From 3266f3948a3e493d119881b263c181a57fc3dc7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Acid=20Chicken=20=28=E7=A1=AB=E9=85=B8=E9=B6=8F=29?= <root@acid-chicken.com> Date: Sun, 26 Aug 2018 17:55:06 +0900 Subject: [PATCH 001/539] Update README.md [AUTOGEN] --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5c1b243396..32a9baede5 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ Misskey is using Crowdin for l10n. <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13099460/43cecdbaa63a40d79bf50a96b9910b9d/1?token-time=2145916800&token-hash=d6P5MWHHsCMxUuBAEPAoVc5wLUR19mIhqAq7Ma9h9rI%3D" alt="ne_moni"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/1?token-time=2145916800&token-hash=f03BFb4S2FUx9YEt87TnEmifb4h33OywGBW2akQVtQY%3D" alt="Melilot"></td> +<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/1?token-time=2145916800&token-hash=DVrSdOqQq2dufgNgWZ3XMnEtl_ZAktr8Lhf2tbHKtoA%3D" alt="Axella"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td> <td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></td> @@ -66,6 +67,7 @@ Misskey is using Crowdin for l10n. <td><a href="https://www.patreon.com/user?u=12731202">negao</a></td> <td><a href="https://www.patreon.com/user?u=13099460">ne_moni</a></td> <td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td> +<td><a href="https://www.patreon.com/AxellaMC">Axella</a></td> <td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td> <td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td> <td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td> @@ -89,7 +91,7 @@ Misskey is using Crowdin for l10n. <td><a href="https://www.patreon.com/fujishan">fujishan</a></td> </tr></table> -**Last updated:** Wed, 22 Aug 2018 05:25:06 UTC +**Last updated:** Sun, 26 Aug 2018 08:55:06 UTC <!-- PATREON_END --> :four_leaf_clover: Copyright From 98f6b2324968a53cae88cd3ded515bf6efeda9d5 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Wed, 29 Aug 2018 12:27:33 +0000 Subject: [PATCH 002/539] fix(package): update summaly to version 2.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eea3f363c3..11391ea2a0 100644 --- a/package.json +++ b/package.json @@ -193,7 +193,7 @@ "style-loader": "0.23.0", "stylus": "0.54.5", "stylus-loader": "3.0.2", - "summaly": "2.1.4", + "summaly": "2.2.0", "systeminformation": "3.44.2", "syuilo-password-strength": "0.0.1", "textarea-caret": "3.1.0", From 073c96af478f4c518ad19d2b7650c8a611321d62 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Wed, 29 Aug 2018 14:02:49 +0000 Subject: [PATCH 003/539] fix(package): update vue-js-modal to version 1.3.24 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eea3f363c3..b48b336a49 100644 --- a/package.json +++ b/package.json @@ -210,7 +210,7 @@ "vue": "2.5.17", "vue-chartjs": "3.4.0", "vue-cropperjs": "2.2.1", - "vue-js-modal": "1.3.23", + "vue-js-modal": "1.3.24", "vue-json-tree-view": "2.1.4", "vue-loader": "15.4.1", "vue-router": "3.0.1", From 5b943722fbd9a143b0b6b654e07e192e1218d4da Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Thu, 30 Aug 2018 00:16:12 +0000 Subject: [PATCH 004/539] fix(package): update @types/uuid to version 3.4.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3123de1042..774c978f05 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "@types/speakeasy": "2.0.2", "@types/systeminformation": "3.23.0", "@types/tmp": "0.0.33", - "@types/uuid": "3.4.3", + "@types/uuid": "3.4.4", "@types/webpack": "4.4.11", "@types/webpack-stream": "3.2.10", "@types/websocket": "0.0.39", From 6a87e9f690c87579c37e3145bac080d6b6cbad35 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Thu, 30 Aug 2018 00:18:42 +0000 Subject: [PATCH 005/539] fix(package): update @types/websocket to version 0.0.40 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3123de1042..4496b950eb 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "@types/uuid": "3.4.3", "@types/webpack": "4.4.11", "@types/webpack-stream": "3.2.10", - "@types/websocket": "0.0.39", + "@types/websocket": "0.0.40", "@types/ws": "6.0.0", "animejs": "2.2.0", "autosize": "4.0.2", From dddf7834ccf2b915338da92f42544b5f20b12247 Mon Sep 17 00:00:00 2001 From: mei23 <m@m544.net> Date: Thu, 30 Aug 2018 20:52:35 +0900 Subject: [PATCH 006/539] Add host/digest to HTTP signature --- src/remote/activitypub/request.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/remote/activitypub/request.ts b/src/remote/activitypub/request.ts index 6238d3acb1..d739d08e15 100644 --- a/src/remote/activitypub/request.ts +++ b/src/remote/activitypub/request.ts @@ -2,6 +2,7 @@ import { request } from 'https'; const { sign } = require('http-signature'); import { URL } from 'url'; import * as debug from 'debug'; +const crypto = require('crypto'); import config from '../../config'; import { ILocalUser } from '../../models/user'; @@ -13,6 +14,12 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso const { protocol, hostname, port, pathname, search } = new URL(url); + const data = JSON.stringify(object); + + const sha256 = crypto.createHash('sha256'); + sha256.update(data); + const hash = sha256.digest('base64'); + const req = request({ protocol, hostname, @@ -20,7 +27,8 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso method: 'POST', path: pathname + search, headers: { - 'Content-Type': 'application/activity+json' + 'Content-Type': 'application/activity+json', + 'Digest': `SHA-256=${hash}` } }, res => { log(`${url} --> ${res.statusCode}`); @@ -35,7 +43,8 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso sign(req, { authorizationHeaderName: 'Signature', key: user.keypair, - keyId: `${config.url}/users/${user._id}/publickey` + keyId: `${config.url}/users/${user._id}/publickey`, + headers: ['date', 'host', 'digest'] }); // Signature: Signature ... => Signature: ... @@ -43,5 +52,5 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso sig = sig.replace(/^Signature /, ''); req.setHeader('Signature', sig); - req.end(JSON.stringify(object)); + req.end(data); }); From 48223c1c76f48ed59482c3e2a95564f18ff186ed Mon Sep 17 00:00:00 2001 From: mei23 <m@m544.net> Date: Thu, 30 Aug 2018 20:53:41 +0900 Subject: [PATCH 007/539] Validate host in activity --- src/queue/processors/http/process-inbox.ts | 55 ++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/queue/processors/http/process-inbox.ts b/src/queue/processors/http/process-inbox.ts index c9c2fa72cb..a30efe1a3a 100644 --- a/src/queue/processors/http/process-inbox.ts +++ b/src/queue/processors/http/process-inbox.ts @@ -6,6 +6,8 @@ import parseAcct from '../../../misc/acct/parse'; import User, { IRemoteUser } from '../../../models/user'; import perform from '../../../remote/activitypub/perform'; import { resolvePerson } from '../../../remote/activitypub/models/person'; +import { toUnicode } from 'punycode'; +import { URL } from 'url'; const log = debug('misskey:queue:inbox'); @@ -32,6 +34,15 @@ export default async (job: bq.Job, done: any): Promise<void> => { return; } + // アクティビティ内のホストの検証 + try { + ValidateActivity(activity, host); + } catch (e) { + console.warn(e); + done(); + return; + } + user = await User.findOne({ usernameLower: username, host: host.toLowerCase() }) as IRemoteUser; // アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する @@ -39,6 +50,16 @@ export default async (job: bq.Job, done: any): Promise<void> => { user = await resolvePerson(activity.actor) as IRemoteUser; } } else { + // アクティビティ内のホストの検証 + const host = toUnicode(new URL(signature.keyId).hostname.toLowerCase()); + try { + ValidateActivity(activity, host); + } catch (e) { + console.warn(e); + done(); + return; + } + user = await User.findOne({ host: { $ne: null }, 'publicKey.id': signature.keyId @@ -69,3 +90,37 @@ export default async (job: bq.Job, done: any): Promise<void> => { done(e); } }; + +/** + * Validate host in activity + * @param activity Activity + * @param host Expect host + */ +function ValidateActivity(activity: any, host: string) { + // id (if exists) + if (typeof activity.id === 'string') { + const uriHost = toUnicode(new URL(activity.id).hostname.toLowerCase()); + if (host !== uriHost) throw new Error('activity.id has different host'); + } + + // actor (if exists) + if (typeof activity.actor === 'string') { + const uriHost = toUnicode(new URL(activity.actor).hostname.toLowerCase()); + if (host !== uriHost) throw new Error('activity.actor has different host'); + } + + // For Create activity + if (activity.type === 'Create' && activity.object) { + // object.id (if exists) + if (typeof activity.object.id === 'string') { + const uriHost = toUnicode(new URL(activity.object.id).hostname.toLowerCase()); + if (host !== uriHost) throw new Error('activity.object.id has different host'); + } + + // object.attributedTo (if exists) + if (typeof activity.object.attributedTo === 'string') { + const uriHost = toUnicode(new URL(activity.object.attributedTo).hostname.toLowerCase()); + if (host !== uriHost) throw new Error('activity.object.attributedTo has different host'); + } + } +} From f0abc4642969587039909d5f50adb7d4592f48ba Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 30 Aug 2018 22:10:29 +0900 Subject: [PATCH 008/539] =?UTF-8?q?=E9=96=8B=E7=99=BA=E3=83=A2=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=81=A7=E8=AD=A6=E5=91=8A=E3=82=92=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=81=AA=E3=81=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 2 ++ src/client/app/config.ts | 2 ++ .../desktop/views/components/ui.header.vue | 19 ++++++++++++++++++- .../app/mobile/views/components/ui.header.vue | 18 +++++++++++++++--- src/client/app/mobile/views/components/ui.vue | 7 +++++++ webpack.config.ts | 3 ++- 6 files changed, 46 insertions(+), 5 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 84b7ddb26f..6ebd167803 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -94,6 +94,8 @@ common: verified-user: "公式アカウント" disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" + do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' + reversi: drawn: "引き分け" my-turn: "あなたのターンです" diff --git a/src/client/app/config.ts b/src/client/app/config.ts index 74b9ea21c8..a326c521db 100644 --- a/src/client/app/config.ts +++ b/src/client/app/config.ts @@ -4,6 +4,7 @@ declare const _THEME_COLOR_: string; declare const _COPYRIGHT_: string; declare const _VERSION_: string; declare const _CODENAME_: string; +declare const _ENV_: string; const address = new URL(location.href); @@ -18,3 +19,4 @@ export const themeColor = _THEME_COLOR_; export const copyright = _COPYRIGHT_; export const version = _VERSION_; export const codename = _CODENAME_; +export const env = _ENV_; diff --git a/src/client/app/desktop/views/components/ui.header.vue b/src/client/app/desktop/views/components/ui.header.vue index 6de4eaf744..ac8a6c7765 100644 --- a/src/client/app/desktop/views/components/ui.header.vue +++ b/src/client/app/desktop/views/components/ui.header.vue @@ -1,5 +1,6 @@ <template> <div class="header"> + <p class="warn" v-if="env != 'production'">%i18n:common.do-not-use-in-production%</p> <mk-special-message/> <div class="main" ref="main"> <div class="backdrop"></div> @@ -28,6 +29,7 @@ <script lang="ts"> import Vue from 'vue'; import * as anime from 'animejs'; +import { env } from '../../../config'; import XNav from './ui.header.nav.vue'; import XSearch from './ui.header.search.vue'; @@ -43,7 +45,13 @@ export default Vue.extend({ XAccount, XNotifications, XPost, - XClock, + XClock + }, + + data() { + return { + env: env + }; }, mounted() { @@ -119,6 +127,15 @@ root(isDark) width 100% box-shadow 0 1px 1px rgba(#000, 0.075) + > .warn + display block + margin 0 + padding 4px + text-align center + font-size 12px + background #f00 + color #fff + > .main height 48px diff --git a/src/client/app/mobile/views/components/ui.header.vue b/src/client/app/mobile/views/components/ui.header.vue index a616586c56..c9b3ab51ae 100644 --- a/src/client/app/mobile/views/components/ui.header.vue +++ b/src/client/app/mobile/views/components/ui.header.vue @@ -1,5 +1,6 @@ <template> -<div class="header"> +<div class="header" ref="root"> + <p class="warn" v-if="env != 'production'">%i18n:common.do-not-use-in-production%</p> <mk-special-message/> <div class="main" ref="main"> <div class="backdrop"></div> @@ -20,6 +21,7 @@ <script lang="ts"> import Vue from 'vue'; import * as anime from 'animejs'; +import { env } from '../../../config'; export default Vue.extend({ props: ['func'], @@ -27,7 +29,8 @@ export default Vue.extend({ return { hasGameInvitation: false, connection: null, - connectionId: null + connectionId: null, + env: env }; }, computed: { @@ -39,7 +42,7 @@ export default Vue.extend({ } }, mounted() { - this.$store.commit('setUiHeaderHeight', 48); + this.$store.commit('setUiHeaderHeight', this.$refs.root.offsetHeight); if (this.$store.getters.isSignedIn) { this.connection = (this as any).os.stream.getConnection(); @@ -133,6 +136,15 @@ root(isDark) height 3px background $theme-color + > .warn + display block + margin 0 + padding 4px + text-align center + font-size 12px + background #f00 + color #fff + > .main color rgba(#fff, 0.9) diff --git a/src/client/app/mobile/views/components/ui.vue b/src/client/app/mobile/views/components/ui.vue index 7e2d39f259..d2af15d235 100644 --- a/src/client/app/mobile/views/components/ui.vue +++ b/src/client/app/mobile/views/components/ui.vue @@ -31,7 +31,14 @@ export default Vue.extend({ connectionId: null }; }, + watch: { + '$store.state.uiHeaderHeight'() { + this.$el.style.paddingTop = this.$store.state.uiHeaderHeight + 'px'; + } + }, mounted() { + this.$el.style.paddingTop = this.$store.state.uiHeaderHeight + 'px'; + if (this.$store.getters.isSignedIn) { this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); diff --git a/webpack.config.ts b/webpack.config.ts index 1e295c245d..e520c59a92 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -73,7 +73,8 @@ const consts = { _VERSION_: version, _CODENAME_: codename, _LANG_: '%lang%', - _LANGS_: Object.keys(locales).map(l => [l, locales[l].meta.lang]) + _LANGS_: Object.keys(locales).map(l => [l, locales[l].meta.lang]), + _ENV_: process.env.NODE_ENV }; const _consts: { [ key: string ]: any } = {}; From 6a5a9de79585f957f324872746862d47b7294cbf Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 30 Aug 2018 22:15:41 +0900 Subject: [PATCH 009/539] 8.16.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 37620e7a3b..76ed2ac949 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.15.0", - "clientVersion": "1.0.9031", + "version": "8.16.0", + "clientVersion": "1.0.9191", "codename": "nighthike", "main": "./built/index.js", "private": true, From 9cd334576ca81320c8fa9dc532ecc00b2bc2f26e Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Thu, 30 Aug 2018 16:41:33 +0000 Subject: [PATCH 010/539] fix(package): update @types/node to version 10.9.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 76ed2ac949..a461d8076a 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "@types/mocha": "5.2.3", "@types/mongodb": "3.1.4", "@types/ms": "0.7.30", - "@types/node": "10.9.3", + "@types/node": "10.9.4", "@types/portscanner": "2.1.0", "@types/pug": "2.0.4", "@types/qrcode": "1.2.0", From 6434dac04d899ee1344c895d015da2a03adf71b6 Mon Sep 17 00:00:00 2001 From: Nasha Hiramiya <git@hiramiya.me> Date: Thu, 30 Aug 2018 21:04:20 +0100 Subject: [PATCH 011/539] Add return for invalid filetypes, fixes wrong behaviour --- src/client/app/desktop/api/update-avatar.ts | 2 +- src/client/app/desktop/api/update-banner.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/app/desktop/api/update-avatar.ts b/src/client/app/desktop/api/update-avatar.ts index e9d92d1eb1..f08e8a2b4e 100644 --- a/src/client/app/desktop/api/update-avatar.ts +++ b/src/client/app/desktop/api/update-avatar.ts @@ -16,7 +16,7 @@ export default (os: OS) => { text: '%i18n:common.got-it%' }] }); - reject(); + return reject('invalid-filetype'); } const w = os.new(CropWindow, { diff --git a/src/client/app/desktop/api/update-banner.ts b/src/client/app/desktop/api/update-banner.ts index e8fa35149b..42c9d69349 100644 --- a/src/client/app/desktop/api/update-banner.ts +++ b/src/client/app/desktop/api/update-banner.ts @@ -16,7 +16,7 @@ export default (os: OS) => { text: '%i18n:common.got-it%' }] }); - reject(); + return reject('invalid-filetype'); } const w = os.new(CropWindow, { From 18b4f74cdb3f4a0c69855f1ab5b2f286984f1b13 Mon Sep 17 00:00:00 2001 From: mei23 <m@m544.net> Date: Fri, 31 Aug 2018 16:46:24 +0900 Subject: [PATCH 012/539] Improve validation error message --- src/queue/processors/http/process-inbox.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/queue/processors/http/process-inbox.ts b/src/queue/processors/http/process-inbox.ts index a30efe1a3a..7e564dd32a 100644 --- a/src/queue/processors/http/process-inbox.ts +++ b/src/queue/processors/http/process-inbox.ts @@ -38,7 +38,7 @@ export default async (job: bq.Job, done: any): Promise<void> => { try { ValidateActivity(activity, host); } catch (e) { - console.warn(e); + console.warn(e.message); done(); return; } @@ -55,7 +55,7 @@ export default async (job: bq.Job, done: any): Promise<void> => { try { ValidateActivity(activity, host); } catch (e) { - console.warn(e); + console.warn(e.message); done(); return; } @@ -100,7 +100,10 @@ function ValidateActivity(activity: any, host: string) { // id (if exists) if (typeof activity.id === 'string') { const uriHost = toUnicode(new URL(activity.id).hostname.toLowerCase()); - if (host !== uriHost) throw new Error('activity.id has different host'); + if (host !== uriHost) { + const diag = activity.signature ? '. Has LD-Signature. Forwarded?' : ''; + throw new Error(`activity.id(${activity.id}) has different host(${host})${diag}`); + } } // actor (if exists) From 63b8af453178a8586c08f999948890d1719f670d Mon Sep 17 00:00:00 2001 From: Nasha Hiramiya <git@hiramiya.me> Date: Fri, 31 Aug 2018 20:42:20 +0100 Subject: [PATCH 013/539] Fix darkmode on followers-you-may-know --- .../app/desktop/views/pages/user/user.followers-you-know.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/client/app/desktop/views/pages/user/user.followers-you-know.vue b/src/client/app/desktop/views/pages/user/user.followers-you-know.vue index e4a771910a..f1abaf7fc2 100644 --- a/src/client/app/desktop/views/pages/user/user.followers-you-know.vue +++ b/src/client/app/desktop/views/pages/user/user.followers-you-know.vue @@ -36,8 +36,9 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> +root(isDark) .followers-you-know - background #fff + background isDark ? #282C37 : #fff border solid 1px rgba(#000, 0.075) border-radius 6px @@ -48,7 +49,7 @@ export default Vue.extend({ line-height 42px font-size 0.9em font-weight bold - color #888 + color isDark ? #e3e5e8 : #888 box-shadow 0 1px rgba(#000, 0.07) > i From fd07f00d140d8a703f8f3438d42eb014aabe91fc Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 07:33:04 +0900 Subject: [PATCH 014/539] #2551 --- webpack.config.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webpack.config.ts b/webpack.config.ts index e520c59a92..ad67530f51 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -5,6 +5,7 @@ import * as fs from 'fs'; import * as webpack from 'webpack'; import chalk from 'chalk'; +import rndstr from 'rndstr'; const { VueLoaderPlugin } = require('vue-loader'); const jsonImporter = require('node-sass-json-importer'); const minifyHtml = require('html-minifier').minify; @@ -19,7 +20,7 @@ const constants = require('./src/const.json'); const locales = require('./locales'); const meta = require('./package.json'); -const version = meta.clientVersion; +const version = meta.clientVersion + '-' + rndstr({ length: 8, chars: '0-9a-z' }); const codename = meta.codename; declare var global: { From bffb9a5c451260b9b6b67df4972e28b895319825 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 08:09:21 +0900 Subject: [PATCH 015/539] #2447 #1958 --- .../desktop/views/pages/deck/deck.column.vue | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index d59d430da6..239b1b0447 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -3,18 +3,20 @@ @dragover.prevent.stop="onDragover" @dragenter.prevent="onDragenter" @dragleave="onDragleave" - @drop.prevent.stop="onDrop" -> + @drop.prevent.stop="onDrop"> <header :class="{ indicate: count > 0 }" draggable="true" - @click="toggleActive" + @click="goTop" @dragstart="onDragstart" @dragend="onDragend" - @contextmenu.prevent.stop="onContextmenu" - > + @contextmenu.prevent.stop="onContextmenu"> + <button class="toggleActive" @click="toggleActive" v-if="isStacked"> + <template v-if="active">%fa:angle-up%</template> + <template v-else>%fa:angle-down%</template> + </button> <slot name="header"></slot> <span class="count" v-if="count > 0">({{ count }})</span> - <button ref="menu" @click.stop="showMenu">%fa:caret-down%</button> + <button class="menu" ref="menu" @click.stop="showMenu">%fa:caret-down%</button> </header> <div ref="body" v-show="active"> <slot></slot> @@ -211,6 +213,13 @@ export default Vue.extend({ }); }, + goTop() { + this.$refs.body.scrollTo({ + top: 0, + behavior: 'smooth' + }); + }, + onDragstart(e) { e.dataTransfer.effectAllowed = 'move'; e.dataTransfer.setData('mk-deck-column', this.column.id); @@ -302,6 +311,7 @@ root(isDark) color #bbb > header + display flex z-index 1 line-height $header-height padding 0 16px @@ -328,10 +338,8 @@ root(isDark) margin-left 4px opacity 0.5 - > button - position absolute - top 0 - right 0 + > .toggleActive + > .menu width $header-height line-height $header-height font-size 16px @@ -343,6 +351,13 @@ root(isDark) &:active color isDark ? #b2c1d5 : #999 + > .toggleActive + margin-left -16px + + > .menu + margin-left auto + margin-right -16px + > div height "calc(100% - %s)" % $header-height overflow auto From 4c6fb60dd25d7e2865fc7c4d97728593ffc3c902 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 08:13:18 +0900 Subject: [PATCH 016/539] #2541 --- src/server/api/endpoints/sw/register.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/server/api/endpoints/sw/register.ts b/src/server/api/endpoints/sw/register.ts index 3414600048..503fc94654 100644 --- a/src/server/api/endpoints/sw/register.ts +++ b/src/server/api/endpoints/sw/register.ts @@ -1,6 +1,7 @@ import $ from 'cafy'; import Subscription from '../../../../models/sw-subscription'; import { ILocalUser } from '../../../../models/user'; +import config from '../../../../config'; export const meta = { requireCredential: true @@ -31,8 +32,11 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res, deletedAt: { $exists: false } }); - if (exist !== null) { - return res(); + if (exist != null) { + return res({ + state: 'already-subscribed', + key: config.sw.public_key + }); } await Subscription.insert({ @@ -42,5 +46,8 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res, publickey: publickey }); - res(); + res({ + state: 'subscribed', + key: config.sw.public_key + }); }); From 6819eb3b4da43665de8e159d774b3f2325ddfe0b Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 09:16:25 +0900 Subject: [PATCH 017/539] Improve usability --- package.json | 1 + src/client/app/app.vue | 5 +++- src/client/app/init.ts | 5 ++++ src/client/app/mobile/api/post.ts | 24 --------------- src/client/app/mobile/script.ts | 3 +- src/client/app/mobile/style.styl | 10 +++++++ .../views/components/drive-file-chooser.vue | 2 +- .../mobile/views/components/note-detail.vue | 30 +++++++++++++++---- .../app/mobile/views/components/note.vue | 23 ++++++++++---- .../app/mobile/views/components/post-form.vue | 4 --- src/client/app/mobile/views/pages/home.vue | 10 ++++++- 11 files changed, 72 insertions(+), 45 deletions(-) delete mode 100644 src/client/app/mobile/api/post.ts diff --git a/package.json b/package.json index a461d8076a..31e60260ba 100644 --- a/package.json +++ b/package.json @@ -216,6 +216,7 @@ "vue-router": "3.0.1", "vue-style-loader": "4.1.2", "vue-template-compiler": "2.5.17", + "vue-thin-modal": "1.1.1", "vuedraggable": "2.16.0", "vuex": "3.0.1", "vuex-persistedstate": "2.5.4", diff --git a/src/client/app/app.vue b/src/client/app/app.vue index 7a46e7dea0..011eb14661 100644 --- a/src/client/app/app.vue +++ b/src/client/app/app.vue @@ -1,3 +1,6 @@ <template> -<router-view id="app"></router-view> +<div> + <router-view id="app"></router-view> + <modal-portal/> +</div> </template> diff --git a/src/client/app/init.ts b/src/client/app/init.ts index cf97957400..dd31f07475 100644 --- a/src/client/app/init.ts +++ b/src/client/app/init.ts @@ -11,6 +11,8 @@ import VAnimateCss from 'v-animate-css'; import Element from 'element-ui'; import ElementLocaleEn from 'element-ui/lib/locale/lang/en'; import ElementLocaleJa from 'element-ui/lib/locale/lang/ja'; +import VueThinModal from 'vue-thin-modal'; +import 'vue-thin-modal/dist/vue-thin-modal.css'; import App from './app.vue'; import checkForUpdate from './common/scripts/check-for-update'; @@ -30,6 +32,9 @@ Vue.use(VModal); Vue.use(TreeView); Vue.use(VAnimateCss); Vue.use(Element, { locale: elementLocale }); +Vue.use(VueThinModal, { + autoMountPortal: false +}); // Register global directives require('./common/views/directives'); diff --git a/src/client/app/mobile/api/post.ts b/src/client/app/mobile/api/post.ts deleted file mode 100644 index 15b2f6b691..0000000000 --- a/src/client/app/mobile/api/post.ts +++ /dev/null @@ -1,24 +0,0 @@ -import PostForm from '../views/components/post-form.vue'; - -export default (os) => (opts) => { - const o = opts || {}; - - const app = document.getElementById('app'); - app.style.display = 'none'; - - function recover() { - app.style.display = 'block'; - } - - const vm = new PostForm({ - parent: os.app, - propsData: { - reply: o.reply, - renote: o.renote - } - }).$mount(); - vm.$once('cancel', recover); - vm.$once('posted', recover); - document.body.appendChild(vm.$el); - (vm as any).focus(); -}; diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts index 5b9d45462a..edc2b35529 100644 --- a/src/client/app/mobile/script.ts +++ b/src/client/app/mobile/script.ts @@ -14,7 +14,6 @@ import chooseDriveFolder from './api/choose-drive-folder'; import chooseDriveFile from './api/choose-drive-file'; import dialog from './api/dialog'; import input from './api/input'; -import post from './api/post'; import notify from './api/notify'; import MkIndex from './views/pages/index.vue'; @@ -91,7 +90,7 @@ init((launch) => { chooseDriveFile, dialog: dialog(os), input, - post: post(os), + post: () => alert('deprecated'), notify })); }, true); diff --git a/src/client/app/mobile/style.styl b/src/client/app/mobile/style.styl index df8f4a8fae..f78146f8b8 100644 --- a/src/client/app/mobile/style.styl +++ b/src/client/app/mobile/style.styl @@ -17,3 +17,13 @@ body display flex flex-direction column min-height 100% + +.modal-backdrop + z-index 10000 !important + +.modal-content-wrapper + z-index 10001 !important + +.modal-content + padding 0 !important + background-color transparent !important diff --git a/src/client/app/mobile/views/components/drive-file-chooser.vue b/src/client/app/mobile/views/components/drive-file-chooser.vue index d95d5fa223..56e41e31d8 100644 --- a/src/client/app/mobile/views/components/drive-file-chooser.vue +++ b/src/client/app/mobile/views/components/drive-file-chooser.vue @@ -48,7 +48,7 @@ export default Vue.extend({ <style lang="stylus" scoped> .mk-drive-file-chooser position fixed - z-index 2048 + z-index 20000 top 0 left 0 width 100% diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index f9996f9da6..02ef3845d3 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -75,6 +75,13 @@ <div class="replies" v-if="!compact"> <x-sub v-for="note in replies" :key="note.id" :note="note"/> </div> + + <modal name="replyForm"> + <mk-post-form @posted="replyFormClosed" @cancel="replyFormClosed" :reply="p"/> + </modal> + <modal name="renoteForm"> + <mk-post-form @posted="renoteFormClosed" @cancel="renoteFormClosed" :renote="p"/> + </modal> </div> </template> @@ -116,9 +123,11 @@ export default Vue.extend({ this.note.mediaIds.length == 0 && this.note.poll == null); }, + p(): any { return this.isRenote ? this.note.renote : this.note; }, + reactionsCount(): number { return this.p.reactionCounts ? Object.keys(this.p.reactionCounts) @@ -126,6 +135,7 @@ export default Vue.extend({ .reduce((a, b) => a + b) : 0; }, + urls(): string[] { if (this.p.text) { const ast = parse(this.p.text); @@ -180,16 +190,23 @@ export default Vue.extend({ this.conversation = conversation.reverse(); }); }, + reply() { - (this as any).apis.post({ - reply: this.p - }); + this.$modal.push('replyForm'); }, + + replyFormClosed() { + this.$modal.pop(); + }, + renote() { - (this as any).apis.post({ - renote: this.p - }); + this.$modal.push('renoteForm'); }, + + renoteFormClosed() { + this.$modal.pop(); + }, + react() { (this as any).os.new(MkReactionPicker, { source: this.$refs.reactButton, @@ -198,6 +215,7 @@ export default Vue.extend({ big: true }); }, + menu() { (this as any).os.new(MkNoteMenu, { source: this.$refs.menuButton, diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index d0cea135f9..f658686b05 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -60,6 +60,13 @@ </footer> </div> </article> + + <modal name="replyForm"> + <mk-post-form @posted="replyFormClosed" @cancel="replyFormClosed" :reply="p"/> + </modal> + <modal name="renoteForm"> + <mk-post-form @posted="renoteFormClosed" @cancel="renoteFormClosed" :renote="p"/> + </modal> </div> </template> @@ -195,15 +202,19 @@ export default Vue.extend({ }, reply() { - (this as any).apis.post({ - reply: this.p - }); + this.$modal.push('replyForm'); + }, + + replyFormClosed() { + this.$modal.pop(); }, renote() { - (this as any).apis.post({ - renote: this.p - }); + this.$modal.push('renoteForm'); + }, + + renoteFormClosed() { + this.$modal.pop(); }, react() { diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index a74df67c0a..537bf407dc 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -293,9 +293,6 @@ export default Vue.extend({ viaMobile: viaMobile }).then(data => { this.$emit('posted'); - this.$nextTick(() => { - this.$destroy(); - }); }).catch(err => { this.posting = false; }); @@ -309,7 +306,6 @@ export default Vue.extend({ cancel() { this.$emit('cancel'); - this.$destroy(); }, kao() { diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue index 706c9cd28b..a03fa03c5f 100644 --- a/src/client/app/mobile/views/pages/home.vue +++ b/src/client/app/mobile/views/pages/home.vue @@ -42,6 +42,10 @@ <mk-user-list-timeline v-if="src == 'list'" ref="tl" :key="list.id" :list="list"/> </div> </main> + + <modal name="postForm"> + <mk-post-form @posted="postFormClosed" @cancel="postFormClosed"/> + </modal> </mk-ui> </template> @@ -107,7 +111,11 @@ export default Vue.extend({ methods: { fn() { - (this as any).apis.post(); + this.$modal.push('postForm'); + }, + + postFormClosed() { + this.$modal.pop(); }, saveSrc() { From 9e318d5ebc1abd01059d68eacdf42605efdeb334 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 09:29:59 +0900 Subject: [PATCH 018/539] Fix bug --- .../views/components/messaging-room.vue | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/client/app/common/views/components/messaging-room.vue b/src/client/app/common/views/components/messaging-room.vue index 30143b4f1d..1de41855df 100644 --- a/src/client/app/common/views/components/messaging-room.vue +++ b/src/client/app/common/views/components/messaging-room.vue @@ -3,7 +3,7 @@ @dragover.prevent.stop="onDragover" @drop.prevent.stop="onDrop" > - <div class="stream"> + <div class="body"> <p class="init" v-if="init">%fa:spinner .spin%%i18n:common.loading%</p> <p class="empty" v-if="!init && messages.length == 0">%fa:info-circle%%i18n:@empty%</p> <p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages">%fa:flag%%i18n:@no-history%</p> @@ -77,6 +77,12 @@ export default Vue.extend({ this.connection.on('message', this.onMessage); this.connection.on('read', this.onRead); + if (this.isNaked) { + window.addEventListener('scroll', this.onScroll, { passive: true }); + } else { + this.$el.addEventListener('scroll', this.onScroll, { passive: true }); + } + document.addEventListener('visibilitychange', this.onVisibilitychange); this.fetchMessages().then(() => { @@ -90,6 +96,12 @@ export default Vue.extend({ this.connection.off('read', this.onRead); this.connection.close(); + if (this.isNaked) { + window.removeEventListener('scroll', this.onScroll); + } else { + this.$el.removeEventListener('scroll', this.onScroll); + } + document.removeEventListener('visibilitychange', this.onVisibilitychange); }, @@ -226,6 +238,14 @@ export default Vue.extend({ }, 4000); }, + onScroll() { + const el = this.isNaked ? window.document.documentElement : this.$el; + const current = el.scrollTop + el.clientHeight; + if (current > el.scrollHeight - 1) { + this.showIndicator = false; + } + }, + onVisibilitychange() { if (document.hidden) return; this.messages.forEach(message => { @@ -251,7 +271,7 @@ root(isDark) height 100% background isDark ? #191b22 : #fff - > .stream + > .body width 100% max-width 600px margin 0 auto From 2a235151ed411b657ead0142d14da9a14e2f7105 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 09:42:25 +0900 Subject: [PATCH 019/539] #2236 #2237 --- locales/ja-JP.yml | 2 ++ .../app/common/views/components/note-menu.vue | 24 ++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 6ebd167803..c5a3fc81ff 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -285,6 +285,8 @@ common/views/components/nav.vue: feedback: "フィードバック" common/views/components/note-menu.vue: + detail: "詳細" + copy-link: "リンクをコピー" favorite: "お気に入り" pin: "ピン留め" delete: "削除" diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue index 27a49a6536..0b0609ac4e 100644 --- a/src/client/app/common/views/components/note-menu.vue +++ b/src/client/app/common/views/components/note-menu.vue @@ -6,17 +6,27 @@ <script lang="ts"> import Vue from 'vue'; +import { url } from '../../../config'; +import copyToClipboard from '../../../common/scripts/copy-to-clipboard'; export default Vue.extend({ props: ['note', 'source', 'compact'], computed: { items() { - const items = []; - items.push({ + const items = [{ + icon: '%fa:info-circle%', + text: '%i18n:@detail%', + action: this.detail + }, { + icon: '%fa:link%', + text: '%i18n:@copy-link%', + action: this.copyLink + }, null, { icon: '%fa:star%', text: '%i18n:@favorite%', action: this.favorite - }); + }]; + if (this.note.userId == this.$store.state.i.id) { items.push({ icon: '%fa:thumbtack%', @@ -42,6 +52,14 @@ export default Vue.extend({ } }, methods: { + detail() { + this.$router.push(`/notes/${ this.note.id }`); + }, + + copyLink() { + copyToClipboard(`${url}/notes/${ this.note.id }`); + }, + pin() { (this as any).api('i/pin', { noteId: this.note.id From 359da9a5a145946ed97f9fed5d1080e52043489d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 09:44:15 +0900 Subject: [PATCH 020/539] 8.17.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 31e60260ba..1b42598b31 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.16.0", - "clientVersion": "1.0.9191", + "version": "8.17.0", + "clientVersion": "1.0.9212", "codename": "nighthike", "main": "./built/index.js", "private": true, From 4d6b9f62e5a66171ffcb791904f3e20358d84e78 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 12:05:25 +0900 Subject: [PATCH 021/539] =?UTF-8?q?=E3=83=A2=E3=83=90=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E3=81=AE=E3=83=89=E3=83=A9=E3=82=A4=E3=83=96=E3=82=92=E3=83=80?= =?UTF-8?q?=E3=83=BC=E3=82=AF=E3=83=A2=E3=83=BC=E3=83=89=E5=AF=BE=E5=BF=9C?= =?UTF-8?q?=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/components/drive.file-detail.vue | 49 +++++++++---------- .../mobile/views/components/drive.file.vue | 23 ++++----- .../mobile/views/components/drive.folder.vue | 12 +++-- .../app/mobile/views/components/drive.vue | 35 ++++++++----- src/client/app/mobile/views/pages/drive.vue | 2 +- .../app/mobile/views/pages/selectdrive.vue | 2 +- 6 files changed, 68 insertions(+), 55 deletions(-) diff --git a/src/client/app/mobile/views/components/drive.file-detail.vue b/src/client/app/mobile/views/components/drive.file-detail.vue index deb9941be8..43867211e9 100644 --- a/src/client/app/mobile/views/components/drive.file-detail.vue +++ b/src/client/app/mobile/views/components/drive.file-detail.vue @@ -1,5 +1,5 @@ <template> -<div class="file-detail"> +<div class="pyvicwrksnfyhpfgkjwqknuururpaztw"> <div class="preview"> <img v-if="kind == 'image'" ref="img" :src="file.url" @@ -25,7 +25,7 @@ </div> <div class="info"> <div> - <span class="type"><mk-file-type-icon :type="file.type"/>{{ file.type }}</span> + <span class="type"><mk-file-type-icon :type="file.type"/> {{ file.type }}</span> <span class="separator"></span> <span class="data-size">{{ file.datasize | bytes }}</span> <span class="separator"></span> @@ -134,11 +134,10 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -.file-detail - +root(isDark) > .preview padding 8px - background #f0f0f0 + background isDark ? #191b22 : #f0f0f0 > img display block @@ -150,7 +149,7 @@ export default Vue.extend({ > footer padding 8px 8px 0 8px font-size 0.8em - color #888 + color isDark ? #606984 : #888 text-align center > .separator @@ -179,25 +178,17 @@ export default Vue.extend({ > .info padding 14px font-size 0.8em - border-top solid 1px #dfdfdf + border-top solid 1px isDark ? #1c2023 : #dfdfdf > div max-width 500px margin 0 auto + color isDark ? #9397a2 : #9d9d9d > .separator padding 0 4px - color #cdcdcd - - > .type - > .data-size - color #9d9d9d - - > mk-file-type-icon - margin-right 4px > .created-at - color #bdbdbd > [data-fa] margin-right 2px @@ -207,7 +198,7 @@ export default Vue.extend({ > .menu padding 14px - border-top solid 1px #dfdfdf + border-top solid 1px isDark ? #1c2023 : #dfdfdf > div max-width 500px @@ -218,14 +209,14 @@ export default Vue.extend({ width 100% padding 10px 16px margin 0 0 12px 0 - color #333 + color isDark ? #dfe3e8 : #333 font-size 0.9em text-align center text-decoration none - text-shadow 0 1px 0 rgba(255, 255, 255, 0.9) - background-image linear-gradient(#fafafa, #eaeaea) - border 1px solid #ddd - border-bottom-color #cecece + text-shadow 0 1px 0 isDark ? rgba(0, 0, 0, 0.9) : rgba(255, 255, 255, 0.9) + background-image isDark ? linear-gradient(#292f3c, #1b2025) : linear-gradient(#fafafa, #eaeaea) + border 1px solid isDark ? #121417 : #ddd + border-bottom-color isDark ? #060606 : #cecece border-radius 3px &:last-child @@ -242,7 +233,7 @@ export default Vue.extend({ > .hash padding 14px - border-top solid 1px #dfdfdf + border-top solid 1px isDark ? #1c2023 : #dfdfdf > div max-width 500px @@ -252,7 +243,7 @@ export default Vue.extend({ display block margin 0 padding 0 - color #555 + color isDark ? #a8b7d0 : #555 font-size 0.9em > [data-fa] @@ -273,7 +264,7 @@ export default Vue.extend({ > .exif padding 14px - border-top solid 1px #dfdfdf + border-top solid 1px isDark ? #1c2023 : #dfdfdf > div max-width 500px @@ -283,7 +274,7 @@ export default Vue.extend({ display block margin 0 padding 0 - color #555 + color isDark ? #a8b7d0 : #555 font-size 0.9em > [data-fa] @@ -301,4 +292,10 @@ export default Vue.extend({ border-radius 2px background #f5f5f5 +.pyvicwrksnfyhpfgkjwqknuururpaztw[data-darkmode] + root(true) + +.pyvicwrksnfyhpfgkjwqknuururpaztw:not([data-darkmode]) + root(false) + </style> diff --git a/src/client/app/mobile/views/components/drive.file.vue b/src/client/app/mobile/views/components/drive.file.vue index 6dec4b9f4f..4375cfdd7b 100644 --- a/src/client/app/mobile/views/components/drive.file.vue +++ b/src/client/app/mobile/views/components/drive.file.vue @@ -1,5 +1,5 @@ <template> -<a class="file" @click.prevent="onClick" :href="`/i/drive/file/${ file.id }`" :data-is-selected="isSelected"> +<a class="vupkuhvjnjyqaqhsiogfbywvjxynrgsm" @click.prevent="onClick" :href="`/i/drive/file/${ file.id }`" :data-is-selected="isSelected"> <div class="container"> <div class="thumbnail" :style="thumbnail"></div> <div class="body"> @@ -7,20 +7,12 @@ <span>{{ file.name.lastIndexOf('.') != -1 ? file.name.substr(0, file.name.lastIndexOf('.')) : file.name }}</span> <span class="ext" v-if="file.name.lastIndexOf('.') != -1">{{ file.name.substr(file.name.lastIndexOf('.')) }}</span> </p> - <!-- - if file.tags.length > 0 - ul.tags - each tag in file.tags - li.tag(style={background: tag.color, color: contrast(tag.color)})= tag.name - --> <footer> <span class="type"><mk-file-type-icon :type="file.type"/>{{ file.type }}</span> <span class="separator"></span> <span class="data-size">{{ file.datasize | bytes }}</span> <span class="separator"></span> - <span class="created-at"> - %fa:R clock%<mk-time :time="file.createdAt"/> - </span> + <span class="created-at">%fa:R clock%<mk-time :time="file.createdAt"/></span> <template v-if="file.isSensitive"> <span class="separator"></span> <span class="nsfw">%fa:eye-slash% %i18n:@nsfw%</span> @@ -73,7 +65,7 @@ export default Vue.extend({ <style lang="stylus" scoped> @import '~const.styl' -.file +root(isDark) display block text-decoration none !important @@ -111,7 +103,7 @@ export default Vue.extend({ padding 0 font-size 0.9em font-weight bold - color #555 + color isDark ? #fff : #555 text-overflow ellipsis overflow-wrap break-word @@ -138,7 +130,6 @@ export default Vue.extend({ > .separator padding 0 4px - color #CDCDCD > .type color #9D9D9D @@ -164,4 +155,10 @@ export default Vue.extend({ &, * color #fff !important +.vupkuhvjnjyqaqhsiogfbywvjxynrgsm[data-darkmode] + root(true) + +.vupkuhvjnjyqaqhsiogfbywvjxynrgsm:not([data-darkmode]) + root(false) + </style> diff --git a/src/client/app/mobile/views/components/drive.folder.vue b/src/client/app/mobile/views/components/drive.folder.vue index 22ff38fecb..f76ecba6ad 100644 --- a/src/client/app/mobile/views/components/drive.folder.vue +++ b/src/client/app/mobile/views/components/drive.folder.vue @@ -1,5 +1,5 @@ <template> -<a class="root folder" @click.prevent="onClick" :href="`/i/drive/folder/${ folder.id }`"> +<a class="jvwxssxsytqlqvrpiymarjlzlsxskqsr" @click.prevent="onClick" :href="`/i/drive/folder/${ folder.id }`"> <div class="container"> <p class="name">%fa:folder%{{ folder.name }}</p>%fa:angle-right% </div> @@ -24,9 +24,9 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -.root.folder +root(isDark) display block - color #777 + color isDark ? #fff : #777 text-decoration none !important * @@ -55,4 +55,10 @@ export default Vue.extend({ > * height 100% +.jvwxssxsytqlqvrpiymarjlzlsxskqsr[data-darkmode] + root(true) + +.jvwxssxsytqlqvrpiymarjlzlsxskqsr:not([data-darkmode]) + root(false) + </style> diff --git a/src/client/app/mobile/views/components/drive.vue b/src/client/app/mobile/views/components/drive.vue index c313d225e4..36a6ea2f40 100644 --- a/src/client/app/mobile/views/components/drive.vue +++ b/src/client/app/mobile/views/components/drive.vue @@ -1,5 +1,5 @@ <template> -<div class="mk-drive"> +<div class="kmmwchoexgckptowjmjgfsygeltxfeqs"> <nav ref="nav"> <a @click.prevent="goRoot()" href="/i/drive">%fa:cloud%%i18n:@drive%</a> <template v-for="folder in hierarchyFolders"> @@ -26,11 +26,11 @@ </p> </div> <div class="folders" v-if="folders.length > 0"> - <x-folder v-for="folder in folders" :key="folder.id" :folder="folder"/> + <x-folder class="folder" v-for="folder in folders" :key="folder.id" :folder="folder"/> <p v-if="moreFolders">%i18n:@load-more%</p> </div> <div class="files" v-if="files.length > 0"> - <x-file v-for="file in files" :key="file.id" :file="file"/> + <x-file class="file" v-for="file in files" :key="file.id" :file="file"/> <button class="more" v-if="moreFiles" @click="fetchMoreFiles"> {{ fetchingMoreFiles ? '%i18n:common.loading%' : '%i18n:@load-more%' }} </button> @@ -94,6 +94,13 @@ export default Vue.extend({ return this.selectFile; } }, + watch: { + top() { + if (this.isNaked) { + (this.$refs.nav as any).style.top = `${this.top}px`; + } + } + }, mounted() { this.connection = (this as any).os.streams.driveStream.getConnection(); this.connectionId = (this as any).os.streams.driveStream.use(); @@ -466,8 +473,8 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -.mk-drive - background #fff +root(isDark) + background isDark ? #282c37 : #fff > nav display block @@ -480,10 +487,10 @@ export default Vue.extend({ overflow auto white-space nowrap font-size 0.9em - color rgba(#000, 0.67) + color rgba(isDark ? #fff : #000, 0.67) -webkit-backdrop-filter blur(12px) backdrop-filter blur(12px) - background-color rgba(#fff, 0.75) + background-color rgba(isDark ? #313543 : #fff, 0.75) border-bottom solid 1px rgba(#000, 0.13) > p @@ -509,7 +516,7 @@ export default Vue.extend({ opacity 0.5 > .info - border-bottom solid 1px #eee + border-bottom solid 1px isDark ? #1c2023 : #eee &:empty display none @@ -520,15 +527,15 @@ export default Vue.extend({ margin 0 auto padding 4px 16px font-size 10px - color #777 + color isDark ? #606984 : #777 > .folders > .folder - border-bottom solid 1px #eee + border-bottom solid 1px isDark ? #1c2023 : #eee > .files > .file - border-bottom solid 1px #eee + border-bottom solid 1px isDark ? #1c2023 : #eee > .more display block @@ -584,4 +591,10 @@ export default Vue.extend({ > .file display none +.kmmwchoexgckptowjmjgfsygeltxfeqs[data-darkmode] + root(true) + +.kmmwchoexgckptowjmjgfsygeltxfeqs:not([data-darkmode]) + root(false) + </style> diff --git a/src/client/app/mobile/views/pages/drive.vue b/src/client/app/mobile/views/pages/drive.vue index c7cbe0f72e..657f43c7c3 100644 --- a/src/client/app/mobile/views/pages/drive.vue +++ b/src/client/app/mobile/views/pages/drive.vue @@ -11,7 +11,7 @@ :init-folder="initFolder" :init-file="initFile" :is-naked="true" - :top="48" + :top="$store.state.uiHeaderHeight" @begin-fetch="Progress.start()" @fetched-mid="Progress.set(0.5)" @fetched="Progress.done()" diff --git a/src/client/app/mobile/views/pages/selectdrive.vue b/src/client/app/mobile/views/pages/selectdrive.vue index 1a162b346c..c098b8c65e 100644 --- a/src/client/app/mobile/views/pages/selectdrive.vue +++ b/src/client/app/mobile/views/pages/selectdrive.vue @@ -5,7 +5,7 @@ <button class="upload" @click="upload">%fa:upload%</button> <button v-if="multiple" class="ok" @click="ok">%fa:check%</button> </header> - <mk-drive ref="browser" select-file :multiple="multiple" is-naked :top="42"/> + <mk-drive ref="browser" select-file :multiple="multiple" is-naked :top="$store.state.uiHeaderHeight"/> </div> </template> From 7e35048829782eb9fb0abc799f5f96cc864c040f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 12:06:15 +0900 Subject: [PATCH 022/539] 8.18.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 1b42598b31..0b3335bb98 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.17.0", - "clientVersion": "1.0.9212", + "version": "8.18.0", + "clientVersion": "1.0.9214", "codename": "nighthike", "main": "./built/index.js", "private": true, From 29b2bdf613efb6e1db10c830012e84270a480fa8 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 12:58:04 +0900 Subject: [PATCH 023/539] Fix bug --- .../desktop/views/pages/user/user.followers-you-know.vue | 9 +++++++-- src/client/app/desktop/views/pages/user/user.friends.vue | 7 +++---- src/client/app/desktop/views/pages/user/user.photos.vue | 7 +++---- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/client/app/desktop/views/pages/user/user.followers-you-know.vue b/src/client/app/desktop/views/pages/user/user.followers-you-know.vue index f1abaf7fc2..0e7e3f1d77 100644 --- a/src/client/app/desktop/views/pages/user/user.followers-you-know.vue +++ b/src/client/app/desktop/views/pages/user/user.followers-you-know.vue @@ -1,5 +1,5 @@ <template> -<div class="followers-you-know"> +<div class="vahgrswmbzfdlmomxnqftuueyvwaafth"> <p class="title">%fa:users%%i18n:@title%</p> <p class="initializing" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@loading%<mk-ellipsis/></p> <div v-if="!fetching && users.length > 0"> @@ -37,7 +37,6 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) -.followers-you-know background isDark ? #282C37 : #fff border solid 1px rgba(#000, 0.075) border-radius 6px @@ -78,4 +77,10 @@ root(isDark) > i margin-right 4px +.vahgrswmbzfdlmomxnqftuueyvwaafth[data-darkmode] + root(true) + +.vahgrswmbzfdlmomxnqftuueyvwaafth:not([data-darkmode]) + root(false) + </style> diff --git a/src/client/app/desktop/views/pages/user/user.friends.vue b/src/client/app/desktop/views/pages/user/user.friends.vue index 516eea0288..a238565588 100644 --- a/src/client/app/desktop/views/pages/user/user.friends.vue +++ b/src/client/app/desktop/views/pages/user/user.friends.vue @@ -1,5 +1,5 @@ <template> -<div class="friends"> +<div class="hozptpaliadatkehcmcayizwzwwctpbc"> <p class="title">%fa:users%%i18n:@title%</p> <p class="initializing" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@loading%<mk-ellipsis/></p> <template v-if="!fetching && users.length != 0"> @@ -41,7 +41,6 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) -.friends background isDark ? #282C37 : #fff border solid 1px rgba(#000, 0.075) border-radius 6px @@ -113,10 +112,10 @@ root(isDark) top 16px right 16px -.friends[data-darkmode] +.hozptpaliadatkehcmcayizwzwwctpbc[data-darkmode] root(true) -.friends:not([data-darkmode]) +.hozptpaliadatkehcmcayizwzwwctpbc:not([data-darkmode]) root(false) </style> diff --git a/src/client/app/desktop/views/pages/user/user.photos.vue b/src/client/app/desktop/views/pages/user/user.photos.vue index 8397e56484..64c537f1ed 100644 --- a/src/client/app/desktop/views/pages/user/user.photos.vue +++ b/src/client/app/desktop/views/pages/user/user.photos.vue @@ -1,5 +1,5 @@ <template> -<div class="photos"> +<div class="dzsuvbsrrrwobdxifudxuefculdfiaxd"> <p class="title">%fa:camera%%i18n:@title%</p> <p class="initializing" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@loading%<mk-ellipsis/></p> <div class="stream" v-if="!fetching && images.length > 0"> @@ -40,7 +40,6 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) -.photos background isDark ? #282C37 : #fff border solid 1px rgba(#000, 0.075) border-radius 6px @@ -88,10 +87,10 @@ root(isDark) > i margin-right 4px -.photos[data-darkmode] +.dzsuvbsrrrwobdxifudxuefculdfiaxd[data-darkmode] root(true) -.photos:not([data-darkmode]) +.dzsuvbsrrrwobdxifudxuefculdfiaxd:not([data-darkmode]) root(false) </style> From 488bbc96510990afeb9afe3ce5e68e001d514e3e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 13:08:43 +0900 Subject: [PATCH 024/539] =?UTF-8?q?Deck=E3=81=A7=E3=82=82URL=E3=83=97?= =?UTF-8?q?=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/views/components/url-preview.vue | 31 ++++++++++++++++++- .../desktop/views/pages/deck/deck.note.vue | 1 + 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/client/app/common/views/components/url-preview.vue b/src/client/app/common/views/components/url-preview.vue index 242d9ba5c6..d5dda0c80a 100644 --- a/src/client/app/common/views/components/url-preview.vue +++ b/src/client/app/common/views/components/url-preview.vue @@ -8,7 +8,7 @@ </blockquote> </div> <div v-else class="mk-url-preview"> - <a :href="url" target="_blank" :title="url" v-if="!fetching"> + <a :class="{ mini }" :href="url" target="_blank" :title="url" v-if="!fetching"> <div class="thumbnail" v-if="thumbnail" :style="`background-image: url(${thumbnail})`"></div> <article> <header> @@ -118,6 +118,12 @@ export default Vue.extend({ type: Boolean, required: false, default: false + }, + + mini: { + type: Boolean, + required: false, + default: false } }, @@ -293,6 +299,29 @@ root(isDark) width 12px height 12px + &.mini + font-size 10px + + > .thumbnail + position relative + width 100% + height 60px + + > article + left 0 + width 100% + padding 8px + + > header + margin-bottom 4px + + > footer + margin-top 4px + + > img + width 12px + height 12px + .mk-url-preview[data-darkmode] root(true) diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index e6d062eac9..2615c0d090 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -36,6 +36,7 @@ <div class="renote" v-if="p.renote"> <mk-note-preview :note="p.renote" :mini="true"/> </div> + <mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="false" :mini="true"/> </div> <span class="app" v-if="p.app">via <b>{{ p.app.name }}</b></span> </div> From 8ee771ca77887ec3956e5a2da3c5f527a3b5d870 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 13:12:52 +0900 Subject: [PATCH 025/539] 8.19.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0b3335bb98..401f7d2862 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.18.0", - "clientVersion": "1.0.9214", + "version": "8.19.0", + "clientVersion": "1.0.9217", "codename": "nighthike", "main": "./built/index.js", "private": true, From a228c522f1cc2159d2162f6b40378a66ca2328c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Acid=20Chicken=20=28=E7=A1=AB=E9=85=B8=E9=B6=8F=29?= <root@acid-chicken.com> Date: Sat, 1 Sep 2018 14:54:40 +0900 Subject: [PATCH 026/539] Update autogen.sh --- .autogen/autogen.sh | 49 +++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/.autogen/autogen.sh b/.autogen/autogen.sh index 1ea71ff00c..f01f633278 100755 --- a/.autogen/autogen.sh +++ b/.autogen/autogen.sh @@ -1,18 +1,19 @@ #!/usr/bin/env bash -# BEARER_TOKEN= -# CAMPAIGN_ID= -# GITHUB_TOKEN= -# HEAD='acid-chicken:patch-autogen' -# REPO='syuilo/misskey' -test "$(curl -LSs -w '\n' -- "https://api.github.com/repos/$REPO/pulls?access_token=$GITHUB_TOKEN" | jq -r '.[].head.label' | grep $HEAD)" && exit 1 +# __MISSKEY_BEARER_TOKEN= +# __MISSKEY_CAMPAIGN_ID= +# __MISSKEY_GITHUB_TOKEN= +# __MISSKEY_HEAD=acid-chicken:patch-autogen +# __MISSKEY_REPO=syuilo/misskey +# __MISSKEY_BRANCH=develop +test "$(curl -LSs -w '\n' -- "https://api.github.com/repos/$REPO/pulls?access_token=$__MISSKEY_GITHUB_TOKEN" | jq -r '.[].head.label' | grep $__MISSKEY_HEAD)" && exit 1 cd "$(dirname $0)/.." && \ touch null.cache && \ rm *.cache && \ -git checkout master && \ -git pull origin master && \ -git pull upstream master && \ +git checkout $__MISSKEY_BRANCH && \ +git pull origin $__MISSKEY_BRANCH && \ +git pull upstream $__MISSKEY_BRANCH && \ git stash && \ -git rebase -f upstream/master && \ +git rebase -f upstream/$__MISSKEY_BRANCH && \ git branch patch-autogen && \ git checkout patch-autogen && \ git reset --hard HEAD || \ @@ -20,12 +21,12 @@ exit 1 touch patreon.md.cache && \ rm patreon.md.cache && \ echo '<!-- PATREON_START -->' > patreon.md.cache && \ -URL="https://www.patreon.com/api/oauth2/v2/campaigns/$CAMPAIGN_ID/members?include=currently_entitled_tiers,user&fields%5Btier%5D=title&fields%5Buser%5D=full_name,thumb_url,url,hide_pledges" +url="https://www.patreon.com/api/oauth2/v2/campaigns/$__MISSKEY_CAMPAIGN_ID/members?include=currently_entitled_tiers,user&fields%5Btier%5D=title&fields%5Buser%5D=full_name,thumb_url,url,hide_pledges" while : do touch patreon.raw.cache && \ rm patreon.raw.cache && \ - curl -LSs -w '\n' -H "Authorization: Bearer $BEARER_TOKEN" -- $URL > patreon.raw.cache && \ + curl -LSs -w '\n' -H "Authorization: Bearer $__MISSKEY_BEARER_TOKEN" -- $url > patreon.raw.cache && \ touch patreon.cache && \ rm patreon.cache && \ cat patreon.raw.cache | \ @@ -42,31 +43,31 @@ while : xargs -I% echo '<td><a href="%</a></td>' >> patreon.md.cache && \ echo '</tr></table>' >> patreon.md.cache || \ exit 1 - NEW_URL="$(cat patreon.raw.cache | jq -r '.links.next')" - test "$NEW_URL" = 'null' && \ + new_url="$(cat patreon.raw.cache | jq -r '.links.next')" + test "$new_url" = 'null' && \ break || \ - URL="$NEW_URL" + URL="$url" done -IGNORE= && \ +ignore= && \ echo -e "\n**Last updated:** $(date -uR | sed 's/\+0000/UTC/')\n<!-- PATREON_END -->" >> patreon.md.cache && \ touch README.md && \ touch .autogen/README.md && \ rm .autogen/README.md && \ mv README.md .autogen/README.md && \ -cat .autogen/README.md | while IFS= read LINE; +cat .autogen/README.md | while IFS= read line; do - if [[ -z "$IGNORE" ]] + if [[ -z "$ignore" ]] then - if [[ "$LINE" = '<!-- PATREON_START -->' ]] + if [[ "$line" = '<!-- PATREON_START -->' ]] then - IGNORE='PATREON_INSIDE' + ignore='PATREON_INSIDE' else - echo "$LINE" >> README.md + echo "$line" >> README.md fi else if [[ "$LINE" = '<!-- PATREON_END -->' ]] then - IGNORE= + ignore= cat patreon.md.cache >> README.md fi fi @@ -80,7 +81,7 @@ test 4 -lt $(cat diff.cache | wc -l) && \ git add README.md && \ git commit -m 'Update README.md [AUTOGEN]' && \ git push -f origin patch-autogen && \ -curl -LSs -w '\n' -X POST -d '{"title":"[AUTOMATED] Update README.md","body":"*This pull request was created by a tool.*","head":"'$HEAD'","base":"master"}' -- "https://api.github.com/repos/$REPO/pulls?access_token=$GITHUB_TOKEN" +curl -LSs -w '\n' -X POST -d '{"title":"[AUTOMATED] Update README.md","body":"*This pull request was created by a tool.*","head":"'$__MISSKEY_HEAD'","base":"'$__MISSKEY_BRANCH'"}' -- "https://api.github.com/repos/$__MISSKEY_REPO/pulls?access_token=$__MISSKEY_GITHUB_TOKEN" git stash -git checkout master +git checkout $__MISSKEY_BRANCH git branch -D patch-autogen From 63e2dbbb0d1b9be3aba6afc8ec7ddb5f84c193cf Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 15:22:28 +0900 Subject: [PATCH 027/539] Fix bug --- .../app/mobile/views/components/note-detail.vue | 13 ++++++++----- src/client/app/mobile/views/components/note.vue | 13 ++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index 02ef3845d3..8a0305cedd 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -76,10 +76,10 @@ <x-sub v-for="note in replies" :key="note.id" :note="note"/> </div> - <modal name="replyForm"> + <modal :name="replyFormId"> <mk-post-form @posted="replyFormClosed" @cancel="replyFormClosed" :reply="p"/> </modal> - <modal name="renoteForm"> + <modal :name="renoteFormId"> <mk-post-form @posted="renoteFormClosed" @cancel="renoteFormClosed" :renote="p"/> </modal> </div> @@ -87,6 +87,7 @@ <script lang="ts"> import Vue from 'vue'; +import * as uuid from 'uuid'; import parse from '../../../../../mfm/parse'; import MkNoteMenu from '../../../common/views/components/note-menu.vue'; @@ -112,7 +113,9 @@ export default Vue.extend({ return { conversation: [], conversationFetching: false, - replies: [] + replies: [], + replyFormId: uuid(), + renoteFormId: uuid() }; }, @@ -192,7 +195,7 @@ export default Vue.extend({ }, reply() { - this.$modal.push('replyForm'); + this.$modal.push(this.replyFormId); }, replyFormClosed() { @@ -200,7 +203,7 @@ export default Vue.extend({ }, renote() { - this.$modal.push('renoteForm'); + this.$modal.push(this.renoteFormId); }, renoteFormClosed() { diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index f658686b05..4bf4eb34e3 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -61,10 +61,10 @@ </div> </article> - <modal name="replyForm"> + <modal :name="replyFormId"> <mk-post-form @posted="replyFormClosed" @cancel="replyFormClosed" :reply="p"/> </modal> - <modal name="renoteForm"> + <modal :name="renoteFormId"> <mk-post-form @posted="renoteFormClosed" @cancel="renoteFormClosed" :renote="p"/> </modal> </div> @@ -72,6 +72,7 @@ <script lang="ts"> import Vue from 'vue'; +import * as uuid from 'uuid'; import parse from '../../../../../mfm/parse'; import MkNoteMenu from '../../../common/views/components/note-menu.vue'; @@ -89,7 +90,9 @@ export default Vue.extend({ return { showContent: false, connection: null, - connectionId: null + connectionId: null, + replyFormId: uuid(), + renoteFormId: uuid() }; }, @@ -202,7 +205,7 @@ export default Vue.extend({ }, reply() { - this.$modal.push('replyForm'); + this.$modal.push(this.replyFormId); }, replyFormClosed() { @@ -210,7 +213,7 @@ export default Vue.extend({ }, renote() { - this.$modal.push('renoteForm'); + this.$modal.push(this.renoteFormId); }, renoteFormClosed() { From f1d65a66b465a18d200f922fac03384bee7d6f69 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 15:38:03 +0900 Subject: [PATCH 028/539] Fix bug --- package.json | 1 - src/client/app/app.styl | 10 ++++++++++ src/client/app/desktop/views/pages/welcome.vue | 17 ++++++++++++----- src/client/app/init.ts | 2 -- src/client/app/mobile/style.styl | 10 ---------- 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 401f7d2862..110145366d 100644 --- a/package.json +++ b/package.json @@ -210,7 +210,6 @@ "vue": "2.5.17", "vue-chartjs": "3.4.0", "vue-cropperjs": "2.2.1", - "vue-js-modal": "1.3.24", "vue-json-tree-view": "2.1.4", "vue-loader": "15.4.1", "vue-router": "3.0.1", diff --git a/src/client/app/app.styl b/src/client/app/app.styl index 431b9daa65..aaa0d34c71 100644 --- a/src/client/app/app.styl +++ b/src/client/app/app.styl @@ -126,3 +126,13 @@ pre [data-fa] display inline-block + +.modal-backdrop + z-index 10000 !important + +.modal-content-wrapper + z-index 10001 !important + +.modal-content + padding 0 !important + background-color transparent !important diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index ac2f921a21..37c776130e 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -37,9 +37,12 @@ <div class="tl"> <mk-welcome-timeline :max="20"/> </div> - <modal name="signup" width="500px" height="auto" scrollable> - <header :class="$style.signupFormHeader">%i18n:@signup%</header> - <mk-signup :class="$style.signupForm"/> + + <modal name="signup"> + <div :class="$style.modal"> + <header :class="$style.signupFormHeader">%i18n:@signup%</header> + <mk-signup :class="$style.signupForm"/> + </div> </modal> </div> </template> @@ -88,10 +91,10 @@ export default Vue.extend({ this.$refs.pointer.style.left = x.left + 'px'; }, signup() { - this.$modal.show('signup'); + this.$modal.push('signup'); }, signin() { - this.$modal.show('signin'); + this.$modal.push('signin'); }, dark() { this.$store.commit('device/set', { @@ -265,6 +268,10 @@ root(isDark) </style> <style lang="stylus" module> +.modal + width 500px + background #fff !important + .signupForm padding 24px 48px 48px 48px diff --git a/src/client/app/init.ts b/src/client/app/init.ts index dd31f07475..0b22509870 100644 --- a/src/client/app/init.ts +++ b/src/client/app/init.ts @@ -5,7 +5,6 @@ import Vue from 'vue'; import Vuex from 'vuex'; import VueRouter from 'vue-router'; -import VModal from 'vue-js-modal'; import * as TreeView from 'vue-json-tree-view'; import VAnimateCss from 'v-animate-css'; import Element from 'element-ui'; @@ -28,7 +27,6 @@ switch (lang) { Vue.use(Vuex); Vue.use(VueRouter); -Vue.use(VModal); Vue.use(TreeView); Vue.use(VAnimateCss); Vue.use(Element, { locale: elementLocale }); diff --git a/src/client/app/mobile/style.styl b/src/client/app/mobile/style.styl index f78146f8b8..df8f4a8fae 100644 --- a/src/client/app/mobile/style.styl +++ b/src/client/app/mobile/style.styl @@ -17,13 +17,3 @@ body display flex flex-direction column min-height 100% - -.modal-backdrop - z-index 10000 !important - -.modal-content-wrapper - z-index 10001 !important - -.modal-content - padding 0 !important - background-color transparent !important From 21da6bd0470e8055dacc0ed11f909f8ae138a79f Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sat, 1 Sep 2018 16:05:10 +0900 Subject: [PATCH 029/539] Refactor languages loader --- locales/index.js | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/locales/index.js b/locales/index.js index b1bc782166..7072d5a694 100644 --- a/locales/index.js +++ b/locales/index.js @@ -5,24 +5,13 @@ const fs = require('fs'); const yaml = require('js-yaml'); -const loadLang = lang => yaml.safeLoad( - fs.readFileSync(`${__dirname}/${lang}.yml`, 'utf-8')); +const langs = ['de-DE', 'en-US', 'fr-FR', 'ja-JP', 'ja-KS', 'pl-PL', 'es-ES']; +const nativeLang = 'ja-JP'; -const native = loadLang('ja-JP'); +const loadLocale = lang => yaml.safeLoad(fs.readFileSync(`${__dirname}/${lang}.yml`, 'utf-8')); +const nativeLocale = loadLocale(nativeLang); +const fallbackToNativeLocale = locale => Object.assign({}, nativeLocale, locale); +const makeLocale = lang => lang == nativeLang ? nativeLocale : fallbackToNativeLocale(loadLocale(lang)); +const locales = langs.map(lang => ({ [lang]: makeLocale(lang) })); -const langs = { - 'de-DE': loadLang('de-DE'), - 'en-US': loadLang('en-US'), - 'fr-FR': loadLang('fr-FR'), - 'ja-JP': native, - 'ja-KS': loadLang('ja-KS'), - 'pl-PL': loadLang('pl-PL'), - 'es-ES': loadLang('es-ES') -}; - -Object.values(langs).forEach(locale => { - // Extend native language (Japanese) - locale = Object.assign({}, native, locale); -}); - -module.exports = langs; +module.exports = locales.reduce((a, b) => ({ ...a, ...b })); From 2c135fa2f6980ab9550c8c50d0615b28fff558ca Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sat, 1 Sep 2018 16:12:50 +0900 Subject: [PATCH 030/539] Not fallback to native locale --- locales/index.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/locales/index.js b/locales/index.js index 7072d5a694..1f28d3ff03 100644 --- a/locales/index.js +++ b/locales/index.js @@ -6,12 +6,8 @@ const fs = require('fs'); const yaml = require('js-yaml'); const langs = ['de-DE', 'en-US', 'fr-FR', 'ja-JP', 'ja-KS', 'pl-PL', 'es-ES']; -const nativeLang = 'ja-JP'; const loadLocale = lang => yaml.safeLoad(fs.readFileSync(`${__dirname}/${lang}.yml`, 'utf-8')); -const nativeLocale = loadLocale(nativeLang); -const fallbackToNativeLocale = locale => Object.assign({}, nativeLocale, locale); -const makeLocale = lang => lang == nativeLang ? nativeLocale : fallbackToNativeLocale(loadLocale(lang)); -const locales = langs.map(lang => ({ [lang]: makeLocale(lang) })); +const locales = langs.map(lang => ({ [lang]: loadLocale(lang) })); module.exports = locales.reduce((a, b) => ({ ...a, ...b })); From 7559b8da6c1b3c1bebd0355891d788f11bafa4ea Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 16:23:23 +0900 Subject: [PATCH 031/539] :v: --- src/client/app/mobile/views/components/post-form.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 537bf407dc..b076cae26d 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -170,6 +170,8 @@ export default Vue.extend({ }); } + this.focus(); + this.$nextTick(() => { this.focus(); }); From c008154d18440c678270a6b090a05d2a34d64b8c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 16:26:31 +0900 Subject: [PATCH 032/539] 8.19.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 110145366d..afdd47b3ce 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.19.0", - "clientVersion": "1.0.9217", + "version": "8.19.1", + "clientVersion": "1.0.9225", "codename": "nighthike", "main": "./built/index.js", "private": true, From e846e3d5712d73934aee9d1a4dfb7dd5cda41ce4 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sat, 1 Sep 2018 16:48:22 +0900 Subject: [PATCH 033/539] Update .npmrc --- .npmrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.npmrc b/.npmrc index b680f3f72d..6b5f38e890 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1,2 @@ -save-exact=true +save-exact = true package-lock = false From bf087bfccfd9c71d31bd546fb433c0f0dedd6fa4 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sat, 1 Sep 2018 17:27:33 +0900 Subject: [PATCH 034/539] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 32a9baede5..b7a2d9b681 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Why don't you take a short break from the hustle and bustle of the city, and div * Reactions * User lists * Customizable column view (called MisskeyDeck) - * and widgets! +* Customizable widgets * Private messages * ActivityPub support From 7204e2a84c1e9de7824f5e73548679d0fa991090 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sat, 1 Sep 2018 18:02:04 +0900 Subject: [PATCH 035/539] Update contribution guide --- CONTRIBUTING.md | 40 ++++++++++++++++++++-------------------- README.md | 17 +++-------------- locales/README.md | 6 ++---- 3 files changed, 25 insertions(+), 38 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0add0bdcb1..50aef3a4b6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,27 +1,27 @@ # Contribution guide -:v: Misskeyへの貢献ありがとうございます。 :v: +:v: Thanks for your contributions :v: -## Issueの報告 -新機能の提案や不具合の報告は https://github.com/syuilo/misskey/issues で管理しています。 -Issueを作成する前に、既に同じIssueが作成されていないかご確認ください。 -もし既にIssueが作成されている場合は、既存のIssueにコメントをしたりリアクションをするようお願いします。 +## Issues +Feature suggestions and bug reports are filed in https://github.com/syuilo/misskey/issues . +Before creating a new issue, please search existing issues to avoid duplication. +If you find the existing issue, please add your reaction or comment to the issue. -## Issueの解決 -[pr-welcomeのラベルがついているIssue](https://github.com/syuilo/misskey/labels/pr-welcome) -の解決を目的としたPull Requestを作成してくださると非常にありがたいです。 +## Internationalization (i18n) +Please see [Translation guide](./docs/translate.en.md). -## 翻訳の改善 -ソースコード中の `%i18n:id%` という形の文字列は、言語ファイルの対応するテキストに置換されます。 -言語ファイルは /locales ディレクトリに存在します。 +## Localization (l10n) +Please use Crowdin for localization. -## ドキュメントの編集 -現在Misskeyはドキュメントが大きく不足しています。 -ドキュメントは /docs ディレクトリに存在します。 +[](https://crowdin.com/project/misskey) -## テストの追加 -現在Misskeyはテストが大きく不足しています。 -テストコードは /test ディレクトリに存在します。 +## Documentation +* Documents for contributors are located in `/docs`. +* Documents for instance admins are located in `/docs`. +* Documents for end users are located in `src/docs`. -## 自動テスト及び自動リリース -Travis CIで行っています。 -設定ファイルは /.travis に存在します。 +## Test +* Test codes are located in `/test`. + +## Continuous integration +Misskey uses Travis for automated test. +Configuration files are located in `/.travis`. diff --git a/README.md b/README.md index b7a2d9b681..465d171114 100644 --- a/README.md +++ b/README.md @@ -32,22 +32,11 @@ and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz :package: Create your own instance ---------------------------------------------------------------- -If you want to run your own instance of Misskey, -please see [Setup and installation guide](./docs/setup.en.md). +Please see [Setup and installation guide](./docs/setup.en.md). -:wrench: Contribute +:wrench: Contribution ---------------------------------------------------------------- -**[PR](https://github.com/syuilo/misskey/pulls)s welcome!** - -### i18n - -Please see [Translation guide](./docs/translate.en.md). - -### l10n - -Misskey is using Crowdin for l10n. - -[](https://crowdin.com/project/misskey) +Please see [Contribution guide](./CONTRIBUTING.md). :heart: Backers & Sponsors ---------------------------------------------------------------- diff --git a/locales/README.md b/locales/README.md index 09888299cd..56bfae64d6 100644 --- a/locales/README.md +++ b/locales/README.md @@ -1,5 +1,3 @@ -# **Please DO NOT edit these files** except `ja-JP.yml`. +# **DO NOT edit locale files** except `ja-JP.yml`. -If you want to... -* i18n ... please see [Translation guide](../docs/translate.en.md). -* l10n ... please visit https://crowdin.com/project/misskey +Please see [Contribution guide](../CONTRIBUTING.md) for more information. From ad9b9964fad91b56ffbde9f0ddf897376dc52012 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sat, 1 Sep 2018 18:15:25 +0900 Subject: [PATCH 036/539] Update contribution guide --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 50aef3a4b6..2fa78d1934 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,9 +10,9 @@ If you find the existing issue, please add your reaction or comment to the issue Please see [Translation guide](./docs/translate.en.md). ## Localization (l10n) -Please use Crowdin for localization. +Please use [Crowdin](https://crowdin.com/project/misskey) for localization. -[](https://crowdin.com/project/misskey) + ## Documentation * Documents for contributors are located in `/docs`. From 409b37b2719fd3c69aa172ddce647d91e1a3120c Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sat, 1 Sep 2018 18:42:46 +0900 Subject: [PATCH 037/539] Update setup docs --- docs/setup.en.md | 1 + docs/setup.ja.md | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/setup.en.md b/docs/setup.en.md index 6a54817a78..d426271870 100644 --- a/docs/setup.en.md +++ b/docs/setup.en.md @@ -131,6 +131,7 @@ You can check if the service is running with `systemctl status misskey`. 2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` 3. `npm install` 4. `npm run build` +5. Check [ChangeLog](../CHANGELOG.md) for migration information ---------------------------------------------------------------- diff --git a/docs/setup.ja.md b/docs/setup.ja.md index 7c701b019f..2758e6f231 100644 --- a/docs/setup.ja.md +++ b/docs/setup.ja.md @@ -120,6 +120,7 @@ WantedBy=multi-user.target 2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` 3. `npm install` 4. `npm run build` +5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する ---------------------------------------------------------------- From 7860d97a10eb6509974d5f0442ada2247f881963 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sat, 1 Sep 2018 18:47:02 +0900 Subject: [PATCH 038/539] Add type annotation --- src/models/stats.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models/stats.ts b/src/models/stats.ts index 326bfacc80..82c07aa678 100644 --- a/src/models/stats.ts +++ b/src/models/stats.ts @@ -2,7 +2,7 @@ import * as mongo from 'mongodb'; import db from '../db/mongodb'; const Stats = db.get<IStats>('stats'); -Stats.dropIndex({ date: -1 }); // 後方互換性のため +Stats.dropIndex({ date: -1 } as any); // 後方互換性のため Stats.createIndex({ span: -1, date: -1 }, { unique: true }); export default Stats; From 52aa64fcb6bef627da82c7d1515a5798a0d53684 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sat, 1 Sep 2018 19:12:07 +0900 Subject: [PATCH 039/539] Fix drop index --- src/models/stats.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/models/stats.ts b/src/models/stats.ts index 82c07aa678..d496f2c480 100644 --- a/src/models/stats.ts +++ b/src/models/stats.ts @@ -2,7 +2,12 @@ import * as mongo from 'mongodb'; import db from '../db/mongodb'; const Stats = db.get<IStats>('stats'); -Stats.dropIndex({ date: -1 } as any); // 後方互換性のため + +// 後方互換性のため +Stats.dropIndex({ date: -1 } as any).catch((e: mongo.MongoError) => { + if (e.code !== 27) throw e; +}); + Stats.createIndex({ span: -1, date: -1 }, { unique: true }); export default Stats; From 795fc5e7bca45aca90815cdaa9404cdb1fd73eb6 Mon Sep 17 00:00:00 2001 From: mei23 <m@m544.net> Date: Sat, 1 Sep 2018 16:39:46 +0900 Subject: [PATCH 040/539] Set Person.updatedAt at first --- src/remote/activitypub/models/person.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts index 3bd4e16763..212a1c5ee6 100644 --- a/src/remote/activitypub/models/person.ts +++ b/src/remote/activitypub/models/person.ts @@ -139,6 +139,7 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU avatarId: null, bannerId: null, createdAt: Date.parse(person.published) || null, + updatedAt: new Date(), description: htmlToMFM(person.summary), followersCount, followingCount, From eee98358acce99f181e5b03fe99297f772ddfdb1 Mon Sep 17 00:00:00 2001 From: mei23 <m@m544.net> Date: Sat, 1 Sep 2018 16:46:41 +0900 Subject: [PATCH 041/539] Add missing updatePerson properties --- src/remote/activitypub/models/person.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts index 212a1c5ee6..0246798616 100644 --- a/src/remote/activitypub/models/person.ts +++ b/src/remote/activitypub/models/person.ts @@ -291,7 +291,9 @@ export async function updatePerson(uri: string, resolver?: Resolver): Promise<vo name: person.name, url: person.url, endpoints: person.endpoints, - isCat: (person as any).isCat === true ? true : false + isBot: object.type == 'Service', + isCat: (person as any).isCat === true ? true : false, + isLocked: person.manuallyApprovesFollowers } }); } From 15eaebe52228afa1acbe96137b10a885e39943b1 Mon Sep 17 00:00:00 2001 From: mei23 <m@m544.net> Date: Sat, 1 Sep 2018 16:55:11 +0900 Subject: [PATCH 042/539] =?UTF-8?q?updatePerson=E3=81=A7=E5=86=8D=E5=89=B2?= =?UTF-8?q?=E3=82=8A=E5=BD=93=E3=81=A6=E3=82=92=E8=80=83=E6=85=AE=E3=81=99?= =?UTF-8?q?=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/remote/activitypub/models/person.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts index 0246798616..9c770141a3 100644 --- a/src/remote/activitypub/models/person.ts +++ b/src/remote/activitypub/models/person.ts @@ -293,7 +293,12 @@ export async function updatePerson(uri: string, resolver?: Resolver): Promise<vo endpoints: person.endpoints, isBot: object.type == 'Service', isCat: (person as any).isCat === true ? true : false, - isLocked: person.manuallyApprovesFollowers + isLocked: person.manuallyApprovesFollowers, + createdAt: Date.parse(person.published) || null, + publicKey: { + id: person.publicKey.id, + publicKeyPem: person.publicKey.publicKeyPem + }, } }); } From 3efffbcf22f9292bfe4644df4b7627687a6748f5 Mon Sep 17 00:00:00 2001 From: mei23 <m@m544.net> Date: Sat, 1 Sep 2018 17:53:38 +0900 Subject: [PATCH 043/539] Receive Update activity --- src/queue/processors/http/process-inbox.ts | 28 +++++++++++++++------- src/remote/activitypub/models/person.ts | 8 ++++--- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/queue/processors/http/process-inbox.ts b/src/queue/processors/http/process-inbox.ts index 7e564dd32a..8e6b3769de 100644 --- a/src/queue/processors/http/process-inbox.ts +++ b/src/queue/processors/http/process-inbox.ts @@ -5,7 +5,7 @@ const httpSignature = require('http-signature'); import parseAcct from '../../../misc/acct/parse'; import User, { IRemoteUser } from '../../../models/user'; import perform from '../../../remote/activitypub/perform'; -import { resolvePerson } from '../../../remote/activitypub/models/person'; +import { resolvePerson, updatePerson } from '../../../remote/activitypub/models/person'; import { toUnicode } from 'punycode'; import { URL } from 'url'; @@ -44,11 +44,6 @@ export default async (job: bq.Job, done: any): Promise<void> => { } user = await User.findOne({ usernameLower: username, host: host.toLowerCase() }) as IRemoteUser; - - // アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する - if (user === null) { - user = await resolvePerson(activity.actor) as IRemoteUser; - } } else { // アクティビティ内のホストの検証 const host = toUnicode(new URL(signature.keyId).hostname.toLowerCase()); @@ -64,11 +59,26 @@ export default async (job: bq.Job, done: any): Promise<void> => { host: { $ne: null }, 'publicKey.id': signature.keyId }) as IRemoteUser; + } - // アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する - if (user === null) { - user = await resolvePerson(activity.actor) as IRemoteUser; + // Update activityの場合は、ここで署名検証/更新処理まで実施して終了 + if (activity.type === 'Update') { + if (activity.object && activity.object.type === 'Person') { + if (user == null) { + console.warn('Update activity received, but user not registed.'); + } else if (!httpSignature.verifySignature(signature, user.publicKey.publicKeyPem)) { + console.warn('Update activity received, but signature verification failed.'); + } else { + updatePerson(activity.actor, null, activity.object); + } } + done(); + return; + } + + // アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する + if (user === null) { + user = await resolvePerson(activity.actor) as IRemoteUser; } if (user === null) { diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts index 9c770141a3..dff38f5460 100644 --- a/src/remote/activitypub/models/person.ts +++ b/src/remote/activitypub/models/person.ts @@ -216,10 +216,12 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU /** * Personの情報を更新します。 - * * Misskeyに対象のPersonが登録されていなければ無視します。 + * @param uri URI of Person + * @param resolver Resolver + * @param hint Hint of Person object (この値が正当なPersonの場合、Remote resolveをせずに更新に利用します) */ -export async function updatePerson(uri: string, resolver?: Resolver): Promise<void> { +export async function updatePerson(uri: string, resolver?: Resolver, hint?: object): Promise<void> { if (typeof uri !== 'string') throw 'uri is not string'; // URIがこのサーバーを指しているならスキップ @@ -237,7 +239,7 @@ export async function updatePerson(uri: string, resolver?: Resolver): Promise<vo if (resolver == null) resolver = new Resolver(); - const object = await resolver.resolve(uri) as any; + const object = hint || await resolver.resolve(uri) as any; const err = validatePerson(object, uri); From 57a63d38aaae33331c0272cbcbc3f5d254cfd93d Mon Sep 17 00:00:00 2001 From: mei23 <m@m544.net> Date: Sat, 1 Sep 2018 20:17:30 +0900 Subject: [PATCH 044/539] Send Update activity --- src/remote/activitypub/renderer/update.ts | 14 +++++++++ src/server/api/endpoints/i/update.ts | 4 +++ src/services/i/update.ts | 38 +++++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 src/remote/activitypub/renderer/update.ts create mode 100644 src/services/i/update.ts diff --git a/src/remote/activitypub/renderer/update.ts b/src/remote/activitypub/renderer/update.ts new file mode 100644 index 0000000000..cf9acc9acb --- /dev/null +++ b/src/remote/activitypub/renderer/update.ts @@ -0,0 +1,14 @@ +import config from '../../../config'; +import { ILocalUser } from '../../../models/user'; + +export default (object: any, user: ILocalUser) => { + const activity = { + id: `${config.url}/users/${user._id}#updates/${new Date().getTime()}`, + actor: `${config.url}/users/${user._id}`, + type: 'Update', + to: [ 'https://www.w3.org/ns/activitystreams#Public' ], + object + } as any; + + return activity; +}; diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index cdb4eb3f56..585339e249 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -5,6 +5,7 @@ import DriveFile from '../../../../models/drive-file'; import acceptAllFollowRequests from '../../../../services/following/requests/accept-all'; import { IApp } from '../../../../models/app'; import config from '../../../../config'; +import { publishToFollowers } from '../../../../services/i/update'; export const meta = { desc: { @@ -144,4 +145,7 @@ export default async (params: any, user: ILocalUser, app: IApp) => new Promise(a if (user.isLocked && isLocked === false) { acceptAllFollowRequests(user); } + + // フォロワーにUpdateを配信 + publishToFollowers(user._id); }); diff --git a/src/services/i/update.ts b/src/services/i/update.ts new file mode 100644 index 0000000000..25b55b0355 --- /dev/null +++ b/src/services/i/update.ts @@ -0,0 +1,38 @@ +import * as mongo from 'mongodb'; +import User, { isLocalUser, isRemoteUser } from '../../models/user'; +import Following from '../../models/following'; +import renderPerson from '../../remote/activitypub/renderer/person'; +import renderUpdate from '../../remote/activitypub/renderer/update'; +import packAp from '../../remote/activitypub/renderer'; +import { deliver } from '../../queue'; + +export async function publishToFollowers(userId: mongo.ObjectID) { + const user = await User.findOne({ + _id: userId + }); + + const followers = await Following.find({ + followeeId: user._id + }); + + const queue: string[] = []; + + // フォロワーがリモートユーザーかつ投稿者がローカルユーザーならUpdateを配信 + if (isLocalUser(user)) { + followers.map(following => { + const follower = following._follower; + + if (isRemoteUser(follower)) { + const inbox = follower.sharedInbox || follower.inbox; + if (!queue.includes(inbox)) queue.push(inbox); + } + }); + + if (queue.length > 0) { + const content = packAp(renderUpdate(await renderPerson(user), user)); + queue.forEach(inbox => { + deliver(user, content, inbox); + }); + } + } +} From 5209a584a2ed76057ec5edc351cf155154f3f68f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 20:47:49 +0900 Subject: [PATCH 045/539] Better post form --- package.json | 2 +- src/client/app/app.styl | 14 +- src/client/app/app.vue | 5 +- .../app/desktop/views/pages/welcome.vue | 16 +-- src/client/app/init.ts | 7 +- src/client/app/mobile/api/post.ts | 23 +++ src/client/app/mobile/script.ts | 3 +- .../mobile/views/components/note-detail.vue | 28 +--- .../app/mobile/views/components/note.vue | 28 +--- .../views/components/post-form-dialog.vue | 131 ++++++++++++++++++ src/client/app/mobile/views/pages/home.vue | 10 +- 11 files changed, 184 insertions(+), 83 deletions(-) create mode 100644 src/client/app/mobile/api/post.ts create mode 100644 src/client/app/mobile/views/components/post-form-dialog.vue diff --git a/package.json b/package.json index afdd47b3ce..4c88e02a45 100644 --- a/package.json +++ b/package.json @@ -210,12 +210,12 @@ "vue": "2.5.17", "vue-chartjs": "3.4.0", "vue-cropperjs": "2.2.1", + "vue-js-modal": "1.3.25", "vue-json-tree-view": "2.1.4", "vue-loader": "15.4.1", "vue-router": "3.0.1", "vue-style-loader": "4.1.2", "vue-template-compiler": "2.5.17", - "vue-thin-modal": "1.1.1", "vuedraggable": "2.16.0", "vuex": "3.0.1", "vuex-persistedstate": "2.5.4", diff --git a/src/client/app/app.styl b/src/client/app/app.styl index aaa0d34c71..3911f83a61 100644 --- a/src/client/app/app.styl +++ b/src/client/app/app.styl @@ -6,6 +6,10 @@ html &, * cursor progress !important +html + // iOSのため + overflow auto + body overflow-wrap break-word @@ -126,13 +130,3 @@ pre [data-fa] display inline-block - -.modal-backdrop - z-index 10000 !important - -.modal-content-wrapper - z-index 10001 !important - -.modal-content - padding 0 !important - background-color transparent !important diff --git a/src/client/app/app.vue b/src/client/app/app.vue index 011eb14661..7a46e7dea0 100644 --- a/src/client/app/app.vue +++ b/src/client/app/app.vue @@ -1,6 +1,3 @@ <template> -<div> - <router-view id="app"></router-view> - <modal-portal/> -</div> +<router-view id="app"></router-view> </template> diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 37c776130e..ae9bf7e678 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -38,11 +38,9 @@ <mk-welcome-timeline :max="20"/> </div> - <modal name="signup"> - <div :class="$style.modal"> - <header :class="$style.signupFormHeader">%i18n:@signup%</header> - <mk-signup :class="$style.signupForm"/> - </div> + <modal name="signup" width="500px" height="auto" scrollable> + <header :class="$style.signupFormHeader">%i18n:@signup%</header> + <mk-signup :class="$style.signupForm"/> </modal> </div> </template> @@ -91,10 +89,10 @@ export default Vue.extend({ this.$refs.pointer.style.left = x.left + 'px'; }, signup() { - this.$modal.push('signup'); + this.$modal.show('signup'); }, signin() { - this.$modal.push('signin'); + this.$modal.show('signin'); }, dark() { this.$store.commit('device/set', { @@ -268,10 +266,6 @@ root(isDark) </style> <style lang="stylus" module> -.modal - width 500px - background #fff !important - .signupForm padding 24px 48px 48px 48px diff --git a/src/client/app/init.ts b/src/client/app/init.ts index 0b22509870..82924e92e3 100644 --- a/src/client/app/init.ts +++ b/src/client/app/init.ts @@ -10,8 +10,7 @@ import VAnimateCss from 'v-animate-css'; import Element from 'element-ui'; import ElementLocaleEn from 'element-ui/lib/locale/lang/en'; import ElementLocaleJa from 'element-ui/lib/locale/lang/ja'; -import VueThinModal from 'vue-thin-modal'; -import 'vue-thin-modal/dist/vue-thin-modal.css'; +import VModal from 'vue-js-modal'; import App from './app.vue'; import checkForUpdate from './common/scripts/check-for-update'; @@ -30,9 +29,7 @@ Vue.use(VueRouter); Vue.use(TreeView); Vue.use(VAnimateCss); Vue.use(Element, { locale: elementLocale }); -Vue.use(VueThinModal, { - autoMountPortal: false -}); +Vue.use(VModal); // Register global directives require('./common/views/directives'); diff --git a/src/client/app/mobile/api/post.ts b/src/client/app/mobile/api/post.ts new file mode 100644 index 0000000000..5c0f0af852 --- /dev/null +++ b/src/client/app/mobile/api/post.ts @@ -0,0 +1,23 @@ +import PostForm from '../views/components/post-form-dialog.vue'; + +export default (os) => (opts) => { + const o = opts || {}; + + document.documentElement.style.overflow = 'hidden'; + + function recover() { + document.documentElement.style.overflow = 'auto'; + } + + const vm = new PostForm({ + parent: os.app, + propsData: { + reply: o.reply, + renote: o.renote + } + }).$mount(); + vm.$once('cancel', recover); + vm.$once('posted', recover); + document.body.appendChild(vm.$el); + (vm as any).focus(); +}; diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts index edc2b35529..5b9d45462a 100644 --- a/src/client/app/mobile/script.ts +++ b/src/client/app/mobile/script.ts @@ -14,6 +14,7 @@ import chooseDriveFolder from './api/choose-drive-folder'; import chooseDriveFile from './api/choose-drive-file'; import dialog from './api/dialog'; import input from './api/input'; +import post from './api/post'; import notify from './api/notify'; import MkIndex from './views/pages/index.vue'; @@ -90,7 +91,7 @@ init((launch) => { chooseDriveFile, dialog: dialog(os), input, - post: () => alert('deprecated'), + post: post(os), notify })); }, true); diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index 8a0305cedd..786e57bb22 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -75,19 +75,11 @@ <div class="replies" v-if="!compact"> <x-sub v-for="note in replies" :key="note.id" :note="note"/> </div> - - <modal :name="replyFormId"> - <mk-post-form @posted="replyFormClosed" @cancel="replyFormClosed" :reply="p"/> - </modal> - <modal :name="renoteFormId"> - <mk-post-form @posted="renoteFormClosed" @cancel="renoteFormClosed" :renote="p"/> - </modal> </div> </template> <script lang="ts"> import Vue from 'vue'; -import * as uuid from 'uuid'; import parse from '../../../../../mfm/parse'; import MkNoteMenu from '../../../common/views/components/note-menu.vue'; @@ -113,9 +105,7 @@ export default Vue.extend({ return { conversation: [], conversationFetching: false, - replies: [], - replyFormId: uuid(), - renoteFormId: uuid() + replies: [] }; }, @@ -195,19 +185,15 @@ export default Vue.extend({ }, reply() { - this.$modal.push(this.replyFormId); - }, - - replyFormClosed() { - this.$modal.pop(); + (this as any).apis.post({ + reply: this.p + }); }, renote() { - this.$modal.push(this.renoteFormId); - }, - - renoteFormClosed() { - this.$modal.pop(); + (this as any).apis.post({ + renote: this.p + }); }, react() { diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 4bf4eb34e3..d0cea135f9 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -60,19 +60,11 @@ </footer> </div> </article> - - <modal :name="replyFormId"> - <mk-post-form @posted="replyFormClosed" @cancel="replyFormClosed" :reply="p"/> - </modal> - <modal :name="renoteFormId"> - <mk-post-form @posted="renoteFormClosed" @cancel="renoteFormClosed" :renote="p"/> - </modal> </div> </template> <script lang="ts"> import Vue from 'vue'; -import * as uuid from 'uuid'; import parse from '../../../../../mfm/parse'; import MkNoteMenu from '../../../common/views/components/note-menu.vue'; @@ -90,9 +82,7 @@ export default Vue.extend({ return { showContent: false, connection: null, - connectionId: null, - replyFormId: uuid(), - renoteFormId: uuid() + connectionId: null }; }, @@ -205,19 +195,15 @@ export default Vue.extend({ }, reply() { - this.$modal.push(this.replyFormId); - }, - - replyFormClosed() { - this.$modal.pop(); + (this as any).apis.post({ + reply: this.p + }); }, renote() { - this.$modal.push(this.renoteFormId); - }, - - renoteFormClosed() { - this.$modal.pop(); + (this as any).apis.post({ + renote: this.p + }); }, react() { diff --git a/src/client/app/mobile/views/components/post-form-dialog.vue b/src/client/app/mobile/views/components/post-form-dialog.vue new file mode 100644 index 0000000000..6fe9249321 --- /dev/null +++ b/src/client/app/mobile/views/components/post-form-dialog.vue @@ -0,0 +1,131 @@ +<template> +<div class="ulveipglmagnxfgvitaxyszerjwiqmwl"> + <div class="bg" ref="bg" @click="onBgClick"></div> + <div class="main" ref="main" @click.self="onBgClick"> + <mk-post-form ref="form" + :reply="reply" + :renote="renote" + :initial-text="initialText" + :instant="instant" + @posted="onPosted" + @cancel="onCanceled"/> + </div> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import * as anime from 'animejs'; + +export default Vue.extend({ + props: { + reply: { + type: Object, + required: false + }, + renote: { + type: Object, + required: false + }, + initialText: { + type: String, + required: false + }, + instant: { + type: Boolean, + required: false, + default: false + } + }, + + mounted() { + this.$nextTick(() => { + (this.$refs.bg as any).style.pointerEvents = 'auto'; + anime({ + targets: this.$refs.bg, + opacity: 1, + duration: 100, + easing: 'linear' + }); + + anime({ + targets: this.$refs.main, + opacity: 1, + translateY: [-16, 0], + duration: 300, + easing: 'easeOutQuad' + }); + }); + }, + + methods: { + focus() { + this.$refs.form.focus(); + }, + + close() { + (this.$refs.bg as any).style.pointerEvents = 'none'; + anime({ + targets: this.$refs.bg, + opacity: 0, + duration: 300, + easing: 'linear' + }); + + (this.$refs.main as any).style.pointerEvents = 'none'; + anime({ + targets: this.$refs.main, + opacity: 0, + translateY: 16, + duration: 300, + easing: 'easeOutQuad', + complete: () => this.$destroy() + }); + }, + + onBgClick() { + this.$emit('cancel'); + this.close(); + }, + + onPosted() { + this.$emit('posted'); + this.close(); + }, + + onCanceled() { + this.$emit('cancel'); + this.close(); + } + } +}); +</script> + +<style lang="stylus" scoped> +.ulveipglmagnxfgvitaxyszerjwiqmwl + > .bg + display block + position fixed + z-index 10000 + top 0 + left 0 + width 100% + height 100% + background rgba(#000, 0.7) + opacity 0 + pointer-events none + + > .main + display block + position fixed + z-index 10000 + top 0 + left 0 + right 0 + height 100% + overflow auto + margin 0 auto 0 auto + opacity 0 + transform translateY(-16px) + +</style> diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue index a03fa03c5f..706c9cd28b 100644 --- a/src/client/app/mobile/views/pages/home.vue +++ b/src/client/app/mobile/views/pages/home.vue @@ -42,10 +42,6 @@ <mk-user-list-timeline v-if="src == 'list'" ref="tl" :key="list.id" :list="list"/> </div> </main> - - <modal name="postForm"> - <mk-post-form @posted="postFormClosed" @cancel="postFormClosed"/> - </modal> </mk-ui> </template> @@ -111,11 +107,7 @@ export default Vue.extend({ methods: { fn() { - this.$modal.push('postForm'); - }, - - postFormClosed() { - this.$modal.pop(); + (this as any).apis.post(); }, saveSrc() { From f3499b787cb08d36f2bf9af8293efd41729c77eb Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 20:49:06 +0900 Subject: [PATCH 046/539] 8.20.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4c88e02a45..72dd6b73f0 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.19.1", - "clientVersion": "1.0.9225", + "version": "8.20.0", + "clientVersion": "1.0.9240", "codename": "nighthike", "main": "./built/index.js", "private": true, From 4a977cd5235b71494e70be75bd52ffe061dc3b76 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sat, 1 Sep 2018 21:41:37 +0900 Subject: [PATCH 047/539] Update CHANGELOG.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef3b5b4939..84cf61f028 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,13 +47,13 @@ Please run `node cli/migration/5.0.0` before launch. オセロがリバーシに変更されました。 -Othello is now Reversi. +Othello is rename to Reversi. ### Migration MongoDBの、`othelloGames`と`othelloMatchings`コレクションをそれぞれ`reversiGames`と`reversiMatchings`にリネームしてください。 -You need to rename `othelloGames` and `othelloMatchings` MongoDB collections to `reversiGames` and `reversiMatchings`. +Please rename `othelloGames` and `othelloMatchings` MongoDB collections to `reversiGames` and `reversiMatchings` respectively. 3.0.0 ----- From 3d24112d2db94ba9755f1acf4ec03a1582e830ba Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sat, 1 Sep 2018 22:09:54 +0900 Subject: [PATCH 048/539] Refactor reversi engine --- src/games/reversi/core.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/games/reversi/core.ts b/src/games/reversi/core.ts index 92b7c3799c..b610d46884 100644 --- a/src/games/reversi/core.ts +++ b/src/games/reversi/core.ts @@ -205,13 +205,7 @@ export default class Reversi { * 打つことができる場所を取得します */ public canPutSomewhere(color: Color): number[] { - const result: number[] = []; - - this.board.forEach((x, i) => { - if (this.canPut(color, i)) result.push(i); - }); - - return result; + return Array.from(this.board.keys()).filter(i => this.canPut(color, i)); } /** From 91ebd310b7dd94a98517a6c28228d8da9024983e Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sat, 1 Sep 2018 22:18:07 +0900 Subject: [PATCH 049/539] Refactor reversi game --- .../views/components/games/reversi/reversi.game.vue | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/client/app/common/views/components/games/reversi/reversi.game.vue b/src/client/app/common/views/components/games/reversi/reversi.game.vue index b432a2308d..673879a435 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.game.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.game.vue @@ -159,11 +159,9 @@ export default Vue.extend({ canPutEverywhere: this.game.settings.canPutEverywhere, loopedBoard: this.game.settings.loopedBoard }); - this.logs.forEach((log, i) => { - if (i < v) { - this.o.put(log.color, log.pos); - } - }); + for (const log of this.logs.slice(0, v)) { + this.o.put(log.color, log.pos); + } this.$forceUpdate(); } }, From acffc3e522c4fd46d2206dc90546268f388a70b7 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sat, 1 Sep 2018 22:32:51 +0900 Subject: [PATCH 050/539] Refactor mfm component --- .../views/components/misskey-flavored-markdown.ts | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/client/app/common/views/components/misskey-flavored-markdown.ts b/src/client/app/common/views/components/misskey-flavored-markdown.ts index e97da4302c..44680751f7 100644 --- a/src/client/app/common/views/components/misskey-flavored-markdown.ts +++ b/src/client/app/common/views/components/misskey-flavored-markdown.ts @@ -205,17 +205,8 @@ export default Vue.component('misskey-flavored-markdown', { } })); - const _els = []; - els.forEach((el, i) => { - if (el.tag == 'br') { - if (!['div', 'pre'].includes(els[i - 1].tag)) { - _els.push(el); - } - } else { - _els.push(el); - } - }); - + // el.tag === 'br' のとき i !== 0 が保証されるため、短絡評価により els[i - 1] は配列外参照しない + const _els = els.filter((el, i) => !(el.tag === 'br' && ['div', 'pre'].includes(els[i - 1].tag))); return createElement('span', _els); } }); From ffb345ccb5680df4f28bd9ad3c3d1ab8480c99ba Mon Sep 17 00:00:00 2001 From: tamaina <tamaina@hotmail.co.jp> Date: Sat, 1 Sep 2018 22:45:27 +0900 Subject: [PATCH 051/539] fix #2315 (#2339) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * improve MFM to html * improve html to MFM * missing semicolon * missing semicolon * fix html to MFM タグのリンクは解除するように * fix bug * misssing semicolon * Update html-to-mfm.ts * Update html-to-mfm.ts --- src/mfm/html-to-mfm.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/mfm/html-to-mfm.ts b/src/mfm/html-to-mfm.ts index daa228ec51..e2681f5447 100644 --- a/src/mfm/html-to-mfm.ts +++ b/src/mfm/html-to-mfm.ts @@ -33,15 +33,19 @@ export default function(html: string): string { case 'a': const txt = getText(node); + const rel = node.attrs.find((x: any) => x.name == 'rel'); + const href = node.attrs.find((x: any) => x.name == 'href'); + // ハッシュタグ / hrefがない / txtがURL + if ((rel && rel.value.match('tag') !== null) || !href || href.value == txt) { + text += txt; // メンション - if (txt.startsWith('@')) { + } else if (txt.startsWith('@')) { const part = txt.split('@'); if (part.length == 2) { //#region ホスト名部分が省略されているので復元する - const href = new URL(node.attrs.find((x: any) => x.name == 'href').value); - const acct = txt + '@' + href.hostname; + const acct = txt + '@' + (new URL(href.value)).hostname; text += acct; break; //#endregion @@ -49,10 +53,9 @@ export default function(html: string): string { text += txt; break; } - } - - if (node.childNodes) { - node.childNodes.forEach((n: any) => analyze(n)); + // その他 + } else { + text += `[${txt}](${href.value})`; } break; From 291beb45fcb7a4c856232b12848ebad8267e2840 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sat, 1 Sep 2018 23:12:51 +0900 Subject: [PATCH 052/539] Use string interpolation --- src/client/app/auth/views/index.vue | 2 +- src/client/app/boot.js | 2 +- src/client/app/common/scripts/streaming/stream.ts | 4 ++-- src/client/app/common/views/components/autocomplete.vue | 4 ++-- .../views/components/connect-failed.troubleshooter.vue | 2 +- src/client/app/common/views/components/url-preview.vue | 2 +- src/client/app/common/views/directives/autocomplete.ts | 4 ++-- src/client/app/common/views/filters/note.ts | 2 +- src/client/app/common/views/filters/user.ts | 2 +- src/client/app/common/views/pages/follow.vue | 2 +- src/client/app/desktop/views/components/drive.folder.vue | 2 +- src/client/app/desktop/views/components/drive.vue | 4 ++-- src/client/app/desktop/views/components/media-image.vue | 2 +- src/client/app/desktop/views/components/post-form.vue | 6 +++--- src/client/app/desktop/views/pages/drive.vue | 2 +- src/client/app/desktop/views/pages/games/reversi.vue | 4 ++-- src/client/app/desktop/views/pages/messaging-room.vue | 2 +- src/client/app/mobile/views/components/post-form.vue | 6 +++--- src/client/app/mobile/views/components/ui.nav.vue | 2 +- src/client/app/mobile/views/pages/drive.vue | 4 ++-- src/client/app/mobile/views/pages/followers.vue | 2 +- src/client/app/mobile/views/pages/following.vue | 2 +- src/client/app/mobile/views/pages/games/reversi.vue | 4 ++-- src/client/app/mobile/views/pages/settings.vue | 2 +- src/client/app/mobile/views/pages/user-lists.vue | 2 +- src/client/app/mobile/views/pages/user.vue | 2 +- src/daemons/notes-stats.ts | 2 +- src/daemons/server-stats.ts | 2 +- src/mfm/html-to-mfm.ts | 2 +- src/mfm/html.ts | 4 ++-- src/misc/fa.ts | 2 +- src/remote/activitypub/renderer/hashtag.ts | 2 +- src/server/activitypub.ts | 2 +- src/server/api/endpoints.ts | 2 +- src/server/api/stream/notes-stats.ts | 2 +- src/server/api/stream/server-stats.ts | 2 +- src/server/web/docs.ts | 2 +- src/server/web/views/user.pug | 2 +- src/services/drive/add-file.ts | 2 +- webpack.config.ts | 4 ++-- 40 files changed, 53 insertions(+), 53 deletions(-) diff --git a/src/client/app/auth/views/index.vue b/src/client/app/auth/views/index.vue index 609e758994..ba7df911e5 100644 --- a/src/client/app/auth/views/index.vue +++ b/src/client/app/auth/views/index.vue @@ -80,7 +80,7 @@ export default Vue.extend({ accepted() { this.state = 'accepted'; if (this.session.app.callbackUrl) { - location.href = this.session.app.callbackUrl + '?token=' + this.session.token; + location.href = `${this.session.app.callbackUrl}?token=${this.session.token}`; } } } diff --git a/src/client/app/boot.js b/src/client/app/boot.js index 54397c98c6..dd2cf93a89 100644 --- a/src/client/app/boot.js +++ b/src/client/app/boot.js @@ -94,7 +94,7 @@ // Get salt query const salt = localStorage.getItem('salt') - ? '?salt=' + localStorage.getItem('salt') + ? `?salt=${localStorage.getItem('salt')}` : ''; // Load an app script diff --git a/src/client/app/common/scripts/streaming/stream.ts b/src/client/app/common/scripts/streaming/stream.ts index fefa8e5ced..4ab78f1190 100644 --- a/src/client/app/common/scripts/streaming/stream.ts +++ b/src/client/app/common/scripts/streaming/stream.ts @@ -44,11 +44,11 @@ export default class Connection extends EventEmitter { const query = params ? Object.keys(params) - .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(params[k])) + .map(k => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`) .join('&') : null; - this.socket = new ReconnectingWebsocket(`${wsUrl}/${endpoint}${query ? '?' + query : ''}`); + this.socket = new ReconnectingWebsocket(`${wsUrl}/${endpoint}${query ? `?${query}` : ''}`); this.socket.addEventListener('open', this.onOpen); this.socket.addEventListener('close', this.onClose); this.socket.addEventListener('message', this.onMessage); diff --git a/src/client/app/common/views/components/autocomplete.vue b/src/client/app/common/views/components/autocomplete.vue index b274eaa0a0..ea05afd6dc 100644 --- a/src/client/app/common/views/components/autocomplete.vue +++ b/src/client/app/common/views/components/autocomplete.vue @@ -125,7 +125,7 @@ export default Vue.extend({ } if (this.type == 'user') { - const cacheKey = 'autocomplete:user:' + this.q; + const cacheKey = `autocomplete:user:${this.q}`; const cache = sessionStorage.getItem(cacheKey); if (cache) { const users = JSON.parse(cache); @@ -148,7 +148,7 @@ export default Vue.extend({ this.hashtags = JSON.parse(localStorage.getItem('hashtags') || '[]'); this.fetching = false; } else { - const cacheKey = 'autocomplete:hashtag:' + this.q; + const cacheKey = `autocomplete:hashtag:${this.q}`; const cache = sessionStorage.getItem(cacheKey); if (cache) { const hashtags = JSON.parse(cache); diff --git a/src/client/app/common/views/components/connect-failed.troubleshooter.vue b/src/client/app/common/views/components/connect-failed.troubleshooter.vue index 6c23cc7969..f64cae6b4b 100644 --- a/src/client/app/common/views/components/connect-failed.troubleshooter.vue +++ b/src/client/app/common/views/components/connect-failed.troubleshooter.vue @@ -57,7 +57,7 @@ export default Vue.extend({ } // Check internet connection - fetch('https://google.com?rand=' + Math.random(), { + fetch(`https://google.com?rand=${Math.random()}`, { mode: 'no-cors' }).then(() => { this.internet = true; diff --git a/src/client/app/common/views/components/url-preview.vue b/src/client/app/common/views/components/url-preview.vue index d5dda0c80a..e182e7f8cb 100644 --- a/src/client/app/common/views/components/url-preview.vue +++ b/src/client/app/common/views/components/url-preview.vue @@ -170,7 +170,7 @@ export default Vue.extend({ return; } - fetch('/url?url=' + encodeURIComponent(this.url)).then(res => { + fetch(`/url?url=${encodeURIComponent(this.url)}`).then(res => { res.json().then(info => { if (info.url == null) return; this.title = info.title; diff --git a/src/client/app/common/views/directives/autocomplete.ts b/src/client/app/common/views/directives/autocomplete.ts index b252cf5c1f..26bc13871d 100644 --- a/src/client/app/common/views/directives/autocomplete.ts +++ b/src/client/app/common/views/directives/autocomplete.ts @@ -191,7 +191,7 @@ class Autocomplete { const acct = renderAcct(value); // 挿入 - this.text = trimmedBefore + '@' + acct + ' ' + after; + this.text = `${trimmedBefore}@${acct} ${after}`; // キャレットを戻す this.vm.$nextTick(() => { @@ -207,7 +207,7 @@ class Autocomplete { const after = source.substr(caret); // 挿入 - this.text = trimmedBefore + '#' + value + ' ' + after; + this.text = `${trimmedBefore}#${value} ${after}`; // キャレットを戻す this.vm.$nextTick(() => { diff --git a/src/client/app/common/views/filters/note.ts b/src/client/app/common/views/filters/note.ts index a611dc8685..3c9c8b7485 100644 --- a/src/client/app/common/views/filters/note.ts +++ b/src/client/app/common/views/filters/note.ts @@ -1,5 +1,5 @@ import Vue from 'vue'; Vue.filter('notePage', note => { - return '/notes/' + note.id; + return `/notes/${note.id}`; }); diff --git a/src/client/app/common/views/filters/user.ts b/src/client/app/common/views/filters/user.ts index ca0910fc53..e5220229b7 100644 --- a/src/client/app/common/views/filters/user.ts +++ b/src/client/app/common/views/filters/user.ts @@ -11,5 +11,5 @@ Vue.filter('userName', user => { }); Vue.filter('userPage', (user, path?) => { - return '/@' + Vue.filter('acct')(user) + (path ? '/' + path : ''); + return `/@${Vue.filter('acct')(user)}${(path ? `/${path}` : '')}`; }); diff --git a/src/client/app/common/views/pages/follow.vue b/src/client/app/common/views/pages/follow.vue index 13d855d20a..ec74b3a9b9 100644 --- a/src/client/app/common/views/pages/follow.vue +++ b/src/client/app/common/views/pages/follow.vue @@ -1,6 +1,6 @@ <template> <div class="syxhndwprovvuqhmyvveewmbqayniwkv" v-if="!fetching" :data-darkmode="$store.state.device.darkmode"> - <div class="signed-in-as" v-html="'%i18n:@signed-in-as%'.replace('{}', '<b>' + myName + '</b>')"></div> + <div class="signed-in-as" v-html="'%i18n:@signed-in-as%'.replace('{}', `<b>${myName}`)"></div> <main> <div class="banner" :style="bannerStyle"></div> diff --git a/src/client/app/desktop/views/components/drive.folder.vue b/src/client/app/desktop/views/components/drive.folder.vue index 83880fef5c..e6b71f9426 100644 --- a/src/client/app/desktop/views/components/drive.folder.vue +++ b/src/client/app/desktop/views/components/drive.folder.vue @@ -163,7 +163,7 @@ export default Vue.extend({ }); break; default: - alert('%i18n:@unhandled-error% ' + err); + alert(`%i18n:@unhandled-error% ${err}`); } }); } diff --git a/src/client/app/desktop/views/components/drive.vue b/src/client/app/desktop/views/components/drive.vue index d919e4a5ea..cb289027d4 100644 --- a/src/client/app/desktop/views/components/drive.vue +++ b/src/client/app/desktop/views/components/drive.vue @@ -323,7 +323,7 @@ export default Vue.extend({ }); break; default: - alert('%i18n:@unhandled-error% ' + err); + alert(`%i18n:@unhandled-error% ${err}`); } }); } @@ -404,7 +404,7 @@ export default Vue.extend({ folder: folder }); } else { - window.open(url + '/i/drive/folder/' + folder.id, + window.open(`${url}/i/drive/folder/${folder.id}`, 'drive_window', 'height=500, width=800'); } diff --git a/src/client/app/desktop/views/components/media-image.vue b/src/client/app/desktop/views/components/media-image.vue index 8b68f260fa..52d029a269 100644 --- a/src/client/app/desktop/views/components/media-image.vue +++ b/src/client/app/desktop/views/components/media-image.vue @@ -48,7 +48,7 @@ export default Vue.extend({ const mouseY = e.clientY - rect.top; const xp = mouseX / this.$el.offsetWidth * 100; const yp = mouseY / this.$el.offsetHeight * 100; - this.$el.style.backgroundPosition = xp + '% ' + yp + '%'; + this.$el.style.backgroundPosition = `${xp}% ${yp}%'; this.$el.style.backgroundImage = `url("${this.image.url}")`; }, diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index bacaea65ee..eb8b40062a 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -110,9 +110,9 @@ export default Vue.extend({ computed: { draftId(): string { return this.renote - ? 'renote:' + this.renote.id + ? `renote:${this.renote.id}` : this.reply - ? 'reply:' + this.reply.id + ? `reply:${this.reply.id}` : 'note'; }, @@ -313,7 +313,7 @@ export default Vue.extend({ this.geo = pos.coords; this.$emit('geo-attached', this.geo); }, err => { - alert('%i18n:@error%: ' + err.message); + alert(`%i18n:@error%: ${err.message}`); }, { enableHighAccuracy: true }); diff --git a/src/client/app/desktop/views/pages/drive.vue b/src/client/app/desktop/views/pages/drive.vue index 217dcb7751..dec6c4551a 100644 --- a/src/client/app/desktop/views/pages/drive.vue +++ b/src/client/app/desktop/views/pages/drive.vue @@ -31,7 +31,7 @@ export default Vue.extend({ const title = folder.name + ' | %i18n:@title%'; // Rewrite URL - history.pushState(null, title, '/i/drive/folder/' + folder.id); + history.pushState(null, title, `/i/drive/folder/${folder.id}`); document.title = title; } diff --git a/src/client/app/desktop/views/pages/games/reversi.vue b/src/client/app/desktop/views/pages/games/reversi.vue index ce9b42c65f..1b0e790a22 100644 --- a/src/client/app/desktop/views/pages/games/reversi.vue +++ b/src/client/app/desktop/views/pages/games/reversi.vue @@ -16,10 +16,10 @@ export default Vue.extend({ methods: { nav(game, actualNav) { if (actualNav) { - this.$router.push('/reversi/' + game.id); + this.$router.push(`/reversi/${game.id}`); } else { // TODO: https://github.com/vuejs/vue-router/issues/703 - this.$router.push('/reversi/' + game.id); + this.$router.push(`/reversi/${game.id}`); } } } diff --git a/src/client/app/desktop/views/pages/messaging-room.vue b/src/client/app/desktop/views/pages/messaging-room.vue index 1ebd53cef4..4be33dda04 100644 --- a/src/client/app/desktop/views/pages/messaging-room.vue +++ b/src/client/app/desktop/views/pages/messaging-room.vue @@ -46,7 +46,7 @@ export default Vue.extend({ this.user = user; this.fetching = false; - document.title = 'メッセージ: ' + getUserName(this.user); + document.title = `メッセージ: ${getUserName(this.user)}`; Progress.done(); }); diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index b076cae26d..8b1f7b08c8 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -105,9 +105,9 @@ export default Vue.extend({ computed: { draftId(): string { return this.renote - ? 'renote:' + this.renote.id + ? `renote:${this.renote.id}` : this.reply - ? 'reply:' + this.reply.id + ? `reply:${this.reply.id}` : 'note'; }, @@ -229,7 +229,7 @@ export default Vue.extend({ navigator.geolocation.getCurrentPosition(pos => { this.geo = pos.coords; }, err => { - alert('%i18n:@error%: ' + err.message); + alert(`%i18n:@error%: ${err.message}`); }, { enableHighAccuracy: true }); diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue index 39ea513b76..54eed1b6d4 100644 --- a/src/client/app/mobile/views/components/ui.nav.vue +++ b/src/client/app/mobile/views/components/ui.nav.vue @@ -82,7 +82,7 @@ export default Vue.extend({ search() { const query = window.prompt('%i18n:@search%'); if (query == null || query == '') return; - this.$router.push('/search?q=' + encodeURIComponent(query)); + this.$router.push(`/search?q=${encodeURIComponent(query)}`); }, onReversiInvited() { this.hasGameInvitation = true; diff --git a/src/client/app/mobile/views/pages/drive.vue b/src/client/app/mobile/views/pages/drive.vue index 657f43c7c3..27ac956043 100644 --- a/src/client/app/mobile/views/pages/drive.vue +++ b/src/client/app/mobile/views/pages/drive.vue @@ -80,7 +80,7 @@ export default Vue.extend({ if (!silent) { // Rewrite URL - history.pushState(null, title, '/i/drive/folder/' + folder.id); + history.pushState(null, title, `/i/drive/folder/${folder.id}`); } document.title = title; @@ -93,7 +93,7 @@ export default Vue.extend({ if (!silent) { // Rewrite URL - history.pushState(null, title, '/i/drive/file/' + file.id); + history.pushState(null, title, `/i/drive/file/${file.id}`); } document.title = title; diff --git a/src/client/app/mobile/views/pages/followers.vue b/src/client/app/mobile/views/pages/followers.vue index 421c150856..601f6670c1 100644 --- a/src/client/app/mobile/views/pages/followers.vue +++ b/src/client/app/mobile/views/pages/followers.vue @@ -49,7 +49,7 @@ export default Vue.extend({ this.user = user; this.fetching = false; - document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + (this as any).os.instanceName; + document.title = `${'%i18n:@followers-of%'.replace('{}', this.name)} | ${(this as any).os.instanceName}`; }); }, onLoaded() { diff --git a/src/client/app/mobile/views/pages/following.vue b/src/client/app/mobile/views/pages/following.vue index ff201ff2bd..0efac6110e 100644 --- a/src/client/app/mobile/views/pages/following.vue +++ b/src/client/app/mobile/views/pages/following.vue @@ -48,7 +48,7 @@ export default Vue.extend({ this.user = user; this.fetching = false; - document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + (this as any).os.instanceName; + document.title = `${'%i18n:@followers-of%'.replace('{}', this.name)} | ${(this as any).os.instanceName}`; }); }, onLoaded() { diff --git a/src/client/app/mobile/views/pages/games/reversi.vue b/src/client/app/mobile/views/pages/games/reversi.vue index d6849a1c11..bdadc88a43 100644 --- a/src/client/app/mobile/views/pages/games/reversi.vue +++ b/src/client/app/mobile/views/pages/games/reversi.vue @@ -16,10 +16,10 @@ export default Vue.extend({ methods: { nav(game, actualNav) { if (actualNav) { - this.$router.push('/reversi/' + game.id); + this.$router.push(`/reversi/${game.id}`); } else { // TODO: https://github.com/vuejs/vue-router/issues/703 - this.$router.push('/reversi/' + game.id); + this.$router.push(`/reversi/${game.id}`); } } } diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index 7437eb8b47..838ffd2a6b 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -2,7 +2,7 @@ <mk-ui> <span slot="header">%fa:cog%%i18n:@settings%</span> <main :data-darkmode="$store.state.device.darkmode"> - <div class="signin-as" v-html="'%i18n:@signed-in-as%'.replace('{}', '<b>' + name + '</b>')"></div> + <div class="signin-as" v-html="'%i18n:@signed-in-as%'.replace('{}', `<b>${name}</b>`)"></div> <div> <x-profile/> diff --git a/src/client/app/mobile/views/pages/user-lists.vue b/src/client/app/mobile/views/pages/user-lists.vue index abd04c1496..5ee0636dea 100644 --- a/src/client/app/mobile/views/pages/user-lists.vue +++ b/src/client/app/mobile/views/pages/user-lists.vue @@ -43,7 +43,7 @@ export default Vue.extend({ title }); - this.$router.push('/i/lists/' + list.id); + this.$router.push(`/i/lists/${list.id}`); }); } } diff --git a/src/client/app/mobile/views/pages/user.vue b/src/client/app/mobile/views/pages/user.vue index 8918847a8f..ddea43c9f2 100644 --- a/src/client/app/mobile/views/pages/user.vue +++ b/src/client/app/mobile/views/pages/user.vue @@ -107,7 +107,7 @@ export default Vue.extend({ this.fetching = false; Progress.done(); - document.title = Vue.filter('userName')(this.user) + ' | ' + (this as any).os.instanceName; + document.title = `${Vue.filter('userName')(this.user)} | ${(this as any).os.instanceName}`; }); } } diff --git a/src/daemons/notes-stats.ts b/src/daemons/notes-stats.ts index 3d2c4820a6..bddb54cfa5 100644 --- a/src/daemons/notes-stats.ts +++ b/src/daemons/notes-stats.ts @@ -16,7 +16,7 @@ export default function() { }); ev.on('requestNotesStatsLog', id => { - ev.emit('notesStatsLog:' + id, log.toArray()); + ev.emit(`notesStatsLog:${id}`, log.toArray()); }); process.on('exit', code => { diff --git a/src/daemons/server-stats.ts b/src/daemons/server-stats.ts index 4a653f81f4..9bb43fe84e 100644 --- a/src/daemons/server-stats.ts +++ b/src/daemons/server-stats.ts @@ -16,7 +16,7 @@ export default function() { const log = new Deque<any>(); ev.on('requestServerStatsLog', x => { - ev.emit('serverStatsLog:' + x.id, log.toArray().slice(0, x.length || 50)); + ev.emit(`serverStatsLog:${x.id}`, log.toArray().slice(0, x.length || 50)); }); async function tick() { diff --git a/src/mfm/html-to-mfm.ts b/src/mfm/html-to-mfm.ts index e2681f5447..b476a9af5c 100644 --- a/src/mfm/html-to-mfm.ts +++ b/src/mfm/html-to-mfm.ts @@ -45,7 +45,7 @@ export default function(html: string): string { if (part.length == 2) { //#region ホスト名部分が省略されているので復元する - const acct = txt + '@' + (new URL(href.value)).hostname; + const acct = `${txt}@${(new URL(href.value)).hostname}`; text += acct; break; //#endregion diff --git a/src/mfm/html.ts b/src/mfm/html.ts index c798ee410a..2e38fe10a0 100644 --- a/src/mfm/html.ts +++ b/src/mfm/html.ts @@ -44,8 +44,8 @@ const handlers: { [key: string]: (window: any, token: any, mentionedRemoteUsers: hashtag({ document }, { hashtag }) { const a = document.createElement('a'); - a.href = config.url + '/tags/' + hashtag; - a.textContent = '#' + hashtag; + a.href = `${config.url}/tags/${hashtag}`; + a.textContent = `#${hashtag}`; a.setAttribute('rel', 'tag'); document.body.appendChild(a); }, diff --git a/src/misc/fa.ts b/src/misc/fa.ts index 8be06362c3..90cdac89b2 100644 --- a/src/misc/fa.ts +++ b/src/misc/fa.ts @@ -26,7 +26,7 @@ export const replacement = (match: string, key: string) => { arg == 'B' ? 'fab' : ''; } else if (arg.startsWith('.')) { - classes.push('fa-' + arg.substr(1)); + classes.push(`fa-${arg.substr(1)}`); } else if (arg.startsWith('-')) { transform = arg.substr(1).split('|').join(' '); } else { diff --git a/src/remote/activitypub/renderer/hashtag.ts b/src/remote/activitypub/renderer/hashtag.ts index a37ba63532..36563c2df5 100644 --- a/src/remote/activitypub/renderer/hashtag.ts +++ b/src/remote/activitypub/renderer/hashtag.ts @@ -3,5 +3,5 @@ import config from '../../../config'; export default (tag: string) => ({ type: 'Hashtag', href: `${config.url}/tags/${encodeURIComponent(tag)}`, - name: '#' + tag + name: `#${tag}` }); diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts index 1007790ca6..f04f9e91e9 100644 --- a/src/server/activitypub.ts +++ b/src/server/activitypub.ts @@ -22,7 +22,7 @@ const router = new Router(); function inbox(ctx: Router.IRouterContext) { let signature; - ctx.req.headers.authorization = 'Signature ' + ctx.req.headers.signature; + ctx.req.headers.authorization = `Signature ${ctx.req.headers.signature}`; try { signature = httpSignature.parseRequest(ctx.req, { 'headers': [] }); diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts index d4a44070e6..2b00094269 100644 --- a/src/server/api/endpoints.ts +++ b/src/server/api/endpoints.ts @@ -79,7 +79,7 @@ const files = glob.sync('**/*.js', { }); const endpoints: IEndpoint[] = files.map(f => { - const ep = require('./endpoints/' + f); + const ep = require(`./endpoints/${f}`); return { name: f.replace('.js', ''), diff --git a/src/server/api/stream/notes-stats.ts b/src/server/api/stream/notes-stats.ts index ab00620018..ba99403226 100644 --- a/src/server/api/stream/notes-stats.ts +++ b/src/server/api/stream/notes-stats.ts @@ -16,7 +16,7 @@ export default function(request: websocket.request, connection: websocket.connec switch (msg.type) { case 'requestLog': - ev.once('notesStatsLog:' + msg.id, statsLog => { + ev.once(`notesStatsLog:${msg.id}`, statsLog => { connection.send(JSON.stringify({ type: 'statsLog', body: statsLog diff --git a/src/server/api/stream/server-stats.ts b/src/server/api/stream/server-stats.ts index f6c1f14ebe..d4fbeefa04 100644 --- a/src/server/api/stream/server-stats.ts +++ b/src/server/api/stream/server-stats.ts @@ -16,7 +16,7 @@ export default function(request: websocket.request, connection: websocket.connec switch (msg.type) { case 'requestLog': - ev.once('serverStatsLog:' + msg.id, statsLog => { + ev.once(`serverStatsLog:${msg.id}`, statsLog => { connection.send(JSON.stringify({ type: 'statsLog', body: statsLog diff --git a/src/server/web/docs.ts b/src/server/web/docs.ts index 81e5ace3e8..14ccbdd04f 100644 --- a/src/server/web/docs.ts +++ b/src/server/web/docs.ts @@ -196,7 +196,7 @@ router.get('/*/api/entities/*', async ctx => { const lang = ctx.params[0]; const entity = ctx.params[1]; - const x = yaml.safeLoad(fs.readFileSync(path.resolve(__dirname + '/../../../src/docs/api/entities/' + entity + '.yaml'), 'utf-8')) as any; + const x = yaml.safeLoad(fs.readFileSync(path.resolve(`${__dirname}/../../../src/docs/api/entities/${entity}.yaml`), 'utf-8')) as any; await ctx.render('../../../../src/docs/api/entities/view', Object.assign(await genVars(lang), { id: `api/entities/${entity}`, diff --git a/src/server/web/views/user.pug b/src/server/web/views/user.pug index b5ea2f6eb4..98a53ab549 100644 --- a/src/server/web/views/user.pug +++ b/src/server/web/views/user.pug @@ -2,7 +2,7 @@ extends ../../../../src/client/app/base block vars - const title = user.name ? `${user.name} (@${user.username})` : `@${user.username}`; - - const url = config.url + '/@' + (user.host ? `${user.username}@${user.host}` : user.username); + - const url = `${config.url}/@${(user.host ? `${user.username}@${user.host}` : user.username)}`; - const img = user.avatarId ? `${config.drive_url}/${user.avatarId}` : null; block title diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index 1da0f49a24..d1c7051ab0 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -40,7 +40,7 @@ async function save(path: string, name: string, type: string, hash: string, size const thumbnailKey = `${config.drive.prefix}/${uuid.v4()}/${name}.thumbnail.jpg`; const baseUrl = config.drive.baseUrl - || `${ config.drive.config.useSSL ? 'https' : 'http' }://${ config.drive.config.endPoint }${ config.drive.config.port ? ':' + config.drive.config.port : '' }/${ config.drive.bucket }`; + || `${ config.drive.config.useSSL ? 'https' : 'http' }://${ config.drive.config.endPoint }${ config.drive.config.port ? `:${config.drive.config.port}` : '' }/${ config.drive.bucket }`; await minio.putObject(config.drive.bucket, key, fs.createReadStream(path), size, { 'Content-Type': type, diff --git a/webpack.config.ts b/webpack.config.ts index ad67530f51..341d4c7022 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -20,7 +20,7 @@ const constants = require('./src/const.json'); const locales = require('./locales'); const meta = require('./package.json'); -const version = meta.clientVersion + '-' + rndstr({ length: 8, chars: '0-9a-z' }); +const version = `${meta.clientVersion}-${rndstr({ length: 8, chars: '0-9a-z' })}`; const codename = meta.codename; declare var global: { @@ -42,7 +42,7 @@ global['collapseSpacesReplacement'] = (html: string) => { }; global['base64replacement'] = (_: any, key: string) => { - return fs.readFileSync(__dirname + '/src/client/' + key, 'base64'); + return fs.readFileSync(`${__dirname}/src/client/${key}`, 'base64'); }; global['i18nReplacement'] = i18nReplacement; From d8dcc4da275230e332fad0eb6ce09703d08aec30 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sat, 1 Sep 2018 23:12:51 +0900 Subject: [PATCH 053/539] Use string interpolation --- src/client/app/auth/views/index.vue | 2 +- src/client/app/boot.js | 2 +- src/client/app/common/scripts/streaming/stream.ts | 4 ++-- src/client/app/common/views/components/autocomplete.vue | 4 ++-- .../views/components/connect-failed.troubleshooter.vue | 2 +- src/client/app/common/views/components/url-preview.vue | 2 +- src/client/app/common/views/directives/autocomplete.ts | 4 ++-- src/client/app/common/views/filters/note.ts | 2 +- src/client/app/common/views/filters/user.ts | 2 +- src/client/app/common/views/pages/follow.vue | 2 +- src/client/app/desktop/views/components/drive.folder.vue | 2 +- src/client/app/desktop/views/components/drive.vue | 4 ++-- src/client/app/desktop/views/components/media-image.vue | 2 +- src/client/app/desktop/views/components/post-form.vue | 6 +++--- src/client/app/desktop/views/pages/drive.vue | 2 +- src/client/app/desktop/views/pages/games/reversi.vue | 4 ++-- src/client/app/desktop/views/pages/messaging-room.vue | 2 +- src/client/app/mobile/views/components/post-form.vue | 6 +++--- src/client/app/mobile/views/components/ui.nav.vue | 2 +- src/client/app/mobile/views/pages/drive.vue | 4 ++-- src/client/app/mobile/views/pages/followers.vue | 2 +- src/client/app/mobile/views/pages/following.vue | 2 +- src/client/app/mobile/views/pages/games/reversi.vue | 4 ++-- src/client/app/mobile/views/pages/settings.vue | 2 +- src/client/app/mobile/views/pages/user-lists.vue | 2 +- src/client/app/mobile/views/pages/user.vue | 2 +- src/daemons/notes-stats.ts | 2 +- src/daemons/server-stats.ts | 2 +- src/mfm/html-to-mfm.ts | 2 +- src/mfm/html.ts | 4 ++-- src/misc/fa.ts | 2 +- src/remote/activitypub/renderer/hashtag.ts | 2 +- src/server/activitypub.ts | 2 +- src/server/api/endpoints.ts | 2 +- src/server/api/stream/notes-stats.ts | 2 +- src/server/api/stream/server-stats.ts | 2 +- src/server/web/docs.ts | 2 +- src/server/web/views/user.pug | 2 +- src/services/drive/add-file.ts | 2 +- webpack.config.ts | 4 ++-- 40 files changed, 53 insertions(+), 53 deletions(-) diff --git a/src/client/app/auth/views/index.vue b/src/client/app/auth/views/index.vue index 609e758994..ba7df911e5 100644 --- a/src/client/app/auth/views/index.vue +++ b/src/client/app/auth/views/index.vue @@ -80,7 +80,7 @@ export default Vue.extend({ accepted() { this.state = 'accepted'; if (this.session.app.callbackUrl) { - location.href = this.session.app.callbackUrl + '?token=' + this.session.token; + location.href = `${this.session.app.callbackUrl}?token=${this.session.token}`; } } } diff --git a/src/client/app/boot.js b/src/client/app/boot.js index 54397c98c6..dd2cf93a89 100644 --- a/src/client/app/boot.js +++ b/src/client/app/boot.js @@ -94,7 +94,7 @@ // Get salt query const salt = localStorage.getItem('salt') - ? '?salt=' + localStorage.getItem('salt') + ? `?salt=${localStorage.getItem('salt')}` : ''; // Load an app script diff --git a/src/client/app/common/scripts/streaming/stream.ts b/src/client/app/common/scripts/streaming/stream.ts index fefa8e5ced..4ab78f1190 100644 --- a/src/client/app/common/scripts/streaming/stream.ts +++ b/src/client/app/common/scripts/streaming/stream.ts @@ -44,11 +44,11 @@ export default class Connection extends EventEmitter { const query = params ? Object.keys(params) - .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(params[k])) + .map(k => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`) .join('&') : null; - this.socket = new ReconnectingWebsocket(`${wsUrl}/${endpoint}${query ? '?' + query : ''}`); + this.socket = new ReconnectingWebsocket(`${wsUrl}/${endpoint}${query ? `?${query}` : ''}`); this.socket.addEventListener('open', this.onOpen); this.socket.addEventListener('close', this.onClose); this.socket.addEventListener('message', this.onMessage); diff --git a/src/client/app/common/views/components/autocomplete.vue b/src/client/app/common/views/components/autocomplete.vue index b274eaa0a0..ea05afd6dc 100644 --- a/src/client/app/common/views/components/autocomplete.vue +++ b/src/client/app/common/views/components/autocomplete.vue @@ -125,7 +125,7 @@ export default Vue.extend({ } if (this.type == 'user') { - const cacheKey = 'autocomplete:user:' + this.q; + const cacheKey = `autocomplete:user:${this.q}`; const cache = sessionStorage.getItem(cacheKey); if (cache) { const users = JSON.parse(cache); @@ -148,7 +148,7 @@ export default Vue.extend({ this.hashtags = JSON.parse(localStorage.getItem('hashtags') || '[]'); this.fetching = false; } else { - const cacheKey = 'autocomplete:hashtag:' + this.q; + const cacheKey = `autocomplete:hashtag:${this.q}`; const cache = sessionStorage.getItem(cacheKey); if (cache) { const hashtags = JSON.parse(cache); diff --git a/src/client/app/common/views/components/connect-failed.troubleshooter.vue b/src/client/app/common/views/components/connect-failed.troubleshooter.vue index 6c23cc7969..f64cae6b4b 100644 --- a/src/client/app/common/views/components/connect-failed.troubleshooter.vue +++ b/src/client/app/common/views/components/connect-failed.troubleshooter.vue @@ -57,7 +57,7 @@ export default Vue.extend({ } // Check internet connection - fetch('https://google.com?rand=' + Math.random(), { + fetch(`https://google.com?rand=${Math.random()}`, { mode: 'no-cors' }).then(() => { this.internet = true; diff --git a/src/client/app/common/views/components/url-preview.vue b/src/client/app/common/views/components/url-preview.vue index d5dda0c80a..e182e7f8cb 100644 --- a/src/client/app/common/views/components/url-preview.vue +++ b/src/client/app/common/views/components/url-preview.vue @@ -170,7 +170,7 @@ export default Vue.extend({ return; } - fetch('/url?url=' + encodeURIComponent(this.url)).then(res => { + fetch(`/url?url=${encodeURIComponent(this.url)}`).then(res => { res.json().then(info => { if (info.url == null) return; this.title = info.title; diff --git a/src/client/app/common/views/directives/autocomplete.ts b/src/client/app/common/views/directives/autocomplete.ts index b252cf5c1f..26bc13871d 100644 --- a/src/client/app/common/views/directives/autocomplete.ts +++ b/src/client/app/common/views/directives/autocomplete.ts @@ -191,7 +191,7 @@ class Autocomplete { const acct = renderAcct(value); // 挿入 - this.text = trimmedBefore + '@' + acct + ' ' + after; + this.text = `${trimmedBefore}@${acct} ${after}`; // キャレットを戻す this.vm.$nextTick(() => { @@ -207,7 +207,7 @@ class Autocomplete { const after = source.substr(caret); // 挿入 - this.text = trimmedBefore + '#' + value + ' ' + after; + this.text = `${trimmedBefore}#${value} ${after}`; // キャレットを戻す this.vm.$nextTick(() => { diff --git a/src/client/app/common/views/filters/note.ts b/src/client/app/common/views/filters/note.ts index a611dc8685..3c9c8b7485 100644 --- a/src/client/app/common/views/filters/note.ts +++ b/src/client/app/common/views/filters/note.ts @@ -1,5 +1,5 @@ import Vue from 'vue'; Vue.filter('notePage', note => { - return '/notes/' + note.id; + return `/notes/${note.id}`; }); diff --git a/src/client/app/common/views/filters/user.ts b/src/client/app/common/views/filters/user.ts index ca0910fc53..e5220229b7 100644 --- a/src/client/app/common/views/filters/user.ts +++ b/src/client/app/common/views/filters/user.ts @@ -11,5 +11,5 @@ Vue.filter('userName', user => { }); Vue.filter('userPage', (user, path?) => { - return '/@' + Vue.filter('acct')(user) + (path ? '/' + path : ''); + return `/@${Vue.filter('acct')(user)}${(path ? `/${path}` : '')}`; }); diff --git a/src/client/app/common/views/pages/follow.vue b/src/client/app/common/views/pages/follow.vue index 13d855d20a..ec74b3a9b9 100644 --- a/src/client/app/common/views/pages/follow.vue +++ b/src/client/app/common/views/pages/follow.vue @@ -1,6 +1,6 @@ <template> <div class="syxhndwprovvuqhmyvveewmbqayniwkv" v-if="!fetching" :data-darkmode="$store.state.device.darkmode"> - <div class="signed-in-as" v-html="'%i18n:@signed-in-as%'.replace('{}', '<b>' + myName + '</b>')"></div> + <div class="signed-in-as" v-html="'%i18n:@signed-in-as%'.replace('{}', `<b>${myName}`)"></div> <main> <div class="banner" :style="bannerStyle"></div> diff --git a/src/client/app/desktop/views/components/drive.folder.vue b/src/client/app/desktop/views/components/drive.folder.vue index 83880fef5c..e6b71f9426 100644 --- a/src/client/app/desktop/views/components/drive.folder.vue +++ b/src/client/app/desktop/views/components/drive.folder.vue @@ -163,7 +163,7 @@ export default Vue.extend({ }); break; default: - alert('%i18n:@unhandled-error% ' + err); + alert(`%i18n:@unhandled-error% ${err}`); } }); } diff --git a/src/client/app/desktop/views/components/drive.vue b/src/client/app/desktop/views/components/drive.vue index d919e4a5ea..cb289027d4 100644 --- a/src/client/app/desktop/views/components/drive.vue +++ b/src/client/app/desktop/views/components/drive.vue @@ -323,7 +323,7 @@ export default Vue.extend({ }); break; default: - alert('%i18n:@unhandled-error% ' + err); + alert(`%i18n:@unhandled-error% ${err}`); } }); } @@ -404,7 +404,7 @@ export default Vue.extend({ folder: folder }); } else { - window.open(url + '/i/drive/folder/' + folder.id, + window.open(`${url}/i/drive/folder/${folder.id}`, 'drive_window', 'height=500, width=800'); } diff --git a/src/client/app/desktop/views/components/media-image.vue b/src/client/app/desktop/views/components/media-image.vue index 8b68f260fa..52d029a269 100644 --- a/src/client/app/desktop/views/components/media-image.vue +++ b/src/client/app/desktop/views/components/media-image.vue @@ -48,7 +48,7 @@ export default Vue.extend({ const mouseY = e.clientY - rect.top; const xp = mouseX / this.$el.offsetWidth * 100; const yp = mouseY / this.$el.offsetHeight * 100; - this.$el.style.backgroundPosition = xp + '% ' + yp + '%'; + this.$el.style.backgroundPosition = `${xp}% ${yp}%'; this.$el.style.backgroundImage = `url("${this.image.url}")`; }, diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index bacaea65ee..eb8b40062a 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -110,9 +110,9 @@ export default Vue.extend({ computed: { draftId(): string { return this.renote - ? 'renote:' + this.renote.id + ? `renote:${this.renote.id}` : this.reply - ? 'reply:' + this.reply.id + ? `reply:${this.reply.id}` : 'note'; }, @@ -313,7 +313,7 @@ export default Vue.extend({ this.geo = pos.coords; this.$emit('geo-attached', this.geo); }, err => { - alert('%i18n:@error%: ' + err.message); + alert(`%i18n:@error%: ${err.message}`); }, { enableHighAccuracy: true }); diff --git a/src/client/app/desktop/views/pages/drive.vue b/src/client/app/desktop/views/pages/drive.vue index 217dcb7751..dec6c4551a 100644 --- a/src/client/app/desktop/views/pages/drive.vue +++ b/src/client/app/desktop/views/pages/drive.vue @@ -31,7 +31,7 @@ export default Vue.extend({ const title = folder.name + ' | %i18n:@title%'; // Rewrite URL - history.pushState(null, title, '/i/drive/folder/' + folder.id); + history.pushState(null, title, `/i/drive/folder/${folder.id}`); document.title = title; } diff --git a/src/client/app/desktop/views/pages/games/reversi.vue b/src/client/app/desktop/views/pages/games/reversi.vue index ce9b42c65f..1b0e790a22 100644 --- a/src/client/app/desktop/views/pages/games/reversi.vue +++ b/src/client/app/desktop/views/pages/games/reversi.vue @@ -16,10 +16,10 @@ export default Vue.extend({ methods: { nav(game, actualNav) { if (actualNav) { - this.$router.push('/reversi/' + game.id); + this.$router.push(`/reversi/${game.id}`); } else { // TODO: https://github.com/vuejs/vue-router/issues/703 - this.$router.push('/reversi/' + game.id); + this.$router.push(`/reversi/${game.id}`); } } } diff --git a/src/client/app/desktop/views/pages/messaging-room.vue b/src/client/app/desktop/views/pages/messaging-room.vue index 1ebd53cef4..4be33dda04 100644 --- a/src/client/app/desktop/views/pages/messaging-room.vue +++ b/src/client/app/desktop/views/pages/messaging-room.vue @@ -46,7 +46,7 @@ export default Vue.extend({ this.user = user; this.fetching = false; - document.title = 'メッセージ: ' + getUserName(this.user); + document.title = `メッセージ: ${getUserName(this.user)}`; Progress.done(); }); diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index b076cae26d..8b1f7b08c8 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -105,9 +105,9 @@ export default Vue.extend({ computed: { draftId(): string { return this.renote - ? 'renote:' + this.renote.id + ? `renote:${this.renote.id}` : this.reply - ? 'reply:' + this.reply.id + ? `reply:${this.reply.id}` : 'note'; }, @@ -229,7 +229,7 @@ export default Vue.extend({ navigator.geolocation.getCurrentPosition(pos => { this.geo = pos.coords; }, err => { - alert('%i18n:@error%: ' + err.message); + alert(`%i18n:@error%: ${err.message}`); }, { enableHighAccuracy: true }); diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue index 39ea513b76..54eed1b6d4 100644 --- a/src/client/app/mobile/views/components/ui.nav.vue +++ b/src/client/app/mobile/views/components/ui.nav.vue @@ -82,7 +82,7 @@ export default Vue.extend({ search() { const query = window.prompt('%i18n:@search%'); if (query == null || query == '') return; - this.$router.push('/search?q=' + encodeURIComponent(query)); + this.$router.push(`/search?q=${encodeURIComponent(query)}`); }, onReversiInvited() { this.hasGameInvitation = true; diff --git a/src/client/app/mobile/views/pages/drive.vue b/src/client/app/mobile/views/pages/drive.vue index 657f43c7c3..27ac956043 100644 --- a/src/client/app/mobile/views/pages/drive.vue +++ b/src/client/app/mobile/views/pages/drive.vue @@ -80,7 +80,7 @@ export default Vue.extend({ if (!silent) { // Rewrite URL - history.pushState(null, title, '/i/drive/folder/' + folder.id); + history.pushState(null, title, `/i/drive/folder/${folder.id}`); } document.title = title; @@ -93,7 +93,7 @@ export default Vue.extend({ if (!silent) { // Rewrite URL - history.pushState(null, title, '/i/drive/file/' + file.id); + history.pushState(null, title, `/i/drive/file/${file.id}`); } document.title = title; diff --git a/src/client/app/mobile/views/pages/followers.vue b/src/client/app/mobile/views/pages/followers.vue index 421c150856..601f6670c1 100644 --- a/src/client/app/mobile/views/pages/followers.vue +++ b/src/client/app/mobile/views/pages/followers.vue @@ -49,7 +49,7 @@ export default Vue.extend({ this.user = user; this.fetching = false; - document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + (this as any).os.instanceName; + document.title = `${'%i18n:@followers-of%'.replace('{}', this.name)} | ${(this as any).os.instanceName}`; }); }, onLoaded() { diff --git a/src/client/app/mobile/views/pages/following.vue b/src/client/app/mobile/views/pages/following.vue index ff201ff2bd..0efac6110e 100644 --- a/src/client/app/mobile/views/pages/following.vue +++ b/src/client/app/mobile/views/pages/following.vue @@ -48,7 +48,7 @@ export default Vue.extend({ this.user = user; this.fetching = false; - document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + (this as any).os.instanceName; + document.title = `${'%i18n:@followers-of%'.replace('{}', this.name)} | ${(this as any).os.instanceName}`; }); }, onLoaded() { diff --git a/src/client/app/mobile/views/pages/games/reversi.vue b/src/client/app/mobile/views/pages/games/reversi.vue index d6849a1c11..bdadc88a43 100644 --- a/src/client/app/mobile/views/pages/games/reversi.vue +++ b/src/client/app/mobile/views/pages/games/reversi.vue @@ -16,10 +16,10 @@ export default Vue.extend({ methods: { nav(game, actualNav) { if (actualNav) { - this.$router.push('/reversi/' + game.id); + this.$router.push(`/reversi/${game.id}`); } else { // TODO: https://github.com/vuejs/vue-router/issues/703 - this.$router.push('/reversi/' + game.id); + this.$router.push(`/reversi/${game.id}`); } } } diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index 7437eb8b47..838ffd2a6b 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -2,7 +2,7 @@ <mk-ui> <span slot="header">%fa:cog%%i18n:@settings%</span> <main :data-darkmode="$store.state.device.darkmode"> - <div class="signin-as" v-html="'%i18n:@signed-in-as%'.replace('{}', '<b>' + name + '</b>')"></div> + <div class="signin-as" v-html="'%i18n:@signed-in-as%'.replace('{}', `<b>${name}</b>`)"></div> <div> <x-profile/> diff --git a/src/client/app/mobile/views/pages/user-lists.vue b/src/client/app/mobile/views/pages/user-lists.vue index abd04c1496..5ee0636dea 100644 --- a/src/client/app/mobile/views/pages/user-lists.vue +++ b/src/client/app/mobile/views/pages/user-lists.vue @@ -43,7 +43,7 @@ export default Vue.extend({ title }); - this.$router.push('/i/lists/' + list.id); + this.$router.push(`/i/lists/${list.id}`); }); } } diff --git a/src/client/app/mobile/views/pages/user.vue b/src/client/app/mobile/views/pages/user.vue index 8918847a8f..ddea43c9f2 100644 --- a/src/client/app/mobile/views/pages/user.vue +++ b/src/client/app/mobile/views/pages/user.vue @@ -107,7 +107,7 @@ export default Vue.extend({ this.fetching = false; Progress.done(); - document.title = Vue.filter('userName')(this.user) + ' | ' + (this as any).os.instanceName; + document.title = `${Vue.filter('userName')(this.user)} | ${(this as any).os.instanceName}`; }); } } diff --git a/src/daemons/notes-stats.ts b/src/daemons/notes-stats.ts index 3d2c4820a6..bddb54cfa5 100644 --- a/src/daemons/notes-stats.ts +++ b/src/daemons/notes-stats.ts @@ -16,7 +16,7 @@ export default function() { }); ev.on('requestNotesStatsLog', id => { - ev.emit('notesStatsLog:' + id, log.toArray()); + ev.emit(`notesStatsLog:${id}`, log.toArray()); }); process.on('exit', code => { diff --git a/src/daemons/server-stats.ts b/src/daemons/server-stats.ts index 4a653f81f4..9bb43fe84e 100644 --- a/src/daemons/server-stats.ts +++ b/src/daemons/server-stats.ts @@ -16,7 +16,7 @@ export default function() { const log = new Deque<any>(); ev.on('requestServerStatsLog', x => { - ev.emit('serverStatsLog:' + x.id, log.toArray().slice(0, x.length || 50)); + ev.emit(`serverStatsLog:${x.id}`, log.toArray().slice(0, x.length || 50)); }); async function tick() { diff --git a/src/mfm/html-to-mfm.ts b/src/mfm/html-to-mfm.ts index e2681f5447..b476a9af5c 100644 --- a/src/mfm/html-to-mfm.ts +++ b/src/mfm/html-to-mfm.ts @@ -45,7 +45,7 @@ export default function(html: string): string { if (part.length == 2) { //#region ホスト名部分が省略されているので復元する - const acct = txt + '@' + (new URL(href.value)).hostname; + const acct = `${txt}@${(new URL(href.value)).hostname}`; text += acct; break; //#endregion diff --git a/src/mfm/html.ts b/src/mfm/html.ts index c798ee410a..2e38fe10a0 100644 --- a/src/mfm/html.ts +++ b/src/mfm/html.ts @@ -44,8 +44,8 @@ const handlers: { [key: string]: (window: any, token: any, mentionedRemoteUsers: hashtag({ document }, { hashtag }) { const a = document.createElement('a'); - a.href = config.url + '/tags/' + hashtag; - a.textContent = '#' + hashtag; + a.href = `${config.url}/tags/${hashtag}`; + a.textContent = `#${hashtag}`; a.setAttribute('rel', 'tag'); document.body.appendChild(a); }, diff --git a/src/misc/fa.ts b/src/misc/fa.ts index 8be06362c3..90cdac89b2 100644 --- a/src/misc/fa.ts +++ b/src/misc/fa.ts @@ -26,7 +26,7 @@ export const replacement = (match: string, key: string) => { arg == 'B' ? 'fab' : ''; } else if (arg.startsWith('.')) { - classes.push('fa-' + arg.substr(1)); + classes.push(`fa-${arg.substr(1)}`); } else if (arg.startsWith('-')) { transform = arg.substr(1).split('|').join(' '); } else { diff --git a/src/remote/activitypub/renderer/hashtag.ts b/src/remote/activitypub/renderer/hashtag.ts index a37ba63532..36563c2df5 100644 --- a/src/remote/activitypub/renderer/hashtag.ts +++ b/src/remote/activitypub/renderer/hashtag.ts @@ -3,5 +3,5 @@ import config from '../../../config'; export default (tag: string) => ({ type: 'Hashtag', href: `${config.url}/tags/${encodeURIComponent(tag)}`, - name: '#' + tag + name: `#${tag}` }); diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts index 1007790ca6..f04f9e91e9 100644 --- a/src/server/activitypub.ts +++ b/src/server/activitypub.ts @@ -22,7 +22,7 @@ const router = new Router(); function inbox(ctx: Router.IRouterContext) { let signature; - ctx.req.headers.authorization = 'Signature ' + ctx.req.headers.signature; + ctx.req.headers.authorization = `Signature ${ctx.req.headers.signature}`; try { signature = httpSignature.parseRequest(ctx.req, { 'headers': [] }); diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts index d4a44070e6..2b00094269 100644 --- a/src/server/api/endpoints.ts +++ b/src/server/api/endpoints.ts @@ -79,7 +79,7 @@ const files = glob.sync('**/*.js', { }); const endpoints: IEndpoint[] = files.map(f => { - const ep = require('./endpoints/' + f); + const ep = require(`./endpoints/${f}`); return { name: f.replace('.js', ''), diff --git a/src/server/api/stream/notes-stats.ts b/src/server/api/stream/notes-stats.ts index ab00620018..ba99403226 100644 --- a/src/server/api/stream/notes-stats.ts +++ b/src/server/api/stream/notes-stats.ts @@ -16,7 +16,7 @@ export default function(request: websocket.request, connection: websocket.connec switch (msg.type) { case 'requestLog': - ev.once('notesStatsLog:' + msg.id, statsLog => { + ev.once(`notesStatsLog:${msg.id}`, statsLog => { connection.send(JSON.stringify({ type: 'statsLog', body: statsLog diff --git a/src/server/api/stream/server-stats.ts b/src/server/api/stream/server-stats.ts index f6c1f14ebe..d4fbeefa04 100644 --- a/src/server/api/stream/server-stats.ts +++ b/src/server/api/stream/server-stats.ts @@ -16,7 +16,7 @@ export default function(request: websocket.request, connection: websocket.connec switch (msg.type) { case 'requestLog': - ev.once('serverStatsLog:' + msg.id, statsLog => { + ev.once(`serverStatsLog:${msg.id}`, statsLog => { connection.send(JSON.stringify({ type: 'statsLog', body: statsLog diff --git a/src/server/web/docs.ts b/src/server/web/docs.ts index 81e5ace3e8..14ccbdd04f 100644 --- a/src/server/web/docs.ts +++ b/src/server/web/docs.ts @@ -196,7 +196,7 @@ router.get('/*/api/entities/*', async ctx => { const lang = ctx.params[0]; const entity = ctx.params[1]; - const x = yaml.safeLoad(fs.readFileSync(path.resolve(__dirname + '/../../../src/docs/api/entities/' + entity + '.yaml'), 'utf-8')) as any; + const x = yaml.safeLoad(fs.readFileSync(path.resolve(`${__dirname}/../../../src/docs/api/entities/${entity}.yaml`), 'utf-8')) as any; await ctx.render('../../../../src/docs/api/entities/view', Object.assign(await genVars(lang), { id: `api/entities/${entity}`, diff --git a/src/server/web/views/user.pug b/src/server/web/views/user.pug index b5ea2f6eb4..98a53ab549 100644 --- a/src/server/web/views/user.pug +++ b/src/server/web/views/user.pug @@ -2,7 +2,7 @@ extends ../../../../src/client/app/base block vars - const title = user.name ? `${user.name} (@${user.username})` : `@${user.username}`; - - const url = config.url + '/@' + (user.host ? `${user.username}@${user.host}` : user.username); + - const url = `${config.url}/@${(user.host ? `${user.username}@${user.host}` : user.username)}`; - const img = user.avatarId ? `${config.drive_url}/${user.avatarId}` : null; block title diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index 1da0f49a24..d1c7051ab0 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -40,7 +40,7 @@ async function save(path: string, name: string, type: string, hash: string, size const thumbnailKey = `${config.drive.prefix}/${uuid.v4()}/${name}.thumbnail.jpg`; const baseUrl = config.drive.baseUrl - || `${ config.drive.config.useSSL ? 'https' : 'http' }://${ config.drive.config.endPoint }${ config.drive.config.port ? ':' + config.drive.config.port : '' }/${ config.drive.bucket }`; + || `${ config.drive.config.useSSL ? 'https' : 'http' }://${ config.drive.config.endPoint }${ config.drive.config.port ? `:${config.drive.config.port}` : '' }/${ config.drive.bucket }`; await minio.putObject(config.drive.bucket, key, fs.createReadStream(path), size, { 'Content-Type': type, diff --git a/webpack.config.ts b/webpack.config.ts index ad67530f51..341d4c7022 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -20,7 +20,7 @@ const constants = require('./src/const.json'); const locales = require('./locales'); const meta = require('./package.json'); -const version = meta.clientVersion + '-' + rndstr({ length: 8, chars: '0-9a-z' }); +const version = `${meta.clientVersion}-${rndstr({ length: 8, chars: '0-9a-z' })}`; const codename = meta.codename; declare var global: { @@ -42,7 +42,7 @@ global['collapseSpacesReplacement'] = (html: string) => { }; global['base64replacement'] = (_: any, key: string) => { - return fs.readFileSync(__dirname + '/src/client/' + key, 'base64'); + return fs.readFileSync(`${__dirname}/src/client/${key}`, 'base64'); }; global['i18nReplacement'] = i18nReplacement; From b28dd4be5238f2f36b573b39e689fc816fadda48 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sat, 1 Sep 2018 23:29:22 +0900 Subject: [PATCH 054/539] Use typeof --- src/server/api/endpoints/admin/update-meta.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api/endpoints/admin/update-meta.ts b/src/server/api/endpoints/admin/update-meta.ts index 2c7929fabe..9737a281ed 100644 --- a/src/server/api/endpoints/admin/update-meta.ts +++ b/src/server/api/endpoints/admin/update-meta.ts @@ -25,7 +25,7 @@ export default (params: any) => new Promise(async (res, rej) => { const set = {} as any; - if (ps.disableRegistration === true || ps.disableRegistration === false) { + if (typeof ps.disableRegistration === 'boolean') { set.disableRegistration = ps.disableRegistration; } From ce28c70c35a0bbe0f344fa1fb40ed8d6f4a4c013 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 1 Sep 2018 23:57:05 +0900 Subject: [PATCH 055/539] Clean up --- src/mfm/html-to-mfm.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/mfm/html-to-mfm.ts b/src/mfm/html-to-mfm.ts index b476a9af5c..6da1dbdad3 100644 --- a/src/mfm/html-to-mfm.ts +++ b/src/mfm/html-to-mfm.ts @@ -47,11 +47,9 @@ export default function(html: string): string { //#region ホスト名部分が省略されているので復元する const acct = `${txt}@${(new URL(href.value)).hostname}`; text += acct; - break; //#endregion } else if (part.length == 3) { text += txt; - break; } // その他 } else { From 01beb705a28e84764ea36436d20ded14cad1b598 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 2 Sep 2018 00:07:23 +0900 Subject: [PATCH 056/539] 8.21.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 72dd6b73f0..499d453560 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.20.0", - "clientVersion": "1.0.9240", + "version": "8.21.0", + "clientVersion": "1.0.9259", "codename": "nighthike", "main": "./built/index.js", "private": true, From f24869625ec12deb660f8f6bb8fe681af7ac0b2c Mon Sep 17 00:00:00 2001 From: xps2 <9610872+xps2@users.noreply.github.com> Date: Sun, 2 Sep 2018 01:09:27 +0900 Subject: [PATCH 057/539] fix --- src/client/app/desktop/views/components/media-image.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/components/media-image.vue b/src/client/app/desktop/views/components/media-image.vue index 52d029a269..0284872c68 100644 --- a/src/client/app/desktop/views/components/media-image.vue +++ b/src/client/app/desktop/views/components/media-image.vue @@ -48,7 +48,7 @@ export default Vue.extend({ const mouseY = e.clientY - rect.top; const xp = mouseX / this.$el.offsetWidth * 100; const yp = mouseY / this.$el.offsetHeight * 100; - this.$el.style.backgroundPosition = `${xp}% ${yp}%'; + this.$el.style.backgroundPosition = `${xp}% ${yp}%`; this.$el.style.backgroundImage = `url("${this.image.url}")`; }, From a4678e45deeac110acd76388983f27c6f68e8c07 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sun, 2 Sep 2018 04:48:42 +0900 Subject: [PATCH 058/539] Not check dependencies --- src/index.ts | 2 -- src/misc/dependencyInfo.ts | 32 -------------------------------- 2 files changed, 34 deletions(-) delete mode 100644 src/misc/dependencyInfo.ts diff --git a/src/index.ts b/src/index.ts index 470699eab9..ed23ff7e72 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,7 +20,6 @@ import Logger from './misc/logger'; import ProgressBar from './misc/cli/progressbar'; import EnvironmentInfo from './misc/environmentInfo'; import MachineInfo from './misc/machineInfo'; -import DependencyInfo from './misc/dependencyInfo'; import serverStats from './daemons/server-stats'; import notesStats from './daemons/notes-stats'; import loadConfig from './config/load'; @@ -116,7 +115,6 @@ async function init(): Promise<Config> { new Logger('Deps').info(`Node.js ${process.version}`); MachineInfo.show(); EnvironmentInfo.show(); - new DependencyInfo().showAll(); const configLogger = new Logger('Config'); let config; diff --git a/src/misc/dependencyInfo.ts b/src/misc/dependencyInfo.ts deleted file mode 100644 index 09d2828222..0000000000 --- a/src/misc/dependencyInfo.ts +++ /dev/null @@ -1,32 +0,0 @@ -import Logger from './logger'; -import { execSync } from 'child_process'; - -export default class { - private logger: Logger; - - constructor() { - this.logger = new Logger('Deps'); - } - - public showAll(): void { - this.show('MongoDB', 'mongo --version', x => x.match(/^MongoDB shell version:? v(.*)\r?\n/)); - this.show('Redis', 'redis-server --version', x => x.match(/v=([0-9\.]*)/)); - } - - public show(serviceName: string, command: string, transform: (x: string) => RegExpMatchArray): void { - try { - // ステータス0以外のときにexecSyncはstderrをコンソール上に出力してしまうので - // プロセスからのstderrをすべて無視するように stdio オプションをセット - const x = execSync(command, { stdio: ['pipe', 'pipe', 'ignore'] }); - const ver = transform(x.toString()); - if (ver != null) { - this.logger.succ(`${serviceName} ${ver[1]} found`); - } else { - this.logger.warn(`${serviceName} not found`); - this.logger.warn(`Regexp used for version check of ${serviceName} is probably messed up`); - } - } catch (e) { - this.logger.warn(`${serviceName} not found`); - } - } -} From 0177023ead75594c603e41f9c1f355e7f4b18369 Mon Sep 17 00:00:00 2001 From: mei23 <m@m544.net> Date: Sun, 2 Sep 2018 02:57:34 +0900 Subject: [PATCH 059/539] Use Tombstone for Delete --- src/remote/activitypub/renderer/tombstone.ts | 4 ++++ src/services/note/delete.ts | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 src/remote/activitypub/renderer/tombstone.ts diff --git a/src/remote/activitypub/renderer/tombstone.ts b/src/remote/activitypub/renderer/tombstone.ts new file mode 100644 index 0000000000..553406b93b --- /dev/null +++ b/src/remote/activitypub/renderer/tombstone.ts @@ -0,0 +1,4 @@ +export default (id: string) => ({ + id, + type: 'Tombstone' +}); diff --git a/src/services/note/delete.ts b/src/services/note/delete.ts index d0e2b12b41..dea306feec 100644 --- a/src/services/note/delete.ts +++ b/src/services/note/delete.ts @@ -5,8 +5,9 @@ import renderDelete from '../../remote/activitypub/renderer/delete'; import pack from '../../remote/activitypub/renderer'; import { deliver } from '../../queue'; import Following from '../../models/following'; -import renderNote from '../../remote/activitypub/renderer/note'; +import renderTombstone from '../../remote/activitypub/renderer/tombstone'; import { updateNoteStats } from '../update-chart'; +import config from '../../config'; /** * 投稿を削除します。 @@ -32,7 +33,7 @@ export default async function(user: IUser, note: INote) { //#region ローカルの投稿なら削除アクティビティを配送 if (isLocalUser(user)) { - const content = pack(renderDelete(await renderNote(note), user)); + const content = pack(renderDelete(renderTombstone(`${config.url}/notes/${note._id}`), user)); const followings = await Following.find({ followeeId: user._id, From 34eacb7e2d35f37f11874410306d6473f54df761 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Acid=20Chicken=20=28=E7=A1=AB=E9=85=B8=E9=B6=8F=29?= <root@acid-chicken.com> Date: Sun, 2 Sep 2018 06:35:06 +0900 Subject: [PATCH 060/539] Update README.md [AUTOGEN] --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 465d171114..5d811b6a73 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,6 @@ Please see [Contribution guide](./CONTRIBUTING.md). <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D" alt="dansup"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4950409/28e7d016209243759d9316be2e21381d/2?token-time=2145916800&token-hash=LuEaDkchH3GQWUcTOhBQ8xfKQYF0s5FjlZRd7Yduia8%3D" alt="mikan54951"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td> -<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12959468/c249e15aebec4424b5c0f427173671b6/1?token-time=2145916800&token-hash=lubpCEdxAkxPlpR2O6bvZ7BIh8Q4nGf-U_mE1qpjVAQ%3D" alt="fujishan"></td> </tr><tr> <td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td> <td><a href="https://www.patreon.com/user?u=12931605">Reiju</a></td> @@ -77,10 +76,9 @@ Please see [Contribution guide](./CONTRIBUTING.md). <td><a href="https://www.patreon.com/dansup">dansup</a></td> <td><a href="https://www.patreon.com/user?u=4950409">mikan54951</a></td> <td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td> -<td><a href="https://www.patreon.com/fujishan">fujishan</a></td> </tr></table> -**Last updated:** Sun, 26 Aug 2018 08:55:06 UTC +**Last updated:** Sat, 01 Sep 2018 21:35:06 UTC <!-- PATREON_END --> :four_leaf_clover: Copyright From b93395fc4ceaaf9a7139e50ebf7a8643160be3dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Acid=20Chicken=20=28=E7=A1=AB=E9=85=B8=E9=B6=8F=29?= <root@acid-chicken.com> Date: Sun, 2 Sep 2018 09:05:06 +0900 Subject: [PATCH 061/539] Update README.md [AUTOGEN] --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 5d811b6a73..17a492886d 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,6 @@ Please see [Contribution guide](./CONTRIBUTING.md). ---------------------------------------------------------------- <!-- PATREON_START --> <table><tr> -<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12378075/0156f769e20f412594fa6b87d85fe228/1?token-time=2145916800&token-hash=IsIJRUXszzoD6-7pDnRY8I05T9nSznc4GTaxj7C9SwU%3D" alt="39ff"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13099460/43cecdbaa63a40d79bf50a96b9910b9d/1?token-time=2145916800&token-hash=d6P5MWHHsCMxUuBAEPAoVc5wLUR19mIhqAq7Ma9h9rI%3D" alt="ne_moni"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/1?token-time=2145916800&token-hash=f03BFb4S2FUx9YEt87TnEmifb4h33OywGBW2akQVtQY%3D" alt="Melilot"></td> @@ -52,7 +51,6 @@ Please see [Contribution guide](./CONTRIBUTING.md). <td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=zwSu01tOtn5xTUucDZHuPsCxF2HBEMVs9ROJKTlEV_o%3D" alt="nemu"></td> </tr><tr> -<td><a href="https://www.patreon.com/user?u=12378075">39ff</a></td> <td><a href="https://www.patreon.com/user?u=12731202">negao</a></td> <td><a href="https://www.patreon.com/user?u=13099460">ne_moni</a></td> <td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td> @@ -78,7 +76,7 @@ Please see [Contribution guide](./CONTRIBUTING.md). <td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td> </tr></table> -**Last updated:** Sat, 01 Sep 2018 21:35:06 UTC +**Last updated:** Sun, 02 Sep 2018 00:05:05 UTC <!-- PATREON_END --> :four_leaf_clover: Copyright From 4f0d844b4383160bd9127ce8562d5235fea3bf99 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 2 Sep 2018 09:31:11 +0900 Subject: [PATCH 062/539] Remove needless properties --- src/models/drive-file.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/models/drive-file.ts b/src/models/drive-file.ts index dbbc1f1cd5..698ef092a6 100644 --- a/src/models/drive-file.ts +++ b/src/models/drive-file.ts @@ -193,5 +193,10 @@ export const pack = ( */ } + delete _target.withoutChunks; + delete _target.storage; + delete _target.storageProps; + delete _target.isRemote; + resolve(_target); }); From 14c03f226d49d656a7c1b8d522fa2b50b6280ac7 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 2 Sep 2018 09:33:55 +0900 Subject: [PATCH 063/539] 8.21.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 499d453560..522765359c 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.21.0", - "clientVersion": "1.0.9259", + "version": "8.21.1", + "clientVersion": "1.0.9264", "codename": "nighthike", "main": "./built/index.js", "private": true, From 3a6947c7edf7c975dda696f675c0fdc952ec8b66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Acid=20Chicken=20=28=E7=A1=AB=E9=85=B8=E9=B6=8F=29?= <root@acid-chicken.com> Date: Sun, 2 Sep 2018 09:45:06 +0900 Subject: [PATCH 064/539] Update README.md [AUTOGEN] --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 17a492886d..ef36b669d2 100644 --- a/README.md +++ b/README.md @@ -65,18 +65,16 @@ Please see [Contribution guide](./CONTRIBUTING.md). <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12931605/ead494101f364dffa90efe49e36fb494/1?token-time=2145916800&token-hash=NzSFPjIlodXyv41rwK61aZWVZWfI4surJaNj8vWKvqM%3D" alt="Reiju"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=UERBN4OyP7Nh5XwwdDg0N0IE5cD6_qUQMO81Z5Wizso%3D" alt="Hiratake"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D" alt="dansup"></td> -<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4950409/28e7d016209243759d9316be2e21381d/2?token-time=2145916800&token-hash=LuEaDkchH3GQWUcTOhBQ8xfKQYF0s5FjlZRd7Yduia8%3D" alt="mikan54951"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td> </tr><tr> <td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td> <td><a href="https://www.patreon.com/user?u=12931605">Reiju</a></td> <td><a href="https://www.patreon.com/hiratake">Hiratake</a></td> <td><a href="https://www.patreon.com/dansup">dansup</a></td> -<td><a href="https://www.patreon.com/user?u=4950409">mikan54951</a></td> <td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td> </tr></table> -**Last updated:** Sun, 02 Sep 2018 00:05:05 UTC +**Last updated:** Sun, 02 Sep 2018 00:45:06 UTC <!-- PATREON_END --> :four_leaf_clover: Copyright From f6217d96d20905024a5780fd4b3e7320eb41e3c6 Mon Sep 17 00:00:00 2001 From: Marihachi <marihachi0620@gmail.com> Date: Sun, 2 Sep 2018 11:25:33 +0900 Subject: [PATCH 065/539] add an endpoint users/lists/update (#2585) * add an endpoint users/lists/update * add meta params * fix packing --- .../api/endpoints/users/lists/update.ts | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/server/api/endpoints/users/lists/update.ts diff --git a/src/server/api/endpoints/users/lists/update.ts b/src/server/api/endpoints/users/lists/update.ts new file mode 100644 index 0000000000..b80d648122 --- /dev/null +++ b/src/server/api/endpoints/users/lists/update.ts @@ -0,0 +1,55 @@ +import $ from 'cafy'; import ID from '../../../../../misc/cafy-id'; +import UserList, { pack } from '../../../../../models/user-list'; +import { ILocalUser } from '../../../../../models/user'; +import getParams from '../../../get-params'; + +export const meta = { + desc: { + 'ja-JP': '指定したユーザーリストを更新します。', + 'en-US': 'Update a user list' + }, + + requireCredential: true, + + kind: 'account-write', + + params: { + listId: $.type(ID).note({ + desc: { + 'ja-JP': '対象となるユーザーリストのID', + 'en-US': 'ID of target user list' + } + }), + title: $.str.range(1, 100).note({ + desc: { + 'ja-JP': 'このユーザーリストの名前', + 'en-US': 'name of this user list' + } + }) + } +}; + +export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => { + const [ps, psErr] = getParams(meta, params); + if (psErr) throw psErr; + + // Fetch the list + const userList = await UserList.findOne({ + _id: ps.listId, + userId: user._id + }); + + if (userList == null) { + return rej('list not found'); + } + + // update + await UserList.update({ _id: userList._id }, { + $set: { + title: ps.title + } + }); + + // Response + res(await pack(userList._id)); +}); From b00060c09ce1eba9f09f4a1c3a23bd0b497b6907 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sun, 2 Sep 2018 17:44:49 +0900 Subject: [PATCH 066/539] Clean up --- src/server/api/endpoints/users/lists/update.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/api/endpoints/users/lists/update.ts b/src/server/api/endpoints/users/lists/update.ts index b80d648122..7cfc4e0a24 100644 --- a/src/server/api/endpoints/users/lists/update.ts +++ b/src/server/api/endpoints/users/lists/update.ts @@ -1,4 +1,5 @@ -import $ from 'cafy'; import ID from '../../../../../misc/cafy-id'; +import $ from 'cafy'; +import ID from '../../../../../misc/cafy-id'; import UserList, { pack } from '../../../../../models/user-list'; import { ILocalUser } from '../../../../../models/user'; import getParams from '../../../get-params'; From f94992abbe19a58f81d36de28d4f063064684261 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 2 Sep 2018 17:56:20 +0900 Subject: [PATCH 067/539] :art: --- .../app/common/views/components/menu.vue | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/client/app/common/views/components/menu.vue b/src/client/app/common/views/components/menu.vue index 9b16732b9a..e99bfcbd26 100644 --- a/src/client/app/common/views/components/menu.vue +++ b/src/client/app/common/views/components/menu.vue @@ -1,5 +1,5 @@ <template> -<div class="mk-menu"> +<div class="onchrpzrvnoruiaenfcqvccjfuupzzwv"> <div class="backdrop" ref="backdrop" @click="close"></div> <div class="popover" :class="{ hukidasi }" ref="popover"> <template v-for="item in items"> @@ -119,9 +119,10 @@ export default Vue.extend({ <style lang="stylus" scoped> @import '~const.styl' -$border-color = rgba(27, 31, 35, 0.15) +root(isDark) + $bg-color = isDark ? #2c303c : #fff + $border-color = rgba(27, 31, 35, 0.15) -.mk-menu position initial > .backdrop @@ -131,14 +132,14 @@ $border-color = rgba(27, 31, 35, 0.15) z-index 10000 width 100% height 100% - background rgba(#000, 0.1) + background rgba(#000, isDark ? 0.5 : 0.1) opacity 0 > .popover position absolute z-index 10001 padding 8px 0 - background #fff + background $bg-color border 1px solid $border-color border-radius 4px box-shadow 0 3px 12px rgba(27, 31, 35, 0.15) @@ -172,12 +173,13 @@ $border-color = rgba(27, 31, 35, 0.15) border-top solid $balloon-size transparent border-left solid $balloon-size transparent border-right solid $balloon-size transparent - border-bottom solid $balloon-size #fff + border-bottom solid $balloon-size $bg-color > button display block padding 8px 16px width 100% + color isDark ? #d6dce2 : #111 &:hover color $theme-color-foreground @@ -191,6 +193,12 @@ $border-color = rgba(27, 31, 35, 0.15) > div margin 8px 0 height 1px - background #eee + background isDark ? #1c2023 : #eee + +.onchrpzrvnoruiaenfcqvccjfuupzzwv[data-darkmode] + root(true) + +.onchrpzrvnoruiaenfcqvccjfuupzzwv:not([data-darkmode]) + root(false) </style> From ef630195fa6a86ae54eaf866b38c5379dd79242e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 2 Sep 2018 18:23:47 +0900 Subject: [PATCH 068/539] =?UTF-8?q?=E3=83=A2=E3=83=90=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E3=81=AE=E3=83=89=E3=83=A9=E3=82=A4=E3=83=96=E3=83=80=E3=82=A4?= =?UTF-8?q?=E3=82=A2=E3=83=AD=E3=82=B0=E3=81=8C=E3=81=8A=E3=81=8B=E3=81=97?= =?UTF-8?q?=E3=81=84=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3=20&=20=E3=83=80?= =?UTF-8?q?=E3=83=BC=E3=82=AF=E3=83=A2=E3=83=BC=E3=83=89=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/components/drive-file-chooser.vue | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/client/app/mobile/views/components/drive-file-chooser.vue b/src/client/app/mobile/views/components/drive-file-chooser.vue index 56e41e31d8..aaa707d8a7 100644 --- a/src/client/app/mobile/views/components/drive-file-chooser.vue +++ b/src/client/app/mobile/views/components/drive-file-chooser.vue @@ -1,12 +1,12 @@ <template> -<div class="mk-drive-file-chooser"> +<div class="cdxzvcfawjxdyxsekbxbfgtplebnoneb"> <div class="body"> <header> <h1>%i18n:@select-file%<span class="count" v-if="files.length > 0">({{ files.length }})</span></h1> <button class="close" @click="cancel">%fa:times%</button> <button v-if="multiple" class="ok" @click="ok">%fa:check%</button> </header> - <mk-drive ref="browser" + <mk-drive class="drive" ref="browser" :select-file="true" :multiple="multiple" @change-selection="onChangeSelection" @@ -46,7 +46,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -.mk-drive-file-chooser +root(isDark) position fixed z-index 20000 top 0 @@ -59,10 +59,11 @@ export default Vue.extend({ > .body width 100% height 100% - background #fff + background isDark ? #282c37 : #fff > header - border-bottom solid 1px #eee + border-bottom solid 1px isDark ? #1b1f29 : #eee + color isDark ? #fff : #111 > h1 margin 0 @@ -90,9 +91,15 @@ export default Vue.extend({ line-height 42px width 42px - > .mk-drive + > .drive height calc(100% - 42px) overflow scroll -webkit-overflow-scrolling touch +.cdxzvcfawjxdyxsekbxbfgtplebnoneb[data-darkmode] + root(true) + +.cdxzvcfawjxdyxsekbxbfgtplebnoneb:not([data-darkmode]) + root(false) + </style> From d15ebe5732bb4d04a7861f43ab882738b3e4d9ef Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 2 Sep 2018 18:27:43 +0900 Subject: [PATCH 069/539] Improve usability --- src/client/app/mobile/views/components/note.vue | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index d0cea135f9..258433cb3f 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -471,10 +471,6 @@ root(isDark) &.reacted color $theme-color - &.menu - @media (max-width 350px) - display none - .note[data-darkmode] root(true) From c0ee134f19911dc88f2f3dd2f3600a820fd411cc Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sun, 2 Sep 2018 18:59:42 +0900 Subject: [PATCH 070/539] Add users/lists/delete API (#2589) --- .../api/endpoints/users/lists/delete.ts | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/server/api/endpoints/users/lists/delete.ts diff --git a/src/server/api/endpoints/users/lists/delete.ts b/src/server/api/endpoints/users/lists/delete.ts new file mode 100644 index 0000000000..906534922e --- /dev/null +++ b/src/server/api/endpoints/users/lists/delete.ts @@ -0,0 +1,43 @@ +import $ from 'cafy'; +import ID from '../../../../../misc/cafy-id'; +import UserList, { deleteUserList } from '../../../../../models/user-list'; +import { ILocalUser } from '../../../../../models/user'; +import getParams from '../../../get-params'; + +export const meta = { + desc: { + 'ja-JP': '指定したユーザーリストを削除します。', + 'en-US': 'Delete a user list' + }, + + requireCredential: true, + + kind: 'account-write', + + params: { + listId: $.type(ID).note({ + desc: { + 'ja-JP': '対象となるユーザーリストのID', + 'en-US': 'ID of target user list' + } + }) + } +}; + +export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => { + const [ps, psErr] = getParams(meta, params); + if (psErr) return rej(psErr); + + const userList = await UserList.findOne({ + _id: ps.listId, + userId: user._id + }); + + if (userList == null) { + return rej('list not found'); + } + + deleteUserList(userList); + + res(); +}); From 3136c714bf2359564c97953a02e86bf9cdb1fc76 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sun, 2 Sep 2018 19:03:00 +0900 Subject: [PATCH 071/539] Fix users/list/update API (#2590) --- src/server/api/endpoints/users/lists/update.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api/endpoints/users/lists/update.ts b/src/server/api/endpoints/users/lists/update.ts index 7cfc4e0a24..e6577eca4f 100644 --- a/src/server/api/endpoints/users/lists/update.ts +++ b/src/server/api/endpoints/users/lists/update.ts @@ -30,7 +30,7 @@ export const meta = { } }; -export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => { +export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => { const [ps, psErr] = getParams(meta, params); if (psErr) throw psErr; From d033998b566fa09d3c53ee32fa42617490db4b04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Acid=20Chicken=20=28=E7=A1=AB=E9=85=B8=E9=B6=8F=29?= <root@acid-chicken.com> Date: Sun, 2 Sep 2018 19:10:12 +0900 Subject: [PATCH 072/539] Update README.md [AUTOGEN] (#2586) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ef36b669d2..9412222614 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ Please see [Contribution guide](./CONTRIBUTING.md). <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13099460/43cecdbaa63a40d79bf50a96b9910b9d/1?token-time=2145916800&token-hash=d6P5MWHHsCMxUuBAEPAoVc5wLUR19mIhqAq7Ma9h9rI%3D" alt="ne_moni"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/1?token-time=2145916800&token-hash=f03BFb4S2FUx9YEt87TnEmifb4h33OywGBW2akQVtQY%3D" alt="Melilot"></td> -<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/1?token-time=2145916800&token-hash=DVrSdOqQq2dufgNgWZ3XMnEtl_ZAktr8Lhf2tbHKtoA%3D" alt="Axella"></td> +<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/2?token-time=2145916800&token-hash=rwZ8qvbm_kpA4ib3kc07tVKupXeySpY5ATQFGxfL9v0%3D" alt="Axella"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td> <td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></td> @@ -74,7 +74,7 @@ Please see [Contribution guide](./CONTRIBUTING.md). <td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td> </tr></table> -**Last updated:** Sun, 02 Sep 2018 00:45:06 UTC +**Last updated:** Sun, 02 Sep 2018 05:30:06 UTC <!-- PATREON_END --> :four_leaf_clover: Copyright From c145c994a9d6a3e19cde971325df0017ff7d4a6d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 2 Sep 2018 19:27:09 +0900 Subject: [PATCH 073/539] 8.22.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 522765359c..bb7e70beb0 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.21.1", - "clientVersion": "1.0.9264", + "version": "8.22.0", + "clientVersion": "1.0.9273", "codename": "nighthike", "main": "./built/index.js", "private": true, From 99fbd6026591f555f270b826c71c42e9de601267 Mon Sep 17 00:00:00 2001 From: tamaina <tamaina@hotmail.co.jp> Date: Sun, 2 Sep 2018 20:19:59 +0900 Subject: [PATCH 074/539] Improve url visual (#2591) * Use string interpolation * improve url visual * fix lint --- src/client/app/common/views/components/url.vue | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/client/app/common/views/components/url.vue b/src/client/app/common/views/components/url.vue index e6ffe4466d..04a1f30135 100644 --- a/src/client/app/common/views/components/url.vue +++ b/src/client/app/common/views/components/url.vue @@ -12,6 +12,7 @@ <script lang="ts"> import Vue from 'vue'; +import { toUnicode as decodePunycode } from 'punycode'; export default Vue.extend({ props: ['url', 'target'], data() { @@ -27,11 +28,11 @@ export default Vue.extend({ created() { const url = new URL(this.url); this.schema = url.protocol; - this.hostname = url.hostname; + this.hostname = decodePunycode(url.hostname); this.port = url.port; - this.pathname = url.pathname; - this.query = url.search; - this.hash = url.hash; + this.pathname = decodeURIComponent(url.pathname); + this.query = decodeURIComponent(url.search); + this.hash = decodeURIComponent(url.hash); } }); </script> From c57bf87f525f40e37b88714073e198511406fb44 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Sun, 2 Sep 2018 21:39:47 +0900 Subject: [PATCH 075/539] Make poll button togglable (#2592) --- src/client/app/desktop/views/components/post-form.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index eb8b40062a..2ca5484610 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -35,7 +35,7 @@ <button class="upload" title="%i18n:@attach-media-from-local%" @click="chooseFile">%fa:upload%</button> <button class="drive" title="%i18n:@attach-media-from-drive%" @click="chooseFileFromDrive">%fa:cloud%</button> <button class="kao" title="%i18n:@insert-a-kao%" @click="kao">%fa:R smile%</button> - <button class="poll" title="%i18n:@create-poll%" @click="poll = true">%fa:chart-pie%</button> + <button class="poll" title="%i18n:@create-poll%" @click="poll = !poll">%fa:chart-pie%</button> <button class="poll" title="%i18n:@hide-contents%" @click="useCw = !useCw">%fa:eye-slash%</button> <button class="geo" title="%i18n:@attach-location-information%" @click="geo ? removeGeo() : setGeo()">%fa:map-marker-alt%</button> <button class="visibility" title="%i18n:@visibility%" @click="setVisibility" ref="visibilityButton"> From 13e822cba616604de7ffc71da495f46200fb815b Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 2 Sep 2018 22:40:27 +0900 Subject: [PATCH 076/539] Trim text Closes #2595 --- src/server/api/endpoints/messaging/messages/create.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api/endpoints/messaging/messages/create.ts b/src/server/api/endpoints/messaging/messages/create.ts index a6fabcfa45..9a49e09248 100644 --- a/src/server/api/endpoints/messaging/messages/create.ts +++ b/src/server/api/endpoints/messaging/messages/create.ts @@ -74,7 +74,7 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = createdAt: new Date(), fileId: file ? file._id : undefined, recipientId: recipient._id, - text: text ? text : undefined, + text: text ? text.trim() : undefined, userId: user._id, isRead: false }); From 09843a409b488872a08c07329207465f9ffdb957 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Mon, 3 Sep 2018 18:58:26 +0900 Subject: [PATCH 077/539] Fix typo: Wroker -> Worker (#2597) --- docs/setup.en.md | 2 +- src/server/web/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/setup.en.md b/docs/setup.en.md index d426271870..23bcdcca98 100644 --- a/docs/setup.en.md +++ b/docs/setup.en.md @@ -54,7 +54,7 @@ Please visit https://www.google.com/recaptcha/intro/ and generate keys. *(optional)* Generating VAPID keys ---------------------------------------------------------------- -If you want to enable ServiceWroker, you need to generate VAPID keys: +If you want to enable ServiceWorker, you need to generate VAPID keys: Unless you have set your global node_modules location elsewhere, you need to run this in root. ``` shell diff --git a/src/server/web/index.ts b/src/server/web/index.ts index 452e36fe95..e7332f4230 100644 --- a/src/server/web/index.ts +++ b/src/server/web/index.ts @@ -63,7 +63,7 @@ router.get('/apple-touch-icon.png', async ctx => { }); }); -// ServiceWroker +// ServiceWorker router.get(/^\/sw\.(.+?)\.js$/, async ctx => { await send(ctx, `/assets/sw.${ctx.params[0]}.js`, { root: client From 66f3a155e6050fc297d2f600e6d619c5dba0f764 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 3 Sep 2018 23:23:50 +0900 Subject: [PATCH 078/539] =?UTF-8?q?=E3=81=AA=E3=82=93=E3=81=8B=E3=82=82?= =?UTF-8?q?=E3=81=86=E3=82=81=E3=81=A3=E3=81=A1=E3=82=83=E3=82=84=E3=81=A3?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/common/views/components/signin.vue | 2 +- .../app/common/views/widgets/broadcast.vue | 10 +- .../views/pages/admin/admin.announcements.vue | 41 +++ .../app/desktop/views/pages/admin/admin.vue | 6 + .../app/desktop/views/pages/welcome.vue | 297 ++++++++---------- src/server/api/endpoints/admin/update-meta.ts | 12 +- 6 files changed, 199 insertions(+), 169 deletions(-) create mode 100644 src/client/app/desktop/views/pages/admin/admin.announcements.vue diff --git a/src/client/app/common/views/components/signin.vue b/src/client/app/common/views/components/signin.vue index 5230ac371a..b1c6782e93 100644 --- a/src/client/app/common/views/components/signin.vue +++ b/src/client/app/common/views/components/signin.vue @@ -78,7 +78,7 @@ export default Vue.extend({ cursor wait !important > .avatar - margin 16px auto 0 auto + margin 0 auto 0 auto width 64px height 64px background #ddd diff --git a/src/client/app/common/views/widgets/broadcast.vue b/src/client/app/common/views/widgets/broadcast.vue index 69b2a54fe9..d3a39bd9cc 100644 --- a/src/client/app/common/views/widgets/broadcast.vue +++ b/src/client/app/common/views/widgets/broadcast.vue @@ -42,15 +42,7 @@ export default define({ }, mounted() { (this as any).os.getMeta().then(meta => { - let broadcasts = []; - if (meta.broadcasts) { - meta.broadcasts.forEach(broadcast => { - if (broadcast[lang]) { - broadcasts.push(broadcast[lang]); - } - }); - } - this.broadcasts = broadcasts; + this.broadcasts = meta.broadcasts; this.fetching = false; }); }, diff --git a/src/client/app/desktop/views/pages/admin/admin.announcements.vue b/src/client/app/desktop/views/pages/admin/admin.announcements.vue new file mode 100644 index 0000000000..532400deb2 --- /dev/null +++ b/src/client/app/desktop/views/pages/admin/admin.announcements.vue @@ -0,0 +1,41 @@ +<template> +<div class="qldxjjsrseehkusjuoooapmsprvfrxyl mk-admin-card"> + <header>%i18n:@announcements%</header> + <textarea v-model="broadcasts"></textarea> + <button class="ui" @click="save">%i18n:@save%</button> +</div> +</template> + +<script lang="ts"> +import Vue from "vue"; + +export default Vue.extend({ + data() { + return { + broadcasts: '', + }; + }, + created() { + (this as any).os.getMeta().then(meta => { + this.broadcasts = JSON.stringify(meta.broadcasts, null, ' '); + }); + }, + methods: { + save() { + (this as any).api('admin/update-meta', { + broadcasts: JSON.parse(this.broadcasts) + }); + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +.qldxjjsrseehkusjuoooapmsprvfrxyl + textarea + width 100% + min-height 300px + +</style> diff --git a/src/client/app/desktop/views/pages/admin/admin.vue b/src/client/app/desktop/views/pages/admin/admin.vue index 3438462cd6..a71059c378 100644 --- a/src/client/app/desktop/views/pages/admin/admin.vue +++ b/src/client/app/desktop/views/pages/admin/admin.vue @@ -4,6 +4,7 @@ <ul> <li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }">%fa:chalkboard .fw%%i18n:@dashboard%</li> <li @click="nav('users')" :class="{ active: page == 'users' }">%fa:users .fw%%i18n:@users%</li> + <li @click="nav('announcements')" :class="{ active: page == 'announcements' }">%fa:broadcast-tower .fw%%i18n:@announcements%</li> <!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }">%fa:cloud .fw%%i18n:@drive%</li> --> <!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> --> </ul> @@ -13,6 +14,9 @@ <x-dashboard/> <x-charts/> </div> + <div v-show="page == 'announcements'"> + <x-announcements/> + </div> <div v-if="page == 'users'"> <x-suspend-user/> <x-unsuspend-user/> @@ -28,6 +32,7 @@ <script lang="ts"> import Vue from "vue"; import XDashboard from "./admin.dashboard.vue"; +import XAnnouncements from "./admin.announcements.vue"; import XSuspendUser from "./admin.suspend-user.vue"; import XUnsuspendUser from "./admin.unsuspend-user.vue"; import XVerifyUser from "./admin.verify-user.vue"; @@ -37,6 +42,7 @@ import XCharts from "../../components/charts.vue"; export default Vue.extend({ components: { XDashboard, + XAnnouncements, XSuspendUser, XUnsuspendUser, XVerifyUser, diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index ae9bf7e678..e67ef16136 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -1,46 +1,60 @@ <template> <div class="mk-welcome"> - <img ref="pointer" class="pointer" src="/assets/pointer.png" alt=""> <button @click="dark"> <template v-if="$store.state.device.darkmode">%fa:moon%</template> <template v-else>%fa:R moon%</template> </button> + + <mk-forkit class="forkit"/> + <div class="body"> - <div class="container"> + <div class="main"> + <h1 v-if="name != 'Misskey'">{{ name }}</h1> + <h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1> + <div class="info"> - <span><b>{{ host }}</b></span> + <span><b>{{ host }}</b> - <span v-html="'%i18n:@powered-by-misskey%'"></span></span> <span class="stats" v-if="stats"> <span>%fa:user% {{ stats.originalUsersCount | number }}</span> <span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span> </span> </div> - <main> - <div class="about"> - <h1 v-if="name != 'Misskey'">{{ name }}</h1> - <h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1> - <p class="powerd-by" v-if="name != 'Misskey'" v-html="'%i18n:@powered-by-misskey%'"></p> - <p class="desc" v-html="description || '%i18n:common.about%'"></p> - <a ref="signup" @click="signup">📦 %i18n:@signup%</a> - </div> - <div class="login"> - <mk-signin/> - </div> - </main> + + <p class="desc" v-html="description || '%i18n:common.about%'"></p> + + <p class="sign"> + <span class="signup" @click="signup">%i18n:@signup%</span> + <span class="divider">|</span> + <span class="signin" @click="signin">%i18n:@signin%</span> + </p> + <div class="hashtags"> <router-link v-for="tag in tags" :key="tag" :to="`/tags/${ tag }`" :title="tag">#{{ tag }}</router-link> </div> + </div> + + <div class="broadcasts"> + <div v-for="broadcast in broadcasts"> + <h1 v-html="broadcast.title"></h1> + <div v-html="broadcast.text"></div> + </div> + </div> + + <div class="nav"> <mk-nav class="nav"/> </div> - <mk-forkit class="forkit"/> - <img src="assets/title.dark.svg" :alt="name"> - </div> - <div class="tl"> - <mk-welcome-timeline :max="20"/> + + <mk-welcome-timeline class="tl" :max="20"/> </div> - <modal name="signup" width="500px" height="auto" scrollable> - <header :class="$style.signupFormHeader">%i18n:@signup%</header> - <mk-signup :class="$style.signupForm"/> + <modal name="signup" :class="$store.state.device.darkmode ? 'modal-dark' : 'modal-light'" width="450px" height="auto" scrollable> + <header class="formHeader">%i18n:@signup%</header> + <mk-signup class="form"/> + </modal> + + <modal name="signin" :class="$store.state.device.darkmode ? 'modal-dark' : 'modal-light'" width="450px" height="auto" scrollable> + <header class="formHeader">%i18n:@signin%</header> + <mk-signin class="form"/> </modal> </div> </template> @@ -57,7 +71,7 @@ export default Vue.extend({ host, name: 'Misskey', description: '', - pointerInterval: null, + broadcasts: [], tags: [] }; }, @@ -65,6 +79,7 @@ export default Vue.extend({ (this as any).os.getMeta().then(meta => { this.name = meta.name; this.description = meta.description; + this.broadcasts = meta.broadcasts; }); (this as any).api('stats').then(stats => { @@ -75,19 +90,7 @@ export default Vue.extend({ this.tags = stats.map(x => x.tag); }); }, - mounted() { - this.point(); - this.pointerInterval = setInterval(this.point, 100); - }, - beforeDestroy() { - clearInterval(this.pointerInterval); - }, methods: { - point() { - const x = this.$refs.signup.getBoundingClientRect(); - this.$refs.pointer.style.top = x.top + x.height + 'px'; - this.$refs.pointer.style.left = x.left + 'px'; - }, signup() { this.$modal.show('signup'); }, @@ -104,11 +107,40 @@ export default Vue.extend({ }); </script> -<style> -#wait { - right: auto; - left: 15px; -} +<style lang="stylus"> +#wait + right auto + left 15px + +.v--modal-overlay + background rgba(0, 0, 0, 0.4) + +.modal-light + .v--modal-box + color #777 + + .formHeader + border-bottom solid 1px #eee + +.modal-dark + .v--modal-box + background #313543 + color #fff + + .formHeader + border-bottom solid 1px rgba(#000, 0.2) + +.modal-light +.modal-dark + .form + padding 24px 48px 48px 48px + + .formHeader + text-align center + padding 48px 0 12px 0 + margin 0 48px + font-size 1.5em + </style> <style lang="stylus" scoped> @@ -117,122 +149,85 @@ export default Vue.extend({ root(isDark) display flex min-height 100vh + //background-color #00070F + //background-image url('/assets/bg.jpg') + //background-position center + //background-size cover - > .pointer - display block + > .forkit position absolute - z-index 1 top 0 right 0 - width 180px - margin 0 0 0 -180px - transform rotateY(180deg) translateX(-10px) translateY(-48px) - pointer-events none > button position fixed z-index 1 - top 0 - left 0 + bottom 64px + left 64px padding 16px font-size 18px - color #fff - - display none // TODO + color isDark ? #fff : #444 > .body - flex 1 - padding 64px 0 0 0 - text-align center - background #578394 - background-position center - background-size cover + display grid + grid-template-rows 0.5fr 0.5fr 64px + grid-template-columns 1fr 350px + gap 16px + width 100% + max-width 1200px + height 100vh + margin 0 auto + padding 64px - &:before - content '' - display block - position absolute - top 0 - left 0 - right 0 - bottom 0 - background rgba(#000, 0.5) + > * + color isDark ? #fff : #444 + background isDark ? #313543 : #fff + box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) + //border-radius 8px + overflow auto - > .forkit - position absolute - top 0 - right 0 + > .main + grid-row 1 + grid-column 1 + padding 32px - > img - position absolute - bottom 16px - right 16px - width 150px + > h1 + margin 0 - > .container - $aboutWidth = 380px - $loginWidth = 340px - $width = $aboutWidth + $loginWidth + > img + margin -8px 0 0 -16px + max-width 280px > .info margin 0 auto 16px auto width $width font-size 14px - color #fff > .stats margin-left 16px padding-left 16px - border-left solid 1px #fff + border-left solid 1px isDark ? #fff : #444 > * margin-right 16px - > main - display flex - margin auto - width $width - border-radius 8px - overflow hidden - box-shadow 0 2px 8px rgba(#000, 0.3) + > .sign + font-size 120% - > .about - width $aboutWidth - color #444 - background #fff + > .divider + margin 0 16px - > h1 - margin 0 0 16px 0 - padding 32px 32px 0 32px - color #444 + > .signin + > .signup + cursor pointer - > img - width 170px - vertical-align bottom - - > .powerd-by - margin 16px - opacity 0.7 - - > .desc - margin 0 - padding 0 32px 16px 32px - - > a - display inline-block - margin 0 0 32px 0 - font-weight bold - - > .login - width $loginWidth - padding 16px 32px 32px 32px - background isDark ? #2e3440 : #f5f5f5 + &:hover + color $theme-color > .hashtags margin 16px auto width $width font-size 14px - color #fff background rgba(#000, 0.3) border-radius 8px @@ -240,20 +235,32 @@ root(isDark) display inline-block margin 14px - > .nav - display block - margin 16px 0 - font-size 14px - color #fff + > .broadcasts + grid-row 2 + grid-column 1 + padding 32px - > .tl - margin 0 - width 410px - height 100vh - text-align left - background isDark ? #313543 : #fff + > div + padding 0 0 16px 0 + margin 0 0 16px 0 + border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05) - > * + > h1 + margin 0 + font-size 1.5em + + > .nav + display flex + justify-content center + align-items center + grid-row 3 + grid-column 1 + font-size 14px + + > .tl + grid-row 1 / 4 + grid-column 2 + text-align left max-height 100% overflow auto @@ -264,29 +271,3 @@ root(isDark) root(false) </style> - -<style lang="stylus" module> -.signupForm - padding 24px 48px 48px 48px - -.signupFormHeader - padding 48px 0 12px 0 - margin: 0 48px - font-size 1.5em - color #777 - border-bottom solid 1px #eee - -.signinForm - padding 24px 48px 48px 48px - -.signinFormHeader - padding 48px 0 12px 0 - margin: 0 48px - font-size 1.5em - color #777 - border-bottom solid 1px #eee - -.nav - a - color #666 -</style> diff --git a/src/server/api/endpoints/admin/update-meta.ts b/src/server/api/endpoints/admin/update-meta.ts index 9737a281ed..10ca15d329 100644 --- a/src/server/api/endpoints/admin/update-meta.ts +++ b/src/server/api/endpoints/admin/update-meta.ts @@ -11,11 +11,17 @@ export const meta = { requireAdmin: true, params: { + broadcasts: $.arr($.obj()).optional.nullable.note({ + desc: { + 'ja-JP': 'ブロードキャスト' + } + }), + disableRegistration: $.bool.optional.nullable.note({ desc: { 'ja-JP': '招待制か否か' } - }), + }) } }; @@ -25,6 +31,10 @@ export default (params: any) => new Promise(async (res, rej) => { const set = {} as any; + if (ps.broadcasts) { + set.broadcasts = ps.broadcasts; + } + if (typeof ps.disableRegistration === 'boolean') { set.disableRegistration = ps.disableRegistration; } From ba38f643536580c495b54c768ded0315a78467d4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 3 Sep 2018 23:25:35 +0900 Subject: [PATCH 079/539] 8.23.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index bb7e70beb0..c43f73ecc7 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.22.0", - "clientVersion": "1.0.9273", + "version": "8.23.0", + "clientVersion": "1.0.9287", "codename": "nighthike", "main": "./built/index.js", "private": true, From 3698c679e23c184e897d86e9d75dfe2a110a282c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 4 Sep 2018 02:09:56 +0900 Subject: [PATCH 080/539] :pizza: --- locales/ja-JP.yml | 6 +- .../app/common/views/components/index.ts | 2 + .../trends.chart.vue} | 0 .../app/common/views/components/trends.vue | 105 ++++++++++++++++++ .../app/common/views/widgets/hashtags.vue | 94 +--------------- .../app/desktop/views/pages/welcome.vue | 52 +++++---- 6 files changed, 143 insertions(+), 116 deletions(-) rename src/client/app/common/views/{widgets/hashtags.chart.vue => components/trends.chart.vue} (100%) create mode 100644 src/client/app/common/views/components/trends.vue diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index c5a3fc81ff..a57f724a32 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -375,6 +375,10 @@ common/views/components/visibility-chooser.vue: specified-desc: "指定したユーザーにのみ公開" private: "非公開" +common/views/components/trends.vue: + count: "{}人が投稿" + empty: "トレンドなし" + common/views/widgets/broadcast.vue: fetching: "確認中" no-broadcasts: "お知らせはありません" @@ -403,8 +407,6 @@ common/views/widgets/posts-monitor.vue: common/views/widgets/hashtags.vue: title: "ハッシュタグ" - count: "{}人が投稿" - empty: "トレンドなし" common/views/widgets/server.vue: title: "サーバー情報" diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts index 422a3da050..4700b6269e 100644 --- a/src/client/app/common/views/components/index.ts +++ b/src/client/app/common/views/components/index.ts @@ -1,5 +1,6 @@ import Vue from 'vue'; +import trends from './trends.vue'; import analogClock from './analog-clock.vue'; import menu from './menu.vue'; import noteHeader from './note-header.vue'; @@ -40,6 +41,7 @@ import uiSelect from './ui/select.vue'; import formButton from './ui/form/button.vue'; import formRadio from './ui/form/radio.vue'; +Vue.component('mk-trends', trends); Vue.component('mk-analog-clock', analogClock); Vue.component('mk-menu', menu); Vue.component('mk-note-header', noteHeader); diff --git a/src/client/app/common/views/widgets/hashtags.chart.vue b/src/client/app/common/views/components/trends.chart.vue similarity index 100% rename from src/client/app/common/views/widgets/hashtags.chart.vue rename to src/client/app/common/views/components/trends.chart.vue diff --git a/src/client/app/common/views/components/trends.vue b/src/client/app/common/views/components/trends.vue new file mode 100644 index 0000000000..627edc3876 --- /dev/null +++ b/src/client/app/common/views/components/trends.vue @@ -0,0 +1,105 @@ +<template> +<div class="csqvmxybqbycalfhkxvyfrgbrdalkaoc"> + <p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> + <p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%</p> + <!-- トランジションを有効にするとなぜかメモリリークする --> + <!-- <transition-group v-else tag="div" name="chart"> --> + <div> + <div v-for="stat in stats" :key="stat.tag"> + <div class="tag"> + <router-link :to="`/tags/${ encodeURIComponent(stat.tag) }`" :title="stat.tag">#{{ stat.tag }}</router-link> + <p>{{ '%i18n:@count%'.replace('{}', stat.usersCount) }}</p> + </div> + <x-chart class="chart" :src="stat.chart"/> + </div> + </div> + <!-- </transition-group> --> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import XChart from './trends.chart.vue'; + +export default Vue.extend({ + components: { + XChart + }, + data() { + return { + stats: [], + fetching: true, + clock: null + }; + }, + mounted() { + this.fetch(); + this.clock = setInterval(this.fetch, 1000 * 60); + }, + beforeDestroy() { + clearInterval(this.clock); + }, + methods: { + fetch() { + (this as any).api('hashtags/trend').then(stats => { + this.stats = stats; + this.fetching = false; + }); + } + } +}); +</script> + +<style lang="stylus" scoped> +root(isDark) + > .fetching + > .empty + margin 0 + padding 16px + text-align center + color #aaa + + > [data-fa] + margin-right 4px + + > div + .chart-move + transition transform 1s ease + + > div + display flex + align-items center + padding 14px 16px + + &:not(:last-child) + border-bottom solid 1px isDark ? #393f4f : #eee + + > .tag + flex 1 + overflow hidden + font-size 14px + color isDark ? #9baec8 : #65727b + + > a + display block + width 100% + white-space nowrap + overflow hidden + text-overflow ellipsis + color inherit + + > p + margin 0 + font-size 75% + opacity 0.7 + + > .chart + height 30px + +.csqvmxybqbycalfhkxvyfrgbrdalkaoc[data-darkmode] + root(true) + +.csqvmxybqbycalfhkxvyfrgbrdalkaoc:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/common/views/widgets/hashtags.vue b/src/client/app/common/views/widgets/hashtags.vue index 56520400b6..0cb6b2df10 100644 --- a/src/client/app/common/views/widgets/hashtags.vue +++ b/src/client/app/common/views/widgets/hashtags.vue @@ -4,20 +4,7 @@ <template slot="header">%fa:hashtag%%i18n:@title%</template> <div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'"> - <p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> - <p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%</p> - <!-- トランジションを有効にするとなぜかメモリリークする --> - <!-- <transition-group v-else tag="div" name="chart"> --> - <div> - <div v-for="stat in stats" :key="stat.tag"> - <div class="tag"> - <router-link :to="`/tags/${ encodeURIComponent(stat.tag) }`" :title="stat.tag">#{{ stat.tag }}</router-link> - <p>{{ '%i18n:@count%'.replace('{}', stat.usersCount) }}</p> - </div> - <x-chart class="chart" :src="stat.chart"/> - </div> - </div> - <!-- </transition-group> --> + <mk-trends/> </div> </mk-widget-container> </div> @@ -25,7 +12,6 @@ <script lang="ts"> import define from '../../../common/define-widget'; -import XChart from './hashtags.chart.vue'; export default define({ name: 'hashtags', @@ -33,89 +19,11 @@ export default define({ compact: false }) }).extend({ - components: { - XChart - }, - data() { - return { - stats: [], - fetching: true, - clock: null - }; - }, - mounted() { - this.fetch(); - this.clock = setInterval(this.fetch, 1000 * 60); - }, - beforeDestroy() { - clearInterval(this.clock); - }, methods: { func() { this.props.compact = !this.props.compact; this.save(); - }, - fetch() { - (this as any).api('hashtags/trend').then(stats => { - this.stats = stats; - this.fetching = false; - }); } } }); </script> - -<style lang="stylus" scoped> -root(isDark) - .mkw-hashtags--body - > .fetching - > .empty - margin 0 - padding 16px - text-align center - color #aaa - - > [data-fa] - margin-right 4px - - > div - .chart-move - transition transform 1s ease - - > div - display flex - align-items center - padding 14px 16px - - &:not(:last-child) - border-bottom solid 1px isDark ? #393f4f : #eee - - > .tag - flex 1 - overflow hidden - font-size 14px - color isDark ? #9baec8 : #65727b - - > a - display block - width 100% - white-space nowrap - overflow hidden - text-overflow ellipsis - color inherit - - > p - margin 0 - font-size 75% - opacity 0.7 - - > .chart - height 30px - -.mkw-hashtags[data-darkmode] - root(true) - -.mkw-hashtags:not([data-darkmode]) - root(false) - -</style> diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index e67ef16136..481441c3c7 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -8,7 +8,7 @@ <mk-forkit class="forkit"/> <div class="body"> - <div class="main"> + <div class="main block"> <h1 v-if="name != 'Misskey'">{{ name }}</h1> <h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1> @@ -27,24 +27,24 @@ <span class="divider">|</span> <span class="signin" @click="signin">%i18n:@signin%</span> </p> - - <div class="hashtags"> - <router-link v-for="tag in tags" :key="tag" :to="`/tags/${ tag }`" :title="tag">#{{ tag }}</router-link> - </div> </div> - <div class="broadcasts"> + <div class="broadcasts block"> <div v-for="broadcast in broadcasts"> <h1 v-html="broadcast.title"></h1> <div v-html="broadcast.text"></div> </div> </div> - <div class="nav"> + <div class="nav block"> <mk-nav class="nav"/> </div> - <mk-welcome-timeline class="tl" :max="20"/> + <div class="side"> + <mk-trends class="trends block"/> + + <mk-welcome-timeline class="tl block" :max="20"/> + </div> </div> <modal name="signup" :class="$store.state.device.darkmode ? 'modal-dark' : 'modal-light'" width="450px" height="auto" scrollable> @@ -71,8 +71,7 @@ export default Vue.extend({ host, name: 'Misskey', description: '', - broadcasts: [], - tags: [] + broadcasts: [] }; }, created() { @@ -86,9 +85,6 @@ export default Vue.extend({ this.stats = stats; }); - (this as any).api('hashtags/trend').then(stats => { - this.tags = stats.map(x => x.tag); - }); }, methods: { signup() { @@ -113,7 +109,7 @@ export default Vue.extend({ left 15px .v--modal-overlay - background rgba(0, 0, 0, 0.4) + background rgba(0, 0, 0, 0.6) .modal-light .v--modal-box @@ -162,8 +158,8 @@ root(isDark) > button position fixed z-index 1 - bottom 64px - left 64px + bottom 16px + left 16px padding 16px font-size 18px color isDark ? #fff : #444 @@ -179,7 +175,7 @@ root(isDark) margin 0 auto padding 64px - > * + .block color isDark ? #fff : #444 background isDark ? #313543 : #fff box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) @@ -190,6 +186,7 @@ root(isDark) grid-row 1 grid-column 1 padding 32px + border-top solid 5px $theme-color > h1 margin 0 @@ -257,12 +254,25 @@ root(isDark) grid-column 1 font-size 14px - > .tl + > .side + display grid grid-row 1 / 4 grid-column 2 - text-align left - max-height 100% - overflow auto + grid-template-rows 1fr 350px + grid-template-columns 1fr + gap 16px + + > .tl + grid-row 1 + grid-column 1 + text-align left + max-height 100% + overflow auto + + > .trends + grid-row 2 + grid-column 1 + padding 8px .mk-welcome[data-darkmode] root(true) From a9ae9a65c83832d746df030c38ec2344c8176c8f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 4 Sep 2018 02:10:47 +0900 Subject: [PATCH 081/539] 8.24.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index c43f73ecc7..4d4d109527 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.23.0", - "clientVersion": "1.0.9287", + "version": "8.24.0", + "clientVersion": "1.0.9289", "codename": "nighthike", "main": "./built/index.js", "private": true, From a5eb19c878b58a9512f2a034d38ea97dec67a9a9 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 4 Sep 2018 11:24:39 +0900 Subject: [PATCH 082/539] Support darkmode --- .../app/common/views/widgets/broadcast.vue | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/client/app/common/views/widgets/broadcast.vue b/src/client/app/common/views/widgets/broadcast.vue index d3a39bd9cc..e4e77263e5 100644 --- a/src/client/app/common/views/widgets/broadcast.vue +++ b/src/client/app/common/views/widgets/broadcast.vue @@ -1,5 +1,5 @@ <template> -<div class="mkw-broadcast" +<div class="anltbovirfeutcigvwgmgxipejaeozxi" :data-found="broadcasts.length != 0" :data-melt="props.design == 1" :data-mobile="platform == 'mobile'" @@ -25,7 +25,6 @@ <script lang="ts"> import define from '../../../common/define-widget'; -import { lang } from '../../../config'; export default define({ name: 'broadcast', @@ -67,7 +66,7 @@ export default define({ </script> <style lang="stylus" scoped> -.mkw-broadcast +root(isDark) padding 10px border solid 1px #4078c0 border-radius 6px @@ -134,15 +133,11 @@ export default define({ z-index 1 margin 0 font-size 0.7em - color #555 + color isDark ? #fff : #555 &.fetching text-align center - a - color #555 - text-decoration underline - > a display block font-size 0.7em @@ -151,4 +146,10 @@ export default define({ > p color #fff +.anltbovirfeutcigvwgmgxipejaeozxi[data-darkmode] + root(true) + +.anltbovirfeutcigvwgmgxipejaeozxi:not([data-darkmode]) + root(false) + </style> From f42665d4bc65d9a0a5f58d0a62b384b3e670c2f6 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 4 Sep 2018 11:34:36 +0900 Subject: [PATCH 083/539] :art: --- .../app/mobile/views/components/notify.vue | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/client/app/mobile/views/components/notify.vue b/src/client/app/mobile/views/components/notify.vue index 6d4a481dbe..1b93ab87a1 100644 --- a/src/client/app/mobile/views/components/notify.vue +++ b/src/client/app/mobile/views/components/notify.vue @@ -1,6 +1,8 @@ <template> <div class="mk-notify"> - <mk-notification-preview :notification="notification"/> + <div> + <mk-notification-preview :notification="notification"/> + </div> </div> </template> @@ -22,7 +24,7 @@ export default Vue.extend({ setTimeout(() => { anime({ targets: this.$el, - bottom: '-64px', + bottom: '-72px', duration: 500, easing: 'easeOutQuad', complete: () => this.$destroy() @@ -37,13 +39,22 @@ export default Vue.extend({ .mk-notify position fixed z-index 1024 - bottom -64px + bottom -72px left 0 + right 0 width 100% - height 64px + max-width 500px + height 72px + margin 0 auto + padding 8px pointer-events none - -webkit-backdrop-filter blur(2px) - backdrop-filter blur(2px) - background-color rgba(#000, 0.5) + font-size 80% + + > div + height 100% + -webkit-backdrop-filter blur(2px) + backdrop-filter blur(2px) + background-color rgba(#000, 0.5) + border-radius 6px </style> From dc1d7fa9d75dcf00a8e04b9f5ebe7c6262e0c597 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 4 Sep 2018 12:58:35 +0900 Subject: [PATCH 084/539] =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=82=AB=E3=83=AB?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=A0=E3=83=A9=E3=82=A4=E3=83=B3=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=83=AA=E3=83=BC=E3=83=A0=E3=81=AB=E8=AA=8D=E8=A8=BC?= =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=A7=E6=8E=A5=E7=B6=9A=E3=81=A7=E3=81=8D?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/api/stream/local-timeline.ts | 6 +++--- src/server/api/streaming.ts | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/server/api/stream/local-timeline.ts b/src/server/api/stream/local-timeline.ts index 82060a7aaa..25e0e00c9f 100644 --- a/src/server/api/stream/local-timeline.ts +++ b/src/server/api/stream/local-timeline.ts @@ -9,10 +9,10 @@ export default async function( request: websocket.request, connection: websocket.connection, subscriber: Xev, - user: IUser + user?: IUser ) { - const mute = await Mute.find({ muterId: user._id }); - const mutedUserIds = mute.map(m => m.muteeId.toString()); + const mute = user ? await Mute.find({ muterId: user._id }) : null; + const mutedUserIds = mute ? mute.map(m => m.muteeId.toString()) : []; // Subscribe stream subscriber.on('local-timeline', async note => { diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts index c8b2d4e0b9..e6094a40b2 100644 --- a/src/server/api/streaming.ts +++ b/src/server/api/streaming.ts @@ -52,6 +52,11 @@ module.exports = (server: http.Server) => { return; } + if (request.resourceURL.pathname === '/local-timeline') { + localTimelineStream(request, connection, ev, user); + return; + } + if (user == null) { connection.send('authentication-failed'); connection.close(); @@ -60,7 +65,6 @@ module.exports = (server: http.Server) => { const channel: any = request.resourceURL.pathname === '/' ? homeStream : - request.resourceURL.pathname === '/local-timeline' ? localTimelineStream : request.resourceURL.pathname === '/hybrid-timeline' ? hybridTimelineStream : request.resourceURL.pathname === '/global-timeline' ? globalTimelineStream : request.resourceURL.pathname === '/user-list' ? userListStream : From ba64de334afa9f38ead7285de3193f3b6e58fe75 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 4 Sep 2018 12:58:43 +0900 Subject: [PATCH 085/539] Fix bug --- .../common/scripts/streaming/games/reversi/reversi-game.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/client/app/common/scripts/streaming/games/reversi/reversi-game.ts b/src/client/app/common/scripts/streaming/games/reversi/reversi-game.ts index e6b02fcfdb..adfa75ff3b 100644 --- a/src/client/app/common/scripts/streaming/games/reversi/reversi-game.ts +++ b/src/client/app/common/scripts/streaming/games/reversi/reversi-game.ts @@ -3,8 +3,10 @@ import MiOS from '../../../../../mios'; export class ReversiGameStream extends Stream { constructor(os: MiOS, me, game) { - super(os, 'games/reversi-game', { - i: me ? me.token : null, + super(os, 'games/reversi-game', me ? { + i: me.token, + game: game.id + } : { game: game.id }); } From 6abff253ea718acc73ba3d1feca53161923319ae Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 4 Sep 2018 12:59:34 +0900 Subject: [PATCH 086/539] =?UTF-8?q?=E3=83=88=E3=83=83=E3=83=97=E3=83=9A?= =?UTF-8?q?=E3=83=BC=E3=82=B8=E3=81=AE=E3=82=BF=E3=82=A4=E3=83=A0=E3=83=A9?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=82=92=E3=83=AA=E3=82=A2=E3=83=AB=E3=82=BF?= =?UTF-8?q?=E3=82=A4=E3=83=A0=E6=9B=B4=E6=96=B0=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scripts/streaming/local-timeline.ts | 4 +-- .../views/components/welcome-timeline.vue | 30 ++++++++++++++++--- src/client/app/mios.ts | 6 ++-- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/client/app/common/scripts/streaming/local-timeline.ts b/src/client/app/common/scripts/streaming/local-timeline.ts index 2834262bdc..41c36aa14c 100644 --- a/src/client/app/common/scripts/streaming/local-timeline.ts +++ b/src/client/app/common/scripts/streaming/local-timeline.ts @@ -7,9 +7,9 @@ import MiOS from '../../../mios'; */ export class LocalTimelineStream extends Stream { constructor(os: MiOS, me) { - super(os, 'local-timeline', { + super(os, 'local-timeline', me ? { i: me.token - }); + } : {}); } } diff --git a/src/client/app/common/views/components/welcome-timeline.vue b/src/client/app/common/views/components/welcome-timeline.vue index 5a8b9df476..d4e7902c7b 100644 --- a/src/client/app/common/views/components/welcome-timeline.vue +++ b/src/client/app/common/views/components/welcome-timeline.vue @@ -31,15 +31,30 @@ export default Vue.extend({ default: undefined } }, + data() { return { fetching: true, - notes: [] + notes: [], + connection: null, + connectionId: null }; }, + mounted() { this.fetch(); + + this.connection = (this as any).os.streams.localTimelineStream.getConnection(); + this.connectionId = (this as any).os.streams.localTimelineStream.use(); + + this.connection.on('note', this.onNote); }, + + beforeDestroy() { + this.connection.off('note', this.onNote); + (this as any).os.streams.localTimelineStream.dispose(this.connectionId); + }, + methods: { fetch(cb?) { this.fetching = true; @@ -49,13 +64,20 @@ export default Vue.extend({ reply: false, renote: false, media: false, - poll: false, - bot: false + poll: false }).then(notes => { this.notes = notes; this.fetching = false; }); - } + }, + + onNote(note) { + if (note.replyId != null) return; + if (note.renoteId != null) return; + if (note.poll != null) return; + + this.notes.unshift(note); + }, } }); </script> diff --git a/src/client/app/mios.ts b/src/client/app/mios.ts index 664848b5e7..c2ec7f1750 100644 --- a/src/client/app/mios.ts +++ b/src/client/app/mios.ts @@ -3,7 +3,7 @@ import { EventEmitter } from 'eventemitter3'; import * as uuid from 'uuid'; import initStore from './store'; -import { apiUrl, swPublickey, version, lang, googleMapsApiKey } from './config'; +import { apiUrl, version, lang } from './config'; import Progress from './common/scripts/loading'; import Connection from './common/scripts/streaming/stream'; import { HomeStreamManager } from './common/scripts/streaming/home'; @@ -230,13 +230,13 @@ export default class MiOS extends EventEmitter { //#region Init stream managers this.streams.serverStatsStream = new ServerStatsStreamManager(this); this.streams.notesStatsStream = new NotesStatsStreamManager(this); + this.streams.localTimelineStream = new LocalTimelineStreamManager(this, this.store.state.i); this.once('signedin', () => { // Init home stream manager this.stream = new HomeStreamManager(this, this.store.state.i); // Init other stream manager - this.streams.localTimelineStream = new LocalTimelineStreamManager(this, this.store.state.i); this.streams.hybridTimelineStream = new HybridTimelineStreamManager(this, this.store.state.i); this.streams.globalTimelineStream = new GlobalTimelineStreamManager(this, this.store.state.i); this.streams.driveStream = new DriveStreamManager(this, this.store.state.i); @@ -361,7 +361,7 @@ export default class MiOS extends EventEmitter { // A public key your push server will use to send // messages to client apps via a push server. - applicationServerKey: urlBase64ToUint8Array(swPublickey) + applicationServerKey: urlBase64ToUint8Array(this.meta.data.swPublickey) }; // Subscribe push notification From 977200b7cd38191944cf9e078c7bff00314f9d78 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 4 Sep 2018 12:59:40 +0900 Subject: [PATCH 087/539] :art: --- src/client/app/desktop/views/pages/welcome.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 481441c3c7..0bc5c256e0 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -172,6 +172,7 @@ root(isDark) width 100% max-width 1200px height 100vh + min-height 800px margin 0 auto padding 64px From 199573ccee68a9507e64221611b485e1c242a7f6 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 4 Sep 2018 13:03:16 +0900 Subject: [PATCH 088/539] #2566 --- src/server/api/endpoints/meta.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/api/endpoints/meta.ts b/src/server/api/endpoints/meta.ts index 2b39f26b8e..b0876eaafd 100644 --- a/src/server/api/endpoints/meta.ts +++ b/src/server/api/endpoints/meta.ts @@ -33,6 +33,7 @@ export default () => new Promise(async (res, rej) => { }, broadcasts: meta.broadcasts, disableRegistration: meta.disableRegistration, + driveCapacityPerLocalUserMb: config.localDriveCapacityMb, recaptchaSitekey: config.recaptcha ? config.recaptcha.site_key : null, swPublickey: config.sw ? config.sw.public_key : null }); From 921609cab162906cff1be52164c4d0ef3f70bf2f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 4 Sep 2018 13:07:09 +0900 Subject: [PATCH 089/539] 8.25.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4d4d109527..6238613e35 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.24.0", - "clientVersion": "1.0.9289", + "version": "8.25.0", + "clientVersion": "1.0.9297", "codename": "nighthike", "main": "./built/index.js", "private": true, From 5b039a1beea20d300d1cb2579674383ac763176d Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Tue, 4 Sep 2018 17:44:21 +0900 Subject: [PATCH 090/539] Add User-Agent header (#2602) --- src/config/load.ts | 2 ++ src/config/types.ts | 1 + src/remote/activitypub/request.ts | 1 + src/remote/activitypub/resolver.ts | 3 ++- src/services/drive/upload-from-url.ts | 7 ++++++- 5 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/config/load.ts b/src/config/load.ts index 8929cf8d3e..3a1bac3201 100644 --- a/src/config/load.ts +++ b/src/config/load.ts @@ -7,6 +7,7 @@ import { URL } from 'url'; import * as yaml from 'js-yaml'; import { Source, Mixin } from './types'; import isUrl = require('is-url'); +const pkg = require('../../package.json'); /** * Path of configuration directory @@ -43,6 +44,7 @@ export default function load() { mixin.stats_url = `${mixin.scheme}://${mixin.host}/stats`; mixin.status_url = `${mixin.scheme}://${mixin.host}/status`; mixin.drive_url = `${mixin.scheme}://${mixin.host}/files`; + mixin.user_agent = `Misskey/${pkg.version} (${config.url})`; if (config.localDriveCapacityMb == null) config.localDriveCapacityMb = 256; if (config.remoteDriveCapacityMb == null) config.remoteDriveCapacityMb = 8; diff --git a/src/config/types.ts b/src/config/types.ts index a1dc9a5bd4..003185accd 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -114,6 +114,7 @@ export type Mixin = { status_url: string; dev_url: string; drive_url: string; + user_agent: string; }; export type Config = Source & Mixin; diff --git a/src/remote/activitypub/request.ts b/src/remote/activitypub/request.ts index d739d08e15..07f0ecca8b 100644 --- a/src/remote/activitypub/request.ts +++ b/src/remote/activitypub/request.ts @@ -27,6 +27,7 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso method: 'POST', path: pathname + search, headers: { + 'User-Agent': config.user_agent, 'Content-Type': 'application/activity+json', 'Digest': `SHA-256=${hash}` } diff --git a/src/remote/activitypub/resolver.ts b/src/remote/activitypub/resolver.ts index 0b053ca774..9bbe474d35 100644 --- a/src/remote/activitypub/resolver.ts +++ b/src/remote/activitypub/resolver.ts @@ -1,7 +1,7 @@ import * as request from 'request-promise-native'; import * as debug from 'debug'; import { IObject } from './type'; -//import config from '../../config'; +import config from '../../config'; const log = debug('misskey:activitypub:resolver'); @@ -51,6 +51,7 @@ export default class Resolver { const object = await request({ url: value, headers: { + 'User-Agent': config.user_agent, Accept: 'application/activity+json, application/ld+json' }, json: true diff --git a/src/services/drive/upload-from-url.ts b/src/services/drive/upload-from-url.ts index 4e297d3bb1..0cf21ea5a2 100644 --- a/src/services/drive/upload-from-url.ts +++ b/src/services/drive/upload-from-url.ts @@ -34,7 +34,12 @@ export default async (url: string, user: IUser, folderId: mongodb.ObjectID = nul // write content at URL to temp file await new Promise((res, rej) => { const writable = fs.createWriteStream(path); - request(url) + request({ + url, + headers: { + 'User-Agent': config.user_agent + } + }) .on('error', rej) .on('end', () => { writable.close(); From a0735b0e7a843ef383de486968abdf07c3429814 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Tue, 4 Sep 2018 18:15:58 +0900 Subject: [PATCH 091/539] fix(package): update webpack to version 4.17.2 (#2599) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6238613e35..b53345b9d0 100644 --- a/package.json +++ b/package.json @@ -221,7 +221,7 @@ "vuex-persistedstate": "2.5.4", "web-push": "3.3.2", "webfinger.js": "2.6.6", - "webpack": "4.17.1", + "webpack": "4.17.2", "webpack-cli": "3.1.0", "websocket": "1.0.26", "ws": "6.0.0", From eaec936fa6a53d0fd1004a613ea09f482198f366 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Tue, 4 Sep 2018 18:33:16 +0900 Subject: [PATCH 092/539] Fix remote follow (#2606) --- src/client/app/common/views/pages/follow.vue | 2 +- src/client/app/desktop/views/components/follow-button.vue | 8 +++++--- src/client/app/mobile/views/components/follow-button.vue | 4 +++- src/models/user.ts | 4 ++-- src/services/following/create.ts | 7 +------ src/services/following/requests/accept.ts | 2 ++ src/services/following/requests/create.ts | 2 -- src/services/following/requests/reject.ts | 5 ++++- 8 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/client/app/common/views/pages/follow.vue b/src/client/app/common/views/pages/follow.vue index ec74b3a9b9..05c1329f6d 100644 --- a/src/client/app/common/views/pages/follow.vue +++ b/src/client/app/common/views/pages/follow.vue @@ -83,7 +83,7 @@ export default Vue.extend({ userId: this.user.id }); } else { - if (this.user.isLocked && this.user.hasPendingFollowRequestFromYou) { + if (this.user.hasPendingFollowRequestFromYou) { this.user = await (this as any).api('following/requests/cancel', { userId: this.user.id }); diff --git a/src/client/app/desktop/views/components/follow-button.vue b/src/client/app/desktop/views/components/follow-button.vue index 62742a8f39..1db4b0cfa4 100644 --- a/src/client/app/desktop/views/components/follow-button.vue +++ b/src/client/app/desktop/views/components/follow-button.vue @@ -55,13 +55,15 @@ export default Vue.extend({ methods: { onFollow(user) { if (user.id == this.u.id) { - this.user.isFollowing = user.isFollowing; + this.u.isFollowing = user.isFollowing; + this.u.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou; } }, onUnfollow(user) { if (user.id == this.u.id) { - this.user.isFollowing = user.isFollowing; + this.u.isFollowing = user.isFollowing; + this.u.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou; } }, @@ -74,7 +76,7 @@ export default Vue.extend({ userId: this.u.id }); } else { - if (this.u.isLocked && this.u.hasPendingFollowRequestFromYou) { + if (this.u.hasPendingFollowRequestFromYou) { this.u = await (this as any).api('following/requests/cancel', { userId: this.u.id }); diff --git a/src/client/app/mobile/views/components/follow-button.vue b/src/client/app/mobile/views/components/follow-button.vue index 360ee91d4b..ff7260edb5 100644 --- a/src/client/app/mobile/views/components/follow-button.vue +++ b/src/client/app/mobile/views/components/follow-button.vue @@ -48,12 +48,14 @@ export default Vue.extend({ onFollow(user) { if (user.id == this.u.id) { this.u.isFollowing = user.isFollowing; + this.u.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou; } }, onUnfollow(user) { if (user.id == this.u.id) { this.u.isFollowing = user.isFollowing; + this.u.hasPendingFollowRequestFromYou = user.hasPendingFollowRequestFromYou; } }, @@ -66,7 +68,7 @@ export default Vue.extend({ userId: this.u.id }); } else { - if (this.u.isLocked && this.u.hasPendingFollowRequestFromYou) { + if (this.u.hasPendingFollowRequestFromYou) { this.u = await (this as any).api('following/requests/cancel', { userId: this.u.id }); diff --git a/src/models/user.ts b/src/models/user.ts index 31d09bc8f8..8f3fbbdc8f 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -432,10 +432,10 @@ export const pack = ( followerId: _user.id, followeeId: meId }), - _user.isLocked ? FollowRequest.findOne({ + FollowRequest.findOne({ followerId: meId, followeeId: _user.id - }) : Promise.resolve(null), + }), FollowRequest.findOne({ followerId: _user.id, followeeId: meId diff --git a/src/services/following/create.ts b/src/services/following/create.ts index bd39b8e183..dd2fa544dc 100644 --- a/src/services/following/create.ts +++ b/src/services/following/create.ts @@ -11,7 +11,7 @@ import { deliver } from '../../queue'; import createFollowRequest from './requests/create'; export default async function(follower: IUser, followee: IUser) { - if (followee.isLocked) { + if (followee.isLocked || isLocalUser(follower) && isRemoteUser(followee)) { await createFollowRequest(follower, followee); } else { const following = await Following.insert({ @@ -72,11 +72,6 @@ export default async function(follower: IUser, followee: IUser) { notify(followee._id, follower._id, 'follow'); } - if (isLocalUser(follower) && isRemoteUser(followee)) { - const content = pack(renderFollow(follower, followee)); - deliver(follower, content, followee.inbox); - } - if (isRemoteUser(follower) && isLocalUser(followee)) { const content = pack(renderAccept(renderFollow(follower, followee))); deliver(followee, content, follower.inbox); diff --git a/src/services/following/requests/accept.ts b/src/services/following/requests/accept.ts index bf8ed99e13..5e38879a49 100644 --- a/src/services/following/requests/accept.ts +++ b/src/services/following/requests/accept.ts @@ -75,4 +75,6 @@ export default async function(followee: IUser, follower: IUser) { packUser(followee, followee, { detail: true }).then(packed => publishUserStream(followee._id, 'meUpdated', packed)); + + packUser(followee, follower).then(packed => publishUserStream(follower._id, 'follow', packed)); } diff --git a/src/services/following/requests/create.ts b/src/services/following/requests/create.ts index 4c7c90cc08..946c22568c 100644 --- a/src/services/following/requests/create.ts +++ b/src/services/following/requests/create.ts @@ -7,8 +7,6 @@ import { deliver } from '../../../queue'; import FollowRequest from '../../../models/follow-request'; export default async function(follower: IUser, followee: IUser) { - if (!followee.isLocked) throw '対象のアカウントは鍵アカウントではありません'; - await FollowRequest.insert({ createdAt: new Date(), followerId: follower._id, diff --git a/src/services/following/requests/reject.ts b/src/services/following/requests/reject.ts index affcd2ef5a..eda6716321 100644 --- a/src/services/following/requests/reject.ts +++ b/src/services/following/requests/reject.ts @@ -1,9 +1,10 @@ -import User, { IUser, isRemoteUser, ILocalUser } from '../../../models/user'; +import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from '../../../models/user'; import FollowRequest from '../../../models/follow-request'; import pack from '../../../remote/activitypub/renderer'; import renderFollow from '../../../remote/activitypub/renderer/follow'; import renderReject from '../../../remote/activitypub/renderer/reject'; import { deliver } from '../../../queue'; +import { publishUserStream } from '../../../stream'; export default async function(followee: IUser, follower: IUser) { if (isRemoteUser(follower)) { @@ -21,4 +22,6 @@ export default async function(followee: IUser, follower: IUser) { pendingReceivedFollowRequestsCount: -1 } }); + + packUser(followee, follower).then(packed => publishUserStream(follower._id, 'unfollow', packed)); } From d279f8e9ffa5f192e205fa3b96933155f1cd180a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 4 Sep 2018 19:19:51 +0900 Subject: [PATCH 093/539] :art: --- src/client/app/mobile/views/components/notify.vue | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/client/app/mobile/views/components/notify.vue b/src/client/app/mobile/views/components/notify.vue index 1b93ab87a1..4d9b7c0f6b 100644 --- a/src/client/app/mobile/views/components/notify.vue +++ b/src/client/app/mobile/views/components/notify.vue @@ -24,7 +24,7 @@ export default Vue.extend({ setTimeout(() => { anime({ targets: this.$el, - bottom: '-72px', + bottom: `-${this.$el.offsetHeight}px`, duration: 500, easing: 'easeOutQuad', complete: () => this.$destroy() @@ -37,14 +37,16 @@ export default Vue.extend({ <style lang="stylus" scoped> .mk-notify + $height = 78px + position fixed z-index 1024 - bottom -72px + bottom -($height) left 0 right 0 width 100% max-width 500px - height 72px + height $height margin 0 auto padding 8px pointer-events none @@ -55,6 +57,7 @@ export default Vue.extend({ -webkit-backdrop-filter blur(2px) backdrop-filter blur(2px) background-color rgba(#000, 0.5) - border-radius 6px + border-radius 7px + overflow hidden </style> From 2555e23b107bb2c38e068e5f2f9da568a2adb375 Mon Sep 17 00:00:00 2001 From: tamaina <tamaina@hotmail.co.jp> Date: Tue, 4 Sep 2018 20:01:15 +0900 Subject: [PATCH 094/539] wip --- .../common/views/components/media-list.vue | 1 + .../desktop/views/components/media-audio.vue | 68 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/client/app/desktop/views/components/media-audio.vue diff --git a/src/client/app/common/views/components/media-list.vue b/src/client/app/common/views/components/media-list.vue index cdfc2c8d3c..c531f9ac91 100644 --- a/src/client/app/common/views/components/media-list.vue +++ b/src/client/app/common/views/components/media-list.vue @@ -3,6 +3,7 @@ <div :data-count="mediaList.length" ref="grid"> <template v-for="media in mediaList"> <mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')" :inline-playable="mediaList.length === 1"/> + <mk-media-audio :video="media" :key="media.id" v-if="media.type.startsWith('audio')" :inline-playable="mediaList.length === 1"/> <mk-media-image :image="media" :key="media.id" v-else :raw="raw"/> </template> </div> diff --git a/src/client/app/desktop/views/components/media-audio.vue b/src/client/app/desktop/views/components/media-audio.vue new file mode 100644 index 0000000000..4a0c26fb9e --- /dev/null +++ b/src/client/app/desktop/views/components/media-audio.vue @@ -0,0 +1,68 @@ +<template> +<div class="abunaiaudionankasirankedoichioux" v-if="audio.isSensitive && hide" @click="hide = false"> + <div> + <b>%fa:exclamation-triangle% %i18n:@sensitive%</b> + <span>%i18n:@click-to-show%</span> + </div> +</div> +<div class="komeijiokayusabanomisoniohitashi" v-else> + <audio class="audio" + :src="audio.url" + :title="audio.name" + controls + ref="audio" + v-if="inlinePlayable" /> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; + +export default Vue.extend({ + props: { + audio: { + type: Object, + required: true + }, + inlinePlayable: { + default: false + }, + hide: { + type: Boolean, + default: true + } + }, + computed: { + imageStyle(): any { + return { + 'background-image': `url(${this.audio.url})` + }; + } + } +}) +</script> + +<style lang="stylus" scoped> +.komeijiokayusabanomisoniohitashi + .audio + display block + width 100% + height 100% + border-radius 4px + +.abunaiaudionankasirankedoichioux + display flex + justify-content center + align-items center + background #111 + color #fff + + > div + display table-cell + text-align center + font-size 12px + + > b + display block + +</style> From dd3e3ddcdd69136023cb39a769d7785fac6696be Mon Sep 17 00:00:00 2001 From: tamaina <tamaina@hotmail.co.jp> Date: Tue, 4 Sep 2018 20:21:36 +0900 Subject: [PATCH 095/539] wip --- locales/ja-JP.yml | 5 ++ .../common/views/components/media-list.vue | 3 +- .../views/components/media-download.vue | 79 +++++++++++++++++++ 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 src/client/app/desktop/views/components/media-download.vue diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index a57f724a32..af1ef601af 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -583,6 +583,11 @@ desktop/views/components/media-video.vue: sensitive: "閲覧注意" click-to-show: "クリックして表示" +desktop/views/components/media-download.vue: + sensitive: "閲覧注意" + click-to-show: "クリックして表示" + download: "ダウンロード" + desktop/views/components/follow-button.vue: following: "フォロー中" follow: "フォロー" diff --git a/src/client/app/common/views/components/media-list.vue b/src/client/app/common/views/components/media-list.vue index cdfc2c8d3c..41b8bf9bb7 100644 --- a/src/client/app/common/views/components/media-list.vue +++ b/src/client/app/common/views/components/media-list.vue @@ -3,7 +3,8 @@ <div :data-count="mediaList.length" ref="grid"> <template v-for="media in mediaList"> <mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')" :inline-playable="mediaList.length === 1"/> - <mk-media-image :image="media" :key="media.id" v-else :raw="raw"/> + <mk-media-image :image="media" :key="media.id" v-if="media.type.startsWith('image')" :raw="raw"/> + <mk-media-download :download="media" :key="media.id" v-else :raw="raw"/> </template> </div> </div> diff --git a/src/client/app/desktop/views/components/media-download.vue b/src/client/app/desktop/views/components/media-download.vue new file mode 100644 index 0000000000..236b065204 --- /dev/null +++ b/src/client/app/desktop/views/components/media-download.vue @@ -0,0 +1,79 @@ +<template> +<div class="ldwbgwstjsdgcjruamauqdrffetqudry" v-if="download.isSensitive && hide" @click="hide = false"> + <div> + <b>%fa:exclamation-triangle% %i18n:@sensitive%</b> + <span>%i18n:@click-to-show%</span> + </div> +</div> +<a class="reiujibreakfastbreadbaconeggnuts" v-else + :href="download.url" + :style="style" + :title="download.name" + download="{{ download.name }}{{ download.ext }}" +> + <div> + <div>%fa:download%</div> + <div>%i18n:@download%</div> + <div>{{ download.name }}{{ download.ext }}</div> + </div> +</a> +</template> + +<script lang="ts"> +import Vue from 'vue'; + +export default Vue.extend({ + props: { + download: { + type: Object, + required: true + }, + raw: { + default: false + }, + hide: { + type: Boolean, + default: true + } + }, + computed: { + style(): any { + return { + 'background-color': this.download.properties.avgColor && this.download.properties.avgColor.length == 3 ? `rgb(${this.download.properties.avgColor.join(',')})` : 'transparent', + 'background-download': this.raw ? `url(${this.download.url})` : `url(${this.download.thumbnailUrl})` + }; + } + } +}); +</script> + +<style lang="stylus" scoped> +.reiujibreakfastbreadbaconeggnuts + display flex + justify-content center + align-items center + + > div + display table-cell + text-align center + font-size 12px + + > * + display block + +.ldwbgwstjsdgcjruamauqdrffetqudry + display flex + justify-content center + align-items center + background #111 + color #fff + + > div + display table-cell + text-align center + font-size 12px + + > * + display block + +</style> From 8bcfa97349b73b3c9759cad7b1678a02bc36e2f9 Mon Sep 17 00:00:00 2001 From: tamaina <tamaina@hotmail.co.jp> Date: Tue, 4 Sep 2018 21:06:02 +0900 Subject: [PATCH 096/539] wip --- locales/ja-JP.yml | 4 ++++ src/client/app/common/views/components/media-list.vue | 2 +- src/client/app/desktop/views/components/index.ts | 2 ++ src/client/app/desktop/views/components/media-audio.vue | 3 +-- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index a57f724a32..f04495ed95 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -583,6 +583,10 @@ desktop/views/components/media-video.vue: sensitive: "閲覧注意" click-to-show: "クリックして表示" +desktop/views/components/media-audio.vue: + sensitive: "閲覧注意" + click-to-show: "クリックして表示" + desktop/views/components/follow-button.vue: following: "フォロー中" follow: "フォロー" diff --git a/src/client/app/common/views/components/media-list.vue b/src/client/app/common/views/components/media-list.vue index c531f9ac91..4408ba2792 100644 --- a/src/client/app/common/views/components/media-list.vue +++ b/src/client/app/common/views/components/media-list.vue @@ -3,7 +3,7 @@ <div :data-count="mediaList.length" ref="grid"> <template v-for="media in mediaList"> <mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')" :inline-playable="mediaList.length === 1"/> - <mk-media-audio :video="media" :key="media.id" v-if="media.type.startsWith('audio')" :inline-playable="mediaList.length === 1"/> + <mk-media-audio :audio="media" :key="media.id" v-if="media.type.startsWith('audio')" :inline-playable="mediaList.length === 1"/> <mk-media-image :image="media" :key="media.id" v-else :raw="raw"/> </template> </div> diff --git a/src/client/app/desktop/views/components/index.ts b/src/client/app/desktop/views/components/index.ts index 7b7a38afa2..159ead4983 100644 --- a/src/client/app/desktop/views/components/index.ts +++ b/src/client/app/desktop/views/components/index.ts @@ -13,6 +13,7 @@ import ellipsisIcon from './ellipsis-icon.vue'; import mediaImage from './media-image.vue'; import mediaImageDialog from './media-image-dialog.vue'; import mediaVideo from './media-video.vue'; +import mediaAudio from './media-audio.vue'; import notifications from './notifications.vue'; import noteForm from './post-form.vue'; import renoteForm from './renote-form.vue'; @@ -43,6 +44,7 @@ Vue.component('mk-ellipsis-icon', ellipsisIcon); Vue.component('mk-media-image', mediaImage); Vue.component('mk-media-image-dialog', mediaImageDialog); Vue.component('mk-media-video', mediaVideo); +Vue.component('mk-media-audio', mediaAudio); Vue.component('mk-notifications', notifications); Vue.component('mk-post-form', noteForm); Vue.component('mk-renote-form', renoteForm); diff --git a/src/client/app/desktop/views/components/media-audio.vue b/src/client/app/desktop/views/components/media-audio.vue index 4a0c26fb9e..5d41947b17 100644 --- a/src/client/app/desktop/views/components/media-audio.vue +++ b/src/client/app/desktop/views/components/media-audio.vue @@ -10,8 +10,7 @@ :src="audio.url" :title="audio.name" controls - ref="audio" - v-if="inlinePlayable" /> + ref="audio" /> </div> </template> From ebeaef94e2545098ee81f143503180defa731793 Mon Sep 17 00:00:00 2001 From: tamaina <tamaina@hotmail.co.jp> Date: Wed, 5 Sep 2018 01:08:18 +0900 Subject: [PATCH 097/539] Improve media list --- locales/ja-JP.yml | 13 +-- .../app/common/views/components/index.ts | 2 + .../common/views/components/media-banner.vue | 85 ++++++++++++++ .../common/views/components/media-list.vue | 109 +++++++++--------- .../app/desktop/views/components/index.ts | 2 - .../desktop/views/components/media-audio.vue | 67 ----------- .../views/components/media-download.vue | 79 ------------- .../desktop/views/components/media-image.vue | 2 +- .../desktop/views/components/media-video.vue | 21 +--- .../mobile/views/components/media-image.vue | 2 +- 10 files changed, 152 insertions(+), 230 deletions(-) create mode 100644 src/client/app/common/views/components/media-banner.vue delete mode 100644 src/client/app/desktop/views/components/media-audio.vue delete mode 100644 src/client/app/desktop/views/components/media-download.vue diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 193c3c5022..de5505e7db 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -250,6 +250,10 @@ common/views/components/connect-failed.troubleshooter.vue: flush: "キャッシュの削除" set-version: "バージョン指定" +common/views/components/media-banner.vue: + sensitive: "閲覧注意" + click-to-show: "クリックして表示" + common/views/components/messaging.vue: search-user: "ユーザーを探す" you: "あなた" @@ -583,15 +587,6 @@ desktop/views/components/media-video.vue: sensitive: "閲覧注意" click-to-show: "クリックして表示" -desktop/views/components/media-audio.vue: - sensitive: "閲覧注意" - click-to-show: "クリックして表示" - -desktop/views/components/media-download.vue: - sensitive: "閲覧注意" - click-to-show: "クリックして表示" - download: "ダウンロード" - desktop/views/components/follow-button.vue: following: "フォロー中" follow: "フォロー" diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts index 4700b6269e..43cde6c54f 100644 --- a/src/client/app/common/views/components/index.ts +++ b/src/client/app/common/views/components/index.ts @@ -18,6 +18,7 @@ import reactionsViewer from './reactions-viewer.vue'; import time from './time.vue'; import timer from './timer.vue'; import mediaList from './media-list.vue'; +import mediaBanner from './media-banner.vue'; import uploader from './uploader.vue'; import specialMessage from './special-message.vue'; import streamIndicator from './stream-indicator.vue'; @@ -59,6 +60,7 @@ Vue.component('mk-reactions-viewer', reactionsViewer); Vue.component('mk-time', time); Vue.component('mk-timer', timer); Vue.component('mk-media-list', mediaList); +Vue.component('mk-media-banner', mediaBanner); Vue.component('mk-uploader', uploader); Vue.component('mk-special-message', specialMessage); Vue.component('mk-stream-indicator', streamIndicator); diff --git a/src/client/app/common/views/components/media-banner.vue b/src/client/app/common/views/components/media-banner.vue new file mode 100644 index 0000000000..69cd579446 --- /dev/null +++ b/src/client/app/common/views/components/media-banner.vue @@ -0,0 +1,85 @@ +<template> +<div class="mk-media-banner"> + <div class="mk-media-banner-sensitive" v-if="media.isSensitive && hide" @click="hide = false"> + <span class="mk-media-banner-icon">%fa:exclamation-triangle%</span> + <b>%i18n:@sensitive%</b> + <span>%i18n:@click-to-show%</span> + </div> + <div class="mk-media-banner-audio" v-else-if="media.type.startsWith('audio')"> + <audio class="audio" + :src="media.url" + :title="media.name" + controls + ref="audio" + preload="metadata" /> + </div> + <a class="mk-media-banner-download" v-else + :href="media.url" + :title="media.name" + :download="media.name" + > + <span class="mk-media-banner-icon">%fa:download%</span> + <b>{{ media.name }}</b> + </a> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; + +export default Vue.extend({ + props: { + media: { + type: Object, + required: true + }, + hide: { + type: Boolean, + default: true + } + } +}) +</script> + +<style lang="stylus" scoped> +.mk-media-banner + width 100% + border-radius 4px + margin-top 4px + overflow hidden + + .mk-media-banner-download, + .mk-media-banner-sensitive + display flex + align-items center + font-size 12px + padding .2em .6em + white-space nowrap + + > * + display block + + > b + flex-shrink 2147483647 + overflow hidden + text-overflow ellipsis + + > *:not(:last-child) + margin-right .2em + + > .mk-media-banner-icon + font-size 1.6em + + .mk-media-banner-download + background #f7f7f7 + + .mk-media-banner-sensitive + background #111 + color #fff + + .mk-media-banner-audio + .audio + display block + width 100% + height 100% +</style> diff --git a/src/client/app/common/views/components/media-list.vue b/src/client/app/common/views/components/media-list.vue index 0312c2dfda..e949c063ab 100644 --- a/src/client/app/common/views/components/media-list.vue +++ b/src/client/app/common/views/components/media-list.vue @@ -1,12 +1,15 @@ <template> <div class="mk-media-list"> - <div :data-count="mediaList.length" ref="grid"> - <template v-for="media in mediaList"> - <mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')" :inline-playable="mediaList.length === 1"/> - <mk-media-audio :audio="media" :key="media.id" v-else-if="media.type.startsWith('audio')"/> - <mk-media-image :image="media" :key="media.id" v-else-if="media.type.startsWith('image')" :raw="raw"/> - <mk-media-download :download="media" :key="media.id" v-else/> - </template> + <template v-for="media in mediaList"> + <mk-media-banner :media="media" :key="media.id" v-if="!media.type.startsWith('image') && !media.type.startsWith('video')"/> + </template> + <div class="mk-media-list-fixed" v-if="mediaList.filter(media => media.type.startsWith('image') || media.type.startsWith('video')).length > 0"> + <div :data-count="mediaList.filter(media => media.type.startsWith('video') || media.type.startsWith('image')).length" ref="grid"> + <template v-for="media in mediaList"> + <mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')"/> + <mk-media-image :image="media" :key="media.id" v-else-if="media.type.startsWith('image')" :raw="raw"/> + </template> + </div> </div> </div> </template> @@ -32,62 +35,64 @@ export default Vue.extend({ <style lang="stylus" scoped> .mk-media-list - width 100% + > .mk-media-list-fixed + width 100% + margin-top 4px - &:before - content '' - display block - padding-top 56.25% // 16:9 + &:before + content '' + display block + padding-top 56.25% // 16:9 - > div - position absolute - top 0 - right 0 - bottom 0 - left 0 - display grid - grid-gap 4px + > div + position absolute + top 0 + right 0 + bottom 0 + left 0 + display grid + grid-gap 4px - > * - overflow hidden - border-radius 4px + > * + overflow hidden + border-radius 4px - &[data-count="1"] - grid-template-rows 1fr + &[data-count="1"] + grid-template-rows 1fr - &[data-count="2"] - grid-template-columns 1fr 1fr - grid-template-rows 1fr + &[data-count="2"] + grid-template-columns 1fr 1fr + grid-template-rows 1fr - &[data-count="3"] - grid-template-columns 1fr 0.5fr - grid-template-rows 1fr 1fr + &[data-count="3"] + grid-template-columns 1fr 0.5fr + grid-template-rows 1fr 1fr + + > *:nth-child(1) + grid-row 1 / 3 + + > *:nth-child(3) + grid-column 2 / 3 + grid-row 2 / 3 + + &[data-count="4"] + grid-template-columns 1fr 1fr + grid-template-rows 1fr 1fr > *:nth-child(1) - grid-row 1 / 3 + grid-column 1 / 2 + grid-row 1 / 2 + + > *:nth-child(2) + grid-column 2 / 3 + grid-row 1 / 2 > *:nth-child(3) + grid-column 1 / 2 + grid-row 2 / 3 + + > *:nth-child(4) grid-column 2 / 3 grid-row 2 / 3 - &[data-count="4"] - grid-template-columns 1fr 1fr - grid-template-rows 1fr 1fr - - > *:nth-child(1) - grid-column 1 / 2 - grid-row 1 / 2 - - > *:nth-child(2) - grid-column 2 / 3 - grid-row 1 / 2 - - > *:nth-child(3) - grid-column 1 / 2 - grid-row 2 / 3 - - > *:nth-child(4) - grid-column 2 / 3 - grid-row 2 / 3 - </style> diff --git a/src/client/app/desktop/views/components/index.ts b/src/client/app/desktop/views/components/index.ts index 159ead4983..7b7a38afa2 100644 --- a/src/client/app/desktop/views/components/index.ts +++ b/src/client/app/desktop/views/components/index.ts @@ -13,7 +13,6 @@ import ellipsisIcon from './ellipsis-icon.vue'; import mediaImage from './media-image.vue'; import mediaImageDialog from './media-image-dialog.vue'; import mediaVideo from './media-video.vue'; -import mediaAudio from './media-audio.vue'; import notifications from './notifications.vue'; import noteForm from './post-form.vue'; import renoteForm from './renote-form.vue'; @@ -44,7 +43,6 @@ Vue.component('mk-ellipsis-icon', ellipsisIcon); Vue.component('mk-media-image', mediaImage); Vue.component('mk-media-image-dialog', mediaImageDialog); Vue.component('mk-media-video', mediaVideo); -Vue.component('mk-media-audio', mediaAudio); Vue.component('mk-notifications', notifications); Vue.component('mk-post-form', noteForm); Vue.component('mk-renote-form', renoteForm); diff --git a/src/client/app/desktop/views/components/media-audio.vue b/src/client/app/desktop/views/components/media-audio.vue deleted file mode 100644 index 5d41947b17..0000000000 --- a/src/client/app/desktop/views/components/media-audio.vue +++ /dev/null @@ -1,67 +0,0 @@ -<template> -<div class="abunaiaudionankasirankedoichioux" v-if="audio.isSensitive && hide" @click="hide = false"> - <div> - <b>%fa:exclamation-triangle% %i18n:@sensitive%</b> - <span>%i18n:@click-to-show%</span> - </div> -</div> -<div class="komeijiokayusabanomisoniohitashi" v-else> - <audio class="audio" - :src="audio.url" - :title="audio.name" - controls - ref="audio" /> -</div> -</template> - -<script lang="ts"> -import Vue from 'vue'; - -export default Vue.extend({ - props: { - audio: { - type: Object, - required: true - }, - inlinePlayable: { - default: false - }, - hide: { - type: Boolean, - default: true - } - }, - computed: { - imageStyle(): any { - return { - 'background-image': `url(${this.audio.url})` - }; - } - } -}) -</script> - -<style lang="stylus" scoped> -.komeijiokayusabanomisoniohitashi - .audio - display block - width 100% - height 100% - border-radius 4px - -.abunaiaudionankasirankedoichioux - display flex - justify-content center - align-items center - background #111 - color #fff - - > div - display table-cell - text-align center - font-size 12px - - > b - display block - -</style> diff --git a/src/client/app/desktop/views/components/media-download.vue b/src/client/app/desktop/views/components/media-download.vue deleted file mode 100644 index 236b065204..0000000000 --- a/src/client/app/desktop/views/components/media-download.vue +++ /dev/null @@ -1,79 +0,0 @@ -<template> -<div class="ldwbgwstjsdgcjruamauqdrffetqudry" v-if="download.isSensitive && hide" @click="hide = false"> - <div> - <b>%fa:exclamation-triangle% %i18n:@sensitive%</b> - <span>%i18n:@click-to-show%</span> - </div> -</div> -<a class="reiujibreakfastbreadbaconeggnuts" v-else - :href="download.url" - :style="style" - :title="download.name" - download="{{ download.name }}{{ download.ext }}" -> - <div> - <div>%fa:download%</div> - <div>%i18n:@download%</div> - <div>{{ download.name }}{{ download.ext }}</div> - </div> -</a> -</template> - -<script lang="ts"> -import Vue from 'vue'; - -export default Vue.extend({ - props: { - download: { - type: Object, - required: true - }, - raw: { - default: false - }, - hide: { - type: Boolean, - default: true - } - }, - computed: { - style(): any { - return { - 'background-color': this.download.properties.avgColor && this.download.properties.avgColor.length == 3 ? `rgb(${this.download.properties.avgColor.join(',')})` : 'transparent', - 'background-download': this.raw ? `url(${this.download.url})` : `url(${this.download.thumbnailUrl})` - }; - } - } -}); -</script> - -<style lang="stylus" scoped> -.reiujibreakfastbreadbaconeggnuts - display flex - justify-content center - align-items center - - > div - display table-cell - text-align center - font-size 12px - - > * - display block - -.ldwbgwstjsdgcjruamauqdrffetqudry - display flex - justify-content center - align-items center - background #111 - color #fff - - > div - display table-cell - text-align center - font-size 12px - - > * - display block - -</style> diff --git a/src/client/app/desktop/views/components/media-image.vue b/src/client/app/desktop/views/components/media-image.vue index 0284872c68..904dc7f832 100644 --- a/src/client/app/desktop/views/components/media-image.vue +++ b/src/client/app/desktop/views/components/media-image.vue @@ -89,7 +89,7 @@ export default Vue.extend({ text-align center font-size 12px - > b + > * display block </style> diff --git a/src/client/app/desktop/views/components/media-video.vue b/src/client/app/desktop/views/components/media-video.vue index 6c60f2da96..0a374acb8f 100644 --- a/src/client/app/desktop/views/components/media-video.vue +++ b/src/client/app/desktop/views/components/media-video.vue @@ -6,19 +6,11 @@ </div> </div> <div class="vwxdhznewyashiknzolsoihtlpicqepe" v-else> - <video class="video" - :src="video.url" - :title="video.name" - controls - @dblclick.prevent="onClick" - ref="video" - v-if="inlinePlayable" /> <a class="thumbnail" :href="video.url" :style="imageStyle" @click.prevent="onClick" - :title="video.name" - v-else> + :title="video.name"> %fa:R play-circle% </a> </div> @@ -34,9 +26,6 @@ export default Vue.extend({ type: Object, required: true }, - inlinePlayable: { - default: false - }, hide: { type: Boolean, default: true @@ -68,12 +57,6 @@ export default Vue.extend({ <style lang="stylus" scoped> .vwxdhznewyashiknzolsoihtlpicqepe - .video - display block - width 100% - height 100% - border-radius 4px - .thumbnail display flex justify-content center @@ -99,7 +82,7 @@ export default Vue.extend({ text-align center font-size 12px - > b + > * display block </style> diff --git a/src/client/app/mobile/views/components/media-image.vue b/src/client/app/mobile/views/components/media-image.vue index e40069bbe3..c8766f5464 100644 --- a/src/client/app/mobile/views/components/media-image.vue +++ b/src/client/app/mobile/views/components/media-image.vue @@ -65,7 +65,7 @@ export default Vue.extend({ text-align center font-size 12px - > b + > * display block </style> From f539491502e4969d43736e7e3e0f2493a2afaf25 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Wed, 5 Sep 2018 12:47:13 +0900 Subject: [PATCH 098/539] fix(package): update vue-js-modal to version 1.3.26 (#2613) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b53345b9d0..c5c363798e 100644 --- a/package.json +++ b/package.json @@ -210,7 +210,7 @@ "vue": "2.5.17", "vue-chartjs": "3.4.0", "vue-cropperjs": "2.2.1", - "vue-js-modal": "1.3.25", + "vue-js-modal": "1.3.26", "vue-json-tree-view": "2.1.4", "vue-loader": "15.4.1", "vue-router": "3.0.1", From a38ce86f87d72573dedcd1b09d7cea885715f9dc Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Wed, 5 Sep 2018 12:47:30 +0900 Subject: [PATCH 099/539] fix(package): update systeminformation to version 3.45.0 (#2609) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c5c363798e..6664c91b0e 100644 --- a/package.json +++ b/package.json @@ -194,7 +194,7 @@ "stylus": "0.54.5", "stylus-loader": "3.0.2", "summaly": "2.2.0", - "systeminformation": "3.44.2", + "systeminformation": "3.45.0", "syuilo-password-strength": "0.0.1", "textarea-caret": "3.1.0", "tmp": "0.0.33", From 4bce6f14f3a4df30495b0db7add39c69a9ea55ed Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Wed, 5 Sep 2018 12:48:00 +0900 Subject: [PATCH 100/539] fix(package): update node-sass-json-importer to version 4.0.0 (#2614) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6664c91b0e..2bfd0cc27a 100644 --- a/package.json +++ b/package.json @@ -161,7 +161,7 @@ "nan": "2.11.0", "nested-property": "0.0.7", "node-sass": "4.9.3", - "node-sass-json-importer": "3.3.1", + "node-sass-json-importer": "4.0.0", "nprogress": "0.2.0", "object-assign-deep": "0.4.0", "on-build-webpack": "0.1.0", From 7c5bc03492a475eac1008d67869cba8dcbc78a07 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 5 Sep 2018 12:53:08 +0900 Subject: [PATCH 101/539] Update langs --- locales/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/index.js b/locales/index.js index 1f28d3ff03..6780251e10 100644 --- a/locales/index.js +++ b/locales/index.js @@ -5,7 +5,7 @@ const fs = require('fs'); const yaml = require('js-yaml'); -const langs = ['de-DE', 'en-US', 'fr-FR', 'ja-JP', 'ja-KS', 'pl-PL', 'es-ES']; +const langs = ['de-DE', 'en-US', 'fr-FR', 'ja-JP', 'ja-KS', 'pl-PL', 'es-ES', 'nl-NL']; const loadLocale = lang => yaml.safeLoad(fs.readFileSync(`${__dirname}/${lang}.yml`, 'utf-8')); const locales = langs.map(lang => ({ [lang]: loadLocale(lang) })); From f77eaaa08ab99533b4d3709ecb104c6974802525 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 5 Sep 2018 13:06:49 +0900 Subject: [PATCH 102/539] Improve usability --- .../app/mobile/views/components/post-form-dialog.vue | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/client/app/mobile/views/components/post-form-dialog.vue b/src/client/app/mobile/views/components/post-form-dialog.vue index 6fe9249321..ec37386512 100644 --- a/src/client/app/mobile/views/components/post-form-dialog.vue +++ b/src/client/app/mobile/views/components/post-form-dialog.vue @@ -1,7 +1,7 @@ <template> <div class="ulveipglmagnxfgvitaxyszerjwiqmwl"> - <div class="bg" ref="bg" @click="onBgClick"></div> - <div class="main" ref="main" @click.self="onBgClick"> + <div class="bg" ref="bg"></div> + <div class="main" ref="main"> <mk-post-form ref="form" :reply="reply" :renote="renote" @@ -83,11 +83,6 @@ export default Vue.extend({ }); }, - onBgClick() { - this.$emit('cancel'); - this.close(); - }, - onPosted() { this.$emit('posted'); this.close(); From 6fea2f52f10f4cb9f6cfb9210917c615a9423307 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 5 Sep 2018 13:47:26 +0900 Subject: [PATCH 103/539] nanka iroiro --- locales/ja-JP.yml | 3 + .../app/common/views/components/ui/card.vue | 27 +++- .../app/common/views/components/ui/radio.vue | 2 +- .../app/common/views/components/ui/switch.vue | 7 ++ .../app/mobile/views/components/notify.vue | 18 ++- .../app/mobile/views/pages/settings.vue | 118 +++++++++++------- .../views/pages/settings/settings.profile.vue | 68 +++++----- src/client/app/store.ts | 3 +- 8 files changed, 155 insertions(+), 91 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index a57f724a32..1b73c825bb 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1355,6 +1355,9 @@ mobile/views/pages/settings.vue: post-style: "投稿の表示スタイル" post-style-standard: "標準" post-style-smart: "スマート" + notification-position: "通知の表示" + notification-position-bottom: "下" + notification-position-top: "上" behavior: "動作" fetch-on-scroll: "スクロールで自動読み込み" disable-via-mobile: "「モバイルからの投稿」フラグを付けない" diff --git a/src/client/app/common/views/components/ui/card.vue b/src/client/app/common/views/components/ui/card.vue index 05c51bca6b..aa16b557e1 100644 --- a/src/client/app/common/views/components/ui/card.vue +++ b/src/client/app/common/views/components/ui/card.vue @@ -24,19 +24,34 @@ export default Vue.extend({ root(isDark) margin 16px - padding 16px color isDark ? #fff : #000 background isDark ? #282C37 : #fff box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12) - @media (min-width 500px) - padding 32px - > header - font-weight normal - font-size 24px + padding 16px + font-weight bold + font-size 20px color isDark ? #fff : #444 + @media (min-width 500px) + padding 24px 32px + + > section + padding 20px 16px + border-top solid 1px isDark ? rgba(#000, 0.3) : rgba(#000, 0.1) + + @media (min-width 500px) + padding 32px + + &.fit-top + padding-top 0 + + > header + margin-bottom 16px + font-weight bold + color isDark ? #fff : #444 + .ui-card[data-darkmode] root(true) diff --git a/src/client/app/common/views/components/ui/radio.vue b/src/client/app/common/views/components/ui/radio.vue index 04a46c5a96..dcdda1cf0e 100644 --- a/src/client/app/common/views/components/ui/radio.vue +++ b/src/client/app/common/views/components/ui/radio.vue @@ -55,7 +55,7 @@ export default Vue.extend({ root(isDark) display inline-block - margin 32px 32px 32px 0 + margin 0 32px 0 0 cursor pointer transition all 0.3s diff --git a/src/client/app/common/views/components/ui/switch.vue b/src/client/app/common/views/components/ui/switch.vue index a9e00d73d2..e88b867801 100644 --- a/src/client/app/common/views/components/ui/switch.vue +++ b/src/client/app/common/views/components/ui/switch.vue @@ -64,6 +64,12 @@ root(isDark) cursor pointer transition all 0.3s + &:first-child + margin-top 0 + + &:last-child + margin-bottom 0 + > * user-select none @@ -89,6 +95,7 @@ root(isDark) > .button display inline-block + flex-shrink 0 margin 3px 0 0 0 width 34px height 14px diff --git a/src/client/app/mobile/views/components/notify.vue b/src/client/app/mobile/views/components/notify.vue index 4d9b7c0f6b..7a2f7bfedc 100644 --- a/src/client/app/mobile/views/components/notify.vue +++ b/src/client/app/mobile/views/components/notify.vue @@ -1,5 +1,5 @@ <template> -<div class="mk-notify"> +<div class="mk-notify" :class="pos"> <div> <mk-notification-preview :notification="notification"/> </div> @@ -12,11 +12,16 @@ import * as anime from 'animejs'; export default Vue.extend({ props: ['notification'], + computed: { + pos() { + return this.$store.state.device.mobileNotificationPosition; + } + }, mounted() { this.$nextTick(() => { anime({ targets: this.$el, - bottom: '0px', + [this.pos]: '0px', duration: 500, easing: 'easeOutQuad' }); @@ -24,7 +29,7 @@ export default Vue.extend({ setTimeout(() => { anime({ targets: this.$el, - bottom: `-${this.$el.offsetHeight}px`, + [this.pos]: `-${this.$el.offsetHeight}px`, duration: 500, easing: 'easeOutQuad', complete: () => this.$destroy() @@ -41,7 +46,6 @@ export default Vue.extend({ position fixed z-index 1024 - bottom -($height) left 0 right 0 width 100% @@ -52,6 +56,12 @@ export default Vue.extend({ pointer-events none font-size 80% + &.bottom + bottom -($height) + + &.top + top -($height) + > div height 100% -webkit-backdrop-filter blur(2px) diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index 838ffd2a6b..4a148dc9d2 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -10,80 +10,101 @@ <ui-card> <div slot="title">%fa:palette% %i18n:@design%</div> - <ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch> - <ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch> - <ui-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi">%i18n:common.i-like-sushi%</ui-switch> - <ui-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch> - <ui-switch v-model="$store.state.settings.games.reversi.showBoardLabels" @change="onChangeReversiBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch> - <ui-switch v-model="$store.state.settings.games.reversi.useContrastStones" @change="onChangeUseContrastReversiStones">%i18n:common.use-contrast-reversi-stones%</ui-switch> + <section> + <ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch> + <ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch> + <ui-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi">%i18n:common.i-like-sushi%</ui-switch> + <ui-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch> + <ui-switch v-model="$store.state.settings.games.reversi.showBoardLabels" @change="onChangeReversiBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch> + <ui-switch v-model="$store.state.settings.games.reversi.useContrastStones" @change="onChangeUseContrastReversiStones">%i18n:common.use-contrast-reversi-stones%</ui-switch> + </section> - <div> - <div>%i18n:@timeline%</div> - <ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch> - <ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch> - <ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch> - <ui-switch v-model="$store.state.settings.showLocalRenotes" @change="onChangeShowLocalRenotes">%i18n:@show-local-renotes%</ui-switch> - </div> + <section> + <header>%i18n:@timeline%</header> + <div> + <ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch> + <ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch> + <ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch> + <ui-switch v-model="$store.state.settings.showLocalRenotes" @change="onChangeShowLocalRenotes">%i18n:@show-local-renotes%</ui-switch> + </div> + </section> - <div> - <div>%i18n:@post-style%</div> + <section> + <header>%i18n:@post-style%</header> <ui-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</ui-radio> <ui-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</ui-radio> - </div> + </section> + + <section> + <header>%i18n:@notification-position%</header> + <ui-radio v-model="mobileNotificationPosition" value="bottom">%i18n:@notification-position-bottom%</ui-radio> + <ui-radio v-model="mobileNotificationPosition" value="top">%i18n:@notification-position-top%</ui-radio> + </section> </ui-card> <ui-card> <div slot="title">%fa:cog% %i18n:@behavior%</div> - <ui-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</ui-switch> - <ui-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</ui-switch> - <ui-switch v-model="loadRawImages">%i18n:@load-raw-images%</ui-switch> - <ui-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</ui-switch> - <ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch> + + <section> + <ui-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</ui-switch> + <ui-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</ui-switch> + <ui-switch v-model="loadRawImages">%i18n:@load-raw-images%</ui-switch> + <ui-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</ui-switch> + <ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch> + </section> </ui-card> <ui-card> <div slot="title">%fa:volume-up% %i18n:@sound%</div> - <ui-switch v-model="enableSounds">%i18n:@enable-sounds%</ui-switch> + <section> + <ui-switch v-model="enableSounds">%i18n:@enable-sounds%</ui-switch> + </section> </ui-card> <ui-card> <div slot="title">%fa:language% %i18n:@lang%</div> - <ui-select v-model="lang" placeholder="%i18n:@auto%"> - <optgroup label="%i18n:@recommended%"> - <option value="">%i18n:@auto%</option> - </optgroup> + <section class="fit-top"> + <ui-select v-model="lang" placeholder="%i18n:@auto%"> + <optgroup label="%i18n:@recommended%"> + <option value="">%i18n:@auto%</option> + </optgroup> - <optgroup label="%i18n:@specify-language%"> - <option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</option> - </optgroup> - </ui-select> - <span>%fa:info-circle% %i18n:@lang-tip%</span> + <optgroup label="%i18n:@specify-language%"> + <option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</option> + </optgroup> + </ui-select> + <span>%fa:info-circle% %i18n:@lang-tip%</span> + </section> </ui-card> <ui-card> <div slot="title">%fa:B twitter% %i18n:@twitter%</div> - <p class="account" v-if="$store.state.i.twitter"><a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p> - <p> - <a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ $store.state.i.twitter ? '%i18n:@twitter-reconnect%' : '%i18n:@twitter-connect%' }}</a> - <span v-if="$store.state.i.twitter"> or </span> - <a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter">%i18n:@twitter-disconnect%</a> - </p> + <section> + <p class="account" v-if="$store.state.i.twitter"><a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p> + <p> + <a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ $store.state.i.twitter ? '%i18n:@twitter-reconnect%' : '%i18n:@twitter-connect%' }}</a> + <span v-if="$store.state.i.twitter"> or </span> + <a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter">%i18n:@twitter-disconnect%</a> + </p> + </section> </ui-card> <ui-card> <div slot="title">%fa:sync-alt% %i18n:@update%</div> - <div>%i18n:@version% <i>{{ version }}</i></div> - <template v-if="latestVersion !== undefined"> - <div>%i18n:@latest-version% <i>{{ latestVersion ? latestVersion : version }}</i></div> - </template> - <ui-button @click="checkForUpdate" :disabled="checkingForUpdate"> - <template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template> - <template v-else>%i18n:@check-for-updates%</template> - </ui-button> + <section> + <div>%i18n:@version% <i>{{ version }}</i></div> + <template v-if="latestVersion !== undefined"> + <div>%i18n:@latest-version% <i>{{ latestVersion ? latestVersion : version }}</i></div> + </template> + <ui-button @click="checkForUpdate" :disabled="checkingForUpdate"> + <template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template> + <template v-else>%i18n:@check-for-updates%</template> + </ui-button> + </section> </ui-card> </div> @@ -134,6 +155,11 @@ export default Vue.extend({ set(value) { this.$store.commit('device/set', { key: 'postStyle', value }); } }, + mobileNotificationPosition: { + get() { return this.$store.state.device.mobileNotificationPosition; }, + set(value) { this.$store.commit('device/set', { key: 'mobileNotificationPosition', value }); } + }, + lightmode: { get() { return this.$store.state.device.lightmode; }, set(value) { this.$store.commit('device/set', { key: 'lightmode', value }); } @@ -273,7 +299,7 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) margin 0 auto - max-width 500px + max-width 600px width 100% > .signin-as diff --git a/src/client/app/mobile/views/pages/settings/settings.profile.vue b/src/client/app/mobile/views/pages/settings/settings.profile.vue index 3b797cdde1..3efeac3da5 100644 --- a/src/client/app/mobile/views/pages/settings/settings.profile.vue +++ b/src/client/app/mobile/views/pages/settings/settings.profile.vue @@ -2,47 +2,49 @@ <ui-card> <div slot="title">%fa:user% %i18n:@title%</div> - <ui-form :disabled="saving"> - <ui-input v-model="name" :max="30"> - <span>%i18n:@name%</span> - </ui-input> + <section class="fit-top"> + <ui-form :disabled="saving"> + <ui-input v-model="name" :max="30"> + <span>%i18n:@name%</span> + </ui-input> - <ui-input v-model="username" readonly> - <span>%i18n:@account%</span> - <span slot="prefix">@</span> - <span slot="suffix">@{{ host }}</span> - </ui-input> + <ui-input v-model="username" readonly> + <span>%i18n:@account%</span> + <span slot="prefix">@</span> + <span slot="suffix">@{{ host }}</span> + </ui-input> - <ui-input v-model="location"> - <span>%i18n:@location%</span> - <span slot="prefix">%fa:map-marker-alt%</span> - </ui-input> + <ui-input v-model="location"> + <span>%i18n:@location%</span> + <span slot="prefix">%fa:map-marker-alt%</span> + </ui-input> - <ui-input v-model="birthday" type="date"> - <span>%i18n:@birthday%</span> - <span slot="prefix">%fa:birthday-cake%</span> - </ui-input> + <ui-input v-model="birthday" type="date"> + <span>%i18n:@birthday%</span> + <span slot="prefix">%fa:birthday-cake%</span> + </ui-input> - <ui-textarea v-model="description" :max="500"> - <span>%i18n:@description%</span> - </ui-textarea> + <ui-textarea v-model="description" :max="500"> + <span>%i18n:@description%</span> + </ui-textarea> - <ui-input type="file" @change="onAvatarChange"> - <span>%i18n:@avatar%</span> - <span slot="icon">%fa:image%</span> - <span slot="text" v-if="avatarUploading">%i18n:@uploading%<mk-ellipsis/></span> - </ui-input> + <ui-input type="file" @change="onAvatarChange"> + <span>%i18n:@avatar%</span> + <span slot="icon">%fa:image%</span> + <span slot="text" v-if="avatarUploading">%i18n:@uploading%<mk-ellipsis/></span> + </ui-input> - <ui-input type="file" @change="onBannerChange"> - <span>%i18n:@banner%</span> - <span slot="icon">%fa:image%</span> - <span slot="text" v-if="bannerUploading">%i18n:@uploading%<mk-ellipsis/></span> - </ui-input> + <ui-input type="file" @change="onBannerChange"> + <span>%i18n:@banner%</span> + <span slot="icon">%fa:image%</span> + <span slot="text" v-if="bannerUploading">%i18n:@uploading%<mk-ellipsis/></span> + </ui-input> - <ui-switch v-model="isCat">%i18n:@is-cat%</ui-switch> + <ui-switch v-model="isCat">%i18n:@is-cat%</ui-switch> - <ui-button @click="save">%i18n:@save%</ui-button> - </ui-form> + <ui-button @click="save">%i18n:@save%</ui-button> + </ui-form> + </section> </ui-card> </template> diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 469563495f..53f3eefc08 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -43,7 +43,8 @@ const defaultDeviceSettings = { debug: false, lightmode: false, loadRawImages: false, - postStyle: 'standard' + postStyle: 'standard', + mobileNotificationPosition: 'bottom' }; export default (os: MiOS) => new Vuex.Store({ From 1915ccabdd99f45d708122ff52a2c2070cef40bc Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 5 Sep 2018 13:49:08 +0900 Subject: [PATCH 104/539] 8.26.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2bfd0cc27a..7cfca8480e 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.25.0", - "clientVersion": "1.0.9297", + "version": "8.26.0", + "clientVersion": "1.0.9358", "codename": "nighthike", "main": "./built/index.js", "private": true, From f83f8631accb2455fe03fbcbb1711fdb829d163a Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Wed, 5 Sep 2018 13:56:59 +0900 Subject: [PATCH 105/539] fix(package): update systeminformation to version 3.45.1 (#2616) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7cfca8480e..70124a0ae4 100644 --- a/package.json +++ b/package.json @@ -194,7 +194,7 @@ "stylus": "0.54.5", "stylus-loader": "3.0.2", "summaly": "2.2.0", - "systeminformation": "3.45.0", + "systeminformation": "3.45.1", "syuilo-password-strength": "0.0.1", "textarea-caret": "3.1.0", "tmp": "0.0.33", From 8b490b9b94511e85dd37ab655d5ccead71ba6a4e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 5 Sep 2018 16:48:59 +0900 Subject: [PATCH 106/539] #2607 --- src/db/elasticsearch.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/db/elasticsearch.ts b/src/db/elasticsearch.ts index 4acff40793..ee5769d1d4 100644 --- a/src/db/elasticsearch.ts +++ b/src/db/elasticsearch.ts @@ -4,6 +4,12 @@ import config from '../config'; const index = { settings: { analysis: { + normalizer: { + lowercase_normalizer: { + type: 'custom', + filter: ['lowercase'] + } + }, analyzer: { bigram: { tokenizer: 'bigram_tokenizer' @@ -24,7 +30,8 @@ const index = { text: { type: 'text', index: true, - analyzer: 'bigram' + analyzer: 'bigram', + normalizer: 'lowercase_normalizer' } } } From ff8d300ea84a5ee4294123768789ddcab13819da Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 5 Sep 2018 17:43:31 +0900 Subject: [PATCH 107/539] =?UTF-8?q?=E3=83=A2=E3=83=90=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E7=89=88=E3=81=AE=E3=83=A1=E3=83=8B=E3=83=A5=E3=83=BC=E3=81=AB?= =?UTF-8?q?=E3=81=8A=E7=9F=A5=E3=82=89=E3=81=9B=E3=82=92=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/mobile/views/components/ui.nav.vue | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue index 54eed1b6d4..83a8eb4392 100644 --- a/src/client/app/mobile/views/components/ui.nav.vue +++ b/src/client/app/mobile/views/components/ui.nav.vue @@ -34,6 +34,12 @@ <li @click="dark"><p><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template><span>%i18n:@darkmode%</span></p></li> </ul> </div> + <div class="announcements" v-if="announcements.length > 0"> + <article v-for="announcement in announcements"> + <span v-html="announcement.title" class="title"></span> + <div v-html="announcement.text"></div> + </article> + </div> <a :href="aboutUrl"><p class="about">%i18n:@about%</p></a> </div> </transition> @@ -46,23 +52,32 @@ import { lang } from '../../../config'; export default Vue.extend({ props: ['isOpen'], + data() { return { hasGameInvitation: false, connection: null, connectionId: null, - aboutUrl: `/docs/${lang}/about` + aboutUrl: `/docs/${lang}/about`, + announcements: [] }; }, + computed: { hasUnreadNotification(): boolean { return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification; }, + hasUnreadMessagingMessage(): boolean { return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadMessagingMessage; } }, + mounted() { + (this as any).os.getMeta().then(meta => { + this.announcements = meta.broadcasts; + }); + if (this.$store.getters.isSignedIn) { this.connection = (this as any).os.stream.getConnection(); this.connectionId = (this as any).os.stream.use(); @@ -71,6 +86,7 @@ export default Vue.extend({ this.connection.on('reversi_no_invites', this.onReversiNoInvites); } }, + beforeDestroy() { if (this.$store.getters.isSignedIn) { this.connection.off('reversi_invited', this.onReversiInvited); @@ -78,18 +94,22 @@ export default Vue.extend({ (this as any).os.stream.dispose(this.connectionId); } }, + methods: { search() { const query = window.prompt('%i18n:@search%'); if (query == null || query == '') return; this.$router.push(`/search?q=${encodeURIComponent(query)}`); }, + onReversiInvited() { this.hasGameInvitation = true; }, + onReversiNoInvites() { this.hasGameInvitation = false; }, + dark() { this.$store.commit('device/set', { key: 'darkmode', @@ -204,6 +224,17 @@ root(isDark) color $color opacity 0.5 + .announcements + > article + background isDark ? rgba(30, 129, 216, 0.2) : rgba(155, 196, 232, 0.2) + color isDark ? #fff : #3f4967 + padding 16px + margin 8px 0 + font-size 12px + + > .title + font-weight bold + .about margin 0 0 8px 0 padding 1em 0 From 299f83684bbced1cabd36836ca37ccc1684ce750 Mon Sep 17 00:00:00 2001 From: tamaina <tamaina@hotmail.co.jp> Date: Wed, 5 Sep 2018 18:01:47 +0900 Subject: [PATCH 108/539] media-banner darkmode --- src/client/app/common/views/components/media-banner.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/client/app/common/views/components/media-banner.vue b/src/client/app/common/views/components/media-banner.vue index 69cd579446..48b0d03d30 100644 --- a/src/client/app/common/views/components/media-banner.vue +++ b/src/client/app/common/views/components/media-banner.vue @@ -70,7 +70,10 @@ export default Vue.extend({ > .mk-media-banner-icon font-size 1.6em - .mk-media-banner-download + .mk-media-banner-download[data-darkmode] + background #21242d + + .mk-media-banner-download:not([data-darkmode]) background #f7f7f7 .mk-media-banner-sensitive From db943df0c8fbded2a2d5a8f56927c173e6aba931 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 5 Sep 2018 18:09:31 +0900 Subject: [PATCH 109/539] :art: --- src/client/app/desktop/views/pages/welcome.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 0bc5c256e0..b7a39fbdb8 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -172,7 +172,7 @@ root(isDark) width 100% max-width 1200px height 100vh - min-height 800px + min-height 1000px margin 0 auto padding 64px From a1b82e97230eab994c06fc7c902e71539664d3d7 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 5 Sep 2018 19:32:46 +0900 Subject: [PATCH 110/539] #2620 --- package.json | 2 +- .../app/common/scripts/parse-search-query.ts | 53 ------------------- .../views/components/welcome-timeline.vue | 2 +- .../desktop/views/components/note-detail.vue | 6 +-- .../desktop/views/components/notes.note.vue | 6 +-- .../app/desktop/views/components/notes.vue | 2 +- .../views/components/post-form-window.vue | 10 ++-- .../desktop/views/components/post-form.vue | 16 +++--- .../views/components/sub-note-content.vue | 6 +-- .../desktop/views/pages/deck/deck.list-tl.vue | 6 +-- .../desktop/views/pages/deck/deck.note.vue | 16 +++--- .../desktop/views/pages/deck/deck.notes.vue | 2 +- .../app/desktop/views/pages/deck/deck.tl.vue | 6 +-- .../desktop/views/pages/user/user.photos.vue | 6 +-- .../views/pages/user/user.timeline.vue | 4 +- .../app/desktop/views/widgets/trends.vue | 2 +- .../mobile/views/components/note-detail.vue | 8 +-- .../app/mobile/views/components/note.vue | 8 +-- .../app/mobile/views/components/notes.vue | 2 +- .../app/mobile/views/components/post-form.vue | 8 +-- .../views/components/sub-note-content.vue | 6 +-- .../mobile/views/components/user-timeline.vue | 4 +- .../mobile/views/pages/user/home.photos.vue | 2 +- src/docs/api/entities/note.yaml | 12 ++--- src/misc/get-note-summary.ts | 6 +-- src/misc/is-quote.ts | 2 +- src/models/drive-file.ts | 2 +- src/models/note.ts | 26 +++++++-- src/remote/activitypub/models/note.ts | 6 +-- src/remote/activitypub/renderer/note.ts | 4 +- src/server/activitypub/outbox.ts | 2 +- src/server/api/endpoints/notes.ts | 10 ++-- src/server/api/endpoints/notes/create.ts | 23 +++++--- .../api/endpoints/notes/global-timeline.ts | 10 ++-- .../api/endpoints/notes/hybrid-timeline.ts | 12 ++--- .../api/endpoints/notes/local-timeline.ts | 10 ++-- .../api/endpoints/notes/search_by_tag.ts | 6 +-- src/server/api/endpoints/notes/timeline.ts | 12 ++--- src/server/api/endpoints/notes/trend.ts | 2 +- .../api/endpoints/notes/user-list-timeline.ts | 12 ++--- src/server/api/endpoints/users/notes.ts | 10 ++-- src/services/note/create.ts | 11 ++-- src/services/note/delete.ts | 2 +- 43 files changed, 167 insertions(+), 196 deletions(-) delete mode 100644 src/client/app/common/scripts/parse-search-query.ts diff --git a/package.json b/package.json index 70124a0ae4..775c997e55 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.26.0", + "version": "9.0.0", "clientVersion": "1.0.9358", "codename": "nighthike", "main": "./built/index.js", diff --git a/src/client/app/common/scripts/parse-search-query.ts b/src/client/app/common/scripts/parse-search-query.ts deleted file mode 100644 index 5f6ae3320a..0000000000 --- a/src/client/app/common/scripts/parse-search-query.ts +++ /dev/null @@ -1,53 +0,0 @@ -export default function(qs: string) { - const q = { - text: '' - }; - - qs.split(' ').forEach(x => { - if (/^([a-z_]+?):(.+?)$/.test(x)) { - const [key, value] = x.split(':'); - switch (key) { - case 'user': - q['includeUserUsernames'] = value.split(','); - break; - case 'exclude_user': - q['excludeUserUsernames'] = value.split(','); - break; - case 'follow': - q['following'] = value == 'null' ? null : value == 'true'; - break; - case 'reply': - q['reply'] = value == 'null' ? null : value == 'true'; - break; - case 'renote': - q['renote'] = value == 'null' ? null : value == 'true'; - break; - case 'media': - q['media'] = value == 'null' ? null : value == 'true'; - break; - case 'poll': - q['poll'] = value == 'null' ? null : value == 'true'; - break; - case 'until': - case 'since': - // YYYY-MM-DD - if (/^[0-9]+\-[0-9]+\-[0-9]+$/) { - const [yyyy, mm, dd] = value.split('-'); - q[`${key}_date`] = (new Date(parseInt(yyyy, 10), parseInt(mm, 10) - 1, parseInt(dd, 10))).getTime(); - } - break; - default: - q[key] = value; - break; - } - } else { - q.text += x + ' '; - } - }); - - if (q.text) { - q.text = q.text.trim(); - } - - return q; -} diff --git a/src/client/app/common/views/components/welcome-timeline.vue b/src/client/app/common/views/components/welcome-timeline.vue index d4e7902c7b..b427721d37 100644 --- a/src/client/app/common/views/components/welcome-timeline.vue +++ b/src/client/app/common/views/components/welcome-timeline.vue @@ -63,7 +63,7 @@ export default Vue.extend({ local: true, reply: false, renote: false, - media: false, + file: false, poll: false }).then(notes => { this.notes = notes; diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index 1ba4a9a447..a61a004a85 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -42,8 +42,8 @@ <span v-if="p.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span> <misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i"/> </div> - <div class="media" v-if="p.media.length > 0"> - <mk-media-list :media-list="p.media" :raw="true"/> + <div class="files" v-if="p.files.length > 0"> + <mk-media-list :media-list="p.files" :raw="true"/> </div> <mk-poll v-if="p.poll" :note="p"/> <mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/> @@ -114,7 +114,7 @@ export default Vue.extend({ isRenote(): boolean { return (this.note.renote && this.note.text == null && - this.note.mediaIds.length == 0 && + this.note.fileIds.length == 0 && this.note.poll == null); }, p(): any { diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 7592ae3905..1d6b2048ba 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -28,8 +28,8 @@ <misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i" :class="$style.text"/> <a class="rp" v-if="p.renote">RP:</a> </div> - <div class="media" v-if="p.media.length > 0"> - <mk-media-list :media-list="p.media"/> + <div class="files" v-if="p.files.length > 0"> + <mk-media-list :media-list="p.files"/> </div> <mk-poll v-if="p.poll" :note="p" ref="pollViewer"/> <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a> @@ -110,7 +110,7 @@ export default Vue.extend({ isRenote(): boolean { return (this.note.renote && this.note.text == null && - this.note.mediaIds.length == 0 && + this.note.fileIds.length == 0 && this.note.poll == null); }, diff --git a/src/client/app/desktop/views/components/notes.vue b/src/client/app/desktop/views/components/notes.vue index a1c1207a7b..f19ecf8f9a 100644 --- a/src/client/app/desktop/views/components/notes.vue +++ b/src/client/app/desktop/views/components/notes.vue @@ -122,7 +122,7 @@ export default Vue.extend({ prepend(note, silent = false) { //#region 弾く const isMyNote = note.userId == this.$store.state.i.id; - const isPureRenote = note.renoteId != null && note.text == null && note.mediaIds.length == 0 && note.poll == null; + const isPureRenote = note.renoteId != null && note.text == null && note.fileIds.length == 0 && note.poll == null; if (this.$store.state.settings.showMyRenotes === false) { if (isMyNote && isPureRenote) { diff --git a/src/client/app/desktop/views/components/post-form-window.vue b/src/client/app/desktop/views/components/post-form-window.vue index 51a416e281..a88c96d1bf 100644 --- a/src/client/app/desktop/views/components/post-form-window.vue +++ b/src/client/app/desktop/views/components/post-form-window.vue @@ -4,7 +4,7 @@ <span class="icon" v-if="geo">%fa:map-marker-alt%</span> <span v-if="!reply">%i18n:@note%</span> <span v-if="reply">%i18n:@reply%</span> - <span class="count" v-if="media.length != 0">{{ '%i18n:@attaches%'.replace('{}', media.length) }}</span> + <span class="count" v-if="files.length != 0">{{ '%i18n:@attaches%'.replace('{}', files.length) }}</span> <span class="count" v-if="uploadings.length != 0">{{ '%i18n:@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span> </span> @@ -14,7 +14,7 @@ :reply="reply" @posted="onPosted" @change-uploadings="onChangeUploadings" - @change-attached-media="onChangeMedia" + @change-attached-files="onChangeFiles" @geo-attached="onGeoAttached" @geo-dettached="onGeoDettached"/> </div> @@ -29,7 +29,7 @@ export default Vue.extend({ data() { return { uploadings: [], - media: [], + files: [], geo: null }; }, @@ -42,8 +42,8 @@ export default Vue.extend({ onChangeUploadings(files) { this.uploadings = files; }, - onChangeMedia(media) { - this.media = media; + onChangeFiles(files) { + this.files = files; }, onGeoAttached(geo) { this.geo = geo; diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index 2ca5484610..f6f52c8f1f 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -20,7 +20,7 @@ @keydown="onKeydown" @paste="onPaste" :placeholder="placeholder" v-autocomplete="'text'" ></textarea> - <div class="medias" :class="{ with: poll }" v-show="files.length != 0"> + <div class="files" :class="{ with: poll }" v-show="files.length != 0"> <x-draggable :list="files" :options="{ animation: 150 }"> <div v-for="file in files" :key="file.id"> <div class="img" :style="{ backgroundImage: `url(${file.thumbnailUrl})` }" :title="file.name"></div> @@ -188,7 +188,7 @@ export default Vue.extend({ (this.$refs.poll as any).set(draft.data.poll); }); } - this.$emit('change-attached-media', this.files); + this.$emit('change-attached-files', this.files); } } @@ -225,12 +225,12 @@ export default Vue.extend({ attachMedia(driveFile) { this.files.push(driveFile); - this.$emit('change-attached-media', this.files); + this.$emit('change-attached-files', this.files); }, detachMedia(id) { this.files = this.files.filter(x => x.id != id); - this.$emit('change-attached-media', this.files); + this.$emit('change-attached-files', this.files); }, onChangeFile() { @@ -249,7 +249,7 @@ export default Vue.extend({ this.text = ''; this.files = []; this.poll = false; - this.$emit('change-attached-media', this.files); + this.$emit('change-attached-files', this.files); }, onKeydown(e) { @@ -297,7 +297,7 @@ export default Vue.extend({ if (driveFile != null && driveFile != '') { const file = JSON.parse(driveFile); this.files.push(file); - this.$emit('change-attached-media', this.files); + this.$emit('change-attached-files', this.files); e.preventDefault(); } //#endregion @@ -354,7 +354,7 @@ export default Vue.extend({ (this as any).api('notes/create', { text: this.text == '' ? undefined : this.text, - mediaIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined, + fileIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined, replyId: this.reply ? this.reply.id : undefined, renoteId: this.renote ? this.renote.id : undefined, poll: this.poll ? (this.$refs.poll as any).get() : undefined, @@ -514,7 +514,7 @@ root(isDark) margin-right 8px white-space nowrap - > .medias + > .files margin 0 padding 0 background isDark ? #181b23 : lighten($theme-color, 98%) diff --git a/src/client/app/desktop/views/components/sub-note-content.vue b/src/client/app/desktop/views/components/sub-note-content.vue index cb0374b910..6889dc231e 100644 --- a/src/client/app/desktop/views/components/sub-note-content.vue +++ b/src/client/app/desktop/views/components/sub-note-content.vue @@ -7,9 +7,9 @@ <misskey-flavored-markdown v-if="note.text" :text="note.text" :i="$store.state.i"/> <a class="rp" v-if="note.renoteId" :href="`/notes/${note.renoteId}`">RP: ...</a> </div> - <details v-if="note.media.length > 0"> - <summary>({{ '%i18n:@media-count%'.replace('{}', note.media.length) }})</summary> - <mk-media-list :media-list="note.media"/> + <details v-if="note.files.length > 0"> + <summary>({{ '%i18n:@media-count%'.replace('{}', note.files.length) }})</summary> + <mk-media-list :media-list="note.files"/> </details> <details v-if="note.poll"> <summary>%i18n:@poll%</summary> diff --git a/src/client/app/desktop/views/pages/deck/deck.list-tl.vue b/src/client/app/desktop/views/pages/deck/deck.list-tl.vue index 70048f99e3..e82e76e4d0 100644 --- a/src/client/app/desktop/views/pages/deck/deck.list-tl.vue +++ b/src/client/app/desktop/views/pages/deck/deck.list-tl.vue @@ -68,7 +68,7 @@ export default Vue.extend({ (this as any).api('notes/user-list-timeline', { listId: this.list.id, limit: fetchLimit + 1, - mediaOnly: this.mediaOnly, + withFiles: this.mediaOnly, includeMyRenotes: this.$store.state.settings.showMyRenotes, includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, includeLocalRenotes: this.$store.state.settings.showLocalRenotes @@ -90,7 +90,7 @@ export default Vue.extend({ listId: this.list.id, limit: fetchLimit + 1, untilId: (this.$refs.timeline as any).tail().id, - mediaOnly: this.mediaOnly, + withFiles: this.mediaOnly, includeMyRenotes: this.$store.state.settings.showMyRenotes, includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, includeLocalRenotes: this.$store.state.settings.showLocalRenotes @@ -109,7 +109,7 @@ export default Vue.extend({ return promise; }, onNote(note) { - if (this.mediaOnly && note.media.length == 0) return; + if (this.mediaOnly && note.files.length == 0) return; // Prepend a note (this.$refs.timeline as any).prepend(note); diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index 2615c0d090..b42df1f347 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -28,8 +28,8 @@ <misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i"/> <a class="rp" v-if="p.renote != null">RP:</a> </div> - <div class="media" v-if="p.media.length > 0"> - <mk-media-list :media-list="p.media"/> + <div class="files" v-if="p.files.length > 0"> + <mk-media-list :media-list="p.files"/> </div> <mk-poll v-if="p.poll" :note="p" ref="pollViewer"/> <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> @@ -54,11 +54,11 @@ </article> </div> <div v-else class="srwrkujossgfuhrbnvqkybtzxpblgchi"> - <div v-if="note.media.length > 0"> - <mk-media-list :media-list="note.media"/> + <div v-if="note.files.length > 0"> + <mk-media-list :media-list="note.files"/> </div> - <div v-if="note.renote && note.renote.media.length > 0"> - <mk-media-list :media-list="note.renote.media"/> + <div v-if="note.renote && note.renote.files.length > 0"> + <mk-media-list :media-list="note.renote.files"/> </div> </div> </template> @@ -100,7 +100,7 @@ export default Vue.extend({ isRenote(): boolean { return (this.note.renote && this.note.text == null && - this.note.mediaIds.length == 0 && + this.note.fileIds.length == 0 && this.note.poll == null); }, @@ -371,7 +371,7 @@ root(isDark) .mk-url-preview margin-top 8px - > .media + > .files > img display block max-width 100% diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue index f7fca5de92..2e7e30f12a 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notes.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue @@ -127,7 +127,7 @@ export default Vue.extend({ prepend(note, silent = false) { //#region 弾く const isMyNote = note.userId == this.$store.state.i.id; - const isPureRenote = note.renoteId != null && note.text == null && note.mediaIds.length == 0 && note.poll == null; + const isPureRenote = note.renoteId != null && note.text == null && note.fileIds.length == 0 && note.poll == null; if (this.$store.state.settings.showMyRenotes === false) { if (isMyNote && isPureRenote) { diff --git a/src/client/app/desktop/views/pages/deck/deck.tl.vue b/src/client/app/desktop/views/pages/deck/deck.tl.vue index a9e4d489c3..120ceb7fc2 100644 --- a/src/client/app/desktop/views/pages/deck/deck.tl.vue +++ b/src/client/app/desktop/views/pages/deck/deck.tl.vue @@ -96,7 +96,7 @@ export default Vue.extend({ (this.$refs.timeline as any).init(() => new Promise((res, rej) => { (this as any).api(this.endpoint, { limit: fetchLimit + 1, - mediaOnly: this.mediaOnly, + withFiles: this.mediaOnly, includeMyRenotes: this.$store.state.settings.showMyRenotes, includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, includeLocalRenotes: this.$store.state.settings.showLocalRenotes @@ -117,7 +117,7 @@ export default Vue.extend({ const promise = (this as any).api(this.endpoint, { limit: fetchLimit + 1, - mediaOnly: this.mediaOnly, + withFiles: this.mediaOnly, untilId: (this.$refs.timeline as any).tail().id, includeMyRenotes: this.$store.state.settings.showMyRenotes, includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, @@ -138,7 +138,7 @@ export default Vue.extend({ }, onNote(note) { - if (this.mediaOnly && note.media.length == 0) return; + if (this.mediaOnly && note.files.length == 0) return; // Prepend a note (this.$refs.timeline as any).prepend(note); diff --git a/src/client/app/desktop/views/pages/user/user.photos.vue b/src/client/app/desktop/views/pages/user/user.photos.vue index 64c537f1ed..c5cd9e24fe 100644 --- a/src/client/app/desktop/views/pages/user/user.photos.vue +++ b/src/client/app/desktop/views/pages/user/user.photos.vue @@ -24,12 +24,12 @@ export default Vue.extend({ mounted() { (this as any).api('users/notes', { userId: this.user.id, - withMedia: true, + withFiles: true, limit: 9 }).then(notes => { notes.forEach(note => { - note.media.forEach(media => { - if (this.images.length < 9) this.images.push(media); + note.files.forEach(file => { + if (this.images.length < 9) this.images.push(file); }); }); this.fetching = false; diff --git a/src/client/app/desktop/views/pages/user/user.timeline.vue b/src/client/app/desktop/views/pages/user/user.timeline.vue index 67987fcb94..54221380a7 100644 --- a/src/client/app/desktop/views/pages/user/user.timeline.vue +++ b/src/client/app/desktop/views/pages/user/user.timeline.vue @@ -66,7 +66,7 @@ export default Vue.extend({ limit: fetchLimit + 1, untilDate: this.date ? this.date.getTime() : undefined, includeReplies: this.mode == 'with-replies', - withMedia: this.mode == 'with-media' + withFiles: this.mode == 'with-media' }).then(notes => { if (notes.length == fetchLimit + 1) { notes.pop(); @@ -86,7 +86,7 @@ export default Vue.extend({ userId: this.user.id, limit: fetchLimit + 1, includeReplies: this.mode == 'with-replies', - withMedia: this.mode == 'with-media', + withFiles: this.mode == 'with-media', untilId: (this.$refs.timeline as any).tail().id }); diff --git a/src/client/app/desktop/views/widgets/trends.vue b/src/client/app/desktop/views/widgets/trends.vue index c33bf2f2f2..aeaab63ac4 100644 --- a/src/client/app/desktop/views/widgets/trends.vue +++ b/src/client/app/desktop/views/widgets/trends.vue @@ -49,7 +49,7 @@ export default define({ offset: this.offset, renote: false, reply: false, - media: false, + file: false, poll: false }).then(notes => { const note = notes ? notes[0] : null; diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index 786e57bb22..10ff3fcc09 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -40,8 +40,8 @@ <span v-if="p.deletedAt" style="opacity: 0.5">(%i18n:@deleted%)</span> <misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i"/> </div> - <div class="media" v-if="p.media.length > 0"> - <mk-media-list :media-list="p.media" :raw="true"/> + <div class="files" v-if="p.files.length > 0"> + <mk-media-list :media-list="p.files" :raw="true"/> </div> <mk-poll v-if="p.poll" :note="p"/> <mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/> @@ -113,7 +113,7 @@ export default Vue.extend({ isRenote(): boolean { return (this.note.renote && this.note.text == null && - this.note.mediaIds.length == 0 && + this.note.fileIds.length == 0 && this.note.poll == null); }, @@ -369,7 +369,7 @@ root(isDark) > .mk-url-preview margin-top 8px - > .media + > .files > img display block max-width 100% diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 258433cb3f..9bd4a83ecb 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -28,8 +28,8 @@ <misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i" :class="$style.text"/> <a class="rp" v-if="p.renote != null">RP:</a> </div> - <div class="media" v-if="p.media.length > 0"> - <mk-media-list :media-list="p.media"/> + <div class="files" v-if="p.files.length > 0"> + <mk-media-list :media-list="p.files"/> </div> <mk-poll v-if="p.poll" :note="p" ref="pollViewer"/> <mk-url-preview v-for="url in urls" :url="url" :key="url"/> @@ -90,7 +90,7 @@ export default Vue.extend({ isRenote(): boolean { return (this.note.renote && this.note.text == null && - this.note.mediaIds.length == 0 && + this.note.fileIds.length == 0 && this.note.poll == null); }, @@ -414,7 +414,7 @@ root(isDark) .mk-url-preview margin-top 8px - > .media + > .files > img display block max-width 100% diff --git a/src/client/app/mobile/views/components/notes.vue b/src/client/app/mobile/views/components/notes.vue index 714e521c0f..ce2670dc52 100644 --- a/src/client/app/mobile/views/components/notes.vue +++ b/src/client/app/mobile/views/components/notes.vue @@ -125,7 +125,7 @@ export default Vue.extend({ prepend(note, silent = false) { //#region 弾く const isMyNote = note.userId == this.$store.state.i.id; - const isPureRenote = note.renoteId != null && note.text == null && note.mediaIds.length == 0 && note.poll == null; + const isPureRenote = note.renoteId != null && note.text == null && note.fileIds.length == 0 && note.poll == null; if (this.$store.state.settings.showMyRenotes === false) { if (isMyNote && isPureRenote) { diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 8b1f7b08c8..644e27cce8 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -200,12 +200,12 @@ export default Vue.extend({ attachMedia(driveFile) { this.files.push(driveFile); - this.$emit('change-attached-media', this.files); + this.$emit('change-attached-files', this.files); }, detachMedia(file) { this.files = this.files.filter(x => x.id != file.id); - this.$emit('change-attached-media', this.files); + this.$emit('change-attached-files', this.files); }, onChangeFile() { @@ -269,7 +269,7 @@ export default Vue.extend({ this.text = ''; this.files = []; this.poll = false; - this.$emit('change-attached-media'); + this.$emit('change-attached-files'); }, post() { @@ -277,7 +277,7 @@ export default Vue.extend({ const viaMobile = this.$store.state.settings.disableViaMobile !== true; (this as any).api('notes/create', { text: this.text == '' ? undefined : this.text, - mediaIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined, + fileIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined, replyId: this.reply ? this.reply.id : undefined, renoteId: this.renote ? this.renote.id : undefined, poll: this.poll ? (this.$refs.poll as any).get() : undefined, diff --git a/src/client/app/mobile/views/components/sub-note-content.vue b/src/client/app/mobile/views/components/sub-note-content.vue index a4ce49786e..4d0aa25f34 100644 --- a/src/client/app/mobile/views/components/sub-note-content.vue +++ b/src/client/app/mobile/views/components/sub-note-content.vue @@ -7,9 +7,9 @@ <misskey-flavored-markdown v-if="note.text" :text="note.text" :i="$store.state.i"/> <a class="rp" v-if="note.renoteId">RP: ...</a> </div> - <details v-if="note.media.length > 0"> - <summary>({{ '%i18n:@media-count%'.replace('{}', note.media.length) }})</summary> - <mk-media-list :media-list="note.media"/> + <details v-if="note.files.length > 0"> + <summary>({{ '%i18n:@media-count%'.replace('{}', note.files.length) }})</summary> + <mk-media-list :media-list="note.files"/> </details> <details v-if="note.poll"> <summary>%i18n:@poll%</summary> diff --git a/src/client/app/mobile/views/components/user-timeline.vue b/src/client/app/mobile/views/components/user-timeline.vue index 6be675c0a7..7cd23d6655 100644 --- a/src/client/app/mobile/views/components/user-timeline.vue +++ b/src/client/app/mobile/views/components/user-timeline.vue @@ -41,7 +41,7 @@ export default Vue.extend({ (this.$refs.timeline as any).init(() => new Promise((res, rej) => { (this as any).api('users/notes', { userId: this.user.id, - withMedia: this.withMedia, + withFiles: this.withMedia, limit: fetchLimit + 1 }).then(notes => { if (notes.length == fetchLimit + 1) { @@ -62,7 +62,7 @@ export default Vue.extend({ const promise = (this as any).api('users/notes', { userId: this.user.id, - withMedia: this.withMedia, + withFiles: this.withMedia, limit: fetchLimit + 1, untilId: (this.$refs.timeline as any).tail().id }); diff --git a/src/client/app/mobile/views/pages/user/home.photos.vue b/src/client/app/mobile/views/pages/user/home.photos.vue index 73ff1d5173..e9025ec816 100644 --- a/src/client/app/mobile/views/pages/user/home.photos.vue +++ b/src/client/app/mobile/views/pages/user/home.photos.vue @@ -26,7 +26,7 @@ export default Vue.extend({ mounted() { (this as any).api('users/notes', { userId: this.user.id, - withMedia: true, + withFiles: true, limit: 6 }).then(notes => { notes.forEach(note => { diff --git a/src/docs/api/entities/note.yaml b/src/docs/api/entities/note.yaml index cae9a53f82..6654be2b02 100644 --- a/src/docs/api/entities/note.yaml +++ b/src/docs/api/entities/note.yaml @@ -33,19 +33,19 @@ props: ja-JP: "投稿の本文" en-US: "The text of this note" - mediaIds: + fileIds: type: "id(DriveFile)[]" optional: true desc: - ja-JP: "添付されているメディアのID (なければレスポンスでは空配列)" - en-US: "The IDs of the attached media (empty array for response if no media is attached)" + ja-JP: "添付されているファイルのID (なければレスポンスでは空配列)" + en-US: "The IDs of the attached files (empty array for response if no files is attached)" - media: + files: type: "entity(DriveFile)[]" optional: true desc: - ja-JP: "添付されているメディア" - en-US: "The attached media" + ja-JP: "添付されているファイル" + en-US: "The attached files" userId: type: "id(User)" diff --git a/src/misc/get-note-summary.ts b/src/misc/get-note-summary.ts index ec7c74cf9f..3c6f2dd3d6 100644 --- a/src/misc/get-note-summary.ts +++ b/src/misc/get-note-summary.ts @@ -16,9 +16,9 @@ const summarize = (note: any): string => { // 本文 summary += note.text ? note.text : ''; - // メディアが添付されているとき - if (note.media.length != 0) { - summary += ` (${note.media.length}つのメディア)`; + // ファイルが添付されているとき + if (note.files.length != 0) { + summary += ` (${note.files.length}つのファイル)`; } // 投票が添付されているとき diff --git a/src/misc/is-quote.ts b/src/misc/is-quote.ts index 420f03a489..a99b8f6434 100644 --- a/src/misc/is-quote.ts +++ b/src/misc/is-quote.ts @@ -1,5 +1,5 @@ import { INote } from '../models/note'; export default function(note: INote): boolean { - return note.renoteId != null && (note.text != null || note.poll != null || (note.mediaIds != null && note.mediaIds.length > 0)); + return note.renoteId != null && (note.text != null || note.poll != null || (note.fileIds != null && note.fileIds.length > 0)); } diff --git a/src/models/drive-file.ts b/src/models/drive-file.ts index 698ef092a6..215b49b305 100644 --- a/src/models/drive-file.ts +++ b/src/models/drive-file.ts @@ -92,7 +92,7 @@ export async function deleteDriveFile(driveFile: string | mongo.ObjectID | IDriv // このDriveFileを添付しているNoteをすべて削除 await Promise.all(( - await Note.find({ mediaIds: d._id }) + await Note.find({ fileIds: d._id }) ).map(x => deleteNote(x))); // このDriveFileを添付しているMessagingMessageをすべて削除 diff --git a/src/models/note.ts b/src/models/note.ts index 9d2e23d901..98d37caf22 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -6,7 +6,7 @@ import { IUser, pack as packUser } from './user'; import { pack as packApp } from './app'; import PollVote, { deletePollVote } from './poll-vote'; import Reaction, { deleteNoteReaction } from './note-reaction'; -import { pack as packFile } from './drive-file'; +import { pack as packFile, IDriveFile } from './drive-file'; import NoteWatching, { deleteNoteWatching } from './note-watching'; import NoteReaction from './note-reaction'; import Favorite, { deleteFavorite } from './favorite'; @@ -17,9 +17,20 @@ const Note = db.get<INote>('notes'); Note.createIndex('uri', { sparse: true, unique: true }); Note.createIndex('userId'); Note.createIndex('tagsLower'); +Note.createIndex('_files.contentType'); Note.createIndex({ createdAt: -1 }); + +// 後方互換性のため +Note.update({}, { + $rename: { + mediaIds: 'fileIds' + } +}, { + multi: true +}); + export default Note; export function isValidText(text: string): boolean { @@ -34,7 +45,7 @@ export type INote = { _id: mongo.ObjectID; createdAt: Date; deletedAt: Date; - mediaIds: mongo.ObjectID[]; + fileIds: mongo.ObjectID[]; replyId: mongo.ObjectID; renoteId: mongo.ObjectID; poll: { @@ -92,6 +103,7 @@ export type INote = { inbox?: string; }; _replyIds?: mongo.ObjectID[]; + _files?: IDriveFile[]; }; /** @@ -271,11 +283,15 @@ export const pack = async ( _note.app = packApp(_note.appId); } - // Populate media - _note.media = hide ? [] : Promise.all(_note.mediaIds.map((fileId: mongo.ObjectID) => + // Populate files + _note.files = hide ? [] : Promise.all(_note.fileIds.map((fileId: mongo.ObjectID) => packFile(fileId) )); + // 後方互換性のため + _note.mediaIds = _note.fileIds; + _note.media = _note.files; + // When requested a detailed note data if (opts.detail) { //#region 重いので廃止 @@ -344,7 +360,7 @@ export const pack = async ( } if (hide) { - _note.mediaIds = []; + _note.fileIds = []; _note.text = null; _note.poll = null; _note.cw = null; diff --git a/src/remote/activitypub/models/note.ts b/src/remote/activitypub/models/note.ts index 1dfeebfdf7..97188b44a6 100644 --- a/src/remote/activitypub/models/note.ts +++ b/src/remote/activitypub/models/note.ts @@ -78,11 +78,11 @@ export async function createNote(value: any, resolver?: Resolver, silent = false } //#endergion - // 添付メディア + // 添付ファイル // TODO: attachmentは必ずしもImageではない // TODO: attachmentは必ずしも配列ではない // Noteがsensitiveなら添付もsensitiveにする - const media = note.attachment + const files = note.attachment .map(attach => attach.sensitive = note.sensitive) ? await Promise.all(note.attachment.map(x => resolveImage(actor, x))) : []; @@ -100,7 +100,7 @@ export async function createNote(value: any, resolver?: Resolver, silent = false return await post(actor, { createdAt: new Date(note.published), - media, + files: files, reply, renote: undefined, cw: note.summary, diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts index 1d169d3088..6b30324ae7 100644 --- a/src/remote/activitypub/renderer/note.ts +++ b/src/remote/activitypub/renderer/note.ts @@ -8,8 +8,8 @@ import User from '../../../models/user'; import toHtml from '../misc/get-note-html'; export default async function renderNote(note: INote, dive = true): Promise<any> { - const promisedFiles: Promise<IDriveFile[]> = note.mediaIds - ? DriveFile.find({ _id: { $in: note.mediaIds } }) + const promisedFiles: Promise<IDriveFile[]> = note.fileIds + ? DriveFile.find({ _id: { $in: note.fileIds } }) : Promise.resolve([]); let inReplyTo; diff --git a/src/server/activitypub/outbox.ts b/src/server/activitypub/outbox.ts index 37df190880..cc7e55b5df 100644 --- a/src/server/activitypub/outbox.ts +++ b/src/server/activitypub/outbox.ts @@ -58,7 +58,7 @@ export default async (ctx: Router.IRouterContext) => { $or: [{ text: { $ne: null } }, { - mediaIds: { $ne: [] } + fileIds: { $ne: [] } }] }] } as any; diff --git a/src/server/api/endpoints/notes.ts b/src/server/api/endpoints/notes.ts index 029bc1a95e..4d15e9483f 100644 --- a/src/server/api/endpoints/notes.ts +++ b/src/server/api/endpoints/notes.ts @@ -20,9 +20,9 @@ export default (params: any) => new Promise(async (res, rej) => { const [renote, renoteErr] = $.bool.optional.get(params.renote); if (renoteErr) return rej('invalid renote param'); - // Get 'media' parameter - const [media, mediaErr] = $.bool.optional.get(params.media); - if (mediaErr) return rej('invalid media param'); + // Get 'files' parameter + const [files, filesErr] = $.bool.optional.get(params.files); + if (filesErr) return rej('invalid files param'); // Get 'poll' parameter const [poll, pollErr] = $.bool.optional.get(params.poll); @@ -79,8 +79,8 @@ export default (params: any) => new Promise(async (res, rej) => { query.renoteId = renote ? { $exists: true, $ne: null } : null; } - if (media != undefined) { - query.mediaIds = media ? { $exists: true, $ne: null } : []; + if (files != undefined) { + query.fileIds = files ? { $exists: true, $ne: null } : []; } if (poll != undefined) { diff --git a/src/server/api/endpoints/notes/create.ts b/src/server/api/endpoints/notes/create.ts index 04f5f7562e..47b53c943b 100644 --- a/src/server/api/endpoints/notes/create.ts +++ b/src/server/api/endpoints/notes/create.ts @@ -71,9 +71,15 @@ export const meta = { ref: 'geo' }), + fileIds: $.arr($.type(ID)).optional.unique().range(1, 4).note({ + desc: { + 'ja-JP': '添付するファイル' + } + }), + mediaIds: $.arr($.type(ID)).optional.unique().range(1, 4).note({ desc: { - 'ja-JP': '添付するメディア' + 'ja-JP': '添付するファイル (このパラメータは廃止予定です。代わりに fileIds を使ってください。)' } }), @@ -124,15 +130,16 @@ export default (params: any, user: ILocalUser, app: IApp) => new Promise(async ( } let files: IDriveFile[] = []; - if (ps.mediaIds !== undefined) { + const fileIds = ps.fileIds != null ? ps.fileIds : ps.mediaIds != null ? ps.mediaIds : null; + if (fileIds != null) { // Fetch files // forEach だと途中でエラーなどがあっても return できないので // 敢えて for を使っています。 - for (const mediaId of ps.mediaIds) { + for (const fileId of fileIds) { // Fetch file // SELECT _id const entity = await DriveFile.findOne({ - _id: mediaId, + _id: fileId, 'metadata.userId': user._id }); @@ -155,7 +162,7 @@ export default (params: any, user: ILocalUser, app: IApp) => new Promise(async ( if (renote == null) { return rej('renoteee is not found'); - } else if (renote.renoteId && !renote.text && !renote.mediaIds) { + } else if (renote.renoteId && !renote.text && !renote.fileIds) { return rej('cannot renote to renote'); } } @@ -176,7 +183,7 @@ export default (params: any, user: ILocalUser, app: IApp) => new Promise(async ( } // 返信対象が引用でないRenoteだったらエラー - if (reply.renoteId && !reply.text && !reply.mediaIds) { + if (reply.renoteId && !reply.text && !reply.fileIds) { return rej('cannot reply to renote'); } } @@ -191,13 +198,13 @@ export default (params: any, user: ILocalUser, app: IApp) => new Promise(async ( // テキストが無いかつ添付ファイルが無いかつRenoteも無いかつ投票も無かったらエラー if ((ps.text === undefined || ps.text === null) && files === null && renote === null && ps.poll === undefined) { - return rej('text, mediaIds, renoteId or poll is required'); + return rej('text, fileIds, renoteId or poll is required'); } // 投稿を作成 const note = await create(user, { createdAt: new Date(), - media: files, + files: files, poll: ps.poll, text: ps.text, reply, diff --git a/src/server/api/endpoints/notes/global-timeline.ts b/src/server/api/endpoints/notes/global-timeline.ts index 8f7233e308..554245a0f4 100644 --- a/src/server/api/endpoints/notes/global-timeline.ts +++ b/src/server/api/endpoints/notes/global-timeline.ts @@ -33,9 +33,9 @@ export default async (params: any, user: ILocalUser) => { throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified'; } - // Get 'mediaOnly' parameter - const [mediaOnly, mediaOnlyErr] = $.bool.optional.get(params.mediaOnly); - if (mediaOnlyErr) throw 'invalid mediaOnly param'; + // Get 'withFiles' parameter + const [withFiles, withFilesErr] = $.bool.optional.get(params.withFiles); + if (withFilesErr) throw 'invalid withFiles param'; // ミュートしているユーザーを取得 const mutedUserIds = user ? (await Mute.find({ @@ -68,8 +68,8 @@ export default async (params: any, user: ILocalUser) => { }; } - if (mediaOnly) { - query.mediaIds = { $exists: true, $ne: [] }; + if (withFiles) { + query.fileIds = { $exists: true, $ne: [] }; } if (sinceId) { diff --git a/src/server/api/endpoints/notes/hybrid-timeline.ts b/src/server/api/endpoints/notes/hybrid-timeline.ts index 2dbb1190c1..1060792683 100644 --- a/src/server/api/endpoints/notes/hybrid-timeline.ts +++ b/src/server/api/endpoints/notes/hybrid-timeline.ts @@ -66,7 +66,7 @@ export const meta = { } }), - mediaOnly: $.bool.optional.note({ + withFiles: $.bool.optional.note({ desc: { 'ja-JP': 'true にすると、メディアが添付された投稿だけ取得します' } @@ -164,7 +164,7 @@ export default async (params: any, user: ILocalUser) => { }, { text: { $ne: null } }, { - mediaIds: { $ne: [] } + fileIds: { $ne: [] } }, { poll: { $ne: null } }] @@ -180,7 +180,7 @@ export default async (params: any, user: ILocalUser) => { }, { text: { $ne: null } }, { - mediaIds: { $ne: [] } + fileIds: { $ne: [] } }, { poll: { $ne: null } }] @@ -196,16 +196,16 @@ export default async (params: any, user: ILocalUser) => { }, { text: { $ne: null } }, { - mediaIds: { $ne: [] } + fileIds: { $ne: [] } }, { poll: { $ne: null } }] }); } - if (ps.mediaOnly) { + if (ps.withFiles) { query.$and.push({ - mediaIds: { $exists: true, $ne: [] } + fileIds: { $exists: true, $ne: [] } }); } diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts index bbcc6303ca..018e636ab5 100644 --- a/src/server/api/endpoints/notes/local-timeline.ts +++ b/src/server/api/endpoints/notes/local-timeline.ts @@ -33,9 +33,9 @@ export default async (params: any, user: ILocalUser) => { throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified'; } - // Get 'mediaOnly' parameter - const [mediaOnly, mediaOnlyErr] = $.bool.optional.get(params.mediaOnly); - if (mediaOnlyErr) throw 'invalid mediaOnly param'; + // Get 'withFiles' parameter + const [withFiles, withFilesErr] = $.bool.optional.get(params.withFiles); + if (withFilesErr) throw 'invalid withFiles param'; // ミュートしているユーザーを取得 const mutedUserIds = user ? (await Mute.find({ @@ -69,8 +69,8 @@ export default async (params: any, user: ILocalUser) => { }; } - if (mediaOnly) { - query.mediaIds = { $exists: true, $ne: [] }; + if (withFiles) { + query.fileIds = { $exists: true, $ne: [] }; } if (sinceId) { diff --git a/src/server/api/endpoints/notes/search_by_tag.ts b/src/server/api/endpoints/notes/search_by_tag.ts index e092275fe8..317a0726d3 100644 --- a/src/server/api/endpoints/notes/search_by_tag.ts +++ b/src/server/api/endpoints/notes/search_by_tag.ts @@ -247,7 +247,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => if (media != null) { if (media) { push({ - mediaIds: { + fileIds: { $exists: true, $ne: null } @@ -255,11 +255,11 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => } else { push({ $or: [{ - mediaIds: { + fileIds: { $exists: false } }, { - mediaIds: null + fileIds: null }] }); } diff --git a/src/server/api/endpoints/notes/timeline.ts b/src/server/api/endpoints/notes/timeline.ts index 099bf2010b..145f648c56 100644 --- a/src/server/api/endpoints/notes/timeline.ts +++ b/src/server/api/endpoints/notes/timeline.ts @@ -67,7 +67,7 @@ export const meta = { } }), - mediaOnly: $.bool.optional.note({ + withFiles: $.bool.optional.note({ desc: { 'ja-JP': 'true にすると、メディアが添付された投稿だけ取得します' } @@ -154,7 +154,7 @@ export default async (params: any, user: ILocalUser) => { }, { text: { $ne: null } }, { - mediaIds: { $ne: [] } + fileIds: { $ne: [] } }, { poll: { $ne: null } }] @@ -170,7 +170,7 @@ export default async (params: any, user: ILocalUser) => { }, { text: { $ne: null } }, { - mediaIds: { $ne: [] } + fileIds: { $ne: [] } }, { poll: { $ne: null } }] @@ -186,16 +186,16 @@ export default async (params: any, user: ILocalUser) => { }, { text: { $ne: null } }, { - mediaIds: { $ne: [] } + fileIds: { $ne: [] } }, { poll: { $ne: null } }] }); } - if (ps.mediaOnly) { + if (ps.withFiles) { query.$and.push({ - mediaIds: { $exists: true, $ne: [] } + fileIds: { $exists: true, $ne: [] } }); } diff --git a/src/server/api/endpoints/notes/trend.ts b/src/server/api/endpoints/notes/trend.ts index 7a0a098f28..9f55ed3243 100644 --- a/src/server/api/endpoints/notes/trend.ts +++ b/src/server/api/endpoints/notes/trend.ts @@ -52,7 +52,7 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = } if (media != undefined) { - query.mediaIds = media ? { $exists: true, $ne: null } : null; + query.fileIds = media ? { $exists: true, $ne: null } : null; } if (poll != undefined) { diff --git a/src/server/api/endpoints/notes/user-list-timeline.ts b/src/server/api/endpoints/notes/user-list-timeline.ts index a7b43014ed..e00a7de371 100644 --- a/src/server/api/endpoints/notes/user-list-timeline.ts +++ b/src/server/api/endpoints/notes/user-list-timeline.ts @@ -73,7 +73,7 @@ export const meta = { } }), - mediaOnly: $.bool.optional.note({ + withFiles: $.bool.optional.note({ desc: { 'ja-JP': 'true にすると、メディアが添付された投稿だけ取得します' } @@ -160,7 +160,7 @@ export default async (params: any, user: ILocalUser) => { }, { text: { $ne: null } }, { - mediaIds: { $ne: [] } + fileIds: { $ne: [] } }, { poll: { $ne: null } }] @@ -176,7 +176,7 @@ export default async (params: any, user: ILocalUser) => { }, { text: { $ne: null } }, { - mediaIds: { $ne: [] } + fileIds: { $ne: [] } }, { poll: { $ne: null } }] @@ -192,16 +192,16 @@ export default async (params: any, user: ILocalUser) => { }, { text: { $ne: null } }, { - mediaIds: { $ne: [] } + fileIds: { $ne: [] } }, { poll: { $ne: null } }] }); } - if (ps.mediaOnly) { + if (ps.withFiles) { query.$and.push({ - mediaIds: { $exists: true, $ne: [] } + fileIds: { $exists: true, $ne: [] } }); } diff --git a/src/server/api/endpoints/users/notes.ts b/src/server/api/endpoints/users/notes.ts index ff7855bde0..d894e52dba 100644 --- a/src/server/api/endpoints/users/notes.ts +++ b/src/server/api/endpoints/users/notes.ts @@ -27,9 +27,9 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => const [includeReplies = true, includeRepliesErr] = $.bool.optional.get(params.includeReplies); if (includeRepliesErr) return rej('invalid includeReplies param'); - // Get 'withMedia' parameter - const [withMedia = false, withMediaErr] = $.bool.optional.get(params.withMedia); - if (withMediaErr) return rej('invalid withMedia param'); + // Get 'withFiles' parameter + const [withFiles = false, withFilesErr] = $.bool.optional.get(params.withFiles); + if (withFilesErr) return rej('invalid withFiles param'); // Get 'limit' parameter const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit); @@ -104,8 +104,8 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => query.replyId = null; } - if (withMedia) { - query.mediaIds = { + if (withFiles) { + query.fileIds = { $exists: true, $ne: [] }; diff --git a/src/services/note/create.ts b/src/services/note/create.ts index 63e3557828..11e3755863 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -84,7 +84,7 @@ type Option = { text?: string; reply?: INote; renote?: INote; - media?: IDriveFile[]; + files?: IDriveFile[]; geo?: any; poll?: any; viaMobile?: boolean; @@ -135,7 +135,7 @@ export default async (user: IUser, data: Option, silent = false) => new Promise< const mentionedUsers = await extractMentionedUsers(tokens); - const note = await insertNote(user, data, tokens, tags, mentionedUsers); + const note = await insertNote(user, data, tags, mentionedUsers); res(note); @@ -309,10 +309,10 @@ async function publish(user: IUser, note: INote, noteObj: any, reply: INote, ren publishToUserLists(note, noteObj); } -async function insertNote(user: IUser, data: Option, tokens: ReturnType<typeof parse>, tags: string[], mentionedUsers: IUser[]) { +async function insertNote(user: IUser, data: Option, tags: string[], mentionedUsers: IUser[]) { const insert: any = { createdAt: data.createdAt, - mediaIds: data.media ? data.media.map(file => file._id) : [], + fileIds: data.files ? data.files.map(file => file._id) : [], replyId: data.reply ? data.reply._id : null, renoteId: data.renote ? data.renote._id : null, text: data.text, @@ -347,7 +347,8 @@ async function insertNote(user: IUser, data: Option, tokens: ReturnType<typeof p _user: { host: user.host, inbox: isRemoteUser(user) ? user.inbox : undefined - } + }, + _files: data.files ? data.files : [] }; if (data.uri != null) insert.uri = data.uri; diff --git a/src/services/note/delete.ts b/src/services/note/delete.ts index dea306feec..32e736b7a5 100644 --- a/src/services/note/delete.ts +++ b/src/services/note/delete.ts @@ -23,7 +23,7 @@ export default async function(user: IUser, note: INote) { deletedAt: new Date(), text: null, tags: [], - mediaIds: [], + fileIds: [], poll: null, geo: null } From 37058e3480041a922ac5c193e4cc3bc29fd663ae Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 5 Sep 2018 19:35:57 +0900 Subject: [PATCH 111/539] Fix parameter name --- src/server/api/endpoints/notes/search_by_tag.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/server/api/endpoints/notes/search_by_tag.ts b/src/server/api/endpoints/notes/search_by_tag.ts index 317a0726d3..f982dc01e9 100644 --- a/src/server/api/endpoints/notes/search_by_tag.ts +++ b/src/server/api/endpoints/notes/search_by_tag.ts @@ -45,9 +45,9 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => const [renote = null, renoteErr] = $.bool.optional.nullable.get(params.renote); if (renoteErr) return rej('invalid renote param'); - // Get 'media' parameter - const [media = null, mediaErr] = $.bool.optional.nullable.get(params.media); - if (mediaErr) return rej('invalid media param'); + // Get 'withFiles' parameter + const [withFiles = null, withFilesErr] = $.bool.optional.nullable.get(params.withFiles); + if (withFilesErr) return rej('invalid withFiles param'); // Get 'poll' parameter const [poll = null, pollErr] = $.bool.optional.nullable.get(params.poll); @@ -244,8 +244,8 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => } } - if (media != null) { - if (media) { + if (withFiles != null) { + if (withFiles) { push({ fileIds: { $exists: true, From 4257fed5009a30b7815fe3254d18b4b87806fe51 Mon Sep 17 00:00:00 2001 From: tamaina <tamaina@hotmail.co.jp> Date: Wed, 5 Sep 2018 19:46:55 +0900 Subject: [PATCH 112/539] fix mk-media darkmode --- .../app/common/views/components/media-banner.vue | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/client/app/common/views/components/media-banner.vue b/src/client/app/common/views/components/media-banner.vue index 48b0d03d30..5c83925a32 100644 --- a/src/client/app/common/views/components/media-banner.vue +++ b/src/client/app/common/views/components/media-banner.vue @@ -42,7 +42,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -.mk-media-banner +root(isDark) width 100% border-radius 4px margin-top 4px @@ -70,11 +70,8 @@ export default Vue.extend({ > .mk-media-banner-icon font-size 1.6em - .mk-media-banner-download[data-darkmode] - background #21242d - - .mk-media-banner-download:not([data-darkmode]) - background #f7f7f7 + .mk-media-banner-download + background isDark ? #21242d : #f7f7f7 .mk-media-banner-sensitive background #111 @@ -85,4 +82,10 @@ export default Vue.extend({ display block width 100% height 100% + +.mk-media-banner[data-darkmode] + root(true) + +.mk-media-banner:not([data-darkmode]) + root(false) </style> From 229e85b2c595a296d1f6501ad7057b72fb5ffd53 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 5 Sep 2018 21:51:31 +0900 Subject: [PATCH 113/539] [WIP] Update welcome page --- .../app/desktop/views/pages/welcome.vue | 207 ++++++++++-------- 1 file changed, 119 insertions(+), 88 deletions(-) diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index b7a39fbdb8..ba22cb598f 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -9,41 +9,65 @@ <div class="body"> <div class="main block"> - <h1 v-if="name != 'Misskey'">{{ name }}</h1> - <h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1> + <div> + <h1 v-if="name != 'Misskey'">{{ name }}</h1> + <h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1> - <div class="info"> - <span><b>{{ host }}</b> - <span v-html="'%i18n:@powered-by-misskey%'"></span></span> - <span class="stats" v-if="stats"> - <span>%fa:user% {{ stats.originalUsersCount | number }}</span> - <span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span> - </span> + <div class="info"> + <span><b>{{ host }}</b> - <span v-html="'%i18n:@powered-by-misskey%'"></span></span> + <span class="stats" v-if="stats"> + <span>%fa:user% {{ stats.originalUsersCount | number }}</span> + <span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span> + </span> + </div> + + <p class="desc" v-html="description || '%i18n:common.about%'"></p> + + <p class="sign"> + <span class="signup" @click="signup">%i18n:@signup%</span> + <span class="divider">|</span> + <span class="signin" @click="signin">%i18n:@signin%</span> + </p> </div> - - <p class="desc" v-html="description || '%i18n:common.about%'"></p> - - <p class="sign"> - <span class="signup" @click="signup">%i18n:@signup%</span> - <span class="divider">|</span> - <span class="signin" @click="signin">%i18n:@signin%</span> - </p> </div> - <div class="broadcasts block"> - <div v-for="broadcast in broadcasts"> - <h1 v-html="broadcast.title"></h1> - <div v-html="broadcast.text"></div> + <div class="announcements block"> + <header>%fa:broadcast-tower% %i18n:@announcements%</header> + <div> + <div v-for="broadcast in broadcasts"> + <h1 v-html="broadcast.title"></h1> + <div v-html="broadcast.text"></div> + </div> + </div> + </div> + + <div class="photos block"> + <header>%fa:images% %i18n:@photos%</header> + <div> + <div v-for="photo in photos"> + </div> </div> </div> <div class="nav block"> - <mk-nav class="nav"/> + <div> + <mk-nav class="nav"/> + </div> </div> <div class="side"> - <mk-trends class="trends block"/> + <div class="trends block"> + <div> + <mk-trends/> + </div> + </div> - <mk-welcome-timeline class="tl block" :max="20"/> + <div class="tl block"> + <header>%fa:comment-alt R% %i18n:@timeline%</header> + <div> + <mk-welcome-timeline class="tl" :max="20"/> + </div> + </div> </div> </div> @@ -71,7 +95,8 @@ export default Vue.extend({ host, name: 'Misskey', description: '', - broadcasts: [] + broadcasts: [], + photos: [] }; }, created() { @@ -166,8 +191,8 @@ root(isDark) > .body display grid - grid-template-rows 0.5fr 0.5fr 64px - grid-template-columns 1fr 350px + grid-template-rows 1fr 1fr 64px + grid-template-columns 1fr 1fr 350px gap 16px width 100% max-width 1200px @@ -178,87 +203,95 @@ root(isDark) .block color isDark ? #fff : #444 - background isDark ? #313543 : #fff + background isDark ? #282C37 : #fff box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) //border-radius 8px overflow auto - > .main - grid-row 1 - grid-column 1 - padding 32px - border-top solid 5px $theme-color + > header + padding 0 16px + line-height 48px + background isDark ? #313543 : #fff - > h1 - margin 0 - - > img - margin -8px 0 0 -16px - max-width 280px - - > .info - margin 0 auto 16px auto - width $width - font-size 14px - - > .stats - margin-left 16px - padding-left 16px - border-left solid 1px isDark ? #fff : #444 - - > * - margin-right 16px - - > .sign - font-size 120% - - > .divider - margin 0 16px - - > .signin - > .signup - cursor pointer - - &:hover - color $theme-color - - > .hashtags - margin 16px auto - width $width - font-size 14px - background rgba(#000, 0.3) - border-radius 8px - - > * - display inline-block - margin 14px - - > .broadcasts - grid-row 2 - grid-column 1 - padding 32px + & + div + max-height calc(100% - 48px) > div - padding 0 0 16px 0 - margin 0 0 16px 0 - border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05) + overflow auto + + > .main + grid-row 1 + grid-column 1 / 3 + border-top solid 5px $theme-color + + > div + padding 32px > h1 margin 0 - font-size 1.5em + + > img + margin -8px 0 0 -16px + max-width 280px + + > .info + margin 0 auto 16px auto + width $width + font-size 14px + + > .stats + margin-left 16px + padding-left 16px + border-left solid 1px isDark ? #fff : #444 + + > * + margin-right 16px + + > .sign + font-size 120% + + > .divider + margin 0 16px + + > .signin + > .signup + cursor pointer + + &:hover + color $theme-color + + > .announcements + grid-row 2 + grid-column 1 + + > div + padding 32px + + > div + padding 0 0 16px 0 + margin 0 0 16px 0 + border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05) + + > h1 + margin 0 + font-size 1.25em + + > .photos + grid-row 2 + grid-column 2 > .nav display flex justify-content center align-items center grid-row 3 - grid-column 1 + grid-column 1 / 3 font-size 14px > .side display grid grid-row 1 / 4 - grid-column 2 + grid-column 3 grid-template-rows 1fr 350px grid-template-columns 1fr gap 16px @@ -266,8 +299,6 @@ root(isDark) > .tl grid-row 1 grid-column 1 - text-align left - max-height 100% overflow auto > .trends From b5ff2abdb9ee0c086c8970c738cce5d61761f8f5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 5 Sep 2018 23:55:51 +0900 Subject: [PATCH 114/539] =?UTF-8?q?=E4=BA=92=E6=8F=9B=E6=80=A7=E3=81=AE?= =?UTF-8?q?=E3=81=9F=E3=82=81=E3=81=AE=E3=82=B3=E3=83=BC=E3=83=89=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=20&=20#2623?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/api/endpoints/notes.ts | 128 ++++++----- .../api/endpoints/notes/global-timeline.ts | 83 ++++--- .../api/endpoints/notes/hybrid-timeline.ts | 12 +- .../api/endpoints/notes/local-timeline.ts | 83 ++++--- .../api/endpoints/notes/search_by_tag.ts | 211 ++++++++++-------- src/server/api/endpoints/notes/timeline.ts | 12 +- .../api/endpoints/notes/user-list-timeline.ts | 12 +- src/server/api/endpoints/users/notes.ts | 178 ++++++++++----- 8 files changed, 435 insertions(+), 284 deletions(-) diff --git a/src/server/api/endpoints/notes.ts b/src/server/api/endpoints/notes.ts index 4d15e9483f..5fa58d19de 100644 --- a/src/server/api/endpoints/notes.ts +++ b/src/server/api/endpoints/notes.ts @@ -1,51 +1,65 @@ -/** - * Module dependencies - */ import $ from 'cafy'; import ID from '../../../misc/cafy-id'; import Note, { pack } from '../../../models/note'; +import getParams from '../get-params'; + +export const meta = { + desc: { + 'ja-JP': '投稿を取得します。' + }, + + params: { + local: $.bool.optional.note({ + desc: { + 'ja-JP': 'ローカルの投稿に限定するか否か' + } + }), + + reply: $.bool.optional.note({ + desc: { + 'ja-JP': '返信に限定するか否か' + } + }), + + renote: $.bool.optional.note({ + desc: { + 'ja-JP': 'Renoteに限定するか否か' + } + }), + + withFiles: $.bool.optional.note({ + desc: { + 'ja-JP': 'ファイルが添付された投稿に限定するか否か' + } + }), + + media: $.bool.optional.note({ + desc: { + 'ja-JP': 'ファイルが添付された投稿に限定するか否か (このパラメータは廃止予定です。代わりに withFiles を使ってください。)' + } + }), + + poll: $.bool.optional.note({ + desc: { + 'ja-JP': 'アンケートが添付された投稿に限定するか否か' + } + }), + + limit: $.num.optional.range(1, 100).note({ + default: 10 + }), + + sinceId: $.type(ID).optional.note({}), + + untilId: $.type(ID).optional.note({}), + } +}; -/** - * Get all notes - */ export default (params: any) => new Promise(async (res, rej) => { - // Get 'local' parameter - const [local, localErr] = $.bool.optional.get(params.local); - if (localErr) return rej('invalid local param'); - - // Get 'reply' parameter - const [reply, replyErr] = $.bool.optional.get(params.reply); - if (replyErr) return rej('invalid reply param'); - - // Get 'renote' parameter - const [renote, renoteErr] = $.bool.optional.get(params.renote); - if (renoteErr) return rej('invalid renote param'); - - // Get 'files' parameter - const [files, filesErr] = $.bool.optional.get(params.files); - if (filesErr) return rej('invalid files param'); - - // Get 'poll' parameter - const [poll, pollErr] = $.bool.optional.get(params.poll); - if (pollErr) return rej('invalid poll param'); - - // Get 'bot' parameter - //const [bot, botErr] = $.bool.optional.get(params.bot); - //if (botErr) return rej('invalid bot param'); - - // Get 'limit' parameter - const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit); - if (limitErr) return rej('invalid limit param'); - - // Get 'sinceId' parameter - const [sinceId, sinceIdErr] = $.type(ID).optional.get(params.sinceId); - if (sinceIdErr) return rej('invalid sinceId param'); - - // Get 'untilId' parameter - const [untilId, untilIdErr] = $.type(ID).optional.get(params.untilId); - if (untilIdErr) return rej('invalid untilId param'); + const [ps, psErr] = getParams(meta, params); + if (psErr) throw psErr; // Check if both of sinceId and untilId is specified - if (sinceId && untilId) { + if (ps.sinceId && ps.untilId) { return rej('cannot set sinceId and untilId'); } @@ -56,35 +70,37 @@ export default (params: any) => new Promise(async (res, rej) => { const query = { visibility: 'public' } as any; - if (sinceId) { + if (ps.sinceId) { sort._id = 1; query._id = { - $gt: sinceId + $gt: ps.sinceId }; - } else if (untilId) { + } else if (ps.untilId) { query._id = { - $lt: untilId + $lt: ps.untilId }; } - if (local) { + if (ps.local) { query['_user.host'] = null; } - if (reply != undefined) { - query.replyId = reply ? { $exists: true, $ne: null } : null; + if (ps.reply != undefined) { + query.replyId = ps.reply ? { $exists: true, $ne: null } : null; } - if (renote != undefined) { - query.renoteId = renote ? { $exists: true, $ne: null } : null; + if (ps.renote != undefined) { + query.renoteId = ps.renote ? { $exists: true, $ne: null } : null; } - if (files != undefined) { - query.fileIds = files ? { $exists: true, $ne: null } : []; + const withFiles = ps.withFiles != undefined ? ps.withFiles : ps.media; + + if (withFiles) { + query.fileIds = withFiles ? { $exists: true, $ne: null } : []; } - if (poll != undefined) { - query.poll = poll ? { $exists: true, $ne: null } : null; + if (ps.poll != undefined) { + query.poll = ps.poll ? { $exists: true, $ne: null } : null; } // TODO @@ -95,7 +111,7 @@ export default (params: any) => new Promise(async (res, rej) => { // Issue query const notes = await Note .find(query, { - limit: limit, + limit: ps.limit, sort: sort }); diff --git a/src/server/api/endpoints/notes/global-timeline.ts b/src/server/api/endpoints/notes/global-timeline.ts index 554245a0f4..e70fc5d76f 100644 --- a/src/server/api/endpoints/notes/global-timeline.ts +++ b/src/server/api/endpoints/notes/global-timeline.ts @@ -3,40 +3,49 @@ import Note from '../../../../models/note'; import Mute from '../../../../models/mute'; import { pack } from '../../../../models/note'; import { ILocalUser } from '../../../../models/user'; +import getParams from '../../get-params'; + +export const meta = { + desc: { + 'ja-JP': 'グローバルタイムラインを取得します。' + }, + + params: { + withFiles: $.bool.optional.note({ + desc: { + 'ja-JP': 'ファイルが添付された投稿に限定するか否か' + } + }), + + mediaOnly: $.bool.optional.note({ + desc: { + 'ja-JP': 'ファイルが添付された投稿に限定するか否か (このパラメータは廃止予定です。代わりに withFiles を使ってください。)' + } + }), + + limit: $.num.optional.range(1, 100).note({ + default: 10 + }), + + sinceId: $.type(ID).optional.note({}), + + untilId: $.type(ID).optional.note({}), + + sinceDate: $.num.optional.note({}), + + untilDate: $.num.optional.note({}), + } +}; -/** - * Get timeline of global - */ export default async (params: any, user: ILocalUser) => { - // Get 'limit' parameter - const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit); - if (limitErr) throw 'invalid limit param'; - - // Get 'sinceId' parameter - const [sinceId, sinceIdErr] = $.type(ID).optional.get(params.sinceId); - if (sinceIdErr) throw 'invalid sinceId param'; - - // Get 'untilId' parameter - const [untilId, untilIdErr] = $.type(ID).optional.get(params.untilId); - if (untilIdErr) throw 'invalid untilId param'; - - // Get 'sinceDate' parameter - const [sinceDate, sinceDateErr] = $.num.optional.get(params.sinceDate); - if (sinceDateErr) throw 'invalid sinceDate param'; - - // Get 'untilDate' parameter - const [untilDate, untilDateErr] = $.num.optional.get(params.untilDate); - if (untilDateErr) throw 'invalid untilDate param'; + const [ps, psErr] = getParams(meta, params); + if (psErr) throw psErr; // Check if only one of sinceId, untilId, sinceDate, untilDate specified - if ([sinceId, untilId, sinceDate, untilDate].filter(x => x != null).length > 1) { + if ([ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate].filter(x => x != null).length > 1) { throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified'; } - // Get 'withFiles' parameter - const [withFiles, withFilesErr] = $.bool.optional.get(params.withFiles); - if (withFilesErr) throw 'invalid withFiles param'; - // ミュートしているユーザーを取得 const mutedUserIds = user ? (await Mute.find({ muterId: user._id @@ -68,27 +77,29 @@ export default async (params: any, user: ILocalUser) => { }; } + const withFiles = ps.withFiles != null ? ps.withFiles : ps.mediaOnly; + if (withFiles) { query.fileIds = { $exists: true, $ne: [] }; } - if (sinceId) { + if (ps.sinceId) { sort._id = 1; query._id = { - $gt: sinceId + $gt: ps.sinceId }; - } else if (untilId) { + } else if (ps.untilId) { query._id = { - $lt: untilId + $lt: ps.untilId }; - } else if (sinceDate) { + } else if (ps.sinceDate) { sort._id = 1; query.createdAt = { - $gt: new Date(sinceDate) + $gt: new Date(ps.sinceDate) }; - } else if (untilDate) { + } else if (ps.untilDate) { query.createdAt = { - $lt: new Date(untilDate) + $lt: new Date(ps.untilDate) }; } //#endregion @@ -96,7 +107,7 @@ export default async (params: any, user: ILocalUser) => { // Issue query const timeline = await Note .find(query, { - limit: limit, + limit: ps.limit, sort: sort }); diff --git a/src/server/api/endpoints/notes/hybrid-timeline.ts b/src/server/api/endpoints/notes/hybrid-timeline.ts index 1060792683..16cec86797 100644 --- a/src/server/api/endpoints/notes/hybrid-timeline.ts +++ b/src/server/api/endpoints/notes/hybrid-timeline.ts @@ -7,8 +7,6 @@ import { ILocalUser } from '../../../../models/user'; import getParams from '../../get-params'; export const meta = { - name: 'notes/hybrid-timeline', - desc: { 'ja-JP': 'ハイブリッドタイムラインを取得します。' }, @@ -68,7 +66,13 @@ export const meta = { withFiles: $.bool.optional.note({ desc: { - 'ja-JP': 'true にすると、メディアが添付された投稿だけ取得します' + 'ja-JP': 'true にすると、ファイルが添付された投稿だけ取得します' + } + }), + + mediaOnly: $.bool.optional.note({ + desc: { + 'ja-JP': 'true にすると、ファイルが添付された投稿だけ取得します (このパラメータは廃止予定です。代わりに withFiles を使ってください。)' } }), } @@ -203,7 +207,7 @@ export default async (params: any, user: ILocalUser) => { }); } - if (ps.withFiles) { + if (ps.withFiles || ps.mediaOnly) { query.$and.push({ fileIds: { $exists: true, $ne: [] } }); diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts index 018e636ab5..2458a70556 100644 --- a/src/server/api/endpoints/notes/local-timeline.ts +++ b/src/server/api/endpoints/notes/local-timeline.ts @@ -3,40 +3,49 @@ import Note from '../../../../models/note'; import Mute from '../../../../models/mute'; import { pack } from '../../../../models/note'; import { ILocalUser } from '../../../../models/user'; +import getParams from '../../get-params'; + +export const meta = { + desc: { + 'ja-JP': 'ローカルタイムラインを取得します。' + }, + + params: { + withFiles: $.bool.optional.note({ + desc: { + 'ja-JP': 'ファイルが添付された投稿に限定するか否か' + } + }), + + mediaOnly: $.bool.optional.note({ + desc: { + 'ja-JP': 'ファイルが添付された投稿に限定するか否か (このパラメータは廃止予定です。代わりに withFiles を使ってください。)' + } + }), + + limit: $.num.optional.range(1, 100).note({ + default: 10 + }), + + sinceId: $.type(ID).optional.note({}), + + untilId: $.type(ID).optional.note({}), + + sinceDate: $.num.optional.note({}), + + untilDate: $.num.optional.note({}), + } +}; -/** - * Get timeline of local - */ export default async (params: any, user: ILocalUser) => { - // Get 'limit' parameter - const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit); - if (limitErr) throw 'invalid limit param'; - - // Get 'sinceId' parameter - const [sinceId, sinceIdErr] = $.type(ID).optional.get(params.sinceId); - if (sinceIdErr) throw 'invalid sinceId param'; - - // Get 'untilId' parameter - const [untilId, untilIdErr] = $.type(ID).optional.get(params.untilId); - if (untilIdErr) throw 'invalid untilId param'; - - // Get 'sinceDate' parameter - const [sinceDate, sinceDateErr] = $.num.optional.get(params.sinceDate); - if (sinceDateErr) throw 'invalid sinceDate param'; - - // Get 'untilDate' parameter - const [untilDate, untilDateErr] = $.num.optional.get(params.untilDate); - if (untilDateErr) throw 'invalid untilDate param'; + const [ps, psErr] = getParams(meta, params); + if (psErr) throw psErr; // Check if only one of sinceId, untilId, sinceDate, untilDate specified - if ([sinceId, untilId, sinceDate, untilDate].filter(x => x != null).length > 1) { + if ([ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate].filter(x => x != null).length > 1) { throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified'; } - // Get 'withFiles' parameter - const [withFiles, withFilesErr] = $.bool.optional.get(params.withFiles); - if (withFilesErr) throw 'invalid withFiles param'; - // ミュートしているユーザーを取得 const mutedUserIds = user ? (await Mute.find({ muterId: user._id @@ -69,27 +78,29 @@ export default async (params: any, user: ILocalUser) => { }; } + const withFiles = ps.withFiles != null ? ps.withFiles : ps.mediaOnly; + if (withFiles) { query.fileIds = { $exists: true, $ne: [] }; } - if (sinceId) { + if (ps.sinceId) { sort._id = 1; query._id = { - $gt: sinceId + $gt: ps.sinceId }; - } else if (untilId) { + } else if (ps.untilId) { query._id = { - $lt: untilId + $lt: ps.untilId }; - } else if (sinceDate) { + } else if (ps.sinceDate) { sort._id = 1; query.createdAt = { - $gt: new Date(sinceDate) + $gt: new Date(ps.sinceDate) }; - } else if (untilDate) { + } else if (ps.untilDate) { query.createdAt = { - $lt: new Date(untilDate) + $lt: new Date(ps.untilDate) }; } //#endregion @@ -97,7 +108,7 @@ export default async (params: any, user: ILocalUser) => { // Issue query const timeline = await Note .find(query, { - limit: limit, + limit: ps.limit, sort: sort }); diff --git a/src/server/api/endpoints/notes/search_by_tag.ts b/src/server/api/endpoints/notes/search_by_tag.ts index f982dc01e9..82f11a9775 100644 --- a/src/server/api/endpoints/notes/search_by_tag.ts +++ b/src/server/api/endpoints/notes/search_by_tag.ts @@ -4,119 +4,152 @@ import User, { ILocalUser } from '../../../../models/user'; import Mute from '../../../../models/mute'; import { getFriendIds } from '../../common/get-friends'; import { pack } from '../../../../models/note'; +import getParams from '../../get-params'; + +export const meta = { + desc: { + 'ja-JP': '指定されたタグが付けられた投稿を取得します。' + }, + + params: { + tag: $.str.note({ + desc: { + 'ja-JP': 'タグ' + } + }), + + includeUserIds: $.arr($.type(ID)).optional.note({ + default: [] + }), + + excludeUserIds: $.arr($.type(ID)).optional.note({ + default: [] + }), + + includeUserUsernames: $.arr($.str).optional.note({ + default: [] + }), + + excludeUserUsernames: $.arr($.str).optional.note({ + default: [] + }), + + following: $.bool.optional.nullable.note({ + default: null + }), + + mute: $.str.optional.note({ + default: 'mute_all' + }), + + reply: $.bool.optional.nullable.note({ + default: null, + + desc: { + 'ja-JP': '返信に限定するか否か' + } + }), + + renote: $.bool.optional.nullable.note({ + default: null, + + desc: { + 'ja-JP': 'Renoteに限定するか否か' + } + }), + + withFiles: $.bool.optional.nullable.note({ + default: null, + + desc: { + 'ja-JP': 'ファイルが添付された投稿に限定するか否か' + } + }), + + media: $.bool.optional.nullable.note({ + default: null, + + desc: { + 'ja-JP': 'ファイルが添付された投稿に限定するか否か (このパラメータは廃止予定です。代わりに withFiles を使ってください。)' + } + }), + + poll: $.bool.optional.nullable.note({ + default: null, + + desc: { + 'ja-JP': 'アンケートが添付された投稿に限定するか否か' + } + }), + + sinceDate: $.num.optional.note({ + }), + + untilDate: $.num.optional.note({ + }), + + offset: $.num.optional.min(0).note({ + default: 0 + }), + + limit: $.num.optional.range(1, 30).note({ + default: 10 + }), + } +}; -/** - * Search notes by tag - */ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => { - // Get 'tag' parameter - const [tag, tagError] = $.str.get(params.tag); - if (tagError) return rej('invalid tag param'); + const [ps, psErr] = getParams(meta, params); + if (psErr) throw psErr; - // Get 'includeUserIds' parameter - const [includeUserIds = [], includeUserIdsErr] = $.arr($.type(ID)).optional.get(params.includeUserIds); - if (includeUserIdsErr) return rej('invalid includeUserIds param'); - - // Get 'excludeUserIds' parameter - const [excludeUserIds = [], excludeUserIdsErr] = $.arr($.type(ID)).optional.get(params.excludeUserIds); - if (excludeUserIdsErr) return rej('invalid excludeUserIds param'); - - // Get 'includeUserUsernames' parameter - const [includeUserUsernames = [], includeUserUsernamesErr] = $.arr($.str).optional.get(params.includeUserUsernames); - if (includeUserUsernamesErr) return rej('invalid includeUserUsernames param'); - - // Get 'excludeUserUsernames' parameter - const [excludeUserUsernames = [], excludeUserUsernamesErr] = $.arr($.str).optional.get(params.excludeUserUsernames); - if (excludeUserUsernamesErr) return rej('invalid excludeUserUsernames param'); - - // Get 'following' parameter - const [following = null, followingErr] = $.bool.optional.nullable.get(params.following); - if (followingErr) return rej('invalid following param'); - - // Get 'mute' parameter - const [mute = 'mute_all', muteErr] = $.str.optional.get(params.mute); - if (muteErr) return rej('invalid mute param'); - - // Get 'reply' parameter - const [reply = null, replyErr] = $.bool.optional.nullable.get(params.reply); - if (replyErr) return rej('invalid reply param'); - - // Get 'renote' parameter - const [renote = null, renoteErr] = $.bool.optional.nullable.get(params.renote); - if (renoteErr) return rej('invalid renote param'); - - // Get 'withFiles' parameter - const [withFiles = null, withFilesErr] = $.bool.optional.nullable.get(params.withFiles); - if (withFilesErr) return rej('invalid withFiles param'); - - // Get 'poll' parameter - const [poll = null, pollErr] = $.bool.optional.nullable.get(params.poll); - if (pollErr) return rej('invalid poll param'); - - // Get 'sinceDate' parameter - const [sinceDate, sinceDateErr] = $.num.optional.get(params.sinceDate); - if (sinceDateErr) throw 'invalid sinceDate param'; - - // Get 'untilDate' parameter - const [untilDate, untilDateErr] = $.num.optional.get(params.untilDate); - if (untilDateErr) throw 'invalid untilDate param'; - - // Get 'offset' parameter - const [offset = 0, offsetErr] = $.num.optional.min(0).get(params.offset); - if (offsetErr) return rej('invalid offset param'); - - // Get 'limit' parameter - const [limit = 10, limitErr] = $.num.optional.range(1, 30).get(params.limit); - if (limitErr) return rej('invalid limit param'); - - if (includeUserUsernames != null) { - const ids = (await Promise.all(includeUserUsernames.map(async (username) => { + if (ps.includeUserUsernames != null) { + const ids = (await Promise.all(ps.includeUserUsernames.map(async (username) => { const _user = await User.findOne({ usernameLower: username.toLowerCase() }); return _user ? _user._id : null; }))).filter(id => id != null); - ids.forEach(id => includeUserIds.push(id)); + ids.forEach(id => ps.includeUserIds.push(id)); } - if (excludeUserUsernames != null) { - const ids = (await Promise.all(excludeUserUsernames.map(async (username) => { + if (ps.excludeUserUsernames != null) { + const ids = (await Promise.all(ps.excludeUserUsernames.map(async (username) => { const _user = await User.findOne({ usernameLower: username.toLowerCase() }); return _user ? _user._id : null; }))).filter(id => id != null); - ids.forEach(id => excludeUserIds.push(id)); + ids.forEach(id => ps.excludeUserIds.push(id)); } let q: any = { $and: [{ - tagsLower: tag.toLowerCase() + tagsLower: ps.tag.toLowerCase() }] }; const push = (x: any) => q.$and.push(x); - if (includeUserIds && includeUserIds.length != 0) { + if (ps.includeUserIds && ps.includeUserIds.length != 0) { push({ userId: { - $in: includeUserIds + $in: ps.includeUserIds } }); - } else if (excludeUserIds && excludeUserIds.length != 0) { + } else if (ps.excludeUserIds && ps.excludeUserIds.length != 0) { push({ userId: { - $nin: excludeUserIds + $nin: ps.excludeUserIds } }); } - if (following != null && me != null) { + if (ps.following != null && me != null) { const ids = await getFriendIds(me._id, false); push({ - userId: following ? { + userId: ps.following ? { $in: ids } : { $nin: ids.concat(me._id) @@ -131,7 +164,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => }); const mutedUserIds = mutes.map(m => m.muteeId); - switch (mute) { + switch (ps.mute) { case 'mute_all': push({ userId: { @@ -202,8 +235,8 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => } } - if (reply != null) { - if (reply) { + if (ps.reply != null) { + if (ps.reply) { push({ replyId: { $exists: true, @@ -223,8 +256,8 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => } } - if (renote != null) { - if (renote) { + if (ps.renote != null) { + if (ps.renote) { push({ renoteId: { $exists: true, @@ -244,6 +277,8 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => } } + const withFiles = ps.withFiles != null ? ps.withFiles : ps.media; + if (withFiles != null) { if (withFiles) { push({ @@ -265,8 +300,8 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => } } - if (poll != null) { - if (poll) { + if (ps.poll != null) { + if (ps.poll) { push({ poll: { $exists: true, @@ -286,18 +321,18 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => } } - if (sinceDate) { + if (ps.sinceDate) { push({ createdAt: { - $gt: new Date(sinceDate) + $gt: new Date(ps.sinceDate) } }); } - if (untilDate) { + if (ps.untilDate) { push({ createdAt: { - $lt: new Date(untilDate) + $lt: new Date(ps.untilDate) } }); } @@ -312,8 +347,8 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => sort: { _id: -1 }, - limit: limit, - skip: offset + limit: ps.limit, + skip: ps.offset }); // Serialize diff --git a/src/server/api/endpoints/notes/timeline.ts b/src/server/api/endpoints/notes/timeline.ts index 145f648c56..089e7a182a 100644 --- a/src/server/api/endpoints/notes/timeline.ts +++ b/src/server/api/endpoints/notes/timeline.ts @@ -69,7 +69,13 @@ export const meta = { withFiles: $.bool.optional.note({ desc: { - 'ja-JP': 'true にすると、メディアが添付された投稿だけ取得します' + 'ja-JP': 'true にすると、ファイルが添付された投稿だけ取得します' + } + }), + + mediaOnly: $.bool.optional.note({ + desc: { + 'ja-JP': 'true にすると、ファイルが添付された投稿だけ取得します (このパラメータは廃止予定です。代わりに withFiles を使ってください。)' } }), } @@ -193,7 +199,9 @@ export default async (params: any, user: ILocalUser) => { }); } - if (ps.withFiles) { + const withFiles = ps.withFiles != null ? ps.withFiles : ps.mediaOnly; + + if (withFiles) { query.$and.push({ fileIds: { $exists: true, $ne: [] } }); diff --git a/src/server/api/endpoints/notes/user-list-timeline.ts b/src/server/api/endpoints/notes/user-list-timeline.ts index e00a7de371..61192d7d3e 100644 --- a/src/server/api/endpoints/notes/user-list-timeline.ts +++ b/src/server/api/endpoints/notes/user-list-timeline.ts @@ -75,7 +75,13 @@ export const meta = { withFiles: $.bool.optional.note({ desc: { - 'ja-JP': 'true にすると、メディアが添付された投稿だけ取得します' + 'ja-JP': 'true にすると、ファイルが添付された投稿だけ取得します' + } + }), + + mediaOnly: $.bool.optional.note({ + desc: { + 'ja-JP': 'true にすると、ファイルが添付された投稿だけ取得します (このパラメータは廃止予定です。代わりに withFiles を使ってください。)' } }), } @@ -199,7 +205,9 @@ export default async (params: any, user: ILocalUser) => { }); } - if (ps.withFiles) { + const withFiles = ps.withFiles != null ? ps.withFiles : ps.mediaOnly; + + if (withFiles) { query.$and.push({ fileIds: { $exists: true, $ne: [] } }); diff --git a/src/server/api/endpoints/users/notes.ts b/src/server/api/endpoints/users/notes.ts index d894e52dba..42c31189d6 100644 --- a/src/server/api/endpoints/users/notes.ts +++ b/src/server/api/endpoints/users/notes.ts @@ -2,63 +2,121 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; import getHostLower from '../../common/get-host-lower'; import Note, { pack } from '../../../../models/note'; import User, { ILocalUser } from '../../../../models/user'; +import getParams from '../../get-params'; + +export const meta = { + desc: { + 'ja-JP': '指定したユーザーのタイムラインを取得します。' + }, + + params: { + userId: $.type(ID).optional.note({ + desc: { + 'ja-JP': 'ユーザーID' + } + }), + + username: $.str.optional.note({ + desc: { + 'ja-JP': 'ユーザー名' + } + }), + + host: $.str.optional.note({ + }), + + includeReplies: $.bool.optional.note({ + default: true, + + desc: { + 'ja-JP': 'リプライを含めるか否か' + } + }), + + limit: $.num.optional.range(1, 100).note({ + default: 10, + desc: { + 'ja-JP': '最大数' + } + }), + + sinceId: $.type(ID).optional.note({ + desc: { + 'ja-JP': '指定すると、この投稿を基点としてより新しい投稿を取得します' + } + }), + + untilId: $.type(ID).optional.note({ + desc: { + 'ja-JP': '指定すると、この投稿を基点としてより古い投稿を取得します' + } + }), + + sinceDate: $.num.optional.note({ + desc: { + 'ja-JP': '指定した時間を基点としてより新しい投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。' + } + }), + + untilDate: $.num.optional.note({ + desc: { + 'ja-JP': '指定した時間を基点としてより古い投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。' + } + }), + + includeMyRenotes: $.bool.optional.note({ + default: true, + desc: { + 'ja-JP': '自分の行ったRenoteを含めるかどうか' + } + }), + + includeRenotedMyNotes: $.bool.optional.note({ + default: true, + desc: { + 'ja-JP': 'Renoteされた自分の投稿を含めるかどうか' + } + }), + + includeLocalRenotes: $.bool.optional.note({ + default: true, + desc: { + 'ja-JP': 'Renoteされたローカルの投稿を含めるかどうか' + } + }), + + withFiles: $.bool.optional.note({ + default: false, + desc: { + 'ja-JP': 'true にすると、ファイルが添付された投稿だけ取得します' + } + }), + + mediaOnly: $.bool.optional.note({ + default: false, + desc: { + 'ja-JP': 'true にすると、ファイルが添付された投稿だけ取得します (このパラメータは廃止予定です。代わりに withFiles を使ってください。)' + } + }), + } +}; -/** - * Get notes of a user - */ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => { - // Get 'userId' parameter - const [userId, userIdErr] = $.type(ID).optional.get(params.userId); - if (userIdErr) return rej('invalid userId param'); + const [ps, psErr] = getParams(meta, params); + if (psErr) throw psErr; - // Get 'username' parameter - const [username, usernameErr] = $.str.optional.get(params.username); - if (usernameErr) return rej('invalid username param'); - - if (userId === undefined && username === undefined) { + if (ps.userId === undefined && ps.username === undefined) { return rej('userId or username is required'); } - // Get 'host' parameter - const [host, hostErr] = $.str.optional.get(params.host); - if (hostErr) return rej('invalid host param'); - - // Get 'includeReplies' parameter - const [includeReplies = true, includeRepliesErr] = $.bool.optional.get(params.includeReplies); - if (includeRepliesErr) return rej('invalid includeReplies param'); - - // Get 'withFiles' parameter - const [withFiles = false, withFilesErr] = $.bool.optional.get(params.withFiles); - if (withFilesErr) return rej('invalid withFiles param'); - - // Get 'limit' parameter - const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit); - if (limitErr) return rej('invalid limit param'); - - // Get 'sinceId' parameter - const [sinceId, sinceIdErr] = $.type(ID).optional.get(params.sinceId); - if (sinceIdErr) return rej('invalid sinceId param'); - - // Get 'untilId' parameter - const [untilId, untilIdErr] = $.type(ID).optional.get(params.untilId); - if (untilIdErr) return rej('invalid untilId param'); - - // Get 'sinceDate' parameter - const [sinceDate, sinceDateErr] = $.num.optional.get(params.sinceDate); - if (sinceDateErr) throw 'invalid sinceDate param'; - - // Get 'untilDate' parameter - const [untilDate, untilDateErr] = $.num.optional.get(params.untilDate); - if (untilDateErr) throw 'invalid untilDate param'; - // Check if only one of sinceId, untilId, sinceDate, untilDate specified - if ([sinceId, untilId, sinceDate, untilDate].filter(x => x != null).length > 1) { + if ([ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate].filter(x => x != null).length > 1) { throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified'; } - const q = userId !== undefined - ? { _id: userId } - : { usernameLower: username.toLowerCase(), host: getHostLower(host) } ; + const q = ps.userId !== undefined + ? { _id: ps.userId } + : { usernameLower: ps.username.toLowerCase(), host: getHostLower(ps.host) } ; // Lookup user const user = await User.findOne(q, { @@ -80,30 +138,32 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => userId: user._id } as any; - if (sinceId) { + if (ps.sinceId) { sort._id = 1; query._id = { - $gt: sinceId + $gt: ps.sinceId }; - } else if (untilId) { + } else if (ps.untilId) { query._id = { - $lt: untilId + $lt: ps.untilId }; - } else if (sinceDate) { + } else if (ps.sinceDate) { sort._id = 1; query.createdAt = { - $gt: new Date(sinceDate) + $gt: new Date(ps.sinceDate) }; - } else if (untilDate) { + } else if (ps.untilDate) { query.createdAt = { - $lt: new Date(untilDate) + $lt: new Date(ps.untilDate) }; } - if (!includeReplies) { + if (!ps.includeReplies) { query.replyId = null; } + const withFiles = ps.withFiles != null ? ps.withFiles : ps.mediaOnly; + if (withFiles) { query.fileIds = { $exists: true, @@ -115,12 +175,10 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => // Issue query const notes = await Note .find(query, { - limit: limit, + limit: ps.limit, sort: sort }); // Serialize - res(await Promise.all(notes.map(async (note) => - await pack(note, me) - ))); + res(await Promise.all(notes.map(note => pack(note, me)))); }); From 395cfa61089efc4ab3ea1b6c6842521bad31efed Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Thu, 6 Sep 2018 02:16:08 +0900 Subject: [PATCH 115/539] Resolve #2625 (#2627) --- src/client/app/desktop/views/pages/deck/deck.column.vue | 3 ++- src/games/reversi/core.ts | 6 ++++-- src/prelude/array.ts | 7 +++++++ src/server/activitypub/outbox.ts | 3 ++- src/server/api/endpoints/notes/global-timeline.ts | 3 ++- src/server/api/endpoints/notes/hybrid-timeline.ts | 3 ++- src/server/api/endpoints/notes/local-timeline.ts | 3 ++- src/server/api/endpoints/notes/timeline.ts | 3 ++- src/server/api/endpoints/users/notes.ts | 3 ++- 9 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 src/prelude/array.ts diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 239b1b0447..abb09775fb 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -28,6 +28,7 @@ import Vue from 'vue'; import Menu from '../../../../common/views/components/menu.vue'; import contextmenu from '../../../api/contextmenu'; +import { countIf } from '../../../../../../prelude/array'; export default Vue.extend({ props: { @@ -117,7 +118,7 @@ export default Vue.extend({ toggleActive() { if (!this.isStacked) return; const vms = this.$store.state.settings.deck.layout.find(ids => ids.indexOf(this.column.id) != -1).map(id => this.getColumnVm(id)); - if (this.active && vms.filter(vm => vm.$el.classList.contains('active')).length == 1) return; + if (this.active && countIf(vm => vm.$el.classList.contains('active'), vms) == 1) return; this.active = !this.active; }, diff --git a/src/games/reversi/core.ts b/src/games/reversi/core.ts index b610d46884..34eb03becb 100644 --- a/src/games/reversi/core.ts +++ b/src/games/reversi/core.ts @@ -1,3 +1,5 @@ +import { count } from "../../prelude/array"; + // MISSKEY REVERSI ENGINE /** @@ -101,14 +103,14 @@ export default class Reversi { * 黒石の数 */ public get blackCount() { - return this.board.filter(x => x === BLACK).length; + return count(BLACK, this.board); } /** * 白石の数 */ public get whiteCount() { - return this.board.filter(x => x === WHITE).length; + return count(BLACK, this.board); } /** diff --git a/src/prelude/array.ts b/src/prelude/array.ts new file mode 100644 index 0000000000..e944030a7f --- /dev/null +++ b/src/prelude/array.ts @@ -0,0 +1,7 @@ +export function countIf<T>(f: (x: T) => boolean, xs: T[]): number { + return xs.filter(f).length; +} + +export function count<T>(x: T, xs: T[]): number { + return countIf(y => x === y, xs); +} diff --git a/src/server/activitypub/outbox.ts b/src/server/activitypub/outbox.ts index cc7e55b5df..a5e762eea8 100644 --- a/src/server/activitypub/outbox.ts +++ b/src/server/activitypub/outbox.ts @@ -10,6 +10,7 @@ import { setResponseType } from '../activitypub'; import Note from '../../models/note'; import renderNote from '../../remote/activitypub/renderer/note'; +import { countIf } from '../../prelude/array'; export default async (ctx: Router.IRouterContext) => { const userId = new mongo.ObjectID(ctx.params.user); @@ -25,7 +26,7 @@ export default async (ctx: Router.IRouterContext) => { const page: boolean = ctx.request.query.page === 'true'; // Validate parameters - if (sinceIdErr || untilIdErr || pageErr || [sinceId, untilId].filter(x => x != null).length > 1) { + if (sinceIdErr || untilIdErr || pageErr || countIf(x => x != null, [sinceId, untilId]) > 1) { ctx.status = 400; return; } diff --git a/src/server/api/endpoints/notes/global-timeline.ts b/src/server/api/endpoints/notes/global-timeline.ts index e70fc5d76f..5d93cd78ec 100644 --- a/src/server/api/endpoints/notes/global-timeline.ts +++ b/src/server/api/endpoints/notes/global-timeline.ts @@ -4,6 +4,7 @@ import Mute from '../../../../models/mute'; import { pack } from '../../../../models/note'; import { ILocalUser } from '../../../../models/user'; import getParams from '../../get-params'; +import { countIf } from '../../../../prelude/array'; export const meta = { desc: { @@ -42,7 +43,7 @@ export default async (params: any, user: ILocalUser) => { if (psErr) throw psErr; // Check if only one of sinceId, untilId, sinceDate, untilDate specified - if ([ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate].filter(x => x != null).length > 1) { + if (countIf(x => x != null, [ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate]) > 1) { throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified'; } diff --git a/src/server/api/endpoints/notes/hybrid-timeline.ts b/src/server/api/endpoints/notes/hybrid-timeline.ts index 16cec86797..0eb7b61830 100644 --- a/src/server/api/endpoints/notes/hybrid-timeline.ts +++ b/src/server/api/endpoints/notes/hybrid-timeline.ts @@ -5,6 +5,7 @@ import { getFriends } from '../../common/get-friends'; import { pack } from '../../../../models/note'; import { ILocalUser } from '../../../../models/user'; import getParams from '../../get-params'; +import { countIf } from '../../../../prelude/array'; export const meta = { desc: { @@ -86,7 +87,7 @@ export default async (params: any, user: ILocalUser) => { if (psErr) throw psErr; // Check if only one of sinceId, untilId, sinceDate, untilDate specified - if ([ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate].filter(x => x != null).length > 1) { + if (countIf(x => x != null, [ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate]) > 1) { throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified'; } diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts index 2458a70556..39c385853d 100644 --- a/src/server/api/endpoints/notes/local-timeline.ts +++ b/src/server/api/endpoints/notes/local-timeline.ts @@ -4,6 +4,7 @@ import Mute from '../../../../models/mute'; import { pack } from '../../../../models/note'; import { ILocalUser } from '../../../../models/user'; import getParams from '../../get-params'; +import { countIf } from '../../../../prelude/array'; export const meta = { desc: { @@ -42,7 +43,7 @@ export default async (params: any, user: ILocalUser) => { if (psErr) throw psErr; // Check if only one of sinceId, untilId, sinceDate, untilDate specified - if ([ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate].filter(x => x != null).length > 1) { + if (countIf(x => x != null, [ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate]) > 1) { throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified'; } diff --git a/src/server/api/endpoints/notes/timeline.ts b/src/server/api/endpoints/notes/timeline.ts index 089e7a182a..5f3844987c 100644 --- a/src/server/api/endpoints/notes/timeline.ts +++ b/src/server/api/endpoints/notes/timeline.ts @@ -5,6 +5,7 @@ import { getFriends } from '../../common/get-friends'; import { pack } from '../../../../models/note'; import { ILocalUser } from '../../../../models/user'; import getParams from '../../get-params'; +import { countIf } from '../../../../prelude/array'; export const meta = { desc: { @@ -86,7 +87,7 @@ export default async (params: any, user: ILocalUser) => { if (psErr) throw psErr; // Check if only one of sinceId, untilId, sinceDate, untilDate specified - if ([ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate].filter(x => x != null).length > 1) { + if (countIf(x => x != null, [ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate]) > 1) { throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified'; } diff --git a/src/server/api/endpoints/users/notes.ts b/src/server/api/endpoints/users/notes.ts index 42c31189d6..1ab7786a18 100644 --- a/src/server/api/endpoints/users/notes.ts +++ b/src/server/api/endpoints/users/notes.ts @@ -3,6 +3,7 @@ import getHostLower from '../../common/get-host-lower'; import Note, { pack } from '../../../../models/note'; import User, { ILocalUser } from '../../../../models/user'; import getParams from '../../get-params'; +import { countIf } from '../../../../prelude/array'; export const meta = { desc: { @@ -110,7 +111,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => } // Check if only one of sinceId, untilId, sinceDate, untilDate specified - if ([ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate].filter(x => x != null).length > 1) { + if (countIf(x => x != null, [ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate]) > 1) { throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified'; } From ade7e628368fb1443056adf98ac65a768c6ba0d9 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Thu, 6 Sep 2018 02:24:39 +0900 Subject: [PATCH 116/539] Add README.md for prelude (#2628) --- src/prelude/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/prelude/README.md diff --git a/src/prelude/README.md b/src/prelude/README.md new file mode 100644 index 0000000000..bb728cfb1b --- /dev/null +++ b/src/prelude/README.md @@ -0,0 +1,3 @@ +# Prelude +このディレクトリのコードはJavaScriptの表現能力を補うためのコードです。 +Misskey固有の処理とは独立したコードの集まりですが、Misskeyのコードを読みやすくすることを目的としています。 From e8948452fdc18f8a85af34bc4687e304cd39c987 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Thu, 6 Sep 2018 02:28:04 +0900 Subject: [PATCH 117/539] Resolve #2629 (#2630) --- src/mfm/html.ts | 5 +---- src/prelude/array.ts | 4 ++++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/mfm/html.ts b/src/mfm/html.ts index 2e38fe10a0..b7fa5b6f03 100644 --- a/src/mfm/html.ts +++ b/src/mfm/html.ts @@ -4,10 +4,7 @@ const { JSDOM } = jsdom; import config from '../config'; import { INote } from '../models/note'; import { TextElement } from './parse'; - -function intersperse<T>(sep: T, xs: T[]): T[] { - return [].concat(...xs.map(x => [sep, x])).slice(1); -} +import { intersperse } from '../prelude/array'; const handlers: { [key: string]: (window: any, token: any, mentionedRemoteUsers: INote['mentionedRemoteUsers']) => void } = { bold({ document }, { bold }) { diff --git a/src/prelude/array.ts b/src/prelude/array.ts index e944030a7f..aee17640ed 100644 --- a/src/prelude/array.ts +++ b/src/prelude/array.ts @@ -5,3 +5,7 @@ export function countIf<T>(f: (x: T) => boolean, xs: T[]): number { export function count<T>(x: T, xs: T[]): number { return countIf(y => x === y, xs); } + +export function intersperse<T>(sep: T, xs: T[]): T[] { + return [].concat(...xs.map(x => [sep, x])).slice(1); +} From 1cc183ecdbc1d9e54d2d04634ea30b2dc071bc53 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Thu, 6 Sep 2018 02:44:01 +0900 Subject: [PATCH 118/539] Resolve #2631 (#2632) --- src/client/app/common/scripts/gcd.ts | 2 -- src/client/app/mobile/views/components/drive.file-detail.vue | 2 +- src/prelude/math.ts | 3 +++ 3 files changed, 4 insertions(+), 3 deletions(-) delete mode 100644 src/client/app/common/scripts/gcd.ts create mode 100644 src/prelude/math.ts diff --git a/src/client/app/common/scripts/gcd.ts b/src/client/app/common/scripts/gcd.ts deleted file mode 100644 index 9a19f9da66..0000000000 --- a/src/client/app/common/scripts/gcd.ts +++ /dev/null @@ -1,2 +0,0 @@ -const gcd = (a, b) => !b ? a : gcd(b, a % b); -export default gcd; diff --git a/src/client/app/mobile/views/components/drive.file-detail.vue b/src/client/app/mobile/views/components/drive.file-detail.vue index 43867211e9..8108892597 100644 --- a/src/client/app/mobile/views/components/drive.file-detail.vue +++ b/src/client/app/mobile/views/components/drive.file-detail.vue @@ -67,7 +67,7 @@ import Vue from 'vue'; import * as EXIF from 'exif-js'; import * as hljs from 'highlight.js'; -import gcd from '../../../common/scripts/gcd'; +import { gcd } from '../../../../../prelude/math'; export default Vue.extend({ props: ['file'], diff --git a/src/prelude/math.ts b/src/prelude/math.ts new file mode 100644 index 0000000000..07b94bec30 --- /dev/null +++ b/src/prelude/math.ts @@ -0,0 +1,3 @@ +export function gcd(a: number, b: number): number { + return b === 0 ? a : gcd(b, a % b); +} From 498094b3c7d4fb80bf01fd2668c8244411a8a9fa Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Thu, 6 Sep 2018 03:02:52 +0900 Subject: [PATCH 119/539] Refactor reversi engine (#2633) * Refactor reversi engine * Add puttablePlaces --- src/games/reversi/core.ts | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/games/reversi/core.ts b/src/games/reversi/core.ts index 34eb03becb..9199efa092 100644 --- a/src/games/reversi/core.ts +++ b/src/games/reversi/core.ts @@ -1,4 +1,4 @@ -import { count } from "../../prelude/array"; +import { count, countIf } from "../../prelude/array"; // MISSKEY REVERSI ENGINE @@ -90,8 +90,8 @@ export default class Reversi { //#endregion // ゲームが始まった時点で片方の色の石しかないか、始まった時点で勝敗が決定するようなマップの場合がある - if (this.canPutSomewhere(BLACK).length == 0) { - if (this.canPutSomewhere(WHITE).length == 0) { + if (!this.canPutSomewhere(BLACK)) { + if (!this.canPutSomewhere(WHITE)) { this.turn = null; } else { this.turn = WHITE; @@ -172,9 +172,9 @@ export default class Reversi { private calcTurn() { // ターン計算 - if (this.canPutSomewhere(!this.prevColor).length > 0) { + if (this.canPutSomewhere(!this.prevColor)) { this.turn = !this.prevColor; - } else if (this.canPutSomewhere(this.prevColor).length > 0) { + } else if (this.canPutSomewhere(this.prevColor)) { this.turn = this.prevColor; } else { this.turn = null; @@ -206,10 +206,17 @@ export default class Reversi { /** * 打つことができる場所を取得します */ - public canPutSomewhere(color: Color): number[] { + public puttablePlaces(color: Color): number[] { return Array.from(this.board.keys()).filter(i => this.canPut(color, i)); } + /** + * 打つことができる場所があるかどうかを取得します + */ + public canPutSomewhere(color: Color): boolean { + return this.puttablePlaces(color).length > 0; + } + /** * 指定のマスに石を打つことができるかどうかを取得します * @param color 自分の色 From ebd1c877ada8c9081c3a42f7168f5e25b91427b1 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Thu, 6 Sep 2018 03:21:11 +0900 Subject: [PATCH 120/539] Show host in local user detail (#2634) --- src/client/app/common/views/components/acct.vue | 10 ++++++++-- .../app/desktop/views/pages/user/user.header.vue | 2 +- src/client/app/mobile/views/pages/user.vue | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/client/app/common/views/components/acct.vue b/src/client/app/common/views/components/acct.vue index 1ad222afdd..2b5efe609c 100644 --- a/src/client/app/common/views/components/acct.vue +++ b/src/client/app/common/views/components/acct.vue @@ -1,14 +1,20 @@ <template> <span class="mk-acct"> <span class="name">@{{ user.username }}</span> - <span class="host" v-if="user.host">@{{ user.host }}</span> + <span class="host" v-if="user.host || detail">@{{ user.host || host }}</span> </span> </template> <script lang="ts"> import Vue from 'vue'; +import { host } from '../../../config'; export default Vue.extend({ - props: ['user'] + props: ['user', 'detail'], + data() { + return { + host + }; + } }); </script> diff --git a/src/client/app/desktop/views/pages/user/user.header.vue b/src/client/app/desktop/views/pages/user/user.header.vue index d8f4656ed0..4b434ec219 100644 --- a/src/client/app/desktop/views/pages/user/user.header.vue +++ b/src/client/app/desktop/views/pages/user/user.header.vue @@ -6,7 +6,7 @@ <div class="title"> <p class="name">{{ user | userName }}</p> <div> - <span class="username"><mk-acct :user="user"/></span> + <span class="username"><mk-acct :user="user" :detail="true" /></span> <span v-if="user.isBot" title="%i18n:@is-bot%">%fa:robot%</span> <span class="location" v-if="user.host === null && user.profile.location">%fa:map-marker% {{ user.profile.location }}</span> <span class="birthday" v-if="user.host === null && user.profile.birthday">%fa:birthday-cake% {{ user.profile.birthday.replace('-', '年').replace('-', '月') + '日' }} ({{ age }}歳)</span> diff --git a/src/client/app/mobile/views/pages/user.vue b/src/client/app/mobile/views/pages/user.vue index ddea43c9f2..c1082f31a9 100644 --- a/src/client/app/mobile/views/pages/user.vue +++ b/src/client/app/mobile/views/pages/user.vue @@ -16,7 +16,7 @@ </div> <div class="title"> <h1>{{ user | userName }}</h1> - <span class="username"><mk-acct :user="user"/></span> + <span class="username"><mk-acct :user="user" :detail="true" /></span> <span class="followed" v-if="user.isFollowed">%i18n:@follows-you%</span> </div> <div class="description"> From e2c6227f4713b91d94355c69d619ac2d5d865c1b Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 6 Sep 2018 04:28:22 +0900 Subject: [PATCH 121/539] Improve local timeline API --- src/server/api/endpoints/notes/local-timeline.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts index 2458a70556..ce84b4135a 100644 --- a/src/server/api/endpoints/notes/local-timeline.ts +++ b/src/server/api/endpoints/notes/local-timeline.ts @@ -23,6 +23,12 @@ export const meta = { } }), + fileType: $.arr($.str).optional.note({ + desc: { + 'ja-JP': '指定された種類のファイルが添付された投稿のみを取得します' + } + }), + limit: $.num.optional.range(1, 100).note({ default: 10 }), @@ -84,6 +90,14 @@ export default async (params: any, user: ILocalUser) => { query.fileIds = { $exists: true, $ne: [] }; } + if (ps.fileType) { + query.fileIds = { $exists: true, $ne: [] }; + + query['_files.contentType'] = { + $in: ps.fileType + }; + } + if (ps.sinceId) { sort._id = 1; query._id = { From 451acb77df54d9d27177f0e3a618939d1a034310 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 6 Sep 2018 04:28:39 +0900 Subject: [PATCH 122/539] Improve welcome page --- locales/ja-JP.yml | 2 ++ .../app/desktop/views/pages/welcome.vue | 33 +++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 1b73c825bb..eaf940ed06 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -990,6 +990,8 @@ desktop/views/pages/welcome.vue: signin-button: "やってる" signup-button: "やる" timeline: "タイムライン" + announcements: "お知らせ" + photos: "最近の画像" powered-by-misskey: "Powered by <b>Misskey</b>." desktop/views/pages/drive.vue: diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index ba22cb598f..f21070f36f 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -44,8 +44,7 @@ <div class="photos block"> <header>%fa:images% %i18n:@photos%</header> <div> - <div v-for="photo in photos"> - </div> + <div v-for="photo in photos" :style="`background-image: url(${photo.thumbnailUrl})`"></div> </div> </div> @@ -99,6 +98,7 @@ export default Vue.extend({ photos: [] }; }, + created() { (this as any).os.getMeta().then(meta => { this.name = meta.name; @@ -110,14 +110,30 @@ export default Vue.extend({ this.stats = stats; }); + const image = [ + 'image/jpeg', + 'image/png', + 'image/gif' + ]; + + (this as any).api('notes/local-timeline', { + fileType: image, + limit: 6 + }).then(notes => { + const files = [].concat(...notes.map(n => n.files)); + this.photos = files.filter(f => image.includes(f.type)).slice(0, 6); + }); }, + methods: { signup() { this.$modal.show('signup'); }, + signin() { this.$modal.show('signin'); }, + dark() { this.$store.commit('device/set', { key: 'darkmode', @@ -280,6 +296,19 @@ root(isDark) grid-row 2 grid-column 2 + > div + display grid + grid-template-rows 1fr 1fr 1fr + grid-template-columns 1fr 1fr + gap 8px + height 100% + padding 16px + + > div + //border-radius 4px + background-position center center + background-size cover + > .nav display flex justify-content center From b4f86feddb213bf61a55dff6174a53a1561e8ffd Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 6 Sep 2018 04:38:07 +0900 Subject: [PATCH 123/539] :art: --- src/client/app/desktop/views/pages/welcome.vue | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index f21070f36f..f6473a4fc6 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -225,10 +225,14 @@ root(isDark) overflow auto > header + z-index 1 padding 0 16px line-height 48px background isDark ? #313543 : #fff + if !isDark + box-shadow 0 1px 0px rgba(0, 0, 0, 0.1) + & + div max-height calc(100% - 48px) From 91e0fc8c620a8b355151db481ccd59a6733f979b Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 6 Sep 2018 04:52:42 +0900 Subject: [PATCH 124/539] Improve welcome page --- .../app/desktop/views/pages/welcome.vue | 10 +-- src/client/app/mobile/views/pages/welcome.vue | 65 ++++++++++++++++++- 2 files changed, 67 insertions(+), 8 deletions(-) diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index f6473a4fc6..4cfae0c71e 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -34,9 +34,9 @@ <div class="announcements block"> <header>%fa:broadcast-tower% %i18n:@announcements%</header> <div> - <div v-for="broadcast in broadcasts"> - <h1 v-html="broadcast.title"></h1> - <div v-html="broadcast.text"></div> + <div v-for="announcement in announcements"> + <h1 v-html="announcement.title"></h1> + <div v-html="announcement.text"></div> </div> </div> </div> @@ -94,7 +94,7 @@ export default Vue.extend({ host, name: 'Misskey', description: '', - broadcasts: [], + announcements: [], photos: [] }; }, @@ -103,7 +103,7 @@ export default Vue.extend({ (this as any).os.getMeta().then(meta => { this.name = meta.name; this.description = meta.description; - this.broadcasts = meta.broadcasts; + this.announcements = meta.broadcasts; }); (this as any).api('stats').then(stats => { diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue index 49227790ff..1856731d8a 100644 --- a/src/client/app/mobile/views/pages/welcome.vue +++ b/src/client/app/mobile/views/pages/welcome.vue @@ -1,5 +1,5 @@ <template> -<div class="welcome"> +<div class="wgwfgvvimdjvhjfwxropcwksnzftjqes"> <div> <img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"> <p class="host">{{ host }}</p> @@ -17,10 +17,19 @@ <div class="hashtags"> <router-link v-for="tag in tags" :key="tag" :to="`/tags/${ tag }`" :title="tag">#{{ tag }}</router-link> </div> + <div class="photos"> + <div v-for="photo in photos" :style="`background-image: url(${photo.thumbnailUrl})`"></div> + </div> <div class="stats" v-if="stats"> <span>%fa:user% {{ stats.originalUsersCount | number }}</span> <span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span> </div> + <div class="announcements" v-if="announcements && announcements.length > 0"> + <article v-for="announcement in announcements"> + <span class="title" v-html="announcement.title"></span> + <div v-html="announcement.text"></div> + </article> + </div> <footer> <small>{{ copyright }}</small> </footer> @@ -41,13 +50,16 @@ export default Vue.extend({ host, name: 'Misskey', description: '', - tags: [] + tags: [], + photos: [], + announcements: [] }; }, created() { (this as any).os.getMeta().then(meta => { this.name = meta.name; this.description = meta.description; + this.announcements = meta.broadcasts; }); (this as any).api('stats').then(stats => { @@ -57,12 +69,26 @@ export default Vue.extend({ (this as any).api('hashtags/trend').then(stats => { this.tags = stats.map(x => x.tag); }); + + const image = [ + 'image/jpeg', + 'image/png', + 'image/gif' + ]; + + (this as any).api('notes/local-timeline', { + fileType: image, + limit: 6 + }).then(notes => { + const files = [].concat(...notes.map(n => n.files)); + this.photos = files.filter(f => image.includes(f.type)).slice(0, 6); + }); } }); </script> <style lang="stylus" scoped> -.welcome +root(isDark) text-align center //background #fff @@ -145,6 +171,19 @@ export default Vue.extend({ > * margin 0 16px + > .photos + display grid + grid-template-rows 1fr 1fr 1fr + grid-template-columns 1fr 1fr + gap 8px + height 300px + margin-top 16px + + > div + border-radius 4px + background-position center center + background-size cover + > .stats margin 16px 0 padding 8px @@ -156,6 +195,20 @@ export default Vue.extend({ > * margin 0 8px + > .announcements + margin 16px 0 + + > article + background isDark ? rgba(30, 129, 216, 0.2) : rgba(155, 196, 232, 0.2) + border-radius 6px + color isDark ? #fff : #3f4967 + padding 16px + margin 8px 0 + font-size 12px + + > .title + font-weight bold + > footer text-align center color #444 @@ -165,4 +218,10 @@ export default Vue.extend({ margin 16px 0 0 0 opacity 0.7 +.wgwfgvvimdjvhjfwxropcwksnzftjqes[data-darkmode] + root(true) + +.wgwfgvvimdjvhjfwxropcwksnzftjqes:not([data-darkmode]) + root(false) + </style> From 2448bf4e4e8433695f9a8611a8ea2c98d51f7f2f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 6 Sep 2018 04:57:21 +0900 Subject: [PATCH 125/539] 8.27.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 775c997e55..60c6a09787 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "9.0.0", - "clientVersion": "1.0.9358", + "version": "8.27.0", + "clientVersion": "1.0.9378", "codename": "nighthike", "main": "./built/index.js", "private": true, From 8e359d54bdd05f6718d8dab28ae19e1d1f657f89 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Thu, 6 Sep 2018 06:06:22 +0900 Subject: [PATCH 126/539] if elimination (#2635) --- src/server/api/call.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/server/api/call.ts b/src/server/api/call.ts index e9abc11f54..ee79e0a13c 100644 --- a/src/server/api/call.ts +++ b/src/server/api/call.ts @@ -25,10 +25,8 @@ export default (endpoint: string, user: IUser, app: IApp, data: any, file?: any) return rej('YOU_ARE_NOT_ADMIN'); } - if (app && ep.meta.kind) { - if (!app.permission.some(p => p === ep.meta.kind)) { - return rej('PERMISSION_DENIED'); - } + if (app && ep.meta.kind && !app.permission.some(p => p === ep.meta.kind)) { + return rej('PERMISSION_DENIED'); } if (ep.meta.requireCredential && ep.meta.limit) { From 4a00c13b33fa647e4833317f2b2251b740968924 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 6 Sep 2018 16:03:00 +0900 Subject: [PATCH 127/539] :art: --- src/client/app/desktop/views/pages/welcome.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 4cfae0c71e..0138fde273 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -213,7 +213,7 @@ root(isDark) width 100% max-width 1200px height 100vh - min-height 1000px + min-height 950px margin 0 auto padding 64px From 40735ce76bbe727eb9c87475d71e19506e5aad0d Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Thu, 6 Sep 2018 19:28:52 +0900 Subject: [PATCH 128/539] Fix bug (#2638) --- src/games/reversi/core.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/games/reversi/core.ts b/src/games/reversi/core.ts index 9199efa092..481b5b0f75 100644 --- a/src/games/reversi/core.ts +++ b/src/games/reversi/core.ts @@ -110,7 +110,7 @@ export default class Reversi { * 白石の数 */ public get whiteCount() { - return count(BLACK, this.board); + return count(WHITE, this.board); } /** From a1b026239e8d38ae1c25bdeb59086551bbac0397 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Thu, 6 Sep 2018 19:55:20 +0900 Subject: [PATCH 129/539] fix(package): update @types/ws to version 6.0.1 (#2636) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 60c6a09787..3aa41cd504 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "@types/webpack": "4.4.11", "@types/webpack-stream": "3.2.10", "@types/websocket": "0.0.40", - "@types/ws": "6.0.0", + "@types/ws": "6.0.1", "animejs": "2.2.0", "autosize": "4.0.2", "autwh": "0.1.0", From 5dd2feba9bf12598eb240e3ece1844124392917d Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Thu, 6 Sep 2018 19:55:29 +0900 Subject: [PATCH 130/539] fix(package): update @types/minio to version 7.0.0 (#2626) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3aa41cd504..811a60814a 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "@types/koa-send": "4.1.1", "@types/koa-views": "2.0.3", "@types/koa__cors": "2.2.3", - "@types/minio": "6.0.2", + "@types/minio": "7.0.0", "@types/mkdirp": "0.5.2", "@types/mocha": "5.2.3", "@types/mongodb": "3.1.4", From f428372869461cf350c0e0cd21c41312a3e0f56f Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Thu, 6 Sep 2018 20:06:16 +0900 Subject: [PATCH 131/539] Refactor effects function (#2639) --- src/games/reversi/core.ts | 90 +++++++++++++-------------------------- tslint.json | 1 + 2 files changed, 30 insertions(+), 61 deletions(-) diff --git a/src/games/reversi/core.ts b/src/games/reversi/core.ts index 481b5b0f75..e2a2289f18 100644 --- a/src/games/reversi/core.ts +++ b/src/games/reversi/core.ts @@ -238,87 +238,55 @@ export default class Reversi { /** * 指定のマスに石を置いた時の、反転させられる石を取得します * @param color 自分の色 - * @param pos 位置 + * @param initPos 位置 */ - public effects(color: Color, pos: number): number[] { + public effects(color: Color, initPos: number): number[] { const enemyColor = !color; - // ひっくり返せる石(の位置)リスト - let stones: number[] = []; + const diffVectors: [number, number][] = [ + [ 0, -1], // 上 + [ +1, -1], // 右上 + [ +1, 0], // 右 + [ +1, +1], // 右下 + [ 0, +1], // 下 + [ -1, +1], // 左下 + [ -1, 0], // 左 + [ -1, -1] // 左上 + ]; - const initPos = pos; - - // 走査 - const iterate = (fn: (i: number) => number[]) => { - let i = 1; - const found = []; + const effectsInLine = ([dx, dy]: [number, number]): number[] => { + const nextPos = (x: number, y: number): [number, number] => [x + dx, y + dy]; + const found: number[] = []; // 挟めるかもしれない相手の石を入れておく配列 + let [x, y] = this.transformPosToXy(initPos); while (true) { - let [x, y] = fn(i); - // 座標が指し示す位置がボード外に出たとき if (this.opts.loopedBoard) { - if (x < 0 ) x = this.mapWidth - ((-x) % this.mapWidth); - if (y < 0 ) y = this.mapHeight - ((-y) % this.mapHeight); - if (x >= this.mapWidth ) x = x % this.mapWidth; - if (y >= this.mapHeight) y = y % this.mapHeight; + x = ((x % this.mapWidth) + this.mapWidth) % this.mapWidth; + y = ((y % this.mapHeight) + this.mapHeight) % this.mapHeight; - // for debug - //if (x < 0 || y < 0 || x >= this.mapWidth || y >= this.mapHeight) { - // console.log(x, y); - //} - - // 一周して自分に帰ってきたら if (this.transformXyToPos(x, y) == initPos) { - // ↓のコメントアウトを外すと、「現時点で自分の石が隣接していないが、 - // そこに置いたとするとループして最終的に挟んだことになる」というケースを有効化します。(Test4のマップで違いが分かります) - // このケースを有効にした方が良いのか無効にした方が良いのか判断がつかなかったためとりあえず無効としておきます - // (あと無効な方がゲームとしておもしろそうだった) - stones = stones.concat(found); - break; + // 盤面の境界でループし、自分が石を置く位置に戻ってきたとき、挟めるようにしている (ref: Test4のマップ) + return found; } } else { - if (x == -1 || y == -1 || x == this.mapWidth || y == this.mapHeight) break; + if (x == -1 || y == -1 || x == this.mapWidth || y == this.mapHeight) { + return []; // 挟めないことが確定 (盤面外に到達) + } } const pos = this.transformXyToPos(x, y); - - //#region 「配置不能」マスに当たった場合走査終了 - const pixel = this.mapDataGet(pos); - if (pixel == 'null') break; - //#endregion - - // 石取得 + if (this.mapDataGet(pos) === 'null') return []; // 挟めないことが確定 (配置不可能なマスに到達) const stone = this.board[pos]; + if (stone === null) return []; // 挟めないことが確定 (石が置かれていないマスに到達) + if (stone === enemyColor) found.push(pos); // 挟めるかもしれない (相手の石を発見) + if (stone === color) return found; // 挟めることが確定 (対となる自分の石を発見) - // 石が置かれていないマスなら走査終了 - if (stone === null) break; - - // 相手の石なら「ひっくり返せるかもリスト」に入れておく - if (stone === enemyColor) found.push(pos); - - // 自分の石なら「ひっくり返せるかもリスト」を「ひっくり返せるリスト」に入れ、走査終了 - if (stone === color) { - stones = stones.concat(found); - break; - } - - i++; + [x, y] = nextPos(x, y); } }; - const [x, y] = this.transformPosToXy(pos); - - iterate(i => [x , y - i]); // 上 - iterate(i => [x + i, y - i]); // 右上 - iterate(i => [x + i, y ]); // 右 - iterate(i => [x + i, y + i]); // 右下 - iterate(i => [x , y + i]); // 下 - iterate(i => [x - i, y + i]); // 左下 - iterate(i => [x - i, y ]); // 左 - iterate(i => [x - i, y - i]); // 左上 - - return stones; + return [].concat(...diffVectors.map(effectsInLine)); } /** diff --git a/tslint.json b/tslint.json index ae0df46b96..1adc0a2aed 100644 --- a/tslint.json +++ b/tslint.json @@ -17,6 +17,7 @@ "no-empty":false, "ordered-imports": [false], "arrow-parens": false, + "array-type": false, "object-literal-shorthand": false, "object-literal-key-quotes": false, "triple-equals": [false], From 3cace734c70c752c57ed9a0057aef4d7ef788528 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Thu, 6 Sep 2018 21:31:15 +0900 Subject: [PATCH 132/539] Add concat function (#2640) --- src/client/app/desktop/views/pages/welcome.vue | 5 +++-- src/client/app/mobile/views/pages/welcome.vue | 5 +++-- src/games/reversi/core.ts | 4 ++-- src/prelude/array.ts | 8 ++++++-- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 0138fde273..7409f6c9b6 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -85,6 +85,7 @@ <script lang="ts"> import Vue from 'vue'; import { host, copyright } from '../../../config'; +import { concat } from '../../../../../prelude/array'; export default Vue.extend({ data() { @@ -119,8 +120,8 @@ export default Vue.extend({ (this as any).api('notes/local-timeline', { fileType: image, limit: 6 - }).then(notes => { - const files = [].concat(...notes.map(n => n.files)); + }).then((notes: any[]) => { + const files = concat(notes.map((n: any): any[] => n.files)); this.photos = files.filter(f => image.includes(f.type)).slice(0, 6); }); }, diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue index 1856731d8a..7446cc700f 100644 --- a/src/client/app/mobile/views/pages/welcome.vue +++ b/src/client/app/mobile/views/pages/welcome.vue @@ -40,6 +40,7 @@ <script lang="ts"> import Vue from 'vue'; import { apiUrl, copyright, host } from '../../../config'; +import { concat } from '../../../../../prelude/array'; export default Vue.extend({ data() { @@ -79,8 +80,8 @@ export default Vue.extend({ (this as any).api('notes/local-timeline', { fileType: image, limit: 6 - }).then(notes => { - const files = [].concat(...notes.map(n => n.files)); + }).then((notes: any[]) => { + const files = concat(notes.map((n: any): any[] => n.files)); this.photos = files.filter(f => image.includes(f.type)).slice(0, 6); }); } diff --git a/src/games/reversi/core.ts b/src/games/reversi/core.ts index e2a2289f18..3ca9d052af 100644 --- a/src/games/reversi/core.ts +++ b/src/games/reversi/core.ts @@ -1,4 +1,4 @@ -import { count, countIf } from "../../prelude/array"; +import { count, concat } from "../../prelude/array"; // MISSKEY REVERSI ENGINE @@ -286,7 +286,7 @@ export default class Reversi { } }; - return [].concat(...diffVectors.map(effectsInLine)); + return concat(diffVectors.map(effectsInLine)); } /** diff --git a/src/prelude/array.ts b/src/prelude/array.ts index aee17640ed..9a3c266d6d 100644 --- a/src/prelude/array.ts +++ b/src/prelude/array.ts @@ -6,6 +6,10 @@ export function count<T>(x: T, xs: T[]): number { return countIf(y => x === y, xs); } -export function intersperse<T>(sep: T, xs: T[]): T[] { - return [].concat(...xs.map(x => [sep, x])).slice(1); +export function concat<T>(xss: T[][]): T[] { + return ([] as T[]).concat(...xss); +} + +export function intersperse<T>(sep: T, xs: T[]): T[] { + return concat(xs.map(x => [sep, x])).slice(1); } From 00d79487cd89f3cae675ecc0392c47ba547b69a5 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Fri, 7 Sep 2018 00:02:55 +0900 Subject: [PATCH 133/539] Add erase function (#2641) --- .../app/common/scripts/streaming/stream-manager.ts | 3 ++- src/client/app/common/views/components/poll-editor.vue | 3 ++- src/client/app/desktop/views/components/post-form.vue | 3 ++- src/client/app/mios.ts | 3 ++- src/client/app/mobile/views/components/post-form.vue | 3 ++- src/client/app/store.ts | 7 ++++--- src/client/app/sw.js | 4 ++-- src/prelude/array.ts | 4 ++++ src/server/api/endpoints/hashtags/trend.ts | 4 ++-- src/server/api/endpoints/notes/search_by_tag.ts | 9 +++++---- src/services/note/create.ts | 7 ++++--- 11 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/client/app/common/scripts/streaming/stream-manager.ts b/src/client/app/common/scripts/streaming/stream-manager.ts index 568b8b0372..8dd06f67d3 100644 --- a/src/client/app/common/scripts/streaming/stream-manager.ts +++ b/src/client/app/common/scripts/streaming/stream-manager.ts @@ -1,6 +1,7 @@ import { EventEmitter } from 'eventemitter3'; import * as uuid from 'uuid'; import Connection from './stream'; +import { erase } from '../../../../../prelude/array'; /** * ストリーム接続を管理するクラス @@ -89,7 +90,7 @@ export default abstract class StreamManager<T extends Connection> extends EventE * @param userId use で発行したユーザーID */ public dispose(userId) { - this.users = this.users.filter(id => id != userId); + this.users = erase(userId, this.users); this._connection.user = `Managed (${ this.users.length })`; diff --git a/src/client/app/common/views/components/poll-editor.vue b/src/client/app/common/views/components/poll-editor.vue index 115c934c8b..30d9799fec 100644 --- a/src/client/app/common/views/components/poll-editor.vue +++ b/src/client/app/common/views/components/poll-editor.vue @@ -20,6 +20,7 @@ <script lang="ts"> import Vue from 'vue'; +import { erase } from '../../../../../prelude/array'; export default Vue.extend({ data() { return { @@ -53,7 +54,7 @@ export default Vue.extend({ get() { return { - choices: this.choices.filter(choice => choice != '') + choices: erase('', this.choices) } }, diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index f6f52c8f1f..65dc9eb9c2 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -62,6 +62,7 @@ import getFace from '../../../common/scripts/get-face'; import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue'; import parse from '../../../../../mfm/parse'; import { host } from '../../../config'; +import { erase } from '../../../../../prelude/array'; export default Vue.extend({ components: { @@ -346,7 +347,7 @@ export default Vue.extend({ }, removeVisibleUser(user) { - this.visibleUsers = this.visibleUsers.filter(u => u != user); + this.visibleUsers = erase(user, this.visibleUsers); }, post() { diff --git a/src/client/app/mios.ts b/src/client/app/mios.ts index c2ec7f1750..0f72cd2f34 100644 --- a/src/client/app/mios.ts +++ b/src/client/app/mios.ts @@ -17,6 +17,7 @@ import Err from './common/views/components/connect-failed.vue'; import { LocalTimelineStreamManager } from './common/scripts/streaming/local-timeline'; import { HybridTimelineStreamManager } from './common/scripts/streaming/hybrid-timeline'; import { GlobalTimelineStreamManager } from './common/scripts/streaming/global-timeline'; +import { erase } from '../../prelude/array'; //#region api requests let spinner = null; @@ -537,7 +538,7 @@ export default class MiOS extends EventEmitter { } public unregisterStreamConnection(connection: Connection) { - this.connections = this.connections.filter(c => c != connection); + this.connections = erase(connection, this.connections); } } diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 644e27cce8..8107c1f3a7 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -59,6 +59,7 @@ import MkVisibilityChooser from '../../../common/views/components/visibility-cho import getFace from '../../../common/scripts/get-face'; import parse from '../../../../../mfm/parse'; import { host } from '../../../config'; +import { erase } from '../../../../../prelude/array'; export default Vue.extend({ components: { @@ -262,7 +263,7 @@ export default Vue.extend({ }, removeVisibleUser(user) { - this.visibleUsers = this.visibleUsers.filter(u => u != user); + this.visibleUsers = erase(user, this.visibleUsers); }, clear() { diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 53f3eefc08..08dd9f9920 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -4,6 +4,7 @@ import * as nestedProperty from 'nested-property'; import MiOS from './mios'; import { hostname } from './config'; +import { erase } from '../../prelude/array'; const defaultSettings = { home: null, @@ -195,7 +196,7 @@ export default (os: MiOS) => new Vuex.Store({ removeDeckColumn(state, id) { state.deck.columns = state.deck.columns.filter(c => c.id != id); - state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id)); + state.deck.layout = state.deck.layout.map(ids => erase(id, ids)); state.deck.layout = state.deck.layout.filter(ids => ids.length > 0); }, @@ -266,7 +267,7 @@ export default (os: MiOS) => new Vuex.Store({ stackLeftDeckColumn(state, id) { const i = state.deck.layout.findIndex(ids => ids.indexOf(id) != -1); - state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id)); + state.deck.layout = state.deck.layout.map(ids => erase(id, ids)); const left = state.deck.layout[i - 1]; if (left) state.deck.layout[i - 1].push(id); state.deck.layout = state.deck.layout.filter(ids => ids.length > 0); @@ -274,7 +275,7 @@ export default (os: MiOS) => new Vuex.Store({ popRightDeckColumn(state, id) { const i = state.deck.layout.findIndex(ids => ids.indexOf(id) != -1); - state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id)); + state.deck.layout = state.deck.layout.map(ids => erase(id, ids)); state.deck.layout.splice(i + 1, 0, [id]); state.deck.layout = state.deck.layout.filter(ids => ids.length > 0); }, diff --git a/src/client/app/sw.js b/src/client/app/sw.js index ac7ea20acf..d381bfb7a5 100644 --- a/src/client/app/sw.js +++ b/src/client/app/sw.js @@ -3,6 +3,7 @@ */ import composeNotification from './common/scripts/compose-notification'; +import { erase } from '../../prelude/array'; // キャッシュするリソース const cachee = [ @@ -24,8 +25,7 @@ self.addEventListener('activate', ev => { // Clean up old caches ev.waitUntil( caches.keys().then(keys => Promise.all( - keys - .filter(key => key != _VERSION_) + erase(_VERSION_, keys) .map(key => caches.delete(key)) )) ); diff --git a/src/prelude/array.ts b/src/prelude/array.ts index 9a3c266d6d..a2a6bbd4c6 100644 --- a/src/prelude/array.ts +++ b/src/prelude/array.ts @@ -13,3 +13,7 @@ export function concat<T>(xss: T[][]): T[] { export function intersperse<T>(sep: T, xs: T[]): T[] { return concat(xs.map(x => [sep, x])).slice(1); } + +export function erase<T>(x: T, xs: T[]): T[] { + return xs.filter(y => x !== y); +} diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts index 01dfccc71c..e7c08ca9f0 100644 --- a/src/server/api/endpoints/hashtags/trend.ts +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -1,4 +1,5 @@ import Note from '../../../../models/note'; +import { erase } from '../../../../prelude/array'; /* トレンドに載るためには「『直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上』のハッシュタグの上位5位以内に入る」ことが必要 @@ -85,8 +86,7 @@ export default () => new Promise(async (res, rej) => { //#endregion // タグを人気順に並べ替え - let hots = (await Promise.all(hotsPromises)) - .filter(x => x != null) + let hots = erase(null, await Promise.all(hotsPromises)) .sort((a, b) => b.count - a.count) .map(tag => tag.name) .slice(0, max); diff --git a/src/server/api/endpoints/notes/search_by_tag.ts b/src/server/api/endpoints/notes/search_by_tag.ts index 82f11a9775..77082c2600 100644 --- a/src/server/api/endpoints/notes/search_by_tag.ts +++ b/src/server/api/endpoints/notes/search_by_tag.ts @@ -5,6 +5,7 @@ import Mute from '../../../../models/mute'; import { getFriendIds } from '../../common/get-friends'; import { pack } from '../../../../models/note'; import getParams from '../../get-params'; +import { erase } from '../../../../prelude/array'; export const meta = { desc: { @@ -103,23 +104,23 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => if (psErr) throw psErr; if (ps.includeUserUsernames != null) { - const ids = (await Promise.all(ps.includeUserUsernames.map(async (username) => { + const ids = erase(null, await Promise.all(ps.includeUserUsernames.map(async (username) => { const _user = await User.findOne({ usernameLower: username.toLowerCase() }); return _user ? _user._id : null; - }))).filter(id => id != null); + }))); ids.forEach(id => ps.includeUserIds.push(id)); } if (ps.excludeUserUsernames != null) { - const ids = (await Promise.all(ps.excludeUserUsernames.map(async (username) => { + const ids = erase(null, await Promise.all(ps.excludeUserUsernames.map(async (username) => { const _user = await User.findOne({ usernameLower: username.toLowerCase() }); return _user ? _user._id : null; - }))).filter(id => id != null); + }))); ids.forEach(id => ps.excludeUserIds.push(id)); } diff --git a/src/services/note/create.ts b/src/services/note/create.ts index 11e3755863..4759497c63 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -24,6 +24,7 @@ import isQuote from '../../misc/is-quote'; import { TextElementMention } from '../../mfm/parse/elements/mention'; import { TextElementHashtag } from '../../mfm/parse/elements/hashtag'; import { updateNoteStats } from '../update-chart'; +import { erase } from '../../prelude/array'; type NotificationType = 'reply' | 'renote' | 'quote' | 'mention'; @@ -103,7 +104,7 @@ export default async (user: IUser, data: Option, silent = false) => new Promise< if (data.viaMobile == null) data.viaMobile = false; if (data.visibleUsers) { - data.visibleUsers = data.visibleUsers.filter(x => x != null); + data.visibleUsers = erase(null, data.visibleUsers); } if (data.reply && data.reply.deletedAt != null) { @@ -547,13 +548,13 @@ async function extractMentionedUsers(tokens: ReturnType<typeof parse>): Promise< )]; const mentionedUsers = [...new Set( - (await Promise.all(mentionTokens.map(async m => { + erase(null, await Promise.all(mentionTokens.map(async m => { try { return await resolveUser(m.username, m.host); } catch (e) { return null; } - }))).filter(x => x != null) + }))) )]; return mentionedUsers; From e34b264af2e859d9615d6d5308b7fe1bb1b00be8 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Fri, 7 Sep 2018 00:03:44 +0900 Subject: [PATCH 134/539] Fix bug (#2643) --- src/games/reversi/core.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/games/reversi/core.ts b/src/games/reversi/core.ts index 3ca9d052af..e724917fbf 100644 --- a/src/games/reversi/core.ts +++ b/src/games/reversi/core.ts @@ -260,6 +260,8 @@ export default class Reversi { const found: number[] = []; // 挟めるかもしれない相手の石を入れておく配列 let [x, y] = this.transformPosToXy(initPos); while (true) { + [x, y] = nextPos(x, y); + // 座標が指し示す位置がボード外に出たとき if (this.opts.loopedBoard) { x = ((x % this.mapWidth) + this.mapWidth) % this.mapWidth; @@ -281,8 +283,6 @@ export default class Reversi { if (stone === null) return []; // 挟めないことが確定 (石が置かれていないマスに到達) if (stone === enemyColor) found.push(pos); // 挟めるかもしれない (相手の石を発見) if (stone === color) return found; // 挟めることが確定 (対となる自分の石を発見) - - [x, y] = nextPos(x, y); } }; From ff0a05a2d67f45ec9ff06d50c5be821d559c2528 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Fri, 7 Sep 2018 00:10:03 +0900 Subject: [PATCH 135/539] Add unique function (#2644) --- src/prelude/array.ts | 4 ++++ src/services/note/create.ts | 12 ++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/prelude/array.ts b/src/prelude/array.ts index a2a6bbd4c6..abef6ca039 100644 --- a/src/prelude/array.ts +++ b/src/prelude/array.ts @@ -17,3 +17,7 @@ export function intersperse<T>(sep: T, xs: T[]): T[] { export function erase<T>(x: T, xs: T[]): T[] { return xs.filter(y => x !== y); } + +export function unique<T>(xs: T[]): T[] { + return [...new Set(xs)]; +} diff --git a/src/services/note/create.ts b/src/services/note/create.ts index 4759497c63..c08836c94b 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -24,7 +24,7 @@ import isQuote from '../../misc/is-quote'; import { TextElementMention } from '../../mfm/parse/elements/mention'; import { TextElementHashtag } from '../../mfm/parse/elements/hashtag'; import { updateNoteStats } from '../update-chart'; -import { erase } from '../../prelude/array'; +import { erase, unique } from '../../prelude/array'; type NotificationType = 'reply' | 'renote' | 'quote' | 'mention'; @@ -385,7 +385,7 @@ function extractHashtags(tokens: ReturnType<typeof parse>): string[] { .map(t => (t as TextElementHashtag).hashtag) .filter(tag => tag.length <= 100); - return [...new Set(hashtags)]; + return unique(hashtags); } function index(note: INote) { @@ -542,12 +542,12 @@ function incNotesCount(user: IUser) { async function extractMentionedUsers(tokens: ReturnType<typeof parse>): Promise<IUser[]> { if (tokens == null) return []; - const mentionTokens = [...new Set( + const mentionTokens = unique( tokens .filter(t => t.type == 'mention') as TextElementMention[] - )]; + ); - const mentionedUsers = [...new Set( + const mentionedUsers = unique( erase(null, await Promise.all(mentionTokens.map(async m => { try { return await resolveUser(m.username, m.host); @@ -555,7 +555,7 @@ async function extractMentionedUsers(tokens: ReturnType<typeof parse>): Promise< return null; } }))) - )]; + ); return mentionedUsers; } From 5cd6a0db165247d1c3349c7bda166d0c2bc0e994 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Fri, 7 Sep 2018 00:44:57 +0900 Subject: [PATCH 136/539] Fix typo: serive -> service (#2647) --- src/client/app/boot.js | 2 +- src/client/app/common/scripts/check-for-update.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/app/boot.js b/src/client/app/boot.js index dd2cf93a89..f14cebe7d5 100644 --- a/src/client/app/boot.js +++ b/src/client/app/boot.js @@ -140,7 +140,7 @@ // Random localStorage.setItem('salt', Math.random().toString()); - // Clear cache (serive worker) + // Clear cache (service worker) try { navigator.serviceWorker.controller.postMessage('clear'); diff --git a/src/client/app/common/scripts/check-for-update.ts b/src/client/app/common/scripts/check-for-update.ts index 4445eefc39..91b165b45d 100644 --- a/src/client/app/common/scripts/check-for-update.ts +++ b/src/client/app/common/scripts/check-for-update.ts @@ -9,7 +9,7 @@ export default async function(mios: MiOS, force = false, silent = false) { localStorage.setItem('should-refresh', 'true'); localStorage.setItem('v', newer); - // Clear cache (serive worker) + // Clear cache (service worker) try { if (navigator.serviceWorker.controller) { navigator.serviceWorker.controller.postMessage('clear'); From 10232c5866bdb79dd2d6cbc91d2b8f3827af3ad4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 00:52:13 +0900 Subject: [PATCH 137/539] Fix bug & some refactor --- .../app/common/views/widgets/broadcast.vue | 16 ++++++++-------- src/client/app/desktop/views/pages/welcome.vue | 2 +- .../app/mobile/views/components/ui.nav.vue | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/client/app/common/views/widgets/broadcast.vue b/src/client/app/common/views/widgets/broadcast.vue index e4e77263e5..c0f97e97c1 100644 --- a/src/client/app/common/views/widgets/broadcast.vue +++ b/src/client/app/common/views/widgets/broadcast.vue @@ -1,6 +1,6 @@ <template> <div class="anltbovirfeutcigvwgmgxipejaeozxi" - :data-found="broadcasts.length != 0" + :data-found="announcements && announcements.length != 0" :data-melt="props.design == 1" :data-mobile="platform == 'mobile'" > @@ -14,12 +14,12 @@ </svg> </div> <p class="fetching" v-if="fetching">%i18n:@fetching%<mk-ellipsis/></p> - <h1 v-if="!fetching">{{ broadcasts.length == 0 ? '%i18n:@no-broadcasts%' : broadcasts[i].title }}</h1> + <h1 v-if="!fetching">{{ announcements.length == 0 ? '%i18n:@no-broadcasts%' : announcements[i].title }}</h1> <p v-if="!fetching"> - <span v-if="broadcasts.length != 0" v-html="broadcasts[i].text"></span> - <template v-if="broadcasts.length == 0">%i18n:@have-a-nice-day%</template> + <span v-if="announcements.length != 0" v-html="announcements[i].text"></span> + <template v-if="announcements.length == 0">%i18n:@have-a-nice-day%</template> </p> - <a v-if="broadcasts.length > 1" @click="next">%i18n:@next% >></a> + <a v-if="announcements.length > 1" @click="next">%i18n:@next% >></a> </div> </template> @@ -36,18 +36,18 @@ export default define({ return { i: 0, fetching: true, - broadcasts: [] + announcements: [] }; }, mounted() { (this as any).os.getMeta().then(meta => { - this.broadcasts = meta.broadcasts; + this.announcements = meta.broadcasts; this.fetching = false; }); }, methods: { next() { - if (this.i == this.broadcasts.length - 1) { + if (this.i == this.announcements.length - 1) { this.i = 0; } else { this.i++; diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 0138fde273..d55029fb50 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -33,7 +33,7 @@ <div class="announcements block"> <header>%fa:broadcast-tower% %i18n:@announcements%</header> - <div> + <div v-if="announcements && announcements.length > 0"> <div v-for="announcement in announcements"> <h1 v-html="announcement.title"></h1> <div v-html="announcement.text"></div> diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue index 83a8eb4392..c3ae05fef6 100644 --- a/src/client/app/mobile/views/components/ui.nav.vue +++ b/src/client/app/mobile/views/components/ui.nav.vue @@ -34,7 +34,7 @@ <li @click="dark"><p><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template><span>%i18n:@darkmode%</span></p></li> </ul> </div> - <div class="announcements" v-if="announcements.length > 0"> + <div class="announcements" v-if="announcements && announcements.length > 0"> <article v-for="announcement in announcements"> <span v-html="announcement.title" class="title"></span> <div v-html="announcement.text"></div> From 98954cd6d4c0ef25f704bd3df761361f48740ca5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 01:02:31 +0900 Subject: [PATCH 138/539] Trim image --- src/client/assets/pointer.png | Bin 237627 -> 280910 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/client/assets/pointer.png b/src/client/assets/pointer.png index 0d03f75d2b91c9d874d656628a97d76c9fb6bd5e..c9aaada5a39a8a02340a7d14e7df465de26df5db 100644 GIT binary patch literal 280910 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�z@rj8z)(n1m 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 literal 237627 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∈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⁣D2Cl+-bH!7)~V{{q7@m+UbA9Qd?^ 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 From bf7e19b288c8ffda07e9adc300234b4bfc8c8b15 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 01:18:47 +0900 Subject: [PATCH 139/539] :art: --- src/client/app/desktop/views/pages/welcome.vue | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 1bcb0ecb20..5100a8efc7 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -28,6 +28,8 @@ <span class="divider">|</span> <span class="signin" @click="signin">%i18n:@signin%</span> </p> + + <img src="/assets/pointer.png" alt="" class="char"> </div> </div> @@ -247,6 +249,7 @@ root(isDark) > div padding 32px + min-height 100% > h1 margin 0 @@ -281,6 +284,17 @@ root(isDark) &:hover color $theme-color + > .char + display block + position absolute + right 0 + bottom 0 + width 180px + opacity 0.3 + + > *:not(.char) + z-index 1 + > .announcements grid-row 2 grid-column 1 From d92e9759f39b53ba35dd907b311d529f047e07e9 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Fri, 7 Sep 2018 01:20:23 +0900 Subject: [PATCH 140/539] Refactor analog clock widget (#2648) --- src/client/app/common/views/widgets/analog-clock.vue | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/client/app/common/views/widgets/analog-clock.vue b/src/client/app/common/views/widgets/analog-clock.vue index 0de30228b3..04223f0d21 100644 --- a/src/client/app/common/views/widgets/analog-clock.vue +++ b/src/client/app/common/views/widgets/analog-clock.vue @@ -1,8 +1,8 @@ <template> <div class="mkw-analog-clock"> - <mk-widget-container :naked="!(props.design % 2)" :show-header="false"> + <mk-widget-container :naked="props.style % 2 === 0" :show-header="false"> <div class="mkw-analog-clock--body"> - <mk-analog-clock :dark="$store.state.device.darkmode" :smooth="!(props.design && ~props.design)"/> + <mk-analog-clock :dark="$store.state.device.darkmode" :smooth="props.style < 2"/> </div> </mk-widget-container> </div> @@ -13,13 +13,12 @@ import define from '../../../common/define-widget'; export default define({ name: 'analog-clock', props: () => ({ - design: -1 + style: 0 }) }).extend({ methods: { func() { - if (++this.props.design > 2) - this.props.design = -1; + this.props.style = (this.props.style + 1) % 4; this.save(); } } From 769960f29e53e225761e3e119c6cc90137db9979 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Fri, 7 Sep 2018 02:26:31 +0900 Subject: [PATCH 141/539] Encode fetch URI if needed (#2649) --- src/services/drive/upload-from-url.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/drive/upload-from-url.ts b/src/services/drive/upload-from-url.ts index 0cf21ea5a2..35d4ec9883 100644 --- a/src/services/drive/upload-from-url.ts +++ b/src/services/drive/upload-from-url.ts @@ -34,8 +34,9 @@ export default async (url: string, user: IUser, folderId: mongodb.ObjectID = nul // write content at URL to temp file await new Promise((res, rej) => { const writable = fs.createWriteStream(path); + const requestUrl = URL.parse(url).pathname.match(/[^\u0021-\u00ff]/) ? encodeURI(url) : url; request({ - url, + url: requestUrl, headers: { 'User-Agent': config.user_agent } From c6ff6939a5e9b443085cef7498af226915dfbb7f Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Fri, 7 Sep 2018 03:22:55 +0900 Subject: [PATCH 142/539] Add capitalize function (#2651) --- src/mfm/parse/core/syntax-highlighter.ts | 4 +++- src/prelude/string.ts | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 src/prelude/string.ts diff --git a/src/mfm/parse/core/syntax-highlighter.ts b/src/mfm/parse/core/syntax-highlighter.ts index 2b13608d2b..c5157ca1d3 100644 --- a/src/mfm/parse/core/syntax-highlighter.ts +++ b/src/mfm/parse/core/syntax-highlighter.ts @@ -1,3 +1,5 @@ +import { capitalize } from "../../../prelude/string"; + function escape(text: string) { return text .replace(/>/g, '>') @@ -89,7 +91,7 @@ const _keywords = [ ]; const keywords = _keywords - .concat(_keywords.map(k => k[0].toUpperCase() + k.substr(1))) + .concat(_keywords.map(capitalize)) .concat(_keywords.map(k => k.toUpperCase())) .sort((a, b) => b.length - a.length); diff --git a/src/prelude/string.ts b/src/prelude/string.ts new file mode 100644 index 0000000000..2b89304f16 --- /dev/null +++ b/src/prelude/string.ts @@ -0,0 +1,3 @@ +export function capitalize(s: string): string { + return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase(); +} From 7959196dc7d8c6f40c16a020492aae11e6136e44 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Fri, 7 Sep 2018 04:21:04 +0900 Subject: [PATCH 143/539] Add sum function (#2653) --- src/client/app/common/views/components/poll.vue | 3 ++- src/client/app/desktop/views/components/note-detail.vue | 5 ++--- src/client/app/desktop/views/components/notes.note.vue | 5 ++--- src/client/app/mobile/views/components/note-detail.vue | 5 ++--- src/client/app/mobile/views/components/note.vue | 5 ++--- src/prelude/array.ts | 4 ++++ 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/client/app/common/views/components/poll.vue b/src/client/app/common/views/components/poll.vue index 660247edbc..4fe51d219b 100644 --- a/src/client/app/common/views/components/poll.vue +++ b/src/client/app/common/views/components/poll.vue @@ -21,6 +21,7 @@ <script lang="ts"> import Vue from 'vue'; +import { sum } from '../../../../../prelude/array'; export default Vue.extend({ props: ['note'], data() { @@ -33,7 +34,7 @@ export default Vue.extend({ return this.note.poll; }, total(): number { - return this.poll.choices.reduce((a, b) => a + b.votes, 0); + return sum(this.poll.choices.map(x => x.votes)); }, isVoted(): boolean { return this.poll.choices.some(c => c.isVoted); diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index a61a004a85..1e068bd1cd 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -86,6 +86,7 @@ import MkRenoteFormWindow from './renote-form-window.vue'; import MkNoteMenu from '../../../common/views/components/note-menu.vue'; import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; import XSub from './notes.note.sub.vue'; +import { sum } from '../../../../../prelude/array'; export default Vue.extend({ components: { @@ -122,9 +123,7 @@ export default Vue.extend({ }, reactionsCount(): number { return this.p.reactionCounts - ? Object.keys(this.p.reactionCounts) - .map(key => this.p.reactionCounts[key]) - .reduce((a, b) => a + b) + ? sum(Object.values(this.p.reactionCounts)) : 0; }, title(): string { diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 1d6b2048ba..75d6ebd628 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -78,6 +78,7 @@ import MkRenoteFormWindow from './renote-form-window.vue'; import MkNoteMenu from '../../../common/views/components/note-menu.vue'; import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; import XSub from './notes.note.sub.vue'; +import { sum } from '../../../../../prelude/array'; function focus(el, fn) { const target = fn(el); @@ -120,9 +121,7 @@ export default Vue.extend({ reactionsCount(): number { return this.p.reactionCounts - ? Object.keys(this.p.reactionCounts) - .map(key => this.p.reactionCounts[key]) - .reduce((a, b) => a + b) + ? sum(Object.values(this.p.reactionCounts)) : 0; }, diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index 10ff3fcc09..d48d9a7790 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -85,6 +85,7 @@ import parse from '../../../../../mfm/parse'; import MkNoteMenu from '../../../common/views/components/note-menu.vue'; import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; import XSub from './note.sub.vue'; +import { sum } from '../../../../../prelude/array'; export default Vue.extend({ components: { @@ -123,9 +124,7 @@ export default Vue.extend({ reactionsCount(): number { return this.p.reactionCounts - ? Object.keys(this.p.reactionCounts) - .map(key => this.p.reactionCounts[key]) - .reduce((a, b) => a + b) + ? sum(Object.values(this.p.reactionCounts)) : 0; }, diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 9bd4a83ecb..907e728984 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -70,6 +70,7 @@ import parse from '../../../../../mfm/parse'; import MkNoteMenu from '../../../common/views/components/note-menu.vue'; import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; import XSub from './note.sub.vue'; +import { sum } from '../../../../../prelude/array'; export default Vue.extend({ components: { @@ -100,9 +101,7 @@ export default Vue.extend({ reactionsCount(): number { return this.p.reactionCounts - ? Object.keys(this.p.reactionCounts) - .map(key => this.p.reactionCounts[key]) - .reduce((a, b) => a + b) + ? sum(Object.values(this.p.reactionCounts)) : 0; }, diff --git a/src/prelude/array.ts b/src/prelude/array.ts index abef6ca039..54f7081712 100644 --- a/src/prelude/array.ts +++ b/src/prelude/array.ts @@ -21,3 +21,7 @@ export function erase<T>(x: T, xs: T[]): T[] { export function unique<T>(xs: T[]): T[] { return [...new Set(xs)]; } + +export function sum(xs: number[]): number { + return xs.reduce((a, b) => a + b, 0); +} From acc7797dff5051bb966049bbb22d9650d244d3e4 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 04:22:16 +0900 Subject: [PATCH 144/539] New Crowdin translations (#2615) * New translations ja-JP.yml (Catalan) * New translations ja-JP.yml (Chinese Simplified) * New translations ja-JP.yml (English) * New translations ja-JP.yml (French) * New translations ja-JP.yml (German) * New translations ja-JP.yml (Italian) * New translations ja-JP.yml (Korean) * New translations ja-JP.yml (Polish) * New translations ja-JP.yml (Portuguese) * New translations ja-JP.yml (Russian) * New translations ja-JP.yml (Spanish) * New translations ja-JP.yml (Japanese, Kansai) * New translations ja-JP.yml (Dutch) * New translations ja-JP.yml (Norwegian) * New translations ja-JP.yml (Catalan) * New translations ja-JP.yml (Chinese Simplified) * New translations ja-JP.yml (English) * New translations ja-JP.yml (French) * New translations ja-JP.yml (German) * New translations ja-JP.yml (Italian) * New translations ja-JP.yml (Korean) * New translations ja-JP.yml (Polish) * New translations ja-JP.yml (Portuguese) * New translations ja-JP.yml (Russian) * New translations ja-JP.yml (Spanish) * New translations ja-JP.yml (Japanese, Kansai) * New translations ja-JP.yml (Dutch) * New translations ja-JP.yml (Norwegian) * New translations ja-JP.yml (English) --- locales/ca-ES.yml | 5 +++++ locales/de-DE.yml | 5 +++++ locales/en-US.yml | 5 +++++ locales/es-ES.yml | 5 +++++ locales/fr-FR.yml | 5 +++++ locales/it-IT.yml | 5 +++++ locales/ja-KS.yml | 5 +++++ locales/ko-KR.yml | 5 +++++ locales/nl-NL.yml | 5 +++++ locales/no-NO.yml | 5 +++++ locales/pl-PL.yml | 5 +++++ locales/pt-PT.yml | 5 +++++ locales/ru-RU.yml | 5 +++++ locales/zh-CN.yml | 5 +++++ 14 files changed, 70 insertions(+) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index a3d8b94fc5..8957c690d9 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -865,6 +865,8 @@ desktop/views/pages/welcome.vue: signin-button: "やってる" signup-button: "やる" timeline: "タイムライン" + announcements: "お知らせ" + photos: "最近の画像" powered-by-misskey: "Powered by <b>Misskey</b>." desktop/views/pages/drive.vue: title: "Misskey Drive" @@ -1161,6 +1163,9 @@ mobile/views/pages/settings.vue: post-style: "投稿の表示スタイル" post-style-standard: "標準" post-style-smart: "スマート" + notification-position: "通知の表示" + notification-position-bottom: "下" + notification-position-top: "上" behavior: "動作" fetch-on-scroll: "スクロールで自動読み込み" disable-via-mobile: "「モバイルからの投稿」フラグを付けない" diff --git a/locales/de-DE.yml b/locales/de-DE.yml index c66c735764..186d195f23 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -865,6 +865,8 @@ desktop/views/pages/welcome.vue: signin-button: "やってる" signup-button: "やる" timeline: "タイムライン" + announcements: "お知らせ" + photos: "最近の画像" powered-by-misskey: "Powered by <b>Misskey</b>." desktop/views/pages/drive.vue: title: "Misskey Drive" @@ -1161,6 +1163,9 @@ mobile/views/pages/settings.vue: post-style: "投稿の表示スタイル" post-style-standard: "標準" post-style-smart: "スマート" + notification-position: "通知の表示" + notification-position-bottom: "下" + notification-position-top: "上" behavior: "動作" fetch-on-scroll: "スクロールで自動読み込み" disable-via-mobile: "「モバイルからの投稿」フラグを付けない" diff --git a/locales/en-US.yml b/locales/en-US.yml index 6bab447039..7716c191d6 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -865,6 +865,8 @@ desktop/views/pages/welcome.vue: signin-button: "Logging in..." signup-button: "Sign up" timeline: "Timeline" + announcements: "Announcements" + photos: "Recent uploaded" powered-by-misskey: "Powered by <b>Misskey</b>." desktop/views/pages/drive.vue: title: "Misskey storage" @@ -1161,6 +1163,9 @@ mobile/views/pages/settings.vue: post-style: "Post design" post-style-standard: "Standard" post-style-smart: "Smart" + notification-position: "Notification style" + notification-position-bottom: "Bottom" + notification-position-top: "Top" behavior: "Behavior" fetch-on-scroll: "Endless loading on scroll" disable-via-mobile: "Don't mark the post as 'from mobile'" diff --git a/locales/es-ES.yml b/locales/es-ES.yml index f5fa938a7a..22a8360126 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -865,6 +865,8 @@ desktop/views/pages/welcome.vue: signin-button: "やってる" signup-button: "やる" timeline: "タイムライン" + announcements: "お知らせ" + photos: "最近の画像" powered-by-misskey: "Powered by <b>Misskey</b>." desktop/views/pages/drive.vue: title: "Misskey Drive" @@ -1161,6 +1163,9 @@ mobile/views/pages/settings.vue: post-style: "投稿の表示スタイル" post-style-standard: "標準" post-style-smart: "スマート" + notification-position: "通知の表示" + notification-position-bottom: "下" + notification-position-top: "上" behavior: "動作" fetch-on-scroll: "スクロールで自動読み込み" disable-via-mobile: "「モバイルからの投稿」フラグを付けない" diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 7ec48acead..b39db5a6de 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -865,6 +865,8 @@ desktop/views/pages/welcome.vue: signin-button: "Se connecter" signup-button: "S'inscrire" timeline: "Fil d'actualité" + announcements: "お知らせ" + photos: "最近の画像" powered-by-misskey: "Propulsé par <b>Misskey</b>." desktop/views/pages/drive.vue: title: "Lecteur de Misskey" @@ -1161,6 +1163,9 @@ mobile/views/pages/settings.vue: post-style: "Style de la publication" post-style-standard: "Standard" post-style-smart: "Intelligent" + notification-position: "通知の表示" + notification-position-bottom: "下" + notification-position-top: "上" behavior: "Comportement" fetch-on-scroll: "Chargement lors du défilement" disable-via-mobile: "Ne pas mentionner que ma publication provient d'un 'périphérique mobile'" diff --git a/locales/it-IT.yml b/locales/it-IT.yml index a3d8b94fc5..8957c690d9 100644 --- a/locales/it-IT.yml +++ b/locales/it-IT.yml @@ -865,6 +865,8 @@ desktop/views/pages/welcome.vue: signin-button: "やってる" signup-button: "やる" timeline: "タイムライン" + announcements: "お知らせ" + photos: "最近の画像" powered-by-misskey: "Powered by <b>Misskey</b>." desktop/views/pages/drive.vue: title: "Misskey Drive" @@ -1161,6 +1163,9 @@ mobile/views/pages/settings.vue: post-style: "投稿の表示スタイル" post-style-standard: "標準" post-style-smart: "スマート" + notification-position: "通知の表示" + notification-position-bottom: "下" + notification-position-top: "上" behavior: "動作" fetch-on-scroll: "スクロールで自動読み込み" disable-via-mobile: "「モバイルからの投稿」フラグを付けない" diff --git a/locales/ja-KS.yml b/locales/ja-KS.yml index df77ba62c6..09413b2917 100644 --- a/locales/ja-KS.yml +++ b/locales/ja-KS.yml @@ -865,6 +865,8 @@ desktop/views/pages/welcome.vue: signin-button: "サインイン中…" signup-button: "サインアップ" timeline: "タイムライン" + announcements: "お知らせ" + photos: "最近の画像" powered-by-misskey: "Powered by <b>Misskey</b>." desktop/views/pages/drive.vue: title: "ドライブ" @@ -1161,6 +1163,9 @@ mobile/views/pages/settings.vue: post-style: "投稿の表示スタイル" post-style-standard: "標準" post-style-smart: "べっぴんさん" + notification-position: "通知の表示" + notification-position-bottom: "下" + notification-position-top: "上" behavior: "動作" fetch-on-scroll: "スクロールで自動読み込み" disable-via-mobile: "「モバイルからの投稿」フラグを付けない" diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index 22acc8b689..9c22dcf50e 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -865,6 +865,8 @@ desktop/views/pages/welcome.vue: signin-button: "やってる" signup-button: "やる" timeline: "タイムライン" + announcements: "お知らせ" + photos: "最近の画像" powered-by-misskey: "Powered by <b>Misskey</b>." desktop/views/pages/drive.vue: title: "Misskey Drive" @@ -1161,6 +1163,9 @@ mobile/views/pages/settings.vue: post-style: "投稿の表示スタイル" post-style-standard: "標準" post-style-smart: "スマート" + notification-position: "通知の表示" + notification-position-bottom: "下" + notification-position-top: "上" behavior: "動作" fetch-on-scroll: "スクロールで自動読み込み" disable-via-mobile: "「モバイルからの投稿」フラグを付けない" diff --git a/locales/nl-NL.yml b/locales/nl-NL.yml index 7bdbdc781d..314e41f3a4 100644 --- a/locales/nl-NL.yml +++ b/locales/nl-NL.yml @@ -865,6 +865,8 @@ desktop/views/pages/welcome.vue: signin-button: "Inloggen" signup-button: "Registreren" timeline: "Tijdlijn" + announcements: "お知らせ" + photos: "最近の画像" powered-by-misskey: "Powered by <b>Misskey</b>." desktop/views/pages/drive.vue: title: "Misskey Drive" @@ -1161,6 +1163,9 @@ mobile/views/pages/settings.vue: post-style: "Berichtontwerp" post-style-standard: "Standaard" post-style-smart: "Slim" + notification-position: "通知の表示" + notification-position-bottom: "下" + notification-position-top: "上" behavior: "Gedrag" fetch-on-scroll: "Ophalen bij scrollen" disable-via-mobile: "Zonder 'mobiele berichten'" diff --git a/locales/no-NO.yml b/locales/no-NO.yml index 99899cac15..8ea964dcc9 100644 --- a/locales/no-NO.yml +++ b/locales/no-NO.yml @@ -865,6 +865,8 @@ desktop/views/pages/welcome.vue: signin-button: "やってる" signup-button: "やる" timeline: "タイムライン" + announcements: "お知らせ" + photos: "最近の画像" powered-by-misskey: "Powered by <b>Misskey</b>." desktop/views/pages/drive.vue: title: "Misskey Drive" @@ -1161,6 +1163,9 @@ mobile/views/pages/settings.vue: post-style: "投稿の表示スタイル" post-style-standard: "標準" post-style-smart: "スマート" + notification-position: "通知の表示" + notification-position-bottom: "下" + notification-position-top: "上" behavior: "動作" fetch-on-scroll: "スクロールで自動読み込み" disable-via-mobile: "「モバイルからの投稿」フラグを付けない" diff --git a/locales/pl-PL.yml b/locales/pl-PL.yml index d5050a8e6f..b72921d3f9 100644 --- a/locales/pl-PL.yml +++ b/locales/pl-PL.yml @@ -865,6 +865,8 @@ desktop/views/pages/welcome.vue: signin-button: "Zaloguj się" signup-button: "Zarejestruj się" timeline: "Oś czasu" + announcements: "お知らせ" + photos: "最近の画像" powered-by-misskey: "Oparto o <b>Misskey</b>." desktop/views/pages/drive.vue: title: "Dysk Misskey" @@ -1161,6 +1163,9 @@ mobile/views/pages/settings.vue: post-style: "Styl wpisów" post-style-standard: "Standardowy" post-style-smart: "Inteligentny" + notification-position: "通知の表示" + notification-position-bottom: "下" + notification-position-top: "上" behavior: "Zachowanie" fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół" disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”" diff --git a/locales/pt-PT.yml b/locales/pt-PT.yml index 3a764606a5..b1fe356656 100644 --- a/locales/pt-PT.yml +++ b/locales/pt-PT.yml @@ -865,6 +865,8 @@ desktop/views/pages/welcome.vue: signin-button: "やってる" signup-button: "やる" timeline: "Timeline" + announcements: "お知らせ" + photos: "最近の画像" powered-by-misskey: "Desenvolvido por <b>Misskey</b>." desktop/views/pages/drive.vue: title: "Drive Misskey" @@ -1161,6 +1163,9 @@ mobile/views/pages/settings.vue: post-style: "投稿の表示スタイル" post-style-standard: "標準" post-style-smart: "スマート" + notification-position: "通知の表示" + notification-position-bottom: "下" + notification-position-top: "上" behavior: "動作" fetch-on-scroll: "スクロールで自動読み込み" disable-via-mobile: "「モバイルからの投稿」フラグを付けない" diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml index 759767f27e..691eebf64c 100644 --- a/locales/ru-RU.yml +++ b/locales/ru-RU.yml @@ -865,6 +865,8 @@ desktop/views/pages/welcome.vue: signin-button: "やってる" signup-button: "やる" timeline: "タイムライン" + announcements: "お知らせ" + photos: "最近の画像" powered-by-misskey: "Powered by <b>Misskey</b>." desktop/views/pages/drive.vue: title: "Misskey Drive" @@ -1161,6 +1163,9 @@ mobile/views/pages/settings.vue: post-style: "投稿の表示スタイル" post-style-standard: "標準" post-style-smart: "スマート" + notification-position: "通知の表示" + notification-position-bottom: "下" + notification-position-top: "上" behavior: "動作" fetch-on-scroll: "スクロールで自動読み込み" disable-via-mobile: "「モバイルからの投稿」フラグを付けない" diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 3376690e52..a9afed5713 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -865,6 +865,8 @@ desktop/views/pages/welcome.vue: signin-button: "やってる" signup-button: "やる" timeline: "タイムライン" + announcements: "お知らせ" + photos: "最近の画像" powered-by-misskey: "Powered by <b>Misskey</b>." desktop/views/pages/drive.vue: title: "Misskey Drive" @@ -1161,6 +1163,9 @@ mobile/views/pages/settings.vue: post-style: "投稿の表示スタイル" post-style-standard: "標準" post-style-smart: "スマート" + notification-position: "通知の表示" + notification-position-bottom: "下" + notification-position-top: "上" behavior: "動作" fetch-on-scroll: "スクロールで自動読み込み" disable-via-mobile: "「モバイルからの投稿」フラグを付けない" From aa31061d90dee10bb11a2d734a5635a9b0fca879 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Fri, 7 Sep 2018 04:23:26 +0900 Subject: [PATCH 145/539] fix(package): update node-sass-json-importer to version 4.0.1 (#2645) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 811a60814a..71068479dc 100644 --- a/package.json +++ b/package.json @@ -161,7 +161,7 @@ "nan": "2.11.0", "nested-property": "0.0.7", "node-sass": "4.9.3", - "node-sass-json-importer": "4.0.0", + "node-sass-json-importer": "4.0.1", "nprogress": "0.2.0", "object-assign-deep": "0.4.0", "on-build-webpack": "0.1.0", From 6d9716f90eca1ed68b4875659b578abde926c84e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 04:24:08 +0900 Subject: [PATCH 146/539] 8.28.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 71068479dc..4b7431b50e 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.27.0", - "clientVersion": "1.0.9378", + "version": "8.28.0", + "clientVersion": "1.0.9400", "codename": "nighthike", "main": "./built/index.js", "private": true, From 0b5eec4ca805a7b006c151005115f5042dab0eae Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 05:32:09 +0900 Subject: [PATCH 147/539] Fix bug --- webpack.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webpack.config.ts b/webpack.config.ts index 341d4c7022..a50d6c40cc 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -196,7 +196,7 @@ module.exports = { }, { loader: 'sass-loader', options: { - importer: jsonImporter, + importer: jsonImporter(), } }] }, { From 95ce8dce3d874c0f1a23cad929569039052f214d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 05:32:18 +0900 Subject: [PATCH 148/539] 8.28.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4b7431b50e..5b7567e4cc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.28.0", + "version": "8.28.1", "clientVersion": "1.0.9400", "codename": "nighthike", "main": "./built/index.js", From fa04ac789eba82cef075867ebd0e8b9365c15046 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 05:37:15 +0900 Subject: [PATCH 149/539] :art: --- src/client/app/desktop/views/pages/welcome.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 5100a8efc7..f601bc9016 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -287,8 +287,8 @@ root(isDark) > .char display block position absolute - right 0 - bottom 0 + right 16px + bottom 16px width 180px opacity 0.3 From 2b50364ab4f94c1259fb5b5b2df74f5b2e654a90 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 05:45:13 +0900 Subject: [PATCH 150/539] =?UTF-8?q?=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC?= =?UTF-8?q?=E5=90=8D=E3=81=AB=E3=82=B3=E3=83=B3=E3=83=88=E3=83=A9=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=82=92=E4=BB=98=E3=81=91=E3=82=8B=E3=83=87=E3=82=B6?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=81=AE=E3=82=AA=E3=83=B3=E3=82=AA=E3=83=95?= =?UTF-8?q?=E3=82=92=E5=88=87=E3=82=8A=E6=9B=BF=E3=81=88=E3=82=89=E3=82=8C?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 2 ++ src/client/app/common/views/components/acct.vue | 4 ++-- src/client/app/desktop/views/components/settings.vue | 7 +++++++ src/client/app/mobile/views/pages/settings.vue | 8 ++++++++ src/client/app/store.ts | 1 + 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index eaf940ed06..668678e0c8 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -736,6 +736,7 @@ desktop/views/components/settings.vue: delete-wallpaper: "壁紙を削除" dark-mode: "ダークモード" circle-icons: "円形のアイコンを使用" + contrasted-acct: "ユーザー名にコントラストを付ける" gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" @@ -1349,6 +1350,7 @@ mobile/views/pages/settings.vue: dark-mode: "ダークモード" i-am-under-limited-internet: "私は通信を制限されている" circle-icons: "円形のアイコンを使用" + contrasted-acct: "ユーザー名にコントラストを付ける" timeline: "タイムライン" show-reply-target: "リプライ先を表示する" show-my-renotes: "自分の行ったRenoteを表示する" diff --git a/src/client/app/common/views/components/acct.vue b/src/client/app/common/views/components/acct.vue index 2b5efe609c..bd7833f1a9 100644 --- a/src/client/app/common/views/components/acct.vue +++ b/src/client/app/common/views/components/acct.vue @@ -1,7 +1,7 @@ <template> <span class="mk-acct"> <span class="name">@{{ user.username }}</span> - <span class="host" v-if="user.host || detail">@{{ user.host || host }}</span> + <span class="host" :class="{ fade: $store.state.settings.contrastedAcct }" v-if="user.host || detail">@{{ user.host || host }}</span> </span> </template> @@ -20,6 +20,6 @@ export default Vue.extend({ <style lang="stylus" scoped> .mk-acct - > .host + > .host.fade opacity 0.5 </style> diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index 7d6f1d55fb..7cab7ec983 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -44,6 +44,7 @@ <button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button> <mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/> <mk-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/> + <mk-switch v-model="$store.state.settings.contrastedAcct" @change="onContrastedAcct" text="%i18n:@contrasted-acct%"/> <mk-switch v-model="$store.state.settings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/> <mk-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi" text="%i18n:common.i-like-sushi%"/> </div> @@ -376,6 +377,12 @@ export default Vue.extend({ value: v }); }, + onChangeContrastedAcct(v) { + this.$store.dispatch('settings/set', { + key: 'contrastedAcct', + value: v + }); + }, onChangeILikeSushi(v) { this.$store.dispatch('settings/set', { key: 'iLikeSushi', diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index 4a148dc9d2..29fe067a08 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -13,6 +13,7 @@ <section> <ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch> <ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch> + <ui-switch v-model="$store.state.settings.contrastedAcct" @change="onChangeContrastedAcct">%i18n:@contrasted-acct%</ui-switch> <ui-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi">%i18n:common.i-like-sushi%</ui-switch> <ui-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch> <ui-switch v-model="$store.state.settings.games.reversi.showBoardLabels" @change="onChangeReversiBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch> @@ -218,6 +219,13 @@ export default Vue.extend({ }); }, + onChangeContrastedAcct(v) { + this.$store.dispatch('settings/set', { + key: 'contrastedAcct', + value: v + }); + }, + onChangeILikeSushi(v) { this.$store.dispatch('settings/set', { key: 'iLikeSushi', diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 08dd9f9920..16ce78ea9f 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -16,6 +16,7 @@ const defaultSettings = { suggestRecentHashtags: true, showClockOnHeader: true, circleIcons: true, + contrastedAcct: true, gradientWindowHeader: false, showReplyTarget: true, showMyRenotes: true, From 5cbcac713a70e619eb89e5dc7c9f9cfc8cc915e1 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 05:47:19 +0900 Subject: [PATCH 151/539] Fix --- locales/ja-JP.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 668678e0c8..0c4825e8c4 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1383,7 +1383,7 @@ mobile/views/pages/settings.vue: settings: "設定" signout: "サインアウト" sound: "サウンド" - enableSounds: "サウンドを有効にする" + enable-sounds: "サウンドを有効にする" mobile/views/pages/user.vue: follows-you: "フォローされています" From e955fe1ffd38dd2da91e548748da2577810840f1 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 05:47:47 +0900 Subject: [PATCH 152/539] 8.29.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5b7567e4cc..ab984eef5c 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.28.1", - "clientVersion": "1.0.9400", + "version": "8.29.0", + "clientVersion": "1.0.9406", "codename": "nighthike", "main": "./built/index.js", "private": true, From 106d4cc0d65edb01d3b71b3d91258550cd489825 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 06:04:00 +0900 Subject: [PATCH 153/539] :art: --- src/client/app/common/views/widgets/broadcast.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/common/views/widgets/broadcast.vue b/src/client/app/common/views/widgets/broadcast.vue index c0f97e97c1..f2fa720f52 100644 --- a/src/client/app/common/views/widgets/broadcast.vue +++ b/src/client/app/common/views/widgets/broadcast.vue @@ -126,7 +126,7 @@ root(isDark) margin 0 font-size 0.95em font-weight normal - color #4078c0 + color isDark ? #539eff : #4078c0 > p display block From 7343e6e2e8e94b2a58943c62c047b5a7c4116e3a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 19:20:50 +0900 Subject: [PATCH 154/539] =?UTF-8?q?=E7=B5=B1=E8=A8=88=E3=81=A7=E7=84=A1?= =?UTF-8?q?=E8=A6=96=E3=81=99=E3=82=8B=E3=83=8F=E3=83=83=E3=82=B7=E3=83=A5?= =?UTF-8?q?=E3=82=BF=E3=82=B0=E3=82=92=E8=A8=AD=E5=AE=9A=E3=81=A7=E3=81=8D?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/pages/admin/admin.hashtags.vue | 41 +++++++++++++++++++ .../app/desktop/views/pages/admin/admin.vue | 7 ++++ src/models/meta.ts | 7 ++-- src/server/api/endpoints/admin/update-meta.ts | 12 +++++- src/server/api/endpoints/hashtags/trend.ts | 7 ++++ src/server/api/endpoints/meta.ts | 6 ++- 6 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 src/client/app/desktop/views/pages/admin/admin.hashtags.vue diff --git a/src/client/app/desktop/views/pages/admin/admin.hashtags.vue b/src/client/app/desktop/views/pages/admin/admin.hashtags.vue new file mode 100644 index 0000000000..c6bf20361f --- /dev/null +++ b/src/client/app/desktop/views/pages/admin/admin.hashtags.vue @@ -0,0 +1,41 @@ +<template> +<div class="jdnqwkzlnxcfftthoybjxrebyolvoucw mk-admin-card"> + <header>%i18n:@hided-tags%</header> + <textarea v-model="hidedTags"></textarea> + <button class="ui" @click="save">%i18n:@save%</button> +</div> +</template> + +<script lang="ts"> +import Vue from "vue"; + +export default Vue.extend({ + data() { + return { + hidedTags: '', + }; + }, + created() { + (this as any).os.getMeta().then(meta => { + this.hidedTags = meta.hidedTags.join('\n'); + }); + }, + methods: { + save() { + (this as any).api('admin/update-meta', { + hidedTags: this.hidedTags.split('\n') + }); + } + } +}); +</script> + +<style lang="stylus" scoped> +@import '~const.styl' + +.jdnqwkzlnxcfftthoybjxrebyolvoucw + textarea + width 100% + min-height 300px + +</style> diff --git a/src/client/app/desktop/views/pages/admin/admin.vue b/src/client/app/desktop/views/pages/admin/admin.vue index a71059c378..510252b447 100644 --- a/src/client/app/desktop/views/pages/admin/admin.vue +++ b/src/client/app/desktop/views/pages/admin/admin.vue @@ -5,6 +5,8 @@ <li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }">%fa:chalkboard .fw%%i18n:@dashboard%</li> <li @click="nav('users')" :class="{ active: page == 'users' }">%fa:users .fw%%i18n:@users%</li> <li @click="nav('announcements')" :class="{ active: page == 'announcements' }">%fa:broadcast-tower .fw%%i18n:@announcements%</li> + <li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }">%fa:hashtag .fw%%i18n:@hashtags%</li> + <!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }">%fa:cloud .fw%%i18n:@drive%</li> --> <!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> --> </ul> @@ -17,6 +19,9 @@ <div v-show="page == 'announcements'"> <x-announcements/> </div> + <div v-show="page == 'hashtags'"> + <x-hashtags/> + </div> <div v-if="page == 'users'"> <x-suspend-user/> <x-unsuspend-user/> @@ -33,6 +38,7 @@ import Vue from "vue"; import XDashboard from "./admin.dashboard.vue"; import XAnnouncements from "./admin.announcements.vue"; +import XHashtags from "./admin.hashtags.vue"; import XSuspendUser from "./admin.suspend-user.vue"; import XUnsuspendUser from "./admin.unsuspend-user.vue"; import XVerifyUser from "./admin.verify-user.vue"; @@ -43,6 +49,7 @@ export default Vue.extend({ components: { XDashboard, XAnnouncements, + XHashtags, XSuspendUser, XUnsuspendUser, XVerifyUser, diff --git a/src/models/meta.ts b/src/models/meta.ts index aef0163dfe..4f1977f3b5 100644 --- a/src/models/meta.ts +++ b/src/models/meta.ts @@ -4,12 +4,13 @@ const Meta = db.get<IMeta>('meta'); export default Meta; export type IMeta = { - broadcasts: any[]; - stats: { + broadcasts?: any[]; + stats?: { notesCount: number; originalNotesCount: number; usersCount: number; originalUsersCount: number; }; - disableRegistration: boolean; + disableRegistration?: boolean; + hidedTags?: string[]; }; diff --git a/src/server/api/endpoints/admin/update-meta.ts b/src/server/api/endpoints/admin/update-meta.ts index 10ca15d329..f903628774 100644 --- a/src/server/api/endpoints/admin/update-meta.ts +++ b/src/server/api/endpoints/admin/update-meta.ts @@ -21,7 +21,13 @@ export const meta = { desc: { 'ja-JP': '招待制か否か' } - }) + }), + + hidedTags: $.arr($.str).optional.nullable.note({ + desc: { + 'ja-JP': '統計などで無視するハッシュタグ' + } + }), } }; @@ -39,6 +45,10 @@ export default (params: any) => new Promise(async (res, rej) => { set.disableRegistration = ps.disableRegistration; } + if (Array.isArray(ps.hidedTags)) { + set.hidedTags = ps.hidedTags; + } + await Meta.update({}, { $set: set }, { upsert: true }); diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts index e7c08ca9f0..bfa475619c 100644 --- a/src/server/api/endpoints/hashtags/trend.ts +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -1,5 +1,6 @@ import Note from '../../../../models/note'; import { erase } from '../../../../prelude/array'; +import Meta from '../../../../models/meta'; /* トレンドに載るためには「『直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上』のハッシュタグの上位5位以内に入る」ことが必要 @@ -17,6 +18,9 @@ const max = 5; * Get trends of hashtags */ export default () => new Promise(async (res, rej) => { + const meta = await Meta.findOne({}); + const hidedTags = (meta.hidedTags || []).map(t => t.toLowerCase()); + //#region 1. 直近Aの内に投稿されたハッシュタグ(とユーザーのペア)を集計 const data = await Note.aggregate([{ $match: { @@ -53,6 +57,9 @@ export default () => new Promise(async (res, rej) => { // カウント data.map(x => x._id).forEach(x => { + // ブラックリストに登録されているタグなら弾く + if (hidedTags.includes(x.tag)) return; + const i = tags.findIndex(tag => tag.name == x.tag); if (i != -1) { tags[i].count++; diff --git a/src/server/api/endpoints/meta.ts b/src/server/api/endpoints/meta.ts index b0876eaafd..4472d8d779 100644 --- a/src/server/api/endpoints/meta.ts +++ b/src/server/api/endpoints/meta.ts @@ -4,6 +4,7 @@ import * as os from 'os'; import config from '../../../config'; import Meta from '../../../models/meta'; +import { ILocalUser } from '../../../models/user'; const pkg = require('../../../../package.json'); const client = require('../../../../built/client/meta.json'); @@ -11,7 +12,7 @@ const client = require('../../../../built/client/meta.json'); /** * Show core info */ -export default () => new Promise(async (res, rej) => { +export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => { const meta: any = (await Meta.findOne()) || {}; res({ @@ -35,6 +36,7 @@ export default () => new Promise(async (res, rej) => { disableRegistration: meta.disableRegistration, driveCapacityPerLocalUserMb: config.localDriveCapacityMb, recaptchaSitekey: config.recaptcha ? config.recaptcha.site_key : null, - swPublickey: config.sw ? config.sw.public_key : null + swPublickey: config.sw ? config.sw.public_key : null, + hidedTags: (me && me.isAdmin) ? meta.hidedTags : undefined }); }); From d70e2a788e64b365b232086ce53a419672e088c9 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Fri, 7 Sep 2018 19:22:14 +0900 Subject: [PATCH 155/539] Add some meta alternate links (#2657) --- src/server/web/views/note.pug | 3 +++ src/server/web/views/user.pug | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/src/server/web/views/note.pug b/src/server/web/views/note.pug index 22f1834059..4f7c3d7777 100644 --- a/src/server/web/views/note.pug +++ b/src/server/web/views/note.pug @@ -23,3 +23,6 @@ block meta link(rel='prev' href=`${config.url}/notes/${note.prev}`) if note.next link(rel='next' href=`${config.url}/notes/${note.next}`) + + if !user.host + link(rel='alternate' href=url type='application/activity+json') diff --git a/src/server/web/views/user.pug b/src/server/web/views/user.pug index 98a53ab549..63d2f75156 100644 --- a/src/server/web/views/user.pug +++ b/src/server/web/views/user.pug @@ -18,3 +18,10 @@ block meta meta(property='og:description' content= user.description) meta(property='og:url' content= url) meta(property='og:image' content= img) + + if !user.host + link(rel='alternate' href=`${config.url}/users/${user._id}` type='application/activity+json') + if user.uri + link(rel='alternate' href=user.uri type='application/activity+json') + if user.url + link(rel='alternate' href=user.url type='text/html') From e0deaec695650d22c92512cc2672ba3aade96eed Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 19:23:39 +0900 Subject: [PATCH 156/539] Implement new endpoint --- .../api/endpoints/aggregation/hashtags.ts | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/server/api/endpoints/aggregation/hashtags.ts diff --git a/src/server/api/endpoints/aggregation/hashtags.ts b/src/server/api/endpoints/aggregation/hashtags.ts new file mode 100644 index 0000000000..0daf42427b --- /dev/null +++ b/src/server/api/endpoints/aggregation/hashtags.ts @@ -0,0 +1,64 @@ +import Note from '../../../../models/note'; +import Meta from '../../../../models/meta'; + +export default () => new Promise(async (res, rej) => { + const meta = await Meta.findOne({}); + const hidedTags = (meta.hidedTags || []).map(t => t.toLowerCase()); + + const span = 1000 * 60 * 60 * 24 * 7; // 1週間 + + //#region 1. 指定期間の内に投稿されたハッシュタグ(とユーザーのペア)を集計 + const data = await Note.aggregate([{ + $match: { + createdAt: { + $gt: new Date(Date.now() - span) + }, + tagsLower: { + $exists: true, + $ne: [] + } + } + }, { + $unwind: '$tagsLower' + }, { + $group: { + _id: { tag: '$tagsLower', userId: '$userId' } + } + }]) as Array<{ + _id: { + tag: string; + userId: any; + } + }>; + //#endregion + + if (data.length == 0) { + return res([]); + } + + let tags: Array<{ + name: string; + count: number; + }> = []; + + // カウント + data.map(x => x._id).forEach(x => { + // ブラックリストに登録されているタグなら弾く + if (hidedTags.includes(x.tag)) return; + + const i = tags.findIndex(tag => tag.name == x.tag); + if (i != -1) { + tags[i].count++; + } else { + tags.push({ + name: x.tag, + count: 1 + }); + } + }); + + // タグを人気順に並べ替え + tags = tags.sort((a, b) => b.count - a.count); + + res(tags); +}); From 1917b0339e5fa2ca5fa700fa802200083b0c99d7 Mon Sep 17 00:00:00 2001 From: tamaina <tamaina@hotmail.co.jp> Date: Fri, 7 Sep 2018 19:24:18 +0900 Subject: [PATCH 157/539] #2652 (#2658) --- src/client/app/common/views/components/url-preview.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/common/views/components/url-preview.vue b/src/client/app/common/views/components/url-preview.vue index e182e7f8cb..f9b8415b5b 100644 --- a/src/client/app/common/views/components/url-preview.vue +++ b/src/client/app/common/views/components/url-preview.vue @@ -14,7 +14,7 @@ <header> <h1>{{ title }}</h1> </header> - <p>{{ description }}</p> + <p>{{ description.length > 85 ? description.slice(0, 85) + '…' : description }}</p> <footer> <img class="icon" v-if="icon" :src="icon"/> <p>{{ sitename }}</p> From 2c0e514fb2dc5c8ac534f163beb0a36b9787c309 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Fri, 7 Sep 2018 10:32:06 +0000 Subject: [PATCH 158/539] fix(package): update commander to version 2.18.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ab984eef5c..82c7c828c3 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "cafy": "11.3.0", "chalk": "2.4.1", "chart.js": "2.7.2", - "commander": "2.17.1", + "commander": "2.18.0", "crc-32": "1.2.0", "css-loader": "1.0.0", "dateformat": "3.0.3", From 8c6856d894b6ae95f1f935eb31857b43e9acff2d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 20:21:25 +0900 Subject: [PATCH 159/539] Improve welcome page --- locales/ja-JP.yml | 1 + package.json | 1 + .../app/common/views/components/index.ts | 2 + .../app/common/views/components/tag-cloud.vue | 90 +++++++++++++++++++ .../app/desktop/views/pages/welcome.vue | 47 ++++++++-- 5 files changed, 136 insertions(+), 5 deletions(-) create mode 100644 src/client/app/common/views/components/tag-cloud.vue diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 0c4825e8c4..3cf8d90e9d 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -994,6 +994,7 @@ desktop/views/pages/welcome.vue: announcements: "お知らせ" photos: "最近の画像" powered-by-misskey: "Powered by <b>Misskey</b>." + info: "情報" desktop/views/pages/drive.vue: title: "Misskey Drive" diff --git a/package.json b/package.json index ab984eef5c..9b49dfaac4 100644 --- a/package.json +++ b/package.json @@ -217,6 +217,7 @@ "vue-style-loader": "4.1.2", "vue-template-compiler": "2.5.17", "vuedraggable": "2.16.0", + "vuewordcloud": "18.7.11", "vuex": "3.0.1", "vuex-persistedstate": "2.5.4", "web-push": "3.3.2", diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts index 4700b6269e..75c6086d7c 100644 --- a/src/client/app/common/views/components/index.ts +++ b/src/client/app/common/views/components/index.ts @@ -1,5 +1,6 @@ import Vue from 'vue'; +import tagCloud from './tag-cloud.vue'; import trends from './trends.vue'; import analogClock from './analog-clock.vue'; import menu from './menu.vue'; @@ -41,6 +42,7 @@ import uiSelect from './ui/select.vue'; import formButton from './ui/form/button.vue'; import formRadio from './ui/form/radio.vue'; +Vue.component('mk-tag-cloud', tagCloud); Vue.component('mk-trends', trends); Vue.component('mk-analog-clock', analogClock); Vue.component('mk-menu', menu); diff --git a/src/client/app/common/views/components/tag-cloud.vue b/src/client/app/common/views/components/tag-cloud.vue new file mode 100644 index 0000000000..6675ba608e --- /dev/null +++ b/src/client/app/common/views/components/tag-cloud.vue @@ -0,0 +1,90 @@ +<template> +<div class="jtivnzhfwquxpsfidertopbmwmchmnmo"> + <p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> + <p class="empty" v-else-if="tags.length == 0">%fa:exclamation-circle%%i18n:@empty%</p> + <div v-else> + <vue-word-cloud + :words="tags.map(x => [x.name, x.count])" + :color="color" + font-family="Roboto"> + <template slot-scope="{word, text, weight}"> + <div style="cursor: pointer;" :title="weight"> + {{ text }} + </div> + </template> + </vue-word-cloud> + </div> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import * as VueWordCloud from 'vuewordcloud'; + +export default Vue.extend({ + components: { + [VueWordCloud.name]: VueWordCloud + }, + data() { + return { + tags: [], + fetching: true, + clock: null + }; + }, + mounted() { + this.fetch(); + this.clock = setInterval(this.fetch, 1000 * 60); + }, + beforeDestroy() { + clearInterval(this.clock); + }, + methods: { + fetch() { + (this as any).api('aggregation/hashtags').then(tags => { + this.tags = tags; + this.fetching = false; + }); + }, + color([, weight]) { + const peak = Math.max.apply(null, this.tags.map(x => x.count)); + const w = weight / peak; + + if (w == 1) { + return this.$store.state.device.darkmode ? '#ff4e69' : '#ff4e69'; + } else if (w > 0.5) { + return this.$store.state.device.darkmode ? '#3bc4c7' : '#3bc4c7'; + } else { + return this.$store.state.device.darkmode ? '#fff' : '#555'; + } + } + } +}); +</script> + +<style lang="stylus" scoped> +root(isDark) + height 100% + width 100% + + > .fetching + > .empty + margin 0 + padding 16px + text-align center + color #aaa + + > [data-fa] + margin-right 4px + + > div + height 100% + width 100% + +.jtivnzhfwquxpsfidertopbmwmchmnmo[data-darkmode] + root(true) + +.jtivnzhfwquxpsfidertopbmwmchmnmo:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index f601bc9016..549d9175f3 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -50,6 +50,12 @@ </div> </div> + <div class="tag-cloud block"> + <div> + <mk-tag-cloud/> + </div> + </div> + <div class="nav block"> <div> <mk-nav class="nav"/> @@ -69,6 +75,16 @@ <mk-welcome-timeline class="tl" :max="20"/> </div> </div> + + <div class="info block"> + <header>%fa:info-circle% %i18n:@info%</header> + <div> + <div v-if="meta" class="body"> + <p>Version: <b>{{ meta.version }}</b></p> + <p>Maintainer: <b><a :href="meta.maintainer.url" target="_blank">{{ meta.maintainer.name }}</a></b></p> + </div> + </div> + </div> </div> </div> @@ -92,6 +108,7 @@ import { concat } from '../../../../../prelude/array'; export default Vue.extend({ data() { return { + meta: null, stats: null, copyright, host, @@ -104,6 +121,7 @@ export default Vue.extend({ created() { (this as any).os.getMeta().then(meta => { + this.meta = meta; this.name = meta.name; this.description = meta.description; this.announcements = meta.broadcasts; @@ -210,13 +228,12 @@ root(isDark) > .body display grid - grid-template-rows 1fr 1fr 64px + grid-template-rows 1fr 1fr 256px 64px grid-template-columns 1fr 1fr 350px gap 16px width 100% max-width 1200px - height 100vh - min-height 950px + height 1200px margin 0 auto padding 64px @@ -328,17 +345,25 @@ root(isDark) background-position center center background-size cover + > .tag-cloud + grid-row 3 + grid-column 1 / 3 + + > div + height 256px + padding 32px + > .nav display flex justify-content center align-items center - grid-row 3 + grid-row 4 grid-column 1 / 3 font-size 14px > .side display grid - grid-row 1 / 4 + grid-row 1 / 5 grid-column 3 grid-template-rows 1fr 350px grid-template-columns 1fr @@ -354,6 +379,18 @@ root(isDark) grid-column 1 padding 8px + > .info + grid-row 3 + grid-column 1 + + > div + padding 16px + + > .body + > p + display block + margin 0 + .mk-welcome[data-darkmode] root(true) From dac7387a7f1d2737db46b770877a33aa05fe011c Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Fri, 7 Sep 2018 20:22:04 +0900 Subject: [PATCH 160/539] fix(package): update minio to version 7.0.1 (#2655) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9b49dfaac4..4874e873dc 100644 --- a/package.json +++ b/package.json @@ -151,7 +151,7 @@ "lodash.assign": "4.2.0", "mecab-async": "0.1.2", "merge-options": "1.0.1", - "minio": "7.0.0", + "minio": "7.0.1", "mkdirp": "0.5.1", "mocha": "5.2.0", "moji": "0.5.1", From d9fe9cc5df7d3b7964a303544dd3dbbdf1cf5dd7 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 20:23:46 +0900 Subject: [PATCH 161/539] =?UTF-8?q?=E8=BF=94=E3=81=99=E3=82=BF=E3=82=B0?= =?UTF-8?q?=E3=81=AE=E6=95=B0=E3=82=92=E5=88=B6=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/api/endpoints/aggregation/hashtags.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/server/api/endpoints/aggregation/hashtags.ts b/src/server/api/endpoints/aggregation/hashtags.ts index 0daf42427b..c5aacd89cd 100644 --- a/src/server/api/endpoints/aggregation/hashtags.ts +++ b/src/server/api/endpoints/aggregation/hashtags.ts @@ -60,5 +60,7 @@ export default () => new Promise(async (res, rej) => { // タグを人気順に並べ替え tags = tags.sort((a, b) => b.count - a.count); + tags = tags.slice(0, 30); + res(tags); }); From 9e3abb9989e52682a5471a8773ee1007c51b0ef9 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 20:41:12 +0900 Subject: [PATCH 162/539] Improve welcome page --- src/client/app/mobile/views/pages/welcome.vue | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue index 7446cc700f..f5014d585f 100644 --- a/src/client/app/mobile/views/pages/welcome.vue +++ b/src/client/app/mobile/views/pages/welcome.vue @@ -15,7 +15,7 @@ <mk-welcome-timeline/> </div> <div class="hashtags"> - <router-link v-for="tag in tags" :key="tag" :to="`/tags/${ tag }`" :title="tag">#{{ tag }}</router-link> + <mk-tag-cloud/> </div> <div class="photos"> <div v-for="photo in photos" :style="`background-image: url(${photo.thumbnailUrl})`"></div> @@ -30,6 +30,10 @@ <div v-html="announcement.text"></div> </article> </div> + <div class="info" v-if="meta"> + <p>Version: <b>{{ meta.version }}</b></p> + <p>Maintainer: <b><a :href="meta.maintainer.url" target="_blank">{{ meta.maintainer.name }}</a></b></p> + </div> <footer> <small>{{ copyright }}</small> </footer> @@ -39,25 +43,25 @@ <script lang="ts"> import Vue from 'vue'; -import { apiUrl, copyright, host } from '../../../config'; +import { copyright, host } from '../../../config'; import { concat } from '../../../../../prelude/array'; export default Vue.extend({ data() { return { - apiUrl, + meta: null, copyright, stats: null, host, name: 'Misskey', description: '', - tags: [], photos: [], announcements: [] }; }, created() { (this as any).os.getMeta().then(meta => { + this.meta = meta; this.name = meta.name; this.description = meta.description; this.announcements = meta.broadcasts; @@ -67,10 +71,6 @@ export default Vue.extend({ this.stats = stats; }); - (this as any).api('hashtags/trend').then(stats => { - this.tags = stats.map(x => x.tag); - }); - const image = [ 'image/jpeg', 'image/png', @@ -165,12 +165,8 @@ root(isDark) -webkit-overflow-scrolling touch > .hashtags - padding 16px 0 - border solid 2px #ddd - border-radius 8px - - > * - margin 0 16px + padding 0 8px + height 200px > .photos display grid @@ -210,6 +206,14 @@ root(isDark) > .title font-weight bold + > .info + padding 16px 0 + border solid 2px #ddd + border-radius 8px + + > * + margin 0 16px + > footer text-align center color #444 From 19e1f996a6b1aef8148d4489199d65573dbacdfe Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 21:10:31 +0900 Subject: [PATCH 163/539] Fix bug --- src/client/app/desktop/views/components/settings.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index 7cab7ec983..d800ccfe11 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -44,7 +44,7 @@ <button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button> <mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/> <mk-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/> - <mk-switch v-model="$store.state.settings.contrastedAcct" @change="onContrastedAcct" text="%i18n:@contrasted-acct%"/> + <mk-switch v-model="$store.state.settings.contrastedAcct" @change="onChangeContrastedAcct" text="%i18n:@contrasted-acct%"/> <mk-switch v-model="$store.state.settings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/> <mk-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi" text="%i18n:common.i-like-sushi%"/> </div> From efaaa76185ec7ee39e855d90bdcdb8a4d13f0207 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 21:13:15 +0900 Subject: [PATCH 164/539] Improve note visibility settings Closes #2312 Closes #2313 --- locales/ja-JP.yml | 16 +++++++++++ .../views/components/visibility-chooser.vue | 6 +++-- .../desktop/views/components/post-form.vue | 2 +- .../app/desktop/views/components/settings.vue | 27 +++++++++++++++++++ .../app/mobile/views/components/post-form.vue | 2 +- .../app/mobile/views/pages/settings.vue | 27 +++++++++++++++++++ src/client/app/store.ts | 2 ++ 7 files changed, 78 insertions(+), 4 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 3cf8d90e9d..07d8e7f48c 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -73,6 +73,16 @@ common: rip: "RIP" pudding: "Pudding" + note-visibility: + public: "公開" + home: "ホーム" + home-desc: "ホームタイムラインにのみ公開" + followers: "フォロワー" + followers-desc: "自分のフォロワーにのみ公開" + specified: "ダイレクト" + specified-desc: "指定したユーザーにのみ公開" + private: "非公開" + note-placeholders: a: "今どうしてる?" b: "何かありましたか?" @@ -724,6 +734,9 @@ desktop/views/components/settings.vue: behaviour: "動作" fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。" + note-visibility: "投稿の公開範囲" + default-note-visibility: "デフォルトの公開範囲" + remember-note-visibility: "投稿の公開範囲を記憶する" auto-popout: "ウィンドウの自動ポップアウト" auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。" advanced: "詳細設定" @@ -1365,6 +1378,9 @@ mobile/views/pages/settings.vue: notification-position-top: "上" behavior: "動作" fetch-on-scroll: "スクロールで自動読み込み" + note-visibility: "投稿の公開範囲" + default-note-visibility: "デフォルトの公開範囲" + remember-note-visibility: "投稿の公開範囲を記憶する" disable-via-mobile: "「モバイルからの投稿」フラグを付けない" load-raw-images: "添付された画像を高画質で表示する" load-remote-media: "リモートサーバーのメディアを表示する" diff --git a/src/client/app/common/views/components/visibility-chooser.vue b/src/client/app/common/views/components/visibility-chooser.vue index 4691604e57..7d90b3520c 100644 --- a/src/client/app/common/views/components/visibility-chooser.vue +++ b/src/client/app/common/views/components/visibility-chooser.vue @@ -47,7 +47,7 @@ export default Vue.extend({ props: ['source', 'compact'], data() { return { - v: this.$store.state.device.visibility || 'public' + v: this.$store.state.settings.rememberNoteVisibility ? (this.$store.state.device.visibility || this.$store.state.settings.defaultNoteVisibility) : this.$store.state.settings.defaultNoteVisibility } }, mounted() { @@ -97,7 +97,9 @@ export default Vue.extend({ }, methods: { choose(visibility) { - this.$store.commit('device/setVisibility', visibility); + if (this.$store.state.settings.rememberNoteVisibility) { + this.$store.commit('device/setVisibility', visibility); + } this.$emit('chosen', visibility); this.$destroy(); }, diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index 65dc9eb9c2..b2f0954d97 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -100,7 +100,7 @@ export default Vue.extend({ useCw: false, cw: null, geo: null, - visibility: this.$store.state.device.visibility || 'public', + visibility: this.$store.state.settings.rememberNoteVisibility ? (this.$store.state.device.visibility || this.$store.state.settings.defaultNoteVisibility) : this.$store.state.settings.defaultNoteVisibility, visibleUsers: [], autocomplete: null, draghover: false, diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index d800ccfe11..3998adf601 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -26,6 +26,22 @@ <mk-switch v-model="autoPopout" text="%i18n:@auto-popout%"> <span>%i18n:@auto-popout-desc%</span> </mk-switch> + + <section> + <header>%i18n:@note-visibility%</header> + <mk-switch v-model="$store.state.settings.rememberNoteVisibility" @change="onChangeRememberNoteVisibility" text="%i18n:@remember-note-visibility%"/> + <section> + <header>%i18n:@default-note-visibility%</header> + <ui-select v-model="defaultNoteVisibility"> + <option value="public">%i18n:common.note-visibility.public%</option> + <option value="home">%i18n:common.note-visibility.home%</option> + <option value="followers">%i18n:common.note-visibility.followers%</option> + <option value="specified">%i18n:common.note-visibility.specified%</option> + <option value="private">%i18n:common.note-visibility.private%</option> + </ui-select> + </section> + </section> + <details> <summary>%i18n:@advanced%</summary> <mk-switch v-model="apiViaStream" text="%i18n:@api-via-stream%"> @@ -239,6 +255,11 @@ export default Vue.extend({ set(value) { this.$store.commit('device/set', { key: 'apiViaStream', value }); } }, + defaultNoteVisibility: { + get() { return this.$store.state.settings.defaultNoteVisibility; }, + set(value) { this.$store.commit('settings/set', { key: 'defaultNoteVisibility', value }); } + }, + autoPopout: { get() { return this.$store.state.device.autoPopout; }, set(value) { this.$store.commit('device/set', { key: 'autoPopout', value }); } @@ -312,6 +333,12 @@ export default Vue.extend({ value: v }); }, + onChangeRememberNoteVisibility(v) { + this.$store.dispatch('settings/set', { + key: 'rememberNoteVisibility', + value: v + }); + }, onChangeAutoWatch(v) { (this as any).api('i/update', { autoWatch: v diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 8107c1f3a7..dcb2f16fa4 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -95,7 +95,7 @@ export default Vue.extend({ files: [], poll: false, geo: null, - visibility: this.$store.state.device.visibility || 'public', + visibility: this.$store.state.settings.rememberNoteVisibility ? (this.$store.state.device.visibility || this.$store.state.settings.defaultNoteVisibility) : this.$store.state.settings.defaultNoteVisibility, visibleUsers: [], useCw: false, cw: null, diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index 29fe067a08..a078929016 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -53,6 +53,21 @@ <ui-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</ui-switch> <ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch> </section> + + <section> + <header>%i18n:@note-visibility%</header> + <ui-switch v-model="$store.state.settings.rememberNoteVisibility" @change="onChangeRememberNoteVisibility">%i18n:@remember-note-visibility%</ui-switch> + <section> + <header>%i18n:@default-note-visibility%</header> + <ui-select v-model="defaultNoteVisibility"> + <option value="public">%i18n:common.note-visibility.public%</option> + <option value="home">%i18n:common.note-visibility.home%</option> + <option value="followers">%i18n:common.note-visibility.followers%</option> + <option value="specified">%i18n:common.note-visibility.specified%</option> + <option value="private">%i18n:common.note-visibility.private%</option> + </ui-select> + </section> + </section> </ui-card> <ui-card> @@ -161,6 +176,11 @@ export default Vue.extend({ set(value) { this.$store.commit('device/set', { key: 'mobileNotificationPosition', value }); } }, + defaultNoteVisibility: { + get() { return this.$store.state.settings.defaultNoteVisibility; }, + set(value) { this.$store.commit('settings/set', { key: 'defaultNoteVisibility', value }); } + }, + lightmode: { get() { return this.$store.state.device.lightmode; }, set(value) { this.$store.commit('device/set', { key: 'lightmode', value }); } @@ -198,6 +218,13 @@ export default Vue.extend({ }); }, + onChangeRememberNoteVisibility(v) { + this.$store.dispatch('settings/set', { + key: 'rememberNoteVisibility', + value: v + }); + }, + onChangeDisableViaMobile(v) { this.$store.dispatch('settings/set', { key: 'disableViaMobile', diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 16ce78ea9f..22de9b5587 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -26,6 +26,8 @@ const defaultSettings = { disableViaMobile: false, memo: null, iLikeSushi: false, + rememberNoteVisibility: false, + defaultNoteVisibility: 'public', games: { reversi: { showBoardLabels: false, From e7180d529aeb6603871c0107709dcbb586633c02 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 7 Sep 2018 21:14:27 +0900 Subject: [PATCH 165/539] 8.30.0 --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 35b9386191..b123d20798 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.29.0", - "clientVersion": "1.0.9406", + "version": "8.30.0", + "clientVersion": "1.0.9481", "codename": "nighthike", "main": "./built/index.js", "private": true, @@ -90,7 +90,7 @@ "cafy": "11.3.0", "chalk": "2.4.1", "chart.js": "2.7.2", - "commander": "2.18.0", + "commander": "2.17.1", "crc-32": "1.2.0", "css-loader": "1.0.0", "dateformat": "3.0.3", From 39e44948361760c9686e359bd3901efda83a1c96 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 8 Sep 2018 01:31:50 +0900 Subject: [PATCH 166/539] :art: --- src/client/app/common/views/components/tag-cloud.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/app/common/views/components/tag-cloud.vue b/src/client/app/common/views/components/tag-cloud.vue index 6675ba608e..6eb82bb711 100644 --- a/src/client/app/common/views/components/tag-cloud.vue +++ b/src/client/app/common/views/components/tag-cloud.vue @@ -6,6 +6,7 @@ <vue-word-cloud :words="tags.map(x => [x.name, x.count])" :color="color" + :spacing="0.25" font-family="Roboto"> <template slot-scope="{word, text, weight}"> <div style="cursor: pointer;" :title="weight"> From 1c84c0828ef87ca70dfec1f57aee533b099098ea Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 8 Sep 2018 01:46:01 +0900 Subject: [PATCH 167/539] =?UTF-8?q?=E8=89=AF=E3=81=84=E6=84=9F=E3=81=98?= =?UTF-8?q?=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/app/common/views/components/tag-cloud.vue | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/client/app/common/views/components/tag-cloud.vue b/src/client/app/common/views/components/tag-cloud.vue index 6eb82bb711..5f2cc5276a 100644 --- a/src/client/app/common/views/components/tag-cloud.vue +++ b/src/client/app/common/views/components/tag-cloud.vue @@ -4,10 +4,9 @@ <p class="empty" v-else-if="tags.length == 0">%fa:exclamation-circle%%i18n:@empty%</p> <div v-else> <vue-word-cloud - :words="tags.map(x => [x.name, x.count])" + :words="tags.slice(0, 20).map(x => [x.name, x.count])" :color="color" - :spacing="0.25" - font-family="Roboto"> + :spacing="1"> <template slot-scope="{word, text, weight}"> <div style="cursor: pointer;" :title="weight"> {{ text }} @@ -51,7 +50,7 @@ export default Vue.extend({ const peak = Math.max.apply(null, this.tags.map(x => x.count)); const w = weight / peak; - if (w == 1) { + if (w > 0.9) { return this.$store.state.device.darkmode ? '#ff4e69' : '#ff4e69'; } else if (w > 0.5) { return this.$store.state.device.darkmode ? '#3bc4c7' : '#3bc4c7'; From 2824d8a5b6d4232c12accea2f74d0b8f9e877764 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 8 Sep 2018 04:54:11 +0900 Subject: [PATCH 168/539] Add animation --- .../views/components/welcome-timeline.vue | 129 ++++++++++-------- 1 file changed, 70 insertions(+), 59 deletions(-) diff --git a/src/client/app/common/views/components/welcome-timeline.vue b/src/client/app/common/views/components/welcome-timeline.vue index b427721d37..965ec78559 100644 --- a/src/client/app/common/views/components/welcome-timeline.vue +++ b/src/client/app/common/views/components/welcome-timeline.vue @@ -1,22 +1,24 @@ <template> <div class="mk-welcome-timeline"> - <div v-for="note in notes"> - <mk-avatar class="avatar" :user="note.user" target="_blank"/> - <div class="body"> - <header> - <router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id">{{ note.user | userName }}</router-link> - <span class="username">@{{ note.user | acct }}</span> - <div class="info"> - <router-link class="created-at" :to="note | notePage"> - <mk-time :time="note.createdAt"/> - </router-link> + <transition-group name="ldzpakcixzickvggyixyrhqwjaefknon" tag="div"> + <div v-for="note in notes" :key="note.id"> + <mk-avatar class="avatar" :user="note.user" target="_blank"/> + <div class="body"> + <header> + <router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id">{{ note.user | userName }}</router-link> + <span class="username">@{{ note.user | acct }}</span> + <div class="info"> + <router-link class="created-at" :to="note | notePage"> + <mk-time :time="note.createdAt"/> + </router-link> + </div> + </header> + <div class="text"> + <misskey-flavored-markdown v-if="note.text" :text="note.text"/> </div> - </header> - <div class="text"> - <misskey-flavored-markdown v-if="note.text" :text="note.text"/> </div> </div> - </div> + </transition-group> </div> </template> @@ -83,64 +85,73 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> +.ldzpakcixzickvggyixyrhqwjaefknon-enter +.ldzpakcixzickvggyixyrhqwjaefknon-leave-to + opacity 0 + transform translateY(-30px) + root(isDark) background isDark ? #282C37 : #fff > div - padding 16px - overflow-wrap break-word - font-size .9em - color isDark ? #fff : #4C4C4C - border-bottom 1px solid isDark ? rgba(#000, 0.1) : rgba(#000, 0.05) + > * + transition transform .3s ease, opacity .3s ease - &:after - content "" - display block - clear both + > div + padding 16px + overflow-wrap break-word + font-size .9em + color isDark ? #fff : #4C4C4C + border-bottom 1px solid isDark ? rgba(#000, 0.1) : rgba(#000, 0.05) - > .avatar - display block - float left - position -webkit-sticky - position sticky - top 16px - width 42px - height 42px - border-radius 6px + &:after + content "" + display block + clear both - > .body - float right - width calc(100% - 42px) - padding-left 12px + > .avatar + display block + float left + position -webkit-sticky + position sticky + top 16px + width 42px + height 42px + border-radius 6px - > header - display flex - align-items center - margin-bottom 4px - white-space nowrap + > .body + float right + width calc(100% - 42px) + padding-left 12px - > .name - display block - margin 0 .5em 0 0 - padding 0 - overflow hidden - font-weight bold - text-overflow ellipsis - color isDark ? #fff : #627079 + > header + display flex + align-items center + margin-bottom 4px + white-space nowrap - > .username - margin 0 .5em 0 0 - color isDark ? #606984 : #ccc + > .name + display block + margin 0 .5em 0 0 + padding 0 + overflow hidden + font-weight bold + text-overflow ellipsis + color isDark ? #fff : #627079 - > .info - margin-left auto - font-size 0.9em + > .username + margin 0 .5em 0 0 + color isDark ? #606984 : #ccc - > .created-at - color isDark ? #606984 : #c0c0c0 + > .info + margin-left auto + font-size 0.9em - > .text - text-align left + > .created-at + color isDark ? #606984 : #c0c0c0 + + > .text + text-align left .mk-welcome-timeline[data-darkmode] root(true) From ef624977770c4d4b501a0e167804e69752c9ca44 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Sat, 8 Sep 2018 05:24:55 +0900 Subject: [PATCH 169/539] =?UTF-8?q?ActivityPub=20Outbox=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E3=81=A8activity=20id=E3=81=AEURL=E3=82=92=E5=AE=9F?= =?UTF-8?q?=E8=A3=85=20=20(#2662)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix Outbox structure * Implement activity endpoint * Use in instead of or * Use in, addition --- src/remote/activitypub/renderer/announce.ts | 2 +- src/server/activitypub.ts | 18 +++++++++++- src/server/activitypub/outbox.ts | 31 +++++++++++++-------- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/remote/activitypub/renderer/announce.ts b/src/remote/activitypub/renderer/announce.ts index f6276ade04..18e23cc336 100644 --- a/src/remote/activitypub/renderer/announce.ts +++ b/src/remote/activitypub/renderer/announce.ts @@ -5,7 +5,7 @@ export default (object: any, note: INote) => { const attributedTo = `${config.url}/users/${note.userId}`; return { - id: `${config.url}/notes/${note._id}`, + id: `${config.url}/notes/${note._id}/activity`, actor: `${config.url}/users/${note.userId}`, type: 'Announce', published: note.createdAt.toISOString(), diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts index f04f9e91e9..3d346693d8 100644 --- a/src/server/activitypub.ts +++ b/src/server/activitypub.ts @@ -10,7 +10,7 @@ import User, { isLocalUser, ILocalUser, IUser } from '../models/user'; import renderNote from '../remote/activitypub/renderer/note'; import renderKey from '../remote/activitypub/renderer/key'; import renderPerson from '../remote/activitypub/renderer/person'; -import Outbox from './activitypub/outbox'; +import Outbox, { packActivity } from './activitypub/outbox'; import Followers from './activitypub/followers'; import Following from './activitypub/following'; @@ -77,6 +77,22 @@ router.get('/notes/:note', async (ctx, next) => { setResponseType(ctx); }); +// note activity +router.get('/notes/:note/activity', async ctx => { + const note = await Note.findOne({ + _id: new mongo.ObjectID(ctx.params.note), + visibility: { $in: ['public', 'home'] } + }); + + if (note === null) { + ctx.status = 404; + return; + } + + ctx.body = pack(await packActivity(note)); + setResponseType(ctx); +}); + // outbox router.get('/users/:user/outbox', Outbox); diff --git a/src/server/activitypub/outbox.ts b/src/server/activitypub/outbox.ts index a5e762eea8..9a4c881774 100644 --- a/src/server/activitypub/outbox.ts +++ b/src/server/activitypub/outbox.ts @@ -8,8 +8,10 @@ import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-c import renderOrderedCollectionPage from '../../remote/activitypub/renderer/ordered-collection-page'; import { setResponseType } from '../activitypub'; -import Note from '../../models/note'; +import Note, { INote } from '../../models/note'; import renderNote from '../../remote/activitypub/renderer/note'; +import renderCreate from '../../remote/activitypub/renderer/create'; +import renderAnnounce from '../../remote/activitypub/renderer/announce'; import { countIf } from '../../prelude/array'; export default async (ctx: Router.IRouterContext) => { @@ -53,15 +55,7 @@ export default async (ctx: Router.IRouterContext) => { const query = { userId: user._id, - $and: [{ - $or: [ { visibility: 'public' }, { visibility: 'home' } ] - }, { // exclude renote, but include quote - $or: [{ - text: { $ne: null } - }, { - fileIds: { $ne: [] } - }] - }] + visibility: { $in: ['public', 'home'] } } as any; if (sinceId) { @@ -85,10 +79,10 @@ export default async (ctx: Router.IRouterContext) => { if (sinceId) notes.reverse(); - const renderedNotes = await Promise.all(notes.map(note => renderNote(note, false))); + const activities = await Promise.all(notes.map(note => packActivity(note))); const rendered = renderOrderedCollectionPage( `${partOf}?page=true${sinceId ? `&since_id=${sinceId}` : ''}${untilId ? `&until_id=${untilId}` : ''}`, - user.notesCount, renderedNotes, partOf, + user.notesCount, activities, partOf, notes.length > 0 ? `${partOf}?page=true&since_id=${notes[0]._id}` : null, notes.length > 0 ? `${partOf}?page=true&until_id=${notes[notes.length - 1]._id}` : null ); @@ -105,3 +99,16 @@ export default async (ctx: Router.IRouterContext) => { setResponseType(ctx); } }; + +/** + * Pack Create<Note> or Announce Activity + * @param note Note + */ +export async function packActivity(note: INote): Promise<object> { + if (note.renoteId && note.text == null) { + const renote = await Note.findOne(note.renoteId); + return renderAnnounce(renote.uri ? renote.uri : `${config.url}/notes/${renote._id}`, note); + } + + return renderCreate(await renderNote(note, false), note); +} From 11f25ea2e7ac2b094e4bb329e2ba6acf376f97a8 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 8 Sep 2018 06:44:34 +0900 Subject: [PATCH 170/539] 8.31.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b123d20798..a3e7786226 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.30.0", - "clientVersion": "1.0.9481", + "version": "8.31.0", + "clientVersion": "1.0.9486", "codename": "nighthike", "main": "./built/index.js", "private": true, From 380cf0de6912000bf5fb18876dc910ce8b9a0e63 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 8 Sep 2018 15:11:12 +0900 Subject: [PATCH 171/539] Improve welcome page --- assets/about/drive.png | Bin 0 -> 112977 bytes assets/about/post.png | Bin 0 -> 352793 bytes assets/about/reaction.png | Bin 0 -> 24621 bytes assets/about/ui.png | Bin 0 -> 128212 bytes locales/ja-JP.yml | 13 + .../app/desktop/views/pages/welcome.vue | 468 +++++++++++------- 6 files changed, 295 insertions(+), 186 deletions(-) create mode 100644 assets/about/drive.png create mode 100644 assets/about/post.png create mode 100644 assets/about/reaction.png create mode 100644 assets/about/ui.png diff --git a/assets/about/drive.png b/assets/about/drive.png new file mode 100644 index 0000000000000000000000000000000000000000..c35de433a837dfaab37058b4ed5ddde697611f8c GIT binary patch literal 112977 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 SpB|(FemZybHA>VRBmNJ?oXfEQ literal 0 HcmV?d00001 diff --git a/assets/about/post.png b/assets/about/post.png new file mode 100644 index 0000000000000000000000000000000000000000..ba291ec6650c6a8c6ff47e06384808f3427b870c GIT binary patch literal 352793 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‡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ⅅ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%0D&O$PZ($&LKOrRh9U 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 literal 0 HcmV?d00001 diff --git a/assets/about/reaction.png b/assets/about/reaction.png new file mode 100644 index 0000000000000000000000000000000000000000..e4e7e06bc07b357a553ae7c573ec395170b7615d GIT binary patch literal 24621 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 a4?4pSflEv~On?^u=kBR#-zio#5BV>ddVw(j literal 0 HcmV?d00001 diff --git a/assets/about/ui.png b/assets/about/ui.png new file mode 100644 index 0000000000000000000000000000000000000000..ad102a31afb50dc3ca79eb69d2651e0e0bcaa7a9 GIT binary patch literal 128212 zcma&NV{j$k8$XzdjT_sZm=oK!ZQGdG=ETX3F|myaC$?=&Z2Xh&Z@0Gg#a8W$uG`(W zyU#ffKMziXf}A)4EDkIP2nd3tgoqLd2x#l)kqr&`d56;2G5Pc7o3oO*5XkQdyyMRc zaC1RfK@gDIIJj3sh|g;n2MJAQ5D>)vujAX0eW}UkO=1^O4Hsc2Q$rU^dpjZ(OIuSA zW=1AXF2)~RjGRP_>|Bg&T#PJuvy59HARiu*B7!O&dS}^C2DtmnLmw-Nwx0IfZamCc z+3^Sg!N}0G0!!Xa0{IO-wwBV`D@sz`aYFfMunh|LRGBrBKWl^}gxq%E<KX}CnrLco zzI3>oBS<$TNw^tx^S2yrw9l?rBz=GT*ZOhOQJy^aok3{J=|@6}Hd!+`XaGoQ6-}60 zMUr;D<k;V&Lr_cWGV_n}rGYM|WP5z8(XlK<Znn?I3>2o05zaO*Hzk>BVdjwW`k@nO zk)a`@ky}6iYnjR&mX(>v3*EvJqvMDDd|ZGC85+DFlGq92|2{|j|9Kur1)R0ao3+|Y z{qGxry#nDn0YsyF`-MiY>3C!m1EbRa`@RV7=NAL1W@i@u5O!|Flb3xB#rXHfd31fA z8dA>QOpS52-#v3Hn-dC&I#D>YTnU`68aEHYfAcUPa~eD6AL4!Bhj#Yq=pgeVBcs@< zj^hc<w0|M=92pk<8Z`3AMN6a2rgTX^PENYHL*;8tq!55?uOI>zvxz?ANuD@Ia@0Mx z1oOVa5s#f^%tumu7Cu80B-!sGzXg!VEewX4AbwH(l~2Qf{vzQ(!mn)7$!}$4mXE8z zxZO24hQu_H*c*nfWN`=7q{Mx40kzbBOQb0Ot;>+{C~vxS+sSi}{ELKGmL{g=W6l7a zDh!Ud$CAgl&WBzL))8qWLS-5F%|#@;C#Hv;=cHdL)RQqX!Ncg#1>i6`edkvOHi{T^ zGpL^0|4ly3AfbZsUoh(Bk@6%FgMUNE-c<e}-~Fw#kAD8}WfV!AhzfO?CUL!?4n1X^ zQ`8p^I8~^U7EI;>B5BZKCIqa#G0Uwo_8W&N8ddkFtX!RFSuKBgUh5Fq(%qfuGdtFx z7WkYhDC-@#ER_)>L&pM~jEx+94PoR){t7zkfVwD_BW~S#D41CemA6^(s47O%RH!6S ztQ_4!-rGO^D;(H^x58s;{<xOQay!s;s^GA#s%m*VAS`Gq*3x5UtV{ptds*vG%tS4z zH<O99;R}WIard#eFf9C^j7*&aVRoIS7YzUOo=|um*G7B_XYcUV=(MrpW<#q-feq9~ z`AXPKtQu!JRt%)qJ-#L&H~7X$e0OjsqQ&?|i>KQ@u7lkRK6SYB-@iD6(OYaK;BSZ{ zqfJ*)O(pH(+I#~3?qfC1b`?g;UBjtAwKoOkywlfrdM#TH+*=Ns2Cl9Gn5Tc<;`jp_ zZu9sq%0NpgyhF)+IDEUmb$7k7^YH_w2L{qVh$f-73<=GgJ0?56BSRyi!tU4old*0F zV{cd1^RO{8<ae=h-2^uO84Q^?XmnL}3H=CsJbDr|-27q3;g1FlE(`~=mK&WJ9o3~7 z@j*Z(-dTlvLACHy>^sY(#xZB4s*8S+%>}i7_F`bI?efpZl9i08-=7j&*75a9qV?n% zcj=*^qq^#4%lC}8l=aNpCECPT<6~LO=XKO-DU&sPwxp+&t$q^$iIvPrmBw>MU~C1_ z7H^Y6EG0C^8>z;&VVK$=@YhBT(qjM1Ee#PrSh-@E&!$T5TQ-N@?hPpl%E*`SAskjL zS{k~yEN#wSB0G>I(jvp#4;R$D&)w9z+`TLTOcStU%Oa>BEw+E9-;LlZHqyh3k)>Vi zb#^~nxBk(n#n^aQxLU6IW#%)p(c7ht>yepf=b^LC!(K2SA}@8?)R^B?iw1NyCpK4M zmt)CfYV9Sd;_*gQu_2+N-1{4n|JFwOEy05VStJ7786I{So$cw%6m4nz<Y_Tc#G(n1 zo~kWFnoBdzo+IK8Xs*rX@7kD;Fn3RefYuSJQtDlqr-IR`hO$dTC5ZEn7lFV<ZE=m^ zUT$JtijO%5qD&^I-uPbAWfU4Clhp;iFly-hN(^LBdhWWxwEa){f|-MXSjRF%$au60 ziP)YFVK^sXcl#RRKm;_;>_)mrac|nLM$LV4=3ACtinvvXDn2o-LZy1QW<1?g1s2oQ z9`N6|1RfoBElbZU&-j;ho-2o>_*E9>Lzm(uDL$QGg8k11Zr%z1E{R6=L*$yuES5<d zEq_#%oFk^S*RfoQ<;o!=<WR}<qI$J1L%p3#f9Z!*d|YJSs;Dt+y#lkDNtzQ1G`Kjw zifBOM-_WnwnQCl1Z4+j?<@FhwcO(6r&J$KL!kbY>jZgU%eU@cHmVu+l*oO5(vkWUG zDd5qAu8w6UJ_9dq35%3RxBb^+BXQ`l8f@Mi$GMogJMT+&z7G-uO*SG=tu4ojHg};h z^KcqBGQ3UuK0e}WZ7puMRo!+R!g@>Bd;nS+6i1D?)y=*QudVp%gLqPBv+BPK9Ev{i zp<Vjc^{5t&zd{^cZo}s_7V*X|1rhcoL%2!IwM-U(oc~runC8=(>>$<z@hr4j`;ymj zza--E=^3_VXRoc}pAT4^tSutk^db9`GP5(IK00n`a_!d}F!lYLP>dt%P>g4o=*)#G zM~0vCL&V1YXe+Cz)-Rb3a^2WI_$te*4CB_R{?dld?uz}{P%2z@H#AlS+YvY2*?`gy z8b8Rlmyf39L2(O9eY-f)_@_#h#fa0qaRcVJR>8nUc<0*a)5Rdy)Z*Y*0(L^Ax>T%4 zJdNKn)h{=Vd*$VWfs01IFtim_d&M|5E>P*=?G1Hd=4@ixvOX1o&DNRnUDUk9ZEo9V z*$9t-!UnF<qrETkaG$(4T;j{Q;K^aORl511%g#$3u_t}`N-=`pE4ow?k^|_6xxt#s zQB00DeAmu1zlP_DnCLOC9GN&Zn!W)C(|Qa~#f+_S-RvHbSEX>TrVleOC&aC%HPu6- zv(R)rXPvU#?_pYACdRI23BM0UDBn0<)oHd|m9sEf%JAKKA<(#=_gl+%^v9i_D_;86 z_ne%OJ46_KYLpvXn~u{MQW!d=ZFN69d*}Mjz%%a*k1W!{iGy9!o}fopD{9Kf;KsBL zMIt6H_oZ7mXj(5lqLS_J8qhT4PbZB9o}o?0sjxn0Z20LrEaf_pjMdh{zG)m3{G}Uy z+u;wF$uA+@O8qccQFP$j$$5sI?Rtc5Z61aT4G%le3A(=O|7+!t&dSCra9Sp0E{eKl zhl%7NasQ2BjR4b4U1g`@uE^u~&YiK142957H$eaO3j6h0{sY9Q)8hqrr*U<qRr&5k z>g4Pqk<E-q(+uU%=J4FN>#(kRxRnp}0j2NP_3gvc6n*p|jhLMRQY?tTdg+F}dO39A zAb=btaq(V(QJKGwL=&d`4YYC6-A!03h7@mUrVrd!!DvOd>`I`$Q+|5|47D|%bdc{q zGa=IP0}|#+2~<$L1pOR;;hQ%QTv(QG;d^)JCjGgy7Bd8YVlE0D+V;#M>j8uGUKIo> z`kOwVh~rB0lIIL<k0>F@or-6OfrKL`UJbjgu#*tRu*TH#JWQinOg4Js<NC)t?gQ^D zPL9vEF_y7bd`5O`@iRMTw%y)7Za&9Aj|rnd#jLSP9fC5Z+@V-xjsnaJuVU-ELapuJ zk=m(J*3v5epQ#IO8n$k3XNVm`_vbE%m3-cGr;GVhhxcA!gZ&{=t=N(6%k~A!TMSNj z=^1~YGvX;ct@cap^<6?QU!O_;!$C@kJMn3x=zAD=QD;MN_I&-k0mLOKxZAXIsJd+n zYcb=LbkIM}by(tGyu?QVg};v&gd`N_fr2`U`r@g>qygN9JM3pVZcun0XsZ4jp@o~! z`QEG!7eAb*_3Q)GD#Vw&ygHsIXx84_{dXDsy|KC7?1QE)#AGUQhZwS=@8xj0(l4F8 z@u_~rf0GUiN&`8)XxeGZlnYL6w+%9Yo1^D2+AZ5lhjl9niLj*bS@zefhN5#lmtX~t z{f!ZekUZ`NUHQ-2JF@QHnB0JYu_wvfG!h%)%uyYE8COf;m(7K$VSaU;$=*JK9_4@Q zEe%fhe`4f)0b+LP^fHZ<NyjJGVA{rwo-3?5;VG>)=kKDn;u}f~Lx|O&X9{6N`x((+ zl(omN4nGq&lSYx<gT3??M-76&+%OV*{Kzc8HBEbFA%5evIRI5ZNaC(}D10z@9iP(1 z6yrK%;78|X#~aw4^bZevZv?IAHq0HDqrHX1w^@(5^f;G@XztCs$^(uemek`S#I(m7 z-S=%fF`-ll$+h7mm0&QV(5`~9;xxFp?ixtbmTRwU8FsVLWM@QZQTlf+l6so5SxEuz ziKbZ@6JB(qArUeH-o&QePM7ZUr?(<*u~e872tZyCM3#mtASuZhw>wI(Ij&0*vIDB2 z^L}P?d_*GfCKxP_y_h&}y@&jVNsl$J^-)wv%ybmlWd`%znP6jijSe^GrFp1lgP(%7 zB=D0Wm+JmatN-P+8^mJuJ)>+OiQZi-c_CTyf5*^0m%XmtiEoeqB$}L44bm?8@ScjR z4BShx(!oU++VdUTsa(Z(L8$s8>NSIS`*$Ytv+Tq(JV&(~ygs6{qU!^8>K$Q}#=1hz zS=k9iyBVMCgKT-!_ZY|dw>$L4G7t8~CULOQFif^vj{iJf0@s)H+6d*slHTYg>c$NJ ziTK50)0aTr#1ckLFI!4Tgc}yHL+UnRWO;8`hR4j;-r3=~>p-%~J<}QT)99fi;#Kww zviH)e{#&l`V>v-m>$S5Enw4Dur;Z#`^h5zl2P=xFkUbCfg5O0&c)8r8M(5u(;M)=c z>{O4kdE89n1rUCYhAwlN22|t;mw!N|1>4l2YbU>P>G%=oi$$l32fqCm*8sd}PZipl zGbX)F7=AMg1PeG&!B^=T!YIibgSr9rvC>5Bh05hQnR-)H*W?R10*^3d#cX!{H23Nj z`LC4r?xEKNPlBW089st^a*WZ#*0iChpP~Wlb`baV58Wrz;)+E+1bXXm4M_~@b}Y4% zqEAC*>BvRkow<ICtD`rdFDurYPiocsWt-<|xopgwe(xSGO&ochs-(xt9(hLH-^g6J zt6bB)bYLpo3^r^i-gyZu(mh;S+ZoNJ*#9zl6_VAv%j^%_?k;&Xe@FafF+L_aG?yq8 zEfq0@#m?`%;X)Cf6rZ#$=2Mvpr^CRVXJ5$50Qf6;?c*VVp?<>Vu~`{J9_?4O-;mRk zWa@&9!;^p;R}5KJxv0B5nuq9>l?l;WY|EHW+MVJ?3A>ZhO=a0#dcH$G?8Rv1NY1OI z8s^*6D(LF;hvByXBQzC?uAw?->hKVHZvxea<p_Lq`0G`TS_qRwvVBO>(LhGpOZ2T+ zEO~e?w91?Mu>zeHKcrHaz*b_*WUhV`v!+h!d3rRAJVGG<*7PapIn0~jYOc#VQ71oW zNSQM8w1PfDrf{Ox>uRnTlkrad>Owg6ENs3gi<l|-%^g<??0M=ZbJu_T9FJ8L{Sh8@ zM?%SabR8T>!7KUqw$ya8-uOMj7zNYZY)FBL?r$tLJ~B-lEK`}7)ooM~ueohB<UdBo zWr9NFGTAXpURz86L4xgZnWMM6ETz&=;+Bk<m94fyp&EtE-ow)YdnE_OSRh->zXvjZ z?!f+7-Lu9A5&Mx{+B8~aim&)nFb`Odi~e#tJ#U(n1|91cn=?>P9P+{q1_97SZCjy} z;FXQkNlYQKYTgfO-B;Qp8Gd;=8Y`7*H*t6?F~NKsH)(iZcDFm?N!|v?;KJvRox=)Z zgg9($0Snevhk-4exK-o2Q@AmS8zvu#WR1+VX6)9EuUR8hql-fJ%vX(EjhK>>G%{3w zMM{crLm;q+Ct?M)oWASJx1_h&o*!LX>a3KEB1HX(+?D@@kR&<D`Wwei9kW5pvfG7{ ziP(5c($tM2v75#6auSV{rgd>~jPQ#rz8ZmvBTM=a6KN3UKLzf>3Tn{vAzd7H2VwcA zSFE?7wHOfSQNA)2fm8_zsXqt6kH<##oo)h%b$l1l(Vzo0L5)`ww?^&`Q$K15|8<t? z-gBrJ63jrc)gEK)F%vJYzO(~m<9y&|4N@jfP+CfW)Wa{<t$w{*(7JwC#H)a0>ZRX# zGGTx_bdl)F<nIj}Wd@8`g+FP9feU>z>yb|^*9nPP!L#zzsXn0aL2^;MW@sdIEMNy% zsHh#1>8uOjK^yK71%{xrc$mUhnw}Au1YvNkz{G@KhM{s50a`^N;|s7cVqQ5zr-D9h zDicn5obxnzCVlt$Dx`k7hC6X{#rs15p*>h|#h;MAc_#HDt#ZEw95fs%1df6!OmVUR zMzD#)XFChQf*7gMEhSXHPS90CoXF#kyc;oEr|Gjr{gxO()$_%V#C-E2yT+QXBGH0S zR560d=$Qy&WDzNN8tYttD&zx!*oWWsK~<a4&2w6z9VA?BB=>T7?3sH~ZwxHc(A9OE z09%-N`G2$k88qa{6+*VgEELIw#A?-seQIMS)tS6X^WUEG_8w%9?U#Z#rcm%~Fk`gX z{Lf$r2!+4$P9op_c%P<9hb#7J+C+czx+kYVhDXaWK>t&x69x%GBWZH4feI<D!R!Ue zeKh7Sy)jF59~L!;y;&a>bqT5-5PWgK&p}LE-WWtEs{O0FO@wGqHx^C?3k{yeg!IUw zx&FtdtykOKKQ~tr7M5Q^l`<eK*kY#b4LBCATrxR~kX7dxF5G4C>98w$3m~Faqj5NF zqf%ovdwYOl?@on^=o<HCA>fTBo`tk*bTx0{7qSfpy=^pcmk{Oz+={BD=LRJ233q2; zL@RhGp(@-BPi<PIis`n4Q<PsLe`l7|xbB52&_GR{5S=uDdYhWf9Tr#g#I6^XwA)P$ ze22LD^r<bFwWw*g_iIl7uA428aomS%TwHo*>{7Jhi`m&^rZQwLmpVIPweMB8Qy%#H zcjY@n#owPm3H+~Bc^*dFANPRs7FJfrFayuC)299G6jrC&Tpswkabqz_m=nTc0P?I_ zu+q6HrU2<XCtnXkC!|WX3kTtp#Ec>x4DkOadDxqfH*3k1lZd?Xy|f%bar+r7zo{Hg ziw+$NNnXn=hX+$aTblPJt*dcaJ@&e)zk8s_R1Qj%Cl<p(V^b81wz+Sn6~(=3Ez*B< zd{|KQy$q5jB|H%mf~YD@O8uK`b?EAaL_%EufYJx3@<x**ayeeS>CePU=<7Vh#>3=i zXRX=1`=CW|`czyngS=dnay+4k6fhERl#Bxct@Bl0>)hT~oYrZiu(`B;fs&Gy+U@Qn zKoU!-<5I`_Cim4s{c5dcr^@)eUGsLq{*TAo8w#{&r|pJ%O2L2MjCPGQ^j*%v^;)v% zIhWm9m$4<7p>&JO<~6!qG4Ibdpg3kN<R~n3<tTN|+Gn$p!!3to2ZKHy=y5WQAE$a8 zJ8aTn^_s!%T9c;g?qDqWNumEUsscbo<Gv-G26qj|yf#TauQR4P5j*0A&Zi%KGz`Zf zp0J~bphzO3p9(50+z_&#?@$@F*1hJ8-t|!l!QJdyn+j_s4|dV|4{y!;VNoK|eY>|? zH#*4sp*JfF9u>7!3<sr>a7{0<uhLy+%gYs~g^e{b9V~{<*5mD5KHqs@3pjb|aPVvS z@o|^lVws)H$$CaC-}k}4C_9=cSXYoJ9OUW%%T7F;DTF{ZH1uIzTQMw%ZRmFozUJA` zYZo~EbSt{3&=xFsAfwIlCp7v9tdnshAHX(@W|By8Tch7Q*eBr|97vjg1XWch%BBC~ zdnbn}!;Y(iuR9zb^+(>m9jC~fD?ZJ5@cQNeSUN=nV`P!nY@h1J*!Q1~fQSXfQl`d? z%5B>M+R407(;vyHmU{+&H!TPK7vF+dcdw3%{9ZFqs;}TC&~Cm6(gKF6l|atdt0sY) zN>!@+EfeQ)SbbXi`T5WcE=;F7*>IN3H}D+Ha|DFz*PdYsd0|DxOQKf3V!2;rllbfZ z*%A<(*o3Lm#<Q_VT}x{=o!c4U|AOh4`^EesVI1bc^9GVZlfF#*<UYd^6V^I>ynwp9 z{=8Yi3N>I?Q4EYF2kf9Ju<TD@(7f&$G>t~~xr2uGe$|WF;4QVs-u6q)^Q`;T)SG{5 z+VkVnd9%T8+vL?~l)TY>CHD0U(fci|l=>PqM<~XZfIx3KJV_0tN4F77pQcvOB2!B` zN}$i9|Cc;g&{Uov<R!rD(8D~z{e@L!FD#ry;QgSSBlK_8`<xxhipF|sX)d%F5e}!l z&A_$xkc9~@D1nzem{YB+w!4x5rwVadbL4T;Ti>W#I??y{y4=t)A)tzZ?}6dFo(qXR zCMM>!c!(-tcgSgVJAlG7xT$m|PND0*EJfpC&eVxEyn>*&jV*3Vi=Fl>%K4U|&9$uR zjG85Lri5a5tvwBGE~j^@K=NZGx*^%4mHabTE>0-tX82njsgpI2PeDJ{^<=f&&{=cq zs;$*lwrHkj+>fxWo%az8)k)TlEoJN+<+onYH~Y7J{we=1+!fV!Lw|c(9DUumf4Pq! zxvy{N9ljsR7PYqoAcJFm?oD>Q;VqnCInRr<8uhh__+w+S>mhDKJ(aM{>s~+}D4y#{ zO2^(mi^FsV$7N9oNpva1-ly3QjyF~OLv44sp4@2JF)w?q0S?$Xdi4N#eR2*c0mTe# z1U80|Dx#cr^thDR{&5*_xG!%L-h@c&c3yR096PJh`+G+6h(_TW8v*t+zYQ)<Yntko zJfM7BmLKvg;ERpOszv(*l&T7BY)2qy#{bOLr@U}|hN|6t%GK3kvf5Dd8GHLZ#nISN zEw?I1#<CsJOGk5Lcxn7Nl(7V1%FKgC|Ju&?5_Vt6SgNDWPv7JhcXlUFrfg69n(8Pl zR0-%SajVd0+`#hk1ZbchrYUoGriXF{Vzb*lG8HOe?hs-gZ}bUzP8hll&J}cM4~y|| z#!LO=GTP1mXeH-xXSiBmOEp&^pw^y??CN>4gUjoGu(~Ddd@+<!LqR2t;`;2fdeb{S z{F$B4N*e<oL>BhV>w<^kI+wL@XYb!{>OFVNo1N)Nif_b0_|DGo{xlHQvK86AmGhD- zDr}B<&7d9aL~%K<hu&a?fLVujR-_*rIl&(Ni#Nh5qSu(!$l8>RzHP_7<upfqSql|& zipJydzG|KAbqS382Xz8}YKmmR8X-B1?Z<o2(aAOL770nT7*2-51ZkVKqt$Ld)zc}Y zi`s92k-e~A8l7|!M|z=IDxU1$8Meoi4AqgLNra}4;L-Mq#;T?ieAjr<8(&jXKD8My z=Bw0z8%1ekwX-d<O9F<U`Nb@H)@8(kc_py4F~qRdZ)vljF=At={SsYntLu;dRx@jF z|88!jecUj1-Mj5tyFx9v&KVdx)492^Z+ly#a+$>qHBn&Zc>UwnaXsg4*(-lh&@|l@ z2DfGvTe4BQT?Jm}Z6g=7^sYJGAowVKhkd6yP0gxP&~qwXi+E_dYog3**<qLY?u%7l z{m@L@5o}Gk2~vpv9I`m8e}?e|8NgW!e#w;xIvL?f4enhk8L0?Gr^0=5r&cJX5zgI4 zFRJ9=J02ikdZ^G?nXr_hKf+8Ly)FA(p^WXQZccDaq>SN8=Ff_X*5B~E)$+@@p^ZNQ zcBt@IUSx;lKp5SlVfsO1dA|_x&CTGjoL9iA+hTuDQ;F|U1Cv5U<53-ZpR}J@5Ch?! zLhGG4$E{3r%?M!~9o6Z(!(#PbQP^;9abBr2M_2MW3}Ba$$rX$M4!MQdSP3P)?hR0$ z`Bx$dikED7=W-)=FSO5@?F(}z2=sTUtl2SC7Yms715k}TVVE{C)4$k*`&oHGdhhba z<<s(@cxOE3q~`(tiWYk*HlC_IN_Vk2>30Z{0mrupklq&(SLb!%Le(aD6Z7b_p(8J; z{TR-Q&q9k+gxFQ6m>f*?MR3^1k9!=DVfAb*ee=S-Jxj2GCusT1>R`b$IkZ*QwA$)y ziJhcTs*tG*)^gy{Jjme3T+7@4nRUuEW(Nk)1u3xwz-V9YHF95VwA#GTJxHyNyt<9? z6`GG>gnrt<GKiO&CwHaUAwH(cY5|89GA3f_d9?4k>?WpUz5U>J+U@AZQ9k;xMcx(5 zn~5rV(TNjv%mBk??&&#_7*oGWCa2IlbZGEarrMUS8t@X6gFH_9Z*5dCy5$7|l4g6o z<WYSFq7FdbN_+hy9jj=mte?qv=nY)>cy3UYx@ry09Hg}4Fl;XwokxM%(>12tC+v2@ zqcHXHEN1WoUVAW2oiJ|J951$4M0C6<5#uIv_-Da?)?=T4b3H+aA(DGS2&1F@?z#~7 zxaa?X*Tif#xz_QVK%)6zbETC^g@9E?tkPZ!emQuF(z)KD7ruLyzSLeQC_Q`f+f_*J z=EXF>1Jsy!Y6K5<(+l1~STos5m)b6IQ-2x|2M-ynOt_NSn9h{OYe2->8CqM9nSK(D z$~<d7skg(iwX>2W0oO084fm}nvD_b8UoIaR9y3&F4?y9HS1d~-Cg_KP+Q`+SOFvM) zxIMJkx@8D@pTstz@pgoG#C_tpUO#&^uTCx@uN`(3!sXMr5jokF9i9lYJ3T!eIN9|G ziE)?!Ax}c#)C!^-dg~hSu2pX9J!E4*hg!S{seul<y;|f;phfl~eCOcLglZ<G09RjC zLkkTa_Dxk{%3{vpalTiT$k4l{?H6SRHE3GikI2^(S0gmmuj=cui}&|Ow^K8pMmvO) zOdJ&BhMizdjFw9JmNPpFmnx0-c9`@lpbi<%x<#daT=gR7^vniAlxUEqGOdE<6T4dF z^HDeieXZvhyXVBvSanA)q44~`9Rm}_a3`nrH7x7jt{6CT)15w7Cw)-$^52X^0n$9~ zv}P;`>x)fa#WOre$j;wGsWr_780_AYAp5>T=vWeXX{rS8bVd0hBA>ObUI)Wc($?OA zp+CgAZ<Sf@k+8EvI0kZaHJg#_9_zK?5zhT~>f8Ax8B0!VQe$jKHKED&;vx<W3;JvK zjTaVQ1@A4!5eaD#FDssh#TkdryO?tei^S39qXwmhRFdX?m`{N6Im)&LYHQ#y=@~3& zuc1*r_ajh`9#t&DJXo;$&m+?hAHY|oTY!=E3tHh(sIUc4G-l{O-&_sDwC`S?qW-Tp zARPYF9)zM@mnf0lYT%x*Z`cUwRHC$xSu3ngjoQMhWuh&UH>D74DKp+`4WXNovb<fM z!2R!4EUf=tb<Tp>jjT_=A|z$N){=0^jP}Ap@O_c9G^xLx1NY$3Te6Y67%F;he%p3x z&tJ5DS?~S=b>M-dpOxa?_yR?{JC<4xR)K={79vz**#5X{p(%&XQ6i);&<LaU{t=Pi zdU_<E&w~aK;e4(HOQ}JN+LD%o_7^`Q8!K5gsHkhd;JfzqM(n7Z;MLLJpNDti*4mg{ z-_`gGf<Fg>=l-j#(B*?dkeCVDt3WLB+d#t7w*GQRA&3SZf{Wi!y3wIuv9>!$9&MWK z*DV!xQqTb0L}-&kLx-pbPA0d4@*-@vBgyCJTT7Im;Y_N2P%$}6JP`u`Iut<c1eEc! z!=Xsqi&&jCByyB)ev3;jHM4F{p-h+tL0Y(YKW%!}#xSC9MTX(fqiv4mD|NFUS<=y4 z{Zuz-61nk13Evy+!ryDqWkxMqOM#)gx)CMSiJ2%rLyzcm9ZS|C!NV5BzeZ`61xWd> zKNB1)%&6J=X0G9AmEP0cndgzFyK4FhEmh14&WqnJ5|&diEsdC4HR5R9|0opv{>6SG ztPALUbkpQu8uDH#WM~*(sew9|<vnt7{^Tq%0;3aeXKPBrg68*@WuNRwnDv18+{{tb zwYeayKDCpl|M<)ZKqldcRJdI@b^(?*k>`b$_lUchF^k1XC20%G+e8PXA+ro&C!{0O zG9UymP?8T`DH(`xc-z}jc&;LoxG$Hgy!sds)XB027X~-3_5xcex=p7C$&u8)KpUu_ z$1tD<qv-nf(>wj)Rr~gFm+1QQGdp8yO(0m~$gt-1X9Bq<XBD^aPSDW67wvN<@e&2$ z_@+CAa;;^;0Y2TV_|{V)AnRh3j-IR{IB+*Cj{*q4jwOd-Sqy?^<ij?H&1jM&z2@%j z^^%4=I~c*>>V006L&4dxp(g9LT-v5qHbU+ZD>_8JWD?Z>Z~99V^%9RKy_AKQH(}(2 zFT}&Jb<pBwGh$^Y2FI?Y<;w_?F`e0tkH4Z;P37WqW^S8|-UzftH|Tz)ZW~=GQq)_> zP0tIJh#i_DPg*2{J0s_Uon(@DGLfSsFaUvEO8+P@7@Rl-0?w7slGoF5od5~`jJG%{ zs^MJwkt+pn{qC>@jm2LkJSCV>aI)kC{yaN~mb1bt<10wDgZbj<mOSOc`yJp_&Cbvs zReMK%>$zmv9+rz^tM*hsF|7mqIYM&s9<?@wmXX`S7v$UNLw*8&&Fgs{U%Ij)83$5P zoY0<F0v7O_UUgbjbJwV%XyBWwYzIwGEhIwJDup;km{uNbqn+e{5`s>kR4~Ns+{_3B zjiw@+Oym5kB0ego(`w&eGEYRTv@_ar;b~t$+xyFZ>bX_A(~847T%S;orD8*N4E%4L zwotXXx#nvsQ!y=<3P?8>El*Vt9K}<Oz~@!dl*9?vi~yukWCRI^L=Ri5#=Nptu=abk z2W}OHs**!iJ%`$cpPi7ZS(9VjwEgCa;T-U`g<Ry+vEtd(j&lELkU;jDkB;EY*kr%< z%=q^JgDI3x0da9#p6UZfMHvSeab<@t3h=5OADtZt)p~=tS^{B~kqVE>;pFPR!%vCJ zPF|UqkI~)hQ4V9WTCthMF$kn>{Iu0<O}B%7g&#;SBx~*!dV*If*fdac{ahp|c#)i4 z&n?D8l*5)B5f+uu9wMmA3wH(y2OT-V?$Dlt|4}V?Hfp3prbf3Ul^F92|Ax&DI&y)a zn;8H#^4Lk5V!>Qlfl`Wu!`_BCvMPHi;|DB8b^=4xO+EjfS;=Lu5G0(`rLuzf)eY4b zO?#(*(vY*!?!DQjjYU-I<c_O5SSXmJNXbm+fkqO#6OmfrBSLr{hexG|ppm2F(=Okj z{VCL{W&LZbD{KN4gr%MQXVUvPr~F%#Iae522RC<nD|F%Ni^@sG><pbfF;nQB=GXwu zxi<05-C=$rgw3k2zxV@(HPc7%?xjT{&Lo+cpgJc`n*A#VzeYVAZbng!*e9s>Lu~rT zHM~0gX#j`N%&wkvP1$&id`sulQiLncUyNwzSX@%#no_;)8ARj%mu&(YonbC9wjh1_ z?7T9`pH+q#`fOf{7{UH(UJG}SOU}DC-1|drD7eF}1)6plxAiQ38tayP#Qx-jx?@ao zfG%rvsMlJPXJ`WjE9!USq?E5z@yOVJTn58Kf(M^%95*D-S<n92B+?-hu~+_g=Cbv? z%C_c+TszR8ERCl}g;t$K;vcrI!~9%hLD4v1$^XBexKQFxMSvk!&aFEF%F61(Rr^bc z%wnKe`plzs=;%-|=i|Z*OG~TLCFgrW(U7=)COvcfb&YMqO*pw0F`^JO|8@MOjM1zU zZLvOi1WMiS5n$57tmw|il**)@A?%|16#Ob!L_?rpxHJ$XZBSiof*(Cp`p@y@i-fO1 z3ngf0K$~Le15jP0xqeVj$j^ylNUar&!p_T_x#0<iyq9gRN+IRtmjyMGs_F)WLKlxh zOOa%1vDDoBp11NIpqp)5JJ@o2kmCa?*|PcF!^)ab_`9esUW>;7Mq(1ct4e^VZ1H-T zAEoAqCDsb!#K3k~)}zq>TrcT2VkgpY!Rqsf!o;mLWyLXI<Vb|$@Q6%kY(%Mr;JZ}$ zo<N^vUi?vUqLQ&`?ty|(DugLxsD!{yZR2`m5Zky+3!;p~1$Fhdo+?CS-Aw%7d<FAo zz+?lka1{18%?Pk!3H|Ria<{7McxlS%g&9)*@ZS-sgLm8i=q?8ONq1;Kw27hvXQB2U z8jOlnCCzl3g$9g8UPM1WK%JV~ja9{zYEwPz`Yk!#<&iAixFud$Ob+<mZhNk~7Km)w zu-pX)CToZ2f7{^RV_h$tMCIu?#90*FnDN`rV`W7#Au+TPOMis%xg*{^Qz`-h(#kDC zl)#{^24<h_fBk=)#3FXVc_w7#QPQL)5OH?JYu9Su;S<Q%{`{o_ppjG5TC>7;T+qav zh|Xh$TBR>0ld)hHk=+mT<9-*55#yDI#I*=sG?}?6^<?!OnNtTuXj<jQ2y#eav@Y1S ztgiS(nEOeZkvWy=(J!MX@3BO_#*NAymqnvcAK{spKZ<E7U&>37)qb{Zek!?x*rz-Q z>d8goBz~}mM$pml7d;YME@`zP$dPc)P(>)prA2K<PF&*}S`#U>*5=dvFk?PxA%df9 z-dTDYGbKqMI2BL;{MES@g@E~iLlq?AB&J1zS)$@ejD`kNlF@nPhfYxX&ZsN!NcsB? zz5w~KqPJos<qTG@0zK#6%|c1pB241ng;1;HO03AmLZzaQpHGJiylG8@1k#=$CZZ!T zjq03N<B?v?&&jA>qAwT3xb|sh18+_CSf&%RfBg+X7aT(>p*R-EGgbso=Bc{n)Yva2 z2@u0@SJC|`6`nABi>WU~lCjFm*#0d-3`a$1IY%lnhGAm+<)Z1wBQp&W25e-o@(829 zqlBVoo5Hk(@1crkmsS%Q@`?=g^3<wnNLqyEg5%L38VRr-48t?sRNfl5nHJd?wU7od zdPts_V7`AFf)l$$fD5%+xm=S|S6FiW1^zz!UeUiq9q>!}3^p?S2bx3!0c;8sj)EF> z%I^Xx#BC8BM$O}h&$iIRAz%dfx`A+C?nz^!KwK1)Q$iWEzECZ-f+`5G)_;>xl{arY zAO)vp6c`EP|A!e+PKK2aE&E{wn=e9jo)o*A#e<!bs^(b+F6xxcmRP;SX-wmPJBrD1 z;kLk06rHX^6QjqWnigKED-v>`COzEtx4eb3Wp?)0FmI9g?Pn_Clc+kML>1aQEGFTn zL|^rktaR&=X|<Iji6}^ZLvSM^Cq`IPmR7h`ix^GND8MNNBW7P1jwSaLlpfq8O1iUW zB%WSbT8qGMFNy@0s?zw-eo)B|v>|YL;pN?*dRcUS|7<?0hl?vtm9wLUiAhs0zN{v+ zcIWgoS^B68fON31I1RKOgy*Dv=wCgr&+}+&+g@r4nv~CCPvH0a7f;%1dtS;h)Zh2M zHz-z0;6QbBqcAp+*}n}dK@VI+2C51x`<smTe%W_NWj_qQbY7Hw%E`W7WixTpg3oTq zBaOiPJ-Lo%Tk@PPDLb*B*11{{GwAN4RT2&sU#Lz<p%3$kOL8V&qW~H|hF&zjCy&Zh zKL|hGKRNg^AsHJ;Yyrhwhl3wg07M%HT9AvPLDlzxlIz4!55poakd0E+;p&hFrYiD} z%hceXSlA)9M~S<wuF$QK%3`8yOI1#{u8xDV!5BhZ)6CvjX7l5;)&*9yL0({NiiQkX zg&2!dQ_GT(4d<-emGyxxqlYthqU@Tq3pM0T8pt(G(hE<8sL8zvrmOi+tkQUbvws>g zXwjUJ;gCc7!RWrdM~x#WkF-mNy#H3}BE!`rfD98n90PJ&Qf=Hvm-Q1z0;cxwt%%;U zRK%WABAP6j1obx>m1W8mLRBiFUN0&I|5KdR>Cpi~!S`|DvQdXZ1=TP)X%5Wn<Wlh| zg?hBcq5!<Wd|TBse!!3~6Bh$-Uir_k2-(PinXBRAErL8>5p)%NQY_n8GN*O6Mwz|m z?{I5L*7g0ZB{F(_!F8fiC(cRgX|?2hzxXF)m~O;PsSK}4l6ZpvSAiAIc!=vV>9bEt zJQJhl^0ONObNX)p&0k9VpF&B57AH@?)8|~1Z#+{A5h%fEBYF{B+e(E)7bAl1njT+T zZnx9CnFKIyrBV&&_Qz({d&JZsu#Yq6zyc7JjU*ls^ONU`ph=ce%|lem)I13rQE{_G zP^zJ9i>XN)zNih53GP&vwFV&(2;x;*8iCelOrk!uT2j%6PqYHNrmU+{#NkOD2@zLP zDY!7X-3iYY#jRr5gb2l;tsAWfs)`><_!Ir!SW2Vwtrur*h8h+GyIpCs=3Orv9>w@> zxC-Bwn=g9yv_?W}EA%37l@N3zFH^_5bjY8g>8+05fP3sTzr+@zNy`kSUvTuZ#`PJv zb>xHfuB^Ow3Ky#v@G~Ahd$ptShS?d>K5Lb+bd_+zFq)tX1u8ikFG(FOLo{36dUc2n z+JSX8<D@NWexX7wcahn|2E5H2!KXoeJ<psrqV%4qP!&@k_)(+5iUSFdWJKGknc01! zrBCJ3`RtjB3F+7i4AOj4<r!udWvXY8qwx()Opp}8@H#|LNZ%^R%BV@b5_*af=3kR4 zsJLXNWdT*&BqM0YxAKXk3HuC@q>^0iAbC+BkpvvgZX^Mnp|a+aeX_fS%sTId<U^$7 zOtHCyfCJzBEI5C8I>C9Aqeh!eS7i1~RL$eg(;>iUsmn7s3p`6P$({YfwQnrl=uQeV z8roR!VqRED6<yEoJOL8*Uh7Y9QOLQDpI!Pl+3JL5#C+6ST+f93DbA-m46bvifw1l8 za_f-0p+I%##clmmrvtHl1zS+A#V3f3MMyP;f6LAR<|C1!vK+h{!LrNeL;*53Ho^*= z^?P}*SGMjRs=%zP|BQQRt@vH{YefCx+|*CT_<q{>eo#W6q|OYwP%ZGoI?WF5q~FMY zo9B`bQ9D7}h*F2bmsL>&W8QfFS@rvr=>tBtt?fV9QuWnd@SB`#Eqb+K%$11+C~a65 zCrjG$1Zk=vwU-FZkKtk?>%1eqo*odv<{?QRrI{2GJS0rO)4QT+q{<B6vC+>`dmHgk z{ST#IkN7D`G|h!a)-^RqP`VcJ`@~C0GHM`gTSQbSbXij+BAjg!jM2FLt1DSH16l6u z{s`|Q4!mGqM+ldU)8!tv=n|E=8_UCEVJPifCJAGCwwXh*g2FO*X6O=%u-AA=rFZ`P zf6a`S{O-e)geJ_~uOxo+=OnAN%&<(kPPAIg!%Sv=+L`f|mZJj%_~0)JCdpO4osvIR zt@UkCG!5kT+{rJp){Ej^F5NMVNb7;3!%O{tg?`&CweTHrVGq(?@B%`S!Nv^<fI)!w zKvp-o;COIiAhUshe!PETFp(%hQ9@5)b68^CQ4_Bw>MOA|7<r4U%jk%#lkCFJUbt5g ziU_uof9ZiT(FEiXl5YcmbOxTZ7h_{%vTb1)XR;ck67URAO#l_FR8cP)yv(gKI>hw| zfNWIUlN^OR31&?rDS+}YAtw1*vRWJE!bL7p%>2?XG_VOM(Q5Rdkmn3|-3Z1Jlx-!N zi6$H(j940D*ok`&Od`3rWjXB0PVA$DzBuS%HexMUCZyOmoS2~Nu)VsmR1SeKvX<jx z)|HFS`JsAGqVCM#M4MSMiWhNJ8+KN&MwB4`q7a&PFK!wOq=j;s%!Df0G{E>Tnr2P< z3pqMH1@&$B{~f;eEA1ur6qFj2kYAHVLnP(kOqR@<jD%?~P7R7e!icCk66=c%l=JYE zALXiu>{!Yes!dX9qx~WKCIuQ69P5vkN|Ny=`cSD{a=BMUU-8d138Yx7O{XR?-0X$o zn<P3|gN#SXnl~nV2=M8$P9=ayiOO{R^>nq#U8~mFUA5=Wkj{^9Q3`+ucu3y3zZYet zf8NW*x}wiuO;(9E&+`QeGQQ)gv=#*6ce~iT4j(b%XAU%{M))zHhNmuW92|}TFeia0 zuw)(WC9*-8B21^s4pnP5p2^(x`e^$3Z`1z3`vU8lgByF#mxfvSV6KgaXPCNJ<n4|> zZ-UhUBzt5>$7{18-^iP%|0usMjPsHYsEB=SC-}sxmj|V&tz<n^8H@U|%UyXHr2`2f zBv7F1Uh>kCTc8nuRx}Bd`1BdZUJ(y2I-W>LNkPaU`Hrcd@MK(fPIGd#_*4;QDss`~ zH1R`edeZv+-8g1);(y68uU9vF6_Vqhf$-ciOR6|zAIBU%dfd*CaUL_sEojt514Y8< zN$>IaLXusl)mA}9DGJ!|I$22|_oFD5{=@y!hg%B#m{1j&9*MXq4!}vZmPv5kER}^O z0gfi*iFI#7?e-i7`y9p}Tb<+*>0Vrg;kE5_Q@<J6H-hD!ur@iM^s3r$(+!$euhxJ2 zcJMY9!PJ^F?BBq$w+BUC3e%;1f>gUtis*_c25O&i=nK!zfS$j<F<Ocy|Cc-J&jiZt zDS^k4WJomz^al*!p!_aWFC?0_tpD*@3r1mPlH#y~f3W3Zw-2Gz9W7Ts*-AXhgT@ub zIc8_eCnKJ&at0WWR(S!UKUd(1ukJ5FmIR_UG(hy^?k<p&GbsLW0taY&L1Y*5oqn1k zdx?INqxep}BiWY?NUN()^kjW?Ac_*gLmi2c!Bd-OACnel>Hi*ajP2+};93mMa}5?& z5O5w>u-7|J3jN$M1@SFnYl%f(xQ~uMn1U`vTr8z3<pvvZJ>BRYGe5w1kw7w@*@Eyr z{wGHRYyE?29f3zi#`M$7sYTnad${po3`q-a2G`XhKGfs0!ko)$ZCK~Rh%1y~7I&t4 zeO@@9=<`UOVp|F9xZj-@66W=@lE^xq`B|;;6n41(6+|JM_%mekfB0M+^K%zmWxVAn zeHyA}Ymk0LEO@q(TI6eS7#Pg(S|u92#JxJ()#_Xj1k9P@a@mo=j?}{=X-(BCi20Kr zSymJB;LC-$wJqv{p^{314WjM&0)e7<a~k!vWv$EDG!MEzK1M}V$yyr!ZX|iG{o72v zfmR)K#=Tq1zh_h~oDA>pa4x+9*!SP2CEU*bs=o^pKx^pvLmgPt2kk%jhq|816_$|S z>KIH_*-LqGt2q4<p!n9^T+lSsB!D7{gC0v#{O$%(UYW<}-2bh`x@dR$UK7Y-$o&q^ z>f4QQFRT4@?GTS2P|&#la$@*=&XAw0(svGi`wUO$)5EX6w_HT^<Eb$S%7bW!o(J=Q zmR@X(*FVJfP0Xb0{(Dx+%hdfT|Fr~%?oUNJy+|i@2J_Xor|N4K^3wbB?!&ktRPXYu z#|xbAxG9n7P{K&dFE<gMEuR_A<{WnjtACwHwbvoozG}xT-YruK;}pPe+-`(>wltn% zpz4^ILCILW84NAZ5xG@?B^7Y(?Em&x@nAnUlAQ?+n+w8-{$DLaaGlLABfbCaKlFnj zp>yT}O@fR=1Y9m8-qiGbWVAm!7y32p+reW*IWAhe8=3X=_?vpX%;EOFCx%6z61<=t z7W;)k(RZNg5062HWajil?w=K~re81CoE;494{r5N3Qtb%6Lm9`tVN~$OAm@)hCL5^ z*qEX+3HuWh*VDkLZZ|wvDfBQ&kboODSgLxu*LsvUo7DOJ)m_QR36c$bh*4aZOg*BH z0EW!qWIx|km>gRa74}GJx%_)8L4~vY4;|I{OR|zY_Ud>zoj`EZWt>-Fs>(qGNmZnI zaxi)dIvlwJOe9&mD;K>3jA|N083jVz8VXtB$TP~&vv7np88gh=64P4J^4mTR=YupR zU}GBSsq#xIO)&*3l1$m;!6EO6T67xSpIWeJic0G2zMg~%jD#wkp<N*-iKmR|Oj;~0 zDdv$-kCXu+Zb$w8=x$0jK4~aDU7m_yeDS=ha+gmP(3k%m2`FAfJZ>iV9aU>lE3=l7 z1?D1@Vqkv$$}rA*f|`3%uL|QrPQNgPq$PM~sH#>9lq;);oPAg=bfgh#TUK`WCfFEc zzdyNcIDd*!@H8Pzf<kMx%|oQK7brUW@lI%?hu(39SLSOUl*dqKZXgJS+Gx*5DsR7C z@hD0~$lua$u$%mc>Kp3!68b@APp|e4tivuh2DwBIY#X_@7kqw04)FM&H{66iI4%L+ zs07c!FglEm>$7o!U6&fJl=OG}P}jFTTKDbKE(TNdd=1^cih!1dDhE9;`nKi0wdp_a zp>hGoW$lh0-4vj`3666SI{Qs06TC`HZ~dZIdIXl(l@7r-Lo`4u&D|mk7b{VS;wCo7 ztHSXFt3m=qwCrMwqQrQS1OutS>tcz%#+RGwEjFngS?qnOW772|ihNxA*lm>Y^oT_0 z2Kx=rLq5qpE4b??QdJ}(L)mGykKhX701<Re+EOm?6eVDIo1~loskb=i0otLViy=GV zurT%fKHIOnl(1=4qG_Bn%|;hVRfxGHN~bZgL%5HS^UQw+7Pbd{YLoOi$x&en!jwsu z^PX!|mDPV@LXKN3ZP?dhWG@d6E}g49ezCd8c|I}fn`AYSD`w%7+A5>6T8L8(*9i<P z+c?N(_W{pcdWGjvN*PRap<NRM*`ht^_84>dxj5c20kBrBct|krV<DLNo-6Ph7`MW* z4s%WThv!Ri!HQ3h2^}U1M8v3Q2``hW%x-^@cGT6(FNp$P>Kl-1&tx}`{74f{3EGiE zgwc2}l9Vt0$T~0oxy21yWN=NyleV+|3D|J3{hkI|$TZT=GN$V==RD_oK_wYEpz8k# zTjPoHVIj#tj_(`%&zB{X;?rVlMLWj=rwLh?ziXxDOssxb-|t)nilDJ^Tv|cS@kf@< zY=PzHQQ><^-xS9Rzq+cAN*9@M0jynca}~;w8t8w-H2XJsBKY0x5BcatSS2DChSP{b zr9cyF3hpo~gHRluX}evXfapnM!jHgo*kFtL!PKG8&4mzj80Ag92(Vd6HYCsm1=sH+ zEszZun`P`hty`r^1DSLyBBJ)+N~oH6>F_T^j*SE}Dc3=PH_Ck?4i2nIb~nl<I{e-g z_DSmoO7naJiWb>|rt>Y6%e#g~9E@5ksORRs87;1;x%g?wV9LI{I!{lpys9F0oqQPQ zi#qE`9%9oLb@=gY0i$^+Qpu^%90z>_ZhYaA-tN7wgU6*7&A`fO&^uXvk+Vmp*Sjb6 zVxl_c#Q3z#P<o2se)1{RMRs6qy}K$(+wk<lyyNzT5vF$R*}L=#jL;2f+s|{0A^!dQ zsTwSII(o6i6?Lf1-wv~=kD4QhJPr*o?Sh9CGSqeO<?(n_i`o28wflrS7pm8Rf<3b| zt5bFI0awk3mzw9%B*z#2<MhEu_R!$dyPr_Zh1>r_kox%0fv5sx-kh9)<eXLqFq<F{ zpcE-blL9Y8nHyZ`u6Lk(P%(Ll;366#QC8Z+`J>kAwhNZ*qPnN>3g{t{l2eWBJ_0c{ z93-j$9>*w$6}IF&v85=Z>qrb=B9R(w@Df7rkES#>=9sD()+*a*)2{3gAIZW(#U+6< zADgA)p;Y({h12<<r`8#%gIyB-2Q5v$to&{tH^t!6jaK@~-swvaICi!(PGI^O1=$`< zyEY(QtSQT<M)l5?kv=`H!GA5Rp@blWOAipjMsLX->8AXqS+IH`a2kTyn@uk27&9b$ z7<Zdt@$Z)JA&}m|O!lzRdNy6ax1}B@?cZZgHHo7<CZtMVG<XNU%Po65?(YttLifi7 zS<BMxg<wbo@@dJw`Gol4=9?yIH>~RgKom1-0y^+tS!G_$Ee4p1;rpn?YC8RKSZ~jU zeSZTrBLP3ubJRpq>PQMDba}jho+Sh7vFlxc=@{${i`Qtk;xf;;y?@BAT~|4!W$dDE zQxoY`KGe3I)xk@iiD>V3d>kzWnZaal@BJQ)MDvikj}z|YfRT>ZV#)QjV4$~QKr_^8 z5N>4fk4J2N%$eIM+3V}xon#)9JVef`>>R$!<J#T}3FJ?&NG@vX;T_K)r1PMI*qnu1 zmEl1r!_bYeKA_>Dp6k8zx$SaG;)hX!w4S`wPuP?zzZNPK0YFe#Bs1%YKu65>7BB@O zLed}Js}(*?3C^uo=Uqa9`ul7jsz;&I#QpfS5>ZwDH!GlgI(7d&b0geM(IM$uEmVHw zO%bBU4*6uRpA$^t#UsqEj0EbZI^><tOGczOl&I(lbxm#fDfhp&)@0ZG)JD;<LWql9 z;gAeMN1hl3yDXLp3?EQh!>zvYe8bYu-sCf+N!VcV>i*mU=>fycW{o?kKd4Syz~OdG zE%E#mmp_gRf$p7a7MBWs=8ZqY=4Yr3mbE)5IZv^~H(y5WFh8%ng!8;xd~KWjjbylM z8;Sf3dl1w4%Iw1q%&b_-Z<Cyf%VX~U5cZDIkv?Cz_DqaPGO^8xZQHgvvF(X%Pi)(^ zZFOwhdV7BVbJjZF-mi^X)zwc`?b@~P>$WHnJFwf4y@C@U()eX7`c}?Hej|VsUcviy zryN1zMuVxr6XtaaX5O7OC9AEP+DqKke$Woi{4)?Km-I(1r8KWbz-WYEh@<&B!)+8# z*?<5#Qy@7L?8SNBA6~tCA0@p~4@mdP@uy`-x6IOTa9<kf5z6e3Br3grAvjcV-(A9i z40ns^nJzHW409@~pIRE2v)!w4-$`?6`c_V-8Te{uMhR}&ea3iF5J1@&1z1wEv?c9` z{I~{2Z8C;!f86J6KH)MZBlyjTFi2k4=;>V!1~0&d$RE=V>99?G4<_pK9omq;!xmPt ztA1RCQ-R$IKJn8!Nam++!Koc7%$B%?$15XH36!H)z(Pg;8y<5ffBhn_6I$#b=Yu%! z$3IQ(C(}G2w2BB-W-2wSh!jPc5GS^c!{wTL;(NJ&HmRmNhA(GXaTp`4pyfDS>DosL z8<VQ!#izig?JF={qCKU3^4Q@s2WG}Nw_|t_U`oB$yboQ+y?-E)mVI~XrAJ|;9RH1I zr{6pMoO?LS2L_#M;plHr#EZw9s9qz;?SbNeVsAn$l(jWY`2A*<NAnJWfyg6Lc>G*V zi*jeq`eEQs;0t}G3k)6X5`mh_OjJtng!ShGeyg1dxuoEx4qa0HZ9{Xv^ITX-nYG_W z`L6$>^EN?-=a_yfcU**#|I++7^iO#eKd*rMw7M&b13ZmBk>MM+ZJ7kg7IVh}MIDrn z0)?%_2nd<r#CMjVv-470t|1zo(2{wtFoQ5wss>1Sf}y#=&K8uYPJ_wIET~IbzBnyz zC7EJ;(@$Xp>m0HprxA2RhD_WMy*u#R?hpTLbXP%;Q>3|P_d+Pzhoo~fV36<TK;&Lu z&s4BnENpjj6*Sd*+(EsN0J&};M))>C`o4{o8l4^C&2)G@z+_ttUSzvOu(Mw6`SKUs zn@~+7honKEy5eWJoc&W!buN(sku0Z(E;9wnp7vJ>sS0~6aajNz{Rc4K!qc-9*jebk z6vkAA5T0LsyEVsr>&uQl+b0belR-E5Eohew5ujzz;SjEzp#M;5$8Ap~$9<+cVDre0 zF%|n8+`o4})b~Jht?l_j_ce|O1y}&+5p^nTnD$<RSsMQgodQ@yPrO%FoewWX_{21d zrrO!m0QdICe9514b1%0`om3=A<j!?^)44Hx6^i34^XHckEP8Qt%R`34+orA-_F2U< zQ;d)84TOa*nm$`|E2tisg>!X*=Y%7pRiz*r1wXE1+Afp?OK;k3cqGFZjvnrs@M15L z-Wg`hbmR6VX~_2~)YwgZW;kYkNBaV4ZY2M!J`kOr2E1uPQ~{??iaZ#HO~+1^&-m7F z&(wmDLJb2`C24NwKU9nSoKMb+rwfWaDl1m~G=d)v7ELp;>z_WwmC2OXZz!@WXR|wd z-qui&720fLRjbUFs`E3^>kgG{S=B%b4f!f*ZtzcOZ5XT;(nG$+SHkD#PoO0B*y{k! zCtC693mKRvb@-woo&OapUnr4X(r;3>PET0qzYYn7eHKs4f?74JXqZVx9Ke_TDhZ<V zE2Ri{IX8tUAea<*`6J<ejpd~D-7qY^OVJ{==i{9TkX5q7Vt=*e^9Nz0efN*DL@yD- zu>gwflef=N#`2q?rCf-y%E;EK8lFto^SoT_CfmXLdM58W9JJm6(*zySU(S~2!ft%W z3ixu9T%G$X@*R_1uAAuWYmbfrWfw$a7YTHAN&mbYzT4X0FYc)h*OmFg+hZfm<K+<J zu9%b&*+|p-l#qP5hL#ozn$K4cB{iqtPUFG=^5~cslN2eYkTHb!<{^7wI@<U^(#0TR zgf^wx!pzE)uN49~7Q`|Rwwq;U-Ax$xW4|o4;Mg}<W=af^EegLd^vM({gCKvRa2qnS zsr61=drj*<7d>|G+&-QuL<Yd@wG*|VM4O_dSWv%PANQx(n+vX-AgAetS_e<zB>|2o zo9c2SBjSFr#zBzdy%}><`hrsaVuL<jLmKAs=dNYy=MB4@EY&Y#K~}w6_qH;St1t^O ziA79tyEuOPB2#_IN@awkF%^vktO8etT1+Y(JNZnljT=V>TVG5%6_c)4M%teCW$W!T z)Qq=PUVx1onXIspCTj*bxE(oZ@AyEw1Fv9Qyz!x6N{W?H_V@5A#URk~Ui3w_O!jQP zISPY&P26><)|dxB9Yy@pJtX-JG7*o6wL-@#I;_b}F4Tn!TsyYLo-TV>#mg6_W`B~8 z(?`6oI{#fAnF$A>7+PvgvM@2EGW!bOgeeZt4f3o3k&5U{q3|9hT#Zw@hjgNud^Vqm z#3;q=$C?N1{o}h1Z<Cn<vV47IPUJg9;pLvGagATK?|p*5kRKI;l($kK{N*V!N`sOv zhURt$-(ed<!w}vleiaV=cze2|ppqf)`lNiCIF&4b!5GVg@>P&?0q4BBUoA53dL3%| zcI962o|b)Bm-|46P{XIlCI`r0{;IY=Nu48eZwk^e_?B9n<Ml$Mf5AktM!F$_2~+a7 z7bxR$H6STipQ}AckH!;VGLxU&cC}0CZs|CI&fq$h(2v=xZ0wo9{-7ad+sQqUHcR&5 ze9k%`jMznr>B)b#H+>rmGWX?@ljN>X?*I6%NAmLrr5LpXG!pA%Wf#7y?{P9m5;u`R z0Y4vrB#Ut#)KZ2rt1sx}hFxA^IIt*DUuaW8(k9P)7XL?7$s)Rh2zcsvpbi#5d%{7W zCo8?er5_P}ns{K$dQ<;6wcQK~5KT)<AWi|%FG99nOvVu=hL)N1=59_lR>RjNb!#tM zRoZvh>a2ZF;U5N8%E}fY81wHY3(5D<sH@|w^2ts+66FEga!w$fPQ<Db->VNFdR@)( z=iTHoh6)L^PB_UrxpdDyWhoej$$g6ZqBezVQNhi*CndOObJ<bSRc|8bn<sa6^cCx^ zn7<mhczBTGmOu%4QV*vOH^AH+&^Ob$E!^-7lJI@Ty>Op5+=42AYlcCB`4o+2+q#e4 zmlnTGjZQ2PuKlUTs3<2H+6W73$G6@Kd?QJ?1*h6+is$@p+uULo9icm7Ip-zCwbuJ2 z&g*D8Hr7nk-zqLQloNWX1GW$mU??*;tcjR&l8MW`>pc}6H8Y}u1y!~$5R3X}q*1au zpK~eP)|l^d_afchxV3Qd>1C=}{EA$}9<_u7Bg{gi<u^)6T8WAOixzs9`yzCuU)Y6+ zpDS6SqEXO8S43KQIs#Fl6MFobW{XKMEkWrJ9r&oxG!HUEgq%MUN19sc%&Uep5GcWu zBy4CL$Hhbn|9Hig|1nGM-d-XidHgQXAzPM4CAI>-^P(V&c&ue{4zQeQ;I`9b3I(U^ zdUk-Mf0FG6E9PRTKcS%3VWFV^t}({D<w|knFEh?myVK<e(fIe<&7jWFw%=Ts540UR zh%LN;U=DQ^)g}&Scf+2kgAO3|*G%WTi`*_I{*T?)c8{@eXt01$;G)*1Vw<{$-AIYi zygo^6@`<R><}I@u%I)|0U4`mx*0$D@o}3V^IQtM;5+dN<=yKax825dt0cqzpBoIC9 z#Qj`;U!sGgH#A_#t&ZbXxbXS5^BRW_KT{g;OuqLsyoYQAU1~a)@V8JHV0Si+0xu<I z0rIPFow)>r6xT#|rw3i_eDF9RX~Y~5;BB;~FXiwEm3_a2rc1?k*pOh*b*iY_R{oJK zchgIRg7C}THHxX|#=ztvz4^u@Ft-Av2$w51XZiY0>{E04-JPN$iCZplpkbXdEV&l* zm)Aa>iUFaVbb7lj9ogb5Seo^j%cnTVQ_MWfb+g9c$W|wE*@`+wkrZp#<#gAdhx>U0 zY@MF<UipCzf7}33;e0|rmS49&d(V03X*7P=qPO$AIf5&Tg8ryC6=YMr-J7cB>ao4+ z?x8hwvD$z$J+bM^$jhsBD$n-T1)Rh$uO!67Aaj}eX6W`HcPKvL^Dlei+pmkN`jFKz zdf^?}82yNEh*x(SYP~khbn+93bq=JZzm3!*tY2TFLaJEEpgA@Z8hlpG@W79CPTrp^ z{5%}^J7Z{n%>}D7U$oa}b<#K&Bw`hR|DA05;xy4?VYP5ts`tl<T)ANaHdmLO5<M!i z?5+1uD4qay#P3tnWYHih*6Kpp8*v(y@|?B4+M|rHXUl5-K5Mq`Pw$9t(qSC~7#}n< zrqv{(2(DV_vY1+b(rO{RwtgQRr7dZwRR&vMa27N_LlhItR>Q{?P(bZxw{PBJLlN0w zE$r9JtNP^&Y%7AS{8ZK?u*bBcmBsb)EB^^d$*r{(hYl06#>|C*1w@?jg^j`Z6YhtK z*u2Xu6TeJ-`Psi?WO)@qL4YGgkYIg`6CzGZCn^lJF+PI|tjlE4qphBYcq1Y+e8y6c z*)MOJAH*41Kni6ISdpP6931~f<QAWt-t(8HQxnbstNQz#`0Yj#B$X0G9#<1w#0kkb z0YfcuvN?Zw*!E7AdM8Y&_;c?{dxB<MO5k8cRedjmz4cxQgOSwtC?5aRgUF?H5%R^_ zX#OUCF!uz#JK$kY#cP0iP)L$jrEfH_8dx%6uA<WNFzUN2<O;f*mP05ZGQ5n6daW>C z)WGsUBFRE3(VTlX6d62jEI4<;x2qb&UQ{!oi-4|>Mb-p|oDkk~psPzJjbE`jX=|!9 z%2-x-y3!VK6;b!uAD;;~KW)2bGOvjLLdA#AU`oA{4E1oNw~KBPFCNo<33EIgbI`m) z$0&}Lhzgl*V6x7RAX%M4jk~uiV|PviNhYzWzn;O-qJFe17?tA)c-bxI-Yu7u-9;yp z3<8@^)gI_iiF^#}>N4#K`XR+d#&R(@g$c)AXvKv*stA(quUOfmRELg@CO&r1!sPrs zLUwVL*va+tYdqUf&K;LpN_H?XS+ioQbP(=~e)pD73f<P|w<Y~4qzm9N16u8CF;qnD z?8Ve~3+=J>;x^B!6I)}@g2d#t>NN4w<g5`e#IWOO4mDo5VNE{{lBm0fsuU4xzq8sQ z(=Uu1R$pYG>;m&Op_mjx4$SPYwo0U;;rH{AQ>}nQ<tnF{c^)%JZ>sekL5Dw=ubBRK z-{ikDh8O|3r0d>^DODoB1}gyLu$S^fN*KY*dA3A7SJMgm8>vlemGr~a(5ozQ(ss2G z7W@U1`z6B04?n{b<f%-tQ^g{LGPqjUYuH2QIDU8;pZrQLA@Q57HV$BP^gX$nZ?rB6 z7-g`~GJ$tz&_UA(dhg!M)cOE#L>}FgH#n5zPjTND_J^p*Wd}-0yGnK&TCf_5B=HXV zFtMx>ZJp&Rt9J_P?-L~HEj~C~EG%Ab6HNTpPvQf)L~v!^5FD;f>+w6onFt=JCaF4q zOa2Y#xNG<$Txx&EGBcU7wzuLLd-LAyHsCPDs)t!Gf$BMPvuml%{OPqzp^La(HJQ|6 zFiCrf+4Uhcif3Tl_v%y)w`qeN3I6iFE8v%RK=S%)PW)4S?>tRg7=KGW;J)}PED*cO ze|Rk_JH;oaK3+zAvo%1>{e-1hRn?AAYSb;ULPT(_)f#dR*88eEDj16v4|M$YE^Z|7 z9KkVO-qQKHD{C^4<6-pm#<T{X9PX807POHA9#g5{iKAY!F1H{ih1b^kJaLd6XJp1U zSm~%2I!aG4CA&X=2?n=_-E3}tMw@8Wh}TOw`ZjxW&>Ho~N_X1&SCJ*HQ0;p3oOzTP zdp@}Ni$%eHS&N%WUPF-^YTd9zb+JbZiCx%5IVmA7&Sc@T=!0{*uOr)#?`K*EO6t}k zgqR{y^I?X1>?F_OWcLfQ=G6ywH&mDsWlV-UgzQv8N1sysUT&RJ-X=zW{)*Gov3F4f z1*a`|r6P$de!KdD&nHKu59!&z`ZEFyo9Bf=gWZ)b<f?$hYg(>^=GJfVgj^u2FgQlT z2KWV`=%iQ1lW7q1(2j^-0hZ5DTELQLf>MeYF;DUlll1tsoP349X1<Aq_^zKE;-1%Z z;+<DEW{!gCJ17jvqhKfHe=(fec<7s1?_i*D^F{Mtn!5wISWt&v9CM5W<uF_R1ac&$ zDUOcvEYoNON*9BoQ|o-Q{>^D<(}C9nP@o^ia#soTUVS;v;(;v2OQb}ZsdW0F&@*o3 z$j6pR>rzxiIUr_8ut^ELitpsQ9!RdfIhZ>EP}*tuIeC8GY$z(%{|Q@$#HM-{*YwQ9 zd;b$Ak3`KU$(-{TjP2gA*kJaZ>@q&DGCj3M<C6*$DT3RMfiR`bmF~%~Y4hplA#TO? zFd3Q67R=l0)y<v6d1H;E^Ky}-jbqNq;D-!%o9i1o{$5a&-u4hfn%yNJC^98WOg7q< z02+(l@V<oEn9kscj13!ix+`+E`<)cc`vbhWiodegJmwuYBA%rC+#fwFz-ZhBPo(SY zEXgZvH>ps*SYsp95})31+Dt;9cC!;M7z5d=-qc9rK-DUJ_0O9NPS5F@D(%#8o#V#C ztfa1CrROO#hOZ-};^(cWabyy&Yg#+fwtg{(Yo1d`PFsFNchy>$VwIzg0`b(8q~Ph+ z=Y;U<mtC#wK|dMIXaLz#Krn*S%6lzrQu+o4lUM-4g0u8MyWOqp7QtghA%%^t!BzGB zW|fCxUC0EdSjcV~*21~-o?k?z+o7oow}&;G?sKD)z2N!B6da`GRJ%MnJv*3)W0LrT zed+H{-B~A%0~@!asXg8M%O%x}dJ`V}`+zBpWk@Om?e=88V*N||k$7ZQe9QXX>UQ{T zg17pjk9gD6%_GQF)5vIp-{|QLSCk>xkSpN9JM@zG|0yBtD(nV`QfeyP@Uz&Na2V`? z)e4CvrjmJ>wWira$X+Esl)V1#n=cd;5iqf3MiB4G`3#6nz77ZD9?xOZj}{y?A4=?> znq*Umu;Wv#N7}P#Pf?M`>&SmO=*!S#K7(r|XZ(#!DO-~t7Cr;YdRwCe)d-SePjz27 z7Nl1q=|+TYRAHJK&ne4$5g2#vpBiRII`lDRE0e~+GBeX7_uGB@k1ocOb9D+2p!xoe zCb%iP`Hf8t9$lP`%cl^L(jc<9XPU{?<>&UnRu4y%7F*nC=up+A+L8Ntt`6C*-f`E^ ze{ZK?DmCTzTWnOUoB!o0#h`j|h&Ua=`<ms+_lq&5cfiU<lyVO54V%yOCA|QQ@$Q6| zp^>W;x7eAr_jx&lzS#=_odc-ZJW5;=otP<qW*FV&Pr^sRqvHt;ZgJb>V>%-b%M0Ub z>P<=uQ|FkC*@UeNa68Fty>)1TSMGg%^wf^bp4ou^$l{^@xPt~{RU8?Hi|N%P89a}F zxIHHo(+{mikv}R!;<&z=Yt9YMXwQXpB5Pd_$K!C{mL+mBh}Odu&STFi&yDH^IN2m0 z6!qySg<MY2s!#K%m1T2Lq8r^7z$VV=xF}!6SA1uhn#tR+43RqXQ*(i4X7Kay@dT}^ zD(yL+O%wlG?(c|PPc49%8DHy?MXK6*R}1f0l1Y58i&*j+#fSZiH5<Pf)dboT?3!7_ z?8$IL0_O|IrOHG&4(39G+>UG2x;(8Qlm)QP=FBzn#WVW-me(q&qf<9L!%<8!h^i75 z>c|nRN1mjbAJN3#49gZZez*?MZUv?3{sNW5OIM^x@}-iC<(ZBAa5>SQ860T0${XOh zWw|r4+BzrhVW^AX{;#$@m<kcGwP|sy=gcnW<8OIQc}Mb_syRQnBzt}ISU)LE<487Z zSjrU<4l;S)UG`B99ZgX5ukS~JVKW$o&I6G2IXt}I$%}^^wFCvUc&6O;P~WfKs_k<< zWlV{gS2eV~4t|r~5o$preM@krJf9jBlhPpFP5sGYky`UxP+co_m?t-Ly1Nf7BwY*y z^@f#)0d1Ikz~Sb}cQpQ6ExihJVHbpv`n*D$SUAq-@$XB$MLFu;L>=rnlZ9I-;;^P^ zmMHC+C2NQb4+-P*=drN52Rszq;@)A(QOWB7TeZ8A!_zgijGGfQ>Sr_Ln1#>jHby*e zVgvCwF(hqYx|Fd1#Bln8Ipe_k3J?)#=1YwA$ap5>#lGhr3Jn4ZO)22z09D!F7V#<8 zQ;z|75&I9qw;tp>v^*kGINv4-bn@cHh2EqjI8+gBa=AY~Q`AnYnKe`CkkzB1k0JQO z_7b)49mwR|FLc^UbUFlp#@0OY*Vn7PVSBEDD>k*=n~g3jT%=$nG)seKkJ;7z!J?PO zXZ9-iG-YUmx2NNgxU%mV-tBl*B53D0%YjNUY<oks9LJiCSeLX^Pk$9Bx41ny7VuCv z*BAU{@Z0sz?spr~@6DbCcusGruS-bR`BPT?P;h#H1rh<ga=tq4Fr+UU{DyE1@GMK# z@xn*FxHb)oo^gC~LDPRV?K4*Y?8|7yo|SAjg^Xp=Ubb#@%%w1CzZTwig&2Ks%{4K} zE?=8n4j?x^x2bsOoq$B-!2U(2ESQ$`sibyD!zdJHth4O!9YfKcqV4+a_53|%X<GZ2 zhO}yu^pN8qrk923Rbihu7yK<OJW?B&H+<VZpJxo=z|6?Mef;MSWFjI5{M5f85o#TN z69pv4WRb)PR7hzxBnn(t1uv;*&P0#dF^0-ESor&Y!1j5fk}#UvQFJ@;GLPs&xQIa| zI5aS9=Zw-#@Vg|&hZe)g3KUCe+i{20RBp|VvTVrZz$Cv0FDR_*ZW-m30okc6lDA}+ zi<s{IDrxD^DhcqSm00GM-2$_oSG&PKm~7sz9D%qG($2B`Nw(;OF$V>(G~tH9i@___ z^MmoJjk@oZu3vO*YCc26!H4B^L99IB^>eyCN2VA3XEciba<3SuSO{(kZG&o!xfUUi zTOE|p(P8Kw?#eRdjdtIq4Cy>8u;%IHd)><5Mjf?7W#sM8zKP&%akYYwe<~vR2V<Zj z`RWJtZx6APSz!6T!<ykg6F&mnesal{?Y;Tlu(A4Z0oa!&^BW`sQv(aln?Tp+Nf<=( z67otV=Mwm+E`34xEF5;`>txusFNQ#h{MwEt1m;gnd!5D+a=I^mJMlfUIb}P-bL#md zkcTONr1!02hG~b+zA2lZ_dO|{wYC%(%~@X6{u+smN#(BC>N@P3=d1S{qFCw9fz~Ap zrTchvTsV@{{oRbLZdVGwE>|(ECiS>?ifR6=B1VH{(}lZ{?F)TDjL?%b6Pl_@%*w1; z;~9k=qrD#WDv7W#idUgQt%FhFt$~#LBr|h&{MN2AIVUoYUfuWm(!Z8F7*;LFI=eN; zbXj1lNFwj9IJ+ytILgUhzFrGv-bRPCvm0gh!s5x(0ZQ|%W2HMur$J_UduUi%{n3%< zkZ-$hJfG5FNeW$!MDWCauXD);fK<Gb=d5Q4gSYjIROwb&U<gpT)&IOr%pM)47XIuz zd+5nmZmw>OxrVM|N0G?YW?<;+_(drla$2>;&*vQ9Aqtdbkl-lS+l6vqy%MlL{$CC= ze*kyto_8~Uzkmdds~lAib2|9Z<w|IL2Q^N|j>n2NErx|<?TSq=do?URi*pVY3+e@5 z2V!&A4H6pTcdq5R@aCh8Z_|6z`VKF;)G{pj_4TN&d}Y1Ar6|#sU5u(lLp<7%$CY-k z$Kgz#yK<vosVEVf4wkfLk}@DXEwN`-0{#7|2N;uXWkZlDpLmTK?d{An5VsPg{Vdm6 zGpwxp8(T*)_FM>-eh)&lV`J9G^v9&Sy|Y$h*v6zsx=TxUH&uV9Q(4+;_%(`ASv9C^ z`{S`<3*_v4m3}HC`i?q=Kf57YO>snPJ19Nuq}Gv{;%hVN7S0AQlZ3*rG$AbeoWTMG zuei5sg?1rpGjeW%)eJ_5{lJ6gw%9C|Pb0wot|7HvJ7j29XT@6)G(&=Rptv+vE3X%D z=d3O4+7q@4X>_fkfoju1g{E@?zcR+`cKD>aaCt)%5_Z@jfz|OKNj^0py$ABNm;77X zIUCWQDU)I)A+U&bR5zF3pNdssQsi%OC+Je0gSJmITIJmu!zDjbg)FEdjA$+m52!4h zr;ZKVEvxMSu_vp(w$~3|I&nAe^_ghQe4||Z@*6V~)Wgk_p^{a~#G~eZMOeVYi@;;y zLA$RUD6#h4w{{GJw!6$X+!{td3?qo}-<EbYYhjUYG-FblwFjVVU7o|>S}7@FUVDzp zC6e{q6|Xo>YZ)_BwR=P^4BuQBW*Yf0Emb9&Al9y;7ilNBWgw$)YP?RKSSL8-V$LH) zJ6;9JRdKCEWGlY^tv}P3u*-2yLff)V5hj^cJR3ZBbTTtK>TJo-VNQ*rNS_IBQpQ&8 z-WFy%tM7yzF+F-;U)C`LTph_lf$D@NX5<8oQj2UgdY~>0%BEUG)hw1@v$uaE<ZN&A zq$T(q&${bP?mQRF#gt1~+#T?D!?BIti+cfieDMjU(Yjmo&}N`T_jvs5P@e4xtg5cE zm1z!GSDpLe(V#a25+xg8u2ZX?kQMc}x+|c4&=mg!K}w8j!RcTTvew@3p&Hd{!}#Q8 z!+HC<s3G#Q1}KuxH8s~nV%#5N5gMG5rP8fPzC09xh5IOaxXCnThP$Qk@DFta#=wE& zA+Mb0idwPi?C_3%)9r72GfQZvM78QskJ{RE)yfqtOo;OGkt3q8v^Q6KY{!*|q<cR< zo(29wn;ruwoSclF5?POjorsyvzFA%D#cdkz;5YBDsB?FE<A3#LC8168<T$!oi&^Q? z{+;GRf9<epaXIG?pZ$}>#kK?KyWFp|5GlbDW_F@zpl1Xt8_l*;e)`+$sm>==+D;}d zcwAqI@$JUDCpHk_^Nm;3bp2Y_mFKrkQLv*17v*rXfsGhtRk++RM`3zw(jBkzFB9?7 zu)!g@%#n<VKuqMCfkQcM3cahL_lQ(=6Mxe^NX5iz`)+jL7Ru;1lz#n}M;yO0czkDY zjZIsdK*cH+OmU6<@u(1@sluUG0K_7^P3)(0(K<sBBQ)&MP~LgV?-GlKmait+kv%yA z)-Yg=ESA-#P5;scD;@_aVdkJP>uju1FQ1;3s7wlqHEmX5?_f8Z{wWeoQD#xla=GBF zG|dqHv~CPMyZl0QeUqmBTC_ukaxFH?bVuN`>t=uFrD_3|6St!Ddwv5<r4qGSOCBPs zkye~jGVTz2>9kD(b|o?m1&2nEF`0b*um$~{G_Gv7%Cz25QB3B_LllXP#dt@mdlUSI zJFD5slciQT3E5MX;~kRrI<F%!twhj*xo$&w20P0y)W1}m+a_B|rTFA~mv5Ha4^%Wq zMe|#Ey~pm9>PwcjE{(XqRw)b6OBlWcabpUwr_KajVcIDS<+Sb+AtBej;@obR=fK5# znc+Ske<8<nwg2=KWdoc8Dm><Vx#%A2KI3XGW0EcCo(OIAE{2%+>T@GIo6L*rU`bTa z*ShAfOQ;31?+)gN371ZKv_`q~rJW4Ec*)Up@<Sd$U~dryj5289vDY}S!|Sn(iaZsz zC4@~?k+jjT27mF*+#I`lm4z>#Zp;CK7Toa)GRJh!R%jzv<N9<5mMJPL4t*m)|8X$% zpN*C*><uN4yZ3r`M?oJ}W-i;QP~ieca6d~F73&2zk?mSDM#gC3wY=}nP~%s2pe24Z z4#UzR)6Xv(6E<!J9?en3b#lQ*O_FJ2+w!MRhDCG%{6c=C-mO>O6Tc~n;QnxA`svuk z%>JiO;wmOs>S`z?&Dl(8we@PTNhoBsjD!U5$e(2j9D(byEM{I_XDtlbL2;Y28Ku-c zzDB85E#+ZLVMRH2Xf(`&JG&j5DY-PazBJC0;JY~s!-}@aV0g4g7J(?V6bx%Q`Vhto zq+1kp@F+a{qzwu4@OG=7W^H|M_<{muhF4}5?1rhYjnHJ)%xuS<kNKaelD^<!zbXvK zXfCCQYF&E=x-vd+bBGLjK8We=c_5o(`C}v0I=gK~`=Gbg_1T?b)gY^5GI$8IYj2i9 ztAXdHmk;OMttTG;cvkzOx2k%B{nK#NQtG=(``~yb$iU;YcB)eyiZ>Z27LWQvVuG60 z^&0cc6(_FL(p3P{V)z5OMBLDrj&ujB8$H8tV6YeL#K~M2ii_7tU-%pD`+H=1HE`KV zoYTC=Q?<I)zetzGSwVB_DxzC7Jc;o_417!0BCVwq+LAzLFyQqlBWV~3;d+|%(tf?g z^ReVbIr>zLsifK{Svfu=9sZqNd{Jt&UNa5)afqS4rTRzY%KD@+W<Z*y>N&y>;Z=V0 zRof}!?{b&-i))v0w-9N*c+jiE)|>2=<tQ|k)jPtQecEv_p(=Rud<4omMf|M)R~ zI%KXR{Y@9!_x5lt52D3S9Kea_r5j6otUgHhV8nE`^KK;m*~&}8W^qRy*#0Hc-ernq zZPzUN!$r(mnS<HEt=EqDcw%rNd{LB^=kfD-BNbh?tC;4Y(|yy-zomI6U=^8x!^dpw zht1h>ALd!XslcpoaWUQWf8ut<1LEFVDPduoO%j%gQHw|phUBf}=Ec=m0x_BZh4sa2 z3=#t)Ya@K35Io4gH~?RvH$vTyd|ZxmNKHf&nEe1{peiR{1l+q0-I?ph%5?_j@YY;# z0XI6Y?+`Sc=WAF>$frP)O1Z(<qsa#HKJ>;z6s#7XbHDl1?OvRC{`x72JhbLxZ+HAm zi<;!MVvY}svd1&8pg^BUX_^N`>`dYM{Xo)}sjy9$F%5yAbYYc$>#GlO3?P0>edmSC zs^s@amUlFoM*@s_{^Ce>S@32~pAuhfZWy!)l0Auq`B#JYBJGK`-VHi2dNR%1ALCza z;X(>hFvoHFmuB~QF4d4mUDEyITv&1R{XvRkWdX$L5*m~?F)JUH*gBOv(}U0{$2HrG zxE9TxHxrqPt1P}|P7IvrX(AS0w}GII+2(>Ck*J2qDm4rWS9HmfrIhRy(&ytx$<%Dh zOzbEmPStHO&^k@{{$5LZT|W<_cz?{TfUm;EJR{Ks@EujM=w8wlL2)G!t=BIFG5Hex z(rWvub*G2E9s-kKl0KpJWqLGg|N5T&p+uI0{!CO|y=6K4e&@{d=KFO8|LBh3ZT}PI z9|JH>AZs*qm>eChZHCm(bH2#|=a~1MzmFf0$n_Z+G43ozvic|qO&lZROA54NlG5rE z;D?MhOz0R7+0MqLFKPJZS{L&ZxhbDa@*o8T-s)+4kgE{EbqNCwEz3$!)#JzKgBfv* z_-s=GnnfI!Le$l!-3<k4SQh>l1@x9}jKGeB^-Arg-vd>FqCCn*$MYIHNfe}ut*idB zE3K8riQzDWEM8JzrJ0a4$QytCS9*B|;UIdF_ZWpTalLvJO?JylOl^l@EMXi*cF~ZZ z^;}K=PLA=f)9Ua{Dx?j`_(VRGS(4eM(Wz39Rmc&&HrsN!%;?PW!CSqvR<oi3N+gke zu4q=%O)GxjxvpC+cc$*DNW=8(`r>Tv&8r}`nOmDAHD?+Z?wy}C;Z>5Zn?95T{Ub|9 zymtA%m)M2Y;-t@T*AR3r0`B>~7XH(nh5T)^8g?o=glj3lRk!|LTROHfD3EXQ`5}aM z0T>e+=%cffOeNH*v|KlflG&^V&5_&ah8gDk!xu$T+l)>3)kPXdMnw4OPJZbV!-KcF zXjP~yZ21pAK|;jl0S#vQvqK{QT{#ANJk}QumfQE_{3y3bhW0s`UcQ~VKrQHl2Dlg> ziLnl`@DoNFKMzVRhw{I+p@LyQ!n7+l=|ITY$uO1wy%PPOa|l>JIN~VoCm5FYKRcuU z&<zHE{+TQh<V9k!Q0|lbr{33}D;{}xMd+dfx;`-PzWw*PVI%{QD#=3s4O(so;8*>- z5RN?s{%gR<k5{+~YXi-lf(EGg-mR^>0)5r}*ACDRh2WenS+g>DV-rrwGvXhRCQ_Mm z_32N5H~!3%|Nq(r@%}WN#dtuI!q&vH)UVeJB9|k;5SZEG`q-G?@<o5c%eeymudC6h zeM_Sc!+ST^_}sR7{Z`Om{sxflcB6TA6o>%K`skD+kkuv=&^I<O8A%25fAlZ1JlV@@ zQ=r-t*iVSD8syeP5I|fy1seu#QcJZ*%`NJ0!;_@J8t*$8Rke`_4~m|?2sDBSpJEQ0 zm4|oF6_REmDZP)_5j`j9!{Nl8gQpYkXr!PB``#O}#3zr;-Xs6nIwlKm=r7F^ZW;b~ z!0t+U?ct(at)7i&ykFMciK%YTP3`R2@La|ThAG|PR(b*9izn3Qx&p>RckcC%q7fdT znN-bfK7!kf9sNwnBKyNc{q;^e)jlaP@;@4u0I(R2DCJ8WR7;BL22oFcfK-HZq+aAj z>~BOXj=0e{hdj2Rw!;occI=)%c_l-g;P0Fd@nq~-q-3V)zCuzS$P=1Fb8peity<FA z^tESH-LDQsU6=j)H_iTg;&Q6GqXYRVjxX)~(|m%agKqF9%f3wv(fuM<BWHKqrO}9J zG6<#pD)m;Z^=9i{z0YedCl{v?seB<pLn0sFtFK(Q33h5NAaRhB5mAE#_(=RjdL+)u z8u96{H1U&KxgP7)T-i&gQPxF5rQ{tvo8}8i$=(W6bypx@ii?{NHZ7F{oPWJ@Ef7JH zG97@&<!t$UOW!Phm^P3}64FHiXYCk{xw&Oqv>S^6$$9uLSREgBgLXUz6GulE2KLdl z^z);{%6NT<?1v4Xu?JCS;jB1;sW0q7x}Dw$nN?KPZ>~ea*;2M+2BSl2?#GEc3^hgp zU1WDM>A#WWS>Aqpa}0aPNc$}R8)&~A1nS3}<HUXlSmd5C2QW+V)U+@XPhv{Yys{*- zE0Em@a0gH01lwrPwzYf*PoM1xVTmfd%5y`5nKy<z>R)yEy-;=A*CP{CaYug^7MR~J zW{2%BgV0B%h=yO#^}@S(Z!wS(66yJ3lMc8Z#f5=EAW#Gw28VjVTCk4>CTjg4O8-K_ zUKTfK^6?XzyUtzP9hJ6|5%~c)XfeQ}Ibieqd3ZeJQ|yeXfx)N~fKYBZ{osH&wBp># zT~;uEakmKn3#GgJi5DXZXiT+Z6dtzo_S#Fscc`oF%UI8N&>Hv8s|xrJ1v|?Ws&AML zpmgJ(aEXE!ph8D;jzDsKm!RQ-)YGQCU*SHD6)=375cd#&^#fyt29%Hz;(=r)0j6e{ zl9q{RU4fgj{{NrH*FWnKFn?ZxT<mKh?^r-7YlFzFKP9_%Uc#~SvsI7SKC$f7fRp>^ zc5LJgcRaORVuR^OuNP~#)6WMNIvnTcrrF@c=bxzP!3=5M>JSd1QGMPBd}D#vxe*E; z@H}ixR1KkIjQvpOasL1PC_AW$XgUAf{6#uUYp50Z5LF>87?=ar;&0Hke+ro#7J=oG zC0;4Y3OmO@g5)Srqp^X}P%Gq_H{yd#nx)_j&dO&zYn^5sppb>l0VeElw&JM(EL0&u zN{CNY_XayL*9eV~=#$}V!LseX;qH1nL_S}s3zj=usu<w1?Fxmwd_%74cqf`jWr*Sn z$-?f*qRiP$A@gA0b!TTFh?8>O0J_9z(-x-=kQ5;@&u)F_FFJFhrDkgS2br^4;of3p zW6N*li6!g(3VIiDj197QM%BjPutPWp%eik2P5!~9T+*PXUyulW6>rRrO%=R}&2=nJ zIz)RTH^YpsFWCVHi51c%dZ~{@;6Qb{^Ko|86Vk<}9Mz6(%YDZgULQSNVeV+ZT8M54 zNHrW79=`K)Gh<Aj#NaA|GR^1$bNxK^z22>lF>+8q+r95NOj8EA2za>Wy+-Re$AH01 z)3^nU6ijorGWVqo?*;ej3r2DvLX`a~M(Wk`(-+=;=(()vUt5J}?@UKHlOoP}7{12( zK~#fAfzueEbjOs#TN$HDw(Awwvi<#M9zDjuw^u~@dKJPs77ftTeah$4$HxVKIDu^r zF2+~yO2XHZig2q+-QCz}j)(FZt}<r_&ui>sfi{Z!7yzT6mTtIOG*bDr{=#UXaLtpN zFHJKB)l%PE);%1O;|@1T78kON%tOn^@KfJK=pb}Nxc%N_O8u2)6o97G2(MKSD+$tq z7pV|Jvog8bv9-g@(+Ib1Q+<4${XbVP03O1WHpW^t7t*oPz9I@aEiIxwbg!=r5dJ}8 zU~cO-I0q3W`l@&V`wz-Vz>bFTBTg!A!Bo#%$fmZF_krPh!=~Wfj$uNI?9POShUWRi z+Lzzj8QJH4Z@lI({c82egtV;^-iLhh%p^e+u2B>;p*QUO+$p2M4n7@?fQAMYBESz? z7p{$W!|%}78)mWNrl+y^)*D$(+Yaw9me=gYP8gmoip7mf5bE@}RA`NX24}5DfCLn9 zA?fLcJdTd8q5UUg?wO^(If)s%6h6$R1sVhd>Q;;WmIWz0rMlS`qRX$P1xFsr4&bP# z9q!;rG5Q2h(c3<vrg{TRQkg#;Qk@*HM<H2S9#6jpPo#W9eZP)Om{}V8TI{&Dnum7c zpQv*ah`T_0aq@?RT#a}3hGFHIPp>2VwvsZ#*dXec@^mAV)2aBkfpG$@4#&ViRK*W* z;F5!f{KlJe1^#ab$Kk{(YGJJ6{XTRPF18HYydE_*MccsaoJZh_SCpI)b-&<c#!@FS zGLF{?!7AY(lmF0%lkTse!9;Jlrjg2X0pj%{!9&}5tZKE@1zQCGE70Xl!I$!@C<YzW zmnY`aipltaI~NZ@8x1;3FnlbG++28kGgKgL^@F8$PxuF!gOEzmnb5w6JCrss9)Nn~ zWlyA&`q!^#@dy>6>~a9^Q{RD0PKP1BP20&+jfMlg!MR}S4`mv^0?a3w8c4QuZL2VJ ztjC9PqS^A>zVbSuN>zb!7JcO@H)$MSc$?Rq4>us3V+OZa)FSfTYly$Q`2<tqH(cGk zGvG*SekWIevh9Wiy%j#AyAz&CP=-a!aB68gOpvdan-fA@79M5R3Wmx7I!T-n848T? ze_<DVj4>G}oR6PE@pzC7w(B-JpZB+4H}kPcx_t?rxejAm_u!;iFT&I+di1Az_Pc-s zx4WdM=lglvZRgcz253_EN<L;R)G6N4NH?+}nhm@q2t_0oas51wp%VYB6HBC}52PW^ zpBjLcT0z8#D0N$B!w)>Z?=*6|YEu7VJ78Q01N6J<DY@yhx(*W>v!<Y14{5)A=VDYW zB4TkzQ6|BAA^Qjwr&G}($hMtvp#;8-HeW>7r}ueFqN%lxSbleF)Xd5@j{N|)8WNL@ z*MGDpZ2|C>BEx%=;Kb`BLyXx<^e4BG>PK!a-tp6#vpc-8w|b-ZhBLwq#ltEXVpqT= zqQ_}!16drI_?Hm@Zerj5gR&)c8XElkhc54}?a^0OBUq~Zz&TV;0Dy4PpaGG{bUDLd zB;;t11~?}2-EP?(in4)fR2wQv3O<2z=Dr;(s;}TaH{<p8@6e7rcC8GamqhM5TNrQ_ z9iRNVa(!vb7b43=Xc)tPcN#sn?cG-Lv1vV|8F$;>PHQ_ShMM6BXz}zg+UykTwRC6j zjd{fTsU`HDWTYaj9FMO!P*$zc;{NUMzyb6(v)kk_g@Dp7(`x_HXE{A<5SJeNZJ0!* zPOHy@S4Sy7N{`eK|Hrx3#HJZpHwGQ`&87EubInn#+c}Nhi{r}IAo%?Cn&nmRg~JUH z!weDb`^$;6?Y!h9c%5jKV!@shgGnZo#d5|3H#M|S5>~H3{+<Kpb1A^52oJw{%kfcz z^ai`en#smE9p>L5;9pJ5Pw*+dF6pcUJI)NZSH5Z@DsQ3%N*?qI5`8Vra{KFTS+~@j zBzgN;O)WKOOIIpwT1a@Dm8rvZiOI3`p9PX1Nxw*;)2}~*b!yhEyzqOyk71L>Y`3iR z*1&j}88ppyALK37vvF)%G|$ZdmIB_6`lXD%6A&5;r$#j^D}LmVIEy?^Rm{gT<_Mj> z|DxRg28u}9K!7(ook7J$B5rAFO146;84mi8xhaq&6^qrAyy-$as3>{Ejy-Yx%c2Fq zs(eWmG=K7EP!Te-3r<!I8Gu)e(nwm;fbn!3&z}TV4MQRhXJ%u$v#tOnSA!C|DN7|K zLu<u^h&ii}!8J&qpUy>^En)XGxSQe7I*rxikj2C9ubR!006D||J@&oZcJE&1W;)<y zVQ(kJdVL2o0@EKo7G&xhC1vZ8CZ>};iKVT_=N2a85+!B&uIh;B_>eS87H^N<5n47J z_?a7!`lfj+{aHs3@ioM@Hdn6)wL`*A4UJDfwvhoTc3_g){0Su?^-~b8#mH5vkQp+p z?5FLu%?o|6w6-WP`Dki$#GY{E7obyclox}=eHiBH#QW~;$l&>V_9=kJ+<(qY|C^n2 z(&?wzi;;G%+Rw)UDkJzTh?J5zcV#<vD?83CyM6V*GPa1Ke#1)t;j=&Jv<=P81cbeT z8=l?0{x9zA_EYQtuYSb^*7HB}i<6JXCS?o#pKy_eip;D_so&aF>ZpG9dP9rZIjI&J zIINfWk?BI})S(P6nx@q>W^oS~2)3THT=?tVFU=wDrz92U5V|2?ulb4-W|IBiaTF-{ zMN6A_M4~NA4u4)P=7pnTokL%O^=Jco>wpxOnd!erhEBw=<UbWnMrOZJv+~!z#)C?h zr}bxwju#B05^|0Hl3OHZv4LR=giSLfBz$tM7+H8H9(%?H&#X?&^3*_;+%EVNDGEvG zIwwefy+r^7UIa2;Ic$|IYa^Gwt&9Hn<>j>tcoxc%U;DvQ&QDSCf5iR&O#_2E#`yyd z3H~;K4KqvAoga1y3I?=ddp%-85lRn+5x-&{CSU7;7c*Oxh?Ep*Micz|@u^A6>s&oO zCm$ph(BL%_jj!d@in-a^VA_PJ<u@d9vrE^Pj^|SU=;5!vGh=_X{9Fg4`0u^lbUXT3 zI0)Sffnyes$Wyv_r3cA+O|m9S0_o=doc)1U*nif3qjMGAcjROKKNG^rs)Cz54Di|} zs@~3(yD0JCzL7=C%$j1bw!lzv5~y_`A}fpa>GZ^sDu4c`vL0nHC{0{8Qmk19G)C+8 zG<r&Mcrhg-G`Ov@W|i7%OZlJ&PD%|ngO(h*&}xek4!O0fq{3IPZ^yt}yL~a7$)^D! zA^B=>;BLjq2lMc=5m%|IWPiL!TRs^7vlNR)0C6iHh@JaCvo#Nj^pEws5Av=dV~%QR z+Ruj`3(FwMb-&1aV>52eg$34~qU?7Vmvme<U0*Uh&wW{x=&1pt>8`-9kF$Up^$IUN zluVsAGrTEHP6!K@MFxU$e>j>8$XfGtNa<%6fnv7&a;fm^Xyd?<C<@1$1hMR)E4qaA z|E(0FBsw}e?{R@-A`(w3xcnX-wH-f>t!xJyp!4Ih5_?iqF3S5ZI}d>VGlGJV&_-fM zgv2!9mR(vgbKwq7&PsJ@fwTHOK}R&bEqOR(PAY&DF5gEtY7S@WwhI|?IbenV`a%Lu z(Y;9lkfun|YW1rq^(p_Jw3SDEqV+?8`vEZTE%&5NZA<gN`M0*P#4_S2z2L#U(q%-) z$arg#O%1JwO(sJfEKr<J#<{k>W5*73v3YTPR+WZpZgjb3^~}2;QRp>h=0BJfJXox~ zI3Jl1*MG}vYqHS|d1`Oe@{kODc`_l%m6Vu-!5nw_KUV=_#3(GCabc3J5;)IL%U_S( z4nl`@eA}gkT|^^GGIHC)2vtd1pW2aIe6B=mSuNncU!uATpp{zT+^r%w&&QhY4Ez(p z$8s1Rd~Dn#`o8QNZ0wFDpLf=ZUFRQbsK+?c6mZ?26hqv1IMkTfAyYi~`UenY_!!bi zL)nfHWcMa)Wm*wzd{ime{>1+?;dv9h4ETSNE^4n1#a|rnTw1_fvV7lvlxlcR-E!7{ zPzy#C0d_CEmMb~-y?avak~J$<YQ8Us{USO+MM2K>cF0QHH~Oj;WWM$n2QuZ(XNL>X z_rvL@z1g>~z+Zde>U7H2Ejlf)$$B~Tbg<1Ew?ZW3q&FY4J;rdAnJpjD#c_$O*priQ zadGQ@bGVQS8NQT1ii9gxuR%7wj}!_D3wQftRCi2W-(@dXM|M_FTRQ{ONf;x>--Wkt zn)mS8(DEz9S|kloKZz1-nZV;C8w@S!;;4AY7xjR-l?=3+3y~-8sQLJ&UA<=R(5nIw zZ7*HFqyEs-&z;@ImI>Qz!q+~GDxwrv!1IN4PLmyBddr?j1x<q5BR`QV1n1@p3d?Q$ zw|G;7(FU{%oY)bXKEU`Pk(P~p+oS#g*V)0WmSDw^dd*$FYfZU`&1;<Z?Llh#FE(Qk zFs=vN6Ls-rQGvI(Wx|Rce6Rlw*8M?d5dbQ>Zm54}x95(<wMpU2hY`t4_!y~}`+JZE zS6qHcLGaJ_bgdUeARKoFur?NG#f`LktR^tnuA;Ry0vRPPC*>EN*VPbQxzb{dj_1DX zIY1WOTcva6#@tL`%ZW5`qOZ3gz26mB{P}?$iO&cB<+&x~_Bp8b;wXkRT&1&9$OjhI z)F^FtDJFfxO|j=Ok){)w3aa-Sw)C|dgMT50hup+t<m+`u;N!K}*z#ExW5=(H(sQ#a zKIr3hK&Pzt3Z=zm6iWdaDq)<J+>DR^1`QxSGNjJL3jnR~?edoVc=C<n*{6ZCR>~Qr zi}$YJ-<3ydA(7RpJ<CLxVU43nPb0DZNh7|{bx*WeaFWk+9Elr2dNdI)QWE*a>IFk% zhib9((xjs`Jn*){M4z%=m&&gPv^?(UZgjR!t?6;CI5)S_*;vaL1)2>3Pk7s2^+Qi* zGHBqPqEQ#?%X#aYgr&;W-)Y&}TZ;V%Q!}DsA_k8YIOx+SuNfD|o!LAmCZvUAUC7W| zBqiuIYh8U=8eZAW41~ozA#dv>wtoxeGw_2V)G5N$xZk<B0kZyd{RoV_XGTE{!jE)4 zO_aC={B&F-R&TyQ1rW3OaoynA)(^A9{GgM&%!p(z3b8O&U{8UDCPQ+C5TSc&?zfQb z`D3!hwv|`GgkKEqrg;}<)|6+>mkv}eg`Y${KZm(cLm{OYGli!481>W@<2@j+d=TOH zXWM;{mqVbR5t5Nb#^6$DdT@}rc>OeHAjlmLB#<4r9Y+fZErQ1h|4D~{R+ZsUaS^u0 zsHs`-vI6w&g^&C@4U#{diHr7WCQDMA6)9Y&;Uqb{bCzg?N;d?MhIO$)V}%7qZtQ5K zC4iVKHk&vtUAIowhNh)HvjQl_90g2y=Nh;s8#b-Vo$(%$^2+syudYu9UC$#PC+9ax z%92G3zPPi&%Q=hVha0QbbO~J+Lqj7sYi)m|DF;UK?M1cC;WcM$H$8~H$P=aOk^U!x zhvKW<+_x`kx`&&)b=%${=j^>C^z4Ci4W|7<G32M+ie^8h?6nX!$zj~_EP%d$B~-jO z;Y~Wh7gaMk$#!}9=bxS)9v;37a<&!Qc6@wDzU)U&%xgig3z%H$pYbXn--q#8UBJoC zlcyn;y6%5*n$X$MzpMI+FeFn?4hi^Je$DW-0wCg)_DqGKgkq9%qMu613UmZC*nTE< zQ8t0O`#OA)eANbB*b?uqy5yJf^+Z22d7Q)Vc#j4Qi`P+6Po_oNKPtX=j*`(q2QJBl zrC^)&FU?7M0kh1*($t-G7)`diy{9nlhzczj=s4K{u~&heSeCjUiQZBo@$?@Azq5j* zq~Z@CX8m=hyF+9gsPe9ttp(jnJ|Lg+O~`e9vUwfj^1i{+Y5t*>$QBRe6qV=8P|@3Y zn5H^VCBe|=GcL+@M-8uty9A93J(GfoC2EH9G@99pX#M88Pc{bE7Yuq(=r%~m7LsbV zjv9J5#ewYmId40=u@U8%tn;msEGrB^6p6`$03QN-0Ld%zyA731&lzZSg()_Mu2;Dc zInApc0LlV+9g)59C(J0~gQ(qsNW&S_=X3ZdF5Zp1LK<p$@k+>k76k*2L|IvSzb*H- zzuU$TI{izFg8IX%+Pk~AK;FaZ*SnI9M51&S)%5prULRPFRSgH&me)3XgN@fH2g}eL z@k=_zo6&usZ-{#wUq4B_6p_=fTX-+#?Z7IbojgyH>S`2BQY|4~S+0W6^PQVh+v>sL zN~LR|FY)Ue^Vq7hU_z7ZT^S8}7aO<YBed?X0TJDCkBT2PP_Z-Toiy1a4g|J^Jx?3i zJt`GoR#lGEq8bCqka!_iK+fOdC($^G4c+kVxcIiBUQ$<cPE=W2YQl^C#EtZVt8)$h zDDsO7*V=FKSwPH6?b2c|_oHy+(=w7j#lO`3yuDah_aC@mpZ|}yw+f4+>$*jQySux4 zAV6?;4Fq?0cX#*T?hxGF8n@umxVsaa0H^c5-}mq5ob&9PeX*~4T~t@sS~aVB%`wLu zV|~R-b+>0u{ua|PP}b;jywc$$1p`<{1BsQldw-NSFd;mjNnc9bu}VSX@OlP=<KkHU zHoP3J%QS}TKf4>a#Y6z>LU=04Z8-f3MqQKQ=M%aLgloH-%(#U{GdL78ab;t}bBRH~ ze%_cX`Hkfu;MSki`AL=n7z=hEj9}=sRTH)9K778wILM}a_Q7Q!%>cOP2arCrCfk`5 zs%cJ_(i7Z9!Plv78c|*^@m?8EZ#of&>N>4Pw%s)xSlHTzF7JgZlt~C*!dX~I0jhhS zdEZ?=dS_OFada3_Y|fh=*`9}RQZmP13()n5I(UelUVGmWs(A>ss=*drI}?(Vryz5j z4k#GhsGXX%<^v#^9oMS4#+~~pK77z|bbMmhjd1SEm@m=V?lSFq?vLJJbsCVW#ObpB z%9C1<CRphHhOJ4-BGhWxRcLp#K!iwSkkr%`RaJ|COnVEIRM9_<9Dc{~H!(^ZJi=;y zt#K%Xg4_6X2H=W~I6?e_HlY}aCy=WXm8&NaR2NTIyhxh#Bp%-RU|`#JOoy??dul<A z;rZ=kfK^Hj0ezU^anO-BY@f+&qBqI6*9H%#NxzxY-iFX>$#;BH1%5|sMmVUgBpB|L zJBB`{fyQ&tc!1$H{#LEsN|9C889reS0BPr%)kO(^7Xi#USNSZI-j|tzu#hUj>b0UM zc>C+Tzp8|hw4?K96TU()9NMB9!R8Oh4KAClTXGV)87%4n&E^4?4(-TA0$|HnMmjUg zSEF(iu-R{JF;RbOA>NR_et!5aU`NIf0`#`R=-&3^4@`Uke%Ge8GURQwK7ka5x+>SY zahx{RO=MJhk?V6?-;@?w8nIyrBS#}Iah{Y%isJd<y7l4-?7Q#~6taUK9(c+Z^h$-l zupS#H<b1(X$b#GQ>w;e1y0iZCaOt1l)C8XD#>?r~i*)7FhHl^Wil*mvZ@d0_ZQOR5 zs=xi?J3;;|jc|!F$fFa>v3_i3ykrEk+()BTyI~Y5BnbQj;|^phb}MiNY>#e*8_HDL znu!qnH~^~x^}uf;|1$OP`t`ZE)*F|~e<R?|`4z3>z5k(I`$l?RF8iwYEnPL=F>f7q z$Rc|hs<{`$kH*DmH(^UCs_KTk)T&}?B)1n)@&*10(IdZc0B+fc%fb7SmZQi?eG7$l zHdy#lOp{hhQLgDd8{(re(Q_{=(TPjt`AxIo6Wh5Uk!-FGamjsjDzrSqqsEM;?vf(r zgA^%3pyKv}wdJ<P3}+un(o__FkDzlGBN({e74LC6C(g=w8?V>*L{vheI+9}#0%Q&e z<!xf>d0D3*NVU6_-rhvGF}T3QaT5%e2Rkuo?a-k)JQv=c!kjnLVX^`xJ4rC+TW|6s zC|arcqGo|(@}d&n+d{#JK0idFF=&eOhnWXrI0~bCPM6p^5qbvo>S1g9uHcX-$ibnZ zf;F=P(>_=f9iaZhmzunUs1IEyzRPS*FdEhy>viq$jl9}{vRc0Y*V<~4<z;Qd)pimU zEuuEta}&%FYCt(xVZqI(x%u1tc|4CMU>-y>!R(xylHI+cQ<6*IH?^g;)k4aGi!Fat zU0vTT#UAq^+w`?2@WxvI$mpe&H@FQ_!`HRtl?N5y#5M2II0;dC{nnGmo!BvF<<FiB zrH=KTe=YB-zq)~xf(=Yj?6{}T+|R}he(|CSp47vB7Vh8>EH@Gs>{5+_kn4gLv-NDq zNLrv4cN2}A@CPxlJ6gJzh|C5xZ;oFI$73dB5=MGfp}jvvkrjBbJ<f&2Rv{<UMVj+P zF?!pL(GV~?jIsMP<SFLZ3MK|s>wYOe>^=TAm(9W!w;HGht;ZI~?{<4_gX-gt`70$( z+c}_r&~e*~I|F@=kz2#jq*m7<q>dzoyN=}M3Ej@}IK%0WZ@8$?ju9qRtAV;0e>p?| zdH0qoMU7a;m#MNCo-RU1MF)M=!iL$v;-p6KqLxrOrP0P&Luwf((TG*yBifU20gOE$ zl!33LN1`ltIHn{6eH^;trNM1@=SMtEfn^hZx)E4-V{|9{s#XQt?0Vc#5j!jWR7}tl zWp;W>sB^T$PWTVm>mo}Phx-LMjf9lIJ#-8<3O3@QoBElbu?~$y=e%_=Kk2@*9s?D+ zd!+2FCBL*>yerue@wBe{K;-@5Z-XE2pekcbPJ3ztxhrxDx<XuPyVZ7u2#dJi!snwD zysk05Diy=79W5D1o|0>pZ$?^zJjXnRsQj*mG<DAX;+phX>pKq<jk#`OXtbY^lC~B5 z3=sH~C)_d0mJQ(f(ByyqIHPdrgQolWiwjq*+^eJe>)c?Y-pIulU}%#-{-r%_+$>M~ z`?Xi&p;F=^EOqY9U~7J1%V$++8zzw|6kuyo`jUEKW>>9VqL$}ce$UJD3Ra|fu<Ym{ z`-A8^NEWw*B*8#bK+mn-GCC}@AU>p)xLB-sVc3Eahc4tya>nWF3H|Mu+UI>wq#qus zy~pU2=0>$Joe&BTGYd!UygK{)EVsiCIvP?FF<8?(6#m^Sl6mpjN^h`~UXkYSQqmUt zvq)*>bW{b2lI|uT`20t1ZdC8ahxwm<8h3IAPk~#fQiJKK)|)+PGr4K0kX3^B&c%UO zasI}lrk_Od_7_16J*XGDuC&DbIBe8WVRf;p%q|-E*BhxghK(re6+#LAoVd4Jo6l>4 zHz7^iR`5*Kw%qSxg5j=$(gsP2?s(S^I@yb|O>-UM7JtsrbzZZ(BA(_MXmdKSsNM@# z@_ORNa(QDa7zlj{+ea@5qRyEuF8RST!Q=mo!+-rFWiQE_6oJH#3MqU>@dY;|Uod2p zD$%<Ca$Ai39U_iaRRcF*^g_BL>YF%(!m(cnwh{!|Vfa`9>~MMHghRhmow(fxcv?iy zC_g6@GaHaRO-fcaaKcVfn}XGQYNdR$9=?~S09Kq%0(VhD4=oV6_WqMyJU((7MC^mz zIX5sSC-zr)Q%hk>34-(xf<s*?*bkcAh~g(@CFKp>hpv`5E1%xIdr|B*G1^4gF;i7> zvgA=JpGBO}aBrq-j|3^Cu;{rA3s^drU^oh&w-ZSXlpm+?k~CZV9<r*TR8%GR&Hf+7 z&BiL*=uW=tb;RGbwj|+LZoA+E86q%|2^d+)XITt@!N%9V<vPcAG9CC<nJXw&#KRVu zN-zP*kZL$PzeT|HqB0+`QyXl_Daw;YRQbkz?~PFlq6MfOl$+_Q`f_r#$n`%F>w>$N zTbPJ6HxC3Q$8c9YKOhwke{%1A{CeqOjdkg<$N%RhIOXZ}NPmY!zZyUy_zv0ox{cA* zZHlv?g@m0JGkifaIS`{<RByd30iw=8*Rz>%v|bK8ZuN#L_B_$_tUOH`{!MGCba;D7 z0%h+!Tzq?0W@weSz|I>{{w<M%iQ?@GZI;VTrlws>so9aAU)XBUu;6i&XD1gx9VmBW z5#`F?GtC@K8H#A@^^NLtgg;u+G8HDd0?;+%KZ~2xW`9Z+z~Q8)r`pAO%|W4-kWHG^ zLKBX^{q({{tK`x`3wM8zb*-8oUIo)Z(7;-NRax{+^aWV@vl`he7@}T_rS!lQROnG0 zsGa6PSf0#^FWI9uGMvTL;rGV&^Ib(>XSK&xV8joFv$W(JyY5)QaC~0SQC0Jaw%zK5 zHs3Ip;#vZn@Jl#xw#{tBMsh)=!0*wPjP$SIBP0EF%Y=k5ds@RX@was-<}5eC6)(ds z#XG>B(ZPBTf3MqaZS!6Zu{G@<c4x>g^h^TnVEKuqq32Lm!q-GOpo?Gyphp5%iDg54 z&h+Ro@IwXeZvVW@E<Z;!33?j5!Say6qY;u)IIv>+Cxekt5(Ix3pz(8C)pvB+U9-Rk z<HC1}&`M;vJe{m-rsqxxaOttA>fv7tBQ>id)vhAgPt%$=Eg+%1*47V%eQ3WjHA%29 zEpU!m$H%1UKXH}H=P<TX+I_6pdq}g%aCF{Fa*fJTl@F%-Gi^`=pCh*#*5J_!VmhwH z>k9v+a<CdmB>lrTvX8?~tQ1mSUCFRaPfrR73h^)*#6>Ggp{Lf+WnR#>Ew`~Bh&xpC zQC|*$$l=ITGJ$*8ctLrZS?>53Tm=ODgX|;X#BnAvMDX?h_zzZ1it833RRc1ksyY{2 z7oZ~<3!BMp959`fC7E!hz(|on3I;${GXsm=EkK8Xnx2^>q%N-|LAHI8ShJ{Y;18}B z_kDI(seh|yAXb$BKhgK^m=`oA{La_rE2wo|Xyj3>3^LyPdr%B!$Uif}-TAAJJpi=> zB8~lX?tfrU10cwB?%zsD;Qzr`CPF-U@A~#vBb$~T5nGP;O+1d;4ploHD&m*I5RhXh z==#x(21wAx?u~6uRsZbW$=2O=knFBy*{7Bg_(!lXccXsfDo3act^8{TNXku(ny90| z=jS%=*=8UYvyL2Gjb$z1fh1VzK7kOVOx}L)@mSC0Sle}%kWojtl{;8NDo&~HkW5An zV#OG=k&?HAel05mIxS}#qb+V2zU%cNy6vTYgf(7XU9b~;+D9EFI=q^L+VFj4;%3CJ zsqVjXw*c9jID#=}fvhPiT%YdGNcJ{Yk<WKz1NfJ$`08)ub>1HIG%Ny{u@KC$Ze4?p zjdMMbQ}x}xrcTNwrG?~sux(MVFC01l3#%i_a<H)-3Xc8;^WY;+-}`Z}bWPQ1fn763 zlW09u`kiD~Uw7`-fT#16mCPPrVx;~@se7UCn!tJT^7H60RHIWu1oQcdQq*7jR5>j; zyL^bRT6K2TP%UH8lK7MkX@mA7Sqv>Af@g@Bovj5G;(8~FPGmA1O&d708!b!@rwWpZ z_1IWnI6e1zXh9g|RNwiSic+CmsD$c8O`zyzf4Kcx$R+EW(Tp{>^^V-udr+%lZYb3e zQ$I&f4eI9UhQ%qej=D)XzQIRPd`S_ORkMU$C^Z9(VlF~)K~LD*#1+)bar>9i9_RHP z8zE4Tp?Y%QGre;CaZj2Z^b3a?;h+#m;-yn#nZ6Il%2DuCLv?LX?9oAQ%S&lgV{q&K z4Yo>+ETY<CjiUDdf&GFs^_UVvZjL5R(>NfC%yPN}IjgIUYi%D6(zWHRfqvLAp_&4R zs~y~O8r!^T4;(Euc1&t^7Aa}})PX>jXXH0k7I;1UU&5z(+^YLa@~)tUvb=r-`|H#r zvS)x7Tqqc=-AhpB5`D!a%R%^^iy{)mOT0m34OmSRxbIdpQBTjI<MNuvYhvk%&&IFv zG3VzwFfB-YNs8s^-AnA_hrp<Vv94@nbGISHskfeZ8uv?lA)$Gs(_9tAXrMfV&?E4d zcLYAq@&d7_W%w{72HF1_=NyCVbt|u4Yf`q4B_ni-cLSqY27N9k9f~~H)IB`p=>!VI z*aaJ$6$d8FaYU|8`Z7OyBJ!HY7{F1<A0xK=k#+W6$BkHVnUNWy>P;*;k?Fw`a?@HB z<6fWvOH9)19v<Xr=iss<{pU1Jbp3qGUEzW_P9!Me`?p8z{F|+#8xbDV#ggCs1Bh<S zuP-7E>IE<n{S&kP7ji`RzPWFX!-lgRw=ULBHfx<lVS1?9)-<@qd?<9mRcqiHx{g@t zz{boi0Fyd*bd8pCC^c&@2w!(y2sKJxjVdJg#xHh@qZ{<x{_eh^Rd@FMSSM|FPnrjF zfN@&&0$=N|N7ovcj9T0L7u(u$?=J(PSHt0s&&?9&-6y>yVztg@wZoa}f<u1op8JT~ z_D~W!-&BLTa_xW)`CXW`cMtwZaD^TH*Pz8CH$%_m_XqRhNLh>W<>lJjxL><T+K4^h ze|{QiS4p&WFy6wc-JZ)Kx(x%sCh}4e7LF3(It_9z(J(`hSKA;^(eoN4PKfi-sflyE z7WPwS{%QzFB_BNJJ_~4<;oy2cjyOklPvqrohWxE`@+ivmmQZAck(*Q-k$Na6sSsX^ z<V)@MEg33$i&GLhGW}~Gv|!@s5VZ&b@8sYd15KTx3S}rJTY{fd(1Zq>p(D|!?jE^? z*KRlF?Kyl1u`J3{pgBj-F3%^g3p`gpqi<dpKV#qEEKmK}Y!XkGKfQorQnvPyuClTf zS3u|GLpu@DPNFmK`T!?lxJcp{K9Tni=ubsBCr~igjaq?-2s5c}b%zx{zjbNv2g=sS zRo2T388$^O5gY&PyZ|Xmr9P$_TGkHt9c($sg)#1+l@Zg4gOiaTT>bX=A!0XR+1ilY zjTb#_3JS;xb4z>5fMDdwi|EMVP6?_ajrbH4U_X8j@A4ghy)h<s?2nWd7xEo3D`Mh| z-1ZAOQ*VMpkK+r<3M;jMTX#s<W<0-S7a1?=jL2?7lvWZvP8VMyz2Oh&A*KWKXV94e z|I2$#?8?oL9&~)Lc&|nzBy$QEEDXUN2|%Ep0{r272z+!gm>%v1E>oL(jj#sFn$r!( z)QcM}G?vddY^FV78ELhT1Wlbbe98*^suxunw)+0d)%8{lLcAgqmDT}H#t&hg>ppaQ z<Wh7y2^NLUAu?e36`7~>mpCWyWgOTl3FIuzib2T6<_Jo|R|L-&&hxm_csKYMXc!wX zWgql(jDR@+rdz=a8zd$*X`C)*%S0`&pdeC5Y6AePEyjnvv+dFfg#|z3iCM-izlEbi z{S)8~sJaENdr8Q6SLwE5uTLRV+lwX16(mT{WYZmJOM{9CEz&S+VP2*emzR?e%x%uU z>H99O^R__`YBK3{c=z8N>0CQCB<rq>103Ta+>Auy>^AsK<F8;911OQLUkdd$<4Hd? z5brM-*a}fL!g^-7ay!5lCPYu^VPW86G95&kAx2HUh)2Uf!<kh40u?xJ!E4b0MU$8% z7b8o3ae{0=Y#&ox)-xd}XZHFSo~cF}-?bd-j4b%uDUf}shlkdbwq~{azAc=_C7rZU z^k6+giC2=#zZV)&t`I1%Q0x}N(r*+JPr_PV`AJcx=!DAFCYMEHQ|RjvGnJ<8vnp#Z z8|zEO%??<~_kAlt@#&xx+858wpdDKTAs~MUgx<s!-IcMo$X@Dq_`7thgqLo5ezPHL ziF0KV{%M_Ci8AxWJ}iNT*Fx_H2N<yJieFB`m2C%+cbFOug*|Qoy45VdDjN$1c=!5Y z$maS$vCs*u52CMotg1dVljF)sF*4@?(F{~bC)sHLUFJo#bNz{Zp~Z5C>j7X?#Yy_% zGU&VBZn)uavc9ipObsAsgf)>3x4fg4bCsV}xcv5R)I5(qo~qxqaNj9+UkVxX>pvI! zJLsy=VYGsH$CBtcoy(6MR#B+z(@9;W1U{`9WqDswSu8@}W>NCdEA@SmSp=`L+*}U~ z{4hhApXEnrKoCQM!Tdp{($zAG^uD<4v5fLvacT}o5DNHQ=$9&a&ksM3(qQj!)#Spw zr1};3tQk<E{JH~w-#Qmo1{}(xlJCJyE^{2V*t|i71;^XT)#)9FXIi^?{qPG_EXE?6 z**2H09f5*U{Z<TNt%v;GP?$1ToOlc&tBpbovnem6u?`yyV94&o*ZvJ%e*IG=_1)DP zzuc&#Ci*f%Mnx^-`>6RWd;c8;2bx0DZIQc3ikK8ig?<xn0}jNT->brI)KdK$+%k%# zCrcj3BU6?V@n_E)Dek6TEYP+Qk(z=pDJ$OQAiUq|LUbG5j?W=qIyYYOK}ZrDm5?k6 zhqG9U>6N1kCv|B|Po2yGDjf2=Y(nE8%!}xHt^Fe_sW8p=&&N#IT-{eV_51Vc<)+K9 zs=7M|un6ltFKFnOX|a5iCZ6J<sN~f{rvc2vz3C|^vgVZH)NmfsT@RjT{vaqEuMlsD z$UyMVPmA!-Zg#lD7#ot?Eg5pBexN^ynnlXj4u9S+f2<a05F(1VBQ9Oef})Nr7p29N zqD}aaO^5crb16H6ME&*<Ox|VwvIW7?*PpSU7HfizD^7g?4`m4X=Y4u&CX<hB+s)^_ z@T-o+gJA|g2Q9i671ay>vZ71seJd;8R0Ywj=he%FBo#dYkre$`g!u!i!8>-EkUJF; z&bRk!$RaTx(Y3$V!`goV|Mh9abb^&V@E1?z&5OU<c3{3R>7TFOQwMF%5`0;WMgwQl zyCbo4P9*&`q_~@i?w#NpGC3mtyWQ7V^;g~U#R%&v$qE(TYteOTA*`+C@ezS{6oZ^( z(A3=IPquDbpHRRc2^q>+&{}Mz)FNjF`d*i54%eU-uVX307f?Pf$p7>p?%RvgQyda- zmwYv9E~XeTSjAG{-D9l!a}43Z=Nl0NTc}*=c$#6pGvKa1Dl0)v(W6kK*ajZ=cLUtH zWsGDGg*E_rP9@hjw<R{=w*I<RdtK8si~=H$3}hv0{F7BE{{I>aLI{-TKT}dt?>;`h zlSGZg3^Y(79F$P}K(kl(aDP(=&M^Nvb2i^&!O0HeZA@ZS5nx{lLtN)J##7UyL(ox# z;jGfb5c#K?3)-4PiWI8Y&lnF+YI>Y!9I@4y1a(p0%B6GQDe}F7`xhGz)67(#CPw4l z#6-{mdZ#rbqyq<LABUGh7O%P@^;<_F#P38vd`aBR|725$YLxElA(2n7dmpLV0c!{S zy(Hd{_Pq}kU6h}*{clRzE)TWaz6<Zr2zG&Wx?dz~Q-Egc&ANTwwO40j1~yDRB3k<= z&U@X#g~RZy6v@MF8qDT+UV%dFGV!w`S>2Ntg%Jk1`;Q&2=!*UJ#Aulk5YswHO;Z0f zJpM1k-Jp$CgWP?GPWHO8^PRTU$LIBa`Kh<lA0?|=ThGZO-N?vc#Qr0|lO~&#<>n@B z>jPWg=RIQ`-xD^GKskiwQL6poc@$npBti!cy`$doZKLLx;4hU2Wa(Zfc3GmX8(V4L zrfdiG&G(x0-Q$SG(cnYCbF3gSO%UIG%U$quqsVgj%QQy(&LU1;nl?o|+SOPr<JR6c z0gfv)SRJFIthwu+{)&Hjb8PZvYH@taS=q`(4qF59<P5xjICt`oW}FA$bjY1UaPF4} z2h%@Dr(uLlnJ0Z_d;$%w>zX<ec!eRl6ZI7&L#A_M?WoV{1B}#_teb9=1_tJ4;hQrh z-VhYk6mt1+q(u3VdI;}&9>nBF@i3>(m_g}iqU1m?%78x&o_r$SlF73;4h02+tkpvE zr+ZtW275w>qOp)YMLsxhce|1EjCqHp^*x7KAi0iCdaP_CyMwYFw8FGBU~<<dhAtzZ z?TP!?*w}Fz!e3Ixs-g=gga3O#v~SvQhR3{7{q}sk;Qnt4w12S;3E*GyDQF4L;ir2a zsOLTx8y?n|Vs0L(3A;}5ZM#_Bq1XO`SC{?T@mLk2g#mFTxizq|0MEfSkiP`5oEx}s z_+<Ob!NTR5N7tdQ#~V90=!u<K$ZE{w=Lbnm_+w6U-xt~ZOs?Fk&e9J2WnC|_Jd((N zTDzcQ{u30q<Z1LoUA-^X?L!*%*qe__(!b5+0;~H1535N;t51d2)A3k67H6tA5Zq@u zj-#Sx-!7JCVsk!y*XHHf@&TjQWqiPn5w$W$aM`L2pIAY9&BjPbW`p_3d(fF`J{=e( zAF{Rw$UyL>DUSUY4fvN2TwDqRZ)#tpn!e?&Mpkj32Qd2?&c=)!SroN%Z#BDU6Y6V^ zb$-<q+tSPb>52>F%eC`rxYmY!n&CXl>B@7Oq;eh4$<U)$hl>?G9oD@OG>q~Q>huQI zWB>h!&YwJCa^5x+3b=o4xgaD!5XRp%W+iW5X>Wg;mi4=LAkhSyjFPn7lW9ZZY2x52 zoL_-dQ6NJkvYn}|4Xx=SGHZpANQ0@-95EF2f$!l_ioNJ`8!$87`ayhJ07G0$V3$Vl zV;CeyNQ{F%;U>!N^*M?r4{2|jB^3o$$9pWay!vOV_FK_>1#7ib@Ps0pp;;ucv?G0! zW|xNkX<u|@M}7M`QW-<B3n6-qoHXD9Zo{LlKWdu?ojmEk#6nZ4^i^suL-(_?r>TXw z4-c6eRgo_}V|0B}Q(_AhWrd|Gp%T_GJXIHUCdGR{Uy%9gPZ@lAT?wjmb){rv0XGPW zeYehOWOQ_B#!=A@>-%)97VFm)=MLvj(7c>o;M!>{JF90zZKU!hK@V}V#y3wNl)FtU z62<9@N|mZoX7LN92Ti#xyjmVT?Re}WusR~D|A284|9lLD0?KO);^IfX9?3@PzgDX4 zo<z~qeN&0<o>EI+Tp4YS5w>$j?!snrnX-EzT8l6<rtcth8|2Oq%Hbn&YsGFf|23GR zt`m1a!#s#si$G_+oKL}tRv#Ie-h7FG%is>Ua2T+2?%&u9XbIynVbU6pe_gWv5KkNG zKY9%!Z)?@ZjgH2_H(Y?p!NFTCrBsZ@{ef@o&Xb{*tWH?+KM0dB=1<G5z_JOwFnUAu zxOhQ~BWnG?P-$6K`mZ>Lvo}%`apJ~u1RZ4xfsUKt+(yO)c03W!`aR*=F3gyNBfIq@ z!~=?#9RyqgZ+x5z8G&9YIMu0cE}q$SyelS+fD5;Q1Gj>`VE6j_l(OggZhpO(9<u2E zTZ|Z;(FdsNvI~pX&A*)kn0y6gBXTzT7|m4LfeU6ThKM!Ed4M$YMx;M&47?cn#ZM0; z*E%h|Eb#0%VNOWsI3#s~UNsHX|Fk9jeIF|4|11DwR)@*mymS8}=zRo6JmlKEWAFV# zts4im`!Np8*andkdfnT;K8M>;k&wnQ`uB)JHqbE=qZQcZzU}~Mo8yI5R;3l`u5If6 z^SGX|Sfkcii3N+e+ru|7$;8gfo0;=`IN5$=()mJe=#9<c{k^XB>$T~Sx5mj6esc;; zeQP<PnK)<mrB`yR-M}y+wd&YaO9ymM0mRLry1s$XhhN)A5`yEBW#i4Id7hECA(=!x zVeqQTwAg@V8X#pE1-=_wARb4d45lQ{Hzb&fcUD86<x1XV6h^)Jc6a_j+~arAFQBFl z0?yF7=}h*xs^Y~${7blGaAfcuu%R1%4|o?ZQ|CloBZ|Qizor-M%4+Nw6Xta3oORG2 ze)}+N+nPT`%M~W%i&G?gsZRA@P!W*Wcj8i5zHhDClG<NkExwx%dCqkuneziqU_dU$ zCOyid77xz%M_tV+Llw(2ai@E&nMfNvd>RgN3Cz?m^`+L$d_2QVpSQi?iTcFssu5tJ ze$Oy&erMoHZSP9oCvu#OV*B$jh-g1x+SsSA9?fs9)_34E=8cgPDcU?!o|4Yi{>du` z`oq_jLg1+@p>_6uW;PP)+Nph=uj91{5ZGD`Iy!q}wj?HOg812STw{+;pPig9yt3K% zVDZLN*@cVT-LX-@@IRA6+n#JM>znmK#ivcz`CYKuLE?xH(XbIIH8)s5?a9^S>KF8# zcT4zE@zwG2(YDR4kqAe1EipYYI)uR<+{)Tv9)ywKG%&Dwk0VZIxbnz(v4<TLlm0Fv zaU9#fY1{vUP;lqD{m{Ox@|?e5UC`87;6~481T^rpFBA<PW2{!_dU(eM650K^&4lB& zzEs+DTe1{&oLI!zHn^{CbURJ6h`L;wVJ}axa;XmoZwEqgz+Q-U;<duLLkZU!^$}(} zN5Oj1fTB9cIJ|xS#Zbx`#EnG=kinYEoKLLcFs?q7?Am&wk7}(R4nSv`I&+7U$a8{v z(eXt%$I%I9`pwc8jpys|Yfe##(~L1j&^L0OYT8K68sgmbU?xj7B3@SFetSpbyH?nD z>t%zYMfm0G8ztP`9Y=<p`le6JG}Lh<6rjkXl}iWY4|lCVusLZUPu@5>fLggMUHc9m z$N_}mXrj&zJl17?v9^*FF}RwxU!-D9IFJW|vHV)Y=+ShA9c(ZJ4biZ(`M}ycoRZam z2dhd+tR}-6#Z*T|$D_(SWgHAq<M;>fL89Vff8Uwip%g^A1@?J->kc=b4y_9X!)L<^ z2f_;kXLW#PuwP$Xj~f-k#Si7=vbj-eS@eTZQvHKXvs$)a`-y-$T{y^TFkE^Lbm!M( zmOv?=Dy6;PB=qx5-7pn1IpL(~XetJ^0*gn5a#yQ!=Cyd9Zm^$vBnzo(eLDe;`x?b4 z1Yt~TEdaA<7nBs-@A<=hI!I9u9NSs)_~+J>LWUUxYqI>ndi`KsEHj%8Q{kl9FoCad zPlnML6HB3)8sFPkbz!W#k@B8cPPB;ZI6Uh+W<#r;78$AYUp=clRt^W$QlPoaekLmK z^|>#Uf7u1-5OwY-b;3x?5FM7$f+B(hCmv>=14N@9TD!XuUenLc36doYoW>p_g&bj| zbWmisA9>y4Fc>XlPtbV6SHqcz1t6ve&!cngR^B&6AThb8?MHIkZjug8h^tncy(*D2 z{TT8{$_~z+k0P27=%0da#|=DJVIE3;SPWV^xz;3GOIoXYZ4~`r=8utrCPRhwLXhOa z8-$8h95JOaFQ~S`(gL;T?61dnBZHWc8f-L{tYIdm1NkjNx_iM?c8K&UjdlCKxRjKY z1G!cB!VvM`bJT((f0UBe+<v-~pyu<Xw-|q<=qZN{JE19P>A@b(?xD4{1%#9MB4T0m zBi!Q`r(z24IEnb*GfA1fZN6^%R%y0MZ#G`b;Z^~hTWRuJYVc~AHlnl1%8a&0Ggt?y z086V8{A)du&r`LIEB!rEvhsbg@m$7lHA?>aQ5C519UJ#;v$g(oFTx$2q7Bed0jwj+ z(V7i;%qcjp7Zpp`RgGC}#ofB0M=vFYh5mJ#5Z23CiCQY5&UBx(t{*Jh?G02jQQL!z z(V5}VD4EB!CPM5s0jK~;5eMkHmm=4?(eL3DPVIHXm@u;3h9@}17lrDpWrn2|BCUd@ zI-j9d%KJ~3(}Ha>!1nL!3H0mV;>)fGS(xVCPka#l{Qju{f#RFV>8kVXa|}mnpIQ$A zT%^}|vxm}#jij0t@#ou-{$w^dw^pc@kFHOOJDdwlJUEK)ZP=jx#x~OjLdwHZ!?B9R zbS_JdZ(Du{EoKDh(*h`_SzM&%>ta<cJZwVMeG=3UYE?#$vDgTQxqJ{5Ej5xxD(p>G zOzXdKNG+%EG+I3|HoYDpJg56b3jnmU17B$@mD(ENNtoB5qUFI-WMJY)0zHCJq7RXV zBgiy8J|t;~eTy#4$9*IUxzK1)(C5%l1wbo=h#s0|<S}7Rwp)Y7E9ey~-IKw6l=M}O z<8#|FM^W8O%si0i=&4LPBZ9<5BHw3>91-rei;T>BsxT5v)|U5;EgMd!VLc3MbnGy} z6(3MTryQBb8g#)Bxvdl^OGz<1XqF1iY{kTMp145i4~=oE@_EH8E1oFu?~X4BI3}Yy zaI{G3IG19ff<qb}xpwm=$4XxvKnB%pdN%tsi{Wt25)=nF7Ocjl#jkKTHWBXiifzGV z*U$eOo7B~sEIXD-DgDRw;O*58{#WQ~WR~G#8n6k$0op8x0T{%--Nvc@hzc1>O|625 zXP~+FwpCN#nG+d%qcuPw=>7y{H9f%9@H&8T-EU7-r=d>JOkQT&nI6UPp3>px)^zGB z*HlPkUEqa88mz1xC38Coi=6$izuhy;(&+af3Pg9PPpuwWCec>3>-}0h0g-DqgxA`N zqD-y28cyxaoMnX@Mytple+<+iBcq!AxZrxfr-I_jlnHke&_EEiHOGMS*7RK6eEYC} zPsQNG@cK?*m|DFQddR-ILD;XA7XP_>D=90&Ivkr+oY^ru<*B6@-ui%?jm4Z%BI5x3 z9H{>-gv+=Ml(~ccRVZx7d>^+S`|7=sTr7QORvU0qGZ$wnR0`Np!rBesvx%`XbN%s4 zbzgT(^2`N)^YL|<5@cGPCL|@phkgrP4b$2`Iy83l#6xVsPR?<m7ueDpeNY0crb9L# z`kB~fhm|dXq}Y4*(>iQ=CrJBeK$LE!?YueJ(R%c@QpHUf%m?F@rpsudY$P!)^5qji zu6Ts*DZdG+Q%B>rnMhk^T~dA9D)z}vsV;FW3Z)e$95Wh}i6uq|@9SM(%W`iB4x4>^ z*6B2+)k|NNtO16z<XR8M5J&>9h#LG?7Cp9IE!zh=(CUrOoLjde^Y#l#`8F`y6OYd; zP=|>Mf>El)gdoGwhra_@irec_d}2j6u+&H<hcVGR<-W^jVAA-yeXgcq33rX==DG7q zB+w7&{1xkQXYfO(U_|^aoP0}fNso)pl~zH)0ufeUiv|a%r5a}16%L|k6LZgzKL*p- zOZ+a4M@{>J*fVI-^hLejU@H7G8;n31_<dz>&_mWQr7s+SBTga9r6SXv(5J2*c!r*5 zV&-rR3W=D$bwl5Rk6o4WN^7OgZNjc@I}C*^HVA2|A=ax^cz1a$4rVS)ViG<XDj%Ci zEC<oC)GV6GAp0qu^lx+5%aR|=S1Xah4(i-;Qf+#jHhHQZZ+<%7Pz?Gvge^&t*Jb|O z>RmoxdVnmhaACC!t?s$|w%Ha55r}U5uw0?8U%1gZcDIEu7vsA8q(R+%FhSiPFV-IZ zwpdpw{E?CKU_SNMQI9f4T#YOky|KXO0Xq%3;3xOPOE^Ie(mc3}sOE`4pU*ojg`r}$ zq6m!dZ>WS{8Nt{X3?(fab1ZfFsc#yH-_Y;M&AC$CCYZI&t!2rf%T5pAL1l1*&npK( zQDclLO9M3+3~1(@q9yDDS}oYkf{cMy18U_=CIgFoB`yF7G_=iU6zt}f-5Z#X5c51= zc&;3Ow9oi!>8Nf(C5nT&ATNyZUxwiBEH5A`jjjR-?RU9xI=*W<ekJ<#bM}pEPv1IE z%xkX|=eEsHDVgNb*&eWoYd;e1A5+qRE))`uSZ-wRgA?@{wout&u1`^rCLt%48`X7$ zjHw%llph-k0&O`yPL@e;9z_P0<iZoou!bT>nwj{Czr@R$Ch7F19>XIP5orVnW)>uV zbGxjX5Jaj;gkQa)X${K>yRF$_hBYH1#0f;=W?)lVHAjxlaPAn4LRbV3Am=FjB{-nw z&#uNSwP9)y!5_0@vnQ^SEJcZUXr1N%&MdIz?7L6_l*|oOn~A7b2MkmSSv&FR`JOSY zJ01~vJZ1Fm-Na^XYk5Ft%Wz2`;~{o##HBr6j0pDVhTiT&;-*I&q*_2>G!wJr`3Qgn z`o0Y}cXaRoZD+rQ-0OjuO{+teGh%iyH$@Jj7H<rXd*GhU3L#ofH`v4pOpQB??Ll@T zcCcTuG&U~7l!6w8!P|Vbw1;$&d6r<H{lp19)Vk1krIMW(7!pIW32zZ<`u(VRp8HrO z+<LZRN47SjAWE7P8;<R87Gi;#QcIhp2<M+H*T4#h#cstAkCt@C)Z2`Do0xG%eP*&g zoFOF%ZK?hET^KKkGed&Kv#v$T1XDqHqgYv074ZQlMU$gIQwp>A+v>6*Zykw1CwOlE zXYLE^r{s0PpvZ6N<?yuY_-%q8=)bMb9M*=?05%HZSsSs<@=O*A3gIi4Lq@F_tueSE z?1$MwVKFufD7cWV5=dNK*Q}aHcMW4BEqizUJB|Q@I7t=fYk~?47&50wH%EMqM1&wy zhIb4t|DiVzZN1phJQ@Te@`WVcH_kt@*dzT(-X2Qa)y`q9F2syWMM{w2i*ktO<3=fe z93kGDQtwHmQ`aWx8eF*t^|=Tenp-y-_~_XCKYgZ7cqVPR2(+ztRaYM}1oC}&ZGBX| zx6xou(enWYFN(xtN6G55e$aA(P$6NPCP2t~(5&1fb$=0k0JSBpPpN8KCWlh%asKtm zj@zq2qvnni&(4j9h9C(cGD32!Jng1RNKykjFvks1Mn0UM9U->FJ0JKRwgsx|@sQW! z_gnn7)L6(k=JfL8SkF-M%!DYmZp*n-hthYt_T?Olh(Pni2*>S}86x#Pu)3asD2EGQ zd+GiMbOShjdw9RMy8}5fcVa$j=-i<wjwc2q@(2gQ-9C2V<?IAUr?HB)tpHt)Iz|so zJL)F`4qej-!M~~wsbA+Hrm=qsVwL?$k7!EfZlmWaaQTg2OoI|==ZxhYR}(aS5Hd0M z$@>k=L)VUbrTNQE6v6h=neyst*xgRi_Cv)?%c=L1nqT~CVsK)IF;~-<W}xrfn1}gq zGukg!IvJ^fcN?MCEt~*^aVhD6Dd3mIYN3fq%~75=#wv|Y{47rUA8zN6A{tKK$p|+z zQKd7NheFu86cQV>n$91CgZ8XO+nS7{H;$cqMKVh&ppprH=+vj2d1yN^cg}*<jEHPh z{WOytVr0p?<P4Dd(xA~^>V=%gWpMQg>8Y%2zS3zyg_CGbIx<lfW`~CdCO$XPm=a?b z<fgS9ARdY7DN6p#8vkaC%6`YcwhQsQ40%PjUb=Nw!Ox07UN)>s_|~FDBVjuy`k47L z0K2(>OBqWD3ondY>G`<;3Zc#BFh}kDUVo48#_x<tDMitbcPOWy>_w8X329!rmHJQc z;%jQg7YJm9bm;1Qq0J0={fka)xFDcBsyO3mnc=t4@QT}w3^NL*mK=7?`?Vox0>F^n zExk42KI+}obusSDtbGgkZ%v`ecXD4>!6|w^6-~+mztjB9uVEeX3*l2@-4>d;3skKW zviPARePIR;t^qqLfFd;~9EgLbNROXQh`n!Dl^&ia=1;ek_H~smB!nOVSeOU#`9oU^ zLe@_YIVBFw!2D4u$*c)DZ*7E@3t-fUz8~1M&3eE+-3gG(7dx9SW4$+xnq6B!LpL;R z*vzxGklpT_mhXPQ=*jJQ<mqUOXJoPacZ+tN;{|-z^Xl((4##XAh8>);i}^Y4!0^p; z4I0HfKFV55c#JA8`HB&5iafEM8Es>X4hR)Aef7Y!eIr(p{Rhn0t=|rY9DOmbCrMOk zKCZuyq$g_mV)euQqd}X_IJDGe4l=4V=<Me*@WDmwok&u!&XyWj?F&url`R_e_%|wY z3DB|}Po7r8<h!lq6MV+-q?s0W?n1zp#Ndd$VZA2-w|Amf8Cc}zVt{b}*tIe_INEK9 zW*H7~+;f<Uu}nX`F0?)3q)f#WF>mZcLLr35SCV*d)!RQhGQKGkXU&kau(cjI^ffJC zv@leso0U)=XtFv7HfyhDFq6){tTKE6vRBwWJ^KRud@hg9SOof-mvxYX0i??=`z6+j z14`5i>e`GNZ$L~$-6z=E)+*nm#l{9c{tnK5YpaIQ&6Fq>NxhKQYo3~1PAL7-ji^Ee zwN=^cxpC6jt~M5>y1L+q(#Vh|)b?=c@Idp=J5255KZAuFCPf{co&y^DFc}@*7<qBm zB~5riS{gf=H}gCim}YGpW~zkTpK{=&dbT;*%;LnIwLZIieapA94c?8O&i6NlE5$|( zn41gJw1P^iMy{%FSLXMjT}ZhX%0jxP-zm2jGYY~ZhJxCZ4v31>%~6Pcdwm=@X&5lF z7Ok9sX<Z7zuSDv6NFE2_NZS6MMO~15_mjW5ulg(Z(OK;;3HMFRZw^odUNE`dZWXF@ zTNBed$^FnVDuj1`UrLj`>p^PztU=iYykdVg?Bc_6pD6q;g5H;8p%;Zd;l+nfS@<>| zBnX@64QxWt!grwtr5=AtRD&ZE%R<xpsoItjI(cxclx89YPQvUQB=^SQ`3^$VQP4<( zexdNs%v_m3(cg0~YCg+0;=OQt33|)mIRl{d3Mp$G;;ILpQRdfBEprDU#@ubf?x)kU z(>m8R>|<YeS{r0ecR-Db;aQK9Crd|ZzR+hN)2q|hT)ziT%uC?dM99{cf{s#b|M!Wl zn+tcrTPN0}&i?9jbdq>FcPJmL&W8Ql`@;o8S55tF0?M$pvRUmFFU3MPWNm7k2vTA_ z9)gqfK5^E2TX*|}4N5T=sN6c?+mcwkhA9cuX5}Jk$ZDEG2G}@Bh0$XWF)?4=skn#% z(s^+xn$7W8h?0^@)Y4Mue$&V#E;D9$nCD#o9!*PEkDHN6sRS`VCJ`}M1V-H!VZoPO zsriMMd#N@sGE%)+4N4`iN3Mu&y9lfv<`H1b+Q;t+uSLjA>vk2^^Aip^6b2>?d8DQk zI0BzQOF0@POU{-4(fx#o(_zxxeVdteu<DS&09fqnRUBBXts{?=ccOtU*cTm}d%2!l zOxJ#;q}C<iu!vm8_5<VNy+|{Bvw2J4?(s&idtrNSbYKx!X+hO#PjXGGW)Zub7W00p zj|iS64<|YMb*zvZ7h=sEPERIWbFy*%^}xmRWVBF;wqPDFe`!YiZRQ_#=pA-k=_r+5 z@1e;4zR7@bJt;2}T2C=1@Z7G-dr!JtN4~BJm>}T56XOd#FsB+UpS5f}g%>@u1Pqz$ zZ?3Cvm&ij3orbY@Mj(tua`>_USY3tfltD5tguBsfpP|f}J-#cbYy0-T4}`^T_Y?SY ztU_2-eopH2W(VK-h`Co;+j}qp#uL5XydujRp@Cj@q?SD_Zl_^{)=rswwBSfK@!Aw^ z33{nU>pi4llB+u~CccmND&hvp5;7&qCd_;pBGUT?@wfaaY`+8QWF8b_x9c(i`zFtm zzBg&n$eCZ^C>Z}^O+y2@whT+48Tkf6LinJ0pzL#D^ALQAnkb$(7>l+7F{H5(Hlb~G zowluou~FJ;woFSeoir<cEbUq+$<|vNGIF@=%Qo&!^t!?5$HV3;u@z1`fP;0G-}jKO zeZR~*RY#;@H0)*`DR7;*O#>MX;PY0{*|vSrd&jWfMS$Ag|F=y2_W|36onKf8^6!0M zb0aDj7ypjO$i!q}R};udhT%s2?LGqnRq&Q0xuv46L^xE7axY*xp!y4Pk50{~gm@8> zS|!%6&WFD4GE7Hi8V)yx&)<?f7lI3Oypg51CHe({jD%y-i80hkigvRtwbygG(X4j^ z-9jthu7!<&(U1GWhJMB6h{D0c#M&sb=>U_9rEPV;NNHhgo!-8bs-7Duf>9i9k$w0$ zx=ei^tlUH3?lYXx$W_hXD-X(xKQu$g_5Y1g#bO(>Xc+pn2Bji1mR9{yw2~Um&X?Q@ zf7PJTtKQz9YE_HSq3P@Fx{0ugJpcAh!&y7{&B;%PpPyPc;HqaKLHqTT%H_S+JkGoH zz6<7keFh}HA0g*T)WBN51N1JAG8UN@shz=9GHaU|($4}<j3!DMB&&AC9_{MpW%(wa zCausre=o^MqKyG`U7P*0ZtAe61|K?d_yCvGewfw~nC^ZkV=uuf&0aW1YK&}Voa82b z8K@?!FKhZpe9Sa2D1?a4K7@P<G*xN@GLJ-ksr}>&OGJ95(+-#L?}27J>sYW2brQjl zr|lZ_Ba<b8hDCK5{UM125aRL)#wRkijmom`O|VXq$Nhp_!0%)_oqy{yq-Os?!1A>B zU+6|B#Pm5$%}az!zKI;%_uJVAHdkXsN{>0bVmf&88_0wFs96sX!zcEJrgFUNtQFbl zE6?_sh=}bOpIL@ui0RTO?K<}!`HF!|T)N@<n?5-@48ml?LB=O;0fQ&H7)luX-VD!Y zNhRv^(gH2M5NK!}A&i4Wd&lUrK3<`J<?`4l{%&KAnFtxkmld;>;}<9~(C_sIPqJr# zjI5Mp`D4|4WW!xHy<Ny8S~hwd99jm=_kX^yFK7{DUz2IA)kpom=433t5AQ|Hb}jdB z5DU$mq5fAf=Ku0Ig5JqjptcJnE2`i!c>fP=dISSayhfxTU|=Uf7W9CLh1bBi=>Ge# zd5}hpe(zserAz~r)+6ImbWx5w{+R;cMre>X_1n*o0Yg!1=U^QQ(D_su&v~{@mLWR+ zDxU=kIq;$0$Cap7%&e}4gss8@tJQXX(4b}u&0OX9J>I?A8!v-(5dV8*SH6_=uiLQ+ zv>UJPKVe6|U01%7qTZ2@!ldb7b{GSQxEwpW77}f>ml{9D%F=Wt|D>T`?lLU4XB!~~ zfYJmnizc22|9$IkMo!RJkRxntk$=UWBL0y_0o;JpRJ%!b4E`2M{xa#0U14Sa-dW`k zD$py15XHrG?7Q_4cgP;mKkvYJ^1t_;n;7*H9`vn$9^L<Z>%TfRf6ws08Aq6)f&!VG z91kS7aa;{biMsR3$<xHDm(Kzf%mdg2(0F*rfJlm@sM(+DV6<T{a@Axp2$2aC&twZ* z8U6|X5eU#;)31<T4ZY3LF;YtA*RF^<NK<YbGU#pd#9gu1zXN&Z-@6vH7aCEKqJ!CV z4vmwRz_<*0lrgY6kQ25`&i<q03V|lh{Jf37hklR*n$av<-5HoJ&Od9wO&me)<U4aR zsxJ<@n|-w~M%O?8hC&=pA<xQOxfN)cNdG4|c5A5q*V6rOCjRe&1mzKR)1Zw_^+-7* zibXXF?yjFWfuKC4I)D7*g1eswnb#J&)Rda=2`jAlE3Oz%pdua#Tn<;<TlLFz@ApCm z9Qr&7J2cohCUP@A=T6<x@e7tT5DXdJ>%*1yb~P}}LVq(wu~s4jKr3tLg0ynIBgh=} zpgu;{qE2_R-9sgjSl~&vE$6TiZ+ywup*W7>Q1mxxmm~#b4axk0fvzk>`*NzwoxeFa z;kRp(!P<H-UNY5`K0a$zo+R7!h3Zv1))c%|s3!56uB&{(R<znKUdP$Tp~{p`g>Gew z<qKSDDz#jm09GX2jYgvx(w!Io_{4-^Bd>75_#!@0mjG2(ac?c@XZj+xcR$Z|2+TYF zO-6KK*f{>=a}m~~iokR9Vj=5pgsk3*1Z_yk%%xO`+)XZg&9Be5-z2RnPOdPWl<j&8 z>a61=O;iyi8<-JJ!g?IMsvW#@oGzxr6-)!Z6&P^=Yd-WMGv)5$3Bn;=@$q$b{L9|f z%=-7G6J?2%Uz?;{4giHe!(=UgSX14)46t!tx*)PCNY>cFc3tNWsW7xY5L%Ul`7YP& ziN>?$OqQ-3+vB1%QWG`T_@3i0vOAWHoZxIz&SRw;ag!9?|4#Txj96I<hi#v;E=oSZ zPZ+FICUg~TUeaeT4*`MR-Ol<nS+1UP!xKya6<O{3<V5Mh%)U+!vu<?)#L+1G-786J z@+HpQ{8rKC`{U%6Q1y&Z(HvmUdEyIyyo|Wo<>)eHH(A_tJV!9}U1)VR+R0C|7y{m? z6KfPJ>k2d+obaF^@LUDo$IA^1+vdItGm+&zlXwEVr!Kn(ZIjn=zxbeQ!d7zk_b;tR zYQy+8^r;MxBVUajXIXFzL(Cys)W^T0&EPMldq&=+7W^EKlh=o5n4T4hSTCCB|D(TK z)uqkK<H=cClJ_g52I*jF!^wKOz>Mp)CPXLK6O|dy4P}bZfynG2FWTp~(z*2tSmzo& z$l@t^ztPcesvDP(3u@pOJ8Q_V$CZ|W!}?MF^Z@q<@u<c;ov4`cGLc5=YhDs8cY5sN zKhT;T!cy}OJHHJ}GwQsulrI=lyord9ke{)b3Eg1K9=ksc%#{|dD2ID#KSj^4SUwtv z{Lvg;KoSaT5rn@pZU-{iygt;0UYZQF;~H~gc!frW->A?puvX5oD)C}@>k=6LhKf6a zJ<3pGlO}-s!GiUxLWUa?n^GIv<z!sQf={9e&#KK@q{2Bshai_*5nqb~%Yos-=~qF$ z$2L=&#j$RBhC6bD92BkPCipU%N8f9^cukn^pMW5nZ084XRW+HT)*&OqWeutr35stj zDv3XS1h1}Y*{n2#!s$@k_@2iYy~MD1^V>K94w`PR3Q<9*8UN)E+1=ku2*cx4fJpGS zjjNu<J(uGnFt|-^#|yr8+#m@_K@%R=6)`j2!2IwG0ZVB37Z;|Uh`|ub$-Kr-1K}~r z)`jezld6AiE7qR)@Yz34jT{%RI7#m|omVE96OyO(|47LVMH7`6EjgAWa{Zk9c0uqo zeYFL^o1ad!9&k4MI7=WRaWFi~<A8TYU`~@I8e>E3KVOKmwd@e!X1efdr!>4R9+#bk zyPu{K#*34>-#AF_!7-9M98;pBLQA(CAK4Y=x;apinwi6t$t*>Y82*(gyCW?p7c^^- zEW3kO!K<lvI{E1W(-V%>yD|R;Z~vPKdiU3v_T7Sq!PN7}7v&F1b^Uf~o*l++QFw{% z*|l7Nv%e2fTCQg`=r%mR)d1RJRQA!exlGZqQQE|r?}_<p)S8-EZ#q0FHa(AsOw7#s zt(ps~tC6s<uyA=?XkYHn!sq6`Rq1wOBZot9W+5q*VYqeXu&DTFjuu*5SBFo`lH2QU zOVUCL$1C@~N%Ot5_TBBT5xw;qnPY7FoJx1q$uWoJ&sPHHtAbuB=~T%ScfbLL4cB+# zZI4`!JN1J6%-UXs&I6{seZSP-(EZ;pKE}Qzvf;_Mz2ZC?J|wF=XOAc1n>QxEAMm z#&luknv?h=`};qUaC>^0IPRO@R3Q{B<2{|t{65r~V(Qo-#R)YCJS$V|XZ8F^;fqvs zP!flkE+Jft7}232hF9=#BK)2o5?7s<4=+d?d-{_fU4>eH*gyCA|DozEgW~AAXq}+J z2_D>?!5s#74G?s22oT&If(LgG9xS*sxNC5Ccelae&imb}TXla9#h*UiefsRZp0zgb z_D;Uuq0?B<ZsCWk7V1A=oOjiJ;wUw?&8BO(n)z#CHD9zpk*>dOtT-uIY$r3QGEqiO z!I^hiXdFcP0N^Ep24=GtV_L~-_X&lNoEQYW><|1n2Pecdb<v}|u=kY=e|Z$>*d6`* zHEVUP_5rKK1s#Ikrut+vS>i(g^x;!eQ&ZK^3IA56X}nOWPrz#jbqO(PRrX~Idso|U z08ckM$pER5dJa~~njoxpY7e<nFCkKcgZif0oBof9N0%|*d_oaQ;e}JLAhAp79v6om zelFXG5v!i5@H$U+eNsDnUilK4X8oBS-O(h+=Wl!bY4q;+#4>R2wt_Ec2b;@~&I@X| zjmCXLY$rdsys5ISo#ILu<fUm!%v&6n8S)I4vD5vj29aESQnrQ3*{*}BT%x2Ins&EB z{$#4p!}wDxA+aXkqPbLuIt`~Bnqhp2l?7Knci2;FAyo0UMIyECjVNSY!989-Ep{%( zKe;9A3h1^LHsB(npUPx%w?&4K8N&JRI1Ex`WXja@&^7(j`P$-M1)52(jG3SSi_^EP z+tIH*{bm~!xpl|!K@Z-BguE+xv`tMs??4seZpjjC+lnzuOUq61IWvyD!orYNh7t`% zYHDhu&8~o#<!a{xWxJ(9zv1CwA4+@#C-YoHb*#qO36ZZ$%kzQZJE6TcK(23cFz(w@ zrD=Y?2v3S}jq#j4zq*~VdX#5H1Q>S@^-FeAg;~~#;=`jq7gdY%jT0ADeeqAq?8T~A zj(y%mCl>s|F#f8oPCyVp`~?~Wn^i70wec4DUI7ZqA@+3`IlYoK0OR(zv3$m5g1(j) zHI2!R1iW=*K%HxJy`oyKbeZ3wQ?OY+E4Tbtcw33y<(O9&V*V>rfS1dO)GOto4Tm>w z3yL}jqR`t$?BWLRXR7bCy$xE|!z6reFt>ACug=(<(FFbo?E>muY8Hc`6A(GHK&tWZ z%|yMHD!8(Rs-9MbjqkiMm9HNbY(OFU{ZbE`b?)gNKN78bcZ~BLtf#)u&VJh(i#3$6 zm55%Q{t~Sg_Hp0QiJ_}Dh_&lD=0*4Vrb=Y+0IEr!Z|gfLnf)bVjLXr1CTgMC`@V`K zX@%i~xQ3#991_t;WHRyREBY$EA~L2vXBOk`U>}SYevnGZsqVcF0#Wk9x%EP*hYN@J zaOWZM&(yhy1hn0Mj&0b>UC#!K<|p>lEQXq{p2_?V)#wMUvDwMN1^sPBXCFG&?khpa zxoVc|t6T~IS2OFCg%ZaQks?47N>%5L0Py{o6I{fpoP*YTOD9vmpCYhOFwOF4naFBa zWI=BjBi&w$$}%EPKw{;jv`|l|?QhRf-*H%pE19@2THI|hcb6=yGX8VSxc@-J?^ph` zt&@TU>JMyWEP<94oANgV!DFq_!t5Q(=UoHOrAI#3aT~=f0o+77mHoHIrKKeT9vcEf zQhq1u6jnp@2Hmj`fX)ww+MXB^!O2d4e*#p5_0$x(*#vT0clc>*I31Va9A3b9Fy};C zY;-0i*@43YeC2w1pnQSozACJcGV3kU4^-noo`#%`nO)19{0`=2*aifx1Nxfc>41yH zs{6AHO`!$g5*t7{GNM-Z_qU~pCP9$hH;+m~1X4xkt=_Y{#nPCd$`)kjktHuBMj<{f zcr9-mk0rbpz4Ny5uh?L0i+_>^H{aX#tE!mAuj3NqvuY5InSba-;&(u*)I*gr|9sBf zJ@Fj>J)8!#<={X)WvJ3wZo~u+;@#dKuE;zI%FT$TEx{^cJ-5<n0lMj~H%hhBgN7gF z%a>*`>WTzwwhD3M20(Nsm(9evZPxLb2^Is3GtWQsnd-R(YTgouQZU6PobpkHtZnR~ z<Tjs5%S%tyHlM64|H^!Iq{xve=+Q+j6b}c@7y<2FG<WJ?CyWjC@>Z#YfH|of4<>ny zHH1v_ti21?BGL2?uao3;9=2Gh86J!JwxCTvwU?agz^Q#JvBWau$IvZMIW~<g(WTX0 zr-1fx(rJ;Tqh@Qqoc9NojIRE!ecNtwQ;VE^TqV~0Zr=ykuNctk2JM=|>Yq=Sx{f*p zkj3v~#W*ck=0n6GX0ftZXrrli1;;b3&&F*ANPrk;Xv)P6rRG`pvcMGy1hk4vRi6q) zoggpCJJ^#=veN7=vI|^K|CHQx^3Vuqz{N{+Nmh1{aT~jI?rQ!>DmAzf)4v>;tk*FZ z;cA%g;eQ)e)jl@;m{p>3FeNDqy^?D(gM}GlrFicrD^7NwL-Iox0f5>w<ZLwLbhA5% z-ExwgnwHiC`iGLgf5lBrsdDh~@tw60oD9i%5wLnZJv|B7j6N(_{-@usw|lRI0F<EF z=Q8F5yl$xf_C1o4&QtGmt!WK@LnrXCKzufO;B9PcNPOuAO&55_7H{of-B|3;+2SuN zOksHc4$U1qM0Q8o6Y4KAYQd{+ms7iSG%jAsg^h}Y&vBtzRrb&Ny3xi2=v)buusDgt zqOfuX2yru^X|=v=^SuZNlhUP19(B!=2|Svr`MOETh$#4P2s?5LG<==~Vug6z_V2YR zo};MOq}U6tLf}Nm;@?PL><OOA%~%H`z8R_1b^R?~9~3Z<3mT)Xi8#32N6@{HrnZSs zk@zCSjh!ka6y51i2Cy5b<CQ-M+Z>|W-X-;w-5e-QoZOB8M8rzb*K0HyW1eR7%nFX~ zEyvu}jf=K1ISHv@DYovU^p>7JV2Zsp`JxsWYh)Ok=ey_FqGSliv+T%ZfY#XlSVPN2 zt@g6O$kl9<Tsy`mD_Tl}bYu)riEFA!=BqWAciA2(R%x~$!Lg7&z_kd}o*oWzyD~q7 z>I`;YhEfZrjMiaW8`D`2mS``35yaE;+DNuHTIA~yqs3_cUJZbKGTBNmhH6w9pPZD) z%gX$f#od-_%@?bUVVe#iM>Aom7GoJ9?i;@N#lM}9n~r0?aE3-M7SSFBoP^*TY>F>- zp8fel4G64iyOuvkzB)d+$g{MtnHO~uxs-r`oD4F>2`&f25-l6q9-jhg5957Kli=+o zhg`e<NqWJn=j&2+5SbysH=`&>z+Sj}$|Kv&==^czqc*}`Leh*S3d+d|Y$UPDD%eld zTR8qXyy^+}LvOU`ldW@H*6L5&+Adt;&R}#|?|S`3QbNM^P<_9}(i3%Y>*HlC3QXdO zIKzW0sL}HJRR|g?_jMD?JTzxAH+g+EWcqKVSn1KAGE6GDSZl)_Q@NdI?1aB^fI^a> zn~~|sfwui)y$n2{X0Qg?upSuhuJ`r}LzlECc78zs36!t=En=+YUbS!?DKj4l5JG}3 z#YCv#U8DZ|t+k6rwwY%j^;!~rE7$ACJql?1r?K!~mzAw=E;vGNG~PpOmB324^C`2D zKQ*g{DYQ-umom_xC+5f1#>U3$U&z#;QjorWbPys&er07$C&TdA*xu-Fra~pk-Q8VV z_Nx8Ru>u~*$uT$l*a{l(x%?J&l(^e|NZ1)NucDWgnc9oAD$!%rUw-zDU;#L1k~Ie< zhW9w|OBjFm)k6e^!?gm1qfpsf9N4rsv6Ok4y|@9fwg2tPC-Of6UbZanrwRSh5jZ~U z)%@GwVX(}dA_jRYeOx{r9<sxr;zlgE_O`3f**v`Tl!8@52>!y>oQKLi)KCAu;qLQs zx}ekCTBe|YtTu2Bh&xHx$N#@ukS1WX_|tYjR@LSS&wL;!t@@QzYJWntXJ7N%0_+pq zN9Ga2)2Z?<uU8`N3V$T)yQ+NEXZ|1GvMM}z^kM%dHujp7|CCrkPF?Ok&?xfyfl;X2 ziM=wWu=1|iy3;XG`M^5$C;WxnnUd3Fk^E0_p~FXcJUuM1nPZ`OhI)EFT^y^OQuJ-E zG)!`N9d#(L?Q$QsxauExWIAb+G)Xozc|nKG4;Lzvja-Ci8>Dx1mV(1_NCe!JUW?u5 zMv5BFkyQ-PFtQbqPZbub6u3Mu1b?(xV|mFtx?>RcoDfg#+6c|Fs3@K89ywtOj$Wyb zdD~*?nqaA3UF&94>r9XyFh8!(hrTSmxrV~xPV9`C(8ftWoYYP>8n%rKoohG3#o`gM zue`e#9}z~7fRXGg8N-I(@3VfGVQ^0~>WfX`4y6trsEb=n%O^vdmCXZX4tYxYgTD4G z$ArK|MTgy*!jrE+x#+dx=W6GU#EDYHyZBs7l()`grMV>)9ZVxWY_ORQ4TS=po-Rbs z&??{Q>(|d@8qmd9MH~8|fQ_Vu)lm=7aUAAQ@U`@<TlyEmd3WC`JPEO6BYb>J5QWHq za(xdOP~{lUN7%fKyD;K0<e7d=$<I;fiWAa?5{+7FP;G9J4#+b}h~uFzrStX(K#O4} zOk%4dLoOWWN|Ii~kc5d1DvLJwrV~u@qfaf-m&3TkO!SG^xreE+Azv|a=Fkm~#5{=d z9}tiQrZnTwy}$1s;ywM9P8;zv;Ekgij)x2@DgGKP#An$yNfyUeTVzB2D9zv{6N}!L zKzr5Va-?S0PQqdKiR`EJb}}3bm~GOCqjoyMD2v~j*4;4Iy!O1(uroW-;8^8#|6h9V ztDD^I^b>V{c&dRXB3g9KD{zQWp@*AzH%Q?#e&|H%I8o{tigzU9$$EKEp@8B8?{%+| zt0|tlR4%58m(9}pv|Vx`K}#gqpmAFQoP8|aq_MTCNoywfxIE(UZor-5UNi2PIj`lg z9T#UDI8`1rs%(YodniId^jNUiKR5`GJl(E257Kvd%-M&N!HI|dCvz_FhT5`91o1C> zP#)oW&cs|D-6XxR$9*3#<3(~HI~i5aE&_xcD>(k4a1hb83`bBPEx4xFh%jzKGMIF{ zWoIVC8!Agi5%S}_B42y@=+*vB*h^-vrdAzxQrJ!<cg#ph8IZE}^yI&QULt+lV!B0k zIN15X1ai8xsuVzr)v=oj-Cn4FGuQ#Z^uOKLJ%to9HduNt3YhwLUGr-Hnp!r=@>Lj+ z5=K$d1uIu54xQ_5Ab8h>g%Q;8G*h8~dJ4L9tbQDNxWMBA6txOkLVLnLGlCLm!!YX( zFJnQt<>ecl%*r4>XvDKpY_Eov^RF(NynoATNsBG5NbbW;(HE5ER8W-4H2b-uE$LMS zAC`<X`<YO=)lrBxN8yV6X!hG?dKpks0^ZvPo7gd!rpcZC@>XXkM}Sm585vg(`Rjw- zZdyf{_<D2vp`a&mxzZT@%dPdIUdvlnk(ot)X%RXpEnH6?;XKB2=6I??mLu>PT}aR` z`=hF_G{!+^Yyw*5UPexAAj3{P=MRDmM#h@g#Hu~rFSM0}w5UH-)*1%$d(Nb;pG+Xw z$$s@ur!J^%?^=`Q2-~MTmCL~iokDcb1`U7i2U^-od0zXV38L3AJs&UR(BC{LjL`_* z9eN>8wNy8oPJdXyH_DmeQYaIfJ;{A%DJ*);qvBp(0<rE2U&dvl5}06+43F>6nl`p0 zm@2#a@eTh~baIJC_p#DMK5R#_HlM)QMg}v7P!)VarcPiW>>cCX_^19MF%tIiL@fzH zH@30USqrJ-X`jw>!V6&}V&5o`FTZOqSW=qYJ*49!8N7ly%lElKlTC8R%zye=Ep;)~ zQ1#C9I|vx6?*z5f1dyfJ^lu(L4t-a#(J0bR$?Rm7){}@rZx8H+GC>$Q>J$3GD0Us_ zUIm{ErS$1+$WhCyR&dXxv5X$lz7p`;ag9KdhPbze2{}<YFTh`}bdG+R2GUsHvS|}# zOsZlDgGZ!z4T3)Qh8i8rpE)Uc$Zn2zzN7y^V-|%BQ4A3XV77L=iP@n|6#6$~qu7J- zb`G)wx1;qY=U4fULcAc7^v`C)h2syW${r{M{`cClib~yR{v8+=`u^}BbUMgILc&+c z?RrB{_>6rEa<7GojC5xQ{Sy##m>esTwe^!P;;oD$>OuDq1GdAfuY2Bmb>3o!8*HbH zjL9Se-Bx|8o%B<#-w>GyVbQGFsUFd<hfT$ZAS&U30C9Qv*$TIkMMoMZfFbHlT8tbW zs;5r%neZoXPgyMb^l*!;n49xf5~}Yx!GSeYHFqZ$D^kw%j1>q6FK4l!KNhvl-xu4K z=)Vt68;7%?ySnpDr>r9F$mDlarl4q#{D5v}!?p4~iOgU)DRuIAd6Rio4Y}V5DgY!C zta7uZ!hr8Mys2<ZV8EmRj(pTA*3g>q)poxS#7<Ka&pkZ%EIBEOTtp=2`9O_2G@-Uj zv?04|c{iZ0f=Nq^3}}TK5p?1LM-ya;Cby3nElL@FUhX^#r5fPE0u%I&JgMO`c2Q!b zi>+8^Ko&Sb6L7+#J1TEz#pA-?08%m&cA5(7x`8!2f?=|#{YD&Ht3*}eIo+^OHAA2M z{U2xb?PzR#RwC7c<iVT&8!qpfFOf38X(b3dd)Lnw+R&nwEnvS`?N9T6TjF~jQDAe^ zy`7Xa>qZNOQ*aW?1|2JQmuwO6e2eHcQI_i|N$l<XtV$~rRXZF$5446bzf?nH%)YzY z=4CqVTOD$`V4^zG{`Px>ce3?xp{1f_{zQBsrkGoJkM>@DaIpJWywz65+H2kfilr!! z8EJ^u@t7+dVmJ(vbN+79GfX$!u=Rz_w6=|!{kC35^#o=?t_r}$0mKV@K6wsS`II*i z?W0HsKsW0gCE>t)9guwM;HL`f`Tb=PuYG!gXoVei`AYovaMv1gquttw>1qO5rN8ny zJOcy6YJvg=^Uh%G;LGEUCy9=WTpARbf@4N9gC3|+?7n}e#jl->eQ_AZ4Q!M;N!%<v zORN^&iQ@DSseMU^lrXSc2p96A`cFx>N^tsjDyBLNSAnAxpqe<8Jj#VnsWmy{0~zM9 zS;tvnvJh<j+<vpaLeI#YU`=USK#;bl2BFVT2QwXh+w->Xh>QrTF~44J{=t%?r4`)t z_t9}lu=CZS_5v&Vhg$*7(6NEm7hh2<Fn#d0O*AokUIp0nJ*DL`uh-}N5bxdc>=|<2 z>pUS8mT_F^i%n#Gyi1e2FM4ZwVOiHhXyV$~AniU@B0z8MU~OBITgmve5y7WTSY6FK zCl#Bys<}bWDz~_}(R23cft#_dMz@DL@Y&mTYb~O!wvd-N8kfZMsgZpO56PP#vZ8&7 zl9j|Tt|7U+84gJc3U`SoF}G0bmabihC}@IeI}(ypN8VhAbrr-#fWT}$ODpB2sgi8w zb~B`+e-^tfqM9bUsc;<Zj@yy|2Zr9|(&7Qg<oXI!#tbygc!^IZ5GW(lqa0<q+({TC z;C9DMsKxe3KaN}=7Cl>!!FTPB-;#9HqGw^)!%Na$YH-$i9xG>prpjU=jzYF}QVqkX zq9#!b^Ey7BEF_3H+q^Wt=(XKkTbEQE|7IpnYs^5{RUyOB|81t^CP=(^xxG@&ElDb= z@y!oY#J2$^r{j+F2V((B-N5VKsuTr4iEy<ZlI&jX|BBZ^jP9gVVrr7`62$9&1MBy+ zsSYlr8mTv<M|5ozf4-_@4Q!%*vDP81u5-Q71R%6*8#yv$q-&QO`Io5}dZ4*k-y;5O z@!gYU8rs3YFcf(wM7P;sXbLW_Y(X&ey+r~VW3Z(VND_nTXKN8tFH-zsvN8qeWYLPk zg+=3~X5%dP_w3*AD4)GuaE@c5Bt1*5QTJR`TmEbm4-kh1JN7<0u^}4zkyU=$C<rC# z{Zp<;pM?B!x!k(gE^z&*2$NMlo-R>Xt<|bk-WS@GdcBvuFWbr#mC7<nEh^XbG$DwU z@0SYeB$5X76~M3F%@AGq+&NTejj3ZT7wh}56$aW&AY%oSPW}cFa&U04xg4qj%u30S zKv?5uVzdDYFzJm-0E`@#=TQH*@L&QDTE3!mzhUiv%|66}>Pu2#`s8nZ5T@qKE$|RY zeE;Yz?Ax}Xh{;azls$c5wiv3=i9VEaHH-c-9$bjkAVpIhb`>BD8j=cNZmwt$PHa#z z<`H{eDGPXDt0Ya~S$w~sdC>J*_rLL=2CD#cPY5?{PF}j^IhgS)gDcm}xyEeSE)LTU zDW13CWwY5o9`jM1ese8(dm!R^!+Z|XX6`F47BAJz<L^UWO(Z@Fu+TE}Lx)Z=a$=bN z2qufWO9r71J;~2&kJw04bjp6PUvEoC(Yaor2~aqR=X>2vRDq6Fs=Au(Na6}CZ*sYy zI$;jiCHy0Ojs)jR+Au|wTh;lNf#FoZG57xb$m@}VjRaNa`HJMmR7_F{ttQiVGjanW zg!i6DxfTeH#G#UPOXR}dK)0)&gV9|P6{SOXXf3QTtpgHPb&P*I{QUss!?I0z&)|O* z6omsU*C`VQlLOLDhXB3Vs0npR)>DYu)d1b1-_7fyPygDY=Y4@NzyV1?Y3(y^vkYwJ z+HeT7j)h#aT3Yo-SOjub)>u6~xxR!&nk@zKq<w0;S53o=lI&nW2m)0ZONET4(K2bc zdF^2W6P%9waDu`Ld1~1H{=S=`0aky_z|fg3R6vJb%eczEc#8734C`p!^TZR@#K}Sd zC`YlqSy3KxQdn614v|~*dnL$GPd|pQ$+N4Y@{{4$XuRyG|Ig*C;$X?etGDcHZIv%( zY*t!WZJ0C}fDrYF2pz)#BbK7$e+!RQH=Bbc1ag^@T4hvVcdlwVX8i37S%M}5s5oN{ zQacUnDxM^Y7TLxx((q;#6;a(_dY3~nn9Z~hN+#+91RW=aXjbfc!U|&j0EFxsu(CFE zdNFn?pgcZs$Wpglb`=!byv=Ayq~}?}1}!v?OZ6QNH8eDxnV5A987N@GRiH&kZXw6x zteRytRLBA-%Pl6%C8t<9d;t^0(WFT-nsXPN{q}o00?j6103Np!zNLXkWkqKittcH8 z%$E_utr^MU5ZkgX|68o@azpYz6JA92=#h8n3fbdmv=$8ZQ$RugvwAzwFFGX}pCyi% z9<=P-`Y4<K#V00x#?Yv5rFrP5LjrY%Bula&Y1S?#hyZj9OUWKDroE`$QkiuEp`y=~ zEE2W0|I3vOz-#!20_+@pci)VP$k;;hnVK*fUjeh_E~%J!>MG%1>y`tKr1<QCV3*yv zzycW(Xd?c9;f-~FcI7IO-#nWA6e{Ieb)1ClIJRX0sQ;r#NK?9(s`m@K%Z><mQ~xt( z2TByzl!l<_cb<Fz<4kgd8#sL>_t%RE6ped^d7My7fBEs+(Xgu}Xt&DO_I%zd^u~fF zRB%WC#-ikBtbk{%n-k17H|0g0J<I`WHr4tE1n&&Q^r))<BkWWCqo4}jgp=)0LHkyC zqJ_$?%qrnnIc&j!9=n4)-mmqy2H?vZDDASDMneOgkt4sTr|-bu4m$mzBv8Ul{Uh07 zncgfBi!dm=1qCipg1o~Yh=rh@){#wjRlYRzw00-^K3B*Vl_V~HN1ee3i?!4-1DX^r ze=K!yi`NcXF3s7TWLT}qMA54qPjH}-^+`}I^y(ai3D^63)5;O2P2=R`)cmV3zyik< zdN9!OAFfI*Z-vwGEwvkrA@LF1r4&0!#7*r9`_^|@rksD*p!EhFlW1{${qrM96^fz% z)yK;AeJ8sB;I<1zQkCBpQ@QUJ78s`oSH<{jq}YL5??2M<UqV7o4@<*5t)LLKldpUq zO}Yn(5_(zYL<ki9`4q=%Mvf3eHg@wSBT=|u{1Vh;JhF3d4DH$U&(ghpGF85flhctv zG#R(A931A=5AXY}2<8!5x?c;fCmNSot*?<y6C?r0z98)LtMAVD7Ec87^O+B0r@b6r zK+l50O5#5_IG&})r`_tOj=lE-)(86%SOj_8;f`fqV|fTG@CF==w_`XX6z&T;^1@NH zp*8AV@+#^OOI~?-lm+|FIo#ab>P5;^eDcD@y69U=(s(LDX}oI+`IY=xa&j{0gF3VR zU#crbJIq;W@l=Ect9mbug#kR7w|T>Lde)CB!Z$+Wt(S~oxPO^~i2O@x0%!jp>D+5v zy2ixX-$UbJwWsBAgbXHteVy6<s(#f1Lf%R?++ND>ZVnGOf-+Hq%){W))r0xv)1NC+ zK?+H1v|k<UhGiDaO(|2y8V0f(c8l&5g4m~qSb5svy)b3JW1zM0ZFLf(>`p*K!^io* zI9}Bt#;BO_7E*Ob-QaJB4wCiYV!WbvdgR}f4HzL9IHD)WU?eMuf;K>?9s54u*)Pss zjCk*l2B=w_uvFt|K_T}W6iqI)e)Di?wC>7l89qlao(w|R-xYg<CWHf|v<#RRf(QHh z9^y_|VV>jVac!V4eC)tvJe9*$1JqV`x{Sr`HP7|(Hs`+sv3QRuyXcguj8+zV_aoqO zN&`hG>wZT#_c^6lb$Y+ZRddh!?tXQrwP{b*9vWugPYV9(L-VQ#G^c%gndaoXUmhRn z?ys~z8?0o~7FibwR<LjX9NTtn|BsK;>*>(w339^3DrNC7i}Y~w{N5{Z(H516H=bx6 zYuISF5fU5>2aJmfX40`9#tm3S8A4VFOgcvDEc*z3?%#*$a{jS2Z}{Ax{r&sbWBU`K zrKXx%4@=W*m?XPSgjF2j*f7g>R{-o{qb*U#BZRJFO`D!RE}@+H|Iy!{`f~1DX*CvR zw<r7`1v_5PWem^<=a$r9($2re235%_V6f^(=l7q27_@)o+m=yj+pv_ZQL%<@6<QmL zZ%vk^i$f8xud+$;ck|08VJk;lntG;Apw`&RAW4Ar#c+THVLL*qu;UjypF8P)VDJHp zL_GPG=gRbo!^&Wj>A*M6-R10nju{sFwLqqv7MMDFA+L=ikNvy*jjnGCGozK26an57 zu=iU}diDuWyu)YL!RNML4H%oO05A^(AUq);mH+E_l#NcP0$M$YdNPPk4|QLwS<nZi z$YWO@rl-qNjoR_Kz=NT{6qnVoYO(ZqeZyrfO8g+)>h>tBw7hf%XywaI*Ci#ZT6>PQ zpDWe4>575R6+BcReTqeX@eNfb#n4Bsvh=^-B)dFRR}sYz>USOZ;>_-HN*^U?g<O>7 zRSP0YXFvV;Q&v{4Czo9x<4MQkQEKSlX!jTVoXFeL7)^Kk$qjZq@#h&gi!5%kQl0cP z|1EweTbJ{fS7DF0hE!uNSKF*CHVe(x%N&mP2NfATwHC5(+-RV~1n$&T9NAw96d}x2 zZ{^?rJF>5|d*3^KRvg{+6Lm(WlFoO1xZGMjeujQ-w(2H;J11ZNz#q%3P+PNwe@A9% ztZ=|*EE5>ykCAjrxLsie0CsMSUV<heXM$ZF5-Kulhml;fdBJ)vTBdeqi3CrJUfLrm zwTLrx>Dukwl7|L?zX9!*27~ufJ<!~RsD!w5dMQn#!1;NbpuxQzO+9RPt=t(+q~f*y z74K;}-Ub!u@WeGhm4+t{TSoND^VB`X$Bjfwr34I4TM;043r4o+Hktn`B2bSISYbmC z{k{w?<oE|%biQd;hAVG1iofi2%RC5a8u*_nc`^tnedE5y!los~VE(FhtK0i<w8TjH ze9ryNMR{ihgxk^C3Vb2Q&sl+0G2O*!Bw9p^p<k|tznhD{?>AV1@+Q>K8%oysh+f!w zZ*;Sa2ECz#fzy-=S{ij>$A?zF;VM9=XQln2Gi{n1AHP<Rtzc|AVp{*Jq8dl?Gh|dj zRNs6-4vXiFo@8{JMDQ#2b(6YB3%(mmz5iT55T7b&Bo$@Be*30Ud%#cS-EZ4UJALRR z;#F+0puF1MtnS5T37P(z?zx&MOiBXpBoUP^ts_)%z$!w)W9};XTF@MlS`Mc67-k75 zZ`@rM^(|Sqf2Cn!1q)(o6rD{&7#Xdre~f)M@TXsOnsN2HZl#CYu@__s4Xe9cjZ|rL zbyG<L-)f?=dSNA2qPa<UkZ8So3&-KD=>0S@c(O~CJz?VGVMtpfL%9&l6gjH&wcvhI zIgj0K)2P?r?){zKbrQL7+Wm7F_EG&R(c+y1c(FA&O6+$m`}?VE<`JUR4xyTFYmm3& zuiZr*?e_Esr}>{h-Oq0hzWcH^5d(+8!_C|2){l-qD(wbFd0({bj)0UE7d6rH6+O`1 zx*L-$O!$Piz+*=fT*%3_X!9b`bb}h`*9d$f(|E_>_nvEZp6ELaDempHE3)2r`6QV7 zPTu4qX~mU0p?)uxH9y5taMfO=dVh`R#2{qW9Zl=-8uc>9J(LY?rhLR@(llNXF-%er z?tM_V=pKsM8+XlA^@iJyI!+&Q<R^YfcGj9~Fn-v*s&3R)Z81#+5s}nxh9W~7tP8nT zHm5;o*u2T&{n5xI6p;X=b*k>mQtUkAgZ+KGHoFUej6j7wy`!V_Z+FO-Q(cP#%9OVv zuAfmLRM}IkT|KDEAqp^gf1L0)8Oz{a)jhfJUUOY={QP|3|DL%p^Rv#nsy*d-W143; zI)J0XmW4TVZn<5Obe9kl`Eg?%I)Ck9BXYt8Y6+ZN3_ju%Y)zcZt<Jnu`=yN*h>$#1 z+FLN=H|+IU@wW1Jw99Ev-J1ZRkedNKEsKxjv4|H_=yWYAm@8_D10LlKvxC`@m6rqw zZjgA`N3trRmD*#?VCnDQV2W_&c(Y`U`sZCWofQcriiDdZ+|v5jY{*@7X!b!|YI(&7 zDe11*U}y)1tq6cd>@Uu(ypSD6hwqNB&s&aGJ~AlZQ;R|K_1F)m^NB)!{e_^+-k<Mp z7Y$FxJ%d5ZwPu^sYu0CYz*fVu>Q&c_rCuu<FbunLS(>Zu%_<c-lR#<{i`ueD=!rN2 zdb(>XhN^#CCl{B!h&iO60~8i3=F{K+Vi=_>T2-++n^;@WAA#RiFqiU4QSVUb9Kxw+ z9Kw6Poy3%Mz4Ai=&h2&#kuYWZ?XMWJNiA!;ZgdPb5!MRl2xeI{R{~~3m>}P~x#pc1 zL5JtFrkh=i-Ii*Te&p=afO)C_#m@wmg4Dq)<>)qxpjq1hqHu>4kci)X==t^KVF$g= zIes(8>GOQGz(WBosu|%=3<Fab5B8Hz8ghs5=f+cW498j&SnNJ$6o`p4Vt~S_xw~+{ zCP6TUzzu_uZ6kXCLUUHqpx#Gr@7h!!r}PhY&esBRaS+AekUv6%r?j^3mbB1#5u(D2 z9$L9e2yv2V5Ol%yh5^5J3z#r58;=E&+MmD3Z#)pBBy^ozW_Q(8!Qf&DM{eKv1+_1{ zklxw%?Y~Wt{7s{0^)zM3L1_uIvPVmbx!j(^Xiygsn=r1a-|ByF56Nm(0LK-|e%e)0 zh;t|uvw{|J-4?UbzC*E1ZEe5xyh}0AfPy#wIKf>sB^Zx)(>x1y^ueRJD?u~y+l3Kc zeKJn09*0W5Gh0Y6TrvN6f3=R6JXTo94rQIO+k>6hrmJ~u4CxBX!_yrgYs~*XJ-52I zwRJ<AyWbn>kh6-j>H6PUkJjufO<7TUxNtOw<NkLM-OjlbxXgu<Ag#u8$RBd0VbdIi zz&IrRv9I;Jgjh;v8xuz7I?$;qR)E#LGrGD9dZ-P+CJCMQU&!7hSIB*Qq1TUMzrgH+ z8`h5g)KPzEe%;Qzk31%{9L;!Ezf0JJ7XNR}P+(#wZxHyni+$cBI&VNYBt5SuFK{)- zE3y@4x@R1VG?@?>l9f*xM<g+|jZ^;S{tGwt#jY4$@`qdn{ASR2(Pe33*Pc)yeC%1z zWvk{6h&g&P?A!yUn_X5uN72sH#=6ldV83biiLNQ~WuWjE3fEn5D~t}`jvDr!ty)5O zfyM9~r}4=<pnf%R687gtf&#Wq*?$S}dk#GyjhF|0#Jq|o(HWCHXGV45hIiuT9n@+I z>YnWMPg>&lJ&z<Rr_1^gyz6fSE69=QstpdK6&qTq2=QNW;A=P4gu&EtC56o`IPn3@ zEm!;0eRO|z_Ov$oWAZBzS>5{gSyrGuVf(g6(wwl!a3W%paw^52F`x)SyKwzA;96E= zVEFuuLjy5mIj5Qn{5tE<I}c^m3s$1+Cz&HAglwc3{_PoThdqBg^T2;$`Fnbkx(iXW ze(CgSe81iwbYO{j5F35k@Dc&PheydoZfPO5%qdL{mS(8`1|DPeN1FzLpKt}yH($LC zQ}kk)o$W=4U@cG&HmVvLzpxs<|5<f<h%#V9;;a<RB2!s@E4ugZQK|BwYI4K)&&qNr z{IGb}r5iU6Z%+SoOiM8OBRBVC>uXQ4Wgxc*nw`1~EG$@w0Ap56i-|_!kRb-rRaYsi zEHCP%%P|m5GRBpLUDXL;#BbOwQwW-pm%kS;n={>bb821%dc=r+$ervq@80J5&r0*3 zD8rxNJY+6fE1;W6UqlY=MC_z%9NaM!#+evEsNB6hb!K2wR{KCl&Q{)B7vZ)85fl_d z37M01#vSy18U8C=G`mHkEP>cxq)db~P%Olq56mZ5eQ9P7a*(A`s;|iy|Ncfj+*b^> zJLf7v435P<m5KlTft%#n&=B>k3K0BsTdGRj&np9mw3_nS(-<Bgb~mg18iNp{!KoX% z?}pVJtW_*_@{@Vd$z*iet!;V|I+dk$^zuoMZ2RmU7^Is6Q>Gr|i<o(N*L0%V*ooH~ zfzfp?!~sPuwg`pbu`ABBrGA0B*=5xH1h7rzn@{ZkCP-D#9@?;0in0!^<dQn`SfQe2 z1nJc<jp4U<2so$e?QpMmA@lVsRnqh(o5VyR<Ng%x;{BDq2*1j&RcsP?@5!$lZVVcn zgA(!S2vS}gNr^Jz&VzfZsF9?)5i;+50xbs?bmp^|X38Xp`f9f&)KAX)<Zl6)M$H~T zRQ!KZtM*kvTYsgTtYvUso%7lc<V(J*1lQX0;JiBJW$>b9tgr@A%I8OAhcY+s;$fme z-}1b)0dy%yJ8%Akh+kw>CLomd?vmrdv*Abm-No{ck%~6`(>hU1Xh2J#X$-X+EUgI0 zy6&4_NM9c_cI!uLYMLK$Qh<qI>9@Kt5!opJ%C^@6;Y;R4x>VqXQH-#Zjh2G~;2HRK zHdtKDMzL0BJOU?!KC+ebnZ|i3FIQKH2wB~uCKq_2F`su+A(p3M0%>pBzQ)KN+`ABo zwd!n<wmZ_HpGgZBxqXdd`z*4B(b@AS?7VAnV?9{i;EiaSE+&CUFh7e2?}<~uf?+nR z?-<_=J*6sdr|j(XS^`GP7h(f;F{AkUWjK%s`L5v2Z@VZ;`aGzK((jny5b;)Q`wM6M zy?>JgZm%|ssm}ut5(W3L_=t<LTg-&n2lavlnxbQ6o<<<*arQr&_CzU>V%5F4B*T?V zD1DjK7M=*6=VZ6Vz8Ol$m9&;%diPO6wG#41mIws*-p|}`8lkZ49a(G?SA?sv%de=6 z<Ik^Js?z44$HgtSKlHvn4dVS0VdwsW!QzST@3F<Odh2lTfq$#{u%+yBr4#t8KI$@s z-ARrd#e^D1v7A24O*vN3=IUrDha-hGk=uRKigVK97|tLD4rvFasu@RpH>qCVamVoO zS0-6IS*Q1vp)8u56j98~1P~>*<JKM+8$#soE%^4fe8czpI|M3QK4rTyPSd*JG)PpT z<>>10N(j(yO^%;>_$0yJ<PAmrUNGb@Cv!LdG}sKC9J&gf8Vc!L#b}@<7oZY*yHBlg zHr|XIFU`>3Ki6Lge5T70)G|QM9hQ~a4jfvlnqJ(vp5is^6Is^_tgAfqA=Y2}lzAwB z+73GfCk##F4I~ZOUi^;1ddOx)r5!~XpO!itlBN_>E=tiyKP22#J(8l#%THZnPO2M~ z+z@6pOf&l3M;Cd+&pJ!$2^13HpF<Tr-Urba+hDnT^_os7OJM=qDz<qaRo9%+?LqT; zqelU)a8ULrK|%j!J?z40wj>@(lv6txdfv>X1=}fabo^3?lboo&GEHj^2Og>vFPL5x z;v4<@gOtW&Q3P7~EG52hkV0AGoWlos{?wm@w<hCs+dS3$@>J&dTERQY9WQ4T=r^f- zL_oN$cqrn<XBac^JH&!gP$YGtwa19V_{pj+J|#V1N}YD3VJrM1la3Xh?R%jZ(Z*vl zeLgWP4awl9wQSlBVFYF1W~R$Es^wCnv@&s+pK-7?z4LxnOk`yn>H)|p0EFGOFviQ@ z{p#wul?Z$2L?x1R`(=_03EGYBjbqR9r|Te)Y$dbjeL{wV3U6LX^?o{hCjlpmF6~_Y zmtJNVk-`UD=DX8}G-PUeDE;<Hzu#s5P1kN%%=h{_eZ+`OE)!MrThPq0q;_Vitbc7p zpmkb0P=Ay)7p79s2I*2_)vD!L1kS&EzFjONQfgVVU7od)kS;POxC$}6AI1;@*R^YR zT~C)A^Z>47;K+%=`HHOGi{OI#KR8+-7ycag{_b|~spZvwsqQw5|NIcAg6;)R-FzOF zR~Fmcgf*cm3E}d>DkH1Zz``t8#kvBg8kp9&i~#Ku>G9Zgm%aNUz58B&0n>7fxuPw$ z%L#-w&hsSMFzk*_X?NVJYn-wk+*DRKG;9@DY34TmCDhZbg0k4AOWvXe$VSli`^@xX z^8<9bS)t3#1~QJZrtjFlbhKXZdxrgOqqj0|D|s|tS(nXX2!UUJ*}!Uhe}Z}wK7_P- z55ojL3!-a`D3CZNg-ujSpE3c&oF%9X*TLYM3(2hrVZ5qZB42oz<S7FG&bHN$+1N{~ ztuh?QUfHv6;6o8xuGSxNc-mMRdwL40hEQfnF~Wh(Y}~BFPio76*5oK~pf6`3>|fsN za?^_LM%4a@S6Tx0<E-vR;2IN;ED=APWhdfqu27bmi8X_W`j4J3&Tf9~=x!+O`?1R7 zB_Ep~N?Y09deo<?tB{ot3yNvm-?C)buKy*nZAV$r>o=eUsib#_Oqjc~e=L`tJAW-% z2dkX>dQ2V=VC_tSzGC>c#S2Rw8kbu2tT*UK{!-P|Bh1r~Zh|r2+Z|OPDJ?B>7WJ~U z3d1iHu#Y-YibY7`?GWTUT|@DgE)_KGwrkjGjRg+2>}_nXV3>{)H2Us*e|fk=)=n=$ zQ7FTW5cBnL32}H>>@7TawO<UpB|j>*(_%<?+NYx6g~I$1sqevO7p^rbHbfzMjd?!) z7E=T<XrrAH!}BECkWOCk;aNmNR_oQAOwOezv(1AeZikOQgM37OWM9!*p)Bzve$i=H z@8&$6fux>P0|+^ggm!F^!YPj`hE=PlJyI=E{(&$fkC2lfqWQ9FwOvqt>(QzXbS%3U z;N;T-cf#lfn0)2OYpiw7%d5QU4WB*>5f+3z3z`e75A{9@r|_gntg?aTpbFUn)&r%P zYF%wuP}TbDrwyM6B;*C#1Z!9i*B{MeHDC%$BHhPX?2^R>o@H)1`$K-ypv{ATf6_2w zvBqqJ3iGl#yU%jP+U^NN4rN7c9f=3)MYghuX6=P%j4K69aUTkuuv)K3(UZ)hAgKto zVEW$Jw)YxcC*NI!u6y;7fq9zl!7zh>5%aMA@qJ<8%cwP>Mab}85D3rm`RO6Y(<qkw zI|v7-L#Q#VPy5QJ8K#3L6LkFRd96w(Y@BjrFnBIPCcCf9!Z1v00*ub|ewV*GU6*9T zBB>WC1$b4g&bfRFdkbmse-Pw(-Kcxm|10>l&aP~A@$<omQnf!M2!y=(5I@KIstJI1 zn7VRx!wc$Yp=}n?rbvxpmM_j6?2d*uxn5uEE7t?BMSw`7f5)ovFC=CxHg>w~$-=@q zJtJe1k#-#p%QEwReQiD|Gg+|@_zAU7PZm7vwCiTB7?oOWjjDN+FOoaToXCE~rgl8Z zc|NhcuFYf{V}OAjbG@PkXkg%Wj(!MXNmTnZb3mUrKS=9Tc=$=Nq}Df_W;)3Kc~+#* zo`+S?){gHCU?B56qyA99<gs|~B)EI#ZkijGd%wk074S?})qV4d@bLG?R+-gL_c5O4 zw>L%~!Ti>*4w2rd6OQcxPZfe+8-7p`M<<NRQlDP1hV7|L^gsp<s@q>_bl)#L7Y*KI z?aqEx{UILje8b4bJ=t8-`)FvzFEpyzbN7G+aEZlBIuu(Yd=ndlmWG|G%RIPw+wlk0 z7me={cXjq%-|$y5!)4=s@gxV=B!n5Q8m{aCQP9J@uZI7NE5LQCLEJ3$NnK}3^$I*c zEBNo@C^g6utjH`N<WPfxj|4u~rg3#@)Aq6@V}`nyQb5b34eA>3f19`y`osG2vBJS& z=N8AY>L;}E!*KNrOgcKIXjJp02Pqx)sKdlB8$tW&y$F}!OcK^3Z>GJSNlw+IPs_kZ zR>AaN#b+oAm0b&F0TxI14zIRIpx8HzbN7zWs#;|`To?R_?jL+9Rq-I42q^7+8MhLc z8S{#5-}PA4wE1R&>(f|}c@@i%p58?E%W?`@Gm7YbnQ(Ds5lXIZskm{>jk0j;Pi7-N zT@H~V|0MkjBo><=naWb*Mwc@bNRPC!7{~k<nKnVNbDZiOGz>G+cyW*6%*n3QlQc&s z{bg+h_ie&8p$tYMVi~iwRowfxUL%>lP9;M<h9}p<vjzIu!~q~P5=nn)n(#Z$eO_0A z1igmOGfrr9q{p&fzRvl7$)`-ftPB7jG(CyhNU3n{*M=)*ix&zPizcv`V~%VrsUx_k z6b(u5p3->5@9nXu_D7mKvFP-`G^xrF6CeBkeO7&)jv6{Qn!YWdDFDI+J31tsz8Ix$ zLHJcZbT`VJ8KgF~uMYtJY54O|rZN}T>jPkxcnZ&$9?2`T$&D3WAMek^bB}kFPO)V@ z<X>N%u^=w1B{ppLQJ-ky&o_WHvvD0cSn|m!NSg(j(i-HL!A2aSVia)RnD)OvHp&GV z^FLE-<7EY>+*ouASaX4vvLw1Z7bVyVryEem1E^?70d?{Jp|Z1Y&Y}P$GdbFKJv174 zEMoH^8YAwA-J`^?-D5YcfK9hy*Pl=g^+XdGQnttaBKhOKmD9!Y;2bR;(ye0iOfOlP zE3;)XRlHe=oDkCBT{Up0xO#QB)PiIC6Gg}KoZ=p_QTWHfk>8$|o-<KfIglcB^D5qQ z!@ich4xA|o$Q=AJJU9GIGI~Ep(|7ZFcVEn(3>IPYX3MRu%p8WNqyRI@uFxqoD>UM$ zg9Tw>pz`x)8gEf8i=vUj#auXouTwvAg)De9FjhazkyQm<$1X^?Zg8uPN3s}8bFHS! zS!N1;tn8Qycdq^L;kH>$QcOdK#AKp{Gr>sEikevBd5Bw0GALyW>_8LRiLNRP?ap+E zO9~aOawBKTD0i!709Pa5A~*VaovbaN3#_|G${eu`5}smxu*%p!9w0<cL)#R~_FhmS zGJY!0mqA_|Y^gT{{D*`$UUTt(-$r~HJlWb`0xR&Dc|?IqwSl#FRzH)V^Kx|+oUa)Q z&%U;%PQQ%Yx!DbWBi~|E%Q;^1OWdT+lgl~4pC$CQ31>#Fh0lOgF}cIn?oPiwJ>TFn z+5n)%a1pJJF1N6WRWd@i+)8nPg<p;#qkBV6;G*ndYV4{Nb{x--63~pd95FW>Y-Q_* z*D4`=$5#P5MLuFwi6@HtZbRd)%-Dj9&U1<XEc*%`w~so9Hz!Q&yH^`m{K?+Pg~LDV zTdSnkNByP8IsHYUkm9Euxt-nlar#?<KN~(sPo3|qx9^t>X6w!*Tt{1+nG98+5B<BJ zPf_4rJC4rAPp?$7{r`fdeCdsYY_}&%!byp#P?lL*Y<*|ae@176g8!3?C3^zrV)cU| zFA?6y+DdFBD~5kdEWVvwoi<dBa#!sbk;G+_P@9aVn5fBmBMQ`CNU=P3C16NED1f-H zdnWFXum9T^ROEm1%2vn6N$|pDjx$%;C;FJm4JBw1jDg9RR!AEXhwhs6^mNm;HN<n` zKDb^+7ZAl^(seV0TX&uP5wk;v4xzO}o%B=pUly^&-;Qr}iOURJ&FR1(^B4eT`Z&Fs z141#dvA}20rx5U*`7o*v{`RTm`yx%G<FUwF@bLX=a5~0Xc;b1dz8ybsh*<TfGn9hF z7kbdU%@K9Xr%DvQr;hS{aNA`O!hJl*jtPH%flU~6%SvX(tLHx&dcLtYA{0brq-AsU zb&k6#8>K|nC&7*jA_ZeJI2ZNs<wB9u^y32do4|g)lhg%c#b6r;KQ;SKtO16AoxJZW zN~W&R>0>h_*y-*dw41iX+&K8}tGA9rPp_;GPHYikkE*Cc$qHFt6^$_D8NwiVgZ$(~ zK#7HO_{sqA<sr8N?I0vh;kCq{erCe(m-G1>ZfF*lRAu-$gBB>b-+eWzqrhwb_h(`n zgHq9h2f{EJq|(J~>JcDvJkudNeI4Fo#<Z0bWhxxeW1t%Ue1Jv*D<ig<a;@cvCJ0!g z6knO#G`NPl%j3=2@0ZM+KkVzY*ybJgL96755`d(%Tr@}}MX|~L-L#ABTOdS*jO>-R zP=UOR9Xms8BW&a)ZFmZ!q&${FUP8+fEK5f*28_U%r($X_gTDwryO*XNPm94%X^-7_ z-+AB77(&(cX=$U5@0K)V##^J1=%vH>G-%%0jHl9hhfF&mBnQ1H*7GN{H^_F~&;`Ch z9DLp8cqY5UhzCv-QF#CT8=-*d?v3z!ASbjt_joX#oZ2H1#C-8G)2{9DwgfGCvC`7M zSqh?*_SJod9(3ihc(IQ$-H900eW{@gFZh~LG0mTGyyNxzE-K-Fa)@3WZ13Wwzr+qh z;$Gp0mbXVXB~qGHm`S(oqUdA=jwSt8AboAm{qR|0n25+7pIzIlmXnf<(2?5mY9;vs zygRRc^6C}I1PWHOb7czw)pw;{&(3G=T0{gJn=S1wQfB2AhtJYk9I&ZC4~!`GsF|U$ z(f;bs;+QDt|Bd+(4h2x48(`T3BPvA$$L0)Tq*NK^p!8!wQitMYya=lfv5s)gOdnT< zzc(qrGN7r2!|^b|^pG@S6o%|{ppUjf#fsDFoR(r}e|KgX*M({!?av`<y+4j#YKH=~ zi{tdcQikqICq}aHsW;yl1mdI;{8{~kCI=L2lMW$cT?YDI%m(<fKdo}I@3+AZ5pbyL z9>G~0ro~TMauEpq;H$l+6ydT`lrHH({WsMwg^$TlTI#X;{`T*nhRqei{O3=x$!*_I z)#&Ra*kj}cJj8k!`PozerOL>~=3PC|kM&0dUbxtoj=--a8f?|RpQLiWyncfW)tIu~ z%r5b{b_;=Ng)(L@mzrj+woV$>%IUDgAsfH33~>G?P>THdtBwV|BY)}R<u!&WR*<Q7 z1wVI(<Qi>$KqcWPo>4|;-3{_}XzeMB%x+-A$&u&adKjkv^Z>yseVnRly&dR^jd*QT zt8H~-0dH=jIG&*`4ABH^PX71FH+3LW!HPVscjBx$%-1M(;!n}q38i+ci+gVM=x}#4 zHt&g=kVCz$odtlI;Fd`g+0=YZAQZnqfG(?NYA)#Vv8sIfoJo_~S0YYvmg@gLL_>kq z0@rdCzc)YDSAWajruf!;`W)9)<fPJ9OQQgIH(2FhAz^*586y>ju@Jfxj1stKjuNo= zxc_#A4iuSsyzY&yvD(x1d3h2n5pqziJc}wDL$-E3xE)LRd&qhZ&6soO2IF6QGPhmd z`d^OGjb2V=UJP-^Up@MG>`(b`?=-FV9*{97Lp{ny&z%;o<hX9Gj$d+mwr)Ho>kG62 z@Rop8D%KE-lK~}<?fAjVUBfp36wJ_UGc-8<<?H_NT7!qEwugXSn$4$*Bm1hbP!zF! zDaQ&zWZWwp=Ti_I?2KOaH<T@E(Z>2Bd3e*iz;p@y-Q%C*p<8+ME70QCDPhPcT5@vb z$C?7Og<d1KN)R1u%}sm9=l+wXp~6cXzfO4r7)D6acGvjf0ov6=f&U;$(>et-Lq<X( zJ|RPDAWOM<4Pdq>?GI0Z375$0$EDn{gXdSU26>}X1U<5Cmp`ihnAN^peOJAHl?PjR zs6E|vf5CXqhFY3$_8gYW6(iyws6ER>_kS77lC9=6;rl|kTcNh~73aYyaSpv4y8*-Z zy_{>jFMk5|I9H9WB-A}ErV@m|!|kuSGHt~8cXEcJN)J?vS*{w!sQ521xXB@6IXgSd z8@~4~P$>|eZCG^r6QFtb9-QQOo}e9adcqJw$bK^LBQ5hGGZcwJh22d@Fq_A@josPW z!$2$j%dUcFg@ozsl7-2vC(4$kRX@Nj@z2B&rz;FrZLPqm{j=luy@~hBPsj2-ks%}3 zSS4U<8M6T;)C(D~?Wh-|^9AwB(6xkq0sLErm%vXYPS}-L+R*o7)EBGMkHg_>WPSl8 zRsQr%q-0UTH(Vv$gf_3&dVJ;az1-=DxJHX>3r%`1EZz{4m7JW=0tzplYVBeFTV;Y! zgmZpiG0Oj;?5%?0?7C>(1b26b;7)+xP9V4iZ`|G8J-E9=fZ*=#5P}AGcW7L?k=^<J zQ|ETquIh{Ko37W^TJs%ij`6_zzbh@fhvOGRleOU<)(`Gu%`{lSN4?+u1R$Ze(<i{D z!`QpnbpzHie=_0scOB!jQ}5K2OCM~+4^H^Y6;c~?d>F@fcRjMy?jhn<>Y_?Fg=k2i z$zf+olylI5*S42?{b?Qo4Z!cSVfK1+WsJE4%^h*nEPEoU&4UjR%iZsrz9tl`SqE}3 z0B0;%4r*z2-3>+eW;j+(aVU;lBgA4-0B*+83Pt)~a@0*B9RU^z@voSXC-A`mnrFBE zQ1+)@5GKOQ43l5=_>cXb=P^<qJTiBeiWR+qwIuLEm~7=&7A9S5>&%1;WbDrIrUki7 zo1|raMD0xFij*p0LccO4vu334_FLnJt_#-&p}0Tf<V^gI;VMNZr-TI4dwTUuq9XV> zp^-|6UM&<&{>tPYmO~@e9c2T(-VNuLW7!-Ac**<<%v(*XAtW}cJiGWJ=5xRUcWpFG z<hnnn%<^o{H;onOGoC?J(#;~C<0dsj<E@hB(zp$g7d%}WMr4mVKAPsSpb<-BDDVfy zRu#R#6o1$kA1v0&SaL9zdt;=WTv&B|B(erl$w+JA(x>)-k8|*-p^Xbs;eMtpCZile zq~Vg@>cq=i+wCP4S?}Egv#WCmC7(f+Q&l;>kW3Hm1=EG3H~ovNqVFD6>rWjaC0$s< z<N=d(Sgp-#$6Z1_zgE?vkRE)B;HxZoPqUSKT={e|j;nNfuu5wEKPaJ_pIE<H({ypM zCke&0*e%DMmg$ESGdmyFg*z<usi;7&1<B3_TtlPvy!5PN5h8b9&Zla!bC7QoS#LE& z10z09A&_I|v~aH}zt5jtafRc%wAgj-2x?8j7FIUkDaiGT4cd@TREyPZQQqm$gF*xJ zfM8o1-;%^FGD(SrbvPwisQ6@J#IQB!!BZ-F8A&Ew$LvmjHM3uqfi2|<tgv-lTtywW zB7nH%si4wRo%uTWfDS2AreELpcQK!{e)9b2Zyyzah^1)J$@Z_XrLVjEJ@U2Z<Ey8Z zjm3qb`kagj3F#9C&pe-l76KM!2wY~{<sGL)XDtl+CRp2!gkO0<lNoXSW%*H27XsAv zCwB$z_}x0D_(UCxj_EM&0ft3&-bbw8fy*1hKYnj1;#Us62x^$)cJ($XI%ZZCuZg@! zR-jWwU$`9pzyxqDrZ>ErzcPpiXIACvle_yi$X^oX;m}gw(kX<d>vdW6;vnHNw%SYo z4Z7kvHbS1-hF)M!UHHYi8Y|_#Q@gG)<nMaEJMF%Zku~+{>vFbEorA)5GlkQXTENk0 zB``(ig#eA;?u%l_ffQ@Q1dnZKbvfaY5EzCHo&VmHi@eGZod|Y4X{{;$0)4HAk|9ip zd8~M5kfb(>WlcqsS<>F)%AFF!2fL+0XSp(79%LYZJ(HH2ZMe~eO-B2<bD#xCq0@S? zdz&}XZUNbK)<>PN5b0~N7wFP!gHEs!KT{%}1r2)hQneX4x;M6DNj-F$^m?Rcm-lKE zn2Px3a|U%<rLUjNC~GbZW)qNW95dP~5-gqvR)`U;D9Ydo(vk{>k6~IhRXG3{uz}q; zkdR{$(;iF&G{V~K&`c~uK0f(28R6#rcsYDTZ^S8hzIwi}<z49VwrNJ}-j$WPZRU3Q zGOAX~@G2!JdFyz6`|9e!#Yd5mmdCV)XH{F1<X*td1-dU7sTr@7J;d)N5%VRI!qVq0 z#zMzr37_w++sdyqL|VGw{sb&F@b0D98Qr_vqN~%M9rh09Wp>3@9mx61F`q!mk=QIZ zDmTqizwcs`v}p3WchFDr_W7b$%3<HEK^5Ezafp-)Jw1UZlD=v~!s{4(bszh{pwFK9 z-o%?0n?a8k2Um$tLh?9hJTY4iM#e1&r_kKW3$5%sYacciv4;G5!dW<-NF`rtkRbcA z;xfhp2>;vC-Y>_^uv0dUQ;GaY)FF%r6A=y(j|PjL`^09x`MJ2GHOZgPo_PdV1F(vG zGn>zLcMHFtcnJWfC7q1z?R_#2J3JW{nIje6K|&m@*SsCJnSN-IXUa{7LyGxlX82yG z=wVUuaB<-xYlMgZqWR%oHvEQM%6!dOnM)<VkO$7XUc0W1luSe#pTH{<bMWOm85iAd z<1a<V>_%tL9K(RjL+TVOMXIG<KZXvd><LVUU~p}~f!p}*zvyLMUpyw?h5M`T^L@J7 z@Z{RjCkiSAC<mzQmz5zc^|+^B1pd7=#ebo;-I|;;RL{eUFDt)Z!a?nsT-co;VVR1= zcK$l!H>CZEm-*O@H&?2(2_+**E#pTKL91$&cCfCrHYwtA=sL-!;sFe8l*}<`f=h{X z*+3`1_ER<6<SX{<>*w~bymm=$8N!@6LXj>HkT&Fr-kMH59M#aUW22$AvDBsX2R%^F z4#l<HB}!L7hE^Y!M}k>;Gn01jQ%)eglHtU6pospye_~&Cw<=#E3*BK-W#IQxJDPnN zv(`0-^6O|X8f>7>eCkXA8O>?b#MOyIK)jxTKaCr94u+@nU4+G@spp|Wn8&(d0kP39 zn25MmC0aqw(Y|g&{&fq*5DO6f6V=e@#fRb6*rclwlbIqjNnz%YMx*I(`{iDw<=2)> z-=zOO`8$@nqIevBCZ6Rg{ZI}4c?V+lTl;zRU)KXUi@m(^-hw>pmsP(E_rAz_aBhZU zU;hz#v)9!$7wTIE^OTa<Bc$wg)Z!wgmSffai2IHBb4(;10}ft$whAe#Y=M_*@0;?k zrmo!I)L+Jj`wdDN+!C6ETOEI&C0~f?2zNDX7#q2a2a`m7VO<VpzJDBp=#%7bnp8ZN zepXw!Gg5W?pz5A3kycNSO#=%XVnKa!COLFy|2Fk6$DTC%2b6Jfg@8DVi<f>eR`6qf z+ABjEq>iq6y%>Lmzd3k4<0%MxWr3xG>xnUKtJVK7?MrJfjUMVjjos-&JK*<9<q7_( z^h=z<0oQ038rgVI$N_2nC?9J2r_mMK2{dq~=SrUR<5G#sP9}%W<pSmc19rjlU(}h+ zfKN^F>rnTxM`A0jd%6s@I<ON7ByGEc2DP5x0%qQ18hmD~rZl5=06|2^X?ZS))M|>I z@jAj3x2D!<CsB&$A(=QwzIrsGEL%_ua56A_ExVpD(@oGDjQtM@8u8V}jhlY#qc)t3 zGAww0PBIa%O+8VUt;C&i^k|<$ENw|2P2Zs5P4+Aq-3okTlyb4((07P<mq~e*(sh2j z!6mD833LMcX^q!5Gs)Q-`pL907V>zY5h*3mEWP`AX|%F~<${-FSdptp&eO9K)~-Dd zVu+{TG+Wd6K664gQ@8Zdgf}k;cb6YF?l7?CHkn~A5kr(pf-QDXo>T?$i-l<oyQ3}o z)7Sa>gTC-!x1+xjL2vnzglzgjX+Hu+)vg{iKI7#^?Mw>?LPB5Tf(2^BXyvJXD1-iF z#RT*HEsS&o2%5n43l!x8PGc-?9G{T*qcj(GlM8j&v7<u!o<1CG`~GrhF9?}wevk=~ z-nt)zzfV3aKX(>g${kY{xEGjPAAz|nMz#0dlv*mkvTgEla_A=Zpsg^9>4Df@{#%`i zZTw6+%@PjRlO|wr6q3}_SD`MrGF3Sf5)3fr@hm;oNH5Nk*>Bm%6<0Qyb)6dp;$I$h zA@Rys^Z5e|&yQsgxvlzKPW}vB{j+J(QTexl^`p1nx(<m|fL+4@MCC~$&d(iPx>w@E zE_J03LEOx_P7XeW8qL-%J-C2>qYZL58WwW8QY3&fFn;1e4OJ>J_2VDaois06<f2W8 zTlSsvG~FN+`n0g$s5qJmvF{#j+}ixycg;Qcos$xJa(h?+Ob~Nca83HF%3;1r4QZE- zA$SOZv7c%_5=&3+{|ieune*eVw^zpg0>!K+8yqiU{F{`=aIUtt|D}vfO3;TMVVH;7 zcR$fkP`(eOvTr8J%_&|g@Zh1ECmhQ*xAiBH%&X3ZojTNRW!#ZwC~Y+z)UJ@IM~#*q z$qx%>lj7M^a(2u}-sG)valI46Ycz>F^xx_*vbsF<R;CsiN&5vBoRvhgv?Z0C8v&b? z7CT<vB|>9$wIp)}&)n{B<lbf$Fa(vl`9VUJf{W~{XTf~y{0O}1`0IFlx~{r*H?6F2 zKyWBiwUP#aAv+^U*JH5o;C{cC7^CgY50zDIjO}!^dIP0<1%(Aw%fxMeO4ROc@5r|C z#;=4Qy0W<aJwsJs^7%2b6?p5VoyknA+8MvWRdp{-OFbVc>TZul=KoU5dl3VHdgodE zo*%zaU6RidL|l5?^@cbN4E&cqUiwiw0Ti&M#g|$ei9@Ug5G-%`qxq<U5T`l)owz}< zgh7d%WyTL?_+u=I?bk|=+jDF7{ToUz<e!Uvet&Q|5_yZsCT~lhBu}&{a(Of$AKI%G zj&EcYR;oc%I_)BaM9l343bQu?iQ|GS@`8W91$}P~Pmx5?=hb9|y&5q@MQbTyg7=Wm zCq{xqQAxLUvcg`5UOumSQ`x@XJ=f>o7E8qsd`)*(4CRn48#3?2Ukr?ZI%;}$ak>o4 zeOJsT(MQ3?#E0P!_Ye)*uB-dP<!Doot_w?3KQ@o8YmTqh@cYKQyt||!N|z%9{I~LE z`?EID>zT{-$Wer53r}m4!&VNd<HwotL|n^VvB{7{4>bagMT6>iXNdw!#1YRP;dXMz z!ar#X-pM#rEHHXG`^j=UBSn`E(P2ObUkx%aLc{T43sA(&uGsErqNNn??P{A%jhOWB zc7tgqnr%Kn_T^&H{I}NdDeQ%O2D`rgY1VlTiF}42rXN_^AC>g?i&uSg$jgghj?ZSh zbGeOF9BFL(?2t76tT^v#Tv~&rJtCvp(^iD={>}^z%>qQ#F8qjG!^hA;F@JjhZ88DI z$6AV?&13jDa&C*ewjgl&Q(;s>xZth_>g|TBpq?i}1%basMS)3eZ2zP7L=C528)@iV zYPLANu-VZYH2lNp%26&$Iz+=A+iAOtlG|7P0IFO$S;ZN6io|9I{_%2V2#md7h@M!$ z+|~DOxM1pX4FjBitbtgLa9FxES?^&s)};T<)Unm|i6^uW!ehUraip)>E1nFQs$2_! zYG-kYwlitMM9S-ks`iSL-{mOeNq0QkGfES(=UEpNP?HwXY)Ak-PD|`&?HFv4yUW?d zyy(Om?}J`uu{?7Cpv$?3fiTRyqO9ijU@GO%H3N9;c2_}qED3-V-X9$9Ac*X?+_JE6 zZTA$9k6O{#+SHU@UR~}R5Yh17iP7YD`N-TVpwofY5l~d`{|X0jxGvUeM;ieAN#DS= z76(~1&%P`8kU??274X4h!>JW;nuY)NY5-`XZzxe!k#^AUC}=UM&|g!Oy__RN7x1v{ z9B5SsuEqPUMek$PxwwrE(e8L&kWUwsc0q0VULii%vZO#1qNcU${%ASnCMTwRh!>j- ze35@OYvZuf{mznTGhnhpA`Hp8r1woqi9-F?0EuhEGa>g8$4(De9K88w?1|ClpycW) zOZVdgkMhl#%sKtV#`*M?pquG*9@fk5s=-)EjhD+fG4I)3BP1F!#GV`!TL0&5D<pm! z#Pm~AqW?~vN%<17I0`nHeMV1_V*4jLd066+K{)1-UesOTj=@CO;HvU;br^MCmpt$F zM*u*%o}W!yVg+DdHUw{4a+hwWfVZ5b%U?6?pm77b>7x5h4QB;*(iTet@U^fhBvGK> z(HY6VE_6VOlmJ_U9^uZ}nSC~!JptV!F8_A})?c51wZ*Z<;NSpZZKp|Xudd0FIC4b8 zH^M6U3)7Or(eJFuOu@+!l*zy6d6wVP58nv7=Rl;eu?66BmJ(&#QTQm*ov&8xzX#%s zr_|M>SKs|8(xK)B-_g``5@AQ99|Z#~?0bmg4esTtp4)7U-v2h#I=wgd4t2i!t3agf zBZsc&fc0BxNUPSQ&C=clzP{Lfzbr%tJz(pGx49N>r*_(I=h^vH4#`C=UunUve19{T zzhD+K85gz%0g35#-;&pfMBCXwM_5s>L9W}I3Z0%gYu`KrmdB15vy(^LVsRzRpmEmC z%58obv^Dhz4J)~`IcGTLnw{&!;jnWEZWIimw=6&CQ9vrfK0^OX8s3vBFvoF>%d#u0 z`T8qGIJ2OEeJolle}h`2z8^d?gg~R3d0OJmI%fK=rQed!m-;GkaNpi35pgfk>S1XH zuPwAJ=y^qmsIn@86;3@C0tQ#-r=;;>y%DrGy_=fd^PXRrF<|RR-#Jsm{dUE33&^xj zcuA+3a1mUyIC;{}ASlb$-u6uF<xqJ0jH*-2N8^*wLifB6=dd*a)79JCoeDx$#7Q~e zR(@?#XLXZmH$%s6&kb`N>@+Zb&y6p#A0Gu=rER=?(9x($)cquZw{f_-H*vJ4z7?9= z`VKpcE*#d-+xuhS3_==G>P^)hYy@^LX!$>Wdb(+WuLtkdLNd<imo7|2Y(GPVN^7sd zEJ!WVAxtMt4<PAHKN9aen|A|}lK6*$dm0j>jZM5f`^k`i_y=N#j#lRB8%J3}Z2~H= zrEbN}4oO7$+TF{C7-{RDklSIZq!I=FZV~_+my8(etnFxytuO%_5dULyS9t!n3xAJr zw2Sp_$~obuNIP;|hH`DAX}s38u&VVpXNE7TaHtlo^8NvMw|kcMQ)eL@>6?AOsRO>j zz#cM@wLvR@i*(Cx%BBWF&m3$FYLAO~wCuLA!<jo0mejyg@tfiRsV_IBfA$YLa@SN^ zZ3MzuJ2KJ-tGCo{Lxo=xh0Lj#p0D<b1Gbx?k66VIGY}nhtLfjYts>sq&wYl=EDB4E zMOv7j;{j_<mF>xj;{D@gjZk2FxvgE6kd?uYG|u$kOSzQV=N^goOb?Mihr;uCb`r1l z-lW7G!+nAlyIibecCo0wbtKiA-EPoC6A!L}`f^*LQ>Ie=InQ0T)wTUS<h^4347UYG zRGSeS`8}hd)mvW&B82HCgD7cYAGdA~q?g|wnB@19>Ejg5yb$M4kA-vhXcg1b`5Wwz zHxdqj(gukIMSvq`sh($KZ?dTAQ&Jw79$SXbAKN(`gF2n?*^uK<dgfus@RycE@P(Vt z18h9Rn|(x5L~O$b@HVL`NdyR@s<`@2LOqs*pU}Qfuza-T8?QT*qZ}A0tacE4xeVma zOp;vYEWz2?nbG7P_>Nb{OfEzJmypH`>=#1plk<igDp?^L1g|<zP_4e*#Yk7d@1sP5 zMa1$o_J^;6to)^Sf;liabVvMdRKJVohH70}9lblUXgFaacTFZ|Q;2~qty#%<uDP}` z>mR8{H?hSR3Gao{8GJ=mzTPf0ApGY)n@VJQM|->wqw^?dVY0}*>51u1+{I1l*XK4C zNSJ6Z{WAz#pA-?4{dY@W2VH(F=^HA0DB@={o2~XcR7?5m<A75r{hCdwB0C<?v>rn2 zCXV}So_Kyvcn_yysvL?}0HUs%&;y4Gk^EF>vZvsddoai)__uv0>ac<DSo*UEM;#EW zB;erC&2m$d8J8-7-xEhQ0wrAzrRA+Bb*oQ9Gq&GCukTIr9B#a2G#(%9gUWYCrQh;B zZEt&(Jb~Mu5eqUwt4qXNZQiLF${OK2dcEe7_kNPRL_`{%RG;aix}2lp&3cOQejxYJ zI@p7S<N!IFPsr}Nh%i<{gHFv^btIgAW@XMOgbL6{hOQc$_+=MV+9cY<3G%xm38z(z z@HsJ(v3X?wMed+NU8Jv@`8gEtPVTRHG!j%Gi5U@%(O#G!niIP^stAG4jH&-4X?c|F zPPl(0oZA!&lojl9<vv`5i(GEPCFo$s_(<dJBc1r?#G1UQ>9K08`_g@1A$Ky(GWjO* z)8Xj7??jS?O3SWGi|<SE;z|8>rpL1C5m39?j8sEp<=Ss-xzayOn3Enwd4F#&p9jb` z7zOV?nHH4%{=|y~M%lkl1l4+-Vt%*RnN0hX%y~^M|1vCO%TTvj)~b)Bxi)>IPa$a! z6g!Ix=}&~J9vymvLTdZ2vD}1OXA>IVvWN@+N#F|+kH8mU8bL;QfiDVmr^V<n0;&WT zR_wgkg*V6BYMwi)t^F015o!{wT07SasaMu3&@rRPG#=eZ@pF}7<9SH9f6l4OOS46= z(^)M4F7;QY!0nMK(6ToR#7C}*>Ckw*FuFWn#V$nSO822_{#aKYK=`K5gOu%~ysx^U zP~{OHxlRvWE~es9?eXugR{&^`nXlh!D*uH3yqyG24Q5e(KJ%%S)>T*vp@E@;gTNBd zu-0xc9ni@mS`;)x!rQJ?V9;P=#nI!ZQQ6|q<?7p6@SR$&>H}l|kPO29>L|a2rJaI@ z<3v-2ZDRqF>TpH~0pLJ2P;klfX9rjU7#*Q&BwbuVf}6!s$H*_W$j+OTxV)N<{H**< zo@e+XOaVW;7I^&wa?@RvM4jWD64##p2&0gsnRAdvsJ&iZEZ>}Rp3^A|XfRCUF5k^z zi$g%F-7%I>>Fj)SiF2|JRA{8Ioz3!dc@fAl@!M2;22SNCK;FNO_@HvS-$HQ;yVZOU zLzb8^XS>-4>@aEJJv=`+KMm?2xtX3hVXzALj=)ZY_*s6R$S?A|wjg-XLOk4uU21Jg zB8iUuSOX|;2-RVr6(sksccpjGEXH0KZ+I*Eb`pKZbdUR+`d1}qN=Sw@WURxEvYBo9 zM;-KbqGjv*LuKo~(Dig3F`mDlFtz_<Z@`UxrOfKPH*x)WvveQvTYh7KpeplYE)~U0 zQfhlfO(%-isR|@~8_qOl=;RYy-&1g=^W<zuRq6F&joRDDD$ucTx?uV=YTF+gz=?5$ zDsmO0|Ay{575tlyCIbO)boNKH0rg>){fOrv6|L>9kw$4@uR9iYSFc1|smrNlP(j&= ziU(|v=u9Uc*#_<iO6HIDzlVbd&U+yan**C6LXV7Z%0D=Vjb47qEZ4cQ=&VtJzmp+i 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 CEG63j literal 0 HcmV?d00001 diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 07d8e7f48c..9404cd6ba6 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -6,6 +6,19 @@ common: misskey: "A ⭐ of fediverse" about-title: "A ⭐ of fediverse." about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。" + intro: + title: "Misskeyって?" + about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。" + features: "特徴" + rich-contents: "投稿" + rich-contents-desc: "自分の考え、話題の出来事、皆と共有したいことについて発信してください。必要であれば、様々な構文を使って投稿を装飾したり、好きな画像、動画などのファイルやアンケートを添付することもできます。" + reaction: "リアクション" + reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません。" + ui: "インターフェース" + ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。" + drive: "ドライブ" + drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。" + outro: "他にもMisskeyにしかない機能はまだまだあるので、ぜひあなた自身の目で確かめてください。Misskeyは分散型SNSなので、このインスタンスが気に入らなければ他のインスタンスを試すこともできます。それでは、GLHF!" adblock: detected: "広告ブロッカーを無効にしてください" warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。" diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 549d9175f3..441ce890d0 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -7,86 +7,128 @@ <mk-forkit class="forkit"/> - <div class="body"> - <div class="main block"> - <div> - <h1 v-if="name != 'Misskey'">{{ name }}</h1> - <h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1> - - <div class="info"> - <span><b>{{ host }}</b> - <span v-html="'%i18n:@powered-by-misskey%'"></span></span> - <span class="stats" v-if="stats"> - <span>%fa:user% {{ stats.originalUsersCount | number }}</span> - <span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span> - </span> - </div> - - <p class="desc" v-html="description || '%i18n:common.about%'"></p> - - <p class="sign"> - <span class="signup" @click="signup">%i18n:@signup%</span> - <span class="divider">|</span> - <span class="signin" @click="signin">%i18n:@signin%</span> - </p> - - <img src="/assets/pointer.png" alt="" class="char"> - </div> - </div> - - <div class="announcements block"> - <header>%fa:broadcast-tower% %i18n:@announcements%</header> - <div v-if="announcements && announcements.length > 0"> - <div v-for="announcement in announcements"> - <h1 v-html="announcement.title"></h1> - <div v-html="announcement.text"></div> - </div> - </div> - </div> - - <div class="photos block"> - <header>%fa:images% %i18n:@photos%</header> - <div> - <div v-for="photo in photos" :style="`background-image: url(${photo.thumbnailUrl})`"></div> - </div> - </div> - - <div class="tag-cloud block"> - <div> - <mk-tag-cloud/> - </div> - </div> - - <div class="nav block"> - <div> - <mk-nav class="nav"/> - </div> - </div> - - <div class="side"> - <div class="trends block"> + <main> + <div class="body"> + <div class="main block"> <div> - <mk-trends/> + <h1 v-if="name != 'Misskey'">{{ name }}</h1> + <h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1> + + <div class="info"> + <span><b>{{ host }}</b> - <span v-html="'%i18n:@powered-by-misskey%'"></span></span> + <span class="stats" v-if="stats"> + <span>%fa:user% {{ stats.originalUsersCount | number }}</span> + <span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span> + </span> + </div> + + <p class="desc" v-html="description || '%i18n:common.about%'"></p> + <a class="about" @click="about">%i18n:@about%</a> + + <p class="sign"> + <span class="signup" @click="signup">%i18n:@signup%</span> + <span class="divider">|</span> + <span class="signin" @click="signin">%i18n:@signin%</span> + </p> + + <img src="/assets/pointer.png" alt="" class="char"> </div> </div> - <div class="tl block"> - <header>%fa:comment-alt R% %i18n:@timeline%</header> - <div> - <mk-welcome-timeline class="tl" :max="20"/> + <div class="announcements block"> + <header>%fa:broadcast-tower% %i18n:@announcements%</header> + <div v-if="announcements && announcements.length > 0"> + <div v-for="announcement in announcements"> + <h1 v-html="announcement.title"></h1> + <div v-html="announcement.text"></div> + </div> </div> </div> - <div class="info block"> - <header>%fa:info-circle% %i18n:@info%</header> + <div class="photos block"> + <header>%fa:images% %i18n:@photos%</header> <div> - <div v-if="meta" class="body"> - <p>Version: <b>{{ meta.version }}</b></p> - <p>Maintainer: <b><a :href="meta.maintainer.url" target="_blank">{{ meta.maintainer.name }}</a></b></p> + <div v-for="photo in photos" :style="`background-image: url(${photo.thumbnailUrl})`"></div> + </div> + </div> + + <div class="tag-cloud block"> + <div> + <mk-tag-cloud/> + </div> + </div> + + <div class="nav block"> + <div> + <mk-nav class="nav"/> + </div> + </div> + + <div class="side"> + <div class="trends block"> + <div> + <mk-trends/> + </div> + </div> + + <div class="tl block"> + <header>%fa:comment-alt R% %i18n:@timeline%</header> + <div> + <mk-welcome-timeline class="tl" :max="20"/> + </div> + </div> + + <div class="info block"> + <header>%fa:info-circle% %i18n:@info%</header> + <div> + <div v-if="meta" class="body"> + <p>Version: <b>{{ meta.version }}</b></p> + <p>Maintainer: <b><a :href="meta.maintainer.url" target="_blank">{{ meta.maintainer.name }}</a></b></p> + </div> </div> </div> </div> </div> - </div> + </main> + + <modal name="about" :class="$store.state.device.darkmode ? ['about', 'modal-dark'] : ['about', 'modal-light']" width="800px" height="auto" scrollable> + <article class="fpdezooorhntlzyeszemrsqdlgbysvxq"> + <h1>%i18n:common.intro.title%</h1> + <p v-html="'%i18n:common.intro.about%'"></p> + <section> + <h2>%i18n:common.intro.features%</h2> + <section> + <div class="body"> + <h3>%i18n:common.intro.rich-contents%</h3> + <p v-html="'%i18n:common.intro.rich-contents-desc%'"></p> + </div> + <div class="image"><img src="/assets/about/post.png" alt=""></div> + </section> + <section> + <div class="body"> + <h3>%i18n:common.intro.reaction%</h3> + <p v-html="'%i18n:common.intro.reaction-desc%'"></p> + </div> + <div class="image"><img src="/assets/about/reaction.png" alt=""></div> + </section> + <section> + <div class="body"> + <h3>%i18n:common.intro.ui%</h3> + <p v-html="'%i18n:common.intro.ui-desc%'"></p> + </div> + <div class="image"><img src="/assets/about/ui.png" alt=""></div> + </section> + <section> + <div class="body"> + <h3>%i18n:common.intro.drive%</h3> + <p v-html="'%i18n:common.intro.drive-desc%'"></p> + </div> + <div class="image"><img src="/assets/about/drive.png" alt=""></div> + </section> + </section> + <p v-html="'%i18n:common.intro.outro%'"></p> + </article> + </modal> <modal name="signup" :class="$store.state.device.darkmode ? 'modal-dark' : 'modal-light'" width="450px" height="auto" scrollable> <header class="formHeader">%i18n:@signup%</header> @@ -147,6 +189,10 @@ export default Vue.extend({ }, methods: { + about() { + this.$modal.show('about'); + }, + signup() { this.$modal.show('signup'); }, @@ -199,6 +245,54 @@ export default Vue.extend({ margin 0 48px font-size 1.5em +.v--modal-overlay.about + .v--modal-box.v--modal + margin 32px 0 + +.fpdezooorhntlzyeszemrsqdlgbysvxq + padding 64px + + > p:last-child + margin-bottom 0 + + > h1 + margin-top 0 + + > section + > h2 + border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05) + + > section + display grid + grid-template-rows 1fr + grid-template-columns 180px 1fr + gap 32px + margin-bottom 32px + padding-bottom 32px + border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05) + + &:nth-child(odd) + grid-template-columns 1fr 180px + + > .body + grid-column 1 + + > .image + grid-column 2 + + > .body + grid-row 1 + grid-column 2 + + > .image + grid-row 1 + grid-column 1 + + > img + display block + width 100% + height 100% + object-fit cover </style> <style lang="stylus" scoped> @@ -226,16 +320,11 @@ root(isDark) font-size 18px color isDark ? #fff : #444 - > .body - display grid - grid-template-rows 1fr 1fr 256px 64px - grid-template-columns 1fr 1fr 350px - gap 16px - width 100% - max-width 1200px - height 1200px + > main margin 0 auto padding 64px + width 100% + max-width 1200px .block color isDark ? #fff : #444 @@ -259,137 +348,144 @@ root(isDark) > div overflow auto - > .main - grid-row 1 - grid-column 1 / 3 - border-top solid 5px $theme-color + > .body + display grid + grid-template-rows 1fr 1fr 256px 64px + grid-template-columns 1fr 1fr 350px + gap 16px + height 1200px - > div - padding 32px - min-height 100% - - > h1 - margin 0 - - > img - margin -8px 0 0 -16px - max-width 280px - - > .info - margin 0 auto 16px auto - width $width - font-size 14px - - > .stats - margin-left 16px - padding-left 16px - border-left solid 1px isDark ? #fff : #444 - - > * - margin-right 16px - - > .sign - font-size 120% - - > .divider - margin 0 16px - - > .signin - > .signup - cursor pointer - - &:hover - color $theme-color - - > .char - display block - position absolute - right 16px - bottom 16px - width 180px - opacity 0.3 - - > *:not(.char) - z-index 1 - - > .announcements - grid-row 2 - grid-column 1 - - > div - padding 32px + > .main + grid-row 1 + grid-column 1 / 3 + border-top solid 5px $theme-color > div - padding 0 0 16px 0 - margin 0 0 16px 0 - border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05) + padding 32px + min-height 100% > h1 margin 0 - font-size 1.25em - > .photos - grid-row 2 - grid-column 2 + > img + margin -8px 0 0 -16px + max-width 280px - > div - display grid - grid-template-rows 1fr 1fr 1fr - grid-template-columns 1fr 1fr - gap 8px - height 100% - padding 16px + > .info + margin 0 auto 16px auto + width $width + font-size 14px - > div - //border-radius 4px - background-position center center - background-size cover + > .stats + margin-left 16px + padding-left 16px + border-left solid 1px isDark ? #fff : #444 - > .tag-cloud - grid-row 3 - grid-column 1 / 3 + > * + margin-right 16px - > div - height 256px - padding 32px + > .sign + font-size 120% - > .nav - display flex - justify-content center - align-items center - grid-row 4 - grid-column 1 / 3 - font-size 14px + > .divider + margin 0 16px - > .side - display grid - grid-row 1 / 5 - grid-column 3 - grid-template-rows 1fr 350px - grid-template-columns 1fr - gap 16px + > .signin + > .signup + cursor pointer - > .tl - grid-row 1 - grid-column 1 - overflow auto + &:hover + color $theme-color - > .trends + > .char + display block + position absolute + right 16px + bottom 16px + width 180px + opacity 0.3 + + > *:not(.char) + z-index 1 + + > .announcements grid-row 2 grid-column 1 - padding 8px - - > .info - grid-row 3 - grid-column 1 > div + padding 32px + + > div + padding 0 0 16px 0 + margin 0 0 16px 0 + border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05) + + > h1 + margin 0 + font-size 1.25em + + > .photos + grid-row 2 + grid-column 2 + + > div + display grid + grid-template-rows 1fr 1fr 1fr + grid-template-columns 1fr 1fr + gap 8px + height 100% padding 16px - > .body - > p - display block - margin 0 + > div + //border-radius 4px + background-position center center + background-size cover + + > .tag-cloud + grid-row 3 + grid-column 1 / 3 + + > div + height 256px + padding 32px + + > .nav + display flex + justify-content center + align-items center + grid-row 4 + grid-column 1 / 3 + font-size 14px + + > .side + display grid + grid-row 1 / 5 + grid-column 3 + grid-template-rows 1fr 350px + grid-template-columns 1fr + gap 16px + + > .tl + grid-row 1 + grid-column 1 + overflow auto + + > .trends + grid-row 2 + grid-column 1 + padding 8px + + > .info + grid-row 3 + grid-column 1 + + > div + padding 16px + + > .body + > p + display block + margin 0 .mk-welcome[data-darkmode] root(true) From 82ee3a538be54992fad21137a6ae66f662f59d0f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 8 Sep 2018 15:28:38 +0900 Subject: [PATCH 172/539] Improve welcome page --- src/client/app/mobile/views/pages/welcome.vue | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue index f5014d585f..74f43f2c71 100644 --- a/src/client/app/mobile/views/pages/welcome.vue +++ b/src/client/app/mobile/views/pages/welcome.vue @@ -30,6 +30,34 @@ <div v-html="announcement.text"></div> </article> </div> + <article class="about-misskey"> + <h1>%i18n:common.intro.title%</h1> + <p v-html="'%i18n:common.intro.about%'"></p> + <section> + <h2>%i18n:common.intro.features%</h2> + <section> + <h3>%i18n:common.intro.rich-contents%</h3> + <div class="image"><img src="/assets/about/post.png" alt=""></div> + <p v-html="'%i18n:common.intro.rich-contents-desc%'"></p> + </section> + <section> + <h3>%i18n:common.intro.reaction%</h3> + <div class="image"><img src="/assets/about/reaction.png" alt=""></div> + <p v-html="'%i18n:common.intro.reaction-desc%'"></p> + </section> + <section> + <h3>%i18n:common.intro.ui%</h3> + <div class="image"><img src="/assets/about/ui.png" alt=""></div> + <p v-html="'%i18n:common.intro.ui-desc%'"></p> + </section> + <section> + <h3>%i18n:common.intro.drive%</h3> + <div class="image"><img src="/assets/about/drive.png" alt=""></div> + <p v-html="'%i18n:common.intro.drive-desc%'"></p> + </section> + </section> + <p v-html="'%i18n:common.intro.outro%'"></p> + </article> <div class="info" v-if="meta"> <p>Version: <b>{{ meta.version }}</b></p> <p>Maintainer: <b><a :href="meta.maintainer.url" target="_blank">{{ meta.maintainer.name }}</a></b></p> @@ -206,6 +234,46 @@ root(isDark) > .title font-weight bold + > .about-misskey + margin 16px 0 + padding 32px + font-size 14px + background #fff + border-radius 6px + overflow hidden + color #3a3e46 + + > h1 + margin 0 + + & + p + margin-top 8px + + > p:last-child + margin-bottom 0 + + > section + > h2 + border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05) + + > section + margin-bottom 16px + padding-bottom 16px + border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05) + + > h3 + margin-bottom 8px + + > p + margin-bottom 0 + + > .image + > img + display block + width 100% + height 120px + object-fit cover + > .info padding 16px 0 border solid 2px #ddd From d44dc7e00d54d4c1cf0f18faf60b53b7e88545a6 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 8 Sep 2018 15:30:07 +0900 Subject: [PATCH 173/539] 8.32.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a3e7786226..32396cb64e 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.31.0", - "clientVersion": "1.0.9486", + "version": "8.32.0", + "clientVersion": "1.0.9489", "codename": "nighthike", "main": "./built/index.js", "private": true, From 0e01fb5fc31f30c1075e0384bf38dfc345e9f161 Mon Sep 17 00:00:00 2001 From: "pengin.nu" <37444014+penginnu@users.noreply.github.com> Date: Sat, 8 Sep 2018 17:10:47 +0900 Subject: [PATCH 174/539] Update setup.ja.md (#2663) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sudoに関する記述を追加 --- docs/setup.ja.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/setup.ja.md b/docs/setup.ja.md index 2758e6f231..609f3e9aa5 100644 --- a/docs/setup.ja.md +++ b/docs/setup.ja.md @@ -109,6 +109,7 @@ Restart=always [Install] WantedBy=multi-user.target ``` +CentOSで1024以下のポートを使用してMisskeyを使用する場合は`ExecStart=/usr/bin/sudo /usr/bin/npm start`に変更する必要があります。 3. `systemctl daemon-reload ; systemctl enable misskey` systemdを再読み込みしmisskeyサービスを有効化 4. `systemctl start misskey` misskeyサービスの起動 From 08c278578d2dc9329776e48111e4e10bc6a917ae Mon Sep 17 00:00:00 2001 From: tamaina <tamaina@hotmail.co.jp> Date: Sat, 8 Sep 2018 19:03:20 +0900 Subject: [PATCH 175/539] use svg and cdn to download reactions (#2665) --- .../common/views/components/reaction-icon.vue | 22 +++++++++--------- src/client/assets/reactions/angry.png | Bin 4606 -> 0 bytes src/client/assets/reactions/confused.png | Bin 6058 -> 0 bytes src/client/assets/reactions/congrats.png | Bin 10000 -> 0 bytes src/client/assets/reactions/hmm.png | Bin 5874 -> 0 bytes src/client/assets/reactions/laugh.png | Bin 6933 -> 0 bytes src/client/assets/reactions/like.png | Bin 4822 -> 0 bytes src/client/assets/reactions/love.png | Bin 2805 -> 0 bytes src/client/assets/reactions/pudding.png | Bin 7595 -> 0 bytes src/client/assets/reactions/rip.png | Bin 6793 -> 0 bytes src/client/assets/reactions/surprise.png | Bin 3806 -> 0 bytes src/client/assets/reactions/sushi.png | Bin 8651 -> 0 bytes 12 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 src/client/assets/reactions/angry.png delete mode 100644 src/client/assets/reactions/confused.png delete mode 100644 src/client/assets/reactions/congrats.png delete mode 100644 src/client/assets/reactions/hmm.png delete mode 100644 src/client/assets/reactions/laugh.png delete mode 100644 src/client/assets/reactions/like.png delete mode 100644 src/client/assets/reactions/love.png delete mode 100644 src/client/assets/reactions/pudding.png delete mode 100644 src/client/assets/reactions/rip.png delete mode 100644 src/client/assets/reactions/surprise.png delete mode 100644 src/client/assets/reactions/sushi.png diff --git a/src/client/app/common/views/components/reaction-icon.vue b/src/client/app/common/views/components/reaction-icon.vue index 46886b8ab2..61a3baa273 100644 --- a/src/client/app/common/views/components/reaction-icon.vue +++ b/src/client/app/common/views/components/reaction-icon.vue @@ -1,17 +1,17 @@ <template> <span class="mk-reaction-icon"> - <img v-if="reaction == 'like'" src="/assets/reactions/like.png" alt="%i18n:common.reactions.like%"> - <img v-if="reaction == 'love'" src="/assets/reactions/love.png" alt="%i18n:common.reactions.love%"> - <img v-if="reaction == 'laugh'" src="/assets/reactions/laugh.png" alt="%i18n:common.reactions.laugh%"> - <img v-if="reaction == 'hmm'" src="/assets/reactions/hmm.png" alt="%i18n:common.reactions.hmm%"> - <img v-if="reaction == 'surprise'" src="/assets/reactions/surprise.png" alt="%i18n:common.reactions.surprise%"> - <img v-if="reaction == 'congrats'" src="/assets/reactions/congrats.png" alt="%i18n:common.reactions.congrats%"> - <img v-if="reaction == 'angry'" src="/assets/reactions/angry.png" alt="%i18n:common.reactions.angry%"> - <img v-if="reaction == 'confused'" src="/assets/reactions/confused.png" alt="%i18n:common.reactions.confused%"> - <img v-if="reaction == 'rip'" src="/assets/reactions/rip.png" alt="%i18n:common.reactions.rip%"> + <img v-if="reaction == 'like'" src="https://twemoji.maxcdn.com/2/svg/1f44d.svg" alt="%i18n:common.reactions.like%"> + <img v-if="reaction == 'love'" src="https://twemoji.maxcdn.com/2/svg/2764.svg" alt="%i18n:common.reactions.love%"> + <img v-if="reaction == 'laugh'" src="https://twemoji.maxcdn.com/2/svg/1f606.svg" alt="%i18n:common.reactions.laugh%"> + <img v-if="reaction == 'hmm'" src="https://twemoji.maxcdn.com/2/svg/1f914.svg" alt="%i18n:common.reactions.hmm%"> + <img v-if="reaction == 'surprise'" src="https://twemoji.maxcdn.com/2/svg/1f62e.svg" alt="%i18n:common.reactions.surprise%"> + <img v-if="reaction == 'congrats'" src="https://twemoji.maxcdn.com/2/svg/1f389.svg" alt="%i18n:common.reactions.congrats%"> + <img v-if="reaction == 'angry'" src="https://twemoji.maxcdn.com/2/svg/1f4a2.svg" alt="%i18n:common.reactions.angry%"> + <img v-if="reaction == 'confused'" src="https://twemoji.maxcdn.com/2/svg/1f622.svg" alt="%i18n:common.reactions.confused%"> + <img v-if="reaction == 'rip'" src="https://twemoji.maxcdn.com/2/svg/1f607.svg" alt="%i18n:common.reactions.rip%"> <template v-if="reaction == 'pudding'"> - <img v-if="$store.getters.isSignedIn && $store.state.settings.iLikeSushi" src="/assets/reactions/sushi.png" alt="%i18n:common.reactions.pudding%"> - <img v-else src="/assets/reactions/pudding.png" alt="%i18n:common.reactions.pudding%"> + <img v-if="$store.getters.isSignedIn && $store.state.settings.iLikeSushi" src="https://twemoji.maxcdn.com/2/svg/1f363.svg" alt="%i18n:common.reactions.pudding%"> + <img v-else src="https://twemoji.maxcdn.com/2/svg/1f36e.svg" alt="%i18n:common.reactions.pudding%"> </template> </span> </template> diff --git a/src/client/assets/reactions/angry.png b/src/client/assets/reactions/angry.png deleted file mode 100644 index 7e32dd6809bc85dfd060498d2170ebd181f4700e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4606 zcmZ{ocQ_l~_s1hdiJ~g4S*liIQ+u`csF2uV1vNs6`N4-G(b7`2S8MMUsVzonXsKPb zY6sO8wfFw|{Q3Licb|LC>$&%w_jCR`_c`|^!cd1E%nk+s0Q7pgn#NZQ`p;;nue`!z z+3#1Na#e$?0RYwUbY~8rtMgqaU1K-^@UH*>5b+EEIJvrt_yYh0NB{t<XaGPl0{~$0 z&T2*~Uj?WgAL(db@oF7ww1i)Q)?3%g4*)1V{m&?rH5}*xfE&|#nrfy&Q|q=KDYnkR z7lZwL8tM{iNeZX4t~Yf*@jc9#9Lk~Pp<~i2i$P0*t<;B&E9x8WiB(v_EFsQgx1M~= zyJ!CHHdYi^c|&(F>>%^A_SWkLs~5V^!xsrDR6U+a7e6+0YL&7dyKL4DO`h7c)gQzk z%gi6=Z0^|Q90td&yc+!TYVhlmZ}|M@cHq~gWC^fh?00Y{%fu0$3mgSIk^)&ngH%8+ zOMjQMLGDw`9-ZH`SwMowEetp(pBxbu_^o51PO+3oiwmHC<b}h3f!G+4mYC3;n_A#G z16;m*ww4DN4eF|mx(@0_c*}qoO{&6y-kqCvV3)wT#Vp1lE@_gUW+Gk~`on<qhbMx* z-4<e_i({)+DwS^+Z2a>KkXvrCiDRAD2LJlU(1+P(2-2UQ$H`3o2x(O!&dm<0|2lZn za07p44i4jH{+WyXHm~qyz$eBPxwR=tF=s?FOKlQloys=Jnvdwhr}BKo7NK<v61b7! z3b}J?RX(CdSqF2^AgrhiHBz7>Ff;-$evDrUGkkclJ;U!%<-!HB&qLn<>6oC~8iO3H z?MI^U7A9LZ1`(G!qCO@K*Q74)I1%Q3ATwM(r)_$qM7V?a(ITsT79Ojll3I`~`*j3* z)J;`-^Z=S5!jizxip_C?%0I`Sb`4;;K_0%jBHNxB`aLj&Hv=fQh`fw}6OGw-W7AEx zOo5SW|Ju)Nh}`~0H#aRtUwCnH*Y8XPlzzJCzbw_yuHcYvyj5rSAY4Zci;C69ZHxM^ z{CXJ@lUquLw}DK=@`u-?BJq8&qgg(`(AW6JlM}vW`Was65e-QE72QSqgm{5)<#nT< z^wU{@pVy?ZPeMJaHY{p>z4w$Uv5RpyZchR(rAtvy3OD1lpjA*}CSHZv;K&MWKI{u; zPkWL9D<G>}I}T5N8i<gH2kzzuG=niMUE=h&pz^8sM7<<l=BEz|(6k_d`)l(o-9aP_ zN}n{FeD)$5W|=wujF+dsg&EMAix*#wOWuj%2LC>g0?+A?m}!5pgw2mcI?1M)%g$w- z#IQ+2vb0G?CGrb!h)BUFQ+=;E!N>icirM%|+S^!hP;Nms*Vi1-66k=`vkF`%P|Q%e zcb?s<Bz1w*T2(C~84Tq>EKs<>U{QOepm?RpO!4N0n|cDaATJ(hBF5iBQ1R)%Lw8CK z+JzC*@PZyxvi@%`p5vWh5_KH@@Q|^HPOFm!fy|@&>qJuwPB|XGFO!uN0%axqfF4QS z{$7jjB}IuNz1cwRy2RnGaB<`oBZN~6w|x@D?q)ja)K&&3O+9;n4)H#jeS?w7S&!OP zc#gj$I3T$T$sb^rWNRpAzoDf^uA6oR&l1Rs5lYm?&87pZ@`Vp60?MUovdZsrb1$9W zx%4a{Yl8cuj_c2Fpd{vitl&94(jfbM>i|3Q-$GQi7C(cfyFr_wT*oZrOcoaqT85<q zmBS1Jf2mesm2mNbL1y?s`LnjvH2!i9uV(6p--!Z&n7SvmCxeWu^Ww!cZhI}cc$3W) z`=ngJHBr_BC4nCSL8_$qDLBbKWu0fKlpHVgRlJnU5dh5Rnzw^Xi|kOjd>*voMESj$ zJ@NXhzeO3YK|-^)91yfhqwXG-FQf!|hwG5cnp`8a9V_JoLX+Ea%x@PPt4pW!a7Lao zg9i_&X6^15(F7nx;db5U)k>*;sbDLWBqdd`Xu;rXpj<}zIRb{g&GNG?+xM!+Gu&-F z@HfKcX<-jQjjPt_{8feQ_F;6Ok9BVoXmmNE(mbF+I>12wyrwBNYJugq&abI08l0&% zm`^SrwJo#iGy8q;R|}EJ2*0aF{YC$D3M^%0$OsBA!_Hq&Q=C>rsV_`=rMor)o(8V{ zwc`2O{r-~m5ORr8(Kqbn&q&NOcBBC1>cZ?os|?1HA)znvsdf(|Bt&KKy6GNJqCADw zM|B^UiP#!-pI0oJF`RLSUV1Qzor1ZC6A14l@ju(vncg2tkG#QNkI=~W{J9pp`_i+J zR`r*ZmnGGI-<2F4xY_P#$K`x{jV~PEr_c0lN$DMZ==ZUwF^iyW<C%K1|Af4{Vb-|H zNk0{8I1+H^R^ncHaUKjN6rpc{`k+CX-1q6m)B#FSiw1?{a!HCXgkSmO=Sk-uM>R8u zZ*ZRw8Jhdqi~i}ql}c>brL!F_xYr!5`&svcvkR*Au-#nX+uu6s`uT*V6=gK$iSngE z^rGGV54l`Fp<Zvt7+&>!#1?Eo>#8gGg<pD`Pe@+}rGGYvF^Q{Vc)y^CGE`fC7LVNe za~Zd+^f9y2j8E*$?Ro@vG1{Sp(!eJ!e6NRReytOtEUlL3!U1xn&Qy`R9}(hYH=>kc zGL!b{q`{+=e6UtX7BBsDcwzx|ajCImDwxx8O4=23lZ)UTi`FSi=w~d+fKD=*BV2;v z_MG<_&VEBOumj43S&^lY{f5{_jLqd-k1ynt!=D<AcVDBNa`VV_L=o~;&~-GS0}${i z180HaHqZr0EV<l!l~KLIh(x#E9&a{Y#@m4hErv5t_ig)&5|j(7nM$*kz+i(W5I?Qe zb@#ea#WqRY!Pk7e<|YjTH9Nyri=*MecXR0)H>Id^N)XttP}_9scx5x%jEO#GUGY~l zW9a8UhH<sbL!L4bn9d;Ce*<bCm_^&{MZOWq9IL92y|EL<m24bi4wPTK2)&1sUNU`u zk5G(eT3=A_bW=-2EOUPm8NYD0+@DY<51N#8=Rj~zjYT(?`n3Fm&1JjHas|4U49+;z znh8x57Xv*kS`*~)lpnkc^nuJEf~&%8=8Fa@^}IjEaleN%usyj*v?Zte^W+dd&}B-J zWW9+;g^^QQs5pvdm-Jhpj5o|i_!vbo!`6HLe*fo&$y$(^CF(?XDADS?O7iBJe*Nm= zMaGBk+Kg{AsF}Unvhb_^qo~9qBK6Y~x28!cef32}kgy|a069sjeRI60&6i-WL~ziZ z!Nv;#={>~cPi@ygEe93P*v%aVyiE>OV~Ec=+yRGd`>wmlVAh^vI~3)+P!HV)+ajeH zQsrKY_VKV@-22=Wo|Rrso1uR?g_|@<uI>qlA4a5rI^V6rB*K@O1@A&ezEQf#4|_Ak zb?DZlx3MPEg_uupnP!R#9b04GXmN>KYB+qm5zR*6Uf$y~jVIj|!msxwn|bm>JC7u$ z^~dJj4;lmY)CZELJLxwj*{ph&7c&Cn-{K!2a}bq-r@N3=PYoa9yWO@h8NQHUyiA!8 zK%bgCHzG&<*8wG0C!5dJt%=O+3+-F+O3dq8poK8xjPGzI(+1lXB2{|5Tg}c#DPg!% zwJF0#DHcMX`XE*En;Y{d{EgqX@?MJ*wms!UYR}ZwCp#jaPD6<^%m#-jVQYT}1K-Q= zcXvi~8?SZMcI)$wk3yrBh7TbitkI)#DIGF9Se469RMjpK*Of5Fo2-mF?z7Ga+drj* zoT*t+)7jB&SD21{v@Z1ad2#*$!?{*~q7CxtrCmY1S!lScG5Yf!-?eK&0-&&0GQnjF zo`?4;ZNd}o5v|QyYn@MzwfP`RG__t&pjh`AnWuW-(jaaS7pOF3(LY$!24CPIYq110 zvCR!JQ<kZn{WAgBa1!#9XdHXFwgh-xC}dhfjFvfT+9_}9AEUiFCXU#W0bf0CRd8_k zz2T3ijum6^_dT3hR@iG~siT_=NKJKkn~j0p=~5wyo69Y70*{t%O#*Djf<s66R@$FJ z&Jgo|74rG#ydr^1EXWry+1;BUS6AB&h26V~7KQEz8*Me8BIzf+@GQ{#SvdPr-Z{Kq za9z<J-D~ANB=pp)uBG=t_wSy?>Oud9AA+p<r$8kVPF}p^uo^a!R+IR>E8M*A$O*!^ z=FG&2Wr#@cy1u?)TJx;OKv(ph$iG0(#`3WO#0nu<i5CYr7HvbnnMX4B9&Wwg+={-b zd178y`36x;Q;Q)mo70Gl0?xTT?#If!>1{>6)3Cs7@0LR?A99QcpA#G+`R+o<3smpM z-eOutrl=oRVuZ>lc2J_RHl=I?7C{&#+gRhe1Am--2|cmo7+BlJy-zLw^8Ng-S$6qt zS=71vwQaTKTk{r9g0*E24@Dta3uB3<+%J~}d%n)5nvV>gu?fmv_v9>@DY8yEFlL-Q zU!Ur5{lQ#X&Lw8Y$9q^v<t(&G|MqQN(z1eR$DzCF$Sc87Rz)e#p8Oi(0(`HH>eh4X zIuCd)<=UJ5ad2VvkD;Re!x#;9B5zRcou%UWm10ej5p)0Apg|<JOw-M=Iei_(*2c5q zVoZ2@9@$_j@}1W5nd4oDBCWq6%s+=e<P!(9_)F-Qu8E@aJ2G2*0bbIzer>M2^)%UD zKMPa#5{g*SW&$w*GR=&eMdZY+gPSw@q~|$BCeeN0EqSIU6D`AL8mRL=9hn=dF^tY+ zRehX+)1v-LpM*r=&Fp;c-g3-i@ps8Cp;t}1{d52K4&)TLd!EGHEC0j|-B^uk*U?b) zsGQhe_cM<w4MM8dM^XySC5d-97FFzd1}s`ccYURE$6cC#Al0!WE^MYJCfaU~vF;z! z_Jth?<%cQynXZHrdxx+_OyADIE>_`N?)$mv7^v@au|>huw&s?u%RpDuEW#@8+ib#? zz_cDIB-A61?0T!0(@Nro`N<&$hz`{Mw1EuYaR=LgT~5v;neB2R6GsOKwOh+`hNN?u zuPkw^+N*j@kM-QlqP5AvcJq0dAhDccNw(-O>~7p}*bSdt_b`Z@WoK7z!NSrsVK_~> z!6nPCEMIqHfTFVN-6YvK!DzhUK<`&=!@{PI<;44mWkwUldPYpyhoNK~j56d!`F0X} zifuUiKjBRs%IVr};|Omg{xFCcB)qY1J^tgBiKY}Z&Nuzes-dXW1MKr{W4E0$7!iNK z5T?A)s+ykm1pOKC@!uG>QY5&IqsrZ;Q@c-zitdG&=ecpL=7xCv{KF6867#9gVS~ex zheMX0(u#Wq9U`L&7_$YPj(YpdpO+g2<l6jd9jmm&<tL<Xz9lB!Pk|QBjV?*IL()v- zcB}xetr0vMd<wsqWahrN9{<(wCN^M>hx(P9bZYDU`Cs#Gq{g{}3jMMOgi$wO`ziQ# zwrRzWf!c2TUBUNTlSfm8SY@A<kIIRh0UhV7<%SLDcJSPnE*JQ{ju{VT_V7m|N?$1R zhxb=scu!G6vLqds6Z|%Y9*CL-ac2~z_)>y2+EhljxEHts^=Wp%Dli|lHXd|j5vaza zb+HC9za$Gb1iyNhh2wzJtpaltaAVCzUn=5DuEr|o-G*<z{mo8>l91L1xPdKcP+uk< zt1Jc^)*w|N-pL-Wko4!hbycUiR(b;>$GJGt5{@}j6%v2Gzo<!fHu=^1IQa~15oQ^9 ze!9!Y%sK3@%Bv>a^jm$qrh$toe5m**w!8e~p&TgJOUHKYpQ&e$U`GK!=My=qSFxn4 zSvMd^%1sF8yOBz3931$)qoN@!_U#|Yp<rH9n<am@LiY3iHK=tYkCh7TK!9iGK0%Rp z8<xXSs4=ZdFWFY^^h5^q$*Zn=k)ZcI@NGSBjAzzZ38j}`_M!r$;sK4|Ux&(nmAk|l zI8b-$BYy#jQ#EAKCEw|IjF5k|g|FfXpQv|?E3EOamFR1ZJlkB~kwLeut@58l3UJzp zdi=z;pHks{#s9YIQaD9MbRiY8)}HC=?}Oi8%hLa`gTJ$)ldtm?08$c?@}d%QqLR|4 zlG2J&5{goC!V(gS5)zhuVM+f-;E8>VaS8ta1+cU(u`2=Fe-%uyF8+ZIzRrNaz(6sK emxrH|gSWF7*4OpzhBEtA5<pMOP?MmJ#{UmkDyOdi diff --git a/src/client/assets/reactions/confused.png b/src/client/assets/reactions/confused.png deleted file mode 100644 index c791854183a4520c7a1af198c8f5858da26a2c61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6058 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 diff --git a/src/client/assets/reactions/congrats.png b/src/client/assets/reactions/congrats.png deleted file mode 100644 index fdea27fcb9ec608ef2b8a5e9bd85a2f3d7a2aa5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10000 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 diff --git a/src/client/assets/reactions/hmm.png b/src/client/assets/reactions/hmm.png deleted file mode 100644 index 725fe3898d5273f8464b4a33e829439c336708e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5874 zcmZ`-cQ{<%(_aM9zfq!-h*iR}dQS+#uC`=#(My!DdS?*?5v+~qHX?fOJxa7_iMD!= z-o=U*zs;ZTAMbshbLW|J@64H*Gc)J&oEVt48WlMUIRF5lf~c$L;i=!hahC-Dma&x_ z!;?D>N?J+)Kve?8wG}a*e_*4orv(56@BjeFHvqsTehRq-0C<A|fE`N!KsFTsU_@j# z>&oLlkXUP|so*L8xlnEi#S=1wy0Iq!P;m8c5XdWAQ2_u9qYxD(xZmu4mcJR?Zmw^% zvazER)FVg-8i$*FgU{<(O>aJNQrNa>bIVALvOfD`0(HzV#`zCLq#7SI+Qz162t9Oq z)dfCJObHGUom(_Fo#Y;+1b197J{?g26Lz_5B6>H1o?xG@cC7sMczIs8fE{)Zxy0BK zMqfm-@i`Jf1CXdBj4e5zKReom7?=}|x<#Ta6bI~JdIV6XR5%j#bsGD(`|qIvZpI5H znjSnViCL3@g;B^ui4-KlA_h9bP%s!RG4w8<|2^~`A<!ZWMS=N70$u(B4@1RKUUR@s z$ocLmLUdpc>Fv8d*_r{~>R|L%6AdtV!hHU0Xcr=&gA(Kmjb-!W514gR7>X2{AAt%1 zvzm0ONM~x2Ay57*rAB)Z1JA`yFG4YSCaQ&o$t*abImH2P*cihGoPEfV03j4kMF<R5 z9FT{dq<v4{iLuYQ0~{5jpt}Ple2@W{qd^Oj0GA?YTcSFr80Gjb2+*wr(93R>a7%LJ zh9wW%dos3DBa0K|%J>1AA(6Oex-6tMM-5Z6ckicUS_iV0->Zs1jm{k2KW-461JhA| zQ6YsMkO1Y3G-I9NkCg^UF}7e$6<@80=iAcJQzsZ(9=?kuXC{~63o`VO_1CL9Mm4#f znl`0@4QDgwjIj-n3zc*#C6?Aqi4@u!PJ1bJ$JAm7!%fW-ahu_iU-uBRZUyrgDT@Tt zVc>;yH4koCft4*sq2fZDiUXfrUSG4gn!-*5`I^?pghv!7(M&KO@q17AScp$ATin&z zkXaOgHshYUMprJrrD@~ryPJz|%7lM+W%mT@Hm*`<E{f8B-D9QLJ+{4|=^!v`NgPxh zFspwaLMFwAZY76)&zOQUJN3lS2i>mlt;Z1^jeK?Oh`VJ7D|iFb)EToX&Q=bPkLEw) z&Kg)FV-wX22X8J;`R!LxPhSV=Fk!zfCnT)t+KBd7){!;g74}YjuUN*11mfxVTn_l> zOp)!RhrrJ>z(F4LW~xgQ>zP{oai!^TT~7QaSOF4U8e?Vj^ql9PkqoLuCX-vxdV|)D zhhmLZrRB4>+vWM+klivrQ>Cgv96E`g8Yw39m&L}zj}P`(kJLh14Ia)J#Y$?{Br?y# zVAYrza3Q?Im-F4X@imjlbR)ws37+8)AtlLe){Qeo?--?$jpp#Omjc5|KID=4RR=Nl zSw*?}L@&h}0%qn%MBglj^3?XuU(H!Begh9>Fhw~WI7i@vV9QPV(ki<^^5kahjBP__ z!+l#lH$`E85MwK=8Se9pFO^uWfS3UIwPgpCvmipKgZd#L{)2%35%BIQZ?w&?@rBCs z_;$=L$;#gQdw=|wm@-GPYt~AHLie|h=fb3~E1l_|EQ#MCp7}Wqt{}btWS*mj@*x%O zi2s=FzQXLi6q^APnlB-wKtj!^6k&J=JR_u)2pzONBCPjXv-<#h^<ezJ@S*_faawP` zzd0+@@?UwiUD?9phy!LaCEt4P#*Ab4(Ta~XyRdUnj}AYWRxT58jMLf)2jSjK@tH{c zuvlFeo=Nur6%XtYmlFX46)sd=dc}k4yqTzl_7ie_NmmoD{SIx6Qm!jA$b{I&KKtRf zbR?!1A7->N&+UNUzMb=2E+WEsEo1Xb`z6cHplWf!N=V9BX%g1pt^vE~P&g4nluw4U zUs!-=bB4teLo!)+9stv0LSh=}tLqHzmFxbfO4Vw^vD9>J%zwzSSX#$2+QqW_z^VZ~ zj<P*htuQ@PEc>_E>BpdQKoOYPp`Iq%asNS3yFcHc7~QW{Yf??Iurg_?kMFrx=hbYE z&TuQzb?$dHok=?zWl8euA`nh%{{^)LOOFJLlh~=zS_x>ETt)mI=3Lcr8J0ma(NCGv zIZ{EVN{Abpzadc)B7VV8HQW41OOsq`<^iStbo!{Q3Y>imMQ4FQmjOC9=R7{l-J7z$ z%}cD>LB+b0NZvldEpn*VQa&lKyY`!`KNln#&kbe&U=fz@S0365e=WT54zKr*-K`OG z<9Q`Eg2hCjnNe(ivc>H0DZ%`W#^pmXP@WQWJSpEyQjC_7db=&!g@;cr{VhKCjqo#` z2d^WxW1468QU!VviUKZfWf<kNn<}VMMt5RAyDhw5qUoKC3_JL`2CT<HI~k;5pFq1? zhCPC;*l!Q;ng=4a5;iMwGZ`>r^bUjB;IVCKP;<s81?T&{`86_GTP^bLE8)d=oW4tI z+qmj@_WBp_z`+T`D<O7BM_2Tml<B+F^bV`%Q1H<1Ax?e@#BlU0uqri)cK#K|9Cory z=DfbQ9DCW}F~48yn8szY2j|ywI0P{uR<l~bAl=Qet}lI_M#pd|I75N|_36L#<V8iK zms&UJpE+&pCh%@mI=EZVoLkfGyy(}?KCN&9)Mro{oof1i)QEX;#+H4f#(M4ZV5FvP zT5x%^o6P8sI;mz%2~j$S@MgaQKK2*M-4&Ol%Yx&{Ua5hhrbE^;xRSK1-+t5;@)I0- zR;U(}YXQEPV`fWO#C)j`CrB5#Sj(o<o2w?*s4tM6MEhpk)LKDm+&;WU?ztj<zy3LN zn%rGwukFib;m;c~E5{Oe|GdYGQSf`M3i}fyFM;*}*07t~gJ`J&-`-^IJc2F!VicUX zyI{ou4KNwo5J`@sn;}fEIK}g9bLGxZ4%<PBab`+CJ|TNsGHZ+#FADhoc;8MpJ54#P z!Eg|i#$TjZV|7>Fta(jE1C5%i0nHGHu#~iB%vxd++nWeC-1+a98cL8ntO=zP0>DvV zQWF5OG!O0=flx;m2{Ry^#{aX;yVG<n#LTZGUFWF2(1Io}6cSmU%X(C0W98;D6dUgD z{Z1-7RK}*OQ?vDs3v@CJ)i9|^W}+bR^RVZ#-3k8Ka&)!bwM_%x?Azk5B!fN%gi4#Y z&&^@hyv&DbtY+t^(3u8ehr4OXlT)6&CCmfEJ7N5;gd@YTdI4G5Vv^=W+Jry@eYz{B zXvlE?tV44Pu^&`Ex^C1bdLeI1)>sLW+lRC&UkJ4@Xj94e$^D$>J5!A*nB%!@BW{~8 zD*32T&LGFGAoGLE8&-p)Wqk2rw^d7D(ngEgPOT+tOB&5y_MCBmAR(b0+|i~u;0w~< z^Z7EJD2A^W^55Slqcw;#7i6lHNMF4`<Zyrb<FlzQ0SM(CJv?DUgzsFrJxbJaCbe>J zHWSJ`fD2tOPnx=Kzsg<hxs9bO>L1wK@nFkLp3#?y8$)nvBUr)O6ZPFA6Do7D#z-$g zW`~m<hHHM^0;+m=$2Lg$82zL6zRsklAM|byo}F|#$smJD2YKgY%nHaE4@!(@Omu<d zBzTCZ1-GN$p)K=vS)a-zCDFdaS9;Mxb_?4VlJm=gG+aFi@QP5&%@F6#Incy@%2VG1 z4_*+N!gur21Gl*D!CWh`{GuE4D<**k0$=Mj5<<i-yZ?><k`exxPRy7jYBE+x6sGPN zz3QFN;(tMKXo&Iy4}NidQ>6F28umpuCPLM=<@NrDV9MGJ1}YlkOyj`(0)#P?yR zTvb+Eu0-0CfAX-%iFl;?*`1>{mrH-kdvzdv%sOW_AUiLKV4lFyq*!UdRtKO%4ZvmC z<kR>O{`rfH!Ld?huahkwKWXmae(*iPGJTnB`P<iRxKU^_d4m9y5>fiN4^Frmm-ewL z8^D2?f<y_(QV*Nw-wbI-*9~h&R}W(amo1p_ZY|w~w(A1J+%#1uJB{E6Ovvx-KMQA{ z-ofe6%@<>5`IYqDSp@q~x<1_Z7%6@?BGj{s^zrCtYHgrUG=GwPY2vTAiQzBS-tVtF z_7w-nB$f?a_KEoA2*<_{#?_B3gBt`~0<Dp#{6RPU=R{8i+26&Fsy+;S&W%4>2`D($ zlO*^lJrCXDN+DK$D@q)39J@$6u}4+g7ypnDB47}fIhvsML1cKzD#x-^o@G6&pw_rt z_CJAch6{nnu=05y*1cYINl5#vNkv<hXXQ-7ndWXOUrs-{^f7<Jmtuc9Q&dBCD@U|v zuKU4f5$(zw@*|&A$Xiohwsnz!H#Rlz7>Lc%q!go!IV+Rl8)u{}+o(#00=$8FrV4}c zoFgftd*$iD{|u+xJ*E#OZ0r9V<F}`rz$XjoQ|%b5#^GaC8^&D6Q1EPMYgJ^q*K$;y ztQX~&rCZHI@{3om_KD)~NV&#QV~ME2Pk%Oh0)0*@R~8{L?9}9f<<q3;<x{+AA`1M4 zQ@^LA`p&d!1j;JjhZPQrwX6=|R=#VW9%~CVv2#gyxcsI75@6|jJF9bFoF=Mr)GrXR zzH;x0f$s%>7RH03<DuZ!M_m#3j4~I=X2iIvf(#4=NB3gC=y-LOBzP%K<$>iP&qRhD z8=;<BXSXa%<SiD55rdHs6R&UWmha?=UG9bj)s=V%J8G(4G#?CSY=2qdvj}{&*TYY> zy2wJ;nG;QSghxwgb}bb=RGp3;huNWf4AA6wRBI-k*LTkO{@L+PnBQ$r#_=Wk{mF_; z{)JY&X@44XjOSJFE2@(~7xO|=WPA}dXas(#D$uYnC2yG&4J;rkrdb;Q!<CVdCT<w2 z$1azDskL}_&up4iSf1&jbN%0)+19Np>OVJ@nJEt(!fB}s<Xa)}1RRtXmtH+XwXe?= zKWf%;pH%KQk8ehd?%DstUG#!+y@ND$-D_mcB_os5SI;fV0PP*qe!)St3Vbs8g`ev} z)z_*JkL;VRPlw~9G~0L3twxx>a;$65-f<Z#n|>NC@6r|K)59<OZA4~Ll73+*WC=}g zGv#!1GwWW@Ky2@Z5A<mAs{3fxhTS=tXWQlR4X@k6rw>0I+p&+>GHd;q_?ikcNoc&O zD*L;uS7j&I#s%DXG>EU0I1}QHbyKB8D2<c563@SbJZSTNDd)$%i_vitnX8CYn67Rm za(e&Hz=2boqEM6t@#HB7BXw1g-0a)v^KQe2FP(6?XMV+c3MLGP=iUQxDK#ehu$N%y zOSQhzB5M^1o0S#{xoN3g0x35G_o8%oCgtvq>nuqr=mJ%B^y^H9gqoLlNvB1OqVTUD zQ=Z-ayx31QQ?8Ze2}MiM4)aVdxj>$X*~1eqbfar@@c7@o%H&a}&R<OmFR_bXRw_&P zR?WqbSbJjtbj<Q;Hgf0sUS+T!>0`;WaBpuZBg2;oC-H4CZ_7f_Po`_6!<Pc$+S47K znZ>7eWIyY9N%ZP>X9Yl1Y8O!)!;%DkEu*vX{Du7QlqbVJ6%OqtoKPuP8qXNli@(pm z<6t~RUH{Uzh~STePb4OnZpn=ZxD?=)9^GPQ+sKuC*2&&35;L+<&&MpG_WZNc;R86n z>FlPnTKSiZe|X7b?Khrc*W+DyVOxsYxHQE>GIKjM=}d7%qFXuck7#LeL{(*LaMo`A zj0_3R_Ffk25#FI&@q3fe&%5e(h2Spj#8dj%?&?<Mm%K3<hm-KS!RP|UjV^KXi>u_+ z`%3`mJC4qqEmxz(ovoi-1{-JR9rO9Q8%FZQG`+bVYU1BLKU)SDP~ZdHMq*+Shfnr= zG>)Z>!*na)5+%*~x@qr3Bb~BxpX08E_ErAy!X$3dd%@~y(uDkvRoe+R_K4!(2;HWA zNp!_N^<eC7xp+f6V3uil|K<ZSFs)32G#T2EBSYnA{7ZEHrSFtue1>&!gL9UnB$mQZ zn>)AJlHR3-G}l_g&B)L<!p>i9$*Caj*dO2CfttS``+U%iGt-_SMF%aGHnav}`Vc@7 zw)(6FtRyKuO+R0*Syk@0vj1WY?7GzE&dbE@5P2W`rT2%oVp)AYk4EPNk4!ZJ52(x8 z4FW7)1e@w#k#wWRJ4;k++v#FrhZ`_KFMVfZ23-qEo4ko1JMY%DE--(PBk3?-KPATk z>+3UD4QD0FdY<8LFY3Y!U*E@PuioNqYt)Z$a8{^~&mBR5a%Ft~DV$%V(Z7nuY&4ql zSNJEj)`Nm6{1!CJ*hd@{t_sL1%bPw$V*V(~854G&_&A{5w!*%*5){fZ#iiREBfIGZ z4Bt$z;PwPmZPuD^rneBqj~f;?+8gFkimJ?o-gb=WP28K;oBQ}GklyP%^Vk?-BwaJ3 ziMa&t_B*a7Rrpy2PuQ<$dUy6We+!H1L5*`v`99LEDq?iuT#VUKe)LPe0iur?@#xj< zKW~1a9MeMeI?zTsP`4VE&FZZ?m_O589Y^{5NWsHpzwmCI3)u;8pES2t>P9aIWL*Zb zPO8BbYQCFp+SHaaZ&McEd?JilH(y5i40#YW%B*D8qBpsdLPspviet-y(M6g~yqoKq zAHwyyIGx;BA?xQC@qMkO?8P+H&JfUF4)lMSEPb7Vi1ZMqWmaI)(>0xky1%Z1P00@+ zFi{qV>{aoyrZd3Or?Z;|t4B8=ko)@S1HPD)3Tk@kuYOF+_fY+}zYJM2u@+j520mI{ zXPEGS$%mYT9H5xib;Cf!Uql^l`Ovt<ne{7pz>q+G-c5YkDqDm8>)&1ys80k+39Pkj zNh|#|=-P>9<h`Q5EB#&{-Fi9X*K)QUcCi-gMc7T%AqC+IHP}U#IlCstk$g|vh)b+k z-%p^87^%R`+5^<oxo(Sa5{>NNrBntIgG)N?Ft)6G%tUl#ud8IsxsWyf+9tib+({Oj z7J-#IqQ;EV(vd0&!g0SJfkI|2T3-#CX2D);9jiw<8Qk16CN8X7I;;^QZ0~cEcRZ)5 zo~)cdriPs`@x>4Vm9XLy&jG$ED%qEjB*KT&W{=vk>dHdMpdLyPS-$P_h96VC9C1vY zH^3-QRR7l<nn1+G?7{mgO&=eH;hep<{k)|>KOVlOXo)P+Zb8Jf!rLp;r`i%LOA^#G zdR29!CaIAQsrLC{sFs<TIYd(sFCwhKz2g(hdA=}&>nrku6w!})BDOuGye931g~Z)+ z3dlMYiiv|OW`)2qTmGYJc8lPN5~^Q#?7^}qWZk0rZO|?f7vNUh0^z!idHyhg3V`eV zY(Bf#^!z%4<e|eIz}16b|BEH7OzsmpVA8F!GQt_3IedU=#>9`$5g(Ua7`bDvAF+gA zf95{9AwmWlzwO_MNabm$Z7NSx33<;QwM&Q$-tmg`92=8-uh5j32B}-g{-_dC&VBNl z2*D6GpOXCTZnSTk`WNY@sMl2fsQ!cxDJPu-jXQ5(ov8l4>UST7$J6ga*1smJJh7m? z01l<GZ2d5~vs`@IQ6)9#IQ-8Uw8~=t*jpbd+_(jIk}ygoB%b@EhC3+%F9M~#s1F6L zG!43uAf29l2F<L<8aPd8a6QHA%0l($pj7@kq@@0dbG&4RtkXcagrQuwOPX?WBE0XD z4eH1R3&&4yP0lttQ!}~L@%OzzFI6KiTPrU+SsM>KJOPM;MWjJsDUgUbTtr+}6f7$$ zB>)D?g26_EA*lZ&@Y>DR(cb_67vN9n6~YTJ|6AdOo4uE>m4_X`*Vk9b(bd`0#tLC4 X<mTa!aUjov{|Nw5)mABgW*PoJdACul diff --git a/src/client/assets/reactions/laugh.png b/src/client/assets/reactions/laugh.png deleted file mode 100644 index 3b3c10a27a8fd0b634f64cdf259e2155ae806f8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6933 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 diff --git a/src/client/assets/reactions/like.png b/src/client/assets/reactions/like.png deleted file mode 100644 index 526b391f96fa204e070e3f2d1e45d7f1fab1137c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4822 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 diff --git a/src/client/assets/reactions/love.png b/src/client/assets/reactions/love.png deleted file mode 100644 index 9fe82cd070052b0aa11a154d1547cae8e5beb4ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2805 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 diff --git a/src/client/assets/reactions/pudding.png b/src/client/assets/reactions/pudding.png deleted file mode 100644 index e4d10a229d94c68f4018a3d197a473a5123bb3f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7595 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 L=&4t$T15O0PI-TJ diff --git a/src/client/assets/reactions/rip.png b/src/client/assets/reactions/rip.png deleted file mode 100644 index 4800fdb91b18be14cddce63fe372f9dba4c4172a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6793 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 VoCVYnXG#EoqO7V+m6U1Ne*w3M^8^3@ diff --git a/src/client/assets/reactions/surprise.png b/src/client/assets/reactions/surprise.png deleted file mode 100644 index aa55592ded7b1b6c349487f834853935ad91c027..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3806 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 G*#7|`E*nPx diff --git a/src/client/assets/reactions/sushi.png b/src/client/assets/reactions/sushi.png deleted file mode 100644 index c30d44eb153709dc080dd295254fb9580cc5f3a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8651 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 b;bzU@>S3F8Dn|Zq6F^yBL#|rJJmP-<^mT%V From 67f60ab3071521838c1886716066c8a22ddb2e1a Mon Sep 17 00:00:00 2001 From: tamaina <tamaina@hotmail.co.jp> Date: Sat, 8 Sep 2018 19:25:59 +0900 Subject: [PATCH 176/539] fix wrong reaction img (#2666) * use svg and cdn to download reactions * fix wrong reaction img --- src/client/app/common/views/components/reaction-icon.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/common/views/components/reaction-icon.vue b/src/client/app/common/views/components/reaction-icon.vue index 61a3baa273..c668efac6b 100644 --- a/src/client/app/common/views/components/reaction-icon.vue +++ b/src/client/app/common/views/components/reaction-icon.vue @@ -7,7 +7,7 @@ <img v-if="reaction == 'surprise'" src="https://twemoji.maxcdn.com/2/svg/1f62e.svg" alt="%i18n:common.reactions.surprise%"> <img v-if="reaction == 'congrats'" src="https://twemoji.maxcdn.com/2/svg/1f389.svg" alt="%i18n:common.reactions.congrats%"> <img v-if="reaction == 'angry'" src="https://twemoji.maxcdn.com/2/svg/1f4a2.svg" alt="%i18n:common.reactions.angry%"> - <img v-if="reaction == 'confused'" src="https://twemoji.maxcdn.com/2/svg/1f622.svg" alt="%i18n:common.reactions.confused%"> + <img v-if="reaction == 'confused'" src="https://twemoji.maxcdn.com/2/svg/1f625.svg" alt="%i18n:common.reactions.confused%"> <img v-if="reaction == 'rip'" src="https://twemoji.maxcdn.com/2/svg/1f607.svg" alt="%i18n:common.reactions.rip%"> <template v-if="reaction == 'pudding'"> <img v-if="$store.getters.isSignedIn && $store.state.settings.iLikeSushi" src="https://twemoji.maxcdn.com/2/svg/1f363.svg" alt="%i18n:common.reactions.pudding%"> From 5a13c38a6d27535da21894ca8642d722873c017f Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Sat, 8 Sep 2018 21:44:28 +0900 Subject: [PATCH 177/539] =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E3=83=B3=E3=82=B9=E5=90=8D=E3=81=8C=E3=83=96=E3=83=A9=E3=82=A6?= =?UTF-8?q?=E3=82=B6=E3=82=BF=E3=82=A4=E3=83=88=E3=83=AB=E3=81=AB=E5=8F=8D?= =?UTF-8?q?=E6=98=A0=E3=81=95=E3=82=8C=E3=81=AA=E3=81=84=E3=81=AE=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20(#2668)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * titleが反映されないのを修正 * deckでtitleが反映されるように修正 --- src/client/app/config.ts | 2 ++ src/client/app/desktop/views/pages/deck/deck.vue | 1 + src/client/app/mios.ts | 4 ++-- src/server/web/views/note.pug | 2 +- src/server/web/views/user.pug | 2 +- webpack.config.ts | 4 +++- 6 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/client/app/config.ts b/src/client/app/config.ts index a326c521db..2e464c50f3 100644 --- a/src/client/app/config.ts +++ b/src/client/app/config.ts @@ -5,6 +5,7 @@ declare const _COPYRIGHT_: string; declare const _VERSION_: string; declare const _CODENAME_: string; declare const _ENV_: string; +declare const _NAME_: string; const address = new URL(location.href); @@ -20,3 +21,4 @@ export const copyright = _COPYRIGHT_; export const version = _VERSION_; export const codename = _CODENAME_; export const env = _ENV_; +export const name = _NAME_; diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index 26b989656e..5e7a07ea6b 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -85,6 +85,7 @@ export default Vue.extend({ }, mounted() { + document.title = (this as any).os.instanceName; document.documentElement.style.overflow = 'hidden'; }, diff --git a/src/client/app/mios.ts b/src/client/app/mios.ts index 0f72cd2f34..d9d4ee9a07 100644 --- a/src/client/app/mios.ts +++ b/src/client/app/mios.ts @@ -3,7 +3,7 @@ import { EventEmitter } from 'eventemitter3'; import * as uuid from 'uuid'; import initStore from './store'; -import { apiUrl, version, lang } from './config'; +import { apiUrl, version, lang, name } from './config'; import Progress from './common/scripts/loading'; import Connection from './common/scripts/streaming/stream'; import { HomeStreamManager } from './common/scripts/streaming/home'; @@ -72,7 +72,7 @@ export default class MiOS extends EventEmitter { }; public get instanceName() { - return this.meta ? this.meta.data.name : 'Misskey'; + return this.meta ? this.meta.data.name : name; } private isMetaFetching = false; diff --git a/src/server/web/views/note.pug b/src/server/web/views/note.pug index 4f7c3d7777..234ecabe22 100644 --- a/src/server/web/views/note.pug +++ b/src/server/web/views/note.pug @@ -6,7 +6,7 @@ block vars - const url = `${config.url}/notes/${note.id}`; block title - = `${title} | Misskey` + = `${title} | ${config.name}` block desc meta(name='description' content= summary) diff --git a/src/server/web/views/user.pug b/src/server/web/views/user.pug index 63d2f75156..506a889d98 100644 --- a/src/server/web/views/user.pug +++ b/src/server/web/views/user.pug @@ -6,7 +6,7 @@ block vars - const img = user.avatarId ? `${config.drive_url}/${user.avatarId}` : null; block title - = `${title} | Misskey` + = `${title} | ${config.name}` block desc meta(name='description' content= user.description) diff --git a/webpack.config.ts b/webpack.config.ts index a50d6c40cc..bc1c0ddbcf 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -22,6 +22,7 @@ const locales = require('./locales'); const meta = require('./package.json'); const version = `${meta.clientVersion}-${rndstr({ length: 8, chars: '0-9a-z' })}`; const codename = meta.codename; +import config from './src/config'; declare var global: { faReplacement: typeof faReplacement; @@ -75,7 +76,8 @@ const consts = { _CODENAME_: codename, _LANG_: '%lang%', _LANGS_: Object.keys(locales).map(l => [l, locales[l].meta.lang]), - _ENV_: process.env.NODE_ENV + _ENV_: process.env.NODE_ENV, + _NAME_: config.name }; const _consts: { [ key: string ]: any } = {}; From c87b98c2af72cf8395808fcab43a6ce0555737da Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 8 Sep 2018 23:15:39 +0900 Subject: [PATCH 178/539] Add ai illust --- assets/ai-orig.png | Bin 0 -> 261679 bytes assets/ai.png | Bin 0 -> 249271 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/ai-orig.png create mode 100644 assets/ai.png diff --git a/assets/ai-orig.png b/assets/ai-orig.png new file mode 100644 index 0000000000000000000000000000000000000000..b684e2c07834bb5181207144367eb364795a9c76 GIT binary patch literal 261679 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�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%0ACFn5w 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 IE+ZfQKRcoOV*mgE literal 0 HcmV?d00001 diff --git a/assets/ai.png b/assets/ai.png new file mode 100644 index 0000000000000000000000000000000000000000..9c6ca566324a0868889585a500aa609d25ba7c1d GIT binary patch literal 249271 zcmY(K1yEaIx2_Z130ho(wYU{`cP;MjUfhCvako;mIK^pkg1fa)T#CCDJL&oVGjs2k z$z*2FB-ygQCGUDxjGBrpCK?GE006+0my^-}0Dxlv0Q@%;B-oMB19Csu2a>s>tQ6q& z->c|*c`ED(s;iuy2LQk`_wNnFpqBK89Ypq&SC&TJLPfzs0*eZA9|8bW0C_2KEuUY< zfi_uWI_bCmXEjxmcJ5d?UuGB`EUiYwTj*pRw|hw9IZSoy8+`9Y&Tuh~aWgQPJ0DMQ z33VX}nLIw^u6;;kR_L;H26`pLiX?X2Ie7wFzt3bNY7b8j4hoXPhVB9j7Qc0Tg)Qg& zy8@3XU+m31$&GOd_Kkh*Andhc5&40iAlUMG6dz>byHZnEkBMGN2!7spcuIB1i2j)v z0$Wsyp;{PNSf5=S$x^^(W>%=De8K5dN<i2W&w%@gfr)Kl>IkQmERLdvhq|?1`$G&= z_Mh(o@fvh7IJCnAaFmVZBoNHdP++SOpB*O&IwHr7HOb#r73%Oe%r!Ci`(Z#(&=Hw< z4jgPjm=XDwdU&vCIJRHO@;pGUhO+|5g+{GP|NY&uyLRtNdw}PZ2Gd(WI$a3-1^_s% zLDrk_ju5R6|KIgkKD;0TT?1_A(fUUtaMbEnF4_6{GCmM)x7?gS*bx!jLv+*!zSB?* zySIeG{~@M;2fUk+#X_Wtf)hw}5AiTnF+*u}22tw)Lr2cDZ%&?$-qh`{|8Ru=Fs~i! zFHJ=Yc0-#qyiQDn-%x|nQy~Tb0DD&<au^ps#Ip{S5)jQ+-A>V7`rovg*$TbY3PwNx z1U$|*`S#S98tWC`=oe4Xs>Fv-js1)aFAIeaDT6@qs2UMmv8skYp-V>JVTL-80E#$w zpyc~`5kn~wK}Gv%R7#<DbRXW&pL==jR-ioKxQ<Y{uA#-p8c0%cNfF&*L|PyIb?38Z z1%`}rruDH$r*#bgGa*y8#^HM@a5(n3J|@NBKl|Rs^*JU@^*HIp02CBHWWKysh*X3; zKFE^)X!<>`v#<`d<S$Jrrj)rF8jW9BwQnzKuSu<O{Gps0sH~?tN;czxM^XR5q_Bxh zS|mv&g;2a~9nM(~VFdv}Z&E-?d%|xL4;36KGuuKPFTsQn_O>yMU9|fLxy}0pls^2d zW?e(=(e4Icmc@DPke|Xb9`ktHW?@w^1`=YQcB>_!mEzDHJ`Mpa7Lxwj+Ee@?uo{|# zsdMIOpgWdK$k;xQsg+SgJr-OOS}Bn7_35wGQ_0w#c-a7s8+BU9gU~1Rem)?a_HJcs zEX-ubej-fr6URa4tcPMY)t|OhgH_fGKyt}cSxejJ>~#k75S|+vBjb&6+2r-HI^F4k z*TcNsigzfXBe)ey@OxJf-`}4kfo%$C)KPFnvGL_CCxewU98i(iXJa=SMA+r>`rs3X z^RX2Zs+y|EQycS7r-zyWneYKkrBFNx*PA|T!-gVx*j*!zlTN35y7f|YQ#m4QqoHOj zl~#+T`6L-6Cr<gr6fl3ZXe2w?t4-kF>93A^EqIIP**P%s?}@Ci3sE38)JW%KnW)F- z=R=Rl?9i9o<-|q5d|KCn!lU&5jkFJd?X(`^$cz+;mxr6Ndzk%GY3L)AQeo_Qg{h_B zYVIb|#Vy@>7J)aEF~@sYxZE`Uow|T4mO?UNY|VxL#jjpk`7@4w+3Y2FI$R_U3^ZW9 znF>Lzo{$dghy5w2lX6Yk>$8LXZfLj{)A}_v5cb@xD2`P|5p;OEW)>2Bt)%VFI_Z)z z-@$g$ts7lPK`{qN!gH1jL%MP*tkD&qdiE>HF<$;R=MLnP2znGnijlTK=-56ww&uon zR0$N9I;MS-@2)(P`R|cWQ{d#pgA=p)$q+&Wctds81QHPm2JH-dIHl|n{uvk?hO|Xd z8ic*-wN${3wesyCWy{&bp%Gk}k2r#sdC1Jx(Q)M4JZ()@6wM9ch$85q%St^4rLhS1 z8l-4VNGt;rcY=46<ufAR`TS&{u8~R1XN(ac8sZNy<71XS8zwUK$q1)My~^WHCn6%2 zotlp3IVy0xR3-}3AOc>sv4pw(-Xb&<=~n-DXZmuxioCF1|CTk|Rx{2>)*9CZhV4+A z6RHYO?zx8vh(y|8|A>en?o#;YBAbZ9cnK)y%s~phM3Vl2bS=lH!%nA4C_AnIcRqjw z3L`aNXEDh>&jQSO`7D7h{O+A>TDNB(63+1>JyB(cW}_ONPVzrpM?F{`<^Fx1)-|M3 zsfC&N9l`yVCO5|%gQ(0~a^6L*CjU(OEGT9vI~)xM2=JzL(L&s}0p>Wo@ngXkalc6J z^K%!ADjV??+<;lo)WEHMQ|SB>z{`=0&5NSnccOU<0Uf0=z~lnFFSVU|rCYod7GAZr z3-1!DX3s?f{#qh$S*ExnkIP8i*6>}~CkyV3NM8Z{VTre{cdtdp2fa@XP01ytT$3(a zNFybW>d<Vt1gf%if6n+}Q75)p9(E(n-VbcWRG$^DYec<YKSZ*cry2idiIOsz7p@_! znZd!X;Ogce{9zu=PAIe$I~){bc0~4)>5xf7cHOUS2-x!~_d*(x%K~5JT4%KJQuLR& zPz>-ZHy6>z#A4CHg2uY&A4Q`krQXXNw61UE@WNrVRCeJp)fDuM5oD-`F_PgMzoaK< z!0*mmOy#|ZU$1}BwfO|m8g2s8`rtq#=k(=7ZZc>|yUIBQUtV%l%3R0=Lj#2a`8q3Q zUgHNg-o8_)4Tc4<#=PG|F+)v1&b&u-SG2;6qLL0jhW$cKwah7lm$O&JlZW7=!pY1| zK{Hy-+?pBR;qV2n?MOReJ`E9|Pk+!x(@_V4yRoT+-V}_B<s58hL$`eFRgqaurV$k4 zKTdUc5}<hG^dxG+Z+-svUkQIG$g<sYZ>uzp4+Lrrus?enyW-NzbFqJ<C~d^xCz~$B zgOFx?E2{kR&qc>?q|gPeM1FKESOWY!i}>0G(n@A_Nl_ijXlLfr-_9y(EytEcj%;YG z?X$FXRSpy2F!QOCClldeWc}ZGgi_GI+Sx*dFvR0|n+M4@E!27*X^FHWWn_J$+hc>X zSFXd{BZQMekVQ|Zm3A)3W*9bfNy8X{GhA#s+BQago3rqp8_EOa>crlHEc#iDGrV6I zqMz-n$Hk*p|L5ZehNYOxPk5W>w+DYm<ss3Ln$ZLrX<qt@V{XF9po*-mMbdPug381u zslw0Sy=gvAs?(2#e2zX<?!af@ztp;TWs078VP9t-x*Fa<k#K$wJBvTti}cn-G9?FV zwctf|L{7;Hq{52=I(8h@9u}MKv{E3Op)i8Q3{e*=;wqKoZ!Vr^Wvt1VA3AV70nTA$ zXjElY8x4F!bZx$a0SLmZBHR=NKkwo6I9jWtgD)W370j$5_~)e5I$v<Cg5ITP8>w)$ z+ql@g&sazc1*r9jgQO$v=?C4!;`o=Iq~lnDn|hP(edAUoL!VLnkY&eLBfofO=iLel zE2Xr@E2Bn<#h+r(1+h6BH6cg?H_gzLPL++P1)_p)pR_A#>LN8j4LG~t?QB(*@SnfO zzib%^C5uTVZ)jQ$Q;TM;qrX*56ra#uXvq8|`>FI_h*Qj9>O<fz^?>tY0swPpfNBae zqMVVoLO?~Xxmv#znJnT_CB{%PRJ{?LK@sd1^9#d!VQ29yIIMd^wAY<Tt2X=Xw{7Ts zMXY*Lo)bxQTq)*5uPZ~W$`y>*kHz6|pWuQVgt#&}`SsAIG+>YKSo-WwTfgpba#0C$ zcn1M{9kLovnk<BfB)2EDM7Sk8*nTwdki`0Ld;xnEURg2~M>$n=w_&@OAqEiLiD2;Q zt4@B>Zk)b2(}+sA5cZF8xf~fV!btCUiCY_5-v{#?RO>U|luIL{XUVNTRG978FkaH} zaG{n`r69DkJ2It#hNz<8iy9Fq;(E_C&Zi5#O{c*><+*uS`trbJibQj$sfXcu#Aq9A zI&6e%R#>L-ZqgZirD>WHd>j;M8c>HcjY-Dc_y(@SE@x+ljaEZ<EVNi!%_hpi@b=5_ zz@SVu9y!>3Udea9Hbkp1X!y-F(rZMH8r#eC$v41_)p3P55Qw@N9N7C-D-te)8WzPn z4%B%nN-Ru+*icGgR)lM@{RsjTYV#7blyRH6eE8dv2T$T1>6x&fN9yI08c$G54-(}; zskNgD-%v$f>kI3=?XJTMVk}(^`mvgVAcIOn@gB|@(F$my@c;~&q6@=;%;=J(6lbMP zbKB-gE?l25S}ZSlpfSh{Z6t%^2XA)L+Nuh@mFL!OJdCwLdzs9(11S&6eo6C{8^b4? zbNh<9IuDmWRMMm+DwtxFYRSj=x5E0>WTCxX6z>kon_NJz_fa)8ddgIoG^8I1d$`L0 z)z)nt`?5EzmwT@S#3?wuHLQsn1?9$#!zm#lsrVMs(azH`6cV(q%ib$@a-Yy8qVKRF z4rKe>A1tJu5MMp^8}wW}8L9J*f^ja})J#AU14q4x9!EI0Z8K_Q;>#xxjupTrSz0;Y zg-To@LCl`Mt8k_s!yC9fl7!DTmKff7{)EBX155+jm?X#_@ACR)UW&bsNxo$eT&UI> z#b5r4UG>y?`0|>Kq<$Ejlut6yduq(=QaiC`9t9dMrmCO`>%fm=c0iNpD?&k;a&Pg= zC=~1@SC$DD;m3Ea9kI+(_rS8viL86Nq&EE4h3T-*^Gj&>z&8`ngNHishzv}S+$MW{ z{!7s{zaZ>@GIvc#Ovi|NKdrA9o8k&eM-<m0h!jT!THvRt{Z{3i<mu_<nYa(04cpHP zW6*jowgc=>Z=nhw49t=$+2`SQo-#Er4CmmH9woi3UMum3h@PBD7;gJm2QzF{`TeRJ zDMinDc(@|nWQqlFNBzE<e=VS>yR=dL5#6MJ$lhJcS!X2GsS0r*NyJXr$W3y=DJTs& zXSSiW%)#)+;cr#^wYZq5T_bog;LwTL$nEfsfzGPGME-`=$tx!XfuBqwz?O)+c&lTO zh4I?=p>n2yYxZ7EqHTZ(;*5x{fbJ&l!NNP~0(aHci;sE<rdeJ5(ytP`N~NS6R+c@L zu%w(pi(r@x9Hs(%3rAx~p1vbc{A1>vDwaUMo<{$wp&*XZ9IeIqT@cREIUgR*bZ%9^ zu%SL%6|5!X{Rc&c-ueTjBFbi=UMv2aNtf`ie4JkW^YJP>2N!R>J;|iG3&aeZ2ETc~ zQLgy+q+mNedS!O~#B5o<2Axlcf~}U{hK0g^7qhGW5%i&Xab^9ZPkOtaD6Nr6a*>n- ztl|op;aL6Qd_e5Q`kghxpAJ>=ZJe8hKj~fup_qGTk&kduEP_M@i&oClZxz*5@GzLe zz6xoAN^wrI)&F3%OhmHUfr;)2XTnikJB%<1J_m`VSR#S0dPFHjjERwpV(1lh0seqB zW^;8<AAmrbdvw0Jd-bsSLftj<JMKk@fk!+kZoR>c&OR2s2tT4+KCN6l3V?vuz(?V0 z$Kd?^c=Z|y$d76E3=nE$kAdYSHY_rj1h^6-^VICyC&k6U`6Zssya*N_d#G_fb9u@( zc!1q8K%;NRa4IDoA_5>22dpo5Wvo9eU!BRHrGWa-yPUb-NUI&*Z8_}cBTAsG8e><i zl=>gGl>N-}AkC+%37GZg9-cXscE>b?*N|+wjX`Zd6}Rj#wl<NGV5*=A^$2kb^Wni1 zs`W2`MHCtwWLyE?oPiM{`1CCCg1;&R*=Ev4h?7+;vH@mzwZ^lf-egC;FR9O(^yn;= ztlQpst+>fW!7@_59bKdTh5ncc1av6(t8>57D;tE;N&>$869~9KRpQ2FRVrA#NHJ0v z9{a4lUb(#6c<T=oen?U3xENU({9kqW2UiH)6vRdOkRbq(?&AF5vuvF;yl{DxO<1kk zRHb<F(5$GocPIWCf1EC~{dbY`8$NMPsnJwao^TNKS1s3<D!Q2ITiLt&5Um_9cf>-l zzz74iYKX`8b=qQl!xXaFidBqFdop_=AWt!5Kn`i^3stz783rlI*M^TO1h_eoaVsPb zUtP$du#ynrSp)+sNw?EPS8r7Ghdnh|FVc`GCx@~8ZCxJB0gq1q6pUWN^4#<<?6CeT z$eCE|Z!1NF|1X;-K-HeZjH21UNBv%us}bw5<QTGaL+Rrc{Dzm!p=oVbv%M^9wey=K z)&tHy$suUqgf!zK*mrNiJA$35v}<60u&+@fAm{`)?QftO5n?)V#R}ryM_}6Fh$<5C zuVA()B-;>s6Nhgtn@p!FjXI2O?0F|i>7Tgt%mOv|M-*_k>g9eVyAHOeQ(1hkRdWym zk%nGM!Q~7U%WP92U|k|mo2G@RM^0Rk)Hjq;$Rb6ZuNIduqDA?vZ-96wYoJga7KBtw zS(Y=;Xk0FpL*U{5w=LP=HqyebdqZ18NukNj(f4U@Q^;V2;t$aco&@t+ay%4v4h|&1 zdE56k#~b&jm))fXKWAYH-q0|4o7c$Vobe&oQ)ZBjG4{6$#zR_a!)cAF!sV5VL>%j$ zldZ9@3a(>S5fxYu)aqsXvp%b)6s_9mwsae=``9zz2Q3>Dx1oCJ6!S9|kY&M+tZ>^; zg-tvp4LFPq-2OG-0*q4d>Pu41zQyHzI}Y65MwNYdXo7%pHe77pc+svO64w%UMO9g5 zGkX~W3h)zM?B70i3g2xiq)1uU{#Zm^U1PW*qO?9W{q3EnX!kN)guf%d7H1N4g+djV z>iUC4Ul{q2KQvE{B)xMg)v;)3V`u!gU*AR2e@4>V3*vu7RyjO!3E#Lqs)N1?H6yB? zttO4>Fz3-I4V}34U<6e>^Q2t+5F@HqEYEAic_lPIwZrGTkeYESJZxQ>SJ%FSW=`2f znOoLq$j@@=eRn>(pWu;}brbToZV(8fpmY7k)|Bq78(cF!4`#xRDx-2!6381k^6B3k zV<6W^S=fA^WT44oTV?;ulNwiDSA-ztt_LkoP!-FMhHxT{GNPaa{oVQqOW#ALY7JtC zXoOd^Suv~%vv#YFMVodNT<JGu??l7vf)B0l;i;9RwuuU{e%j@nT*g-6{4-?2h{*R@ z{zQb)(hSq@UC|m4WVN-)C-u1Bu$>;r(T+LBDQMOi(ce+~3P)onhQPIbZa#J5$2LpK zWn*RQd(Wne_%ma;&#;4+HQg#si+f>MNxJdlJcYhjwQ!kV0@GTFUX?foWL~(5yZ5&z zg;MexrH8kcvm(mnQ}{u2BbL-}IYP!VmMZDA;)L4E_`~+X#V#MO**%0pFT!JyKb}BO zx4*Y}NebHcbztOafW`~l@@avS><<Kh-nCP4*!Fd_b%CC%QG#Q{<Ms-REZ%6gq6eU$ zEK`3ovjKjN3IFjiZK^s8B-HGMo`{VZ%7MDy(pnO1i4o=h*ZsXEajwit4XBl3ejAva z<y?f?D{9oZ`Ax6XD!ufH>)o5nZjny%%!yq1%mFcCphxHC+gLHIBLx=rl#f~^@seB; z895nGV=SA9&a`r*OgUD>xM5($A<0Pa*xz52ihgOgH)Hc4W@hu!A<1AY1#u$8Vx{2x zpA?BsniL-cO*&;26TVQ$Lyq0VFMKyH{fqB~J{iRt7nnyHGli020n;{qkoz}m+hRK# zHx1AzFl`_Tvl#KKBq1HEQU>9gbR5vLD{NjNIxVqIl{ENf^fmm`i{ivlfa;gnxI*0) zZ}t}F0RUEkN3vnu{;@~FD{gCW3CA~g%W+%M%}*H5`T*0k4HsBpMEkY9tTyF!9dqnH zitv3&10zPnfkV{zcI4N3m^4uoRhE$QMtPw~e=Yrx`J^6Y_PW&(EYHYjVTudigab~` zlIFH{QM1(eS&Sdf0g``Jq<a<zTZ5>%C<K@w8p5lJ`2+j-U9F<--Adtqc9@tr@#{!g z>yR6vi1Nwe#E41K7tp}`Wv}Wtg)7sE^pZAN9hOm^<}xp1(64#o=GbB|p(f0>vS#Q| zIt~D6tPWvEEtz9_uE(jSPYL{|2pNO5Sdcm37=}K-Rfrqg<Pg!((v5A`E?vId>wV%D zl#le{F8EfkYAsz!Bi`7oh{lK}^4;BRZP89!8S%AK+2KCj36l}~zS@g^&+PzAjP}RU zva7bT%2=eh%I^|=YDc_p54G>|+7mJ_pCX^KDNIs8G$TK83Btqy<P%|Pq|rU=I)<Zg zp_vL_UJt622s5OG$d6Mgq9U&ggo>UX4KRFQk!lxD3<tP_cfe8wm&4GnJ6sm4s06Uk z9~7_|nIvHBQeE3yyv<PFo4(2m7w*6W)6o|DSQOiB`bd1X|1fFcXX?IYS|O5VvJCk! zCptwXDmg<rNrv%1kDI%I3*U^_=!XB&!0)yBz&bjzTClD)*8On}?WOl2!Bu`7Et?|~ zz4kL4BP=y$*4sk0rwNr}PL!gNPpKT5xttvTRJtpDNC8guOiIZC+eJtdSA2=Gh+z&@ zNSQFO{2<3eDG{*3PK;dI#rsP%<kinjP^2+Hgaot3EJQLEA)k&Wz&eWap=b0~|I+?@ z&^e23o`s};=eBUtdw_I`wWpfD$~9WpKZ$+OSV}_d@|sytHLtIIEK|_<ao9?S`uNIJ zcE8~%9>XnqRmm=I_tToeoRp?IQRbAxuq~t?C@R|75E*PUNAjb+osc>SeSoMrP2-<{ zib(xkhk<&7WJ#X0U|N1woy$&yX9<*g6r3@eFrI?I#1V!-_s-M)wOc;61Hrh!Y-VmW zoc~9@U86<hDBjx_|FI+6w~3}fzR5R8S8ZIk;d!?WlLOMcG(_Ejw{)uyBdTA%2d<4a z|Dhxvd#!hL$iR~z{ihKg52|q=QWaLZy1Nq9oe4%CHflhR2-10US69QAu)3`9JIa53 zBeQVH=IbwhuSg{eNz};nx*^EY(YNIh=cSy9LB($)5T3XHDsS0{P|9ddmuD-}Vnb8> zb-~s;TWXX<%bg`zA3QRCBNv8}%^b$G*RPVu-7dm^fUWG^ViW5PfvDykOX{qHM7p|I z9=^v5EN0sr{<@rVr6>r#0*HmYn-qS3@|^P7{2DW1FW8e8a?R8T3uoCS=3DrAKdAs{ zPcK~}SLG*<=gEq!Blm0T0k?#X_X88l!N*{dcd_N?aBZ~!=L}6t&KM@?mqj;CG&)?V z08<owW}pJ&i}@~%P)i`&Dz3D|wkt<uha5;b!c0vjg${=mQGpLd#f)IXz-;jw0_K*S zGxbMtAgwRd(BX@9^a6E8!NLT8zKdS@yYjlp21^E=<I~eYudi>yMp9HLq^9C0D%q@R zkvX;_bRbZZ-w6vfm}TK%@bMaQzO1r<$=T%8lI^~Ve?>yRqda?#EYi9G!{hl=E&P2Z z+cPFWOk2AoMf^P{i`NaTs@{lM!*3i<7W6sI$Yn=rr$X?eDT~W|$60ICj1q$%s3O>_ zt``Z@0s~3#Dz|__HQqcLej;V4$n5su<7xcO5IfMWohzsO8d>%`4{KRvJ)8jNH{ez{ zCmOW9t3B=3T)zZO`NI9tt$-9f@eoM{<QXpZ@b0JSsA9XfM2hcCB8s1K-+S;7M-o_N zz@>_Zo7sfg5XbCLy!Cfp0_JrGaK!eR0ebH5ZF58p`i78>5058TRhaYy?5<c-WhG}D z&C45;5XMhna?ao5i6fXCG;8AVt|*>fSX>W+k46;BJu*pA+3bbDbW#;vLorj446~%S zN7Oo_x`|TR)Km(We*FEN4~Tj-HL4ztEyZ0#rLcYn6p<fyJee`y%-5NeGL=pB^0+hS z+8a-(*@AMBMGul5w?aLZeI%Ug;Lvb39P>1s!Z6})8z4bM@GnK+<nCeI;#Y}6mW4K) zY#6ldRw<@(*-hxKH*K=9cAy|9-O<!uGR2Qu)~ZK-)U<S;;`5@d`m<Joixv9N)$!(! zMh_&&R?e=%ky!tfd7ymn?`PvWImV_&!wF81zpwnqEqSvt{KPS(zylg!;`s76D0qeD z$^mP3d~bHIL^Jt9QfSN~w*3=-LyrB>K)Fc$Gt}?=vH)IpdOpo-?q)2bxSBl=TT`V& zi;4>7Xj**I!_R#rB4pLwf4#iCY1z!VIr)?@kfZAems4i$I8J=q_3}AR47K-bRMNhs zLm7DBDM(A>ZvrlRA+ozV0`tbw5-u0FN~E&iq)LiBBI)<>uxziS_ydGkM=3iC&XkjG zJ(LU22rN#D9O14f-nJZH!}-d*p=!%v4}Lhv3ArEtTol_6#-o-}#E3sa>HaB6!tFM; zG-%@K|FX)jHrW;u{guV)^Z2rAxL6yls=~;V{I_T8F=A90tt+`(HJoYq_(j`3wVT!R zFA1)kiXTeG=8hXHKWv{<Y~u5IyT5C&+#vI-iP!tQfu+iMWX4ZCbAV!<lJ37`qck!= zmny}ukT!9nf0@^slfuZbVpD65G}O@D)(L-<$vl)dI$E8}=9C`?Q9CUt6>i^GI}7=5 zx+}y_ZwC5&XZ~~=sJg|_?GN|+cYgF>iK!9<Tza-GnagYTSX}$$SUu5^EF@z7{;aGB zpdk=sNk5A3+phKeK_S%~j$0mbt3s&)0rO%7VB=b-e96Z5E&S#+f+5G5@a9VWJUe3x z`+TcFl8B<PM|<CCyu)Zkn^KA<S&T2~*wx>kHJihAG9o<bpQ;%R31KToYmw`T@^~{f zm@;Hv?d;Iga>CYghD|5WfEZ_>&(0^1Xb~93uRn!>$>z~?iS?|BtWE;1%#5%F>_=Yh z9HVCA<G<h8V?->Cj1JKwwZkdRzt=#yRH7adik=hC@s+msmC59IJ;WAafpBAIg=|C! zN8wyQxb6;Jl|2mv3*Uo2u<Cw-g4ujcx7}vO{)wN}(mh9!qERX!1V8d$GiyNR>aPPw z$XK*wZ}U7KuRi1<>X|R6@-%(2Y0kEzSOpW8R1S@;7XHK>Q0S}2(VI>Ef|bJEWQ5w3 z3HkC#wrZN6x~b_mf;`m+NB{q00b<#|BwH7VfT1hps=1iZ$Ef<VVYh&-*mpf;6%SpW z{YZ{KTQH4XM7*FQl(VAroMwphQ58)>{W!P2pld((Ums<m>ff}|i;pZRpC~eS^{nAa z@W=LBEH9Xw(x&i;%n`{3jIC3?a^}vo@e#W><JH#e5|n1N+WKXHOBJJp!Px;XFJZ*O z?80}~m*e9%IYNTnJA2xbA;%`d)2NgDA|D^D^xi-B7rw@0j%Apu=!pkOptWqrea(Sc zQC|~G!$Ame-DUL3RMR$G7Qtpa5sq(!z_l6v<PlwB)`RpjJT~1Y5YOw$VSQlAJyD<? z^<*1Si7$goT6mpNy5?vJtD(Mn{GnI;z1%uOt-ZvU^CZE0k8dK(|0N-euQQM-mNvPX z@*&FP2@Y?Dh(-ikK;YwkZ~6!&zA`vm90!&FJM;n-JZM8(exZ?_koWj-M|vq{>Q)J- zn$6`j6UpI}eY{kr=y3jN-i#pAEzgtBSknkHKxaOzF8|hT?c{*VfCJ7x_`<M|kg_zI zGMnEBlw-{n2pAgh+t9`S8!6imbTG@*N={5J37w&}tzaCA!ILf9)hi&PAdr-V*@xpT zp?id4#(C6|_x4k14I@isR*oSlY4S9;Xa2Ew01kgXPx$IJy|ydM_aK;<nnMGhcr*0n z&4G{Z-&zP&`Q_@kW#vvpRxF4MXNOzU(4!~U2-*u=b-ftWbT%+BPMoC8|8pWNa&mS= z85i3?{m<J;j9LWl?QF2G3H(eN#B8ppwI4p<BF$iyvT-r#_}<L#I8s486*JO45jVpZ zl`+i;Dit13r~%Q?jeOLnH|x6uXH$(3Pkqyfo?0CCw-?#*brj^erQi>(`pn)%ahA67 zHa0#VSrC-4#}w|YSw|8xIPeKZR`472UQ&&{$D-^{cgQgP`6Nv&UBPAM=D~&3<Y`XT zo<Y0ZS7U7#U1s-TIX#SFjND0>Uiq@AOFmA>$sv<hf*=b^)tXUcbo$C&W1n-*#^xJp z??^8W*|A7WGx~~{2hlb<3F(|AsYj@u4L^>msink!dL2i4jjOC?Ld6m(L>aB~n@g(Q z;pC6E``7Jpym<))y~))D<}&Yw=agw$<rmx}5y)4WluhYR)KZ_KS-KRQHgz%@S((^b z`gT&KKb)*)$+Pj`h3*k0<O}fUY$w!OYyc+hT&8?ymwi9m{3?gQtMMpffd5zQK?K${ z5e$PRrc(y$t1AhA!&|gHHmplda)f<!4us#Tid1)46#ni^oY#K{N(tZ-){1f@KQ`0J zs4n@2S9VTs6Uih|O*V2d@W3rSUA~-WW3G=yc0e8?o7~_w@i*_*KwBgJ!j{<qADkN{ zOx2O_pZ;RpP`;rZrzTP^JEur!@O`1I>y@@naq|z6{j*O5Z(1lt1R@R;<-dM&v1*=$ zD=Gz*mU5RfT=MnT5(_E#?|tn#Fjd@tZO>=q!daR3-{I%a9r4y64Rmwu`gX?t7LE4Y zuiRPmZv1QA=dvy`gr45h)Q8R`z-Or}iO_MM>ls;feGM8Z)JadRHxbDs?-fT8!43yQ z7H&^ZF>e~`D^X3l4lH~FWu1J9u{<gJ58H2kVmd{B?9Q3Uoli>0{r!#EV)s){ScA2E zMN>fv{g_1f`v)xkJmR$tsqRU;ba5dgkZ1{dretnyZR&IM5MJByF{Y+UEZ=_H=473@ zN@>CGz%Ca?(JJnb!RC&JhCV=KBxGc_gVIdXv5YsMi?(nZU;2J~oOEgo2f7I&@XZ{w z5c)?7|J8Rt{}a*Jk-z=e=*50uR1?UGzFQ*m>o%|IEO^}W^B4Jq4^3uV9+5^9@jBvZ z<sJa#&yraaVcfG>{CU4k%iP&c@X9I;r+&*`UnY6z)Q<Swvz;!7&Rn=vn>3>MV|)M7 zSKAM!7z+1G3c)maxXe`7FpOt0XfX}aqjolF)%vuXeF|j6Roqt?V>~F^p2_q!e=MdY z%8A~LsWG^EDd16DDc-HpvvDpZmKRzD5wnXHeqP97Mh{J2mSp6?_o-0%Qbv;0Bglu@ zl*NAK*T(-t#k<LJ((QU4(B=F-qqW)U_jNh8P&BQuuq_OJu=<*5uIW#j!LzvYoUWDZ zv~95Q94|{5h<~C;xNWfh!h6^U3~-*nU2QW5(v(WmVE9`LA|XhNi;|&|AZ+A?fNGDL z+!OPol0LI<^g~&HhF|H_j{Cma(*Wt^Z5`~90Ql)kMR&UUX=~)~5vF}d|AMLIU1n!p zB9!re<Kxvw7)QWO32qwYpr>0Nj(p;ZOiYUtwD_DC&A`si85ucx$@Cruc2Eah?NF*2 z7y}1n8*C@L4g%=1mJ(>cKUc7^ZIb^MHn0DV?RLD(vHCQkx^)4ij8aW@8-&nT=V~Gj zo*`a60%*eLr)<?E*m-dxmP(gVQo)LFJ>n>?kGuO2c-<~nL<MxTOLnlI?OW4pWUX}e z5EaEJ!Bj5u=K03tQo4`MJld0=h9#YDQX!1%GpKL&$q)u~lfqep3aMkwc<x%fX*t?G z%D&hI1g+2D{o$L58e42pdPp9dTnlNY>_k<4dGx-32=JYpmBvC~is4wsH&ZJ~%yqwd zMU0L+oYRgY*43BxsbUvXz*yDTd2wltYdb-G5v5iNv%%ZGdK-3dOz%-jf@>BFUdD<$ zdi&b^A{~d4lG4V^e(O$GF#U*{HUXRC3Kn3w#k&sYqv9URubN6aNUhxm^Q28hxbQ!T z=yDy?A=Hplu)^EuOLFk|ym8?Nb4+R`#}Q2uH$laa#&kAi=`_IfZ&3v8IW-e)o?R%c z!oZJ|_(M*{K_5SNe-aOo!w4(cMj64aHClyKK|V!~{J^dcehp&Q>ms6j{v(T1NYw8{ znz7kGw%=<23O6JIrd!EMDSg@{j*qd8|B?c3?S$jCa-0m+xjXJ<qYUEPe`dgSV;^$e z316GL9ByD83)?lk6C)d_wwLGd><q|X*n#lbGqSh=;mR|aIE~lsT0B8zB@=q|=GzAX zjR*1~dU9M=<nue5ZB<+C@3BKckc5*sj}6^KgWB&T*usxb*9>_;N<fi~DG?njB4<gP zv;0>gye6{NHFxyA)@HMn+mq#Gji@>o{kWl6Tpxwlo-SkPce589OW(47=QPfigz49n z-=fiHPlv5-f1j@0*P5A+nr>)?J2*$hOzKL4Qzf^x7mDb$#+tbKXAkMJLm8P$7I`Pf zb=>sU$@}J0D`&qTWHaH5J0_Y&3XI1qhz87psTIkGeNLwQ1!n}g;WEcJG8(brl;>RU zmpQ_h5&ZuCwZ85IiZv=@9HL3;E~v3|jp;=@t+W)^c(J~0KfVI%23%Kup0s%e(F#RS zGe($!nlwTziD<X3Cy@HMt?!Un4#vV)M}=TH_eJWuOK(*R;k=I4rmZUWTSW!;wdaC< zazKc!5EdYsPRn)jMkGf@CAzB0Zy(eno;I);#hK2?LhE#-&UEgKTgHO#VBmlRn8a|4 zK>$da_9@Ub5x<%ARe|7CZV{7_`6nLY#P2FMM@u)oJH)`g+s?!m#o(NY!*sfd9%67m zJ<351YUPUepV(?gc@PS4^)yuaZ4Hc!j6CnBd;*v}jOqX;8!El9cw6TCcfBOh{$i#m z5$L%o#G@W@qess&Ur((vL$+Vuw3hUo_3s{i*p3uDlVUC~NnKg;K9i9jPNFSGs&D#A zD%jb<K@n$g_O%Laf=aCu2yWq#JK~W{M<)K|gxb|Ar2Hs}J#~2G?<b#R@r8fk@Yvx` zDuQI*4CwiwcG7|hP=!wW=V+|<N<csWBZX)%*XZ|o{Xl$lW62}fo|f81D?;6nuhlp{ zOfTg0)H&c!$I<zc$rH^XI^_P>9?$aXB8rPRk%BlMy!x*ab9t1hOAP4pJs&<`yp)In z=vFc5m47VjVTGz+rEsqL`rLg#&a+hXqmgF+`L5t_aO5SZ+OcZz+y@`niq0dA^L3MZ ziErKqE~ko4SRO1G1<H-jqFA&b#tlGF|KWjy@+B(U{e^u=)LII$ZDF^+Y|T=5;k!z~ zi5O?aEl2`{iqzov@KZ0TtfGPpEy;Y{0BRGU4~w>GNP%{Bb+t88)7yKJ+jxDQLXsB` zD=yHx;Pb!%b2mfwR*Kwx9<h(_KJ|-(h8kmaL4Z84|97-Tq5cLBRb;{pLbzgB^`Ace z_#UN_n@mjE4WavfyKu%(50YEg!RdW9%zqmA$9OotxTXWcidr-_EC?F^&J0xQOpB=~ ze>{<sN<n9(1={UYPD%YPbGb@T%H;6rwjL?_OZUOfdiU3_q~V}pTuBc}TDVZx#cefM zr`O(Luv_>#tzhKvO6l?1vw$yRXiM(ba(Vdn;owA3xNCxkc$N(ai;OP>o!5C_vsQ(< zig|Ff0}a;T7svWb{SXkDpVx6##Y8$P4VlWu?#2n)s>+!mYPUq~_P1m3i;{6&dqQ$$ zxdR>dtBS<>7X|?-e@`bqELcSXByjB|B68%w{dGg$`d@6{i4N;hNW{qP`9h;pY=U=8 z`HrbI&85)B9ggFBY{tSPnpRNxkYu2+k`#+u2Vc?}1Cu~gR^)R7kwWY{H3N;1%v*|r z872}Ea@pl=1zN?)P(&+f+qX=h?LQcO7D>X91Y?;cB~5s_`uiLIFV{8Y&UiVpK?Ab% z9V!vQ_0)<NbjRd}Uc69y=J7=+!sw~@XMtoZca-CH-Q59y#8)3u3%3)y+u)oQtXkA1 znJrSHp*4H$d(ofciN7<ZGTYjH$2CWvi4_?2&S3O-607}Uhly<SwPn09E?bT>X2uo+ zzGVB)A-R~5JWwX82_56<KKKl}m@kNf5?=qgl%kIEIA_LA;MWRvQsBf~#-6g6>&<6t zkc8C7V}CM9Ny)a;Uk+{ubeX1>mPD;iwoCoBL2QPD5wQ08*J~%vmT~hG1igaI=&HA# zr3IFbzojJR&R0p1&nuN3F20tV$arWY61FPU#9xlTtJ~VFF}OIsVl!RX)v+OywZ30? zk}wZ9&K@8G%P}IR>oz8;f_Afe8!HQ_-DH41qetP(Ba5sb*u9!+FI_=LD<tfM37bBz zpuc`e)Hq4XL7sWrCP7}<;7n|r=J`$AGXOjMTZ^<lI{B9MJ)uSO?l%jYMMQ*WW<rn0 zP0KzolKk%d-RI_SAaCO~q=a2*H8k2!lD+u2<4m`2huwL_%;Vp`d2_Y*OaDjdc2>|s zO>;Nctl$sj(BBrB)th<6^A7xg(^zy4iUjN5cXM@Ju`bU~`}Yejr;=9E{KhZ8U1qx! zl;?_u@a&wjvzY0GRV^MZ<p?uQzfz6feb&iNPHzO2aUBseQIr|k2EJ9NR6xz((F((b zXwq8zIVBa-*?*C5?Y?MKbhCE_iTZBfAP6}-8qUV1hDpx7WMk4rOs?mB>_VV4UPH>} z*fjcqd~s73h`FEd&uScW!V_RB&LskCQKP|#qxW_Sp)`X+DqeK*e<fj28bJaDyWQ}K zOObH%;;TpqeH}8YvTAK{;=FGl7(eRC$8RZ!OqeGmE@PrUaO#Da*1{t7G<a&W|9<wa zI|-T67a?6++vo2a(H=RMr0+FcZJXNe26xsH0DAckjfvSH`GjK~O>DyO*s=*5vV*cT zII9><tNF`jHXKV1H4g>!hT<9=XFa%5gvUGQ!uifLI@I9cmHqRk^=B;E$4IxeEyDZN zTD#}223rhgX?OR4(Jf|bF}<FDOtiUBSCs2U575we5c#}y{T_)Vw(oum@vG|^gdP^w zsiK|^<gNJ|ED0H;^Deo<!25r@+8kaC^VZiAXJ<9y8E}c>1~)P`hi9he@^5&Kjq;)A z<D|%HMCZj#<=Cx3f7o2RTHgfKy#aQ9!3%jdGHQFsUGJ+qZAbR<*xQ(}DU@28)S3IP zV4z&OfSIhpF5ejYbHYpBUjAq4k^x$tU3fM|iH8a&5k=s1vJ&rzv7Y&yfvS^fV^t|u zAZ<xexVfh%!iq^SP%+cS89;vfHfw!4<n{0KRoj(h?%WRs9kMf082!YNm>}3SHXqZo zx5!Tw?#jw(vF_D%zZG{s-MmzERYS`c>@3Xc<Px@Z1$i4=+@DRi(Z}FH=S%or(<kH1 zH>In-B4mAm_f1l*ZX|ZCaRRQSFO*jPPn^tVil;AqfgGQVl&mV-%Tba65Gzl(8#Om$ zQc_!+CFtV3pV(?d<fg`D`%&~B_@P!Wtay#W@%x$cyEJ>%!-fH5M;WQRxAGeMbLxaC z$3{%9Nar;424+ebV18*-vRedR>J269w-aW~QMT{U``esPI2nhsP7ha;e!Fy~%!EDf zN@8y{3;Rzmc%a>N*RyPU@4yYA*!KlNfu-vde|L(O&%`y=r7%*wiSM2cb(ZUcgjEXo zLRFo0Bfs+2LOQ814pSHyM!U@GvR~PR#_p)ZaRIGbI$MLgifWr~w1(=a!P*2Bl?Jv{ zgbAP9<y4zmxiJ%f9Gn!AJtuv>ar&;OPcrw<)W@fXLxI8fv@Z|nCa%Z(uv}xnM&#Kp zuhkBZTX~SH`-%FqMG4c8@)_gjD&9u!F6p-%QRC#)QlcN;t+DAleZPWd3O*hFkZ4yU z<-sK(26R4SwpdyGQ<*~uNBc8h2aamTivj8_6e<{eZxQf9t6pu?u-Ncj6x7?-p&<1{ z;e+q{tK3eA1Zp6wYObd(pEAJT8Y7$2ZCJ?6T*u@;<(CO_u|#BK1B*2V>K{HtK0n^k zk|e+k2R}_?xDlgp3Rzp5LqGtndmUR^oob9T116Kj#-bsFo&A<7D=wxsY;&W9?SJiW zY4{tFO;Zx$Zoo#mq@T!cr|P;X7j!V5nmVQ0z4N>#QXrtH4FyLJ^0f%?a!4{PVj?3r zr~e^#)D`dv44UibmN0PQvAREO&fWN62?FeT)!Z+)z5s*0wiAkYxBgyszar=Cw`}dL zIKu<F9>!Do8f|Py)DLM6-nLcoBY~{^p24ky^VP;_G*5pisK)K;_rSN2%LRHzb9+AZ z63s}(xV1;m=ki+({9?Oguo6?`mF+bV`L&stfLD0C^y=67Ra8(^aK`~!dA)Q&@p6h9 zU_JN`Q$F)VIM_mTfN0%Nv*yuM&kD6b<b1JHhH$0DssH8qab{*Fv_A^Fq_rHmuImy_ z3}t9&sE1#cnF6^40ae?>lcw>r;E;ng(;Jjf^KT`WK0+vnVMOHQy-$efZX>0cG`KNT zL>OC7S5v`D!`JQm1^q0A&&(f>S7Vf~_BI-M#;APLDxtRra-Lj~X)u@`AiwCldhZ^H z>CDI`9m2t0_a-z)zYPXUHT-n54<HLO9P}WUb-V4$_y&|f2{lLtVx?v1Y)?|Y!Y!0q zVIda!7y7^%c%SsWTWJ-~u)@d}O00SHf3H!+gLwfYFw`V}PeI+Gla0T+$O6lxj7xi} zsg(d!Lj%!jXruhx=_^8`%oNTAQhOP6hV>PQw0P>Pw|DEkE<YZp7X4>*F}54pHZQV` zO@mDO_@U?b2;2@6>pzJjKyamC$nr=~V0M^?nuO~?S8MQz`_W>J4@@orB|$H)3ZF5I zjEtfO&0)nR>OwpIRtA_|LG6zl?ZyW+!gGGs@c+Y1aZ8KBsfz8U`J(LS<u!-u>-O<g z;xQz1iJ-bdiTj2AgsQ^N-@NMHHO8lG(HMF?>@rqXhy_a0^17@&wc!1EUGt`NZrh|q z>BJAPf97P)UjMR^FC;<7HG0Bv$qHkM#tL@clN`D_*>OC@hstq2Eoh%-q?JV&YT|tC zobjzj4n91C`i||Fe@Y?to;LBn8emV%7mA?_+#S0gdB)!0S~5)Vr}Rg7y*+yEmBbc> zYh6OFwevYGD5RlC==-rZpe<P{yWqmgCnRT2#?Vl<W&M?<XOUFhbP-f0Ez8>nUY(9n zHXDuKToxiu1wqC#rl5C}>kt#s7oysgFAP^tg=f#`&X3bxpTKC^%3o~Il|u)nQDD$@ z1a7!6Ywo@OrLJBNvIOIo5bOp`ctY`Jd|6PIb<=^;pVQN!?Ih7eh5{eBy6#(&L<-?p zTkcpXnqr#{Jjf?#gzuo4R2PL@Jk7CNNiiR!e#MGY7-heRsXTPKP}$87ccOWE8z?1; zjljo4B0V)s6dT~&<+g<nQx?f#N$zjq@@YX%ED2P6y<TKd9|A%aV@MoZJ3>N2Lix#R zz{~B*`RmJicS$85<Y+P{=^r8s=7b@#Bads;G#HPk$zZ^fqcQr2s4x_EBsDY_J>sWy zZBuvWBQ~iyS35hLAQ2Iy+A28=40zlKvU-PB_joAYAF|^?)$SLb)l2X7-Y$NR>816k z?&k~D^ZdGC#G1HF006723(?5MSrt2i4%bfu8zam%!g+&A#zRZpfhx{x^p4C7vLiY; zN&mx{{)rteB+P*@)%xUP8uok)BRj?5-$lQtmEYdmjb08HSF#k)`vC;!*Yl{0z1mFI zHjAXxFpmuj77FAAZnD!;X~PAK#+?zQnl!Onm;^k(3ztmiS~7=4jj+$NsI=1g^n4ba zG&!mAbo>6!9HtKzRlPO8;N#mjO@j?R_3Je^Gom7^>w%=S&4|)K>@wmpZneG|*P#wA z+e>XXc?|L6UKTVZgLoaxWy1S_5fa;f(>PT4GVmWEmmzO<BZmXD`AqYd<MfY;i8ojO z5xh%_`>sny-rIGjZSW%9*d{Ntnf10K8hPGpzH=R?<mBXSw_!S)=}WDfTP-qqqTM(J zpQG1Yc-TJYxeZ3&<Ra?*2&=eld&oR;aCK7$9<DlvfZF2XHtVV(I~O}b>xoH87N)Nv zLhEyJi0O1{QL@E@cw+IA>6YwuD~$<e!GKIQy-0`C`*+nwT|~Rm5pCy9g@e*ZI-3@) z&y>Pncz9#qoOKG8ma+a+A28Nc0nkPXFl9Ki=%{y6RBw#x?OWvl(RqM8gi$+g3=TF- z@NH<IxoAO+ppD_iVGBc$LXnCTM;#-C1$Qv><))J_U<?0;|4}(8pGexti3`?pDGxU< zkIb0v;YsXG=8$swJ5+YZNP1T;a?2wZ#AY5Cwm7A0pc9I`F7#>68xs?Av%vqf_Z?ez zJTgTaWmuRb%nRXKpmY#0GqQy$X4Ja{;lT!$%H%#V#4zhY?HHt;L1ks)bL0ChH#)Sv ziSIZ8!cpRi71Qz4oJn*&JQIsyizp3qJ0{P@<sU>KmMXER*C`}`+`UD!v0~aRxr+Nk zogWZeiHMbxp>!Ri7<AS)(2_}TpvwMHx{h&gxkwP6@k#^UKP<T>z0{RJ)}4znVDwGd zuJ-94zPH1d`Iq#fFhD?*)u_Thh02wHu*XCj@#oRlJ1u^{Erdux!CpMKV^Z?L6iA46 zS+6#x5DxMNXLQ2GMuYR}-|g<cU()ECW@MsICxI1=7~7q%4_tvxI6Y(7&)71^f61g! zLAE()JZ5d^d+{sBPAEi}c{i3=@3NsJHV_sYL^JDUCGsR14(@-r0Ua(}H4414pN(Ba ztekwyu#=;j^vs<wZz7!+fzNU2(nTqD0k&!v<&@A3sH$o&L>(!?p+(K{_SvC<@0%2y z;kGHDt8wSgpaK9k>-bt%1|&h&wp5djBwUEVC8E>)peMk@f4b6&jV*Eyc)5xa?K>Z4 zr~j<pW<_i)-}lqwtvWfHsk0pr+=?E%1Yac=`95=(Opg;H5SlwsQAxrb#yrui^O!^5 zntqd|TFFeTUwJG42?@4mxiR%6B1jZ<3p`WAyz*^E<M-1bYTtcx70vlt+X(@^Lwf>U zLDvXaci5Z7>o0`f>w)i`Uv?PWCKhzIQ^r{PwRMcrFIJ!T*8JU`Z<hL5)K~vM&Kkyr z!8EdAMM2m$$}b8(SByiy=(`;3U_k95;E<a=n~DQ3_>f6P39`?u#7$nHK0S|!#1G*u z&${7@WX3DA+^8k6S3Zjfa<IpzEAv!ba=`{er@}xRxh4-Zv7_&RfbvAotpuBbVOy{^ zSGYy<+no^(2Oc-1S$if#*-3lsR9_)AS()NQSsWW!c^PWihrK=BmeVVzEJ`>g<P4U9 z)>n6dlAPfGb>!L?SO+ZBJ;{DK`AYJ;vG1!vp<azUWZN)oV<YuC0F}0gRhsfqKg9=z zaW&X#X#aWI)0btu9Zsgbzo`pOa0%KbB_bu2gaO;3O9|3+h>SP>4OJ~ls$ExpV!!=t z-}_49NdBP}zN0!2CfTvQqiHXT>eiHKx}9@6@ksf#{Kc6IQ5)=v#qJEMD+`5sO{Fs6 z%7M4UAiDa~Y3l4lVszG@%717|TkERpgf`ia;g~Fk*N{W&w{@|D+?I^mj!ru_HSq7@ zfrhS|5pBB}2KDBHXhN5r>zjX%>SPV{sB87-A#&5Aw4a5HjCa3JeUF66vEmsnnG8RV zZ?^m=Fxwixpx{!g^_k^^;d|w|3>hRnZBfFIZzc1ydQM^den15t<>RUo-*peX+P2&A z5r3j`M+ZvuCQA;-T&YJ@eRVNORoUiE2ikbyN<4P(-p3>QfQ#1dZyMWk)*Dr5lRTg~ z3o(sZCG3&qog=c2VoQDM)@<{&oU7@Zy^rzNcaw(~+CNt#Ps99+Di7`G#tjeR+0mHr z#kzt~Vv;%7GvN;1NX;~n`uKb#xFREJhS#6qJdC)?dwW?LrMMGsJoYy>b=IX6tztwL zo$&a-R@0%YyC=|!a5~pqB_t~Uac~#nH_cvgir^&gHb@q?BGwne!YW!m68G(i3VwnH z53C38pRo&Y#>VJk!07fHuU%c;58<5M*tn&ptf=EBNM4;isE%}RN5V<W!viN=>$y}< z2PFTG1^80+GyK3w%C?&0QmK1oZ{*6*kaeYIoFBgDCORF=@9g9p>6&0g@?Xq-{v@oA zh!-}5bCUNK%#9iRYbi!&T_6#UL3OJb`4n1f)X6R&5Su6&HLb57O{&8j0v>}6nrq_i zYVD?TZ73=b3-}{n{0e0aIMZB$O@InUU&eVYv{in_5P?lxNu29^5JyFF8e!wF{py;S zT+15&krJL8^EK$0?}t}WSk^l_lb76X@uO8jV`4PjBf)tV!Oy((*}}KKoa2=S&QF4$ zvDHfYC7>;tu9j1^Bge68^ZZ@|KOfbtuj!pmayZxfT+jnH;l5Q1Ap5^QjaO5cOxV;w zbH0kkLW8eW|A^E-a{FdI1oTkhCm|m$BYd;PXb7cl!~Z!8q>m4^72ud)MzH=Lw$6dM z5-#e}H@;EFPDdTvNvC78W81cE8y(xWZQZbA+eydP<emDaYNl#_!qGlw@BOTG;#w#8 zF`zVPL!7_j<MtnIPPaF7Tu>xp>|Y`sn~dBdhq{xjGTeFCjbHoe5sE+dzH#LVf892u zO+U#40j1N3O?);N50$6P>-HnxJLfNdoLP)B_EaJl`4FOu3K&D5y7;$g1BzaF4&?rD zL~670Lnys!7#0_=5=k)Njtvi*`&uC`&UKMF5;l)kuMiJ6Lt8KuF+t%}E@8k~00sUp zL|-)8B7s`~h)t%Kq<`B9ZDmz965mJsC7Pl9=8P}+KaBp6HKJYuLK`Eu^CC^o?j%l9 z1Tx^>QRBLRZ#`O8$BUk|8n&K0i+HIhk4VQ%H;OA3&w&W|l`$vDQQ9Uz-jQbaLA;_6 z5)41Y%fCG>!>+r&3FF=hkBscxpP8R4CGeA}BN49Hb^2oaF4rM#z3*blt;`q%JL`H} zE#b_)I}7EjH`wkHNpg-d@8P1<;glxfJzezYJ2DIp9y87h8!W~!NvPCX-Tu)_$khIW zKc?`l-=S0tq(=0!=}&?Xn6PX%xGLLVsA!&WKyrLBY9MCL#PQL`_XoL3%t(JxL$x)9 zP^?F%+`LNU?Rj~t9QP_D6>JuQEWhG1qNH89Bm4iJztx#rX5q+w040-T)iJ7sAZfs% z12J*5M)qxbyThB!Be9qMhJkp}$z$jU;-S4}lb;IsH(4@UIvgEmqZt&<A{b|BVOak} zMp*mJltIx_Qk;;3m>C0Rc=iU0!}I4<ZXcT<zc2R*Tzx&m1Y$-0_{5bPt(5KkbZF&; zyL!xFr>}laGUX}!fZKj_AT~BZA0iE=p1wOQwxJxHkZ8!gQ}~S&x&(^V*|8{Xc5l(y z(oPSd?^g@>gg;(t=X0JFhLDmfKvf<&a}MAt(AOxA3J{GY9I;cSa3k^GC@@^UTm4pV zo?!j@@<Id!0-Nd+^lw~Y1=>wJ))?I01V24}zSoOrbhNyoK#atikV`sN^=GPUaFAzS zG+Uj~tt^I3@XxJ@q<)AKr%!2wYEQrUsKhqB44L*}(f3xhYz7?oQ;|cJLpytcE6n6r ziVvdp9sTsk5jN0^fVW_Ub9O>VU$Sl#7Gyq=-m`P>nwf8vAISJubO?SZABRo8jVtEq zjN|h(QSr2WI&{@)bkr&-bF;&^c+YC5EM&lKLHf^b{c|;g^4fDoNBQ(g#-loJXMv0L zElMJCDe!3~>?2cwwwiMId#v@&r^|*(f2YlvR=Q<G%&yzN2?OU$Rmp@Pvv`eh-Si2; zmVEBCWd5+pThhcO&4k8RzJ~b>!@v6Cx)%RG(ZlKF4h|GppRDeB%s>hB)rzy!tXiRI z$9OQYRJ7F#?Wk$H7VH%1+wn)})xGQnf-g}}xS1BPY?^hyoeO_AmOece>Cc~DA)Nln z$tz3@nMle7H-z`s2ZPc*<gazPbpAfnR%0`5A!8&sqkuhY*+&Xn#)cQ$(+%_0e|b9H zdZSzS;nBkTjyF_+w3VV0JDAAPXd-S*O!nM|2K<`(RPLWth8K>^0>pes<Q%ND+E6P8 zqMz448az6is%I@1|Mh(OARvA-A<U>RG_^T&?v~hGtIeIpwXORQFnx|6<i{QwYVkqA zT7L_6vJT*u!Dd^vTX<RztDx5Txoj+b-rC?=?455CN4kVCHmnA2uRQc=wFQqw)>`JB z9WRu-M5!Rb9>%;f9=c}xZ2;61`}t?V_~k65x~kYh#Ub;A%_6<JqEbEl=NP75t$U<- zS_vvdB6cc?5Ho>v!kx2#sP%z{3(_2WT9Y|TV$x&c8uE`1?&pCha`|Eow-haA^jJLl z92lD(tp5;xO|V3=jfWNHJptgCnq6tOKxc23^Pl?x;yLeTq$Wq>nJ_Fr6)?c0f@Ru% zVxqG!LC^M)D8Pr1y|LvBnF}Ii5=fr=7A`-2Sz0w*b2u&1WRK<v8sCPKt)UTcaszh# zaxutn!TJ#nS-sJQ_i5K^DS6gZpAW?FLFx^|cwoHT%e$t`Uav#q(Dnes%=Y%bPrH!i z4Z7X|0}<K%BbD}Crc@so+CdVtyU*I{%Pcbexkz)4#5~0Kd#Y5H(40M|>05gF?qHsG zgG*<y6pfscHVgph#)F*|cE}C}vhP4IA$>f6`J!%TA{X5SMf$H=Cy<Ht(fbmZm8La= zZi*LivLH-IQ3MV+OPs&yTymaLmejWKjU9*W+}kM!;>HR^j?{hb10Ei~ZU2ZoBH4FY z;~fyta`?-#<D&1(IZSukT4jw3Kk#*goDq%x6O;fI=31kP^nVzzR9b+*7(vXW&=Sc} zp$HPm_f34FS<%hkA<cg94cxMJc{*<8q6f+Iz=FJNc=6YYxr<3<VZS65Lr4Cg%i!Hx zeitea_Xr%1B1i{LNV$Mlm-C^R0-jd)N!0nE`<X8ED~-gwH2p)|TB6?nM@{0K1t;M7 zTrhrd*kfhccft0@4v&EJ)&r%q0`w~@7y{epjP9=M8oKcqlHk`u=zYyaZ^Jvp&kGA} z>z}O3A_i9d%-_<9ZQft4J!h0uf@HmSYVMus0fs^l%h#b|aU_AT9exybs0gjrS%L%g zQhY$)LS#=}H)zI1fpdSggo@C9Mea$QsLS2-pFqqMeJ?lUg249%4#*C(Hf1bLRh<ZL zG0)=eYh&2cW4G>|gw8Ihv7@>KrrjUy`AH(hNd{JSfFK2>=0;;i6K>O2G2@k&Y}_6! zn0C)u7S8h-r=}D&yA0-7+}JbRk!wiuC}-<%dCfavq(D^3toz)DNBy<=#qUsnWR;}t z<Q$&f`<cT36fd6TM86YA+l@#Qu|N1cFTYc)C~t)OUP}GpI{J4a!NbFno*67RMMP>u z<JTt$ZWX1ENWS8xKk1R>bJjG83o)#-MuQmzC51Zd2M&y56`wFe7flqJcAAzxQd{_= z)7iuK5B@P&a-*t=S3#FIxVS>6%VVeemFLKF>X{%OLj3S&MDr2$-M62}4S1Dk;qR(( z%b@GiaLQE%=m=!ULlHQi?OXr6Y4Ga4Q4$1hGLevkC>C25l)%DKWMMER#p}TnV*KxE z{g*l|OV+OBgZno-;2H(0ZQ_W_Ip1-5hZkt<4`RMYbtPgT%WFV`G)6Xup<f37U9{%4 zjkWZ$R-e_Rd9W#Auu%La^1LR|Q-4}rhV<E6refBhREciO@jA!3>B-@Xu_ff1s#m=T z-W?ob;`ZLfCuqH8uUzdO+4y)S^r7H#*`KLG&%;KJ{8d!Dceuv*)9G7#u_#athA5E% zEw_l=i_u5%mG*L@@p}-mGy-C0`Qg~8w1>pwQqPfO3Q0{0<zHpLTq22D*2%3iCs<f@ zpO470!e6>k(o>IVXn49!&MCeIN^>YASMg>`G`2RDf>PSx3`o%)QDMfQF7@PTyha4H z_Tq*|X$W=YK$CPAk_eba18z*}mfR}@F<pgL%KDG+hvn6k@u?_L_qeOMLUu|PKO-V4 z$%G4@)og72+(VDBW*`7U6c624bmYblm;nwYJFvJLNvEF_1PqdIjzADdVzjfzm(3*T zf8A{TzQN9k3O+g+{c)dno-V&5eY}g@Vg}CV`HaAO-P`d#y)~{3(o+YucGmg(_zZBd zihp#L8o44F+}}6NR;M8p#}fFn|AO$_b^V<+beTh-CI>wcKBkUOkQKy~<J?5p<9dw! zZ?ysE(fjFf{Ylcr1a2hfrOwtL=<f2c6$2$@eKAJ2v=!i{%`???g-<&GY2`sRUPJpj z^9LYv6)BCFyV4RU-@kV>-Dz<+HsSRR;s=^kb5C(KhMAe61ZD69exo$>z~0;+EE)+& zO2u{eqAn>W4A(8@Tc1k@8v{td%zDFLYal^3#lnVT39BR#B;GF#dl##5zEIlF^=1S# z4|!)c1-gNLD*+LOWUmOGBya<1|C-h<Z~JoL_1oR~WN?02A-DueNZblXr!sz`Rvpq? zB9UJNRGdU7fAdKo!)NP+lh0{gM>Ns3C7Uq$y@o`o5a2pfGO`8&rwNANUz_uLx`sBy zEo^`-YMRX8>~Qu{1&m-<yS*Z6NxSV`p58fR3HM(!e9>Cm7XGnUe6N-f_DbJ~9GT~{ zP@ew4=6ix_5<?hRRE|Bzy8e7)@8#;{(5INKAi2oO(K~^aH*IX^;D$PP`?K@5$~C`X z%W~`f4XJx_zjA!0pc=)>6&>YV@I>3TJ<wgc<Tt;nvaDW~MqaD&pQb}&ewMi3x(0>m z8Z*nYlbHM0@v4(rV;F2sEv)n_A1c<HC-js*Ok)f^YzRt1Muf-&^Fp_(gIR8aq2B4s z^x;W>Hq!A5PsdyRUeJKt!Cf=$I_lny1(SD{=U*;#Dut+=%&Y<VHg=IkBTA_uU|pqs zGpQP}c_-MJliS-@oGwmH_Wb54R^kSOPL8Z9=A(fqdrZ1Di(NEa*Vmyw!Z;!B*L<oc zqL@5>Ny2!LWGP$+pDz5fD6BQ%nA!@Yl{b5owlnslh-kW>Ly>A*n^9F8*8gA(Nd7TH zNjX$T+Q(bNJ*>%oA2jtj^UjO4ZQngLuB|kA)38N)KTVE4R_eEQ$6c(fO804!Mr$zr z{ljwyTu+_z55x9_nCxy_+g*N601wYaE`WBUw}<zZWV5~uX=(j4qdFxnE3H4gB*$(q zmUUlSVXG4bvcHsAUGOsb!c4aT)1%I>Z-Ak9-sxB*nohXA&pkD=R+<K2if;Cx(~KBE z+0Tp^h1BiA4GJuoDky0(AA4A8xkdcfL+Et{!j?Wlj-=4TXo6!+)$Z0$&Gm>@vRW|a z-E=V^+4)$Tz*zS@98Q20cs=E%mvYpPY(!Q~<ywgNhAeoso(4}`Fg=fmUH(mIZhe(s zY5^rhxYJsS&*ofn2V_PD9u6$I*@4BiF_L-TJTShPd@zTj7mxVO{TEtLKAD($DiTJl zFH$zyz!GyXUbWk^h7~eac51s{8v1gzCAgq24Q^hct=S2-df;Qv6byX*s~49y{cCkK zrLUgkLJ0UCh_PWqg2b0JOg^ZoS+N=`Piye9ERRk>0VbC@iDmbmmol1WWg~HDk+pIB zT-Jv&NQ&~f;fS=VQsd0$yCa4)Fz<{x$8;e~RNW*y!$=wckWVHWF<f@PwI&kot-VmL zpLc@@DHjA`=%KT%feNLVE`Rj0tgfA}^b&M?kt24gxh+hjp<xZjY32KbhQEk5-c=e! zPAy}9Ot%mW5BR>1VCSR-7nv`}*8wIB?5`^%f{}t#cQF$c=YrHJ0~8`wX7wMli!@fP zY%Aw0B2522q>A`&M|5M1qDOFpz~>nCkD(D{Le1+%0Uqq3hFD^`;v~(^&4QRBzR`I^ zAqZ@QHgjg_virRbQl>Ns^@EMZA{lA%IQ)_k2vo!T3UOA{O{Bq+m`;S^!C2*OtA!z^ zO{+)xPH>m44iv)b4$<UoWp(Y{Necvn`4BabvAn+Esx}%&;+#(*l)$gpFnQtTWy1dV zrked#nE{>A`y4xpR;q$8gJC;eh=Hz5;4#cv`}2IAOlxy4rh@RQb6k)-dXLXH3PQBx zF)NG7ERdo?tU;{=N|G1|Sr#H{)t#)aVfu}GpgMfWKp@$?Z^p?in50n<rFi4ibc|JB zsQ2WN-E+|v8X%2?)Mar9(yFd)L_bf~w)t`O`5@*SwAH$&a=y`xm``co!LG<woB9mp zM^>g>8ON+K*)1l@j--ZJ&yrXvz~c9yY}sZtMV<T>rmPd@86qx55<?M-xP1H9K%;0K z6t0OI3_dkEvG;b)T~WP#A4%0J=+<o&)E;id3e3)AB3UNl2i8_Mp%6ZgKbBESAY+6t zh)^>_O4Nfn_^U|3I#mo!5V83-vr5gESF<-dHwu>51g3@wnOnOI(O}kN&-k&)RES(F z(DH#z$rLj&rS!pUJ=3d^HP(Oa+lcr`<jR<qW&w#JYR{zdh%~ej{W7b%7h|r5eSTPg zkmK#s*cB_O`mpD}4kYUe?wXsc*w63KgcbW1qXFL$^(;NOdfQx<4#J8~`KgAU2SU%A zwW87;Ft`yCA!IN@s#T*(=oZhcPSnGNBW5`hv8K963}E1KO6X(styRwwzFZPC0k^le zZcjUxyF#|F7(~hZ%mgFi{E)esrfo#j&B+-CbAL#yTce7~EUNn>_ntXiAKUNjTIF~% zM{&qNqL6*O3<26a-$yZ(J6Y{uL&p2Te}{)bxFnZ12vc;l)vt~A&Wbca4fL7k|1BNj zR7%nFoDWa!c#o-edC0zyhs(#7TQ2iQCS&W;9`31(PtZ27anW}D#g&0aL~an5fu{vg zoeYz0Iv^EFVQx)ylFiXKt-~8_>2lGJ@#|4A*$|}HHY1Nf{}z;6Jzki7*Q>6^4)u_j z_H*6&X_*F<<VoBX$;bVWo8WC+)qc<RgJP*-K2ikVeK($2tAx*H?6jYIavagN6B7`Z zl`U*zf{zLYY|?@ox+pPahzKbbVkn)tDaT^y{|lk6x+VIEe^f%@y$kyp-|K#}i>=bW z;uDD<q&E~&1@MC*^g>=bUyi6=G$G0ut_Hm@#g8=<ZyERf1+7<0<Prg48-qGz-Dm7A zh{J!?%v%vq(8rMQO-q_5Aj&+H*)v-gLfWgD++(6c<)Twb2n!}NGP1+YnMlxTW)7$; z(`iG12`D5ZCmMIS1qXx*8+e8m3BjV!RC|llV@UbmTc5u{N>tVxYj3ZEV`CwDAI!Vt zcPkla3ilj!oU?hfAMh+~r<kRwLg_Lkjmlz)VxetMj6!Dra>ra-tYMh`ODm**ap#ra z73i!`!#FPuy}FJM*q#oh-}xw@NXDmJGh})R%+fqL6~<4<-&XzC4j-MR{qJZb=Ywf} z-K!UZ|6~xCUYj>r++fJqs*d+@S0F5izmYOQ1~F_1BP_uvQu@_g3&g5_N((Cv!pd9Q zEIy#sYif^2sj<;SCP*@P`5SlHD%AV@iTrECghg#>uAB7rRBJ9)EntDcXXiF&gmB%J z<F%LB{=QizbplHOWX$2nN()e1NQ#3*)!=R#=ry7;th$w?6<)Y%%Hate2>k{IASDZN z^DZdq(!j*vmND=dE5e+kS#<s$VzZ6dmBq=%HH1r&QM}YP(EXWg)1QlOYRY0JH7FP= z(;Kv9-qwa{pbt^R!sIgL91#_gs?Z*4bY&#b#s>oICSV&DeT%m9Xsq$8P=}b*tg8=O zthGzIqDIOwWlp<nf2aG}l!ayzz*7&;ikEb*Ul7OvpR9~w4Bxc9jQt!&Fwf0PM|2Ui z2S@lGm>BE<w66~bBOhJO;JP+>=WE_jq``FH1r)LUsnbG|gTyq<Np1*rZV2@TiZZ~_ zNOg7@%UWUhu2Mk;^gJxK)Q~>O-{n*@)CcMhy2EBRLL=)>c93MFU=&T|)FSE;@-vO; zuYXi-vXKb5fvM0BHmln{$&#cq%ZuMEQZc#|M+WK;Hhe#L_xj^G8{fuq8gb+9dWZ+n zFIA4AAMR`V(PZBS?<qAsJ=8n7l@d^zl0B$5Y01Zy;o<Fy4iplC;#Uyh$}uhM58P52 zVtx~oNgS6;g;+6=M6S0bI}vSUkN?Y9cYWeK-Q4`v`3e6iIiR*JCfxG_n~dg>u=Afi zYg-OjDePtWkx)Tf<akx9Ajy(4{f~z_KF?k5>WwBeZyFWazypOCH_cy#)SZ$%IU^J2 z_ynB3C`d@L^v{j9(L={uw&x?|ZV0bO%%k8>PbGX8Ylm;}Fmc(~75enA4F<0dUGcN7 z?IDgZ+5SZ*$ZaA5$goE00S55g@GdE^$!`O&62De6LtwQRaxs(+?M1;U%AV8;HCE$F zO(j@^pBrWFp%nrB=q#0#HI65}x63m?`m+m-`uD2!PBg&P0fR5jW%v8x%vWaM6%}5T z(os}=BK6yTa6xEXV&2v$Nh_$lmLh8(QEVpvcf8%lTkfm7x0Dz#Q0gK{!)g;dJ!_-< zjF#Z!4ZLW1vCr%>B}7zvZ?vsuo{<<iAV(K_i0;fo-7vP-N?*yjO~qjF(wW#wIE-nC zO)}l<OekpdxdH{d0$ip>L~U%5ED|s_vrr?_XDSfE*V{lbt=}y-$iuOr<<dd-xZZ(~ zybx8Hu`ML0+V=uDKVK>kyDm$K*&e}4-Yg&unqjax9#C!uUh5*o?i%*IuZ7(rQ5Cs8 zkMNa_9q%2b6;i6znd1TUPWy@A6z8%XfQYV^SRyF(Btj~w#|??WX7+cLG(sln58!4a z9Ps5Zne118@Oa)c)`QJGo&^6G(WgL7G|qCi+n94t@09%{-IG#eCJ9TR$^3}6^@6x; z-J#w(vTXmwlt_~+NA(SdlTd2m%^My<E5*_*sqhSR^|bEgM+s;a_?sQImv*FkhcMOd z@w9i~FEW*1ivZDHUSC+3ZvjCjwP~*@7#_t{l}IKY;8*9gXme!+QDp9~hAAxIXRgi| z&<5keEK9i)B+S`Th=6h8meTyTanSW$PB>2(D^B$%<02rl+fo5d5zjhxUguo^3o?!X zOzLW4On|jeq4o7JgPJc9B&X&sy<$&XR{hO^S=~jmKy7g1dM{Nq@@aE_p2mT@r^kb= z+T0*}!7<I9n=fV9_Os9T!J5U}9QcDGHl!;gp*Zt%Kv~mOAiRO()<1B1IWl6f&K1ng zzMUzIWIq+*XEA>QSxWYOV6k?y0Tb?IqvbCCHfsc~^oG+fHqIXN!^m1CM42p}fA&*X z#y=X{u@Ftbe{BLUVHtW~Ga1n3Q`B%p68?RFh{oW$KkjP`2UgkCdj8rLcIkse<s_MO z=f_RjUefs#;S?9f0c1VU!9{9Mh3|3MPz*3Inx+dr9X)jfXmdKx%8IJ8gZZW@Zl$;o z;u-FYPTz}7dYl5O#8yHOQA8e*U7eb@Ck7j(IyBOu9eH8$@i-Zo!#nl$nsc8o`ARoR zHK-?PZr(KuFzsWa_3v1MX@SSqr30^@50>abox9P~pN9N%mf(colepgE5vsp)n%A*2 zCb#d3m^v@3JBU<DpS{kUm*@hG+4h2;D__@@aD&Gr)GSaa9G~qlFHoZ_HPeqnRUY^o zkq);?itR6}TJk$O)><||e9tJfgjJ^tQO{Z6)ux0T_%&aRgqY63Dc$7!E{<=UStcz3 z{6u32ti~Dn#yUj@&PKHYb0|H{w3_F=SbIwPX3(_Cq486Gxa2BU>!;e6&l4n-AWGyS zt#uHD4B<=)V5VVUZ@J#V+-x~!;S2!SdVXlJA36B-^ER2MzU%vi94RbBVnZ!!S0{y@ z>t8$cY{@b+=x84pxu>$-0&^)d1jS`CnyDA_G;zv$&q<ATRS(^kXfm05Z0NvSqAY34 zIYu>!gcJG70Mhmm`5N)m)M<eQ85Io!HM^waY))5LS1YwZ>nu8Y?=$?GTuNh9-tZ$T zF?SaKBhj#-b&>wD2yY&Qo)R3W)Itx3<i)FPdT1rstG5+mImzoy-L{7FV!oetfTfF- zuKyx}jEfjlLBzZ#sMsnLGqqSZ+~>Wan=S4_;`y%^rfyDZKMdcq#FmQ&ajas`lX@EL zX~|6fq1KiTX3cyglosb(fOadL^3`&yFbbZM+8O~$eLjE87&4jW&!KvLIx&$^2NBfF zkgnwK70k}x+sjG#cwnk>iCJ=l6hlq1CuC*mzY){4=Eygd%HLHPr>ACSiDl5zg&Ut^ zL-M_^Oxukpzjh*_R%!;4NF7_53%2K~oKyEl;m3m2vKB;OM2L385+{>zrdT0IP;HV( z_$QI<h{e7E0dh-!O=$Sd37~3DY7xk@#ASRd*UDBfvM`m{;ZXf+v41wzcDJD<fzLgI z&lx}s*|EoF>g#Ds{ZQdp6mXEz;Pj&r=;OMpC}AJ;+{zr(*!~O41clyPUi`AOL^Ad` zPdm4~sLG&@@>4f$&*_`ZXC0VUk1NM&#ut+N0jlwW5>eKK23ZV$9e)=-#Dd-TB&!!H z$x*$!z2sz*N?DJW489DRg0eE4r4744+m5e!{pr-ChM^@KJse{*-@=%8QrA$Tj{~jv zJAUxSPpE4OiT=+CxuzVl0Y^l%dz}n)<~%6I$siQ7g<&8djV3qOJaq<Yw63+|DmLdA zywHN0q3%HKT9P^nT|)UNAZ&1wQBRJr$yzZ?1S2i~>(E1NQbjNB(4|091I^B~15<Q7 zV4t<Vb+A|7c8)6rc4U!&IN90NnZ`!)rZ?v1oA{d<*C8pdMEzd3h_=RaGIADO_L5zg zx*JSv&dvJ9&?uJeDH0|$=U3kA!J)&9-N}dmMB}JQt^En3R{Fjc8UU2_uj&&oY&^17 zdPXQ|I1v#iJ5!{88UlM0TV6b9<~}e3{{jr9<H&HZ{PMOD0tqdCg{8i`=)}2Q!$E?7 z(3BysU93J`I%_B;Fzb6-?^pG0>EEWd{hAeh?Cn5Ga$kKq)6rm1DU>2adSx--fBp!d zyJVt{J|{*=;ru;I3A(#vxW$_MsQEHA{};-4o+FyHyF5)$F*X7h^GCCb9!rP;-$<v3 z@`?6*96cNn)x_zcZ0_v0ijjEzpvOHJm_6i!ZG&8pv3lw_#!QD#pwwe(NK9L}y>3WV zG6O#i`UW$`SGhwZO=JGEm%h-J0MQdW7d?gCWL75!vgymQH32#r2ttrTT;<>DE=Nj0 z9r#ZSqgit!JWo6V7^=|kG~c41z)(tU{}+(n;tRT;APS?ukfDP&k^j0Rwx(qI9YEr( zn{kan*=}QJ!eHu7IN&(wiiuHB$igVm-+8+C8m;W%OY|FvfN>Z&bw>D-(qO~^G=4jN zlt6t4$FC{|@@!_<&hjy7X|>RTbJWpIDjj-VK?4RN%8f;}sO3zB(;0$<yCHSHxVn;o zG<5=i23Mh`XDGo9viZzdRPtYv;FN~HqyFAgFq0erY2C+j$XeCa)$sW546~XF3xbXF zjAPqPwlN79GPrqo-;Gcgk9fr91y@|Q*f3+9*^OqcqR^4mbBl<aUq)x@_HlT@IgVW- zk;O6-lE)i3{#7loE@My<l~mm*e<)M6U$~db<VK{?$*H}A!K48NzWRg=p)5U%RjJW` z9{S6CGVhd@{?H?@iKXqWz{}hM^SiS|FD=IOZN2?Kuc&wKLR~!);OfaRcIT8%$C@m` zng4IW<Klyp0lTVRwrk!ojJBBa81qG?{AG)@va<k_n{K`ZVZ}JAi@Dn?K`MDEQERrL z0{ZptEkkPthwFVSz<g!oi(RIS{K{koQJFXdCYYsD@}WvQkm14g!;SI*@<hkB=7U#O z&?enspPp8LdP)OtsYF})=U!$4c=tc_atR8HO7p&5FFO4^1sQ9aSDHDmST8SHY!b%2 zkw`&v)C8^NEmhpVwQ<F4HPI5njfSi-M26%2Z@)?|RV+*firRm;rA*XdXHsf?YUGoT zZL6**V!RI5i68}Qy<c5=hVJ%b-@zl`8K*or>b!B&BcvF5g7WqIQ3r!H-MGJ>xY5gB z^HbOlm|K%ZAX5Sc0{DTng0-)bH9;giKM8aOpKlMGY`%BN2`&5t(D6^M)O2P^7oO49 zk>;CqlfH|pBY`%Hq4AIl(zJY05fF{`JZh$Rq2s>DX4cJnlWOfaR2ZWnnH%-F4JbH0 zGxAAE!GQb3Z$Q}Q6r-NY(LVPBW}xCA3POkOOmD&1ce!Hn%c_@4+b&vtH>2fukMg#m zXmcqSXlL4Leid|Jkbh+!UL{nfHqEJcF^a$QJ+cT&0?FD%E$}Ng6PH+EXHRYq?$iET zZH4YK?))`-&)ycLn!#Hbk070<A^nezgn5AZ5MHxW$38)n;(7+|vpN{A!W=DN%n1{s zAhFfsHMxA1#^&rY)L8v%cHOf|AOU|}P=l2PbSBbhqotm5-&We2!t6QjSDc{58h);O zUUs#9X_mQ>)aL9?({fUZnaWe6oU5$G=Nnp=pL)%)+hZcrXoV&G;x(o5Xmxn$sJ~%e z$z`hLmJ1Rg@WafhSFY6$Y&gCA)oXRN8>5JO0ULktqs0<tGZVqks17q=M`FteO{d`p z)x}VI$Oo61*E;dipUMxl<wvysNW&Z>n(b}-)2*=ap7Edln6f@9oBekZ&#)T&vf#9< zt}g}<4BC{rmX$~P-oY15{f1k(qs7pDa-cUrjAwf38hXR6pvGi@#mfzFX<0r}#$vj` zLw<^PZe>nxM!d?FSUgp)BSWzgdiw^8O&O67lrTd41NDm+7P->A5(et(yvTku-!Cbn z6Rmq$_-=67oBzagNvKUmSv;+sX;<cAvSuqdkx0Xhgp^1G^edMQ_pOmcPXWJ!5gcwi zq|38{3qu~6k(C$B9OqjF9>aub9o3&8dH)dS(#$5Qd9Y4~v|QPXYrw8kw;xPQmY_Cs z_~-4Pnx|%-$2W$&!+MNj6sk4B3e!DIju@7wH?Y(sk`kQU2ZK(%rS&?_vd2(E$Ar?o zx=(g^>a*}v1`-0r^8goihX$57BPt~pSmbYw)I;hQoaFi=J4TKQ07jXsH1FTA{zMVT z!v62pBN`09r+1<)J@jy0EGcy{d9EE>NOy%Va>{J2#kiG2OLBa0mvp*Ed`ri;@XQtb zH2e%kJf^27c2@J@#;BAdIF(7H04aGgh!A1NAH69mSH1t{NpEi4dD9p5k=@AqSgpf3 z!PSv-?L$mJ5jtTB$7JF^Z^FpT><v<SfxoSDZh1|Un#uQw07er1A&cZeh6bCDkeVPi z$RswIL$kg9JcD0~5~I6k^MqymbqfEyEm#oXuSsZ9-TaM%tGrW+598#F*1Z;*7MQHR zUr?5=eg)!R_|pp0s?bu%0p#xH^cPJs(KhvRi>%i%1r%{CGG2#hIs5@<(ntW)Z13_2 zodgs-yJ<e%D?X1?(qacFRx)(8@^4Hyy65Ky)hMzOsE<Mhx_n}%6ZJK(Wo19Lx*a># z)=&UwVI?kq^XH(3h6=;}B5`Cah}ayt{3(jt*dskB#Jnf46QuP6{79ocH6APS9MEaP zn%nbbUEau>TMXoJK1HwI=uTs?72!|d;aVh6wb=-oJDO@}&9?Ci6Et#*56hSRJ~r>v zn@5}#rFONAJ?sS64dmf2aI0C(^M;}*P$DubmD2a}!q3XevdWe}`hw_5%X~`$5EHuT z$^373ZODWL_-9$KEj3>x9Rnee4eMdv*!HpHI9kGz=?h!VG{E>Vb!zs%M|(jB@Sni2 z*AsdCNm^l+{BgW}B5>E-M3h#kwRyXLJ8h`!$^oqXdLGBzx^O&Ln5hXQ%@ENeBED|D zs6YUq;h^49`~{>fxJV`XH8*!vN5A$q<I~^1zr(gvy>~--Ko52+7pjfOP~G0lasy)_ z9?j8Fnmbw)UxALj(=?IE_eZC^u&Q6KFD~&}X(sAL-A>M$G4O*>a#sX~LG;uI)j~is zV02>ytZLkE8ThpPkQk-@=ryR{qjbHGp8!}KhUkmRkUPz-7tHLpj-D%aWzK;x2vEku zML&z!Z~i&f87E8wlEcRb?r!+<icJXYVyGdBRT6!EyJ`wpHMAf&;%K>kcQZ)6Mff6Q zetxLk0DG-u`>Sn%&M)bkh_+(}pU${8DtO6H*6ZHnBvXgX+l|%P0G7mtIF9OYcKnM# z3_~~y9#xqZhmioH+1nuB4`YVzo~{Orp8Gc6ywAJY*RdOF4U+KXwodjTVL@m(y3nZ7 z)S~GwZ+!>Ma+~d`vzo{U6NsMIUegbn7ZpYr10324d>he9<GvYIaY=JTIf3|DA_=o3 zOjq|Fw-pZ$Suwm}HpI)HF1S!2VOMXSW*v93>egMjt>%&(Z`5M*7xNy6T=jejt%@o! zE)I5trnr$_X=pra$w=BZE7dsadtVa_<wt>^Y;2)y6-!Ueso%Q>*STG>=5PI;Dn)Hj zC{RYXVR4}NlU9Yl(LEBap7Q1*YgMe=;LXi%F;jb?bv~+CuY`XI(F)XP4Lp5yQv;y< zk{&NHzFRZW!BbF})Jmvyc1LxBZQnT;+Lg(J>WOX$?9eNY{r>cx_$$EsZ6~X6CQ-sx zs-k!L?<ysP$z4FUsg+N;(q$s3p3V_e*<do&q*0+Ykr{Au7mF|yf0G+e;Nw+CVRVm8 zQMnTir)<mM7&fe#hDt<Unn9e~IfzekIG{*U!Mv?0()|}MRarL}t*WK$(qXFWgR}PX zYJXAv-EDW9nB24#A#fo&XS#U9HzW8aoIatdEL}smGhamhxTd*bKL#m>D-uO{$n?wA z*Nr!{rRV)359;;Y|NVf1xJue;P{G+o`f7JJB~G4g@L8CQM2VEY9A>N*U6<cGX{=SA zpABK(38Jd2qKiijlNoIfOq~mUzR(3VLfb~KmXtu3r(kdAXZVjGP;HX1cs=A8W^jrz zPCbc0f^k^FAhT0efahAq__VQBdvuT;V>^F5G+NBLs-r8??<}t1m}C=5?mrBU!)f@A zU59Hmo%jGds>HyeGOb~HMD?3|k~Uj4%#=(ay6TYGo09{s&73)^KxBV+?|^q*0!wfu zdM|G>I$&;UcDBg~2}o{Nq9#?Bh$z4J)H;~j|L?QR?Crh+GekL>qGMj!X=WgDWm{np z0lM$Rq-Lx6P@u!^M^|*&!BE3|x_r4?3fhF4##*L<o5!~?H~iOTE2@r@&yUTXoxg*S z><=!xQ#7u7lb$WKo?r0-R_2y&{vhNBiMNy#3y^qzthCD5%SMRs_YwTl{K_phb-A0_ z894$vTrPU+Ud%7AwZlUbCWlkCBulvj?`V(hUyBbNOnoPLx2=pRL+yvqgd57*=y~jz z><(=^s1fwV4Q4XKv)v|HrnT5y(lRuARSqf?J0$r*w|e;SsYLwuD6)qMSH7WCoRV~z z1UaIf)F;ViKw-Tkg)361OXTpx?LnMPMC*$<Lwl`GH<S(r&Dc=i4+M1e{^L7@VhIF8 zN1RTtJM7}(l3Dze_^AoQ2~0{~7q>5ACpfKtZchawQ@C*y`>>%|g={`qTCJtAGG~vC zIalO{{o|5r_h5mbx_e0P?0VQdI`ooQ0uGtpcOA;1;${=+)qcnzWL6g!eFHlpu4b9? z9330$AI1{AfH>F0$}spOn@mpX80>qi8B`^r=;EXIgCEku`rejkIxTNB#9$Al3RO0} zmXF|rQs7A<8@*cWvCcH@G&Vj54;N31vAzKd8$5p512Nr`Uyr&C=i(q_!B`{5WtEf& zpXDdE+24cPMJE<Gj}H$su`aILn<=unztOLk&R(xVhCRG2wz>bg&sCY(+9Ju-@;#<+ zyy!85vw|AWES*?YsfLcz(6B*=v+>eTW^L4~zg2)_N-f|T_#&L~GzP|&KTb8))*t7+ z=!JXYB1WabPK|dIc46d>@WW*eUVgnNKcQ^!t1QfD=L7+&F9|yfp>SE*t>TD@<eVW! zLMh^woc0-}wq+M9`z9t3gu&%N!qfy}s+KIf8#J>W`7k^i+GaKu;A0bdVy<{!Y^i|P zS$K)PxfOm^^p|lbNg_jkEv;EdxZw}9FbNXr$b8=FuYuK;RpHR!DX67MzMvL!=k6OO zT#YTp=XRVLQg>k&8mDGs2R9t!q*r7i0Pd^4r*iVib+BP%nrOLL+49`(n?zawDBCWi z{y6_JS~YjuskZY9pzZsM80PZ*<P41_T$@m8eZQ3wFCpi5knEIwtz%uTx$o!Q73Wm! z^!8K*hsxV{){<^$#nvm{(=`@fq^a~UHGQBl;$Gc}x>bdga;Le&_eiRD4^@~CJH6UP zSW&{Zv)}8F$9ttI!rYDb%y+{Eqv_<o4{x6O#rQDOfe@iS>JM!cC_pg?C|O9zI&@95 zh&Ec2kf}Wb@<`1W4~WPF>wqP=bk>{Lgh<RSi2^-rGaD<v35l+QBNHM0;`B9;M_B{6 z>Jd2Ebw|oW9vWdtdU;5INiDe3=^#y4JO4<Y{b;cNHI=mKEvJh)_&|esX}dq$1)Vq* zv&T!vb*S$X-cv6Oub=P7-N@CHW=$YJB;_@BEtMP^I~!b-cJHRlnZ7#a$6a4&ZCeq6 zcb0V=-WfkoPaXZIG6cV#e8jahCPNOvU|Jf&Hw0OJE*{8e1*>z5k@N?X$}=-jDQ)U= z{GfzBN=if+D)-tT;}`$G(BJ3oqH>Mq{>~Gl_E|0{myE`VfMGGKfAZ{uL@maYj)HN; zWnd0;utdDxMLU4RE`s>>w{T&Ks|SN@KN}H(DXDgLci;gsHlYO#IH}3OO<i3WJ&TL; zL5stp(nSs8tBvo>YKx4&k8atA6gCx-6sh=;QDCIJYoI7Onwq!0V|inmn4ms8&41up z(L8x3&WR5jv_2<mdTouB95H&lxG7)ppHpNfU%@HJRPMbkrzO^&Z*%*;C4qMB(8A5w zs<p8hC01&=oux!G?Twtqk7iBDDX2Zho96oGVRF0Ix%>GFv&9?L=NW6v#W@2YF}W`k zJn_3YL#~}LWplWY1cB^dpnF9b0f&`NX!8qc!WSz>)Ort*<EOF&E=jfNaG*1oMaoPT zkhhKM^Wy3G)%I3nk8PSvS4E;mo_Bm_!%MWUlo?FD%P|iCPtEN;3CHpJ97;q6&TJ^f zey?bckDywvE63Ae>mDf8$U|6(!wNYLa0Cx96zj6{R|uY0Q=Ud#`i4MMs%kW0>ER@} zDkv%9W>_vcLz@3+Wp!re{%$gOLkmyVErtDiGw<UF#5Ms=oa>M)F)&0D1m14Ed$M=L z5A2)tbX6H3-xcb4VE6hgdtctj_}{o-!-+cpQUR*(OAl=z6D?<IQcJC($-aJ)rrudm z0pUB}f@}W`|HIx5onr(2-=X(m??*Yrjt@Ujww|kFZZ!A@!xs%RT-?~X;2#&}4W_?c zN!_Rp&R8bX=Rk;`l_}Dh*Vm%%;nhfeWM2pN<5cSMZff<XsnlHFDKsud+R$;T)RE6; zL+n2>F5SU@Y&>q$Y@Rclae~x>^LXgT=U>-B_bm_UuDw&UosKFqi3Dl31Kn-QmKPnt z)0b3FoO~q7k#)m{2cvswa8X_ccs_e6OIBOgg2rK^4kPIwctpQDv5ZbHU2;7M!C<H; z3)B4QVxVbTl7c_D(O2p@X;8NVpOZi~zvM}D$%<9;FJv|W6NM$ev*#<>L6|VfKbght z<knCKD84ClAiV_Sp4_LSoIyzM4qt~)&a{T4id;ZCz+kJl4(7n4$4ASWKYx8=xdl-Y z!uV&51Sb(CWqgYdRL{uD6(L#|7M_NqheK;g$kHBTuPx?^!4#(E$TFXXV^v+T=|K+o zXJ*-#Q+ey50^VC%u1}=fyXAXsn0JZL_4bCEi36IDW@`aYGB`gs&&<wj+B2Ca?1&t< zB>EVNni0uG2Q$kp?fHr{6&1H#sv2d-e;}q913?LDQ_>}~$zd#M9Q_{YTzVb@#+I{N zvjH9>y(HPLqTc8X0@{u=(9qCVd9Isixzr?>ngV+F$rfNt>Y`fmc1B*fuC}LvMHVj1 zNYRBb&%3@qbc0gEei%RQblUG}s3i$5AimwKi%1(eJnif#J}u@Mx(RJbR$5yR7XNdZ zj>{!mc1HD)Ws$+>cAI(c=&pkJqu3>f;k<p<3`u-!Ext22Py1H{G1|UIU$8t+?|F4C zY#a*p1Psas2@A_wVlV|umUnEtdc{Qzk9rkWANpLy8(+_%rK9k#ta`4|?cM$rCqQrO zWnqT8ks&iDXGqoe3L@@Hbh1{DS*{~2ot!KsW>L!w3w2dcc2eFP+tLgc;5S)z+N*#9 z`BDU0+_U|vFoTf+xS4;23X}L}*mkcxcB_njHJ-6BJGTQLS*eg~Dniqz^}V)PO>RY; ziczznj_!UIs+6|qi#y?InFkpQ%1*Dr{^}EqM@`N;#PXSuhJS6gz3(cq918Z=rt81K zXm%|%h*aQ!N9$e{jL7QJE>%SLrJ+rvnPZfZn-ezlq!5-E{t?R^kc7`ToP-)lx3qRM zVB3NAQ$|dFNq-;S&p2ewSzX#1m`TsThM<<dbJimP7&L}mvek-gxm=6b>UxfDwR|L3 zOAZdz<@E1)zHV@H*(M=BbSyf;I6xC!fsz&{k>>3ysp{$%i3OKH{Yd1L<h6QsCOtg# zl0iD(OpQ<weV!?+5-BA}hE6ZKt@oSNs3VB8v9i?C;V&q)tH!`3maa%CV}l~cV6c@j zUva7B?eqQTDHbZq52&=V9-f#GUKs!#9129?$LL~<2(ltKAXa`6h4ycD4(-&dib<rT zTwJvzm=MH;yI3C%-h@6yT?=AeTzeI0iceWc-jsJA+mX|C=lxJFSUbkc0DcK_CN?L6 z<h;G}dD>I!_L(KNKwAr|+2iW!^*Zb}aA{?Th5OTQv8(Mxou*}H$J$NQ{SAf6o#l`N z7K^9bONgL*uZ%sorzairK|~G^bkVWa8WM7VzdsmhV0u-NQJaAdt>XpUqW^yIES2WV zl#`}i8-t`em@oh1ALqYR-kGrKgHxNo*Xz7_cs)QEt)|l^nfO_QTkm%O0v;DkEYrV5 zSRyukky5Dih_P-Z3u;n<MhZ8w;JYBZi)I#sP?om1$FX#t*9_M=BJrCIwQ+1`{inO0 z%%Ij*((VV480Lb<-)<e3)Lva{{vRI_QqFxsN-MDit3p5lM<IxZ^N#NG*~TVkp*-r} zy7;#ZP@pT-4A*BZ6M{52>vk=W`+~*##)A9<$)%Y^VeIARZ{Mnhu6=e>mfPhvM~Wyw zm=@=afy7B^!expb6c8Yx;+1_m{-Wfh=65+e>f8c!&jiqRG^vlR&J+2hl5?D_fEp>= zRjVJo>2k8QbAPFWOJiN-Dq0X%n9oRqikJkjnjH$$(*VKc<!)ySnOupK;6+Kfr`)jz zU9RhJf<XFW93E>6i~S-X^`0ESM84{UGch7cnJ(IGdpzr@i$fP89QkegVD4$S?+2%s zJp#2@o?^-TXg9)r#JLo9<Pw{b{kw!juG7$i)%4$$^1kZtY!Hd6(!&t0e5IGC;lmvt zM$zn8pAM*CP=Y!g0jGaF*ymPV4nnYj;hV%&P74D)?sxr^K;k$u6uiazg6{6l_+m;X zt!`tq;X`I|$E@UJ!(_H^Sqg8{LJZrnHQn{pm-TrCXcdx!wEzBH<ZZ3gqm(f-&6JqT zNn1!D+x=VrX|>$z@m-_X-(P52CEFX4u>lHM;-=DKlfMD%_ixg#TXcTLT~r?<f{ev| z4hjP;jrI_Z+G$Q$fJ1HuvG7(TEZ@&bAlO`894kT`4qOAxo^_EdZV~a0m5oThqVkIX zs2=93w6Wf$R2y)O5_;I}@m{jwQ)cGSTvJqQ12#Y-jp#@tqNQJG(~C1^+(=uZBJtcI z7hI@3sub&i5n-C@S)_;2z@6^e<EN$et+7A$QCskn$oKD{VQ2lr4>9lii_p@f#0EnT z2YzY@ZnN3>ZOKM0uuTvpmf&ZgZf2LC%!c)HLp#hhf7mZFDY>7-us<<t?4BjYTEcp& zA{mkoNaqnIC->5oH~#&MEHVgXov0U<&0T#H5=dB&6BMJqUe!b}|1&M;ms}0mJ_s!> zW)8}EJ6$@ia^iMu1JCAhC&2SqwKwOAcIM&1kd<0sb!vRna~6aDmW?||*TF#-cp%sX z3Q>#t*gWu**A*pP#0h_J>1^qsDcry1V>m0x(d?i`&q0W>{Vh#WO({;EsMa#2Seu5= zt*V?5sV?^w5#vr1Kh`Eeb^b-yXXO!f4HS8}&_?pYq6>Bw<k4vX5npv`M;vlUy>v|0 z4(~rU>0uz$Mb}1t6cNgx+@B~AKmkkUsU$Z*W_qds31*<lls<LFh%h;bOA<LCm2`En zC9Fy2-Yk;JEP`fvelf_=@it0Bv#$RLY~Q4~oWqV;eKguxs!Px>oqX6D#8Na`loCaK z#knvaa63&PNRs+9t<-LP3|cQ6=Nn<?tIOL#j}Km;<E`49(llx~3IDo$%JpPoz6ONa z4L~qY9GvSkvGp>-I&~7u-o*?0(_<U>;M}CI8F|EG!n%Q(_ShSQB~YUQ&kjhc=Gb+s zOaRIgrH*>&_?u0SiO20Dj-YbH(gukiNJgu0uyr<%i<u!NW)%GX!f)K5k?G_EB}nMD zuj=-d5Wm*uCOxKmN@f3W&N%iar~8$Wy;3Kb%{tm`V7STc<2=~7R%;@4iPdZ88SDCl zqdRZ6SyBk%t1U6$OW67Kx9!IAdJxP~Ro|~)t290wmg!F?R=AHFzI>Z^#T)|r+%pk6 zMSEo{8ww;1YHceNBfFfgH=I5`Pn^G_W%6=Qp4J`3<Yy2Y$@bLbbNUyvT`J8jhgVah z)Rl!)P4Uo>DIj6hp@~1*6&gzWN9$LWw2_f5%R`BPGcsr)=50v5(%pWY)q78)q<3B@ z4AHWN)up?yC0*WGc=&^--Om5)v7~U|SiNGp7iFbdmE=MF!rjOZy&C~%r;mRuEd2Gc z)i%Dz?IzG*8;x;c(YDy?^`DuV{QX)Jq=r(#2)THYd;nznky<(Qj8QZ-6<E3=@{CG~ zu%<TZFBRvVHpRfFhq2o)v&pEBWazIqz*mLM(b3V&!XkhOD2FOh`mA;ED)@!1aE|=~ zfCCfigGf@Og+btC2bjhI37NK&YA4Rp=3!$XcnV3kkf5MnNcNW<Y-wInI+AiC)WG%( zT)T^8=cki+mM_*s&%^>Uq*{RbT1#H?y3N-csQb1*V)s1E_VmG^>ryhrtVTc6Q5idQ zTw}W##1@T+k#oKA%VisB?)GT_Vp^Y)CDx_rCeV>2<v*COKeKvI_TzjSdGCykYN%*0 zwBnb_K+w`16F&zwH2sv3or4veP!DHRKL?>e3ApqToZ8ZA(63ij5@LxsNH8V|{`xMc zWE=jB3^5_Y?@4aY!Rvn!usG1y9G#BMeGV5!FjOkH7GieiX_W^2Y&25oOP@lI(zg3I z9@iuPbL%{j((Pwc)kU<>SipfVSIJ6gK_-TXJUc}h9LN1{U53BBq3o9?mx9X{9lit^ z*gZgi+gkL}E|2exIzD!GFP(Q6W26RbE&2~ESj7b`?Y*IxAljXAHkvqdo8H+rS|7Iu zk_VS20d&ae;~$V?#U{|nk$`a`HE=(3`QzdpQ@MgpVnVrOz(g>vTK=|A3-JSPc~j*| zMU<8>2ta=CnSw&=_c$MH+3T&;%3o``A^G-ptp1gAV`rre1n03FpT%M-_)cfp4lViI z{dl{5^a<Ob*===SB9|^^F|)N$`+cQe>snU6kNA0m{P8dYuguK?&TD`F$1IGBGM${) z`@w7FA}3R3uLl8PcVv!5oXS@t@c*y?MGD8q$5(+`yrJR#bN->6_~*qTJI>MDCSS&k z+}%D`K;F+mFm4|&fW3PECg|llSoVYdUxyc7bM<j=da;KSDcV;mNJ=_u&3|Fm46SUD z-$|crB-m9vau5+_%_FadX^<brB_b*$9U`Lcb^c|^JaW;p6(j5WGUqn!xw*%nS!#!$ zbjvtS4`?D?TCLOBXpBpM7>+ew;Lb5{zIVGG!iop-#{a>cA5Qes2GoqAR<CyBsLPBf zbptKZd84&^M$lwd7_8zFXss2J?c6=lsx?-^8_WCh(E|emH+Pm6RFCD=a47w2IXzsp zQA38<3NRrd6Zy@6ln~kbBx*oGAS69gMFnqLr<o`ixog+B{6@S?J7{$Oy5P&EeaZSn zOe>iP2x<EJdq|#T{MvXz(C2mh)=<jl`xX;7OKgUVjqo@-QA(c!iXnFf8R6&2wEc$A zCzh;sr;?9MBI(=MLS^WxD@6&D+U~!9IZ}IFBeHpB>Skdh_H!~E&&R3&Y%Z^`v03HX zD=j?;J-O}YJ{0cOPpD2-)`)0r>!)q!*Q*TG%l^rXmn%yS-Pj;fej><XV*%Pam%76x zt?6OZfr$z*h|L>+>AUOGZtED?srC^*CMN%$mx`YLg4i#=r(dpmgE7V`50!{D!**qr z7N>ur(Glm8p`(ghD(*l22!pe*u$b+N&_aU6?MqhFGtfM2v~2ZDiVqj(^H`eptUvWT zilyxp;j#ZO0RKP$zY`I4^UJ-s2~r{hvON*UmiA_df`CUKeH4cd9b!g8s;)dxk{aTL z#8W|TPQ+kXmMi=q@&*mBV_OO+qkg~Y!yrCymjGypDa#9HDZu2~v^fpML-V23M>J%= zMuO)XH?F~ko^}XCKrWZX;TNAN`J6T-6>MF%4i7%IAIX@)v|;HoST1^)mPMYtaFN{h zt?%M@9)F_jwjbQJ1NUy+0E<#QaQHah^x_dbG&X^YcIy7WO-|!Cj-N(POu_%RZVfbD z4+#+fz@?K%10@Qjy(-l-ab_lsXU<&$K=96e+i?5#4cN7+3w3b?G28l`7#zUGV=n`Q z;QZ7q2LRMZO*xBcSv;T=W>6)=?r#`5vz@mB)M~n@L9i1*HgDd{=&XhY{N@AqV@Gdi zbu_GQ+Tdm`?K5tBs}`l<n59)4SXzdT1BVWQQi^+TxW@ZHsZ#kR<$0g?z3D~(z)8EG zqgz86DB$;M!U@tvjU`eM!m?-sMdKy$F=Rnh_FzRpz{ZUm(b(9COePbd59{~rNV$$L zAtS)+wc|8h9-NzJ{VN5+9cB<H3ChMMN%crcg4CkDgZh~K`fb%!g1iY>FHE4oCrS{! z?_LbJBx1r3n9jdfv^L=#SMPyh*W+FoI)f9(4n^L-uYUjE@WRQHxG*t|ho5=L{f*_A z<r0mYrV&vP=wK#|zrE>3^f!lVc@$B^S8jhZ1VZr5lcxXxzklW&nq&!EQc1ippMwbC zzxS`jg`$e0Y2xm??+$q_LoXgeHSq#N(=l7r&=im1vffTNW*Fs+=ABXudv>KHG4eNj z9%4y=G9qbO%P?%s(ukQ&NJxxeFg=g!uDBde{_-FW95{frYuCCobXBrfrsq+HJj<x& zC#2-_SMoYc=8I@c#>1Xv4J)H4DY$rP7=j?6yRF6hAW>xoZ$k?(I><U)$P#Y9avy&5 z%yXF63^c@Kn3@5Ri!TeZ=sVdx-R&4kXVKT(08>>V)+I_%UJ-AUyG|r*i#OG!kk9AQ z-`~$@FJDZSlyvZ_11iB)u64o&^P1+n*M6X^LgTe+B04(Dlh}z~0wIuIE47w2^cpSq zIEC5?Qeq1^2yPG5;Lmv-e1iQ&%R8?GtdW2-G~K{w{^6hSvHMkA{f4W3+t<}MWBZyF zXs$~j!L3)zp5+pInLj*xj@<d(f5VI8Oj7A{hn~m4oY%EIDa-ik9k=1SmA&qLp4AQP zpUZ$!iZ5NZ9@jKA;(W1)rc??m_>u_#*_kQKPft{PK<G#&(4LC>fYRT{Hr%azG#vp( zzIHl@1|SC%19Ekhws($$kFU*ZI!3a2Y_;p;3I(qWK+Wg8EZ4GLrBVL3%Xv!`m`BHE z7@5zZE0yr?hSDmiOV4wYWd-NYpGRFV8AquyDMXT)u(~~d{Y^K50(i-xVhhFay>w`G zN>LY+ad2e9zD_LBC+r3Um4_-Xm=RbBP1i9oG2!<86y3#W;aR8N?-2yK;B--Qg)*uF zN{Z5+ZaHtVgh$FJ9&KoCdhINBWRW*3@{-%&C<yGj`QnsblXl|k092)Q8(bPGMO#B1 zKK8jUVr0U<p6=ef1p}j#c*iw+@TT3Hm%;Lt9LFao$*wPdm8|%?|Ao&y{R<o#9rt}6 z6Gi;s-n(({#`U=CDi+6VmSsG<Zx?QAVGq=aTpoLO><I1q{0j%GH`^@BrP{o=X-OK? z^)fY`DbfTMcfYqtO45y{rbi-B<)k3506DAa&`k^Ld%Gcs0;Z=uO<s)yPEV?gM$((^ zb^)(-;nG}wk2ofYn9LV_mxWeD5&xwTMG13rb1o(B4!MR5%6hL$$-OsTgStc<2Zkp+ zPd`9IJ9EOcDE7VaO3dVo$f)dkS?>9i(EqI-y&{-Wg1p`8j(OE`^^0z$%PI=)vBqrU z&~%su-}h@+<ja5pu^VMq@^+oCuV|=yZ7p<544AwoFA)R?Tn0ZO72N(BpXInL;np1+ zv7x&aANe1D;rmS0G!!)5R&es3=4G&a1xI&R7xKD+2Y&bn_I&jrJjo>i)hRMQxN9eV z^vhpjZ({>~uwx54IG6t?vuSMGw=cBMiF2nz>saV-$|cLxxZv;$OmN*}-kG=3M|yUY z24at%Wmqn5$oH?L6gV}_iidaf_aT)?_!d~LkdHjCAaGLM`#sC7LT;~|;Stb}r54-w zY*9shu!fFSxiZ+XR8dy&)KgF4hCSQ;+a+sQTpK*FRAdQnx$<&M<qJ^l*lIA-)yW<e z1p+;mKz%ZSOPP6ALZTat9axm!XLQW6xxU^f+eielHqNu0w3;BepF0`KrbXGgR(lQs z&Dm1NRnnUb0Ew$vONejrUk1!Fx0eG<5|X~-!E<rmB_RZN?%RrqsR?}J(MR0(fA4QT zhmXAT9grkWM|c@5U)gbP_!7Rha~nRoejT7|xcyt-!Ka?wkAh)fFrC4#e&>7Gno8my zHuhsJC&e|W>Bt)fe*InV3g8gM;7iX{H|cnAsG$#>^E+Y{@@-MnrWr}Wk`N$<_7woq ziCh7SBw<BI8>nSL;EqR+0?R1i<bSW4y37)WM-*r}*Vm#H>7wRmD=n+)2iMXJNV0;L zj~qc~3m2~xgvx>hK2tgAqit`$>T&?UvzHjFVHJyh`cxDEN@185wA?&yf8$;poAe|E z&3s|;4?qMs^fov6ReTmI6Bq&FJUFjtV6=46G+BaAjX+rn2r7D$#Q!~(OvS#FkYA%I zA}%dTmgGLVpAljUt8=Naq{2O`g^DezKqiN4H?76zzxFlcbMyGpH@}5Kv51ep>s?s6 zvfp=n%V7Bmj<+;5;`+KIKHA=bZ*1tp{=GZ#wqzV<hKF(GSN;WSV+y{$^)mEu4|C2m z@lP{z5Cj3ccJ1=*FE=}le0r|Bju;VONvrtcOuhgLCZZlR<wD>X0lL&QeTkHzW1^)g zSbm(H&7dKb#JUyTXl-mnI_=3+>BT~2z_$h7dBJy3x@7m3S{4e18Ia)O&!xJjn3@LU zL;||5qo<t%OG&9wO$R_@tNYJ)+;Tm-TAT6o&?vj}7G>o;Zbu9O6s(=q;p4}#W8-?f zG(O`qda9~Vt<keIO#|6%w(7OC7H@$_q6=1<ee5}lMv5?00?H__vaC1h!wS39K_Fi2 z4PJ)sYj!Ng%XFC*gSD8mlL81KAcA9XMBOa1U@Ddf1ZGji=C)?UB>|uQ+t1?hUp$4+ ze)zYc7IRp=dV`OOT?WfnaNNgr5~&kKbV?GsbroNI_5cKn;+xwxqb~3ue`h9*Zwy_; zy1u@M`pW04o)EkjM|>Vr`5nyWSiGtjq)Z6`H7y?yMrOQfMg(2LeQp|+!5u(a)v#d| zOM+@|Zp7iko??;doLh8{o=8s>08HH|8Q-k^;im3_ED3_QP7nY!fDF|Q%oU2Dl%kba zgGwx*h@AsVMV9csU%3tQnvT;`OpM>)6MeXNVmepAyKcJ)Cbe9xTYxo&UL;zE-ZC`Z zr$)sKx<^VfM!Nb@ZY4lOFV3E_LmEZhC@(Nj>N75h#PJLxzvuHL?LH{P`HsNt1K85h z`r2RgY5~lM&CG%deKrGaHtmXg_>B%yVL#PB+k&DnuQgx5t~EV){NRhYci%=N^jSRl zv+rYQ@DxNrbg9^7uzZEar*>|qI~$_aSKi#(gvWPnLxbc8!zo?IUkzPAESbdJ_uLcu z-qeM`>K9=iEC{Lwh)$cn${9we)GizcrC~sg04aW*;p2#<!2Q@1qXTc;%MzS+ZS2SR z_;^|R*XQk08hIS9r^LrM7YLq|QjFQUw~-!nC7RBDS*C^Y(<g1Oi~C+|0bMHMN#FNA zdH>rW2n5HcX4!gTny~C79>P(ibJ-kLw6|iziXJzE7GO1+OD5*v;JGZ~%$YM`!>3BN zjs{mqzC==VJU`Zh69Cdh)df5LRSrNMwV2ShKFTDVO6?}oaSsiPxv>Kkh1W@?<sv*x zF_B;%UqOYQ$@&w1M4<#;F8sQRi8v^w*wf7nnTwONuq+F@rsDj$6RcUeJ@J;o@)Z~> zn;Pl;d-tGa>o&yO+d%?Zj$2YGG)KfQK0h{z6)Sp?PNz{{9|qd7Gbd}J3Cmgdk%-34 z#NHqc8&TL#4b!)PxH`0Dc5jtR^5ML(Ia{QmKFPeRx_Hbdk!Dq~fHN94;CPxPs8|O) zx&KwOf;$3T6OK2=b#t%AgJI(36i3D;0RY$Y2|m&S6<?a#JT@bdz^`6&1rCl(x;KEu zA_*XP<^GfNj26B7#;ftd*tG8)&Bc0`5j3pI^@BBny<ur3JA;c|MdWul9$-R}AP@pQ zU^IGFI~;iO|Fe@y+&CE_sHA=8g&e$OHdjPl@XNTp|8KuWU(IXRiVa&JR6|?W2$)sZ ztBL}oMz;1D**q++*D4W2JLB2&;6pz^Yw<3r*S1a7aqVS&_`&nX?T`(>75m>ZSiS<| z&#%4;o7-9utFK2>|9Z6V+Ktxj+aZ)`=`~nT@wH1Mc>hN}0!k^~{qA=MC`26-=g(9L zl)*9qp)>^>2rdrI%z=PqdHR9Th)~=yOL~VT>ERNZjC{{JhXQW4Q|%Km1({5yHqS5M z-4S9RZ#l!kS4v1rzbr@U&hTGW5_)ROf`Dabs21((*51^(I2zUgOYR&$e&4+?EDOgb zXY6}q!ZHjN$Fpz!oDKFLxcd&w6;-!~D8P~+C|x@5l2V|)&dc&u^V#TY6=GS-fFyT) zd5u^}5HRb@0`}LpIxix!x;`R_T=pfY2nJqR7K!w9UC)vmujVGu8!o>VxBk}0(YbcR z5_*_5%?{VQbds{Pxs12YIO<aZS%L&y+hdhQwk}hOYu5B&U~CElW7D3&%O%AvgXI#B zjjb*8zAc-4l#VFNQ0nT@x@|j>-O<fQ|9p59m+#yOSy3R%GJ1P^eV?Z%#;T^od>$aJ z?Jn2F6i~1_#~|$pFtGsVvtZ1!s^hc5Vgh_D6!6MM-g@;F?BTI3T|RDE@n`r%BO&6t zEM@_)&)aDMrMV!?)w3E_1&KIzi~wL*6peK$FJ?&y5L+Nv%8E}b_Nwh$(ACm}7dem7 z$`>I>qI+O5Ny6z1!&uqbj-Hk#49uo|_njpME#i7{hK4{0o;&1abQjX;2r+Z`I*nAK zO?^1X)d!0L@jO0mAFf9!2oOY(Ex?lKW?p(;XN2+}=Z!{pCm}x3?;u!)ME74MLy{Hj zx$SON_gYQzT(xoeT9edlWRe@1z&<rC=$V{vJryJ|5JRR5_zgc53jl(u;p&ZR@a)O+ zpqzq`vyLu<<r0rC-g1*GwH2C>u^6=ZumJd=s^JGCqvXlwo+Iyn|NBW-S6678;S)!y zp9+TMOL!qfC~xWq)c*m5^-k?^Y;qQZj_1L7SyA3xNg&g-vL5L~z5qp*(ACOn2V3me zuM@Yd`1}z9Lc_J5)UwKIfJZLA!FU&#RxJUb^9AoA&o&}<>->)}K?iEFHbsMT^Qhxn zIEi9N?7XJY?C+KO7aw{bj!ev8-Y&E@>{z6e>8FSSF4&4wzkS#3cyeeASxt8@i&-cx z$h-8saSt#BP)totx$`G8H3`eIU|AHF6<DB9s|P{shSF?~Xod-i5Dx&IxR>okGNAMT z()XLba)`=QtbZ;MAFb%4IU7>1%5`h)&dZT%YQcv;{2@$_T&TdMTQGAqlomOLLk-?1 zkwl1gDU_MZ`x*kc^_L)sB~y?i+n-erpkjh0`cP2pUD<^f&JUxgg_*Qvuw26N&dr<X zEo)Yn{Jc0f2O}E>%g;|t`~JTD_S-|-%#97#ut-^v)_p~O41j8TU-Km->rPJ3xmlo$ zR^_&<f`*Os@Hh`uGfk+5iTZ?>sM6iaN-9pAI8hq>1NABn5V^?e{MWFeJ(vhkBqcKM zoa?I@76Z))Bf+7<2?vt=dTY4}R0J7KM@u6YqgE1&n}~HyzM9K--f}$>ih{#qQ%ohv zqR_J}c1bCPY8aTwuzC4=_rD!Q!@$cEGqCJ!Ez5$Q&BF>LMOBv=#dJI!x>_Ivb8~4I zOmlOytUa5}I9Qazw84{7%YENJeIuw;!az@uME5;O6p+&m_L(Sf@kk-E421apFF>o3 z@<x?w4h8ocu<Tx~Dn6U8x(NXA@WT%y!<A`8-cea{<Lyh!$@;eu8&dA|(`M6tquyo$ zZvXJ7aO?X&5w3@>k^T_uvYu6`ICRs*p@9p`kFY3b=q-;W84d9m{l_=oQg)l%a2W6& zPiOG;^Mk%w64ZkQfXTsuDhY;gCMd1eI;RxPw%D*)LYgk88IU-yhxaC<JWC_0yhPRg zi9y`#p3E0P0c>3D(a_iJ-Ua}!ijN?Qk)1Kz>_y8e>3&*<0TS`QiXEun<qlBOau;@5 zY8{{vaW-dR7X&7fU{ie=RfEFQbBRTIAA$fhdp%GUS;7bJdJBF!IO2kqQ7GE~rVt6i z*c6LtCgU;mb$8;Im&Re)=V)0JMqXv{PB(4~w}XcpVhjQbvCR$QC1fa~h`8+un1&9u znD>kjZl!atul@U$`?o(MHkh$W6xn?*B}?wnIba%UI9#?Ap#;?$37(}iOBa9{|Bpvg zXAjy|t^oklClkmOtE1h`Vh!~C0;GQhS%PFI8dAfAk;(cPFd_<Q=;*@A%{$P&e$%3^ zft%=KQrxhq4=<h{_B4f;6?~R<{OQ$Kp}tH4kCx3s%Y-eqKOYJMXlJLt{gk0;7&&>o z>SGCJoRS)*Xv%ISlq(^ZH(OL;@YJjGTP1|ezjt~t!t1h1(zh3Eiua~{o*+Yq-N9vG zfEf&;5{t}eEJuNQzfG%XIR#HI-1e+Y%YtQ^FborxX}SxzV_0aRWG9pDS0G&LA>uCB zR5#q%R?#qU>l^lPeEkx{wOTp=PD<`iKlongl;YHMn$eDMx}y*@#T1`V{iojhPE6#B zzC<4uyDWHYBjJsLK;EMb8vfWIiw`DZGV=Cssg8u9PrKNk;uz|;4axzj<pQefA&4T2 zY1uR#yN4Dc1CWtKc@(HsBZ^-JC|~6jBWri;gJ92<HQk*!JzTj_1CgcLs92!N_@#dv zDV1>JzIrzAd$t8ZKt4SOA_!QqaSNig5G#5YHZaTX@2sjz;_T=YCerghVUuOBTnY-K zt(AUY*N*aD<=AM5w)jRSi_>#+q!L(;51cAl%pdeBc?z($N$T+Oq-@8VqG|dB3#d)k zS|tE#cs_@zi1Guc-jAV;$<eS3IO74sqqVsiXV0Dm0LU>VQ2&NNM-YEC9-o}SB=DlY zNGV`h6sBpxFin_-0mCq1niee6@==8p6a~X@V_gNqbit5$j%ElTdC4yR9#IM?eCsl0 z36x$$i2<hLti}}F_QriUl`Xj7E!h8UOT{sh_Ogv1xb0?0f`9`f6A%RAzAQ}xsO4ph zI_K*An+PsAIxj&KAPDS51OW+If@CLb&5aF1v}1?tCHU(UgUkpCvTZiyPKf=ow-qJ# zc_09ax?WzCV3EwBufDRvj>r-q=g3TYN!PFbJy*I0QN2Wwt^x!FNrI(m;RXduM9A`M zmzYYr4~oGh`+yKPJhf`;E_ltnc=~}>1WNaji8JqVb6XQy>JoT)Xw);(tYxrVlJVC! zT<3N<h@>lY4aKP`-+OsMz?VnHBjyI7mtTIl@4agEVBHBo7d|^3uTd?LtfPpcpN6%Q zd`e}S<}?GNxv-Wi|B&&Pe^!rv_%?6cfM5LL7wi}ksS1`p<>)!T`$!GHq6?$>EEvZB z&)$2-$yJu^<JWWA^x2*5HQ7xzy^x+j5+IZS2_dvlBvKRv5q<H8;tMK@ioPnoD5COO zKv5B;sZ^071PBQw2}wxXWV5}O=`*K2zduf&wzDCA|1l4r`H-ER**SC0bMEWDulv5Q zTZSylP-Gd3te8b7)IQ$H2%~iRFD}X8^d4GCOURkjs-bOZ2T0SXs;Vi8XE+kPU7*5! zoQgooYaE3_zrXu-e9+P303<>Ps(oHWZG~q7&tda9Yp{E86bV%Y%W>L+<v`OSSf0}! z90!JD!SJkBSi>1rr7ReZF(W+9fzSZg%kvN=39(oV14mm;kTfDsmeU>#X9Lj8zDLso zvK&FG^RrZ?pbUXZDLfpfN&02!yB4zIBs-`a&*~fJGSABiv2MtZt4lBvjpK07z;Ux( zr8V^kR%p(7GBO4+5<z$W@c0<Uv05K)a)Oo8#}HkzKDYUll5j?sV*@<^fKXkd$tGlj zVR1=J#?9;3h+sxlIa*DDjuVmPaaoINYv}r^QwqK&(bsQEHyIn|H?br>92m&jIbN?9 znbok}`}Y<fRptP>g4M8@G_0VRmV88JN|wQARBBR5&YA3wiV_q`k<6jmqv}I>i7_YB za16ql(Ox>++3VHPG6k}%>5961{+tY%2}V?t%X4C=PJilCQB*y8Gyu|w9F3?E8NHK) zFlGeAa*PHZMxh9R_HfJz(7Nnhu2ut8lFiq2M>S8`Zxl3<;}lr}S{sQicj@<duy*M} zZ0+oG;5Y@atF6=V)*s(?GZa<D2fagj1gSk#QP%W-Sw?HQU|FqMT%SQmbl|f<(pgwj z?bp7i$Kydd7BfMT$tb{KY}75Qe~xkftpXjAF)&8E3kc6?TDbbYN~A@oifR>W6yZPS zWnqD=`k(PIm4aA}?d0R3WjrOKwyfm1*{?~n7nt;8&!LYnJQl@)?*4Jxz=+O-9IN2| zM8<9thB0%Bl)^#(CZiFZjB%s9ev<ROWV|RM11tr>JQwvo4|ccrXmW}AJ5PY+$6>k{ zhW_%L!bLrlQY8BOoRMNOg`e);lY8?{n&kLdOeWCRx*v3$|4au+&dxQG3A(eifCuQ} zIE-Wo7AQGqTSn3%f<7M-nb9KAb4fagX3nApfGPF0j@M6V)*O<92M@yS4_G-%dy$SF z!F7kDc%!4&)}yC|da9~IQB;V@6ck0VRDK*b&}#1>3<H*B!SWn9fdeP--~=8l%Yo6A zM2yHXF3MRsG1ab1YNv_qMN#?}p53fpcZNNN-n0U%vd)pay#LF$;QfJ7lNx0i20@Pt zk&Ng+==0*7<%{t0;Vy_7IX^j;Fe7M^qrE1(@XC6mbm}^pOhQ#<M?RCaMUw`7>i|!N zm>_CCXV-1jtCv`p0167fZqTF2l*SY&c1m5%RFiNxM;Vxy)5;SdXZ|zGM(Yk7D8PNp z&~p2MHq;%*A<|P8EI0rC&_fU7XgCg++XFQv7KSqYx=>lsoaN&lT{_PsYpae|;?^LA zczD$Oo0XHNIQnUe;$E|&O93FjqWUTjLh$aP4qJ-q#5(46$BJcGTvJ`}HK~!|tiHkr zd-@Pfi#adnMHgM<___b^!J_*YwaAiwjLoUNmSY$UB~y8~Zz>}{siej1DJO(rFp<XW zlNO*Y9L-r+q3XFLEAS)ejU~V`44P_f=auEq*q~Jizx?vcaQXZNa+U=9`$ypAIel7| zo`W=UkE*JHn4`Va$~7{a4vsD!f?ELZc7byV;CNoA1{s4cM|U)48tPn!1HFJID>o`D z=1+#gj3Mm@!F_x;DaQj9mgCV>Ta7u*jo8^YY#O{0w+lmK*$PS5Z#)kvS;lKex*WM* zDl57S8ObnCIa)e0zI&-2A?(?+M>{<kk*5`DvgY}A0;km`VqP=G)*501X``j5)Fptb zs$SV^fTp6+?K<V2+1}~Ue9aeF+FO;7f8rFeQF)5`@zn12b@ajO5{}E(@B~UwR@bQ6 znZ7>!_VK6j^u2eZe`GYvX62<~0Vt`DE4V-YFBz9$_N-Dx(R+U>Mti%>8`)P@p$7)z zl(iR(E_po=B3Ln{9ub=zJOP%+xJuk^`q_mG#(iC)&zYBOO(gMHZ-3s`3mJtiM|ZwA zu>+%OPA_mG%f;o-zsf2_hds%zZ(dbVvcPaalyUC)=c9Ebw^W^)7R`!GyBM{is?K?u zybGHyx)1>H&O7fwa7e*9d+h+=;J^r6EDJ?ZAS;SS!I`;7XoHRQ5lRfpXn8W82d{%8 z?{<L`1TZ{j8f!c4$k+;Gj0qZ|s%i--#vWNpwxS>Fq2*2WC`~t>l_8y4JBGHA!J#1> zX*-Ic;XJ}64u1duAOJ~3K~%Y>@*2Qpf$&{7UWZ-7R*}f`ic$<mv&Uv_SiJ(Xni|nM z5<x_i9N?(L5?TQbaq6k&6)e{ul71~>v6!_l3l*7~f&#=U6mk>|*{g01@FZXegAv`( znSHR->Y3B3oT*vmYyha)*O>z}9d>;@2h`L-q*i1JE$4r%Yb>5Tz7*`7g{BVdH^1=> zeCqtQSTcVeSeC``XryRhIVSyJGSN~esukeq*H4Zm098e7WDts8{8%}u+1dwr6%aBi zm@}Sc+?M^V^0@K(-ov_CRZoEBv94?9&Ov>kaD%awN@cZ++}_%Tw4&tQCmtK!pehR5 zKG;41?lg~3dBIA(><E<SSaghKizmob1<Mfh#}Zk8J6F5Lm<rr<(@kJl7CZE0xjl-c zit3~!p|xR5u68QW!0mz8>w(AP!GQw@z`NWwfV5PHR8@r{D~O3A%3K0em0AYNh#>VG zDZ_E#cn-Xa2k#QVyLi2b#i03g@MUZjp1M({CPou1T(}Sn!yu9t&9O|T!ib_~MNXPd zFSV*>^<$rE(9Ue(0l~3&9J}{^gkL@UJAC7w@8LV&zZYA#y^E32(E|Ab7N~79KkMZA zvr%0ZLXYnBa0~-E$MtjZJf8j0w{UbMj8_kLI%sc7sYZttYL_5J#j5q-b>o~!B(x}< zjAPJ{kJi<$g#$c^b=?@2K}|q&s(Qmw>s)8bq?x^(Iz6jXwNx*{a!N1Qj>it2)CP|E z#>VN#?)n(oum?K(&|Gu;#(Zh*7C<x_#nVqeg<Cdl1Y90?-EQ<`hyWCdERTtbEy|$T zDqAT9aSP@tRrEZxswmogTL7Wj2J7A{C|PI|<tI7lWnBt#VO<qssWf&T?t+{a!JUA; ziLY4|<#gwDSC9L;<Uqe;!yQN@v2`q55Vb;~kooV??hcIhcG+?tMQpJgrQB3+V<>jj zl?2c>lx=(?qLy!x3pD+k)GWt>cYEOT`Ec6m)#y057mI2uvc80>d;gSDq!q2{eR6FE zwXIL!m^O6^_8&Y1mgh`>q?GE#8!A+)0;(2Cl$cbNZeVq))rbmN0<eN$IhYwrKct}G zx?af|Pr~c<B2-$6z5T=3G;eygLK~$v$um9Lv|WpYBxMwRI6rsqzWsQA$4(3m4dHLk zJ`bPIi&ZC|jJ0R3!9^FG54YP5zpsdB)L#OWRRhCX{`|qO-iDjL^#jzE_y7v{-2&d* zcMwZvISZ?%)YszVxwG)jz5}>uZj198Cz9a2?yRXg1)~weA>(;4l*h!I5OWM=wncBm zXnkTCQ;n+B?E=d(R-dM72_IxmsWAHL6#HCCgW4lBqgIyYXzeSM1|j%3>csmy`*6za zsmI5N5rX>Za{&MkJ@gP(pEOsKmyCt6aApezA_=IHY(|f{!P2_!N-7PGpE#U2#l`Xs zAJB&{^Ss8)=u<(`u>{(}Q6!>axcxzRgQeEJYl@wa+-XXqLYZa{K41g^ij;(pW8vXB z9PS&$%<A$Jk>$kq7@@Z>Us|wL#5nbdeka}fsgDkh`}b>Wt^Cr#ty?B0DV1j+b5S`@ zo5AiJ4I`PuQ&a%Bc@C1SWHsSuML>#*hDI$Pa_;)|*f}s__E0*&Qj$$2nL)kEEtEM2 zR0o%J=bQ~u6!F3fFM@Zu&AgMM$a=wsc3X|6(ilmlb()ocWm#}M3(jbHU>QJFElp6v z6SYN;g>5x8?V>D6C@%{kA?osV$Sm?v^wC1vLyIb{NRwk3aCX|85bWKzAHVtC@3G+I z)i`zSI&67+E832><GXj?g~xvP5Waf*ZCJW^5h}{divvoNS86b6-l>!7v3S8ew2edn z0t8$F-rJ{7wPBol`<pjxhNP%?Vs~pcdlHUK_#R>yg8u&gJer=zn)D(Lwt-<7xOL+_ zno65AF{2l4F|74}GuN2`gho%TQ4mB`OI3*Gpj>Ibd)1z&{}?&TzR?J#)>R&tGgjTy z0+*i7`04%k<11HPY|vR)HE))tq?JdQB$I~KoZcc@NHU^tYhq7Ernf-hsv%1U03<Eq z53jw8UGKf8`_wMD1108lAo(N<?L}M}Dil<upoBn@B*>DC<qg$1&^rW5)f18BMAxR7 zGw_Mo<4Y^0Mn)W)?Jxa<IFd+=>qakKy43u4_x|14o2^javyyv<X$|njUuqY}Aqo-U zw5UaB`i@E~DuTfh495~^k0vm!G?4dD+DD_9x#na58WsEHFMk<tb@pRTQ=Mb8s`fmQ zzR4HQoR&=^0;tm+i9LJwqOP<YiD)#ZfpW1dYJ)z_7#i&hnMO;L0slC_=uA@CoKm6( zG8AHX1XHWaaj^BUEeB^S`k|^el-Neu5u5zYKrDfP*Na#(iHDwf3HLwwEF$qFHeIw4 zx7>IG&OQ4qG}PBkXpipva5wfJJcL9d0ZJ*_J3A4J#W82rOhA&rhX+yOabf<nsrd1> z_c5is1dFFOW7No7`b&V=nAz^McKKq=X`X~_?VVWJREt`3)~QzUt0YsFTv%3coNJm0 z0nhW`j#rCJu8T$(Ggn!ni&&TxI@KdYYHPXD^O)2|ol^TZ(Dx_N#Se%re@lwEHJvfi zv8|*ie(cs0W7SNV0T6=i+qVOX>|hjp9uG<?D#xGFW1Le;p~{l2pv^pKw!od{JR2ym zRdPMaxCFCxgi11&woJk+ue^*k8!iGN1m$%N=o%Xt|11+Ds?=*4RBF<?D)d3@l)}ex z=oyV5d4h(W*zyWIeedec<3^Pl1?y}a{-2|r_^%?OR>SzKih_Z*!xK8bylNWixF4L8 zD(j0SQDXDtL`u;zxdClGz35G(vcS?VL_HKw;H(*%Q{nY`v2nu&{PV>Zu&llceu1}? zaP%rg0A{Iw7J%tA?Df}NjW2xZE7-YnCuS|4g~86Fj)?|@5QI}A6iN}76;yMqa|#5p z@)XpjzLVR!kvyk~Xk~GPfvi#_q7kfGu>>!?wH@KKgi?<a092zeCg;shpi&?Z@MHc} zpT)eXP59h3S7FmtpDY?6|Nh(yh(x1!<E^*x@@xNsEX#;QqKL)gP!z>#5n)+Kk_4B_ zg;Xj9f#>0Ixe!YvaJah<GJxJ>8r5Z`sBLP-f;qEM%UB!de{a1J8*cjs{&}baS1+3F zI0iWy2jh0-Xi*|L|LGP4^!D~*(d62HCj(?|YZu4b_K8K=Qev@j8pB|ll%i4)GlHbH z)ENaa-V0<oVdE|S7z=#%w)bFWL(OqJKaI1s;>3p^ei+xRKP&6^Z-2NK=Qb6NVyU9o z=00i#dyGEf&jFB`VK^BV6Z8Jcm~%-%0hPipaA<2gYW_Y@R+Y0ODAymQs%qw{4GB(F zQO#>kDaE|1GQ7~*ft~HWC%|$d>zgZ2!R(6h6YPpCBRx7|{`_!HA9~a2aqlRXjh5=# zz0*uw=l0lPQVo_ML2gfw7NT-Vwovqxst^XEag3&&<>SN2G#1Ti!7J~)hqw)xNe+PN z2**&{X!VT#`2PDbdGchu*E@*SjWwnhPi-Ej@h`LI(6lhx4dU^*QC(Gq*I$1f*Ppf0 zG*o7_B+H_Aa0HT~A|Wd_&p$_#GNn*O$)b{S0HiewQ9sjWbrJ)H)h3RF{63WH6GL|Q z4r29`h76in%J62L(Q0obhESP+N51i8ESo(8LeuoD5nJ}P<?XF__x%s>*b`5oufHGt z1A~xdorczzy`q}h+9fCeF`d@(!=k8xD90h8s0apw*wxyG&-~9%z;ir;!5}JwK3u=y z9Bf#<0&ABq#)^5f@Yb%qXd4Zq*;bWFRSG#8*Jcoo7g|A+_Vf9C;Dlpqfhew4&C&~w zr6p9`&bgj)wl29X^~e~}Cu2pLTE(_iXhH!SkZJ{EglMvRWSlQAE5|lSyL)I1Uia~7 z8DUt?6i$EavB$9eS3h$6zNxkvBk?4XsWb|HVuoE&(;|pV$ODwNJ3a4Yhw%}U5CX6a zpr?r{y>2}J{tn9#^9M3MJLBG0DOA<gHbkj|MmNP6SQb=~;O9AT41>OK>;zaAy8<p3 z9sRG*74_Ogf1kOLh9wC<>FmLs<Gjb`cGJ2#E1Kv#u&<!OAvRSI(42eMqEU;nI`(0^ z`VaApF<miHLUUt1ylyu-Mx!8RWRMNG!^t$7o14w2CQX`z%P+nN&p!Js7F3nNYs=FS zXe}2JQERnmuFLSCdCQ47<FwUy?1`rkmlUfxon>@gQlM>c6ohEUnrjS`{diST0^@QP znGo9?Lt>v4Vgpp7S9uzSborc_+I2V1SH@==g%X57%az(B@K}by?50MnI%!T`BxvvG z#8ZEN20!`vgBThfM%*SKz%WdfGbGx2<cwo9B5%b8s!3aaTxxL8G)8Gr#OT-<hK7gn zrJw!^-+A~?s3;AhrLh4jrFi*J2R^fWp5t_?$rMzNJF6gs<Z<2zAw|)!6K5TXfqJIt zjU>~sS6*ce4yJG*rs;$+)DmJh$CEh~r!*i1C?%GvGI5IL*{N3*hC#NqHx%(DqsbIP zf#V~CSlcoa953KcfBF-qH#cEgqjSp9@;Ng=DMd6TA}GoFK<yl7+8!lS3MDOq9S112 zh@RRySZU7SGj}Mc{hxKaAnUabEhPaA3|qyBr8RXq-)B;+wm}G#8mdnAqtpw#SQen# z{d`h&84e8$p8(5Z*X_%fIy6!9Emc(!@9r^w{zX?W`iqDvFP$|5dx*99((!0cAhU>} z9ECg?0_yGI80J@%6$O;`o7))E70!q(2NNlTN`k1XEW^Q$Zb*ayZ#UGoKRFzUVR}Oi zkca?oFTim4`nSG~zdZd{e9$|DRgKj!S~(1578lQhWe65dsb-IObqEybT6e-hjG z9YhV!nILI=pOh{*kXDp&<yX{{2n2k#en8>?GE#t&HO`@n<FIIkRwddWOJpg)Xq2x6 z;ufqZ#I}zlMMco(&3Rq6yuB4a{PF$Ry6xSZJ(PqHGomDfpxWa>i04u1b|JuVC=mp- zINF;m<1~;;;iGT_3<#2njQx=)!lGybucSxBgb)meBN&awaIm8rlu{fR9L3)L5zMJ} zvMh2W3Rgv$b0i6}s|^)JK{Of#CkPV+LsI<9Y<`kQ;55lT!1)Ve&qG^nBvxcZEKsn~ zv(zSuNUfSnJz}NVOor_i@$#J6^J_&u)X84t0MOR%eq4L@DaXZ@RZZ6JuP2{)0_QKY z^@=lE;afvhB?OMc;lWYV)>nhgSLLb~#ZjHQ)Y?aA{&<mQ;2xp*Uqtf<n8Zl0P=Kfk zJOXd#OUr5-ZMdq@s*0jOm36As(6Y8)PyJ`c)^@^hEEN3@1q2QQ(fA3lEM~2!ucNPA zv8lMIvaipSoQo?8e%ITNpN;dLTN>+W4aY%lu?ky6-RmbLw}+a`3$rKW(~5$a5$R-x zoa44fXwM%UcJ_#lq-6|^MR4gEtMT36K8D>xV^~yPVoU048*m_z)Fw+9Ly{w7fG2>G zk`i3D=~6uZx4)sW#E&VVpw(Cog5hK;o2JU>jXPzzCNi&b0vKDLqWPT|2BCmIV<0oh z#v(#MRb5GkWt>gYqzL1z>kssfjDllX@EnW%{lm6%Y6D!!YTe1KRu&b-9ByqK*N$Bu z;<h`!hVAda?}#D;fdJC!v>7?pc|4dJ@T1)2!o1QFxL6iE!+<LSfl37d(}O|VwH5Kt z{(gwE3_r)CEgnaAJZ^%go#s_3#h-TW#}`&DM3vub%VDXI;|X&Hp|g+1ehnB%k_3(y za7^>73Mru*eh<T%1I&XSw^iho_5O_E;AXX^9s%3KO-ewBZ2&f<Ae1;Fdzw+ql6ff@ zn-(&)IWHza8;+ZeE2gT7!O<uxc&_LcvO=qVhSoCj>T9pzt3UaU^$U+5h({ps9IDGo z5l*JZohm|j4pd3oQX4WDfg2}Gq<Npt{{%4|6fJLQ@#j8)!}BjZk9F(T!(UcmX+0~7 z?%WtXvl<OcsqH!aT4?&ijFl;2h}ma5EmVS6kDka`j=NZfq5t~CW$^Li&lpq{1+nff z^XG3IX-7<!3vTU`N`mxvv!>&h-91|0pFxpD#xex-X+B5Y7Fk*bEt;0hf|*>C+Y42J z2K3xW%$9E>1n3(b!`vy8v1HaXeD}AHVIY|TNU6hk0Kk!v2+B&eoYq)4j1PA1LL!+$ zdq*cYLQqy-jz>N`2*1EXRw+u{0-8fXa9$ru{Jw%b+=BV@P!<ZIwY>ukB}`UIBCZm& zG*3n{I)<$B@C<sD=-x2Hb43HBJ>+Bw177bnTQO%Aw(QyiQK4}0Y*sGEMm;!wCn*Y& zY0cQ|Z|}sd|NULO^TAGpBN6i^uCA_z&*wv1TN`9q#)41?8yf53VOh98h9Zo8mAM3* zQeKYkL;@=+E3{E;ih_Ui^x{Y?j-gb_vE|~Tgg@^(h~<qnST@O`&E<F!tk(^~a>$&F zZCnRgmbHATAUMZx(BeQcYj$Sl-qxKaV?PQUGk(>xEm}AK4z;RdDYfS~iTOKo+KG+I zrOr6Waf|}X=AVY4<7g&DsixA1q|#8*5*Q!N0!)&}X~_Bg7zPy$P1w0}Clc|v#o{mw z;0pqAU6`EbvA1s!=cWtG-Z28FOCRdrND={_(<~Ov21lzPh&rmq3#3A`&J|%<Q(S}s zm{C=R{rmP|-MaM<JYFrDlw{lWp;?inY2S@jG7z)iN1J)em>*jo@PZ}e1Xzx@PHk+! z>V}4*UK{W2HQPnH(`h``KZrk$^PVp@)}dP9F(xZ$ZnAQGk->p%pd81b*rS%Qv<N9< z(uu<$6j&aec9B)pQSHYPf><(zQ|4>ckgWqFz~ow}l43I&6fsG{s-=sx2&SY2r>$BE zRyXQ5T>DA9`@s&Jxo!ilm_Hq*ZUKje!#FY$!BAuXilX3==U>L@i{@ieO_gKB6aa7> zhm)5t!&86#8&2MQKHNs`lMsx>lSrh}xOl}9{NgWv#l|^PZPY3<a*sMCm`ZCSfG~b# zEV1Xj7y^Y-q;=1G{<LOn*|i5B^$%fTLv>b;j>@vu#GPRYTpWjh$Bk>gbuXTIa~nn@ zQ8O1gXZCCi4-X@eNI;fl)6gs^3n3&3$9=Ci`n+h+DPgw`#FsZsMnaacWnd78qcODF zMtQZ3gwZh;!9YBT)222es5@D5I0m621gJEph<|BNi;!84Gb8T&QGEegt^h?&7;D^| zaa$bf8N~jsJ{;*A!qnPIoWFGLxCv8|5pinKBsJR(h-!~Cowq5WR@J6)m<9Wj^*2#d zT0wiRYhV<W0k4*3G0-%V!KB%dSQZsdfU2ezaDof}_{Tr6cBLhv4&LRMc5~*^g?Qqh zuR)O{n_bD#>cOzK-cbrAC4q6P88(Y%1eF$GYVAA|43#Mbcou3>iy(PW4Cy&{hGkJw zRfpluqYfwDK5<4XY}1E?6Jq5vO<7F++H)+3qSY9LJgyU>1cjEH<LLKKKeedWDzc1t zPq+E=58Jz-sA|DoaMt8W^qewHv1e44!FjDAr{RG<6MTwp&9ZGu)gjt!Yn>><!!9?d zH42Ox(+3DaT$HeAMhiHW#oA?y&@~!CjKcKB6ho{UK(M65mU6VBA3+eXa>a6-w{|Vw z?;S#^+l8g|Rk(a!3r?=D!onFXczgFpxa5xS;F&kyG22G$YvcO!psFf5B1s2LD^nF^ z0UvmdLnI~Ul)iErW1_Wo(CmDdecq#~;^L64(=1k{9zh#@Y9o0D=NeNSvWjtJ1&_Y6 z1+VPbgK#VkhG9@$U5yJb*nmx!T#WbLc^fCqpNG-WQ7F2ho#gZV+xC2}-QndpoKshe z>!(eHkTJ_tR#d#x(T7(KwOiV^y3jQkCQBFB5C#wg0W8N`=aaRGp*zNV>4FX%>zJ2G z^if?I`elx9V(kB*Tfo0|AHq+cdmUT$x8umb2%dd+H=fzPyZG~B=+3hGF)_rUi_4h* zCyw!FP8=h}MYz-{%HB0Js?ptwk?YKUP}n0UYPLc+{;jB}YSgCpy!4NMVAUL(T9elg zc&%#Y=DKQ(#*?73s)?2>iYZS?&B-l_Ry9hk&r;H9Epk&eC&7^)q%<p)WbbP&cs`6a zGhM@%GK?t};bmFuc>e?Q<)NB7OTJJ)7D5PEo`uUTz~ym)<2ev$@}R0&O>Py!F$@9k z62P$xScagbtmFh(7NBG3mzOWavfAQ$o8rAaCcnQm9Kn+VLxpojZa01OtTpD(gDOS2 z-gHkXMLIUIY3P|oSWzh=I)!4fhomTL8S;6}2JWMgm?=z5DTQ07cF#R|2~<jPXe6xN z7sh5Iz~PYyYU-^DJ44Sj7LOwqkE5@D0Kfg^&(Ri5T6t9v_yiuOo-`K^e&q}J>1{XT zFE77=FW&bcQW+z`uKvUonjWiSi2x9W!GWG3)K^xZEEs^KD2S#d*os>-(9m))6m#|^ zvFW>#9J;PfE2yf}bObIx>on~;#uB-~GNZCsQdB&<rxgmNsHmw!JdwoQSu=3!%{Sra zKm92le&`{5{jR%E+t7%cZ@$?oxB*Zq@Ven<H9cFN2PX*H!{q|+a)Ecd^@sK|CkSA9 z9t_86hP_z5VA~QH1}%Yr8C@HOKb}rwOIsHn-*Et<tb%|*jV1s^&JtE9gg}%eNRp&Q zmO00IF&RLcaUE>HYU=pvy1UkpXuZe_z#B)p@xsmn_}~Az2m5!vht}OYF}<Y)FMhBO z|Jr@1u;-99ZbUyO1F%`^nCvq-ozrG4h>#35pbX%knZcnAE#oN>4W&UH5Hlv6nDWQY zs!j($*&fwXG=O|#%NA@t_YB*`b!#nJx--;NTLTK9eI#rSJaD923=q=m4NQ$)S++ph z)|O$<1!q1eMfRLNY7+`jHK11Q4gj?(y#qXlZd;(@3zeBsE61|nT|8WF0lXl9AsWca zk_=grwY(;^s&mcZ3M>mw;LV}slS}+3XxMy<XBd1%FD5A_s!a6unm_-pw;%F2QRUsM zPJy3N7?3yyz@<l)iY!9~!9=oAnLU<`K_7M+6VE3AlmLN?XTdQ9vSI;lSdWbM9BId@ zljdNNuCmiP8o}I9Q0uYM4c|~Ag_mD>4X?lT4m!HJG_ini1YWO42N@MUuMcri!f$pT z#>(0XG=&11^qWpEu9!O$vzi*Qt!oIK-CdYA)vAznxm-AD-dudt(S@b8vrJ<fONp3L zTaVfbtzf2YG>nt#Dv_r_)hZlFiy&T)E%GLXQ<u8jq`<LeC9B6JAn5br-S%Ewv3Pcl z$kGCQQBm;b;Vx7KyqY-`Q@H!q&tch;MOb|L+2Fl?2gSH?<Ao?IE5qpMC<KOqzq~xF z8GhX6c)LU!r5O|+H79Qv#)GPgtw4f0sM?RhVNgoZ($a#~)>hMTc&n`oDMi86OXq?D zkYmYQiAFFC165VQu$+yiCC4BWn~{H~mKG=>1Om%KQdH~-r|`t1zsH%UpJu-G`KKPo zf|FO{Z`(e^{N{R;1-uguzqP!XRrI47Xj{dsA;fM2u?n9D=~%*&R<uo3u|)W7y}bb9 zsWjXi>kt6Q6^ha#q%mt-X5q~@--N*PsI&KsyFA+Y<Xu2IiHlEP2||FQBM~&$R)Wc) zqig(3cw63*0&3c5$;!($JASs<Gm<3&k(KY%_pu$or<4Zp$1PT`r6&*sr|ZZPJ@ulh zDpXmqBHfJpK+}$fIX4xA032)D&8CvTiO4cvRQdVE3#|f~2}G6K!cn|1JX-Me*Up<u zZ(J}Rs;$zjS`f^>H$_ZOc&rvOsz_Oev2vEhNV*vj70bZw5>V#%!sQYW7bPf)iq_#V za14VLbG4qr(-zJ{X~2&?y@TL9ZVV<<*xEgSAHK5-F;T*{9lP-6)_2g+*@gCwPK<@a z=<VxAPj4R*$rJ{MwRwu2gTr{XwG$7#vm1Z@s12|0+>KY?+X(<D@%ym$v{eqEG}bj& zU5Nv2o!WWQJ$Z$yU>FALS1tp~Fc^v_vnwGS!-_S-MAMRU3J59ANUM}0Ws4ZsE?)#u zQ81Jvx}=nv0tG2aMorL%{r$rL0lxCd%W&Nlo3LW_>EJz{tPu$=w;P}R>}NqK#j@I3 zYqn$Nz~v(HZ_bfg`m_#~1t$m)JRZ3Hes}@_c!MSIm4@IiD}%qh9NyAWxO_g;=@qnu z5S)GXS@`z1zU453?{)Oz=?@QT=T(xd=+O50LBAj2a9A4;Wv5X;{*7xzehdRicOaj5 z?2ith1b`{cO}O{F-$o)W;<<PCU?MXQv+f-SMax(-I9Y4Tjq#_46G@FqlqATa1Su^- zOr;?v(?}<h5R)lLsWjx22wBu#(>XkbN}mUcEJKlG?f<f@(TB3u7NHt6sj6mBuojR9 z$|~UY`LSio7M!|laR%3}w;1W#!2+)_5N#u4P*Q0vlB5>B3e}1fGy5>9Ea#0N9dxQJ zLy;8yJ1N#ccH1#qj)%S7L)C%<T{xd-7>KrF#IpJZEhkB|LM&BLZT*#M7WGRA0kLTX zn@*Um7rfl-J^_}w)+zOMxNGIf#}rlG*VzTJzzD9nm6h~?v(JQ^;~Z64UE#1<o-Zbo zpgNsV^vZaxhhs5NXoONme$J$~^w&?TE(gnUI64}IA}a`|(oiTx%GU6H#rks)PNeYM z{v-I+jstkEwF6@XCafEtZzK{i9{`X{rx8o1AyMFs_jlof+waEIORmGi&%T7djM<sS zy5ZVuFd7bHf45Z#b);_y9LvHj2&fE|U|08mlR7hjf;i?cQc%qxOfaJ17zWffKlCiU zsOiI=!Q7WfkJ96538RS=*3F&@h7dGNnuI`gtwx0rHj_670DR&Tp8x<<cs--gt04dY zAOJ~3K~(>*JVpngay$>0*NfS;HDLA8Sf`zO8gBdlzKEGKXF9gj>#ZHwcC;t&pZ2+3 z;5ZHp!~WY2pHeL!%(4vT&z+O=HJ`eAGs??C*t)+BZ3YX2V;mmrxQ|%#|0Ydr422@j z6o4bQr$;}E{!n#b?1{t>;5qGiNrob74_TBUiz4K-2q`5(Or{_vQV^3G_)5tXq*Mx$ z{&Tgi2YcYa0h~JD#(uD@HYD7jV+}hvcNTggF%4)W*^-CLco3F#{7w-iZODNRh#KW7 z>BlNT5+x{-Yyud~keqWo9R07<1V~T{h9O|}K?Fg+5B>V!iqh&j6AX=k-;`z-Niswm zvcR$|SR<mhUs9HJG9o9SF*~ZfWX5!q6gd$g(c5cAl^?|u*fN?w*BEfQ=-)2cXhp0x z?`BYvv0#DLAe@dxA;%JsBe4k?hfHIaF#0Y@9*_hvb6@60(LJ|Pj~k*SAudT!RTV4< zScbrDtHRuL_UWJi-Z<EfWS)MknW0jwsH(!M>T0a2uEOf-Dx6$dfn^otSXNPv0MDC} zTG3bxlv1S9A_l@yeD&9V#L5dV!(&f8mGyT$9yivUb}BlDM$NqBKsbh$Moq!v!c$K{ z$7lp`QFc;Xd7`kQrY2;7CCd;T?y?-E3s$cHAp`@_+yHNUMrFW@lbh>N;rBvSDLf@1 zK=5b=E01$Cd-iPjJRY#eNl5!xSIF(w?hQ(D!37t<<Mra_KYPFtT~-Hucxu-H#PYNq z#1aV%4Gm44J((C>YHULRc{z^b@cnP!4MkP)`&YMR%|9%h#4J3=)3~n~R&xrBynn## z5hOYP6os?ZL6sFmQX;B+9y4#Js*3io4XxIC3-#yph|>|dNis?*wVH^>AAcNYFS1nv z3m#|gQeS5-U5KH03Zf_?6^>~DoJwn;Y&;SvNRo_nT7;O=9;s*?QZlVQ(xL{EIzY;j z77;6o73tZlQBBY^+I4I)cMQ?;i3~%)z&YgE&GVWlJOF>F!chThzcz$eIZ2jd%|7q^ zx+B&vPUI{zR?sEj0183%zQzUfiwouy1#w$cd2f3cRGM4(kYyP9$oc1CYH4ZK?^+W{ zq!b0KSFhG+x|mj;uSzmhNdm+36Z;az%s|FWTW94ZjrIo%BrS?WkrfCG1DC)fl1l3p zuG(aIPA_OV+}(>$fBm}!52MlN#kI{%jta`m6_q4V01-*Tu8}c}$r3u_2@J;L5R*yF zn>`y}{O>#Q$fJ+p`KSKkc<)u0Uxr`(<VPlr7fq(nJ*a8&p0Q*B9(?*a?C2iAsV$A; zGX$x$rbbi*7#TN^tWtPwLi4p1WoWFfL|2Z%+1mA#%!t(57X-BpjT%teMHX_b%h#`m zXJ{z1bKw8^T2@z!e;#c&2bHf`vj&xwl^E2^_hr2V|LI)^@yTV`?HMkChb+tgUa-`e z&+%p~UUm6p`0F#z;@KBp!h5alSTeoIieQK{N0*%vBsubN8F@{HXbLz6eF&=0*3?== zvRghf^300%9>xSx6^>M1Mr%a&u~^SdnzI0JzWF9nsTAh7Ov$ET0l;VdyS}OdimGD& zzzAmXf=Rd9^L<8(h)Q8nqpGTcwU7AAHAg_NIE9U(*S?z}5MtRTlB0{rR8XQuCkczR z-mmQP`7`p7`mlLN+M-BP%CexUrc87qvdoAo?_G0RQ33>jQ?2LyNE9y)kL3NkUs=8k zS7nU$GUVwFCsSI}tKQ&lfTaPL#Tkd}{A5rN&=rY0y;#E|)9E2CTdwtJs<HxE&mRa3 z(L7SBVmO(GtWpU2&C<~~fOTK|I*#^ej>4o#lkmUy-ivSE^>xP~b;T0}ff4`$JdYsH zqrvONx`sMjK6w&8KVuqhn>`at%ggZL-o5bh0xGJivGMY&kVsgq8K<sXfkS;mCS9ng zD#~;*?~6`91suy_Z|`8yp}CSwO~@G$SQgbGr}J~&hI8_QWiFd2DJp8~YPA`Xr0}_# zGH)K9dhb1)QeFnv#{e2x5+NoMNX4Q^ClXMViH#%{SXL9DCRQQJ#TQ*<Iue7i1X7ZW zNGgqeec3X7X;H$|sZ)y<3ivpS8Rwk3-7fs#o^OL;7(DvgyAWl?(Y^x0IK(Upr-ySy zoJ6BJ-|6VZcV69&M?Y)@C-C3}9z4&37dUV{uT?d(tj6*XYw&bpECN2W7uDXsXn)wE z(_9s?q1rkeIB)<}Wg+uk*1T$4dlv69D`MB5q7^uHMdDD!w5?*-rst}EEGuy469yei zscN>BI3q?~LB~d`W>=vT>ulOeg-tqDwL1wa7*GuBl8`LVLvVX7tzX^VjTc2`-K$im zsP#W|BC@otGPfJo&6`_ficm$Y$I8q6zHb0DPgJ?Qt`>K#T#;=k6Ivn2OCzIjxm>34 zNZT5}siYK%mDy2|i(@gGN@KDtgN3_5G)Z;+M8)ixoLyakKfnJGD!gt};9TH&^bL>V z`tSZ22Rk&SqEBw#jN8BR70jJG7qTp2+q>`Lg%@5l_uI~qQ7q7VNyo(?0G#eL_&5%i zOlriLH8r?@{{j5v&ws}G8#ds!JHLis{8*ckFm38o%$q$6?L(tzsxF7BQnSL3V_95% z-kJFAbN|F>B4z5`7K|?ANw7ua1da2@u?#x<onU<W!g;t`Rna;)ik8apzc<gamO&l| zJc6MRdSfv}l1ZFbU4?gshp}~F2(^A6++1<Da!QZb?Z#D1CgJw`iyp?zvbM@hXmhS= zZEa7+wcj{@I(BvUV^)n*L$)$hlI7SPf6o`D-lwtN-1-g<wI0TKYtKeab(Q)2tQphs z<^TFTzJK3O@Y=2eICsgM46Rl}Er#TbI`c)GDy0~TMDd4zZAWYW2-d7#2~Kd~nT`nE z&=?>j^D~gyL80Pc|1c_jUNi5>5C)Xw=)Gp_5w$K2XQLp36_wy!Zgh5bV$sZLc=}&& zL*O~|4v%1%xX?Ei!H0YHVrY06Avce3B#J)0P;qPb0D59cs0=|%O$A&W3yx(_;&!1T z;6<6&qX}*x4dc^QQ37kLh_yzh*%Y+&=+fxDHH*-Uh&fNL$;fAFfTn@&tcsAyY!E_F zQeA_AqldH4lPTm|Y-DLE`J4btTlDwiGuIR)mJVq1DygL9WZn)(@Km0@%0)HR^z~0% zo@LC$cpT!`7-EWoe}$uFRGArB7Sv|6jeN>g3^b|4kI_^bswCU0J*`bcRm}@jGAhL= zr4V=)E@M1RA_*0MBrCY~p8N36?OFryxo4k+U;p~o5OgEUu^cvRxWEKU0O(JpKGt<9 z6?oh<y#+t|Xg^+i?KRwR{ipHBV}HTbS6mK&;^GT8;)TZ_MN@S-C@h*70M@Tsj)$Io z39lV&$Hfa~jPC%65~!>=s^AJmmVSYE6g&aI>5JyWCGhARixvfz1zEj}HGjUA9vDa_ zF}JJ?r&U%Wz;JlzzyU;M8M7+N(QFfg$Z`fG31TvlEySX#NJXPyIZmrk9WSyJv|-AJ z4jsa@Y18r^cqEm^il+MP<4{z@<8fUCpA^;daEweWJo-@T$NumKeD1%$hGZ&*l3)<u z{OTRJ@zd9tul?#*zJv$<@0WPt-91=y(hRsV>049%$&y(!q7OoHQ?)w|cjCGC_9B*+ z@Xo6*VeZ_yc;l_NFmKKrY`Xe7dgb&gQc$-}k`YUbs110v9GwkJGIV|%?KAr945TF) zA9W8PAxcPej^JBOO&A#&0ZTMi%jb5ZraT09Z6g}$>rhu)gHUNHNMr;j)mGrSx3}Z* zSGJ(5uOHPV0T4nFNu(gFDnwbq-kt%tI2MXZ5pWCevkYccgwPoDq0#4c>?LAL|JVl~ z5Su15$qZL*7m`{7MYR?Xy*SF;JF@6tNCM?m`R4&oV7u9ieola;zFI=1xM|@@Mc;(6 zZmS9Qm)*UPbKLOtem{Nt>Q5k$Ax);LD#ER;0HyeOR}aouy&5mR|GovJ39Ue6IGM)Z z54PjRGnQrNcSy$n)$Gsr@f=dJ0#MZ|Y_V0BDT-=|4y&rEZ%OoO$8w(sZk9zjEg|T3 zfl?JOZGG1?m=FHqK@%vAJ7V+Z&3NL8C-Ca4uL1zZR0^MwrzQCnOtLi`Ra5M^!Q;WY z$&Glfy%QH+cp*-jJ4d5O6d7lqc_w~v?~icFD(z%6R$H?m*RNcL%90?qwfA8C+!k#J z@OaT>A_*?&FA6MEvI19*Y4X=xdLf>F@g=O8X3gb%V#j`5x^QN8lxE~9ivWz}%Qbnj zcL#=WMtwaPLa?Nw40A)v@Vy;7@u$5XVRA_+&YRMVGLJh)R2eIf9-~ObV(=CKTXTP^ z6jP^8MOj&y13+_8%;mo9NWFJx7=3+xy8Zx@cMj|ESW}ytuzU9&eD=$C;J#aL#92!h z;+6M5#Ak261J$8YTzIiY9|!z?T(Rj={N{JR$5U_Zz?G*jEqMK%z-f;-wG$kUr||6d z-H4<lJp0sNuw;qWsxf=!Ow`s?<JrId6?K!F=npoXZIgm^iuo&P5lK<j_ANE?mBtiJ zT{K=F4+a2-`-d<bOJHx;0J=xRNJ}!BD$C##c+|Dj;%i^~6mGidCj9!&FXGCzr-301 z1h)&AwZ!@ThI)a%4lJ294XUc*+Ydd8*<}GtsjdKD;s+sGUu`@sLK|RC(I1K7!-Ge0 zXe5Gd-2>nbwnL;8GioZ)R2jn5su0RDbf4`JwYC2#EP{^a1WTxj6Dallt0-1r;Vlgv zm;FN+OUw5JSn5&bBj=w7SCOLB$)Q20>6D&tOybp%F;rv}?szzkKDzOIOtwvSFjlOy z6LLI;{qY3uYwyZRe=B-4Ih07DD;kF?$zbhsDRa%X%wcQ;0*}r}TvJq06m77rjdoQe z*%3_wMDM%Ps>PZrLr6<9BFPkjZkMB{aPyT{V)B&c?9U7Y@b|y}9gjWs7;d=X2E5zf zkE`d;E&AN%Tjxxhh8@GBc;F{L!5<!d6i{V=Qp}n;0}XX`h$d5@l%gzXNp`t-9yf2g z0C)fT57^$`gVj@uDD;UJ0hUJO9tvVm%#QpoIQJYp@yzp%=XQ1X<E)uYD9r#dg{no< zk#4seWhEu1=BfES%i``Oi*d``Ir#DJJ^0nGUGNJ6)=iyaMw(JO4P~7Cw=9YflSv4k z{8TjW@!<CR@5huma}c!cZLc@GsXvo`HC8APz`(!&ik5%-7%Naxf{j;Pg<Cdl#O8C) z0LQYp=Dag7y`dI&-hV%0$pkiEbrk^M^EZ74e}3XAys`Tr&RsGGA-}g6<KYBOT{Cv) zkuD5`WBAq2?#F4XR$2~pokmxemRI2Bn{Ni~-EYY&nzXhKmMIZYQG~}3Bv7-b*6iu* zLw`7iEeF~_2*K>SD%6w)ux9pDR0O>63OpEwVC_w}LG+h_Qi^q_EU~KEg&fz~R`Ao( zPzOpW`eF$*heY#wF$_V#wwFu1ZZvybTI-5FXncSI2M0#*_Z|De5TLd+fRiTG!silj z(xh706zFwERV^s4VW;>r?HvKZ-aUIQ=gs3iKG?un?IR}&eDtXD%2_jueto>liYg!I z?14-v?*7hq5R1j=WtUz`2_f{RnbUC5w3e**ro&;x^<3w-+d2wv3Q1KF)2Tr_P?C)Q z@+3}B;d7%yZ$F`;Cd93(s^0UY^+Fk7Nr>LF#B<;T9xTtH%<l!uvY6J~gaqfzXRSYf zecpl;pU;PDuDJ%GPzWlec(=FjV_zeIW%22GbMWUUpTw58-U1j7U^##=*u42F9O@m0 zz;hVPXx+K(6PJMJIJ~g;aFMxR6-uHw>NwyMFcQfw=2?H{8bp(6L~Y<i2thPQ4=T0K zG%R9GZfHO}4>e!ucH^F<OYrP@=ir8!Gw{s8R($KNxAD}0gNW)qt>dk9JYKNBci|_l z!iqI(P*qh0o_FS?GS|U@+y!qu$6)&O={PR)rt+*YU88sFw(Y1dE5YrXFLhA#C(oOO zr@!|#e6V#ZKH7f(0C3X0x%k%C?}V(Vc=6pm$KrLHZA$<6U>}w(UWCn8T$bsWn{s~5 z&CNDVSG^EMRWuz|S%oS}NJ}yVhOzQ=w#Sd2e*=Hn_93FF6s}#p7++eq8k?5S!+G<k zqp6}4ewUz+1Ouw4Ov9EfTi|iKQEjgw@aE7NcKb}gy6h}X8@nf>jcc=H8?*IkiLRsS z;W>DD4lSVoHY}Qj|33dze0klem|jzXLw!T|`v?2*)yMyVKfJXQA9nO=-%HWHld9$u zSWwM=)LdZd<2eLuvs(qX#}<Fkaqcgg_jMYhr+F{`@nA^^p*Jl!spwo~YIGE`PLmFZ z5}q0uLRm0~PhWpMzWL2>;_)Y+#L|)=?mlBpPS1U;^$<W+{JDP+ua1o7bD^}zQq`dF zK<}WfHH)AaBAyVSKHx`Olt4kv-YYpRK^A3)!agCI3O^_C+C$G>d0hhb^$cLeoSA4H z8MC5hj|UfQ+*t5DaU6#ypL`MwA=ooG__3~$swhZAA_z(nCVPFj{@UwwgTny~iwiHf z0R1VNZLkSJ!0W*s*IbThTEugETZ{TUC6B&qCNOvePNPvX=vhz|YuB8L_iW+>H9;Sa z42@;mC1GN1LFb-*Ha^TT2-?0Hd_G(=eHva^e=h!d?pl-(g7#=}J-d`rbCzn(=r)*} zrY*^!Z&{Ybp@f{X*ODUyeSLj8v#9=C?rWphHIYc*ti>ng3|2}5ethNf4X6>UYk2bw zp9TQDv8NU3Vk^-zR@d+-2+QKWAAHYIi(orB0D$M7doHKFHqHxGRU8@)L)DddRF&#L zqJhbpna%jpxht`8!7NNJE71l^>p<$LJO$tnmE-W?!?@+jOENr{97SCWWA<CRcph#+ z!0!HGUCK^$C<8h4VhQ6AbC(k-Kvm)6Irw=FXUu5E<`pO5wza3=%vn>w5rXG-9l%|G zeHG8`K7@~Y25sknIzPv*HJgK76BWhmvjl)ZMb!iVGFN^pJ8$_P50>=-f6=*0WaKIz z?Cya?DL#4awK#C#0Dkts1DNXb;g?GnA(%l+Q2^n?tx(fxw5QVe-qFs21}iDcsGT~^ zEX60Zu)Zrr<_IpmvR3bXl9FkNX%Vt4L#3)&AfTzUaGD6WE^%d8mY~NCNl~$R<2rL} z7XW<Wb2o$I#y9e(pME+fH8fz~@CX__o@0t3D5Xe5!jSc825akTux{f<baZuTH#N(l zp|JsT7cD_aFo-sL6w3>MFNn`vxDIud<#_F2dtSi+2RKVomhgG5oF$;C(KtME9V~DC z{O7T^&x)*4l7byw{n;L|#|_))`0=CJvNHIKY;7tP1WYd}!AH?3s@$%k&$(0pEIYPu zLo%5?Sw+nNz3Gkh_{AN!V&_O4kqmXDkk^fxni@@iR{i(nE7LkXe)h6O*m>v(e)hyO zh{Us<pz2U5%F+=))O++?F5LRL&q7udJiG0~WBTkpZC$whg7dL#$>KcwM+3`OUU?;N z&|^qps+6MKtmLK+*|-G_HSi09W2y+XH}>nmT2fgJmgDil3opQzF>BQ>Lg3t(7RCPg zO&1_8N=Qi(<U|rsm7Hojnh2|H5{fKC6=eso5&&+V!|5}caoN(j_`+Ey<Dx~gpsFgK z{$L;O`{!0{J>2QMPjghX66yp!567BQc{H%BoB%)qS#3Wy!3d(uGX6({B_V`<Y1xvZ z`zpm)43bV~wWrc}xThaH$KkdweF;}wdI>^=;K3PFFn!XbtoKGcIv|c}rPz10wxK_r zE~I*mLn9G1&D8obW1<A5kny(dsLbf9+UG^*SQKI^rD-ox>vasvfOqlWT|79BwI(*` zYi4aF(y|PeWwB<lCDgEZ>C&R}Y*$}*9paLNNrHfLtE(`@=S4i7#{N7#skscdYNMgA z{M;?L@4ovmY0@N<&H}??{kiAB<#ucRiuN16vL5x7<+%6rHy|x5c>bf}=-7hMrT*RB z9EZ3aSV9$m+Y2ZPPCs=OdPl+t>mbrn8A3RRq+U~PjWKqisN*UrE5qSPwCFwF6ON#B zER4Vege_FtKFM6ITi(FUH{FDL?zzYDyep&aWaa$XnBG{AmZnK~c-tO~*!p9sETf~N z<KGrl0zg8)Urw1n8;^bG4s9xoF9-xm0hb#HhD;q)D6&@6qObqD`6h52hgWv)M>x;O zwL<HSJ%_R6lmc>@Ive43=Wl1CvUYBgvW$>hfIYvLpFYeIVg)Egb#n_q2o4`U46lvJ z5LR!XCtr9)?hEa*a+%Hb+60mhdWUrBJH@FHs~R*c>x?uhprq3UkJH1mSkO?7^XE^) zt!J;mC5vZcfA1iE_UbmgxVIIZBjEz~pj80m<~Ve9TdjQFlG2GFLEaw;h*=%~9}Sk1 zOM>{!N%M<-eZ05Fyg*O%4<fCqxb@as@$ySAp{?yG9+*A_a{>XlD=IRm+Y!X|i1gu} zKD?HXezn~L9g#Q|uUrMfFi6P?=s1)Rq1iw=mP*6Ru^34tq3GVG0hBDqfp-hwc)=zf z?0mn#u@G1e@9sOG8Fd4It80orXG@l7m3A+5bfA>yu`CqAWs@4=QWQM0Yd8LJqzwa! zMA1=>U3`9IbW{gS7K;`x#H<-Jzz1#l7`GSj1pr?Vo6cN~WwU4CgO0wO5ndKp>NEUu zo@>TX@KM3Doc$L-!&D#;0>^Q<WW#yrh-t=lYDEac@nqHrFG-RSixn?xIJv25Le%Zw zjvPVx1fog+=t?B8qqi6P6%`MBumg9zz6D=<<4yeU_IL4o>tX!%kw@_BU;o<ip1OKx zi^!ZQlQm~xQX_h!3H*G^4l}~+7#c=28qJDEkLOD2V9Dr0^i7MGBRG2j&^Qffo~>P{ zn#tCd4-aXe37~26BwTaVm5^iw+YcO_(B}?@V;Brav24kb0${1_nL^i{QWY^#gs5mV zrgMf@@y-<h_(EEtRXUx<hE*%TuR5Qe|IPd8%g_E5FFo-n?)~At*?-J$(dyTozZQfL zbcVI#Rm5~oo0X}ILxBltE_($YlgdhP^(hPRrE^z<BLvTWco2_m-;G_JeGXcj8l!*o zBM%6?mY+3leSa|9rx-7qv;n0qLt#di<UbiK2_f{NY17~>(&Lsz5vd_7SM;z>_ccwP zj4yrR3;6N$DLA<#2v1d&<DyBa6vkRx0jeUdDEMvx`qjL)s){$-d&s&AHWFEu$yi#{ zJ+uPX+xD51QpmD`KYVxyqbU)+v829pwW%DOz(a5g;5bgN(aDe9r9KZ1c66h$%5ngX z963_-c|PyF^T03+9^AXnJlr79<IY73@aS1<FvaV|>upEz;0HVL%F%Wl7#T6=5CU+N zg9E^aPd$mh-1r&Xc=gq|=dQ2o&HUQbjBBpC5{k!foeOV3`*(FCIF7@g@3|8K&*O<5 z`!QNX5sw_r1LAt4a&^#$upQ_r)d1S1MGQCIa6R_*4ucVRG=>78l;WME-I;tFx_Wwx zKA$sY%)n?`Ec*4mi3DcksK_p~4o721Q{Z!xC*k4KPsPg{*5Q>6>+tt;*Ww4uwU&xY zFTK>cPfDFR%S+GDq#Lg|`!t-oa2`gJY5eJf{Qw~tjVICE+zeHb|84iTF>!<t0)(o7 zvTBWWU>IFmkkuS1W8kr(01<0i&=+sH836Fo`+Fz!xjPScpfni3tQphCWhRIj9oen9 zF6JgH5cTMiKNhtn+n*KOUOf8fqgra@zrIHQ?`IF-$v^%Mr=GkVfst-}e(lN}k)_+r zt-1vPezzOD^@1(6z_0|8QS?U@6{;vt=)hTqLBPf1tl3lX=~atx#;hsW)!B#Ny!ioM z+kXU+WGai;^6?zfww`C+<sQeU$UnA^z&WPRtN{K`1xpvp;_g+a6i@5)_L`D%f9M;) zh$Lg?v}ySH4}XX|8ftMtxz=;$DYrmHktB@m-wf`0BmD`K)dE`K=^c2W=RV^Lj> zPR`=f&6|%nfl`uXq+}UmsWe1IHLpGI5+Jw)JvTZ2_pU4TqrI;mo6bBHE9Yy|8+v<t ziau`~$DyIV9_`U=>M-PT;jSf%@cT2@;K!$|z=BXI`oa<X^T-jr(smR_M#m7#h^XaM z3f&*PkM>ty#{d21A;e;FlZw6K(o3-BtTTaNnPw2(dfwRU2ZCj2s;$OtS6zZgDvg)+ zw~ZfNCX%2zgt&=L^{Q${H79kxcKNbp*w@($F6c*pG!C9+@aEwz$7=$CAd(XRzlMee zG?x}nF%6|ssBldzvW!R)yt0HUP)rX7(Gm=zDG)%d*NZoGU=IWWj`z%+Ybjp^d|ou@ z&XwQe!J~KIj!-ZFfBhu<;MMII49C#d+dE;Iy@@PNcW44$4=~aXjO8hcDzULZQL6xJ z#<UikcFM^Zizm_6H&pcJ?(ghJxvl>+$L2A?lF0%=Ti>9fpkJqeeFC4~?&o7T?Lbmm zhPJjgTy)Vz^tD%C#iur3q0#2iF(8$Mi)C=vop)ycd9USUefHw@NGl4Cjz!J6kU75| zn++)wn&{&=4-^8&peo?SRV(J<vZZt2;d%UV+irX~;2eV(5hVvx!RUj<3t?k!2+f|q zYS8BYkzh#(p&O^QAm|c`%i*Xh68#o+_p?qdI`HrumNCHPx?vz32SKk2qyWN44x5#; z|JU7%e+-Qjb;-8vc9yM2bxKJUrHqSCOwnOOz*v%G$g-YP*I%Mg3XWsJ>(#DKy0-8k zRhI;?ZTEh7-7eg5&E;VAGWLnA&7b@vL{-Ie?YUcJd>n^`73H{P&TKrmdL@3ndNuxM z=@NXZWeU3TRB_HK2_l|K;ctKYo9--VQy$98%7Dr`?P33(HIo3txa#Tv03ZNKL_t)R z!`(N05^I+&!aGO1@#?|$aqd|PB^J+1!`1|S&T7~kdA{3k`7HMK3?e~+s>&)PL<!s5 zEoUR>b)#!=xahp4+wI28it^%tPn0Gsx_&ScK}g6Auu<LdYiMZ504L5g{+D00(Hi*# zt?KmE2fmL~G=k2dQ7Ed4!NEbZpZMRgMBT}0s;$;qE&AF4DTh-MD7E%UBI0oJHeI3# z7Q9tt+Yta99T>)?7hPC@g4G<YXfz5*k_xg*1Bs-ArE=`C2{5s~(lYGbyO%!l$Rn6J zwaNM$HU~m*<;b7f`Yq>A*M!#(={dxF0GJCb)wEcY=te%rK_hb*RQSDEF|`5Lu3UhG zEaQp&ZTM(t45F%{+UJ3ysu&v^GaV7L*K*wXv~YGBklf$tKQ^+wCeMt!ocWKzK~pgO z<&iOTq|zu4_%S^e#a;C^;EYy+s%rB*M~)svS}*b68jj%m?VUw`UPoVcPOUQ%*XJQx zVWlCqOrfdqNRq4<@o1YZEo+sq2S&mW1Re~f8T(-T8GS6n;82%l+}EvKhGmNuKs1x~ z#jUIKrthA3qNvw<I2ILd7iv8o^ruqT7tT)dPxARtA_#c#*=Mu^wNLDDdo|k4zIZ{S zV_6n|zUNNNXspLe`;LrT9jnBX+0KCx84!Y$J%5wKAYAw9Phn4IAE?`fb52_YmSM2n zHtUfGMeo2sF8h#oO|Pmd`rOYf31W)hH=%oDFqKBRCwKA5SXygLw?~r3!87^@w5BOj zfyNfC4_05Zn;Y@H8$W6O?DzX1i|K#c{jKQNV%y#WIwc_i!#VnWdBGAAmt`Pr(eoE? zyZ{2v<L!OLf#twh6wyQy%}tXFfF+}UfB!hC7~52jOst$B?tI~!-=+^e^bq_$A0Ug? zca4Y5`#e|inLTg0>5Nmsu`IUf^JA4fR4mCMK0+ylG6D8vT>HRtIHjo`=S^)ylmgGS zc490gf@L%@72_T)O2vm1h$v5hC9tTv8f%*;PmF@q*H1dTK>^eQ_(D~MWBP-;T=V#2 zJv~V1ROR7h5})385J_1XH>x~*Si33Pa^$eu!%@97TruaeL09BaBpH${LotS&>doFf z%YXt%DGCT-995+`agtbdK1BDlnybn%7K>vn8Uq1v;rjFbfA+pRK91^Y`?*uLuX>le z+<Wg}jE#+LjHwA=Qvyy1EiZW?B>4h_nh*jBp(VTty@npZbV9X_jeEBxTe56*t)%T` z%KiSB+1Z(G+Lfi?7%soT((Y<^=gyt`ob#M>o`V`ysxQ+qdh}=vC@)8?*PHdV8ep}c zJ_X3mC@REjZ@d|!x02O7>PKD?;K)Uu(}9=n{tXKAa`Ec6{oOd16jC6VbguGkR&e_4 z+hoEJMaAehWH?$p0r>qs{B-r@IMCXGEk~4%n}$N@>Ts!GpV^#@7@4_%Mp&k(^ZPS? zeP<+sh%94%|Kw^%?nnd#!1U?UlX^UpCr!kRX;YNU(|%Q2+zS9spE*@yH8_SK==1dX zz5du6Yv7BPx^%WGpcy}OnV$&7=Bm7`6lX450zs5e)7Y8;1*_DKE?vAR9jyfb*tKg{ zB8{q_OG+U~a$=@_maNW0o2uzcFTJE>-iqPa8ufI<-itTmg(N*=VX<ijkBR3nXZ&dR zA_Ce2O7dH>j!3B#nWSJ(4I`4==_G)S=P<oE4|DpL!X1u4rWAE`b+NDSaHhDYNcYsM zfl2y~f+Zn@-g(lTj712-9=ArNZu9!E)#HVoWpVSM0T`^az6sC6<a8qFa=}}F7@!m` zLBQ(0)#!`}8Eu0_Y8LIjI4_h^N}}-#ITX>lhftY9jEE2frFIgkWL;E^r%3Ifp(V^1 z;%_89Z%>rAHX{Zq&6J~3cgs(jg<ZRMXMNLN_M;!+gCj??zFrgZ^RTuxxv0U+qC$is z5!Bb$s|erCHDwr}axlR07+W<6Puy}Nj<|hT(@i;v<O{$bXL%E%7$bZJdb2;i@=6?N z^8h9bes#moVYl1xS+zn*Gm?Pq+qSAepBY-t9Gku~4&fLOGYewnV6&OvktI}EIaF9V zlv_EJSvVA#S>*5x>>LA=PAqz7XBP+|s7&FFx<Vl=QZ;JzBNPn6Wa81Uq8#I+tc^1d z=x6jWqa`UVEv@i%wDskku56fQ6JGrAGxb7BKv#Q8u>5Sx4n;p#H^z=04FEXQ)P3Bt z&Fuvt1pWI}rukaRdfBvTQ*scXv9ghnC@HPb;*7VfjD^P@Q>6&0k%sPy&Hb9qJJFa- zWs4AlcX{cu)07etHHIrE^A_Xw)rY>>rRY-$qEU$~o&!yJ==Q1<UUjk6f-%MUU>OGQ zzyH2Aw`RK|Jy4SLwd?V7@tp%pr^$q+Rf9A4Ds`0Tn)VLJ0G1UMU{0Pf!_Zn>jEKjh zDD=om=If0$b=c?gXIzWFd-ra%wY8zs>r42X{i^zl6b^$B0$EaJ>r{PLP@>6gu`COo z=V0O(4gA{tK}}XGsn@0D2r2Kwa2z<B1!kKCJjdes4-{eaQKbd2+w6*%aTa{gigV9J zQx7_j%qlH|Ulid=k`0_^GJ$0XKKSqh_1<E-um9xDK*eBy5G<HB5l`N7BR;P=f;yKw zwRb7Wc=fYy;>}F}fZc44c`hk7vRTuoVcL|*s6JGSew7ut=Z@P@*WpG@TPFwsnwpxk ztF>Id9Q=}{AUc|f@C+CS52nBZCf^Ju*9^vK!t^2iv9_rNCWgSo5SSSP3rpbO7!;UT z6q{L;SvgeNIOLmHGzWti=5)f6Ld$ngXD4RHdzGMQZE3;Db7teA`|d?av92K8nFkCQ zrcs?y&%?rV2zcCmcAtmUc<2jv{|5i>uTRFVkvCCADGKJ>s}JGz_dYZ{Ri)}5XQJj) z*Wv=-U8^(|Od1**@RtjgkmT!40Tr3j#F(X=`91gY5f44})Kg<LbTk1i90Gzd5Bk0* zUjX%`C}*?B61i3`R^Dr$ZZFchZ0id6V|_mf+@S~#b$J0olq_0(Q&2)u<70va(Y*)D zG7LtH7=hf}TzEX5B>J$1x)38!cDGA2-!ZTxgwSl%dL%(WNGC1!T(d&OTvA?|Ft@DP zg3f*W6zdhh%?Io7ep`E1qBUh@WmvavUDD?~;Rw3I0w|>rf*}PcMG2J3T7Nx;5O6FD zj^{ua7Oc9V%ao$t?bY3gG=;sTc&x0M2WPW@QEz-R&%+y~B7=S`oIelYB(0v(Qs0v& z!)muDSf1UDVuu|=9S&^o>`MB4Rc<a`d+l|dXPLp2=i~!LilFs*r_RN_*Ia>re7yth zX@m%Bn_cMAJs*u@I4x$hcd2wDP3~>8EQ`}loe#fCCtq{rk1=7yFs#{K1BMXnJ9sFz zFJ!Wg3yZ*?bq*{y-wOVWWnl6xVDc;=HXejC8Vn1D4n&wz91Wx{u4e%7guu*DZ0YF4 zijh?yRxasO)_T1d8}C_Cproh(fBEA*$-OFj4lr;8V2RP4vLy8>4cpM+hTUexDa+1; zD9QNK3o6YRNn)_6$w<X{x%l(r&l;XOb>7J;#&y50Tpk~W4j$Ca#bZ<_S4u<uE9<B& z5JFL0A67+Hu6u{<_76AEhaY}8_J@Mb*mSpRhTW0&4y@a>CC$B3psfQF&tci@X=wEN z;f;uj=s-j?fFHxN2GpBUUW~)h`pj@Rxj~tb$*UJuNO4~zVUhA2b_4<e3>`WYPN!2T zA4vw3$X=0{5azq*Sza@FV&-0DON*gg#4U;#X}4jr(~)2;`i>sal7MbIbQmu+w`Q&G zR##Vt!-tb+Xi@+NTwRbQ84<4^k|=2zuTgK3<2X&SuF>bm;jUPW&>fB_eJ@2RHTlXi z;LK*Q7PFxx*o48A_~e_d(OnLwpFA6Ftt~0RA=UWd%9UugShM;Y-fYJFk|G3BWKISs z(A?Y{qm44{Vo_Y7cs&4qdhQvxXvso6x9vb`L&j;tWAA*P0G2ir2VWG3#MIf1(WH-v zS_}5!dvAl9tw2r=%1TSK&lV&EBqs;_^0UD&J1gbg&snT^`tCbmzv!}V-|~$kO)#+x z77iZ>#%ThRZvinIJ<P6f1ZSLkZo=xcn0O2yIyCj0TWr9fQ85~}y&Xa**k|`S%P=tU zCLpH(SDw8T&%FC_QkoEeLNyWsm&c32ah-H3%FDpAY({jQ%j3tAMW=Op-MRz4=xx>L z^`p#gH9B3CA``USv111&PE_|gNmQAj=tYcC%8$JH0m2<EsZWmMV=|5aE?Ru5($qal z#Rfx(=SQF!=?*iGjcUA?%4(udDsb!$Ak$+dB7%U{)>f_WC##8f^bjEppZ6W}ET@;3 zC2g6Nnu3k-_%Etn<qt}dXb#FUs35>ENm#x203JKq*rUtR($a#?&dwCpCMET5FC<Yy zBpB9e)EGj*uq;@PQzYxun^Bf2y3{zEOeunbq%K%Fp}{I4ilh^3F@rVp2^2@Z(}w+r zWAVnRBdSnQR+=>xyK2=ce9dIns*5+7Fext&TRRfxrQYv{)#1RQnwspvl3|qu6srRq z%i_=1{{&-)55=?Fs*_WxL;B%hb2~bs*|X|-<l8Jb5{;<}sWbkjPMU-Tr<|;H>L@NQ z!GjOnkA1Cf9IUI)+VIeCPVAgh!3<6gR80RtSbqJDxb(W8p{YD|EUn%j#J`){aQpmO zm{P7}5)+P5=-eC=z!3NZ0W+(r5~S_4P8i({T{(%>Z0gf&*jA4Z6&2+G!yw0*gU)CP zl07%sA_E+`c=m(OaQUT|Bsy1i8?5H^;w6o)F36N3KW&X=Y;C^$^2<o$S}KeV$D&Oy zo<S0`W0O%t{m)-bEA@&>qHdmjZcPWb+0}`MUwEba$#ll({_{>f2@b18%Zing#3G~n zha^)>n>8C9fe<`lwfs#xA8Mpnv(55Nf|d*+2<SvYSdPyeA-kJa_B-TR5<=(|<Hu$E z`cP*FWOY#;4u!GR>w}GDaB+F^wEenJ2$$`x#+o))kL{NWFT9X=+^OR@+gn^(#;X*L zDAo?kDm9cmYgF+8)u<zeVbGykfK-r-#4AI<@Ekac87$8w1sj%O(BbuJaUWh3lvs)+ zX5|r$88Zf^@`~)P8-OJP`XiWxw%XCzg;G%fM=4sgI@m0xpXHQzn$-?7&*Qn<eu1$g zhT@g&i5arPiu2(xoAB}%o3wcY04L9(FgGU#8Yza&X2t!#zuRDlEIs{n+<wc=U|AMh zw{At&H32c67wpV=$)B2gs^U$Bf_Q4{E_~3QSe)M!4B_GGT3k780<M}m9*#IUJ!0X& z<e9OqtrhcT%}m_bWhvuz5G^lZ0k~V6`|N%XMg*;8)7$I5!ID|i6dJg=Jn8G-+kFTv zU2dFy+JdAsdUrJJVO8D6YPDpv!E0HY37N0}RlUH@P#Dg5kfz;l`b(B9(fuwP84q{t z`rrBFi}1BJbbrI>BqU8dho!TpqdgGR5(ncmU8AfN%Mb`=E1Whfj(WUW=Dr*edIpe5 z0NH5NJ0a>AD55vaGual>N$)b>A+Tf!!KyK%GWRN5W2xdVsb1w}<z=uZNqpGs_2G)W z)%dDA&DRXZ=FOW@J{J}x>~|@#I~tBC)GN;^ZGhskGJO#d19Fw%yv1xrvl?%cMJdKg zFa!+GgSD8!aBNDiY|Ow4NRo{A*Q?(x=!>IwGF$N$iv?$1cOA^De*)7bmw}x)3CKWQ zCbzg4f4S=}_y!Dwjbo5+VnK+6O|A|sC@n;e)uMt;52zO2q{P#ld2m>*c=VS)Lt#lN zK8(`@WeCCSA^ouZ;88SpxV5=5a|~Ktow1E6?fEC3>siZ};r||f039w@4+^(+!<1ZL zL)y9#($<ZTUw;lSEuI4}!{WZ`Iy`Wo781`xwwTe*vAA!^DY$jsjKqYJ=w8Dyc)F$< z<L1ms+)=Vv1JOD-S63H0nvV3@{ch%Y%$qwG^+%4PwxJQfyYn_+(5R#>seFDvZn)(( z-1_TZCOr4$y7h2%xiP%5H0|d_1=p9Iz9^lgka~000Y_9dN~RR<P{hbq%5t}JZ4hYJ z$0{XBDH#FK<@Mo_r=HHR>$nZjiBv3`qa=8(S2dR9P{>H1vJ5~eL`g=(@5QoNQ?a`( z#tcb;U~g>b2@mzl&oQd_9HUHNJUD+Rz>*L`&mEDu4y+^y2zMxp$}dTHs!3TCC*>tl zIA3+Sv1<1|>`9Wr+LN(m>$WuP3?(&PUWIxk1P~>#YA0_Jw=j5yXzPhm3XhuRtt1Z+ z5QYJ3;=x(;Lh8xKpi-rNbbq}{#fF11aLB^DB!s|Zv4EXE1Kiw`V7~Gym{(s3ro24u z-`USQA3yokuaG-_JUT)FZ0YF0ZQJ+Y;;R0*eC#lsH*O@nDd_8r2FEKU4rK#iHk<K} zTYmv_ei1&YGm1k@8BhjMmhr*nJzA`$JjaQ)X!21Hsnqk%T7d<poUHzR4*)X~hV<$C zNuQE;Y=-#Svyk`iMy1n^C(b+#FaPiiJa*0!ESNL~3nz`iFXzw3=~e0Lj(rgUYijDS z{Gyd{Kq+ei<Qdr}YOA+w`*>zMy8HoHEf#Ftycug=dl>^pk2BD~`ti<tAHd`FCNydW zfPcRF8b%GQM0r7O+RqbIDzY@4V1&-I6w{~|QCUV%lnl2O(Vk1+F#GI3{EZr}kEja` zcsjHM#CxB6CA$gDjj2XmaM~#-E6m52hno}*OQw(lvF;*-QR=&SmcjNtdoW?dFl=jy zbs3T(Ldqru$KqK^QszwwXhv?j-dJS6JD%lb-PEQTD4f<-4FC=WLvV{ChT5!{mv6jb z9y!{GOZQfzE5ka<%r=wso5+?H7etjBrMfyNJy;R|K~aK3^)@1rh?a4#rWb%U^I*+p ztyfznqp{5uqu!!QCz6nL?9xCVPM84GPp(SzFbPrUzXA);*$k=iDE58)0UoQa!&hxC z{C46f+&XO>^2<w5Wiz8;@2;42+e0c7MdiStktnF>hbM2p31^?a0ACz!hgY5F@*D^H z=jUMk-b1KX>+S?ef-4G^$I?YZqcgjIY1r=vZ8{3t+yLpb4-omw-H_{RGybR|n-zoe zoUobrlqDkZ<I}pM;CT}qdQDhLW9)(~$J#=r8L}Ei@CCztdcTX3436V)_VP0@Wm5X2 zzFY3N8xP+1hlE({x(yrg_|wl~{J`?=uSrAzAw*HhIo3fbA}W}045Qq$(cGPGK&HQ5 zOhOcl*P~Nm$d0tM;dhVxExSES2bLzD!|D}F;Ef14(C!8WAnFr+bVh;OAH=F93m{Qh z)4BzqG=@Glv`oC_5y5Z`sor>{=>W4Eaa{rsmiumiWr4+#m12*-Ii{fVj|L^Ka!#?a z?bhnO)wt`>VG<B}4=AI+mezumWNd5gP`p7&Qe~&28nMuBERJDN>9lLhAtFf#2%<v0 z5(cc<lvKwtop-rkFP0GS#sESTjtMB3%1SV$r5e3LY-+t=jtPWgAn)7^@yUm9%d|20 z=z=rw#+eIn`Lu~}l$V1yn^Eepq2b7pj5h0Ths_D}9|p&$Nw{R?O02%%eC%+C;R%I7 zDaG`G6<`U$OPhBiEJ`SG+GEtuv9_F&GK>8^cl*tVJn;}Bk3R_U<99&aoqc`}tvk|$ z>C>jgfxCL`qu)CUm}!7hR;{+aY|o|lKG<%Ifv28(0cE8nIOoje3C~@5?f)R(ZpGZO zL%aPfUmysxS?T1H<{M?^SyHNnO%kMGrPT9go_D5k!u1qvIH=WDKJx0@*-xg$W>7l1 z>EiRjFa&$rJC(DNB*<zK57AMiT|Pf5iwiNlvO>$C1(Y(9-tK3b%d@DijwR@2qCK1( zB8~N!06^I901ZnBp{pm1%Sy3F))m07ak;<%SX8J4xwm+ISh#H$)?`^jnd$I)y(GQS zNy)zUE-jT^^aqs2t3;n3O^|OjV?eG04l@rb%ivfRE&dP~jswFo3AAl@V@O#MzSyQ~ zSESGUl*Fu)eT<VHhTPJkc#`=RFb*DsjhlvG00lNH29%Ycw4xlAyc{JV3BZKXVr<*9 z7obwlvr6N=OnVMcF$jw;{t^E6*GJ(ksDLnLI_553iVM$J49;Z6nmq?m;<TYAN>7tx zToSURoI^M6<-gXh2Z90R_z#U|cI?HxXo0&%@d-+1r7SCe8O@5NH1PmXTX$Fk3EIcs zmr{y;mE9+k-F@%<xc9C*5+48CKc2+yefzO=`dFBGuG{z7UEhQOapLlsctfdnaJ4-G zTBF_=jh$CA48Hr5O*E>(tgWT^auM}!@45TVo-Ne8n8V<(T5;A%GqJI;P0K=8Vv$O% zcJu?<)GXw4PMwP_%`U?^O2_J5CZS=&y1iSB7c!yg%@{*#E|Pdnz7wA1#bZWiPQkXt zte;m}+YpdsOmI3d+HS)pj~C0f?j*ZCUh-|8Pj!bIP0<2*Nro5<DqbRqSw)?pFkHb9 zrdE`I0x+9RXbpxGfaw9K<vDB+^%Rgk7DDA19h>EQQ@<aP*Ixl+riv%Yc0aZ8ugEc* z(A3tRv1gXK%gX>JGjazE!fk*0Gp5d-jc4Bf7?+>17!Tic9low>M7u8tQ<OUAO~>|m zRL<xeEG9G79%=lKt+(fQ?n6f~gzK-rUboXp3KcIzj6kVB;=IfQ)iqkug^6SP{CiKI zIwkG%ul?&S%$hL`vt~>)Jl@dQgqv=@1;x1zOdp<^+E*YVbSsV?1<P-~`9=f2ghP%> z-HD2~Lt!w2lkWNy7&mU5@$-c^pipZo?|k9~AVJwC3$WAy{{OB#527q%cbnShQj{Qz zq8i#!UfQLC{ZG$116`r8CQtw<ol7X~J@1lIz^R*qaKM*zt`b?+G$5&)?h_s?`#GH$ z8%Lq0vqpn$u`Jj(S`|xZQDHvTw0B_nwq4|SI47A>Y;Vy~8vc;cYE_$v`vnnIYGQ&Y zhzN)x2*W6;+gXm0{mVcp#amx~ty&dv;@qOB04VK#vzH_Z``4|7@Y<^g|LI=H+t-6w zxE{|(v(JwXkEiFc(+q~$Y{ta#<1ljgFw8!E8CJ}ni-&Hw8n5lE$FLD2)EC)$;o^$j zCi+xXR-&%U^B-Gp&+puibIw?Xyl5XynJOM-C>Zl9Qyn_*vfb4VQ53;23?#Yle9MDP zO5JN&Y3gK~&aN)J^vdga<j?mdJa_4je*&-1kF)1Y%1F6Ku~{h=oHDN)uvE6&jT<-O z&p%j9l3Ic4yo6N4G$Ki{?gr6)N|Y0H2p)Lg0V8VY%SF6hfDnN%7{pU+KI-{8RqIis zW6t<7C@aXrR-MNv2SQ3_z52z>9H%soFD*tzK^_ivx()lSk{Hxe+E6*ysG-3Sf^Rm( zWGRDgx7L9vnYB$+9qp7LX>>bJY_KGR(5$@5_I5+uX}w$7koud=SiNUIIbP0-VHkXI zxCvo7S_VQP`2)~*_vRS}AyLA}k^+=EZHNd0q7Axe5Bdn^sIpr%YP&8(!f{latXQ*x zszI3sFbN@;v|u6DzVtj0XjdfKj$v$QXjZa=Y2U`d9CkY%ec*m@`GvrM;ke=l=ith7 zmSNqt9S}s(kY0aGRBSiiW#xbYT6S|^k8RCu__XdQuDtfT*tHe~!0(O4D^mex96cKj zsk+9p3}?D}#A6&KYRObyZt4uy4?g}kZur@?22TV4ZvWjM@X6<2;gks@Fm+gFc@F+y z2$C$rX0vAGSr!!)X`O=%2b3;C1c0FKL&;V_d?x8*+v?~@eJ2_*u7#djTlxB@YjN;j z&k``laKGgnMOp5-b~SdkcEB4EKtUm@u}BI9z)UQI`WD3jx$^8~`227)d=WvzCMg)| zk#`yM#$$lVfTF#<T{9Rw?QM`{8L~{Z#4-Z{X0@Y#2V#~#o|uIYfldeZYqtksSw^MV zjBEB)ljG@}95x#SNyc`)MJGsxiysmtc)}5IJcr@Mg`fbMJwBD~%RUjNFvp?jnAWLD zK9Z<VaC*R$Wk3iipqU0R8HT}6ueu5!d)!$i8KoLqIy{&gN2T?Zk)mzD_8ef)NL>B% z8!%$<AZ$BuC}n9v)?AV#s`O>@O=RlqIhxjQUypYV)Z(fOet^?XJ1zFzd>(W(H>dX~ zB?%CX!0E8rlueBx3Eeb$b8I<SAEU;TjMla`h@yy@)2A99-@bDf?*8Nb$aC1RWNPO9 zZrvT33c@Ql=+L1<lgsCkSO#ZAloilSlF$<sEr`b1uDRwKV`5Q!K7pqb{$L1qJn;fx zvL55+lV>mrFFfrOSWPBuZ*EuQH)RUJr^GHPr3i~6Iy}l+z4787AS8;|(b@r7eXT6Z z5PSj1dMaA|FGJT-qpKN0(ADMEz|`N>2}-H*S(HMi6p{*_l*-!U#-&IS#NG*EPJFq$ zs=Pc5&dtrtpqFKYJ7cv#&on94koOqtf%;+$EL6_v!<r)rRuWM?H@lffK$O66EY27= z6bvC~&~31?kiB;~xU2}DZ`lz8$AB*}P9+FHD4+;d%Tmg$$l=3>;f3A%0shzk#xDqX zZ~q}&eEH@7`3u4E;PMM`!>@h?iDe=5*6k#V>LDjJIv9r&+ge<GetN!$fCGUr?tAR- z%C!_l!0SOv?LnM;?hg_4`&CdBjR2|rE*iiy8jo{W%y9erE;(t(p@yUa5PGj<#TiQt zk5wN$h^6P84?z&HV%7u{I5RH+X>qwhy76T7o~6g*Nud6sY$26oZDXfE${1QS&i0$P zzo3_1da2H<6pTiey91CVe6nd9YF>SUz<P|OEer$X$LMVn&*7@Gm*U@bjT&f)!I1hh z1xpB;+m(IQW-(((c`3d=+5%ZUM_Hy217RgXxuDMg03ZNKL_t*Esl{#8xrhRxjtbS! zCDG=TfDpjMvaqP7Ba$c}916sY5S^c{&9D0Tvi7?%BR1;spYSv+A%vbka(LzxY+I{g zQ~FA^P~5#-8qzC9Kw%F0<>$a1j$l(`n^7lNy}&_9#*r>B7>0$-#A9S>A^hQ39E0`% zEJqJ4M{QF}%!>>Kj1*jSlZ-?FzfVb5k7min9cQgL3-!${__+3HkLTg2$A?Sb{T!2L zOi!<z(#IpWq!iPao&`RW&g_|bm!hDnUo;-2Wu@5b>V#hq3`WDohGu+yv<dIk)Zw4I z58$=EHF#<F0lc_tKVIEigD(y@;G;wJIMkV$C-mmNgP6T=5v(R22nBIu_fCB9uYciB zPdtq?=FdYU7>r$WQB;4{|E_yn6d|bck)ep#eJiVD7?nkN3G}Ldl$Mkjo^N-#aQ@0m z(b&`s6UTO|))PNmT^>*XBZdvj==El^S&dvMo|PoakR=JCC_$DaZ373CSZE~9VAoW* z7=l%+R>7{X?G)n^dzAR?YoC6l8F<G$3Q9C>WB|DHsvkk16#HFn5H%B45sD|sGn)_$ z#_B77{i6%f8VDH@eWDH4iP5GobpJ9q1$ye5VZg8q7?y?A%p;(FRye8=YmfjnplxEm zZBQMM${L_XU(ewL9v6+yT;49!5%VhRLt(TF0ysjB%k!E%s1hcQ!z&wiVq-%qrd5_` z3yG*rn>m(6M3S|YHoT+&dv)Fjm9zJlIfjKGir8OQj}iU*DG450jhzy=3`Zg`^E^NW zWs|gufZ3wxu<CBGveHtlTDcORh5T5Ug%|lvLkl`XVKn;!_~ZI5$S*F&`p5t8TfZiZ z)z-UjC`(Gh6vrzKgLP}s=k+2eQ>=XRBjh?AU`!@3;SlP4LHI-oQ$`F!S6BdvgmJi8 zF>YGB+yE$AJznHmEU=q+FaRnYcAPbG2=c8K<Xg;enoMX51o262J>IH5j4gNl5pcEP z?RVeB4R`$>YhQQ<FaGOac<T3esWhKt^qisx!vI7ED5DujRFuH6EOKlXV`g<P4-3zu zwY?pFe*kuS_t)itNB)ZKyOgr12}Am$B+r@E=LxD2YV9r#t6sujFbGK$lSV0Im4*z8 zA_!5a%%CX2%yF@dSV_`KzZNW5U|chLH6^ug<$?MJJbmkp%BS~6T%F|<z-(9Q(XD0^ zmdu)l{S6HmS)8xNUja%8itHA2xMRs^mn>O`tN-v2HZ-<kaDHr_<wyjeR*-0;aDBf? z!_P7JWLQR<LkhskbKumv+OFmXupFzKW174>7>P}*UK@!bb`H@_Dkm&h&h1x;aT#X8 z%Cd||SFB&+Kh=P=Aj`)kTISoWm{HXqZ*JKDH9^Y0gTq~3>}&7B$l`pp`LkkWIjv^M zIyxrLY5}Db-cSTiiwQK+gCrljvKg%3xfdfU%K@JcC=?Ab%hf->5kJ4;a(I0{%$qSy z@iMJ81u!{Y1x;mIPo6#vzyIwmxNGRD1W?@3(vG?=54u8Od{N(sJ+4j!B^jN8ASz3W zF>TUBTz$<|xZ;Y-(|QsA)kBs5fhtA@69Y`2$Bm!-WHm&;AM@tU#=Mi}Kn?^zOjZbz zfRcg&rN&H>;8&^AfIk3P6c7po07+p3>W&`4dta`_rsfv7s_XID{u-D#4uMDnGNs^o z4y>mO;24}baRR1|9gX7L96WaGZ{n0>Viv!4sGfzMO|V-nkSPVnv2X|au059|%a}K3 zHridTZo%@7-`|V-A9x51A+Yis#tzC(=wAv)w8qfIMVak4&CSi4I0Mmd(i){m;1@)2 z90x%VASeO37~WFlwGXV_P4_*qLXX<U4^sP9KJ?1J@X!rctCoblcP6>84CrXl5+a|y z{U#JGIv-~ZsWjLIrFI*<Uax_+UA1^Vo_YV@I8&D4)M*;ia0FbgC5eGSlCaszUKd3` z0>H-ehzJ6FJ|9}^YQV5;(z;Zt`(JeKX%f0z-%gF3$e!i$p;cK>ux$nk_R~)HaeH2; zjT=r^Od1Ij&tk=t(RgLUPHbvw$H<ZbrK1C@97Brp4e9yOfcfs`Hq0DU*`t_czC+n~ z+PmD!O%e_ysJBcWJqnLJ^)x>FdLuT!`5N+a9138XOd4Q*{N-18^WAsx%4@Hot;3BM z4>e$SLnAiUH=x1ehd^a?215{J3aiD8Q)W)b$rGnw#j+(BHD(N)PA7_^t<rki`{#Io zGpRro?%lf09#OKg0&cRXfzrHLGca$~bR)H$mv6{E<<yNN*JcA`8M#(#LhWPKpg~wL zcP>CFLV*B|9z6=iY{u3D)c^%1jvRp^rvs2g*v%$9cFX?*Bnf7gje#YJv-p)R<Z8wR zW7vf}ZjYLsD8s_{tv2kap+mX_uXjKA2zUSSJ_r#3^9EO9ZG97_4Ih-%=ZJxjMw6y1 zRWY!b1qEo*0RbUIDN!K=;202&1FLpt0f579A4(i?pf5?r#Gd$a5di3N!5<9aiMKyc zz>@TmX9*}}B>5$POHnv;SglwzZ4%ZWX~ygUWf~|^0NZPgg82{Ja5bKM_hW2nYRA06 zl^PVv5fN09z?hP>)=JWnQV*5@Q0lO%9=;V}pHJs`(xf`OdhjHAJ{HDu%xD_X2?v(L z%F5`W)>hR1balpm6OI$%-tF^)QhHo^mE-%BYB$;JVFU5mo<rEx(hg5}F!Jpdg}-N5 z1l6KujV4rYybX1Ym^PpsY!A+ERR40Y41?B=E_Gv$C<#4;XdCd)FTEIUj|aOCR0EQL z!}awTSY8f<!$81~Hn#^WF1!eVU=R$$U|>ZB9^YRJkJpFsqsL+ZAt);;!A~!~2&~xx zmgiAkUIxx&Qa0b{q4!*R3p7m@wJQYySYDNLiyR*pp6Yu483HYF*~rm<<JENJ6moRx zVKJLAv`R5Bhv<7DQmO%?!)#8J^wWc76fk97Ur`eK!XB>|c8eJ{vq=*k?~Bpt3t(<# zMcPu1U3>Oo)#X1%BqHFXf#ryZ5@rvo1fQi?f~1ziL_Lu7*HD=ri^ZZaK#bxY5r!yY z4TL}vM1U0l5O5raNF)M(L`+!U*FC?6`X2kI4z=UTMf@Hh62c>|zKu8U{cV)D>|Nus zxB}>G)0Bc9{Kd66`HKI+T%C8GV>P4E7l>o1Y*;*FGCtnC1G5H}E5=v!G<*S=3iFI{ z%47(qBQ&BTq*B+xU=Xsb)RdF>TL>}U)}Z&G^D(1+xe-mWQZs)}D6stM(pA(6ij({I z!+;E%JjZ9j?(+E++T%DKgG=%?YZM?D*1rPl_Eh7G`X-z;rb<)Kh~B)dUO!5lc7#+< z(!{c8bo<ahKL=ElK(g2z7>2-MHDlAh>e%KR@G8`f8nc8fBiClb?D69uOA?%Bvl6=m z010psf*r5Eqye4XW`o0SLqrr&ke_b^M21nM=b~U7N9*;fXKAtkyd}<~6OZo&p9%=$ z!BC%7n+h-igu`K&qqG=>nr1I2B;y1^A$S7;lol2kjh6VBr7Ww4jSR>@p3{M_ARyOn zMVs5#XVX&G(he?-2i4NrilyhAk50E6ql*i$c<2E9?u*U%@yzjAf0p16AgJD3MTLbK z)37FsN%4%dtWNC~0U-npUY`cSBuPo&C6`=cOzeqoJnmNZw10m5IZmE5F1E&dn}sPV z2U?XRy+P%r7&Ev(wl%vjsX}3XaxG@GA8kwc)72}M;DZfY@adtWSTby2Y|j!U$e}P; zizV))NfKw%n52`Z#*BCE+NCVVxO&nAkCN(vGx{@$8F-Y$ic?M$xx1?;Po$04{*+EC zD#X^7R?Ml)Jnj%`Z#TH||L*KMZoSHLrj4P{sZMOEYrxET^HE-2hIMrfU|3eW!K^$7 zh7g2R3*KQ-Ho?j~CkpL~#VrfjEBOp6EyNeQ_Qp2lfU4pmCl;bJ0QMa`WXPDc@Eoct z%9W$C0%ZmHa9AuTaONbJOq1mp7$n)?4WQA}!LUZ4R5+gAr+9na)6}^v^w^Gfzg&y8 z+qP@q>kkC5_?qj`-q~Tu#BFi4W7W;KVrO-=5v)^sxv|HNG&U)TDpY9<+*d=U1pNmL zNcsFNcm57Xjy7O;VID3VHw<n55C-SxU`Tm!c9%esAq%2*k7atzDk>`Qv*+HSN)~4{ zbi#tLESPBC0U=rkjfgBO)HV|{MwTsGrt>P}%0*-u@VIcKr42g|)}c7sEvW}(BW>;N zI8<AQc2|m0rNS~LyrPa<uly0VyJBIi;YE3Hc@qtz<tNR=s6qWv)8T<9BE%?s0!Y39 zD5#e08uh;8MI7Q)j0Cmp#^>|JfRdy>wD(j!`)C+T`&s{)CqkViLkNBMU@exs{5r<` z<0$~Zk|BdL2TNTREC76Q9LFn98ZlU1B+Bv3mz&A`k3L2k8=FX25XqNuWf&|&;8L|2 zqf|$mF94g`ORy(B<%)BikR%!YpxW?N3@3n^C@5V>>W((x$G6>Sc<zf$oAL0AF9WiS zeYLgNd+1P10Vw5WE~nq@k9DwIc8?#A-eszv4M!Z%s*i8ow;vC^^iRwfGa8^2hZ>IJ zykGtrtCpOO^1>o5fOF_*1Ah77BN$s%g;OR^)_q>OYZLpK=Q!{T1ELrH?}O3h4`9in z<fTM^xc>n>{?s$z7zR}ZxiE7qs$E?;X<!A|ELDZXKoFpS)6BzW&7|00nRl%-h8mY7 z(SHfiY6=M<m^5h;7>0o-98sTFfa9gM5M91}c^n0+8$LJuULSt@_h%u9BB`n@&uBgS z{C@1*y$64P@@f3`?%(6CKir4)8@@qDx?Zs?3zQGi49i*LN29bLAB`SG4wGY;q?ylV zp2s`)-+{UgH~xL_h^Al^RWXwM!PLg83U)LO{djec3j_jckKPo2Xh2N;5&bb5N7jKS zVgCEUQl^yDx!q)YYb&X9yUCn>m6+47GPA#xq=b0oCa>?fJkKAD8%9l>l1WMk@O5>4 z!fW2&dk8*VEv3V3(t0s=sr>`Jq1cT@h3vsHSM^Fi+qPTT1cUw<7*ZMg4%On(mtF=a z#Z`Cx9v3fLqHUHfE*H+Z@mH8VVH`jyF1h(OL?S{r8+;mY>@~KWWcm1U0+0#bbqWBD z_ds=zf3amNF2DUQJa^}9uv@M02ZC62^KH0j@giJyM$CKh2ZOlm_Pa27#0cEF`f?>j zU&X>mB!b7^d<(NLTMf6@oAP=FgCX!NgPNwcKAqW!ASBI#-LrQe?)t;MIBnQKP*6-P zQxbqWLSYOk$N^{1PTfXS@1-MdUyQ!)9xF95dCl-m@IDFJ{Xy7lHst5!VRwrQvC=T$ ziYu;wH44u0<sty!cHyx%-^H`<eWK+mBwNqB_wK_pFT8~NAAA@mFItN8S6zy?*1U&_ z<HzB;pZ)~bUwakKT($&LCr?UGF*|aBf>>?p-+prgws-lpk8@Z|*tGXR!k-PPEXS;| zqww{SW+R3HkOIN1WjUkg%JV!JmQMnXnd}4c>OHCldLk<LEX~TRbQ$Q2#&ATTJdVRL zV_>;fjN2Iq;n^=YCtQ6`Fih4Sie;Wv73IUHf~8x%v70=89av^h!wxJd008W$JFMK; zp@8N=_yYl4@QYvJq)8L8<3Kf9J3DdN@?`*}@CO4p_on}cd#<}0lSd54c{lwUmn>U~ z3B!gV6pp}9Fs1i|5*~-qYv~OtHkCFdm5=`gZ)i=C-5l(ztHb5D-G%$EzYc|}`pn8( zZo`D(!*KD^CEDw%j~u~CKmI8$UA7cIyWj^}En9TF{pDA9@~wC9%S$gtZkjTlP{0qF zQuxCWSk0zBn-V@r;r-$IdR%bPN}MsYKPnwo*m)lLRx?`tL5wXa0AU%hrtC6wMU}Pj zgd+%sLYeKwNYl%b#1K_UZWT~ikdHt_R2?6J|9$5RddVf1=)Oc;tWuHyZx>$q<O`fM zxPox{oCHF!d+$Cx{`9k$IO`;wyl5%DT(=&zb%*i0+i%57Pd|a*+;jt`O__|M!outt zS(o(FXx^#;m6$Sd9BMlhr6Q-<giU*^V<8XSxb4TQAV@M^-C2|HmO>BW+6+U`($WIn z+)G)%IsiT4vSAkt9FRF!#_{m)yE=}`c;#86htN|-4N;n^5`vF+AH;7`y!P##)#TwH zET&N!Hd@SUR&ScH?nb3O$Ve>8br?MvNmR4p2p)OyWt=p5A|{O-fpO<ufQN3n5mvJq zpcJcay9-X64VNunhG*Y>548=Ac<!#-amWAt0~ah=jNyX@s!1Zo(%_i2O?%s&)NL>+ zHZNKHFIe$CpO5o@@oW6{%GFpfeHuW4>+Zb|ZJnKX>GyYPm!P`-2$o%c18%xx6|Pv3 z*dV#n<3(9vA>R7)A5qYa+?y=R$g!B=@(1A$h5KYS!h(ogn*}vnzrhi22zj}=I8;-O z`~G-8X64y1G(QK=?>K<zl}ee1)5IgkYyy|9usfxY)N^17L1lRcsy}Mik)ubC#yNVr z+)ql>+DnRvy8~6Fg*Z@iP>aD$ojNt<RZ^Om*yHU4WC<Jh9KfiOd^l}3_<}(^@%D#! z@U?f~@dt7K*(-4El|RPmr!CB==cj&b+p!b-4pbu$2!K+G!$*$5=ksICsF8pmfOoec z*J{T2VO4lw!)6RA%*B+d!RU-Kc8*-Y*QI4uFPbq0V+IevhQmiNXHYrHHJL#ISr8!w zLq>X>q*?oFrWDWfX%oD9I!-9CEV9{X`_Hb<f`aWbJk}VF9GB-cvtJoliy4FvxO@S8 zy7NF<Kwo?4DCP|5hdiqV`&(T&ee@8pDn%hvXc@B6{(0Fnf-ZDAKnTHx{WY;0HWWmo z$B#$<`7+*q@Xz@B>u(|y5pc>>C9d_}y7l;G=T7YY=L-mjBe><S|A&A7?GYSqY68nL z7}mevw~RNkk|d$`NTNw9$Nh*;5hUGE$x43Tdu!L@hKpCKG&%6s*IvW=oxAYiqYuKO zZZz#(UAX*?yK(Ig&d2JrRwM=HT&Eqg$BzRcOyYMSMq2AgQxkGj%~q+8=C-ZVjdr&O zvzMF&uONcwcnr+X!NLJ0sBkD7@&5KsoIFJlO1G+wowEf?F%(uB5&(!uGAgo=I?UCK z3KBPEssJfrAj%X0uLpByPQ`m`H^LnjkY_dHzWeTr^D5)6iKhc^efc&1ykb82+q!LV zIvp6l@+yq08iZ>uU5WEoUYs#NzP08(c)VVGv34Ck{`515q6m-23!mQ)Ns_cg7?x!r z2m;JzGeV&dOgs;(*$iJGfP)Rq5CJp=!zeAtL;0Y=m^fxM%9+^p|I_tXV)+ff#Yffk zxMZ@iOO)vKgRz(uM<La^*8ONPnb6eKgvkTTzX!{-9@wy<8NW8@awX7gJAD4*?wl^1 zFoI6&R|3{z1{enKZ{LrbyZM_JH|-|(tT>hC+bn2PYn(zlFVe5;XGtRhh$V9?jA00D zW)r?SSQmRR62kBP{y2Vk`XY=QHWcUn?=NuYHCJgH?&>>#hsSUE4RW0hJpbMYxapEr z7}Bp2zCaK+T)Z+3SSR0flY_!Bj)<C2pp)AIVUB+)mLPFX;*u7Ozf(w(jPl|lESfa~ zAOy7y4fyl(FXH`2{(^!WWg~BLwd2aW?!jft&%mY2m!+I<hBeZBi9o4ia)JR=<~gvl zu~k#B>Fv?d(t#00`QRA_oYjnm_AbmQ$=86g(d&mKQ}oX@(#5PLJ5NLm#%R~hP#9I2 zlwhfIQCeE6P7%=w6GZ2a0mCXCNAewZ6sqmUb~d%)vj!J!d;R3}6s*sUcfQ(yu`EH8 z$A|m^6Q23)FED-d2$%*9PiV2FA78Fpk8d__!Aq~cj^>sYw6rSSS!A7IW6~?`P(|BT zmLyOBk#Jb)G!ls@Aj)wFNHTJAa<ILo7C*V?FW@;IIXO8f&aq?l^2Jzw(o8IxF$FWn zjl$aPyHVTe#^8cnogGUddi~&Yof+ARCKC_4-LBMS_vCgW-x07pWkCPTDcJV*gva&- zL&x1YO{**cYc_%5IMlYf@YUW!8KK06x&}-cP>z?k>;(V_x{S1Dj~{~z^Lk9h4y`E0 zuDZsUPLvSAzc*~eM}Pk--u-GF23J<%yoIL%0PcPIIgB4R6sOOg2}zdG($RsRUGPJN zk+Iw2npTtK8-4sukqj`CB}-)MU55QiOocP0ZIN|+f+k6S=w8FJEGCW|0Z@u?IE)8g zcnL4x`+E%Or+E0`NCfvk`vMltnt?0M(aEV%l7{+C2F%9acOI<8jIw;llp5A!Z;sXu zH%jeREFL-lAi%xN?FJ3fYL{DUh_3(YoGsf-*w|iSW?4+1JUKJQT)$-5_&Uod1xvJc zRWrsYeJTSH0oPr3oiTI}ukY;b1Y{Y{y!SEwc;+c!83v;V^~c-^V^Si);rb(Z{jIn0 zmq-7Gc9#o&T{jqpVG@KEB9VvzETjE52_XiyKp(>mwY6!+K{ygYXIB^6T`t`C(BE;_ zlP{tuF9$>W_k&C+KCZ6EPiBlWTpKwUf^4;@%08(%ljwIMgk(g+X1iUSP+)oX@XS0* zS&|TO8!6aB!4Nva;p6Iju9-cNR^{h_v)KTKV9l1j_(O(&`^NVD<en9$(&%DmRho=a zs%6LmJu4rnD9pq5Lr1k0*Vu3rw_J54Doaao^MjA#mMd3-V_EnE0le`32Uz>$KL9lq z`>ONL1;??*?(c?8J(+jJB;WjdosL!eHA?>lvC6bYMv@~c5)e0kA8pu(Gw094#8D%) z<e(ij2eD%QJj|LfKJIhUZBs~p-53U)9v}G1B2|aA_vP*y+Pl!@^}!L{RH@?inOGK_ z%>pqH!oK!S42=UzhUc>iMZ|-pM5#fCx!e6m1r>!_Bq`_7%yF1JLfO+kt!tvUEr}&v zCFsBcfX|KBKK%;!t(Z>~16f9nJ}X#vEx%m19)En`L9E~KP0||5Xp`>f&!tu?@_8P` z7Bie2hg_2hL!FKUdLIB<Lm}*Od%%DoD2dqT@xmR6XuvC|iG_p^xZECedVM%h-vCM} z_P2FncS{Gxlp3>dMUNNeq5@+}5+oXLk|e?F^@1~*vfL)RfAI+gmi7#9z>v$8kTtkJ z5IC;R<)l$n^z0#(APfW6X2IrzN3rX0V^){{i<)}y9E<g}4VprQiRZO45&)1R*=NL> z)i}=^UvI+MGpC}|Va54N79%VOD9X>n+$l<|^4WLa$N$~>8w{*a;s=BRR*Th0A0}+- z(T){K9%Go)UekAJ=w<#iuTBSwdR<mVmrYF6$5q2Xk|YeQti+hAA%@3C3?7UehrQ?D zEee!z*DV+ct6!b=N%QA#4%DHc%ZJJ3N=e9`whq{NUQ3LNND^v0Jy<$ypyBU$M|LG6 zazro~nS=m&nZzt*31B&dG_Nal9U()2rjAZ<EDN4vaq6k3V%oH6F|Sfea^L#8@Z9_V z#)1+B#3GV}^1=ecwb{CT2X6TF&Dgkkv%!mWI-LlI!<y$<VYQ;l=|G{`jB$CnFte;e zZD(-5<(W(vu2WF!2uJWyOA8{R2nWZb*6&Ay->-qEp5~P)#f#ha;b(Iv8T4?eBt!HE z!08fzk|szI27(}f<4x#M=@&`;#0dkIznV3J-ZSr{j9we@CU%)`jEKioChVMkB?_Hj zF+m^%fB$f8*5B>j-8E!nSrPR}GN4M9<v47H_+_@WOh8Ofec#b0h1MegWD#F%+kq7e zPgT7bim}6nVeX^}smmFXc|Y1lo92iI$?qy?8gB5oc{Ff;y4OX$OIZfXFc>>xc(fUj z_OhJZ9DQqs%)S7L+v)Y+MU^e2GKIrzQj70<A1njG5O{_lSB*cm`$MSAv4e0N#6S>j zsyA4XV>ATVEXxc8f6y>BqD++{_-?KA0ASC7AP9KunhQztYpDFo5=N65oH=F`F24BU z*!7Gg>DUtRp}oBWYu0YWg0qznh#*M_s%+W5!$)xauYQNGw`_ykqqNLoSr(<GrLf!W zsI9GqD2kYvpO5AJD`90>SXj1Ku1kU0gxQ6KXb1!_v$zN$NkT}H@Ihk}4*C3O4}}b? z!5<Ou&+P{=qkkEutD@|HQmVt+EJ_<M8V{1{YeZ3rmzqpkrxs+gloO&oBq8*3!hmH( z7M8GH3s$51nd4`(T{d|%U07KRLI_xg4Qmh7;kq8aS6zo2oW+c?e8timURj3v#^%@> zipr5?0X9{tELcR8)QwpNLLn3u<YU~hp;{uztVt6AmNC{!>Q`ixc1^Ll8vae?ReqPf z%VduwqZ8xjO7lEvjDCz4IOq*ZIC{<0>lYCPl;zlA;@G%i`Q90|%`P}dtouY*l2GBa zD_$T44tIJmv>;c@4A(r%EX4?<xUv^flE7vHEI}V&&w<b9L%tp$p${u7_k%>KR_0aL z;il)DbB=21hZ19z0O0rFrH?+tpUys2J2^AQ!D+SN(mU?M+h1)!r$=!T7>2=^(WBvV zxey2hAc~^q<xMQeN4}}|Yhe4^ZRn>`!WI>Xe>i9$0-}g7TibBZ>qCvsiK*>yqrS_7 zR(}xls`?{GmFpDUKA4K~0huPrkOlH`6c3r@IBji{lwky#8c37020LLy3C<lpJfqi% z;jq$ZG;Ta|q~W+Zm-$uw01yzCg~aoC{?m;;-dREsf%rpVG<Pc2q`#vB;W#mZY^m6y zTn7k%n&#FRpveNpjT#At=at`C7OdH%{LFFczv>bH7|SYIsGRO#S>ut+v-~c5lg1s^ z7$b}qqSqhsbF2NXe>}<jCp~o6isKRw-Q#}M!-<xTI4!+j2NwuOAj(t=$82e8L$1XP zs?vN1J3R@>J%nWv5=XlCEMxR#7zpI>001BWNkl<ZM3NMvHWO*YpbwBGg?1!H-BD;7 zsL|G36vcU}P{hiW;CWu5UWF9pZ9X@iTJw>SK@%ms@X43>Wa}=teSR<ugVNGcoOR}M zoPX{)*!1-}Oc*~7ot>SKR9bm}-QIW0HOXT(j>F=La;zR!1(VLuqm)9FWPDxUj8Cc$ zYbrWak{|^`>U@!egJBq$OeU}#ADhpp{;pnUmSI2`MUR(ox<l3IC5C+lCsy<4N@r#b zfWt|24g->mra<tx*m*CQJ&DdN$p;t$&T7WTyQ+KaRmLptc2bn<pa9U{X~*tnV?dvZ zB9Mim3ac)-_rKYyc#g6{4KXHDa%s8*N{^(8S!O`L_GJmle<NT<nE?iXta|!-k1;-; zsR^B{*CnMqUJpFV6!iL$mKLqQDy6hf5`4U&up*zRj;>G`gY%r)((^?GR23Mz5oKFn zNhQh93zlUV$dtmA3E)a1;O&ChY*s-r3EijuBFj|sR?j^1Or;Ju5=ia_$uf=}uEVwi z2Z3>eAxJVl*n0>Pr6?+^KwWJu#*P|+h4bfQ&dH}>;lc&TQENS~zWQo>{>7KtC+C@X zgH~-6)T7sx7_K{2mk-qr$cmUb&2lZ77zRU~PV8~J4K2_7;V{0eJqk&tSTSxG%p42Z z8vtwKlj;jc1Ob8|D4u1qO!}y7U^<3I{q6+O&Lrf-Ytfa!Ob9|k(oeE@<vZ;z{LgXn zoo5cN1blulEDM();f;0MdIb&KJ|)gkXth9;Wkf^?Cbc$<O4*l4*ezzXyFK`1`)(|l zI8NCJI4;&@qC4re_>Gle5&=_toQcIBzV|AV&!ZkNDU+zr8sFZGVNwgQ8#awpZUKp- z(~%r3RhqrNu~|pG5|rgRdwnW+hCz{90#euI0Vq(aOA>JfLKqNNug6-mj92=M@k&+& zkZ>k~CJY1A?#8yQTXAv`Np1T8FmWt$>^981@lN{rCm$<~)>8%E!a=<7-Y0nA+=V0} zN%-pEQIt4siai<$;r8pV!Stz<G3Augz}p-KigCq?vrte_fX>cNm>33*!ooN}M8faM zfQ2TZ@S}h!OOkddLMZCbGBuQ@^taov$L$8C6hns&MNLhOW;m>^J&KSd;gV@%K>>)q zAd>aEWEcjrEQ4V=9ZgHJ&-KyTqs8v86M}}l|I||wR?*juO_=i3b2#^nw_+@a%Y~3D zvA%L`m*==Rk6X@POqpnh0hYl>dk^;7dkd087(!rIE#OvNL)M;T#7-Ej)a1Rrev{gB zQUyq!Qx1*;cs`Mu<N4%={<(N+koi7F+3k&;45-r4vGJ5_N;)-;IyXEXN4LhmC&MVr z1H<6Jp@Ya(fr(>c>#(;*OQ#2BmO;My8FgJ=4AcQ~gV&D<Wr<?o*_MpN$1DAU01BYE zD1%;>EDwZ($W0>h9=}P;lqxD%C(Qwb5YlF-goAi@-9{zsB8Vu<v14D03n0KRFa803 zbiw(UdD1E1t=5G5$ZWCTs;jO7r4-Z4%hlFYOk680((U?-QOYs8lVKPzEDO$Lg2`%y z#o>U}>4YsO7xuh-I0_2jC@h36FArwB9TjQ@Eg=M_owg8n-f@QkcsJEI;f);!6gpNA zV)U!-^K%>yxZQ3=EJIJD_QE}OLV)G`fkrWcoo(${{K{*vIUU&0)TDq#C<OPxnxqnD z8<TjO|LHMr{0Lf}V+R$L4&R-UgfDm1^g1d;l}qY%1_Bkb&xkElGYbFl&PUpYh)Bo? zis`^H6<`|TWlUnC$oD{*dXr5kxru@$n^_z)S*$o+968yMA~~ze>w{CJ`Z<<?nP+?T z^y^w&Fte=YS+=V^Dx>3Ymls0|@{&wjcI!#-8B5G8D(Ks6whX{hIp^By1Kolp$1r&9 z)350DsuEVZv2DjrtlhCk0q?MY&OiuDM^}L%1pNjKfU~q*Y5Yv$>YLSZ(M1;l0E%qZ z|JYj911iV!FxzYxU0w!Ot;e2s@;uz|zdy&wks}Qr?&mf2*ihG)mhs{^4h+Ng`qw@o zz;alAtj1|WV-v<b{uFTsLu5<cVd7F%d3^QtDa$14j|1hNSws6n4urJe^T!A3`(!_5 z2?0Y0+`3j?G}@>)i;<(=SpHB5U+vnfY{)_+^+uc2)8vgCvCb1o8KeAuWaecW0JED| za6G`J1HoiTSMdp0Nsdq`h|y~OV@QxRUDe(ik|2U(7;vhmxUanv1-f`-lh<$XG<!0r zEJKP*4m8`WAVB&SRvLw)B+(2mE$kL7S%zTV+&Re4%j@=S-~Q;|_{#;S696c7+AwQy zC5jw2$TEdBHy<!rm3uA4Jv4gsXxOdRge>9z^vJhZkgGOcIP=UiVYS)t=pzpsyvx!Y zJ6_+uU+bn6KYW1z+S}W+W(>YFVChs-op-jiW5zSj8?Jaz5Xk%0H3=O?qN6zy0sWT0 z|9NvJ(Lu!pkRxG$Fxc1LfiHGd_xj3>b|A6wTtX`{IZN*{Dog+XU+><pY{*o~jPlca zjtrALvFCe`>>a>NN6p3qU9!yMEC4a77poo}E|<3cWGeUiJ=fv(A|gq!n|MSd3BHJc z;e|1v5oH-R{@7A9#JKuO00;#`U>FA0OcI6Ed(NIlM>gu|iZaEIE?$|@_j>Y`Hz2DS z?i|Btv0;`WDDT%_0m^PznIA4&hSKtiZ@q)-bXCAa>8wI9fBt+F7svE$MM+5@dSiQX z@7!$SA*$@$_h6Y~)O2=X+~ZFrz1CX~*QeC^+~o0n>tY1+#|?uV3<6NHOh4FH*9ZG2 zp#^F@$7$xV{cw}fYR<B^<?w#7mPES_9ae5cNz5#hHB~at_rTcufEhp6sgkIA1dPd! z<Z4U%57dBH3-@K3J^k6;2uB2X!Vy&E=c2_I1Obq%*5*l+VqhvE?kr$i3?@p<5lMz5 z%iy>SfLLX3Ea@`O)p-dCBK_gH=XCp)Tet5(T|;Bi(-0&X<rU?M0YlPn^+U#u!|R(i zVRm5w%*OyUq7XqO5J1T1MK}<EoTZ$miDeaaC!NUrIcJ}(84_*2078NYPbiGN&90>D zpsK2>*Voqx1C~d<UJQNgA1P;NP2J&?f7>N~yE>r%bLM=?u`J|37=#eCc>SnpZtoM+ zh-zk*JM9R>CG}*R5v%tsU;g9^WpPKs-RqNn?=^n=)NCrlCDRg~?n-)+9P77ijn!D1 zO+9baonkb0dQjoC!_2X$>+%@lm0iIw%AEFe_?6L!k5>XpSc792P46_5(Z3{h=Z|Ox z=d2miV9B5s_5F`NNf0}a4xVL=`n+jIPJTX`d_H)BK`bdPL79n1ZI>INEcVBc-;aRX zgOJ~kNHB!3-w%IR7lbS{w^^3eosR;T<>lq-wW6ANvts;k9C9U=0T$=y8jOzb!BRIq zTXiAr_sC;uXJ$iZ7Y?O}OLhvvxAxta&lpd~4yu402rAN@gy8S%xA)oSRjNrjIc5{Y zcp5g#j98o5qyc6y96?=Ei;~_R@_(<g^WO%X83JC$g6&DJdpI1?)|@EIXma~{^|V^L zyx<rH7LJ7=%i3B8l*Z>}4%;!kKb2)jN#bNdQG_VVifBM4a}VH$r=5(SKKMMn^@aCo zs@I&paA8K@Ys<Fnc<B5^-QQf@ykh+L@c@9<U=UW8#k}HTEGjF*Hw}$=_uwJay4`92 zUJ?XEf`J6<gUT{OUT?-8rpctpAy!vcr~TrdP#7}@RVIE9NrvC=2O&(adzb(9V0p@O zFLpa4f+UeIQ<R5%n@yM&Pf;43N`VjvA=uN>juyAC&rrprX5*Pz77<Z`paaaFWW)~C zB`W;$<Ij~JS{v~FIKjNnY>rf517LKSlHem#+Uw1qBa(yxc}k}DzP2v(%ZZ7U*iAev zsp5ngx|T}3GV!%mwfNnUiSmtENs4n=tysO{bbS8EJs2=}Bz^Yt?Nomqu6yM}Iy}SP zynFWT!>e2OCHK;zhD!$LIAg{P0Khk`N@*QK2&NVl;7>EBV~E{`7kBT$^Sk$=BZbou z^7~RU+LTg+e3=<X5t*W@stN@K1qJ|3+|y+gCXp#@YImWzxmgvo>Rou_zAJmdkx;lN z23Mbr%NEV1b4FJ|_Nmqw0sghK8jtqjXGR164igVbDVqF23{dGQEh9DyYpgUc2M3O} z001`cQ!PQC8wmOVs~z8u?*{<vudW6tMZQ|r!7+@X0eNo>cQA~gYVZXF0i%lxdi5Sp z7O&KgK?4VL|0Wh2V736^5bnKpHFE4W4C`NsX`@GA(#6-%Mpp-Nb8}&_m~rOPCEdPV zLt_&<I=j&5>B7R1gOC@OWF%2J<NMiSv7jI~H-T}ouq<w$ItAB`9fJpU?!w=<Z->KV z!qTcC7_6!Q3E?oLZj5a)5<w&wgvpw^JcYMfanpkjV#t^=$kBBzNmiCKsw{a%alX@u z*49=iy+ObCEPFH_IdYUFpMY-%F6WLJ3Iae>btX5|HKL)@)2Cl1M@=k<THWmdqm`I# zMy%Zuv-ox&Ivlgq+rIZMzaPr@*E?%)-E}_$2r<OTO<eEQ!To>s&O1JeI{oAC*<P~g z3F(z2^j<~j3Wy@2*syo~S+IMy(^F49^*jr<vtw`P**kUx1eD$hr1!GfzBBXtV>Zd| zW)pTp3VJ-R*S=u0voo_Z^ZkClpQn7DMqey3&KKjexxH=4L_KAm7F(x`79chzCXBtv zO0o?E^qGvaMDf!z|K!L?<48_S<go|u#}r1*quFetrnVMA5U@Jkosj0hjxt?(iZU{= zbrPdYG8njf{5U?GH-`%b74gCLo&4>`pLloMcC5|eiMqIKwl<yKP&WFsB}|$zgXHAo z0JnB1(A!>J9~y8qDhdk=>CkEW5VMTT-mj@+K~ms~MAHwkv};d1N*<J%f@pUli;DEz z`x|!j`f*#69#SmIK()Gpl6*W~h(K9I=a=NOdCxw|YU)T&N&ssk*jvC9^@n*j_7v~s zm({<vGli@y$|}l{B#ETNL?lVV<MAp|S}GL|hXacx3XjK&+wCShD-(@IgDlJB<>cUW zIZ5zyCH*hji!Z;zmDk-!i_MNvr@`cVwv1X0Elzij9jCam7K27jj6qLji=7F6ncDk> zuP|Jcoy99badoQ0b@zGPN}H|_mX?^n%YVNOF{>cFnoYp0)gX!@Dbca)u5BbUE>QQ@ z5TQ!a+#`?Vm$%;Ra+?gZnX?KDI4&ofDu;vn*Q{f&wT1jJw7F$j#_e>X??k}C5FL8K z5fii!QLEMLuzSgIxrqwOEY=7Dm6er>f@2T6`v0fE@|~L64q)k)`?kt*>WD)5%vqB_ z2Cr|mx~{Z}CWo_EQCk2Kd~UE-VFFKZFh0UGZ)4D4T(@nf0+y}pGP~#x^K5L{ww>j# zz0Qj7zQ^fw5pA(xF`E&*9tu-asBg9sZ#JP<tFgO1$b!JuiVC7lChA&jXjCe+Dgm`h zg;uM@D}zz3lwrij#-i8jF-Mu1e#8;v<YuEcnb8^a6b>AS)8!&7BLlP9^rskS-~IR# z4?OfRpM3EZGscdjFgt^9R<<uh3|bA1JtzdyY_(z0>xePvXmq;Bi9~!L3~>Zci@j5F zCi?n<hGkkk49HX#lcL8@&sPIRGjRz66s4Uofmd6$3yax=(<8F3w2Em3fv#Y)(Lk%% zc{nV~5+6@gm;(2)Ivp`O9h<FI7Nw?y&(OO7%YCa>l5zOqz8XuvTNDI(g_-F*@t39C z_VAO8h?Cp0tO4Ro22xT|6#ZFA?9u1?e+n!=udNq$O_?a0{9H7HEPcy<PCR^!GRPbb zWUq+ZEAr*G;$A(bAPBNb5CRlB^lCLbDr%UWof^n2BQSGNYWuD-zuL`~rau(BJbKQN z%$h!xq2ngAYtJ4WPA8+%(|G#0`J`AZxV&DBS}kgo3a=<32vBRYqt~c$c||;;h^loF z;v1y@-MEDTmMFGW*U;j2)8cTj_LEQe+-7HIO%1gzHe$^t%mxFpO3mNzxsyc;kNZQ9 zvFBfUnX7KRiKb>N&)sr0ryez(qb|RRf~<B)N{vd@)`6ra%;s>SQ>!p*wG=m6895*^ zd}bNO0#WP&*c%)!#*Z8p-oaEVNKA$JWM9`8xxKYoq>YxX4d8O1R;d`66vsMW?ts7L zq^7htH3-9E;^W!X9KQ5tc~dhbjZIjxGQ(e+_{7vhxmI_6{~a%H-@(AbLT<kK=JvTN zs5$qP5kn}<OlM$D7SDhF4QGrWLcGsyEqlG}+qbXBS>^v6SOR=hSI1(%I;V7trO%Fi z?%c!W!v^O8;I%5O^0%@oDw?dl?h952HA>BjjiSzK3&@s}A}pgBnU@jpzR5ocLYASr z6mkarVV(`GR!i|dMP@L`V&RS%Qz=RcQ4{A|d|UKg*TG#sBXm8T-Q%Ib?!fNrO{i0A zc>Jedc<Rx||FB?bv)Os~?YFq;uXp10czEaDTUj)HiZZFz))KFl0L7hFXLHb#z1E#B z4{-)PMy&>`%Z)`JzWY(~?jJ1OR$Hf^m9;oH=bZB*J7JZ&Eq2*$Yg7vI<D)I)C&uyR zwqj~p>?HY>$ap+ngv2yirBWe^;(o7qc1})2uG|0a-c3S;eMw90cAOOzm<FWq<?p{! zW^F+&2*exo42+HC{m;H2CnqNWEYs2hOGJj|Wh;w;tV}Abb{_wJ9al^nOSD1HzS=rc z;s$hJqdj5&GYLMe_Ck3TF24&oGIc<o9CyUPoHn2o?anq<`RSJ3eRBM$ph1vqHd1f3 zBlxXoBNZkv1;q<m2$}$FO^VCu4`QEw@fD)4neRPE&0>0fUauU-q}7rh6HP&4A_a+w zWXHww*P~|f&6+jbdi$M!xG}Y_q?D_#zJ~Lzyq4tHXx_a0<~E=NsBgBS_M56TDuJF% zzVM177QGIGMomgoWLenKev0lTkGIprw<f2XA1Z1&^PF?~_JX?{N+W6D^tm(1jI$ui zGQSiniFKF1^|}1wroHmW!aRBFXYa9P%NDM>>Z<+H%c7zp8eHMWk}K?XilU<<I`v)F z7F;s?Uv?JHPoK({#~#gB#~#i5bC2R56UQsww-Zkc_)ctWV9fHwnMVL{%8}EUI(j$_ z4i~Sj-3o$0gUvy1ZZ4A8^I|jqb6~l)*(&_tS97U1^o`Q~k)sOR2e)sf`s=<5s+(<n zl3`R3)Nw(lR^t^#9KmtRZq!@0x>R0x>s@UAfGMM}%Rh)ECMXFxMM;UAI(lTE9^0hV za`B{zJhbd_Y&QEJ=9(>k?F}Z+n9Y~pe9Ohh&*zz&uHxv!#<#DR98MZr?BplL`adu| zs!_3_q^eE#H7`E0$$Nip*skK0pY7a7W=3XsQg=OR_0?_OprvOoVU=W(hZPQ#qtmnG z*rB83t#3TT7Z2afbGKYgQA#3(1qD3x&_lfP$}3$0W=2K^xnT&mw_2^!NuoY7X4&lV zVDfrMMy4=2nt{>L<X9}EnoRsqu7q(cLEgS$!`j{47PE<rWW~)MWi;~Y9oG{VZ6PW> zi+_B*ikhYtDk~}?mf1T5mYvw?8@C7zK2UJ>K{o8P5k>OgOeF{|I-JN}uM(@=zPHbQ zbCTK6foaNsLkt#FkIWStV>Y&B6xP($bM1qV1a9E4K|}Q);<?ycQUbu-qC!O~tdH%; z!UF707jL}t?m>U8%E~J^|NpMw{7Wxq^3WoFeEOd}eD%eQA5s{w-In5g$g)hfU#6x( zqwbI#b|BX5bTTMW={ywEmF{Xtu<Y8K;^}1J;ub~LRMc?nf@Avj!b>7FwfE$W%gW>B zrygU)6ZiAtt=Dk+yjc|GWfPl}4AF65G(kl%085rE;fK#Y>J%^y1_Of<6T-jlZcoI5 z_}iPCiPMD!SgUXD$;b!{?`YH-RK6stlaD`65r%JNot7xRe(XM+)@Dj-8xSRlnwlC! z?;&Q{V|K=t?d)^9D3f|$!{?-_W83~O`dH=4z2#IlxAa-viau!d+u9_zDkvTksVg?l z7bDU6_P_jt&-rclp1_T&%fRb7=%0zy6lFp4%f6C+IsTlY0%Td{*EMSo>g%*}^{-5u zGoR(JzRn}pT*_;ATu(|uT*#!2O}qChfA{lXxV$2niLpI)J`T6HEz>(v>#}r2mKEim z5VpRm4q28tcJkQ1z4$H7&<X@PJ;Wsv6&p|D=*gIdjDh^&kT*=p704I}X}Mr&cVixY z<UEd;G@;WUU6`C4_Nfeti6$>Xw|9-xMM5VXS{i+g@BNu%tBXqIYe=1wmk*f(mA<z= z8<LyJJr|wPP6VRNc-^iZzx4mJV7aETNjPrfRz9G28N`W4jFnq8R7Hmq$)m8!pZ4@^ z;eJs<;N;Y*mDw1iY$QjxBFjpSZ}qI9QLC{zU0nO{Gl2;V9`_$Y1}|lRGEr=;?jI(s zRjVmTOyrGs{&P@XADhk2Y3H2Joa0U))@)?s>rZph!g*-Ba6^_<*N_lx4ge*MT18oX zbB~-;d0iv2ETiwP$bn3!a&R8IqtnHs(<`D@sTh=C3E5D-*UV){lq8P0=o-pALi;$= z=@r#1gHcflYHiB}ftj`{6-UpT8*<l1gF(LflTX7Yi!Mo~*k%j+)EnGx+>*qM%+T4h zO>Q>=Fk!-k4vQ9mF{4K@ar{^?M?*$_!0(znX<XZ4O`{TUv^4klrT?GHhV{2fyS-PL zT~11(eBFshbzqg7Dr+gJZ|W0PDF}k>&m>!|wK1;M=?)P2h*VHL)~_~jWJWSkf{L$K zt>x;cmh;aGPV*Zn)exI_P?wT;e6D$q*nf(_Q}c3ocGa)gZ1#hy?(*}mzUI=U*J5|r zx%ZmOIC;ug;=*7RyGzSSu$Tkleol{<w3wdBLa%LZAvrdtP0F!5CV53vA$nbUTO3_7 zQbB;~sw&b_>L4zu_iuveh5Bj)1Xgd^jxI5^Te~rs%m{)Y$3<J1GjS|hjT((w&BCdZ z&}nr{`R+UUw{1JIU2txPiz;YTpcX(SU^400*We({s0mnicx4&4BqPe;k(B=fY-ngi z5CqaYd2Z^QPLA?v)CMd}91e6kEg5O4j2Jdl`J*LPVa}zyl<VT>C8(;Zrlr2-5Lo_^ z?DUxv+d6Yd4p&=N-6xxO_33#ecH*Ln(rK{;B``$lhSmC3^d`NIn#L9ujUP&)*}%V^ zTTXRF1@~QYcDqnP<zC1edeGjlfqA)T)M{M)*tV^;97WfIF}(w^J;i(Z=cCJ5{@NSl zW@qx=gMVXKTKK@QZu@TXQv<hmc)X-1^o$#}tg4Q9t@?m+YbB2-Bv`teyAuCaGJ2Ea zV!>|h8?dxBgU5|ZB_K&Mrm!<n1Fz0(Uq_R37tG~>zuyTqtMVIsrA+k>Hxtjfy#3o+ z6@p$3IyHj2T`+$_UMA0exSb`LDV-iqLg^=J_sUc{928hA7&^%Z*xb;-v2*8jp#IfW zRZN|77>_>i50d>$xh%1eRiFT-M{(iGvW!8i!QR}|<Cp(`)(zX+Hh<DcImfRnhu5kM zyfynODQ~p)sm9*00ilETYC&L2X=MkOM<jq5?E_+?UPrCnfmWqrV)_6U4bJ1$kH6sL zo9|}pUSAB*-U1CZ2kkx6YPIC%WaE`2ek|VGFXs^FE3U4tsqOdc@$&0$GG+E0UVP;> zE<58CzIyoXh=3Ac!>-~El4M%78hsBf2I?BE#2fVow2x4=mZH<urB-rrV>1KOQ_!f@ zZDkz2@A_yj>yTubm8(~WIm-u5^O;%Mm<$HRD-@fkxHR*IKuQ(}5FZ=E)6YJK`QOjU zsyG9xSObDdtFTHx20v?HHZEDF)b8jKV6=jOUL~`(zJcQg<s%q1AuEUWSgi~TW|lG} zC&u&e{r8fY(Xk~L=4eGJ%&)3J62)F|!yW?5Ua%;mL7wYtzXc%rvC0oN?d<dON$y0H zIU^>Dh7bu1as(N%1Jjf^pVRHZ;T37|xp60E4B(n6qgl6g2eU4_k$Ycy1DnICl#(38 z$v#KTnhC(_lKv@qX$_zCC$rpByqBXEEaKctE~6+Xiw_^Vi@VNPM0|uvG}R4_h?2zM zAb@pwy**ZDS=G>t`2eq#90Dvow$1@yUz3&1H4RJ{HrTguA3e{0vC-s&I2!8e!X%b~ z(|l}f3`JS#%$+<|*{2{VQhbT2V2%ZslNmFnbJ$^rp`E|5(|e^c7<uvTzhOS@?ERj? ze@ZIQsa4D_%tmF=p^7soY}L;iU2cv!;e-y%(xB5)IIxSBWd;-E3~qPB*4E;2Iu3#5 zAHkN)m=KT}FZ!{{TC1(kmD>k&()c#bV#XbUMTVnl(rO95CcAEr7g?4m^>bY%n~hvK zaRf$5<d!F2<ovrIVt4UgsINL`@7-x9F9wuygnj`_WOQ0BNr{R5a{Nc1e3~h<=dj|t z?|A&iD|zp(8<{%1dn!y{u385`YII<nx~HV>>@GKDjaIB~55HH|Qqt6dtsB54%N@sn zrwi4d)n(O)lEjR$BU`CV-z53?B_b7NrW5N4Gr1->o-51TeaYF3E(!raW{Z+6BnV8O zJ{|RxnW%C@1C=T>hhvvs%UPFSK}BkM=Zg!QgRd)VxMRj-#`;8H1dR$+j2>0A4pagy z9uJf9^E*h}AxYs~TfcG=qh8l5*|3LVmc3x(i*nlUwI8eecIUo6Jr6+;WI=$;n5fP^ zN0cONZcpIqJc5E=wMuDnW_P*Ks#Vn39Bnmkpd=QZHL{40cI@TNufF5k-!^d7X(w{& zUv9zNhf;&#+F=tXFgP!dDr-x>9N(zbGI_+XK0of8@BW7eA6dqlb-yur#86f|ayLa; z83(k_jk}A{4~Y-v001BWNkl<Zs?{CJGo%A(UQk-wz_%NAU~{^tXs}}Uiu_Vi$uA|9 z7<Gz@k48|sPfW^8A<<+YD<-O~@p)**7K9~|jMz#4+kH(|el4$N{GbAs%$d;+VqSOn zBIrH9EKiv|jgp#rHg4L?u%SaDVwOk}GslfWtx|Vz(PE4Oj|&j6*=z_JjVx|lCrEob zdc@R+&s4r|YvF};8yTaKm=jc|S>bT<*p5A1G=3zPj2qD*5lb*=P-#^Bw6T<FlP7gt z97tl=4Z2k-6|yX&2AZlX4}s;uZdWauEf393YkS`st6W)J&hFZVzGszPWK`;Wg7Q0S z8W@@0USAbyMyy7o#^V(kI3NjE2v%y)s988Dmm!I9e7IvDH$3_@%RgJevrj+C__1RS zN_P3?3orJ|u|1;5q``yx?0CEO>|xnc&+x>*pCvaVjk_*Bi%X85PfXN-H}9@%Y-U7W zMh9lloy64^r;DdP`i`=?CLC@LmZ&K7dOedTPbNJr4M9*^H@TfIydDp~u3f`7Wwo@} zY{VG!=mZ#<l1Nspg}k6vR>6{Yo)#N&C+v4mLo=czbLyNKfh998XYYfh*gh_Y56t1# zr<bEoO5HzL2J6szJ?OPs1w?~^)D+cL!)UeoMAdbng&xFptB_k-kT$O6^*K|xb;VCS zu%j4_EOYtLLIkynT91bZ=1pgAes<?ru2J#g&K;a|)xr*b79^2yh2Yg{HD0fmy2eK8 zD|)_G`Vd(5pv@UKOkR9M`{XbAB?+w9(LV_zgOcJp{Vd)mf?OXIpqIUoNkyquDm;k9 zSxjuHtYvn7$2uytATT&7j?9=SKHOH!+HE_SJ%0fU<{!=NxBP|t+}wlaKAwL1X*{y* z@qRhBTNH^&P3`sLRM*t-;U}N**Sqhbs;Zi$OHSn4Qx+=Oojqi$wrnRY&e9=KMv~-+ zyV!radK3F<8~Nm;j~I}aj$W@vtyU8o8{0u14WOc;0*}W-b7LdVKJ#zZuUp5rYu4b| zQ%ZtSPpZYt#Pk7V$664B7KdJY=PvjyH4Olqd+eN`RZisnIk)ZDfkAH|JKU}vetM^A zi3zOTx`W9RCxk({g2B?=iY^^jE-DqoDGTR>gapO=wBpmyM0fofr1fh6NVk}IZo!e% z+8tQkUIv&9sMIQs2}231#qHsvoy9CaZAlPNN&&xlf2P%H@Or%w_wfwZ4#g~c(54M9 z2z(}6>nba1C~asK`s19kqC2l^Eb;-VI|v+QNg@&*t0bSB*XeXq*4%X*B}%7d@vwoM zJ$ew)YJr#Ec#BEXX7SLY%P1?aI4JI8PIeZPCQah^%D#`S8e`*_cYN=59$EG48m7&e z&jpuV$+)6?{_~H&@{dc-?oprwSif@*Mx8ET@n!W1b%)&p(q}(x-o*nCJiyfHGbk!7 zBquwY%*@P?KnakVno3qy7Q;r2;Gstz<<qZM@ca4=9JgQraVcr6EwACl-?y>+_ibz_ zt;FRA=$@9&pW)(0D-(te>d3sik+hbPmd<N$y~D?!eG%Rl{1|$1RSoH>Ddc2lb^RSd z=m?0d$uC-6=<R&~XEK?Hii$#a(KTVu28kvkxv>^ZI&G&VBEhzzxD>5cN0k4)lw}1d zTjRm9ykB>$BuU7!OpC+SE92%6SoV;eGJS%a?ALTwa=P2xnICM}*>C4n*oCZ^);D1_ zg?PB62x<-Ue06lKeL`#PT_?w=1%V++@mw%w2uBxYV*pD*w7$1mx%TGUm@sw5L8FU$ z#u=xvqO$LmeB{_zMvWNWEBpT9>lK`P$z>e1U=ezizzers$D4n<f%$&I=RIW=we?7n zL~crAKyN{h4>(N`tp0bFSEJSHIDg40;IJw$rxhH{zLyo8HgG$Yc$?R)OtgNJt5&Ne zf8apgeCJ($Sh<SVUVDwv<HobCu89}dZ03>we$CdBN@Pjuv}9ysbv=?SGk40w5H5kp z6T-}96PI3i9_u%5;+%{BkK(=i$!YL&nLhvNHyn3t7`n9T5Y9uF4=ha~>NM3_TGL-^ zs;jz|1MDIDsicAl<HrXAr6ef}5K(M@@BeRz^OAh7bE%h-tqy@@57~^7g+Z)RiB*;~ zG*i*s_sJrHAjo=+y6eOSlz3usea8acNXkcATXiLv3`FU5Y_AKiEtgTNVR}wFS56wq z=#&J?E2}u=tn(N?elqWW^hv+o&*P6h20162zSQy&HCm28V@Z$i_qX*MxaDtmvEZar zdHJ<Bc;Lzl`Rd`jIAiXNE~V-Y#NPV)djvtCC_On~VsrbF$09jyyv0n6B}x&%kR|0M z`M*RZp679b+W{^+xNJUPZC2h(?d&!#E{;=9IfYL?{gjQHHgW9y`Ru8z<FWU@;nDwm z#k%s)wZN^<_2MIEbo{WJwU*Hq3s+on5%Z3k&3Ttz&MR-c6&CP)@XhxuK4DQ96G4da zZ>{$YTyrO2=>v145r@Ok>(Bj5>$fm%=1l+DM*&K=%jb#}+wXNNQ2M`6%ALHv1%7YA z`ysIG0lR4aRN3FHB)QsI<$u<1N0g*~alsBt-hT&yD4mv;5IyW7=`?Q8Dg#WCWinzd zG)CwKi8Jasc~}8wjv7R&#muIy+gNnk8BClui|>B?sbB7?Mx)`33(iB#$n3LYs>Y9J z(CAS;w!htbin;qA4>D{1aoqdhzc_8~EH=FQB<IhcO+rj`ul|<m`UZ?TZ3mXtV0Zbz zGJGx9c#E0Jni}rB_aC_3Va5h!xgAu!Zg93JK<ZZ}VzF2#Dk|cwx8LFIH(zJw^r>tr ztLDv3yLfNwo({X*R9#10Of<uC{ho=|k_ERbqWD_CV$)>gq(#T`{FBT0^ouWf;NeF@ z|4zM<K(u~u8Fq&=JP$-Lvy^2;2}q?5!7PP<?bobbiy#O%Z@#S8=C4;aY^C1eWa-kS z?LaAtO2U-K9SD^EuOODWeaFtW&Llcb@92FW0?Pxm<hU4l%)qQ5R%vTvmAiZi0sUba z(fiM6G-<UV-LOQU;-m6wd!L&S!={@0Zi0I}7mgjmX~PRhG8tI4W-ap;p2&j5r?BeR zHGO{l5)%^8PMiS7KInOxpN}wPaKwo(p{%C1mZjJKg(Hrd$E|nX&0)g_v+>m@dG^LD z4!9g7T>Em>S_;yWI|%bzUCOg&iBRAmB`%sf@4cVLo_M-@{XS(`anU+je5Db7E?S+A z1;?MjJMaCMkN*1}Cm+9%Un^>OeD$V)y5SbLm+7O22gWB`7nQOM%?CEtvobSS{>)RH zaq7vaLwSUJy2`Ju_=!2QXNI@a;Qh450L>N%X7_4Mdwf%tsIIPV1EAgm%WW(=W<Ig4 zeKaLmS$H@d?X0r1mmj;Vt*gcB^`cU#daRE35LouGEjnyeK(d15_8|F~+REbceq)sY zV^a4oO_m=Y6EZF#MbHE~(U;&;(bPg(tc3=Li#mJviu%nuEhAGBxoF%F<`raNK<0x_ zK4aF=3z#x%4xfMZb>CjZq$HR%tK+28la`wYM;rm#1Iyy8tFPzLC!c2g)R{c`<kO58 zn8!Q!-padwzllNFnSFZMc9d3-U@>=)PHcVB3eu7z+TYUSXEDAon;UMsovBC8*?)Ym zQ_z$YhUv5glwtrFO=jjEb1bjC^%m=YUB$x1C-Bzx5`M3&rB0*tZ5=;yI5z(pOh5N7 zbrp)F;{n=$<mAv`X^aA$ftTL<h*KAz7$&O>ntmKD)HXJUZfM}oLcJcUs%waeiRrax z<hRNiRuq?V(Pfvn1E1HUXw|mHD?0<sAor}x=|T_$BuT<z?41&xLtuFTR+O0{j~*B} z35mW;x@M<~)%*G{yE7}sf>FEwxR6n+MkYi?Yy`ptsd37HvU|J?O-aHlNvyA`JD~G7 zYqiYC&EV1r!#JiehiJ9HPb*ikVDYIOK6@@7eEex2QuGX%I<;c~caJ<oMKE&)7`i{e z9S$e&y!Spw%$~#2>;FPxl!<3=y@q%1x{>3j9oB1c$xcDLshRp_E1Ajh9iF3BIYf;* zvTGS-&~y6CiJUiQ3KeB#96oyvzpvlW{R9-z3r@QNno`iSE~qFPF`9>#J;CKyT+WBP zN_qN+RRH|+<u@69?ot-t@gV>H_-pL`Aq=Mj_HKpp;%=3agyF*B+g+uUS5`8(s4$G} zI|A-&FTKcyU3)^;glgKeW6Smx;}yM~W*hf}eYkxOmz;7EM;>`(d-iKfGxe2~T{B8i z1aBa4Mwv{=vaE>A_fk^Qp*qV0u(M`Q4q%nC*Nf<LX|60T$L4bP3#$|aK|Ufoyjnf8 zkInpER?T?-??m8+jWHYB76@vUKyG{tWj&PC6s^}WH7AX6>B)RkT*k`MDt`QBC8wNq z4&z3T=E}=1VbOwP`(R~Mq`0V7d=n7&Iv|@g2}T`QjPk|jUtrlY&$4F2W~PoF&aJm! z&)mu5h_m!xE42T9_p?Hn2P7f~*DxM{D6CeaW?W%5g&6~Q^SfV}J^xtFKK(S#JLen* z6&7@dW-9E`=>@e;DW&iS7>$ml*Ivis6OPB_lRp#$p{={c+O=!Z<`09GdayRMPu}%a zU~7V;bVaDV2krObQUpO@<nS<5o>YO;dtGfU&%U^vj~={3VX48avegAEdiiDLN{*g8 zhxb4HxL2N$7Pp7(b{8)^^>1H-mIO8{ReN?Z>(nz@{r)=`TNjXR<u8IllvOGaB#>2Y zjI=e!BFdnrsXK1^Ltxo^cG%E?^0`MH7B~?!wFAW0+xPbC`DKRLFR&m%VTFy3K)0#f z>J|wjhGx_&fNS-+r-r2^^X1k(xJ7Zl*|`2D$ugoWx0ST`n@OwT=z?q}Wenh(;&Qgv zHuBw1Kl8&czc6(0VE%g34IDOcBB?0@dhenZ7AkR`RjZ+~oAD_@1#z)3a-;&l-C=HZ zb$tHONBrxFr&zmr8&gIM;fJRlWMn}eCWF4;$HtD5att~x>4~wp$^*-9WFc}^*<k@? zG9Y_JhQ(P}{?f~Q|MM!|c<K4@i~BoZrVL&eh;9X7G+G~cs4$wN7&v4Exa}Phc!mt} z-M^Svr5vNC99va6W`kZyP$}CDElrS|-ec-M4GoRqZyYrC{`S|~7@41q-el@nV;Rt_ z-NnvbyGc$+V93CHY#tArs_T$snFgneW|td{N`=Q)*QiyiNj4dAi6Z%NG33SV-*x-m z)?FMn`zS?2+v%WW`*t?}{ySf<Ud=Hxrr~xtFlzh&ycIA7!6*K%0+plyr%Hv#rv>YD zdn1mA9|Fr>Hh-laP-1+odXnGl*oW2W>bF>>N)Q;D6d%^MtsUk=1;u5rh!BP=SFKW^ zRjaYN6c#ZuBbg63?qF|YOB)!6V{TDmXMGdHk~=^5c%y+ugY#&1x!F`*&sTd&*|2Fd zi%&nB%#3u-T5>8kT(z|K8Yk!FK}rhz{4<o6Lb$2*f&jU>Fn+w^a_vsikR<WutFLm) z-|u5@MI|TAn#zq!PGt6k(O68zgJx`e{L?BWCMnAu+@va%O3@@eKr5+jU~*bA7mO<6 zsdZbKGV@6O^Tw+OCZ8z#n5O7ymx5FI{#9#y*_Tr2duuT9-`}=z(_io4`~`ElaQ-aJ zMgug~D%q#0IS?Ipz`y&;72kxHbR!4>b(wqj?&Zz5-e&#s$G~I>q1@xUC%)hR&qp8U zwks}S>Z!+(aQz+fl)`+W#VazlsDMV72f^)PZ)Fw8GS!VufJ}9>l^BBovrdZ&NRKkJ za8Mp`MgwsMJr<pg8oPt9_Uz;R9eY`O*Zoje!v`OK%r$r2!;i1N#B2ZkFE8A4m+xG} zpx@(rg<_Uo5sg|+w8?;16no{lJ_MHCuxTTU<TGXl7AA`=?bLtuzVd!OzeJM(ZJ4Wf zqeg>9r9zTJbszDf)`s_p7<5{!4&@;oU@;SKHnOw6DI&1ctJQ3%s_hai{oS*ZGgBCx z6vzA9irLX<WnW1tcir~@Z@u#$&RlXD$IP3<@crp#cE?O6m_8jE8er#6<z=&VER+@m zWd)y~2br0Wo!z}eAxYw`*IwnmhnG=NQ^SNIMZ9<4Z4AlHIw;4-&eC!Y8=MzXW7zKT zqSGE2Sh_r3s+(;L8WBshUdIVVIXtswGjonz$mN$_%pJGfbl^Xtt)4Udugp1eHj*s! z;3JRn#M|$4$?->X=G+-dnNI0WNJvp!vj-6SUbSW|v!+iAW5pbJjqmyU-?{qK<4KB* zQF=gz+Fq8y<=~%>E<>x)aL$ZL2tGFb!N(ut5j`Zw$K!RmKoqgrY#@r*ZFVHD2dCYx zxKl-u;?fd6`Tj?Kt*oMM$3DK<wiBI3gWc^$l4Z174eI7b(5RR>Y9!-_4IwEenx}5N zIjE6?&-LmLmaQHyzie2u(SRh&Xf$e??7dSPdI&7LVg9`;m2o8@`WVKB@*4KlH}~uL zjY^HIL9c)kZ|q<Z#4XJR9ae{vTAPDJvylnesjS&s!MuX-Cv-tzzjArO7HiORRDLGK zYc?~zAe$}K^=#X*lbde;8~=RdG5+u33;4ea&+qw`S86pRCMvIC!@%u^@^Xb~dPU{m z{5*(@gXr$nG&a=N^UPCE^UB-rP+Q-~qUlq(cF9d7#6&Bs<sh{6JNMvlxk*ciK@Q5O zZgIJ(YPO+0z|7*}syaX>*5`80i;HH#pj_VFyo-Aue2A9jW*+><y?y@M4F)~OFF1yo z)2H&v8*lNiN0;&ZhoAHO%}W_Or~qoq!C`}x?0{y);hN26$L)4AZp^4KN3~*QWo5ke z)|-^R_mVQmEU}>npW8uMSs8cUdq1~baxNx~sx9d!E<Uy`nMR{h7+s9X1d>FI(b%E( zF+V4VS%)7EvW(Mir?j*bm0r)f?K?n*QG<#|v_ygE#jMxy)U7vxD56)Z+riS`1xqWd z^ns*G6`(%Q+|-ODNl22^R`-1fEc+WM#|@QFJYsAhrq~>9H}1#XrO2|}Z!TCt5ag>S zN0u~_YB95VZzZRU9UA173O}nXHp)b0Lo@5ks+n1s&FG92KHIW~t+fpSExW>Dj3rGi zowgMVWhqf6h9t&ecY8R0>=3G2?0mhal;S2Ucl`Z6o_+o$PCxY|&OPf43i9)N{-Q_u z&NV*1M|QVu+jic2_Z^;o@nxb-MrMy2#g!*7By&L0K|emeUAG=tmYFmt4>_oT^7iU_ ztZtFmr~`8uSJXEV7qnQIlrexNr;D$4m-4SC|BdK$@UMS8)H@l>`>~klXfD0rJQgiD zmSs;q%}vj}!2_3`&G4KIC5E|otHLnjBP*X-w|+eUI;}1YX4(F`m%sE9w_SJ^M!ilc z843QrASl8OUN@I4y_(^J3b=5t!d`8yxeWeb7_6ovbs|USdl~e42KvTbUV3_v+gky~ zD80U8-^$>4B?3r(TDL;`{M2l<Vm9b8>2+<Aiig0mpKadwj#+4;FZ*gwT_c+-Yy0*5 zv}zTpmdN6DsTLDWArwR82=rm2jQX}~0NJF*M3EXD#kShUh`=&4#zI+hWMBy}HZ6%~ z*KT3%z$~(3Ei4&PNQ>LU)|v*kH8k_DM<3_K<*#t@`R8!r2`98CXB<SfX6-s2TlP3# zfA>9wnQ1(B%_U42Qq=2eJ3VP-)pbe?TchrvLbId3iS(>&435SFI>z3rI*PJ7HXELu zp9zA%SG!7h<oV^q8g<-$=bgRZI;*oq+<;{6{Oc`L*VORs*DDxqj#lEA9ye4JD|)iY z=^;xzLfPgmTO(LCw}a&;AAZ1>|F~Is6Bh!YWkm>J`D<_R!N;HS-M{~Z*_Vl`YYoHr z1EoJ0w#ISgE&vm7xm@U5TYbqO`dDCaS(DxA#A>%QAR#``-5MOTlzhoOK393HB?_0v zLyXx-O;hj4iyo@8jKGeWI6^iDWgChPXItU*m)nYw`cZ@cU}AdY*`U#S9ad*3und2N zmKLwLb~gCwY95iF!G`L{>MbpLEp~6@vSGP#(Zm{bZ1B~0>eOoDjRp?OO6ANEg<Lpx zFgXSdPd)JzQ)kcN|E|1>HS2!s_h-s(cksc-pR(}8lUTU;6l}HCynD|rynp{4%$q#^ z4+WF}?|$<mLvxgVuEB0tms(G4T|EZ<fw{>Vtt~`_h_R~$f!TQ(Ov+3_mSz6-__JJb z>HlFb-`B6#BsnRG#V4NxSp|@s;hW@TMZ}<NPuR`Y8yb~Gh9;c4*)|zICokWAodQZa zeHTeaGS}a78-Kg}B90h7sO_)C6;<tE+0EC--~Y&uzy03ELTz?CbN=sgY8&d?W5cpU zRb4Ho-*OupcI*gbt-<?j1LgL=m6TVY*JwZnwW@cf;6q>;fgLeyU`JNzOYCurBAY8} z`~4i#ERi?uO*AR$B*C(Gk?6y=YJEzw)CQQt)01g&d1!QouNA9Rsj$1dr?ELXGlkXV z)gdR*jOZwiADqVpql!2tCzaJ-e!+r;i#YGXi}~!!udv%4eRhxRb_Xk0|H{+Py}+2s zhjZ<9H;@-+;jO!G;?28nV(g#-#bx#fwB2PD<fkMdi&B6azuD;`KQEV>nwp5)a|K&< zgO&JB63^6vz_CR+j7mvFmSvW`@gHuu`BtTjqc?;CA~Cgw3Q^6%Tkog1rd|o%G}S3A zGmNq3^(|ia8y;!R<Q2WJcPp9EK2K9ZN~bLL^z$wxH7Sv67tarH<=R`vu79VGkf7+t zQvJ4Bw{;tjzWxRihYkT*W_MXBC*JTEPM<fI)PzLkdot`UE#rnqmN6_ppXp=9_#Lkc zAolxAtI?oUsSsqjM<gQ;f#m_%@Z1bJA*eT`<o2{>{C%-?4<1nz`ujYG4v0K%=9MI5 zpdnbIE&`3k)`qKkot|%YDqYH>4SGgqrto_NuIYHAf!z(=OOVQqi>A`rbwRROr)6kz zJd2C6IjJy<x88k^zubN&(~g|OqmM0PUrA}N-JAM`23~sgbxuC(9OfLih&%7Thm&U< z#)@V4@XsqRWYVxff9Nr?V$JV}l0>xGfE46{-C9*gR!%le&CLe{mNiW+)VA0e*2QzK zRjD{}Xg<dj<siv2kH7r^m)~*+_HDmGOaCU{B_<|t;^GrI?;p#k_mx`FSPL~}`~7Y! zNbZ+es#G9)a98d{tgBT1rZ+%r=$QBCUwzFx@4e4+H(iOb)m5rDfJRG$wFSARTnGR| ze?atOron&zZtXhGz2h!kzVmj>Mk6-6gVS%hozvzV#o5QSgR;%x;Osl@VoXsHx1E13 z8nwC&MBQ#T&%XCQhn;;sO;&5CfbDQN(W+JKtf-;4CgDS18Ky0oGP)zH^h;p)Wlwp( zpJR%}EE~HaZ5HQ?H&$9(f=6fA`!E}nK{k3|Han~9sP>7;Ps&c?m(uY2LZ(?v)H}MT zD?1>{gh!IX{(hRp%rOPoG?kZec&vdJ9)FyPhfm|u%dh04Pd~@w@$|@jvD+Oy_tMKu zo^cfCU3xjyr6t^Z={fxL^n=`S{^_J8Cj2SJ$k)IAh9JP8%#;o;e7oCAOiV1YEE5;i z{TkTD7CSn%Dx`3Qzv<L!revjZbU`)%%ijKgb8fyHO148yd00%YH%zP5a{4JJanlXg zvG|tzsPT1Sp|)bbK<@RGaqO2kNg}xHy!!m}h^_Y_DLrJ_Qe{;&7hicbSDbM&qw=z8 zJ3vY{cs=B#4(JGmVc6E<V$Qw&E*@BVISD>}*(JB$&d9<7&NzBr+jcujN;u+zi#col z(OhxLNeWQ<*$3bM!1M2a$PH(mK}=NVc??dw4M~=<x!k?xl{o~KVc3|0Y&kP2u7itG z^i9gY?yKmafYToqPJLo$j7%j6G&=&>KqLx_t&Oka&3aPfV_4y1mqSt#kYstk4Wa#+ zpR1eMY-&NEAR&fwYxr_kBT^DjiC!w|8aZW94kzTN^PhL#Wzi{17&>|!cieS1-~aS; zx6bFAZ@=g2Yp-YYq$yl>^|fTgNAt#AH}UyHcXIK<qyG@ut&!NeZ99oIn@Eg~YHKFY zHYr<eB<VHCvW)ovREBnzRWT?jF6`%FdTu&%24*75GH-tM9k)OAB2<_5yIXeF^l6-X z_L-b>&m+`WeKop`HC+R(FAnK;d-g{``SO#GS+jnFlAvR<Ky>K2Vd?dMA<Agv_A~v2 z+2aQ&8MBgv+ta;}$l~k%!e1{spIH;e0|J--<3VZ~8hGfMrM|jJ1t{k)y@pE{pTK#? zb(E}ZXtt7)kih#7-Oq8;r*^$QkR+lFdSnO`x<3S#eQR^Z4hhXFeJib%#pV54F4Ah_ zBJAYgKdGoyLWmV>_;8uzlh;$LRh&9w0xS2FwZ%YZ6lU>b1fudXU~_km)s0F?q}Jw$ z=(o?zO=m@M86Ht0JJ!O5V+M1@#Ni}}Zl3%1v&=ni5u+wdX4w-@>^HV)Z)xHEx8G*m z#KV|>!b!aL);kPLNo3uN%lPpA+gUXIFk+(2f68(4-S3+iUzDTV!yr~(WpkkQD$j%J z0AfmetLljJ6P@=;Qd>jm&TK|*2CZ7jcR&9cH$L{P5-Z%dU6HBlCtGszVx~`@#%;^r zRlv#H^)ufp<*45ebJ|x@%4rw=9~Uh=T49N4IU!4Eep<PTPrvw*7jL_^-Ti8eQj(B- z&8)ZXEouKkhx-=#{U<;E%r$2$;f(q70D&jod6%CzY~+K7AH<;30|K>;O`Q9;ySeP7 z#hkzJxHbUwf5lkL95!M&@zF6I&%wX;QV=Mqs36+62ornBYjCJ^WIvXlmMs6}<hh~2 z5-4l3vh@HvZ1j{R9DpXGfIxF_UrU*=^<hnVof24=p(tYjxhaYKT3*Af{0t7y&*JV+ zf4gn8WdHym07*naRN!baJ1k|PD4iCo+k;uB#Vbh&f`B^A2{zSYrr8x4&<>1O2IFsy zEsRfyCQ7FzN~dMf;5_UeFIJbEFZY!3_q*@ofrlPp-mDoMId>j0u`xuM&D7S_<FMO! z<&{_2vTZwMRn<%%Gm>*IJC9=ypGaC_e4lsz=xh6B`yQ+|JMmFwWKl#8ig%YaG`H#2 z9!Q<#&Wajl<+PWLxI_`V$4k<F<o=E>%t5Eouwr*9_bq=DtKH7B>n?-6+aN6$qGI~x zx?Oqc#hiNf`Fy;ioTF#Y=yKbmW+^=^)6>$r-siQ~Gbk&AVfi_V0D+;S+uLq;aNSL} zu=MoBjL!A-IMwPPbD-j`_4OUCs&D8BQf;r`_cEd=k(!jqQIjWvAh4&bjE7!%jZc?7 z+y;6Tb+ue{*S(y5>@l2m?EFsW7nQ$DRuDn}rJoztVJAH{iVfw}NYbIMBmH8bGGHaA ztF86WZ>3cS1*@Evn=T(ynA7d==fqk<Hi4ES$SyPLv{W@JahGEz4(FLqf8dCmRCH=J z1xfL2uWt-XvsSNGWB0j#%B?mG8V$+j@Fv(~vynCBH4*>*g@bZ=ZR2+G#}6akui)LJ z)nL+USTekT7Pkkx$IGsDt2y!I*NKmdMX%Ljwb{^W)XW$&l1W1f`OAH`k()N)PY;mo zH$IA=_En=21V-j(AO)2nxkZt*gg6>}ooLb$V!L&iMw^2cr;Cv(34ZQ3!kQdg%Szm$ z$oIwNJn`;F81;G{xZ(mR*{QIvn7)r4YqeVLyX$sNJLdu>O*xEsL+A0_jPx|7Oq$4Z zFTKq1#~y<zc!A)sv1-+7-v8t?&R;MWyVHd!JG86+vB#gFwyKJ&Pw*w$Xf%+Xr<9if z*p+eY_IMGJ(qy^1Ob7%<p(B6^0&2CIQG<#=mT|dU{Oi@%dGjClke8tVvdit}!R4=V z)Z~erx9B*(iALzcn-vO}1K)4hwTFo*aY(X^=a4pR|JdZgd7ZLKfYo~|4vO=PJ-}`g z(Rv-b8=5+PAjx4n>qSYT-j~=jI4hMg1=+0JSIH5%=^U1y!FSvDh6R>GlH+M`I3X?? zNtW4ET}N{3>NhN=7<p~t!1x&Q<6`)BZw1E>%I%c#M(MO9n~m(Kx00Nm#)Frik5R8j zt5K7ep8CHxK%!zGBcB&vzmV7{C0^-mvIcCjrLvZxdD(5{McvJY-BDJBR;9*2iOuQt z;to@mQ7s4@U674Qqv4BPB|P}*J5)C`^5hLyU@G6Elw0(G*m=a>tK3|!y!2w8`1f<% zeEl_DZu|BtFLA<>Gnse%iM;m0v!tb_C?7P{Vc)ZjMQ2~YoJnJO;iJ#_Vf|)~KIRxE zO&pIUDvDu4hLD;vfcmN`-hJmC?z#9ZqRl3yCNm>HkX`%S(+$=Z<hn{h>GaVFShk7; z_=6|##mZGIm@$n}g9o*Rtk&<`#c?yHF?r;OKt?Ha=GvtryKEJS_d9+=a|_z^L{x%+ zu@~g-%4!=Afn`^A+RTaa%#ndgFR~~h`dkzn%WJ5!ISz_*4JWy0XMGbtmsC<?b70bH zaC${lDivmffkuZDtIOS{?dnG@!#;<&C=+|D8@TI@&ygh&r_0UnUN1W;YspE7q1G+3 zx~v+5MvXzECMPyJq+7NqF}5w+G0te<gKfpk$ju15<yVrqdv3nD12g&OProxGCvCrr zkEt2SJh5sW->hBF(o>HA-y9&ZiIAENY7N`A?_^?;l1(WFC0JCqI2bi<2$gjWL>+*p z?Y^pda^oyP^QVB-9e$#YS`e6(mqDCC&pTUov;32<h&G#e?Arfp7duZ(>z?5Kfy^~0 zoye_s-c4C~1?g#>FS=3&B=g@lUg6#c|Hb0d&*Hr|ULndHg<Mg>bq_s()9vP8OE2bw zAAaHXXI|lfM;=2E1avwb1Co=NICeBS@iCk@{V*0ypQ13y%mOf)1A)@V&c6R`V<0H{ z>$0lkb}}f)?Qv0AMifP|)6*H6pBM1=qTF1fyBo9j2TGOD)}9MNz~OfJ#D3&nY5u%= zd+{N#>=J;oJH`e?d%F(o+S1B{!Ue0-sO7t7P3m$RyT{A(>$Z@Wl}S;4A+n$%Au$P^ zUXRD?rL3%s>XpAx*4P{Xma-&;UAL4yAOW|~#Du9csVpyN@7{fgHXFZ{R<W+M3IQmt zR%$LaYBg~t16q{|jUbR{)RSORItS>~Dq7qgtS&byl|Z%4L1}XfD@&_5GCz~({UkVa zmu1Hr4IGi3$~VR3EbN3``n#?36Jojfi5EC&_S8R3`A683R$^)!sI1?(376YVa%^;4 zyCi=rwmLaIKab6O_8w4L|K6%va$*C$2C^)NY%jMz8<UoVS|#w>h8-+>`vaO<Y&?AR zCB#dTB6gmZ+wPL=BRgx!sl55_f4J(hOS{}IF(H8m{(dLhckV<KB~Cl{eD>_vK}~HP z4_<Krg<0ubanf;29XpDTe_BOdla-XDMAmHE$;w|=ao$Z!nK@>-lFXBu9SD>Fwsz0J zmg0RKS!Daw4`ha|>{60Yt5ggtDnvjC*e*II+V?ixdnN?3PF2vks8pa<BTF(-zPt&U zo(D_2!+8iSJ7o^T3*|FsPYMl|KuwFCHTx<LigTTmv44rXP1W_N)fygn{CP|v>Xqv1 zYB~A%`HT#b%Zo(CCpp%_=CV4jy8dPw8k%_G-^=lO+|=*e$S}Q!D6N|B_f|t(I(DZM ztyY61il_tuQ4rYO(gc!-!)B+Uv4J1<Rv-uhk}UJg+AVlQiG9sBiV|YTiM3$TYC24w z2Wr!D(s_36X6zm>rv0=ho1K@zldCs!|MItZ=&FnVHwK1ErPScXCbmtSpMLQrf&c|+ z$sJfFz`p8QCJh_J7pvAF9YCgHadkaof)+6zN$NI}7@3lYD9gONc^5B#`ZZ;>b-Z!c zO(cOLcAlQE2#@!X4b019`Vog?w>vt<BSTo>Kqa5zu?O$xn{U2hN^Uwi3DKa|pcTE0 zFUn_pQ9hy%ylNYpX|~zO9FT-II!=+_(}ZwYI+ak0-RYvNrnVEH4CNa2?+79z_%X`v zc&gg=AL>{>M%fCOZm)-wXfryE`hc>nJF`8Nb%(&RGYch{F1g%otL9(#RUr1W4s5Gs z##p-i{Qa$au!$05$BYRHlmH0{i3kF0s;FgXs$V;+2q!m>uXfF5x1&<2(CH0CCFc>H zYC_(<fui^*YK%rQi$-_453k3K%jrOpL>g)<X>O>+>vm$bHc?}3q+(AQDnUS_Ruga3 zqXtH#B$8w{k{KO^NvjFFpJ%WcG-{@1r}0Z^B{TOEC(VnCCedW%nfE{ChBHqlB_Zz5 zJt#C<rHOG&pv(WqpMNGP#zJ0dVuyGofJYR`9FRm=O&ywU-j{vV^|(A<h7Aa0@NQAW zBX%Ev$D}5a86CwlYd5pv*WWqqwtM;Fk$b@9gnip!Ko-RHT|MmZp+mxJ?(ApjX{jtZ z?NmjKK=gv3R+>21Re{@u8X3H95@R7TE*hd@m1G`GC$YU2C3oSgU)L$gQ*Di;r9i;! zEOyyJ8qbeOhRrJd7-h&z+;*U}`Pw74mX25qJ?{~)yWEGsGL#L<&XBKNG&2ONY%i=| zb&w?X09_`{ctnX`D{7fBV+KXTM|V9Jsx`C(6_d*mxVY3RRhuMNV`IA-NmNWcr7nTY z+;P;cUcrVPtC*IagG*)TWKPzh@wE}M_)W}iw+pw+fh<Ybtc_Ha?nV~9AbR<1R|&E# z6Js=>R|zDUjf_c2#Guu*m4<|U|C8cqDECrrbL=+@cXVnZU+gO3t*^i1^2Nvfc?X5T z1nIeo>n_MX`Qj^z(v=$DU}m|kx}LNo1>nA2w}IRN-4o8(QC5vftLaceq*1Bx9$<_r z$!z4(@xxiZej8t|TE|gW+{Ej5{e}2wi=x}=^*~Zu->gRtB!gO|Zr6U*Xp{`!*2S*q zZ397~<3QcXaXjuev4-Ea?`{Vv6(9uxrhhk()_7){(76v3JC(=l2BYi*FiWbc+FbFn zEcZ%+kJafq1eT#}LP2K7Kgu$aPo-y5MGdtr_JiVF$EGLCrwl9T^z#+PWmux4$;cf@ z;h-U1?kgcSHliMu!4_jSwn@ZUTLPu?TwaNtUKwNIWKzXn@mlL3COxA4>vVc_zBrO4 zCZ3dxJRkX$$hS6OYp$odyckLJQr^_S<_$Ygs{|5#wSPzEWuVunNiZ6^tVz|XR1A%e zX)9mZA2a!4R|(I)|Jk1xEX~nMwq%Gtil2P`B_5BLQTdt3lGGtyxxKcL8DmB$9s^Ot z?de`xe{p3^$hK_)!T~+AZO^Vj$GM{i^X8_Ve6eaRcRu$j4=ue&nfR+q71oxV5mwFd zL1nGLrqYGSkgbhvpcddVZv{+Q)lr|d)&1J~Qia$i6j;jbBr+^k84Q-b80Nn6N<Y`D zKuWBo$1kH+r8)$bp={FNj>#RO!__t@H&xUg6p1|mqf<H`0M#}JKbBN-^^LbuSy@5R zput`4YuKP7nj5PE{}_QARwW2Xl7!Rg#1*8#BeXu;IwRR5kD%Gwgi(?rb~%Nf4^&uU z;;_WTk&>x2nRUAyxSURG&2^NQ?85DI@cQQ6AWIl^I^qp_#-%0@YtS>mY$C=G2m}cx z194$Y!U-k=7QL2@yNX${=67a{9r@=O2!fzAC{E7kl!<)s@h8dxvnUrSM7*-n=3rrw z5?gb7ylsN}-EqT?4UzF}(rUV`_7rMgONJNn`j*`+d;0_O(^I)@@d9O%ul4E44#@16 zhSGgz_I5XVTg=hFr=&j!ch!kxe?S@hx8OxcFth9eIJfWKMT}41TB8y$>w1=1Ry8!E zS04h)4tC_2A@a%7#&!66E30&iBEOa#9Em*!tyaE$`uNb^6j9>E4LcY$c04nWn#b17 z8}~o)CnV8aALw3|BG73~^|?Ep4hPQtXyuxsqI<2C4uDQ?M5j0U0CXUt*Mq}h!`{+N zOJgk+B|G`1qMqjFW}@_Zbb=yiaMZx8HrH#oi2^yX(QK%y<DC^h{CU7qt%j5=h)L`c z9G1WK25AYg7<F1awvOJG%_WtbId3+*%PNp%nZ)SG%LW>44r-cP$n=S#2Y4(*ks5o? z=`w58Do!4p%ewezZh7iO#t$iE;?O|~3#zMBCis-BKPO;%++b~Jdpn?2Dab#0#~;A_ z<B_3&v9o`}U8sc#oQ>8NEWRvjjar3X+p}dq#Z`6a)#^iF8Ei9x>M9k)klSi2R~DD! z=%JPDf!gro_)Z(0ezapRO-?sA-gYO*G6jYEZ~tV8i|4o6z%KTYG=Lrur(~vT^?FLn zD)uuL`i7W09X7UZSVdEPEwU`(al25dR7jGSD6<)lDB(h&zQsmmi=EvK&BPlGEF7Fm zMs#?YkYiGl*ico+%b$Fu)a(7xO>a;VdG;d#S6)#`i_ON^yh3G|1To8v6}7}!%$SV^ zHttaxFn6c%^Ty&bv}!duA>3=S3^hGm>#S3&nV6Q0Nvq+$m*3{uo0bx1@jVOmKF>>P z_8-qB+m(5}P`azV5w#%D91IVk*q<yb9;2?na(_VCm8528jMML5r_;d@Us9seBSw^G z5srx-FB+BVkdS(?C5IT0qQlwdU;q6ek+)L`f;=NHbj+{X=HQo-O3pd&BBG*N1<v=s z+KNd^?rzzwVOB`19L>1Wi{H}w0x6h$v9zx{}PySCtU*=TO8!(ng1*3yhx5U8uG zBO^T>Ns=)5#JOAC9`-d^`S+U5{1#>(&OwQBs04u~o1OBy#y|D|Fh@hqps=)3-~UK) z!5%SuAd=hDVUnt}*;zPMDZi>|QP^LbV0Q#oZ?%yT6MEs|61~J4d#4_9NMammqKlcA zUau7Aw^~CLRF(XBCOuJv@;zW{Ps;mYPX$lD@+PqfNsO6$f*b%=oh96~);;>wKL-5Y z|9xlMb@>XtU431hubxwBKHt+-mi0|m+@g4hS^C?_)5gh1ju{dfEKyvrJ8K&bigQi1 zm_v$3H#%KBzita@DFaxv_>_qDnU$O0L4;hE!v{-^T7^cfX8X=!Q0e>q8g1LSnx=+Y zt~%{RE;)W4Tlbdm#maT4)hbG=YmsG{Up8*R>2!8T5^;FE{AbH<G%6L*dM&9@=1$8| z)GC40C=+E?8?Sx0l538i^T&Jm1wm1-NlNQHQ!>a_{kj^nK~Hva0^a794xg_sF6XK# zQvfJyXlz~NMSdUmRg%+5d6a;Frk5C=S`f%KXps}5IOUeVbNbwwTzmRrl44_^u0pwH z12X>{K-pXmD7BSWJ^li(eEcP+T=h3bPd}RIgk%!)hsw3PHVGZrUF*0B{(o1DvAgcr zPTp_ZzLO~5*i<TAdiHs6xji%=Djf;5DMLGorX$I1UEkN1RCY@(r03@~K|Wzfe#p;0 z-&I1h+slpD-Hax}6zZYFM$qEye&-PYqh3cvc^Ro0dHv2R_iR_#z!i&+B`0+N1)1p_ zdw8JG#NNtktTsCh))wCT_9to@o3J^Y{Je1swT;az|9vY)osMXO9<2bA(gzS{)RSyB z1}F&?CB{)^wej)?pZxK_Qln9X2BPD`j>XyS4qkop9mW@A1uQ7rK6iVlYq4|waZ00K zNv-ugACWziZm*X;Rkh3<6FQSyr&fjCE490p6CK6Eyfhwt^S^xf<0@YI>vfDBRG>6$ z7F3X&{>Pl~WEm>=DecODkA7UmjZeSKrtLc@96gyCCtuK3!Zl^VlJLMR__I*JcpzXF z0xW-CyN(lvD-{72y)JU$gZ)@}Lo;a>^C7VOfA-Ehysh$V<G-UlEKBm<D<0W#c0wSK zMF=5b1;Qw_K!HM8AFHL5RiLGdwoqCMEql|l_b3oXLiS!x9LIax+WVaEk0Z;HM`9;l zkiOTY%eE}(=$!Mu@BNJXxu1?PDkE9CZRL{go36Jr1pD5O{Uag-t5PU>>|MFLxs46A zO<ZunMNFAK^N2oM-$OyK6cQ0seM_2~je3HC;m_$-9oR!C7+}Wuu~FULyN}$o&g*zW z>G&8Bb$PsmM3F~ddzY4W8&!?XtZ!~16lzDUR-*_7Db3Bqq|qSiWiNlv{sZ5wiLW=x z`N@7N)qL~qxA^>iGLtMw!BDr{_U76~(i0P~nBqVXSif<T91-bf&FjvCb%aEzSBXP| zMvYcA_&Tn6mUzw?Q^1Sc_p$JrpL5R@7jxaYr$bYXY+xjPheY(<PMNGE2w-cb)$ZWd zzy6Dt|N9j#my6Rczlo)n-WUN&fZ0n{^dHC$1(*W?lpUU*&rdL%E((ewbvEaKUap3A z2Z=iE|G=_ioHk=(kI#$YwpIR6h<1-}M10rM^rUXY9=p%a2m7ih997797hQ7XMniTM z)$I<lqH?!VFxY3X3=UFzoc<1{O%9izb>gfedVe&CK5~mp+HrZj*j;WyqKL!o#^(=E zQCH8;9(jVfr4#skXBl3<Uv7=0(~j&3F97k0GEqg<f6~o{O`A~&0#gceWP`HHsAzX^ z#)-2d9!za*EdcR`{)yZlsBb3GWF)DVx>%<#Fevh7J&p0HiJayS@Xp?Y-15-lczu3u zz33dd4pX6&%WOvS2nA(TpO$+0ci=BCzrjD=`jB1w51=>3@$<j@izO?6M58@OFe(F+ zH@1{%%g>V5zx7=IFZLkc9|;(nmJ|*IN(0{f*&hm#V~P78SaysF`I$Z5g$@?%#>)Bu zDSkfMp;0QOU(B7_?fH-PRZ(kq@{d2?iNP34&v!Z<5u(rGMn-xD?QVN4SoT9sEIZkX zFW?>a>r{DQ7XZ`86c5;E8udDiUAktJ7LQ`~gt4S1Sb6E=FK~K1y#B@4T)24t$erv8 zrJQTCCUq*l^m9D({EMVm<4G_X@i%sFe!jb|nManM90BINmDMN|0tu%6m5%JFsG+nV zx7YvcR7z~#p)+D<XQyG+Yk79dUha78X+%ln=NGSp`hzl2#XLd<^}TLcjVN44`SIF~ z-1Fqie6x8g0P~iu;PPMGM^2$!4PZ4YX?BD<bpr%}Df3Pnai_JXtPCUxYuK1lDHH=% zciS;+9v_}S@PBMrkVVsbG{mApuxl!6M??rV&l=yY=yrWgBkO7#S-xx;#a)C4>gsCw z<b!ueNwScXU?#yDPlCmS)oj9Ij>8;p#1v=1XwaijDzI1+Xzh{%>JP~$Bf*Sfn2m~- z##(}b0C5Hb^QV;#`tec|WKG!IblJ1mUtKqHC%eud3uq^%9x+gE-M)ied&`(noQD(& zA$CzZs&04S3x=3nJSt*zx_y3>3Pr!QVXIqg<SC^?f~6-I9MVfTI?2k)@r58s-1*qE ze0#7?4mH+R$O<?kX^5iiNmlH}-O|hlYc?|b%3C?@=DYcN(-tPon8WX1e3v^PeLez| z09v&Iqb_#4JAT>us4OYcNIA7P-+7m7ue}Zg0e2KYY6dVY-yT+Kv;Hp(D~}l^c|Fgw zaL4x+mxuBZz=9P7LAq{MY`8cO68Ws6mg1r!uDIs^5W9GRJGO1*!2UAwveJ85OA-<i zk|?oj-$Bwcv)QwEYZni@@9RU9Bm{;x6kA_Y0l;M!T>!Zya-p@)D|b^E#4z#X;!*4< zKgg%+H*@D@7mmD%9-knGUDcYS`k1%h{{Vn-xf$JvJpfzkn>p*m<060WJWz=wN&WUJ zTOBS$Nut2od!Ey%QAf%KhH^|yO++aOys)i|i+*t*o4@%AgR2D^Yvk*zGmH#xvZ0FB z+G;-Eu$5o_^EviaRuc>a7(Z<`^Uqw#sptI&qp9c4J@I-a{y-3ac*$t>1{R)o`G}ax zPe1oO*WdDUoGv$djS559fzYc}IKBP>J5EJ?Gdh(L^Z&pyY$;}^_4s_pMzFKKnUP>l zS@qg(h4LTmucFoC<ySY~hQ0@qhA4(8DJkhaBB$ukScH%$qKh|U>yn%8PZ(AZ1QcR$ zSg%t<tqhjqCrkj7MSh4OS)s(|0ehR=v(WEhAa87bhCGk9@2?nH6I`i;lx(@J)&Mj$ ze*9lgl590oke<|I2=>deN?y3Q(^%M5Aqx^@C-tu@%j)g>NYrb472fDD7NucYo#Rpx zSW=Y3Tf6u3z{8L5t9ySX8)YsVVde4Rx!(alv^BEf>#ta|bq9ZZ`ArT~Rv`!ilV;Cl z$$39y-m(=K4wITu2m+RHIJTn*VB(xb!#b5$ef<r8_|so_|Km@YH+2%lxmkSv?fTA0 zgIYzqXW-I6c83d-R)blm`5#y=m^?;0zX!><kjEGCs5Vs%zYu{S2+|L_s0;0FY3J+8 zIwnt<O7WO+Jp)HWJ=y7fBOXYSMA4XWyxGMv>yL_$!|g?<iW|1;WN&Z5X>UiVRI+&C zf~b|R1g&0v#3yuiS7>hrk5jh7k1~8bsYouDX|+2>&IH%T$?|N*ff1Kpw_zg(t7|xY z&Qzpe_YiE2&517%Wcdl5#Hs_evOHu)qNQKQ+ErQ0l=MT3fBQor{2_7JF7NEDG<G+& z@$kbB@vD39?VMwh1d<3rzf7hPhalP#@KaZ|hYhR0=8gZZ;y<5#jos<QWJ%!6ORnOK zORgd_w*Z}??;gHJrNC;GXmQHdc<TJ62yq%oa<&cme)!}w&+&gh{{=R?gC~A@Bj=xd z5+`5#3yN|&Yh6_e#ekOgxjbGpN(Dx>`hQ?KdrZ&ufE`+}ZhwIC5unOq)To)*rI+6a zWtFJZYJPdoZ+d-STWc$0ibnP67@{bVn^!=i!%eHpLqb?1Rq99Rven@Njlgix92#m5 z0x)aFbh5J!QU9ja$PYuDEcNC0KwC4o?Xq`p1S7hJbJ!WNf&kVOxdu=*aKh4Wyz?%C zAW)o<NXXM&W^PSo9djne)<n9)1e|0`-;F4z$H%^g78Xt$f7o^54-Q}0U#Sq7nU%`3 zTlVnr#~-t3(W1`lFDOA122L>~_m~_E;PiQ^+`XOWUV4=$-gu9S+B!m^5QSqWa?a`J zu<)$&$;=yd#2>HMDAB4!d||t2!kmRedW~H!H?RHsReo{Ty#xaR{`0^coOO~cc2V2h zOoCDb<WPN!%Y$M7VchErVAW~St5yF4%e>UYo?NU*U%pM%4FgU^J`%6;%r2n*+Rpt{ z+nro;*%g@L!#M|mZehhu8`g34m3_-Ibg+GG9uGU~n>l_|b_a^~`MYK(Cs5JmL7`A! z46|~Dj?E+d`BL~AOEC}Ra9UWHS&}3~NkSCGnAaU{G}g%>zom;$?)wE+sX%1{gGu%_ z-A-t0l$nG5k^57tP$&dMQKG7$iIUu`;h8WRt;}{cSqEJ3`-!KY!yIRzI5QPrLw7mA zE!7SD`Np$*oL5r{bNYOojr%GAq0jof!#Tz#Cy->+^XCWu*a?<h4Hu<KendRZfDE2T z2%K)Whpijd@zIAL@$TneQPt2yeSICt>6x5-&JQ?o=~+yeaUAA^qyafcgGPZbTuU<d zj2|GxS%<{CtgNc${`>Cd$(R4ln7nNM^@|%g^|;PRV5{AMGA$v>vlQ?T;C3Ahg)nI~ z=v2qJkoxJfOQmJAy4P1mhhXdM&S4M1TJ>6HWOf$Tw|jl8uWe#<Q4wdaydd(tR-?h! zrFpZ%VQ2dE>3#4j#mJ^+iHjo?1x)=ZnK9|L_!}Kal7vC8KjL$iB&i#yf}B_N`Fx0? zNH7>gjLKPsLP1)aWG3nb=dL)i1FJP)P5_fx_Apx;<Q!+HZ+Td~R*TEyW$V5J!vmJa zc*rb}0ds&yRdo%GO-(GGHcr-p?c&kxYih&p_Hy2$le%A4l`^6o++Z=;)c^n>07*na zRF_dv-%O(6(D}-dGL#B|MFm;B^3lg^-n^O8($YhF{DKlRN|3ZNSO)#_&prU>H{Yyg z=Z+ox;gNq(+t7g1>16EGnG{W#$pg3EO<cT%)U2EVKS#Y*LAzVlU7fM$4E{C*wXM&- z_%c7g<1Tbc1wT1+DHknS!1S@5rC=_Pmv*O{QAw7V>njKY7lz$d)xh}h=O5ExIeYA( zL$Dy%R}QyVxwtSVvS|cDB2R7FjRahO>o3vkW!9Zery<E|rn;^vDmvrE@AuOevS26* zbW|!;tT){c$vd4!jm_ZzNe18}?N=!XLZ?R>?F5F60{J_KkR%De-%lVAq_(;oNs=(f zn@LYgJ-Q38P|E5ynFWyKf!0P@KQnM>rrqe=Y&PsJBQV6}3@8*biN~5eAS9li#tW~! ziYQ5p&Q2rLgT&m{h89jJ9fw98yREF=whMDV#R#@n)KHqzw_v_Ws~PsaWMXO(uWaAP zqJ;~1{)HEL;e{7?_~C~!nM{WU&S;NQ49fE>6pVz3+-?tR)~(~iPe13~4?m)^stO5# zqVc7ie9|e*TYe5j<4b#Gv<}$x5(Km=@CId8Y{B@cgLbT%+B)vK|2I7Q!b>chJDb1W zconG$mTsD_yDDUsb*?o&LPC^1z=50pcCVMwVPe`b4VFngg?OaSc3jo%4jexJuzp9A zR>SNlw(hEfwbVLX{P5DtBQ=$RLLfIY4WB>uyYAk-leDz-K2hrf!C)kWtJmxC2V-Ly zQZR&|KKyjaO0v>svmqf73<l9?25%$l=%k_wdn|jl%VEKbFIYLS$JOfPl8eMtXm0^q zbFX>L*%QXFVRspgZ9|yn?)ZLj=0QEovoE|vyg|>Xv?Roqwl15BkF^JC`1b>MbbH_4 zs%lEI`)<7WgF)I|9%f|rk(h>r-RJLB5^t!y%hAbJb~Ltf+R~*2f<X=(IKW+Z-NpR* zeGsS+1W>9$sb=@i9qib(o4-HyI0q{Z($d@nf`YlHoyGDiXEJfd9Fo#9&>M#~M6K5< z@P_w=6HXtT(x`9Ot>?l^ub`^Bnul(>noCbxgu0iA#E$ZVGJr-!zI?$Dd1(X3nDF?6 zBz6cM9IHTi!uTTThl^%+_pqYcac!y|{wB{eGv&T|05x_OUmUEXq_~8Y=U)_gO-4#0 zW|NVYw%9OEMfrZF&6pJ~4>`;R6~$_Fx;;qo+9LwXc!Q2$*sBT+vGiTpt}Ot}m^MgO zuSO>mW~|Aw_;h;{cw<Q}naM*;Z89gyY*+Q*0>!2+TiLOD4`&`X8C57mpbO)0Yh4p6 zm5TXOyN4i~+H8!^={s0{xwQ<PS{2!(4mVT^1?^tnu!1GPigBYTO-o{1Lkn9QT3EGe z6`z0p`60n_<Hn8D)zz_P-3HdIT}yR!HBP%7t-(nCm<jy&j;qNYRg6llJ}Q#VKn#OM zfz2f%0@D|sjv_u$674Mm5|4Gc++2Rmb-efC#}wvd@%~GXQIvUTz1^zDCKBU~F=--| zQbA3teL&8)wxu0Ok|Nr}$1GUR8Q1f~i*8`MahOX+lnRA(%bdxw=NA%rb9XrbQRLd2 zeug&Oe=*KzAT7K>tGjdvx7%%4tqFZ<Srdo?OSjkCjbSMDk%(Z4GayP5e!mY%8am6@ z?Q-DtxByso>M4VJFttV&&Ne5?f(N!1xo%SwDF`octwue#-$A94Nj&DnBUa++&v@#& z7f>h!CKhDIq$xVa+R6qlUb3KD2o}KQ^%1Yv_4!zPD(iY|^xUfrqg0|-5C2wXRI8bk zmc*pABp&=`Gxbh4pM3HOvyPuji_K0j2ws<sZJRezSyM-O`F;#K9SV&OquGizEr%an za0OZUg~TT$l8~G_qV`Nd5YTG{Tt11!^ej@d^9ST}Kl=2)Tz$jMxIJzjxak^J&Y6le z?(pR;<<+$$nv5}|MsFZUhIwGhq?+wcQY_|(_V6(amW4fZ?T}fpawya33(y>vIvTD~ znwAu?u2&tbrJ~)z<v;l;W5$jT@0Usna?(+TCB(XhD>klQ$CA^Q_X#Yc1<-wdKW$w$ z#Qt_4ciLL9Sgb>Kt*R=@5Ji!aq9V-k@k4V^wFVMW!JH(E9oSk}FlTm$p)-iPa=hFr zM5iCJ>-*|!uK;mDj=p1!Gm@2L#aG)H^S|8<EgWoaW#yt1dwj1XNlfcSC9B8qT6H~V zjqZDkw*qTCq9~21{pGmqG+x_P&boE$xch+zNzTegq0*q!=}5Asa{SDNoSU1E!4!`r zA!*1%sz>8px_t6paop1Lj_R`xR2<~NhachD7hfhnH=8&9_$$U|B=<eqvA3L2UFvW> zfgqXvtmo}*)HJk^pjJkbSjQw-E}k}CI_HEb-JTD5J6W(BtA;lOt5hhYYiG(#-FB~! zFDvUvNl9VFxfgVpdE{iIqKgVWsa2|&@{#uTHYQD;(x>A^hfGCL<Uq5nn<3G63lstY ze<U0`6vO3|g#fO+>_@|Jvy^hZrXh~Rq;%9O)qppkm5-x><V;xrT{(11_sw_SqpqQm zbLUP)^!mH8qbu4SoLD-ZITO1JV^r2RA_x%I$C}e-yAyvf#MqRCK7YS>t%hc|m()1J zh}mOCCtFeM5y&hk;p#s;i$1Q?fJ-ncFld#07l&3Ypi)3kgcHxa=!i>5o_pyPZvEw* zIGrx8`{4!Lc=o9z7<B#mjBWcXC_XMW?5|cT2P~@7((WKZ-#KrONg?$Kc^N%EFGeZX zRJ67aYX~;iVj?qM4n=%+paxGM$n`hh7HR05oM0xYOK(7>QV~PuaXFo2Wc00k!Rrge zcmfVzSIN7+=O2{{B_5Y!NOP9u;YQC3=bbdXlS{23DKP=Be}IW$ac0OL3rT513X}lv zzW)INa&vUC%e-*<0(?<c$%^?W^!VQQSFeYDXt%D}Sx#!40bM`Duq8>ttm`xy>m2T3 zm#4Jov`k7(q-x(Ts`u@RjpB?jFStMBVA&r2dh^A6^3vm^<`iIz?_c!jK*d2$UVavr zUUdy6c{#lEr~A0?qO<x9l#OleghY`sT|7}=Fvvhj1vj+WW13bRlb&UdAy`0+>dUvU zY50WG1woK5nJhD1*Vi_(uBMT(W5+RTwyavAH|TnluoDCUK@gB6iI(Oj(lat6A=<-& zWq5P9+1ddi(o8k7A@xHgMXOOEiX!3=i8(mzZM3yEla`jwgmGhseSQ_>=TTADFfbpc z(aPRre8QlWgdEb-YiZ%RmtSFgekKO3247n&d16mXJBj9aE?(NRW@v453)X&kd|UQc zGNB({CCGZ9VwAW0?%oQ1Jazcz!L*DNHq|xr$qRp{sI;>gyDuPto)J5|9y$G_3zwz6 z`Sd^7yKNIEEIFNr@3@h+<|e*;=ieC3Rwkd=cYeUbk3Pn4{_r48&CUG%w*TXt6K7+N zGak`*{A6vonRt900b8fM<UmQ?xqW_W+8tQ68n)Colc3ifn_$^fn;_92h~(w!?XGTO z;zK#oO$Np!%NE;5`>If>)!hB--^-x@rGosdG*rD<-fFcHpHHNrzMfG<#gX!g!wtV* z4w+U}9z>xK2nHqE+}=o^xc+#S2Carbzz33S^$UYsz}(ze2S{9Y@yO`(Vbp4=Z#hb1 zOQDc+p~)G8A~4X`@t-%|!sGQZcYG02FxYJ#e7?V$tIu9WT(kg%Ajl6<q}}dd@~G@S zZ%`FYZJe6lKQRZrN`*Jdm}_=>N5niRO0<w{(DT(hudw3!dq~cd`*O-$Itdt=f(vgy z_fNih|4n}T{M-EVH+S&uXCIPPP{eH)pFzOy=Zf3!=iARe<?FX!q;TTl1y5di?REb6 z&?9Wvw3*ox$MM-i_fwK{bb=k*%PUYTmEBST;!)^3S2wru#kMkBULSRB4&1>IYpUv5 zQ&o>%a|{ZpuRL*@v}nrM9=ys<aNOO{a#R=nXuZk{Cdw)mUsTl4?)7ob$_q$HNCW}0 z(~^lhM1i-_pvUJ6(AM6{q|zy9`@j+uMUhaL?OIz?6ZTN$I@1VP_QPTmfKb2}skKzA z2bUSz+)xX^S<6R8bJ~d|MZ}3m7={%9Lp-Ep$$3y=csJA+Uw#F(N=fOcY=RC~%>Opj zHPPyDaoO@N-i0L5kvK1_uIaNd#kaf4(I}N<_fz7|s8Pj;sk;M#5wqXS&Pn5~-3R#a zxkvcH&weMbH^3j1(5Qyz-qs#0=Z&WxWykt8oOjiY<duvidsL?~j!LCw*QRwSl`1}X z<yn6D$kWVPu!K+Fc$xdJ`4MiX18ZU;b=5VP5_%`(>_2dTNB;3o{{HyC$j{2)zMuS% ztIk|{#NK4|Xlb`Iu^_9P9OaQL7pK?9Ki*wMO^XeWKY%GN4y{(p?Af!)%*c>SV3o(9 z+}-ixih2f&D6sSegTt1u)T>pLrX^8hck$W5I#N^9_~B(&0AMl2k$f1Ymo8k4Ute2G z$(XTdwTA~PpFhxPp-B=7g#v{_5z7Ydhw+eLGU9N`;kr;LH0WSiSy4t&Q3+E@Cyflx zQl|y?5rCy34ieMl{G@XD2_PFcZ(-f0%`6KO&BQLzmJfH9^P{DUNHq7rJ`PWpt@|pN zH?go!$J<}i$b{5{eoNfxR7x70o%OCEY2@StXJn@E;l4^fdhYL>bKTu&!=X)IP(m{d zyYK#;Te;<e(`c-zLaoto+YiqqEjyQgyuX^nRJrVF$$38{Gj9}XjfTwpQEXZBC9@VR zVZj+INy*Gc428J;M`yEO<>j>0RdqW?V^b6Fy#FD0-TxaJ8XCFb!WG<n-WjA=EdzEQ zYj^D>!)of*^+pu?AIbV)-3}_7+j;-pcS+62M61=JR4TDpEHMg9#~i^&-xGL9Qp`pF zwxV{}yvq6cSp-5NpB$*h;}3B2ZFiv88_;Of<Y%WJ)=KY~C{Cx7qT<oLs$ax}zdXLk z=4N-;(CKvKWoF{^9a*a`0dR-Gawzha4qF@NuQ+q$OtSunV+(=|lG%lFqiS=)hyY4} zr=Nd;Kp?<^$)k}(5i!bR+tFg9uGPlvmz*y@p;YxK+TLPw^qC2}rJ@FBNaBf&yZAgz zYHRl%J{@AwX=4NljA}KFF3*U#h8m@k(MeYPejlsfd$rR*4Gd3nhNu2`AB{CtTzB7} z_~$3<nK}Oy>Z=ZN&rdFl$yILs_ABoE@k*|{_fKs8`U|c<YXQHz=}Ojp{xP9okYK>i z!qd;@lNTS01+n!TIC1e(F2Ck_rj?B1_21pa@2>jMfC8m#gdISy(ZuXY9cpX+E!+BP z=YIb1hd(g)q<NGS7n7HpOLlg4H>tv73M_vxe`b#+XQ+$C+%!z}l`4gT<FeB@&~9gE zV=IdmpURY}(-8!L+{{$eeF&*`sPzPcL9|*ehCUR7`=d5N0RflGg-&n8-NkC_Yu+-> zpu_K%ujycivzr=f2?hfkH*?yEnP>HlO??ANlLc~$!yuVB<Sf_2jTc|}H)C_s(Wq20 zOmRUFcxUTg=1rX>Z-Rm#pF{rGur{qK3KaZ|&B-|Iu{M+)#1{-9SyEBNTY10iAdhd{ z$>SS$@%EkrIQ_kcR@F)c-l#GqtxDM^kR7UVa$z<KLE!bj-4}IT`q!XfpvLM?-XkNo zfOD_Bfl*^7aL3=CAw4^fjbDAn+s{58W$%Uf?5$Vvc|H8***92r(dB4$dJgX0#Ro4x z!;fyhlQr+YOh$47qehRD^hxQ`rB_|U$;;0|s}OkV&RclpS3hIvanlF<9O{}|5k-;w zv?Qb`V>}QBPD4LRNA}e=qE>78@rCDs$00ww4)EB+4+nT%;P)O|V40EBvvngyfyKdA z+pvAV6Z0}~2ZFq?buUVVf-8S|9RR6GR;+zgrBErA_<TO}dL2rolK4I_5u?G<;dG<b z8Ics4Zj4~5k6vOZB+3Hr48G)D)xk0h1|uggm_K6XSzS|e?-2lnQuZDT#zA(G44BH1 zmks&!^Dk&>Y2}3RMcvlO_EtNsPB(wJF5LPpK0)@5^+w3ZmqAl+q`BRWR;}(in$u-$ zuc)Oke-xvqoJi5kQ&=#634+dm4}sOyjr{f7ZIre2yf)PeMMRPeU{r#c8oP7ET+3vG zp3zBG8fz-q@ZWdk>j}7gL+f2SZSD9xZcbVzw@@qFzM0h@zeh@@Ou%~ev4<kB%`F~- zBuU(T#raqglUaD?d0c=0pSkDpmpJ>!*HFG=3okwTXP&w3T7G-=C3wAFo_+CUsd&tI z>C?a5$3>^i>r+(gNXD!G{SrYCD9KETNe}tMdrg0in_x0xHpQV<DdpB_k|^gvBad(& z(!enWmIY}&C!<4AR_M<9=3&WK>eMP}MrJA>@2|oW407F#w_>qaF&Ok@r1iZgom#EJ zZfhqeHy=y9u}|a*m%H=)oen3W7(&qKk66LT<MR^?x3mfkvM|B^-P<^6?%Y9V-1cW| z+_kr}@v}+|S{)covP53NSjZ}rfkiQLm)~n|zD+?^I-|oP{-JP)OQBKo@s53*GIJ_Z zN(yDKGATXQW7g?GQ1IcJ^~C89AA<D<gRI?Cfx{b!0Er<rpGk9<Q#g7uDXHnWLm{5r zw2OE4R8Z4}XrxgpNr;M|#A(z6RzfgPV?t^ok|go|(|_qSOugcedY5r#OC-#C^LeLo z!`Tb@+da2(#qIY~G`<vDYjY$NJOA`^(HV?{y0oUNJy^~IH(bVNZ@t1VFFBv-V~SWY z{{%{lM-dDL38CTof3KAm-t*5vJF&*rHuM^Gw|r$=cpp>uqeeHuWTd{SiF+UTUBtle zHEMUP0Oi!8T&bs$5hN)l?!CLAWmvx7aoK6Kdc3T!ZKSw(G>ey<hO(nfq#rpfqh3c_ zTN^pKd88!utzg(2m7BC$;|Ya=X!J&cq8PE(`ZEkVEs`V=3IzwXadt2mz}DWvE!ST? zqUM@E7{n59l5>xl1&}vJ4pXM(fX*=N4A;YY#`O(6{rro}D9MxA)S`qG3?c{uo0{4v zuW#bf+pZ5!xOf@(yN-a5@|s#^^g-sXvayvwC`4OJ1GQEAJ2xklhODBAjG1yGQ)bL% z>cmNWT~*KH>v!<+{wi9dBpH*9oec4Oi)qA^k93UEv?LPrI(DvI#m==~$OecA?jiOr zHCi2SKJysszWA7&!qGhX{x?jTbpn^(au+U#9c4Jmq1I@)?}=Br>34sNy!WGjKhJe% z&Zi_hljrWbg<p2$tATUEq7>z2J1`jHC@3D!MgRIlns?`;0}h&>tldaaW(ralL%c&s z#nexMgEVVA_df7@{`&XFaJk(71IsZv>4)_y0qShS6TUevC!KfpR-ja=xcRm_QEN5i zW~O26=Z#mZRp|6u3i5L>84n+V4F*Hqr0xVkLA*uwX6@eovpV(RoI$|v8&u1=qsz#N z$Ils2bItB_GIhaX86-^>SwmLw-H|tY^|jYQ5;?9|t_u|XevrVY)$r}UYJR-@6p}4r z^{C`t@{yq+4!65chTisy+HiyKo(W+_lNoDz0p`3(%$T!~^z;lq-e1Mv*KOyk$~ruO zAj&8MB+n9$XNWuA9BwET0&{cI5k--;AH5OdT{47vLnkd?L0fYp55Dpt55Dq2q?5_4 zg{NXoO2O9J9C_`m1xuKJ`nlLzTlmd&mvY}vFUG7@^YkrOaMnq&Ywq$hmY`B9v9&d` zY3(X`A27sGG^UjE|M7t|<Ntm)U?*8tT}PtH80ldd@q5BQi!xIB^?5g(xq#`#x%}+T zyP3OaF%<_Zk8QA=S<<sYz7*Y>$``;J2oCvoo0FR%t*NS~#_nSN!jma1E+#)Kt(%-( zUq^OoGGmJS*3QT2_QU|1B#DTjAn_JiMP+MEV^oB#Zyr%%Sf;PFsV>q4dN78=-p<5H zlVhR;QK&CB(G3P580=P$HJBq55-A!xzGsi?J23wEmxoz6d2}S#DEb2^v>G;6H&9kx z$4wWk2!{|%vS-=NtMr2?^3k^&`=s8pYI~XNk^8;Gn|oI8QL5DF^ahf%3K={5RF0c{ zB8E5<Z|y$7BWt(uMMVvP@aCyh2&9c5o!E{sEi(m`Lcy1BJd4XN^8tb)c>F^*H<w>@ zIcl|r&)@k^jCi|Rqv7Ng7h+C`P5Es8<_oS`I*0dOdWtxsfzSVPZ>%(3Sb!qgYGKB> z5+q4t)7n)u)>lVfVv4s=I%6&?9)45GIq#aI0?ihiomRVp?39FVgu@OJm`d3{Sc}tX z`N8~|T()=)bu~2{zi=^Iwr=ZY=pQp+*&E3~j0!>StZy0?P048)$*ek9OG-)#%g<av zc6tg)2}e$~E-WlSuj`vf>gnQHOA>@aK@@@#jarT42v~*jVbKJi&x?dKXe6KVz1vx` z=;V$s9Se@30Qh}!ze$f1yl(k_Ly#lV>vR~6hVSG$`RJ2Rsj08$xG|kwKSX~3wI!ZU zHt*)AE0$A|n{{Zf(kGW~RMa&dR=sC`T@#LQ$kdvcLcHbh{XhkUf~350Og`xhCXF43 zGZ^B%y$5;d+pTP>Yr+)>Feb^uNK;_dD3#2}Ou^-_^Z9?C?lk&5LkE_VW}U!Um;IEt zo_UO?{&;W9|4zN&64c>3ZLi18WB1?A?U$^ea^D`Z($je6j+;nJw044IVw$Wj6$Z@f z&pR`0EC%`P!`HeUJ0U5R1*e|NoS*&Wh;PlCt5yS$pPGc!g&`e03PmKfO3Ae1Ty8#l zAz5ZU3zshA)?eJt?!9Hl7FaHsF`?I+6P+Zkx4VX%+*6R5A+4=$AP^F{=7w9CJb4Pq z2}jrQJ~6TH4T#-6^d{73bx26)jqx0aW+3*_v+T%IhJu0c;u##UbUN&;JYxxnAu116 zu)nMfTz0v~q}wTP+5w;J>3Ci8{{p^22h5q%r+sJF%2Q80#oX~lB$#BcSQ15)dL5r^ z+lyYO=jRu%3|j<ovUoyI!!OS%x6daFG#o0V78SWjPS5GrcU7si<W4$~xhJ2^jA^s5 z1%kY^eIJjm+krnM5*T5jSb!7rGSR72eDHK9^VA;#?-15q{`BtO^XsQxL)}G2anzUz zvH`Pe8^62p3Z8rD0c@?!Oe!A5yT8AS)91?V=g{h8l3GG)Oa%Fi6X%d@mFI-R)<${R zj_#nO)-bMgCg=a-11a^)%lo|$%c^S8Y1CvUS-RDIOG5v>%I=1~4k;L7yw$|B&pgME zuDFVWl~u<MSQhsZ!<K@fn2mEd%0|XdoyNM_CdP~z%gkBFk(zAnvpm>93|Egt2pJSp z(sQYZx+X#&Ct_i^6M#RwX%0phw))^cK%#WQco0Q4Y~0Ms%YH)j-rZntl^-rg6krCx z=arxH4<2CF*40y3kpG=rC)G8zy!XjxOe)BV@#5@~#9OPka_dFskYtJP^eTHZo`OMk zAFMiT17CkI$eP{dokm`A`jL5TaaK}`rf~eC6^t${qS@``g>7X#xoI~$n_5TIHMZ)t zOiD|nsjixB-+UV7T@Ed<&sn^T3$ML3=DF6U2L68U&$<501$^}H=MhDbJ1@JCPagUW z6Gr99_uG;Ld86g>r=VXhwdlAHYBiUiu{84c*7aZYdVEv7g}IB)V#3w;^=l!%_sv>4 zCn-tY!=wrY$^qa8R5iDepwn`BX$j?f_b_MvBGzr#cx-@WZ{!}ai$YE95R-cZL6Ej? z-HIql+;Gcn#Kjp&w3vtN_@XGq)L3@6+|`7l7_mYhS-DAO6Ka(bmqS+Z84Qw7LtRx& z4)x@DCy<$*%G`^t<by9)%VAl+R}R1WykWrf$>8a-4;o<F>~_vrw)8u>PX6`O(<GP- zjLVG;uYR^=52Z!<T)bqV{DdJ+CNA}gf?oc+Zqs4&m36H)YQvEWjaE-`TJ}+We}l<F ze(8xUSh9k=+&rr6E}q`Bn<qBzqP$DDl;QR+H7X@rR(%j<IDkJm^r}8ykDL8FxAM;i z?&RuI=kWYPzr|&1V|0ElZ~ftJ?z#LT*+A0iA*V>Lqg97J(oiT2mV*2c1TI;A3f6cN zk|fdI-op0HYkEDlR;#0+WFmz>ytU5@abI;Usn&SJ9z-hKfgl?7(SfBe5Tw!WVsw&) zc&&!BOY&%FY+~`UGmZ^y*xp?8=mfFLALu6UHrPY0R#RPF&2e+)QdnF<T1rBnTWSr+ zLh<=}RM_e82+d)U<c(GJ%*xB`a~M{qQKMEVBeGM2Q9e>rSx&s!63Les4Mv{%%O835 z&A0i%&+p-!ljrg4>#xKbZ<1LQf*{v5hJx}#5+TmgnR6Mid#XaC(R?S@$#XBh%;~cx z#yscr`uKe7US50P4vc!8yf3C?9r~Ji-5ji|XKe1FJ;fad>mt9Gj31cLwMwN%6`w@m zv_<5Uv~pm_x9q8?puEk-=p-w1^D@Zkqrk^tjU<DPMFrV>`qJb4;OBBTAqlX#LzwiS zQ3)spxxA>Zs)8NsR`bsD|6<?vEwr~bBM1T$M&)t+$}?FyXGUj!GCl#)b7fX{thF6( zo+5;UQ38cIS<IVO%4`4ql29;2W%*vlm(J?NS?I96`sN^P-FE<w&re38Ifj@C;Pm-v zu)9znrBq}^Lkl2b38xPVtnn-#ozH7K_aB=rx+3>F>VlUwwhno|G7t!0u_kcg4=+Wp z)skp659#?wYr@7(Vj1L;QZo?*fmT=lYSsi~hMBFkF&vc}c!sgdX=lah%fle31eF@I z)xwW2T!|P8am}6gvTpk>p7_;mOe`8jxGq5kOi>IIf<p2}pw$f+U?wIckernCom&e} zJpBwlx3im9`SKSVm_1=Er_2t^mKn{x=PDx;+efS2LGt}{n7aS~AOJ~3K~!P7hioW2 z7;fRFAh&SbfS;4bltA%}#f%!;OvRo}Y~Nqb-j;S|XQwkR#X78@d3;VfAD372)<1sB z@+*HPdo@AuJ3=TGpjHZK)dC7dI9C>)p9%q#3c_OZ{hPA~%XU+>e=ncB_9ENXeM3`S z4Pw|~m^XD2|9AeG%o;zYvn)udf|N|KB=@XW913=>o2Z|E{rUBLx^^QjuMcZd?`0ev z5vR=DqCS29FE(vOk|bu0E<oy{{kylZ6^B2BCGO}Nh1Rv&uy&CMot2e}&FlOAgXK?_ zo+wQV*Nb(#Sy8V1Q0u`8f*=9>_{ys(88e2A)Wm)Z03Yq}^$>z>Zf%e1fhnNV>9KW? zfJ8}Nt$i4U87X|bry?A!8Q6SGQ$sBtw~MUIRQU;o0t7V(3Q#Dx;^GUKSvrA5Ke&vA zSKPn@*Z+h|&sZwk?_x-Pog~RDSurH*vJQ|~fYoC8POg*R|LHHxpHv+4TvbyWJ1gth z|DWG<ZiuOe=|dO{f*9i4oqJg}z4r#pZl9m3Mme9DUo?Ku^7Mj2fhs<QqUnpt8CA{B zEo=DfKsBqY>KL1xz|!J8Oj`AjUvH&CV0Kn2umA1W%v<?mOkozVgd7M7iV~iH)XfML z1bGQ61la>MXcggBU)|^KrmsK8<*>71)u(J*_YIA;)wDL&hnI|k8RJGXwPX~RE?Z1- zPG)RRQbQc1<;p)}5v~&`1HRZb6aGCtDUmbhoxoFXe}FMAzSnEekpj|abtEspRBC$b zi9;^Hn#LBC3I%GFvYXmYS*wlAoLqFC_M^Hl2OC-_$;s^Y{K8S$-+!<ios-tPWfK)1 zbo+<C2VP-OF-w*%$7nG0S^IS$ho=W7tU{qC5Eelf1TYzlY^rYH{AuF|`Ftq#eJe>x zj5iVrg$Ve4XtcTk{od_u%_Joy$9iyr04fzI44_goY04D7dHrQ>y7$-o<lf)2zp9%1 zuf3w<#><<FD2EJ@M47mtGmdz5oxvENulkCH#wKPhnH}@|dmDCf$E6o^l6uUEG7I)l z!|MVG>Ra2%KZH!<s%>SRMdahA4*EGtfF>b}2`4Nkul@i#x2|VnT@#fyCnw~lGc6+p zwQ^{U)#G#0`J$qR*B-iuAKv*;pUy#&WSbShAChqULuge3-u61&wiecY_7Pjwd`VkV z1LeE6<MVcUV5T@DWAbw;%1Y<|&OeJOC56OyEpbw*<&qF<ioBkpL9zoVg8}fl<@|q7 z>qU|nn=dn)lT$N$j_QeG4B#d9^1A5p+UH+0E>DhpbPdD$lv->ptrS|1u2Fis!%3#0 zd#+t62;YCO?5#aeSK4vK5Hn#F3I(^{bsvHtke!w^qzu>ySoWaK6WuIY5ELY3=F!;F zL`92@!hSU66~dNoC=?1y--V())}tFCp9j0W9b*rZT8>+3L8+#2!UW!Y_DLRm<nR3a zfd|>VXCHsQ<ywkzvgCy?gkSITLR&Lfkc9+}F~EHAPY<$W+Sr)f{x>`K6Osh3JNJyv zkX&jX2sl0u+xAyrK8*5I2MabMrx2}9KV;{sRB5nel`t(io7Mx{IB;MeukR{nV_g%A zMrBi+ICPN#lU9vUt>)vG|HZ-!uO@TU=)=Cp(cXfssez`N3YzPxs43sW!ChNutFOZ2 zbYN?f<vLX=6~%cu6lP_RkznES(@#OK)nJK>BRwghr%;!il1Rw}t-d=*c07W986>?P z88o|konb&VnoJlBaipg89EtFHy)neU{Gtgck2_Tgee+(gi?6(<j^(o^A%$W!b?sgs zqYCo*@au0WNz6H_d(znEV1l`4Z}^zaS&CgkkWJ2^?SFUS#g~$kn}<2xNW5uylwSNj zs1+HF+L(!`RLh%QRlA)+vG3IWj#go9&Gn>b7Z3;p2Lvp=9v3>T0<YK0qWSX<^#wqq z1C@pwZ@iJXcr$nW_K%!&*>ybmtJ^qv_VjR<0RV-}oNW(FeH}x9Sy$h{hD}@e#mdDo z&%d*FJFoxlE;Jp+Q*uUkf=5py;Ai!=ofK#Go~vrIIjL>2p;Rg<89#kk&Re53kT!ZI ziTM*~Ik1(@+qUxLrd<?R<5^mqN5&AWNrfPgY}9km=HT9o7hz4!ASElGV8F+$Q&v#6 z`CE!gXHvCi8wYo9#o6A1*X_h*Z^zcw5{Zn($Hg&i+-NMu9Q>gWcVBt|YNdj-MC;-E zND6|i#FU&N|BN=;#V%bq0zP@21pIPDMhu0+zfoWsju*V~#cE2%PeIYcnioY8x7*X@ ze(1=^?p<~4vkhAai6Zevoh-i?HFh_&kTd-_Z0~=3RH>{co0DdzoAId$#~xVzVE#<$ zq)8>6R+-xy5!vmkD>#%)*tGNv>4|4wLZMWUot`o**G7`09$Bi|uqQ4cAR&=mFq&-} zzNFRV=~ilUsL`Ph>-D(83uIvOmL9JMi^Ym0N#tZ_^#!#-qveX9{Dk@Q=5gA}3pnlC zpYf+#uH}-`mtfHAL6GD%9`J#!SzhqEk=+$!pvK+z-ph#-3S%M)pKjj6DYK?BXX3a{ z<H6d;dFpmjR#`<-eD7e>LF~yHH5QZEI;`if)*46~J&SpnMeN(UntfGOJhovcQ__++ zF)tIdZg82+1=e^bpD>qpx0h94d``gDgcJ(#<m%5r5cuY;=P>GZB$~~{t5uX_C6i() zBu=ko`shN&kIF-@)i5eEqtmeIQ|L#Kr3w?%WRQ#owGJ|z80wUb>;TE=-#dcC(LgCd zo87^GSAWYn7hTgMP}=NvLOtvUS@|Wse%=4B-;5x@=<Kv^Q9-vqh}mpGlB7P#EA|?K zb-K|g6{vez_up%<%uVf7ve{Kt&qo_}aQztzI<2Pg*iqL^FccaRS3(d3>879Ej!vg1 zHOY!zryZ7S<8*s^tTXHg2ZusI6iOv3l^V5L&F+R4#D1_^i^85oAmEFHV+SMz8wfFG zR4(ahY5g?g6%>vc!)Nck&Bd2o#<dUpnX<|%{(Q@IauP@g&k4T|Y^^eQ>c8KB+0xp| z+wXnAo#&krdCunYu&%6<bx-}Zb5l*t?wJkQOBlAIu91n^y@Tr)TlbQZoJz@r86)Oe zXibTXnYozE+;aBs-ojUvb?j(rWl2#k<B}5wEuX1VDcQe&KTkgU9Mh*y=lZjka?ZRt zINcruK|l~dt5y?d(4$tVu$tnI?tm(_%w|qVkx6Y`i})jb9K(9b0l&N^LIIgQ9`MT# zN$O0ZMgb*A-2V6r6cmr|W(Y}=gx%pF&<j5#B|QhrDd$V=AH3LYFW$6g9~Ps5r1&`e z&9QxU>m4qVwJIb@I;>*Up~k+N21Y0MZoGZ3!7?YM)15A>Zix9iy2i4_HFQka#H3^< zl}<sUQInpWIBeI(-V6KJ9A1nrrwvnB)H*pWo7(CF@_G<OggyXBcC!554uU~ofCTEz zaR%IO7gHxsI->WdXJzs7^Uw0q6OVJl1Aj)NQgioJm&hI_icY|Ev~_w_-&4SR@x>Pz zlbI5et9*asZl3t%jh&maIq~qNB9RcR4?;mU?%mIV@p(PIq`uWgtJBR%b52F0(T=F= zp-`!@WR)-}HIJ<F&FtB;ix;=;CDRng8DsJXrPRcrQL$@J8B?ZA;e<JJc=xL{+<g9- z1A7pqN@lgjTfq=7mr8XHHAOW$4#{BI0gRzAa0WYoGTbSpqgisq=9bv9x11;6c$?$r zFYgYNb~}EbAL$UPy|Yi~xrzI#EjyS!TAou<mlRrq%Y!;78|6n+pL(#N1#6V1c2E=% zB?(Q~Q2buUnIuVKSCvea-g2Ot#3-vw3PgkD(Bvx(27`3tEw_=HmPTe;5-Qd3wQXv* zxq5JWAucR}Zi?^BbtI={AxaY4Ynu@J*|MvtPS#ZnhK?RAMNwq@xFSCL>@%iLE<NJU zNk~cI>YHxi;a}XupPzq~i*CP<Hk&<m6Y%@M*)EeAB<Xv%Hr#FxFTC&~r_b&bA=px0 zO+vhxxsxY$dLe23AWXO%czkllk=}$r*6yt!KQEs+%gC)oRjIY4mdxb%MQ2f*mru3b z$v-#j<Uc$2WAhGdx~3?>LLeCA_19nL4-Y=b>TSDdZ0lqBgCNLxWTi4(J|)P%YxS~$ zV@-zaLdYKr*+p_Fy(gfI>ChACB=PvYu|Vk$17!!Wb^*%9)^^Uj^S2}<r<0zQ*Uh8! z9R?@?PC0d1x98UEJ%GdICLzv<6bd1AY3yCoW{)&mKbktreRWM(qnefbLLqEXsi*I? zXSt!Q5>tZgz11|glaXld(X$+?8q2fKJ)c>}9Z#ImK%ymn*se=37{cxCZXoD1nn<?{ zuiJ?(+<wWLDAzMqwAv``2k05J8hl<?$67)Z#iL^VN|K1)V4||J61D0mYvYtEuDt#R z40<g;y8S*pK0oh0^82tN3Gzk|2*}cSDs|t;E#IN><Wo;lm>iEmE1#Fk>tof9az6R% zZzF~iX}R*b_jUL@>@2T1B)Mlxc@3FkW_%~EkwPC&(X@q(DRr@J{g-@ORYh5gjd}T* zOvy;@HMiBDVbyEVs+4Tsx|MJKc&~8T#Xpc9eBm`7`01sck&TYICkUWWf!@$r=A=+| z0$9gulq&ggxbN2idZA!AKN*t2GT;w;m!VDuYy>F99)WV>?)_Z#$4Buiw9H$4DmuL( z0+bG?6Q9?2SfET!N@U8E$;`d=25HrAe<r(#`Z&I+Y(yalOd6Hd%~<z`LS!UbX|u~x zr5Q)aW^Q+RaC&`AN=uBfA;c(P{@!|)moA<oJ^uce!h_GhA^iAH&j^A-ATKp3#@dO5 zhU~6E|30ayY0^38T_~4|WF!wusYqmEIGo+AGk^q3XPBw2wX++9IUyOfT0_0vh3M}) zSWd{#BoGdnNJx?2k8}uvf_0m=(ca#U)q0c^e}w{6YA*Wm<^1^<H}S#O-}2ven>sfj zK_Mf2C@7bfe2=_Km(#^l&pgY_l1}UYv+d>l>4u+>+;LsaNwQdWzdqQ`TdTey#nN+L zt*WVwCcBH|jPH)nyh5c$)LEEt!ZM~zn24xQ@Y=3&{<UEzRRg3YoohDn%1bYjV$_pY zxm$Sm(=UXoh9>!+YAxgx%a80L$jq0!eHh|oAl2&R+@szoKXit0vvI}Y!ZcxTG8|?N z2IXjq-xm><K$5~aOMhp?r2{C#!{hUE_rG4^q^oYB+2!Yi1*c;$nqq*`>ycaa35QS| z((83BIb|Lym6B7Jg~QNsX2>n(>6c!{5+~;?r7paQUG>e3E67D1j?x_|8@8;b0kuMj zKB~6V8w}!)B7%Nz!E)oi*lyPvl`1wg6t(#^I$VQF?olWd(v3g6owzs?NeO05!`$o8 zX74!!YcZP`J62X*2?hKy|BQ>bu&1#FsUM73Q&_+t6!u1gM@jM#1gNd9K$0X<l9LAF z#(+x0wbx$Dd8eMt-(G%Q21<pZ3xz%uvq5~<$Nj&)kCGH~gaKPt*MwT5WB&ATBW;~t z4!`y%|09av^{{zgMI>L{Ez+~^Ace)_zmwNYlptrqTo#>n9;5SeC~vd#&y72Ie(PS^ zJiep)?BXN~JNE32{5>}-g+Dz1ANdbQTckhez??`FNOt5S1Ag#(B01*>DEh<g?K+gN z#3&C|g6;b&IR1*8`O}O4VfMV!IAOu^hyaNsNjMyiPM{P76iP*p<zrf{hNY*>CnHUc zNN9~#v?rb+kzEKXHGB5%V|-YQAk?M5ZllvfY4IrPTiS@zAG!ERWkW0ZR#TV#M!*qO zrt-Z7%ksMBE|XpA5h(3m-=Ke&1&dB$`ixnq)he>ml85!WNRouj(H$(c8VyFhj?~oD z@R|~1-cvND6mKBN-iDTLWjDQz_;8s{Q@CsT(Q3pBf`ayN(e>hm3y%I`bcC!_YHqsZ zLbmTKm;Vlnv&(rP#lRALA|#4nC)3d9l{dtWM>I`8dV?B((bnG1>eXvFeq5pK8TbQK zwRw2tmTNi<i1hsag<l~e9avUbO<rnu;#wdWV(s2aMo*eGtWlMt156R0LdV!S%Q@$) z3rI^zW?MrGe_ywqZz}5u9AU$N(Mhok%sh*U_dfkxXtCMld*9M95DUMvL3+pB3WdVn zq*o5VhC1?*AsIM>0U0<ubd;m&D1ZOr8ytVdjnvsZEL?gXxdkN=pbUjV*ladDUKuDA z3I*{d6K1m+oi>)#Wi%RCzH||z3gjq9WmOHU*Q_Tarx27Xwr<~n&+jM25-+#q>MADV z@G^c>0fAr;z4pjcB?lXt$?K9DlgsOlfiSGy?TImqqowVlH~U7%;N~k8N~N@7<@q2$ zMrtBz_3);Noi0z0WSazw2|*A@NlA%Jlo;T%$lk)1+D1fQ-wcdYt33G}HdzBS;6HkD zL?{@<U@&5eiyNRDqyV*=sWWFWZ`O2BtHb#orJNt?$X5zSu~a&&d0)6?nA<7$)pSQa zTu~3F9h^3B*yNn4$0fhF13ZsnJoLz;j7o|}rBo0MiR`Rv<Mtn2&{@2mnhnMyV12qA z0KFQ6I}X-jGMO>PTOxBy_>Kxc1VSPFS}T+0p23n+mZLKod1Lnh9{zSKbw{wDn6(<x zyVM6REXd;d4?mOtXm9SWmeU`Q?8rq1{qj#SB<JJ18D(N;I5ybfVTN;;;Zf7r!t_gS z;P!_fBR!{(g{Q3~F}bsh%jfga-fqJeUh68A3X9o{PNzeyQlW?{Rk2#koPEZrj4H@Q z5TLcKop;{*6rVppMs@)JAAI}?f&fJsDc!tEfXc>ZW{n?BO;htx_06qlY$ZV-3*><? z8@6K{GYUS@TYogUr^e<Ov||c_Af0{g`4kn8#;DhmoG|<%+wBf#w@xEXO$`)8Y3M2x z3W9-HV6!BqqE@S^Xt8zEW$bNC%+Hd`7sJ<E6s4mk`PkZ;2cAW&P=d+Itv6hUq|qTr z;rxt3Dd&V#nj=&6>B=(f=>HcXM@UgWrOufu_22<36p`*KsI@YvE0q2EUJZ?ntX};M zXH1Y8uA3?wIia+aaRuQ<1D2$|iw|_O!fb5Zvk$Yb=PhOR?gNZ1osHY&j)0}nXhb0h zczr$s{=i`gAR}u(k+X0rOBOR0tiWEspEavj@z{nPOv^}Nc6KTWeGCg~RZ1qO$EFnu ztnvKg_4l~$+|y;SYHgII==uYa9pThyvQ7jz1D&DOu5(osL5lV!<#E?PpXbs4yiG__ zFzvVnj4z!T<Au50ZrpD9{t5_av>M_~rkM5K(Sk5PFNej8=3)s;%h~Nt-g@^F><&2( zoRpeHeC8-=-kj+|ve`sIdJ@4N_Ub?=M0RR2HBBwOGO!ODf^BTY7YH)GOGLyU3K2LK za+cjZlBko8CbxJ4!9hD_c1|vrUjCC2LF(xkt?k_>+$SHt&*%S@ySAInW+X|%>vea# zekEf|scCoM?L%Fv)9XVO&QXYBFtWk;kJ7uWsVZmOm@xx?VU$X83yTo6I$0)9XOJHn zecuc6qd_tl=xjdS5#|zuof}jn2NdcqD;CW<j1JlQys}s7Xajp|xQVq_-qiXqUVQl# zCTAt0QYxr#cVUW)=e(0o3WpBDJqwRyj)p?ub+KyWRuYUo1H}Hi77{ZG@P$SC6$%9g zy&k<@kHu`pVlkuDXuosbri27a73QqbEIjQza&mH6TieK^>vyo~U~Qj2C%p%Gy-bBD zJp2Bq;rMxD-|lk<AVwQ$9rG^GQ4->d^(H%Vm_dK1AVCyRZrQt^WjEi$Z~pZh=A;Zx zIrE|zpbQ3swA*YELr4$=jB!TH@$udEJe5kt<kIn+zHCthDBId>y!O@y)Ymu0yf!T> zpZ7ohl$0>>u&Zaer?HicaIN|mo3@c`KC)<2SxqAbwF+gIxu;Sn2ujC57`EGb7DWOb z@$M+H#$bV^N~Myny!twHIz0)Nc;e%X!+s6i9&aQ(5<T92<3AJ^7e{-<-4u7kkcc%o zouDYPw!G$$d9*+<#0&pj3qVO$D$U_qOE`LxkI(BNCo6N{FODFfP-|qM)Mz_@9tlu} z0-fZDjw0_4#$lwEEzrp{41`}B`5At6gw3Ms-vWLaAU!TQRBLOI!PDakht7JwFPpb+ zW#6_<j7l<LcYE<FwA}OKi%=<*a<O`5z8ro&lHsy}D6)3f9wrrZmmpldtDG@o#^d$- zBVMIWr;7liAP8tQ8qDT+tQHG8t?s)Anv#S<XQF8OB4!<bG8U_qclT8A+?G9kA^;U9 zT6p-|tuZ%mN_sMX{rB5)^dJ<J0kgMz9O=>8G0%dX9%V3`0*DxGq1c|T!9bV+D|QR@ zKk?2-oOIQ#e6)Hkv*s>l?t<kQ!fm@GNy6>%(B9sT-!Iots#Ge>W-~^Eq1!#wXw;mw zY$1#09UsYE);Bcr>TB<I14@9jj64E?Af=<SkwmduzH)DKJM*SYjO;7^z>)1O74=PI z_W-m4LQFd9m;p;kk_5R6c5F<xd5{DNPF;37v*(<ETCE~GBY8wzgO)aXw-Dc&Z@wfo zHI<1IJB!l|24jSj6Kz3f<;j4$yS}-{{6XY64j1)pc0ks06hoZ=eKek>*Xu?UMMjqt z4bBBpC}hA;YvgceKf|1n%_b6VjjCe{MSGP|9%Crb38EdZ>k6tpJvzJuj|&{_a+t2Q zLH^zEi`nq}em_q>`4mMK4L-dYoh5~H=N*qxuaki?qu|Ja5+eCZL8(Ne>i#*aw(lb) zcQjtFHv*1&ovx>}1!}b#vpJpws}+M@{~aU)37ArInKbtd&RcOFJDb~ibp3Y9TG|gw z0GiaLrCFju$F6<*h0ix_lXK?n&2nq3XwE^0CmESf!Pvh$^5h*%*RHRP0A;9?2@7o7 zSI*+=Z|918|3E@Y2FuUAjM3w#MugFW!5}u94X4vdNE8tS0i8~V)nY-b=}xqXHyOF~ z2WN8Xq7zVt(<lcjs(AH3@6p<e2!k~#m86tRX+}vtVh{UGy~{&siA+@U2ZHD{M^<}X z+1N^9LU)xagIa|vN}BJO>N;|;u|?J_jj|RtRn-r;2`dPK^u)6-he<t2Xw>RqKX*|S zX>RM@hU~LXKjPeT&y9^ps#Mt8+j_LLl9Ez5(9$k9&h8~AQ`6i=tHZ_K>IPCQCL9h& zOvt7qRMT$@aNjQ3TP-RY#J%n)rbE|uMxlUAqzHxcKph<#dV1}lKC_G2(mk~o0s``e z=yA$Guhq+ScN!h<e()hDEnLLf_upW_lwu}iB$Jw$AWPY$=N=tU0yx^ko0Y1^aJ*V) zB+inI(<QU8HEJ~~mFjSj8B8V<27>{Q*Ne~V8xR$!p&D7)S&SP!hpLJ_e6@ZPPyIi8 z=N%nad3F8YonF;Oy?4p7Y|FCTdk15Ku_+<+1i~9gK0*j2Bq0F;c~c1xO6Vm(z?4vJ zY}|X5ZCR2nTUM{5uIcrDe~dJiEXkH^8N_R!wO9*Fnwfj&-uvw5?6c24hmH{&pyT^v z(g!qWpV*I?Lt;<>zk2pncE9ng57<oYzWb<qBj=~^J-+^y?*Df=Pi?@u>z6&9cf37b z<2|*xYiMcZg%3aH*;Sw5LBgyBSCN>KiLA>Q!Rz&6wb`)QY<@wFR3b&I)1p%LPosy2 zhH&StD@lm+wSPzify0HzSif;Q_OpluqvKOhE9AKPDg6{zH*m}43n;6tM-;^~n)eSB z?G_tNoo3?F68f@O9uG}c`^5>C&7J0N<a54%^KB#~CZW@42nz`u5$E38Vd~@0T5$Lv z+qZ4y)t6uD_4CDxuVB^tZ~G^Y^vqBa)3Q0RYa_;%cA^LH%4{`R2oDY6XmtZqGLw7* zJ)92Y3g7rIm&=7hF?5-?&FWih<1PdZJA8?SZz1Yv>8de_epeuy!$oaV6HP5`$YnAd z4hK%B6TMD@MyVnsP*0@cY(@ZLA9lpw>n)1Df!5xxmH>;1y7o?*8XJ8x|I$V=cXXPs z*DW{<!sCWcGxtgNZQ!!Ae&0b1{nXty9y&%+Mh;e+&A;JNs|RmMCY4IjX|-t7Y8(zH zcDoIi%RQpSKpE*NEM71hjYh?|=ii`U|1SRX=4%`{T)@Bf7cn~_iYak@2LY)2*+Aq* zh4JR0qrCt1X0Bf}*H@=js=G=AvL2qUJwUQs;pzv+9$?uMD7)K9L@zdngD<x2=65f> zMR`pfu?eY6nz0a_KFCkG+U<6%HX9zd$8R#AP%6;rbUr%2pBOtjof}qOj-gB3=<#^j zxhJ3PJNFIBq$DOGjk}(CU3})+g}qR?u)djKy%w!nMPa$Gr(UHTdQwtYQHxwEB{4|f z?>@Du2lIGQf#uPvhF<H8%QO6q<|(P^;?vK+j35z+j}9L(G*UxT-%RnpAFU!UFOQIr z-V1bWv~P#&a9C0F7zFF~c!-RNM+EXK>WE5+LFh+;=JAT8rlwPJ@&s2+9fwLTquE$X zRIE=9ey(8I+0}wFDkFV_0;S-i%S6!!R$WhALvssHzw-e*4;ON>x(18Qj(~tnCdFj2 zpi(MPDHZ568iMqC;-ey2v2ZStp&^6^2Qels`80d6vt*j0FN1a3ZLHqBjpL22jEV~7 z`wM0uRjGYIsnvHSy5jj|)223RjV-+R=^DnQCHDH2)#2nwWg}Cw7h&nj3?x#?IbC~+ zM1oqaLZwpTa=EbCY&d$<Ku1bU$jN5*tf?rvC_zz>&|;GioIH_PQ5m#V7O|$NkamZY z%ToLL?iLzb#q979{{_hm4MwBYvu4jhu3tRgmo3`NzEXi&drF|wUGw&<S;f8}*%MgB zQ%cy<>RO(7a~1#oYz<)%QOv#kTH-FK`7;0jAOJ~3K~xfa^rlx7aXK7WZ8qFJHYqZx z6s=Z^a)4}7CY3UG)+ClKo{g%@x7Fcr^4`a5*s*K>pxwOW3MJuD@qHY}8Z1_p&zb^2 zli8R3sn6lQYBgDi9Y7f5@VE);(N1!4WtM(>D&H4>qN#OQ-(Mn;h>!pINi-S_5r$xN zTJ?xH?~YEhe`ntvO-)9&Z`s7(|Ni$rf3NE@oNsEVAtvDz<tcha!lUAe2o2+eu@$e~ zfwZ4<bh_O%nJp;QS~{(E!h-@3Jf|KGhtr8xdk&OItIue{5E3#nZ?Ntbk8TGX(aYA| z`*`q?$B76tFn#J2{{GlvBvJ`puZU8i!0B=#dcADgu?w5cPQlS**c}cY_}eqIw6zly zpeHdlnjpQN6$|E&5E(&kW~#3*Qs|p-_WZ}8lH>e$({{r2T5i5|r4OXkI^XZ@Rv$$y zm!DgGwkuky%DMgVCplJKM~XoUx>FfbQAHh5aY@*F)SEPF^?8YRy2U^Wg#x$R?W1TN zj$s=Ccdj9mN|`cw0#hgF`r9K!5%%ss#QyvOL`39jJ>eOXnHCz&{+$~En4cWm%VT!b zX$A$Gbm?MzvWNeyUdJzPxt{E#IIvlLN^P0^l<L~$I+ZP+4v^jd^`vY?k-DZ9e)r;A z{CCqfJfc9}w0WeD%0Z>p;PH5HI-S^THryVMe^VlnNKmO%Xf&Dut>uCO^;~<^A|~Wy z`ICkA4ioQw_$7yqlnnX$_gsUzV_!ub_f4M;Ky6pe^IRs5lvFj4H~>Q?ARz1Uo);BZ zI^AwsI?V)jT|mh&EAA#wnMPjTB$P@8(GeqOszRNyrBC+p{yT3W2tuEFC4jO^spfLp zPs?F^6l#20Hi!3Z#p`hP3zo%|^=QHq2#-$WU}+Vj;v;FbpQ@LhtCLS#i;?(*5$r1} z2q1L%%62&crH;zt%~xI|BQ>RWCMfjcPsy7xvzIaT$+B|V+S=H>eFyo63TSL<;{Lxp zjm>T+B_W=;$Oslqo5a}EMD%JEGfo>>)^0MhY0p98f&=*L&+kSdSNQrfeO%Zn3eN2U znatNqI@I1xmy<`Ie}yqQ<JntW(#Jr3e`z&Id5dv(F*w}|?XUrqOom>k^HH=;Cw9BN zSN8Kwg;t|s{@m$|%1reGfhfY^f?~Gs*xS2VUJ%fQCNTH%Ygqf)e+bp6$csMpy-6hk zFYGT8+uV>beg+W+ElKHPICf+&Z+`X_fBpH7eVL@y+~YdB`=MHU%$O8=W|O|3zqf8P z4?gn}HT4aoWQ<|bwE1ZDfw){QOePZ!rxUNo>;EnVK|rZcqSb27SZ^Mcp3L<tE+e{! zIYmWP9dEt=88x+y{`VS6M8+g?-+$i_|8ezP0l?~X(PFl8$5og6vR|n$i&qbkhIP8# zls7grFE^{--z%gNnlILxr6`KRjq@gpvr^)^()ZzW?+FeL5np=a9b^hQaZzF4>iDf* z)TP;i=`_W!!{K1drVZS2$DITO^qqc^)+L~E*!q4y9*>9c=y;rN4<*(0WcO2(t!Zf| zJt75VNE{ote9W~obNS-HaUwJP*8!Kyg?tFYC%4;$$Kxh8I%?$KXgwB#=%`4DiX8G= zq;y?_yh*+Z9Zsi{k`tx8`0DF4G&W+l+j;EySFqXbXw+&(B`1;^8_ms27ZDR4N>G5F z8M$Nl`7PHYmvz;)x(0FkCRK=l*H`0o_n2iUR}5}q1+e70TPP{3;NgdVOW2oR_G$`m z>9i1N2uGAD{pQyymFj|&C8ScRuV+)G@>8@<rwi{l;O8406v(or3;n*P-9TAXT*Ai9 zJNj*va=V=fQVnC$(>YLA;|EKZ*UP%nD#}|s$eA>ki0A}A6&Vs5$qVm)%ws>f1GQY{ z%O?HT@-&d_VN2Ib&?Aa$+LzDM?|;hYo3{~{n8uQ;7ZDL1kJIU-t-T$$%iZgH>(1mg zYBh4Xd_bVnXjIIfHHC$9rub=BuUBOMp(5V@cnzi=Ywb|MQYw=Z6`$h&_n|r?QHBtL z^g0j(_U9i2AZm#EkmAaEJYJE20c`R#3OULi>-a?lmfalnshx#qnAS!?y!ZZJVladf zq}LIA0fxk$b5_~d(nnGG?!RBBy}gZl?zy|)*UX>q^Ifg4DJNs><lYau%SB{VJmH2= z>O0J2Ih;sNyV<;6U!%5MsUjjg5@Wjw$7v=9F1LF~U}@@T!|U~umYl%F7z%}gF{871 z_Q}8ce^yXfgwyF{?fQ-E*|(ps_w3>QwHq)51(FmU#T7HB(B5exB{qi4q<Eib)?@W$ zlPaw*lk8sIdp5I6B%G<M%x1H5^N)VY!J?xqxZ*ng{HH&Y71ukf+*EKJZB!PXu4haT zgsuVG7jlo%o1(SbeSO8}>q$J|h9)_IMGIyT7@+S1l<PKZ#o2FNPJ-LohD;lRL>=JI zT+B`vt4~yNpstB=6J`(+)_a4MlrfeAJJ#{`=U;K>ie;xVO6VUX{j{qu``mq`m=8DZ z;OV#DN2d>B?1brz$(@G7;i9d*y;m05%>s0Tq)a9|BfzC4$8*h9i%5)*_WzyT?%>lk zo7lSZKp$b@x$t>OY1x3U9j&6>#PZoRU1M-$UALZ0GU3FwZ9AD{V%xTDCllMYZ95Y? znb@}N<evAdx>fxr)s^b*ea_i?t!F(@{5VoqJ!1BSocVe2No8v`l)Hpfev)&+z^&D_ zJRAW>6O*`9@6|aCV$ur6*GEW5)3z&7$V7R=h)7(Vw`$b<xH{`R3^;I2%$v`NOGseZ z>8nsAs#O*HxD4WvC{Tt`rX?<>Fty;<I(hOyYU`BO*@q>n;Qc1@Ln4Pm@tHA(j4+i< zkj+d=%bqH_9$Y@3?LKE-Vy7+KAAsWGmO7v2?;Qe&C$GKw*&a{7|BIijW2DL83>q~Q zVbpgbvxr$U?aW<#wb1Q4&Dr()n<G*X2jTMuhTUSd6Q0!aPfb@^eZ?M)KFuCl3YQK` zN+zC}=-TNeygYHthg?RhG<MYJ*oliphh8QHreiXA?f?r-AeI19Dw81^bMDq7EJ+9v z8UR6S%^_q=zrH7jBmcnoYbYmSeEfG$Jfga2!NgQ~R(wo@8zX}~BCzqCZx|CfM`AS2 z`~9lo>bVywFCv&%cq3=ED!W`eS$XMZmt6N|+I3TuN|nK8mj+3(0RfCMi_EcR8WAB@ zf|MdjLWycYea-Xxy$0H3)=;H6^7{(OFKKJy3O@DmI^=_X7v4XDe_uA*t#=LYhM<N| zGu$u3g?;vUb(H@I5h3K`r^Dr!<|k(|TXiclQR4ERUVN4G-a_y{`#-N*)?^`;VXbm~ zMD(Hukq7F#*$wpYJ>W0}Wv1GJQXPz7B5AEHuOH>DwHp&>W#MXddA(rjX2iz!h5;&c z51vmEqh8rrl4z`H)gXxL<@1s6P9=96K7Bz%EMdWaJfY^x<v3RDDZDX59YY&vxw*Y8 zHX|G7B`G+6IX&gbOpG54yKedq8sycNV`WSZK>+E=+4az$4f@!5eF6ib!nFoFUiAtI zVY1?!tlGi|;OlQKu1>YPL-=;*&rr#gtv{MXM6H!Ek-QF(H|mP6!CtT3_~oDj{6y|9 zB8w8lNVF{sNo`uND}YP5bC16!_q#}e$#TfZVaVhmKM|OS`}%-rwp?APo}ApYQc_bA zP*J7Ngqp=CB#e%W56?FGZGG&bCpNhtWW<UXXgvBU8G9*^4TiYZnd|a7k{@R0>vViA z=IDEvTbUoksc!D@SM(G&%sp+Yb0*B5{;}`i4Q=%>-FM&w5c42GdzEr6qPW<Ugu!^> zhR|@xJKxT=3;m<b-(Jlo$XUfZIfyuz8A8$>P$6sm&-W-_czvgKL<thX=dhY{|N8Qu zOPK?TsvxLue4%Nk!4tLBW3I<5&_nHScUBInJ1@Z<$fblTW)XbS<1f}CWg3dMDsTIr zHc3eadZXBVz9MUM8_o35)!IG%joF{U!7(A{Arusr1~7gz2*TUwf^}-6#7Uxz;AZqE z^LC6jI{iXd^XS?nOhaDoI4vP=A9f%KBFJ4h85z5+qd+Fx|1P&R6S`mmM7Crq<A0<y zy}=`*Aw{a9sI$1jiHnOLfB!CTK0mYf%7PUI*v(j@q$Jkfr>}j0`cTW_ky4TLZkZn0 zwVAuRL50emgD{v*D*!WN=3h0#1vlGv99{vr)!BW0Lcjd7i&Cb^>Dby;|6M$ItaLl# z0|C3IEh7J2EXsA+R>Dx-&sz{F6Kanxw2sNYUwmIk<eJ=&5s{>(W1Y-CK3-!K(WsXP zwqH7f>tTD|8CbJt1rweWy1Fm>l6Wsm87wTUh^Q%on-ip9V3^k)ovj--0G);^jwod` zcKiS!CKf83<Yo^pA44W<vxP9Kn|C>3Ha&>&X*Prbpu#lQ$DUTh+i@$(XZtJv?i2dd zBfgovJ8C`!9A^d4^k0V)jrM^qaW+A_*Z42gN7&<X>TC&VdF{LR#1OJ5c|A-%#fpI; z8U7VbWL35Py;b>ddHI*TJ_vu$7y9uO(=HX+5QN0gD^<R1f{p7REhj;$poaycqCw)b z+iq6ZIW%589%&^mg%h9SyinBtIBU$uamLQ92VE4ylJ+);s3#e!>G6pJe_!r?p`4i6 zmb4cKM`^Y+99<*s8W@H}g_&4AnxR1dAeYHDT4`dJUz+JfrMA5THC8mFRjCNF-;*(Z z8(fGoBVtBq$I>0IL#V&hG{-QwkR;5GYc3StFh@aYDew>_e42e9Jid$gph*fz5EW zJGPtkBarjBN5G|x;(3@)7%@@^_;cUb1W^2R@s9L9K~N-6+Z567v2+)7DH5rehNTQP zqBlyKi--t3YB_Ou-rvu>x}DJv78U|U$r;>L@Z{|&`L;B|z}mE;rKlcEV}9oig5GN! zPNa^UpCHdZVUQo%wJ=dfZo&vA;)p<i(Z6sh2c(h;OuqE9@2otp(s#}e3thK*JK zRrqN^sxaD%4Yp+NydHr>6Y~29b)47$1fEB#U+*uXzk)!*8S&x!DwkC1YhB3e@t-H) zAXs<Znx1;alT4vI08%bl52u=aT!RA$5YiF{7wO^bq9#GK^(fC)8N@u*O4WIge$I-| zw`7cp-OrpSKIS_?Alsx^s;$A%4VL|6Vc<yZ-PWrgjs)=<(=<)da6iiapy_(_6f1N< zqwB)+?xn2dP)Us;fHWEqd2Sd(o<vi!FF~Vg68VT)qzaLmEms20f=n55l?+%_e&<QX z70ih&R@_N*L4=O}zE{{aKw*e^%^Zz-K4@WaaB`$8SjG2)si*U+WPV{0=)6X<+P@W9 z*kOkcG+IeS+<7ZmZMs=RNqco0lYe=AAxCG^5OeV*rA4U3#-<)ZhzlURf5EcuJ7Bu+ zi8i=x-s>b*Q2ZSYx8T$43XA`DOE^i6K5ckuWT8T*I+eNm<?5a#JC0zDvHIL!pzORa zlC{#Xc5<_Qo@d!c(dXc~1GTeqhL)pR<a;}RLeuR<Y0(s4YS$mi$zHQ0Dg9e9r&}VV zzwdOKU%xMZ91@zRV}Og25-Lq9_=KevB~Vf39YlbT0!4z0i#8A|0D%Na37Yf!_Gx;^ z%EwdOjk#JBIaDHtxd<-_*U(9=A){+-8e_Pm{Z4_V{Oez8+v^Nbd{JzKiSr=U7iNj; zNmO2Shrr_*J%tVp{PGM9sGqXED@~dy5=F#x73aP^1i4C70NnxTa&)!lPJ|G^$Ydw< zU+2TTHTt-uO%^LRq})|a=I|dhG`wOLi?OnOE{%!)%F<5of1P~EscQZq5EH}a^}jBC z7QnBNA|q!ZN=N5^4fvao^!^a#T4ruW!p9i30xWYPm&G#0)%`qJGF`T`hC{%X8Hg7+ z=o#Ck5pXQ1SwH60$R82bhf9n7<}*w?Uj1yVIjWBsg@(a;ccW_n!mSKpU~cQDGe@cR zyST`V(9Z(&T-v8znjC;&ySuHgFak&tA<>`55zp3vbw#+E{KWo`mz!b3X9s-{co_Gd zL4kq)=H>nf#omv7?+}ooN<zZU7|B}|ITQ{ex`@+uZ3!1EQdqZPZ}-!)Dn{6EjfJ%6 z{OzWLbyjiX(WRuU8qaIag%lQ8J0th^C!v=6-~reV@ch|Q@yHl*M#5}K`_G&45d6Ke zqik|6zO)sXYQenoEM;7N4-AmhW#g5@8xKw`Kyy{0LP?N2XVIfr(CpEi4WOOH(wMRi z{1)N`bwSgrzS4@0XMVrb6<TB3$B=nG*2jfh<hQ=rcE1vdM!<xHh4mRY#;3Bmhz%b* zEX!9kc|AXnsdzVKKNqr8xBFoJch4mC_uC8#1p#-k(@@N$(8}-HV~4gC*V<V6C7YtM zqKi(p`y=EV%7WKQ;kL3rzL$5B72o`q{qiPzI?ei+dKTTLYO=U}5joqC0T`F)R}C)X z(Y`}l8GG~nTgN1JkICSeWm;?o^YK##yDQvP*B75l22_y5nxQN89cUgQVMPA>!$ckD zyB?(&$+9&cYo<ckz}W*)!YEXPOulrr@S)Q#$`A1I4X2hUf)NT%pYMLemxA9mzmE4V zVS(|Xf9SQH!*KLYdPU9c(gxk&c0qo9`0(c~i*45jnW70TnW2*ny+jxH96jA~h!Rn3 z(zYV93QKb?<G}9aD#sY=?G=qR9ui9L1-rJig#wRCN0x^nj5RJ<r%qgXxdz|It!2-W zb&l!GN$&BsO!-*!Z9)$3FNd)*lUI8Fx73zRx1^Ul^jgy^ogrE6P^;LkA(e=*@I6tp z%9?=#yI4l9lzaI-$OsI+z6?T=Sk5_eCTj<{SG+q{Vfn(w&UE@E>x1PRCSCjo_kow@ zE2kLfdvf~vPtkr@w-|O7!<o!B9d{@i&w+C9prgivsOT_MU7tN%B>=od)F(d8Jk8K} zW%&l0I!X3;u`*dqyB16$C^0PtAr$$bJV5s1;+Vg*ghrGk;eEIW(s%qvkRhWAEClQ| zm;&beB^|Ln$jq6OQ@Yg1J~WmzUArbS_}h##zm`1I3C7>OZ-@eZ?d8bJG{8#0<5r1a zVPl({nQhw%fYkJS!1eV3-UUVR%xoE)%%-sj=+lYf?kNcNeiRfmyNCE6fd!%wX-(Ty z3e0cQ9^o*Lh-g^B!>i&3fgmlzzr9O9ZS9ysyMId8%z2ad{3#5?u<5z6AnK5y_NW5a z&c}*am{P@VzI#c3P=iSIKf7t=)Tj+P4M*~MpUZK47_<E7;r6oQ|MIxR{0<7rsBUF+ zG)1zEV86I$Zc&<7R~-<X?$C(`uf9hX7au1rcYVEL4u0GumBtYbEWZIH)M?SZHA8c) z%^n;a4%Lu}Yh<V;3JQ|Ub$rHP^THRJ3ofU`Ho^l@5Ngx@&w8igt2p&>I$Ffv5%^#C zre-V}NcsJukwv(Elb5~A>t6^9H7dSSm2HlIp()-!PdeT1%wasw$i?DdMZK`l{*(KT zI$)C^+Ks0yEi({NgH(tLFOB`hh130G@Zu(S!Q#fPORfD7^Hs=eH}?oxV}kDpE{hLC zyO;7tZ1q_2QV>m%8!skfij9~ys>!Jl)7;Y1@M+Wg90*=W(eXrX(vY4?WsIB}+Yh!> zWn%MWA?)i*v9Z|hg6H26<?ljo8SXb$-4HX9`kGvY>xd$L;TDgKA|o9V^>$V}7ZXH! zzbj_NnhZ5V#k816Wy(e!N6VditZwk=)LFD%?<=<Ul&4$}1EWNXXj=L>tJUOe^&|!g zuIlbX@ancp&(AGoRpsjuTl~KlF31K91QbqzqB$#J<%4R&bpgCiE{*we6r&T_zbr)9 z{QDu}xvGN0_C%RY4@rpne|!2Dj#}xjReQ17Zi#w^m@o6qo#C2!OwAAxE(~Mf)>IP` z(;3XvIJR#zYFbI1n!1?vU^@$O;mUkZ442g7OjK)i3wxgFk3lklBx2Ary2!LV%>b|b zalTrYHH`n&@2B`3JiM`y<@@*VWmR0_Q;9F1Pp*&OB-^BdnYf~E$B>Fw&c#@%nD&TP zyaq&5+B=xEt3>`#gsWAlBvO&Wg&5A1b2ygRBInM+SGvu)e9#e4BrX@yR35@f;Z~(` zYnWM=_ZwLB8`RYrKH0dOZ%$&{_DC8C^0aI`dy_@ti@E?<{O|)&B>(%1?fXHQFHs70 z+xh9)bZQgMdPmYq!(pxKl8Q|x8-9)I0I}k%m9i_WcAOWv5HBy#fjPVcVA5nVH%)^t zo48(o4(rxAUJ-65!e%a*+^s--XRAni*FH061ni?(+3l7#o-#Euvt+V;U&Sj`s4+1y z=jRvoLyvp9O<L5=N-0a)-!Y1(T=ET&MzPq#mY+$!v_^NvNXR3{4HoZt@`?LB7LqPp zAl~56>TLF8urf4)KRO=Wc=`>Tws^w|%c}mIKllAPXbwOw-Dmol-j@VvgamcrGE7>F zL-p}`-lGG2UnFcyuKeh#f;p+RZ@e-W7uJPEML-vM@3>|?oeFU0D$LC*$v7rd@lQ_V zh>}JbGA>F3elw;`1O|fTD~uc$Yj|=MnXzJ#1o#z>KYP?RMZB&`;2%_Ab{<uWpofZ} ziwQ{~h1sC9RX|0QWlc4cajj*T+nR4bhbj1cj2McMAR+DTsn@#^vTM1*s;6Q8QTXY* z)DNIeAJ(qd2kA8!yf#RCx5WjEKRcn$&1~}uDRLrL6hk5ZA!8zij$iDg9wf$!R?K>p z2=N93h49B_l2IY)gZ-1G`Nj4He0T1#nR(4%cR|D4*U#lDlW_Qp!a+6B%|gm`=O^Bg z4i72B?F9Hu<E?I9U|bhlev4$qMlJo2Bs7?HDs633xwBu_|0%7nX7sZGO-tO(=)5-D zGL<kjtZhYV6kAfLHE+q;p=})n1^1`|mb<jPY)>!>${Bu+f;DYI^{i<b7pxRQ7n{DU z{K|Fa?pI!{g!j-xirI4Ca8%2>jGY)H6o4m%8{E2eDJ`(WQY2GyBu>X%z0Pvd>%pMW z=slb+I5oGt_SKti)N4Xz#-~XO?AVxy1R`N$MJ`umqk7Lvy7r_LQ}^SH-MI1Cko+U` zI?~>&AwlX}imZ~$T|9-12^S_yAol2Ta$!-_w9hOKw$R8prK~932E0EH7g{#SC<*=7 zY});W?~WL4q#nOU-`sV5K-kxPAW%^cjE<zpY*#z^1haJ_GS>zlqjc@&9=7%(ruj_{ ze&!I%g{X>$EVbB)7b(nJJh&cmk6<Q@HjSernjA|GsxHjm-DcoFj8(7W!Q<lM`WU)o zEKF?D>i(PE{2Qt6_<UfC$N3}CkC4J|Nyj^_H4sH4CL>U!prCyhEacHfpjr-afFuvU zV{~mqM8X@~SC4>-3B6nx=fa6YKp$)z-NR((%G%ED)yeptGA?aDD!ypFDy%NdiZ>mU zHSf?Zv8?0A>0L$<o*$bM$8o%bvcOVH<am8hy1)Icr+F7i4UWj+jx5aA^OTdQUl0;U z;8gXSp(A#)zeg4rBrKfX?m*bl`)5;Ali#!eIiojCJ_Qlcu2Y+wWYK3GZxpPEgk|Ie zMuJQv;Yd&Jvqb_P3NOWW-Zx{>jOj26O46)~8m++bi~NFqDM?FixDe2Y1sP9KQ*_}& zP}@9D9rKvr^EqM`p5U2l3@ti{;%K&L+)ZgwP3GcgwD1_*y}qr_?5~eEMK9Zf1sYwK z9|^Z)?>VDvz8@pV?{~WNgx?#`b%Z5`QX9Gt)%5w;BErC$=nJqiQ2vZlJJc#e2h=F< zcf>1~D@&kFW(@u1RFtRisE`*%43AE_edW&4W772S3y+ANlIc0J2R;<SrMiE8WvUUg z;d#Lp|HPOJp>)aNeuQuyi?#v1<`-2`Tqaxk@_^F4e;>;ETDV35F`+vOVIHE8$S`b$ zhgy+Be0F^AL|I#55lJp5?VAIKHVQ7a@!VopW@YKn#ivQIDLlDaIjaWEA)FJh)cQ2a zWR?jqu2A3kgO7)wt2ATPgq%00^?kf=;H%>bgar##9x)ivS*u$m?$fi2&8sW9QvO7% z!C}zdd#E@{Ggi!)g?0XZ>ao4Ic8zU3Hgm8Y*0Rniolz+0fr<68mA7O_0G2Tw%X`n& zWIB8D*}f#W(WH2QI7Pf}4VR_GSx$3nAdi@Io}Eom(-wzikUHhf<cCZ~4^GGAZo+X6 zhv33!L1R<X&0p%8n}27v4j*HvG+kbdb7ZnagnXCW?)W)0^hZlEJbmRce18$pRt`oS zUHlU^O!5kkzq#u8vaY$<9*t4%#fldtuClT?yX3<E6rf7*A=ePjC+cr~X)h`y8GOpq z?$U{qUVFSfNta&sq~OPuAupbi;n9Za8eH$|wzjO*kSZ)Jx@*vVFGrWNV8x0@&VM-_ zr^nzoXDg?3#S2pkmnbK+J>_8%IReh;xKUKd00t|SG)DOyqZkQegG-G3g1@i#ews9F zaOg?3#&1657H9NsWGg9o7}@sbcrhL0^d8q44I6{TLdPtn!2}b4^X0FkT?G@))aM+} zOVl3MJzA2XNSZqkzu?0~AKPwi?&iAJ2-()NkT2c}i1U^F+GEH(@dU=?%iOx=_-nHq zjy^!Yn<PPM(gE??j)7aUqLqg%ptTlZRTB$}Nhos(L8oKm5aJ*kv2+P&)Mw0DfhKoU zO4{i19x9bqrQ9;=oLfyu;0EdxD;>NCTh&s&tSK;1BtDtde`pn&N&?2*mi6|s9Nx`! z0b*ci!0sS^{P}_&|N5=c2i@SKcyj%dpTDTNIvGmwkikM~6Z0&g>$0TE5|f`Rf}<?S zwE|m>(~t-2H<)eLGa+Zf(VM2Qh=U4coLDL^Zwxis6iF_=eRluJ?%s5_$yqgM*S7(i z7DJ|t56rm1`M%3ZUA?AMj2!N`5T7Rs@ZV-JR-(ch3M@7$5xkzR39*?gS2sV&7qBq4 z^VXpMp9_#nOiCGDhCCdXi4h`Gangi{ApD;d-S$qw`MPH)xZ&N83h`{*eV+bnJez2o z<zNCxAt9mgKf)9J<P{jqft5(VNK;;LL+JbuFp0RhM7%z-l!b&bUPnfIF6=n6Ff!iS z&8#*${Z)0mvQ>3GvtncKEF(&5YKBjo5aRg8A(EX@eQM9$=crMjSJzh6SuDwPYjlUT zBBJE&<D8ahyXt2gxu)rA=a0YJab!}UI20m@_i)>X2?_e?3?ED3ssq*`uBj9hbjFjx zxJpV3uqTcW{)ES%zs1C`r8ONv$-{3?%$OAvHOKGhd&X8Du+<rC;n=tAc;`x_@amrI zJVha<JFlUAeQxnvdGSo9bVV!<mzfvIJ?Cm57#5Z7@9w4GvP<<|k5O0v$1oc%AvGf& zhoFD9sO$>;2uLGMs<dRLQX)N1(wd&+SKgh$e|`*me5{)^=(B0QXLJGm!GB9OX<;%{ z$@%`?r;Ch%G5_aPDK;D7k071t@Mf3S=ZSBawAjJz0Xys)CuI`!u3<qckN!_g^RPh7 zfVa$y@q^;Z`rwT>I7KZ55lzpd79ZN+Kf$yUTQbTkjF-=|8xv_QeqWs*#jQNTz9PMi zT$xHNO?4#ZX8Dv&Qo&sj`Q2d2rlFo!U!;8k0z$#jl{!2%s)hB%b?`y;w$pSvUZ0qk zpQB%fuk&}hz5HM2j!Imh0*oui0R?3hbi|hLEQJc{H5odDDa2x6#nT;;fQTURG}t8I zLBmShcaJj$qOf3tyms05nL|433K=1nn3ohPO^ASw4C%MsuO5*N0G`7^={+}Z+mD{y zKcnqf@yv}KOAjXG3>`U;_*;Mk86(ka!YHrn9iKoN!lAA+HL5!P^5nZ|y0gytK8?%2 zT_1EOI`6F@uRbX4y4fF{wZ<4I%w#=<L{tD_3uD68<f!*VcG+oyxq}5|2_(q7EP}Bm zH`#Z#`=76$h>`w7wEo55{uiTKi>XBy5&jo239sq8)5XHd@T9M1!#24q+ZmCDWyM+V z0*20`oj)Snu9tewNDt*H_6x}do-cOF%e}Jeq@$YpUFew75}%hTh9V`1xv8U$M{4;L zJ%tc8)>bL$C=Hi3e=9AqZF9g|PVfAbN15&zz6HuLrDQZ_=U1ufwomYVhaYXoWDZBf zJ&3xWE0dt#53>u5DGC*KgO_hhlt<o8PE&dv{912MlXgLSUTG<B<cV!81PvXjFN!y- zh_DyE2hVEWBXTyrBz^AtHA4;@$0WvPgUE>Ds34`YMF#!h%}XiC$@<u5drzERnW2*u z#3M9^4gk3DaE38?daU5p=&X$V8K<DQUbC6L&&&#V<#pyKcfAN>1b{+8&ok3;XUz|& zA?+0ae>~-ZK5)TOSEmmDT~RD8tv0mvK_o3g1%4qM6vu)F?`Rt50GY9Zwohbze19Vw z>-9-W1rW_;;xHU_FuTP!FfX1USJBh;nl)*1gg@Qg%M1iS6x8{bHPDlj@?tlcT<@}k zYz(bVfA$BS(=dUODq(AihcnpyBdK?J({U)C_)Qg;H+Ld3Z`OVZ2|e$4aNw90&)%$i zhaiu#(pBRJ&!-*o!g9t{u@JsuaI=MtS|p4^zZx@supgXZv$u%9J_|!};DA{M#n>gp z0t`=luR<^brdK4D%ajnXar;W|jp{{<kZ@5qul(FA7N){(sUDBe6*P2&B`t?TJIIdK z4Atc|gl_V(A~D&!Q*PZJQgZCca=|#%EsdmvMq+6%m6#}_Ox8$ic@)<l_P#^~rG)5- zcj6ELFvkKr-Sc8*)Awns(&Nh7=e6POrLT&e5WjdaIm`12A(;mNq<*Wd{-nC&&+mqz z>0{3yflsDF#l_89w|k3uKIrf1qYe+%Nx1@|Z0uuVBph5olz-8;E29XfYp$8wSeG<* zVwDLAs+ln$>VuQXj*xLOCa0Fx>TCt+l;}^CD%CS9GH6yNDlgW1PZLT=P&2YM!M&ye zKtCmL$x0&gfsQ#WACzTLrPh1N22Hmq9%^s+ZiyVv_^`2T>s@5bY~K|AGx&-B6*5X? zI)J*Gn3C0U<f_5<iA?Yw%O*85TFEcCS!VxLk8iUxMxJv{j$(mASwiWL5|K{=qrMi} zc*+zpQKhdyHZald(Y4ZByL{)Pl8YD&7_@i*J%|HcE2W?ny!TLdT0vd6U)m@!_GD7n zEtoa;Y?;{K-+#W^^1N)tGj!x$bHUBMJ`Q8P#4S>Q0)FaGLV^9rQ4&JB@X%|y#PIIv z*twJZ{PJjGQCT@TCmch?adx_8Oo_~x){^G(M8hARVq#K<zF)8KJ-K7^E8=~5e;9Z_ zB5MH5Nm5V@q2>Uel#|16v<{Jj2QOgC;S0PhaajxKc0l%QW%=ppv>h-B1we>TTdiCm zP+4Jppyzk&uBUo*4g1?`+)mSuT5rS0A$X<S8RVDLWYr3xlh`1o<$m_bn`4{-?ajJa z5mOF~Y)b8Kx|F%aO_}|_)Gs&E?6-r#&O#W1wGl@)nddGY*B(5j^Q(L?5;@uxOOk); zg1`-7LL#CImdrx|+8QN$#zZ3+@HEOh`8UhP<{PgcI}Mo>&Hh^y5H}~)bivyeQdjO# z)CA8rBQ}f=jTFzXDvJBJ>jl7Z0Cys$XlcFo-#FS$gs1P{XM02X_b&a0yGscCn`8Vh zL1$@HM*Go;%$}d#+cT1o5H8mFuSSgUzP5}GVSeKmeY;6F57Az?CUgL23_wRka6Yh5 zN=;98SERByY<iD!n>R;1@oVz-g@koiSFDCCnh1#uTGTmoT64nx5s@H4v43sL*mQkN z@im$`cq#StqZk+(%2RpED8oK9?H?X8aWMxioVC=s^ux_lp=v}yM~Os9lo3!dMeYx9 z{Ot1w>aAIGR<YO704+N9g(g@W`YJtu*Mb#AOB`&%tC?xpRlh4lI2huBh>1ISh4)r~ z|KG#j;bPN&!FTt9&mkYye<AQQ{MTuH-JuZXk0CT1Jo>cYUx#Fa`HJ^Fc`1^l%N@Ty zk<_x$6iX%%a@;=$5m^iB-v~L?m5<mZTsd$$@89RFHXHpP&Xy9gliAKK2AZ4E43xNx zpi!CH;$sIW8y9g)s!vJm#W4ZbTO7EM9^+mc*Bw+aGF?~h^i($)ob@PWlag6)n>1rf z#{zg9<1Sr(jMZtQW&<WoO4=HcDg`7=8$F3l3=z}fSPb-wl0z^70v3|c8F2xrsmbEv z>Nwt)pnY_lg8Fu!nPDueP`%xW@e?cCymui))`Q{yN=vUg6WXVBXNaEGCvx<OkmmN{ z<Pbb}U<B+PNdUPolP*0~nDz(l=05T@9XcBQ;%M<D0c!CDtq7LX*=me`Y+3wHuB=H6 z3<|{KBQ#(4ZYbt(Z2agIcIJ(4p6Cr8t^PEj$tj)2+sC#}<KvfkLpo=tD>DGd0h$)} zO$TmOT}N&FT&eH~A~Qd%R02qVhO3~YGyniFqmz@ubSd_O`Re;dZz8&7iO};@qz-MJ zx_ajZ_Vye&N{jQ3^_}T|eu$b|SzIiv-fD+Af{dq!BLQd!5dlLi1inXVU?ItOC#(R_ zhvOzJ8;>_>o41`9H;;b0o6VQK*AFBZ>Qgak2|{L9w(kg8YBJ)pAUJ3+9Tt%&m}_cj zNrLHlw)jn2L;@>KDnP3?w+p1WWbZ#8BPy5N1GADvHod0RkNN&J+peK0+_h)D1uCY0 zb0ImG)|UMjF8R>cm~a)1{$L_8A_ycb^NGkQiL*%;s~>ulNfL;iI)%`rlGQzF){K<r z&mOq>XX{MkkIjd41Y8>p&Sn|kGd2X=m2nT0oz3Q{b`6M98I5^X(kO)<Yd_*g3rU7V z6EN^6<A2OiQdSx5HGAXm%KI!@&0V+{HmKXX3mGKT1LQ|wgO>a)O$oS5@Lc)6L(zZS z;ZNl7TB_B|nd(;WT)yEIHdhBD{N`|^*Ay2!Zfk06WMi-Q{vcnk*MsI1pIz3n>87YW z>Yd#K645X%qGE(+&YVZ4|7hS(F$99upVxCrjo~tH>wz{5j*;uy{5RbCVB6BPW}`ua zAtEY{R)M?Pkg{|H1@RZ)xhd&MNa8Kl&HV|7v&<$<6lXWdx+JHhBqTgoMx#QO6pw(; zx_u@zYw9<%zA9tg6<0uNoT$2}XJvEYnm^-88BBF=X;Yc^JVPhg|JQy0=8Ke;82Pu{ zH>kR}kwS(4><<7w27l`wor;btDE-%&y1jX4`_k^VQ^$&?f`FJ?${R**n3zE(VQ~Ac zA<Mk-%<B5c8AJ>dEnWQ0tp32g9yE#qC82iHv83J#@ulxI;f*T%Xa3e}Zwn@@bXB7Z z=NC5)9NybU4J9>iUrCOSgw5qM%x#*k_XBFasu1$AXDuoftv})km~c#f-eqY{xO1Bp zz&q&qk-K8mhhWirX&0Z7(0^pv0y;&gxek&l%@-GN+UWBuY=52EtYT6I*oR4rk^;eg z#HQm6Pf)fQ8I$B)FrJFm%*6xDl4nLtr3JQnYgN8Cc+@BJC16koFmG|-xD8_B455qC zOIwwQ4C2i!%ZJr;hjyt|9Tw`T-F97j2$^{=I;&-km05j1hxy$PqS%4|jKoS1y-egZ zV>uFu(vZdl{QdFRrzVNX8KKFU`1lpX&AqV`Omw2P@_+%U6W2y413o}j0(R@@ar7x1 zxf7~zITiUyZhS9sX>G$EU&EHQkMgBQ6=F{|->`oD-xUit_m1?4Ik6l@xnMb|2ajvE zN3){%#uuwijZLok3Y2jYB%yxC54#SYwJYaN=@Y=t0KDN)pPw#b2!oqd?8Cf$<@7TT zXKqz#+CNJd83*UD;&hjonj1%6pZ~zqv8(T8+tG9Xp6vFcn|uW;&tnMra+`Aj1@+2_ zE<t%@RVxqPss>hB1)sQ6rfqkrP%#0UHBDa})bc9!b*koyyj|*tvq<r<C?g@)1bn={ z_QU@!xsTUUj9d&upP;2DxpNesfNVlt9D25Q`qU#^w(n;f40z%<X=!P(LWRaY#*I!S z3F&Wjoa5#dw8h=+k;?;4Lh=J9EpKP4L&YjXG1$U}irAQxHvmvPx4s@eet_jcud~!o znkn)G6=1a7y$00D=lo8I$0H162hk?G&$9!=BCq6)z{Dkfw?I5H!eBH2^PFF6qWI#i ztg?D|$4;+7V|v+)HcpIDXyEk|CT8y}N)uqI0p6R}KdGy=Tx5nnW=nGHuRwe9fG0XP zmZ5lBUC>GEAEz(;B&;&Zh0e6|+;Ch1hOlHw5Img9jLicBmn#-h*gSk<I^y;R7BcEo zxG@YyRvHrl>bYIJT8lk7cJt*UGgC>(+{wWFkHjKTcm<z#NVt$Fam8ZCy~&nrX1Uh} zoj?AWnK*FxblW#Q-M@bQ@{`RBK7LYd=FU{JcFEj|Yu{t{Pf~Ftf9Y66#zr4T_VtOc zt+o3LD=;7&^oH59(cx;yfC0F={xzs0ih~pi!frh&&QNQi)3Vxl44aYe3(pUwc$5XT zeDE)w$I`0iAUo-2P{G?fOHe+qvNm!t_=%kVmkzTm2QSCxv5muba~;uH3J3`uTNMGu zpg_(J-usJe9OQS)B_ClYr~4ltRzT^fRQ`+TY*w;(5fQKg)ie7E%X;t`cHq*1o3+U9 zzUyZGW2?sn$|M4|Oz7|Ngwiccban!x|AN8g6Cw7cM%vO@5pbZUw~GL<tF(s%kE7{6 zBNy}F790WO_q<>Nx(xQH&P<x_&H9WcY!^K?Sf52*Hzy>2LPQ+?`h+u^?yQ6H<eQKX zd;_JSZL|AbLsFib6ms{ge)zc2eW~oa*m?QADb5VA>vkNR&8F<};gYxn6zPJ6{w2{f z`5(i;M-BO2dSqQ{vWqWSEKH<x`TuY%&R>GHLQ>FP>lMxMmbMpP!8E^{l0l|RNdPLi zXms3PD8gj>(uZ~YpKYp^BW>S|U1>C%BY%g$**|al#LqR*pR&3z+*z(^W{hk-uyXD> zzPy0KBjO+h=#-rNNc?8GRDJLi!v_fRmL8FjP_|{A&}cOVDi#*<n|J+co34eHhDKz5 z>3v=DDx~3*Nkvn!CCwZg5g9})_~ge<M<+FOwEKrK?np&Mw1XvYFnX^xB0BTXrDXi0 z6Oc9h&HMGdmJ<v4y{7YZ><5Izx0>NUN}HbciDJe;*-P}##NJ_xN=pU;07*oJSO4Q; zM^09$(X#Ct5&;}5px^<@_4mxm?-@~iOSmiM4|Oo=vTT}_K((_cw_|Tm@HdT_I7WO= z)DRL1*vvFmxk}5K<5LlaX}5aP_lC!p>)3OGU;9>0DV4EAWK$&_f3s#ZUm1M<J9t01 z5monC$!ErD`nsw4+P0nMk<`?r)<>L`%5F<7O%1%`TAB)GVqqgzm7dU3(jqY_Oa73) zFf*)=9Zk|EApBhdq?`D3M2@FcvQ%p@#k8i1fg9Xy;K6IUo*#`nYci%)nXcnFJGmH~ zS`|EB)18*f0ElMmMTo2Y!2<Q$w;}~fa>{1kg|n62WKEl$F!Jo&=JxY^a7lTTo9v>h zL4!*I-y^PKsjMkk9~XX)E&v-91RBR0)9(8E_|DESH5?lR0iq-X+*wbnU3lN;-^uh} zS}f`p-+$E-X8PqeM6mq`3!E941sg0x(&@}VCYP;!bt8Q{OONHd9U(^NmGfz`@4&#u zWi$}t)u~CjJ@o+Scu}wq@2BWb2B+uycl6zQQjf>B`xx0T!_4zdD`MGh7v=<~BGs@3 zk0TaJRICEQc3+IHicXC3h$I8TfRk$Q_OC_T6>phtFbEghzXuNSiF}_*Z=v6?q8_o` zTe+o7;LveRxB3jyHCAgmGaDN--n*<E(jrGf8G!y88KtnKtPQtg!{-q~AvSjbLO)cj z_u%n*iu>#Ej`hs0V}m0TZr9Kd(2izIPUQuB_xYUZ=Xt9^xA*KcGKw-?45)yFgW|4v zt0=2W)@vJyoKOo;c8I){b5TjZ5pxzZ?iOdVNDA-u^Rrc+K*qG$enm}b01BKyFo>U! zi4Ree???R$m0R_1kyR-96#vYbX4P~jH>)blt!;YsAP>4B@C;6pRG&CiqeO%~3}`ei z+Kd;tvfv8p!eGyq;?sEZ;1P6bcI-H6xxvv!)unLH*P7E0sH+c}xqbGToe>DQ*8K=u zpUD2%v=A$w*f~G&iv)r{y<qzl7LsgwoK=Z}>?(>NVj(gg?<I*Dg9(!%VW$KV{t`9z zrVV(u<~)s#b$f|&9T-QO!e;7nAS`I#6zi%B8hZ7>YrP_;NQB<>{Q?y+F7!4WM!-dl zq9KUpbp7aX9XhKuu&63|+@^{o%@|4Ji2)7{FtG1`zROdg{CD23*=k*u$mM)4^-PO} z!J^oHp2>3Hx}eeY6hO>C24ZxtG~)r<ia`UBG9@M|-n1}x!?1A3Gh#K1E0#LTX#qGq zssS5UxYrMEjVNIIi->L}OOzmO*|_({YyaZA^uAuIT&qRQm<%VRiRX-{<})p_wC%kH z1Z`r_D!DC~=5`en=FP<61c)Rf`%Hl1tK60`V;<P`GULZP)f1q&`WsFj-Im*q5ORE* z(xO4YbDw@Hnv#<ahHz-qLUc?DdI=K2^S)!8V3uHJ!yx3&#pB=~Tut*X)vD1HmY5>o z=8R3ejMI%dH_sXUHEDR5K5S%nw3`-D(emWo>UmM=*^$umOP&v0=JQ@~hLxUoI^h5~ zb1Ns}ppOf|At8nhD}iN>DTrw9mvaG?#gCFK=bbCeq9}4$8Ea+?%?g^@leWIj{Adkn zsyf;aQQwW9;Izul#&5<^Ex-f>jUJOS*Pj?6Tq=z}>oX7#>olq;P@$p2qxW1qV@C@i zze{B^JOZArC$&!rN#2eLv^;q1Diwe}8iYt~Lj?|pX5UPlG7XbbDvKrix>m7@TmZy_ zPLm<wypm<nyDMt!v@fj%A~-OC`GE<`Qj(H8eLAA1d+Nw?QC?M564(N65=;|PnV_p| z+@zSm1Of!}3O9BEFHb4Q5X>;4a4j;?B85D;k)9?zi7+7oQz<e@^hq)@t^j83%hzBs zzBdczmyj5^vFH4Pf~XD6C3#il@U;sfa`u?5_fPo1K#W(M-@vdqHFO4KO+Fa>UE{L- zj4s>bmGWPMLuhDt$MK^2(zliFHT`0}EfXJyD{laHo`Fxahzj3tJ?8sm-n3F?YjO9H z^-X>!m>H`MFbv?)nS!AJVR<DW(JExL9-^^7tNt)ZB{UnrQ4}pnEB7FtoRnVoz1mo| zQu(}n@@2TtOtsK&PK~2<{-|mkNwO$(K&@LzF>FdLtpd2FdH{DkVqpm2Jbp<6D5GEj zrbdT=wzNAs$CFPMLEE+7$%6-QMVy?Rww*X$Q~5QkTyEjfZeG{$8*KX7zOGMf7-AyA zc89R54KB|qOO^f<Yyf&j|2}<+j^o4jb`6JH6T881O<;n5TMJ@b6A3{oQ{yL7LCQf9 z+S~h0iRz#QJQ2!%cKxIO%6^!ZIxGqkg8~Tc&S<_k7(LqB?akY5_zq~K8d+HD9p|tB z_SWu$$Ma@X%k^{4=OP5f0u^alSlxhV2t16O%P{ZLI)HfWUw>YpA9$>7rSd`Hh2OT^ zjqLf}gBU-t%2kL-hMs^10D7t0Q}CWwtpXMM<_FD+h4{EEcA6u*S>t4+Fd->P*`sXF zD{^8|`+?TjWn7uD@-uTLEcb2GC%q<(=kcxV-Br}_>57``Oo{}Vt=$^<3*BEtsup&u zw1GvFx$WDMk<Q8k10_V^L@F6k-@39tAR<P@q`|yQX6DEaYkkHq`~Enq#uRDIW<V!G zqF;KvOzhwSEzDN$X@fj78a21efud7mVp+m)LIyLIF}&dmCo_3MD#Cb)Ze>YRlXve^ zox1eAa<ZIvJrL$9>}Es*#N~}(@O}p9p2g|WA)sMR1aK;*@#ss@Gv9vZmlylXs@n2Y z443C**|ky7EsNgd@v2SWnl)<Jv>!ldeSKuSy<7X~NIGbtgu~33S~Fm{o!9YS_kzO9 zX{$?U37!f!T|Vju^00BOow}dL_>!?*&T|zkl!{A6o;bp4(V?R*IIFdnY6&2CL9aAa zZo$IBMrO6|12|Cs59FGTOOJX-G6vH}tH$&=#+8j7C;QIM^!8N^pO0;C7EEmScUj*( z&!sAi#f=L+!?kAXjV-k=m`Vv4+{xp91<2^J+~WMe2}Wdj%ZE?4cy9=pw#Rbe&kP@c z`NC$i_GgK^70aFdN5$f?>^KemPqp?9n@SZJx)jS1!@$)wZuJHin4m#&H4axUs2e`} z1b{9|I^eJ-P5ojpDH5GSaRu9a2!~}kURp)bXTw|o4{2~4DLg<{tb-zm&?Pf|Kgv0g z#(7f7HvyE=u$nFn_Gg=Xih|(n*|d|=IMiIdVb#sCt<PXSpW8K<+?S2gp?)<xyj;5h ze73IZH@|h<cHAGWv?bRk(b3faOCR6Ke>OJ4v`-FCvc4jAc49S?5)xicJ&mUoH9azJ zN}c#>uzet4aDrLqH*UeSgzaW#Y61uYl!_&FMk@|vvRN`lY9pZ>bSZ1n=EAtBs7ddi z?C=UYIzz;=?`at}t(ToaKaM(Ja3E7jkSOb`Bk7F~V}O}sY1Or<DPSl80P;J3k-jX6 z{{D=_WPNV07(YQCp;$<t<MVWDu&P;#05mEM4gIRBobX+m&d#`3m9L4;fOSzrR(T8f zk5l!wcP0_z;%8rzO6sHD=!Hxkk8d?gldYYYG+l=-@&D>Sr$GUS7Nem=EuWhN%{Gsd z0OtRmTtFCc^JKcU-N2eL4V{P=1Cg*IWjrYEVyoSM^B2I#M#3$7h7-QtRq+AmG5^$1 zhMb^P_FBe|J^U{*Pfg}QAX`N%F`I%YTt`WPp7lWZeS4}y2Bc^kv?np})BhG=Gun3F z6#oyZw3pv8{TSIBj>(y2*as%rzkrxvhoi4|FcKyJ<~A+z><$B}qeSHe`}%W|9`|d$ za;mTYoFOno-K##fCLT9k7b-|s9BNwGdxwIMdQs+(H7KAcW98z10SO=ujtLnVw?!fG zT7qJb2!h{1=B)OjY0+1bjUJk*tD2WyKGn>v)$3{hvzEy8J=eBQ%SwClmT{kQv~W8Q zyK>lAu#~BYmy01M!xbHuFIz;837%DVtTRb+INr8_mLzu(1<`ln!o{~)ABrqPMgT(q zYqcBIa#2!(v$A$BSe#XG{mW3SPaFrCCujGIatXxOgkvn^ti`Uh**_wgmV}+Vp#%2! z;2?E!eMf#kRtA4=)eAyC1u=I`C})I9rV{nYiUD*`rud$udbbnaOIsQ_i6v`G`^%9g zeyy?RAQZVJ05A*gF!=lB{PA?H^?hQ?k3;bI6Gy-GMc{Zuf4mn6R2~k@xEz&-h{Vyf z07;TmGUfKu(^g)K4KYchzfBKmMy@NPtD{*#LnT<pR*aiEO$K;r_EdQSxm*u5{3EwX z=q3KF>~oyCCla2I=a`FIb~1iNfNZV%<)UO{Y!pEC_iD3!6l7`eO4^&lKq1Oozq&ij zEv*lz;dv$|*>(5}507>lvjNSlA`S$NGg!yEpODB4v`f#!7R!QaT$-W~Q5*qUM4hWI z>m;qUkx8LnZXriZJ>!paZaGJTnG>0n(EQ4+(kCODI5C8u;GrS~<h*SkYARbZ6L-F^ z+zlpDCX4rBZrr@@)9^jhi<22pU|!2OX%jlNKUGyOV~hV}N|PmoC8nS{&c57H&`t2_ zYtW!XUw?{fx>;_3b9Hqin}Gk_Vd#^C^i4^THM|pI{eLb1TTMY#TecCCz{#@1<;!jg zCV$>lC<_o2>Jtr<AmEE*$|gXRCbpCpGVb%)ki%%dE5xVq1TLAZ%U53G&4X7^R2FTG zy)=8^?6`Jxr9U{f0P3RR^L2iQ!vUmv;&~!{OArW|WMZgai~IhV6L8S05dLq$(ssL( z^X?zak`Ygr<FmmAqOqYOOpNcDKH#Czda%gd`c}<79m<xRy(-A$ZskrTPbQkDgd7oU z7nv4evWH)~-jp_xnSXBzh=e}xK8LkhOq8*XRcLiN2x_GwN-LcE!IOb(GPn?^Ai?3N z^pGo_VD~%SuN~RxkL31KUNA2{=y1uADe9tJxAW2%s(mI*<DwuMU8WSqL3eT`dkM0H z^YyNro}L>zXV}SM-zpNs6Yx<p5<%@rzDHFnLX2yDmh{&1@QT*^TWZFP7$kM{-rPBb z#1wZygmWN2!qJt<M(VRRJ7r=*3eRmD1kd-~en=+O=bwa>X}Po8YH3Zm-rW#<tJ#CG zmdDBg3Tg>p<kJ-1X|-g37HuO7A<O%Md-?J21JGLlrR>WJCg>*UcmEyKeEbJJ%9L?+ z=NsdbVUa(Vfj`R?&&&tQ%B^>2@;vZ9hL%c~AD~<}-bnFUzo<bUQ$?U@WQ`=E{MA?< zRs+<R>W?mR6jYm1*7NHEi4mPfNwC>2^cL!aPKIuQ8!?iW*2vcQ0V==84W8=}{De@a z!;MFV06`2k{DM9mMM2(*DJ@VR;WRYxI}1*EVVe)XfG_&ggw~LBYG2{WorpJ?Xql3n zj>^DGgo&b7s;6LVB1vhP^>$PXpWf2t$3TptX*@}o7>OVQ3K3oe^0ntm-HG;kRTN2r z`0Xu>`#HDl6QaPCeWR8Oj5?jBhs2aUGfnrm9kKhw%mR9!n~3+V2>RR2p06R)rL7>X zY7Ew;t)+#&Y+1fTJ>ws6Aqm4hZ$BHRGBR|gP5wl`XGZSHxP}iIyuTc%s(F4)PGmFF zXZa{sfa4uJ8IAD$7zYtaI+{!qb(z`;R+=-HvL8Z*DnCu<P|_S`mgVmQ#sqC%ldN7B z{x#XLupIG+4<2)~dpCUwqP3F2B&4<IlfoS*!Y)^8vNp5JO4#BIp;9O>Puyqfjw|)| z!Okb)q~~k8j_aSTkI72Edt_|6C~KvJ6Y?(2ZZWpV?}gaH^u@<r+BHj;+oR=jVLF&2 z%p1@YH293?OEjG|U=xN?>diKPLf_VdJ5{BpuRT9?U@x~DviHfk=@DSYAjb^bwXofe z7CVE1^08piQmg3xT|KiMGPn?x`b|hq-tXU~x#vo72p=eec>=TuH|O}Dy}N^w%gy$< z%tzXGi@IM!uNLJ`SH+(*An{=smbRTiNfmU1dMqvwbWHVHY&a@+_C>;q4mp#FiAg~8 zg44GN5nh)HbGhLL>$PV61s1%83e`Nh`or`y5BKE5xx@fq^T8>%Ep8Z}zViL}Qv2F@ zo5*C%xbnT~Fh!9o&TmgN_03l*A_%2m<s#~%6G{s>7q3|P>a#7Y*c7$V$J~*_$Wj@9 z1CET(-IbFqb*0#GfJ3=l@BLIq++b$0$C7&S8+=@e<%HZPKd-G{spY<r{okgRq~;!> z)znWiEjva`b$4$MVbP2gYm;Irobk@P;`pQ;3<QieUY$kn*0311i`+8~CTGz<g(Tv@ zs=0W*)8SrB4(u_KNv93bwrtL}knTew(2q?1Vuw`FrNJY|iqN0W;W}#X?92p&?;)l> z*FS}gk!x3&r`j#?!vf99Yx0`g<5y250MiQ?bozsO>P0y<wajQTST5K$b(#BB<P^Mg zjSV;N&qO{e*W!Eza>p6c)Gp7bdWQq5pQowwm@1hpEBZ=*4vJEAN9WBcAA%1L$)KU3 zWi+`(Bt0Q6r|9s$7W*sTrZp3jqxP11USMT9E+Tn-<DGWfvo(Mt@g4-Jx}J32_6yt7 z#j5vm3~-4-{s|6bI<bF#d?GeUwmKasxLj=dS|uC$_U8xr`ycGA8eK2X?lWj`;N%v4 zev4vFN~K{tq}3777w0V40B*Nb*G(m|Na{WdM#k8#%DFSck7C@;r&+Z1VMGhR`OeW_ z3}Q5Bl29T-e_0mswtKTLz(BQ2m8keU-@3HCPEgI7yhUB0^8Ln52<MD{6XLI{9Ki>Q zkrgRUN%TBzdb*tyr7XAW<Dyr0zgD(A;$Es?otCfkcw*zZV!!<OF`-)<+r+*psG}p` z(FM>$nQ&ApP4@iA;M=%6S(@AD;3^5A_f0#%2Yh%}1@jOb52yO|?5~H`uw`D^V>D_T zSI+;@`+f;>mB01PZSAZa>2lBx@4|qYo0%US@xLHmb${574Mp$C`o1Fvy_gn@7;!l> zeydHSRH8`4GMFV`3QEs!W0wbD#NxwWKlaG7L@7{2Di&^Mhk-~sJv8-=iRGUqQG+lh zH-~HZc+^(Hc^K~^Nn#|BVDG<?&@n1sI(S+&EzEfu@nc($|D6R3AHPenHE9T&+w(;n zPUaR;z(0KJD+JbbFFC98YZgsojhB1^5=im=8wVLr0_Y&ktt*S_4VX8hUA_$^$!;%l zUz&_Ho_ye!NQk=x8;<b!WhY*j$=z}O1Lk(JybmNxI-ay^d_FN{4QSbQOWh3xxINS3 zpS;{=<rQRUQVjaLB-QF2$)xCX!&Y2U#R^oY%d{dmY~%Kp30=LkI6HE`&-5Ww{iH&y zM+%3{SR{P(5nWUtOY~N*4rvp_pL|YyY=EPf1=;4S8{lWVF`S5Y>tM<PTe|H|+tx>L z%GWzNjtn{f%ZV%|bMbK`ZwT*i9|*2Ekt%k?yTETyp0hj?)v9GHJrMznd!E86zTOYC zm+cSfP6KYU|J*CT+_<&7yDOWFi2N7lJqx(oqY7;$C<GZWICj=M6E<1aCmY#RX0>#K z2tr%y9nu=~I7J$gW-Zd_xRJ*sIc#4^9O^ScWkNc5v#i$Z6JpqG_zA_xfGRN$A<r(= zhzSti2@w<Wt-Rw^MKu9WIgSjvWwp+DeS}JprGA$;4M>EztWC0IZ^r%X6N2AT3KG8@ zrK~rZ#X`CAy2qLI`|DCqzSX-@V>`29?Qb4DVl1e+b+z&C@G7VFwd=PIU?fJ<w*CE( zUTt7v#nF?y=sVyf1?|WTzA>%?*jc@Y5(0@8$x=r%OtyJ)kZDpPv#AR0ULcQGZn9Kq zo!5m5bp_Bg(qs)z)84uOS+qL0E|2fy-5)e*B9-;6b#6g6sj1oZdNu_AI%Mk;I!Ix( zCFhy$XfoADBu6x7nw`MzlrcymLMx954+az|$kE1VZL53mGn`f`y^R7_+o!(c|7g0( zpsKpIt%87bNq0#j-QC??(s1Z*P`Z)sJRG`H1O%j|ySw4g-QRxRnQz8F{t;)h_r30Q zWul=k>eo5}$PReg=9hUNX0Go=(<|i)c*Zxb?^|*aRrj|DCmy$dg|fz0{6@;`Rk7jc z9?d46=Bzf40*FxqaeAWfQ{-e#jJS~Yl}Z|UNVne|za+xOj#gE!HwH5;GdTIS5BU3! zpP#GHO0Z=}U`t9+fhulQT73y$tCbXJ*j@LSHp28Bs3|EM*2h)pKbyBf7a04=8;a3L z6i|XtL$PdFBNJ-jNuT)~|2)t*c3xoO8ha1hz(_0mBGp-k2(~p(%r1%w;B+q^7TB$L z$;t0IEq>NE;mSfwqJgZ%MfF(H@b?HEG`5s9AgyB@DS%QE3!nd}OT&Rk{m$P%JUkpC zcVA~T9Pr7SUX{L=kCmeIzZf<)Ta40lbMv}CBNZ6+%zMBnq}_6E8yazn{blX*6?^Xt zz~0Q(z0flhc94u8>20fj*+~p2p!E5~Ieu+Wn)P9Sjni<<W(5;zPr9KJuSj_WeB!dg z3FssRPY&i8Kj1?89!h`HZMa$~ZmyzntFBMD@c2(vAyo*;;Wl?3r^!&AKly*5xj^o2 z&&3h2kM+_cJb&W*iZ`lLiHeimiI_!cHdC+fT5k|Tsy_nUvt&>tNf&<0(j;jBW`(s! zCJiX>_whhKo8LuL7$-Dmz}^J-$LWFGQ6+BD=Y7o;d#3La5BHHPH=!)7)qa0j&$NM; ze2h#V>9GNz@Yt=^`~-fWnzP}{^$i-B0cPKtz!!#87UQw8s^bhE`>}|3W&$|ivVySG ze!jxVuWP8>lh&{mqhslbY%w%g(P;)<F}e+L3_Yb<3`1^9wHfedrNDoIKo51EZWi>p z?+dSVBLotf!k~?LHpZ60r1e`b=!^T9R3AvYVs^^&&z*R&Qq~Wn5{vz~lg4Ha@H7Y^ zloGn!mUTQ=O+0Ca7*5&#Iv#k{@uf3%{cQW{Ze?KqtldmvimzwG>m520TD!7r*&KON zg-kEycZszaTbqi-vAG*Z*0;aI80adrJsd5KSL1JfgAj&PH|c1$RF<59nmqr9bE`77 z!z{3Fku*Pkf=tLavY$t>L^RQoJ@@S-N2sTNSLY&Vqj(G!vC~r7J^s1@f?x3D2n~$n zN8S;BM|#Nz-UBxnTm^)%ztFNu)79{-vg$J70uDpA3@U<H%-BA3AOuq@+JJdr|K|Ml z$#FtMTbv5>@2OM$-ceJfj{he<!#C9`sVa)$lyX~?aCQTI{o$35E<e@i782a-tN;hV zuC~$Wy72=;2Jgp(oQ$6BYxmz5p5E^xgHt|x@vl;Cv9=RCm|ozyWMpTz`&}Z*rL)}- z^v5v_ICyUS<GHv)gK&8_J_MJ|@P9aH(u=xcSJvY!YijzeZK?I!>UU95@>1%_K9|ms zo6jMValrSoX-mKrNIM9W)r%8j(J1{jX;4|7P}u#`QEAWw>W!nrjJ>#+%MrNTfB{?v z^?tjc)3&qd1*YPLt?W#NVu#vmv?G6l;E#dQ^aK-nS3`NP_~qOkz13BuY_6{^&qBh5 zWaqbSgz0Q1j1R44eLVgyy!y@Bwf_5mz&Kl~4UF*%Eo!DGKTKrXXt11r^DWy{R`nj+ zP;MM|SvRW++0a0Clg8!b-b55CRFkrjx>qvPfvaqvNeeO_5tVFV86-#9<K(~dlY^@T zRcBZ<kxD{UqGlSxCVavKUHbFmcjgN$OhB^SXYO^MFSyKY5iui`0m9<I&(aw+=c(%H zcZ!#w=ryf#Loww3`#70kUC!<NB28NVx;mf1#lNc(#m38)5#uEgrdK72E!oH?zElQ{ z#O7bI?=8f5{-bn+MhpNEls}6q8iJj8fB=p!n30J&Nzt?jl{&4N&=tGOOT?j}A;}8D zbV^!;51=N*2GQ^y5W&}><MeN*Nclg9>vUtx`Rv3^|J=f-rWtrxJYE10+QXyvSrT(Q zbdTIu*osq!k4Wh-vLvu;hi-bpdL|ji5(^>B#?jWy?}2AYFh_y{LxAKi;)V^luK)nd zWo&q-6u{5!V$odQV=3pdsw=@^>3VQzARqb5HC1b$u=!3wIG~TXith00A$f_P+#dV@ zT<h%Z8qv7*iN;M2#icbStGYGWWBjbl(OR|)`i>90dti|nWga9dR<I!pW1%fgnA<F+ zmjyca6$Dc8+1b-FT+@CgX$#PUWn%Rtl|10sOX92)R7o<J2l9`^Hl0FVG@JZ>ITON{ zgPy3Zat48s13XogiSgHtyjruX@DOppM#I#w&%CiWzA7bqxM1cm<C7D%q5$u+dhUW= zUQq$~P$?%2_X!S7;JQ`tl7>dK|J<Tyar<>4jSGjbed{%CDo~+C_z1(;@eN-uHZwI9 zCPWNFLR2onRDyR@Q4w$q#K6Jq?pk1D#}?%01M@sg3fynnl%PQ6!~;LHfFnW^1#r}E zdYoDf@0-+k8T02{bBCj@CQ!E@P~n1gpm9c!@9jY!X6QK+tj$%ZiyKH78|qz)9EER? zEzAah5_@$R@z01W3CsXoQJWbHD{eyX;U6@7$X9LJ>!c^HPT2W!^JaFu7w>Fgepxl} zM||jAFL<0Pi_Jog-sh?bMM#fz>A;2iy)2+EghZbfZH-zjbodL7jR-XQP#PK<5|!I- z#k0HwXH|D#hl&B!Nt=(H72bPaI_2e8=`{V-fBX>HD2f!wImH2?0V7OLnSw+dJiGnx zpILu4HIIQVxEjZX3xCjQF@w|o!^hS|bMpoGnJW+TrN-)l(5Mdhh4zl1{^Gg!<J2df zlt}jrS3{QNsL<l+=`aNvtLG3|1OHW&k*v-GolRuE*i7W`&kd@ca&xZs_Dp?dax!iu zH%*ktse)5JNhJzkmvQD|g{(2bJO9sZt8oKKrkJ)(dVe<od=FsC5#WLj+<te%Y<%ic z#g+tAf%K3M(W>!MRbo|YC>c(!0)(eA`V<M@p6@UGu?zk?AiB+|NaC@8DnMz9VEWDM zl(rx;gsGZ<w-2F`W-9cbW9SBzaBsyo5q$47zWVPmzC+bG1-n5PFnFsy;?snmH+7AC zF5&@L=+9$QIB(!Z`};$cT-nsLw6x!cg~2Ql!zmyRA9nIUkn=L4Wuov2`;6TK5^3j~ zGEU8}C@+d1^T!rFsX6HiaB~KkiGLYJ#!X(KHtkQ{#mNKS*xg?+QPI4G45^5Un(D$* z!{~ttCXzT|jgp+KTwo5R8o?n1_erQyeHoSwn;wfP+aCJoX4;|$$BCqo*fqVmE8@;X z>aZYX??3IldjN-+cv7Wk=l5m|SeXIdof=}+y7x$!!E5XB<}NELQZl*WlFmwaUE;R4 zb2TnJZdKimSfs)JEQ1z~2CL3DEYumFX6%!|fA%|VYm1c%LIu}DHyHDY4Do|YD^aM} z53$q_GQmdCYUDtbL2l~i)fZdf_#09$F3!oFQU0vriN*|s?BF58HR>?|8?y|Ln1His z(1tF2DnYE&<KMK?l3HtIU^W!4j2OKL{BWW_;d9lBQUq#dC2edLBfLThxgECy-}XBr zLV8wQj&p!0$<IAPYgSYW5H*tt!t)1zai2~-M;aUyjQC<77S|FZDg9ZW-+Tm%PeTJS zIULbCjA85h+c|eamWM%CwYutvUn^3X%%__TU*^WbJ|rhN{VZO30W|BF*S_i_vRTpi zuBoOCZ4-owF>npKiVOBQH1RB8GT|)7G?-Ya(QglQLV-VnXPf-m-En8b36x6f+0m~& z8rA)sSf1{nUHd0w2@y$Y#$D8Tt%(-6RZv_iAU3gPcEd&ID}h^ZR7iNT{Q=bc<?%+~ z{JiB8Y;b9E6vnU=WZa+ZV`|{bRo(=s$?vp*yFjfhvVTj0LbdRMCsHEOoK2REj$9TK z6EiWn9H!(oRAWg}W<23DEcr`~LUMuHKh+8#GbRdK=bxJDQCS3ma#|}}z4h@qB<I7Y z$Vw>DQhWH_f8)uhL>vf@ij?>iF5YW;am~2eK*0D>^e2heK^CKN9f2w~-Qdsx`%_(A z!4KJ_l48Qt<>lpcPS<`q!D@51p+CW#0*{09pYC5q^lKwn0w3f{{IM5?bZl%s={MU` z;v9(;u%h1b6>#$(f*i>*VkrM<VvoNtrkuU9q<qd|)h9OJ!Nx?DKDd1F@?C|iejIUm zrywP`&ywE#7Vx%{9V0_4GWx3Q)G~*4?VB*P`>XyEu=?S&el+t*pd6E8KX5navESLZ zU=4ucv1M~H?iJkN!hIkwN1bhOA0R0Q9Rb!dQWAJJ?47PP<%PN%@t^=>(1fE0YMQY( zXLM?I{4D4g>k#18uk|=lEATs%*iFAT1-$ssC}t*`TKxUap%6YTwkabQ&qc7iEBqEI zP3n(bL9N*^k7A9Mm`}(P4=axjm!gV?QaoubLvbBN4=D;6wJaH3o^qs-0t02o6%l== zA!6hdlh%2^_jF-W<x=E+A2zhq`Sk%DKN-vNVt6A~bl)NLU?<3eVQTzjr7jl!^z9#= zU~}p%YQXJuUahC{M<s2zbsy*_mxeKi#Rh=)s<$}S;v=}*U=(sZFB8ci%31s|KK+5J zZbzxmZfF(ib;1u_d3-O`fKs&<A&kCp;(o0A`&<CpJfm{D$WDWnp5fUjNojIa;W@40 z`5nLjRk58dc3Iu`KCrnWjxDLm;51+W;)nnTnr*pgrv=6Z`&4qs5Y;C?A>mo~Si99f zS%A7NQ-3L3!slT8S%?Lm!Be%>mwzp8W?w0jE!K8!tt&lI&F*%M0+lTzLbRmMgdMC( zr&^Xwxfb2-d*=XLUDK;gVmVp|j^$a~-fq)y0j%7>eO5DA-?8vrwtl{sfK^9D9*J?R zR1Ztwb*bAjF6rmE8zG2Vq*|H6EN71iV3gzoQwz%nw7cCb5&pV;%o6#YtpKl-1sOjM zD)>rJ)vSHx!bq}TxQm;k7JqK+_!5q5?1id|{c!nWZ1tFYVfDG7M3{m8h-3?DPjG2P ztD)B@#n8>nO=dEdp>W}??dr6hxA5!K-IAph52)$RTJDh#e8crz@%tR~?#K5)8HKjn zJw5=Brve1Y=#nnLZv54qt2!pT0dyHIM*d~mLb_&N)ksgmNQs840zbNsXUEN)Eu*NZ zBlt1QlFP9ozo0B7mFupS#524k_QlsjrK2;5*%2P-O*K~OMd9{O^+v+Iu>s*)P~d=b zfkQCo_8RqXz{76Z!%}d35ox^JvP>F_2-(Jds8!%F3in#bqTMU@O<3k+ghV7UdDeWA z*60}VFPs+Oc91_`qSiP`yXka40uN}zAeR?d|2;5O+7ur9RI_H25U?uLLpoEXq0@y$ zE_5s1CPIZLXq>dyrUls>W~sF;(NXaFU7b!0!<<1+lXeZSeUf6>v{tpjP!F200@Z}G zS{`^VL#EeEBB-qR04j?+t@XlcSf#09_wp0}Dh){D13qkN#!UVkXN$gc1)AjG(wndk zLcsD+v^gQP<3imB!J;J;Mgf>4d{Wu+WJIFXZwYx>lCsW1mSB?bQ6O`SuMB~KC{AU5 zVx-`arulS1ysa%*sm5_3P+Yx-+{1oZ#MO*xQ>8qm$XbC;J~emz-)x#mv(BSL;vPFJ z6**_8``hcw4sIHtVNfrkSREwRW~19g3tOnSp%luCmuEJ5q1(zS+MYCCRIMRx->X)j z0S02eYQ?x+EjFxZCZ9hIn$RUJ5Tu_ZD($dWx4+xB9ceT&tw_lIGc9lZ%oZz>O4EHb z{aV}@+dfw*_x04%scqSr&rsn0oYHE=?q9)DI;+{>*gtB_bM)wtpNXHaK}<nk?;~_= z8_B7+C3@b&W&~YY7+YNBb;_BoilUybDqSqlNq|`co(8n<Z-ejhC#@s<l@$(A;a@oB zNsIniq9KMRUL=i!?Ve}Y)haYgW&s!OgtZ19iVu+O<;-Vy;7(wt1?UnVi)`hAlVZ*T z4M0zz3$5{w#W=us8##bgvct_eJ6~%xj{`vQ0AfcLMIq0uGxl+q*>tOD$UlPLr4_kB zHGbHE*tz)d0y@gQPQ}8)QYBENF_;kh&5{-m5lflM>)7}WkZ(D4f5bg6Ls@-Zt=ys% z8{X_HWG7^Fb-D7|=yv?pz&~L<i@j?}+_FK6c&GI*w$BtBH~#RhDaSD2LpPbnF#14e zuW6<48>NuW9qPMyfm>L~hehyFaockggZINp&OLu-0@bIcxrjM)(y7>DcHV@<(cVIG z4Ilm_Ey2HYX{45CUkF*#D|y(jN-Hb3JOlkgSwFV+#({4Lu6@gD7UlKLP$DI=FVx4t zep|?mzo(^3fk%dS1JtFU$c26Y#CQP?IJ)>sje49uIXDeN-=(Sunz1{mWWCy+IXIe~ zYKwD$t<}lXE1qBBp$J@y%6-!W&s*#G1*p+2dlIWMISj?EGu;LK`=TIlv=yvZ)@wIq z){+h<7->pn*As?f5U`us$gv~?(<=NEb7A3p627wI^ig^8)ckCcGL$W(=iA{$w!z|N z%t!f#MGC<yaNd@i1rS0;J2Wn2Ld<}Dh>}YB=Z)ER&cJ)56g|vnu*TMIdvX0G^V`?K ztt*zDsaXd2s>Z<L<zzan`$d+3vGmXuPiYrJDhMon?0eB<@+dY~Rjz!E0<x$BCT2fk zrd}{P@)#@jcx&8IY+#Y;vUED5hX#o0E#L`;D<gIQ+rGMHNmhJR2pH^0X$FIt74xQ^ zzW~gw>>*q>(wZZT1wDTlmy9455Pz{AxYK@i0bCWpn5T_G5R0NtOD^JQg@l{3L{Suy z6}_<_d?*AYr_-jagmrofcqn`vAWp<q<R(49Jt$c*3*1VTKf$ObQu)1-#VS_Ka5vSO z?F;eowOPCR{#3evj_rksLn{`f{7*!K-jgDHX!Qnw`d<-!@?%yCvbv=3vK5mXwfL;~ z*H(=*mq;w_T@8VL7fv|eLf)_9B5Yp#lBL4r0pzcfr&Q1bpWOsii`gGAU^K=QImq?B zXP}7c1)fBPjEPeJ_u@~zrX3%%ZPADe^Yb|DIB<GMWy-!GLoBCu(NtRB$Vl5eQ8N_! z-RIXiKvOl+dNww6kvbtNRxkvvTx1w150POX%GQ`v!^ol#f+D_ur`66^v6&i=Wb>|J zH4dT`cXZx7gB!^nN}JGXN~lhK`ENGbxUx{?Mr_}@<@17yjcE_ShZ7Fvw<kq@&k_!u z+x&j7W6M6X;l7WfrmOSwqzLG-eX4`I2kv^<h`cTt$aV0Hhlk3?tGd+J-*+%X7R7r= zWfLudxps0nIWwhXrp~}me+&F&dT9?|>*C(bL12^2*VCb(+ETcR355#l6EYlDQnAAR z)G)KvzefCy<AlRGG!)b<{2VR+e@~RkbIlH`QCby!rk;@f{5UUjeB=TR`UD1S^Irgc znG{9e_B^1_Ha9ot#7G0x{ghfrD`$Lv2?OwM{JR~NeDE_h=?ZdGad?mVhVI|J1p1#J zuAbVP8-|quytZN%`8QXB0!<n49?LU{B>cY?01z@zlSH%HTx#Hq<nhxxw$rH>JM~#; z*SES5Q%9cyk2y)ESLVi5Rwj~)NEbDFN^$2fa&QNM4MX%NdD3tKoyMTK3vj{eu7-{D zO0K-LaBG5=l>N!v3j?v$BPCEp=D(fyCVlTrIyqkN&7Z%T;3nNJKCS^b7X5O(ULyWn z{(BkCZmvPvNhDEC$w0pizNI9oJk#fvxU_p8ZQ}HlsJS`r$Gf7os*D_cp}%Kmg*~fb zWFmlY0Z<@~MWs{>4YM3{SXxj><>0i<hG<ps*_fOpG`b(pIX`^XF8-m09g1;M7t^=Z zyZuSyKO15ykYJjIjg9RzDT#YghVq{AWnhl}*4@2;4b{K)7XM>v5Sh%?9?KR0(Z3_> zG3n+MDF$)i97Ebw4BgR#yF~(o6D&%&HK$oof2?euLMhM@>rQi8-s?1*eoj@z)4W|k z;Wi#HX6eKXRSO22lT13H$MO=Y7L#Q}Y<kZBjFF5CZ9C^W>C@tYNg0cp%T}boPz<(V zbm4iHf!M2~=2qBYaFTY42yB_%&7n<#P!3{of_`A@{9Yzl=x`_IeW0#vJ>olkyUa<C z32S)Frb)uwlnL?h{IbSO%4F|Ae@oK4kF;@mK!uJFdvF089MGQYL2ztaDpZ?=>S@dO zH<!nozGdyg8(_tba|m!n$kWWYj+~c9tY9nLX>a=p9cxWzsSgL}n?MpNzR%t0iBtgW z;{BLGdf6%b%Hq)Z;=$#(_G}~PfpC1}#jb%yQd;D<G~rEcg{%XV$Qiny00jf9itq5Q z_38~_z9dOdObV&D88T~kCKL$cnGW1mVH>jXM0p70=GQ@Ttf~I}cu7GB>iVZyA#LE~ zO=W*L1@U{0<9~QMuDQBM?Ic5>@R3IiGC+x>eT{=l1`!815*E^eP3DDFL8I2A8Ku`; z(9i}I!t8^SP(fCWJlY{Go~$rK$BjGBy2Ic=H7;kG1eNbPgFR!hj;tm}cEuwG5hV<R z@d2+yiy2C6hNvT!W-W1$55Qp5gDAXIXc4P&6D`ghCM1|rWRPJaZXcd+UBMq-KLRmI zC1sFU8LFs~X`q}|h-scPA!2$;L)xOxLr<UJ;OLr6w(LNzOrsuJsL3ewCRVJ(FZUw% zE><qI&m71-i1WI7b<)$;#?^0e*!>ayCnaEv=Wjl#V9=nJo)AWg)Nt>RI#9oX)?jt0 zN^f4O0rm{U*BYQiho%?`EFGcFstDO1<ONE7hmawt1&ES!ulO<ORp9`1jdQ?UzCind zDpWRazGr7B=_zdM2YR<kgjL|3twX!VXntG+WEH@tw}bE0kac3U<c&P`N;^O0`8>-0 zaa!--;NYlret~<v4`iti45a4eZ4GIc)nJQ^&>K+XUg`cF&owbODLb(&W3}y|M=vZ= zJ!LwS5yR=pHrHN8+tfi=-IUtHjs)|{d{p5<8AY+o)h@0i`e}MhKSY5>I`O}4JFIvP zd`b$mkR4uE=s_fy)4&?EK-kKG8-Ys$JCG`KaH9tWcBWVYT~9%mukR2rhl(Tw5`c3K z12OahJ}9IIqp%Kdjae8trvL;PBeoBq5ZpXGAYXt~*5mWWO$YlzK#kO#Dz&6f*rq!M z2W{OgO*A?>KGykT$~kWos9v+#Sx5`ST{`KE;-M_5PRc)z2fijjp>{Di%O*6H4(8pL zG8E|pt7CIaS^vH0CiQ%a+M3eh{!E6%CycuF5enM<rBjZ?4*W)lIBHnYO8sL9wId@V zTZHj~ky=><c6#YqtOtGR$%!3>|A?2H*&Nr}1KQ)!m$@8G6=Xlr&vp^6gX{2^PRih3 z`orMfWh>!oMPFq9!eD1-9~v1k?~lP>xojP;Hyc2$Z)o6kob#5DBzCQN6G}-8u@IvP z)!qK&HiLBp0(V%lul27sYC9HHfduu`X?%Ri7qPUzxutx__r$(=WUlCw=sN33$rxy- zW>Dr~lTTD*{Pp8qq8y|b#0Atg{&bJ$ohsF|=AZ}0Afk8FYF0AU)&(qZ!;qnp`-)A2 z8B0!`L`5AbK_SY4^936b3pq4W%FJrV-PXQ(V0m-z+b;8xeilM_&>_N<>etV~wu~8O zxRXtR#J&I<kZD`J|Cr?<TEk8DPofdX2Wnzly=BehI<C@hssA>)#qnQ6xJkN|dG270 zk9|}MlkD^MtoGNeQH4x4&YX`(;grwwXaQY;FB|xXNYOff{CMTl7>kR{M@kO7l5djd zA6GlUsshBh4TOw9W$5(+ma@8zMs{jF`w@H%5<STzW6f+SuhYhVmZ+0s|N9Tn)ds>g zf2WtAQTtps*OvL^#got@DZ{owfM%Fwb3f8J{q=GM8zj1Ce1kr>vi9Q6*N_Cr;XEEp zw>ID9h9RzmH>=(a9XApiDEp4m5J|c^rHn{BvWTGfUeo;XJTt1lic0UWeyAOuk))V3 z!9o<CW(4NJ+LVk{IMB52AJRh(JgbNSHKma5L{X_*2|Gzw6>CO3_J0UZOT71!u8o@Z z8?G&ZxfSzk@4o9nipaRJa<l{sQ64F6#)aPml>P3W4hQ5QroH+G8gkS?Zm$Y$(7>va zrKJ|jX8hkm(?3rm@z!>g`%T(Ld!fRAx?IO!erN*b(jn?J6)i2Ut!dRUiD(J1zaD&i zqrE<ts*%up<!z&(OimA((2VKd)5GR$hpsK_eb83A{_;^fg0BT7<7m8MDteIQ$%%<B zprGAXI&X*yKna<$xLmdsxlsf_iZnKNUhy(k5P@Xf2FsiV?){p82L_|pWBKH<PJG|) zYqO$swT^U`(5T8fq(K7yydax2^vfpIj>GZBc{@ml4<&&*ja*8m43B2^{9!DkZoo%S zQ>yZbR~KpF^s1BqhH_-8=kJTgrlK$_qz?o+ALZwGuE#JdAJ|nuBed>ZK2c9OD4#W| zpLj1+;NM=7jEg>g1hTmxA9;iSwP)MUO-+fBq363n?~PQ~4!@>|iPB<k0urgMvM(gN zEG)0ACynoPDzzB37`DGC9F5t{Qeu&#N1-EzP8{FtKkFTwKk^ziIE#x5Htdh_^Ha); zq8I5l?7NJ*b9+cLfG+EE#OMCbl&bS(Vopr1g~>q*Yin!gZ9jB>jWkcpJfhdC(&OA1 zKfQ$al?^*7TlnNO*T5DIa(8zZxXAf3iI<bi^t|$|nh#F;J@99&Fynq1t?mtMby&I{ zDx7HgJvBAiw9(@7b-4!fQ@E44ITqsM5EHFv)g*b+Q0;<2MB#Ta*2`%+CH<%}FmP@v z2;lUr&MB-Gz=Q<9=i^^e-#|D}Kpn|2n_Nb6N@kQOo*~yhOkjww?2$z%jLB4dlOE1( zVLjyZ+kWc&X7_M^>Rwt<MD`SegMo+Ydo{|P!R7B$gWb8w@dHx-WWb-z{JTBJ?|hBF zqwCUo_}|!}Y>DdfPQOjG8QVcPhu^pB@4FYA@h}0x?BiLZr-uCa^u8O7*@nO)8yR6F z@!P38Emcu+Hky-#aA?YXq)+*fK?^Q^B}0`q_MZ@;jTtxr>iITZ_`>|i0exx^(0WNf z-kJrJuDQOrbE6|XW;j30Csc&}={`7lQ0UmfC=_+1pQ>C_*nL%;80AQ%irniLe@C?N zBulRbgg<7UkjVl@Dr6c44=Wn3EUY#LB*-Py5><+V93WCLFL)B1B7#%e5a3?i+<hV> zDSLmbm$S8gs2U0t3`9&!rUKis>PgcfHhrpFZ_NI#P%I)RRciF+i)tU3GF5*e@H#Vn zn4l{a99P&rqAI$^o6vDHr$55yIJVh9iCDr^55;g;s54{WoYh?M-p@&o^=W^7XK2Jy z^XHPSVIP=Zw1-M`0PX>M0WWSnBWGtxsg<-@dE`or8a=S>fAcNAJ~NXZ$UcQbh1O8< zNi-5U|A&4|9l7~Em05kwR48K=S{zF%&PQ7P00;11Xlvd{5c#y*kHg<0fDhZOX%TLh z*OR2GiLNNw7*jUVbrg_I8rQln;~1Fj{p7dtA}C4G!?K8Wuo!74EL*<dL;37D>Ek56 z4*fACIT^!XU9l*}u|ti1(6zlb(A~lRld6`FO{Id<+<bR)WU%{Neg1R_f=(fA?%a~n z*9|}ugB2OlHtR{nCwOw-#&_ZF4#ZK*_HIjnG1_y0XN{LgMXp_{0*b-QrY1uub>qsm z!2M2^KclB&tw3Z<rzcXaQZPku&UFUfY8trk)qj8jNyxiL^6H2JA9NJq5M9`OP$=+D z5_Vhio{b*s^dNlpN@8D=L8OnJ`+1UyRDg;M6m``AECv#VO7zY97b|B0l2n)`uZ7eK znF1-$Y|4H`S<C{JkVhxNs?)KV83Nm=pYF`&Mgm5pQ_i;liZ7}<iHD6yo#2GmTVOJJ z_)h+`<Los#jY_0=I%<?nK#l=Nou29F>S1sMx;zEIRR9eOsjc<u;#OtLfI>JIc5h5u z_z$25WM96dxegH!5O^Jxm7rU=^fUkQUl2B?(N_EV!j7%*hI}f%yl|Zs{>fV(9X4UB zmD_|N{m0TqmtOn3@79Czj0>^?IAS7VG%_3~4`}=?_GB3f`Evvl);AN1M3@#X*e>`k zp_uP~4((cV@Fl8Y=8Sz;gU|pfWX~c{>5DE0rqUY|@XLsnoF09Ay0w$8;l_-WiU<)0 z<Qa*PJecUHfQeKb_^lL~7wTuSWDxLFOoCMo6Dr(j-7PD_41l1Z;%vGDyN`p|dNXj+ zo`FY`SwS-_B2k6Nt#Yw)W>gqRYEP4n3oRGp3h7@HX46*s0MG-f`;(`V=CVF}A6d1i zygW*RqI==8r-%cf3iaZE-_G-DM>D_hV%(~O)#Eibe7<xm6zOhlRMWP41JK$0a~&5P zKpKBd{aeUt@XL={y=0t6z(+2~nnTL=f7-_wJ|?BC|G0qinyQk9<B-M7NI>~>VKs>V zJt2->*z?JdvCZ0o{scUqcvz42bm!*oev{BDPn9TP#tNA5EG#Tw-WUUG=L2RIbjAVf zkEga1bCI_<1SK4xtFA_2KfGrfVD8W4KTHnDV+y3da(v`%;$O@6na;D}|3#u7a296@ z=?_txUY`7?rC*!IEJ>rCs6g`*Nfs6pmOtyjWge_Td)|7C;Kq@tAkjvt#Cu_#ZcY(L ztDP8OFNO|Fu}OxQ0+*qn#NqdAcWW>fRiprVyAhg9<3P0|Zd;qr-Wt&-T0K=bk)?_! zV*5|b;vd<bV~>$Qd<d*dC|rhEZ0Q7<Ht6YN7r3+S?S`5H_>M~50fgM#<)eFEyXegm z0N71A%?lcDJX_#Gq^&*$iKGro6;FH2p)ru!Y4F-Vx^WOF@~Lx7F;Rx+Txbv`uAfoj zA=E<uB0c#VN=d=Bta}i0uQ|aiw>a)!4CHMD2HXo)a`6K!2QIU*tb>t|?jkSHc7S;S zOKe1%BP7fh3s=HK{Vcqs2CefVTK|My(@4(?flwbNGl>g)q-<VB3L+cLWsh&-Udfj8 zElt7RwaCHL^Rcj?zFTosKEt-7jY&@C(J-8KjJlPeOC)jS$u4brG|Jj-{WdQ2#CXhY zC*nA4*1sDcKj?X6@4chc3adWn<<a?o%>Vj|_pzb6PxE)aHnzKY2!z$5ko9Ji-r5k0 zXNn2wY3XO;MKVIWg3`i#oI#mnGM!8>1wxRB0D(mH3|R!*)+D;v*#?vUi-n73`3;2d zyQvAOT-C>vH6=ET6S%JT0|ddknh2)cBJ`ZJ8UzyFQP<c<Ad7*Db@GLPpT~1X!&69U zCUqnvnaoL%JLY`A^>`mywtT?I_k`1OMBwba6}@j->hzHJ#=WU*>G_xQcHEOslinz> zHF>|>%mZ+!`FL)}^CNfX=JL89I(SmT#F^E?Y*_b~HJwKZR@P|1uj(?jtw#OY3=}ZU z>gl0C03wbk8TXegYXMn#eR$wz_lB-txJ&6Oj-V!GNn`xF)N>fBm+pHM0j%rDNoAhB z7>FezHO0T9R#ph%NmPkv+kk^$I*&<MdP)m$6P^j?l%FM!bZi#M2nKV;cFPG6SZ*Cj zm+HL%1mMdD<K_1*B?eJ)RwwWr@o*#s#$;-QK3MG<e9Lsa0je}5^C}%l`m(Fwzu1G= za>?{eY@wJL3f&2r0kc_eVmH#A1E8skjqP~$0JSs5?`maaEW^C?Uv`muo9!0=+I#w6 z)KWrt{X2?)fZDWSJZ+)(-$(VEQSUn-5J+-rstX_pKHm%{t+SnHUh{dfZ?;<+6gKkx z*s%C_!FiWazm6cd8=$e+P&qlK_YSFgO#195?m(^l{N0!LbUIa1p~EI6P5LTQG-*8< zi2q?Vd>y$Zf#<>tcDLA5R=mnKOJ<ilL;ly;l#_T>Orwo0Ev(*CUFs39V6o@i3&nRp z74LrU-sSbQ^7P77%p_;n3SEWtb=xlDXHW;eY$BfTEAE7ycVwm_%hY0R^pvEhsapy% znc6X0Wr#@xR7tYYi-RX>aK}YL7xb(<zJntQZ5w)6DlhYUlIA#FA55{W-u`D>efn8Z ztX#5!misD(=&u0g+`@tk2LUz17jA#uk^brB66*<@bGJu4VH3=^*ZC~J=Zk^h)6HCN zN9L=&(cL(Hhk+9h^*Spw{^r2H!mk&6ECNsZpz?BB67|19eey#rwB}nybk>|8KrYQl z^P-y(c81^NmAxB0>>!HW=jN*<Wr?#^KF5y5D5<*hr^YWfdqv=#0T;Vc)^4&tP}KPi zxO4jFqQU;9!Ynfyib0<55@N`p!aP0>qiX93IN_b(=ycwe3b?p3{!aGw^|>u!NcxYV z6qucoIw=Ik=(5CERsb{qHEDkFW$%v8_;t3?Zf&FMNI|{;DctJ&zn#I~R>4t)M5@eZ zkfSN9X#^kM#*@$GLOwVZy5ni2UO#skv~FajbrpRs>kaoMYzOP0yJ^OIK}c!Df1XR~ zj26u-lin+r#5)Sy5<9#>Zz>JjQez3ZO&d^{mQ5NKb$9}WkoL#-PuotZh$1h$!%4Sp zy}Wl*I_u4rwT#}LjO!MO|I5l`?UPi<6L^23%f;J2JvrNkP2<MjxB6N)Yu7uMBY1e& ztU{mid^8X*+Y+#;A6zY%t@hvI^&4=201_kKcRo3(P=x_H!5;}SMaCbLc?c|?nwcUB zWu&B}NWY)NGXYME$I<Y+2+YA9a31!>gg9D)3{CB>GBwz4)8;S6`>O6JvWSpp;+=6F zaYiT@aw&NGdW=sKxF@UO^MoHj6WWvUNmXI=5qe6P!k{s@^N%u@^xl8BY<(zh{!erZ zB#}CrWhc(J^ZV+WZ|smcg)TF{Qk%t$+&s#Rk^hY*jUsO)4|Up*wBN$jq$O+dQ~_#9 z^g!OT(E8iy_DaAL@$<ttORih*mnaHgYqY@4R%WAfKBNX{@h!Wz9jwGpkvalO{{Dho zS+M|ZbBF+~d^Zek{6?&W#aETdY>W<&P!ACix)6og%Z7TFuo2FLyx%X1KkMsVf1QkB zPf7u;UNpkT$@330Aoo1{RG{<LOF%SyAhu`HQ!0CWzsHX2&imEcMLFKW95Pk2Mf*hx zy4H~uFZ_y^VIVuyo+U$r6|rSg?u_sOkQS=aP%cob{60XXc+U-7@t^_6(h7PH=xn>+ z1kFr%POq*nJ_RkHgw?zK7Wx?BV$LR69zcf>Q5Zq?PdQ2l3u?X56^3iQa>H^>z?t{7 zvfsKB#W1BX@1{|$n!w%l{s_F<Zo~pudCi7G0jeJ#WocT;DRIbrp^7F`Ur-^PBlPU$ z{EOdR<iM||HI~cmx7W>Dx~qu7p9Eh@wd$;m<bH}K7M<o^P_bP=%ZzD~)M{RI(LVy8 z9tTLXGXtP@e-247Y8{*4T$6zVAIcWzVd*H@qaB4G1e4`<O~l3#yqF4UZ!h|THUZ5) z1_G>(%j<*xn%UQD7JXbq=|}&yGkI?gH8$3A?zFtuv+;L>xs3!Vtb}=OpQ?t!#JnG; zIO(e}RB66UEcWk2cLE8Zfzmx=fwhjS<8+<p@-QC;v4b^Y<!pJF?@4(T40v#A5my6w zF&RH5sB=oN6F_$+Zs$vv?!N@(C>l6*BcA@cGpf|`B}H%1jRDTKvBSpWgt?g+2}TmD z*T2+<`wBj*_|A6t9t`#lERhl)(ioC}>1r16RFQYpHBY)V>FAFYs`f*Q^Z7DPP-%5h zs{uL8r&sVd*fnW0<S&;T<iGd8!Kgd`k8S_Vg+aaPP}zI=R)aChcp*`f$@JuUrPQlN zS=sj?J#<pG{)SB3!vi<Ri#JG71GFUiZML7l-ih8{@pb@A<2$t{o3}diM=Hz<gaBoB zf{u?VV{S`8D6d@f+ScFoNwKwLd7H&MW_x(<iS!FTxel1neuTsjIV(wfH+M%w3dE+< zufZDCc&URfR8`*VzEJ-=TsJOFKu~ml$xUiDRR7ukUk#ukXG|lmSX{6*+G=&E>9{3m zZEdA(v!MSd+GWkd-lbNi@pH3wVgi7ObcUid)0~EHw4G04^CZdB3RLM5hPyzlW;1y& z3Uf(yl)EQ@4$Sx6%cEXX)VHrA&!N%q*Th^Ek<l!ABS3**!mvdT+J6UD%c{3>6e5#I zSdWj~CqbAxl8+>wzWmJdU4w!{=85O5me@Wkr*4R5jZ5mvLXwO)V7p1;j;So*rh0IN z9vwEBVHZ(9jnxE1C%9RDNu*+Rp6!{je<OsS7Y+{z5i6rkP{>y~n$UBp-BYIa+>$&P zwJLF)*1BQk)PI%RK5dyiyf$dv12K0#>Sd3`7>UqDeBf$GfFkpkyQ;L@OWcm}pIsl- zXjG&OBzMF}Q268Blq?x|Fq{w@O8j1)1%b+aaER-4vUM28fQ$dbUDn&T#i-AWM!yg$ z76At<pViWW4|K3HZ`y(6rvYd@)9JUtuXu19ut@>d^^DKB%w5i~9w-d|u?0*9jU0lq zz2*}MDbA0PxSKM`!1c`6m#|@+-*E$X8}{2Ti(#Cos3@u3;!7~;8(yfKC-PQ|1S4kt zFtH@KC4c5XSw6W;#bzSYPDYImg5+qmedW2`xP0#BrWWwJibo^~%TG9|TaOXaFkW}j zhNjxE>o{W<5b4G7Kh1o=T?cTtc_<A{JNi80vQ(Rnyq`VTC1O9E%CzEqx5=tFV2kg4 zT-EaHpfFlWgGPxtE#ahIRdX4(>(&41(O~%U6P69gZUbIfxQ`|9R-LV(9{94^ij{JD zdoP`>XTY{1cdYEj1u}dT<8G)ioRum?)w}Hv(SSwkVQT;M#WF86G3RjSGMeSv^TL); z*`W!{f0)xDyQTA6@cKKo-k`rLBkV!`z>Kgdt?5}_>~8mVg}=_-mZi0DJ09EH-HrW6 zc=6}yR6H>e02UAIO5c$~)Xbc2bA5g)^dfjIM})yx$2OnN><wnhnUUdq`hbbQ*cU^p zEpyWyO!U0bqVW6P1hFJ=uaf@_qcc31@J-^RxfAQMDIq1LM=`H0He-LZ+x$pTLY@9I zkG&<}59AdrJe1JV)s-bf|F#s<^AbHkk0J?HrKhKd<Lr0*HDW$dvK+K}V&Cy<$#oRj zzim+K_fg$yq^KGY@(QnY<>kJ?biQbUsx1~5oc;Fdhw+31h!%A-z;n)WR7nVhB1WmM zUDM@0KG98l#LU`faR@m|J%4$pTfbdoo0apT3?E^_in8IwuDoq<PaL@o?y^N))sNws ziUNWo6-7>*3iqy1s19Sm-}y#>GW<taS5BYu>P)&6^fZC<PNEeN+<@o1$vCozHJQ%# zTfMf7c6vW9pH)W%D3hrNXi6_C1>l^n^B`?maUpJ5bLPHV_2*xHy`?Rn&MUE=)3lNX z4K0hUj&YZ+-qQcMB>*Ba{}Z!mS9KJiMeEZfnQ#(LA$KXC+}{EXp9PcFgCiqKd7WlA z+Q4-E#*s_n4hED+N>$-v1x6CAVA1eZ)4!z1Cam~_gM;5LXKcv23o=3NYf5t+S6pbq zm*_H>z$7y8ALUF=N&V{nFL}~klsb~J#9oD7V<|UdAhGvaw_$o*nUQ64Dn)*1bc~0F zg(X)eTj0MB>(GslB=8a+FhB*-{>;m9mZA%x!juL6WskhqhV8J2&2!ebIdOCZ(tS>= z1{;pd88K?fIluvpJ=Pv2;)@d7wpQeEY^+LXsN?cwn?57HKUtOy|I3E`7tBjA=h9CG zDNC4m*ftrOZKCIcyHX9%9+OUtTG<Z#+m$QH{ZxnFW&hnLuOr$FPb^SR#$q)7h41-H z;NR-N7lh6>oKUf$UzZnthp*wlI_rWh6O|t0!$z#-W~GbuaM(!9@8L9L5#E3dm$R21 zcNO@0Maq~u-P^!p+A=maBr5kB2n;BJa{9pSJl~Q#*)uBgPy)V)Q05Oo2)Dl}Dh{e` z4PUC-D%$2W=j-dMZS@JG5E0c<m^<iXQc%f19s2upbPCgCn6nkoB!64m-}D|#=64;> zcKx%zyf#1HT%~_7Tfzdkds+=}4#+u<oOuj&>^$hpL9*k6U1wL*U@J#p0P?2hjsKS^ zdKS3e?a+XUk3aPN{R=+34@a7DfOpoL;3$pY1#5})5<0pf`h}0bxw)lDOpGbCl>GW| zayLXZqcG8BFQBDxw_goglEmvie&-tc@dH(#B-Ur=O(&(tmw@L0VWFBd3~eLtqyDK) zzRCCGwHtBME>m-?0nc8RBk7`kegc}BniACRUt0G$0qMiCR_L@=|76~u0_$<Ms9Q#H zTRF0(^;m0#3lZ$Oa!j|q^oBLlt-B{Dor+TC6~&>~*%jY)nC@T&J3FG?+<%JyuLY=S z7fR`TUN<9JIsf=sy2WLv$}yj{-|*`;w3M#E>x}@_F;mq30g&D2d*;1gae2zQKA7eA zVtI!cN(6|s4BRBz5(HoX&Maj8g}e*?*rTm(M&tdcJoIF>E$w1^07y_8^G^Chi`f0O zQVQ$bkK5irx<<(V;z2CMiUaf+@WUS<V0nZ`|2xtHRdT_Se@Gfqm_OxR@mtQpCSmw? zmb>c59mw2ZIZ8uKosoUYtB}p}0}6$5>CWaQqWel=FvjYI_JK-V(;QY@dSFM2x6d|> z^5So@npp!U<v^e+Cief%-~WPb!TqrJVw9s&Kw2G3spySYyNnF<!2*|i#c7qUv!pJ} z;ywhGDhiE6z)RJE(f{ezVs9kF+|sh%dE0Ude%%=N;T$}Xsba0@MtVgRmq}3`f3meu zEoqncMnqsnwAbrE<v|!azAa`OBUUz<_c=<Sb3MGN9&hLjZ2kr+G{a1H>QN-8pmM(W z)PB3S+<sFNSP$AooC^>LRT4j?E_>444{fd?(H!t_b$Z#?`1~4FRsSwlO8(5~1y9g{ zC^$UM`fDOkxm!i`*P4v&FP=56<A9CX>Th?TY>Ka_80Ng^l3F8~2<&*q9sl&$DR@Qn z<cf5VnBk*z%uEodl^5{xa1iXN^U~vT`t%|`qjNHv>8Xl6dCUO_*aS#ewAz9%{}C{9 z@f+2|_ZFFBCMDtr?9xU>N7K^LneJXf1nxJ)OEu&Y6BB<uowng~SgWMJ>kExySNt!? zmr;v<F^A7}h#IEI-}jEgx1ex~ZI4NBXzs)}$Pn!k$4~e0$a&snz%c1OKm!-i^cgyh zRvG1?0iDn5XC<CzYbDpYpy->BnSxh7wxE8+I$SJ=wi7O`YQ4TGYI&J6PjwNmU-%!w ze0VDl;$X@~o-$q-)*%#kU;d#wQc;xg%kpZQDIJlJy_+~lV9>0Z0a2I$Huqy^HU0MZ zME?q}`?@#rs=1I)u@Vwem-k7^NeQ!&<0bwhsg8LC0*-_^;cL;iL_QfLC83##Fhon| z)YS0v+gCgous`JCjK+$5&nWrZ*xvzI<9)jWkSHu05#OCZ-HdzMhz?Nuk_9RgoF(v_ zv$M}<9W4)cGi9THxL8=wAZoIju^-!dB8PW{O6VY6ulP<(ZEhz@b_N2}5Nf;iW=^~) z!AX(|mBGlb_z_?6Yx%P^X7$R->$aSDfTQXD9(HRR>tL|~O*1708yEL-cR%mEzjJM8 zR@=Dm+t;r^J_j5MfrN+0tt2-tfixm>o2gSn+|*L6{)59I0SF|1cs*wQ`9FPz&jVS& zUAQ!Ge3oh;vP~x{wbCCN0D;KhSsPg)$rSWZpz)O^EL1QkSWElHyN*CUX-LA(O`!OI z<G0Zbdg9K&Zta#k|AqIeOn`8#G8SUfk6+Mk=*y<PPh4QwzxJvfM`Mx2gwb@Y-<T;& z;rC-bsvt%8u<7p#Wqf8w0`b#726llt>g3g9b#M(Q6+<+;kQydZG41^1cuGUhm+AS& zo&whY1A$Ih@}YF3C1+1sHAT%ExyJ;p4iBzh5I0eWzl&U0fc?F@<1`v_e6U!71_&lQ zw1U;hx6cCoKZH+5suf7kq+tOixd16M^lv2JasAIp>KSq^ATIa0IYPl?On(BdV^h>6 zUuK);YHt%bZRaMMY_-doxPE^4hqM3twXjZVET6n5o%2fG!){q_+{nMQX-Qd^TCzeF zNSTU^jw-$4s;FBa`cayJ%_AcPyhSU*Mlk;kC+Ld>cSC1R5C2)axR}@nv;LTZz_(W* z?ml0u#UDb@p)`F!Mx1#y!a!?z>dCOsv@g<N7;I&}I>m2!UeftYT&1KfZIR}+vbT1H zqKeI18%V0FyC@-*s~53QI&V5*Tjn4(v%I1E$Z|Al(f$0<kKLC`TOq@!WB@@=oJs~$ zC=b4*3NB4hLwd}<2JVwYYvNAsyo$aL!jNjr^8V&T*f`x<3%xZ5XE7`QDZ4=6Ql#P) z3IqzurPO&UHNQ)A-#*MFL-*^xyas9Ej`dPRe9&ux%j$Wb*n3b>L*Ay2Yvgxp;}TC~ zy8kz=j7~^ouWNZC-Bd63ZqB}@`1(A4$Ke6T_5p*a2@+8lGnUiF>UHlF7LO;ZU?B3+ zQ#ucK^^?6bLo#nz`m6bK4)7Ll-T5pun!Y~^yyWfsC@rg?P-s<S6w~2Dl*4a@MT#|A zla2e5TpRcn&~HpgdkVw^VR)`^W`Lq$L@QC*1%U0yZDg=_|7Mmrd;H~(mT}#uua;0R z%fOe<^0<NHIZ3D8mY&(oMLN@k`2^9iQRRA2C94P(iGAkPgB1uNR&{42SUTS6`usf( zi_zcxyudiUD$AKtRb*nmWI)})t|h^{K2ffTQ22c(?HA};2Uy<Bn-)WNE4b=SZ!9ah zo-PJ1+=LnFcqM(VgwIUA5&#ndHPU%M<=?4B3}oO$tYkLVB|-<g539fT2G_;}4OV71 z@4izwY3Z!^+!Rk#ghrcd*ub0)$xG1%!gcRCAn!m;(fVb#RamY44j!?YB_B8{D6sgF z7LN5AF@}CYn+8A2?Z~0XHKAsRx&N*6<Yn{{WUkz8C0e~i(T>j<T)4o>Ty~a;izjF1 z3#$JILX@XJ_i6{8(N1j3+Gg8>>jUVK1JyBG$$sd4J^Xq!FF6wA@%j@EmF!=wgm4H& z-b$5gttL^Qng{I932S#`0)cEoht?FRlA((2%mFY*N8l9T3~Nt%4&5#RTHR^X5DhCM zUCP{);N2=ba`%agTC!(4lPyl2cb^!bBn<Dirr_dA<qu%bc>m&)l$tnFll}q?;Q>S% z8M=#%>HJyk?ckV7Fv1K+&jh>G7}05lOW?U<idq24E#r^JD=(h`WIjuCm-`9PxX(LS zSQZYGO~=terWA?`MAi8%hc0d66l`T>hd?AfyVt$ujFxtT{c${Wp*h9-YM=7mym6o) zrBn<VKYyE|cQ!yVYnA=iE0iL)wT0#NBAoYATgC5EeBjVeMa;DDdcP!>nw}3%6kSFs z!sa60^A;W+WLthXQ+Bg;cEdz_bMhG%>$GEE$j;$_^L%dmPyha>8f=fbR5E~MuW)l; z)BL<wM6^Rse327|ndQwpSKqVqCJ=u4Oq{&;VvsgZ6wS(vR5K7dY!t0fAXdd$sB!#v zaPUQlC2mR1&w)Q&TZx*fic&q`O{BrOa)DM|<(`w74>MS4IN=%74wauKDMSD4SF}8H zN48b2PokMLms!Oib<<fa)g4~&9C{>_s*1%Z9!q`^`1UNYPYfjw3vPZf?#jrdD_|G| z^r^7bv;Fd$P~mewjnS*>FPi^WP3h;L$5H>STP$vm#AM>&oPq-)rwG#0W~*;=n)gR@ zfgWI>o-B_RE*f9{ZBPcBYPvam?7MepQw{3UiJ05VOy<N|l{y$dE#+i)Z|034j-9Wi zoJ)Mf!xQDECDXF1su(aVZA59(h$PwL|J7L=If}=2X`1z4j_Etr2b_T5P_1)R+7)Pk zv0yr5>)g7ca}*V1hiWxZftn55ZOz8+wIBnBMjF}FoH~_g%2la9YMkd2mAqqK-F_+O zbA2FcX=$02jwRIrC!J$Dv{BHb45IZHB1J8^nu)d0aBIAtYa_)V&3hLlqULu^H;tU5 zEQ1+?CloVEIG>lBAozZ$*@zS&_?KXAG{`K2{YgKSQU725dO(Pnzu(#78Bz^)Dji3! zg(1fIYvnF*((T<Nuei4=sTOzPtw%bTy@oVx(T29+swX^Q?Mmm8^K}T@yf{kXF21i> z{xN$Z0pZN&l=|4yVAO)8uZRz962^Z5F)+AUI&X!-ibuCU^h!zoOvEFs2ih+{eC`T` zzbc~=FX{b+NQv3m9_IDWYF+wVgkBC{P%8sSTN+Yl*05M5sKa*Is!|>nDxyp2ct`3C zqia+4x14o><zV3#)s~vC)9kF-;ba51&EX+XN}vEoEES9zE9WjoQ17@mVz$%EKS4M; zx)^|6ND5)BjiiPYCnaZ&ZB+ED>bb=Pt%&>a+)xK_KcJeLZs7^p(W;-mFafS+T*=%r zYTz7&KRi6tVbnq;SsAB{e=(lW;jjSFF){U>-GNm=PTo+mY*Mo_HQJypw0D%!hNIfk zC3QgMR3W8ar=BK64G5NxWFxEtRvLXfjd>kso*dDFC!d}&ZoEmt7`Ks;{_P7DP2I8A z4qu(N07|*gY?Gd_sVZCT#H1va1>VW@Ua(b-5D~A|^s~_Z-L@NF9Y2wdt*z21;Be<V zT*Q6TwW1|w<*HZ2`zL}Y+1>U2WpGS@HN0Z@|7bd^pgNi@3I|Al;2PXrg1ZI}?(S{} zcMtCF9^5^+g&+racXxN^&i`<$sN$7jdb)S-z1Fw(geenAYUq@B6v-JV*sE-r7zs&T zN@j)tK(a9SozpPl!a1Nfw0nuElA#_-N|%^QN3|AR#F+<>?*k{}!p?wcMbFtEGD(43 z#WEA*oPbWSMhxf`Qu@fSY0M{NH;b9vxg8D|7z0C>>letmhJ>II!~O%8`is!!tECZ- zw~Y^ya+;walsFzKU{`TXOdQ!Gr|L6cIp$K+iRrhZqU8xWv1<z!czeFu@RK(^NU2ez zb|H5qh*+@fIdDmA-_!1p1Mqo)EvIvjK6<y%=mbg$N2{%@=}Xxyph<)6?d_@ZWKnVK zDQosp)nVmjkl%8Ba6kOP%|<Jp2q7a^N9^q=eNsNr71wH$L%1Y)2{|k1kqPN+ZD=Bs z^ZM=}m&yDbe|l!d<N2uMFg?*}>i%;sLVth%?TO$oOQMgOacTHJtvD`Qmg%Y$Y7W5I z4%%_G$9T9kRIQ+RzzF``h9$lADP`r+b0F2ckwptgB+x<x5_umFVNd0-lIOnBbHI!j zhoCD^WAqJBpx|Ns{@`=mMWMiC2jy^Nw=80_@VXXCOyHA_?mG?Fd9kD+v>9Nk0>mDV z`y<q8yYmmHOYprkS~U;Zk!$PV#2VOtO&fUW0#^qmM>BSxfV?p*0wE(E=ge*Vq#+Yg z35nd<Ia_aeVCpET)bOCW0YjxHI)~}!^=vszSJCRctxH8n6`Q&LY&9E#{U_dkrm%`7 z_we?;2T=kD_T&WT-?um{TiNqg{Y)UL;tsbh$o;FREaS3e3+MJd|M)PLd^d`Ma))Jg zJY?dktrB1Bh55X^_jS*1B4M4mK{NK+J*1u)f#<vC(Gal4X{t*9Z8^v1#1B;{Zx}r^ zoprn(XM&!etnpK%L={7X^T^rx;f=i!930kKyf0CB+>XSJlvuQ?psU2i3WvhvD#Q!a zvhSDO-}_U;qr%B5ymB{<iMsBwzD;Dvh2A1mci#|J<N6s7dWk|LIif}@iITwg3AOFr z7HZ4M+jhJ$G}*nytLJ)UtN;gi)F?tVE_cF;UH4o59;*Q1HwK+SvRJ<1-1l3*+rufk z7FXGU%YfRB4!*X7Ti9=%SvB9~mSl3AchjsNH#^-*OG~+^`q}TCe?ez|tC_%}MksGo zvUb^YZoPc=HeC7P=?VQQyWP2@tu5kuSc(Jmo<55-WMb|rTGhssWDkfJ;ac%y!I40F zsGQmO1Rvrnz@=W>`g?L^)G%NB22NH<`Ubt2DCfFG_3`X>RL;B;H)KLSAok_vhYcdt z%HIs-iR#MAzZPtOvph4%5D}RAOt?9O32M`S6L{PRz0G{YmpTh~niR0R$ukcwCc)S0 zu%pmS{U}aXs6xx;hE4{D^(tvf{6fN2<^z7Fj-a^O&i(K;Zb<suQ-8BiprubkHPYm) zHhz%N2t<HCZjflo$_y7`*zkIVYp7NcMB__g$xtczky10YBBPD_f!6C%V)KS?B3URh zsU#p=Qz%n$KAR^f(g8B7pqs&g<o;>}!X&8$w*J%?Dc`jp4VR4c+}+GJy}qKYEHE1H zJvg;q1zTdAEe~4Df5fk+>Ili`K<0m<4Gt4WWl9*cg|=c()e#7@ORYB97`N$ot64~6 zzOgR$yZQovL=Vm-69<QfpH;C(fcFK&Edl&cAv6~u6v&`G*;<1h$N|}wyea?PR}JX` zJ*;Ix$h0w3=cDE5qnVN$U_zNab3tZj!u94WD3^*?G9v3zg;_EZIC3^{a`&Zgx+vtr zngfO!D%(~NCYF#)fG6N^5WZlbzjQ%KQ5BEvTJ`=H6+mCU^5h5JS^W-J6)<E2PzU3I zXu-NV@0V=1qKaz5Q1PmK5hG9o`l*r7%$QsPxmuNmIPg(RUZkPkKO>b{>d<??qt|rC z0Czib=kDXe8k?A`-^?8hczUVHVTI>leQ!9-=P<5QcFY$1l+Ehj3V2~-I1*buvhMsy zh0AD2)i0lO!9#!jQ?Fk~YS=GmjvEUp`g2idBB&z{*{qy#+5a=JPs5>%-kz>C$KZ&` z$`s=0>S{DLGGDa!i;99BmJadazM`?@CSwtGr*3uo<;)U7NuDvs$=(R;oTcV$CpQZs zc_vVGPywG-+}Fthb;k9VTc?OfxOCnVJTsrWFRbRH2GeV9tVh-D42P>q(pNL`f~e@| zB6@m+j;&dSWa7|B=(J)Q6`A0Zz0ID$!Xh`&AF3>(k{<<X07gROI^`1-BT?UQa>aOS z9jHz3_=OW_L;)>7hGv-9h0v9qo}H`h8}>pgpl-r-*;LSEjCUdVQDe=NLRO7CCXqWP zo<M%e0l&goQ&`@CU9%t(tLM}5lJjyn)$ni?z1R65NW8}Wq!;D+UGj<<3q-WHgdp<T zaYvPqp!_eYNCnJEr}LTi_P>W1nb5|$nrsI0l0GD(OikC-RGz8xXP&cm?Md_5#UT8> zO*(s4yRUVf6$u7$Zp<-op+Y%*B!O$<>FSl!jb4(Jq_~w)Md<)oG=urrW$_egmC){Q znAM#5_XMLljkNnAu#V4&9n==*)CAT=cQgZ!e~$VZ1_C2;=BwYR&yi3R?vmsHhKZ2@ zwU4hw7G;F|&)qITzP>`Q;#%jchmQAHEI`Bsok%IW-4>316qgaBpCD%ywt_Zaqdy_b zxz=~Ce?Qs$K|xLdGq{~`PXjbg9d9Cm)ak-v7X+M%n_%jOaO3_wG~KJKuQDIEWZnWB zUlO4(#F!^zrU&*zmP)B=s&iFqIBSnWmy|$CDfadg9H&iMfI2?0gl`b=4#cYAQGez= zXRtpZNSrK9E~Ef|93z+#-x4b+>GZ|-hW^WO^5UDFpZ%@!$A;Y#s4Qmuykbs;+zQyU zwc7nBP6W1YnucGAkNysIdZ1R(KsS!V!nS~t7in+8PbXoD7$Aj`(36*8jCH<!i=;Sh zMlmI|9J;Ea{ZgVt8-Ndn?!2!o#us>bg|{lFZ8f|m8~psW_3)tKVclf0Q+{Dg2qIfc z&Z>lA(MC;;QQuLA%;R>_SFKuOd_ucv^A4tC<g)e?wThK^bmrjbMe0p+s=oQas2#S` zoyPm~!@<+uPiEVTe&s(Yxw-N{7g&EHtEaRA%q~ir@zV)2Rn?KL`%{$~p0J*uK;BG< zI<vXkG1~8oKP#3JBMYs?sH`)4fg$xfC3A~5jlc$z?e}^kYuj}<{yUGax=!bhQTAs8 zjzh+B(v%r~X3X6KMODqED9(cXwl+9Ps}&i6SiyV0#Wl!ubs3($2Yg0z&Di?h%&_Ch zm!ujhSm8MP&fCAsKf=g)I=4QjEk*-vBnS-v_Zk-bQ#J}-rKwTz_2BGd@?g5BPgEj5 z<;neF&K!_7LuNC!qg83esF6u9pdU_FF~TKh=&p!#S~rgj9q&b^dEb1l#$%7FIq;i! z>uwG1{<wnJH45~<mEOGapMgO_Zt?j&mx;seN;-4!eJclsXs12cDcyObkzTjsFh4$L zrPdH?&B+r5lc4vnbPa6v$$(Swyiq}IVL)Srdcs=k$(Nfo7hIP#>l4S;xYu{$3N>D> z5DO=fVD}FQsPORUod;xrVd<JK$r^#Jw@Skl`}KUx1f?=jlwkDXRGrf}@~?o?(f`e> zH;0Z-?H4hujaIPt!Faa!``&>w!Of#3jXm3#Cdc>**LPDctH|(U`!?YQ$e(EA%V?jB zc=XV&L7)Lsz)JOZq#E|>mC;!^3f*w2-gK8}Y;UVXUzp;?uvz8m?#}~`z@DTtE;pQq zMM(__DQ?LO>MeOJ{wkR4;Uh(oQ_kRl(W`Yk<)vjm+|O}k<74c!#vEuTn;Jsb)6CU@ zsq!Mj_Vzaf245Odu3xBfcZRxO(}xl-@`{U#$0THd9`Vq`#6kI#aUh}bPHo%5$=+cd z8nCyeENcPRPsbi_KY(r1k=~^PFa>(|Y@3~{ehtDJGbPV|BuJN4Qm0mTAI)E`+dzIk zCFvgcS5!gXDPTZ62K`pU^196R2NM-1xL*nHel<tmm2<^<F$KtQeNFyDXdE`uaq1j{ zV)(G8Ay!EGAR(Hb&{8Qa|MCJ9&Z4a>?iseAAXAsNwAQhpz7<-5Cudy6x+~}7dGutR z&CJ;K{DWGDK5`d}CVTqM2~+%$39wn&mOdjt_^u$d?k2S}s_SBc?|BJs;BAY>gw#Y= zAY!(<bE(!>qyd`69_4fUihSc50F&rFzeh(UnAlWYV7VKi(CCERq0(6>20skOlj%70 zV}ds7vi(!p!w5L<X=9UBHtpL22IfpSLZfG%g4(_k<n}8?QV#<yo3oT^%-<^1!ot^` zFZb3Q*O-<ZliUR&fpvh?MyVE4_}AiLnEu_5a#dPV(t->`k<`>=NE`JD$Mr0aO3mh& z(Y%N3`4?|J#=J3ANMFC+e~s!`Xz8m^t=qRQSZ}^WjTA5e;!1hb(=9Z7Z97HyOB+n< z?;PG5b<6nPA8T%_d`AK@THG<mXl6cFG&>)U*AB?GOK;E(kL^z~`1}D2`j5Q2Fwy&U z6Dh1$TP5L9v0z636?oUo#O;DmCT!U;T**{*INYIULZ@Jj5)dV<C}r_Yvs<_6!M%-* z=iC1N{xm-oOy-!7nOezamzo{DjVp{PrfSbZYH~_k)+))Vy}N+nY-s9Oi%xZ<-r$xF zDaSDWsu{En+A$Y!v*mI9`P(>Dbe7gsguQagB!9g^r6LK7jr*DVYvABs>0G&4h2Tl& znCVDLW9v(KW#ulT{988Aqb|{zoiU*A?G;oi2-Z&T&JG$E89(%rOdyi5VTN-d{tN^r zT)yzRpSWANph|+?Jgmufj=={vxpBhh!a*CzM85Z!0DXrBnJ-L=;qtuuU9u(~eM%w- z%{&Y;%;+!gso=TVHfx)L1AVHYa?~vzd*1ovCjtFHEay$|ToTqE>sIj!E&=`Dy}KRz zm#fD@6lIi>MARxwZnJpmM)*ha#U@)COPqAzA9TLb9E(JtRMyC`tG~wrpssKw69(z% z5e*Bu)#Bt`6PZq*1Y#^R!hBLOuy*b|THU2;#{~gYuU0fPPz!=be_YhbP@<t*QVMXe z6uK+u9au?qXJ5B(1}d5vXO4p#fq-HhOG_N@W_#O3r;$_!ag-pA^aTKwZKtHBI8>{> zF8CI`zM%6+RqL!f50}+gRHC{%GkbQ`N-&6V{F}3A8ux1c^YFo!^sIn?9dWT$jmu#c z#vU%I@<z{8AI77PCt(p0|EwCB{O%X{o>igT>ZqZ$eiXKSLxGsYiFWREX3A&cdTh~$ zL&iMU?u-+7gF(Z=j9y^ey8fA@u5vYg!f3ylnvFo<gUBfd0R71U2dE@8gyJuasvlK& z+w7Oy<{$f<ZmaA2{3BhdIuXp}TR$u&t!Zd!w}09a!s(VC5agy|JAcD1-hH~KKk55? z+$BL=FA`P>Y{t-v7~!!ooAx<@>pss8E71#5fF=z6w$0w0*`1z<`}o+Pl=PTB?yiY_ z(1cVg8_Aq?nAEh00yf|mFqo=Ow_1Y7Y@B27_~;2OL~Ow+y1(_?xjfzo5z|(!h5EI7 zuAY-ul@#|X;JxlCh7M7r6-xa1d1y97Lq`t$r7=DGD?Pg^K2J;RhQK9L!e>^&kD$XO z=X^9?Vst1INI1=Gb(+ubHF1GD-<UG=^oduGZ$j~;q{V0iM<0neR|URC&PXJWh0g8m zM8>|4)CX@Ejh~Kn>w8D!Hrw<bC88E!27IRsfGsoQYVm=xR<GK8KA~(nx~ovD2#<)N zs*nF$BVJ@Of4VgKYNnR9LQNdh82$K$Hh!ZaQ=l-Y$gvfW{OWs(mA5?gBwDzHBGZhB z%NMneU^=NmNlAf@jyK7mLYIt%5W3;Po{|qM{ENPYdDWIPf&9x2wA22mCF{d&301C8 zaWrYw#+|v@q+A?b83Pb~LgXS|Np&Z#k?=}l#R&NEi@vhOSw}fMdJ6ytMZiR^^_Q3V zzo(k|Gj4x>KqGV@H0o@hObD3u@y8a#&EfQkLl6kTzE;@1m2xJ49Y!^o&%OinOP|n~ zp7Z;iRC02I`9H{q{O7g|nb&Xu)Cpb&jBwoK?2d(nZE+XZ6p@3&qvSwx<5;zB&4Tnq z4!;ANrN2YVDnS0d2U>jg6UVcyOG0Dcsd;JwzDCa&-WmS8&oVvnN`2;OZQ4!RaiWU+ z#P7)wG#&+Q^Kv+c_#5b*o**LfS8Lvh3~mGmi`i`Z4i67MURTHuwi%((uBBtzWtW2M zw-414<oy|HxF3B4K*<s(9WHj+d9WIY$>X14v5i<E!lx6U&$#XIcK3CgKsd;JuhdrD zmHKZ`U%q^~#pa{6AgAai^3&BDK0wC)8H*LuEci@e@AW!6tD(vLCMeVL)|^IW97hh( ztlxK@oS3qfy<9K+?PJGwG=3@yk29uv>UTMr|JBdU#NSQDAubiZTs6*CRsIPHXrpGV zU6g@ps>WhvQ+4JK)wK_4GGh{2R#mR$R#p=$ootj;rN`*|$p6;@F#a7K<Dc#lYGxUA z3D);{z5|=EuzT^K0gS3`bhJR^S!tC<vPqulKgadu<)pI(R%9L{FU7A&P9PphbBjqx z@iC`Wa3=#@9l=ZPl1nEcpB#L`>}DsNiy>;d4yp+hnkWw4!u#yth@F>bK6~T0YC^y7 z0iT?@(uYcUFC_BdKw*uTMWa3^U)G=BqTM_E<E)+H&AwhfljAcGskLK;j(}s~i+BEL zw(Re>J3N^zdb8*V;P^^z4*B`~yQE_<Jsl(&)%+7RPB40i_eCbl#XM$?PF+D+wZCye zZ)JbM7Cc&c2}dAF`n{7ZS#_%{@l+0cRG0L-wvcr6GKY6U39EAcRDp`P)@Oxdd8&<R zPLY_Bq67tXsiQm+ANGh5Z5jMMtgo-Hc5T=Yc?=6cc5MfA#{yD;tKMNEZ2J?u60sjB zX0tK9@OTF6s9_guj|ep<{d%e>Nn#b8Q9Y97vzs?<ilxzEY#^=Zx!n~=wQ9ZIH)MXa zSFiO`JNL~syZBE-$QvEc7?}rt{wsUCmrc=y5BS*oVxFD8t9pV0-55p)F(3_@ZaQ(4 z+$pH$?sswoT<*d`u%qUIB-?)7y(BT#-yIk?0{(R`JK4PyZ9D6mfGGzDhes*e(z;;0 z{^1BXll-tXTZxLfdgGS~Y=i-`ezXAV^`rcb`iz#tK__2E+(x(}VgHpgp)wVcFjBGL z;IqsdO>Fa4ofx39i|7%_^ofQI5}^5$IpWzj&>xB!&sK#t&hLm_GUFn&0WLrm6qg#O z-ezI6nR1Cy4_5cx1+&s(TY-Y!1d!p9i^uKIgsD4CTt2Y&q=Ljr2fH{@+C8?z!ACQK z#OTRxY^iv*UD5pTf>aMB?57`=1eyD?=BGg?Qx-0jkB^9a4Ca%OeD&s7BgLI#?^SqL zPq+w0`e=`)YmQ9}xg%BGAFOEpQd$MH3bhSB{W5w!`(GpA97T}&2#IFhfB*X;#|T>M zNC%vo=b#<c+PkSbE$tgICITgZz}X1WXy@51dh1BO_%_Oa#18-8C~X26=ZBA7sZtp^ zC1r{(uiGEHadQaN;$Ln{_;b3G8XVQw=qu5tWDBbp!cqp!D`nJn3XnkW)19AizEaz- zXI;eCR{)R0hP=p4TErR+e8Sg|LPS{vPWz_2cHoLaKoAL_Z?eDjiRYO5{8YR4Dx+t# zd=$4S#dW<qo?EPJGJp^YMY803S?-pUm)z=Kso9-d2~9}K`j?yY1jD)RizUdA(Lb&l zS;yM}(r-*_riwMVmqxDJ?o|&EpWaE_x*lG79pg1QxGggO7zvyF;rY2x{BH`owEMGs zY=cq1R5j5Iim!V3@5Df13u^3)`>BtXt!KQjs3_3Q$^5}hFy=!LC;~Me1M^EqL*=Pl zrB)q6>_H!iPb?TO&W<;B0FC&2r*V57pL8iB=xnvsy1_%b&N8OHirphu7Kr}p6IbGz zQ%ycyZsoW5!Fp0YGheCeCgke}+?r)M*JZr#F-42+ff3&;6?L)0675t5y0%Fu-A!|R z^0&buHq%e#4=jzSL)Zu*9G3JhJOn^WnED#!IZTJI`=Px2)m(sS$170uUY{9}ZYQMK zg8?P~X6VF*(OxJc^I09<;OKdj3<DS?@z(<5_WjW1vzQd}h0#UZMaxq)jkBD>Ob-GN z#bVVr!uK@{@%1;RP6>T*o$(jqF9Ho+ZVm4mr_NlOuWOLigsji`8qMtAR=#?nN<`y; zkw;Q5V-G$C%9BURDl0etzVlOc+FE+ByMkM((mC<&gpg)>L_&ZZ-et~%hEJUw3aEH^ zSg~5@<2mHRnLlZ0mf^hvN~@|MB>(Mvz10FFT}q0Igx<cli&y?)Dq0Z}Zd<{h4<>RZ z&iUJqxGtN%>C?s4AZ+{^js-yybDOJ-AW^D*p%&Hs5ll{+7hb3G2@<#sBAu?RZ3_L# zV*+h-`AAAi?iX8En~m(t`sYY?69HvJi9jmr^>h2A7?twLWqiU?u%U7F-llwohTsi9 zrQj`<-s42cV}~AT0`Jz<5OB~4{nFj=30uPNS#w(tE1pt%-wk}Q_j*I<eo;hvZ^`ga z)%72NVPKq{57w_Z(Sr3`Z6Pce5=~{$Wr%RG<_#BWH~R++lUWc#*J7x{oX@ADi8!ly zgV{F^4(k$}e1F1Qh(liwPBAkBch`Ke$Yst$wGg!mq~axUeIMD!i^)G0B2RRb@^(Oa zeB{CjBIWEtm7bWai%adqf6ZcGeQt;DNte}WFqU4NJGMTqz%!z(TqS(-N`{!IfAWrQ z<ikoA4%Q-a*^epO1s}LN_F)B5D~Di`%pK4JyO36NldNaTCw-qM3iTN5ae@W;%~<4B za93dK;u^5a(kRr<z{+>N6WaOR5nPPw^zDXz49jP7kcN?R7hHUTn3cN3xY#UdC31R5 zdSQ|XYJ&2)eQ!r-+aruXIx~IAFh#&)|7N$g^pEiitpU_qCfbHKcXWk#Oozq1O?1C2 z8l(P1;l?`nhOu)1-Oo2;i%h)MV+XoVIjme0<T_k2?(?NX4==3gwtIK_$GA&x$US0P zG6{PB?=WvQ{#<)w<0Ds2qf(SdRk~=l{vN0o{~wB<{zmLYPFXc#BZ%+9eUU0k$RiV1 zQgM&U-=2m)ZU?HM%z)QkXB=0*3LSYKISNq!RFz?ZRtdbd2Lo{)I~Cv>7Z%>|_rQr0 znZe$nVYJR_0BPUQFfhb`34MZ=8q5u=%JyRu?Y1wFWz9CKZCcjy#Eit1KSNbx%W0{p zp9<jMti7P)pigX>&M?8U_hoFJ91#7eQUfH-u|eV(`=gW>77V=?-f^m|0>TXHOjjwq z8Tbl+&#xPd7xc_zKayT9G948wHM=*6RM5CF-8%`JY~I3wQ+2C8_n*IdKtO)IQ}t_} zRUboAT-;!>Y$mW?8n%ebpmtWjm%u;=3R!J$MMi^)Pz<UqVLs`$yNakaI}mYu!&dbF z>wH*`T(gDG;Zstci6alk6nwQ8@_CRKe2*%W3k?5xzRojn&6P5wsQXjYXhhVh3ezKu z<x5B!f=U~8hP46OXVj9S(|i=l^Qi(DBA-W+nvQ!)+xFmYLAG!hTikwR_^#qVhZ?^j z=NU<1H&cL2+xq&3G!8eKWL`CewpZf_<kQW|@m%-wJ@xRI@UN}!@bVwYzUq1+nu@5_ zX790?7ahEXZlgPir4H_OE#CAQtbrpi$Q0kdpXF;be5-g%YE_QiC*0~c&oNr4)&&5| zX5P$*U>b!X4?ex?$nmqSMH7p|W_*@YU<R}J1Hks4S?C@fU#Cb8(WJ@bCD`Oo9H3jB z;GV3s{dTY}5D8TonBAi|n8=Qnp)3HX89+_0G&2p+Vl>F~$@OAAc*V((ZD=B!H`N7i zA;H)3q!EJ6oW5#L;?hI+us};ZT20&WQ{zCGPLT-KT%KmCB8ur_Cqq<pVaf8f4CZI- z*={U--*+6=?u?;EWANoGdiQ}Fr(QqRhi@>MS5twr`b-b`Br_zB_}?O*HWurx2bpxf zaOb>`k{loZ6<=1Gz7x&sw+H;i=2Y8Ws`}#*x62lMnHKK2hWn?YPv(_tkt2B6J5Q_v zdoe4vofh+zV_Su#mm1hNYRdHb^<iMbwp`gv&aYEnE&uKKJ%wHZTq8KYx0wPJb=B-! zCqU0zR?Y8LhE*jV-Bf*8XnrB^_~zU7d|Yua+m@UMQfZj6`(e>1^Ep5#{4BXP55*L+ zS6rumYL(2p+ko&}q*xk@X#}xkLR?xB!mlNKAyE@@ZNF7-Ijo8B%WFYBA)<6)8P9ID z4yzW33Yzs$>O}NZ7qQ6d)A}Tmx$vLXqv0gD>4@FI2<b9}Xw{W9D4>QL>Cef+#B^lI zf&%xjfCccsSa#!webrUJURc|1SBwq0kGO=_z(G8*Vlq-P9CmM5<oB!aO=I7$Is(9a zo(dR-noid4S3KbGZb3imI&!-<=hAxpIBb2Vzh2{<xoXjk!t=TlGo|OW)c|jaz{Kug zwxtW48SD8xc~pL@m@M+rhejllFs;fiyYL++B7BOx1c&;$DFx!hJ<)QPbf#Xp;PwK| zPr%T*<hMx-EG@Pav6Iyz?Up(|HIz7k1iEE9LlOB8$m}*}!(+UfO-F7KSF^w=?AMP{ z<{d7310uDRCv~Vt+bv<&i={cM*5S>406||?P>ii>0teUFWt!JeABb%PWy94LX5yW5 znUyG0{CBVPt71sYqG!O%{n3~m)mqPM>&7);6=d?9RqeQY7Hl=^Q#fxs^5n47h#lF3 z<Lz~SgD`@qA>wg4lT(qQuX%f?L_<q--(FHLEl2mV)e^nE(yp-|`Q8j<N-$<H|5?UY zNlFDKH!G(%${UYVL_U{DxK(;T<wo)+C`5qL?I#*O9j)ojylxc!2j12mR_@nZm0W`e z?rdAQ$dQSqPO&tE9@4_mO1aS-{tBN&TN`A(3M90fLg$}|oGCy{zgDqK^{ikH7Opjm zBC^YPW&XRNG$lv15S86O7f#4HefxLI(shpqWd!D<@3wnfn8un8&LcRH{G46YoyFK9 zG7_Jn95hK(+<F2dWkQI<g!Y1;dq?{tgaV<jZk6Th?0X>3TXtOG;ICT@S1qcEoG3ng zZV)-Dwec>KUj1F;JnbAFODmqNw%`P^8-kF{z6;qzz@vIsg9lWl%c{yZdtlDHEe1vp zZno~87aN^;d3+8bs)0+Rhm)DZ?xwF$$qc;1R|0IF>t%x?7v)=AE-ClxtI#rPI>9_R zWlJ%3_5<pC^2BiLV@IprnvRJ2X{Gy%jg2nFX3||2oa;6y$%E=Ok-@K`#O_))srzt5 zEk%)C*5f-#&$l+jh_T_(WC8;IL~8WBjItwl8l9ei5R;+cBn(FDZ8-r$3-P30ZL>b5 zKm||RSvPhhWa31~CJZU6RcfPhG<CuheBgpkKyXvRlydh|MrPMeUT`eSuG@5dwN;1H zft0mGey0iO&yO_jJU&-2a<%v|3Umkc?vyN_Q}9q^+Cqh(WvAhy@jXaGGUOt}>hG>h z2yVtp5K;&TyyxT4W%h=XOKN<dXR;YKmBwPeyHj6mcVpZy)qqCA2^RJ+Ixy&K;SHi9 z@`FXaa1eR-w+9_@@6c3Jy%M@>65n0jah|Q4S{L}91Eg(W{R#7rEN55|v+1oM{Wswu z;0+OEh%k)20<KSGRb|{Y9wS(}eqVvl;A?hhQ&$~mTT_i_<x7I7j_b&Ea#1J;B--=g zEqb>CZ1&*gNxm6d=Gg7UM(#_ojNw+m7kZuAU%P$o?=Q>Jt6WyFereuRnH+CFEj78< z#kbVHUP?mB<s!7J$E+}3&kP_|>NbT9xox;8M#uLa0l~`ob0NbBgmi=EfT;V^;jMT` zbQ@vg^K2okL{z&-3ovXh#oYcX_@E)V)S3<>&JPO-944aT;&l!?1NYIuPC3IitnF$u zs2%a~JmEDRx22vBuqipVi9r$utT9o1jb<+bJ}-bQPkvVG>|n3`e4{%TF>^lNWyx-Q z`0nIO#>tke3fb^3wlS-gv#zzNfMe0OMiLGS%ziUr<Gb7%r82zWB9rc64@-{BBjD6k z-tbNghTp#dGIG%H3^y;3*ZVK*aQl~o^%XVUu@l8ZMySB&$van(LX0;JWfS%rZx6<7 zxQyivfC=Mty*2Qhn;+1{Ffta%cYpHtNj>k>Z15Ji>3&a(wobY1-Cn|9ZB7j6=*1x5 zjhH#=J97<I@zZzRL;QyxD-hJ{;9Va$eSMsmK=KC~=sq(+ayj??oUhjOkvd~I<8oo! z$32`XP`~_e%$Ab}?ANH2B3`kkX)rXur-E{S;59SOl9ia-t$W_EgYIw8L$cqWoK>v& z2|V?kT%%0UC#Fy88zW$>Yk0&(9pwTclIY@S{*mF|AOHK^tdATld|#1UFf}!WfX9&p zh@%{DEeNgWE4KpON{kwphR&z6;}<r>)N*?)oFU}aWCiJWHyKybn9uyM)--<p(9>gZ z_?qV&&hK^CqqLCtI5VIMv^2>jF|Y`~Y;LX-gykbBQubQJKuZeesTeScp%G;MP*I^z z=ZA*>@O?8q>H)t8sa4qRGhvm+oF&BLn)q{ThcO+|IJW(#qiyJZk6`S|=&`%Vne8%c zM#F7bG&M0bX2K?q>?aL-xqk;({<B&j8zql-5TM5jMsZu{HEZBt{VQc;v_s9n!1EnC ze*V95g~;diD~%6jR^!Aa=N0{klixp-#P#iy6hfWY<=Hq+<#Ly?ebVnm{wz<6i!C7w zw98AyxMb{&P;RRZypdSnx8INjemj+b-fv!aUY|J0o=)$mmO5=oh~91_fh@+aKpZw> z*Bxy{Qfl&4fjL*FF#t;M1PfC1nIV9h%r%T73PvVh6f$Oh5QL9y?Hz9UfV4Wpf*VSh zKQiSP??xcDqSf{O8d>Hb{N1uw)Ns77FqU-*n1q7X3(;XX02BFH<-S(IR*4hHya3}+ zf@E5IcOZY@i_w`}YUaNLM;`Kl##l9b)|A8)!kmWL;|yf=4fh+H(?<`wH_wBtnb(U{ zeedvoBa#Dz{#5z1MZ&fouJ1+E?8V>o0dciZndNMoeHLFK7>Dck?Wt}FJJp{XY$9Z< z#*D5`&*^4$d0);w!lsMW{?T;S$Nj*CqZzVLn2*c9Vjdd;xw-nTXC~L3-SC2-x%q_o z2af4yxx#G#AkKAC!(}A}z-gjJ&Pi#jh^#~q;&B2YZ>ALk!FtgPJ3s!T(_oxw_AED^ zd~xdYn%<>B4%!okkQ%OF!nq@<*Q!G7l#A>*C*G)#*Z(%28+v=MeHO%0)##f9_xW>S zTc4P-E?&apk;DazL`z{MAP)k%3gv-PdBp9K#<ahB*S+=XrJM1~%V{S(sPAXwi%~Z$ znWoBo#`CK{Oeuh?=2Z`Q>N`1qZ3+<}t22fj@**rbu8qlT$_W7e>fQQ#rqdx5JoK@_ zEs>|qHMcZDJ3=4`>RrsMW)D+UMNKUTa{~gT(@pvKQ98S><FL@~jLY&RctCV14{?&* zF@H8~Qmn`*;v$N<3%;$Tn*6RSr@A0_w{%wf@%TnQz)DnhVQ9+OJhk!%MzDbo;Adeh zDQ*f8lTK-pzgNT4XC_ZtFVX*fBLwO|o&T7`f<qsB3K1res8Whg%0k;#V{gVLQLw7y z#4fEY7ck#&7|UP>0!9O8yU-_=&Dm7(>yik>^X8jdT1qVZ44_#1OtSh^0;-NR28UYt zyVqj|0Cm-C{Q=hVJmxjqKnfA(7tP^-bxjo*CC})Rg~o|Zr<Fy43r(r}8p~@r5)*MN znXhT+?M7i^CeP-8uy1~0%onR<roV2xL7Tw3nl(ivL_d7@p}}${_AK!?J3*1Sm$$gM zYhc}KrxR~5817gYM*!&nGrPHb9R4f_Kn(Xf5>xT8o0*v^>o}gXT?n{;Kw((%JEW)P z@Eb3Qj!fIsP_h)6k8pA|6DaGbW$T%~z0Y>ERt~<ThlLG>1j=~9HW5TCs2cYi+$7F4 zs4qGJkxxe34O@MrxFY0QPH5aaIscL-)88sKb~f8$fsRkCF&o}HVyj<qE!Zu%)?mGP z%s00_0=L|X-h4tM0|Bsys;ICr*Ex)4v*LB@Tjj!5eYPpMkN<66ra)WNmxLkkzTs7= z-A-E@?$L=q#MogF)-yo`h+yhuahp4-uv2IMIL}&*aa$@?mzNt|B@{Uyx{PVQWfkWX zH8d5f&dON9yXG-dh1g1inSr&J5SQ{vw!ID{vD0c&r>v_gDQ@OExC1c0!uUT{PYV<1 zR7&s6l9qq+#JYzebyC@b4jxW*9!Y`O>M>Fn_yvZzZf;t_;<!<m?0m6-d=CIMOwOTJ zAmeZZ1j5`qv339UA^n4v6kV#Hn4rvr8=Y`?=N=Xnw!QvBv{}Wex7Q#KNwLR}8v6Qg zTL0}gMZd&MkyA-+ust6T4;v+p&hW4#Xd&a{M2i%fokVCnetf`YgXf@0$JB4y^w>5h z<~5aumVrHTd0D=JH;9OX=a5#ediELj%)$iYyBda+se)J2`{v!!{2{tpr-ifGEDt(y z-0}l-f>%_(TKWWIq<&G;u1e`Hd5+JsBrWZ~3IkmR<W_LR#4^7`8svBSw`Z7HW&p$` z{vv8o)%!E?o=6A<WoHK}Qx)(tO}y`@rZBwc9OORHVeXl#EG+xp1s1DNx46DG=4Cc- zY@BXeL^V{2ZvxGl%YxYOpW`H?Wh<J5!IQoIjjyoGmOk1|t;zU*ZL5A1#Uf-UjbWT& zEbJv5n@;`KB`G05tX;}>_YwG`WfNB_eEs5aR&*fuZYK1@I!v@678ZNdmlG|OA3L=( zqf=V1*OcFb?q`Yh21btiuD{tsP&qEVDW-WzNRP>EATZmx6G9QYKV6$4jIg07&6q6$ zBIx@D4-XBfyOa+YI$oDm_!u~WTwaO$)1~OK^>HLaj!@QY@7HcO`Ny1wwT3p6A++)e zx+A{ZbtfiB#89X1i9ilg)Zk*%Q%3gw7gSLk#j-bH0SS!WC9g_M2-U0@0#-cP{d*=5 zFK&kv`Jjbp{l(48QvDuAq~2$UXcEY58r)zh`TMvRCMuU+!;1Y>Q{}5x`7W5^XkRh+ z=ZRRDA!OWK)|*Hvhql!!-wmxsxMU@N07U3^(dFH2KseW!a{qM-4p1tQ%!L5y!io%u zWW*>$=;6e0<dhUQtI{=&PrvgzZdZY$XTuKoYW*+NWi)=zl(rtFtQ2{b$i!31=g>pE zcI@><{}ssnsPrwF5X_E|sphK)=D)M}or_+pj`^FpsRL_4P4ky90gAWndjqb=RMW2} z17RbhNmuI?kEj(?wiJKZG~uaD#KFC5v-BppLs^UHL$d8SI=0)6{R{Fv9a)<zf%_`Y zhop5P!ClR*wGTN&Ynm%hD6vEVzmtovX2!qR_7X-Iz<bX1j&~XVJ(9v8lq<8lL9+%* zyX%CIFsT4#!fauSLFIi+JLSzbon5Wro7VfyJ@4tV7wiGIS#hfZz|}81I+A(0RnE_c z)TzVVqe7Z!nJ^lk-gCTK+YT<gYk$vL?Ut$j^q&<9F1bzB;(R#vRa6Enoq>NDYzFT= z?C1xSE2!$JEGQ@njdZ(zpe|pEcJA3D%_l=E6fCDC`bZ)id2ZXjwJJ$3<wawh>->C* zADhLvC@Qu<9$!unzflt{WBv{3icfE_woYn_LnS0Yt`X97+HddC&!3ou<>Y?Dx%Xf1 znZNyhw+7@sLPhDFUarbOwH79UL<Hw4T&IX?QbYl>WDfW*pH`e0^A=8)Iy_jtkPno# z6oWTDPF|R+J6$35YEl8lDkMa|OZ(g78GEvM9q2XFt_y<r4If8Zkx~RjED4uipqW5% zoh9DBdqMUIX!!N>lYA$a?U)RDEELxZtjw+|B=B$Dvd4E5yv{Xblc`oIU<Kz-OC+-1 z*NB!p>;TTOC(|Rm*ZRZU)7N*?rU|c<Z1|6!I^7MjO?YgnXhHz#Vmi(LZ$J8^w_006 zYyH^dgfb9Gk#f3BS{*3!7F!GnlGz*2&<oh_JKKzU`MXb%UUh-Kmx6XprUrCp%4rOZ zixQJRCt|lFMs~X^`0PGTTj5_`hrYhHq&EoRh=3K+S9VRj(|PLOj#mmHa#KU04fmbC zGV_2d2-9|6na`Xgl}^zT!CjZbXj*GvRXM&J3MFi;gZ@^fMkTa!UQan{!L&qqp}Ggm zcBW^_8$hUi^CT*S!Gwco?yVav6*!L(%*>E^+M|pjisMk{K>T#bvkmdA^MFs_8B4}s z{3!rMPvvGfa^iBNI-4X`(l@-|OMlg}9BBlpxbENf(|P{Tx0m|_FSc$Uqd&uo(DzSk zyl$W0?>(W!YaH}{OO+9mvB&Q|rWv?s@~6`$h^jUQ`-I+<HNJb6o6cELygehEoGr7b z$@uI1^mzKJ!9zYC5%ByBa8VlUki&H)vQ}Oe(oszvMbjaH`)|HA=7n}N;3Jv}(pD>m z<qVh$_WDE<RG?m=+FY~iYEZXKQvvFlW*Y{P?`1q_VfZRoB2csQVBn%(N#X#0?aWyu z0<J&z#;<x*M?O?&D-NHETPkZGkh}mz_vnm#2<9u7uB{_{gm&_uLOqnWoUwzGbk>P< z?7Mzj`bfA~X1j5Eh#&NW$XUV}-!6eZB-&2?kd(Z5fokYg95+4#(k@{^OXamXYRa4? zoAdEBX7dU`#|G3G8yTm#s_Y37W!J~MmkG-k0+>~2xeI+osuaBJ^_nHpteNHAVI*|S z{cN}~DJM-jNERv7c*O6N(Rd*%S0^H}vWVJEwg*3KA>_>6lgogt7jA*#{#-IiG`&>x z*coBNbpb#@5QX*e1Z@_Wk$b?`yEVot|M=d6%z*ZOw=B(tpLdi|t_5F&sanNBhziv1 zoiDdQczOLns;-Jkvy*o-1|(!Ar;P<u4q+@_EZAqYuvW3A$jKA#iaFk}(?*~sw&S1D zHJtQ>m(mi@GP!bh@ZxjtSXblRgbU8<dV2xr*8n#Fh<){4pF-~fpWFX={(2F4q;C)= zDNz*3$GB6;-rxL)yC>l%ZY>9woe~h%fip2}Nh5;t*%3Fq)(U8#`6XX^cK(M+y7>0J z|M-^B&4!{+yv}lF;G16#U>)1I*qeNoS1g;=5wM_EoMP^HpKtFIm#E))QD163bjeED z!FmxxdMmkH_uGJr<iW&9Zq(AwQ7Qv;$3{%phfD2@c=I(y^=+NOg?rUSe-ke7lx#@< zR%i3dY0OtD3?9W{OO(VAFyY<xXxOe@Mf$D975rZdFdab)Jo>nl<?Yqxm3vv^B9~`n z&|B!uk{5MuXXwqM8}Q4;?}9gLVyi<KxF6ImpSEZ%o+PEk{SY=nb8RQ+-jMh3z;Vqy z3!<8t-wj;_`YA=GMdVpKD4+_@Fa0l<9$DBscosvSg-YRjLL|l_9%{r&<`T1}^WOUp z|76?;ztZ((uv@1!+oOh;9a&_=g9CnftAbQM3%)P17&!p;`d%$Dz^nn(!~5gy=SXnW zeFFnm!zap;va$!8A&iTU{k>ecs$h=bjtBi9JM%G+W6Oh6%Wv!p%Y;-QtHO-HKdemw zwBZY7&z%igs&CZIZ3(94$^dtDb_d~(h`>DLqTK}Qm5|W!r;q+ILGZK*oJ#s#S)UP* zKixo>aOd8Mk*Zq%@bfQrN|LIQu64he+opYsJ(n&QFe>HXWp7j)rnBbKQW(t%^f=|u z0>Ae@B_*jFxpB#7o(b2?F*!db11)I4ig|ET=eu@{-c_<Z?FoeA=E^`3pV3F~<=P|> zETL(vN^&C(C?(~ouy;RkTS+mc<2hzJrY|y#-O&Y(>}_W*HE8~E{sPqc!QyMLI*Jvl zCWVxw5s=cUIjtti8yCG=0Q2cVvEGk;iutQd%T_T8YC_B7XFabQn-By7In^z_{}2Qn zHt?4onSycMH}l;Z?VhHGt4+K^j6D1<2>|w)+3kF_7AzYA%|WDyu~g?nmppf-TKB!D zt&vW|am4Z0zkmScYFo_D5CA|-v8Lb1NkLIHaBQn@&rw-RFItC^jO6}fiTC8OY4|O+ zTV5xl_`IpfiE|$^FuG?zEEM^`2rHDRcaO!SrMG`AI}d$;W53!)-A$S-n(E*|Vwp{I zruwXH%J!why;CDGk!->v=insQPNw#5NtTIIi-w`1c*<-g*Z=GniWq8WZ*cEcevgR| zZ6aE+A}SuHKafE<=Z_#=q$CFdb@<_nDi*etm#=N4jYhk78Z}3Ov4D}I$+dw>+xp60 zSCfGVof1@;3?Yl2rhYwQ4Y>bNQu#HPz^R8&mkAqz?`^apEFfvA<Q-lU&s3VWDB$## zT(Ds#1Q9RIM@hY!dU{bIdc_p1(wbV{>E}38<(98h=Hn&zmn9}DV*9@RoUFpmPr&<w zfW!BOxUpXwo9T^~?Pct0=3Ji&sL?>o6zt!rHLHr(0XGmOCGGYvxBV+m99~;KC%N>o zBpT(g@bIrJCP1h44F<vF@G@RSRn3Tv9Sw`X1BB*+D){jTW!A9tF+h<|4JV!YI&Zmc z2Qb?7N+?*rheK#u-j3Y%vwv6f%EYmP34~4zUJX#n&F#iR8{)G?7FQ<o5HmepQXlQg zXOa14-JVhhh{qlW6#>#q_kbbDf@|}0^D=T*kO`nKR#8idXSv<g<A<=0<Un0;lluJ} ztW*G>{?)pA2!@!3hTB4!E2IDlkJEO0`zh7H&Es(){RU82kR(6YXV<LC7TlXks;jB7 zc=ePsSe7ufBc}F-EbNeeTp&+|9Hlu-SN_n%?Vz$~)ZzMIv2D9Ua^@ir!|UFvX|B$< zzd?3i?eRL^#q<4k-u;4f4B2of7QcOM1tK8!c4%MK$R<6=_Jcs?yZlk%5H|ZFWlAZZ zK5)^^P~6n@zDRz2y}I&KZhYM!9cI#^&cNo>^FyjtM%+CuWwwy3o;BgE5)B5vc_pxD zN=j0UJ-8_OjB=z!M-CSkK?4tud3GW6)M!0~G<@bLf84;x&X>9MOA)Y;NR->>Xen@f zo|!C%RX#qiby&VZOl%PNznV&?lEe@HJmf5UfE)f7-EwO7&q(W7<V*PHU|NLm!ba;k zjdb`QQdZB*BiGacD?3{|@`4BVyyv@>PK+k&9$05oBtCr@&-Q@BO!9W@C*n1N4?vA% z!?kwcJqrUY`NABL5GXWj&rk#9_|;we&y&Jhq`&7ZUf<N^1xy(xIv#OxeClgClIq?{ zz)M#zk!-lMna@4X_N%HJaIpf;`jhXoGNEq2u?tja`_Jx~9!5R><G5sHZB|n&qVk{^ z9N*#q&s|ngbrOdn5HkOGx3Hn*LkXpi6@7;{&+7U3H?S*Ag_QdcaqQe)X~W>3!5@Rh z6;vprNO5DRR<8#ob@kqj3N@n!O~9bRh3`sl2G7!pAKDuupc5-xBwVDzVsXfnfSxG% zQ%bldmYA7_`;X2|1ol{T8lFv`_>p8ptPr6>@#HE3Pl3Ezq7t=ITsLy+2u`2$(y_-W zjC}s<QAsXpI$v7t;jJDo#7RUm=}(isTbvaZh`n;xDurO-BfCR7SV+{iT4TB=SaG01 z9xHf7E+!_nTDR$IWMmu|RH#)%E=43K>W;n4acr|tsTug40xxtfNT&Knu|k1@W&CjR z8H*q{$ZVAXCS_STg2Q)+rX;7QtR#348RfGQno)Rccwupu|8+T!4g)9Pap$|)uAqP4 z;sva{KGzH0L1nb5zRESEq;-sNs@Oo{oX5aN(1d`mNXKCU-D?Tx&oXsIB?W)0&AMs2 zOoUR=U$aK1dG4G4@Y3!((VVXvp`n&OAraUkn<Tv&tw!7h;t2f32Cnlbhj-Wgsrt~Z z25<k+4D@Z0@~Pho*o*)iWCjmZBXnY}_T2K~PY(|o>5s?gtWGaLZ<1G8$Tg@-n>?gI zJNMI+#Uj7Eik?w|2uHS{zc1v@`if1n=s65_diurwsz@Cz7e&I+(W>GFC{9%7aGA8v zOo}NV*LXK0qqFR%>DN7XFhA<Ffv}5Hhn*GgYR`gn;QJv@sBTOyuc|7lFAvD0(qF8g z%B!P=(bZAAg#K;eMUq+mz-)4<AV>mm^g(mx=h!j$p!K$F0GyFHWgN5975WX@r$l8~ zG9r>hm?-4+lXIkY6R4-LBxN_R1dVV5t9it~*GiaHJ%2g~cr$O`^8CiURu^UN+_TiK zQw8P4#VOVG-F#q$zB){K0*IgZpX7aD(YzTeYU;B5DKoK}*v;2S2E)}LNj~=r-6YJ) zg1YLs+o^*%77z!nE{0NTLda}IFr(nd4?eH;FYn6g3%IZ|rC~9k%ufQOGLd6e2SMp2 zj=giKO1iqTIyzY&FSom&UH36qOqZ{cQZS5}w0=g!a&xru_-}k@NWFJ;Or}r(eRw3f z)E6R4pWS=+QqHu}(z1tCx7k^h2FqR^U(HuCFW0laquW;WBp`v9`75y3J|p7<s*n;V z4ow9GlckQJk}G}wtDr9e(m_K+baCgm?I7fY7U8D|ZdFlJby~3b5W@R5P`TvvxS(mC zm=-sC+*PTD$Ni<~R#Nh^!Ng*Y7Dy~rte9H_2|QRyDjK%`o8EIZu3K(D&GG$Md-xF- z$Mc%Bexl{XrqpHqHGSs*#*5S>@4I7Y5#iK{;lJIKM>CU_`$Z`M;j3}4i<{+&8i)1Z zn{+l)tvGu)<e6zIiae3sC!|oQz@A^~Mg>iqLPpO~6vn5m76sGxyfzwHu1UBA8J8A* z1rE(Kas_qJscWOvxkO?CiQrsMC|!4VSRtGxsjInC)!PY~;`)Ifs#OrNU=cGlj)|^E zT0p42)!F<ZaUQ{GzbsoA%Lk?FjHZ;H#i{QX927(jL_wWDs9>h51B8|p87^lopO*qT ztnt+uxr5e&9OJEj-}-^{VKf4qafcnM>-`f(rx}}%(3w4962bZDYBFGDd*7V7kvOTp z{&QT*m|HxJ>1Ck*9?cOkQc<T-MJznN&hLFWp1FH)ps1<1UZ`3wDS097XhoDT(-0QJ zZ68T(lg7A6K=k7;L28<~juLb}wUWAS%!;LXf9}ZBPP2X*lO>$Gjte4ce9w}xTuG!) z|K6>nEV)vR$P}AEuSAU5*l{wzuQuL+Nb}6tPSM3o5qxXGE~13&7rKvomC&uF&_?ZC ze|rRd*|kZEn#HJuf?Rgo+W9UJLI&U1*vR)d*;~0$>#u#G^CS0HPEmj;G0-9@d`v@1 zg|}JnNOwr>V${GJrq;M&-aqzk@_rzu5iw8Xa;JoABn+L4I=p)fdjaaDu>i1*`9*!| zm4>y)b8u={Ot=jNHM&v$Psu36BNBj^T1Y;SkG!CyrWv_pM8QLu(y*TmE@d`$-wQri z>bip8h5IfUSiIAeiQ{$N@Xwl&pZ1=JD{N6C*X7W$b%?S0x1U)=t`!?f(=V+n<qwx{ z2U)&woNLbLS6AP?j6_>%7`OpTe8e@&wDNW=kgJ5!Z<_qtd0eB$pwV56A*P7(S%?n< zQEKH+la6iq34+S}><(}jsiZ#WeOTXr*zg@Vb0mrX85Sc=O2eMGJ4>ISJkx$U00IUy zKpe7B!%BF}jm<yi@G_MYj9S|>TmbI#k1SSDOiHTOdj9NQK|#r16y+6HKX;UVzEUq- zh1T?;nt-4_rya6kY4lkZZxGwbtR^Rj{R>{)AjTm&475h_HOJaJ;$Azjy+mbl;av7d zx-1+2yZ$Nc;=+EA#TrY}D{(#euOt9NHC;x^QCX*!b+OfnDlUkUG`)vv!+%UeQshZ) z*zGkS&w@W(M4p1fnpCbGd-JZg)^3lN3-M{y=R-sYl6Nv6B&`4q@MI>N<>3&;;pbeS zL9Q@9_4S&!uaT##^~qo?e(>^`z5(k3S^UrV5zK!9D|TqP-uD#w`T3a$uymMnF2I{> zT$g}Mz@O9l-XNDVRuC&N3<URWe(2Q90NZ1l>np;4)<J+{7xQ%l>918ogW=3K+Tjsl zU!vVt{YEPw)7^KOq?@K-NZ7#?k)t9z1R4rRW=)<Dd<z34wEFnOG})C9WMSdb!dQec z;%h#8kcNhaT)GT`Sk)@DRNMtbb>U@|TGs@edQKF`jNSnx5VuxiiEQ140hPDppTjrJ zZ!X>WDv>vlK`R{>TAd?Qx!wWPp2*s~)gr;yy3%1I2(GGhDmLw^(W)L%xZJp=$}%$& z0VLc_`LUn4@R9yQBF|UpPds7i50o;4zxdQB(G2|zr{b%;v3&q0OuNG%9VC6%Zmry3 zTDd=Da(Ae;?kHRRI>q+JHx!N&!=wm8q;h|34RcD$h3(&`>QS(Fx<Klxh`N_JA{C;2 zor>QQJ?^dL&H^gDB-ME)fNZ4a`@{`*eS;zvN4E=LWuOrWN%`z2bhr7D`L+cm#9a6R znq6s_ft?bHbO!8AO-shgyVG~zTYYZ>qCo@H3XFi79kg6Ku8-yhdixU_am?fRa9;F3 zn$9w+%C6nQ2B4%g0@B@`64DLQ-5qWkq?MGC?(Xi~A|Tz}-QC@A)_cbI{`$-Du=a|3 z&UwxJe9BxnB6jyF)v2JxWO~LD(uPW;l&RtUIJ(BC{DbdXUFJna<)o~XKhGw1Sl4c$ zxn?F91Q-)#zT>u8{sDE>7MRi;ZvzQ~`X>MReuiX0M|PfX^fi=%RY=bgczd@T^rJ`e z!{4FC>l$<3AB@BmI<xG)-Cc9XPo0LtLpJR+dza8$n*gt^|0mr0NgFf%)R=LW><##D z>$omC+syrms~KtPRX<#@`6mUFP3i=;>Z9mPnA!So_=Ztu)KhCPtnYhOdDjDn+YVgT zUFIrNihH%M7`0nHB7b@*yFG8I3nNJDCI*IW!sP0rvZDvXlxc|>>9Ft7fCCSqos9IO zfCGC@cbI9r|Jfk#*>^aTyt5@PeFUG!Ysb(}m|`LQ#g8og+asM%u@Em&ObjZy?JgX@ zJM$}E22kpgUC2yS(X(*m#U3GAQk`G^6B&QH{z>4ip8r=(O}Ac1w~3{Rtq^=1#}&AM zE_*(irh6V5BAnl3eJ$?W7fhw0N|)CX=Zr!_^FMG33Y(TKQVGOtKkM5=`XoSDQWy2^ zq$zYhd0IuqB?zOTXQQIo3fuQ{y)A!c{TvqZV}qbKmGf<?9zU8){Zkn6`%aTE<nwQR zu~}FoDMbho6T`h|Z=WEQh3}WDu$Bg@K!?=!NQQ!g1A?QxV9HL0Tgdsjl8=;R#-u2~ zvVEYn6}DgO0I<T*-5kZ@4qq6v;q#eM@dB31$%l{L^G}^O8NX*Xj2`NTz8zv9RFB8} zp?Le5lh*e+$<m~NDk}by!poq_{go62uhPkfqeZWsGGTi~!$^m8^+_e4y)$>T8*?#K z!^d1p&pkS43q?j}EmUFwfhe%~4q_iv!Ox;d(^=bbA09;y!W^x-G?gvbwjW$6sVXZ# zglN=C2x7*1pAe5%CnA=6Y*@1*!c5PD3mg|WW5AIiRxnW~WjU1w%G1lr!G6?7$Q>Ql zB0|l;xDLJ`{F5;nz`h}`QVBEC(p%_jxEQuEXxAf^O!;!s)~PFWo-YmjlE%eWNo7zj zoDWl<#)b%EHm5QV^r+=V4k*(8=I}foy4{RX_<p+<1ifi_NMbd{2G18ks$sq)%^C#? zaPB>87Ilj5e+a=I$2ADJgE6D0EgNZfVxOMS&=*#jr^cL@gb5DYy;St?x#_auY&a*E z%0*{YLjS`Ns!|k*frTb7Y@?E57*O-Vq5Ynm-omC99C#Zz=~>L+g#v!&gP_J_rn<FA zRTAbW%SLyN>j(rXD6`=>>J8W&{rY@&vF84mD);zrJu@_-U?1mW1G_TAUzd~lHi8D7 zkw0}lWHEhxc+9D|1%qV#WTBu%szW;RD5q~cV6ieNJV{zshxK#)x3!0p7KFQp&8O%e zoaOo+uLi0wQvT)3wcsRh8)#Lehvn~kiRPhDMbecrtULV>7r|8=vrokL>eue9ijLAl z1V<Lz2%m_&Jjw{)!zZ<bgwK$cpP<glZhG#bcUY2yAL`*h4zAl1R^is|If{iHg~Ph= zsGWo$!I9|yn(9^Meudy$A4zv5KKCU-wiAJu&5q305-a?|BI{F%n_pRRH_F@TeG)`I zVMAs&f=$9C=Kp>Ofe{1<wQ{Gzr#8b5u_B;>6GdLmxo(ui5b8RT4rzi<SdjC!hgS3z zQ7h@F^ftRLiR(d7XzKzEjq{mJyLGaSjYRS#iBP~cHCa4b{%@^EPNEEc<0?TvvyxcQ zKU92g28jY)%KE1Fd1l|Y?yuPu9$;=se>)j6DWTDbn3(@^9{ELHyKP05cN0##IpWN? zd(E<1G@@>EKMi0^R{cH*7y!Z>y@nmv0hjI0bqWN4clUJcw^T0=ViwEZ&^Q&Ky%t6D zP)0199kdr(={A)EHr{S7Q(eD`8aW%MPC-t{h+vK6>|aZfAIz6i`pFAf<OF<9+~8&X z{on{YK!_v(1Lx#G@W6$ag|LQEJFB#KS^>WC_*HPSP&?S(b(hGfbs^^n0~XAhU;O3p zXB;oC)F%v>GpF|xnV(d|f2S={ydGZ~wGwF(spaMGh)DUpaJ2T*<Je~E=+l?HbBe<6 z&3dxpWLu_r-}DOTVwDHfAEks_`<mTZ<4?3gq;dR2%i-<pr54D^UKP$Y1nyB0d@zc6 zM|_xQI@eU|%+=(2Vg?#E2Z60uDu%MgY(wq&q&|h)a+*fR@hKc!@0>gu#n|i(B}@Jt z*po%kJeKkgnZUeK3Q$0!Ly8)`QCMF|(5GjgN%CVlXsOQkGP;yuY)!Up0qNi_D$Eq) zvOQcc=H#%RXwPdAzdm8-vMebx9?h$n^WTUA`^ClbTx7_m)5mmH@YL$D31=(sPP!~? zzT`~V_v7NkEZLq4N|)fUze0yk=EUpkrpRZpo8^|432{3);?nlYNRD6b-@-(HeU(Je z1%3yOy5pG`?pOZw^XG5-{LJC5?yM_JI!)QuYEy98h7))IO7jIxt;l#653v6qu8%s5 zs+e7mb<i;|?i{DI%A5CD%~G9MafVxC4=;0xhqpw06bNNiq245WWbGDnK1QrmUn3`k zZMU(y2wCC_hSEu3I1_9uqF}zLx#+Xro1As2uiQ?{$FQ<~?`3YUHB7`W3;MfaXZv$t zE5ER`e}&n2DnziTqy&SPp1z~K{SgzQ`?KdDFSGWIa!h7vMa9N8etGw-!50kd;X&vQ z1{T502Aq73T7#zFWWmZ;qjlw5&;$oenI5CA8<a5GUe+&qxaXggf=Bo83Xl(G$l_=u z@n$^&Ouwy(^T}(+9F&;8jiy_`j?eq-O~y+}SY>HEaqv4X?2;1PjV|5!jeCBJ<xEw3 zPq;uDuW2delDa7p^rbQ;JLTzqze7~KG-6XFRll>sHbvm5{?YwzzSo5F+cGBkDSvu8 ziOTZxN=X{;^Wp{5e~U-sn~M)h2qWL8Jn4X*jV_})f-6TAOfdu*x~IwFS3YGLE(RU6 zrx7hr_Ya{*O}_p6yh!3TE2Yf`*C~Z%MWE1*)o~cw*-drT+lB#?C3k>sFzJsgNv@Rc zwI7^0&HHn{iuirwyhUc&uCM9kO@EzeLB#%4Otsy{jHC%dtl`<~4RWz^o2Hg=CH2lh z3^U=FZXB1ex&n2fGPRh<$R9HYrZdZY<xe+QsqEIA7fen467O7pMVlqZtj*67oN<5q zrRQ3c^DZwxZ&p9DpPGRQg?m{YfB-<u4|{*#>T_lA-7^jvZXX!3Xf_x+N}eoLp`#a; zvl%egeSeLQ1gA!?KhI-`i;KH=ayqIx$(2Z5QG9`q`r>h9dcC!sIkun3yTNX>5##Yl zn(#iWOfXJs;B+HDCL^JPOWzxfS#PZE4Mf#qKxrc2`&O~@!LPoLOC?mMro*&KLBoNs zO0=@3(I+9^KGsevc-3&XyWKFsrxB*)gdJ^$J>|`h55;smkVjF*mP2W!=yfn~;x(Dk zZt-+$iud2WTDAZD7%i4HPWrwjF<lxb$hftdrz)t?C<p~#sIBF9r?U3+<Sq-yHO(-7 zl2;$SD7|&0LC(+l4B0z~(7}jReH?ptV!)2~;Uf-GGzz%#>Hc{gG=aPM@^pN_^q(aP z73OCVRl2yA*-M8F4d+#J=wu8kk%+VsUr`@?E_qK(BC3q6lV}MqRWNa;Qp2~iPKx}f z*yOHvC(U~^m$|Ru5x}chP3x1^tjqY(rX6=-F+B;Zn_Wd(EI7-+I5eBB8%BHXsL?>z zg)M)c^moec0Xsm)d5EIVvN)l5INsO~wN{AdjM;6qR!9_#0fL@~WW}5seL3{5hT1(P z`G(^N4c!vM@^xXyh8H}092Nrt<g-WHny85iJDEhp-oGe@CLdtc$Hh%*ff;ypaPL#m z(%Itsn8OL#bAZxN7j@#V8Zj}_Za&zy9FCs&xnyr{4r}`mRwVpwckpSm(bZ+BXgw$O zB{sZGl*%=`<fng25-0sDJUH9d4Dao|={-!gTIipmciEuC08?xc@&Tm)qhv_lZ!B!e zte}4Qi?<N`RNd7f9euZvB~p<l3NC+=pwC^Zy59Hr2SWGQtd78j_pbxq0DK}i6z9DB ziuQO1UR8U}v7+X7nuZ_LVbmBr;aHHOk9B=GWirV?tUqFn96xGB$4Ceh-@qu0>M8Bl z3mQL{E^l0S04HhVU47G6S}c=%DuQ!7tAYu5lFgKvjjXDc_d=+r_e+%mSw)lkRoZg9 z>(#HL_KT&#bm(U}m%uKBU5lQ84qW(}LP8b(VMU^nOOofBUm70dhs&nerM7OZj=ceS zY9XnBR#_NN_@oj3CvG^uERnhVYHVv+R3_-<x%`T#bJ@@CADL%<H_t@Cqx4!toW*55 zOhn*4&`O1#YCZ~@eSE568?~6MO|Sqv^_Yc<sJMU3r+@oQAuX{t94Rhezp99vsv^U} zc6}T&!%NvuQL$op8wmJY=M<AOE7Aa#<}2#Edv#w|x1Q~*)~>W9HFG^bWep!Oa@>qD zag_W008F3KaB4%aXpxVaKgsB#^(dsR-Ov&o$Lr`-;3O>geVJJwl=xg+Y^_<j3fVu{ zZ#-!W*d-(L^rHUIp#fR`i+kl?BQhw4!`L*3^TxKCHGncAT7^=AHfF>AGZ@9iS1kUk zTq8^IuRwJF;&n0-+PYKAHcU!Vg?LB!K=ark5tjX@7(H~#dlG)2SnDnF_A2j0gy8p} zIJ)OUJI!t(sNsLy3sr{J|HebJ&5rMi_U2?0IUg!DVnpCf9Q*DHSgdZp)Xp0S(S)=> zhzQ^X-}^EdntxeAx;HatHXYYs{JV-YoN>csHj*muZp8|US1wD1$P3I)$1fDPpw{ei zGw4x$CX+{kfx<hwyiG1!k+ZEg)z>OJ6<tRb<dkHMDgMG!&u<v!&dL0O9&Qct(Dw|# z^_jYI	{nFFzWchxA8Cwa9C`FcP|Nww7u?a7755Aw`Xi<&t;ab4!1C3yL}Bzy4U% zK+cmSM{gCQk<_B+&{R&#)4}@fkA1WFv!5LWr(aqoK>OJd*$wK^B!;`#Y)v&y8K02@ zdxcCXP3N}}TcY;dr)~RpzUaP-n9Bx2r7tNZR=4t^tr0nLp&+;>v&*xm-)j=2mLmHr z!f<%72#JXIUj;NIn`v2Hd*#bF-M8BHCs}P4z^RjkIFYGDGj`BEdf>d<UJLN#?d(=B ztrY0+ifC(+6j<N?>VbDW%UBdZ2C+KzzM`eGo~<|L+785fzJJnw)~ZUi>=`jQi&z1D ztD_R4^`w-MlH_SF9nV)c`s5J;4Kwn?A^bk*F#-r;8euEdnB+%I25D+!@=XC!6ZwAc zdCTrA>o6U-bvLo%4C^=*1Eh4GZ+wv6iTjQ9dff<iepvAudIE812Wi?WMR#<g9FztA z|H7;={_g-6R;Q@j(iR4WTuJjs`_V&#X#N*eEf-~l4<QFf0|Qvq)zw{YI68x=6Y>&_ zCt6+YfOmR(+S~vH&#DE2LY00pZ^-;1ioSr{mxlQ0b<%XNa~246Em=N|PEsR2HrDAj zh%yw*SlKLY&SbsK<K;uaKwoMNqgW2V69Flpfy8u&n}BcY&jm&Qs~2@1V)eXS8TZ$# zOGRbI=)<X8gSnj5M68SJ|GWSkc%-CG{+1k_qGID*Y{*Rm0TV|;B~!OtvcaOlN=kge z!S(>P`YUkWLEw3nKR;uju)#B4p*@^G<*VHdBT(M~T}7B0GT8Q0%cW1nX67Wu9D zW6&2>`63kS8CdPwyU*j}tWSbGIuKIuV9-;9>VLi84*2np#R*2OB<>xNyFZc7ZM@h> zi!2xpgL13M&JJw_U3K-DZCApA@We#!e(7`jg&|<S5$Nh|Xc4POxt}k7RS`Rz)9tp> z!bd{OtHquYHrRSt%$R1}JGut0NMN^yikSjgjpvY~A_$|UoMB4{=8`cXMl6C~*4|#R zAmMvtr4#Qbg8L}y5HJ7&_A+F+w}{7olK`HUGK2XhGX59%B&j~rHsTQ<4^QO3s@rZh zn3iZZ*n50EtYzTxpE>BlX*pfT60_m_Tz3UW?h7nm^!iYggoOYVQW8EL32BEnMKn^P z5@NSSXXxu2jW^Hl5?$~Ai(3!_{I1u-SjEe$>E~wJ-DE4(9m<Vr)0XwwFGmerBtB0# z@6q9-Xgc0Zp=0h}V-@}<H+T0@Jp`zB8luKSB7z>*9eiZxUxwd&_ld}Q@><<9Pv6=2 zAh_BZAt(nvp#!vZVP4A_PU{=~u^!sKOg(e4KCdaoUGHYww8{nVglK-|#GZR;B}`#O z35FAI+Izcau>`02_SgZ_UMz(8=QBF0RPIoqAOq2~NwjNj0+?fF)pd@k;%%{GnfPDW zt)KOlD0I0kB#x=GpnZ$GR98=@PYr!@H7T*R^l(T#PGXm5Rbx6XYkMYUx$MY+333ZA z7e@**g+&~-JO+#n_yrwn=3A$nH~tuwV&06zs}BnQ=-gS@Khn@%LsfG~FGa;9STpsp z`=sE>$thWP^vzE<T=mJ`qnl;8<AI}pD{m(qfw!PIrjP%#%i$|xKE@Jt`SIv7L9{4t zRH)VpYlTUOT8c_!wAr`Jd<(>yZN4>pwz%_1ssQlZ0&W(Ob5n7NK%y9bf`1zd^y_&E z>E>--A6SegEntGbxH~)w8kN;balo_VNk_@tKlDnFV%%WFJAC;EDJFHb4dv>Y5E-Bw zG^=4Y>XaPYb8-M*FLTO8rzjSTjX|3OK3D06KZdzs&F5YQY6?33y<b*pV14Dq)g@kQ zFNFF$rYi_|whqXXNtp-afz`(u_2F=?Ip(DG4zw~3$6_daHu<o^#TNeZ`0%DRvsUZK z^K8lX@6*~$8B88nb!&D8>`BZY@tAStW)EFH$x}fh@GEw&uxNsI(Md^xgKZg=ar7RJ z%<Tc;?rev`^Ky^N^Jc^Ll7JmAqUY_euuuHhfYqf!i%6=Q;9PyA=>}zjlH32g)Z>ym zkZG8h{VKoyZ<XF6FW;-A+HRtuvx@>9ZS9~O-R)y(KREa}uDaD|Zj_2*6TxKs$L(1` zhTB=!4s`oIC6V0}?|mdDj+{#88qsHo7}ihjt>^3Z^E9WOq*1h5Xt!KF^v#3`f|?Zt zTJhedjJzQrT>STJU#4-v02z^AUjF`ys5d^Gfk5sMg$f#AdgQ{s_pPwpI@3xJdU~;b za(BAafU^Hr=(C$d?@+iIVz}DMKY{CBzwdm6-SVkIiSj;@gr1$F&pM8GeCx@xf>!%T zf1i(W=yj_&f3=Psxfom8bdHYx7_(@HG;Ex?KMIc-HW=1uRdOc#C8N5+#*5Q=Tpt@B z&0h(WaFL9Sc(NN^esnpqSc^Qefo~^jeflkoF-Avaxx7Mzh8-tvvfulIheF8h6^_l` zwLWM*60ULc>D8@#KnT%zyr`HhEi3C!EIjQP_x#JX5k%y@`RAbA^x0J1et&V|_2@yn zWLW64#BtBTRXxojeO<thUzDV{NlKw6K7N@rkJ%^+ne~*+W^;}`K7G*?!cvwr;5)k% zNUapee*Rg!PmA{kJv&t%$1T9ryLfyV$!|<n%FTHcv9y$aC(k@1yRh&yQwh!21@`WB zv?6fDlok_;-agHA0WC8sdMts2tcNK29noj2_c$Xd8zb|yG$or?t}U5=>RYC~<_J(q z!?A6q#rYViD2@5^y4(Pw_0?>t*<ZpB*}Fh$6^@j&^Y}~rUR1Oj9V_LRQl5DE*L#fE zd2Rn!TNEwwuwZa|?lTQ`xBY{IM|>aie(_Hz?|9sx7THQ3OXSXT3@STMa@U<QQLvSl z)Kk1Z=wj6Du_xUcaXqIj33suG&`)LCqg4f%3Grvs3n#3`+cuN?tK*nLq^Lv$eJr)% zpe@^>3oC)`<S~@{!bZQlUOF#R!Kz&ldq=fo!G%O?KO{<WYuBjet5puXSRM6y^uujD z%;aT^0`IM^9e*HB${)teLER5QfB?Ltn_M8~>zhRk2Qyogt&P5yCLdT7o0T;i<_|IB z)!^K4@sQw-{~U>1Sy`d*nlnji<mcD7N~O@NwW{7NYummW^%?yoa=zLVPT1eIGkn!k z4v3X^D<1mel^NF?XN^U)Oolht$RCmG66KJA+2nG~-6$s~ICRvQHHGKf^(Q28vYMW7 zqpRObAP6vhJlipTg<nK{#^I_~JlVSi2I$#9D~^eb{i#zVTwt5_=ES~<n(5k}6Al~c z!$)RN7|zAjC!M8S)c`ER>sRh$Jy%E07<DEKMtqF#(29Ou2z@E~w!)xZWzJ(&7uXl$ z<(wCFUnw%(GGxGfdW)gpu)oOW8_ko9hD+$8k~`swwa{>~y7JNz`26<W9UE(&5`0pT z6!qrIr(nM^3mcD-;(oC_6p8%F>~MKROI8GQ8odU;(^LN+NedU?cRUic)F5cNhnsf4 zG#I0RoPBLQC&P~!tG4dq@hdd=P*n;dpAhOr!m6L~{Zh!~XmO6Af=yCGT%zGbyr}TH zi*}|=Q%+2bXRIpN<od|_d0epr&f)AYkGD{bwXJ}y*D1&L5BXQ}L222K&4){MNyX<z zu?VonaLB8%!38YzY~d|MQkQbbX-S{W$2C?A{wzH{-oR}OUSf)e!j2tKkkSSw-m3J6 z+!$Kdeg!^cSx;8Yx8kUTW2^$<*chB85on~W)nbV#pZH>1pD#^oX)&wizdiEs@Vwex zXZ2VT|6@Bu1tzo-SrD|}4tal;C`VRh-sACGApzS9%r7KCc2fyp-Il->kXLi@G1^!c z(ZG2FUp4kg1RvYYo&^|}2&HI>9&gSHQr?Bfc5=7ZzSuZO>gnk%EaN#MXHPan6p}@s zx-Ut>r^lcdVFIaQV(<Mq>!lMW7B+%N5Hb#t`=ykU(gg2g6BzqeZr<n%dwggn?ZV<< zpZ^4ixdhWKIl2K0M<f-Me82kTF~wS5w&~&@&$Jtwdo!aFx$TWo-f?Pud%k8|@p-^{ zrTG-(^x$_hAiuMIv7K$xU$~GKGm>)R6F@=yN>^REEkw{8@TPnx{b30I-lNOov8A4g zz&Y(}IV6Qm<cIC-;a9Bh_hj_!IT=_Lnoo9W=9(hE$*eE-AF@tR){7olMZ=Ihnjk8Y z{XH=j9bJlOi-w92;M+-_5sC8Q;FCvRxo(pugh5xfVqUW3T+O(M$#6Be0miF*y#8d^ zl6pnXSOj)L;qUT`0E((ic~82Af5)Ctf9-~dcLn0a<3@^igjcJoYAUZe3R;vR-)XP$ z^R1^&ZTfAZ&+<0{?CE;0cAc1@@;>F9aM`vE2X+o0$WIm89z(Y5ueH=N=vl5R^N^K# z)kJo;;_m|lh`ct2W|w`PCaibDDp~2um_=+Kt9Vj#sd@<1D9g&J+kjO}=)CR7<pQLN z&pX?Lnyx6|=H@74iiY0OS?{BXp_NSaCr`DgsRZ}!E#0q<DY`TAzc~5eISMJ_+P1tn zkAB%aoFB9m^bCP!#lt3~_S`q5ueHdG9Mxtbbz&6^t>-&>1tU=Aybgu7z39q%(#Dvj zg1q~i1<q1~jr|pS9s>UW37Eu(HeAc3xt6ZEIVm+|<+r|HG@S67;qR;k#4<*S<V->- znBr&_Ob=gEFQ1d~rll(yd)9tebWdybuK!%+vIO`1c%dNwFr%6E0hO4AF~ry+e12XF zbVGV>I=}*G8MmRKz<_>^VodZX8y-}<Y&sGOn>`acr4h_Hy;B4qae^=EyyNqvMB__* zR<U5FAY$8A97pFLbleo$AM$&GJ>BD3OfKp1D7+*b+#G3(58RQSR-UOV%5#=K(l<EV z9Im%LU^^WkUVi6mYiA`Tt)&3c0`o^N#vZJJ1aLi4WC8P~T&IPhLRB#F*p)TP_PY71 zt36_U;(6@a?9NZ<Vxu_#R^^up#q$S5M9uF*6rB<T{$_NmCv~^G90}1;hb3+OOHh_w z=5Vzh|Ban-pIwb&x)9CQ^8{k-$jMrRJj2n|tX>l((#y1g{l#ii#9yR}La<N#_}j^z zv=?eIoR9i#C(1L=9`<uXm^Qc3XB$-669InzNN7F-v0=02;bbE)1wzJ3Tl;0QaBA0C z0;kGJf}tPksE|`%{yPYVk(6}&Mt;iyckboY*_RZ;kifuE$HB2*JxAvrRwn(-{;2%c z{3vvU4Kay{vwAf2DGY<!kXtS{C=UUz01Z!`h~^5UAt*Y;$^lW@L&r_ZIqhf255oRe zz!Q|9;{<7F{VSfruc1+_l2wCheSrUnE8hBaj`8Ykpp(9_QLw1NGHy-p@TH~-XOmxp z;3J%fNN9H@<cg^D?m&G#n^fcJURf5`9+lA`507+%xQ>YYUI)i2&-Wcu>#HBt*^80R z+D}1Yrl-A9ld1_d_EQzlVptidI=hQ;aP#6hQGfpM!USU${k<Vivbn!DB#nVX!x}Br zqE*iPT6f~hIRD767m<=wkRAetWo1e(9tmhoOT$O5%YC_h6AMT4k*JRJZ(V#oNP&jp znH9UYz$?CZGb+5k?$yWiLJq!`UPXWZXv$s-#}7#j*^IYzL$|`z&-_xmUj9K3*IV#6 zOpR%Abn&hy!D8T*+}FpHRalD9)NvOfXzk?}yk5Oe9N{}<wgm>B{Nyt=a|B?C#pbVF zxqEdj{M(kppZ((&qhN<bIQNZ<^{g>U_T%SvpXQ2|m$b)rY~k}X?U`z?i52pm?#lHk zv0Ue=C$jgbG4H+LgdK?9NBH+@e0|`&mXYU&PZK{n@QSZt*rd6?#FsXEF`QJ1d)@Ng zlzMH~1=#RxcN^nXbi)VsE?tFokqeoY<h}M>lq3#qRS9SFG@-7rB0;~iZ1po9_$aF% z4xIGew>U6qIcj!l<q|<aGdOJ2zSbD9!JdZ+<O^cx${T&BKuyC2gKP8{)dZ6Y`U}bW z&+>mt`o6MRLV2MVGF@NUqlb{Q<NC3Ug=pih`)?8x66pA@I(_a;&ps@9Ln3-)ROR?R zuCbKWG#?`1hr~<5+sBKE{lqWb?;bZkXq@d-i)3##E<HdEgHQ<O=hs=d?%kVS1FiBk zF$+b`!k>`bJaX2P%cN(GseX<W&8k0L$Xbz2p;sjdnG;r;=j+CoG6$qLr7CbzxRH@? z4=Wx{GX1w<RRR>mt~1-53LFNr+_i=+$RN~x)c8%cEUTkd6FU^PWJp|P|5UGvx|tBi z<HZvrT;R3Wdgc#9HNw&2+DR;B^}hjC8{Meb*ny(7doG4|edZZw8xewbcX2cI9y&I$ z&xOZ~N;*1&3=NCz)uscFLn|3x*P3c&T3uIMOWm~_+Ovt5ybMzI{7l9g6(9IrO9NR+ zl>^}h<=iAI!t2^_4q{*`zx8d6>pjR14D|aK5WX-8dfzw~eDvl;D3}n_G)4aJlj*1h zOqton2o*K0*>MA_)4wB^cRt5Xryw&#!0P&=*Bf3S%WA~xK-(%YxvYOT(H{bR9jDaR zwF4J};`y{e^n7An+^=yl!vt_~>CnC6aztt9oAHMSor)|}LRdMit?&y^wde^$<C|#? z_DOZ)Z%E}wvC^jA$aM;8E}xmE#nRel4b`K2HugB=GUTT2RJNYv_IoFyZU;pC-*(fs zN!U`k^AGZwqWFpm`^zts(d>I%AFlOL;n;Vn&eR>CCrDCs66BG?fR&WteIIOH(HsxV z{`MpMH<@ZBZckS;ZkJ;c(A{ym|HMKDYt{d*&_)rZ%{3bIS<M`7C5n66*R%oB_^jBL z<=1iPov^W(PchCpOVt8$lxu76j?wfyk7;DZH%O927-_Bd=hD<g^$c<AuEcFzBpMLp zBYOP6ki4a>6FAOYPUui*(JZ^4m(u^>D+QA`I+^%b9$kNb6rE6w!?LkNkB=H#ih*_A zA1ul(xHpn=35vN9xEo%f?K?QDyslWON|e)a-<Q&HoA1+Y`X!5k`_|LGpVL(iUX)7M z?R8HC;jkE0#=oFedJ5MWN(a|(!e#JeBzYe!lirR=+(*L>cDuh2*9RRnT{A;AzqYr} zD-eS@Di{RhRxhJfEME150(~KPAbp%QYxCW2)i<#=y0S*XtW{MlZkS8qYIz-Ns{plV zJiN%ZD`@w%sYiUzxjFlHX_Fy49`tHj8%-=qEEJo?BGNWh&*O-L(0!MLvGG=ExXHl# zhXXYU9YawMLS%P$_h<@q>X$G<WbLf@r*YF8_=Pnx39bXrwEUvOqT9`!n}DPmc{E#n zyNV1CXcHK?STbu`Fl$Fj<ylNhgVGJOHN#$0Rufiu)}mV7nR+199sQTwIdvDqE90bB z!$&E=Pgy#?7_Ae^H!G~znJ;1F&lNHQEI)eshno{3PYm%IeVN&+Z`Luk`otdpM*Uj8 zn~5V($r9|a*^AxoHDF;T)Wht%LUbj>G)a<Zr1(58TAN(Zf?=ZB7I0#Re*Fr(r>)e6 z?r!2*v|l||8(|@1(_xpy`KBIC#^Ru*BudMA%3#|$1{!E<w3yJ8#51h{gvkd!b@d0| zsVt=h54^#;fJtnK$!Y0A)UEFPo8-#3J+wm{u(LxPso$^Tp2HhILk)2FpO6SEdKV`~ zY;L%PP~AntSJ%4hzb!OAT`%m-R1k$?Gn^}THG_`IMX#Hs{}Kd@Etmb7_R>;e2V=T4 z!edTaR-vbjX}i9EZv2-Ox+u#nng!Zl23d<Pf4S|nKK;@7C}5QP{lqUKI(=+sR9Et{ z>sr=~j<P0hpI84t1gaCLLwUmyhx&#!Jms@s@apw<`=+JFMF^i>RmbLEU*glVcPGpT z{!&3sNY)2P;EZ9$FV)oGBx7PK=p)Dx*!`ZT!)Uy`SM#XlC8S6r^Q<#borQ;7s^1JF zg!=t>yCitmO3TNFb(go-kvdA)lNNJ_+4|AKi0n$o{@m#rGaeNO3$Qs2U8P`~LZs&! z3j$a~i>xwwE;}`;9Is4q&NA@Jsj3Ou=1U2Pex2o08T8nW<cx}<<9_)@6+;&Vs<wu- zYPa5*u<|IU7#X6iElJomc=gCHdmk_?e}51GjTefvab>J=DQNksM2g>nd40P=ae(>d zhS}%Y69UZ(_+qrt9li+uMK+z6U-IjlPBDqg?|Gyu8#^JXt*=JA%m}`y2<K$cTc8jI zvmBObb0Ye|eL$;dyyxxyjUOTH{BgVGy`Ey{n%$b6lkK631$w(Sm+gA9>oQ-iTHeBj z;molvL%R~HKe4b;#Y|`)P<$t3MI%#PPE~9$x={)g{*3TCLKi*Hr`9vGXLJ{)!2=qX zt&+%*$~7ui7iVw4^9X5DE0V6w(j0(X4(+~Xu(v07o61iZo;+WEPT;S8_v13`x(Bp@ zGP@tz|Gl3-SZrP`=ZvVCvyp4BHg7T<aCs6^9hQbmbCQYdUXDW2_|eZlfXm~6>2+^% zw|jKC6cenatvwKcqw{Y|UC&QEXKh&fr30C32~SG{ArjT&G7|M;xHzH5A&XkMPG5Tf zViLcHOJtr~SDZTQlRpM@JJ0}*vP@0H!N{h<)2v}4M4-i1xmEgw5=Uzm+ZH9eG?s{j zarUXodIv=ae1QKfP7B9>dn8!qWJp3tudc56o;HOUp?1q8&GBs(phl~n{PvKjkt-Sh z46gPcEhFtEt~Gq$J7>c>>AqCWiN}lUidHT~m2u&HYnwvj9_);`yM6*Lrz28?Jf@4f z8f+O=8t$VuY+#{<%Xq1J^W)Txf1_K0Z`JZ0GGTX$?Q_M_KUYUt<??-~DUx19=wDSL z^cddQ#6f$8lu#wFFZF~!fK!us2Ajn=pXr$%AP-z)5U+<{nnH79Rm_G3;`Fg!ek?(Z zdn-rDUxv<Nb6&&w{RErg+0~5x#c|UK9DF|(of@<4GT)>XGLF8B>Q~lSkn{Y^U!~qi zCeqa|oA>#v1bJPxxG-&TH*Fx&w?1KYqOA66DSPym`*pVej+tZTpF#><bWD5$pvoD= zO{lcbCa>-5New-$5bDhc9>`c|>ELadKKl^aIE)N#P@#{R$Z6n}Jzg$^WS%sXJ|I@i z4A5Zou)2J0EuY<qj65Frf&2wXI4zHF>TTxwe|aZKnmV{($Ahi(BdbNGf?;6^@!~fs zPS!WN_>8;-14B&Ko<qu13Te|MIP0|==BMWu3N;Q>E3#?m^9_)O2Y)98N^<H2sQ>-= z5mJVu?LRx2QGeIc)J&jPf_K$Miq>1PJ?EwMbN7QIR}FxN2IZJofI<HE<yd<Wy86r+ z5fKr5=#0dmD+B_uGkP8jE=_6RR~eJG6m6Ln6Vn0cXum~Cw~il(NN8z);HZ*jDOiz8 z2V|@BnP1GqYn@<u{32p^Y%R;W(z*EKRp-0*`p}eiD{94UJE2PuL37TlOZ!CQ->f}` z`_j|Q%uJQhU35o|K_WvhRtPp%sUFeKnS(3sL~+MZM3<wLlE)W$se%1-u?}Y~`NV0X zsK+W#xvx}cO=VGw{4JQP3ru`X);Phx&Z3ZE3~V8cIQnkL2V4+R;R56F%Acv+5O$IL z;Z^9&^6JtD!E4JzH9Gkw<ZvY+(L^|?Xh_e7q3Davcy!Fis3dXKZ)q7Eq?Ek<IPZDB z&}$W`u)6KD>v?a*aR!)zUV4amL~1G|DDH2oplD?8FG<{EAB#A(l`QU(D%ynozf+&M zT#)`S697yef%B<mrN_<o>52s5+B`l)oHpw8kxhZsa2&Jy6Bpy=8K@6R>^&v(W}~O4 z->e>B6k$xb*iNyHj-PJl($Ui!R#n#x5YO2f6B_{qgQ&SS`Q)9MGnO7hHN0u^!{04( zP`PJH<9TBrC{p1`=tukWXUz=OLsi_JCYO$ZmIq4PI%y^pR`2m`uP&aiof>r+pC4A6 zRn*mq9KsvMta^^lGRG|5pnJmngp27K88$>7od&iPuasvYxB!JzPC{p8xxBu`-t)Kv zzq0--Iy5mRzx!Or$6ZFu9lF>S^0X(rrJ)98HN9c}8J*$14RK~O13`T$saCYq@9SZi z#;(W9BKA@=gb_iutq<wz(dgb<4FPZy`e1qrGe!qw8CR35BMApBIJEosq&Y_ORg4Oo z%T16D3)Y+uV}Zp`8>-SEPVeD|2a&Ki4<VQ)C|(>RcCd=~zhP4Elg?w)?~C%=>3hn) zlU7)U?~)8aTi@MCI2Y^AC0mlf2D!l9DL;^e8&9$VUVk>JWW~V2n6sYK<PDKa;k3UP z;$m~!{fbSm@kLr%=DNPiXw4UqF|)EVa!3D8zcRB^VmuOcrb#RA+e!<;-7NOjyhf5A zaTI!*0OeN|(x_TSjOt0Ow~@G`qMB|nO@=oT&dznHgoKQ0u?dbVA`$2WOBbIBy<V1P zN_DCpD;opD%n*M?#w~Gi<JXtBiK>WlGbZ4VEr90E?L$~k|8?+JE;HKijPGl*+2Sp& z$NqU(xiAZLCU`Zn?CCtih@LQ?oc2zmew`^@!w%my)x~HaXngd_+3y{S!RZ$w*oD-& z8ZGwGVk>}U3T`eUzHW{XXtUtF=xmpWlr|L=6&-ER_aRrpt&vZX0bm=@1a86Jf;0y9 zTXIUy-&6o-H6}p_an`j~R{mBnG`m4rFaXInI4VeWT@LVkIO0kycKEutKI$()<}@0f z+<NTjWXRhsmxx5#>FlR^*B;7b*zh^gby*BBuA^L6y!~7S9~TwMNhJM=x5O!9KupwL z)YcnJD^neZd64kfe}U?H=+q6!O1|2{!U7|*4bZAYXZHW<YNOuGAa-cL7kwpTFB*rq ziZw@KVZ|jLJmgmZD{>b{H>5cIY7tyDU-<<gVZC@Qg@<KuLwlC3H7(&!nxEhzUT)et z9GcD2Uqku+A=5=kg4FVvdvn=G^lJ`SU)B9`3|)m!TyMg=)y>xI{%BNLiHzPf)t3RO zBNCOMYtUYo*m5TD!HVLhqrY_qXrYc0$1}NFq<eM@AHE2Ceu6(^!0%gB_LQQfQ!Beh zF76x5FI&*K-qELbzZ5Fv#P@o*0)k+AhkvkgWZzb*{WPDz!zIS?pNrp-Hd3z~R7Yg^ z=4u}0$iH*nWXsUdQyYyOQ{<xXLq%X<UeyKQ+q2_wKV;t#-}_Iuorjidx2AIe3f%*d z9tb<G`BXFy?wO}<oKPUhVdu>n8B%tOktGm7$zlF;%-glW$|kc1gA=Z<y8Wc}#k=M4 zTn3x}0UbA~O;!;&VGhI6C!})Os2LcL(c|l2LD3nKO9!GaDyzJ%a^veFmHm-qY}ChQ zrwGo&#VXxjzkZ<>5crTbJgqDR75vS`s9gBwd9h^<7?woXCF2smM~z1BhTa&9yd{jl z$$?g3Wmt;%DLjPyKEfMH6D5VwjMH{KyyA+6vujE{T-q~!_viT#stbKZ9=L6>^vCO6 zQ7}A`Br-M0uQ0z@`dv8J#YriQBwkBWNAr>OpH0UGcOxq`j|oI~&E8|u|MLPIHa7%^ zk6#SNAl^A9MYNx!UNCmra9&Jn+cxkjIQpt8glYnPrC0v}-aO5bkvHvk7FnQi>1?>t z(pjR~aWTkE!sqndu?FRkUA?QLNs*;2Z#s5oO!dK?^Ln^A;?f7!bLiu~0paYI5~YGE zR9Bc7R8So4*o|w>?6@tf=kw&ezOmug;&ak`bGw@p(RlS67O0-0v?Oe0H{_Rx5oT|` zpHdu7VuMGX!r}?8NRt}=fs7PV?`c9`u7udRy0(Rd1!~K~w#?cytZSup&o!a5?TY6e z&q?dUw4n!2IH&ekSU-J@KRPXPypg{QUgQc&SOyLU+1HJ=OIw`r{q%*~T9$xRW1&jR zn8?$7f%EHE04Kt_E+bA2W!Sg7FF6<RYFk+o$#B;vJv24)>oc~k!jy5OZAS{J$-GA} z0#Ao*sq*H%EG`=R?t`0`?m9O5e}7$G$}%>O_hdVbm(KmlP8cU>b>000oDKVrbpUF> z>e)#R6KpqHKKjyR{aUFg42<_jXDtl7s`L2HXR{;uD#0mNJ`oug@6?H&4{8!Y%wXgY zfB_oq48JzB{{u6S?}t@AjgD>2vWa|UQ@6R4o#=%5M{y$%=8wKwp;K`-Z(-J}{bc@Z zhD>jgs2Nj$bM@Iz%K~jmqDU1g7|*0ly6F56UaDR5M`Cegd8z645>#8A{IRNqrPGna zuhZA!;&QuQ*-T%04%f-qOAfUIO$^V`5-Ce<<@^u63=z88uM=5ZV3PXM$k8MFiR+K_ z0@(5ujMsO6xHrv``*iGxgd?YLg6IJEMHm|hQo_CdZ$)_A9IyG<!f7WA;ivYPp0FV1 zyRT>=<!QTZo>4tzbai&KINVx<aC$9dImX(&U{x&iS(>N9{t%EoP&nU5_;20=Fq_>^ z5qyC?8*4QYf~))1w#1x_EmKt>x<6P;es7jb$fA>xReA{2*Tnyls7)s=O;b0mkLQU0 zh1Ara9<;jUlK*5-zCNpp>bx=X4IB}C;iJZ=cQ`@Fb)ax?wv*MNwPk?8?{|G`B!kF$ z8Wi&TH7y-oz{3eN#&yM=Ag5}Ls43$9o|n+)vaMs=8<ttSbn<Y<XpD&il&OF@8YupQ zVYy-dxc^oMH_bIoiX2@WnP~UL<7U}&F&(>}uxUtIQ%c|!SDJ_WP6jP)i>jO{aUcp| z=Uk71r5cl0)lkQ)rlmHY4EOkjlSaQ5uZQT5ICB1sVY!=_lyd3)*<uRo@E_j=b>L88 ze^4$-`K=M>CZoT)9?FCq^47gsk5VBcB+G_M&3Nmlu1QL(1S<L9-Hhh*5VWMQsAw(l z<uRzF;^{+Gl|3lg4j41;2_PpL4Y1rzNRoCkxkb}PSheH+FR1*H$AP>c)j_)C#L>Z_ z@oqZ>dU#I9bG8XBlTK~#s09_c*ZVBD;7aAo1x@w@uFu00{r8%!HboauTe2LjSlBK_ z$<meb%;FLZJ-0I+!?lhZWi>5_*@{;14uUkDX}KKFdVjCh4;SZz%u7QIX<VAvYAa!8 z$0oNs7cH(ZXw+0{QPFpu(p)o4K>$W}VSRlrMg60V>hYOo+}ORH{71HIN2-KAV&0Y| z5%1@t51dEWiW6vPj*?~4|Cukn1w0%bHEZlK5_G*`L5+Cx%2HfZ@(<~v)sT{kj=jo@ zy9E6P4I#NtHS$eG67<p8$olKfNjyH!dERun(3O=;Lo!q`rmmD$+nY}i3E+7DjLT|5 z&6|c&rxl<#a|M&X0BQ9j=@56g*A#H4OBfhBMa%JR5ECM1r1WjUr78SvmoVQQj*rV? z1Or;>y-QB^_xBt3@>3emi%Sw+*87Ccv{yWpqmz<n4|FHs{780B=Cg+^NTdB=@`xoP z1HKj>ZR5cR8Cd+N&J*ZoHT)c6D&vjwUrL)E`@#^aC+3D*(fr7V2x&d5d@tRwFf^R@ zS@Ut=MC0(7_+GWO5&ki!cwFMMc^!`h<JX!6t;c#T-JP;(@3}ppQb)JDt~SUYU!7Ns zym$V?f`%rZy-HDE9#58T5<k0rQVx_PVfDv8y7FBJu4<FCFREx!B1r&om&(tdEb6pU z2|u_rL{x%RZeU^YZ|xivpP-AW^+m`~ktJ@51GunU4(9^^O%p6g$QHJ8?-uZ`t~q#c zTQA>v-fbnMdJJm<r(txm(u`Qd1Cjp6=|F^Y^_H%0FAbTd7>cxG2elv)I?-_QDjHq6 z_u+vIPS&<*(0pZn1jwYR&d0C<0@HrG1b18N`ZZ=lczRwn6p$*xvmZK)WIQC>g?ox~ ztv){4IojqwxHvf-z(Qtq-d8b8cXy{l)})MyN{jLoZOk_|GAevN5@&&IBl=c3FcBuC zo%(wV^~a3BF1WXr4Qd9fVTemxX<f8Q5J0_w4e4eD!T2{mmB9I|a!@W|4Y6QE$hpIR zmZ^mXNLD7X{*M`yff_Jg)d$G?;9%u~90=J9g`~#w=@VC~{WUZ<&m2Zd=f$jI_phLj z#w*h_5HG0xTP#*nqfNua@M?7v-k8_bsOa*C8pXfzC66T6b1Bpqn1_|t9%L-BQ43Pr z9e`-trO<(V(27Hc$_CC^0o)KCefUTGGGHvLrlU%jo#mdi;sB%wE5%}!-K(guPdw4q z6|L#Ne!cGwM;s!?$XASsLLYI%83xMlu*uXu2Ozaa?M=L7G++GwUA#Dddm?+n)+bBJ zpF8RykxcyF_g6E{U)t-C0J;$OZ$Gk)POd<>T5Ypf<14-739-^!a{o(#W*;9}*1kxX zXjH4=8ntQZ?Npv5o-MEC=9T6QbEialksd+hCf6xXAe(glnvjsl?(h80=3W-KelG3% zlh{0sKlsD4N9g*YszwdoOZgn#P7G>BXRo4pX5>IHM_su>Lw2^W1YuI&+YiGw)m!3a zYSD4={^CpC)2Vo5(%^{?^a1$_y=HLZqpSR!I#xs;?0*@1tDK(z!dQ{OFT!fv9X5LW z`0+I{C3IN$Yow$iH9pa!j;a_r<zzSsYtd$G^)@daVB^G%f^PEB<_~<L6#`z`g58IG z-6uCu%^o<`YGwa+E~?F@X#4x613Zo!?-IR;B6>QwR=j$W>+rcx+GV0R#<cR4XbyT= zF%jT>iT#(oE;!N?`5Tr8OBv;iU3t&miCAzXo5iWi<e@7???bwyt3wK%MyJC|-UkSG z0^ZYdLjYk?eq)Dt9I9T;CtfSeM0`t+Dpg@qjWmldJM{6bY!z*c524a_fB0`7y}{JN zVa$sS`dCa8#=}OhVZc0%h3<5eI9*yS>=+gWNn>qX-?zRydAtkz#Db(8&Y73P`qC(X zl=m>LSb0U2p7!E%rKC)26b?s@{@S`U7*K5ke{-k(_lIb<7O;(_KQe`W|Adw5wZ-tN zGfA#YZ8(X;1BFZ?yohawf_5N~qFYkhXi@3};*)!N=Q)_d^`T5{z*JpVMoQD^Cx8T# zQ)&Ee?70$cueAgXJnTB2XI+1NuIEVVNCd15qWd?)%hlsgR%Dr1H)_|&4wiO|5bAkm z?`N<{rfpDkorj!tzW140)CK8jojrIy)|s+_@onOHH7kt4QL-wS-q&g|-1Su2?W{`O zUN8-kkxM3V@BPgWRw@E*g5-EMy3JNR2Q%gQFaO%=*tHs1VB~{h42XZU+1<WlWT0T_ z5B9bl{#kg`<m#_2`D{OY8$aX(``Rd_fc+eVBaChKYdA$>i8)#rogem?d;qdxccQ`v zQ)(JTlp)GClmoZ%;r9ZM`S{!?Zo40wn<g+qnKmo;8`r2XZv|YQ?s*#)9n5uMsJ=-1 z!UmIj3Q}ne#j2{sOjThdB@xUu7}LD2KrAA?Z`y%8!hw!ZD2`6p<@;F2>9Uo7ztfr; zt>-V{7J!e}zKSv$gZ}6bS2;E!HvN|(6^A=jWoq7E)YhRT=nAYfO&x3dB^7W6o4w3? znxDhN?#HFWTgId{w51vgnTzz!lI7|04N^kEM{6@+_P;(F+MfQLZy0P1xL6nY$d4B- zO@+n9yoQA1&Ii*Mv#rl!Glb2Jm*;fJnYgc;<>lO^Non&)|NNr@%UK{JB0=vvwvXJ2 z5-7FV3^x>tMTImJDCWKRjgfHt$;&CsE!F$eE8-kJ+cq1IeZ3nNbQDusKi9k5gp;?9 zN={!}+PKyl>a$a8NY=|;Sk&aQ8edzf(T-<sHeFh9cR8V8O{hjdxN}A~w%lYTAcc*L zF`V?(wU{HBdPEAUgKg=DD`=12mYLCffX&W5-BPE|;{7NJ>|6FMz>c`nxCFtbe+<+< zX{54pAbtO)iUsbENq%(nM=ErRHNF1FN6+%V_jthhnM0=!%bXIHo4OfSF@%Rlk9$RE z3y%<o5}a!&o>R=MLl+f2FBC?v9SmkPYbgPU{+6!GgT73H9Y?>9W#~bcWa5s<abVIq z03(3<>F2ALr`D0im!Eq&PIIa{?srqjlyR&{m^nf+YC(1jn%}ZAa}6u8(9f@Ts_oiv z)>0JIag1h)asA&L)-2>qv*G*kaPlTs&h38^uea6257weWCR(hv{WRgE0tFQo%ip)K z@^xI_uDo1cWHB(*@&5IVJ$ws`85<v?tRZWt2}==&e5F}JAb-8RB|*#bAy6yNCew5B zQ>xo`5+*kGe;R4wgv8nn_wNC@&2q-<{fYoS4iEX}HgRGG=o+*>*_e6H8HorNVmG39 zCUuFt=e+K$>bO-m1E339WuPafi<Y&T*RXyP`J6Q=c9NVfsVMl!%Io|qpnRKw1fCB6 zmKF+T9M`EF2d<NoWU%d-$+3wr1j6V`Y|vMT0aUh>7C~vp>71|BWCsxNkK+fODMeVb zRbDBl`=KLey<rb?AQ0zIeFEJuOZPFGhG&Zz`W!jJKXGjQ{CLO5yrJlRc}O4@ZB-Y& zdCLv{pkowl;Tp<L3z{(#Pp-?J;X)#T*<2s3r7$yQ{QgoZA;S5oEZB4=%E}ENPE2Hz z4XnFInd%*<_nrurY0Y@@Yd}dqX>$7BygU(^2|SZq+E@Mke)28VWeiIWA)hS9PpKn2 zRmqI+k)1Z+Q_9e9VMY<ksK}^Kj3o)uFuA@zhSt86sR0mrQE{<o$(T4#xcUOY;e1Na zl#Ou3L@jmnpQHMP+q<2NzJ1Jk!4k&dZi6A-e6I1pk(WN?1YH0C3L)+4RvG}Hp!Db; zJttHoBuVY<o`<H;-NCiu_Ecn0SkIHznQLMscdu4wckAi>SLi3B?m<xrXsRwC&z!O9 zL@Oo)?~f$*I~|7$nQWP5*w-;aGG<omH2RIz-xfG8&(d<>NaskZrKh^)E)U1(vhQ=1 zXcVM%7cpQtQ{-Olj*{@Ro9x<ge$(hV*8QyTF?+Gn5^<tH!TjI9wy|>2A4)V-eO7>_ zOW?2wagzB~H4-`^*iq?@xO(mf5y%*ks2d6ts<4e^#wd$-@9}S6w_^!k*~zOdERWo3 zGA&6_h!=OvX^z(Sxgc;|7EB8r=JWH>^#B$^njra_eoW#xHt%t0u8C8pS<TwT9ca3L ze113qs09$E?mAv-LKR*G-i-He8syW20dPM*@uSfYHl-}zyBwOp*jSZfKa%1j6m}~P zvzT;^m=;a<l)b$@0B})OQhM`6Y+1i2mOhlrCrA(0n6a^O89DcTfp*FdVUhwse4Nqo zU~tSx>Z+%(W!{aRdxiN}ml$;H^Gb-cR*N9NHXEUaryMdmW4#v{Jz9PklN@^MPhRbK zK_*J`{tX!GG-{BY9sP?&GU)kD&}k~3@{wz+X1^){0|D+MZ#Kjxl*OV8zX&-prbc1( z;3`Y&oDc1^P2y#Hh--QCyd+<=+OTdcSEzu3j3P^O{Z4M&g2C|mP;qBkape=Q!v>U} zJ9nIV?Pu~CvRrc^IVzH9|Llds&Fb0YR>R86HkIC=o9S&YN0AMh=5XzL;)Fi8i|2(= zYLm<{0<9na4&VZQi07EC{@bmO1G-&9+c6OQ!|}P4l$6@Hhf*~EIMF;*yIzc5di+EM zd`vPHnxqMd2nrG!cynP=u{<mdqc9DI{0=oM6nxIG&Q4LY;nd(BMejifc|=a?qw_`5 z)8S!ZFAGDT`|PepQ6$^Z@#pUc;WMO^fAq|;umd8N-@+NN?vB>8s%oj>LcFob-<-vN zjNV{4G8(m&gK0VWVwgw``xAUX7I6ZrxME#7`uOKNs{6)?{fIBUDHgaibNKad!e$-N z)I8D0>J_)o#4RmpUfdtyL7Ut_^MtwRRPy9+I;pex|D)+E!>VAqXaPy3LFw*p1?leY zmhP4=k?!v92I&Urdg+#u?(V+hcklJ_uaAer%-(y}USVpci_C=!{MZExl>!f6k)hC` zp@le(B1wce3FHdUB@=$sX;p^duJG8}72Ma?bGGvKoH||{OmsOdrRF2QSnP!TLiHd+ zMa5<_7D%CnL@xe}iTGm~?Q|hwM1b@|ycNb&iCDhD;;&zvSMGb6SR|8k<?40c50uoZ z^~Qh=?!C>hA?AAupgq{QRy5k5E&TBDGq>iLhEaHQw0N$9A>Ak!<rih<zhrj9(iyJZ zFntvBNcb$2-YSX{xj73*sUE#Z?aXH|8Hq5MX4QEMe`jJxO$r*O@us$r#P0!_ejEA& z_~L3piV?Q4k~c2yV*q_4-AF?2SH`qed}R08U7gFAmWPg)ZbymI+BUCpY8O(dNKXvz zx>%?PY0<4b%Rdxtm?C+)PM$w2;|9MdrIlEkGCnQ?Rov@?6%BIRuU(fmurm{anErFa z4;i4qZt&;W1zIp<s8N%lMzNn`?zXijv25gWNLEWbf_du(1)JX(f+bkXc!6kh6y~|_ z;IOiqLt20Y^Alx>>KGciK~I9jQEV~ltAz-pNd6SF$Mt?lj)0&bWME)m`~7D4^Xnkd zvt2h<1ox4(ZS%qBf}a7WnP2fQXUy4gYgyS!e-Wh*)q3st?q^jPUj{m-wS#+BUyu~L zqU*Ze|K@#50kiBYO#P5PYPKe88P_n^`2)H5L!gkHWnRNl!73pdJakFz($o>V!HI$J z6TQOl*r?g{qC<kh+lAfNN-fp;^w$?y5!#)bud;3F-!jU87ft)c0A7V&T@YPWOO@US zV{F>QIPgYLYdK~=LN0ZtDE){D#&D!&GR*e|bxRks8uI;VdExdWM>NfQJI6(@7ZA6* zSeKh`44l_+TmkSNCYm%Z#dKfa+t3JgGdn!;{B`&-3d`up33bESeTHO*0*iYxB_ktK zpx@==1*kR^S}k!+>+Zps%T11Nt4+1s+<4h%=SnVS@?X;rdkDl|iX1<l^=sG1(YUVY zVr71SDh-|g^yMyn%#<+8hu_3gZHkvHiqE^vAe5!?vF@PWvUWO7B+nX_RSDxDF7=OX zC@U(wf{CjWpo_)aUHvyC>|P?Zc-cPo{Zwh8$`n=kS247dv~&w-QH#wM7$D2bIl;Yw z7%hb3;NL&D<Zk^WTfD+3j>$zB@r_yn_#N?O6Riq<`KBq_OhASW|M!M{E&pM}?1N^P zkt;^F3RG*+@HDPb1mQM?O?{`TbdHZ*3iIl%2S4(8>+duFZw#TZB$%XYmOHIh#pgiz zx9QS$zqO!m-;BJTo|c*#I-`c`Ai_!eE@EAJoN2;oK4nUAt~yDBY&T`Tv`wbvl}H20 zv8rq5581q_>d;P}m>C;!qSTbtva5=Uj#}shkpN{pi^ZjTgD_bw<>N2iIZ^0#+sB)e zPs4EyYC(#9q5cHiF3ct)m~rvSoO{pV?gxQ;LlYApngU7^fP-pWYLb`8(LIC52>xwZ z?<oc%Y-w4Q<u5%2n-5RMyQiy~X9m&ZQ0j}v?bj9<e4$d#Gd9Emj_rwYVMeo)MDGJb zS^kz|1^zkmIgGXN_!(Hx2d%@Xo&dy>DeM;Lj)8HP?OjoNe=HB4G%Cel<$0(s)3owQ zIWC6M=JkCaEWVnUgvnQh7y;F-xS)eB_n&||s=DWna$(lMvf-PNY40P1z@HIZRzk*x z^BG~zXjF{<5MK;=p6>s|2~D;a>)akM#JQZFp~urWL*1kib!(Ms`mo7pjVs$0+8M}3 zNAh&M^yKT5$O0)$+&Y|*ceB#gr4K*ekr$cfsfbQMyghAI(`$7WZ3wCcBWKFin1)&A zsYCy5#taDPi8WzHeYo)8IbLbNi!5^QNH(oY^?N7&*D^@m*ea&$ME$tUcQ<L-POuVL z{0&Tn74-#_4QT1%S-hT~X-^r1`lbZ*48H4^Div;KI89h7aT5GiboilB_c5KU-Pj0S zTTD)C(fYHV+Xjrw>B{hjE4{vh50}4rUG3-loSOGHr4LfFgo3vNK2Jrw0(Xxz`J`M0 z3C^SAVNQavE4Hf#FYAf%$ch<v-Zk8yDl+ZJae?G4|2$K_SAietd+j1Og0=|w1FdDs z6Kl@6zm%3p@+XZ#&wTC?02ejo!Yo(ui@cnb{rcMdip?3Gx^8=NyNR8{XuXAo)yS^Z z0u4vrY;s6EJTO|Et_?~pfCL`U>Kw93jhohTc$@(O%rdoxt#8{RpvV#VKC`?$-I)zU z1Z&h8e7IZph9i?B8beaHD{vBH74u$}4fw>Qw^BRgIQGb}A30{lnk+%isdEZ%(7Iv} z_us@SM#DhdS}7GyW*&j~Wtg=4?$$&e%Dw~P<(u=-T4eN^FV%{^h2+;V$_a+<HX`qc zIb8X6j?SerzAdUu$)!^hn@294M)c3#FWB+pT**HEM~_n#rWg*Dm|R#Sn{Eb2x2s+^ z{l!QHFF{c}{%^co^^(B>amR@fgs!jwJsAD-pFBf2`OcqStd|=jDWsE_-7k%UP>8xm zoYU|3yj|H&E9zQyZrdc}B{?_gm%10*-JM21cxh?Ld~<DG?4(K#E3*V<g{p}ru@XvZ z`M;(r&n&QIrViS;-d+>3)hf$9b8!yVx9gGr(|`K1JYv1QgZ1~uBYFhp14nNqbWYB% zlx!c(o{tO9`Jz$e#o0bzA>}!IfFlcE^@3`D*~8rwMcun(U3blG=S($WDZ`9==rGPw z1uebdd^WSmO7V%Htyp4<X|t)lvVo&U7W*N4;uT5?TA@rHcvyd9Gcyp+n#$wO8X6k< z+-d!>Y0ZtmXi)ZV8O<Aj1`4Q)%NvE<-Q7orruUq`c&-a{7=B7$?bly+K}Uo|2o#F7 znZ~_MmNK~}V1?D}aEboL+*gmao>x)Unw0yOS!f4nJeJQg$0u2~u$|}0DfJy;)b+k3 z%6C17WwyBz9VEV2@9<cGC&U8L78x$~D*hes@ju&hcW(v#$W{Q+e|BGuCh#XTF(?gK z8!PI4|J!%Kw0_wMVRHO^X3~qr#!UN;=lpL+>_VaxmnH$as46}h)zS}~&E9A}G1|nb zO3w+gyO!q>8hSTt0e>8uHGO`A#y*TPG(wic{-oG=1j1;z{HdWFL4V-L3lPXaZrhGn zKs0nXxltaLkhM-kcCKrl*vl8i#7Df(oAm_oXRSx1g3$}Y?(P&OqHxHq7f0}On0SM~ zH?}mpyc~>mug*GJc<%o^wO>v0a=<yWm;QZcFt!vnB9$OT0pxNf6Kfq1Ubk}#ec0C- z9FEv~kp%tQEcpthR%KRmS_;&fjV|wylf&n%7UI(qe)OLH&YAh9Ky#3Q89i!CHD@hC z^Fy#w2!4+06jlGVHG;|a1tXjPhja{^;jx>_SF(jQF9r|)&i<e_WxM7u@!fVf8Czb( z#}(`6^_gb6Tb8@Arm2OB1F1qKV6oLlD}Y8tAT=`bu+2~8uznq!zEZ6J<`*dkbz;I5 zLBz&4O;(Aa>M2KCGG_@8((Z3DU9QKw^XYcqRx~kMjz?(zS?V3&ns`^}cM+z_%(K?g zGY*l}S^1`QC&sFw{fNVDimjdg`HRW4vRRP%QDDB0y|(qnXt^jccH#A^7riQ#Gim1O z=DoOGF!AU|-&aY;jMRhxw{}AL#dhWV-8>euAsHzV+Qb~?;q%0gxvbc|#s`i+*Cd=p zDat?FkuWkM=TC{q$j~dLB6jf$WN}L<<Ox+V$0cPT25A{>Ynf!D`ucVR>}b2jc@k$k zO>~8f^FFe=_2Ebqpetc)X&pZ@JI)?p%6FtDOd&-kriXiXbqSh`OYL?%e?>qD<sjm! zc%mKg4CTa`vA^Pf!mnEr+GEsBUy(0Wnkv>8HVT?PPBe~u6Tjz*ffu*2|LE}jVqu;8 z-?|6e>ko5Pi!H616XHeEV*c%$51=cs<I0W>)iU#|W4rGL=4x1N8r&r=&@GH{D?t1h zH4vvw6!T&hjx12+c0P;lRg+xnwEr`Ia>M#EcXz)vwx@tkiqr;dOKjWkvY)R{>AuS| ze^FVCmFS(<W0|*SFP#sxX(dM&__kS?nc{Zvv63$rg`Xq+$gV3q-L^Azb2BgGQ|^-S z?-ePIbjP;H%XWr76J*;9&!(4WT9akp-NY|zloTA5K`SIQYxJM4LpW&^^)$zx-=5R! zs4^EKhIet=uNQwz!bDeNKzP~W%@uMX5`J>QRV+=YWF^OP@TxIV|J=0Vg@GFxRQhE- zO3&%~i1BAPacOC3eY5fRo9y+idUc}4p+cXqi7jNTKZ|8_d42Qmx(Aj8TW<-4EXC9< zId0V6I{YV+pB;v7W2sE}!^QG*pY|PM;yyNBDjf-wzL#DvbP1?>N1Xc(o5A2jBa|JV zB3KCS1sd-G!J#BZi!?SSBSU6SE>p9`P_yF<+j<TL9omnO_fe_6d`Gp$m&qrwmVp0X z1dJG(iB3i6Hgrvnc;7INs!z)|lBe5KgY!v);8kDnuHV0L)+}jf;5V$H%%2L#AI4@W z<2i^))*nLpq7%JjxREQK1(3y<C6a>@&jyb*Q<%yB&jskvV{AX~Ns2EVJVAebc85&d zp$J~7?(D6vA5c*xm6)8byL|sykes$5iO*jgBRk;}NmMak3d;C^CrXp`OS*iQ&hHq( zcfF;m`CKwlsjDRUa0RaKgsoGoJ5KHK!Uh$K9}XR6pLONEixEV#hCIDaaVs_S@0&RS z$`&m0^R%J|7Y@U}kIF76{o29H_z0KwB?sEeT9ZAwUG_r?o2xB>A{3>6RDFTlMJR@Y zQeJ&t*h9A0fA<LS%;^lltNdIPiMeEQ(a$zaqZ<)3gJP6XgMZ@aun{*e9`gdUMA(T$ z`wRa|xj@}9F<EiAd%-r6F(4W-QW$GD=!Heb=M*SUL(`RO`(?Wn?Y1&5yoTQ(5rWdD z0S)D2-T1YKI|Ek%{F<Q!1@fnURp*4Lzg=1QyTsIjRnYS*+}FyaV!}*!dpB5CP0m(C zn0(3cvvQKJ`k7Y}BJO)RC9E3xBN*qwcXysg5(_6KWJ=k1+M=2X9t!*LjMIexDpD)& z?szH|3tUE_9H|V~&;53U(*AsyUSKvqJbvJe3ugX&N@h}#3>n3pKR4+bUA9P|!I|Ga z)qZseQ|Uilzh~fm47mB{0K%eM=jz#RytiFvB+uC9blLym&*sqh;FdgJ|Dh_K+hZzL z2ur%8WJs@lMD07k9_s7wpE{hHF{u8O#H1NAYGL>M;qlN^K~nPK-dit%<&#d;SF@P1 z%T3|e=z@BB*0$^J9Y=#2jpnPCg?rnnyV#SbD`fj!uDz=P?z5{kylN2Lj!#zn4Z@3% z-jq$Z^?P`Gg$n*s>rey^O07lz0yLEDgv2|(FGpBBatBe_?)$NWd7(<>B;~?!&3t5= z1)`#fkrQure8NG9g`Uw_V?O$(kxSJJnt=;8X7?pi91{VLDWMad?R+kK_&IqaLCYuo z8;%Vg7Dc>ywPj&Xg!feI^v_{WL>ZF6r^BH}41Loudi6zJaq5z9)L&6olac;u$LjLV z?2AOHn(CZr46yiI)WF!iHxBUF9q}`T55L?05^){HOH++_r_Fb{JrlcsdHjLNV06B# zW#dnI%YOUt;K@%lRrNa03BuQ>hh(p}EA)X3F1}jXay5df8m6vi$Dew5qTI=!aTIMI zY>~%%#&~!=k&BV=2qigiuC=}vQ8k5r&VxrA{J`yU0s=spns-}E89el(vpUeA{W6d~ zNJ@`J6u3tW4vqh}cUQ+vMN~Ya%d|v6{3qoL3cz}Nd0)xbeXcm1_BzC}J71<OXA2sq zRXQ7}>FCHPC<4ilzu-603Zjzdf^IQWW5sXG5y)FuxC8AkNRAGcRFfUrSitv1v23<k z7a5c|$gVEUw|wpFnUDs`TGNAQ>(!d@hiu>BAp_y1RvYdGU8j#ID^3e6yzWb$cZN;e z8tvO(lB)G&eFRC`T+H(44mh1wL?~s_@JTAjyqP(0k({!<lW?N>0y&P@jiqcb6+h8? zXCA(kyWc(}ACgKz8p^^>$8Rm`+)4(77^VF}2y%PtaNS?_1xepG=2M=Dv>z=agYpQv zoVo)L&}zSaTFVBbK5xqdC-QW&8eL-E)OR)@EOmPgOuj$!<=ZXgnut%GLu=6yQwt_H zt~H`7$eXi7fb}2xvl|Zc5B~UQB6^L(gBv;jV_`2puNK$Ix>+_?e?6;0vne!S8}at^ z54v15yE2*tX<}SToMZ$=R@k)A+S9%fBi|d(wj-A=x9j_2feu2D=4q8+g9v<+#$R8& zy6&-FbsB%_`@H#IUOH}Kpi4-}k<hTDIx%&|$z`^Qd?YfTJ0y#uhXh*)DLuCflUj8z zq2#GAfka}_{=DJYf@mdwTd?#=DuutIGFF5|hf@q&ej<`WqvC!4;lqQ=1{9(D^MP82 zJ}R`7<7dZtt_g^Zq}Y62Ofa!7W$Vi%j!k{jwt6vK#@pp#OIFwS4#kP)kz0R#he{4b z5VsYbCNz=zt!^nss<0lXE&xDir~#9;*;tciljignG{=7$;I3j`IZ9D@GizBF8*IpO z72tuRZ9yRH7=k202{nUp{~^cF4l85JU!L90dsc#aDMkVoh<Y)JquC-V%dMoY6uv7K zwMxzKnS%mh57=I@2*b&k-0!E;AFaHEwopn%h$*_KO|!Qy22CA-D|h_tmdv$7>hZ$^ z4DHpIi}Bz$(bD%%ccpVu({UAfob@5fuvdCsu>pM|ut+$6$^ZuPsUDY?Qn~qzYZqH2 z5ulbJX@#TYG+wGuL!_36zVqeOQ_p>e!nWnbHYghZ<0(p0ns&v{`A-1!0p}b9OxWNC z1qzWs3RKPqP1m-fV_}W{6?`ErO81AmGXht6sny3_gX%N3`P79GJp#y5m7(0~#9`As z@3L#T&AYnatGgOna|eo}mW;-{&<QO1?ISy^i=BlJl2URTaii6g<wjH>Ze^`v$vSRs zrO1jbo-(^v7MRs->H8|Aw#8nqaDeE5(S0Njc3O&E>~~@vrzyqMA|aewB^4Fh`M|g( zRMSb@J3^x_F!E?22m;bCKkMh%T6(XYFMYnz9wS=UqLzjs(q`?D!TH#ib;l<HSLU5o zJg^6Nw$CYCh&AWs<7;W~*mZ2l$amb)VGM?dnX2(Lzdk6QDmD595qjZZTu^KjDxX)t zT-^^lmUM4iAxS_zKC#izw7&C`P5f#$A-vgW8k^AT#Cv4@@k=!C975&PY=N?evV9vb z=0~inBO>XC$7Rvy$3Z2Jo6}Kcr>tV}i8X4~G3ny>KLzsUyj0TOh`cvR-rIWrIK%1~ z?6K?Y!%zM}G5=jh34>Gw-=-bRktqxg*F>DnbA#s|he;loj$B%ihb7)?EA8*v?_Pr= z2>5Ft72l)#xj99+DWdp+SE+q3(t^{$M|G!-egjwXL@7Zr%N_@9rLvDxK$e3)XEDCE z>idDl0w>p<sY^^s3l3~y<<D%b_vfRh^WFhJef(S6`qtgiZWHGd;VD0FatiYE!}|14 zj(zag{cgk4&2<XBR-L|ZV!y_~;b%yOZVKWZ(U5SVia~W1>HZZ-EIhq-T~wy$ZH>d# zr^b^-K|upF@NBpb5Xnk;(FyOY227J-OUhU3B#w#9Cu|H#S@8d_ZO%|^CIpU|Zh-*X zzfo;x{CQimXQNRphgv+Lwv4p2v?*8r)ybrJ2_`ryZ2RJUFA?#-p{y|()nD<tV)%YA zpGmW@3LkL9#Ht)0WyRsEs`?R?k@M>zmtXrz2h?x%^=DKm8955J{C5rrrN+)Dqo+1_ zi|xB8u+bSmROZ_;;<D2tiQ(HX&pXHm<}EU`jAT|^4~%KcPJWqLX>7{nLKWi5m=b0@ zaAx~7#Qc{){>(?@_k*Z<VsM_9i+bB}CCl6|py%gviFu8rJ3l0dqX9IH0yj3?hQpF9 z`AoS%_q~XZ*^Fq#?ElnmK;i&enS;n+Xnj2bs?j7-;so%^aCe-?2crndIPSW6BMr$o zz20mQ>E((JW7no*oRX5e<@i+tRb+w)9WdEy_Gw(@n2)Ndsll&<ehiGKf|uvvrDAuy z<^-ZQT@R$Z^WS_@@9*L}yfHF8k$HGV)f3|CJn0Cgr<?8Vv%jk1MG^{;B>c>Tc9OYw zuBLi6s{R>f$cQ_c>E!85PDc@njIhC%IXz-I?){fV?X{u90D8Gb+1MpMHci4n5(any zexnX3FkMxlNk%i81z`hGUnRp(r}O|^0oDMn%{${3HmDbg!F7DBONw>dX)pij@aPed ziDypjyL8Aot-!rtd<2;zGGF)bWmsx>Znv!yM(nR`IPgN7@ZahiKxBbfLQ;~WjCwke z_r0LO%6**>!a;|<v`GZEE6J#@=FoW8f&r^`4P_C*<qNQA0@axj*Hx_kIh_MW1-FDT zcqEQl6872oDL^RVc)4zz=j(A<V88L-j^N^p-G%k5L$eQLbqZh=;H+#1Njz>%I&b{j zcyi;`4FOhIq7Yq0s$Wt1AOv+P>z^hE!>W<l@;cT`K}Qa&i(Z$Z5BDZksJF4NY|iT8 z<!(Lwb^()k3YSiAR!l)lYXm4y{B)}R)==%{%mkA8MvBQw{k#ddkB}?A+W&Nq|32LJ zQIWY{LumLQb9jFxd`3*(@F-}<TI+?bI5I0@ZSgv?a3*-BipZxW2D2j#h;UHxvf*3P z;x;v`?gvkxv*Elr{!~lJx}C88MZqXic~1fJw|0hsH!}IOCAD(t>E2`v7Q*A^VDNXh za8F%N+ER%KDO$cb8fg^d?zndp&6kzg)-MY(0VqBv=Jf=an3$JC`O)@+t9KX}%lFNN zisdYa&YPk(<as=A&mRC^?Z2!i!@g++#^k9BPIwgdKtSUm*4cN`k&2+DlM1ZFOZs4y z>@(rFvikjuJE0%}ah~xBO<UDH{)|mKe(3NIR{BhTy}KRrWh0!X{+|$xP^ov1Da;N7 z6#gWX$0io+!ZJFGe&m(Pi_1#6#y3&cpUuv~+r6Iy>S9NGKNcYuOSjjFhH#1jlWU^V zl9C*|bx0dWo~GqMu(NkcMgy$9mziQVuRe2-FQ2x;)J>}P8|wbhA`oOwJArZ^<4PPY zPMH1iK$SnM=bdcsuV2hEG_)TFRW}R46MV7N2dDf^BVgW~lA(j`$)%#WnK<~zdho(l z&)yAc$wdt&Gy?A<(pLRcJW%(Dm9CB!epwy<xFBl+nx8{sz~c6MiSch{0>i4&{Nj@C zFc2&?H8PxSa%PR~Ba~|gpnjA6Tb}4RjPa+fmd!!j<VpFCLD*OnK0M~0A0FA|DU_zV zjkn02<^vTw%fa#shi<1Acua5!xbZ#);n{wBs5M#Pu=#p`<BXmeIw<Lu!v%;Zo6W96 z^Y3vWj7^;pbv=grD>NE{R<+fYHS8f;bdY~Sw+Ko8J`<-*CL{h95lY6w<&Rg@5(AVE z;cS$0MXnQs1+EfClRsV~usv`+GLf^_#hJ0eS{~hqHJ8^s_ASbn@4r)CPcmP9_c7-w zHi>Ag;L%meT4z#`5OdscEGE;Vb>FM=t-9rHw+1mJ8`-2Q{+9&1u9qMxGk)KpmrcV+ ziRGGYW58y(+8qO4!}frY4)ssUmc*bvuzL3ruV^+~DT#NZ6<0x}*Z*q@yVEs8j*2QF zqc7`t73#M|aptEH32DQ#QyZ1JYe|BYP6y&II@4_)2X_U<#mbth{nfq!nOuDL_ZSeH zm1;bMC?IRFjw=bdv=otm6+2UHv?R7yv(u3yJoy=yt4M@2)Df{Xvs6t*E!>z!s84Yq zoT;Pl0ZVt<bg;Yx(JXxXvJr2$(QbXbZeo0A?a54p_6wfB2yOQtIZ=4vmkfU3T~Gk_ zfZd0&P-Mu9wp~a6j6DC?thTM$il&+PEy@QJ@~jxGc^A*cpGuVR4nmepl{zh~=r(CG zMG9aWWLk$Kh+0xrHK1Hg1?X-6-0s2q0sH|!O?*bie}LawvwX6T1PcYpKlhm%@3Y;; z9e=WD6tClo$m_$9QHe?!7(Yol7<ltYG>J?S=KyOsbgmj4Eeh*D^`T?wpPkOG#s3_q zc-FZ#9hd==5Sg|+zVTEqNZnRv{_V~hG4J%a>*1du`QfzVPERNo)oE|M(DUxx-2=#s z+(B?w%VnA`@CZ;QeFF44upE=qz!MDaMH^PiI9IQ$tz`|%1@iimS43a{9wA0%Vq(%0 z%LDzBnA!3BmbVgNHA;GKpkT3J06dyFNtxFLMG!Jk=o(1CRfD++5d8z?l<n&$z}&Ze z#l*Ai^OHCOmG|c$Zu%FyUBF-{1|J1DaDO5Fcn5Cx<)ko*!(75q^DdEc{<yMK-p9(_ zz7xU3g_wJX@*v)xrA$<KXi|QkE`3h)yoyjcnCywcgZu&Zns*6F>S1JQ-~&Jcw$-}N zQ{-rM+H}#NGuO$Yb>nAAIGYD6y0fl3!WlCjDcf<ru=gL*R@94CvnQeL*?*Z&kydrw zYEjB%43$@R;*yL2PS?eGFACe{^^~Fr!Z(g|xqC@bO-&pK78aI}pkNMoXeh8VR?<|Q z+P@8>#d{SH;87$Msb>Ka2B&E@Hc3fYt2Y1l=cDrcjl;SBR)>cpbS*xI3}An2%6mag z(Jw0dx*pJcOD3eCs@e~n*oP`K>ryzZKFt)#hKI4+rF>1CG8*6Z!-*E_kT0K$$-s7< z_L_(%Me?iwFE(iZZdBZ_UgYoKG6xnfFp$4$3WiD1O4tfVOQDg9{9Zn5@8ybTGM_Q} zQ%1W~@2;FKk~s7BKnxs|fEFp#4$B8P9p#ywbw-|+E73-`A}xmg3=4ao<@@U1`FKe8 zi9t&Qa5c!5U+=e2Y+DZ~4GqV1oK_<h`xU^NIf?*1R#M)JThL<c-$5hQ6yyE&8ILac zZ5V`~fOnzEzZ>x|@i8d@&1yRT)9O1=GBD_0oNxg24_NXICl0<(fi=Y_yqjBKaD{t* zJgR>7d`-q5TAt|QM=Ul>7iy;{(#3=VPM!8gl}%vviHEuaNZBo~k4Lc*1w7aL@qGjH z4FMA529-92o7=xWesAmjWCtj!XfwYQaWDmmu@M1>jfsal{LTAC)PJ9KPe3s<-VYx1 zKKONp$1J+4)<)Ur1N+66x7Vkrlp2@g#bIT6zTwKI^++IMD#Xe%0a+wyH2?XNB#-{; z!<Kun0;PeEvEy2)to(oG5BVXi{QTK?cI{}9Vxw2p?UG(XhA)sw3D6(JI&KRdsv17o zp@)i)k3NEx_~Oa!uWS=XO1q9**6`ORX3K2LHh+*GdSM)j>JU)Uxb)yN<@)_-s!lfg zX|6ashr0&~4^VP5U03_L_VkDLYqsv6XWkr%?f8}LIy=_>61@<XQ&7e=a;w((ym%DJ zqzc`guDZXy+(}B8YnwGLpXj*nBpxp}MN^qhP;`n7RDJpf+*D8{t1f}st3ZuuY+@2> ztjSb{I9DWJz{<r78!?cUFkH^WKS9*RR61A^qpt9C;Rr+i-&Oii{dUIyMCvy6O)U-g z7f*H%`@MJ3_nb^!m$blaN1CZCO%`wdV&lo~Y9+i{G$J$5A793pl}4@ZAfZ!_+x2ui zPMWdXoc;2TRdsA!9D2h`%^)FJSI&>YtPEi#N6XpIm144%c{c@5<1THywU|_KJA$zk z0*=As5XR0#Au3hI<MGk4b=7j{6K5zf`Z|<Z%xI)q2)@L>7d~`uhLtZf!dR78?RGTj z@o#eU&RNZ$1KqUaD8a_{5w~6Ezyp?!kfD;}YynrEuy(!`ZE|KS1#w|v;lHm4k%%wD zb=|v35cA)v^s*mI|9tj%4;Pc42Gj9tQ8uR>DTAP%9-)JS1F7bGH0{wFfsv#LX=09w z#Xg%c{!fu{BNX{)C1hHL>YlBOFe>?g5Vf3~66i{~byHGkpRVi$JrBb4Rk=OFciP?= zfDUQfcH&Z%=14%m?YwaWlf8BK)bd)SjhCq*yf`r7@je`Ndw18d8wQKn=h<z|<A?zW zx$+x*0rkP_a+qr6={Mpu8@HHEyaa`DQ6>)zFB};aRj{BxY^d=PCOrZHsVI+DM<`!$ zWPU+&fIMHB^ci@%kI<I)$5RN2(4D{JiAGcxqj(hDKaNglwBN&hy~CH$+Uq1QEC|+e z%JAjmd{?S6pouZjz47a6uv*&9@peVb`5TPj@0^8y%Bhj}Maw5H;IQ@dg<_;~SgDCv z=X~mVeWa^1n=pNhNJS)IDeHcalnv?4naN66?*Jj=fbRw<<s!A#h)Sguets2e=0)0X ziuCuFY(9@0Z9_*ps-J6E)dE63fr!`G_;_KpK{*@Y_I2;xWxIAEk77OY0vAeb_-U(2 zY(qmsZIP7GB!;c43BH{vDl-gt==<v~A}5d`ifR^V_p2HNN`n|rxr0(_%uD6Vud3?m zSA7`r%-)aRfuBe&?6U7Y(86~<+1j>0s0AVNzvQGs_YL-=`l5ee_qts&g8*GP+;|CF zCMh6D?&!x-noRJxxBEp4m-U}!LWtr~S&J4896BKpX$37cu|Y=N*aknh+e;H^_lH0; zmXyu?MQ{6U=g4u12|=@%KO}XU0h)k51~`1fvQ2A}IvI&wpY4o)=a58(q3k>3el;sH zjA9{9%t{k30m`eBru8Dgamny@=|%kgugdLZc{ZOumS%7nIQp~9<jepLlB-g-Kg@?u zK<kO6?^Pp_#8LXQWVB-DOUG?Y##&@^febK{!2!%hV(1o_{zU>t5%6N+IbLnbzK)0z z_sU@6OP`o|OAD2<$~pUmfJB-eA;*jJb(aS{P6=5$<!<#2g4gqI3j_dGhWfl*A1uH9 zt$`}<7b(8R1n(aj@5uQ|ZSnO^@0QIlI$UcyI=U@z$4n1_9^~*p1jVB!2*3pTZ?-R< zk3(0H%=>YKt~#Llty{moBi<zXHD5x;>MJki`P1Ul-Fsstx04eT;2u*lC)H}=%t=$; z0Z^QzU)(y+4NfTN8$+<u**+S5PEJ`O`D|0J`<m3MQ&9pxMFh&{auulU7t1wjwyhj* zk1gwEZo`?nHgkgsHzQr&2rQ7euz^f{8(O;UqJ*A~uGiXj5#zv~^Pfs+f2octp0OFT ziMw@3kurX&!3Z}^SzyO{x<C>d3R0~?qucYW1C*U^V=l*@L?ps?{|%QV&8sJ&M}TE0 zPXw$^8_9V5n};OcDWj3fK|@0cHk#~hekatV+zl38XSO@VN1yo`n>6>KL2bRS7s;^& zs!~n*_u1Co+Y26e03~2Zii*PY2BGY&!4c-kcR@xH{y+UiQ6}DR&kj968I-iPrr*>1 z4&xHcX4xi!UgZ_Zk%>zy_6`>D+rM;@6c&GAX%KF)_(=09RK!Cg4_cwr`I?9?w82WP zW`Frtk34|+<5;H#qys{V6jZc)L_`kmp4`tW7r+5+DR4fPOkV5F3sE9XBrdJa!GOwM zkXBWt@cR~WvG?Xb&I@P2no5eX4P=vG1DY}rsstfj5zClbdXh!$%|`^rcj59m$0gN; z&%{!KsQ)N+tRe`^Hh<XJae*m?7Yne*!3vx`nh2BG4KO{co=e|fG-AHm9UnNbx4$q^ zukFggPE_)%$!tajr&5O##Jz+|Mek$Vb-c0yFW*?gcjLtKY4{DYz_NVi2n`ytZ7gU) zz4+J1_d)hw@rSlqJ&-vGoOIAlopkn#`}q;LT~0TvEN1YYnE*=tzs;R=8>$#TK9I@( zP%8aL7*+Ugub`m(kmeRA3A|VVoXY`0CLV?86o9Sx9ve*9mFHzLa%WOX!Hn%UkE0bj zuT<UNLOR?7-9%`3&`3!E2V#5sBN}3(?eL(Q?wByj%3vDD(E+!$5WC|092J@=JVc2? zB{02v_(LXY%?Y&4on0yG>IQO=M8;w;8f^B}33t8LavC$^<`4KUV!zX6RhE>DzzB`A zXEO2e;ZxW1Mxxl6n@X&PN|6;)lDiyPFojV$c@a~PC`23?f$A}YW)LmT5}w2v<9VnK zE~RDy!tdD3_;uRLk0hHaBATKcpNs4Ip&ypxvWLf(2L12WMQv@7=M&_pRh^Me!DY#x z%9}aJw}gQv(OJo#v&1uRMu%z|4V1|>*w##rNlEJuU?CIQ*jJIVj7tRf)+O7eQq;kL zWx2_2?~rD}F{h+mP`_n3Ctq0VnMSufHa$I@82*GCi4I<9$S|y573VZjrL+MF8UY!u zR7EWMwYctdLUhIbNF~etl_E}AiAzC4O3ShRzCP4^0Sw9b)U-CYY&&;P4+c|TyxPv` z0B``NI5%FsI5y9`sX5UfN~xHca=|k5->ZwH3V{|M&`;p+^Qo#KeIcM}UV>zEDwu;M zw<h3QbfZc(iO@iF88F4$i%Zx4+4ahW2`vN5kXlL=9C{V|Z5hNwRfu|a;e4N0L5A+d z(zau70&0)kxxq=J-{xWA;cn)S?AD+000ge0veZ{BE7B%rA?jR5;4v~f`p-c=^^5E0 zHrEs2z>~{CF=@6a5;xNp6n+M+P^N;7I3SE}!eGpb1M81gD78e)APo;3ePNx@d&k>T z?za)IJ-j8_EuBN;CGzU0(MZ5u0cjHj<QhXDvWL?#V`Q<$2o4wmpndSV7Gs0E{WnM` zT4?E~7&TJPIQ_+W?s#=2Y(Hb%<+(%Wf-^Sfpv81-xt|R+PcCWXPHR|yeQDwO{>BRk z+aR5-hSDS^Z3)SSHx@Ni1*|&-bImnTvVnDA@eEnwh<!^&0J0W05{$n@fq{0Xh83&B zd|%A6iQS!I(ZrtFx?c~o;(I7C6&gl-ou&OKCHjOj^N&{iWrbOld~~td*yW`G*T`BY zT=^Fq86!#Le^oC_H6|3%{H*?iX1v03Sz%EJ!-ly(LR=8K-X^W?`b7hu_ww%^9*T)# zMiTp|$jQ|44*r;FtjhiTAyp_+IgdZ}Cq=7Lj4>JfY7y>VB4f%Dwy&!+HkFs!j4*&= zQ$<&I)s|@Gd6SigkO;jrz|9G97$M1JLHzXYNwdwALCn9#JH8O)4p%8`UbV6e4CK!p zTAHfxLHR)dJXwKykrYaH?AUMAz-TL|f#+edm*@4m4m9|T`jIE_Cj0cc4I_AFb-!^W z?0x6GHQzep^ZV@e=;1htyVrcsFN~iCOgPAK<nk@qwLqL`CTLLDk+1-cux)DFs3U+X zl#*WH>t*iK_(e$`sDrHC7S8(44?^`bw?}4>NI8x&w@vWq|K-opYn+QdQAmSD8Nt_^ zf-)<X|IY=0?I}E=ZTM##P7Dv;@<T{qgaP!idoR78-QSvVkD0fZS{5uIDl{8@x;vR& zU1yk0nOXGhD~UYenqP+FsmOcq5W3i|57gCV<&-p|DqHiYb)=1i(YD)Sy)VRV8jXS| z;m}f{RZZvr@{?Gw90?1KD--#r-$15+-1JwB<Vn9wZ8Z>OBMihxCx?*Z60#!YY7N?| zwF1NfiK}CgO)K3&&VU_iT&iS+0R0S)4k>M@<sYm>n@E}{rAUqWBj_75HVJU0oB4LK z^{wZ+nSlP)0gc!5X7|<etUCuQUmES?9awu+GqwIQJIh*aXFYTOY@-vbRG918rKo|f zwA8!_2V$ZhTDXS~KSQMINV*?De${%!pPMLAp#|SJ5W9Nu+2zN71E^IrWPYgpa1S~b z(PeYy3F%0JRN;O@nu|9IR<i2m6<o})F+l(Io~nW(rDX=yG(lprjhYECbP&u{$eBB2 z#*Uy)2n+h?ax>ZSM*TeqTQBQN@|SfVxM1b)RA>%|y?a;j`YK`7rn-{{-!G@0&g|D$ zn`&&9*9%N;jQ<Wfg~*Q!&?d&NwJ_N>g+FHyKxo8I(=29t|0e-NU^$9bxVOgh{uF$P zeq<9Q9OZCDDT^^09G;fFM>mQJI-edqdzRvt?Tl#>M-)mMn(^n%Z&)NK7>+)Iu-N?@ zST8;zx#D+S>+9c4X%k2GJ^yH0>pWn{^Iu@Qq-P$WtON@&a+@F-iPr1izxa%l_t+>i zCI_E&0liIlYPRoV=(?}2Oaw(L;X63-8);GjFGpC~2IS-!F;NRXNsCO4yFJ(DRYn!s z8<vM-%ShOkyvF<Di#+m%d4Xg-VNf&9?;h8uj&4Y5n674l-QfRtrk2^pG@!DlB_RJ; z-T|FBqCW9O$gu_AzdK}b3$PQ=cqCfH3#X<$&o$;5Uy{D)`QoJNbh~5eN#xC~*dF_c zWE_&?Fv5bkpx+0Mg79GB3Nkrc$f*i9uVMFjjd^MuB&SkwOED|O{Dn#jjP72oHJ`Y5 z`r(ES`QV}bUOZhVOSRXHZh4Js&+CrAgNVx&*?G#o6bx+6OMIyhcSbdo0X%sr-83-4 zGolun6!`V@3$`=AJd8B17xtX<r_H0y(b^iRhs@dYrYvLex3j9Ia1PkEWdwRYIGJ6X zyuFIMj6+VbYxPOW$L%D}9WSPfyV&|HDw1PHG3$FCxEHX((C7wFI!!K8=V6kggPDdh z9wCr*g)McelnQu50yjU1q<i+-rpi4HZTKKhR%i2uuK~gl2vUhjpoSsha-}9j*rv#^ z7+T(9cF&)*JsgJ1<6#yzXxCQA!aVTU&f@Z-hfY$Wq-j+Sn6u~3m*f+EHnQdceGOW$ zr>>504;T-1@7jmC7KOyek&n{$khgH}K_CaSp$9Hme_r$5lU1XCimy2JSEQc1F-xRY zl>+darR;a-X03865-$IdTGFzS@cqdeD%G9-W}T?5O9CsZF4mUk7-t09$fzpspc$jz z)Yk(Vije!{;uh`{(c>9{O@zF7&<ZDv|C+i4DtRB38B~r!sUkIp1i4MI9d)e4q<KAc zBJGMTmaTg8f=v0Bsg5&vU?ALmR6S0{L6cRgT#a?6fJTKRsiv|_%~;u|7;jtIe`}-t z0Q|j%*Bat8ygenx4h6j&#m0oO^r{rfIf9Rqk7qmhVV>$}X#OiSx)U7wDCP3j;kWiq zoG|%JTl;y-vBkbc$3BF5AuYj=gU0_PJ*jDV?Z0>eFrA_BKVpMnqv@0v&)P28D#=4R z^DIrwN`z4z|6`<Z>Aw~jZs~LDrgKfm6NNO|wYTPZMuPd?{$@@+U#+~qO|>snGR_ZT z?lT-r|BfO#fPT1Qk_U_5UQ+nq?va33xKd%!LJrHua0x1-<Ba+2SX_y;%vcYm)z0tE z6Juur0Wd6Xo7xpF{6HJ56xT$B2Is`F1+i^)%~;-)q4gFgXyV9VFzI6~wKDlw{5uMh z9k0vm=w`de-bh=!WMkk(N!o>HR0*#%tZ3EF>o!){TANT`k#$Yr@kx8(WdN8l4gze( zZ8z0SqzBVMhy-X6Y+RKTbfQ)@lPzzaUNArHUTwLq*Pb6SvGi%|v;6(e-ilrCp^PLc zrC2(PmK(jBC*HL||6~Fw3U`YN%Kgf!ucD%wP({Co&P1S2)o*k54f{o4G8BwS8B3RN zjnACc9Ke2St<R)3mW8Qk67!Jl9kpbg>y%stz>Ykh8b8o%QKQzTPr8i{>Vr>y8`6hf z<9&{;Jo4EAP-RYYbIO-BH~$pu8X>j5i)eBi7pg#toek%kH0|b!iUfUM&HqMBd@mRD z(<cvPja~2}C`dk*s=x|q=&M$$<*GEwxl>W(e{gJx+kE!ECUm4sy2o^Mc@wQL`Okr$ z354Kwto<0>>DzH6P)dL%=HrS7Gs)$xZLf7rP&;8Vwn<hFb#;a5tMBXBQvA4;W44QE z63~l7{C82RSS=mhNTl6iHnQbH3cs;~Qn@B_*1fe@yNd-t%{~C~^oSFAOGrtDx!r|v zGR7JwjtMGCiY``gLC>kGg81R6Y@g>W8|^oc6ph%ylEl~%gk~j+jCDR6Qy^6+RH{Pg zkW{2R;b*<voT0!hp*5&?{HHZdfY|;zd&ZQs{kF_}ma49Xnk`>ize4ihc)0~Fe+u(G z>^oA6tZ#}t$saz|+MN-?q7YEVndp8M#mRzMppqW038ybq!V&DkN}T^OxFrUPt#2QB zW7SI}&`_~h&QkL|9kanAViT|RlSUx`=-wqbyuAnA8kx!`JA1Xw<$Np8Zt0f~!IRS+ zNg_C4*WZu0e{Nr=v8&?68#8zyVGrMq(G5?mN;-O|gM~AUyQk#A<V66NSp#2c@X>HZ zpqgFY;E$=4N*d$v(j|=dg&$S_d)qb|kWUF%vPK)O{e)0Dg`(puiojPLKh6t_-{4om z_w2(24+Shd0MBJ~2T@)B1}{{pl7!z34g@Ri%&F_|0HZi7wk8-fQe6LqJ+kVYluIdY zFnrK!KjMMxVmd1|1~`FS6^!IXKV$+=16C>#iCSCP%YAyIf&y2QiCZM{Vpj@|I;w}K zI(h2afYvM-VAjxkK#qy{+3Gn|S_(_Kj!HqL#pQ)^zFNDN-?sT-5~JYO#S!_l8{_zT za5ttW``(G7FTzjq>7u+T^B5@#PJFrT_h2KABAh!L)8@(6wB|tv77(Vp|D|Fh!d_H; znkqVngTlm2`sIG)Qd{R*b02)R)MCW_0C$_OWW|z-Avt#F*KI6TIxQvvHaxjXpj={# zHwbaG2va%MH7RK|XQwoayhkx6QhsPl5-3$7DZd!Le)0~E1Thde1Yd7S8Ef8oHdgi; zhatc~`NXnEzoRX)_ImZb`saqS>UoVh%qpX_aWk^myuFXwZq6@hkt!Zdi{fGb(+{HY zFigTZTd7otHc@n*pSAV6AJxd<sc7eank<c)IJ2zO-d_g2ecal8Xk@7Hmv^@(UT?jI zYK(931j|j}35UV>-_+p&hdDiET|*Qxq#!Af<SUi~X;7HaCD#mVTdg~Y?R&QbCN;^i zeL36P&tLEMeTA|XlCF*Ch4MKj!2=~BdAshYIuZ0a&ToTNy!1NfFif4d^9FY|>am3& z2+l4diZt_9ihjNzUm__NwlrOU_)lSn%S-QuJzxVcYb%3s$L;oX5rp>QJq+?!ZFPDU zv+Vq_>c2%ts}xdnK(Lyx+Tkbi?fJt|PQ%0`N*PZUPY0e6oR*PQf*a`~xGqbIw5sBT zC=d1$WBUV940H$6p4bB#bfDy+!{6fp;kE$AWm=YuyR5uvj^<f-q_pARgFPkSxZQjY zo<9~?`TrUH0CI$<vkqZE?%MxT87z@>gO;5zMV(sO@R)zEFAO(!{Njcid;UJT@W`RX z7zB>gdtmUwW%;R47JqwVJoWtx>7!X203f=k`g-;YIV=YWfZE1ob_5^uKHYC#O#rYd zy{88X_;u1oW?eJBgi0U(5c5<B>ss?D5X$AO8t4Ki&~z{<ar<~pNUaGnrE>V*s}m!M z-U_T5Sa6RhyV!*x<iY$IHx+rmE%Tb)aTjGv*ES*AHG}e1;0J_fJhfuSn1nL#oI@l* zS09~&^`JwTovmI5XH@mpeMh@<^@8l0r^SLx5(d?Hc)X`FKKHQ9aSaDWlqq}uMFcyU zBD!QOCfy>q7+;a)Jbm#Y3?U^j(Qmv)^`=9JM+VlOp61TJ`0O#TbK<G8pe;x`5!Ey| zhwQzc;5?uDK6PXe>Z==D)Y_gJ=-e@#wy}n!8CWN``}bQgWB+DGB;8;p*X)U%iT=Gh z9T}@#y|vjN-t4&ZzVo)BdLveR-48a{NS@usc@|kjv1fJ`Gt1+U1~4}4+tJj-$#g1% zCl}Y?(tDA{e|f`m38LrF;I?<i;JfJgoVP<VWCk;T;f*-$H4|W?-@I@W-DRl5>AK*I zG-ppzzCg)oNW0GTz^>F4XLdYt)~Ni<fsMEy>_v3W-}!99&hcgI^#jVGaSI7g9@LMq z8ci7TPe}eNu5_xam-@7Q0l%)2g=T*Ju@31s3>h@CZ`F2K&p#X79zvpbJKNkMdgCPY zK1O)Hweuy6=6ww5JUYS-%M(fvp{Hjwax+Hsy%hKT5jsqxfu}X;U2n9kQBkQ^@Od)h z-JpXBLc?iLz8PUR%G*i0hIT4=g~Dpakw_ZK_5Ps?Ja5SQkC|NYzlS^eM%WDZ{Z$R! zEMe_ENRIl>p8^6@V;w!f8|(Gft}~SB<&|jnncI0wGmadlZKm#Ey&wQ0Xyf+AxydsL z5mPj%tc=^Eq4XJUv^GREpI8DaSe_SJei<@i&F5Wprz3)0yARCUQ}wIa^PggVq~aNv zw4!Te1-KY;oILW4`4h;M{jNwX{pOHvzhwo%p5ybslf&Yy9?^ImLy@`jjt5n{P;I>k zu2v{Xdz2gBtqcjK%rVu<D=j;#Bm4O;H0bwgj4(y>Yg#ZO$1=|uJf^0+C2r)R4g*@? z?jIMrkc-RF%+9#0<9F0F2qJMR99y=zaN@{whu#}&jt|EbTi|{w{}@Luh>7tn#f1|u z-QM-w=091atx^4l_nl8GcNgi|Pf%+Q*BIs(>}uCL#rddbih@E3sPBVWzMDZab=;Fy zbv{tq-s;1RU7A~*2q-Uv>UKzk75sL@*GQ_AU}9Z%=d$0XuhM-be8hx-mK2f+K@H#p z7bfkD+2)xQu_yMtYJ^{VYH`+Ypa?m`^W4JO#sm_>74Ak@j~KMu*T?krzUr5Oz01dr zR+7<y-Eo_@BveCtj+3VPm0L><Nz6v1Ph)}X7HL7<5E5}AS)Fy}2Rs3(7lJbKNLyg- zntcA-Kl*RD{xfNo+q2?}$ZW_R=SimMTP389=M_@B^9il(YCB|_>EG{78|S6s8`t$G z5;5eGKZ|he@!^6D%BEu+zch3kIvF^dK*}}EKYk1q5txzbm-xHm6@>$<R*qDo@qLCp zPiM;E9QrGA*6)_!wNgeI6eAy7F{&}1i-u}%B*flLzu-%0gE=0}qRT|nBbN=x^*k&F z0=U~`+9rJ1{3X~hQ{phg?qn=kHgJ5}yCc@Nu>M*e{+?Y;cRTu%eqWmXjNo;hPc(?t zbq~YN!Er#9FO^e93-0mCGnDD>p2N$@k=sQe7BdHzUtk~?D!_5;a0X93@x|h0(@$e< zCaA)lIkVt;nN2FqS3fYbM`raFvz&FLQ%b8UqJ@f-DgE*%mrRi{t&CwpUvfTH7n|m> z$CtH%v)?=>J3Kk6J_tx91A}4bMWo$db-tJMhxN9bUjp=lcBAT+^KI}x!7JlFzl|M; z36aPMqy5N-e?C#-1PKaBKul7maO#X{Xlwr7Jm!4e1()f}=dA61Df<D(Yqu^NW&-b9 zL&|l$lHd7*+TYB~-ks6pixIkH7Iw}bAi9e>3@VE4x3Tlzzf)Jg7BhZvG`rTm7gWUL zjCwc9`f*(^76nt)Z*>X&?4H<I5;~Fo6b%CqU?HNm%C7VbxhC1;)x(E(J;#3d51tOf z`P|MNZvKZ|)#;%~HKu!hTsM)|eb8eR&0iRALdnkFXxh%xC*rmK!K*PF0xFF39W83~ zU>LFVXW1m00*RRei{8f(sLod`Uq9cs4U`Kuq8DhN*DWGJVSm2Y@)ZpYjo+a2yaF>c zP+Hl=#Kl=y_>x{*x{bl-i%1$5{`E(fIn9;YSn_?U6a9xE6Du`w4Lm;LyviqduW&u~ zhShLbQBt&D^mWxnx3|lqvsyCPeR)&uGi;?d7AJ?jp1z05hyV52taQGTWwO`(MR_}q zK6mQ6Fa7D$#5lyd9GFl0eh7V!M<Ptb-dnUT<s(d48Rqv%oFGVe<9e~xF<tvFuDPX^ zaMDik_b+d+`WOH4zhUq_Ev<{JZwPZbUYGb-O8sbP-~emOh{(u|h6TOe?QQZZoffFB zbrhB*F#%L)&b1W$o$s(!MNzsPLUCoUJjNsgxx<G2mn+aK47wKHCaQ|4p&|yK)5{;P zE{0>=+0g}sWVTOCpdiecbBoWwj_oha%_AQFEP~SqKy`ot5px^Y2R%Wiv+VzFMSFL~ zR5>(+ze6@kYU>;hF>zo1LAGQZV$g6lJxv&tWQ@Y>aZ<_LhF?Rs|9ll0Hjxir*K?_S zw=wHR$C=L;pQjI9k@NFv-etptB%i_!+}&~Vs141{;jx(XM0|buDJdyYBgMX)LB<74 zSqoe38Gv<Tg%ITOEt_N!9G$u+A*;T|iQIjXsl)FR!Eequ$m&jyW?Cln>NlRLdDI#e zYJFQ5KRaaN@+N)$a>}jVm9(Cw_g`NZ$fZd>KV-jg@m*eI!wq7oiRxly?F{%Q3i05= z{;<)idHOGrSi(_xPQHp)9jDSJDG)XK>=8D?6i;sDj(oEQ71Z?e>IuGZJKw!!x9wPQ zhv!9>=M^eGzujF*?^a1<R8h1z^6ouA=au+<bhDXimembfca>g8Ya}-04^s_hdX(~2 znBa1pjP8(uqH(VXK4$v#3?=34j(SjQV@=>Q5D>>~mba$NL0V}gW&3eLGES%n@u$Bg zapa*{WOpQg9N?+O`3lxLUp-bacBPp*0=jcao{8R0-Wcz>EVJmj{Au!Ut!ObV+0WPn ztx1G~c5<m%$yp%N48qBzgO)PszYq%f!w|s9ch7jBI?eRDy@=cW-AQKJDEEC-#piK@ zhx0_)<UR97VFV`p?<VqFT1u+|mQ__nK@SNXh(V<YL4XV>BaTJ2KbWRiX?Mo}R5CvS zh?kcau)e?vWe|;`tV7Cbe8-&Da5&c<W*he)k!13_HiHlnV)D;ic$@#i)O?+HLL9ji zsCqmT3w>s?2soHqCb+U{_&hF<@^ANpbN#6-h}R2tj934fn$IQ`zs{`FERUuwJ?tX9 z;3UtFm!vVJrj$Unwhv`xKiB*f#kqGFT-k^{9>;SlpQxd%_+%p2`s!VAx3*j_p8JU) zApSFDlgr?NNgqT0KWx1POk7>qE{Z!8cPKLWK%uz1Ln$)A;O_2T+@%aHP_ztIT#CDE z@uI~k+Tsoc?*7g_e{!xQgg`>b-fPx+<&k%_PsCSOzZ1JU>$h`tRMmS;nWR9TG*r%{ zqe)DVFt~a9NI*t-cE5NA+)MD^wzRh=SU+T|1i$G&H4OtPe|f{7g*Z`Lt50QCCrp4{ z`Sp1EOXB=uD**^ItEAUGXze$nXVj<@vicnUw)t7~F`646C0qO5V~GD3-~$CtTdP{a z8fwB?l<&VKjk1Jw^F+K?Kj%x@{4be-q!u+5^6cwf|AVki3o&#j33^gI`!}O1*|PjA zD{TVkmoC;VSQ&;QubD-ugjh7{5#8`sNvI|M{!p_LJP}&RhL7U*$3~JN^_WQOhYhw8 zEb`Y{EVBj?B^6bHOjLP!tw9xFQ4k7#-~+NWZP1x?Wlc?CK>=bsyvOP-J#9(^oE7*) zAP|7xq#O5WQ)0Zn)ge%0u2ETqf2Y8T0w8TbNrkVf5?>5L)n5NPVbh-ya>cmX>WO~t zN1dvK;_2y0PD>#zvt-QLXV+8`b$0yj6(yx%@3{iGy6%ra#Vwb^zC>0!;<J5)^hg1m z90p}>We80!ov*@hSRr}0Co)ZEX>&fmygVOe*s@bu*_4_lF_@GCg+AGi&)~f&GlG!# zacz5+`|saRN5CCQM>c7}_v5C$5w9e%R8#FsvTnh~hBjBl;^ThAI?AAK0p3hjJM%du zH<FItNCtQ<<yIZFg_cg>7bFZ`_0R=0YLRn<m9`YKU~fzuVkts=h*B*$rSUUrq^#q| z0hH}?R;Bp9fdLQ@hdi(d>_LqG&7BMmrUB?Ikg`-dP$l!r5);`uIG{=61ND)C;V=9I zdFjy5Q708jsiM7#3U-E6yN6SR&D@*5Ll27~(Fl?kEFDM`c>F6X*14ZpshglQJ{=n+ zcs!!WZW;$Wrh<*rZf0rq3;!odys8L;JXuG**EU1w-vg6TfcB%88;3j^O@78ZI|huR z+fHNw#?kyy`KR*Q_=2CJX+eT4!Hy40I+o09fh|6|vmj(ZMNV^I{7rYF<nvKJ*^?14 zSO6`J$?@07${3Q+q(0J=hbs9(fqk<AqqNZN<~>E00{BgaC}WK4S)S7&e?m0!*B#A| zAXG(5Z2fd(<r$1ht_XAC0S0N-ax8k%Fjg#Xa?Z?rT4^y-L}ksxt>*G_sZ?v$a-@6> z#<$Y?s)6szRyTn8J`ceiz@0VsZ-$g?kWi#U5rEy*bFP37%uB>ap2{|B;xFQdKqnE> zd3!8;ch`Py%&sRW`O%PO6IJiweS0qrBUXYb?b9m5kkseA^+wwk?G7cvV_iva(vc~g z=afK5*%P{Hv?9td?(7LODCvxn)v)`AWlWH!VBjv`PNVU<zWQ3#c}LL$yuB!dI$nkv z_hb*2#)L49qxZf~Vux&m8$lYOyqut~dXE_~VL34}Gn7?j<#A-&+ZpsuKD}WPaaQH+ z7o1czVGC$F9hQ4!c*sW-OlWGsNLFkxyAdVUojG?FK|(Y^N;Is7O;!`a3d6|S#ZQRr zsih{C2R<${eLTK?X_y?yf?z3!_FFkt!bIz`A&3q5Nj}xwvqgG_Z$0EXP{?DCrdHJR zd;Q{5Lae;3oy+N37aWAB=P8;A!RrW9^gTWIiZ!~WyrrEu7Wcbve<5NK&!tfOI|@UQ z{+8UD5vBM^pBpEadWS5g{F^Y<Xx;Doa`b<@f?Z*^FLyCFd(~Bgs4BZ0&3J+94#vwg zCxjoZOKxKt79nbrZ{^W&WM$Q24U&^VJ`zHs!<iGLz|$$i=#&Y83X)j<9n2Ojp$X%j zFCH#UF|p};U_YT7+h}Sggbd#@o3x_9MduL|@Av}7M4}$<Gn+OLq4tScpe(X9m7c+A z!^`bC8WS_h`#~$qM>)?x&;Kv@znR@LDCxUEc5e_1X)3H)XH=u7tV{^LIC9hjE=@nX z(>`6Ls_9B68=sr)M7Cwk($ht2YT)<#$~=e?KLK^nwF!X*!&#l_4A9Ub5CyVvecEYA z6G)i9WAe#54l3~*pqcUgqE~K>DHL-SkCm4JbU?)FVLSf%Rl1oI=?%Bvh^!B%mwnNA zcaT5s{(y{SO$W4aErgfY1AVYQcp+D@rp(~O{cJ}w*TU|jWJ_#H&=pbOO%Q)zn>N!E zMb)Gd-BV`p{uoY4-r(MkfD!Bqm=-4}dz*7PRS8sYP!1js-^Z<8{_7@04Mbe-FB4|^ z0?K)fy?NBGp;?NoIdD55fii!m@M%Z3`3^k|26ISry9qRz`G<H62j@B0EHdb)uQhIa z+J_JpyszEkFpntU=6c?I6!Q4n@-Dr-psbPQ&lG%%7<%%7SmgV@lG$2!gKspVe3**8 zbvYJ>$Nu-PtgU3I+&I`0hw{tEJ`>sXnY|v=tXZ=r6<8@IZq7_K-UxhyAU1-S<T0t! z^G9xB583fj+w&rZR3**6*YnY94)nUgp5AqMQz5s)s~?`FmyQDk#o&7*Z*yx_&DTxA z@WH>n0Y6M0(tm9*(hV>`KbU-kjMj-t8pEcQR4!?;jSRVQkdt=+r><GEsM+^5?6rDo z?D!HXEvtI0Mvq&}eh+_Bcs*DaCYM{xj$)HQQ$^FMpV^w7D`q8Jh+<yFVCn4y&{-Bp z+Lpc!>lL4@D5fMXYwkvdZ@5sXu+SWvDVuuNnkw3d|AxiCLo~w7vPs3ixk2E?NmzQP z4jR1$G8i`Vc%_N+Tic9siJt+~#lLk(q+p<tdK`!*Y#VijO6BRxzl}~$b-MvIkf8(y zOpVOpTRE)ytNKewbmRJ<P3Y*+2nP-}0(jigJ_Ji3M%A_)tGBn%_I&KsGot!&C-hhF z_Bpu_FqJc3Z#>WXg8Rq2wXy{9y4v3nqfTrFk#y=^u*jO=-4w?(uzw-N9u2#>Hm$s+ zb|7Yp$7AEM!%5G<W_F-jx>_3{-~_HjLM_HnCP1lER^Xm<Gf7g?h9fzM809i3!$7x< z8k2V1ea&L|w_RFT2aa=fA8J=}-2|I0T^z`1(35TXi5XMfCNQc_{Wkt`M~yVUe;p-G z_Tdcq-%|T}yY1BN-|ir)H=S2O&U@fvTv62|W%&Dr+hGp__qcNQK$57nzibu$26@&} z<*!mp?12_cr@>rm&dUJH)f6)qgs&2RxZlwQepLq~@L?aXo4mdbU%tQ-Lg3JdnLOUx zDF5g{bL7Cz%%!ck$FF3K&&<mk3XA9r1f+>Cw9gk)FT}>3EDi}^?R%BWcb3f<X8z`F zk?HF<9|~E4DbsYMxTj2dd&DLa&EJZ3d#QdL@;Kj<Gp5c!XT1JL3-JEEX$O|9wxJ+v zeBa-nXUQqRa067fbsZ9@4G+0)y3LWro65T<A-@(^jTIzQKxo_b!14j1qLTnUC9g(u z3WgA7r-fM}=k?{>6ex|wLjyEMJ;;7(F7(GDgbtMmOt_8oFYMtkM=m@)Y(wbqXvEP^ zmyT&VRll(_Y^@x3c4RCpCCZ6K-yf#7Eup7r^Bx>Y=wDs_yKH_T=)N_5(Kut~cqe(~ zg1`^ORXzDO2Ac)%;tth!X%vo@?{?pC$F#8NW$xNz=jy+ARGJ{1U|Ch=1v6}gcKMM2 z(8rvaKk}XrJ*p<LqX0FB@)wdIUA?`!Bh#{bd?z77<WUM>D<=fxk>$T20*l#&70tW- zGs?FFd)Ofv%!?ba?i4Z#gtv}fqlH_0Ujat?0gq`9&Yt#F#Q5?w>#=W02uvxu_{oAN z`cegj9YR5WCDf9yWY>2^IdwuiE=D~bZM8^HJ=-Ho9TDp*%^X~S)Ja_|{t|JzmGZK& zA*;G?o+I{hRYH)$FPmN#RBVgR6aLAztejnpGuQgYi5v)IfyOy)hO7dH-%8ed&e8Bu z!WzW}==};QFzNB=X(N)yuDI;8dav$|bB}i^affZRPz`fvVthRs_BzLkKSSgSqw-ai zVP`K-gZV)JaS?MM<VPK&A<-~;&cIfGBc{5@bxe0TS4i2K4joPt%xoAN6KCd%hfBdk z)!N=)ckB+S^5%Ecak6!EH^m&OirkPYYDmT&&KS18TbS;vYqY)s5oU`Y`SB&T2d=_( z<6?)lGffTHj)b4Lr@G=#gKsz7{;m=o9EvtC*C{)kF6i@vzjRI4Z<*v9`6qFv^V$^_ z*4~=X4%fBoe-(k2;FSF2J_$<9`D*ezt#p`?ks2=p1b5#Yp{S)!DVupVeoYnk^PP7k z^Fp1lyj$rD|D9eC|1pF;KKyW*iB-iskb@X!JK<%w+3k46J168|&CadarG*Y5dEczg zfS;u(os^4zK=AQ6)=N5OaF6v*Ab-~JM<#buu8(V<;($?F?T85STJKXg4BXIo;i(_H z{QT)i6QuFCnf{y~i(Vs;+78h(N3M~hZMl78o+XSM*xSzQIr1<*=y_NS$Jk}FCC5TL zzxeP^v|~>Du5Ukt#^jW5)wy%iZw^g13%I8~eA!94B4$1^T!Y=zzVQ?+t3U_>S}BCk zUOTq1#!{Oq6>DMI)M=5Mog4=T2`gQ#Pu}%viVQ!+IJHXKae*N4u)VtlVTKh!*spVB zhfn&e9Ba%rk5z>(H`{%KDw%chBMN@ZpAXht?gi~GZ9-5Y8pVy}(yf1RR{aM5Wl$!} zd+EJBTkU@0`1efm5fl~qQOa@ZTs`71TNdzW>qRoUyjEYrt;y<(>?!MhC$<|`O%jHJ zMuWdQK+~f>7R#ByKnDm;xYZr<ly=d*<r*yGtDR%tY(9dlaa5z$3vGEk9@!ZR_%p$x zim3p}r6pb-pjhopE#Jf^h<W;RE$ht@6pHOKK4;T^RQ~$qA@@U{<n!7_C>=&^4iNIu z-GBGg1=2Dhx>3I>oXK>z^PBj{B#rMDu;LShBR_X2Asi@ciMc*MDK~O46s-MoIS%Yi z@*0;pLEQBa=)t{$m#FEL2~nh#sG^HO<6UX5%$yEHm=zz~|E^jd>J~T+^HJmV+kDq6 z_Nf$Tk@}T(Zb#18Y+94>M1rH}5wQ9rk<9epsx7yqBsNej1AM_v9%FVQD-3S-mZJBB zPFI^(ST$`h)%!>)>pda{(7eD_J70Th2%Jw!3K~-Tt5)v@mGP=AM3~yW?N|V6aPWls z?zQN<=8}Kk_e>Ya+{ok@QyV(<kEEBWU8OWO?7@@C`+TCh=~i+KspUrdz;~1VvUb6( zTTY_u+U~d4pIrtnW*MG;zY2N%a+vnIKY$xWLz`ojbL~L%dRiO~!Z<^t707m0gjZtL zcPyGN=ce7VscuhJkuXK}T1_lbHR|OFq(Qz)&2v~F4lopS^q+%m5&Av!Gjpex-OvF{ z&^<y3Vf>TCz;fUfwOv;4T5pBu_-65jr&z9O71u2OoQZWgfAs<ZmLfr%O>$0EP1RNn zaH!A9G(vDB|J{<A`||Jf5xtgCox;4+rffx#;^nK<<xpex9IADk2uKgYLlp%T?_xlc z-$4DWSf+8l*L?Pa0><*cRLXipPIwtUGr#R)M2$H8HNa(LN)||A{P_ZI!s10<Ed9<e zW=$(w7Yz(8d*jZ2GH<CXbTkoj%FAPi`NLmRwdo47k)Hm$XgXEKM_KJ!PSJQ7d$av( z<3Y3*4coxbfNro)X~5D<7<s#n8v{Y15L35;vnEz?;$yL=<p(v=$_G+Jglc1tY$is( z2#NuTn?T^KL1pUN6r2pyOh@P3HgTEnGOii&)y^JC=|;y&I=JLht;bRG#9mO8U;_hZ z*EwCb07i@l(GZQJ8$g7}gDLxFS5agN-cQ7s{fFYL8ZGe(^F(jluiBn{F?}TdS5YAp zu*Z|rarUkftuJ<nA@er5&%!g@MyRs-2O#45-O1t@4z5a8sLe5793Es?@hg6B*2o~H z8ozK6|LDz)89w45d}yxkEMZ;n$VqJ!l{|rgzDR(JF8$HVWZz73%PnBq|BM{Ig<!*c z`uj>0&dNYq5#;?E0wGXU>A*GaHX?hQ4retFu}8J2hf7i>ZM(iaP~BB++(A}bc_Whn zUI?I<VoDpS0Mg{owEcjfnz4Jcm$|u3$JfQ`BZnoOuKKz%#$nUx=d%Vc$k-#gYlD>L zZ{vhCEYx9le8EqjOTRX!Ae0H2v(~m%T+AtuC;qPnM-2euf+^C-Zdb2Z4chP+>0^H} zQd`SyjG}Xk3q;0k{jvKa0h@y+48qOG1N6dDE&@Iy5zF_seINir9T3)4V3G4u7^)nO zv4bc^K_~5QZ8>+hWTpcg87ATV^YNCqxf?&<V9HcjZ{gYu!09WieiRlLlDT%@1P|=+ zoORIG+`cEuV{-lB9IjM;@rg^bPMRy7RvQ1~Ee|M5Q$H8MsxuhW=^CjYLNeNfCa9l0 z{NpEvmmR<tnKy}iR8snNW6(<VT;;>E()LO=UG7KXt34-0h{rQ9Fnz#6bEG~JAQTtD znkq1y7XyTTqVJhm#&Te0Gk15y4-dPN1A@<g9m%OFheoj_qqSdkcoJ#Ch*1-kfsQ&l zLU9TSK{sRH%<&8XCG5-SzbO|^o&LUE`>D~2PigDK(mD&n>r=>OQ5MUIG3sTWO!-4r zCk9+S<39Y}41}|`hDZi=ORHDL<W-Z-Pg>w{h@9Wq&--C%7^q~}MV64LHCGiXEoAg% zHaeV6DwX8NJDktpDjf%yk?|`FD-Y70b$@4gY`K4?>Eqbz2spIi+PLTZF@FW*sqzs7 zh`Ijyi0Z$qP(C;j#|sD5?P<(cdYS#3yzaQQo=+>Dahejo{iGCc<4MBo+_=F@D4hJu zMfh6)Yr2g-K1%B1?^I$nQqcvyU=eL3{Y(mgV8oKw#7~iLG72EH@OSV%85cLNhgaO9 z49HRQ5=98V<Yj*A_-8#<@o501gD8T37vhjtqyV#=^Nf`{fk0wp=>J^{b|t?y_Qyp} z&f735mBHWi!vlI!v_g07^W<JDX>CWrg(p=2KPkA}bVt$6AV}C<)H7_f`ts-BSm2dZ zPct93RD}(Arh3x<@{|Q={TlqWKFoi%Yj9HsHRRo%3g@WnXJuDD@+S_%Gjl1U8VfL= zfdOJ&-u4N;%n@`PJ6w`}S740rp1vRYlj}?fa)ku3aD5)fybJcz)ea<j(z3W<kn-E0 zia+FEGJ9Kmd6n@tC<ac04`2FR{~f*A$$#GZ0I%8~>Ff$XGSdg>F%p~asKlRJW4Z(> z;;(_-=6DurE}V$FHZs*xeIwr_V$@pi*yfc3o&k>=vAtj47r;};PL0CvX0fZ1i7HBC zN@RAFcE$x5YGP>g2Y<Yz2^#NKpYn1Gk1J+8YGHIJtd37Kxoa-P3ESdRd(VDe*p9T` zsk>V8`q01#F11Jq{eA>BUJNimM%4!xm<Oq@0-M?UbR2c6D5n$P$k*0(#4CZ*yZ9JW zx%X^r&oy4oy3ba2Go&^7gw{ieZY9fvl~ANK`4ScStH(qUrdLA{ZqNkxN}}Dro>Ci# zyy_Q~h$Y&m9ligj7s&7Aaz9oi`1t~fU7fp?*qNGoxO7xYQzvw~zcy6h$=ce#$xN2B zwn?kmiUO}1D75J8N#BP7+|<TG-{4y(dB~?ckr$Mb;TUdSiO{@$TaRj+ce`&mNgbir zmZ;L9pm_4mCj|&mF?bv!x=>%=MBXnVGzz4wZ<I5Pz3~C><>qg9&ym~KQmb!|ollQd z9SZ<-O;Po@8<}hj*73gD8GDuA3xsaUY>_P*s-CQk7&JYX&u5VTkUai37D);KvH{=b zYS#MZ0<_yO27VqS2&1a;dm6i|21jkVSTPwyWudhyd-LbEOLh{}^*B+tW?H41U%K!j zJ1pk!t?+fhVXB$6K%|}ir%dW&#nZY=;g{-6{Be;<j$O#R<SRzvZ<C0>VPHn$WQ&>R z`042P6&u~*s**vNu15a2$jE}`O-nPLzr~Eyj}0nbAp&q=L>T(;IVuI%c`c@wn>u~J z)a{~g&dq-Xh^V1xi)oFj>HfER48ra2Avaa|bxX4EVF}?of+U7TB_vh}my5`D>GPm| zH~^gg<MJt7PCgfP-THaYa^$kctl$z}MDAu}v;EZ$3*bfmnvbgq1#OGjlq&E9-;#=P zuGNaXRihiT5R)&|oF+CVy_cY;9lluQD>+>+7pc)ow?>g60N*b(m`||d<Dj@*4*de? z*Mt^cq0mNtNkC6PEpd)dxmuNV{u!j4x8Lh-H1k+?dl%d?_adSrFFo8#)FSG~zb{%_ zE<PSj4LUhVEyjXCR9EGy_x^E1Ah+Tj{qEEjbw&K8B?5Iii&kG?9RP;vpH^Jjh>q-P z91f2ATJA?`(G{y8L*5lkvj6(gEWJNkooJ5(m(&nB0588UH(RoA^~%kr{)a*)J3!W( zH)jZZ09vi^UIYd7bt$@96Mi}1*S=J88?s;wdH6>;OiN$Iv%Xh({YifSH?Jsayp0*R zf!psZM!Vx9)tV<0m=zYwq<H+6p{v=tX#7I81UF7X)UtAeH*KYJ{f~W*%Qq9H{oJ1& z{AaG7LuiQQ!%8TWsMsHWi!8>fLlnqnC6EwslP1pI;S@ej$F)Jf1OMpj<22hxD4dUP z;_ssg*Lr)$Yu}jlq1B%lM(Q+nPDiT>@hD{^ea=j30JR7(294=lA1D$O+#Xjx&>6^^ zzeKWH_?S~v{4octWJdni)<z-sgw>s86Ths4ktwr9XZ+7l{!W(gDX)(!*FVk@Z7j^k z#BEUluOk~c<^E$TaZv#3(V?k&w}-(a{Cm-<QSbMDTx7)iA{6TCk|!qgJVifb=t5xX zlz2VZiBCJC9e1W^&rO_;5X;PeJ>l{7i`iZeCL%dbba{&;-c4@r*|8vx@a(IM(%@f% zmF(;QVFD|7Wk4t|SE!k(R%|az)jpT<S>6>AY03m0>Vv;(MvLK*2qAkT{(+#7u|G3E z8_|`!_ryuzG0YNxWH$Y@12(4laPtJ69KC-zHu&810kP)uAcYWRcAb!5UfMt7`BZCm z(`9#VNmYqmVVxt8S2&30tsCwuvFDw~2NCf2I>%L*MEQ6oH4>L<)b$L-guoqHr}uXg z!Sy@(<eU&cD$SCi4d8Meo+^g+g43U<YDsGfZWHJ)7e+&40VGEym-PhaemFSlrJpTs zunRUtn4?{F#5Bk1!wa^|je?$;I?f*)$tk*!YkUnje(*ruwx3IZ3A?8RAimSw5(;vh zpwaRY(SQfHKUp-Yo;z;*jfI_$tQ|YPZU;-tD_7v$lYc`_Y|5|7wfbxMCS(YS-jkpX zNbJb~)%p}w1KW+%n(F$ODm;7;=F0_GBv51b=`l$?m;B^I71x5pd~>Lh5W@Gh#yBu0 zP&t(!dgwajz0LOZzq;ygc`nQVP)J5zD0?|``A4P?6nHV_#ovOlMaN;WdR!scG94a+ z=;`UfEjJ5>ckM6Nw}8k3QdwPXSKt>dyHOScpzvF(^-Uo8aBHX=wQ2gt;J{mg#MKaF z082nIjGzKo^w9_0wwsYzC-2{i>7xRe(Yx#ym#p#OJu6rXdKs#O@kxUg!0R}~#V4=> zmL*J?4mV}qv}HVCZQt=iDoE<V1uqjXBL|SI#G!Id!aovTNS40UjJ0iv#rMj725r1~ z>M(eNsFfp7fX#)Y1_np#$oKxL>5f#g>x6dzmqsO=pJOI!sBPtUU(%?lC0YW77(gX; z%!F6>+XA!?=FY-G7w&&l>9~VFjf6ifWAjGO)si!{kO$s7Uk*9VO7VI=D7F7f@+X|{ zkRv4~XgUym2{6%bbHSM5z(qq-?ZonR4l=fn-}C><$7!}3w&NS!F7iQ>agAfv4#P%Q zYU8-=qS1ygA&;$g(Sut=`|ii{3FIf;NEz*%me$|lBZoKNkJs~aNWn|0i7BfCzwLG# z;$q>EWo2w)*FUuZYyPGmV`Z{Ji@~dcy3SVuF;qrqY?|R9DQ!N#hysffiaf!u#h3Vd zB{4I(#HD~6LUfO_LWN4eRD3Dvo0oNne0p!K(datM)Fs`xP;VE^td8FfX%m$zYH%H6 zW7}z>It4zG*(Msgmn@qt&Vj^DsSbI$2O?v5X)%!n!+*KJ*8LJjkO>xP#-y(+4gWJ| z8PW3mkYLTEBCkmgBFwy)+`i8+8G2lQLG0KMejVCafXecwgXopSlR35Mt&o^A`lid_ zy4t5mQiok!wEw_<=cahxk(4}t6fK#am9e0egH)ey#^2se&E|BYW_aAIGQ;yuhjd8D z)zce7oH21;k>e=HF>JM+d{^^NXFJVfxHQGi?oT@Jb>wdq04f|G2V(Ky(%y?9b*s^O zYVs0+2i3ro-2RJjvhQiW)60QxJ)I-U9l#$UwRA{X@OZ$2dHZJTX!kV3y5S3G6rTyR z+2z%y!i#gqU7tJ--fA=!p-l{W%sUC#OyKH)ybDgFZat5Suh5puaqq>dRT~;JWm3uI zDMTY3MY(VOQ@4>Zo$$M|22=@uCt}EWX>_<FQ=l*PFu?4}!j23x>8_XcNK3He4G>o7 z4)ytPB4&)V9T^7-fn5)<_4q{Fq&2hpy!qc7FY%4?1nx*}ffI=wTuM9XAZGQadlkDE ziHCj@C`qE=*B&RLbHLe&WThv@vpkr@FbO!9HwwN~U;W#Sm$f@HyAoDXO_Xh;VAHn8 z3PT!qH-k292RaFgyhl&Y8EhQikTtEZ)%qV<Sx7x!RwZg#anZv;qK)HVh(I`~c>;OW z^>o&XkAXg(!p3BQ2s%5OQ0P{(KC={$dP*Mf@NO~3c6n(vPG78RV!E6k`43PfoV}iU z65lIToL*hWHk7pqbB1W9d7k{lk<`Y=LN#w(xwt6@DG%(Dbw{|lIh)44-4%ZqXgl-4 z5dj$c45aAxctb(g&=LxvHD{rqBTXT3XHi0sGVH588g;2Wc{xw<j*COY;9lR+m`vLq z9bsH($rtCx_M?&dot|?f!B~OrNv#4n3PMk<7(?$hVK=kkZ68Y6vfsH~%h|`|@rY2@ zuDyjJGd|$H2j?Bs=(5gm?$UNtU_FM`dYiXsUiZXBv-sknTDLpOVFFzGo|xQk66nzU z_{Q+q_TN0B;_`BQc}&ks?94Cu!`IC<JA-5<JwJb=kdp2JN}s=zHq`B>?&RuCG=nBu zgCf*Zj{Ou$_2u23(IqpUcYJ%DzH?S(>;NN;QK{?b4YMw98Fq4J_3KA4khC0K_smNX zG^D~$iXL;LUw9`}HSLCj04NIJk7vt$3)5!3S4SQbRY`DG;P%8{0zOr`8u=ZkJZdSp z=JqZ~$Ku0gz5y4zDhOEz!u`_}{r+EKFIFnZczAg_O63kOt9nF5W5zSy?0nYavb1wU zP))dePmD@!3lJ<ly@mVcb;92RW=6-!fbwHUs1~f9+Ruu$zEO_U{+(d`yjPua%7Ot= z8ec$uwfsnX4yXMxBWr%P-FL|vilm-?@O7Ue9nhE+j2Ot18Y}j#?naMVAglAnlCT*L zQ>ZCn)HxTHmjmh<2I!K<EAaTd6AAxBt&qn9A~5@oFxu6mH;N?$ZWcW2CWHek^5G1p z>~KfbwnUaE+6AOxq@<*0DH{)@B_$<1A|ml|=XHT-xud{?Q2^pvv&MFSWb|pc0!sGb zdNchd8?4r*aJU^SEVk){@jp@LPanFc?*K)eZaus40g`I%`Pkcs*MYC<UrO@JwhVfn z<<__T7qrrbcL>&%(f|9dvI<PfG;QYHvSpYf?Pz-(<QrZK<;^Ji20JWB#|~!UG7CCD z>+6Mpe<T(Z7xtWL%Nx|v8Mb&FoghR%m`-K0E-ozK<Dl^f2t+TM1mdQprTr%*{ud%S zP;|p94Roc9<ms}vTfA=k-hYosU^>_P^p~jpwcOB3{k-hZ_F`<SdIl2+u^hvUmr!T< zNIgCe5&}l$JxtfqK0*It%?{2QX6}!&sE2T11y%9O60K{hkCkIc_g2_(acjxqk>uCm zwJKvBV?H)hUzjww_AfVbdl6kv$aoWi?TcOmFQ{wWOy`x?#m9>>TYg(02Y~<^Xd4KA zrz)T7^l`?=#{uD#tgLK{-#Np><0CLNDC{8mzM<@N#IC8J@sb;dSyi_n)Y+HhKlRsQ z|84u|NTcYMVb&mGGkVy(HK19fN*wfCar;JD4`LIkF`uFsZ3^cw*Un=C`g;q_+)fo7 z5egeZi<$6IEuzGxg~Xt*tnt|aPl*t)W5%1+37P{DKkBr?W^Pg8$Oy&LHx4wGb^2}d z3Yx@;ct(Q&k_}ABA*6cEqD%;w5&>Qum~xfpzek~_uD*3NU-2te^H(#NJUwRq1i*f9 zCe2nQT%5=v^30dp9$a`Su;Rh8n`&luE{0xolu11fjSzGwAxeQj^Xng@GGi!g!g&=x z>6bd*sF47@(rjLBvKFkkNzft{q0&c>U_%&_p0-N=JmKHSOI}PtlE(HQ2MucRCwv<g z#Z4M2DZ@pAGx@9OAq&k3(E`>)T;t*6X5gqD;QhCTsu^5cz{N~}cNP$59h{yj(&3Nz z<rj_2ST*&|`5-8K2Yj)5GwN?&kJhWHW2zDZN<EWRnvUeAyd8==*>F0H`5maianfL| z?n?N#=#M==mqI5^m=qi)?d$rzIeo|$bV+AcL%tp@%BAyfxdE51z0LmPp+PO;E{Rst z9bG_`;r`I;TYL!>CD0sFfsz14g#HztrPF~kwXjc)A23I2>$b+qc@1ud#@F9x;T$@+ zCkL(#Z<4jG*E=`?@E$vZis`D1AggNbFV0`>DP_cP*3Fi0F75cV`16=34Mnh@pFTzA z3?8xGKTeXBW6AaR2EU#!w&WG#G)4$*{4DSFn(LoG`DExwz&GXvIZa|Z<xlhQvHHaW zQFmGZMgdQ%TZ9A<JFhAF2=^>wdiq#kFgBaSz*z@2j}5a!Z1@ZTT)_$&y>=)qYsn$B zj!`%o?|;e)$R{%iP$Q9^S4UveaB5=ZaOLu&1C&-?5j^U_yIiV+gEcNNoZZ3uqczZk z0PNgq!J7zM=*W;2EEpQHfn=1Y8;qWTQO505yM*6@^*&J``%^W*8o)qi0@;5I*5YjR zS6>bS-Of#)vDVKK8@#T<S2=%w3FFQnE8z~h^gcr)lGft0i;n7_|8zp->U8phQUy0= zL7H=_pt0f=?@q+BxMDbpG|Y?~&~`+?584)kC(-}6Xo$GSiWRL2uYOfIgS#061;N?H zd^ZNUfdNEcO?Ll@GRyjnwC3-%erM4hvw8+n+<ptkZ%5Zl_C}iGy>?CT)8D8#9Z&2- zryWUv;@P9yPp7AuJ4tl$&CV+0DHGU7Z(aR~^SCoMauJB^TMj3oSR^3jFi@P=Nh+uj z@n;cj5<3>>nj-%BMBjS7c#_sRhbn&L%EG+fPfxk{AF?F7(7i*Wl{D+|&k|ad%$%w* zfWXfp*t$+>)_UwMkIeA%*4g>vmYYAfxDQq8d%S+UpPv+k<9;oM#160DdPc4-e@bNq zG&KK-3GVUeF<Y{JnfnIxQ2BY?(#Fg?L`>L3teu3;J5<G*k2Qwx-O#Ef;acT9>zr3O z^8Lahe7Aui%wJfEwS5f(McC*^%Kmwn<m6eMFmTkWR2r3r>arWunkqhjr6B#UWdj5< zvVtb<zNLQ=US`2)>j4xRA)91A9e(gFIvbW#r^bffb8066QA*03gCk*_v{4)YSg5b0 zHCbbM&lgcG%Tn9+)->2^d3D|J%Cm^s|2^b=(bsY;q4oco#^C*Qa-+9@$y1^d{^8As zGtGMGxc%-uky$KA1F%GMhpWBhlxt2k%griPzl&kX){3YT`#;iPLL_N?03o5C>UU`D zb80G5)_ilrK_l`wX=W2-mPV%t%r}z8KT5W=@Q_ovOxv&cdaI857dI(@yop*9Cv6Y6 z8cgE)tq3&i^^<hc$d3>}@k)l#>!U3*Y=(Kx7MR3t)>HP0$Kb4#7BYa+EgD$NWv7L} z*W(oOUnzvB3~R+Cq2gA`Fda?Y?ZbWLJ<Ks}f!r5IgTGvWGF*A~%_@u*_8Ya4%yQNW zI!o5Te2bCb`KlWmq-^mUn4%jn$p)U%Fh6^+_M#E_yx422PpSo&6%NM*{znVϪ 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 literal 0 HcmV?d00001 From 5d4e9aa9498c94f1c352432d7bc89f427d067723 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 8 Sep 2018 23:16:02 +0900 Subject: [PATCH 179/539] Show ai image in welcome page --- .../app/desktop/views/pages/welcome.vue | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 441ce890d0..ea1734f8c7 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -22,8 +22,10 @@ </span> </div> - <p class="desc" v-html="description || '%i18n:common.about%'"></p> - <a class="about" @click="about">%i18n:@about%</a> + <div class="desc"> + <span class="desc" v-html="description || '%i18n:common.about%'"></span> + <a class="about" @click="about">%i18n:@about%</a> + </div> <p class="sign"> <span class="signup" @click="signup">%i18n:@signup%</span> @@ -31,7 +33,7 @@ <span class="signin" @click="signin">%i18n:@signin%</span> </p> - <img src="/assets/pointer.png" alt="" class="char"> + <img src="/assets/ai.png" alt="" title="藍" class="char"> </div> </div> @@ -350,10 +352,10 @@ root(isDark) > .body display grid - grid-template-rows 1fr 1fr 256px 64px + grid-template-rows 390px 1fr 256px 64px grid-template-columns 1fr 1fr 350px gap 16px - height 1200px + height 1150px > .main grid-row 1 @@ -384,8 +386,12 @@ root(isDark) > * margin-right 16px + > .desc + max-width calc(100% - 150px) + > .sign font-size 120% + margin-bottom 0 > .divider margin 0 16px @@ -401,9 +407,9 @@ root(isDark) display block position absolute right 16px - bottom 16px - width 180px - opacity 0.3 + bottom 0 + height 320px + opacity 0.7 > *:not(.char) z-index 1 From 6a45bb21c384e722b0c67b0c65608cc62ae62b6a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 8 Sep 2018 23:19:11 +0900 Subject: [PATCH 180/539] =?UTF-8?q?#2668=20=E3=81=AE=E4=B8=80=E9=83=A8?= =?UTF-8?q?=E3=82=92Revert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/app/config.ts | 2 -- src/client/app/mios.ts | 4 ++-- webpack.config.ts | 4 +--- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/client/app/config.ts b/src/client/app/config.ts index 2e464c50f3..a326c521db 100644 --- a/src/client/app/config.ts +++ b/src/client/app/config.ts @@ -5,7 +5,6 @@ declare const _COPYRIGHT_: string; declare const _VERSION_: string; declare const _CODENAME_: string; declare const _ENV_: string; -declare const _NAME_: string; const address = new URL(location.href); @@ -21,4 +20,3 @@ export const copyright = _COPYRIGHT_; export const version = _VERSION_; export const codename = _CODENAME_; export const env = _ENV_; -export const name = _NAME_; diff --git a/src/client/app/mios.ts b/src/client/app/mios.ts index d9d4ee9a07..0f72cd2f34 100644 --- a/src/client/app/mios.ts +++ b/src/client/app/mios.ts @@ -3,7 +3,7 @@ import { EventEmitter } from 'eventemitter3'; import * as uuid from 'uuid'; import initStore from './store'; -import { apiUrl, version, lang, name } from './config'; +import { apiUrl, version, lang } from './config'; import Progress from './common/scripts/loading'; import Connection from './common/scripts/streaming/stream'; import { HomeStreamManager } from './common/scripts/streaming/home'; @@ -72,7 +72,7 @@ export default class MiOS extends EventEmitter { }; public get instanceName() { - return this.meta ? this.meta.data.name : name; + return this.meta ? this.meta.data.name : 'Misskey'; } private isMetaFetching = false; diff --git a/webpack.config.ts b/webpack.config.ts index bc1c0ddbcf..a50d6c40cc 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -22,7 +22,6 @@ const locales = require('./locales'); const meta = require('./package.json'); const version = `${meta.clientVersion}-${rndstr({ length: 8, chars: '0-9a-z' })}`; const codename = meta.codename; -import config from './src/config'; declare var global: { faReplacement: typeof faReplacement; @@ -76,8 +75,7 @@ const consts = { _CODENAME_: codename, _LANG_: '%lang%', _LANGS_: Object.keys(locales).map(l => [l, locales[l].meta.lang]), - _ENV_: process.env.NODE_ENV, - _NAME_: config.name + _ENV_: process.env.NODE_ENV }; const _consts: { [ key: string ]: any } = {}; From 408118a1e8595a8f50e0a002416b25b0c463e23a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 8 Sep 2018 23:20:15 +0900 Subject: [PATCH 181/539] 8.33.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 32396cb64e..0112967b43 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.32.0", - "clientVersion": "1.0.9489", + "version": "8.33.0", + "clientVersion": "1.0.9497", "codename": "nighthike", "main": "./built/index.js", "private": true, From 02c1515a0fe56969d4441e54597a43ef5606dc88 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Sat, 8 Sep 2018 23:30:29 +0900 Subject: [PATCH 182/539] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9412222614..b5c39f39ba 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -<img src="https://github.com/syuilo/misskey/blob/b3f42e62af698a67c2250533c437569559f1fdf9/src/himasaku/resources/himasaku.png?raw=true" align="right" width="320px"/> +<img src="https://github.com/syuilo/misskey/blob/develop/assets/ai-orig.png?raw=true" align="right" height="320px"/> [](https://misskey.xyz/) ================================================================ From 2fe872a9c98e98335324068fb89237165a2d830c Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Sat, 8 Sep 2018 23:34:51 +0900 Subject: [PATCH 183/539] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b5c39f39ba..863731b14e 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ [![][dependencies-badge]][dependencies-link] [](http://makeapullrequest.com) [](https://greenkeeper.io/) -Sophisticated microblogging platform, evolving forever. +**Sophisticated microblogging platform, evolving forever.** [Misskey](https://misskey.xyz) is a decentralized microblogging platform born on Earth. Since it exists within the Fediverse (a universe where various social media platforms are organized), From 0790dd7a2c02a94698f50aad15236ec05bf77437 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 9 Sep 2018 02:45:29 +0900 Subject: [PATCH 184/539] 8.33.1 --- package.json | 2 +- src/models/note.ts | 10 ---------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/package.json b/package.json index 0112967b43..9323ab0ea3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.33.0", + "version": "8.33.1", "clientVersion": "1.0.9497", "codename": "nighthike", "main": "./built/index.js", diff --git a/src/models/note.ts b/src/models/note.ts index 98d37caf22..181ebecf24 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -21,16 +21,6 @@ Note.createIndex('_files.contentType'); Note.createIndex({ createdAt: -1 }); - -// 後方互換性のため -Note.update({}, { - $rename: { - mediaIds: 'fileIds' - } -}, { - multi: true -}); - export default Note; export function isValidText(text: string): boolean { From ea4e2da58d09a664d79f51fa1b6b9d0592839dbf Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Sun, 9 Sep 2018 02:59:14 +0900 Subject: [PATCH 185/539] Fix AP Announce detection (#2672) --- src/remote/activitypub/misc/get-note-html.ts | 3 +-- src/server/activitypub/outbox.ts | 2 +- src/services/note/create.ts | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/remote/activitypub/misc/get-note-html.ts b/src/remote/activitypub/misc/get-note-html.ts index 8df440930b..f92e91c34e 100644 --- a/src/remote/activitypub/misc/get-note-html.ts +++ b/src/remote/activitypub/misc/get-note-html.ts @@ -4,9 +4,8 @@ import parse from '../../../mfm/parse'; import config from '../../../config'; export default function(note: INote) { - if (note.text == null) return null; - let html = toHtml(parse(note.text), note.mentionedRemoteUsers); + if (html == null) html = ''; if (note.poll != null) { const url = `${config.url}/notes/${note._id}`; diff --git a/src/server/activitypub/outbox.ts b/src/server/activitypub/outbox.ts index 9a4c881774..1d062f61a1 100644 --- a/src/server/activitypub/outbox.ts +++ b/src/server/activitypub/outbox.ts @@ -105,7 +105,7 @@ export default async (ctx: Router.IRouterContext) => { * @param note Note */ export async function packActivity(note: INote): Promise<object> { - if (note.renoteId && note.text == null) { + if (note.renoteId && note.text == null && note.poll == null && (note.fileIds == null || note.fileIds.length == 0)) { const renote = await Note.findOne(note.renoteId); return renderAnnounce(renote.uri ? renote.uri : `${config.url}/notes/${renote._id}`, note); } diff --git a/src/services/note/create.ts b/src/services/note/create.ts index c08836c94b..ceb2ab2e2d 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -239,7 +239,7 @@ export default async (user: IUser, data: Option, silent = false) => new Promise< }); async function renderActivity(data: Option, note: INote) { - const content = data.renote && data.text == null + const content = data.renote && data.text == null && data.poll == null && (data.files == null || data.files.length == 0) ? renderAnnounce(data.renote.uri ? data.renote.uri : `${config.url}/notes/${data.renote._id}`, note) : renderCreate(await renderNote(note, false), note); From fd06fd4dc18313100db3f06e771c3c4258f24176 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 01:51:46 +0900 Subject: [PATCH 186/539] Resolve #2560 --- src/server/api/endpoints/notes/create.ts | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/server/api/endpoints/notes/create.ts b/src/server/api/endpoints/notes/create.ts index 47b53c943b..96745132a3 100644 --- a/src/server/api/endpoints/notes/create.ts +++ b/src/server/api/endpoints/notes/create.ts @@ -132,25 +132,14 @@ export default (params: any, user: ILocalUser, app: IApp) => new Promise(async ( let files: IDriveFile[] = []; const fileIds = ps.fileIds != null ? ps.fileIds : ps.mediaIds != null ? ps.mediaIds : null; if (fileIds != null) { - // Fetch files - // forEach だと途中でエラーなどがあっても return できないので - // 敢えて for を使っています。 - for (const fileId of fileIds) { - // Fetch file - // SELECT _id - const entity = await DriveFile.findOne({ + files = await Promise.all(fileIds.map(fileId => { + return DriveFile.findOne({ _id: fileId, 'metadata.userId': user._id }); + })); - if (entity === null) { - return rej('file not found'); - } else { - files.push(entity); - } - } - } else { - files = null; + files = files.filter(file => file != null); } let renote: INote = null; From 6f3996c061023619067bfb043f8b44e688826ae0 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 01:51:57 +0900 Subject: [PATCH 187/539] Update theme color --- src/const.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/const.json b/src/const.json index b93226b2d2..af9a22bce8 100644 --- a/src/const.json +++ b/src/const.json @@ -1,5 +1,5 @@ { "copyright": "Copyright (c) 2014-2018 syuilo", - "themeColor": "#f6584f", + "themeColor": "#fb4e4e", "themeColorForeground": "#fff" } From e07210524f4a43f8bde80468fb2808ba12bfc8be Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 01:54:08 +0900 Subject: [PATCH 188/539] Refactor: Add comments --- src/services/note/create.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/services/note/create.ts b/src/services/note/create.ts index ceb2ab2e2d..1ae363d915 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -107,20 +107,22 @@ export default async (user: IUser, data: Option, silent = false) => new Promise< data.visibleUsers = erase(null, data.visibleUsers); } + // リプライ対象が削除された投稿だったらreject if (data.reply && data.reply.deletedAt != null) { return rej(); } + // Renote対象が削除された投稿だったらreject if (data.renote && data.renote.deletedAt != null) { return rej(); } - // リプライ先が自分以外の非公開の投稿なら禁止 + // リプライ対象が自分以外の非公開の投稿なら禁止 if (data.reply && data.reply.visibility == 'private' && !data.reply.userId.equals(user._id)) { return rej(); } - // Renote先が自分以外の非公開の投稿なら禁止 + // Renote対象が自分以外の非公開の投稿なら禁止 if (data.renote && data.renote.visibility == 'private' && !data.renote.userId.equals(user._id)) { return rej(); } From 1344ffa67dbe74505bd922ac7185a4d41dfdddd7 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 01:55:14 +0900 Subject: [PATCH 189/539] =?UTF-8?q?=E5=89=8A=E9=99=A4=E3=81=95=E3=82=8C?= =?UTF-8?q?=E3=81=9F=E6=8A=95=E7=A8=BF=E3=81=AB=E3=83=AA=E3=82=A2=E3=82=AF?= =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=A7=E3=81=8D=E3=81=AA=E3=81=84?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #1778 --- src/server/api/endpoints/notes/reactions/create.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/server/api/endpoints/notes/reactions/create.ts b/src/server/api/endpoints/notes/reactions/create.ts index 0781db16c5..ec68f065d8 100644 --- a/src/server/api/endpoints/notes/reactions/create.ts +++ b/src/server/api/endpoints/notes/reactions/create.ts @@ -43,6 +43,10 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = return rej('note not found'); } + if (note.deletedAt != null) { + return rej('this not is already deleted'); + } + try { await create(user, note, ps.reaction); } catch (e) { From e32884f07f0b05028a581c73073fa87da08d9fd0 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 01:57:19 +0900 Subject: [PATCH 190/539] Fix #1740 --- src/server/api/endpoints/notes/search_by_tag.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/server/api/endpoints/notes/search_by_tag.ts b/src/server/api/endpoints/notes/search_by_tag.ts index 77082c2600..fadebe4efe 100644 --- a/src/server/api/endpoints/notes/search_by_tag.ts +++ b/src/server/api/endpoints/notes/search_by_tag.ts @@ -128,7 +128,8 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => let q: any = { $and: [{ tagsLower: ps.tag.toLowerCase() - }] + }], + deletedAt: { $exists: false } }; const push = (x: any) => q.$and.push(x); @@ -339,7 +340,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => } if (q.$and.length == 0) { - q = {}; + delete q.$and; } // Search notes From e36d45507ad97f2590fba941d7ab22ebb524486d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 02:07:13 +0900 Subject: [PATCH 191/539] Fix #2513 --- src/services/note/create.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/services/note/create.ts b/src/services/note/create.ts index 1ae363d915..7062bc481b 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -269,13 +269,16 @@ async function publish(user: IUser, note: INote, noteObj: any, reply: INote, ren } if (['private', 'followers', 'specified'].includes(note.visibility)) { - // Publish event to myself's stream - publishUserStream(note.userId, 'note', await pack(note, user, { + const detailPackedNote = await pack(note, user, { detail: true - })); + }); + // Publish event to myself's stream + publishUserStream(note.userId, 'note', detailPackedNote); + publishHybridTimelineStream(note.userId, detailPackedNote); } else { // Publish event to myself's stream publishUserStream(note.userId, 'note', noteObj); + publishHybridTimelineStream(note.userId, noteObj); // Publish note to local and hybrid timeline stream if (note.visibility != 'home') { From eb4f625bbdadd63a32b9d6f09714b721e510defe Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 02:09:33 +0900 Subject: [PATCH 192/539] Fix #2096 --- src/server/api/endpoints/i/update.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 585339e249..953a6aec2a 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -84,6 +84,7 @@ export default async (params: any, user: ILocalUser, app: IApp) => new Promise(a }); if (avatar == null) return rej('avatar not found'); + if (!avatar.contentType.startsWith('image/')) return rej('avatar not an image'); updates.avatarUrl = avatar.metadata.thumbnailUrl || avatar.metadata.url || `${config.drive_url}/${avatar._id}`; @@ -98,6 +99,7 @@ export default async (params: any, user: ILocalUser, app: IApp) => new Promise(a }); if (banner == null) return rej('banner not found'); + if (!banner.contentType.startsWith('image/')) return rej('banner not an image'); updates.bannerUrl = banner.metadata.url || `${config.drive_url}/${banner._id}`; From a32071541a0f76c25a8246e1d324f912a6843cfc Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 02:20:09 +0900 Subject: [PATCH 193/539] Clean up --- src/server/api/endpoints/notes/hybrid-timeline.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/server/api/endpoints/notes/hybrid-timeline.ts b/src/server/api/endpoints/notes/hybrid-timeline.ts index 0eb7b61830..5e39d8c78a 100644 --- a/src/server/api/endpoints/notes/hybrid-timeline.ts +++ b/src/server/api/endpoints/notes/hybrid-timeline.ts @@ -79,9 +79,6 @@ export const meta = { } }; -/** - * Get hybrid timeline of myself - */ export default async (params: any, user: ILocalUser) => { const [ps, psErr] = getParams(meta, params); if (psErr) throw psErr; From d9a1cd082c53e27fe984157b99c26d8e623aeee7 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 02:21:16 +0900 Subject: [PATCH 194/539] #2623 --- src/server/api/endpoints/i/update.ts | 155 ++++++++++++++++----------- 1 file changed, 92 insertions(+), 63 deletions(-) diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 953a6aec2a..6aa4cc1148 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -6,6 +6,7 @@ import acceptAllFollowRequests from '../../../../services/following/requests/acc import { IApp } from '../../../../models/app'; import config from '../../../../config'; import { publishToFollowers } from '../../../../services/i/update'; +import getParams from '../../get-params'; export const meta = { desc: { @@ -15,72 +16,100 @@ export const meta = { requireCredential: true, - kind: 'account-write' + kind: 'account-write', + + params: { + name: $.str.optional.nullable.pipe(isValidName).note({ + desc: { + 'ja-JP': '名前(ハンドルネームやニックネーム)' + } + }), + + description: $.str.optional.nullable.pipe(isValidDescription).note({ + desc: { + 'ja-JP': 'アカウントの説明や自己紹介' + } + }), + + location: $.str.optional.nullable.pipe(isValidLocation).note({ + desc: { + 'ja-JP': '住んでいる地域、所在' + } + }), + + birthday: $.str.optional.nullable.pipe(isValidBirthday).note({ + desc: { + 'ja-JP': '誕生日 (YYYY-MM-DD形式)' + } + }), + + avatarId: $.type(ID).optional.nullable.note({ + desc: { + 'ja-JP': 'アイコンに設定する画像のドライブファイルID' + } + }), + + bannerId: $.type(ID).optional.nullable.note({ + desc: { + 'ja-JP': 'バナーに設定する画像のドライブファイルID' + } + }), + + wallpaperId: $.type(ID).optional.nullable.note({ + desc: { + 'ja-JP': '壁紙に設定する画像のドライブファイルID' + } + }), + + isLocked: $.bool.optional.note({ + desc: { + 'ja-JP': '鍵アカウントか否か' + } + }), + + isBot: $.bool.optional.note({ + desc: { + 'ja-JP': 'Botか否か' + } + }), + + isCat: $.bool.optional.note({ + desc: { + 'ja-JP': '猫か否か' + } + }), + + autoWatch: $.bool.optional.note({ + desc: { + 'ja-JP': '投稿の自動ウォッチをするか否か' + } + }), + } }; export default async (params: any, user: ILocalUser, app: IApp) => new Promise(async (res, rej) => { + const [ps, psErr] = getParams(meta, params); + if (psErr) throw psErr; + const isSecure = user != null && app == null; const updates = {} as any; - // Get 'name' parameter - const [name, nameErr] = $.str.optional.nullable.pipe(isValidName).get(params.name); - if (nameErr) return rej('invalid name param'); - if (name) updates.name = name; + if (ps.name !== undefined) updates.name = ps.name; + if (ps.description !== undefined) updates.description = ps.description; + if (ps.location !== undefined) updates['profile.location'] = ps.location; + if (ps.birthday !== undefined) updates['profile.birthday'] = ps.birthday; + if (ps.avatarId !== undefined) updates.avatarId = ps.avatarId; + if (ps.bannerId !== undefined) updates.bannerId = ps.bannerId; + if (ps.wallpaperId !== undefined) updates.wallpaperId = ps.wallpaperId; + if (typeof ps.isLocked == 'boolean') updates.isLocked = ps.isLocked; + if (typeof ps.isBot == 'boolean') updates.isBot = ps.isBot; + if (typeof ps.isCat == 'boolean') updates.isCat = ps.isCat; + if (typeof ps.autoWatch == 'boolean') updates['settings.autoWatch'] = ps.autoWatch; - // Get 'description' parameter - const [description, descriptionErr] = $.str.optional.nullable.pipe(isValidDescription).get(params.description); - if (descriptionErr) return rej('invalid description param'); - if (description !== undefined) updates.description = description; - - // Get 'location' parameter - const [location, locationErr] = $.str.optional.nullable.pipe(isValidLocation).get(params.location); - if (locationErr) return rej('invalid location param'); - if (location !== undefined) updates['profile.location'] = location; - - // Get 'birthday' parameter - const [birthday, birthdayErr] = $.str.optional.nullable.pipe(isValidBirthday).get(params.birthday); - if (birthdayErr) return rej('invalid birthday param'); - if (birthday !== undefined) updates['profile.birthday'] = birthday; - - // Get 'avatarId' parameter - const [avatarId, avatarIdErr] = $.type(ID).optional.nullable.get(params.avatarId); - if (avatarIdErr) return rej('invalid avatarId param'); - if (avatarId !== undefined) updates.avatarId = avatarId; - - // Get 'bannerId' parameter - const [bannerId, bannerIdErr] = $.type(ID).optional.nullable.get(params.bannerId); - if (bannerIdErr) return rej('invalid bannerId param'); - if (bannerId !== undefined) updates.bannerId = bannerId; - - // Get 'wallpaperId' parameter - const [wallpaperId, wallpaperIdErr] = $.type(ID).optional.nullable.get(params.wallpaperId); - if (wallpaperIdErr) return rej('invalid wallpaperId param'); - if (wallpaperId !== undefined) updates.wallpaperId = wallpaperId; - - // Get 'isLocked' parameter - const [isLocked, isLockedErr] = $.bool.optional.get(params.isLocked); - if (isLockedErr) return rej('invalid isLocked param'); - if (isLocked != null) updates.isLocked = isLocked; - - // Get 'isBot' parameter - const [isBot, isBotErr] = $.bool.optional.get(params.isBot); - if (isBotErr) return rej('invalid isBot param'); - if (isBot != null) updates.isBot = isBot; - - // Get 'isCat' parameter - const [isCat, isCatErr] = $.bool.optional.get(params.isCat); - if (isCatErr) return rej('invalid isCat param'); - if (isCat != null) updates.isCat = isCat; - - // Get 'autoWatch' parameter - const [autoWatch, autoWatchErr] = $.bool.optional.get(params.autoWatch); - if (autoWatchErr) return rej('invalid autoWatch param'); - if (autoWatch != null) updates['settings.autoWatch'] = autoWatch; - - if (avatarId) { + if (ps.avatarId) { const avatar = await DriveFile.findOne({ - _id: avatarId + _id: ps.avatarId }); if (avatar == null) return rej('avatar not found'); @@ -93,9 +122,9 @@ export default async (params: any, user: ILocalUser, app: IApp) => new Promise(a } } - if (bannerId) { + if (ps.bannerId) { const banner = await DriveFile.findOne({ - _id: bannerId + _id: ps.bannerId }); if (banner == null) return rej('banner not found'); @@ -108,13 +137,13 @@ export default async (params: any, user: ILocalUser, app: IApp) => new Promise(a } } - if (wallpaperId !== undefined) { - if (wallpaperId === null) { + if (ps.wallpaperId !== undefined) { + if (ps.wallpaperId === null) { updates.wallpaperUrl = null; updates.wallpaperColor = null; } else { const wallpaper = await DriveFile.findOne({ - _id: wallpaperId + _id: ps.wallpaperId }); if (wallpaper == null) return rej('wallpaper not found'); @@ -144,7 +173,7 @@ export default async (params: any, user: ILocalUser, app: IApp) => new Promise(a publishUserStream(user._id, 'meUpdated', iObj); // 鍵垢を解除したとき、溜まっていたフォローリクエストがあるならすべて承認 - if (user.isLocked && isLocked === false) { + if (user.isLocked && ps.isLocked === false) { acceptAllFollowRequests(user); } From 6ac92ac4b86a2e9aeac55b7e1259a9dedcb7e379 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 02:43:16 +0900 Subject: [PATCH 195/539] Fix #2321 --- src/models/note.ts | 127 +++++++++++++++++++----------------- src/services/note/create.ts | 9 ++- 2 files changed, 75 insertions(+), 61 deletions(-) diff --git a/src/models/note.ts b/src/models/note.ts index 181ebecf24..624bdbdfe8 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -162,6 +162,66 @@ export async function deleteNote(note: string | mongo.ObjectID | INote) { console.log(`Note: deleted ${n._id}`); } +export const hideNote = async (packedNote: any, meId: mongo.ObjectID) => { + let hide = false; + + // visibility が private かつ投稿者のIDが自分のIDではなかったら非表示 + if (packedNote.visibility == 'private' && (meId == null || !meId.equals(packedNote.userId))) { + hide = true; + } + + // visibility が specified かつ自分が指定されていなかったら非表示 + if (packedNote.visibility == 'specified') { + if (meId == null) { + hide = true; + } else if (meId.equals(packedNote.userId)) { + hide = false; + } else { + // 指定されているかどうか + const specified = packedNote.visibleUserIds.some((id: mongo.ObjectID) => id.equals(meId)); + + if (specified) { + hide = false; + } else { + hide = true; + } + } + } + + // visibility が followers かつ自分が投稿者のフォロワーでなかったら非表示 + if (packedNote.visibility == 'followers') { + if (meId == null) { + hide = true; + } else if (meId.equals(packedNote.userId)) { + hide = false; + } else { + // フォロワーかどうか + const following = await Following.findOne({ + followeeId: packedNote.userId, + followerId: meId + }); + + if (following == null) { + hide = true; + } else { + hide = false; + } + } + } + + if (hide) { + packedNote.fileIds = []; + packedNote.files = []; + packedNote.text = null; + packedNote.poll = null; + packedNote.cw = null; + packedNote.tags = []; + packedNote.tagsLower = []; + packedNote.geo = null; + packedNote.isHidden = true; + } +}; + /** * Pack a note for API response * @@ -174,11 +234,13 @@ export const pack = async ( note: string | mongo.ObjectID | INote, me?: string | mongo.ObjectID | IUser, options?: { - detail: boolean + detail?: boolean; + skipHide?: boolean; } ) => { const opts = Object.assign({ - detail: true + detail: true, + skipHide: false }, options); // Me @@ -207,52 +269,6 @@ export const pack = async ( if (!_note) throw `invalid note arg ${note}`; - let hide = false; - - // visibility が private かつ投稿者のIDが自分のIDではなかったら非表示 - if (_note.visibility == 'private' && (meId == null || !meId.equals(_note.userId))) { - hide = true; - } - - // visibility が specified かつ自分が指定されていなかったら非表示 - if (_note.visibility == 'specified') { - if (meId == null) { - hide = true; - } else if (meId.equals(_note.userId)) { - hide = false; - } else { - // 指定されているかどうか - const specified = _note.visibleUserIds.some((id: mongo.ObjectID) => id.equals(meId)); - - if (specified) { - hide = false; - } else { - hide = true; - } - } - } - - // visibility が followers かつ自分が投稿者のフォロワーでなかったら非表示 - if (_note.visibility == 'followers') { - if (meId == null) { - hide = true; - } else if (meId.equals(_note.userId)) { - hide = false; - } else { - // フォロワーかどうか - const following = await Following.findOne({ - followeeId: _note.userId, - followerId: meId - }); - - if (following == null) { - hide = true; - } else { - hide = false; - } - } - } - const id = _note._id; // Rename _id to id @@ -274,7 +290,7 @@ export const pack = async ( } // Populate files - _note.files = hide ? [] : Promise.all(_note.fileIds.map((fileId: mongo.ObjectID) => + _note.files = Promise.all(_note.fileIds.map((fileId: mongo.ObjectID) => packFile(fileId) )); @@ -304,7 +320,7 @@ export const pack = async ( } // Poll - if (meId && _note.poll && !hide) { + if (meId && _note.poll) { _note.poll = (async poll => { const vote = await PollVote .findOne({ @@ -349,15 +365,8 @@ export const pack = async ( _note.text = _note.text.replace(/な/g, 'にゃ').replace(/ナ/g, 'ニャ').replace(/ナ/g, 'ニャ'); } - if (hide) { - _note.fileIds = []; - _note.text = null; - _note.poll = null; - _note.cw = null; - _note.tags = []; - _note.tagsLower = []; - _note.geo = null; - _note.isHidden = true; + if (!opts.skipHide) { + await hideNote(_note, meId); } return _note; diff --git a/src/services/note/create.ts b/src/services/note/create.ts index 7062bc481b..ede3a01014 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -447,6 +447,11 @@ async function publishToUserLists(note: INote, noteObj: any) { } async function publishToFollowers(note: INote, noteObj: any, user: IUser, noteActivity: any) { + const detailPackedNote = await pack(note, null, { + detail: true, + skipHide: true + }); + const followers = await Following.find({ followeeId: note.userId }); @@ -465,10 +470,10 @@ async function publishToFollowers(note: INote, noteObj: any, user: IUser, noteAc } // Publish event to followers stream - publishUserStream(following.followerId, 'note', noteObj); + publishUserStream(following.followerId, 'note', detailPackedNote); if (isRemoteUser(user) || note.visibility != 'public') { - publishHybridTimelineStream(following.followerId, noteObj); + publishHybridTimelineStream(following.followerId, detailPackedNote); } } else { // フォロワーがリモートユーザーかつ投稿者がローカルユーザーなら投稿を配信 From ba05f236bd9588b2f780d8d3e95117a59891b671 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 02:47:34 +0900 Subject: [PATCH 196/539] Resolve #2101 --- src/remote/activitypub/models/note.ts | 2 +- src/remote/activitypub/renderer/note.ts | 1 + src/remote/activitypub/type.ts | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/remote/activitypub/models/note.ts b/src/remote/activitypub/models/note.ts index 97188b44a6..b4afda765a 100644 --- a/src/remote/activitypub/models/note.ts +++ b/src/remote/activitypub/models/note.ts @@ -91,7 +91,7 @@ export async function createNote(value: any, resolver?: Resolver, silent = false const reply = note.inReplyTo ? await resolveNote(note.inReplyTo, resolver) : null; // テキストのパース - const text = htmlToMFM(note.content); + const text = note._misskey_content ? note._misskey_content : htmlToMFM(note.content); // ユーザーの情報が古かったらついでに更新しておく if (actor.updatedAt == null || Date.now() - actor.updatedAt.getTime() > 1000 * 60 * 60 * 24) { diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts index 6b30324ae7..04e131637a 100644 --- a/src/remote/activitypub/renderer/note.ts +++ b/src/remote/activitypub/renderer/note.ts @@ -87,6 +87,7 @@ export default async function renderNote(note: INote, dive = true): Promise<any> attributedTo, summary: note.cw, content: toHtml(note), + _misskey_content_: note.text, published: note.createdAt.toISOString(), to, cc, diff --git a/src/remote/activitypub/type.ts b/src/remote/activitypub/type.ts index 3d40ad48cb..28763d3e83 100644 --- a/src/remote/activitypub/type.ts +++ b/src/remote/activitypub/type.ts @@ -40,6 +40,7 @@ export interface IOrderedCollection extends IObject { export interface INote extends IObject { type: 'Note'; + _misskey_content: string; } export interface IPerson extends IObject { From bc3a5f35124fff69e11e7c23bbd9798be8f9077c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 03:02:06 +0900 Subject: [PATCH 197/539] Fix #2596 --- src/client/app/desktop/views/components/post-form.vue | 8 ++++---- src/client/app/mobile/views/components/post-form.vue | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index b2f0954d97..fd489283f1 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -63,6 +63,7 @@ import MkVisibilityChooser from '../../../common/views/components/visibility-cho import parse from '../../../../../mfm/parse'; import { host } from '../../../config'; import { erase } from '../../../../../prelude/array'; +import parseAcct from '../../../../../misc/acct/parse'; export default Vue.extend({ components: { @@ -337,10 +338,9 @@ export default Vue.extend({ addVisibleUser() { (this as any).apis.input({ title: '%i18n:@enter-username%' - }).then(username => { - (this as any).api('users/show', { - username - }).then(user => { + }).then(acct => { + if (acct.startsWith('@')) acct = acct.substr(1); + (this as any).api('users/show', parseAcct(acct)).then(user => { this.visibleUsers.push(user); }); }); diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index dcb2f16fa4..7e6a4c38e1 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -60,6 +60,7 @@ import getFace from '../../../common/scripts/get-face'; import parse from '../../../../../mfm/parse'; import { host } from '../../../config'; import { erase } from '../../../../../prelude/array'; +import parseAcct from '../../../../../misc/acct/parse'; export default Vue.extend({ components: { @@ -253,10 +254,9 @@ export default Vue.extend({ addVisibleUser() { (this as any).apis.input({ title: '%i18n:@username-prompt%' - }).then(username => { - (this as any).api('users/show', { - username - }).then(user => { + }).then(acct => { + if (acct.startsWith('@')) acct = acct.substr(1); + (this as any).api('users/show', parseAcct(acct)).then(user => { this.visibleUsers.push(user); }); }); From 5b2f15726fffd41e77e7a4b1e594f0f2713eb193 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 03:15:46 +0900 Subject: [PATCH 198/539] Fix #2675 --- src/services/note/create.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/note/create.ts b/src/services/note/create.ts index ede3a01014..94ca246e5b 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -184,7 +184,7 @@ export default async (user: IUser, data: Option, silent = false) => new Promise< const noteActivity = await renderActivity(data, note); - if (isLocalUser(user)) { + if (isLocalUser(user) && note.visibility != 'private') { deliverNoteToMentionedRemoteUsers(mentionedUsers, user, noteActivity); } From 23efaae85ebfa722fba132004a52c2444a614808 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 03:39:00 +0900 Subject: [PATCH 199/539] lint --- src/server/api/endpoints/notes/search_by_tag.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api/endpoints/notes/search_by_tag.ts b/src/server/api/endpoints/notes/search_by_tag.ts index fadebe4efe..11bfe34724 100644 --- a/src/server/api/endpoints/notes/search_by_tag.ts +++ b/src/server/api/endpoints/notes/search_by_tag.ts @@ -125,7 +125,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => ids.forEach(id => ps.excludeUserIds.push(id)); } - let q: any = { + const q: any = { $and: [{ tagsLower: ps.tag.toLowerCase() }], From 0fabb6a057cfc92e2d76070a1baa1f934da4fbb8 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 03:40:01 +0900 Subject: [PATCH 200/539] 8.34.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9323ab0ea3..d981dbf25a 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.33.1", - "clientVersion": "1.0.9497", + "version": "8.34.0", + "clientVersion": "1.0.9559", "codename": "nighthike", "main": "./built/index.js", "private": true, From 507a19248925ad9098956709dfaaba25ed070f54 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 05:45:29 +0900 Subject: [PATCH 201/539] Fix bug --- src/services/note/create.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/services/note/create.ts b/src/services/note/create.ts index 94ca246e5b..771e9cade8 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -278,7 +278,6 @@ async function publish(user: IUser, note: INote, noteObj: any, reply: INote, ren } else { // Publish event to myself's stream publishUserStream(note.userId, 'note', noteObj); - publishHybridTimelineStream(note.userId, noteObj); // Publish note to local and hybrid timeline stream if (note.visibility != 'home') { @@ -287,6 +286,9 @@ async function publish(user: IUser, note: INote, noteObj: any, reply: INote, ren if (note.visibility == 'public') { publishHybridTimelineStream(null, noteObj); + } else { + // Publish event to myself's stream + publishHybridTimelineStream(note.userId, noteObj); } } } From eebed9944c85bbf47381cbd21582321012692b90 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 05:45:59 +0900 Subject: [PATCH 202/539] 8.34.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d981dbf25a..410b23bc52 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.34.0", - "clientVersion": "1.0.9559", + "version": "8.34.1", + "clientVersion": "1.0.9561", "codename": "nighthike", "main": "./built/index.js", "private": true, From 20a9c25d70bac9a87edb04f62515eea290850b4a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 14:48:19 +0900 Subject: [PATCH 203/539] Fix #2677 --- src/services/note/delete.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/note/delete.ts b/src/services/note/delete.ts index 32e736b7a5..b164d59781 100644 --- a/src/services/note/delete.ts +++ b/src/services/note/delete.ts @@ -25,7 +25,8 @@ export default async function(user: IUser, note: INote) { tags: [], fileIds: [], poll: null, - geo: null + geo: null, + cw: null } }); From 77d9ae92f6da8a7a403c5aa276ee789df223ee99 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 15:07:37 +0900 Subject: [PATCH 204/539] 8.34.2 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 410b23bc52..c8f8718439 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.34.1", - "clientVersion": "1.0.9561", + "version": "8.34.2", + "clientVersion": "1.0.9567", "codename": "nighthike", "main": "./built/index.js", "private": true, From f3ab8199a53543f231cdf7c0678b331896b4a133 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 17:40:41 +0900 Subject: [PATCH 205/539] Fix bug --- src/services/drive/add-file.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index d1c7051ab0..a7a5ab5726 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -36,8 +36,8 @@ async function save(path: string, name: string, type: string, hash: string, size if (config.drive && config.drive.storage == 'minio') { const minio = new Minio.Client(config.drive.config); - const key = `${config.drive.prefix}/${uuid.v4()}/${name}`; - const thumbnailKey = `${config.drive.prefix}/${uuid.v4()}/${name}.thumbnail.jpg`; + const key = `${config.drive.prefix}/${uuid.v4()}/${encodeURIComponent(name)}`; + const thumbnailKey = `${config.drive.prefix}/${uuid.v4()}/${encodeURIComponent(name)}.thumbnail.jpg`; const baseUrl = config.drive.baseUrl || `${ config.drive.config.useSSL ? 'https' : 'http' }://${ config.drive.config.endPoint }${ config.drive.config.port ? `:${config.drive.config.port}` : '' }/${ config.drive.bucket }`; From 4dc8351f56416832f156e7e67f548810fc8e4960 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 17:50:34 +0900 Subject: [PATCH 206/539] Optimize booting script --- src/client/app/boot.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/client/app/boot.js b/src/client/app/boot.js index f14cebe7d5..25aa26dd19 100644 --- a/src/client/app/boot.js +++ b/src/client/app/boot.js @@ -18,6 +18,8 @@ return; } + const langs = LANGS; + //#region Load settings let settings = null; const vuex = localStorage.getItem('vuex'); @@ -40,10 +42,10 @@ //#region Detect the user language let lang = null; - if (LANGS.includes(navigator.language)) { + if (langs.includes(navigator.language)) { lang = navigator.language; } else { - lang = LANGS.find(x => x.split('-')[0] == navigator.language); + lang = langs.find(x => x.split('-')[0] == navigator.language); if (lang == null) { // Fallback @@ -52,7 +54,7 @@ } if (settings && settings.device.lang && - LANGS.includes(settings.device.lang)) { + langs.includes(settings.device.lang)) { lang = settings.device.lang; } //#endregion From b24f368d3f207554735e4edc5c5a2b7e16a6d281 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Acid=20Chicken=20=28=E7=A1=AB=E9=85=B8=E9=B6=8F=29?= <root@acid-chicken.com> Date: Mon, 10 Sep 2018 18:02:46 +0900 Subject: [PATCH 207/539] =?UTF-8?q?=E3=82=B5=E3=83=AD=E3=82=B2=E3=83=BC?= =?UTF-8?q?=E3=83=88=E3=83=9A=E3=82=A2=E3=82=92=E5=AD=97=E6=95=B0=E3=81=AB?= =?UTF-8?q?=E3=82=AB=E3=82=A6=E3=83=B3=E3=83=88=E3=81=97=E3=81=AA=E3=81=84?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E3=81=99=E3=82=8B=20(#2661)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update post-form.vue * Update messaging-message.ts * Update post-form.vue * Update note.ts * Update post-form.vue refs: https://github.com/syuilo/misskey/pull/2661#issuecomment-419579444 * Update post-form.vue refs: https://github.com/syuilo/misskey/pull/2661#issuecomment-419579444 * Update messaging-message.ts refs: https://github.com/syuilo/misskey/pull/2661#issuecomment-419579444 * Update note.ts refs: https://github.com/syuilo/misskey/pull/2661#issuecomment-419579444 * Update post-form.vue refs: https://github.com/syuilo/misskey/pull/2661#discussion_r216175581 * Update post-form.vue * Update post-form.vue refs: https://github.com/syuilo/misskey/pull/2661#discussion_r216242002 * Update post-form.vue refs: https://github.com/syuilo/misskey/pull/2661#discussion_r216242105 --- src/client/app/desktop/views/components/post-form.vue | 9 +++++++-- src/client/app/mobile/views/components/post-form.vue | 7 ++++++- src/models/messaging-message.ts | 3 ++- src/models/note.ts | 5 +++-- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index fd489283f1..483a51b0ae 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -45,7 +45,7 @@ <span v-if="visibility === 'specified'">%fa:envelope%</span> <span v-if="visibility === 'private'">%fa:lock%</span> </button> - <p class="text-count" :class="{ over: text.length > 1000 }">{{ 1000 - text.length }}</p> + <p class="text-count" :class="{ over: this.trimmedLength(text) > 1000 }">{{ 1000 - this.trimmedLength(text) }}</p> <button :class="{ posting }" class="submit" :disabled="!canPost" @click="post"> {{ posting ? '%i18n:@posting%' : submitText }}<mk-ellipsis v-if="posting"/> </button> @@ -63,6 +63,7 @@ import MkVisibilityChooser from '../../../common/views/components/visibility-cho import parse from '../../../../../mfm/parse'; import { host } from '../../../config'; import { erase } from '../../../../../prelude/array'; +import { length } from 'stringz'; import parseAcct from '../../../../../misc/acct/parse'; export default Vue.extend({ @@ -147,7 +148,7 @@ export default Vue.extend({ canPost(): boolean { return !this.posting && (1 <= this.text.length || 1 <= this.files.length || this.poll || this.renote) && - (this.text.trim().length <= 1000); + (length(this.text.trim()) <= 1000); } }, @@ -199,6 +200,10 @@ export default Vue.extend({ }, methods: { + trimmedLength(text: string) { + return length(text.trim()); + }, + addTag(tag: string) { insertTextAtCursor(this.$refs.text, ` #${tag} `); }, diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 7e6a4c38e1..be20b11f14 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -4,7 +4,7 @@ <header> <button class="cancel" @click="cancel">%fa:times%</button> <div> - <span class="text-count" :class="{ over: text.length > 1000 }">{{ 1000 - text.length }}</span> + <span class="text-count" :class="{ over: trimmedLength(text) > 1000 }">{{ 1000 - trimmedLength(text) }}</span> <span class="geo" v-if="geo">%fa:map-marker-alt%</span> <button class="submit" :disabled="!canPost" @click="post">{{ submitText }}</button> </div> @@ -60,6 +60,7 @@ import getFace from '../../../common/scripts/get-face'; import parse from '../../../../../mfm/parse'; import { host } from '../../../config'; import { erase } from '../../../../../prelude/array'; +import { length } from 'stringz'; import parseAcct from '../../../../../misc/acct/parse'; export default Vue.extend({ @@ -180,6 +181,10 @@ export default Vue.extend({ }, methods: { + trimmedLength(text: string) { + return length(text.trim()); + }, + addTag(tag: string) { insertTextAtCursor(this.$refs.text, ` #${tag} `); }, diff --git a/src/models/messaging-message.ts b/src/models/messaging-message.ts index f46abd506d..d778164de0 100644 --- a/src/models/messaging-message.ts +++ b/src/models/messaging-message.ts @@ -4,6 +4,7 @@ import { pack as packUser } from './user'; import { pack as packFile } from './drive-file'; import db from '../db/mongodb'; import MessagingHistory, { deleteMessagingHistory } from './messaging-history'; +import { length } from 'stringz'; const MessagingMessage = db.get<IMessagingMessage>('messagingMessages'); export default MessagingMessage; @@ -19,7 +20,7 @@ export interface IMessagingMessage { } export function isValidText(text: string): boolean { - return text.length <= 1000 && text.trim() != ''; + return length(text.trim()) <= 1000 && text.trim() != ''; } /** diff --git a/src/models/note.ts b/src/models/note.ts index 624bdbdfe8..6530d0b324 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -2,6 +2,7 @@ import * as mongo from 'mongodb'; const deepcopy = require('deepcopy'); import rap from '@prezzemolo/rap'; import db from '../db/mongodb'; +import { length } from 'stringz'; import { IUser, pack as packUser } from './user'; import { pack as packApp } from './app'; import PollVote, { deletePollVote } from './poll-vote'; @@ -24,11 +25,11 @@ Note.createIndex({ export default Note; export function isValidText(text: string): boolean { - return text.length <= 1000 && text.trim() != ''; + return length(text.trim()) <= 1000 && text.trim() != ''; } export function isValidCw(text: string): boolean { - return text.length <= 100; + return length(text.trim()) <= 100; } export type INote = { From c6e69ffae479a986d09f70001d09dfd35a89615c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 18:07:38 +0900 Subject: [PATCH 208/539] 8.34.3 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index c8f8718439..6c24ae56a6 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.34.2", - "clientVersion": "1.0.9567", + "version": "8.34.3", + "clientVersion": "1.0.9572", "codename": "nighthike", "main": "./built/index.js", "private": true, From b847886254329e6e249c920bc58b51becfa17e4b Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Mon, 10 Sep 2018 18:32:51 +0900 Subject: [PATCH 209/539] fix docs (#2678) --- docs/setup.ja.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/setup.ja.md b/docs/setup.ja.md index 609f3e9aa5..e1ed63cab4 100644 --- a/docs/setup.ja.md +++ b/docs/setup.ja.md @@ -10,7 +10,7 @@ Misskeyサーバーの構築にご関心をお寄せいただきありがとう *1.* Misskeyユーザーの作成 ---------------------------------------------------------------- -Misskeyのrootで実行しない方がよいため、代わりにユーザーを作成します。 +Misskeyはrootユーザーで実行しない方がよいため、代わりにユーザーを作成します。 Debianの例: ``` From 62db650e3c279952d7a16d3c53614890b50e930b Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 21:17:49 +0900 Subject: [PATCH 210/539] Revert "Fix bug" This reverts commit f3ab8199a53543f231cdf7c0678b331896b4a133. --- src/services/drive/add-file.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index a7a5ab5726..d1c7051ab0 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -36,8 +36,8 @@ async function save(path: string, name: string, type: string, hash: string, size if (config.drive && config.drive.storage == 'minio') { const minio = new Minio.Client(config.drive.config); - const key = `${config.drive.prefix}/${uuid.v4()}/${encodeURIComponent(name)}`; - const thumbnailKey = `${config.drive.prefix}/${uuid.v4()}/${encodeURIComponent(name)}.thumbnail.jpg`; + const key = `${config.drive.prefix}/${uuid.v4()}/${name}`; + const thumbnailKey = `${config.drive.prefix}/${uuid.v4()}/${name}.thumbnail.jpg`; const baseUrl = config.drive.baseUrl || `${ config.drive.config.useSSL ? 'https' : 'http' }://${ config.drive.config.endPoint }${ config.drive.config.port ? `:${config.drive.config.port}` : '' }/${ config.drive.bucket }`; From 5b09209ef9f406ef7f6c3bcac7ec59c303e51fc4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 21:36:43 +0900 Subject: [PATCH 211/539] Fix bug --- src/services/drive/add-file.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index d1c7051ab0..828ebcbb94 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -36,8 +36,11 @@ async function save(path: string, name: string, type: string, hash: string, size if (config.drive && config.drive.storage == 'minio') { const minio = new Minio.Client(config.drive.config); - const key = `${config.drive.prefix}/${uuid.v4()}/${name}`; - const thumbnailKey = `${config.drive.prefix}/${uuid.v4()}/${name}.thumbnail.jpg`; + + const keyDir = `${config.drive.prefix}/${uuid.v4()}`; + const key = `${keyDir}/${name}`; + const thumbnailKeyDir = `${config.drive.prefix}/${uuid.v4()}`; + const thumbnailKey = `${thumbnailKeyDir}/${name}.thumbnail.jpg`; const baseUrl = config.drive.baseUrl || `${ config.drive.config.useSSL ? 'https' : 'http' }://${ config.drive.config.endPoint }${ config.drive.config.port ? `:${config.drive.config.port}` : '' }/${ config.drive.bucket }`; @@ -61,8 +64,8 @@ async function save(path: string, name: string, type: string, hash: string, size key: key, thumbnailKey: thumbnailKey }, - url: `${ baseUrl }/${ key }`, - thumbnailUrl: thumbnail ? `${ baseUrl }/${ thumbnailKey }` : null + url: `${ baseUrl }/${ keyDir }/${ encodeURIComponent(name) }`, + thumbnailUrl: thumbnail ? `${ baseUrl }/${ thumbnailKeyDir }/${ encodeURIComponent(name) }.thumbnail.jpg` : null }); const file = await DriveFile.insert({ From fe3dd25bc392032f5212b0769ff70950c857fd99 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 10 Sep 2018 21:40:14 +0900 Subject: [PATCH 212/539] 8.34.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6c24ae56a6..304c309a52 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.34.3", + "version": "8.34.4", "clientVersion": "1.0.9572", "codename": "nighthike", "main": "./built/index.js", From 1fea2cdcbe341bb56be1cd2b79a8115b482fab65 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 11 Sep 2018 20:57:25 +0900 Subject: [PATCH 213/539] Fix bug --- src/server/api/stream/home.ts | 14 +++++++------- src/server/api/stream/hybrid-timeline.ts | 14 +++++++------- src/server/api/stream/local-timeline.ts | 14 +++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/server/api/stream/home.ts b/src/server/api/stream/home.ts index dc3ce9d19f..5f3b6744b2 100644 --- a/src/server/api/stream/home.ts +++ b/src/server/api/stream/home.ts @@ -36,6 +36,13 @@ export default async function( // Subscribe Home stream channel subscriber.on(`user-stream:${user._id}`, async x => { + // Renoteなら再pack + if (x.type == 'note' && x.body.renoteId != null) { + x.body.renote = await pack(x.body.renoteId, user, { + detail: true + }); + } + //#region 流れてきたメッセージがミュートしているユーザーが関わるものだったら無視する if (x.type == 'note') { if (mutedUserIds.includes(x.body.userId)) { @@ -54,13 +61,6 @@ export default async function( } //#endregion - // Renoteなら再pack - if (x.type == 'note' && x.body.renoteId != null) { - x.body.renote = await pack(x.body.renoteId, user, { - detail: true - }); - } - connection.send(JSON.stringify(x)); }); diff --git a/src/server/api/stream/hybrid-timeline.ts b/src/server/api/stream/hybrid-timeline.ts index c401145abe..d0dae9b0dd 100644 --- a/src/server/api/stream/hybrid-timeline.ts +++ b/src/server/api/stream/hybrid-timeline.ts @@ -19,6 +19,13 @@ export default async function( subscriber.on(`hybrid-timeline:${user._id}`, onEvent); async function onEvent(note: any) { + // Renoteなら再pack + if (note.renoteId != null) { + note.renote = await pack(note.renoteId, user, { + detail: true + }); + } + //#region 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する if (mutedUserIds.indexOf(note.userId) != -1) { return; @@ -31,13 +38,6 @@ export default async function( } //#endregion - // Renoteなら再pack - if (note.renoteId != null) { - note.renote = await pack(note.renoteId, user, { - detail: true - }); - } - connection.send(JSON.stringify({ type: 'note', body: note diff --git a/src/server/api/stream/local-timeline.ts b/src/server/api/stream/local-timeline.ts index 25e0e00c9f..e21c071bab 100644 --- a/src/server/api/stream/local-timeline.ts +++ b/src/server/api/stream/local-timeline.ts @@ -16,6 +16,13 @@ export default async function( // Subscribe stream subscriber.on('local-timeline', async note => { + // Renoteなら再pack + if (note.renoteId != null) { + note.renote = await pack(note.renoteId, user, { + detail: true + }); + } + //#region 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する if (mutedUserIds.indexOf(note.userId) != -1) { return; @@ -28,13 +35,6 @@ export default async function( } //#endregion - // Renoteなら再pack - if (note.renoteId != null) { - note.renote = await pack(note.renoteId, user, { - detail: true - }); - } - connection.send(JSON.stringify({ type: 'note', body: note From bb8139196ec337d58f6e519e197cdc5ab567026e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 12 Sep 2018 01:48:30 +0900 Subject: [PATCH 214/539] Fix wrong indentation --- src/stream.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stream.ts b/src/stream.ts index be7a8c4ba1..38a640c5da 100644 --- a/src/stream.ts +++ b/src/stream.ts @@ -10,7 +10,7 @@ function publish(channel: string, type: string, value?: any): void { { type: type } : { type: type, body: value }; - ev.emit(channel, message); + ev.emit(channel, message); } export function publishUserStream(userId: ID, type: string, value?: any): void { From 046976dffc1aa8bc02259ab4a65e74b1216a0ec3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 12 Sep 2018 02:48:19 +0900 Subject: [PATCH 215/539] Resolve #2691 --- .../app/desktop/views/components/timeline.vue | 11 +- .../views/pages/admin/admin.dashboard.vue | 35 +++-- src/client/app/mobile/views/pages/home.vue | 11 +- src/models/meta.ts | 1 + src/server/api/endpoints/admin/update-meta.ts | 10 ++ src/server/api/endpoints/meta.ts | 1 + src/stream.ts | 135 +++++++++++------- 7 files changed, 142 insertions(+), 62 deletions(-) diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue index 52a7753438..8d72016f22 100644 --- a/src/client/app/desktop/views/components/timeline.vue +++ b/src/client/app/desktop/views/components/timeline.vue @@ -2,8 +2,8 @@ <div class="mk-timeline"> <header> <span :data-active="src == 'home'" @click="src = 'home'">%fa:home% %i18n:@home%</span> - <span :data-active="src == 'local'" @click="src = 'local'">%fa:R comments% %i18n:@local%</span> - <span :data-active="src == 'hybrid'" @click="src = 'hybrid'">%fa:share-alt% %i18n:@hybrid%</span> + <span :data-active="src == 'local'" @click="src = 'local'" v-if="enableLocalTimeline">%fa:R comments% %i18n:@local%</span> + <span :data-active="src == 'hybrid'" @click="src = 'hybrid'" v-if="enableLocalTimeline">%fa:share-alt% %i18n:@hybrid%</span> <span :data-active="src == 'global'" @click="src = 'global'">%fa:globe% %i18n:@global%</span> <span :data-active="src == 'list'" @click="src = 'list'" v-if="list">%fa:list% {{ list.title }}</span> <button @click="chooseList" title="%i18n:@list%">%fa:list%</button> @@ -29,7 +29,8 @@ export default Vue.extend({ data() { return { src: 'home', - list: null + list: null, + enableLocalTimeline: false }; }, @@ -44,6 +45,10 @@ export default Vue.extend({ }, created() { + (this as any).os.getMeta().then(meta => { + this.enableLocalTimeline = !meta.disableLocalTimeline; + }); + if (this.$store.state.device.tl) { this.src = this.$store.state.device.tl.src; if (this.src == 'list') { diff --git a/src/client/app/desktop/views/pages/admin/admin.dashboard.vue b/src/client/app/desktop/views/pages/admin/admin.dashboard.vue index ebb54d782e..c86c30db17 100644 --- a/src/client/app/desktop/views/pages/admin/admin.dashboard.vue +++ b/src/client/app/desktop/views/pages/admin/admin.dashboard.vue @@ -1,22 +1,34 @@ <template> <div class="obdskegsannmntldydackcpzezagxqfy mk-admin-card"> <header>%i18n:@dashboard%</header> + <div v-if="stats" class="stats"> <div><b>%fa:user% {{ stats.originalUsersCount | number }}</b><span>%i18n:@original-users%</span></div> <div><span>%fa:user% {{ stats.usersCount | number }}</span><span>%i18n:@all-users%</span></div> <div><b>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</b><span>%i18n:@original-notes%</span></div> <div><span>%fa:pencil-alt% {{ stats.notesCount | number }}</span><span>%i18n:@all-notes%</span></div> </div> + <div class="cpu-memory"> <x-cpu-memory :connection="connection"/> </div> - <div> - <label> - <input type="checkbox" v-model="disableRegistration" @change="updateMeta"> - <span>disableRegistration</span> - </label> - <button class="ui" @click="invite">%i18n:@invite%</button> - <p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p> + + <div class="form"> + <div> + <label> + <input type="checkbox" v-model="disableRegistration" @change="updateMeta"> + <span>%i18n:@disableRegistration%</span> + </label> + <button class="ui" @click="invite">%i18n:@invite%</button> + <p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p> + </div> + + <div> + <label> + <input type="checkbox" v-model="disableLocalTimeline" @change="updateMeta"> + <span>%i18n:@disableLocalTimeline%</span> + </label> + </div> </div> </div> </template> @@ -33,6 +45,7 @@ export default Vue.extend({ return { stats: null, disableRegistration: false, + disableLocalTimeline: false, inviteCode: null, connection: null, connectionId: null @@ -44,6 +57,7 @@ export default Vue.extend({ (this as any).os.getMeta().then(meta => { this.disableRegistration = meta.disableRegistration; + this.disableLocalTimeline = meta.disableLocalTimeline; }); (this as any).api('stats').then(stats => { @@ -61,7 +75,8 @@ export default Vue.extend({ }, updateMeta() { (this as any).api('admin/update-meta', { - disableRegistration: this.disableRegistration + disableRegistration: this.disableRegistration, + disableLocalTimeline: this.disableLocalTimeline }); } } @@ -97,4 +112,8 @@ export default Vue.extend({ border solid 1px #eee border-radius: 8px + > .form + > div + border-bottom solid 1px #eee + </style> diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue index 706c9cd28b..333ca1a7a1 100644 --- a/src/client/app/mobile/views/pages/home.vue +++ b/src/client/app/mobile/views/pages/home.vue @@ -24,8 +24,8 @@ <div class="body"> <div> <span :data-active="src == 'home'" @click="src = 'home'">%fa:home% %i18n:@home%</span> - <span :data-active="src == 'local'" @click="src = 'local'">%fa:R comments% %i18n:@local%</span> - <span :data-active="src == 'hybrid'" @click="src = 'hybrid'">%fa:share-alt% %i18n:@hybrid%</span> + <span :data-active="src == 'local'" @click="src = 'local'" v-if="enableLocalTimeline">%fa:R comments% %i18n:@local%</span> + <span :data-active="src == 'hybrid'" @click="src = 'hybrid'" v-if="enableLocalTimeline">%fa:share-alt% %i18n:@hybrid%</span> <span :data-active="src == 'global'" @click="src = 'global'">%fa:globe% %i18n:@global%</span> <template v-if="lists"> <span v-for="l in lists" :data-active="src == 'list' && list == l" @click="src = 'list'; list = l" :key="l.id">%fa:list% {{ l.title }}</span> @@ -60,7 +60,8 @@ export default Vue.extend({ src: 'home', list: null, lists: null, - showNav: false + showNav: false, + enableLocalTimeline: false }; }, @@ -85,6 +86,10 @@ export default Vue.extend({ }, created() { + (this as any).os.getMeta().then(meta => { + this.enableLocalTimeline = !meta.disableLocalTimeline; + }); + if (this.$store.state.device.tl) { this.src = this.$store.state.device.tl.src; if (this.src == 'list') { diff --git a/src/models/meta.ts b/src/models/meta.ts index 4f1977f3b5..8ca68416f8 100644 --- a/src/models/meta.ts +++ b/src/models/meta.ts @@ -12,5 +12,6 @@ export type IMeta = { originalUsersCount: number; }; disableRegistration?: boolean; + disableLocalTimeline?: boolean; hidedTags?: string[]; }; diff --git a/src/server/api/endpoints/admin/update-meta.ts b/src/server/api/endpoints/admin/update-meta.ts index f903628774..3f5cd56b2f 100644 --- a/src/server/api/endpoints/admin/update-meta.ts +++ b/src/server/api/endpoints/admin/update-meta.ts @@ -23,6 +23,12 @@ export const meta = { } }), + disableLocalTimeline: $.bool.optional.nullable.note({ + desc: { + 'ja-JP': 'ローカルタイムライン(とソーシャルタイムライン)を無効にするか否か' + } + }), + hidedTags: $.arr($.str).optional.nullable.note({ desc: { 'ja-JP': '統計などで無視するハッシュタグ' @@ -45,6 +51,10 @@ export default (params: any) => new Promise(async (res, rej) => { set.disableRegistration = ps.disableRegistration; } + if (typeof ps.disableLocalTimeline === 'boolean') { + set.disableLocalTimeline = ps.disableLocalTimeline; + } + if (Array.isArray(ps.hidedTags)) { set.hidedTags = ps.hidedTags; } diff --git a/src/server/api/endpoints/meta.ts b/src/server/api/endpoints/meta.ts index 4472d8d779..18b0882f76 100644 --- a/src/server/api/endpoints/meta.ts +++ b/src/server/api/endpoints/meta.ts @@ -34,6 +34,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => }, broadcasts: meta.broadcasts, disableRegistration: meta.disableRegistration, + disableLocalTimeline: meta.disableLocalTimeline, driveCapacityPerLocalUserMb: config.localDriveCapacityMb, recaptchaSitekey: config.recaptcha ? config.recaptcha.site_key : null, swPublickey: config.sw ? config.sw.public_key : null, diff --git a/src/stream.ts b/src/stream.ts index 38a640c5da..ebc75c875c 100644 --- a/src/stream.ts +++ b/src/stream.ts @@ -1,58 +1,97 @@ import * as mongo from 'mongodb'; import Xev from 'xev'; - -const ev = new Xev(); +import Meta, { IMeta } from './models/meta'; type ID = string | mongo.ObjectID; -function publish(channel: string, type: string, value?: any): void { - const message = type == null ? value : value == null ? - { type: type } : - { type: type, body: value }; +class Publisher { + private ev: Xev; + private meta: IMeta; - ev.emit(channel, message); + constructor() { + this.ev = new Xev(); + + setInterval(async () => { + this.meta = await Meta.findOne({}); + }, 5000); + } + + public getMeta = async () => { + if (this.meta != null) return this.meta; + + this.meta = await Meta.findOne({}); + return this.meta; + } + + private publish = (channel: string, type: string, value?: any): void => { + const message = type == null ? value : value == null ? + { type: type } : + { type: type, body: value }; + + this.ev.emit(channel, message); + } + + public publishUserStream = (userId: ID, type: string, value?: any): void => { + this.publish(`user-stream:${userId}`, type, typeof value === 'undefined' ? null : value); + } + + public publishDriveStream = (userId: ID, type: string, value?: any): void => { + this.publish(`drive-stream:${userId}`, type, typeof value === 'undefined' ? null : value); + } + + public publishNoteStream = (noteId: ID, type: string): void => { + this.publish(`note-stream:${noteId}`, null, noteId); + } + + public publishUserListStream = (listId: ID, type: string, value?: any): void => { + this.publish(`user-list-stream:${listId}`, type, typeof value === 'undefined' ? null : value); + } + + public publishMessagingStream = (userId: ID, otherpartyId: ID, type: string, value?: any): void => { + this.publish(`messaging-stream:${userId}-${otherpartyId}`, type, typeof value === 'undefined' ? null : value); + } + + public publishMessagingIndexStream = (userId: ID, type: string, value?: any): void => { + this.publish(`messaging-index-stream:${userId}`, type, typeof value === 'undefined' ? null : value); + } + + public publishReversiStream = (userId: ID, type: string, value?: any): void => { + this.publish(`reversi-stream:${userId}`, type, typeof value === 'undefined' ? null : value); + } + + public publishReversiGameStream = (gameId: ID, type: string, value?: any): void => { + this.publish(`reversi-game-stream:${gameId}`, type, typeof value === 'undefined' ? null : value); + } + + public publishLocalTimelineStream = async (note: any): Promise<void> => { + const meta = await this.getMeta(); + if (meta.disableLocalTimeline) return; + this.publish('local-timeline', null, note); + } + + public publishHybridTimelineStream = async (userId: ID, note: any): Promise<void> => { + const meta = await this.getMeta(); + if (meta.disableLocalTimeline) return; + this.publish(userId ? `hybrid-timeline:${userId}` : 'hybrid-timeline', null, note); + } + + public publishGlobalTimelineStream = (note: any): void => { + this.publish('global-timeline', null, note); + } } -export function publishUserStream(userId: ID, type: string, value?: any): void { - publish(`user-stream:${userId}`, type, typeof value === 'undefined' ? null : value); -} +const publisher = new Publisher(); -export function publishDriveStream(userId: ID, type: string, value?: any): void { - publish(`drive-stream:${userId}`, type, typeof value === 'undefined' ? null : value); -} +export default publisher; -export function publishNoteStream(noteId: ID, type: string): void { - publish(`note-stream:${noteId}`, null, noteId); -} - -export function publishUserListStream(listId: ID, type: string, value?: any): void { - publish(`user-list-stream:${listId}`, type, typeof value === 'undefined' ? null : value); -} - -export function publishMessagingStream(userId: ID, otherpartyId: ID, type: string, value?: any): void { - publish(`messaging-stream:${userId}-${otherpartyId}`, type, typeof value === 'undefined' ? null : value); -} - -export function publishMessagingIndexStream(userId: ID, type: string, value?: any): void { - publish(`messaging-index-stream:${userId}`, type, typeof value === 'undefined' ? null : value); -} - -export function publishReversiStream(userId: ID, type: string, value?: any): void { - publish(`reversi-stream:${userId}`, type, typeof value === 'undefined' ? null : value); -} - -export function publishReversiGameStream(gameId: ID, type: string, value?: any): void { - publish(`reversi-game-stream:${gameId}`, type, typeof value === 'undefined' ? null : value); -} - -export function publishLocalTimelineStream(note: any): void { - publish('local-timeline', null, note); -} - -export function publishHybridTimelineStream(userId: ID, note: any): void { - publish(userId ? `hybrid-timeline:${userId}` : 'hybrid-timeline', null, note); -} - -export function publishGlobalTimelineStream(note: any): void { - publish('global-timeline', null, note); -} +export const publishUserStream = publisher.publishUserStream; +export const publishDriveStream = publisher.publishDriveStream; +export const publishNoteStream = publisher.publishNoteStream; +export const publishUserListStream = publisher.publishUserListStream; +export const publishMessagingStream = publisher.publishMessagingStream; +export const publishMessagingIndexStream = publisher.publishMessagingIndexStream; +export const publishReversiStream = publisher.publishReversiStream; +export const publishReversiGameStream = publisher.publishReversiGameStream; +export const publishLocalTimelineStream = publisher.publishLocalTimelineStream; +export const publishHybridTimelineStream = publisher.publishHybridTimelineStream; +export const publishGlobalTimelineStream = publisher.publishGlobalTimelineStream; From 0ed197d4d9d40ca93f492a5ecd20e9c861a7f7d2 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Wed, 12 Sep 2018 03:02:14 +0900 Subject: [PATCH 216/539] Use unique (#2695) --- src/client/app/desktop/views/components/post-form.vue | 4 ++-- src/client/app/mobile/views/components/post-form.vue | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index 483a51b0ae..c371940aa3 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -62,7 +62,7 @@ import getFace from '../../../common/scripts/get-face'; import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue'; import parse from '../../../../../mfm/parse'; import { host } from '../../../config'; -import { erase } from '../../../../../prelude/array'; +import { erase, unique } from '../../../../../prelude/array'; import { length } from 'stringz'; import parseAcct from '../../../../../misc/acct/parse'; @@ -397,7 +397,7 @@ export default Vue.extend({ if (this.text && this.text != '') { const hashtags = parse(this.text).filter(x => x.type == 'hashtag').map(x => x.hashtag); const history = JSON.parse(localStorage.getItem('hashtags') || '[]') as string[]; - localStorage.setItem('hashtags', JSON.stringify(hashtags.concat(history).reduce((a, c) => a.includes(c) ? a : [...a, c], []))); + localStorage.setItem('hashtags', JSON.stringify(unique(hashtags.concat(history)))); } }, diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index be20b11f14..212451a5bc 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -308,7 +308,7 @@ export default Vue.extend({ if (this.text && this.text != '') { const hashtags = parse(this.text).filter(x => x.type == 'hashtag').map(x => x.hashtag); const history = JSON.parse(localStorage.getItem('hashtags') || '[]') as string[]; - localStorage.setItem('hashtags', JSON.stringify(hashtags.concat(history).reduce((a, c) => a.includes(c) ? a : [...a, c], []))); + localStorage.setItem('hashtags', JSON.stringify(unique(hashtags.concat(history)))); } }, From ca2230f690a77f368126282ba51ec28a46e92dca Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 12 Sep 2018 03:32:47 +0900 Subject: [PATCH 217/539] Refactor --- .../components/misskey-flavored-markdown.ts | 57 +++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/src/client/app/common/views/components/misskey-flavored-markdown.ts b/src/client/app/common/views/components/misskey-flavored-markdown.ts index 44680751f7..224bd6f5de 100644 --- a/src/client/app/common/views/components/misskey-flavored-markdown.ts +++ b/src/client/app/common/views/components/misskey-flavored-markdown.ts @@ -1,4 +1,4 @@ -import Vue from 'vue'; +import Vue, { VNode } from 'vue'; import * as emojilib from 'emojilib'; import { length } from 'stringz'; import parse from '../../../../../mfm/parse'; @@ -6,10 +6,7 @@ import getAcct from '../../../../../misc/acct/render'; import { url } from '../../../config'; import MkUrl from './url.vue'; import MkGoogle from './google.vue'; - -const flatten = list => list.reduce( - (a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), [] -); +import { concat } from '../../../../../prelude/array'; export default Vue.component('misskey-flavored-markdown', { props: { @@ -32,20 +29,20 @@ export default Vue.component('misskey-flavored-markdown', { }, render(createElement) { - let ast; + let ast: any[]; if (this.ast == null) { // Parse text to ast ast = parse(this.text); } else { - ast = this.ast; + ast = this.ast as any[]; } let bigCount = 0; let motionCount = 0; // Parse ast to DOM - const els = flatten(ast.map(token => { + const els = concat(ast.map((token): VNode[] => { switch (token.type) { case 'text': { const text = token.content.replace(/(\r\n|\n|\r)/g, '\n'); @@ -56,12 +53,12 @@ export default Vue.component('misskey-flavored-markdown', { x[x.length - 1].pop(); return x; } else { - return createElement('span', text.replace(/\n/g, ' ')); + return [createElement('span', text.replace(/\n/g, ' '))]; } } case 'bold': { - return createElement('b', token.bold); + return [createElement('b', token.bold)]; } case 'big': { @@ -95,23 +92,23 @@ export default Vue.component('misskey-flavored-markdown', { } case 'url': { - return createElement(MkUrl, { + return [createElement(MkUrl, { props: { url: token.content, target: '_blank' } - }); + })]; } case 'link': { - return createElement('a', { + return [createElement('a', { attrs: { class: 'link', href: token.url, target: '_blank', title: token.url } - }, token.title); + }, token.title)]; } case 'mention': { @@ -129,16 +126,16 @@ export default Vue.component('misskey-flavored-markdown', { } case 'hashtag': { - return createElement('a', { + return [createElement('a', { attrs: { href: `${url}/tags/${encodeURIComponent(token.hashtag)}`, target: '_blank' } - }, token.content); + }, token.content)]; } case 'code': { - return createElement('pre', { + return [createElement('pre', { class: 'code' }, [ createElement('code', { @@ -146,15 +143,15 @@ export default Vue.component('misskey-flavored-markdown', { innerHTML: token.html } }) - ]); + ])]; } case 'inline-code': { - return createElement('code', { + return [createElement('code', { domProps: { innerHTML: token.html } - }); + })]; } case 'quote': { @@ -164,43 +161,45 @@ export default Vue.component('misskey-flavored-markdown', { const x = text2.split('\n') .map(t => [createElement('span', t), createElement('br')]); x[x.length - 1].pop(); - return createElement('div', { + return [createElement('div', { attrs: { class: 'quote' } - }, x); + }, x)]; } else { - return createElement('span', { + return [createElement('span', { attrs: { class: 'quote' } - }, text2.replace(/\n/g, ' ')); + }, text2.replace(/\n/g, ' '))]; } } case 'title': { - return createElement('div', { + return [createElement('div', { attrs: { class: 'title' } - }, token.title); + }, token.title)]; } case 'emoji': { const emoji = emojilib.lib[token.emoji]; - return createElement('span', emoji ? emoji.char : token.content); + return [createElement('span', emoji ? emoji.char : token.content)]; } case 'search': { - return createElement(MkGoogle, { + return [createElement(MkGoogle, { props: { q: token.query } - }); + })]; } default: { console.log('unknown ast type:', token.type); + + return []; } } })); From 2118fadc48bd4e0756349bffff452426ee2d09c5 Mon Sep 17 00:00:00 2001 From: Aya Morisawa <AyaMorisawa4869@gmail.com> Date: Wed, 12 Sep 2018 03:51:33 +0900 Subject: [PATCH 218/539] Add toUpperCase function (#2697) --- src/mfm/parse/core/syntax-highlighter.ts | 4 ++-- src/prelude/string.ts | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/mfm/parse/core/syntax-highlighter.ts b/src/mfm/parse/core/syntax-highlighter.ts index c5157ca1d3..83aac89f1b 100644 --- a/src/mfm/parse/core/syntax-highlighter.ts +++ b/src/mfm/parse/core/syntax-highlighter.ts @@ -1,4 +1,4 @@ -import { capitalize } from "../../../prelude/string"; +import { capitalize, toUpperCase } from "../../../prelude/string"; function escape(text: string) { return text @@ -92,7 +92,7 @@ const _keywords = [ const keywords = _keywords .concat(_keywords.map(capitalize)) - .concat(_keywords.map(k => k.toUpperCase())) + .concat(_keywords.map(toUpperCase)) .sort((a, b) => b.length - a.length); const symbols = [ diff --git a/src/prelude/string.ts b/src/prelude/string.ts index 2b89304f16..8855adb905 100644 --- a/src/prelude/string.ts +++ b/src/prelude/string.ts @@ -1,3 +1,7 @@ export function capitalize(s: string): string { - return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase(); + return toUpperCase(s.charAt(0)) + s.slice(1).toLowerCase(); +} + +export function toUpperCase(s: string): string { + return s.toUpperCase(); } From 25ec5a24ab025e3ccc0082ce37946e9b67458bf0 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 12 Sep 2018 06:33:02 +0900 Subject: [PATCH 219/539] Add toLowerCase --- src/prelude/string.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/prelude/string.ts b/src/prelude/string.ts index 8855adb905..cae776bc3d 100644 --- a/src/prelude/string.ts +++ b/src/prelude/string.ts @@ -1,7 +1,11 @@ export function capitalize(s: string): string { - return toUpperCase(s.charAt(0)) + s.slice(1).toLowerCase(); + return toUpperCase(s.charAt(0)) + toLowerCase(s.slice(1)); } export function toUpperCase(s: string): string { return s.toUpperCase(); } + +export function toLowerCase(s: string): string { + return s.toLowerCase(); +} From aa1817737eab9289d8b3fb098dde2f3b62f182dd Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 13 Sep 2018 01:06:18 +0900 Subject: [PATCH 220/539] Fix glitch --- .../app/common/views/components/avatar.vue | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/client/app/common/views/components/avatar.vue b/src/client/app/common/views/components/avatar.vue index c5ac74e537..a2b0fc6bd3 100644 --- a/src/client/app/common/views/components/avatar.vue +++ b/src/client/app/common/views/components/avatar.vue @@ -1,15 +1,15 @@ <template> - <span class="mk-avatar" :class="{ cat }" :title="user | acct" v-if="disableLink && !disablePreview" v-user-preview="user.id" @click="onClick"> - <span class="inner" :style="style"></span> + <span class="mk-avatar" :style="style" :class="{ cat }" :title="user | acct" v-if="disableLink && !disablePreview" v-user-preview="user.id" @click="onClick"> + <span class="inner" :style="icon"></span> </span> - <span class="mk-avatar" :class="{ cat }" :title="user | acct" v-else-if="disableLink && disablePreview" @click="onClick"> - <span class="inner" :style="style"></span> + <span class="mk-avatar" :style="style" :class="{ cat }" :title="user | acct" v-else-if="disableLink && disablePreview" @click="onClick"> + <span class="inner" :style="icon"></span> </span> - <router-link class="mk-avatar" :class="{ cat }" :to="user | userPage" :title="user | acct" :target="target" v-else-if="!disableLink && !disablePreview" v-user-preview="user.id"> - <span class="inner" :style="style"></span> + <router-link class="mk-avatar" :style="style" :class="{ cat }" :to="user | userPage" :title="user | acct" :target="target" v-else-if="!disableLink && !disablePreview" v-user-preview="user.id"> + <span class="inner" :style="icon"></span> </router-link> - <router-link class="mk-avatar" :class="{ cat }" :to="user | userPage" :title="user | acct" :target="target" v-else-if="!disableLink && disablePreview"> - <span class="inner" :style="style"></span> + <router-link class="mk-avatar" :style="style" :class="{ cat }" :to="user | userPage" :title="user | acct" :target="target" v-else-if="!disableLink && disablePreview"> + <span class="inner" :style="icon"></span> </router-link> </template> @@ -42,6 +42,11 @@ export default Vue.extend({ return this.user.isCat && this.$store.state.settings.circleIcons; }, style(): any { + return { + borderRadius: this.$store.state.settings.circleIcons ? '100%' : null + }; + }, + icon(): any { return { backgroundColor: this.lightmode ? `rgb(${this.user.avatarColor.slice(0, 3).join(',')})` From e1a946ab4562e343b9f770788d9d3380dbaf6aa0 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 13 Sep 2018 01:50:21 +0900 Subject: [PATCH 221/539] Fix bug --- src/server/api/endpoints/following/create.ts | 2 +- src/server/api/endpoints/following/delete.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/api/endpoints/following/create.ts b/src/server/api/endpoints/following/create.ts index c9bea0e3d2..00aa904f08 100644 --- a/src/server/api/endpoints/following/create.ts +++ b/src/server/api/endpoints/following/create.ts @@ -57,7 +57,7 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = } // Create following - create(follower, followee); + await create(follower, followee); // Send response res(await pack(followee._id, user)); diff --git a/src/server/api/endpoints/following/delete.ts b/src/server/api/endpoints/following/delete.ts index f3b4a73ae8..cdfbf43cd1 100644 --- a/src/server/api/endpoints/following/delete.ts +++ b/src/server/api/endpoints/following/delete.ts @@ -57,7 +57,7 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = } // Delete following - deleteFollowing(follower, followee); + await deleteFollowing(follower, followee); // Send response res(await pack(followee._id, user)); From f19f92c53886735b5efe166a912209c42a80bfbf Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 13 Sep 2018 01:50:36 +0900 Subject: [PATCH 222/539] Clean up: Remove unused import --- src/client/app/common/views/pages/follow.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/client/app/common/views/pages/follow.vue b/src/client/app/common/views/pages/follow.vue index 05c1329f6d..80a870a257 100644 --- a/src/client/app/common/views/pages/follow.vue +++ b/src/client/app/common/views/pages/follow.vue @@ -32,7 +32,6 @@ <script lang="ts"> import Vue from 'vue'; import parseAcct from '../../../../../misc/acct/parse'; -import getUserName from '../../../../../misc/get-user-name'; import Progress from '../../../common/scripts/loading'; export default Vue.extend({ From b4a30e2a2596be3ebe24235cde1763458c1cac92 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 13 Sep 2018 02:07:03 +0900 Subject: [PATCH 223/539] Refactor: remove needless await --- src/server/api/endpoints/users/followers.ts | 3 +-- src/server/api/endpoints/users/following.ts | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/server/api/endpoints/users/followers.ts b/src/server/api/endpoints/users/followers.ts index 9411873573..7fe3ca9943 100644 --- a/src/server/api/endpoints/users/followers.ts +++ b/src/server/api/endpoints/users/followers.ts @@ -73,8 +73,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => } // Serialize - const users = await Promise.all(following.map(async f => - await pack(f.followerId, me, { detail: true }))); + const users = await Promise.all(following.map(f => pack(f.followerId, me, { detail: true }))); // Response res({ diff --git a/src/server/api/endpoints/users/following.ts b/src/server/api/endpoints/users/following.ts index 7a64d15d7b..0e564fd1b6 100644 --- a/src/server/api/endpoints/users/following.ts +++ b/src/server/api/endpoints/users/following.ts @@ -73,8 +73,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => } // Serialize - const users = await Promise.all(following.map(async f => - await pack(f.followeeId, me, { detail: true }))); + const users = await Promise.all(following.map(f => pack(f.followeeId, me, { detail: true }))); // Response res({ From 8a8c079b2fd974716f85f859c5aa5b64d4361133 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 13 Sep 2018 02:08:17 +0900 Subject: [PATCH 224/539] Improve following/followers view Closes #2235 --- .../views/components/users-list.item.vue | 128 ++++++++---------- .../desktop/views/components/users-list.vue | 26 ++-- 2 files changed, 74 insertions(+), 80 deletions(-) diff --git a/src/client/app/desktop/views/components/users-list.item.vue b/src/client/app/desktop/views/components/users-list.item.vue index 262fd38cd1..f42d577fce 100644 --- a/src/client/app/desktop/views/components/users-list.item.vue +++ b/src/client/app/desktop/views/components/users-list.item.vue @@ -1,17 +1,16 @@ <template> -<div class="root item"> - <mk-avatar class="avatar" :user="user"/> - <div class="main"> - <header> - <router-link class="name" :to="user | userPage" v-user-preview="user.id">{{ user | userName }}</router-link> - <span class="username">@{{ user | acct }}</span> - </header> - <div class="body"> - <p class="followed" v-if="user.isFollowed">%i18n:@followed%</p> - <div class="description">{{ user.description }}</div> +<div class="zvdbznxvfixtmujpsigoccczftvpiwqh"> + <div class="banner" :style="bannerStyle"></div> + <mk-avatar class="avatar" :user="user" :disable-preview="true"/> + <div class="body"> + <router-link :to="user | userPage" class="name">{{ user | userName }}</router-link> + <span class="username">@{{ user | acct }}</span> + <div class="description"> + <misskey-flavored-markdown v-if="user.description" :text="user.description" :i="$store.state.i"/> </div> + <p class="followed" v-if="user.isFollowed">%i18n:@followed%</p> + <mk-follow-button :user="user" :size="'big'"/> </div> - <mk-follow-button :user="user"/> </div> </template> @@ -19,76 +18,69 @@ import Vue from 'vue'; export default Vue.extend({ - props: ['user'] + props: ['user'], + + computed: { + bannerStyle(): any { + if (this.user.bannerUrl == null) return {}; + return { + backgroundColor: this.user.bannerColor && this.user.bannerColor.length == 3 ? `rgb(${ this.user.bannerColor.join(',') })` : null, + backgroundImage: `url(${ this.user.bannerUrl })` + }; + } + }, }); </script> <style lang="stylus" scoped> -.root.item - padding 16px - font-size 16px +.zvdbznxvfixtmujpsigoccczftvpiwqh + $bg = #fff - &:after - content "" - display block - clear both + margin 16px auto + max-width calc(100% - 32px) + font-size 16px + text-align center + background $bg + box-shadow 0 2px 4px rgba(0, 0, 0, 0.1) + + > .banner + height 100px + background-color #f9f4f4 + background-position center + background-size cover > .avatar display block - float left - margin 0 16px 0 0 - width 58px - height 58px - border-radius 8px + margin -40px auto 0 auto + width 80px + height 80px + border-radius 100% + border solid 4px $bg - > .main - float left - width calc(100% - 74px) + > .body + padding 4px 32px 32px 32px - > header - margin-bottom 2px + @media (max-width 400px) + padding 4px 16px 16px 16px - > .name - display inline - margin 0 - padding 0 - color #777 - font-size 1em - font-weight 700 - text-align left - text-decoration none + > .name + font-size 20px + font-weight bold - &:hover - text-decoration underline + > .username + display block + opacity 0.7 - > .username - text-align left - margin 0 0 0 8px - color #ccc + > .description + margin 16px 0 - > .body - > .followed - display inline-block - margin 0 0 4px 0 - padding 2px 8px - vertical-align top - font-size 10px - color #71afc7 - background #eefaff - border-radius 4px - - > .description - cursor default - display block - margin 0 - padding 0 - overflow-wrap break-word - font-size 1.1em - color #717171 - - > .mk-follow-button - position absolute - top 16px - right 16px + > .followed + margin 0 0 16px 0 + padding 0 + line-height 24px + font-size 0.8em + color #71afc7 + background #eefaff + border-radius 4px </style> diff --git a/src/client/app/desktop/views/components/users-list.vue b/src/client/app/desktop/views/components/users-list.vue index 0423db8ed7..05e2f4e5b3 100644 --- a/src/client/app/desktop/views/components/users-list.vue +++ b/src/client/app/desktop/views/components/users-list.vue @@ -33,7 +33,7 @@ export default Vue.extend({ props: ['fetch', 'count', 'youKnowCount'], data() { return { - limit: 30, + limit: 20, mode: 'all', fetching: true, moreFetching: false, @@ -73,10 +73,14 @@ export default Vue.extend({ .mk-users-list height 100% - background #fff + overflow auto + background #eee > nav - z-index 1 + z-index 10 + position sticky + top 0 + background #fff box-shadow 0 1px 0 rgba(#000, 0.1) > div @@ -114,16 +118,14 @@ export default Vue.extend({ background #eee border-radius 20px - > .users - height calc(100% - 54px) - overflow auto + > button + display block + width calc(100% - 32px) + margin 16px + padding 16px - > * - border-bottom solid 1px rgba(#000, 0.05) - - > * - max-width 600px - margin 0 auto + &:hover + background rgba(#000, 0.1) > .no margin 0 From 6d536c61e84c007f92ec8f24682b5a5b8885e1f9 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Wed, 12 Sep 2018 17:48:43 +0000 Subject: [PATCH 225/539] fix(package): update systeminformation to version 3.45.6 Closes #2617 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 304c309a52..88fac6d521 100644 --- a/package.json +++ b/package.json @@ -194,7 +194,7 @@ "stylus": "0.54.5", "stylus-loader": "3.0.2", "summaly": "2.2.0", - "systeminformation": "3.45.1", + "systeminformation": "3.45.6", "syuilo-password-strength": "0.0.1", "textarea-caret": "3.1.0", "tmp": "0.0.33", From c3c885de479cd091f742826f9a3ccfe373880ef5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 13 Sep 2018 02:52:29 +0900 Subject: [PATCH 226/539] 8.35.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 304c309a52..17be739743 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.34.4", - "clientVersion": "1.0.9572", + "version": "8.35.0", + "clientVersion": "1.0.9589", "codename": "nighthike", "main": "./built/index.js", "private": true, From 111f44ce09b6886daab193da1f946cc5d056bef3 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Thu, 13 Sep 2018 05:35:11 +0900 Subject: [PATCH 227/539] Update README.md --- README.md | 43 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 863731b14e..3eff702a5a 100644 --- a/README.md +++ b/README.md @@ -20,13 +20,42 @@ Why don't you take a short break from the hustle and bustle of the city, and div :sparkles: Features ---------------------------------------------------------------- -* Rich text contents -* Reactions -* User lists -* Customizable column view (called MisskeyDeck) -* Customizable widgets -* Private messages -* ActivityPub support + +<img src="/assets/about/post.png" align="left" height="200px"/> + +<h3 align="left">Posting</h3> +<p align="left"> +Just post your idea, hot topics and anything you want to share. You may want to decorate your words, attach your favorite pictures, send files including movies and create a poll - those are the things you can do on Misskey! +</p> + +--- + +<img src="/assets/about/reaction.png" align="right" height="200px"/> + +<h3 align="right">Reactions</h3> +<p align="right"> +Easiest way to tell your emotions. Misskey allows you to add various type of reactions to other’s post. The emotional experience on Misskey will never be on other SNSs which only able to push “likes”. +</p> + +--- + +<img src="/assets/about/ui.png" align="left" height="200px"/> + +<h3 align="left">Interface</h3> +<p align="left"> +No UI fits for everyone. Therefore, Misskey has a highly customizable UI for your taste. You can edit layouts of your timeline, place selectable widgets you can easily move and create your unique home as this place will be your home. +</p> + +--- + +<img src="/assets/about/drive.png" align="right" width="300px"/> + +<h3 align="right">Misskey Drive</h3> +<p align="right"> +Wanna post a picture you have already uploaded? Wish to organize, name and create a folder for your uploaded files? Misskey Drive is the best solution for you. Very easy to share your files online. +</p> + +--- and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz). From 44099c551c354b7c029b9a05e81a15e8729e954f Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Thu, 13 Sep 2018 05:39:12 +0900 Subject: [PATCH 228/539] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3eff702a5a..4de6151080 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ [Misskey](https://misskey.xyz) is a decentralized microblogging platform born on Earth. Since it exists within the Fediverse (a universe where various social media platforms are organized), it is mutually linked with other social media platforms. -Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet? +Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet? [Find instance!](https://joinmisskey.github.io/) <a href="https://www.patreon.com/syuilo"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160" /></a> @@ -57,7 +57,7 @@ Wanna post a picture you have already uploaded? Wish to organize, name and creat --- -and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz). +and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz) or [other instances](https://joinmisskey.github.io/). :package: Create your own instance ---------------------------------------------------------------- From 700f8c9bb4899e684da0cb218f848a60ac4260ab Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 13 Sep 2018 17:44:36 +0900 Subject: [PATCH 229/539] =?UTF-8?q?CW=E3=81=8C=E9=81=A9=E7=94=A8=E3=81=95?= =?UTF-8?q?=E3=82=8C=E3=81=AA=E3=81=84=E7=AE=87=E6=89=80=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../desktop/views/components/note-detail.vue | 106 +++++++++++----- .../desktop/views/components/note-preview.vue | 50 +++++++- .../views/components/notes.note.sub.vue | 63 ++++++++-- .../desktop/views/components/notes.note.vue | 13 +- .../desktop/views/components/renote-form.vue | 4 +- .../desktop/views/pages/deck/deck.note.vue | 2 +- .../mobile/views/components/note-detail.vue | 115 +++++++++++------- .../mobile/views/components/note-preview.vue | 56 +++++++-- .../app/mobile/views/components/note.sub.vue | 56 +++++++-- .../app/mobile/views/components/note.vue | 6 +- .../app/mobile/views/components/post-form.vue | 6 +- 11 files changed, 355 insertions(+), 122 deletions(-) diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index 1e068bd1cd..a0ad089f92 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -37,20 +37,26 @@ </router-link> </header> <div class="body"> - <div class="text"> - <span v-if="p.isHidden" style="opacity: 0.5">%i18n:@private%</span> - <span v-if="p.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span> - <misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i"/> - </div> - <div class="files" v-if="p.files.length > 0"> - <mk-media-list :media-list="p.files" :raw="true"/> - </div> - <mk-poll v-if="p.poll" :note="p"/> - <mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/> - <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> - <div class="map" v-if="p.geo" ref="map"></div> - <div class="renote" v-if="p.renote"> - <mk-note-preview :note="p.renote"/> + <p v-if="p.cw != null" class="cw"> + <span class="text" v-if="p.cw != ''">{{ p.cw }}</span> + <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@hide%' : '%i18n:@see-more%' }}</span> + </p> + <div class="content" v-show="p.cw == null || showContent"> + <div class="text"> + <span v-if="p.isHidden" style="opacity: 0.5">%i18n:@private%</span> + <span v-if="p.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span> + <misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i"/> + </div> + <div class="files" v-if="p.files.length > 0"> + <mk-media-list :media-list="p.files" :raw="true"/> + </div> + <mk-poll v-if="p.poll" :note="p"/> + <mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/> + <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> + <div class="map" v-if="p.geo" ref="map"></div> + <div class="renote" v-if="p.renote"> + <mk-note-preview :note="p.renote"/> + </div> </div> </div> <footer> @@ -105,6 +111,7 @@ export default Vue.extend({ data() { return { + showContent: false, conversation: [], conversationFetching: false, replies: [] @@ -118,17 +125,21 @@ export default Vue.extend({ this.note.fileIds.length == 0 && this.note.poll == null); }, + p(): any { return this.isRenote ? this.note.renote : this.note; }, + reactionsCount(): number { return this.p.reactionCounts ? sum(Object.values(this.p.reactionCounts)) : 0; }, + title(): string { return new Date(this.p.createdAt).toLocaleString(); }, + urls(): string[] { if (this.p.text) { const ast = parse(this.p.text); @@ -183,22 +194,26 @@ export default Vue.extend({ this.conversation = conversation.reverse(); }); }, + reply() { (this as any).os.new(MkPostFormWindow, { reply: this.p }); }, + renote() { (this as any).os.new(MkRenoteFormWindow, { note: this.p }); }, + react() { (this as any).os.new(MkReactionPicker, { source: this.$refs.reactButton, note: this.p }); }, + menu() { (this as any).os.new(MkNoteMenu, { source: this.$refs.menuButton, @@ -326,37 +341,62 @@ root(isDark) > .body padding 8px 0 - > .text + > .cw cursor default display block margin 0 padding 0 overflow-wrap break-word - font-size 1.5em color isDark ? #fff : #717171 - > .renote - margin 8px 0 + > .text + margin-right 8px - > .mk-note-preview - padding 16px - border dashed 1px #c0dac6 - border-radius 8px + > .toggle + display inline-block + padding 4px 8px + font-size 0.7em + color isDark ? #393f4f : #fff + background isDark ? #687390 : #b1b9c1 + border-radius 2px + cursor pointer + user-select none - > .location - margin 4px 0 - font-size 12px - color #ccc + &:hover + background isDark ? #707b97 : #bbc4ce - > .map - width 100% - height 300px + > .content + > .text + cursor default + display block + margin 0 + padding 0 + overflow-wrap break-word + font-size 1.5em + color isDark ? #fff : #717171 - &:empty - display none + > .renote + margin 8px 0 - > .mk-url-preview - margin-top 8px + > * + padding 16px + border dashed 1px #c0dac6 + border-radius 8px + + > .location + margin 4px 0 + font-size 12px + color #ccc + + > .map + width 100% + height 300px + + &:empty + display none + + > .mk-url-preview + margin-top 8px > footer font-size 1.2em diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue index c723db98c0..e7e878849b 100644 --- a/src/client/app/desktop/views/components/note-preview.vue +++ b/src/client/app/desktop/views/components/note-preview.vue @@ -1,10 +1,16 @@ <template> -<div class="mk-note-preview" :title="title"> +<div class="qiziqtywpuaucsgarwajitwaakggnisj" :title="title"> <mk-avatar class="avatar" :user="note.user" v-if="!mini"/> <div class="main"> <mk-note-header class="header" :note="note" :mini="true"/> <div class="body"> - <mk-sub-note-content class="text" :note="note"/> + <p v-if="note.cw != null" class="cw"> + <span class="text" v-if="note.cw != ''">{{ note.cw }}</span> + <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@hide%' : '%i18n:@see-more%' }}</span> + </p> + <div class="content" v-show="note.cw == null || showContent"> + <mk-sub-note-content class="text" :note="note"/> + </div> </div> </div> </div> @@ -25,6 +31,13 @@ export default Vue.extend({ default: false } }, + + data() { + return { + showContent: false + }; + }, + computed: { title(): string { return new Date(this.note.createdAt).toLocaleString(); @@ -52,16 +65,41 @@ root(isDark) > .body - > .text + > .cw cursor default + display block margin 0 padding 0 - color isDark ? #959ba7 : #717171 + overflow-wrap break-word + color isDark ? #fff : #717171 -.mk-note-preview[data-darkmode] + > .text + margin-right 8px + + > .toggle + display inline-block + padding 4px 8px + font-size 0.7em + color isDark ? #393f4f : #fff + background isDark ? #687390 : #b1b9c1 + border-radius 2px + cursor pointer + user-select none + + &:hover + background isDark ? #707b97 : #bbc4ce + + > .content + > .text + cursor default + margin 0 + padding 0 + color isDark ? #959ba7 : #717171 + +.qiziqtywpuaucsgarwajitwaakggnisj[data-darkmode] root(true) -.mk-note-preview:not([data-darkmode]) +.qiziqtywpuaucsgarwajitwaakggnisj:not([data-darkmode]) root(false) </style> diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue index fc851e83e9..15944bebd1 100644 --- a/src/client/app/desktop/views/components/notes.note.sub.vue +++ b/src/client/app/desktop/views/components/notes.note.sub.vue @@ -1,10 +1,16 @@ <template> -<div class="sub" :title="title"> +<div class="tkfdzaxtkdeianobciwadajxzbddorql" :title="title"> <mk-avatar class="avatar" :user="note.user"/> <div class="main"> <mk-note-header class="header" :note="note"/> <div class="body"> - <mk-sub-note-content class="text" :note="note"/> + <p v-if="note.cw != null" class="cw"> + <span class="text" v-if="note.cw != ''">{{ note.cw }}</span> + <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@hide%' : '%i18n:@see-more%' }}</span> + </p> + <div class="content" v-show="note.cw == null || showContent"> + <mk-sub-note-content class="text" :note="note"/> + </div> </div> </div> </div> @@ -14,7 +20,19 @@ import Vue from 'vue'; export default Vue.extend({ - props: ['note'], + props: { + note: { + type: Object, + required: true + } + }, + + data() { + return { + showContent: false + }; + }, + computed: { title(): string { return new Date(this.note.createdAt).toLocaleString(); @@ -48,20 +66,45 @@ root(isDark) > .body - > .text + > .cw cursor default + display block margin 0 padding 0 - color isDark ? #959ba7 : #717171 + overflow-wrap break-word + color isDark ? #fff : #717171 - pre - max-height 120px - font-size 80% + > .text + margin-right 8px -.sub[data-darkmode] + > .toggle + display inline-block + padding 4px 8px + font-size 0.7em + color isDark ? #393f4f : #fff + background isDark ? #687390 : #b1b9c1 + border-radius 2px + cursor pointer + user-select none + + &:hover + background isDark ? #707b97 : #bbc4ce + + > .content + > .text + cursor default + margin 0 + padding 0 + color isDark ? #959ba7 : #717171 + + pre + max-height 120px + font-size 80% + +.tkfdzaxtkdeianobciwadajxzbddorql[data-darkmode] root(true) -.sub:not([data-darkmode]) +.tkfdzaxtkdeianobciwadajxzbddorql:not([data-darkmode]) root(false) </style> diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 75d6ebd628..e1bc8be5a5 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -34,9 +34,7 @@ <mk-poll v-if="p.poll" :note="p" ref="pollViewer"/> <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a> <div class="map" v-if="p.geo" ref="map"></div> - <div class="renote" v-if="p.renote"> - <mk-note-preview :note="p.renote"/> - </div> + <div class="renote" v-if="p.renote"><mk-note-preview :note="p.renote"/></div> <mk-url-preview v-for="url in urls" :url="url" :key="url"/> </div> </div> @@ -96,7 +94,12 @@ export default Vue.extend({ XSub }, - props: ['note'], + props: { + note: { + type: Object, + required: true + } + }, data() { return { @@ -469,7 +472,7 @@ root(isDark) > .renote margin 8px 0 - > .mk-note-preview + > * padding 16px border dashed 1px isDark ? #4e945e : #c0dac6 border-radius 8px diff --git a/src/client/app/desktop/views/components/renote-form.vue b/src/client/app/desktop/views/components/renote-form.vue index 38eab3362f..c5192ecaac 100644 --- a/src/client/app/desktop/views/components/renote-form.vue +++ b/src/client/app/desktop/views/components/renote-form.vue @@ -1,6 +1,6 @@ <template> <div class="mk-renote-form"> - <mk-note-preview :note="note"/> + <mk-note-preview class="preview" :note="note"/> <template v-if="!quote"> <footer> <a class="quote" v-if="!quote" @click="onQuote">%i18n:@quote%</a> @@ -61,7 +61,7 @@ export default Vue.extend({ root(isDark) - > .mk-note-preview + > .preview margin 16px 22px > footer diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index b42df1f347..ec4b9182b7 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -394,7 +394,7 @@ root(isDark) > .renote margin 8px 0 - > .mk-note-preview + > * padding 16px border dashed 1px isDark ? #4e945e : #c0dac6 border-radius 8px diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index d48d9a7790..752e44fd60 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -35,20 +35,26 @@ </div> </header> <div class="body"> - <div class="text"> - <span v-if="p.isHidden" style="opacity: 0.5">(%i18n:@private%)</span> - <span v-if="p.deletedAt" style="opacity: 0.5">(%i18n:@deleted%)</span> - <misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i"/> - </div> - <div class="files" v-if="p.files.length > 0"> - <mk-media-list :media-list="p.files" :raw="true"/> - </div> - <mk-poll v-if="p.poll" :note="p"/> - <mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/> - <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> - <div class="map" v-if="p.geo" ref="map"></div> - <div class="renote" v-if="p.renote"> - <mk-note-preview :note="p.renote"/> + <p v-if="p.cw != null" class="cw"> + <span class="text" v-if="p.cw != ''">{{ p.cw }}</span> + <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@hide%' : '%i18n:@see-more%' }}</span> + </p> + <div class="content" v-show="p.cw == null || showContent"> + <div class="text"> + <span v-if="p.isHidden" style="opacity: 0.5">(%i18n:@private%)</span> + <span v-if="p.deletedAt" style="opacity: 0.5">(%i18n:@deleted%)</span> + <misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i"/> + </div> + <div class="files" v-if="p.files.length > 0"> + <mk-media-list :media-list="p.files" :raw="true"/> + </div> + <mk-poll v-if="p.poll" :note="p"/> + <mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/> + <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> + <div class="map" v-if="p.geo" ref="map"></div> + <div class="renote" v-if="p.renote"> + <mk-note-preview :note="p.renote"/> + </div> </div> </div> <router-link class="time" :to="p | notePage"> @@ -104,6 +110,7 @@ export default Vue.extend({ data() { return { + showContent: false, conversation: [], conversationFetching: false, replies: [] @@ -334,44 +341,70 @@ root(isDark) > .body padding 8px 0 - > .text + > .cw + cursor default display block margin 0 padding 0 overflow-wrap break-word - font-size 16px color isDark ? #fff : #717171 - @media (min-width 500px) - font-size 24px + > .text + margin-right 8px - > .renote - margin 8px 0 + > .toggle + display inline-block + padding 4px 8px + font-size 0.7em + color isDark ? #393f4f : #fff + background isDark ? #687390 : #b1b9c1 + border-radius 2px + cursor pointer + user-select none - > .mk-note-preview - padding 16px - border dashed 1px #c0dac6 - border-radius 8px + &:hover + background isDark ? #707b97 : #bbc4ce - > .location - margin 4px 0 - font-size 12px - color #ccc + > .content - > .map - width 100% - height 200px - - &:empty - display none - - > .mk-url-preview - margin-top 8px - - > .files - > img + > .text display block - max-width 100% + margin 0 + padding 0 + overflow-wrap break-word + font-size 16px + color isDark ? #fff : #717171 + + @media (min-width 500px) + font-size 24px + + > .renote + margin 8px 0 + + > * + padding 16px + border dashed 1px #c0dac6 + border-radius 8px + + > .location + margin 4px 0 + font-size 12px + color #ccc + + > .map + width 100% + height 200px + + &:empty + display none + + > .mk-url-preview + margin-top 8px + + > .files + > img + display block + max-width 100% > .time font-size 16px diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue index 5d56d2d326..a85434407f 100644 --- a/src/client/app/mobile/views/components/note-preview.vue +++ b/src/client/app/mobile/views/components/note-preview.vue @@ -1,10 +1,16 @@ <template> -<div class="mk-note-preview" :class="{ smart: $store.state.device.postStyle == 'smart' }"> +<div class="yohlumlkhizgfkvvscwfcrcggkotpvry" :class="{ smart: $store.state.device.postStyle == 'smart' }"> <mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle != 'smart'"/> <div class="main"> <mk-note-header class="header" :note="note" :mini="true"/> <div class="body"> - <mk-sub-note-content class="text" :note="note"/> + <p v-if="note.cw != null" class="cw"> + <span class="text" v-if="note.cw != ''">{{ note.cw }}</span> + <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@hide%' : '%i18n:@see-more%' }}</span> + </p> + <div class="content" v-show="note.cw == null || showContent"> + <mk-sub-note-content class="text" :note="note"/> + </div> </div> </div> </div> @@ -14,7 +20,18 @@ import Vue from 'vue'; export default Vue.extend({ - props: ['note'] + props: { + note: { + type: Object, + required: true + } + }, + + data() { + return { + showContent: false + }; + } }); </script> @@ -65,16 +82,41 @@ root(isDark) > .body - > .text + > .cw cursor default + display block margin 0 padding 0 - color isDark ? #959ba7 : #717171 + overflow-wrap break-word + color isDark ? #fff : #717171 -.mk-note-preview[data-darkmode] + > .text + margin-right 8px + + > .toggle + display inline-block + padding 4px 8px + font-size 0.7em + color isDark ? #393f4f : #fff + background isDark ? #687390 : #b1b9c1 + border-radius 2px + cursor pointer + user-select none + + &:hover + background isDark ? #707b97 : #bbc4ce + + > .content + > .text + cursor default + margin 0 + padding 0 + color isDark ? #959ba7 : #717171 + +.yohlumlkhizgfkvvscwfcrcggkotpvry[data-darkmode] root(true) -.mk-note-preview:not([data-darkmode]) +.yohlumlkhizgfkvvscwfcrcggkotpvry:not([data-darkmode]) root(false) </style> diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue index a68aec40a1..77527a1498 100644 --- a/src/client/app/mobile/views/components/note.sub.vue +++ b/src/client/app/mobile/views/components/note.sub.vue @@ -1,10 +1,16 @@ <template> -<div class="sub" :class="{ smart: $store.state.device.postStyle == 'smart' }"> +<div class="zlrxdaqttccpwhpaagdmkawtzklsccam" :class="{ smart: $store.state.device.postStyle == 'smart' }"> <mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle != 'smart'"/> <div class="main"> <mk-note-header class="header" :note="note" :mini="true"/> <div class="body"> - <mk-sub-note-content class="text" :note="note"/> + <p v-if="note.cw != null" class="cw"> + <span class="text" v-if="note.cw != ''">{{ note.cw }}</span> + <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@hide%' : '%i18n:@see-more%' }}</span> + </p> + <div class="content" v-show="note.cw == null || showContent"> + <mk-sub-note-content class="text" :note="note"/> + </div> </div> </div> </div> @@ -24,6 +30,12 @@ export default Vue.extend({ type: Boolean, default: true } + }, + + data() { + return { + showContent: false + }; } }); </script> @@ -77,20 +89,44 @@ root(isDark) margin-bottom 2px > .body - - > .text + > .cw + cursor default + display block margin 0 padding 0 - color isDark ? #959ba7 : #717171 + overflow-wrap break-word + color isDark ? #fff : #717171 - pre - max-height 120px - font-size 80% + > .text + margin-right 8px -.sub[data-darkmode] + > .toggle + display inline-block + padding 4px 8px + font-size 0.7em + color isDark ? #393f4f : #fff + background isDark ? #687390 : #b1b9c1 + border-radius 2px + cursor pointer + user-select none + + &:hover + background isDark ? #707b97 : #bbc4ce + + > .content + > .text + margin 0 + padding 0 + color isDark ? #959ba7 : #717171 + + pre + max-height 120px + font-size 80% + +.zlrxdaqttccpwhpaagdmkawtzklsccam[data-darkmode] root(true) -.sub:not([data-darkmode]) +.zlrxdaqttccpwhpaagdmkawtzklsccam:not([data-darkmode]) root(false) </style> diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 907e728984..c608451e51 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -35,9 +35,7 @@ <mk-url-preview v-for="url in urls" :url="url" :key="url"/> <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a> <div class="map" v-if="p.geo" ref="map"></div> - <div class="renote" v-if="p.renote"> - <mk-note-preview :note="p.renote"/> - </div> + <div class="renote" v-if="p.renote"><mk-note-preview :note="p.renote"/></div> </div> <span class="app" v-if="p.app">via <b>{{ p.app.name }}</b></span> </div> @@ -436,7 +434,7 @@ root(isDark) > .renote margin 8px 0 - > .mk-note-preview + > * padding 16px border dashed 1px isDark ? #4e945e : #c0dac6 border-radius 8px diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 212451a5bc..e53ba48ffb 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -10,8 +10,8 @@ </div> </header> <div class="form"> - <mk-note-preview v-if="reply" :note="reply"/> - <mk-note-preview v-if="renote" :note="renote"/> + <mk-note-preview class="preview" v-if="reply" :note="reply"/> + <mk-note-preview class="preview" v-if="renote" :note="renote"/> <div v-if="visibility == 'specified'" class="visibleUsers"> <span v-for="u in visibleUsers">{{ u | userName }}<a @click="removeVisibleUser(u)">[x]</a></span> <a @click="addVisibleUser">+%i18n:@add-visible-user%</a> @@ -387,7 +387,7 @@ root(isDark) max-width 500px margin 0 auto - > .mk-note-preview + > .preview padding 16px > .visibleUsers From 03e1d3fbc45252b05bf5abdb8ffee28297400acc Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 13 Sep 2018 18:01:50 +0900 Subject: [PATCH 230/539] Refactor --- locales/ja-JP.yml | 8 ++-- .../app/common/views/components/cw-button.vue | 44 +++++++++++++++++++ .../app/common/views/components/index.ts | 2 + .../desktop/views/components/note-detail.vue | 15 +------ .../desktop/views/components/note-preview.vue | 15 +------ .../views/components/notes.note.sub.vue | 15 +------ .../desktop/views/components/notes.note.vue | 15 +------ .../desktop/views/pages/deck/deck.note.vue | 2 +- .../mobile/views/components/note-detail.vue | 15 +------ .../mobile/views/components/note-preview.vue | 15 +------ .../app/mobile/views/components/note.sub.vue | 15 +------ .../app/mobile/views/components/note.vue | 15 +------ 12 files changed, 59 insertions(+), 117 deletions(-) create mode 100644 src/client/app/common/views/components/cw-button.vue diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 9404cd6ba6..98c2f5fe45 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -273,6 +273,10 @@ common/views/components/connect-failed.troubleshooter.vue: flush: "キャッシュの削除" set-version: "バージョン指定" +common/views/components/cw-button.vue: + hide: "隠す" + show: "もっと見る" + common/views/components/messaging.vue: search-user: "ユーザーを探す" you: "あなた" @@ -666,8 +670,6 @@ desktop/views/components/notes.note.vue: detail: "詳細" private: "この投稿は非公開です" deleted: "この投稿は削除されました" - hide: "隠す" - see-more: "もっと見る" desktop/views/components/notes.vue: error: "読み込みに失敗しました。" @@ -1192,8 +1194,6 @@ mobile/views/components/friends-maker.vue: mobile/views/components/note.vue: reposted-by: "{}がRenote" - more: "もっと見る" - less: "隠す" private: "この投稿は非公開です" deleted: "この投稿は削除されました" location: "位置情報" diff --git a/src/client/app/common/views/components/cw-button.vue b/src/client/app/common/views/components/cw-button.vue new file mode 100644 index 0000000000..06087edc93 --- /dev/null +++ b/src/client/app/common/views/components/cw-button.vue @@ -0,0 +1,44 @@ +<template> +<button class="nrvgflfuaxwgkxoynpnumyookecqrrvh" @click="toggle">{{ value ? '%i18n:@hide%' : '%i18n:@show%' }}</button> +</template> + +<script lang="ts"> +import Vue from 'vue'; + +export default Vue.extend({ + props: { + value: { + type: Boolean, + required: true + } + }, + + methods: { + toggle() { + this.$emit('input', !this.value); + } + } +}); +</script> + +<style lang="stylus" scoped> +root(isDark) + display inline-block + padding 4px 8px + font-size 0.7em + color isDark ? #393f4f : #fff + background isDark ? #687390 : #b1b9c1 + border-radius 2px + cursor pointer + user-select none + + &:hover + background isDark ? #707b97 : #bbc4ce + +.nrvgflfuaxwgkxoynpnumyookecqrrvh[data-darkmode] + root(true) + +.nrvgflfuaxwgkxoynpnumyookecqrrvh:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts index 75c6086d7c..6f8152cea2 100644 --- a/src/client/app/common/views/components/index.ts +++ b/src/client/app/common/views/components/index.ts @@ -1,5 +1,6 @@ import Vue from 'vue'; +import cwButton from './cw-button.vue'; import tagCloud from './tag-cloud.vue'; import trends from './trends.vue'; import analogClock from './analog-clock.vue'; @@ -42,6 +43,7 @@ import uiSelect from './ui/select.vue'; import formButton from './ui/form/button.vue'; import formRadio from './ui/form/radio.vue'; +Vue.component('mk-cw-button', cwButton); Vue.component('mk-tag-cloud', tagCloud); Vue.component('mk-trends', trends); Vue.component('mk-analog-clock', analogClock); diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index a0ad089f92..7307eeb7dc 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -39,7 +39,7 @@ <div class="body"> <p v-if="p.cw != null" class="cw"> <span class="text" v-if="p.cw != ''">{{ p.cw }}</span> - <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@hide%' : '%i18n:@see-more%' }}</span> + <mk-cw-button v-model="showContent"/> </p> <div class="content" v-show="p.cw == null || showContent"> <div class="text"> @@ -352,19 +352,6 @@ root(isDark) > .text margin-right 8px - > .toggle - display inline-block - padding 4px 8px - font-size 0.7em - color isDark ? #393f4f : #fff - background isDark ? #687390 : #b1b9c1 - border-radius 2px - cursor pointer - user-select none - - &:hover - background isDark ? #707b97 : #bbc4ce - > .content > .text cursor default diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue index e7e878849b..6c84165356 100644 --- a/src/client/app/desktop/views/components/note-preview.vue +++ b/src/client/app/desktop/views/components/note-preview.vue @@ -6,7 +6,7 @@ <div class="body"> <p v-if="note.cw != null" class="cw"> <span class="text" v-if="note.cw != ''">{{ note.cw }}</span> - <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@hide%' : '%i18n:@see-more%' }}</span> + <mk-cw-button v-model="showContent"/> </p> <div class="content" v-show="note.cw == null || showContent"> <mk-sub-note-content class="text" :note="note"/> @@ -76,19 +76,6 @@ root(isDark) > .text margin-right 8px - > .toggle - display inline-block - padding 4px 8px - font-size 0.7em - color isDark ? #393f4f : #fff - background isDark ? #687390 : #b1b9c1 - border-radius 2px - cursor pointer - user-select none - - &:hover - background isDark ? #707b97 : #bbc4ce - > .content > .text cursor default diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue index 15944bebd1..8f01ddd43c 100644 --- a/src/client/app/desktop/views/components/notes.note.sub.vue +++ b/src/client/app/desktop/views/components/notes.note.sub.vue @@ -6,7 +6,7 @@ <div class="body"> <p v-if="note.cw != null" class="cw"> <span class="text" v-if="note.cw != ''">{{ note.cw }}</span> - <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@hide%' : '%i18n:@see-more%' }}</span> + <mk-cw-button v-model="showContent"/> </p> <div class="content" v-show="note.cw == null || showContent"> <mk-sub-note-content class="text" :note="note"/> @@ -77,19 +77,6 @@ root(isDark) > .text margin-right 8px - > .toggle - display inline-block - padding 4px 8px - font-size 0.7em - color isDark ? #393f4f : #fff - background isDark ? #687390 : #b1b9c1 - border-radius 2px - cursor pointer - user-select none - - &:hover - background isDark ? #707b97 : #bbc4ce - > .content > .text cursor default diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index e1bc8be5a5..46a866f9a7 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -18,7 +18,7 @@ <div class="body"> <p v-if="p.cw != null" class="cw"> <span class="text" v-if="p.cw != ''">{{ p.cw }}</span> - <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@hide%' : '%i18n:@see-more%' }}</span> + <mk-cw-button v-model="showContent"/> </p> <div class="content" v-show="p.cw == null || showContent"> <div class="text"> @@ -401,19 +401,6 @@ root(isDark) > .text margin-right 8px - > .toggle - display inline-block - padding 4px 8px - font-size 0.7em - color isDark ? #393f4f : #fff - background isDark ? #687390 : #b1b9c1 - border-radius 2px - cursor pointer - user-select none - - &:hover - background isDark ? #707b97 : #bbc4ce - > .content > .text diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index ec4b9182b7..980fb03136 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -18,7 +18,7 @@ <div class="body"> <p v-if="p.cw != null" class="cw"> <span class="text" v-if="p.cw != ''">{{ p.cw }}</span> - <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@less%' : '%i18n:@more%' }}</span> + <mk-cw-button v-model="showContent"/> </p> <div class="content" v-show="p.cw == null || showContent"> <div class="text"> diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index 752e44fd60..68be9f8ac4 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -37,7 +37,7 @@ <div class="body"> <p v-if="p.cw != null" class="cw"> <span class="text" v-if="p.cw != ''">{{ p.cw }}</span> - <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@hide%' : '%i18n:@see-more%' }}</span> + <mk-cw-button v-model="showContent"/> </p> <div class="content" v-show="p.cw == null || showContent"> <div class="text"> @@ -352,19 +352,6 @@ root(isDark) > .text margin-right 8px - > .toggle - display inline-block - padding 4px 8px - font-size 0.7em - color isDark ? #393f4f : #fff - background isDark ? #687390 : #b1b9c1 - border-radius 2px - cursor pointer - user-select none - - &:hover - background isDark ? #707b97 : #bbc4ce - > .content > .text diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue index a85434407f..4c03593a9e 100644 --- a/src/client/app/mobile/views/components/note-preview.vue +++ b/src/client/app/mobile/views/components/note-preview.vue @@ -6,7 +6,7 @@ <div class="body"> <p v-if="note.cw != null" class="cw"> <span class="text" v-if="note.cw != ''">{{ note.cw }}</span> - <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@hide%' : '%i18n:@see-more%' }}</span> + <mk-cw-button v-model="showContent"/> </p> <div class="content" v-show="note.cw == null || showContent"> <mk-sub-note-content class="text" :note="note"/> @@ -93,19 +93,6 @@ root(isDark) > .text margin-right 8px - > .toggle - display inline-block - padding 4px 8px - font-size 0.7em - color isDark ? #393f4f : #fff - background isDark ? #687390 : #b1b9c1 - border-radius 2px - cursor pointer - user-select none - - &:hover - background isDark ? #707b97 : #bbc4ce - > .content > .text cursor default diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue index 77527a1498..c25f827dad 100644 --- a/src/client/app/mobile/views/components/note.sub.vue +++ b/src/client/app/mobile/views/components/note.sub.vue @@ -6,7 +6,7 @@ <div class="body"> <p v-if="note.cw != null" class="cw"> <span class="text" v-if="note.cw != ''">{{ note.cw }}</span> - <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@hide%' : '%i18n:@see-more%' }}</span> + <mk-cw-button v-model="showContent"/> </p> <div class="content" v-show="note.cw == null || showContent"> <mk-sub-note-content class="text" :note="note"/> @@ -100,19 +100,6 @@ root(isDark) > .text margin-right 8px - > .toggle - display inline-block - padding 4px 8px - font-size 0.7em - color isDark ? #393f4f : #fff - background isDark ? #687390 : #b1b9c1 - border-radius 2px - cursor pointer - user-select none - - &:hover - background isDark ? #707b97 : #bbc4ce - > .content > .text margin 0 diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index c608451e51..8787b39a93 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -18,7 +18,7 @@ <div class="body"> <p v-if="p.cw != null" class="cw"> <span class="text" v-if="p.cw != ''">{{ p.cw }}</span> - <span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@less%' : '%i18n:@more%' }}</span> + <mk-cw-button v-model="showContent"/> </p> <div class="content" v-show="p.cw == null || showContent"> <div class="text"> @@ -350,19 +350,6 @@ root(isDark) > .text margin-right 8px - > .toggle - display inline-block - padding 4px 8px - font-size 0.7em - color isDark ? #393f4f : #fff - background isDark ? #687390 : #b1b9c1 - border-radius 2px - cursor pointer - user-select none - - &:hover - background isDark ? #707b97 : #bbc4ce - > .content > .text From 683d3a70b231c97fda58634b1852444097f47960 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 13 Sep 2018 18:23:44 +0900 Subject: [PATCH 231/539] #2562 #2563 --- locales/ja-JP.yml | 5 ++- .../views/pages/settings/settings.profile.vue | 31 +++++++++++++++---- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 98c2f5fe45..5b6fe6bb6f 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -880,7 +880,7 @@ desktop/views/components/settings.profile.vue: birthday: "誕生日" save: "保存" locked-account: "アカウントの保護" - is-locked: "投稿を非公開にする" + is-locked: "フォローを承認制にする" other: "その他" is-bot: "このアカウントはBotです" is-cat: "このアカウントはCatです" @@ -1353,6 +1353,9 @@ mobile/views/pages/settings/settings.profile.vue: avatar: "アイコン" banner: "バナー" is-cat: "このアカウントはCatです" + is-locked: "フォローを承認制にする" + advanced: "その他" + privacy: "プライバシー" save: "保存" saved: "プロフィールを保存しました" uploading: "アップロード中" diff --git a/src/client/app/mobile/views/pages/settings/settings.profile.vue b/src/client/app/mobile/views/pages/settings/settings.profile.vue index 3efeac3da5..6f5ac9ae93 100644 --- a/src/client/app/mobile/views/pages/settings/settings.profile.vue +++ b/src/client/app/mobile/views/pages/settings/settings.profile.vue @@ -40,11 +40,25 @@ <span slot="text" v-if="bannerUploading">%i18n:@uploading%<mk-ellipsis/></span> </ui-input> - <ui-switch v-model="isCat">%i18n:@is-cat%</ui-switch> - - <ui-button @click="save">%i18n:@save%</ui-button> + <ui-button @click="save(true)">%i18n:@save%</ui-button> </ui-form> </section> + + <section> + <header>%i18n:@advanced%</header> + + <div> + <ui-switch v-model="isCat" @change="save(false)">%i18n:@is-cat%</ui-switch> + </div> + </section> + + <section> + <header>%i18n:@privacy%</header> + + <div> + <ui-switch v-model="isLocked" @change="save(false)">%i18n:@is-locked%</ui-switch> + </div> + </section> </ui-card> </template> @@ -64,6 +78,7 @@ export default Vue.extend({ avatarId: null, bannerId: null, isCat: false, + isLocked: false, saving: false, avatarUploading: false, bannerUploading: false @@ -79,6 +94,7 @@ export default Vue.extend({ this.avatarId = this.$store.state.i.avatarId; this.bannerId = this.$store.state.i.bannerId; this.isCat = this.$store.state.i.isCat; + this.isLocked = this.$store.state.i.isLocked; }, methods: { @@ -126,7 +142,7 @@ export default Vue.extend({ }); }, - save() { + save(notify) { this.saving = true; (this as any).api('i/update', { @@ -136,7 +152,8 @@ export default Vue.extend({ birthday: this.birthday || null, avatarId: this.avatarId, bannerId: this.bannerId, - isCat: this.isCat + isCat: this.isCat, + isLocked: this.isLocked }).then(i => { this.saving = false; this.$store.state.i.avatarId = i.avatarId; @@ -144,7 +161,9 @@ export default Vue.extend({ this.$store.state.i.bannerId = i.bannerId; this.$store.state.i.bannerUrl = i.bannerUrl; - alert('%i18n:@saved%'); + if (notify) { + alert('%i18n:@saved%'); + } }); } } From b28eb54cac5af6db4aab50e2b5b94440d6c67e33 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Thu, 13 Sep 2018 18:28:12 +0900 Subject: [PATCH 232/539] fix(package): update vue-loader to version 15.4.2 (#2692) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 17be739743..a80be265ac 100644 --- a/package.json +++ b/package.json @@ -212,7 +212,7 @@ "vue-cropperjs": "2.2.1", "vue-js-modal": "1.3.26", "vue-json-tree-view": "2.1.4", - "vue-loader": "15.4.1", + "vue-loader": "15.4.2", "vue-router": "3.0.1", "vue-style-loader": "4.1.2", "vue-template-compiler": "2.5.17", From 9ed2a82d3bd8051350057c27fad473085b2b4d87 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Thu, 13 Sep 2018 18:29:11 +0900 Subject: [PATCH 233/539] fix(package): update debug to version 4.0.1 (#2700) Closes #2682 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a80be265ac..4f2543b0c2 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "crc-32": "1.2.0", "css-loader": "1.0.0", "dateformat": "3.0.3", - "debug": "3.1.0", + "debug": "4.0.1", "deep-equal": "1.0.1", "deepcopy": "0.6.3", "diskusage": "0.2.4", From c2eb80b44cc921dcb2e035fe2f15deaba475fd70 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Thu, 13 Sep 2018 18:29:29 +0900 Subject: [PATCH 234/539] fix(package): update @types/mongodb to version 3.1.7 (#2701) Closes #2681 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f2543b0c2..c62efeef54 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "@types/minio": "7.0.0", "@types/mkdirp": "0.5.2", "@types/mocha": "5.2.3", - "@types/mongodb": "3.1.4", + "@types/mongodb": "3.1.7", "@types/ms": "0.7.30", "@types/node": "10.9.4", "@types/portscanner": "2.1.0", From be842b5071512e9ed63f8b66fa98d4c7dc7005e1 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Thu, 13 Sep 2018 18:29:48 +0900 Subject: [PATCH 235/539] fix(package): update webpack to version 4.18.0 (#2680) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c62efeef54..005dd7a94f 100644 --- a/package.json +++ b/package.json @@ -222,7 +222,7 @@ "vuex-persistedstate": "2.5.4", "web-push": "3.3.2", "webfinger.js": "2.6.6", - "webpack": "4.17.2", + "webpack": "4.18.0", "webpack-cli": "3.1.0", "websocket": "1.0.26", "ws": "6.0.0", From b51843ed50449758331444493eef30a38694d542 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 13 Sep 2018 18:42:30 +0900 Subject: [PATCH 236/539] 8.36.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b5dca222f9..c7387d7bcf 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.35.0", - "clientVersion": "1.0.9589", + "version": "8.36.0", + "clientVersion": "1.0.9637", "codename": "nighthike", "main": "./built/index.js", "private": true, From 17cc5a9b953a6af15b4b936c75c74086c9853b9a Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Thu, 13 Sep 2018 19:35:35 +0900 Subject: [PATCH 237/539] fix(package): update webpack to version 4.18.1 (#2704) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c7387d7bcf..fa634da10c 100644 --- a/package.json +++ b/package.json @@ -222,7 +222,7 @@ "vuex-persistedstate": "2.5.4", "web-push": "3.3.2", "webfinger.js": "2.6.6", - "webpack": "4.18.0", + "webpack": "4.18.1", "webpack-cli": "3.1.0", "websocket": "1.0.26", "ws": "6.0.0", From 684301948122d333d1030b4ce579a5596908ef04 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 14 Sep 2018 09:15:37 +0900 Subject: [PATCH 238/539] =?UTF-8?q?=E3=83=A1=E3=83=A2=E3=83=AA=E3=83=AA?= =?UTF-8?q?=E3=83=BC=E3=82=AF=E3=82=92=E6=89=BF=E7=9F=A5=E3=81=A7=E3=81=84?= =?UTF-8?q?=E3=81=8F=E3=81=A4=E3=81=8B=E3=81=AE=E9=87=8D=E8=A6=81=E3=81=AA?= =?UTF-8?q?=E9=83=A8=E5=88=86=E3=81=AE=E3=82=A2=E3=83=8B=E3=83=A1=E3=83=BC?= =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=82=92=E6=9C=89=E5=8A=B9=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/app/desktop/views/components/notes.vue | 6 ++---- src/client/app/desktop/views/components/notifications.vue | 6 ++---- src/client/app/mobile/views/components/notes.vue | 6 ++---- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/client/app/desktop/views/components/notes.vue b/src/client/app/desktop/views/components/notes.vue index f19ecf8f9a..26aa0c8dea 100644 --- a/src/client/app/desktop/views/components/notes.vue +++ b/src/client/app/desktop/views/components/notes.vue @@ -10,8 +10,7 @@ </div> <!-- トランジションを有効にするとなぜかメモリリークする --> - <!--<transition-group name="mk-notes" class="transition">--> - <div class="notes"> + <transition-group name="mk-notes" class="notes transition" tag="div"> <template v-for="(note, i) in _notes"> <x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)"/> <p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date"> @@ -19,8 +18,7 @@ <span>%fa:angle-down%{{ _notes[i + 1]._datetext }}</span> </p> </template> - </div> - <!--</transition-group>--> + </transition-group> <footer v-if="more"> <button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }"> diff --git a/src/client/app/desktop/views/components/notifications.vue b/src/client/app/desktop/views/components/notifications.vue index bfe71903e4..9d0e73adef 100644 --- a/src/client/app/desktop/views/components/notifications.vue +++ b/src/client/app/desktop/views/components/notifications.vue @@ -2,8 +2,7 @@ <div class="mk-notifications"> <div class="notifications" v-if="notifications.length != 0"> <!-- トランジションを有効にするとなぜかメモリリークする --> - <!-- <transition-group name="mk-notifications" class="transition"> --> - <div> + <transition-group name="mk-notifications" class="transition" tag="div"> <template v-for="(notification, i) in _notifications"> <div class="notification" :class="notification.type" :key="notification.id"> <mk-time :time="notification.createdAt"/> @@ -97,8 +96,7 @@ <span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span> </p> </template> - </div> - <!-- </transition-group> --> + </transition-group> </div> <button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications"> <template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }} diff --git a/src/client/app/mobile/views/components/notes.vue b/src/client/app/mobile/views/components/notes.vue index ce2670dc52..17806f062e 100644 --- a/src/client/app/mobile/views/components/notes.vue +++ b/src/client/app/mobile/views/components/notes.vue @@ -14,8 +14,7 @@ </div> <!-- トランジションを有効にするとなぜかメモリリークする --> - <!-- <transition-group name="mk-notes" class="transition"> --> - <div class="transition"> + <transition-group name="mk-notes" class="transition" tag="div"> <template v-for="(note, i) in _notes"> <mk-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)"/> <p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date"> @@ -23,8 +22,7 @@ <span>%fa:angle-down%{{ _notes[i + 1]._datetext }}</span> </p> </template> - </div> - <!-- </transition-group> --> + </transition-group> <footer v-if="more"> <button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }"> From 2c59da36c2880782982d1b6cccb671e535643dd3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 14 Sep 2018 09:19:24 +0900 Subject: [PATCH 239/539] 8.37.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index fa634da10c..1d21d4583c 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.36.0", - "clientVersion": "1.0.9637", + "version": "8.37.0", + "clientVersion": "1.0.9642", "codename": "nighthike", "main": "./built/index.js", "private": true, From 10dc97c43fefcc76465078009a920b4f007bafa1 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Fri, 14 Sep 2018 03:29:26 +0000 Subject: [PATCH 240/539] fix(package): update webpack to version 4.19.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1d21d4583c..ac86a8128e 100644 --- a/package.json +++ b/package.json @@ -222,7 +222,7 @@ "vuex-persistedstate": "2.5.4", "web-push": "3.3.2", "webfinger.js": "2.6.6", - "webpack": "4.18.1", + "webpack": "4.19.0", "webpack-cli": "3.1.0", "websocket": "1.0.26", "ws": "6.0.0", From 4b3ece439e04a1e03825f9cbf88b9885771f5119 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 14 Sep 2018 12:39:11 +0900 Subject: [PATCH 241/539] :art: --- src/client/app/mobile/views/components/notify.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/mobile/views/components/notify.vue b/src/client/app/mobile/views/components/notify.vue index 7a2f7bfedc..307fb08cfa 100644 --- a/src/client/app/mobile/views/components/notify.vue +++ b/src/client/app/mobile/views/components/notify.vue @@ -45,7 +45,7 @@ export default Vue.extend({ $height = 78px position fixed - z-index 1024 + z-index 10000 left 0 right 0 width 100% From 34a5adf9517f109626801e576733a65002cde87c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 14 Sep 2018 15:14:59 +0900 Subject: [PATCH 242/539] =?UTF-8?q?=E5=B8=B8=E3=81=AB=E9=96=B2=E8=A6=A7?= =?UTF-8?q?=E6=B3=A8=E6=84=8F=E3=81=AE=E7=94=BB=E5=83=8F=E3=82=92=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E3=81=99=E3=82=8B=E3=82=AA=E3=83=97=E3=82=B7=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E3=82=92=E8=BF=BD=E5=8A=A0=20&=20=E3=83=AA=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=AF=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 2 + .../desktop/views/components/media-image.vue | 2 +- .../app/desktop/views/components/settings.vue | 258 ++++++++---------- .../mobile/views/components/media-image.vue | 2 +- .../app/mobile/views/pages/settings.vue | 212 +++++++------- src/client/app/store.ts | 1 + 6 files changed, 220 insertions(+), 257 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 5b6fe6bb6f..aaa06bdd1d 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -116,6 +116,8 @@ common: use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" verified-user: "公式アカウント" disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" + always-show-nsfw: "常に閲覧注意のメディアを表示する" + this-setting-is-this-device-only: "このデバイスのみ" do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' diff --git a/src/client/app/desktop/views/components/media-image.vue b/src/client/app/desktop/views/components/media-image.vue index 0284872c68..66ac389f64 100644 --- a/src/client/app/desktop/views/components/media-image.vue +++ b/src/client/app/desktop/views/components/media-image.vue @@ -1,5 +1,5 @@ <template> -<div class="ldwbgwstjsdgcjruamauqdrffetqudry" v-if="image.isSensitive && hide" @click="hide = false"> +<div class="ldwbgwstjsdgcjruamauqdrffetqudry" v-if="image.isSensitive && hide && !$store.state.device.alwaysShowNsfw" @click="hide = false"> <div> <b>%fa:exclamation-triangle% %i18n:@sensitive%</b> <span>%i18n:@click-to-show%</span> diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index 3998adf601..8e2905e73b 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -20,7 +20,7 @@ <section class="web" v-show="page == 'web'"> <h1>%i18n:@behaviour%</h1> - <mk-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll" text="%i18n:@fetch-on-scroll%"> + <mk-switch v-model="fetchOnScroll" text="%i18n:@fetch-on-scroll%"> <span>%i18n:@fetch-on-scroll-desc%</span> </mk-switch> <mk-switch v-model="autoPopout" text="%i18n:@auto-popout%"> @@ -29,7 +29,7 @@ <section> <header>%i18n:@note-visibility%</header> - <mk-switch v-model="$store.state.settings.rememberNoteVisibility" @change="onChangeRememberNoteVisibility" text="%i18n:@remember-note-visibility%"/> + <mk-switch v-model="rememberNoteVisibility" text="%i18n:@remember-note-visibility%"/> <section> <header>%i18n:@default-note-visibility%</header> <ui-select v-model="defaultNoteVisibility"> @@ -59,24 +59,25 @@ <button class="ui" @click="updateWallpaper">%i18n:@choose-wallpaper%</button> <button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button> <mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/> - <mk-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/> - <mk-switch v-model="$store.state.settings.contrastedAcct" @change="onChangeContrastedAcct" text="%i18n:@contrasted-acct%"/> - <mk-switch v-model="$store.state.settings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/> - <mk-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi" text="%i18n:common.i-like-sushi%"/> + <mk-switch v-model="circleIcons" text="%i18n:@circle-icons%"/> + <mk-switch v-model="contrastedAcct" text="%i18n:@contrasted-acct%"/> + <mk-switch v-model="gradientWindowHeader" text="%i18n:@gradient-window-header%"/> + <mk-switch v-model="iLikeSushi" text="%i18n:common.i-like-sushi%"/> </div> - <mk-switch v-model="$store.state.settings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/> - <mk-switch v-model="$store.state.settings.suggestRecentHashtags" @change="onChangeSuggestRecentHashtags" text="%i18n:@suggest-recent-hashtags%"/> - <mk-switch v-model="$store.state.settings.showClockOnHeader" @change="onChangeShowClockOnHeader" text="%i18n:@show-clock-on-header%"/> - <mk-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/> - <mk-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/> - <mk-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/> - <mk-switch v-model="$store.state.settings.showLocalRenotes" @change="onChangeShowLocalRenotes" text="%i18n:@show-local-renotes%"/> - <mk-switch v-model="$store.state.settings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%"> + <mk-switch v-model="showPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/> + <mk-switch v-model="suggestRecentHashtags" text="%i18n:@suggest-recent-hashtags%"/> + <mk-switch v-model="showClockOnHeader" text="%i18n:@show-clock-on-header%"/> + <mk-switch v-model="alwaysShowNsfw" text="%i18n:common.always-show-nsfw%"/> + <mk-switch v-model="showReplyTarget" text="%i18n:@show-reply-target%"/> + <mk-switch v-model="showMyRenotes" text="%i18n:@show-my-renotes%"/> + <mk-switch v-model="showRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/> + <mk-switch v-model="showLocalRenotes" text="%i18n:@show-local-renotes%"/> + <mk-switch v-model="showMaps" text="%i18n:@show-maps%"> <span>%i18n:@show-maps-desc%</span> </mk-switch> - <mk-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm" text="%i18n:common.disable-animated-mfm%"/> - <mk-switch v-model="$store.state.settings.games.reversi.showBoardLabels" @change="onChangeReversiBoardLabels" text="%i18n:common.show-reversi-board-labels%"/> - <mk-switch v-model="$store.state.settings.games.reversi.useContrastStones" @change="onChangeUseContrastReversiStones" text="%i18n:common.use-contrast-reversi-stones%"/> + <mk-switch v-model="disableAnimatedMfm" text="%i18n:common.disable-animated-mfm%"/> + <mk-switch v-model="games_reversi_showBoardLabels" text="%i18n:common.show-reversi-board-labels%"/> + <mk-switch v-model="games_reversi_useContrastStones" text="%i18n:common.use-contrast-reversi-stones%"/> </section> <section class="web" v-show="page == 'web'"> @@ -98,7 +99,7 @@ <section class="web" v-show="page == 'web'"> <h1>%i18n:@mobile%</h1> - <mk-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile" text="%i18n:@disable-via-mobile%"/> + <mk-switch v-model="disableViaMobile" text="%i18n:@disable-via-mobile%"/> </section> <section class="web" v-show="page == 'web'"> @@ -255,11 +256,6 @@ export default Vue.extend({ set(value) { this.$store.commit('device/set', { key: 'apiViaStream', value }); } }, - defaultNoteVisibility: { - get() { return this.$store.state.settings.defaultNoteVisibility; }, - set(value) { this.$store.commit('settings/set', { key: 'defaultNoteVisibility', value }); } - }, - autoPopout: { get() { return this.$store.state.device.autoPopout; }, set(value) { this.$store.commit('device/set', { key: 'autoPopout', value }); } @@ -298,7 +294,107 @@ export default Vue.extend({ enableExperimentalFeatures: { get() { return this.$store.state.device.enableExperimentalFeatures; }, set(value) { this.$store.commit('device/set', { key: 'enableExperimentalFeatures', value }); } - } + }, + + alwaysShowNsfw: { + get() { return this.$store.state.device.alwaysShowNsfw; }, + set(value) { this.$store.commit('device/set', { key: 'alwaysShowNsfw', value }); } + }, + + fetchOnScroll: { + get() { return this.$store.state.settings.fetchOnScroll; }, + set(value) { this.$store.dispatch('settings/set', { key: 'fetchOnScroll', value }); } + }, + + rememberNoteVisibility: { + get() { return this.$store.state.settings.rememberNoteVisibility; }, + set(value) { this.$store.dispatch('settings/set', { key: 'rememberNoteVisibility', value }); } + }, + + defaultNoteVisibility: { + get() { return this.$store.state.settings.defaultNoteVisibility; }, + set(value) { this.$store.dispatch('settings/set', { key: 'defaultNoteVisibility', value }); } + }, + + showReplyTarget: { + get() { return this.$store.state.settings.showReplyTarget; }, + set(value) { this.$store.dispatch('settings/set', { key: 'showReplyTarget', value }); } + }, + + showMyRenotes: { + get() { return this.$store.state.settings.showMyRenotes; }, + set(value) { this.$store.dispatch('settings/set', { key: 'showMyRenotes', value }); } + }, + + showRenotedMyNotes: { + get() { return this.$store.state.settings.showRenotedMyNotes; }, + set(value) { this.$store.dispatch('settings/set', { key: 'showRenotedMyNotes', value }); } + }, + + showLocalRenotes: { + get() { return this.$store.state.settings.showLocalRenotes; }, + set(value) { this.$store.dispatch('settings/set', { key: 'showLocalRenotes', value }); } + }, + + showPostFormOnTopOfTl: { + get() { return this.$store.state.settings.showPostFormOnTopOfTl; }, + set(value) { this.$store.dispatch('settings/set', { key: 'showPostFormOnTopOfTl', value }); } + }, + + suggestRecentHashtags: { + get() { return this.$store.state.settings.suggestRecentHashtags; }, + set(value) { this.$store.dispatch('settings/set', { key: 'suggestRecentHashtags', value }); } + }, + + showClockOnHeader: { + get() { return this.$store.state.settings.showClockOnHeader; }, + set(value) { this.$store.dispatch('settings/set', { key: 'showClockOnHeader', value }); } + }, + + showMaps: { + get() { return this.$store.state.settings.showMaps; }, + set(value) { this.$store.dispatch('settings/set', { key: 'showMaps', value }); } + }, + + circleIcons: { + get() { return this.$store.state.settings.circleIcons; }, + set(value) { this.$store.dispatch('settings/set', { key: 'circleIcons', value }); } + }, + + contrastedAcct: { + get() { return this.$store.state.settings.contrastedAcct; }, + set(value) { this.$store.dispatch('settings/set', { key: 'contrastedAcct', value }); } + }, + + iLikeSushi: { + get() { return this.$store.state.settings.iLikeSushi; }, + set(value) { this.$store.dispatch('settings/set', { key: 'iLikeSushi', value }); } + }, + + games_reversi_showBoardLabels: { + get() { return this.$store.state.settings.games.reversi.showBoardLabels; }, + set(value) { this.$store.dispatch('settings/set', { key: 'games.reversi.showBoardLabels', value }); } + }, + + games_reversi_useContrastStones: { + get() { return this.$store.state.settings.games.reversi.useContrastStones; }, + set(value) { this.$store.dispatch('settings/set', { key: 'games.reversi.useContrastStones', value }); } + }, + + disableAnimatedMfm: { + get() { return this.$store.state.settings.disableAnimatedMfm; }, + set(value) { this.$store.dispatch('settings/set', { key: 'disableAnimatedMfm', value }); } + }, + + disableViaMobile: { + get() { return this.$store.state.settings.disableViaMobile; }, + set(value) { this.$store.dispatch('settings/set', { key: 'disableViaMobile', value }); } + }, + + gradientWindowHeader: { + get() { return this.$store.state.settings.gradientWindowHeader; }, + set(value) { this.$store.dispatch('settings/set', { key: 'gradientWindowHeader', value }); } + }, }, created() { (this as any).os.getMeta().then(meta => { @@ -327,125 +423,11 @@ export default Vue.extend({ wallpaperId: null }); }, - onChangeFetchOnScroll(v) { - this.$store.dispatch('settings/set', { - key: 'fetchOnScroll', - value: v - }); - }, - onChangeRememberNoteVisibility(v) { - this.$store.dispatch('settings/set', { - key: 'rememberNoteVisibility', - value: v - }); - }, onChangeAutoWatch(v) { (this as any).api('i/update', { autoWatch: v }); }, - onChangeDark(v) { - this.$store.dispatch('settings/set', { - key: 'dark', - value: v - }); - }, - onChangeShowPostFormOnTopOfTl(v) { - this.$store.dispatch('settings/set', { - key: 'showPostFormOnTopOfTl', - value: v - }); - }, - onChangeSuggestRecentHashtags(v) { - this.$store.dispatch('settings/set', { - key: 'suggestRecentHashtags', - value: v - }); - }, - onChangeShowClockOnHeader(v) { - this.$store.dispatch('settings/set', { - key: 'showClockOnHeader', - value: v - }); - }, - onChangeShowReplyTarget(v) { - this.$store.dispatch('settings/set', { - key: 'showReplyTarget', - value: v - }); - }, - onChangeShowMyRenotes(v) { - this.$store.dispatch('settings/set', { - key: 'showMyRenotes', - value: v - }); - }, - onChangeShowRenotedMyNotes(v) { - this.$store.dispatch('settings/set', { - key: 'showRenotedMyNotes', - value: v - }); - }, - onChangeShowLocalRenotes(v) { - this.$store.dispatch('settings/set', { - key: 'showLocalRenotes', - value: v - }); - }, - onChangeShowMaps(v) { - this.$store.dispatch('settings/set', { - key: 'showMaps', - value: v - }); - }, - onChangeCircleIcons(v) { - this.$store.dispatch('settings/set', { - key: 'circleIcons', - value: v - }); - }, - onChangeContrastedAcct(v) { - this.$store.dispatch('settings/set', { - key: 'contrastedAcct', - value: v - }); - }, - onChangeILikeSushi(v) { - this.$store.dispatch('settings/set', { - key: 'iLikeSushi', - value: v - }); - }, - onChangeReversiBoardLabels(v) { - this.$store.dispatch('settings/set', { - key: 'games.reversi.showBoardLabels', - value: v - }); - }, - onChangeUseContrastReversiStones(v) { - this.$store.dispatch('settings/set', { - key: 'games.reversi.useContrastStones', - value: v - }); - }, - onChangeDisableAnimatedMfm(v) { - this.$store.dispatch('settings/set', { - key: 'disableAnimatedMfm', - value: v - }); - }, - onChangeGradientWindowHeader(v) { - this.$store.dispatch('settings/set', { - key: 'gradientWindowHeader', - value: v - }); - }, - onChangeDisableViaMobile(v) { - this.$store.dispatch('settings/set', { - key: 'disableViaMobile', - value: v - }); - }, checkForUpdate() { this.checkingForUpdate = true; checkForUpdate((this as any).os, true, true).then(newer => { diff --git a/src/client/app/mobile/views/components/media-image.vue b/src/client/app/mobile/views/components/media-image.vue index e40069bbe3..65ea6cf8ea 100644 --- a/src/client/app/mobile/views/components/media-image.vue +++ b/src/client/app/mobile/views/components/media-image.vue @@ -1,5 +1,5 @@ <template> -<div class="qjewsnkgzzxlxtzncydssfbgjibiehcy" v-if="image.isSensitive && hide" @click="hide = false"> +<div class="qjewsnkgzzxlxtzncydssfbgjibiehcy" v-if="image.isSensitive && hide && !$store.state.device.alwaysShowNsfw" @click="hide = false"> <div> <b>%fa:exclamation-triangle% %i18n:@sensitive%</b> <span>%i18n:@click-to-show%</span> diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index a078929016..c93b3a50f1 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -12,21 +12,22 @@ <section> <ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch> - <ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch> - <ui-switch v-model="$store.state.settings.contrastedAcct" @change="onChangeContrastedAcct">%i18n:@contrasted-acct%</ui-switch> - <ui-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi">%i18n:common.i-like-sushi%</ui-switch> - <ui-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch> - <ui-switch v-model="$store.state.settings.games.reversi.showBoardLabels" @change="onChangeReversiBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch> - <ui-switch v-model="$store.state.settings.games.reversi.useContrastStones" @change="onChangeUseContrastReversiStones">%i18n:common.use-contrast-reversi-stones%</ui-switch> + <ui-switch v-model="circleIcons">%i18n:@circle-icons%</ui-switch> + <ui-switch v-model="contrastedAcct">%i18n:@contrasted-acct%</ui-switch> + <ui-switch v-model="iLikeSushi">%i18n:common.i-like-sushi%</ui-switch> + <ui-switch v-model="disableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch> + <ui-switch v-model="alwaysShowNsfw">%i18n:common.always-show-nsfw% (%i18n:common.this-setting-is-this-device-only%)</ui-switch> + <ui-switch v-model="games_reversi_showBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch> + <ui-switch v-model="games_reversi_useContrastStones">%i18n:common.use-contrast-reversi-stones%</ui-switch> </section> <section> <header>%i18n:@timeline%</header> <div> - <ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch> - <ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch> - <ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch> - <ui-switch v-model="$store.state.settings.showLocalRenotes" @change="onChangeShowLocalRenotes">%i18n:@show-local-renotes%</ui-switch> + <ui-switch v-model="showReplyTarget">%i18n:@show-reply-target%</ui-switch> + <ui-switch v-model="showMyRenotes">%i18n:@show-my-renotes%</ui-switch> + <ui-switch v-model="showRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch> + <ui-switch v-model="showLocalRenotes">%i18n:@show-local-renotes%</ui-switch> </div> </section> @@ -47,16 +48,16 @@ <div slot="title">%fa:cog% %i18n:@behavior%</div> <section> - <ui-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</ui-switch> - <ui-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</ui-switch> + <ui-switch v-model="fetchOnScroll">%i18n:@fetch-on-scroll%</ui-switch> + <ui-switch v-model="disableViaMobile">%i18n:@disable-via-mobile%</ui-switch> <ui-switch v-model="loadRawImages">%i18n:@load-raw-images%</ui-switch> - <ui-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</ui-switch> + <ui-switch v-model="loadRemoteMedia">%i18n:@load-remote-media%</ui-switch> <ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch> </section> <section> <header>%i18n:@note-visibility%</header> - <ui-switch v-model="$store.state.settings.rememberNoteVisibility" @change="onChangeRememberNoteVisibility">%i18n:@remember-note-visibility%</ui-switch> + <ui-switch v-model="rememberNoteVisibility">%i18n:@remember-note-visibility%</ui-switch> <section> <header>%i18n:@default-note-visibility%</header> <ui-select v-model="defaultNoteVisibility"> @@ -166,6 +167,11 @@ export default Vue.extend({ set(value) { this.$store.commit('device/set', { key: 'darkmode', value }); } }, + alwaysShowNsfw: { + get() { return this.$store.state.device.alwaysShowNsfw; }, + set(value) { this.$store.commit('device/set', { key: 'alwaysShowNsfw', value }); } + }, + postStyle: { get() { return this.$store.state.device.postStyle; }, set(value) { this.$store.commit('device/set', { key: 'postStyle', value }); } @@ -176,11 +182,6 @@ export default Vue.extend({ set(value) { this.$store.commit('device/set', { key: 'mobileNotificationPosition', value }); } }, - defaultNoteVisibility: { - get() { return this.$store.state.settings.defaultNoteVisibility; }, - set(value) { this.$store.commit('settings/set', { key: 'defaultNoteVisibility', value }); } - }, - lightmode: { get() { return this.$store.state.device.lightmode; }, set(value) { this.$store.commit('device/set', { key: 'lightmode', value }); } @@ -200,6 +201,81 @@ export default Vue.extend({ get() { return this.$store.state.device.enableSounds; }, set(value) { this.$store.commit('device/set', { key: 'enableSounds', value }); } }, + + fetchOnScroll: { + get() { return this.$store.state.settings.fetchOnScroll; }, + set(value) { this.$store.dispatch('settings/set', { key: 'fetchOnScroll', value }); } + }, + + rememberNoteVisibility: { + get() { return this.$store.state.settings.rememberNoteVisibility; }, + set(value) { this.$store.dispatch('settings/set', { key: 'rememberNoteVisibility', value }); } + }, + + disableViaMobile: { + get() { return this.$store.state.settings.disableViaMobile; }, + set(value) { this.$store.dispatch('settings/set', { key: 'disableViaMobile', value }); } + }, + + loadRemoteMedia: { + get() { return this.$store.state.settings.loadRemoteMedia; }, + set(value) { this.$store.dispatch('settings/set', { key: 'loadRemoteMedia', value }); } + }, + + circleIcons: { + get() { return this.$store.state.settings.circleIcons; }, + set(value) { this.$store.dispatch('settings/set', { key: 'circleIcons', value }); } + }, + + contrastedAcct: { + get() { return this.$store.state.settings.contrastedAcct; }, + set(value) { this.$store.dispatch('settings/set', { key: 'contrastedAcct', value }); } + }, + + iLikeSushi: { + get() { return this.$store.state.settings.iLikeSushi; }, + set(value) { this.$store.dispatch('settings/set', { key: 'iLikeSushi', value }); } + }, + + games_reversi_showBoardLabels: { + get() { return this.$store.state.settings.games.reversi.showBoardLabels; }, + set(value) { this.$store.dispatch('settings/set', { key: 'games.reversi.showBoardLabels', value }); } + }, + + games_reversi_useContrastStones: { + get() { return this.$store.state.settings.games.reversi.useContrastStones; }, + set(value) { this.$store.dispatch('settings/set', { key: 'games.reversi.useContrastStones', value }); } + }, + + disableAnimatedMfm: { + get() { return this.$store.state.settings.disableAnimatedMfm; }, + set(value) { this.$store.dispatch('settings/set', { key: 'disableAnimatedMfm', value }); } + }, + + showReplyTarget: { + get() { return this.$store.state.settings.showReplyTarget; }, + set(value) { this.$store.dispatch('settings/set', { key: 'showReplyTarget', value }); } + }, + + showMyRenotes: { + get() { return this.$store.state.settings.showMyRenotes; }, + set(value) { this.$store.dispatch('settings/set', { key: 'showMyRenotes', value }); } + }, + + showRenotedMyNotes: { + get() { return this.$store.state.settings.showRenotedMyNotes; }, + set(value) { this.$store.dispatch('settings/set', { key: 'showRenotedMyNotes', value }); } + }, + + showLocalRenotes: { + get() { return this.$store.state.settings.showLocalRenotes; }, + set(value) { this.$store.dispatch('settings/set', { key: 'showLocalRenotes', value }); } + }, + + defaultNoteVisibility: { + get() { return this.$store.state.settings.defaultNoteVisibility; }, + set(value) { this.$store.dispatch('settings/set', { key: 'defaultNoteVisibility', value }); } + }, }, mounted() { @@ -211,104 +287,6 @@ export default Vue.extend({ (this as any).os.signout(); }, - onChangeFetchOnScroll(v) { - this.$store.dispatch('settings/set', { - key: 'fetchOnScroll', - value: v - }); - }, - - onChangeRememberNoteVisibility(v) { - this.$store.dispatch('settings/set', { - key: 'rememberNoteVisibility', - value: v - }); - }, - - onChangeDisableViaMobile(v) { - this.$store.dispatch('settings/set', { - key: 'disableViaMobile', - value: v - }); - }, - - onChangeLoadRemoteMedia(v) { - this.$store.dispatch('settings/set', { - key: 'loadRemoteMedia', - value: v - }); - }, - - onChangeCircleIcons(v) { - this.$store.dispatch('settings/set', { - key: 'circleIcons', - value: v - }); - }, - - onChangeContrastedAcct(v) { - this.$store.dispatch('settings/set', { - key: 'contrastedAcct', - value: v - }); - }, - - onChangeILikeSushi(v) { - this.$store.dispatch('settings/set', { - key: 'iLikeSushi', - value: v - }); - }, - - onChangeReversiBoardLabels(v) { - this.$store.dispatch('settings/set', { - key: 'games.reversi.showBoardLabels', - value: v - }); - }, - - onChangeUseContrastReversiStones(v) { - this.$store.dispatch('settings/set', { - key: 'games.reversi.useContrastStones', - value: v - }); - }, - - onChangeDisableAnimatedMfm(v) { - this.$store.dispatch('settings/set', { - key: 'disableAnimatedMfm', - value: v - }); - }, - - onChangeShowReplyTarget(v) { - this.$store.dispatch('settings/set', { - key: 'showReplyTarget', - value: v - }); - }, - - onChangeShowMyRenotes(v) { - this.$store.dispatch('settings/set', { - key: 'showMyRenotes', - value: v - }); - }, - - onChangeShowRenotedMyNotes(v) { - this.$store.dispatch('settings/set', { - key: 'showRenotedMyNotes', - value: v - }); - }, - - onChangeShowLocalRenotes(v) { - this.$store.dispatch('settings/set', { - key: 'showLocalRenotes', - value: v - }); - }, - checkForUpdate() { this.checkingForUpdate = true; checkForUpdate((this as any).os, true, true).then(newer => { diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 22de9b5587..7a5b3e986b 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -47,6 +47,7 @@ const defaultDeviceSettings = { debug: false, lightmode: false, loadRawImages: false, + alwaysShowNsfw: false, postStyle: 'standard', mobileNotificationPosition: 'bottom' }; From c87a43bdba9634934f6349db887e00edc43dbe28 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 14 Sep 2018 15:16:55 +0900 Subject: [PATCH 243/539] 8.38.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ac86a8128e..48a1a3d8bc 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.37.0", - "clientVersion": "1.0.9642", + "version": "8.38.0", + "clientVersion": "1.0.9647", "codename": "nighthike", "main": "./built/index.js", "private": true, From 3220d69a6930151f33928b5d789150aacc4bc382 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 14 Sep 2018 20:11:01 +0900 Subject: [PATCH 244/539] =?UTF-8?q?=E5=B8=B8=E3=81=AB=E3=83=A1=E3=83=87?= =?UTF-8?q?=E3=82=A3=E3=82=A2=E3=82=92=E9=96=B2=E8=A6=A7=E6=B3=A8=E6=84=8F?= =?UTF-8?q?=E3=81=A8=E3=81=97=E3=81=A6=E6=8A=95=E7=A8=BF=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=AA=E3=83=97=E3=82=B7=E3=83=A7=E3=83=B3=E3=82=92=E5=AE=9F?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 1 + .../app/desktop/views/components/settings.profile.vue | 7 +++++++ .../mobile/views/pages/settings/settings.profile.vue | 8 ++++++++ src/models/user.ts | 5 ++++- src/server/api/endpoints/drive/files/create.ts | 4 ++-- src/server/api/endpoints/i/update.ts | 7 +++++++ src/services/drive/add-file.ts | 10 ++++++++-- 7 files changed, 37 insertions(+), 5 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index aaa06bdd1d..134ec33831 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -117,6 +117,7 @@ common: verified-user: "公式アカウント" disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" always-show-nsfw: "常に閲覧注意のメディアを表示する" + always-mark-nsfw: "常にメディアを閲覧注意として投稿" this-setting-is-this-device-only: "このデバイスのみ" do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' diff --git a/src/client/app/desktop/views/components/settings.profile.vue b/src/client/app/desktop/views/components/settings.profile.vue index 262583b640..0f53941b31 100644 --- a/src/client/app/desktop/views/components/settings.profile.vue +++ b/src/client/app/desktop/views/components/settings.profile.vue @@ -30,6 +30,7 @@ <h2>%i18n:@other%</h2> <mk-switch v-model="$store.state.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/> <mk-switch v-model="$store.state.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/> + <mk-switch v-model="alwaysMarkNsfw" text="%i18n:common.always-mark-nsfw%"/> </section> </div> </template> @@ -46,6 +47,12 @@ export default Vue.extend({ birthday: null, }; }, + computed: { + alwaysMarkNsfw: { + get() { return this.$store.state.i.settings.alwaysMarkNsfw; }, + set(value) { (this as any).api('i/update', { alwaysMarkNsfw: value }); } + }, + }, created() { this.name = this.$store.state.i.name || ''; this.location = this.$store.state.i.profile.location; diff --git a/src/client/app/mobile/views/pages/settings/settings.profile.vue b/src/client/app/mobile/views/pages/settings/settings.profile.vue index 6f5ac9ae93..127f531902 100644 --- a/src/client/app/mobile/views/pages/settings/settings.profile.vue +++ b/src/client/app/mobile/views/pages/settings/settings.profile.vue @@ -49,6 +49,7 @@ <div> <ui-switch v-model="isCat" @change="save(false)">%i18n:@is-cat%</ui-switch> + <ui-switch v-model="alwaysMarkNsfw">%i18n:common.always-mark-nsfw%</ui-switch> </div> </section> @@ -85,6 +86,13 @@ export default Vue.extend({ }; }, + computed: { + alwaysMarkNsfw: { + get() { return this.$store.state.i.settings.alwaysMarkNsfw; }, + set(value) { (this as any).api('i/update', { alwaysMarkNsfw: value }); } + }, + }, + created() { this.name = this.$store.state.i.name || ''; this.username = this.$store.state.i.username; diff --git a/src/models/user.ts b/src/models/user.ts index 8f3fbbdc8f..64197c91c2 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -102,7 +102,10 @@ export interface ILocalUser extends IUserBase { twoFactorEnabled: boolean; twoFactorTempSecret?: string; clientSettings: any; - settings: any; + settings: { + autoWatch: boolean; + alwaysMarkNsfw?: boolean; + }; hasUnreadNotification: boolean; hasUnreadMessagingMessage: boolean; } diff --git a/src/server/api/endpoints/drive/files/create.ts b/src/server/api/endpoints/drive/files/create.ts index dfbd11d0c2..4b5ffa90e0 100644 --- a/src/server/api/endpoints/drive/files/create.ts +++ b/src/server/api/endpoints/drive/files/create.ts @@ -31,8 +31,8 @@ export const meta = { } }), - isSensitive: $.bool.optional.note({ - default: false, + isSensitive: $.bool.optional.nullable.note({ + default: null, desc: { 'ja-JP': 'このメディアが「閲覧注意」(NSFW)かどうか', 'en-US': 'Whether this media is NSFW' diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 6aa4cc1148..c1be0b6ebc 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -84,6 +84,12 @@ export const meta = { 'ja-JP': '投稿の自動ウォッチをするか否か' } }), + + alwaysMarkNsfw: $.bool.optional.note({ + desc: { + 'ja-JP': 'アップロードするメディアをデフォルトで「閲覧注意」として設定するか' + } + }), } }; @@ -106,6 +112,7 @@ export default async (params: any, user: ILocalUser, app: IApp) => new Promise(a if (typeof ps.isBot == 'boolean') updates.isBot = ps.isBot; if (typeof ps.isCat == 'boolean') updates.isCat = ps.isCat; if (typeof ps.autoWatch == 'boolean') updates['settings.autoWatch'] = ps.autoWatch; + if (typeof ps.alwaysMarkNsfw == 'boolean') updates['settings.alwaysMarkNsfw'] = ps.alwaysMarkNsfw; if (ps.avatarId) { const avatar = await DriveFile.findOne({ diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index 828ebcbb94..666a6ca742 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -153,7 +153,7 @@ export default async function( isLink: boolean = false, url: string = null, uri: string = null, - sensitive = false + sensitive: boolean = null ): Promise<IDriveFile> { // Calc md5 hash const calcHash = new Promise<string>((res, rej) => { @@ -329,7 +329,13 @@ export default async function( properties: properties, withoutChunks: isLink, isRemote: isLink, - isSensitive: sensitive + isSensitive: (sensitive !== null && sensitive !== undefined) + ? sensitive + : isLocalUser(user) + ? user.settings.alwaysMarkNsfw + ? true + : false + : false } as IMetadata; if (url !== null) { From f670345d450d2ac13448c56bc0aeb8dd5c3d84ef Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 14 Sep 2018 20:33:27 +0900 Subject: [PATCH 245/539] =?UTF-8?q?=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC?= =?UTF-8?q?=E5=90=8D=E3=81=AE=E3=83=9B=E3=82=B9=E3=83=88=E3=82=92=E7=9C=81?= =?UTF-8?q?=E7=95=A5=E3=81=97=E3=81=AA=E3=81=84=E3=82=AA=E3=83=97=E3=82=B7?= =?UTF-8?q?=E3=83=A7=E3=83=B3=E3=82=92=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 1 + src/client/app/common/views/components/acct.vue | 2 +- src/client/app/desktop/views/components/settings.vue | 6 ++++++ src/client/app/mobile/views/pages/settings.vue | 6 ++++++ src/client/app/store.ts | 1 + 5 files changed, 15 insertions(+), 1 deletion(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 134ec33831..5257d616c4 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -118,6 +118,7 @@ common: disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" always-show-nsfw: "常に閲覧注意のメディアを表示する" always-mark-nsfw: "常にメディアを閲覧注意として投稿" + show-full-acct: "ユーザー名のホストを省略しない" this-setting-is-this-device-only: "このデバイスのみ" do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' diff --git a/src/client/app/common/views/components/acct.vue b/src/client/app/common/views/components/acct.vue index bd7833f1a9..542fbb4296 100644 --- a/src/client/app/common/views/components/acct.vue +++ b/src/client/app/common/views/components/acct.vue @@ -1,7 +1,7 @@ <template> <span class="mk-acct"> <span class="name">@{{ user.username }}</span> - <span class="host" :class="{ fade: $store.state.settings.contrastedAcct }" v-if="user.host || detail">@{{ user.host || host }}</span> + <span class="host" :class="{ fade: $store.state.settings.contrastedAcct }" v-if="user.host || detail || $store.state.settings.showFullAcct">@{{ user.host || host }}</span> </span> </template> diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index 8e2905e73b..1973acc839 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -61,6 +61,7 @@ <mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/> <mk-switch v-model="circleIcons" text="%i18n:@circle-icons%"/> <mk-switch v-model="contrastedAcct" text="%i18n:@contrasted-acct%"/> + <mk-switch v-model="showFullAcct" text="%i18n:common.show-full-acct%"/> <mk-switch v-model="gradientWindowHeader" text="%i18n:@gradient-window-header%"/> <mk-switch v-model="iLikeSushi" text="%i18n:common.i-like-sushi%"/> </div> @@ -366,6 +367,11 @@ export default Vue.extend({ set(value) { this.$store.dispatch('settings/set', { key: 'contrastedAcct', value }); } }, + showFullAcct: { + get() { return this.$store.state.settings.showFullAcct; }, + set(value) { this.$store.dispatch('settings/set', { key: 'showFullAcct', value }); } + }, + iLikeSushi: { get() { return this.$store.state.settings.iLikeSushi; }, set(value) { this.$store.dispatch('settings/set', { key: 'iLikeSushi', value }); } diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index c93b3a50f1..9b0e521a4f 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -14,6 +14,7 @@ <ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch> <ui-switch v-model="circleIcons">%i18n:@circle-icons%</ui-switch> <ui-switch v-model="contrastedAcct">%i18n:@contrasted-acct%</ui-switch> + <ui-switch v-model="showFullAcct">%i18n:common.show-full-acct%</ui-switch> <ui-switch v-model="iLikeSushi">%i18n:common.i-like-sushi%</ui-switch> <ui-switch v-model="disableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch> <ui-switch v-model="alwaysShowNsfw">%i18n:common.always-show-nsfw% (%i18n:common.this-setting-is-this-device-only%)</ui-switch> @@ -232,6 +233,11 @@ export default Vue.extend({ set(value) { this.$store.dispatch('settings/set', { key: 'contrastedAcct', value }); } }, + showFullAcct: { + get() { return this.$store.state.settings.showFullAcct; }, + set(value) { this.$store.dispatch('settings/set', { key: 'showFullAcct', value }); } + }, + iLikeSushi: { get() { return this.$store.state.settings.iLikeSushi; }, set(value) { this.$store.dispatch('settings/set', { key: 'iLikeSushi', value }); } diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 7a5b3e986b..997bddc5cc 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -17,6 +17,7 @@ const defaultSettings = { showClockOnHeader: true, circleIcons: true, contrastedAcct: true, + showFullAcct: false, gradientWindowHeader: false, showReplyTarget: true, showMyRenotes: true, From e615a3fdf3087b5e2bbb390154401441f09713eb Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 14 Sep 2018 20:35:31 +0900 Subject: [PATCH 246/539] 8.39.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 48a1a3d8bc..4d2a4b285b 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.38.0", - "clientVersion": "1.0.9647", + "version": "8.39.0", + "clientVersion": "1.0.9650", "codename": "nighthike", "main": "./built/index.js", "private": true, From c985fed3e43bae05f9e6e854f651f49f2bc3e83a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 15 Sep 2018 05:40:58 +0900 Subject: [PATCH 247/539] Resolve #2328 --- locales/ja-JP.yml | 4 + package.json | 1 + .../app/desktop/views/components/charts.vue | 103 +++++++++++++++++- src/models/stats.ts | 26 +++++ src/server/api/endpoints/chart.ts | 21 ++++ src/server/index.ts | 25 +++++ src/services/update-chart.ts | 22 ++++ 7 files changed, 200 insertions(+), 2 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 5257d616c4..72dc88b7b3 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -518,6 +518,7 @@ desktop/views/components/charts.vue: notes: "投稿" users: "ユーザー" drive: "ドライブ" + network: "ネットワーク" charts: notes: "投稿の増減 (統合)" local-notes: "投稿の増減 (ローカル)" @@ -529,6 +530,9 @@ desktop/views/components/charts.vue: drive-total: "ドライブ使用量の累計" drive-files: "ドライブのファイル数の増減" drive-files-total: "ドライブのファイル数の累計" + network-requests: "リクエスト" + network-time: "応答時間" + network-usage: "通信量" desktop/views/components/choose-file-from-drive-window.vue: choose-file: "ファイル選択中" diff --git a/package.json b/package.json index 4d2a4b285b..4b9eaf9e22 100644 --- a/package.json +++ b/package.json @@ -179,6 +179,7 @@ "redis": "2.8.0", "request": "2.88.0", "request-promise-native": "1.0.5", + "request-stats": "3.0.0", "rimraf": "2.6.2", "rndstr": "1.0.0", "s-age": "1.1.2", diff --git a/src/client/app/desktop/views/components/charts.vue b/src/client/app/desktop/views/components/charts.vue index c4e92e429f..6514cdf788 100644 --- a/src/client/app/desktop/views/components/charts.vue +++ b/src/client/app/desktop/views/components/charts.vue @@ -19,6 +19,11 @@ <option value="drive">%i18n:@charts.drive%</option> <option value="drive-total">%i18n:@charts.drive-total%</option> </optgroup> + <optgroup label="%i18n:@network%"> + <option value="network-requests">%i18n:@charts.network-requests%</option> + <option value="network-time">%i18n:@charts.network-time%</option> + <option value="network-usage">%i18n:@charts.network-usage%</option> + </optgroup> </select> <div> <span @click="span = 'day'" :class="{ active: span == 'day' }">%i18n:@per-day%</span> | <span @click="span = 'hour'" :class="{ active: span == 'hour' }">%i18n:@per-hour%</span> @@ -41,7 +46,10 @@ const colors = { localPlus: 'rgb(52, 178, 118)', remotePlus: 'rgb(158, 255, 209)', localMinus: 'rgb(255, 97, 74)', - remoteMinus: 'rgb(255, 149, 134)' + remoteMinus: 'rgb(255, 149, 134)', + + incoming: 'rgb(52, 178, 118)', + outgoing: 'rgb(255, 97, 74)', }; const rgba = (color: string): string => { @@ -75,6 +83,9 @@ export default Vue.extend({ case 'drive-total': return this.driveTotalChart(); case 'drive-files': return this.driveFilesChart(); case 'drive-files-total': return this.driveFilesTotalChart(); + case 'network-requests': return this.networkRequestsChart(); + case 'network-time': return this.networkTimeChart(); + case 'network-usage': return this.networkUsageChart(); } }, @@ -544,7 +555,95 @@ export default Vue.extend({ } } }]; - } + }, + + networkRequestsChart(): any { + const data = this.stats.slice().reverse().map(x => ({ + date: new Date(x.date), + requests: x.network.requests + })); + + return [{ + datasets: [{ + label: 'Requests', + fill: true, + backgroundColor: rgba(colors.localPlus), + borderColor: colors.localPlus, + borderWidth: 2, + pointBackgroundColor: '#fff', + lineTension: 0, + data: data.map(x => ({ t: x.date, y: x.requests })) + }] + }]; + }, + + networkTimeChart(): any { + const data = this.stats.slice().reverse().map(x => ({ + date: new Date(x.date), + time: x.network.requests != 0 ? (x.network.totalTime / x.network.requests) : 0, + })); + + return [{ + datasets: [{ + label: 'Avg time (ms)', + fill: true, + backgroundColor: rgba(colors.localPlus), + borderColor: colors.localPlus, + borderWidth: 2, + pointBackgroundColor: '#fff', + lineTension: 0, + data: data.map(x => ({ t: x.date, y: x.time })) + }] + }]; + }, + + networkUsageChart(): any { + const data = this.stats.slice().reverse().map(x => ({ + date: new Date(x.date), + incoming: x.network.incomingBytes, + outgoing: x.network.outgoingBytes + })); + + return [{ + datasets: [{ + label: 'Incoming', + fill: true, + backgroundColor: rgba(colors.incoming), + borderColor: colors.incoming, + borderWidth: 2, + pointBackgroundColor: '#fff', + lineTension: 0, + data: data.map(x => ({ t: x.date, y: x.incoming })) + }, { + label: 'Outgoing', + fill: true, + backgroundColor: rgba(colors.outgoing), + borderColor: colors.outgoing, + borderWidth: 2, + pointBackgroundColor: '#fff', + lineTension: 0, + data: data.map(x => ({ t: x.date, y: x.outgoing })) + }] + }, { + scales: { + yAxes: [{ + ticks: { + callback: value => { + return Vue.filter('bytes')(value, 1); + } + } + }] + }, + tooltips: { + callbacks: { + label: (tooltipItem, data) => { + const label = data.datasets[tooltipItem.datasetIndex].label || ''; + return `${label}: ${Vue.filter('bytes')(tooltipItem.yLabel, 1)}`; + } + } + } + }]; + }, } }); </script> diff --git a/src/models/stats.ts b/src/models/stats.ts index d496f2c480..c4c838caeb 100644 --- a/src/models/stats.ts +++ b/src/models/stats.ts @@ -204,4 +204,30 @@ export interface IStats { decSize: number; }; }; + + /** + * ネットワークに関する統計 + */ + network: { + /** + * サーバーへのリクエスト数 + */ + requests: number; + + /** + * 応答時間の合計 + * TIP: (totalTime / requests) でひとつのリクエストに平均でどれくらいの時間がかかったか知れる + */ + totalTime: number; + + /** + * 合計受信データ量 + */ + incomingBytes: number; + + /** + * 合計送信データ量 + */ + outgoingBytes: number; + }; } diff --git a/src/server/api/endpoints/chart.ts b/src/server/api/endpoints/chart.ts index 7da970131e..3b1a3b56fc 100644 --- a/src/server/api/endpoints/chart.ts +++ b/src/server/api/endpoints/chart.ts @@ -6,6 +6,15 @@ type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>; function migrateStats(stats: IStats[]) { stats.forEach(stat => { + if (stat.network == null) { + stat.network = { + requests: 0, + totalTime: 0, + incomingBytes: 0, + outgoingBytes: 0 + }; + } + const isOldData = stat.users.local.inc == null || stat.users.local.dec == null || @@ -180,6 +189,12 @@ export default (params: any) => new Promise(async (res, rej) => { decCount: 0, decSize: 0 } + }, + network: { + requests: 0, + totalTime: 0, + incomingBytes: 0, + outgoingBytes: 0 } }); } else { @@ -236,6 +251,12 @@ export default (params: any) => new Promise(async (res, rej) => { decCount: 0, decSize: 0 } + }, + network: { + requests: 0, + totalTime: 0, + incomingBytes: 0, + outgoingBytes: 0 } }); } diff --git a/src/server/index.ts b/src/server/index.ts index f1fcf58c8d..dc60b0d9ec 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -11,11 +11,13 @@ import * as Router from 'koa-router'; import * as mount from 'koa-mount'; import * as compress from 'koa-compress'; import * as logger from 'koa-logger'; +const requestStats = require('request-stats'); //const slow = require('koa-slow'); import activityPub from './activitypub'; import webFinger from './webfinger'; import config from '../config'; +import { updateNetworkStats } from '../services/update-chart'; // Init app const app = new Koa(); @@ -81,4 +83,27 @@ export default () => new Promise(resolve => { // Listen server.listen(config.port, resolve); + + //#region Network stats + let queue: any[] = []; + + requestStats(server, (stats: any) => { + if (stats.ok) { + queue.push(stats); + } + }); + + // Bulk write + setInterval(() => { + if (queue.length == 0) return; + + const requests = queue.length; + const time = queue.reduce((a, b) => a + b.time, 0); + const incomingBytes = queue.reduce((a, b) => a + b.req.bytes, 0); + const outgoingBytes = queue.reduce((a, b) => a + b.res.bytes, 0); + queue = []; + + updateNetworkStats(requests, time, incomingBytes, outgoingBytes); + }, 5000); + //#endregion }); diff --git a/src/services/update-chart.ts b/src/services/update-chart.ts index 1f8da6be9f..78834ba601 100644 --- a/src/services/update-chart.ts +++ b/src/services/update-chart.ts @@ -96,6 +96,12 @@ async function getCurrentStats(span: 'day' | 'hour'): Promise<IStats> { decCount: 0, decSize: 0 } + }, + network: { + requests: 0, + totalTime: 0, + incomingBytes: 0, + outgoingBytes: 0 } }; @@ -161,6 +167,12 @@ async function getCurrentStats(span: 'day' | 'hour'): Promise<IStats> { decCount: 0, decSize: 0 } + }, + network: { + requests: 0, + totalTime: 0, + incomingBytes: 0, + outgoingBytes: 0 } }; @@ -243,3 +255,13 @@ export async function updateDriveStats(file: IDriveFile, isAdditional: boolean) await update(inc); } + +export async function updateNetworkStats(requests: number, time: number, incomingBytes: number, outgoingBytes: number) { + const inc = {} as any; + inc['network.requests'] = requests; + inc['network.totalTime'] = time; + inc['network.incomingBytes'] = incomingBytes; + inc['network.outgoingBytes'] = outgoingBytes; + + await update(inc); +} From fc31e44fd2d70ae8f4114009a26f00fc5db01fca Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 15 Sep 2018 05:42:14 +0900 Subject: [PATCH 248/539] Fix bug --- src/server/api/endpoints/aggregation/hashtags.ts | 2 +- src/server/api/endpoints/hashtags/trend.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/api/endpoints/aggregation/hashtags.ts b/src/server/api/endpoints/aggregation/hashtags.ts index c5aacd89cd..ffeafb2538 100644 --- a/src/server/api/endpoints/aggregation/hashtags.ts +++ b/src/server/api/endpoints/aggregation/hashtags.ts @@ -3,7 +3,7 @@ import Meta from '../../../../models/meta'; export default () => new Promise(async (res, rej) => { const meta = await Meta.findOne({}); - const hidedTags = (meta.hidedTags || []).map(t => t.toLowerCase()); + const hidedTags = meta ? (meta.hidedTags || []).map(t => t.toLowerCase()) : []; const span = 1000 * 60 * 60 * 24 * 7; // 1週間 diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts index bfa475619c..0ec6a4ffec 100644 --- a/src/server/api/endpoints/hashtags/trend.ts +++ b/src/server/api/endpoints/hashtags/trend.ts @@ -19,7 +19,7 @@ const max = 5; */ export default () => new Promise(async (res, rej) => { const meta = await Meta.findOne({}); - const hidedTags = (meta.hidedTags || []).map(t => t.toLowerCase()); + const hidedTags = meta ? (meta.hidedTags || []).map(t => t.toLowerCase()) : []; //#region 1. 直近Aの内に投稿されたハッシュタグ(とユーザーのペア)を集計 const data = await Note.aggregate([{ From 2fee2e51660fab5db24c3291403c6c6950eb61dc Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 15 Sep 2018 05:50:08 +0900 Subject: [PATCH 249/539] 8.40.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4b9eaf9e22..081780250a 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.39.0", - "clientVersion": "1.0.9650", + "version": "8.40.0", + "clientVersion": "1.0.9711", "codename": "nighthike", "main": "./built/index.js", "private": true, From 7b2b7d1456b500c8dd406a6e51c8f95d0f9405d3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 15 Sep 2018 21:48:10 +0900 Subject: [PATCH 250/539] Resolve #2066 --- package.json | 4 - .../components/games/reversi/reversi.game.vue | 16 +- .../games/reversi/reversi.index.vue | 1 - .../components/games/reversi/reversi.room.vue | 7 +- src/client/app/desktop/script.ts | 1 - .../views/components/settings.drive.vue | 1 - .../views/components/settings.profile.vue | 2 +- .../app/desktop/views/components/settings.vue | 33 +-- .../desktop/views/components/taskmanager.vue | 219 ------------------ src/client/app/init.ts | 11 - src/client/app/mobile/script.ts | 1 - src/client/element.scss | 12 - webpack.config.ts | 17 -- 13 files changed, 22 insertions(+), 303 deletions(-) delete mode 100644 src/client/app/desktop/views/components/taskmanager.vue delete mode 100644 src/client/element.scss diff --git a/package.json b/package.json index 081780250a..7b81c925b2 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,6 @@ "dompurify": "1.0.5", "double-ended-queue": "2.1.0-0", "elasticsearch": "15.1.1", - "element-ui": "2.4.6", "emojilib": "2.3.0", "escape-regexp": "0.0.1", "eslint": "5.0.1", @@ -132,7 +131,6 @@ "insert-text-at-cursor": "0.1.1", "is-root": "2.0.0", "is-url": "1.2.4", - "jquery": "3.3.1", "js-yaml": "3.12.0", "jsdom": "11.12.0", "koa": "2.5.1", @@ -160,8 +158,6 @@ "ms": "2.1.1", "nan": "2.11.0", "nested-property": "0.0.7", - "node-sass": "4.9.3", - "node-sass-json-importer": "4.0.1", "nprogress": "0.2.0", "object-assign-deep": "0.4.0", "on-build-webpack": "0.1.0", diff --git a/src/client/app/common/views/components/games/reversi/reversi.game.vue b/src/client/app/common/views/components/games/reversi/reversi.game.vue index 673879a435..fea19d917e 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.game.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.game.vue @@ -50,15 +50,15 @@ </div> <div class="player" v-if="game.isEnded"> - <el-button-group> - <el-button type="primary" @click="logPos = 0" :disabled="logPos == 0">%fa:angle-double-left%</el-button> - <el-button type="primary" @click="logPos--" :disabled="logPos == 0">%fa:angle-left%</el-button> - </el-button-group> + <div> + <button @click="logPos = 0" :disabled="logPos == 0">%fa:angle-double-left%</button> + <button @click="logPos--" :disabled="logPos == 0">%fa:angle-left%</button> + </div> <span>{{ logPos }} / {{ logs.length }}</span> - <el-button-group> - <el-button type="primary" @click="logPos++" :disabled="logPos == logs.length">%fa:angle-right%</el-button> - <el-button type="primary" @click="logPos = logs.length" :disabled="logPos == logs.length">%fa:angle-double-right%</el-button> - </el-button-group> + <div> + <button @click="logPos++" :disabled="logPos == logs.length">%fa:angle-right%</button> + <button @click="logPos = logs.length" :disabled="logPos == logs.length">%fa:angle-double-right%</button> + </div> </div> <div class="info"> diff --git a/src/client/app/common/views/components/games/reversi/reversi.index.vue b/src/client/app/common/views/components/games/reversi/reversi.index.vue index fa88aeaaf4..d23902aae7 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.index.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.index.vue @@ -3,7 +3,6 @@ <h1>%i18n:@title%</h1> <p>%i18n:@sub-title%</p> <div class="play"> - <!--<el-button round>フリーマッチ(準備中)</el-button>--> <form-button primary round @click="match">%i18n:@invite%</form-button> <details> <summary>%i18n:@rule%</summary> diff --git a/src/client/app/common/views/components/games/reversi/reversi.room.vue b/src/client/app/common/views/components/games/reversi/reversi.room.vue index aed8718dd0..fef833d63e 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.room.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.room.vue @@ -59,11 +59,6 @@ </header> <div> - <el-alert v-for="message in messages" - :title="message.text" - :type="message.type" - :key="message.id"/> - <template v-for="item in form"> <mk-switch v-if="item.type == 'switch'" v-model="item.value" :key="item.id" :text="item.label" @change="onChangeForm(item)">{{ item.desc || '' }}</mk-switch> @@ -93,7 +88,7 @@ </header> <div> - <el-input v-model="item.value" @change="onChangeForm(item)"/> + <input v-model="item.value" @change="onChangeForm(item)"/> </div> </div> </template> diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts index f0e8a42662..e32682286c 100644 --- a/src/client/app/desktop/script.ts +++ b/src/client/app/desktop/script.ts @@ -6,7 +6,6 @@ import VueRouter from 'vue-router'; // Style import './style.styl'; -import '../../element.scss'; import init from '../init'; import fuckAdBlock from '../common/scripts/fuck-ad-block'; diff --git a/src/client/app/desktop/views/components/settings.drive.vue b/src/client/app/desktop/views/components/settings.drive.vue index e8a3cc9685..d254b27110 100644 --- a/src/client/app/desktop/views/components/settings.drive.vue +++ b/src/client/app/desktop/views/components/settings.drive.vue @@ -1,7 +1,6 @@ <template> <div class="root"> <template v-if="!fetching"> - <el-progress :text-inside="true" :stroke-width="18" :percentage="Math.floor((usage / capacity) * 100)"/> <p><b>{{ capacity | bytes }}</b>%i18n:max%<b>{{ usage | bytes }}</b>%i18n:in-use%</p> </template> </div> diff --git a/src/client/app/desktop/views/components/settings.profile.vue b/src/client/app/desktop/views/components/settings.profile.vue index 0f53941b31..d47b5b224b 100644 --- a/src/client/app/desktop/views/components/settings.profile.vue +++ b/src/client/app/desktop/views/components/settings.profile.vue @@ -19,7 +19,7 @@ </label> <label class="ui from group"> <p>%i18n:@birthday%</p> - <el-date-picker v-model="birthday" type="date" value-format="yyyy-MM-dd"/> + <input type="date" v-model="birthday"/> </label> <button class="ui primary" @click="save">%i18n:@save%</button> <section> diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index 1973acc839..709715e598 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -87,13 +87,11 @@ <span>%i18n:@enable-sounds-desc%</span> </mk-switch> <label>%i18n:@volume%</label> - <el-slider + <input type="range" v-model="soundVolume" - :show-input="true" - :format-tooltip="v => `${v * 100}%`" :disabled="!enableSounds" - :max="1" - :step="0.1" + max="1" + step="0.1" /> <button class="ui button" @click="soundTest">%fa:volume-up% %i18n:@test%</button> </section> @@ -105,14 +103,15 @@ <section class="web" v-show="page == 'web'"> <h1>%i18n:@language%</h1> - <el-select v-model="lang" placeholder="%i18n:@pick-language%"> - <el-option-group label="%i18n:@recommended%"> - <el-option label="%i18n:@auto%" :value="null"/> - </el-option-group> - <el-option-group label="%i18n:@specify-language%"> - <el-option v-for="x in langs" :label="x[1]" :value="x[0]" :key="x[0]"/> - </el-option-group> - </el-select> + <select v-model="lang" placeholder="%i18n:@pick-language%"> + <optgroup label="%i18n:@recommended%"> + <option value="">%i18n:@auto%</option> + </optgroup> + + <optgroup label="%i18n:@specify-language%"> + <option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</option> + </optgroup> + </select> <div class="none ui info"> <p>%fa:info-circle%%i18n:@language-desc%</p> </div> @@ -207,10 +206,6 @@ <mk-switch v-model="enableExperimentalFeatures" text="%i18n:@experimental%"> <span>%i18n:@experimental-desc%</span> </mk-switch> - <details v-if="debug"> - <summary>%i18n:@tools%</summary> - <button class="ui button block" @click="taskmngr">%i18n:@task-manager%</button> - </details> </section> </div> </div> @@ -228,7 +223,6 @@ import XSignins from './settings.signins.vue'; import XDrive from './settings.drive.vue'; import { url, langs, version } from '../../../config'; import checkForUpdate from '../../../common/scripts/check-for-update'; -import MkTaskManager from './taskmanager.vue'; export default Vue.extend({ components: { @@ -408,9 +402,6 @@ export default Vue.extend({ }); }, methods: { - taskmngr() { - (this as any).os.new(MkTaskManager); - }, customizeHome() { this.$router.push('/i/customize-home'); this.$emit('done'); diff --git a/src/client/app/desktop/views/components/taskmanager.vue b/src/client/app/desktop/views/components/taskmanager.vue deleted file mode 100644 index 1f1385add8..0000000000 --- a/src/client/app/desktop/views/components/taskmanager.vue +++ /dev/null @@ -1,219 +0,0 @@ -<template> -<mk-window ref="window" width="750px" height="500px" @closed="$destroy" name="TaskManager"> - <span slot="header" :class="$style.header">%fa:stethoscope%%i18n:@title%</span> - <el-tabs :class="$style.content"> - <el-tab-pane label="Requests"> - <el-table - :data="os.requests" - style="width: 100%" - :default-sort="{prop: 'date', order: 'descending'}" - > - <el-table-column type="expand"> - <template slot-scope="props"> - <pre>{{ props.row.data }}</pre> - <pre>{{ props.row.res }}</pre> - </template> - </el-table-column> - - <el-table-column - label="Requested at" - prop="date" - sortable - > - <template slot-scope="scope"> - <b style="margin-right: 8px">{{ scope.row.date.getTime() }}</b> - <span>(<mk-time :time="scope.row.date"/>)</span> - </template> - </el-table-column> - - <el-table-column - label="Name" - > - <template slot-scope="scope"> - <b>{{ scope.row.name }}</b> - </template> - </el-table-column> - - <el-table-column - label="Status" - > - <template slot-scope="scope"> - <span>{{ scope.row.status || '(pending)' }}</span> - </template> - </el-table-column> - </el-table> - </el-tab-pane> - - <el-tab-pane label="Streams"> - <el-table - :data="os.connections" - style="width: 100%" - > - <el-table-column - label="Uptime" - > - <template slot-scope="scope"> - <mk-timer v-if="scope.row.connectedAt" :time="scope.row.connectedAt"/> - <span v-else>-</span> - </template> - </el-table-column> - - <el-table-column - label="Name" - > - <template slot-scope="scope"> - <b>{{ scope.row.name == '' ? '[Home]' : scope.row.name }}</b> - </template> - </el-table-column> - - <el-table-column - label="User" - > - <template slot-scope="scope"> - <span>{{ scope.row.user || '(anonymous)' }}</span> - </template> - </el-table-column> - - <el-table-column - prop="state" - label="State" - /> - - <el-table-column - prop="in" - label="In" - /> - - <el-table-column - prop="out" - label="Out" - /> - </el-table> - </el-tab-pane> - - <el-tab-pane label="Streams (Inspect)"> - <el-tabs type="card" style="height:50%"> - <el-tab-pane v-for="c in os.connections" :label="c.name == '' ? '[Home]' : c.name" :key="c.id" :name="c.id" ref="connectionsTab"> - <div style="padding: 12px 0 0 12px"> - <el-button size="mini" @click="send(c)">Send</el-button> - <el-button size="mini" type="warning" @click="c.isSuspended = true" v-if="!c.isSuspended">Suspend</el-button> - <el-button size="mini" type="success" @click="c.isSuspended = false" v-else>Resume</el-button> - <el-button size="mini" type="danger" @click="c.close">Disconnect</el-button> - </div> - - <el-table - :data="c.inout" - style="width: 100%" - :default-sort="{prop: 'at', order: 'descending'}" - > - <el-table-column type="expand"> - <template slot-scope="props"> - <pre>{{ props.row.data }}</pre> - </template> - </el-table-column> - - <el-table-column - label="Date" - prop="at" - sortable - > - <template slot-scope="scope"> - <b style="margin-right: 8px">{{ scope.row.at.getTime() }}</b> - <span>(<mk-time :time="scope.row.at"/>)</span> - </template> - </el-table-column> - - <el-table-column - label="Type" - > - <template slot-scope="scope"> - <span>{{ getMessageType(scope.row.data) }}</span> - </template> - </el-table-column> - - <el-table-column - label="Incoming / Outgoing" - prop="type" - /> - </el-table> - </el-tab-pane> - </el-tabs> - </el-tab-pane> - - <el-tab-pane label="Windows"> - <el-table - :data="Array.from(os.windows.windows)" - style="width: 100%" - > - <el-table-column - label="Name" - > - <template slot-scope="scope"> - <b>{{ scope.row.name || '(unknown)' }}</b> - </template> - </el-table-column> - - <el-table-column - label="Operations" - > - <template slot-scope="scope"> - <el-button size="mini" type="danger" @click="scope.row.close">Close</el-button> - </template> - </el-table-column> - </el-table> - </el-tab-pane> - </el-tabs> -</mk-window> -</template> - -<script lang="ts"> -import Vue from 'vue'; - -export default Vue.extend({ - mounted() { - (this as any).os.windows.on('added', this.onWindowsChanged); - (this as any).os.windows.on('removed', this.onWindowsChanged); - }, - beforeDestroy() { - (this as any).os.windows.off('added', this.onWindowsChanged); - (this as any).os.windows.off('removed', this.onWindowsChanged); - }, - methods: { - getMessageType(data): string { - return data.type ? data.type : '-'; - }, - onWindowsChanged() { - this.$forceUpdate(); - }, - send(c) { - (this as any).apis.input({ - title: 'Send a JSON message', - allowEmpty: false - }).then(json => { - c.send(JSON.parse(json)); - }); - } - } -}); -</script> - -<style lang="stylus" module> -.header - > [data-fa] - margin-right 4px - -.content - height 100% - overflow auto - -</style> - -<style> -.el-tabs__header { - margin-bottom: 0 !important; -} - -.el-tabs__item { - padding: 0 20px !important; -} -</style> diff --git a/src/client/app/init.ts b/src/client/app/init.ts index 82924e92e3..dfc3a819b8 100644 --- a/src/client/app/init.ts +++ b/src/client/app/init.ts @@ -7,9 +7,6 @@ import Vuex from 'vuex'; import VueRouter from 'vue-router'; import * as TreeView from 'vue-json-tree-view'; import VAnimateCss from 'v-animate-css'; -import Element from 'element-ui'; -import ElementLocaleEn from 'element-ui/lib/locale/lang/en'; -import ElementLocaleJa from 'element-ui/lib/locale/lang/ja'; import VModal from 'vue-js-modal'; import App from './app.vue'; @@ -17,18 +14,10 @@ import checkForUpdate from './common/scripts/check-for-update'; import MiOS, { API } from './mios'; import { version, codename, lang } from './config'; -let elementLocale; -switch (lang) { - case 'ja-JP': elementLocale = ElementLocaleJa; break; - case 'en-US': elementLocale = ElementLocaleEn; break; - default: elementLocale = ElementLocaleEn; break; -} - Vue.use(Vuex); Vue.use(VueRouter); Vue.use(TreeView); Vue.use(VAnimateCss); -Vue.use(Element, { locale: elementLocale }); Vue.use(VModal); // Register global directives diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts index 5b9d45462a..9412c85980 100644 --- a/src/client/app/mobile/script.ts +++ b/src/client/app/mobile/script.ts @@ -6,7 +6,6 @@ import VueRouter from 'vue-router'; // Style import './style.styl'; -import '../../element.scss'; import init from '../init'; diff --git a/src/client/element.scss b/src/client/element.scss deleted file mode 100644 index 917198e024..0000000000 --- a/src/client/element.scss +++ /dev/null @@ -1,12 +0,0 @@ -/* Element variable definitons */ -/* SEE: http://element.eleme.io/#/en-US/component/custom-theme */ - -@import '../const.json'; - -/* theme color */ -$--color-primary: $themeColor; - -/* icon font path, required */ -$--font-path: '~element-ui/lib/theme-chalk/fonts'; - -@import "~element-ui/packages/theme-chalk/src/index"; diff --git a/webpack.config.ts b/webpack.config.ts index a50d6c40cc..325923084e 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -7,7 +7,6 @@ import * as webpack from 'webpack'; import chalk from 'chalk'; import rndstr from 'rndstr'; const { VueLoaderPlugin } = require('vue-loader'); -const jsonImporter = require('node-sass-json-importer'); const minifyHtml = require('html-minifier').minify; const WebpackOnBuildPlugin = require('on-build-webpack'); //const HardSourceWebpackPlugin = require('hard-source-webpack-plugin'); @@ -183,22 +182,6 @@ module.exports = { loader: 'stylus-loader' }] }] - }, { - test: /\.scss$/, - exclude: /node_modules/, - use: [{ - loader: 'style-loader' - }, { - loader: 'css-loader', - options: { - minimize: true - } - }, { - loader: 'sass-loader', - options: { - importer: jsonImporter(), - } - }] }, { test: /\.css$/, use: [{ From 25b0a93acdec893ebd4f32b51ad0b7bc5df1350a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 15 Sep 2018 21:53:04 +0900 Subject: [PATCH 251/539] :v: --- src/client/app/common/views/components/menu.vue | 2 +- src/client/app/common/views/components/note-menu.vue | 8 ++++---- .../app/common/views/components/reaction-picker.vue | 4 ++-- .../app/common/views/components/visibility-chooser.vue | 4 ++-- src/client/app/common/views/directives/autocomplete.ts | 2 +- .../app/desktop/views/components/context-menu.vue | 2 +- src/client/app/desktop/views/components/dialog.vue | 2 +- .../app/desktop/views/components/friends-maker.vue | 2 +- .../desktop/views/components/media-image-dialog.vue | 2 +- .../desktop/views/components/media-video-dialog.vue | 2 +- .../app/desktop/views/components/ui-notification.vue | 2 +- .../app/desktop/views/components/user-preview.vue | 2 +- src/client/app/desktop/views/components/window.vue | 4 ++-- src/client/app/init.ts | 10 +++++++--- src/client/app/mobile/views/components/dialog.vue | 2 +- .../app/mobile/views/components/drive-file-chooser.vue | 6 +++--- .../mobile/views/components/drive-folder-chooser.vue | 4 ++-- .../app/mobile/views/components/friends-maker.vue | 2 +- src/client/app/mobile/views/components/notify.vue | 2 +- .../app/mobile/views/components/post-form-dialog.vue | 2 +- 20 files changed, 35 insertions(+), 31 deletions(-) diff --git a/src/client/app/common/views/components/menu.vue b/src/client/app/common/views/components/menu.vue index e99bfcbd26..fba7e235e0 100644 --- a/src/client/app/common/views/components/menu.vue +++ b/src/client/app/common/views/components/menu.vue @@ -108,7 +108,7 @@ export default Vue.extend({ easing: 'easeInBack', complete: () => { this.$emit('closed'); - this.$destroy(); + this.destroyDom(); } }); } diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue index 0b0609ac4e..c9912fb1e2 100644 --- a/src/client/app/common/views/components/note-menu.vue +++ b/src/client/app/common/views/components/note-menu.vue @@ -64,7 +64,7 @@ export default Vue.extend({ (this as any).api('i/pin', { noteId: this.note.id }).then(() => { - this.$destroy(); + this.destroyDom(); }); }, @@ -73,7 +73,7 @@ export default Vue.extend({ (this as any).api('notes/delete', { noteId: this.note.id }).then(() => { - this.$destroy(); + this.destroyDom(); }); }, @@ -81,13 +81,13 @@ export default Vue.extend({ (this as any).api('notes/favorites/create', { noteId: this.note.id }).then(() => { - this.$destroy(); + this.destroyDom(); }); }, closed() { this.$nextTick(() => { - this.$destroy(); + this.destroyDom(); }); } } diff --git a/src/client/app/common/views/components/reaction-picker.vue b/src/client/app/common/views/components/reaction-picker.vue index a455afbf7d..a4828c987b 100644 --- a/src/client/app/common/views/components/reaction-picker.vue +++ b/src/client/app/common/views/components/reaction-picker.vue @@ -95,7 +95,7 @@ export default Vue.extend({ reaction: reaction }).then(() => { if (this.cb) this.cb(); - this.$destroy(); + this.destroyDom(); }); }, onMouseover(e) { @@ -120,7 +120,7 @@ export default Vue.extend({ scale: 0.5, duration: 200, easing: 'easeInBack', - complete: () => this.$destroy() + complete: () => this.destroyDom() }); } } diff --git a/src/client/app/common/views/components/visibility-chooser.vue b/src/client/app/common/views/components/visibility-chooser.vue index 7d90b3520c..1830b1832e 100644 --- a/src/client/app/common/views/components/visibility-chooser.vue +++ b/src/client/app/common/views/components/visibility-chooser.vue @@ -101,7 +101,7 @@ export default Vue.extend({ this.$store.commit('device/setVisibility', visibility); } this.$emit('chosen', visibility); - this.$destroy(); + this.destroyDom(); }, close() { (this.$refs.backdrop as any).style.pointerEvents = 'none'; @@ -119,7 +119,7 @@ export default Vue.extend({ scale: 0.5, duration: 200, easing: 'easeInBack', - complete: () => this.$destroy() + complete: () => this.destroyDom() }); } } diff --git a/src/client/app/common/views/directives/autocomplete.ts b/src/client/app/common/views/directives/autocomplete.ts index 26bc13871d..f7f8e9bf16 100644 --- a/src/client/app/common/views/directives/autocomplete.ts +++ b/src/client/app/common/views/directives/autocomplete.ts @@ -167,7 +167,7 @@ class Autocomplete { private close() { if (this.suggestion == null) return; - this.suggestion.$destroy(); + this.suggestion.destroyDom(); this.suggestion = null; this.textarea.focus(); diff --git a/src/client/app/desktop/views/components/context-menu.vue b/src/client/app/desktop/views/components/context-menu.vue index afb6838eb6..49aeac143f 100644 --- a/src/client/app/desktop/views/components/context-menu.vue +++ b/src/client/app/desktop/views/components/context-menu.vue @@ -64,7 +64,7 @@ export default Vue.extend({ }); this.$emit('closed'); - this.$destroy(); + this.destroyDom(); } } }); diff --git a/src/client/app/desktop/views/components/dialog.vue b/src/client/app/desktop/views/components/dialog.vue index aff21c1754..bbb1e0030c 100644 --- a/src/client/app/desktop/views/components/dialog.vue +++ b/src/client/app/desktop/views/components/dialog.vue @@ -78,7 +78,7 @@ export default Vue.extend({ scale: 0.8, duration: 300, easing: [ 0.5, -0.5, 1, 0.5 ], - complete: () => this.$destroy() + complete: () => this.destroyDom() }); }, onBgClick() { diff --git a/src/client/app/desktop/views/components/friends-maker.vue b/src/client/app/desktop/views/components/friends-maker.vue index 7dfd9e4359..4e8a212b00 100644 --- a/src/client/app/desktop/views/components/friends-maker.vue +++ b/src/client/app/desktop/views/components/friends-maker.vue @@ -14,7 +14,7 @@ <p class="empty" v-if="!fetching && users.length == 0">%i18n:@empty%</p> <p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@fetching%<mk-ellipsis/></p> <a class="refresh" @click="refresh">%i18n:@refresh%</a> - <button class="close" @click="$destroy()" title="%i18n:@close%">%fa:times%</button> + <button class="close" @click="destroyDom()" title="%i18n:@close%">%fa:times%</button> </div> </template> diff --git a/src/client/app/desktop/views/components/media-image-dialog.vue b/src/client/app/desktop/views/components/media-image-dialog.vue index 026522d907..89a340d3ae 100644 --- a/src/client/app/desktop/views/components/media-image-dialog.vue +++ b/src/client/app/desktop/views/components/media-image-dialog.vue @@ -26,7 +26,7 @@ export default Vue.extend({ opacity: 0, duration: 100, easing: 'linear', - complete: () => this.$destroy() + complete: () => this.destroyDom() }); } } diff --git a/src/client/app/desktop/views/components/media-video-dialog.vue b/src/client/app/desktop/views/components/media-video-dialog.vue index 959cefa42c..03c93c8939 100644 --- a/src/client/app/desktop/views/components/media-video-dialog.vue +++ b/src/client/app/desktop/views/components/media-video-dialog.vue @@ -28,7 +28,7 @@ export default Vue.extend({ opacity: 0, duration: 100, easing: 'linear', - complete: () => this.$destroy() + complete: () => this.destroyDom() }); } } diff --git a/src/client/app/desktop/views/components/ui-notification.vue b/src/client/app/desktop/views/components/ui-notification.vue index 68413914c0..7519124870 100644 --- a/src/client/app/desktop/views/components/ui-notification.vue +++ b/src/client/app/desktop/views/components/ui-notification.vue @@ -27,7 +27,7 @@ export default Vue.extend({ translateY: -64, duration: 500, easing: 'easeInElastic', - complete: () => this.$destroy() + complete: () => this.destroyDom() }); }, 6000); }); diff --git a/src/client/app/desktop/views/components/user-preview.vue b/src/client/app/desktop/views/components/user-preview.vue index 1e1755ec3c..f6d6d68a7f 100644 --- a/src/client/app/desktop/views/components/user-preview.vue +++ b/src/client/app/desktop/views/components/user-preview.vue @@ -75,7 +75,7 @@ export default Vue.extend({ 'margin-top': '-8px', duration: 200, easing: 'easeOutQuad', - complete: () => this.$destroy() + complete: () => this.destroyDom() }); } } diff --git a/src/client/app/desktop/views/components/window.vue b/src/client/app/desktop/views/components/window.vue index ec044ad27e..30f0ec558f 100644 --- a/src/client/app/desktop/views/components/window.vue +++ b/src/client/app/desktop/views/components/window.vue @@ -106,7 +106,7 @@ export default Vue.extend({ mounted() { if (this.preventMount) { - this.$destroy(); + this.destroyDom(); return; } @@ -190,7 +190,7 @@ export default Vue.extend({ }); setTimeout(() => { - this.$destroy(); + this.destroyDom(); this.$emit('closed'); }, 300); }, diff --git a/src/client/app/init.ts b/src/client/app/init.ts index dfc3a819b8..db3852da60 100644 --- a/src/client/app/init.ts +++ b/src/client/app/init.ts @@ -31,9 +31,13 @@ require('./common/views/widgets'); require('./common/views/filters'); Vue.mixin({ - destroyed(this: any) { - if (this.$el.parentNode) { - this.$el.parentNode.removeChild(this.$el); + methods: { + destroyDom() { + this.$destroy(); + + if (this.$el.parentNode) { + this.$el.parentNode.removeChild(this.$el); + } } } }); diff --git a/src/client/app/mobile/views/components/dialog.vue b/src/client/app/mobile/views/components/dialog.vue index 9ee01cb782..6a0d74c752 100644 --- a/src/client/app/mobile/views/components/dialog.vue +++ b/src/client/app/mobile/views/components/dialog.vue @@ -78,7 +78,7 @@ export default Vue.extend({ scale: 0.8, duration: 300, easing: [ 0.5, -0.5, 1, 0.5 ], - complete: () => this.$destroy() + complete: () => this.destroyDom() }); }, onBgClick() { diff --git a/src/client/app/mobile/views/components/drive-file-chooser.vue b/src/client/app/mobile/views/components/drive-file-chooser.vue index aaa707d8a7..92ac211af2 100644 --- a/src/client/app/mobile/views/components/drive-file-chooser.vue +++ b/src/client/app/mobile/views/components/drive-file-chooser.vue @@ -31,15 +31,15 @@ export default Vue.extend({ }, onSelected(file) { this.$emit('selected', file); - this.$destroy(); + this.destroyDom(); }, cancel() { this.$emit('canceled'); - this.$destroy(); + this.destroyDom(); }, ok() { this.$emit('selected', this.files); - this.$destroy(); + this.destroyDom(); } } }); diff --git a/src/client/app/mobile/views/components/drive-folder-chooser.vue b/src/client/app/mobile/views/components/drive-folder-chooser.vue index 7934fb7816..6d3fba1efd 100644 --- a/src/client/app/mobile/views/components/drive-folder-chooser.vue +++ b/src/client/app/mobile/views/components/drive-folder-chooser.vue @@ -19,11 +19,11 @@ export default Vue.extend({ methods: { cancel() { this.$emit('canceled'); - this.$destroy(); + this.destroyDom(); }, ok() { this.$emit('selected', (this.$refs.browser as any).folder); - this.$destroy(); + this.destroyDom(); } } }); diff --git a/src/client/app/mobile/views/components/friends-maker.vue b/src/client/app/mobile/views/components/friends-maker.vue index e0461d2bc2..dbb82f4b18 100644 --- a/src/client/app/mobile/views/components/friends-maker.vue +++ b/src/client/app/mobile/views/components/friends-maker.vue @@ -47,7 +47,7 @@ export default Vue.extend({ this.fetch(); }, close() { - this.$destroy(); + this.destroyDom(); } } }); diff --git a/src/client/app/mobile/views/components/notify.vue b/src/client/app/mobile/views/components/notify.vue index 307fb08cfa..5f94b91ddd 100644 --- a/src/client/app/mobile/views/components/notify.vue +++ b/src/client/app/mobile/views/components/notify.vue @@ -32,7 +32,7 @@ export default Vue.extend({ [this.pos]: `-${this.$el.offsetHeight}px`, duration: 500, easing: 'easeOutQuad', - complete: () => this.$destroy() + complete: () => this.destroyDom() }); }, 6000); }); diff --git a/src/client/app/mobile/views/components/post-form-dialog.vue b/src/client/app/mobile/views/components/post-form-dialog.vue index ec37386512..15b36db945 100644 --- a/src/client/app/mobile/views/components/post-form-dialog.vue +++ b/src/client/app/mobile/views/components/post-form-dialog.vue @@ -79,7 +79,7 @@ export default Vue.extend({ translateY: 16, duration: 300, easing: 'easeOutQuad', - complete: () => this.$destroy() + complete: () => this.destroyDom() }); }, From ce659f99265e9c7fb7a4a0364b09754fe65505f4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 15 Sep 2018 22:03:34 +0900 Subject: [PATCH 252/539] 8.41.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 7b81c925b2..bd156e6c23 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.40.0", - "clientVersion": "1.0.9711", + "version": "8.41.0", + "clientVersion": "1.0.9716", "codename": "nighthike", "main": "./built/index.js", "private": true, From 952a49f7496c5c6a6dae8998e8d42ea53281db2e Mon Sep 17 00:00:00 2001 From: tamaina <tamaina@hotmail.co.jp> Date: Sat, 15 Sep 2018 22:22:41 +0900 Subject: [PATCH 253/539] =?UTF-8?q?revert=20=E3=83=87=E3=82=B9=E3=82=AF?= =?UTF-8?q?=E3=83=88=E3=83=83=E3=83=97=E3=81=AE=E5=8B=95=E7=94=BB=E5=9F=8B?= =?UTF-8?q?=E3=82=81=E8=BE=BC=E3=81=BF=E3=82=92=E5=BB=83=E6=AD=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../desktop/views/components/media-video.vue | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/client/app/desktop/views/components/media-video.vue b/src/client/app/desktop/views/components/media-video.vue index 0a374acb8f..8af5f9b07e 100644 --- a/src/client/app/desktop/views/components/media-video.vue +++ b/src/client/app/desktop/views/components/media-video.vue @@ -6,11 +6,19 @@ </div> </div> <div class="vwxdhznewyashiknzolsoihtlpicqepe" v-else> + <video class="video" + :src="video.url" + :title="video.name" + controls + @dblclick.prevent="onClick" + ref="video" + v-if="inlinePlayable" /> <a class="thumbnail" :href="video.url" :style="imageStyle" @click.prevent="onClick" - :title="video.name"> + :title="video.name" + v-else> %fa:R play-circle% </a> </div> @@ -19,13 +27,15 @@ <script lang="ts"> import Vue from 'vue'; import MkMediaVideoDialog from './media-video-dialog.vue'; - export default Vue.extend({ props: { video: { type: Object, required: true }, + inlinePlayable: { + default: false + }, hide: { type: Boolean, default: true @@ -57,32 +67,32 @@ export default Vue.extend({ <style lang="stylus" scoped> .vwxdhznewyashiknzolsoihtlpicqepe + .video + display block + width 100% + height 100% + border-radius 4px .thumbnail display flex justify-content center align-items center font-size 3.5em - cursor zoom-in overflow hidden background-position center background-size cover width 100% height 100% - .uofhebxjdgksfmltszlxurtjnjjsvioh display flex justify-content center align-items center background #111 color #fff - > div display table-cell text-align center font-size 12px - - > * + > b display block - </style> From 7ebee09f740d885f5a0829d86fb4725dd1a15b72 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Sat, 15 Sep 2018 13:57:29 +0000 Subject: [PATCH 254/539] fix(package): update vue-cropperjs to version 2.2.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bd156e6c23..f718f16266 100644 --- a/package.json +++ b/package.json @@ -206,7 +206,7 @@ "v-animate-css": "0.0.2", "vue": "2.5.17", "vue-chartjs": "3.4.0", - "vue-cropperjs": "2.2.1", + "vue-cropperjs": "2.2.2", "vue-js-modal": "1.3.26", "vue-json-tree-view": "2.1.4", "vue-loader": "15.4.2", From 7d768875176e38be394806376997055ee387f56f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 16 Sep 2018 03:46:53 +0900 Subject: [PATCH 255/539] =?UTF-8?q?=E3=82=A2=E3=83=8B=E3=83=A1=E3=83=BC?= =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=82=92=E7=84=A1=E5=8A=B9=E3=81=AB?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=82=AA=E3=83=97=E3=82=B7=E3=83=A7=E3=83=B3?= =?UTF-8?q?=E3=82=92=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 1 + src/client/app/common/views/components/trends.vue | 6 ++---- src/client/app/desktop/views/components/notes.vue | 4 ++-- src/client/app/desktop/views/components/notifications.vue | 4 ++-- src/client/app/desktop/views/components/settings.vue | 6 ++++++ .../app/desktop/views/pages/deck/deck.notifications.vue | 6 ++---- src/client/app/mobile/views/components/notes.vue | 4 ++-- src/client/app/mobile/views/components/notifications.vue | 6 ++---- src/client/app/mobile/views/pages/settings.vue | 6 ++++++ src/client/app/store.ts | 1 + 10 files changed, 26 insertions(+), 18 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 72dc88b7b3..c5ec3fd588 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -119,6 +119,7 @@ common: always-show-nsfw: "常に閲覧注意のメディアを表示する" always-mark-nsfw: "常にメディアを閲覧注意として投稿" show-full-acct: "ユーザー名のホストを省略しない" + enable-animations: "アニメーションを使用" this-setting-is-this-device-only: "このデバイスのみ" do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' diff --git a/src/client/app/common/views/components/trends.vue b/src/client/app/common/views/components/trends.vue index 627edc3876..0042dbe853 100644 --- a/src/client/app/common/views/components/trends.vue +++ b/src/client/app/common/views/components/trends.vue @@ -3,8 +3,7 @@ <p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> <p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%</p> <!-- トランジションを有効にするとなぜかメモリリークする --> - <!-- <transition-group v-else tag="div" name="chart"> --> - <div> + <transition-group v-else tag="div" name="chart"> <div v-for="stat in stats" :key="stat.tag"> <div class="tag"> <router-link :to="`/tags/${ encodeURIComponent(stat.tag) }`" :title="stat.tag">#{{ stat.tag }}</router-link> @@ -12,8 +11,7 @@ </div> <x-chart class="chart" :src="stat.chart"/> </div> - </div> - <!-- </transition-group> --> + </transition-group> </div> </template> diff --git a/src/client/app/desktop/views/components/notes.vue b/src/client/app/desktop/views/components/notes.vue index 26aa0c8dea..1d8c3fff36 100644 --- a/src/client/app/desktop/views/components/notes.vue +++ b/src/client/app/desktop/views/components/notes.vue @@ -10,7 +10,7 @@ </div> <!-- トランジションを有効にするとなぜかメモリリークする --> - <transition-group name="mk-notes" class="notes transition" tag="div"> + <component :is="$store.state.device.animations ? 'transition-group' : 'div'" name="mk-notes" class="notes transition" tag="div"> <template v-for="(note, i) in _notes"> <x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)"/> <p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date"> @@ -18,7 +18,7 @@ <span>%fa:angle-down%{{ _notes[i + 1]._datetext }}</span> </p> </template> - </transition-group> + </component> <footer v-if="more"> <button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }"> diff --git a/src/client/app/desktop/views/components/notifications.vue b/src/client/app/desktop/views/components/notifications.vue index 9d0e73adef..0debd3f824 100644 --- a/src/client/app/desktop/views/components/notifications.vue +++ b/src/client/app/desktop/views/components/notifications.vue @@ -2,7 +2,7 @@ <div class="mk-notifications"> <div class="notifications" v-if="notifications.length != 0"> <!-- トランジションを有効にするとなぜかメモリリークする --> - <transition-group name="mk-notifications" class="transition" tag="div"> + <component :is="$store.state.device.animations ? 'transition-group' : 'div'" name="mk-notifications" class="transition" tag="div"> <template v-for="(notification, i) in _notifications"> <div class="notification" :class="notification.type" :key="notification.id"> <mk-time :time="notification.createdAt"/> @@ -96,7 +96,7 @@ <span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span> </p> </template> - </transition-group> + </component> </div> <button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications"> <template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }} diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index 709715e598..c46f6cfab1 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -60,6 +60,7 @@ <button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button> <mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/> <mk-switch v-model="circleIcons" text="%i18n:@circle-icons%"/> + <mk-switch v-model="animations" text="%i18n:common.enable-animations%"/> <mk-switch v-model="contrastedAcct" text="%i18n:@contrasted-acct%"/> <mk-switch v-model="showFullAcct" text="%i18n:common.show-full-acct%"/> <mk-switch v-model="gradientWindowHeader" text="%i18n:@gradient-window-header%"/> @@ -246,6 +247,11 @@ export default Vue.extend({ }; }, computed: { + animations: { + get() { return this.$store.state.device.animations; }, + set(value) { this.$store.commit('device/set', { key: 'animations', value }); } + }, + apiViaStream: { get() { return this.$store.state.device.apiViaStream; }, set(value) { this.$store.commit('device/set', { key: 'apiViaStream', value }); } diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications.vue b/src/client/app/desktop/views/pages/deck/deck.notifications.vue index fcb74b9140..18d9a21c64 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notifications.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notifications.vue @@ -1,8 +1,7 @@ <template> <div class="oxynyeqmfvracxnglgulyqfgqxnxmehl"> <!-- トランジションを有効にするとなぜかメモリリークする --> - <!--<transition-group name="mk-notifications" class="transition notifications">--> - <div class="notifications"> + <component :is="$store.state.device.animations ? 'transition-group' : 'div'" name="mk-notifications" class="transition notifications"> <template v-for="(notification, i) in _notifications"> <x-notification class="notification" :notification="notification" :key="notification.id"/> <p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'"> @@ -10,8 +9,7 @@ <span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span> </p> </template> - </div> - <!--</transition-group>--> + </component> <button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications"> <template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }} </button> diff --git a/src/client/app/mobile/views/components/notes.vue b/src/client/app/mobile/views/components/notes.vue index 17806f062e..f2ad93bebf 100644 --- a/src/client/app/mobile/views/components/notes.vue +++ b/src/client/app/mobile/views/components/notes.vue @@ -14,7 +14,7 @@ </div> <!-- トランジションを有効にするとなぜかメモリリークする --> - <transition-group name="mk-notes" class="transition" tag="div"> + <component :is="$store.state.device.animations ? 'transition-group' : 'div'" name="mk-notes" class="transition" tag="div"> <template v-for="(note, i) in _notes"> <mk-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)"/> <p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date"> @@ -22,7 +22,7 @@ <span>%fa:angle-down%{{ _notes[i + 1]._datetext }}</span> </p> </template> - </transition-group> + </component> <footer v-if="more"> <button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }"> diff --git a/src/client/app/mobile/views/components/notifications.vue b/src/client/app/mobile/views/components/notifications.vue index 9f20c3fb22..95c85beaca 100644 --- a/src/client/app/mobile/views/components/notifications.vue +++ b/src/client/app/mobile/views/components/notifications.vue @@ -1,8 +1,7 @@ <template> <div class="mk-notifications"> <!-- トランジションを有効にするとなぜかメモリリークする --> - <!-- <transition-group name="mk-notifications" class="transition notifications"> --> - <div class="transition notifications"> + <component :is="$store.state.device.animations ? 'transition-group' : 'div'" name="mk-notifications" class="transition notifications"> <template v-for="(notification, i) in _notifications"> <mk-notification :notification="notification" :key="notification.id"/> <p class="date" :key="notification.id + '_date'" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date"> @@ -10,8 +9,7 @@ <span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span> </p> </template> - </div> - <!-- </transition-group> --> + </component> <button class="more" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications"> <template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template> diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index 9b0e521a4f..c14a683f23 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -13,6 +13,7 @@ <section> <ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch> <ui-switch v-model="circleIcons">%i18n:@circle-icons%</ui-switch> + <ui-switch v-model="animations">%i18n:common.enable-animations% (%i18n:common.this-setting-is-this-device-only%)</ui-switch> <ui-switch v-model="contrastedAcct">%i18n:@contrasted-acct%</ui-switch> <ui-switch v-model="showFullAcct">%i18n:common.show-full-acct%</ui-switch> <ui-switch v-model="iLikeSushi">%i18n:common.i-like-sushi%</ui-switch> @@ -168,6 +169,11 @@ export default Vue.extend({ set(value) { this.$store.commit('device/set', { key: 'darkmode', value }); } }, + animations: { + get() { return this.$store.state.device.animations; }, + set(value) { this.$store.commit('device/set', { key: 'animations', value }); } + }, + alwaysShowNsfw: { get() { return this.$store.state.device.alwaysShowNsfw; }, set(value) { this.$store.commit('device/set', { key: 'alwaysShowNsfw', value }); } diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 997bddc5cc..a7d9bd4560 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -38,6 +38,7 @@ const defaultSettings = { }; const defaultDeviceSettings = { + animations: true, apiViaStream: true, autoPopout: false, darkmode: false, From 2e3d0d3435ea7597ba22ba718f1189ecf3e44843 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 16 Sep 2018 03:48:16 +0900 Subject: [PATCH 256/539] Fix bug --- src/client/app/mobile/views/components/post-form.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index e53ba48ffb..024c73674c 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -59,7 +59,7 @@ import MkVisibilityChooser from '../../../common/views/components/visibility-cho import getFace from '../../../common/scripts/get-face'; import parse from '../../../../../mfm/parse'; import { host } from '../../../config'; -import { erase } from '../../../../../prelude/array'; +import { erase, unique } from '../../../../../prelude/array'; import { length } from 'stringz'; import parseAcct from '../../../../../misc/acct/parse'; From 2a96429be81460036cea60cf57f88f2e9a77d8ba Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 16 Sep 2018 04:21:48 +0900 Subject: [PATCH 257/539] =?UTF-8?q?=E3=83=90=E3=82=B0=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=82=84=E3=83=87=E3=82=B6=E3=82=A4=E3=83=B3=E8=AA=BF=E6=95=B4?= =?UTF-8?q?=E3=81=AA=E3=81=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/views/components/media-banner.vue | 26 +++++++++---------- .../common/views/components/media-list.vue | 22 +++++++++++----- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/client/app/common/views/components/media-banner.vue b/src/client/app/common/views/components/media-banner.vue index 5c83925a32..0693143f02 100644 --- a/src/client/app/common/views/components/media-banner.vue +++ b/src/client/app/common/views/components/media-banner.vue @@ -1,11 +1,11 @@ <template> <div class="mk-media-banner"> - <div class="mk-media-banner-sensitive" v-if="media.isSensitive && hide" @click="hide = false"> - <span class="mk-media-banner-icon">%fa:exclamation-triangle%</span> + <div class="sensitive" v-if="media.isSensitive && hide" @click="hide = false"> + <span class="icon">%fa:exclamation-triangle%</span> <b>%i18n:@sensitive%</b> <span>%i18n:@click-to-show%</span> </div> - <div class="mk-media-banner-audio" v-else-if="media.type.startsWith('audio')"> + <div class="audio" v-else-if="media.type.startsWith('audio')"> <audio class="audio" :src="media.url" :title="media.name" @@ -13,12 +13,12 @@ ref="audio" preload="metadata" /> </div> - <a class="mk-media-banner-download" v-else + <a class="download" v-else :href="media.url" :title="media.name" :download="media.name" > - <span class="mk-media-banner-icon">%fa:download%</span> + <span class="icon">%fa:download%</span> <b>{{ media.name }}</b> </a> </div> @@ -48,40 +48,38 @@ root(isDark) margin-top 4px overflow hidden - .mk-media-banner-download, - .mk-media-banner-sensitive + > .download, + > .sensitive display flex align-items center font-size 12px - padding .2em .6em + padding 8px 12px white-space nowrap > * display block > b - flex-shrink 2147483647 overflow hidden text-overflow ellipsis > *:not(:last-child) margin-right .2em - > .mk-media-banner-icon + > .icon font-size 1.6em - .mk-media-banner-download + > .download background isDark ? #21242d : #f7f7f7 - .mk-media-banner-sensitive + > .sensitive background #111 color #fff - .mk-media-banner-audio + > .audio .audio display block width 100% - height 100% .mk-media-banner[data-darkmode] root(true) diff --git a/src/client/app/common/views/components/media-list.vue b/src/client/app/common/views/components/media-list.vue index e949c063ab..b4b7d8f87f 100644 --- a/src/client/app/common/views/components/media-list.vue +++ b/src/client/app/common/views/components/media-list.vue @@ -1,10 +1,10 @@ <template> <div class="mk-media-list"> - <template v-for="media in mediaList"> - <mk-media-banner :media="media" :key="media.id" v-if="!media.type.startsWith('image') && !media.type.startsWith('video')"/> + <template v-for="media in mediaList.filter(media => !previewable(media))"> + <mk-media-banner :media="media" :key="media.id"/> </template> - <div class="mk-media-list-fixed" v-if="mediaList.filter(media => media.type.startsWith('image') || media.type.startsWith('video')).length > 0"> - <div :data-count="mediaList.filter(media => media.type.startsWith('video') || media.type.startsWith('image')).length" ref="grid"> + <div v-if="mediaList.filter(media => previewable(media)).length > 0" class="gird-container"> + <div :data-count="mediaList.filter(media => previewable(media)).length" ref="grid"> <template v-for="media in mediaList"> <mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')"/> <mk-media-image :image="media" :key="media.id" v-else-if="media.type.startsWith('image')" :raw="raw"/> @@ -27,15 +27,23 @@ export default Vue.extend({ } }, mounted() { - // for Safari bug - this.$refs.grid.style.height = this.$refs.grid.clientHeight ? `${this.$refs.grid.clientHeight}px` : '128px'; + //#region for Safari bug + if (this.$refs.grid) { + this.$refs.grid.style.height = this.$refs.grid.clientHeight ? `${this.$refs.grid.clientHeight}px` : '128px'; + } + //#endregion + }, + methods: { + previewable(file) { + return file.type.startsWith('video') || file.type.startsWith('image'); + } } }); </script> <style lang="stylus" scoped> .mk-media-list - > .mk-media-list-fixed + > .gird-container width 100% margin-top 4px From 8d24fcba6ab18ef03127f8d95eb87ce45bb005d7 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 16 Sep 2018 04:26:01 +0900 Subject: [PATCH 258/539] :v: --- src/client/app/common/views/components/index.ts | 2 -- src/client/app/common/views/components/media-list.vue | 6 +++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts index 21af4ec846..6f8152cea2 100644 --- a/src/client/app/common/views/components/index.ts +++ b/src/client/app/common/views/components/index.ts @@ -20,7 +20,6 @@ import reactionsViewer from './reactions-viewer.vue'; import time from './time.vue'; import timer from './timer.vue'; import mediaList from './media-list.vue'; -import mediaBanner from './media-banner.vue'; import uploader from './uploader.vue'; import specialMessage from './special-message.vue'; import streamIndicator from './stream-indicator.vue'; @@ -64,7 +63,6 @@ Vue.component('mk-reactions-viewer', reactionsViewer); Vue.component('mk-time', time); Vue.component('mk-timer', timer); Vue.component('mk-media-list', mediaList); -Vue.component('mk-media-banner', mediaBanner); Vue.component('mk-uploader', uploader); Vue.component('mk-special-message', specialMessage); Vue.component('mk-stream-indicator', streamIndicator); diff --git a/src/client/app/common/views/components/media-list.vue b/src/client/app/common/views/components/media-list.vue index b4b7d8f87f..d83d6f85cd 100644 --- a/src/client/app/common/views/components/media-list.vue +++ b/src/client/app/common/views/components/media-list.vue @@ -1,7 +1,7 @@ <template> <div class="mk-media-list"> <template v-for="media in mediaList.filter(media => !previewable(media))"> - <mk-media-banner :media="media" :key="media.id"/> + <x-banner :media="media" :key="media.id"/> </template> <div v-if="mediaList.filter(media => previewable(media)).length > 0" class="gird-container"> <div :data-count="mediaList.filter(media => previewable(media)).length" ref="grid"> @@ -16,8 +16,12 @@ <script lang="ts"> import Vue from 'vue'; +import XBanner from './media-banner.vue'; export default Vue.extend({ + components: { + XBanner + }, props: { mediaList: { required: true From a680bcda1fdb6f0658fea1c99cc115ce10e190c5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 16 Sep 2018 04:27:10 +0900 Subject: [PATCH 259/539] Fix --- src/client/app/desktop/views/components/media-video.vue | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/client/app/desktop/views/components/media-video.vue b/src/client/app/desktop/views/components/media-video.vue index 8af5f9b07e..d2752b0c95 100644 --- a/src/client/app/desktop/views/components/media-video.vue +++ b/src/client/app/desktop/views/components/media-video.vue @@ -27,6 +27,7 @@ <script lang="ts"> import Vue from 'vue'; import MkMediaVideoDialog from './media-video-dialog.vue'; + export default Vue.extend({ props: { video: { @@ -72,6 +73,7 @@ export default Vue.extend({ width 100% height 100% border-radius 4px + .thumbnail display flex justify-content center @@ -83,16 +85,19 @@ export default Vue.extend({ background-size cover width 100% height 100% + .uofhebxjdgksfmltszlxurtjnjjsvioh display flex justify-content center align-items center background #111 color #fff + > div display table-cell text-align center font-size 12px + > b display block </style> From 19152c28cb88eee42ef820242f47deeb9d1c63d8 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 16 Sep 2018 04:31:55 +0900 Subject: [PATCH 260/539] Fix bug --- .../app/common/views/components/media-banner.vue | 9 +++++---- .../app/desktop/views/components/media-image.vue | 9 +++++---- .../app/desktop/views/components/media-video.vue | 9 +++++---- .../app/mobile/views/components/media-image.vue | 9 +++++---- .../app/mobile/views/components/media-video.vue | 15 +++++++++------ 5 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/client/app/common/views/components/media-banner.vue b/src/client/app/common/views/components/media-banner.vue index 0693143f02..211dbf0208 100644 --- a/src/client/app/common/views/components/media-banner.vue +++ b/src/client/app/common/views/components/media-banner.vue @@ -32,11 +32,12 @@ export default Vue.extend({ media: { type: Object, required: true - }, - hide: { - type: Boolean, - default: true } + }, + data() { + return { + hide: true + }; } }) </script> diff --git a/src/client/app/desktop/views/components/media-image.vue b/src/client/app/desktop/views/components/media-image.vue index 3cff8cfc04..f9ab188ca5 100644 --- a/src/client/app/desktop/views/components/media-image.vue +++ b/src/client/app/desktop/views/components/media-image.vue @@ -27,12 +27,13 @@ export default Vue.extend({ }, raw: { default: false - }, - hide: { - type: Boolean, - default: true } }, + data() { + return { + hide: true + }; + }, computed: { style(): any { return { diff --git a/src/client/app/desktop/views/components/media-video.vue b/src/client/app/desktop/views/components/media-video.vue index d2752b0c95..1ff762abc2 100644 --- a/src/client/app/desktop/views/components/media-video.vue +++ b/src/client/app/desktop/views/components/media-video.vue @@ -36,12 +36,13 @@ export default Vue.extend({ }, inlinePlayable: { default: false - }, - hide: { - type: Boolean, - default: true } }, + data() { + return { + hide: true + }; + }, computed: { imageStyle(): any { return { diff --git a/src/client/app/mobile/views/components/media-image.vue b/src/client/app/mobile/views/components/media-image.vue index e38cef06ba..652a2ad3a4 100644 --- a/src/client/app/mobile/views/components/media-image.vue +++ b/src/client/app/mobile/views/components/media-image.vue @@ -19,12 +19,13 @@ export default Vue.extend({ }, raw: { default: false - }, - hide: { - type: Boolean, - default: true } }, + data() { + return { + hide: true + }; + } computed: { style(): any { let url = `url(${this.image.thumbnailUrl})`; diff --git a/src/client/app/mobile/views/components/media-video.vue b/src/client/app/mobile/views/components/media-video.vue index aea7f41460..1e2c1ea7b0 100644 --- a/src/client/app/mobile/views/components/media-video.vue +++ b/src/client/app/mobile/views/components/media-video.vue @@ -15,25 +15,28 @@ </template> <script lang="ts"> -import Vue from 'vue' +import Vue from 'vue'; + export default Vue.extend({ props: { video: { type: Object, required: true - }, - hide: { - type: Boolean, - default: true } }, + data() { + return { + hide: true + }; + }, computed: { imageStyle(): any { return { 'background-image': `url(${this.video.url})` }; } - },}) + } +}); </script> <style lang="stylus" scoped> From a61320ca8c6148f7b1b75278a7ddcf364b205009 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 16 Sep 2018 04:34:46 +0900 Subject: [PATCH 261/539] Improve usability --- src/client/app/desktop/views/components/post-form.vue | 2 +- src/client/app/mobile/views/components/post-form.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index c371940aa3..8db85aeaca 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -49,7 +49,7 @@ <button :class="{ posting }" class="submit" :disabled="!canPost" @click="post"> {{ posting ? '%i18n:@posting%' : submitText }}<mk-ellipsis v-if="posting"/> </button> - <input ref="file" type="file" accept="image/*" multiple="multiple" tabindex="-1" @change="onChangeFile"/> + <input ref="file" type="file" multiple="multiple" tabindex="-1" @change="onChangeFile"/> <div class="dropzone" v-if="draghover"></div> </div> </template> diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 024c73674c..1294273a2a 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -42,7 +42,7 @@ <span v-if="visibility === 'private'">%fa:lock%</span> </button> </footer> - <input ref="file" class="file" type="file" accept="image/*" multiple="multiple" @change="onChangeFile"/> + <input ref="file" class="file" type="file" multiple="multiple" @change="onChangeFile"/> </div> </div> <div class="hashtags" v-if="recentHashtags.length > 0 && $store.state.settings.suggestRecentHashtags"> From f7228e79bbc8da4457230ca6bcae21c3afb2cf46 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 16 Sep 2018 04:47:16 +0900 Subject: [PATCH 262/539] 8.42.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index f718f16266..483cef9996 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.41.0", - "clientVersion": "1.0.9716", + "version": "8.42.0", + "clientVersion": "1.0.9769", "codename": "nighthike", "main": "./built/index.js", "private": true, From cda3635d97fbacb3fda2f36cd501b962f4fda410 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 16 Sep 2018 21:40:48 +0900 Subject: [PATCH 263/539] enable-animations --> reduce-motion --- locales/ja-JP.yml | 2 +- src/client/app/desktop/views/components/notes.vue | 2 +- src/client/app/desktop/views/components/notifications.vue | 2 +- src/client/app/desktop/views/components/settings.vue | 8 ++++---- .../app/desktop/views/pages/deck/deck.notifications.vue | 2 +- src/client/app/mobile/views/components/notes.vue | 2 +- src/client/app/mobile/views/components/notifications.vue | 2 +- src/client/app/mobile/views/pages/settings.vue | 8 ++++---- src/client/app/store.ts | 2 +- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index c2a8110d92..3ced4dafe1 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -119,7 +119,7 @@ common: always-show-nsfw: "常に閲覧注意のメディアを表示する" always-mark-nsfw: "常にメディアを閲覧注意として投稿" show-full-acct: "ユーザー名のホストを省略しない" - enable-animations: "アニメーションを使用" + reduce-motion: "UIの動きを減らす" this-setting-is-this-device-only: "このデバイスのみ" do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' diff --git a/src/client/app/desktop/views/components/notes.vue b/src/client/app/desktop/views/components/notes.vue index 1d8c3fff36..ec9aa285d0 100644 --- a/src/client/app/desktop/views/components/notes.vue +++ b/src/client/app/desktop/views/components/notes.vue @@ -10,7 +10,7 @@ </div> <!-- トランジションを有効にするとなぜかメモリリークする --> - <component :is="$store.state.device.animations ? 'transition-group' : 'div'" name="mk-notes" class="notes transition" tag="div"> + <component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notes" class="notes transition" tag="div"> <template v-for="(note, i) in _notes"> <x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)"/> <p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date"> diff --git a/src/client/app/desktop/views/components/notifications.vue b/src/client/app/desktop/views/components/notifications.vue index 0debd3f824..2eb80dcd01 100644 --- a/src/client/app/desktop/views/components/notifications.vue +++ b/src/client/app/desktop/views/components/notifications.vue @@ -2,7 +2,7 @@ <div class="mk-notifications"> <div class="notifications" v-if="notifications.length != 0"> <!-- トランジションを有効にするとなぜかメモリリークする --> - <component :is="$store.state.device.animations ? 'transition-group' : 'div'" name="mk-notifications" class="transition" tag="div"> + <component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notifications" class="transition" tag="div"> <template v-for="(notification, i) in _notifications"> <div class="notification" :class="notification.type" :key="notification.id"> <mk-time :time="notification.createdAt"/> diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index c46f6cfab1..3911ec5931 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -60,7 +60,7 @@ <button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button> <mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/> <mk-switch v-model="circleIcons" text="%i18n:@circle-icons%"/> - <mk-switch v-model="animations" text="%i18n:common.enable-animations%"/> + <mk-switch v-model="reduceMotion" text="%i18n:common.reduce-motion%"/> <mk-switch v-model="contrastedAcct" text="%i18n:@contrasted-acct%"/> <mk-switch v-model="showFullAcct" text="%i18n:common.show-full-acct%"/> <mk-switch v-model="gradientWindowHeader" text="%i18n:@gradient-window-header%"/> @@ -247,9 +247,9 @@ export default Vue.extend({ }; }, computed: { - animations: { - get() { return this.$store.state.device.animations; }, - set(value) { this.$store.commit('device/set', { key: 'animations', value }); } + reduceMotion: { + get() { return this.$store.state.device.reduceMotion; }, + set(value) { this.$store.commit('device/set', { key: 'reduceMotion', value }); } }, apiViaStream: { diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications.vue b/src/client/app/desktop/views/pages/deck/deck.notifications.vue index 18d9a21c64..f73f221b7b 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notifications.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notifications.vue @@ -1,7 +1,7 @@ <template> <div class="oxynyeqmfvracxnglgulyqfgqxnxmehl"> <!-- トランジションを有効にするとなぜかメモリリークする --> - <component :is="$store.state.device.animations ? 'transition-group' : 'div'" name="mk-notifications" class="transition notifications"> + <component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notifications" class="transition notifications"> <template v-for="(notification, i) in _notifications"> <x-notification class="notification" :notification="notification" :key="notification.id"/> <p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'"> diff --git a/src/client/app/mobile/views/components/notes.vue b/src/client/app/mobile/views/components/notes.vue index f2ad93bebf..401df3ae5b 100644 --- a/src/client/app/mobile/views/components/notes.vue +++ b/src/client/app/mobile/views/components/notes.vue @@ -14,7 +14,7 @@ </div> <!-- トランジションを有効にするとなぜかメモリリークする --> - <component :is="$store.state.device.animations ? 'transition-group' : 'div'" name="mk-notes" class="transition" tag="div"> + <component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notes" class="transition" tag="div"> <template v-for="(note, i) in _notes"> <mk-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)"/> <p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date"> diff --git a/src/client/app/mobile/views/components/notifications.vue b/src/client/app/mobile/views/components/notifications.vue index 95c85beaca..11ac23f4b1 100644 --- a/src/client/app/mobile/views/components/notifications.vue +++ b/src/client/app/mobile/views/components/notifications.vue @@ -1,7 +1,7 @@ <template> <div class="mk-notifications"> <!-- トランジションを有効にするとなぜかメモリリークする --> - <component :is="$store.state.device.animations ? 'transition-group' : 'div'" name="mk-notifications" class="transition notifications"> + <component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notifications" class="transition notifications"> <template v-for="(notification, i) in _notifications"> <mk-notification :notification="notification" :key="notification.id"/> <p class="date" :key="notification.id + '_date'" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date"> diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index c14a683f23..f315c058df 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -13,7 +13,7 @@ <section> <ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch> <ui-switch v-model="circleIcons">%i18n:@circle-icons%</ui-switch> - <ui-switch v-model="animations">%i18n:common.enable-animations% (%i18n:common.this-setting-is-this-device-only%)</ui-switch> + <ui-switch v-model="reduceMotion">%i18n:common.reduce-motion% (%i18n:common.this-setting-is-this-device-only%)</ui-switch> <ui-switch v-model="contrastedAcct">%i18n:@contrasted-acct%</ui-switch> <ui-switch v-model="showFullAcct">%i18n:common.show-full-acct%</ui-switch> <ui-switch v-model="iLikeSushi">%i18n:common.i-like-sushi%</ui-switch> @@ -169,9 +169,9 @@ export default Vue.extend({ set(value) { this.$store.commit('device/set', { key: 'darkmode', value }); } }, - animations: { - get() { return this.$store.state.device.animations; }, - set(value) { this.$store.commit('device/set', { key: 'animations', value }); } + reduceMotion: { + get() { return this.$store.state.device.reduceMotion; }, + set(value) { this.$store.commit('device/set', { key: 'reduceMotion', value }); } }, alwaysShowNsfw: { diff --git a/src/client/app/store.ts b/src/client/app/store.ts index a7d9bd4560..7eaef13125 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -38,7 +38,7 @@ const defaultSettings = { }; const defaultDeviceSettings = { - animations: true, + reduceMotion: false, apiViaStream: true, autoPopout: false, darkmode: false, From 32afe77a269f414965373e3c53044c4a94cfeded Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 16 Sep 2018 22:48:57 +0900 Subject: [PATCH 264/539] =?UTF-8?q?=E8=87=AA=E5=88=86=E5=AE=9B=E3=81=A6?= =?UTF-8?q?=E3=81=AE=E6=8A=95=E7=A8=BF=E3=82=92=E3=82=BF=E3=82=A4=E3=83=A0?= =?UTF-8?q?=E3=83=A9=E3=82=A4=E3=83=B3=E3=81=A7=E8=A6=8B=E3=82=8C=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 3 + .../views/components/timeline.core.vue | 6 +- .../app/desktop/views/components/timeline.vue | 2 + .../app/mobile/views/pages/home.timeline.vue | 6 +- src/client/app/mobile/views/pages/home.vue | 3 + src/models/note.ts | 2 + src/server/api/endpoints/notes/mentions.ts | 61 ++++++++++--------- src/services/note/create.ts | 4 ++ 8 files changed, 55 insertions(+), 32 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 3ced4dafe1..2a8cfebb57 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -167,6 +167,7 @@ common: local: "ローカル" hybrid: "ソーシャル" global: "グローバル" + mentions: "あなた宛て" notifications: "通知" list: "リスト" swap-left: "左に移動" @@ -913,6 +914,7 @@ desktop/views/components/timeline.vue: local: "ローカル" hybrid: "ソーシャル" global: "グローバル" + mentions: "あなた宛て" list: "リスト" desktop/views/components/ui.header.vue: @@ -1314,6 +1316,7 @@ mobile/views/pages/home.vue: local: "ローカル" hybrid: "ソーシャル" global: "グローバル" + mentions: "あなた宛て" mobile/views/pages/tag.vue: no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。" diff --git a/src/client/app/desktop/views/components/timeline.core.vue b/src/client/app/desktop/views/components/timeline.core.vue index 25fd5d36ac..b6b5cca817 100644 --- a/src/client/app/desktop/views/components/timeline.core.vue +++ b/src/client/app/desktop/views/components/timeline.core.vue @@ -48,6 +48,7 @@ export default Vue.extend({ case 'local': return (this as any).os.streams.localTimelineStream; case 'hybrid': return (this as any).os.streams.hybridTimelineStream; case 'global': return (this as any).os.streams.globalTimelineStream; + case 'mentions': return (this as any).os.stream; } }, @@ -57,6 +58,7 @@ export default Vue.extend({ case 'local': return 'notes/local-timeline'; case 'hybrid': return 'notes/hybrid-timeline'; case 'global': return 'notes/global-timeline'; + case 'mentions': return 'notes/mentions'; } }, @@ -69,7 +71,7 @@ export default Vue.extend({ this.connection = this.stream.getConnection(); this.connectionId = this.stream.use(); - this.connection.on('note', this.onNote); + this.connection.on(this.src == 'mentions' ? 'mention' : 'note', this.onNote); if (this.src == 'home') { this.connection.on('follow', this.onChangeFollowing); this.connection.on('unfollow', this.onChangeFollowing); @@ -81,7 +83,7 @@ export default Vue.extend({ }, beforeDestroy() { - this.connection.off('note', this.onNote); + this.connection.off(this.src == 'mentions' ? 'mention' : 'note', this.onNote); if (this.src == 'home') { this.connection.off('follow', this.onChangeFollowing); this.connection.off('unfollow', this.onChangeFollowing); diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue index 8d72016f22..3e51d12883 100644 --- a/src/client/app/desktop/views/components/timeline.vue +++ b/src/client/app/desktop/views/components/timeline.vue @@ -5,6 +5,7 @@ <span :data-active="src == 'local'" @click="src = 'local'" v-if="enableLocalTimeline">%fa:R comments% %i18n:@local%</span> <span :data-active="src == 'hybrid'" @click="src = 'hybrid'" v-if="enableLocalTimeline">%fa:share-alt% %i18n:@hybrid%</span> <span :data-active="src == 'global'" @click="src = 'global'">%fa:globe% %i18n:@global%</span> + <span :data-active="src == 'mentions'" @click="src = 'mentions'">%fa:at% %i18n:@mentions%</span> <span :data-active="src == 'list'" @click="src = 'list'" v-if="list">%fa:list% {{ list.title }}</span> <button @click="chooseList" title="%i18n:@list%">%fa:list%</button> </header> @@ -12,6 +13,7 @@ <x-core v-if="src == 'local'" ref="tl" key="local" src="local"/> <x-core v-if="src == 'hybrid'" ref="tl" key="hybrid" src="hybrid"/> <x-core v-if="src == 'global'" ref="tl" key="global" src="global"/> + <x-core v-if="src == 'mentions'" ref="tl" key="mentions" src="mentions"/> <mk-user-list-timeline v-if="src == 'list'" ref="tl" :key="list.id" :list="list"/> </div> </template> diff --git a/src/client/app/mobile/views/pages/home.timeline.vue b/src/client/app/mobile/views/pages/home.timeline.vue index 416b006cd8..d4fcea1f93 100644 --- a/src/client/app/mobile/views/pages/home.timeline.vue +++ b/src/client/app/mobile/views/pages/home.timeline.vue @@ -47,6 +47,7 @@ export default Vue.extend({ case 'local': return (this as any).os.streams.localTimelineStream; case 'hybrid': return (this as any).os.streams.hybridTimelineStream; case 'global': return (this as any).os.streams.globalTimelineStream; + case 'mentions': return (this as any).os.stream; } }, @@ -56,6 +57,7 @@ export default Vue.extend({ case 'local': return 'notes/local-timeline'; case 'hybrid': return 'notes/hybrid-timeline'; case 'global': return 'notes/global-timeline'; + case 'mentions': return 'notes/mentions'; } }, @@ -68,7 +70,7 @@ export default Vue.extend({ this.connection = this.stream.getConnection(); this.connectionId = this.stream.use(); - this.connection.on('note', this.onNote); + this.connection.on(this.src == 'mentions' ? 'mention' : 'note', this.onNote); if (this.src == 'home') { this.connection.on('follow', this.onChangeFollowing); this.connection.on('unfollow', this.onChangeFollowing); @@ -78,7 +80,7 @@ export default Vue.extend({ }, beforeDestroy() { - this.connection.off('note', this.onNote); + this.connection.off(this.src == 'mentions' ? 'mention' : 'note', this.onNote); if (this.src == 'home') { this.connection.off('follow', this.onChangeFollowing); this.connection.off('unfollow', this.onChangeFollowing); diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue index 333ca1a7a1..3150bb02b4 100644 --- a/src/client/app/mobile/views/pages/home.vue +++ b/src/client/app/mobile/views/pages/home.vue @@ -6,6 +6,7 @@ <span v-if="src == 'local'">%fa:R comments%%i18n:@local%</span> <span v-if="src == 'hybrid'">%fa:share-alt%%i18n:@hybrid%</span> <span v-if="src == 'global'">%fa:globe%%i18n:@global%</span> + <span v-if="src == 'mentions'">%fa:at%%i18n:@mentions%</span> <span v-if="src == 'list'">%fa:list%{{ list.title }}</span> </span> <span style="margin-left:8px"> @@ -27,6 +28,7 @@ <span :data-active="src == 'local'" @click="src = 'local'" v-if="enableLocalTimeline">%fa:R comments% %i18n:@local%</span> <span :data-active="src == 'hybrid'" @click="src = 'hybrid'" v-if="enableLocalTimeline">%fa:share-alt% %i18n:@hybrid%</span> <span :data-active="src == 'global'" @click="src = 'global'">%fa:globe% %i18n:@global%</span> + <span :data-active="src == 'mentions'" @click="src = 'mentions'">%fa:at% %i18n:@mentions%</span> <template v-if="lists"> <span v-for="l in lists" :data-active="src == 'list' && list == l" @click="src = 'list'; list = l" :key="l.id">%fa:list% {{ l.title }}</span> </template> @@ -39,6 +41,7 @@ <x-tl v-if="src == 'local'" ref="tl" key="local" src="local"/> <x-tl v-if="src == 'hybrid'" ref="tl" key="hybrid" src="hybrid"/> <x-tl v-if="src == 'global'" ref="tl" key="global" src="global"/> + <x-tl v-if="src == 'mentions'" ref="tl" key="mentions" src="mentions"/> <mk-user-list-timeline v-if="src == 'list'" ref="tl" :key="list.id" :list="list"/> </div> </main> diff --git a/src/models/note.ts b/src/models/note.ts index 6530d0b324..62b1b3ecb1 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -17,6 +17,8 @@ import Following from './following'; const Note = db.get<INote>('notes'); Note.createIndex('uri', { sparse: true, unique: true }); Note.createIndex('userId'); +Note.createIndex('mentions'); +Note.createIndex('visibleUserIds'); Note.createIndex('tagsLower'); Note.createIndex('_files.contentType'); Note.createIndex({ diff --git a/src/server/api/endpoints/notes/mentions.ts b/src/server/api/endpoints/notes/mentions.ts index a7fb14d8a9..3b2e262e4f 100644 --- a/src/server/api/endpoints/notes/mentions.ts +++ b/src/server/api/endpoints/notes/mentions.ts @@ -3,6 +3,7 @@ import Note from '../../../../models/note'; import { getFriendIds } from '../../common/get-friends'; import { pack } from '../../../../models/note'; import { ILocalUser } from '../../../../models/user'; +import getParams from '../../get-params'; export const meta = { desc: { @@ -10,42 +11,48 @@ export const meta = { 'en-US': 'Get mentions of myself.' }, - requireCredential: true + requireCredential: true, + + params: { + following: $.bool.optional.note({ + default: false + }), + + limit: $.num.optional.range(1, 100).note({ + default: 10 + }), + + sinceId: $.type(ID).optional.note({ + }), + + untilId: $.type(ID).optional.note({ + }), + } }; export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => { - // Get 'following' parameter - const [following = false, followingError] = - $.bool.optional.get(params.following); - if (followingError) return rej('invalid following param'); - - // Get 'limit' parameter - const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit); - if (limitErr) return rej('invalid limit param'); - - // Get 'sinceId' parameter - const [sinceId, sinceIdErr] = $.type(ID).optional.get(params.sinceId); - if (sinceIdErr) return rej('invalid sinceId param'); - - // Get 'untilId' parameter - const [untilId, untilIdErr] = $.type(ID).optional.get(params.untilId); - if (untilIdErr) return rej('invalid untilId param'); + const [ps, psErr] = getParams(meta, params); + if (psErr) throw psErr; // Check if both of sinceId and untilId is specified - if (sinceId && untilId) { + if (ps.sinceId && ps.untilId) { return rej('cannot set sinceId and untilId'); } // Construct query const query = { - mentions: user._id + $or: [{ + mentions: user._id + }, { + visibleUserIds: user._id + }] } as any; const sort = { _id: -1 }; - if (following) { + if (ps.following) { const followingIds = await getFriendIds(user._id); query.userId = { @@ -53,26 +60,24 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = }; } - if (sinceId) { + if (ps.sinceId) { sort._id = 1; query._id = { - $gt: sinceId + $gt: ps.sinceId }; - } else if (untilId) { + } else if (ps.untilId) { query._id = { - $lt: untilId + $lt: ps.untilId }; } // Issue query const mentions = await Note .find(query, { - limit: limit, + limit: ps.limit, sort: sort }); // Serialize - res(await Promise.all(mentions.map(async mention => - await pack(mention, user) - ))); + res(await Promise.all(mentions.map(mention => pack(mention, user)))); }); diff --git a/src/services/note/create.ts b/src/services/note/create.ts index 771e9cade8..aa65cfe0cf 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -138,6 +138,10 @@ export default async (user: IUser, data: Option, silent = false) => new Promise< const mentionedUsers = await extractMentionedUsers(tokens); + if (data.reply && !user._id.equals(data.reply.userId) && !mentionedUsers.some(u => u._id.equals(data.reply.userId))) { + mentionedUsers.push(await User.findOne({ _id: data.reply.userId })); + } + const note = await insertNote(user, data, tags, mentionedUsers); res(note); From afeb8058b170e9e121d5d60fc4185f371934ef81 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 16 Sep 2018 23:15:02 +0900 Subject: [PATCH 265/539] Add mentions column (Deck) --- .../views/pages/deck/deck.column-core.vue | 5 +- .../views/pages/deck/deck.mentions-column.vue | 38 ++++++++ .../views/pages/deck/deck.mentions.vue | 93 +++++++++++++++++++ .../app/desktop/views/pages/deck/deck.vue | 9 ++ 4 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 src/client/app/desktop/views/pages/deck/deck.mentions-column.vue create mode 100644 src/client/app/desktop/views/pages/deck/deck.mentions.vue diff --git a/src/client/app/desktop/views/pages/deck/deck.column-core.vue b/src/client/app/desktop/views/pages/deck/deck.column-core.vue index 7f219c0be1..b7602bd235 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column-core.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column-core.vue @@ -6,6 +6,7 @@ <x-tl-column v-else-if="column.type == 'hybrid'" :column="column" :is-stacked="isStacked"/> <x-tl-column v-else-if="column.type == 'global'" :column="column" :is-stacked="isStacked"/> <x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked"/> +<x-mentions-column v-else-if="column.type == 'mentions'" :column="column" :is-stacked="isStacked"/> </template> <script lang="ts"> @@ -13,12 +14,14 @@ import Vue from 'vue'; import XTlColumn from './deck.tl-column.vue'; import XNotificationsColumn from './deck.notifications-column.vue'; import XWidgetsColumn from './deck.widgets-column.vue'; +import XMentionsColumn from './deck.mentions-column.vue'; export default Vue.extend({ components: { XTlColumn, XNotificationsColumn, - XWidgetsColumn + XWidgetsColumn, + XMentionsColumn }, props: { diff --git a/src/client/app/desktop/views/pages/deck/deck.mentions-column.vue b/src/client/app/desktop/views/pages/deck/deck.mentions-column.vue new file mode 100644 index 0000000000..8ec10164f2 --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.mentions-column.vue @@ -0,0 +1,38 @@ +<template> +<x-column :name="name" :column="column" :is-stacked="isStacked"> + <span slot="header">%fa:at%{{ name }}</span> + + <x-mentions/> +</x-column> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import XColumn from './deck.column.vue'; +import XMentions from './deck.mentions.vue'; + +export default Vue.extend({ + components: { + XColumn, + XMentions + }, + + props: { + column: { + type: Object, + required: true + }, + isStacked: { + type: Boolean, + required: true + } + }, + + computed: { + name(): string { + if (this.column.name) return this.column.name; + return '%i18n:common.deck.mentions%'; + } + }, +}); +</script> diff --git a/src/client/app/desktop/views/pages/deck/deck.mentions.vue b/src/client/app/desktop/views/pages/deck/deck.mentions.vue new file mode 100644 index 0000000000..cecb75f067 --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.mentions.vue @@ -0,0 +1,93 @@ +<template> + <x-notes ref="timeline" :more="existMore ? more : null"/> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import XNotes from './deck.notes.vue'; + +const fetchLimit = 10; + +export default Vue.extend({ + components: { + XNotes + }, + + props: { + }, + + data() { + return { + fetching: true, + moreFetching: false, + existMore: false, + connection: null, + connectionId: null + }; + }, + + mounted() { + this.connection = (this as any).os.stream.getConnection(); + this.connectionId = (this as any).os.stream.use(); + + this.connection.on('mention', this.onNote); + + this.fetch(); + }, + + beforeDestroy() { + this.connection.off('mention', this.onNote); + (this as any).os.stream.dispose(this.connectionId); + }, + + methods: { + fetch() { + this.fetching = true; + + (this.$refs.timeline as any).init(() => new Promise((res, rej) => { + (this as any).api('notes/mentions', { + limit: fetchLimit + 1, + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, + includeLocalRenotes: this.$store.state.settings.showLocalRenotes + }).then(notes => { + if (notes.length == fetchLimit + 1) { + notes.pop(); + this.existMore = true; + } + res(notes); + this.fetching = false; + this.$emit('loaded'); + }, rej); + })); + }, + more() { + this.moreFetching = true; + + const promise = (this as any).api('notes/mentions', { + limit: fetchLimit + 1, + untilId: (this.$refs.timeline as any).tail().id, + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, + includeLocalRenotes: this.$store.state.settings.showLocalRenotes + }); + + promise.then(notes => { + if (notes.length == fetchLimit + 1) { + notes.pop(); + } else { + this.existMore = false; + } + notes.forEach(n => (this.$refs.timeline as any).append(n)); + this.moreFetching = false; + }); + + return promise; + }, + onNote(note) { + // Prepend a note + (this.$refs.timeline as any).prepend(note); + } + } +}); +</script> diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index 5e7a07ea6b..4a4535959e 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -138,6 +138,15 @@ export default Vue.extend({ type: 'global' }); } + }, { + icon: '%fa:at%', + text: '%i18n:common.deck.mentions%', + action: () => { + this.$store.dispatch('settings/addDeckColumn', { + id: uuid(), + type: 'mentions' + }); + } }, { icon: '%fa:list%', text: '%i18n:common.deck.list%', From dc2055f5bce505ef3040527b5f5fcde541cd1496 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 16 Sep 2018 23:15:15 +0900 Subject: [PATCH 266/539] Fix bug --- src/models/note.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/models/note.ts b/src/models/note.ts index 62b1b3ecb1..bb600fc0cb 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -26,6 +26,21 @@ Note.createIndex({ }); export default Note; +// 後方互換性のため +Note.findOne({ + fileIds: { $exists: true } +}).then(n => { + if (n == null) { + Note.update({}, { + $rename: { + mediaIds: 'fileIds' + } + }, { + multi: true + }); + } +}); + export function isValidText(text: string): boolean { return length(text.trim()) <= 1000 && text.trim() != ''; } From ae6ce198860a4ca61061f130ccbe7a7bfe55cf29 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 16 Sep 2018 23:19:06 +0900 Subject: [PATCH 267/539] 8.43.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 483cef9996..a4d64a2d1f 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.42.0", - "clientVersion": "1.0.9769", + "version": "8.43.0", + "clientVersion": "1.0.9808", "codename": "nighthike", "main": "./built/index.js", "private": true, From 6138a74231674370f28296516fda0882ddcefb33 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 17 Sep 2018 00:20:00 +0900 Subject: [PATCH 268/539] Fix #2101 --- src/remote/activitypub/renderer/note.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts index 04e131637a..33400ad440 100644 --- a/src/remote/activitypub/renderer/note.ts +++ b/src/remote/activitypub/renderer/note.ts @@ -87,7 +87,7 @@ export default async function renderNote(note: INote, dive = true): Promise<any> attributedTo, summary: note.cw, content: toHtml(note), - _misskey_content_: note.text, + _misskey_content: note.text, published: note.createdAt.toISOString(), to, cc, From 374b276f5ca46555235b76413a14b7f09528b5e0 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 17 Sep 2018 02:45:30 +0900 Subject: [PATCH 269/539] Fix #2720 --- src/mfm/html.ts | 8 ++++++-- test/mfm.ts | 9 +++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/mfm/html.ts b/src/mfm/html.ts index b7fa5b6f03..df9959dc4b 100644 --- a/src/mfm/html.ts +++ b/src/mfm/html.ts @@ -82,8 +82,12 @@ const handlers: { [key: string]: (window: any, token: any, mentionedRemoteUsers: text({ document }, { content }) { const nodes = (content as string).split('\n').map(x => document.createTextNode(x)); - for (const x of intersperse(document.createElement('br'), nodes)) { - document.body.appendChild(x); + for (const x of intersperse('br', nodes)) { + if (x === 'br') { + document.body.appendChild(document.createElement('br')); + } else { + document.body.appendChild(x); + } } }, diff --git a/test/mfm.ts b/test/mfm.ts index 706c4c549a..901ffb80e3 100644 --- a/test/mfm.ts +++ b/test/mfm.ts @@ -1,6 +1,7 @@ import * as assert from 'assert'; import analyze from '../src/mfm/parse'; +import toHtml from '../src/mfm/html'; import syntaxhighlighter from '../src/mfm/parse/core/syntax-highlighter'; describe('Text', () => { @@ -170,4 +171,12 @@ describe('Text', () => { assert.equal(html, '<span class="symbol">/</span>'); }); }); + + describe('toHtml', () => { + it('br', () => { + const input = 'foo\nbar\nbaz'; + const output = '<p>foo<br>bar<br>baz</p>'; + assert.equal(toHtml(analyze(input)), output); + }); + }); }); From 8751d917948df1dfda5a69c01175a19b05f624f2 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 17 Sep 2018 02:56:57 +0900 Subject: [PATCH 270/539] Better stats page --- src/client/app/desktop/views/components/charts.vue | 4 ++-- src/client/app/desktop/views/pages/stats/stats.vue | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/client/app/desktop/views/components/charts.vue b/src/client/app/desktop/views/components/charts.vue index 6514cdf788..e401095363 100644 --- a/src/client/app/desktop/views/components/charts.vue +++ b/src/client/app/desktop/views/components/charts.vue @@ -100,7 +100,7 @@ export default Vue.extend({ created() { (this as any).api('chart', { - limit: 32 + limit: 35 }).then(chart => { this.chart = chart; }); @@ -681,6 +681,6 @@ export default Vue.extend({ > div > * display block - height 320px + height 350px </style> diff --git a/src/client/app/desktop/views/pages/stats/stats.vue b/src/client/app/desktop/views/pages/stats/stats.vue index 41005b6398..7a4e4ab5ce 100644 --- a/src/client/app/desktop/views/pages/stats/stats.vue +++ b/src/client/app/desktop/views/pages/stats/stats.vue @@ -43,7 +43,7 @@ export default Vue.extend({ > .stats display flex justify-content center - margin-bottom 16px + margin 0 auto 16px auto padding 32px background #fff box-shadow 0 2px 8px rgba(#000, 0.1) @@ -60,5 +60,6 @@ export default Vue.extend({ font-size 70% > div - max-width 850px + max-width 950px + margin 0 auto </style> From 43b47c4494f3efee4a6c1cc0305dbe406747d3e5 Mon Sep 17 00:00:00 2001 From: xps2 <9610872+xps2@users.noreply.github.com> Date: Mon, 17 Sep 2018 03:02:58 +0900 Subject: [PATCH 271/539] =?UTF-8?q?fontawesome=E3=82=925.3.1=E3=81=AB?= =?UTF-8?q?=E3=82=A2=E3=83=83=E3=83=97=E3=83=87=E3=83=BC=E3=83=88=20(#2718?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 8 ++++---- src/docs/base.pug | 2 +- src/misc/fa.ts | 10 +++++----- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index a4d64a2d1f..ec2cb44ed0 100644 --- a/package.json +++ b/package.json @@ -20,10 +20,10 @@ "format": "gulp format" }, "dependencies": { - "@fortawesome/fontawesome": "1.1.8", - "@fortawesome/fontawesome-free-brands": "5.0.13", - "@fortawesome/fontawesome-free-regular": "5.0.13", - "@fortawesome/fontawesome-free-solid": "5.0.13", + "@fortawesome/fontawesome-svg-core": "1.2.4", + "@fortawesome/free-brands-svg-icons": "5.3.1", + "@fortawesome/free-regular-svg-icons": "5.3.1", + "@fortawesome/free-solid-svg-icons": "5.3.1", "@koa/cors": "2.2.2", "@prezzemolo/rap": "0.1.2", "@prezzemolo/zip": "0.0.3", diff --git a/src/docs/base.pug b/src/docs/base.pug index 26f19ddf09..41eb80a64e 100644 --- a/src/docs/base.pug +++ b/src/docs/base.pug @@ -9,7 +9,7 @@ html(lang= lang) link(rel="stylesheet" href="/docs/assets/style.css") link(rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css") script(src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js") - link(rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous") + link(rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css" integrity="sha384-mzrmE5qonljUremFsqc01SB46JvROS7bZs3IO2EmfFsd15uHvIt+Y8vEf7N7fWAU" crossorigin="anonymous") block meta body diff --git a/src/misc/fa.ts b/src/misc/fa.ts index 90cdac89b2..5405255ac7 100644 --- a/src/misc/fa.ts +++ b/src/misc/fa.ts @@ -2,12 +2,12 @@ * Replace fontawesome symbols */ -import * as fontawesome from '@fortawesome/fontawesome'; -import regular from '@fortawesome/fontawesome-free-regular'; -import solid from '@fortawesome/fontawesome-free-solid'; -import brands from '@fortawesome/fontawesome-free-brands'; +import * as fontawesome from '@fortawesome/fontawesome-svg-core'; +import { far } from '@fortawesome/free-regular-svg-icons'; +import { fas } from '@fortawesome/free-solid-svg-icons'; +import { fab } from '@fortawesome/free-brands-svg-icons'; -fontawesome.library.add(regular, solid, brands); +fontawesome.library.add(far, fas, fab); export const pattern = /%fa:(.+?)%/g; From 020cc471da00350b92e76c1d0033baf32ccfa909 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 17 Sep 2018 03:03:58 +0900 Subject: [PATCH 272/539] 8.44.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ec2cb44ed0..85860580aa 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.43.0", - "clientVersion": "1.0.9808", + "version": "8.44.0", + "clientVersion": "1.0.9813", "codename": "nighthike", "main": "./built/index.js", "private": true, From b21b33831ad2584c832537b1819f6151bf5c37e5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 17 Sep 2018 03:36:58 +0900 Subject: [PATCH 273/539] Fix bug --- src/remote/activitypub/renderer/note.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts index 33400ad440..5d28e5f450 100644 --- a/src/remote/activitypub/renderer/note.ts +++ b/src/remote/activitypub/renderer/note.ts @@ -6,6 +6,7 @@ import DriveFile, { IDriveFile } from '../../../models/drive-file'; import Note, { INote } from '../../../models/note'; import User from '../../../models/user'; import toHtml from '../misc/get-note-html'; +import parseMfm from '../../../mfm/parse'; export default async function renderNote(note: INote, dive = true): Promise<any> { const promisedFiles: Promise<IDriveFile[]> = note.fileIds @@ -81,13 +82,21 @@ export default async function renderNote(note: INote, dive = true): Promise<any> const files = await promisedFiles; + const text = note.text ? parseMfm(note.text).map(x => { + if (x.type == 'mention' && x.host == null) { + return `${x.content}@${config.host}`; + } else { + return x.content; + } + }).join('') : null; + return { id: `${config.url}/notes/${note._id}`, type: 'Note', attributedTo, summary: note.cw, content: toHtml(note), - _misskey_content: note.text, + _misskey_content: text, published: note.createdAt.toISOString(), to, cc, From 433dbe179d8080f8bc9457866f3411f22bd8168e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 17 Sep 2018 03:37:22 +0900 Subject: [PATCH 274/539] 8.44.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 85860580aa..453a3d6a8b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.44.0", + "version": "8.44.1", "clientVersion": "1.0.9813", "codename": "nighthike", "main": "./built/index.js", From 109738ccb9ef8c203685e6f4bc31986ac2a17046 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 17 Sep 2018 09:00:20 +0900 Subject: [PATCH 275/539] =?UTF-8?q?=E3=83=8F=E3=83=83=E3=82=B7=E3=83=A5?= =?UTF-8?q?=E3=82=BF=E3=82=B0=E3=82=BF=E3=82=A4=E3=83=A0=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=82=92=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 5 + .../app/common/scripts/streaming/hashtag.ts | 13 ++ .../views/components/settings-window.vue | 8 +- .../views/components/settings.tags.vue | 65 ++++++++++ .../app/desktop/views/components/settings.vue | 18 ++- .../views/components/timeline.core.vue | 76 ++++++++--- .../app/desktop/views/components/timeline.vue | 119 +++++++++++++++--- .../views/pages/deck/deck.column-core.vue | 1 + .../views/pages/deck/deck.hashtag-tl.vue | 117 +++++++++++++++++ .../views/pages/deck/deck.tl-column.vue | 7 +- .../app/desktop/views/pages/deck/deck.vue | 14 +++ .../app/mobile/views/pages/home.timeline.vue | 76 ++++++++--- src/client/app/mobile/views/pages/home.vue | 17 ++- src/client/app/store.ts | 1 + .../api/endpoints/notes/search_by_tag.ts | 45 +++---- src/server/api/stream/hashtag.ts | 48 +++++++ src/server/api/streaming.ts | 6 + src/services/note/create.ts | 6 +- src/stream.ts | 5 + 19 files changed, 555 insertions(+), 92 deletions(-) create mode 100644 src/client/app/common/scripts/streaming/hashtag.ts create mode 100644 src/client/app/desktop/views/components/settings.tags.vue create mode 100644 src/client/app/desktop/views/pages/deck/deck.hashtag-tl.vue create mode 100644 src/server/api/stream/hashtag.ts diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 2a8cfebb57..a3b2bd88e7 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -166,6 +166,7 @@ common: home: "ホーム" local: "ローカル" hybrid: "ソーシャル" + hashtag: "ハッシュタグ" global: "グローバル" mentions: "あなた宛て" notifications: "通知" @@ -916,6 +917,10 @@ desktop/views/components/timeline.vue: global: "グローバル" mentions: "あなた宛て" list: "リスト" + hashtag: "ハッシュタグ" + add-tag-timeline: "ハッシュタグを追加" + add-list: "リストを追加" + list-name: "リスト名" desktop/views/components/ui.header.vue: welcome-back: "おかえりなさい、" diff --git a/src/client/app/common/scripts/streaming/hashtag.ts b/src/client/app/common/scripts/streaming/hashtag.ts new file mode 100644 index 0000000000..276b8f8d3d --- /dev/null +++ b/src/client/app/common/scripts/streaming/hashtag.ts @@ -0,0 +1,13 @@ +import Stream from './stream'; +import MiOS from '../../../mios'; + +export class HashtagStream extends Stream { + constructor(os: MiOS, me, q) { + super(os, 'hashtag', me ? { + i: me.token, + q: JSON.stringify(q) + } : { + q: JSON.stringify(q) + }); + } +} diff --git a/src/client/app/desktop/views/components/settings-window.vue b/src/client/app/desktop/views/components/settings-window.vue index deb865b102..b4cc570282 100644 --- a/src/client/app/desktop/views/components/settings-window.vue +++ b/src/client/app/desktop/views/components/settings-window.vue @@ -1,13 +1,19 @@ <template> <mk-window ref="window" is-modal width="700px" height="550px" @closed="$destroy"> <span slot="header" :class="$style.header">%fa:cog%%i18n:@settings%</span> - <mk-settings @done="close"/> + <mk-settings :initial-page="initialPage" @done="close"/> </mk-window> </template> <script lang="ts"> import Vue from 'vue'; export default Vue.extend({ + props: { + initialPage: { + type: String, + required: false + } + }, methods: { close() { (this as any).$refs.window.close(); diff --git a/src/client/app/desktop/views/components/settings.tags.vue b/src/client/app/desktop/views/components/settings.tags.vue new file mode 100644 index 0000000000..a7234f7d87 --- /dev/null +++ b/src/client/app/desktop/views/components/settings.tags.vue @@ -0,0 +1,65 @@ +<template> +<div class="vfcitkilproprqtbnpoertpsziierwzi"> + <div v-for="timeline in timelines" class="timeline"> + <ui-input v-model="timeline.title" @change="save"> + <span>%i18n:@title%</span> + </ui-input> + <ui-textarea :value="timeline.query ? timeline.query.map(tags => tags.join(' ')).join('\n') : ''" @input="onQueryChange(timeline, $event)"> + <span>%i18n:@query%</span> + </ui-textarea> + <ui-button class="save" @click="save">%i18n:@save%</ui-button> + </div> + <ui-button class="add" @click="add">%i18n:@add%</ui-button> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import * as uuid from 'uuid'; + +export default Vue.extend({ + data() { + return { + timelines: this.$store.state.settings.tagTimelines + }; + }, + + methods: { + add() { + this.timelines.push({ + id: uuid(), + title: '', + query: '' + }); + + this.save(); + }, + + save() { + this.$store.dispatch('settings/set', { key: 'tagTimelines', value: this.timelines }); + }, + + onQueryChange(timeline, value) { + timeline.query = value.split('\n').map(tags => tags.split(' ')); + } + } +}); +</script> + +<style lang="stylus" scoped> + +root(isDark) + > .timeline + padding-bottom 16px + border-bottom solid 1px rgba(#000, 0.1) + + > .add + margin-top 16px + +.vfcitkilproprqtbnpoertpsziierwzi[data-darkmode] + root(true) + +.vfcitkilproprqtbnpoertpsziierwzi:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index 3911ec5931..312a7ed56e 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -5,6 +5,7 @@ <p :class="{ active: page == 'web' }" @mousedown="page = 'web'">%fa:desktop .fw%Web</p> <p :class="{ active: page == 'notification' }" @mousedown="page = 'notification'">%fa:R bell .fw%%i18n:@notification%</p> <p :class="{ active: page == 'drive' }" @mousedown="page = 'drive'">%fa:cloud .fw%%i18n:@drive%</p> + <p :class="{ active: page == 'hashtags' }" @mousedown="page = 'hashtags'">%fa:hashtag .fw%%i18n:@tags%</p> <p :class="{ active: page == 'mute' }" @mousedown="page = 'mute'">%fa:ban .fw%%i18n:@mute%</p> <p :class="{ active: page == 'apps' }" @mousedown="page = 'apps'">%fa:puzzle-piece .fw%%i18n:@apps%</p> <p :class="{ active: page == 'twitter' }" @mousedown="page = 'twitter'">%fa:B twitter .fw%Twitter</p> @@ -138,6 +139,11 @@ <x-drive/> </section> + <section class="hashtags" v-show="page == 'hashtags'"> + <h1>%i18n:@tags%</h1> + <x-tags/> + </section> + <section class="mute" v-show="page == 'mute'"> <h1>%i18n:@mute%</h1> <x-mute/> @@ -222,6 +228,7 @@ import XApi from './settings.api.vue'; import XApps from './settings.apps.vue'; import XSignins from './settings.signins.vue'; import XDrive from './settings.drive.vue'; +import XTags from './settings.tags.vue'; import { url, langs, version } from '../../../config'; import checkForUpdate from '../../../common/scripts/check-for-update'; @@ -234,11 +241,18 @@ export default Vue.extend({ XApi, XApps, XSignins, - XDrive + XDrive, + XTags + }, + props: { + initialPage: { + type: String, + required: false + } }, data() { return { - page: 'profile', + page: this.initialPage || 'profile', meta: null, version, langs, diff --git a/src/client/app/desktop/views/components/timeline.core.vue b/src/client/app/desktop/views/components/timeline.core.vue index b6b5cca817..d2176dee87 100644 --- a/src/client/app/desktop/views/components/timeline.core.vue +++ b/src/client/app/desktop/views/components/timeline.core.vue @@ -15,6 +15,7 @@ <script lang="ts"> import Vue from 'vue'; +import { HashtagStream } from '../../../common/scripts/streaming/hashtag'; const fetchLimit = 10; @@ -23,6 +24,9 @@ export default Vue.extend({ src: { type: String, required: true + }, + tagTl: { + required: false } }, @@ -31,6 +35,7 @@ export default Vue.extend({ fetching: true, moreFetching: false, existMore: false, + streamManager: null, connection: null, connectionId: null, date: null @@ -42,16 +47,6 @@ export default Vue.extend({ return this.$store.state.i.followingCount == 0; }, - stream(): any { - switch (this.src) { - case 'home': return (this as any).os.stream; - case 'local': return (this as any).os.streams.localTimelineStream; - case 'hybrid': return (this as any).os.streams.hybridTimelineStream; - case 'global': return (this as any).os.streams.globalTimelineStream; - case 'mentions': return (this as any).os.stream; - } - }, - endpoint(): string { switch (this.src) { case 'home': return 'notes/timeline'; @@ -59,6 +54,7 @@ export default Vue.extend({ case 'hybrid': return 'notes/hybrid-timeline'; case 'global': return 'notes/global-timeline'; case 'mentions': return 'notes/mentions'; + case 'tag': return 'notes/search_by_tag'; } }, @@ -68,13 +64,36 @@ export default Vue.extend({ }, mounted() { - this.connection = this.stream.getConnection(); - this.connectionId = this.stream.use(); - - this.connection.on(this.src == 'mentions' ? 'mention' : 'note', this.onNote); - if (this.src == 'home') { + if (this.src == 'tag') { + this.connection = new HashtagStream((this as any).os, this.$store.state.i, this.tagTl.query); + this.connection.on('note', this.onNote); + } else if (this.src == 'home') { + this.streamManager = (this as any).os.stream; + this.connection = this.streamManager.getConnection(); + this.connectionId = this.streamManager.use(); + this.connection.on('note', this.onNote); this.connection.on('follow', this.onChangeFollowing); this.connection.on('unfollow', this.onChangeFollowing); + } else if (this.src == 'local') { + this.streamManager = (this as any).os.streams.localTimelineStream; + this.connection = this.streamManager.getConnection(); + this.connectionId = this.streamManager.use(); + this.connection.on('note', this.onNote); + } else if (this.src == 'hybrid') { + this.streamManager = (this as any).os.streams.hybridTimelineStream; + this.connection = this.streamManager.getConnection(); + this.connectionId = this.streamManager.use(); + this.connection.on('note', this.onNote); + } else if (this.src == 'global') { + this.streamManager = (this as any).os.streams.globalTimelineStream; + this.connection = this.streamManager.getConnection(); + this.connectionId = this.streamManager.use(); + this.connection.on('note', this.onNote); + } else if (this.src == 'mentions') { + this.streamManager = (this as any).os.stream; + this.connection = this.streamManager.getConnection(); + this.connectionId = this.streamManager.use(); + this.connection.on('mention', this.onNote); } document.addEventListener('keydown', this.onKeydown); @@ -83,12 +102,27 @@ export default Vue.extend({ }, beforeDestroy() { - this.connection.off(this.src == 'mentions' ? 'mention' : 'note', this.onNote); - if (this.src == 'home') { + if (this.src == 'tag') { + this.connection.off('note', this.onNote); + this.connection.close(); + } else if (this.src == 'home') { + this.connection.off('note', this.onNote); this.connection.off('follow', this.onChangeFollowing); this.connection.off('unfollow', this.onChangeFollowing); + this.streamManager.dispose(this.connectionId); + } else if (this.src == 'local') { + this.connection.off('note', this.onNote); + this.streamManager.dispose(this.connectionId); + } else if (this.src == 'hybrid') { + this.connection.off('note', this.onNote); + this.streamManager.dispose(this.connectionId); + } else if (this.src == 'global') { + this.connection.off('note', this.onNote); + this.streamManager.dispose(this.connectionId); + } else if (this.src == 'mentions') { + this.connection.off('mention', this.onNote); + this.streamManager.dispose(this.connectionId); } - this.stream.dispose(this.connectionId); document.removeEventListener('keydown', this.onKeydown); }, @@ -103,7 +137,8 @@ export default Vue.extend({ untilDate: this.date ? this.date.getTime() : undefined, includeMyRenotes: this.$store.state.settings.showMyRenotes, includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, - includeLocalRenotes: this.$store.state.settings.showLocalRenotes + includeLocalRenotes: this.$store.state.settings.showLocalRenotes, + query: this.tagTl ? this.tagTl.query : undefined }).then(notes => { if (notes.length == fetchLimit + 1) { notes.pop(); @@ -126,7 +161,8 @@ export default Vue.extend({ untilId: (this.$refs.timeline as any).tail().id, includeMyRenotes: this.$store.state.settings.showMyRenotes, includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, - includeLocalRenotes: this.$store.state.settings.showLocalRenotes + includeLocalRenotes: this.$store.state.settings.showLocalRenotes, + query: this.tagTl ? this.tagTl.query : undefined }); promise.then(notes => { diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue index 3e51d12883..48eedc88d6 100644 --- a/src/client/app/desktop/views/components/timeline.vue +++ b/src/client/app/desktop/views/components/timeline.vue @@ -6,14 +6,19 @@ <span :data-active="src == 'hybrid'" @click="src = 'hybrid'" v-if="enableLocalTimeline">%fa:share-alt% %i18n:@hybrid%</span> <span :data-active="src == 'global'" @click="src = 'global'">%fa:globe% %i18n:@global%</span> <span :data-active="src == 'mentions'" @click="src = 'mentions'">%fa:at% %i18n:@mentions%</span> + <span :data-active="src == 'tag'" @click="src = 'tag'" v-if="tagTl">%fa:hashtag% {{ tagTl.title }}</span> <span :data-active="src == 'list'" @click="src = 'list'" v-if="list">%fa:list% {{ list.title }}</span> - <button @click="chooseList" title="%i18n:@list%">%fa:list%</button> + <div class="buttons"> + <button @click="chooseTag" title="%i18n:@hashtag%" ref="tagButton">%fa:hashtag%</button> + <button @click="chooseList" title="%i18n:@list%" ref="listButton">%fa:list%</button> + </div> </header> <x-core v-if="src == 'home'" ref="tl" key="home" src="home"/> <x-core v-if="src == 'local'" ref="tl" key="local" src="local"/> <x-core v-if="src == 'hybrid'" ref="tl" key="hybrid" src="hybrid"/> <x-core v-if="src == 'global'" ref="tl" key="global" src="global"/> <x-core v-if="src == 'mentions'" ref="tl" key="mentions" src="mentions"/> + <x-core v-if="src == 'tag'" ref="tl" key="tag" src="tag" :tag-tl="tagTl"/> <mk-user-list-timeline v-if="src == 'list'" ref="tl" :key="list.id" :list="list"/> </div> </template> @@ -21,7 +26,8 @@ <script lang="ts"> import Vue from 'vue'; import XCore from './timeline.core.vue'; -import MkUserListsWindow from './user-lists-window.vue'; +import Menu from '../../../common/views/components/menu.vue'; +import MkSettingsWindow from './settings-window.vue'; export default Vue.extend({ components: { @@ -32,6 +38,7 @@ export default Vue.extend({ return { src: 'home', list: null, + tagTl: null, enableLocalTimeline: false }; }, @@ -41,8 +48,14 @@ export default Vue.extend({ this.saveSrc(); }, - list() { + list(x) { this.saveSrc(); + if (x != null) this.tagTl = null; + }, + + tagTl(x) { + this.saveSrc(); + if (x != null) this.list = null; } }, @@ -55,6 +68,8 @@ export default Vue.extend({ this.src = this.$store.state.device.tl.src; if (this.src == 'list') { this.list = this.$store.state.device.tl.arg; + } else if (this.src == 'tag') { + this.tagTl = this.$store.state.device.tl.arg; } } else if (this.$store.state.i.followingCount == 0) { this.src = 'hybrid'; @@ -71,7 +86,7 @@ export default Vue.extend({ saveSrc() { this.$store.commit('device/setTl', { src: this.src, - arg: this.list + arg: this.src == 'list' ? this.list : this.tagTl }); }, @@ -79,12 +94,74 @@ export default Vue.extend({ (this.$refs.tl as any).warp(date); }, - chooseList() { - const w = (this as any).os.new(MkUserListsWindow); - w.$once('choosen', list => { - this.list = list; - this.src = 'list'; - w.close(); + async chooseList() { + const lists = await (this as any).api('users/lists/list'); + + let menu = [{ + icon: '%fa:plus%', + text: '%i18n:@add-list%', + action: () => { + (this as any).apis.input({ + title: '%i18n:@list-name%', + }).then(async title => { + const list = await (this as any).api('users/lists/create', { + title + }); + + this.list = list; + this.src = 'list'; + }); + } + }]; + + if (lists.length > 0) { + menu.push(null); + } + + menu = menu.concat(lists.map(list => ({ + icon: '%fa:list%', + text: list.title, + action: () => { + this.list = list; + this.src = 'list'; + } + }))); + + this.os.new(Menu, { + source: this.$refs.listButton, + compact: false, + items: menu + }); + }, + + chooseTag() { + let menu = [{ + icon: '%fa:plus%', + text: '%i18n:@add-tag-timeline%', + action: () => { + (this as any).os.new(MkSettingsWindow, { + initialPage: 'hashtags' + }); + } + }]; + + if (this.$store.state.settings.tagTimelines.length > 0) { + menu.push(null); + } + + menu = menu.concat(this.$store.state.settings.tagTimelines.map(t => ({ + icon: '%fa:hashtag%', + text: t.title, + action: () => { + this.tagTl = t; + this.src = 'tag'; + } + }))); + + this.os.new(Menu, { + source: this.$refs.tagButton, + compact: false, + items: menu }); } } @@ -106,22 +183,24 @@ root(isDark) border-radius 6px 6px 0 0 box-shadow 0 1px isDark ? rgba(#000, 0.15) : rgba(#000, 0.08) - > button + > .buttons position absolute z-index 2 top 0 right 0 - padding 0 - width 42px - font-size 0.9em - line-height 42px - color isDark ? #9baec8 : #ccc - &:hover - color isDark ? #b2c1d5 : #aaa + > button + padding 0 + width 42px + font-size 0.9em + line-height 42px + color isDark ? #9baec8 : #ccc - &:active - color isDark ? #b2c1d5 : #999 + &:hover + color isDark ? #b2c1d5 : #aaa + + &:active + color isDark ? #b2c1d5 : #999 > span display inline-block diff --git a/src/client/app/desktop/views/pages/deck/deck.column-core.vue b/src/client/app/desktop/views/pages/deck/deck.column-core.vue index b7602bd235..a320f697b3 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column-core.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column-core.vue @@ -6,6 +6,7 @@ <x-tl-column v-else-if="column.type == 'hybrid'" :column="column" :is-stacked="isStacked"/> <x-tl-column v-else-if="column.type == 'global'" :column="column" :is-stacked="isStacked"/> <x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked"/> +<x-tl-column v-else-if="column.type == 'hashtag'" :column="column" :is-stacked="isStacked"/> <x-mentions-column v-else-if="column.type == 'mentions'" :column="column" :is-stacked="isStacked"/> </template> diff --git a/src/client/app/desktop/views/pages/deck/deck.hashtag-tl.vue b/src/client/app/desktop/views/pages/deck/deck.hashtag-tl.vue new file mode 100644 index 0000000000..f38d5a6df5 --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.hashtag-tl.vue @@ -0,0 +1,117 @@ +<template> + <x-notes ref="timeline" :more="existMore ? more : null" :media-view="mediaView"/> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import XNotes from './deck.notes.vue'; +import { HashtagStream } from '../../../../common/scripts/streaming/hashtag'; + +const fetchLimit = 10; + +export default Vue.extend({ + components: { + XNotes + }, + + props: { + tagTl: { + type: Object, + required: true + }, + mediaOnly: { + type: Boolean, + required: false, + default: false + }, + mediaView: { + type: Boolean, + required: false, + default: false + } + }, + + data() { + return { + fetching: true, + moreFetching: false, + existMore: false, + connection: null + }; + }, + + watch: { + mediaOnly() { + this.fetch(); + } + }, + + mounted() { + if (this.connection) this.connection.close(); + this.connection = new HashtagStream((this as any).os, this.$store.state.i, this.tagTl.query); + this.connection.on('note', this.onNote); + + this.fetch(); + }, + + beforeDestroy() { + this.connection.close(); + }, + + methods: { + fetch() { + this.fetching = true; + + (this.$refs.timeline as any).init(() => new Promise((res, rej) => { + (this as any).api('notes/search_by_tag', { + limit: fetchLimit + 1, + withFiles: this.mediaOnly, + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, + includeLocalRenotes: this.$store.state.settings.showLocalRenotes, + query: this.tagTl.query + }).then(notes => { + if (notes.length == fetchLimit + 1) { + notes.pop(); + this.existMore = true; + } + res(notes); + this.fetching = false; + this.$emit('loaded'); + }, rej); + })); + }, + more() { + this.moreFetching = true; + + const promise = (this as any).api('notes/search_by_tag', { + limit: fetchLimit + 1, + untilId: (this.$refs.timeline as any).tail().id, + withFiles: this.mediaOnly, + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, + includeLocalRenotes: this.$store.state.settings.showLocalRenotes, + query: this.tagTl.query + }); + + promise.then(notes => { + if (notes.length == fetchLimit + 1) { + notes.pop(); + } else { + this.existMore = false; + } + notes.forEach(n => (this.$refs.timeline as any).append(n)); + this.moreFetching = false; + }); + + return promise; + }, + onNote(note) { + if (this.mediaOnly && note.files.length == 0) return; + + // Prepend a note + (this.$refs.timeline as any).prepend(note); + } + } +}); +</script> diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue index 231b505f5d..550b1be628 100644 --- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue @@ -6,6 +6,7 @@ <template v-if="column.type == 'hybrid'">%fa:share-alt%</template> <template v-if="column.type == 'global'">%fa:globe%</template> <template v-if="column.type == 'list'">%fa:list%</template> + <template v-if="column.type == 'hashtag'">%fa:hashtag%</template> <span>{{ name }}</span> </span> @@ -14,6 +15,7 @@ <mk-switch v-model="column.isMediaView" @change="onChangeSettings" text="%i18n:@is-media-view%"/> </div> <x-list-tl v-if="column.type == 'list'" :list="column.list" :media-only="column.isMediaOnly" :media-view="column.isMediaView"/> + <x-hashtag-tl v-if="column.type == 'hashtag'" :tag-tl="$store.state.settings.tagTimelines.find(x => x.id == column.tagTlId)" :media-only="column.isMediaOnly" :media-view="column.isMediaView"/> <x-tl v-else :src="column.type" :media-only="column.isMediaOnly" :media-view="column.isMediaView"/> </x-column> </template> @@ -23,12 +25,14 @@ import Vue from 'vue'; import XColumn from './deck.column.vue'; import XTl from './deck.tl.vue'; import XListTl from './deck.list-tl.vue'; +import XHashtagTl from './deck.hashtag-tl.vue'; export default Vue.extend({ components: { XColumn, XTl, - XListTl + XListTl, + XHashtagTl }, props: { @@ -65,6 +69,7 @@ export default Vue.extend({ case 'hybrid': return '%i18n:common.deck.hybrid%'; case 'global': return '%i18n:common.deck.global%'; case 'list': return this.column.list.title; + case 'hashtag': return this.$store.state.settings.tagTimelines.find(x => x.id == this.column.tagTlId).title; } } }, diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index 4a4535959e..aafe9a45d3 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -161,6 +161,20 @@ export default Vue.extend({ w.close(); }); } + }, { + icon: '%fa:hashtag%', + text: '%i18n:common.deck.hashtag%', + action: () => { + (this as any).apis.input({ + title: '%i18n:@enter-hashtag-tl-title%' + }).then(title => { + this.$store.dispatch('settings/addDeckColumn', { + id: uuid(), + type: 'hashtag', + tagTlId: this.$store.state.settings.tagTimelines.find(x => x.title == title).id + }); + }); + } }, { icon: '%fa:bell R%', text: '%i18n:common.deck.notifications%', diff --git a/src/client/app/mobile/views/pages/home.timeline.vue b/src/client/app/mobile/views/pages/home.timeline.vue index d4fcea1f93..fecb2384ba 100644 --- a/src/client/app/mobile/views/pages/home.timeline.vue +++ b/src/client/app/mobile/views/pages/home.timeline.vue @@ -13,6 +13,7 @@ <script lang="ts"> import Vue from 'vue'; +import { HashtagStream } from '../../../common/scripts/streaming/hashtag'; const fetchLimit = 10; @@ -21,6 +22,9 @@ export default Vue.extend({ src: { type: String, required: true + }, + tagTl: { + required: false } }, @@ -29,6 +33,7 @@ export default Vue.extend({ fetching: true, moreFetching: false, existMore: false, + streamManager: null, connection: null, connectionId: null, unreadCount: 0, @@ -41,16 +46,6 @@ export default Vue.extend({ return this.$store.state.i.followingCount == 0; }, - stream(): any { - switch (this.src) { - case 'home': return (this as any).os.stream; - case 'local': return (this as any).os.streams.localTimelineStream; - case 'hybrid': return (this as any).os.streams.hybridTimelineStream; - case 'global': return (this as any).os.streams.globalTimelineStream; - case 'mentions': return (this as any).os.stream; - } - }, - endpoint(): string { switch (this.src) { case 'home': return 'notes/timeline'; @@ -58,6 +53,7 @@ export default Vue.extend({ case 'hybrid': return 'notes/hybrid-timeline'; case 'global': return 'notes/global-timeline'; case 'mentions': return 'notes/mentions'; + case 'tag': return 'notes/search_by_tag'; } }, @@ -67,25 +63,63 @@ export default Vue.extend({ }, mounted() { - this.connection = this.stream.getConnection(); - this.connectionId = this.stream.use(); - - this.connection.on(this.src == 'mentions' ? 'mention' : 'note', this.onNote); - if (this.src == 'home') { + if (this.src == 'tag') { + this.connection = new HashtagStream((this as any).os, this.$store.state.i, this.tagTl.query); + this.connection.on('note', this.onNote); + } else if (this.src == 'home') { + this.streamManager = (this as any).os.stream; + this.connection = this.streamManager.getConnection(); + this.connectionId = this.streamManager.use(); + this.connection.on('note', this.onNote); this.connection.on('follow', this.onChangeFollowing); this.connection.on('unfollow', this.onChangeFollowing); + } else if (this.src == 'local') { + this.streamManager = (this as any).os.streams.localTimelineStream; + this.connection = this.streamManager.getConnection(); + this.connectionId = this.streamManager.use(); + this.connection.on('note', this.onNote); + } else if (this.src == 'hybrid') { + this.streamManager = (this as any).os.streams.hybridTimelineStream; + this.connection = this.streamManager.getConnection(); + this.connectionId = this.streamManager.use(); + this.connection.on('note', this.onNote); + } else if (this.src == 'global') { + this.streamManager = (this as any).os.streams.globalTimelineStream; + this.connection = this.streamManager.getConnection(); + this.connectionId = this.streamManager.use(); + this.connection.on('note', this.onNote); + } else if (this.src == 'mentions') { + this.streamManager = (this as any).os.stream; + this.connection = this.streamManager.getConnection(); + this.connectionId = this.streamManager.use(); + this.connection.on('mention', this.onNote); } this.fetch(); }, beforeDestroy() { - this.connection.off(this.src == 'mentions' ? 'mention' : 'note', this.onNote); - if (this.src == 'home') { + if (this.src == 'tag') { + this.connection.off('note', this.onNote); + this.connection.close(); + } else if (this.src == 'home') { + this.connection.off('note', this.onNote); this.connection.off('follow', this.onChangeFollowing); this.connection.off('unfollow', this.onChangeFollowing); + this.streamManager.dispose(this.connectionId); + } else if (this.src == 'local') { + this.connection.off('note', this.onNote); + this.streamManager.dispose(this.connectionId); + } else if (this.src == 'hybrid') { + this.connection.off('note', this.onNote); + this.streamManager.dispose(this.connectionId); + } else if (this.src == 'global') { + this.connection.off('note', this.onNote); + this.streamManager.dispose(this.connectionId); + } else if (this.src == 'mentions') { + this.connection.off('mention', this.onNote); + this.streamManager.dispose(this.connectionId); } - this.stream.dispose(this.connectionId); }, methods: { @@ -98,7 +132,8 @@ export default Vue.extend({ untilDate: this.date ? this.date.getTime() : undefined, includeMyRenotes: this.$store.state.settings.showMyRenotes, includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, - includeLocalRenotes: this.$store.state.settings.showLocalRenotes + includeLocalRenotes: this.$store.state.settings.showLocalRenotes, + query: this.tagTl ? this.tagTl.query : undefined }).then(notes => { if (notes.length == fetchLimit + 1) { notes.pop(); @@ -121,7 +156,8 @@ export default Vue.extend({ untilId: (this.$refs.timeline as any).tail().id, includeMyRenotes: this.$store.state.settings.showMyRenotes, includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, - includeLocalRenotes: this.$store.state.settings.showLocalRenotes + includeLocalRenotes: this.$store.state.settings.showLocalRenotes, + query: this.tagTl ? this.tagTl.query : undefined }); promise.then(notes => { diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue index 3150bb02b4..3ec2f16b75 100644 --- a/src/client/app/mobile/views/pages/home.vue +++ b/src/client/app/mobile/views/pages/home.vue @@ -8,6 +8,7 @@ <span v-if="src == 'global'">%fa:globe%%i18n:@global%</span> <span v-if="src == 'mentions'">%fa:at%%i18n:@mentions%</span> <span v-if="src == 'list'">%fa:list%{{ list.title }}</span> + <span v-if="src == 'tag'">%fa:hashtag%{{ tagTl.title }}</span> </span> <span style="margin-left:8px"> <template v-if="!showNav">%fa:angle-down%</template> @@ -32,6 +33,7 @@ <template v-if="lists"> <span v-for="l in lists" :data-active="src == 'list' && list == l" @click="src = 'list'; list = l" :key="l.id">%fa:list% {{ l.title }}</span> </template> + <span v-for="tl in $store.state.settings.tagTimelines" :data-active="src == 'tag' && tagTl == tl" @click="src = 'tag'; tagTl = tl" :key="tl.id">%fa:hashtag% {{ tl.title }}</span> </div> </div> </div> @@ -42,6 +44,7 @@ <x-tl v-if="src == 'hybrid'" ref="tl" key="hybrid" src="hybrid"/> <x-tl v-if="src == 'global'" ref="tl" key="global" src="global"/> <x-tl v-if="src == 'mentions'" ref="tl" key="mentions" src="mentions"/> + <x-tl v-if="src == 'tag'" ref="tl" key="tag" src="tag" :tag-tl="tagTl"/> <mk-user-list-timeline v-if="src == 'list'" ref="tl" :key="list.id" :list="list"/> </div> </main> @@ -63,6 +66,7 @@ export default Vue.extend({ src: 'home', list: null, lists: null, + tagTl: null, showNav: false, enableLocalTimeline: false }; @@ -74,9 +78,16 @@ export default Vue.extend({ this.saveSrc(); }, - list() { + list(x) { this.showNav = false; this.saveSrc(); + if (x != null) this.tagTl = null; + }, + + tagTl(x) { + this.showNav = false; + this.saveSrc(); + if (x != null) this.list = null; }, showNav(v) { @@ -97,6 +108,8 @@ export default Vue.extend({ this.src = this.$store.state.device.tl.src; if (this.src == 'list') { this.list = this.$store.state.device.tl.arg; + } else if (this.src == 'tag') { + this.tagTl = this.$store.state.device.tl.arg; } } else if (this.$store.state.i.followingCount == 0) { this.src = 'hybrid'; @@ -121,7 +134,7 @@ export default Vue.extend({ saveSrc() { this.$store.commit('device/setTl', { src: this.src, - arg: this.list + arg: this.src == 'list' ? this.list : this.tagTl }); }, diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 7eaef13125..171620ae30 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -10,6 +10,7 @@ const defaultSettings = { home: null, mobileHome: [], deck: null, + tagTimelines: [], fetchOnScroll: true, showMaps: true, showPostFormOnTopOfTl: false, diff --git a/src/server/api/endpoints/notes/search_by_tag.ts b/src/server/api/endpoints/notes/search_by_tag.ts index 11bfe34724..7beb97aec6 100644 --- a/src/server/api/endpoints/notes/search_by_tag.ts +++ b/src/server/api/endpoints/notes/search_by_tag.ts @@ -13,12 +13,18 @@ export const meta = { }, params: { - tag: $.str.note({ + tag: $.str.optional.note({ desc: { 'ja-JP': 'タグ' } }), + query: $.arr($.arr($.str)).optional.note({ + desc: { + 'ja-JP': 'クエリ' + } + }), + includeUserIds: $.arr($.type(ID)).optional.note({ default: [] }), @@ -59,11 +65,9 @@ export const meta = { } }), - withFiles: $.bool.optional.nullable.note({ - default: null, - + withFiles: $.bool.optional.note({ desc: { - 'ja-JP': 'ファイルが添付された投稿に限定するか否か' + 'ja-JP': 'true にすると、ファイルが添付された投稿だけ取得します' } }), @@ -126,8 +130,14 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => } const q: any = { - $and: [{ + $and: [ps.tag ? { tagsLower: ps.tag.toLowerCase() + } : { + $or: ps.query.map(tags => ({ + $and: tags.map(t => ({ + tagsLower: t.toLowerCase() + })) + })) }], deletedAt: { $exists: false } }; @@ -281,25 +291,10 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => const withFiles = ps.withFiles != null ? ps.withFiles : ps.media; - if (withFiles != null) { - if (withFiles) { - push({ - fileIds: { - $exists: true, - $ne: null - } - }); - } else { - push({ - $or: [{ - fileIds: { - $exists: false - } - }, { - fileIds: null - }] - }); - } + if (withFiles) { + push({ + fileIds: { $exists: true, $ne: [] } + }); } if (ps.poll != null) { diff --git a/src/server/api/stream/hashtag.ts b/src/server/api/stream/hashtag.ts new file mode 100644 index 0000000000..db2806e796 --- /dev/null +++ b/src/server/api/stream/hashtag.ts @@ -0,0 +1,48 @@ +import * as websocket from 'websocket'; +import Xev from 'xev'; + +import { IUser } from '../../../models/user'; +import Mute from '../../../models/mute'; +import { pack } from '../../../models/note'; + +export default async function( + request: websocket.request, + connection: websocket.connection, + subscriber: Xev, + user?: IUser +) { + const mute = user ? await Mute.find({ muterId: user._id }) : null; + const mutedUserIds = mute ? mute.map(m => m.muteeId.toString()) : []; + + const q: Array<string[]> = JSON.parse((request.resourceURL.query as any).q); + + // Subscribe stream + subscriber.on('hashtag', async note => { + const matched = q.some(tags => tags.every(tag => note.tags.map((t: string) => t.toLowerCase()).includes(tag.toLowerCase()))); + if (!matched) return; + + // Renoteなら再pack + if (note.renoteId != null) { + note.renote = await pack(note.renoteId, user, { + detail: true + }); + } + + //#region 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する + if (mutedUserIds.indexOf(note.userId) != -1) { + return; + } + if (note.reply != null && mutedUserIds.indexOf(note.reply.userId) != -1) { + return; + } + if (note.renote != null && mutedUserIds.indexOf(note.renote.userId) != -1) { + return; + } + //#endregion + + connection.send(JSON.stringify({ + type: 'note', + body: note + })); + }); +} diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts index e6094a40b2..873719d031 100644 --- a/src/server/api/streaming.ts +++ b/src/server/api/streaming.ts @@ -14,6 +14,7 @@ import reversiGameStream from './stream/games/reversi-game'; import reversiStream from './stream/games/reversi'; import serverStatsStream from './stream/server-stats'; import notesStatsStream from './stream/notes-stats'; +import hashtagStream from './stream/hashtag'; import { ParsedUrlQuery } from 'querystring'; import authenticate from './authenticate'; @@ -57,6 +58,11 @@ module.exports = (server: http.Server) => { return; } + if (request.resourceURL.pathname === '/hashtag') { + hashtagStream(request, connection, ev, user); + return; + } + if (user == null) { connection.send('authentication-failed'); connection.close(); diff --git a/src/services/note/create.ts b/src/services/note/create.ts index aa65cfe0cf..7daf83b294 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -1,7 +1,7 @@ import es from '../../db/elasticsearch'; import Note, { pack, INote } from '../../models/note'; import User, { isLocalUser, IUser, isRemoteUser, IRemoteUser, ILocalUser } from '../../models/user'; -import { publishUserStream, publishLocalTimelineStream, publishHybridTimelineStream, publishGlobalTimelineStream, publishUserListStream } from '../../stream'; +import { publishUserStream, publishLocalTimelineStream, publishHybridTimelineStream, publishGlobalTimelineStream, publishUserListStream, publishHashtagStream } from '../../stream'; import Following from '../../models/following'; import { deliver } from '../../queue'; import renderNote from '../../remote/activitypub/renderer/note'; @@ -181,6 +181,10 @@ export default async (user: IUser, data: Option, silent = false) => new Promise< noteObj.isFirstNote = true; } + if (tags.length > 0) { + publishHashtagStream(noteObj); + } + const nm = new NotificationManager(user, note); const nmRelatedPromises = []; diff --git a/src/stream.ts b/src/stream.ts index ebc75c875c..8a8d8b4cf0 100644 --- a/src/stream.ts +++ b/src/stream.ts @@ -78,6 +78,10 @@ class Publisher { public publishGlobalTimelineStream = (note: any): void => { this.publish('global-timeline', null, note); } + + public publishHashtagStream = (note: any): void => { + this.publish('hashtag', null, note); + } } const publisher = new Publisher(); @@ -95,3 +99,4 @@ export const publishReversiGameStream = publisher.publishReversiGameStream; export const publishLocalTimelineStream = publisher.publishLocalTimelineStream; export const publishHybridTimelineStream = publisher.publishHybridTimelineStream; export const publishGlobalTimelineStream = publisher.publishGlobalTimelineStream; +export const publishHashtagStream = publisher.publishHashtagStream; From d872a16fe082725055bb31c423d73aa52f1caf3c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 17 Sep 2018 09:05:51 +0900 Subject: [PATCH 276/539] :art: --- src/client/app/desktop/views/components/timeline.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue index 48eedc88d6..2dc84004df 100644 --- a/src/client/app/desktop/views/components/timeline.vue +++ b/src/client/app/desktop/views/components/timeline.vue @@ -188,10 +188,10 @@ root(isDark) z-index 2 top 0 right 0 + padding-right 8px > button - padding 0 - width 42px + padding 0 8px font-size 0.9em line-height 42px color isDark ? #9baec8 : #ccc From 7587c896d53de70582de6781a952df2228fc8a2c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 17 Sep 2018 09:06:56 +0900 Subject: [PATCH 277/539] 8.45.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 453a3d6a8b..aabe65c356 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.44.1", - "clientVersion": "1.0.9813", + "version": "8.45.0", + "clientVersion": "1.0.9834", "codename": "nighthike", "main": "./built/index.js", "private": true, From 7d599a68eaf8eb22d047b5952be17aec4540200c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 17 Sep 2018 09:07:46 +0900 Subject: [PATCH 278/539] pong --- src/server/api/streaming.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts index 873719d031..09ec23a743 100644 --- a/src/server/api/streaming.ts +++ b/src/server/api/streaming.ts @@ -45,6 +45,12 @@ module.exports = (server: http.Server) => { ev.removeAllListeners(); }); + connection.on('message', async (data) => { + if (data.utf8Data == 'ping') { + connection.send('pong'); + } + }); + const q = request.resourceURL.query as ParsedUrlQuery; const [user, app] = await authenticate(q.i as string); From 67ec10e86d6b73b62dc35e243c73be12c6bb50ad Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 17 Sep 2018 11:43:53 +0900 Subject: [PATCH 279/539] Add untilId param --- src/server/api/endpoints/notes/search_by_tag.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/server/api/endpoints/notes/search_by_tag.ts b/src/server/api/endpoints/notes/search_by_tag.ts index 7beb97aec6..0703210017 100644 --- a/src/server/api/endpoints/notes/search_by_tag.ts +++ b/src/server/api/endpoints/notes/search_by_tag.ts @@ -87,6 +87,12 @@ export const meta = { } }), + untilId: $.type(ID).optional.note({ + desc: { + 'ja-JP': '指定すると、この投稿を基点としてより古い投稿を取得します' + } + }), + sinceDate: $.num.optional.note({ }), @@ -318,6 +324,14 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => } } + if (ps.untilId) { + push({ + _id: { + $lt: ps.untilId + } + }); + } + if (ps.sinceDate) { push({ createdAt: { From f97cdfaa2099ab4c29b980693d3caa5c828d64a4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 17 Sep 2018 11:59:24 +0900 Subject: [PATCH 280/539] Fix #2725 --- src/remote/activitypub/misc/get-note-html.ts | 12 ------------ src/remote/activitypub/renderer/note.ts | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/remote/activitypub/misc/get-note-html.ts b/src/remote/activitypub/misc/get-note-html.ts index f92e91c34e..0a607bd48c 100644 --- a/src/remote/activitypub/misc/get-note-html.ts +++ b/src/remote/activitypub/misc/get-note-html.ts @@ -1,22 +1,10 @@ import { INote } from '../../../models/note'; import toHtml from '../../../mfm/html'; import parse from '../../../mfm/parse'; -import config from '../../../config'; export default function(note: INote) { let html = toHtml(parse(note.text), note.mentionedRemoteUsers); if (html == null) html = ''; - if (note.poll != null) { - const url = `${config.url}/notes/${note._id}`; - // TODO: i18n - html += `<p><a href="${url}">【Misskeyで投票を見る】</a></p>`; - } - - if (note.renoteId != null) { - const url = `${config.url}/notes/${note.renoteId}`; - html += `<p>RE: <a href="${url}">${url}</a></p>`; - } - return html; } diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts index 5d28e5f450..3ed6a6e16a 100644 --- a/src/remote/activitypub/renderer/note.ts +++ b/src/remote/activitypub/renderer/note.ts @@ -82,6 +82,20 @@ export default async function renderNote(note: INote, dive = true): Promise<any> const files = await promisedFiles; + if (note.poll != null) { + if (note.text == null) note.text = ''; + const url = `${config.url}/notes/${note._id}`; + // TODO: i18n + note.text += `\n\n[投票を見る](${url})`; + } + + if (note.renoteId != null) { + if (note.text == null) note.text = ''; + const url = `${config.url}/notes/${note.renoteId}`; + note.text += `\n\nRE: ${url}`; + } + + // 省略されたメンションのホストを復元する const text = note.text ? parseMfm(note.text).map(x => { if (x.type == 'mention' && x.host == null) { return `${x.content}@${config.host}`; From 62509edcbe84ec922203aebfe10758a9fa0f61ce Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 17 Sep 2018 12:18:59 +0900 Subject: [PATCH 281/539] Refactor --- src/remote/activitypub/renderer/note.ts | 28 ++++++++++++++----------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts index 3ed6a6e16a..b3ce1c03e4 100644 --- a/src/remote/activitypub/renderer/note.ts +++ b/src/remote/activitypub/renderer/note.ts @@ -82,34 +82,38 @@ export default async function renderNote(note: INote, dive = true): Promise<any> const files = await promisedFiles; + let text = note.text; + if (note.poll != null) { - if (note.text == null) note.text = ''; + if (text == null) text = ''; const url = `${config.url}/notes/${note._id}`; // TODO: i18n - note.text += `\n\n[投票を見る](${url})`; + text += `\n\n[投票を見る](${url})`; } if (note.renoteId != null) { - if (note.text == null) note.text = ''; + if (text == null) text = ''; const url = `${config.url}/notes/${note.renoteId}`; - note.text += `\n\nRE: ${url}`; + text += `\n\nRE: ${url}`; } // 省略されたメンションのホストを復元する - const text = note.text ? parseMfm(note.text).map(x => { - if (x.type == 'mention' && x.host == null) { - return `${x.content}@${config.host}`; - } else { - return x.content; - } - }).join('') : null; + if (text != null) { + text = parseMfm(text).map(x => { + if (x.type == 'mention' && x.host == null) { + return `${x.content}@${config.host}`; + } else { + return x.content; + } + }).join(''); + } return { id: `${config.url}/notes/${note._id}`, type: 'Note', attributedTo, summary: note.cw, - content: toHtml(note), + content: toHtml(Object.assign({}, note, { text })), _misskey_content: text, published: note.createdAt.toISOString(), to, From 71bada97df5e431d362f7f37fdeef69137dcf3fb Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 17 Sep 2018 12:19:54 +0900 Subject: [PATCH 282/539] 8.45.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index aabe65c356..13083b046c 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.45.0", - "clientVersion": "1.0.9834", + "version": "8.45.1", + "clientVersion": "1.0.9840", "codename": "nighthike", "main": "./built/index.js", "private": true, From 0632a3ed3f8aba6ec4f08f5eaa051a33843ab9e0 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Mon, 17 Sep 2018 08:10:08 +0000 Subject: [PATCH 283/539] fix(package): update @types/node to version 10.10.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 13083b046c..45bcb6854c 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "@types/mocha": "5.2.3", "@types/mongodb": "3.1.7", "@types/ms": "0.7.30", - "@types/node": "10.9.4", + "@types/node": "10.10.0", "@types/portscanner": "2.1.0", "@types/pug": "2.0.4", "@types/qrcode": "1.2.0", From f5a937c523b2165dedd1edd94267c3a0efb5a7a4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 17 Sep 2018 22:51:10 +0900 Subject: [PATCH 284/539] Better hashtag parsing --- src/mfm/parse/elements/hashtag.ts | 4 ++-- test/mfm.ts | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/mfm/parse/elements/hashtag.ts b/src/mfm/parse/elements/hashtag.ts index f4b6a78fa8..339026228a 100644 --- a/src/mfm/parse/elements/hashtag.ts +++ b/src/mfm/parse/elements/hashtag.ts @@ -9,9 +9,9 @@ export type TextElementHashtag = { }; export default function(text: string, i: number) { - if (!(/^\s#[^\s]+/.test(text) || (i == 0 && /^#[^\s]+/.test(text)))) return null; + if (!(/^\s#[^\s\.,]+/.test(text) || (i == 0 && /^#[^\s\.,]+/.test(text)))) return null; const isHead = text.startsWith('#'); - const hashtag = text.match(/^\s?#[^\s]+/)[0]; + const hashtag = text.match(/^\s?#[^\s\.,]+/)[0]; const res: any[] = !isHead ? [{ type: 'text', content: text[0] diff --git a/test/mfm.ts b/test/mfm.ts index 901ffb80e3..a015092f0c 100644 --- a/test/mfm.ts +++ b/test/mfm.ts @@ -71,11 +71,20 @@ describe('Text', () => { }); it('hashtag', () => { - const tokens = analyze('Strawberry Pasta #alice'); + const tokens1 = analyze('Strawberry Pasta #alice'); assert.deepEqual([ { type: 'text', content: 'Strawberry Pasta ' }, { type: 'hashtag', content: '#alice', hashtag: 'alice' } - ], tokens); + ], tokens1); + + const tokens2 = analyze('Foo #bar, baz #piyo.'); + assert.deepEqual([ + { type: 'text', content: 'Foo ' }, + { type: 'hashtag', content: '#bar', hashtag: 'bar' }, + { type: 'text', content: ', baz ' }, + { type: 'hashtag', content: '#piyo', hashtag: 'piyo' }, + { type: 'text', content: '.' } + ], tokens2); }); it('url', () => { From 311b4e90cac635ba50d662db7e87eece28cf4699 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 17 Sep 2018 22:51:25 +0900 Subject: [PATCH 285/539] No lint when test --- gulpfile.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gulpfile.ts b/gulpfile.ts index da111b2982..8a4a74d26c 100644 --- a/gulpfile.ts +++ b/gulpfile.ts @@ -78,7 +78,7 @@ gulp.task('build:copy', ['build:copy:views', 'build:copy:lang'], () => ]).pipe(gulp.dest('./built/')) ); -gulp.task('test', ['lint', 'mocha']); +gulp.task('test', ['mocha']); gulp.task('lint', () => gulp.src('./src/**/*.ts') From 44f6fe6f1fa3873d6b6950dc5746725f014a1bb1 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 17 Sep 2018 23:07:15 +0900 Subject: [PATCH 286/539] Refactor: Extract shouldMuteThisNote function --- src/misc/should-mute-this-note.ts | 15 +++++++++++++++ src/server/api/stream/global-timeline.ts | 14 +++----------- src/server/api/stream/hashtag.ts | 14 +++----------- src/server/api/stream/home.ts | 11 ++--------- src/server/api/stream/hybrid-timeline.ts | 14 +++----------- src/server/api/stream/local-timeline.ts | 14 +++----------- 6 files changed, 29 insertions(+), 53 deletions(-) create mode 100644 src/misc/should-mute-this-note.ts diff --git a/src/misc/should-mute-this-note.ts b/src/misc/should-mute-this-note.ts new file mode 100644 index 0000000000..c818115a3c --- /dev/null +++ b/src/misc/should-mute-this-note.ts @@ -0,0 +1,15 @@ +export default function(note: any, mutedUserIds: string[]): boolean { + if (mutedUserIds.indexOf(note.userId) != -1) { + return true; + } + + if (note.reply != null && mutedUserIds.indexOf(note.reply.userId) != -1) { + return true; + } + + if (note.renote != null && mutedUserIds.indexOf(note.renote.userId) != -1) { + return true; + } + + return false; +} diff --git a/src/server/api/stream/global-timeline.ts b/src/server/api/stream/global-timeline.ts index 4786450cbb..03852fb181 100644 --- a/src/server/api/stream/global-timeline.ts +++ b/src/server/api/stream/global-timeline.ts @@ -3,6 +3,7 @@ import Xev from 'xev'; import { IUser } from '../../../models/user'; import Mute from '../../../models/mute'; +import shouldMuteThisNote from '../../../misc/should-mute-this-note'; export default async function( request: websocket.request, @@ -15,17 +16,8 @@ export default async function( // Subscribe stream subscriber.on('global-timeline', async note => { - //#region 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する - if (mutedUserIds.indexOf(note.userId) != -1) { - return; - } - if (note.reply != null && mutedUserIds.indexOf(note.reply.userId) != -1) { - return; - } - if (note.renote != null && mutedUserIds.indexOf(note.renote.userId) != -1) { - return; - } - //#endregion + // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する + if (shouldMuteThisNote(note, mutedUserIds)) return; connection.send(JSON.stringify({ type: 'note', diff --git a/src/server/api/stream/hashtag.ts b/src/server/api/stream/hashtag.ts index db2806e796..54da4f9ad9 100644 --- a/src/server/api/stream/hashtag.ts +++ b/src/server/api/stream/hashtag.ts @@ -4,6 +4,7 @@ import Xev from 'xev'; import { IUser } from '../../../models/user'; import Mute from '../../../models/mute'; import { pack } from '../../../models/note'; +import shouldMuteThisNote from '../../../misc/should-mute-this-note'; export default async function( request: websocket.request, @@ -28,17 +29,8 @@ export default async function( }); } - //#region 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する - if (mutedUserIds.indexOf(note.userId) != -1) { - return; - } - if (note.reply != null && mutedUserIds.indexOf(note.reply.userId) != -1) { - return; - } - if (note.renote != null && mutedUserIds.indexOf(note.renote.userId) != -1) { - return; - } - //#endregion + // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する + if (shouldMuteThisNote(note, mutedUserIds)) return; connection.send(JSON.stringify({ type: 'note', diff --git a/src/server/api/stream/home.ts b/src/server/api/stream/home.ts index 5f3b6744b2..f1fced42d7 100644 --- a/src/server/api/stream/home.ts +++ b/src/server/api/stream/home.ts @@ -8,6 +8,7 @@ import { pack as packNote, pack } from '../../../models/note'; import readNotification from '../common/read-notification'; import call from '../call'; import { IApp } from '../../../models/app'; +import shouldMuteThisNote from '../../../misc/should-mute-this-note'; const log = debug('misskey'); @@ -45,15 +46,7 @@ export default async function( //#region 流れてきたメッセージがミュートしているユーザーが関わるものだったら無視する if (x.type == 'note') { - if (mutedUserIds.includes(x.body.userId)) { - return; - } - if (x.body.reply != null && mutedUserIds.includes(x.body.reply.userId)) { - return; - } - if (x.body.renote != null && mutedUserIds.includes(x.body.renote.userId)) { - return; - } + if (shouldMuteThisNote(x.body, mutedUserIds)) return; } else if (x.type == 'notification') { if (mutedUserIds.includes(x.body.userId)) { return; diff --git a/src/server/api/stream/hybrid-timeline.ts b/src/server/api/stream/hybrid-timeline.ts index d0dae9b0dd..045b822783 100644 --- a/src/server/api/stream/hybrid-timeline.ts +++ b/src/server/api/stream/hybrid-timeline.ts @@ -4,6 +4,7 @@ import Xev from 'xev'; import { IUser } from '../../../models/user'; import Mute from '../../../models/mute'; import { pack } from '../../../models/note'; +import shouldMuteThisNote from '../../../misc/should-mute-this-note'; export default async function( request: websocket.request, @@ -26,17 +27,8 @@ export default async function( }); } - //#region 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する - if (mutedUserIds.indexOf(note.userId) != -1) { - return; - } - if (note.reply != null && mutedUserIds.indexOf(note.reply.userId) != -1) { - return; - } - if (note.renote != null && mutedUserIds.indexOf(note.renote.userId) != -1) { - return; - } - //#endregion + // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する + if (shouldMuteThisNote(note, mutedUserIds)) return; connection.send(JSON.stringify({ type: 'note', diff --git a/src/server/api/stream/local-timeline.ts b/src/server/api/stream/local-timeline.ts index e21c071bab..ae054a5f9f 100644 --- a/src/server/api/stream/local-timeline.ts +++ b/src/server/api/stream/local-timeline.ts @@ -4,6 +4,7 @@ import Xev from 'xev'; import { IUser } from '../../../models/user'; import Mute from '../../../models/mute'; import { pack } from '../../../models/note'; +import shouldMuteThisNote from '../../../misc/should-mute-this-note'; export default async function( request: websocket.request, @@ -23,17 +24,8 @@ export default async function( }); } - //#region 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する - if (mutedUserIds.indexOf(note.userId) != -1) { - return; - } - if (note.reply != null && mutedUserIds.indexOf(note.reply.userId) != -1) { - return; - } - if (note.renote != null && mutedUserIds.indexOf(note.renote.userId) != -1) { - return; - } - //#endregion + // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する + if (shouldMuteThisNote(note, mutedUserIds)) return; connection.send(JSON.stringify({ type: 'note', From 2fad6e6d5f57955dcf0db903154597a5b8b27700 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 02:13:42 +0900 Subject: [PATCH 287/539] Refactor --- src/models/note.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models/note.ts b/src/models/note.ts index bb600fc0cb..ce307d061a 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -196,7 +196,7 @@ export const hideNote = async (packedNote: any, meId: mongo.ObjectID) => { hide = false; } else { // 指定されているかどうか - const specified = packedNote.visibleUserIds.some((id: mongo.ObjectID) => id.equals(meId)); + const specified = packedNote.visibleUserIds.some((id: any) => meId.equals(id)); if (specified) { hide = false; From ab83e08bc7deb244d35e2315abead473d536d2c3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 02:14:12 +0900 Subject: [PATCH 288/539] =?UTF-8?q?=E3=83=A1=E3=83=83=E3=82=BB=E3=83=BC?= =?UTF-8?q?=E3=82=B8=E3=82=BF=E3=82=A4=E3=83=A0=E3=83=A9=E3=82=A4=E3=83=B3?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 3 + .../views/components/timeline.core.vue | 148 ++++++++++-------- .../app/desktop/views/components/timeline.vue | 18 ++- .../views/pages/deck/deck.column-core.vue | 5 +- .../views/pages/deck/deck.direct-column.vue | 38 +++++ .../desktop/views/pages/deck/deck.direct.vue | 97 ++++++++++++ .../app/desktop/views/pages/deck/deck.vue | 9 ++ .../app/mobile/views/pages/home.timeline.vue | 147 +++++++++-------- src/client/app/mobile/views/pages/home.vue | 49 ++++-- src/server/api/endpoints/notes/mentions.ts | 7 + src/services/note/create.ts | 22 ++- 11 files changed, 393 insertions(+), 150 deletions(-) create mode 100644 src/client/app/desktop/views/pages/deck/deck.direct-column.vue create mode 100644 src/client/app/desktop/views/pages/deck/deck.direct.vue diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index a3b2bd88e7..11dd76d0e6 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -169,6 +169,7 @@ common: hashtag: "ハッシュタグ" global: "グローバル" mentions: "あなた宛て" + direct: "ダイレクト投稿" notifications: "通知" list: "リスト" swap-left: "左に移動" @@ -916,6 +917,7 @@ desktop/views/components/timeline.vue: hybrid: "ソーシャル" global: "グローバル" mentions: "あなた宛て" + messages: "メッセージ" list: "リスト" hashtag: "ハッシュタグ" add-tag-timeline: "ハッシュタグを追加" @@ -1322,6 +1324,7 @@ mobile/views/pages/home.vue: hybrid: "ソーシャル" global: "グローバル" mentions: "あなた宛て" + messages: "メッセージ" mobile/views/pages/tag.vue: no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。" diff --git a/src/client/app/desktop/views/components/timeline.core.vue b/src/client/app/desktop/views/components/timeline.core.vue index d2176dee87..c8aa36f171 100644 --- a/src/client/app/desktop/views/components/timeline.core.vue +++ b/src/client/app/desktop/views/components/timeline.core.vue @@ -38,7 +38,14 @@ export default Vue.extend({ streamManager: null, connection: null, connectionId: null, - date: null + date: null, + baseQuery: { + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, + includeLocalRenotes: this.$store.state.settings.showLocalRenotes + }, + query: {}, + endpoint: null }; }, @@ -47,53 +54,102 @@ export default Vue.extend({ return this.$store.state.i.followingCount == 0; }, - endpoint(): string { - switch (this.src) { - case 'home': return 'notes/timeline'; - case 'local': return 'notes/local-timeline'; - case 'hybrid': return 'notes/hybrid-timeline'; - case 'global': return 'notes/global-timeline'; - case 'mentions': return 'notes/mentions'; - case 'tag': return 'notes/search_by_tag'; - } - }, - canFetchMore(): boolean { return !this.moreFetching && !this.fetching && this.existMore; } }, mounted() { + const prepend = note => { + (this.$refs.timeline as any).prepend(note); + }; + if (this.src == 'tag') { + this.endpoint = 'notes/search_by_tag'; + this.query = { + query: this.tagTl.query + }; this.connection = new HashtagStream((this as any).os, this.$store.state.i, this.tagTl.query); - this.connection.on('note', this.onNote); + this.connection.on('note', prepend); + this.$once('beforeDestroy', () => { + this.connection.off('note', prepend); + this.connection.close(); + }); } else if (this.src == 'home') { + this.endpoint = 'notes/timeline'; + const onChangeFollowing = () => { + this.fetch(); + }; this.streamManager = (this as any).os.stream; this.connection = this.streamManager.getConnection(); this.connectionId = this.streamManager.use(); - this.connection.on('note', this.onNote); - this.connection.on('follow', this.onChangeFollowing); - this.connection.on('unfollow', this.onChangeFollowing); + this.connection.on('note', prepend); + this.connection.on('follow', onChangeFollowing); + this.connection.on('unfollow', onChangeFollowing); + this.$once('beforeDestroy', () => { + this.connection.off('note', prepend); + this.connection.off('follow', onChangeFollowing); + this.connection.off('unfollow', onChangeFollowing); + this.streamManager.dispose(this.connectionId); + }); } else if (this.src == 'local') { + this.endpoint = 'notes/local-timeline'; this.streamManager = (this as any).os.streams.localTimelineStream; this.connection = this.streamManager.getConnection(); this.connectionId = this.streamManager.use(); - this.connection.on('note', this.onNote); + this.connection.on('note', prepend); + this.$once('beforeDestroy', () => { + this.connection.off('note', prepend); + this.streamManager.dispose(this.connectionId); + }); } else if (this.src == 'hybrid') { + this.endpoint = 'notes/hybrid-timeline'; this.streamManager = (this as any).os.streams.hybridTimelineStream; this.connection = this.streamManager.getConnection(); this.connectionId = this.streamManager.use(); - this.connection.on('note', this.onNote); + this.connection.on('note', prepend); + this.$once('beforeDestroy', () => { + this.connection.off('note', prepend); + this.streamManager.dispose(this.connectionId); + }); } else if (this.src == 'global') { + this.endpoint = 'notes/global-timeline'; this.streamManager = (this as any).os.streams.globalTimelineStream; this.connection = this.streamManager.getConnection(); this.connectionId = this.streamManager.use(); - this.connection.on('note', this.onNote); + this.connection.on('note', prepend); + this.$once('beforeDestroy', () => { + this.connection.off('note', prepend); + this.streamManager.dispose(this.connectionId); + }); } else if (this.src == 'mentions') { + this.endpoint = 'notes/mentions'; this.streamManager = (this as any).os.stream; this.connection = this.streamManager.getConnection(); this.connectionId = this.streamManager.use(); - this.connection.on('mention', this.onNote); + this.connection.on('mention', prepend); + this.$once('beforeDestroy', () => { + this.connection.off('mention', prepend); + this.streamManager.dispose(this.connectionId); + }); + } else if (this.src == 'messages') { + this.endpoint = 'notes/mentions'; + this.query = { + visibility: 'specified' + }; + const onNote = note => { + if (note.visibility == 'specified') { + prepend(note); + } + }; + this.streamManager = (this as any).os.stream; + this.connection = this.streamManager.getConnection(); + this.connectionId = this.streamManager.use(); + this.connection.on('mention', onNote); + this.$once('beforeDestroy', () => { + this.connection.off('mention', onNote); + this.streamManager.dispose(this.connectionId); + }); } document.addEventListener('keydown', this.onKeydown); @@ -102,28 +158,7 @@ export default Vue.extend({ }, beforeDestroy() { - if (this.src == 'tag') { - this.connection.off('note', this.onNote); - this.connection.close(); - } else if (this.src == 'home') { - this.connection.off('note', this.onNote); - this.connection.off('follow', this.onChangeFollowing); - this.connection.off('unfollow', this.onChangeFollowing); - this.streamManager.dispose(this.connectionId); - } else if (this.src == 'local') { - this.connection.off('note', this.onNote); - this.streamManager.dispose(this.connectionId); - } else if (this.src == 'hybrid') { - this.connection.off('note', this.onNote); - this.streamManager.dispose(this.connectionId); - } else if (this.src == 'global') { - this.connection.off('note', this.onNote); - this.streamManager.dispose(this.connectionId); - } else if (this.src == 'mentions') { - this.connection.off('mention', this.onNote); - this.streamManager.dispose(this.connectionId); - } - + this.$emit('beforeDestroy'); document.removeEventListener('keydown', this.onKeydown); }, @@ -132,14 +167,10 @@ export default Vue.extend({ this.fetching = true; (this.$refs.timeline as any).init(() => new Promise((res, rej) => { - (this as any).api(this.endpoint, { + (this as any).api(this.endpoint, Object.assign({ limit: fetchLimit + 1, - untilDate: this.date ? this.date.getTime() : undefined, - includeMyRenotes: this.$store.state.settings.showMyRenotes, - includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, - includeLocalRenotes: this.$store.state.settings.showLocalRenotes, - query: this.tagTl ? this.tagTl.query : undefined - }).then(notes => { + untilDate: this.date ? this.date.getTime() : undefined + }, this.baseQuery, this.query)).then(notes => { if (notes.length == fetchLimit + 1) { notes.pop(); this.existMore = true; @@ -156,14 +187,10 @@ export default Vue.extend({ this.moreFetching = true; - const promise = (this as any).api(this.endpoint, { + const promise = (this as any).api(this.endpoint, Object.assign({ limit: fetchLimit + 1, - untilId: (this.$refs.timeline as any).tail().id, - includeMyRenotes: this.$store.state.settings.showMyRenotes, - includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, - includeLocalRenotes: this.$store.state.settings.showLocalRenotes, - query: this.tagTl ? this.tagTl.query : undefined - }); + untilId: (this.$refs.timeline as any).tail().id + }, this.baseQuery, this.query)); promise.then(notes => { if (notes.length == fetchLimit + 1) { @@ -178,15 +205,6 @@ export default Vue.extend({ return promise; }, - onNote(note) { - // Prepend a note - (this.$refs.timeline as any).prepend(note); - }, - - onChangeFollowing() { - this.fetch(); - }, - focus() { (this.$refs.timeline as any).focus(); }, diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue index 2dc84004df..ccc35f95ff 100644 --- a/src/client/app/desktop/views/components/timeline.vue +++ b/src/client/app/desktop/views/components/timeline.vue @@ -5,10 +5,11 @@ <span :data-active="src == 'local'" @click="src = 'local'" v-if="enableLocalTimeline">%fa:R comments% %i18n:@local%</span> <span :data-active="src == 'hybrid'" @click="src = 'hybrid'" v-if="enableLocalTimeline">%fa:share-alt% %i18n:@hybrid%</span> <span :data-active="src == 'global'" @click="src = 'global'">%fa:globe% %i18n:@global%</span> - <span :data-active="src == 'mentions'" @click="src = 'mentions'">%fa:at% %i18n:@mentions%</span> <span :data-active="src == 'tag'" @click="src = 'tag'" v-if="tagTl">%fa:hashtag% {{ tagTl.title }}</span> <span :data-active="src == 'list'" @click="src = 'list'" v-if="list">%fa:list% {{ list.title }}</span> <div class="buttons"> + <button :data-active="src == 'mentions'" @click="src = 'mentions'" title="%i18n:@mentions%">%fa:at%</button> + <button :data-active="src == 'messages'" @click="src = 'messages'" title="%i18n:@messages%">%fa:envelope R%</button> <button @click="chooseTag" title="%i18n:@hashtag%" ref="tagButton">%fa:hashtag%</button> <button @click="chooseList" title="%i18n:@list%" ref="listButton">%fa:list%</button> </div> @@ -18,6 +19,7 @@ <x-core v-if="src == 'hybrid'" ref="tl" key="hybrid" src="hybrid"/> <x-core v-if="src == 'global'" ref="tl" key="global" src="global"/> <x-core v-if="src == 'mentions'" ref="tl" key="mentions" src="mentions"/> + <x-core v-if="src == 'messages'" ref="tl" key="messages" src="messages"/> <x-core v-if="src == 'tag'" ref="tl" key="tag" src="tag" :tag-tl="tagTl"/> <mk-user-list-timeline v-if="src == 'list'" ref="tl" :key="list.id" :list="list"/> </div> @@ -202,6 +204,20 @@ root(isDark) &:active color isDark ? #b2c1d5 : #999 + &[data-active] + color $theme-color + cursor default + + &:before + content "" + display block + position absolute + bottom 0 + left 0 + width 100% + height 2px + background $theme-color + > span display inline-block padding 0 10px diff --git a/src/client/app/desktop/views/pages/deck/deck.column-core.vue b/src/client/app/desktop/views/pages/deck/deck.column-core.vue index a320f697b3..e1490cb0e4 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column-core.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column-core.vue @@ -8,6 +8,7 @@ <x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked"/> <x-tl-column v-else-if="column.type == 'hashtag'" :column="column" :is-stacked="isStacked"/> <x-mentions-column v-else-if="column.type == 'mentions'" :column="column" :is-stacked="isStacked"/> +<x-direct-column v-else-if="column.type == 'direct'" :column="column" :is-stacked="isStacked"/> </template> <script lang="ts"> @@ -16,13 +17,15 @@ import XTlColumn from './deck.tl-column.vue'; import XNotificationsColumn from './deck.notifications-column.vue'; import XWidgetsColumn from './deck.widgets-column.vue'; import XMentionsColumn from './deck.mentions-column.vue'; +import XDirectColumn from './deck.direct-column.vue'; export default Vue.extend({ components: { XTlColumn, XNotificationsColumn, XWidgetsColumn, - XMentionsColumn + XMentionsColumn, + XDirectColumn }, props: { diff --git a/src/client/app/desktop/views/pages/deck/deck.direct-column.vue b/src/client/app/desktop/views/pages/deck/deck.direct-column.vue new file mode 100644 index 0000000000..d5093761f4 --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.direct-column.vue @@ -0,0 +1,38 @@ +<template> +<x-column :name="name" :column="column" :is-stacked="isStacked"> + <span slot="header">%fa:envelope R%{{ name }}</span> + + <x-direct/> +</x-column> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import XColumn from './deck.column.vue'; +import XDirect from './deck.direct.vue'; + +export default Vue.extend({ + components: { + XColumn, + XDirect + }, + + props: { + column: { + type: Object, + required: true + }, + isStacked: { + type: Boolean, + required: true + } + }, + + computed: { + name(): string { + if (this.column.name) return this.column.name; + return '%i18n:common.deck.direct%'; + } + }, +}); +</script> diff --git a/src/client/app/desktop/views/pages/deck/deck.direct.vue b/src/client/app/desktop/views/pages/deck/deck.direct.vue new file mode 100644 index 0000000000..ec9e6b9c3d --- /dev/null +++ b/src/client/app/desktop/views/pages/deck/deck.direct.vue @@ -0,0 +1,97 @@ +<template> + <x-notes ref="timeline" :more="existMore ? more : null"/> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import XNotes from './deck.notes.vue'; + +const fetchLimit = 10; + +export default Vue.extend({ + components: { + XNotes + }, + + props: { + }, + + data() { + return { + fetching: true, + moreFetching: false, + existMore: false, + connection: null, + connectionId: null + }; + }, + + mounted() { + this.connection = (this as any).os.stream.getConnection(); + this.connectionId = (this as any).os.stream.use(); + + this.connection.on('mention', this.onNote); + + this.fetch(); + }, + + beforeDestroy() { + this.connection.off('mention', this.onNote); + (this as any).os.stream.dispose(this.connectionId); + }, + + methods: { + fetch() { + this.fetching = true; + + (this.$refs.timeline as any).init(() => new Promise((res, rej) => { + (this as any).api('notes/mentions', { + limit: fetchLimit + 1, + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, + includeLocalRenotes: this.$store.state.settings.showLocalRenotes, + visibility: 'specified' + }).then(notes => { + if (notes.length == fetchLimit + 1) { + notes.pop(); + this.existMore = true; + } + res(notes); + this.fetching = false; + this.$emit('loaded'); + }, rej); + })); + }, + more() { + this.moreFetching = true; + + const promise = (this as any).api('notes/mentions', { + limit: fetchLimit + 1, + untilId: (this.$refs.timeline as any).tail().id, + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, + includeLocalRenotes: this.$store.state.settings.showLocalRenotes, + visibility: 'specified' + }); + + promise.then(notes => { + if (notes.length == fetchLimit + 1) { + notes.pop(); + } else { + this.existMore = false; + } + notes.forEach(n => (this.$refs.timeline as any).append(n)); + this.moreFetching = false; + }); + + return promise; + }, + onNote(note) { + // Prepend a note + if (note.visibility == 'specified') { + (this.$refs.timeline as any).prepend(note); + } + } + } +}); +</script> diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index aafe9a45d3..e5aeba251a 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -147,6 +147,15 @@ export default Vue.extend({ type: 'mentions' }); } + }, { + icon: '%fa:envelope R%', + text: '%i18n:common.deck.direct%', + action: () => { + this.$store.dispatch('settings/addDeckColumn', { + id: uuid(), + type: 'direct' + }); + } }, { icon: '%fa:list%', text: '%i18n:common.deck.list%', diff --git a/src/client/app/mobile/views/pages/home.timeline.vue b/src/client/app/mobile/views/pages/home.timeline.vue index fecb2384ba..225abcff6b 100644 --- a/src/client/app/mobile/views/pages/home.timeline.vue +++ b/src/client/app/mobile/views/pages/home.timeline.vue @@ -37,7 +37,14 @@ export default Vue.extend({ connection: null, connectionId: null, unreadCount: 0, - date: null + date: null, + baseQuery: { + includeMyRenotes: this.$store.state.settings.showMyRenotes, + includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, + includeLocalRenotes: this.$store.state.settings.showLocalRenotes + }, + query: {}, + endpoint: null }; }, @@ -46,80 +53,109 @@ export default Vue.extend({ return this.$store.state.i.followingCount == 0; }, - endpoint(): string { - switch (this.src) { - case 'home': return 'notes/timeline'; - case 'local': return 'notes/local-timeline'; - case 'hybrid': return 'notes/hybrid-timeline'; - case 'global': return 'notes/global-timeline'; - case 'mentions': return 'notes/mentions'; - case 'tag': return 'notes/search_by_tag'; - } - }, - canFetchMore(): boolean { return !this.moreFetching && !this.fetching && this.existMore; } }, mounted() { + const prepend = note => { + (this.$refs.timeline as any).prepend(note); + }; + if (this.src == 'tag') { + this.endpoint = 'notes/search_by_tag'; + this.query = { + query: this.tagTl.query + }; this.connection = new HashtagStream((this as any).os, this.$store.state.i, this.tagTl.query); - this.connection.on('note', this.onNote); + this.connection.on('note', prepend); + this.$once('beforeDestroy', () => { + this.connection.off('note', prepend); + this.connection.close(); + }); } else if (this.src == 'home') { + this.endpoint = 'notes/timeline'; + const onChangeFollowing = () => { + this.fetch(); + }; this.streamManager = (this as any).os.stream; this.connection = this.streamManager.getConnection(); this.connectionId = this.streamManager.use(); - this.connection.on('note', this.onNote); - this.connection.on('follow', this.onChangeFollowing); - this.connection.on('unfollow', this.onChangeFollowing); + this.connection.on('note', prepend); + this.connection.on('follow', onChangeFollowing); + this.connection.on('unfollow', onChangeFollowing); + this.$once('beforeDestroy', () => { + this.connection.off('note', prepend); + this.connection.off('follow', onChangeFollowing); + this.connection.off('unfollow', onChangeFollowing); + this.streamManager.dispose(this.connectionId); + }); } else if (this.src == 'local') { + this.endpoint = 'notes/local-timeline'; this.streamManager = (this as any).os.streams.localTimelineStream; this.connection = this.streamManager.getConnection(); this.connectionId = this.streamManager.use(); - this.connection.on('note', this.onNote); + this.connection.on('note', prepend); + this.$once('beforeDestroy', () => { + this.connection.off('note', prepend); + this.streamManager.dispose(this.connectionId); + }); } else if (this.src == 'hybrid') { + this.endpoint = 'notes/hybrid-timeline'; this.streamManager = (this as any).os.streams.hybridTimelineStream; this.connection = this.streamManager.getConnection(); this.connectionId = this.streamManager.use(); - this.connection.on('note', this.onNote); + this.connection.on('note', prepend); + this.$once('beforeDestroy', () => { + this.connection.off('note', prepend); + this.streamManager.dispose(this.connectionId); + }); } else if (this.src == 'global') { + this.endpoint = 'notes/global-timeline'; this.streamManager = (this as any).os.streams.globalTimelineStream; this.connection = this.streamManager.getConnection(); this.connectionId = this.streamManager.use(); - this.connection.on('note', this.onNote); + this.connection.on('note', prepend); + this.$once('beforeDestroy', () => { + this.connection.off('note', prepend); + this.streamManager.dispose(this.connectionId); + }); } else if (this.src == 'mentions') { + this.endpoint = 'notes/mentions'; this.streamManager = (this as any).os.stream; this.connection = this.streamManager.getConnection(); this.connectionId = this.streamManager.use(); - this.connection.on('mention', this.onNote); + this.connection.on('mention', prepend); + this.$once('beforeDestroy', () => { + this.connection.off('mention', prepend); + this.streamManager.dispose(this.connectionId); + }); + } else if (this.src == 'messages') { + this.endpoint = 'notes/mentions'; + this.query = { + visibility: 'specified' + }; + const onNote = note => { + if (note.visibility == 'specified') { + prepend(note); + } + }; + this.streamManager = (this as any).os.stream; + this.connection = this.streamManager.getConnection(); + this.connectionId = this.streamManager.use(); + this.connection.on('mention', onNote); + this.$once('beforeDestroy', () => { + this.connection.off('mention', onNote); + this.streamManager.dispose(this.connectionId); + }); } this.fetch(); }, beforeDestroy() { - if (this.src == 'tag') { - this.connection.off('note', this.onNote); - this.connection.close(); - } else if (this.src == 'home') { - this.connection.off('note', this.onNote); - this.connection.off('follow', this.onChangeFollowing); - this.connection.off('unfollow', this.onChangeFollowing); - this.streamManager.dispose(this.connectionId); - } else if (this.src == 'local') { - this.connection.off('note', this.onNote); - this.streamManager.dispose(this.connectionId); - } else if (this.src == 'hybrid') { - this.connection.off('note', this.onNote); - this.streamManager.dispose(this.connectionId); - } else if (this.src == 'global') { - this.connection.off('note', this.onNote); - this.streamManager.dispose(this.connectionId); - } else if (this.src == 'mentions') { - this.connection.off('mention', this.onNote); - this.streamManager.dispose(this.connectionId); - } + this.$emit('beforeDestroy'); }, methods: { @@ -127,14 +163,10 @@ export default Vue.extend({ this.fetching = true; (this.$refs.timeline as any).init(() => new Promise((res, rej) => { - (this as any).api(this.endpoint, { + (this as any).api(this.endpoint, Object.assign({ limit: fetchLimit + 1, - untilDate: this.date ? this.date.getTime() : undefined, - includeMyRenotes: this.$store.state.settings.showMyRenotes, - includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, - includeLocalRenotes: this.$store.state.settings.showLocalRenotes, - query: this.tagTl ? this.tagTl.query : undefined - }).then(notes => { + untilDate: this.date ? this.date.getTime() : undefined + }, this.baseQuery, this.query)).then(notes => { if (notes.length == fetchLimit + 1) { notes.pop(); this.existMore = true; @@ -151,14 +183,10 @@ export default Vue.extend({ this.moreFetching = true; - const promise = (this as any).api(this.endpoint, { + const promise = (this as any).api(this.endpoint, Object.assign({ limit: fetchLimit + 1, - untilId: (this.$refs.timeline as any).tail().id, - includeMyRenotes: this.$store.state.settings.showMyRenotes, - includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes, - includeLocalRenotes: this.$store.state.settings.showLocalRenotes, - query: this.tagTl ? this.tagTl.query : undefined - }); + untilId: (this.$refs.timeline as any).tail().id + }, this.baseQuery, this.query)); promise.then(notes => { if (notes.length == fetchLimit + 1) { @@ -173,15 +201,6 @@ export default Vue.extend({ return promise; }, - onNote(note) { - // Prepend a note - (this.$refs.timeline as any).prepend(note); - }, - - onChangeFollowing() { - this.fetch(); - }, - focus() { (this.$refs.timeline as any).focus(); }, diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue index 3ec2f16b75..e61916fe18 100644 --- a/src/client/app/mobile/views/pages/home.vue +++ b/src/client/app/mobile/views/pages/home.vue @@ -7,6 +7,7 @@ <span v-if="src == 'hybrid'">%fa:share-alt%%i18n:@hybrid%</span> <span v-if="src == 'global'">%fa:globe%%i18n:@global%</span> <span v-if="src == 'mentions'">%fa:at%%i18n:@mentions%</span> + <span v-if="src == 'messages'">%fa:envelope R%%i18n:@messages%</span> <span v-if="src == 'list'">%fa:list%{{ list.title }}</span> <span v-if="src == 'tag'">%fa:hashtag%{{ tagTl.title }}</span> </span> @@ -23,16 +24,21 @@ <main :data-darkmode="$store.state.device.darkmode"> <div class="nav" v-if="showNav"> <div class="bg" @click="showNav = false"></div> + <div class="pointer"></div> <div class="body"> <div> <span :data-active="src == 'home'" @click="src = 'home'">%fa:home% %i18n:@home%</span> <span :data-active="src == 'local'" @click="src = 'local'" v-if="enableLocalTimeline">%fa:R comments% %i18n:@local%</span> <span :data-active="src == 'hybrid'" @click="src = 'hybrid'" v-if="enableLocalTimeline">%fa:share-alt% %i18n:@hybrid%</span> <span :data-active="src == 'global'" @click="src = 'global'">%fa:globe% %i18n:@global%</span> + <div class="hr"></div> <span :data-active="src == 'mentions'" @click="src = 'mentions'">%fa:at% %i18n:@mentions%</span> + <span :data-active="src == 'messages'" @click="src = 'messages'">%fa:envelope R% %i18n:@messages%</span> <template v-if="lists"> + <div class="hr"></div> <span v-for="l in lists" :data-active="src == 'list' && list == l" @click="src = 'list'; list = l" :key="l.id">%fa:list% {{ l.title }}</span> </template> + <div class="hr" v-if="$store.state.settings.tagTimelines && $store.state.settings.tagTimelines.length > 0"></div> <span v-for="tl in $store.state.settings.tagTimelines" :data-active="src == 'tag' && tagTl == tl" @click="src = 'tag'; tagTl = tl" :key="tl.id">%fa:hashtag% {{ tl.title }}</span> </div> </div> @@ -44,6 +50,7 @@ <x-tl v-if="src == 'hybrid'" ref="tl" key="hybrid" src="hybrid"/> <x-tl v-if="src == 'global'" ref="tl" key="global" src="global"/> <x-tl v-if="src == 'mentions'" ref="tl" key="mentions" src="mentions"/> + <x-tl v-if="src == 'messages'" ref="tl" key="messages" src="messages"/> <x-tl v-if="src == 'tag'" ref="tl" key="tag" src="tag" :tag-tl="tagTl"/> <mk-user-list-timeline v-if="src == 'list'" ref="tl" :key="list.id" :list="list"/> </div> @@ -150,6 +157,26 @@ export default Vue.extend({ root(isDark) > .nav + > .pointer + position fixed + z-index 10002 + top 56px + left 0 + right 0 + + $size = 16px + + &:after + content "" + display block + position absolute + top -($size * 2) + left s('calc(50% - %s)', $size) + border-top solid $size transparent + border-left solid $size transparent + border-right solid $size transparent + border-bottom solid $size isDark ? #272f3a : #fff + > .bg position fixed z-index 10000 @@ -166,28 +193,22 @@ root(isDark) left 0 right 0 width 300px + max-height calc(100% - 70px) margin 0 auto + overflow auto + -webkit-overflow-scrolling touch background isDark ? #272f3a : #fff border-radius 8px box-shadow 0 0 16px rgba(#000, 0.1) - $balloon-size = 16px - - &:after - content "" - display block - position absolute - top -($balloon-size * 2) + 1.5px - left s('calc(50% - %s)', $balloon-size) - border-top solid $balloon-size transparent - border-left solid $balloon-size transparent - border-right solid $balloon-size transparent - border-bottom solid $balloon-size isDark ? #272f3a : #fff - > div padding 8px 0 - > * + > .hr + margin 8px 0 + border-top solid 1px isDark ? rgba(#000, 0.3) : rgba(#000, 0.1) + + > *:not(.hr) display block padding 8px 16px color isDark ? #cdd0d8 : #666 diff --git a/src/server/api/endpoints/notes/mentions.ts b/src/server/api/endpoints/notes/mentions.ts index 3b2e262e4f..8675a9f562 100644 --- a/src/server/api/endpoints/notes/mentions.ts +++ b/src/server/api/endpoints/notes/mentions.ts @@ -27,6 +27,9 @@ export const meta = { untilId: $.type(ID).optional.note({ }), + + visibility: $.str.optional.note({ + }), } }; @@ -52,6 +55,10 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = _id: -1 }; + if (ps.visibility) { + query.visibility = ps.visibility; + } + if (ps.following) { const followingIds = await getFriendIds(user._id); diff --git a/src/services/note/create.ts b/src/services/note/create.ts index 7daf83b294..7c1e71dcb3 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -142,6 +142,14 @@ export default async (user: IUser, data: Option, silent = false) => new Promise< mentionedUsers.push(await User.findOne({ _id: data.reply.userId })); } + if (data.visibility == 'specified') { + data.visibleUsers.forEach(u => { + if (!mentionedUsers.some(x => x._id.equals(u._id))) { + mentionedUsers.push(u); + } + }); + } + const note = await insertNote(user, data, tags, mentionedUsers); res(note); @@ -188,7 +196,7 @@ export default async (user: IUser, data: Option, silent = false) => new Promise< const nm = new NotificationManager(user, note); const nmRelatedPromises = []; - createMentionedEvents(mentionedUsers, noteObj, nm); + createMentionedEvents(mentionedUsers, note, nm); const noteActivity = await renderActivity(data, note); @@ -318,7 +326,7 @@ async function publish(user: IUser, note: INote, noteObj: any, reply: INote, ren if (['public', 'home', 'followers'].includes(note.visibility)) { // フォロワーに配信 - publishToFollowers(note, noteObj, user, noteActivity); + publishToFollowers(note, user, noteActivity); } // リストに配信 @@ -456,7 +464,7 @@ async function publishToUserLists(note: INote, noteObj: any) { }); } -async function publishToFollowers(note: INote, noteObj: any, user: IUser, noteActivity: any) { +async function publishToFollowers(note: INote, user: IUser, noteActivity: any) { const detailPackedNote = await pack(note, null, { detail: true, skipHide: true @@ -505,9 +513,13 @@ function deliverNoteToMentionedRemoteUsers(mentionedUsers: IUser[], user: ILocal }); } -function createMentionedEvents(mentionedUsers: IUser[], noteObj: any, nm: NotificationManager) { +function createMentionedEvents(mentionedUsers: IUser[], note: INote, nm: NotificationManager) { mentionedUsers.filter(u => isLocalUser(u)).forEach(async (u) => { - publishUserStream(u._id, 'mention', noteObj); + const detailPackedNote = await pack(note, u, { + detail: true + }); + + publishUserStream(u._id, 'mention', detailPackedNote); // Create notification nm.push(u._id, 'mention'); From ce3797c4af7e5bee99f3352e34342b484b1f46a1 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 02:15:19 +0900 Subject: [PATCH 289/539] 8.46.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 13083b046c..fca60a9b73 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.45.1", - "clientVersion": "1.0.9840", + "version": "8.46.0", + "clientVersion": "1.0.9851", "codename": "nighthike", "main": "./built/index.js", "private": true, From df148e25da6b6e6d8ecfdadfa6299874f06995da Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Mon, 17 Sep 2018 17:24:15 +0000 Subject: [PATCH 290/539] fix(package): update @types/node to version 10.10.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ba38f5c626..d5df0c69ca 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "@types/mocha": "5.2.3", "@types/mongodb": "3.1.7", "@types/ms": "0.7.30", - "@types/node": "10.10.0", + "@types/node": "10.10.1", "@types/portscanner": "2.1.0", "@types/pug": "2.0.4", "@types/qrcode": "1.2.0", From 31ce3aa31296a1809cabc02f1ed6c92b328f5b3e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 05:35:06 +0900 Subject: [PATCH 291/539] =?UTF-8?q?=E3=82=AD=E3=83=BC=E3=83=9C=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=82=B7=E3=83=A7=E3=83=BC=E3=83=88=E3=82=AB=E3=83=83?= =?UTF-8?q?=E3=83=88=E3=82=92=E5=BC=B7=E5=8C=96=E3=81=99=E3=82=8B=E3=81=AA?= =?UTF-8?q?=E3=81=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/app/common/hotkey.ts | 79 ++++++++++ src/client/app/common/keycode.ts | 139 ++++++++++++++++++ .../views/components/reaction-picker.vue | 35 ++++- .../choose-file-from-drive-window.vue | 2 +- .../choose-folder-from-drive-window.vue | 2 +- .../desktop/views/components/drive-window.vue | 2 +- .../views/components/followers-window.vue | 2 +- .../views/components/following-window.vue | 2 +- .../desktop/views/components/game-window.vue | 2 +- .../app/desktop/views/components/home.vue | 4 + .../desktop/views/components/input-dialog.vue | 2 +- .../components/messaging-room-window.vue | 2 +- .../views/components/messaging-window.vue | 2 +- .../desktop/views/components/notes.note.vue | 63 ++++---- .../app/desktop/views/components/notes.vue | 4 +- .../views/components/post-form-window.vue | 6 +- .../views/components/progress-dialog.vue | 2 +- .../received-follow-requests-window.vue | 2 +- .../views/components/renote-form-window.vue | 33 +++-- .../views/components/settings-window.vue | 2 +- .../views/components/timeline.core.vue | 11 -- .../app/desktop/views/components/timeline.vue | 4 + .../app/desktop/views/components/ui.vue | 35 +++-- .../views/components/user-lists-window.vue | 2 +- .../app/desktop/views/components/window.vue | 2 +- src/client/app/desktop/views/pages/home.vue | 12 +- src/client/app/init.ts | 2 + 27 files changed, 355 insertions(+), 100 deletions(-) create mode 100644 src/client/app/common/hotkey.ts create mode 100644 src/client/app/common/keycode.ts diff --git a/src/client/app/common/hotkey.ts b/src/client/app/common/hotkey.ts new file mode 100644 index 0000000000..10cbeea543 --- /dev/null +++ b/src/client/app/common/hotkey.ts @@ -0,0 +1,79 @@ +import keyCode from './keycode'; + +const getKeyMap = keymap => Object.keys(keymap).map(input => { + const result = {} as any; + + const { keyup, keydown } = keymap[input]; + + input.split('+').forEach(keyName => { + switch (keyName.toLowerCase()) { + case 'ctrl': + case 'alt': + case 'shift': + case 'meta': + result[keyName] = true; + break; + default: + result.keyCode = keyCode(keyName); + } + }); + + result.callback = { + keydown: keydown || keymap[input], + keyup + }; + + return result; +}); + +const ignoreElemens = ['input', 'textarea']; + +export default { + install(Vue) { + Vue.directive('hotkey', { + bind(el, binding) { + el._hotkey_global = binding.modifiers.global === true; + + el._keymap = getKeyMap(binding.value); + + el.dataset.reservedKeyCodes = el._keymap.map(key => `'${key.keyCode}'`).join(' '); + + el._keyHandler = e => { + const reservedKeyCodes = document.activeElement ? ((document.activeElement as any).dataset || {}).reservedKeyCodes || '' : ''; + if (document.activeElement && ignoreElemens.some(el => document.activeElement.matches(el))) return; + + for (const hotkey of el._keymap) { + if (el._hotkey_global && reservedKeyCodes.includes(`'${e.keyCode}'`)) break; + + const callback = hotkey.keyCode === e.keyCode && + !!hotkey.ctrl === e.ctrlKey && + !!hotkey.alt === e.altKey && + !!hotkey.shift === e.shiftKey && + !!hotkey.meta === e.metaKey && + hotkey.callback[e.type]; + + if (callback) { + e.preventDefault(); + e.stopPropagation(); + callback(e); + } + } + }; + + if (el._hotkey_global) { + document.addEventListener('keydown', el._keyHandler); + } else { + el.addEventListener('keydown', el._keyHandler); + } + }, + + unbind(el) { + if (el._hotkey_global) { + document.removeEventListener('keydown', el._keyHandler); + } else { + el.removeEventListener('keydown', el._keyHandler); + } + } + }); + } +}; diff --git a/src/client/app/common/keycode.ts b/src/client/app/common/keycode.ts new file mode 100644 index 0000000000..c5ea6cb484 --- /dev/null +++ b/src/client/app/common/keycode.ts @@ -0,0 +1,139 @@ +export default searchInput => { + // Keyboard Events + if (searchInput && typeof searchInput === 'object') { + const hasKeyCode = searchInput.which || searchInput.keyCode || searchInput.charCode; + if (hasKeyCode) { + searchInput = hasKeyCode; + } + } + + // Numbers + // if (typeof searchInput === 'number') { + // return names[searchInput] + // } + + // Everything else (cast to string) + const search = String(searchInput); + + // check codes + const foundNamedKeyCodes = codes[search.toLowerCase()]; + if (foundNamedKeyCodes) { + return foundNamedKeyCodes; + } + + // check aliases + const foundNamedKeyAliases = aliases[search.toLowerCase()]; + if (foundNamedKeyAliases) { + return foundNamedKeyAliases; + } + + // weird character? + if (search.length === 1) { + return search.charCodeAt(0); + } + + return undefined; +}; + +/** + * Get by name + * + * exports.code['enter'] // => 13 + */ + +export const codes = { + 'backspace': 8, + 'tab': 9, + 'enter': 13, + 'shift': 16, + 'ctrl': 17, + 'alt': 18, + 'pause/break': 19, + 'caps lock': 20, + 'esc': 27, + 'space': 32, + 'page up': 33, + 'page down': 34, + 'end': 35, + 'home': 36, + 'left': 37, + 'up': 38, + 'right': 39, + 'down': 40, + // 'add': 43, + 'insert': 45, + 'delete': 46, + 'command': 91, + 'left command': 91, + 'right command': 93, + 'numpad *': 106, + // 'numpad +': 107, + 'numpad +': 43, + 'numpad add': 43, // as a trick + 'numpad -': 109, + 'numpad .': 110, + 'numpad /': 111, + 'num lock': 144, + 'scroll lock': 145, + 'my computer': 182, + 'my calculator': 183, + ';': 186, + '=': 187, + ',': 188, + '-': 189, + '.': 190, + '/': 191, + '`': 192, + '[': 219, + '\\': 220, + ']': 221, + "'": 222 +}; + +// Helper aliases + +export const aliases = { + 'windows': 91, + '⇧': 16, + '⌥': 18, + '⌃': 17, + '⌘': 91, + 'ctl': 17, + 'control': 17, + 'option': 18, + 'pause': 19, + 'break': 19, + 'caps': 20, + 'return': 13, + 'escape': 27, + 'spc': 32, + 'pgup': 33, + 'pgdn': 34, + 'ins': 45, + 'del': 46, + 'cmd': 91 +}; + +/*! +* Programatically add the following +*/ + +// lower case chars +for (let i = 97; i < 123; i++) { + codes[String.fromCharCode(i)] = i - 32; +} + +// numbers +for (let i = 48; i < 58; i++) { + codes[i - 48] = i; +} + +// function keys +for (let i = 1; i < 13; i++) { + codes['f' + i] = i + 111; +} + +// numpad keys +for (let i = 0; i < 10; i++) { + codes['numpad ' + i] = i + 96; +} diff --git a/src/client/app/common/views/components/reaction-picker.vue b/src/client/app/common/views/components/reaction-picker.vue index a4828c987b..58985658c6 100644 --- a/src/client/app/common/views/components/reaction-picker.vue +++ b/src/client/app/common/views/components/reaction-picker.vue @@ -1,5 +1,5 @@ <template> -<div class="mk-reaction-picker"> +<div class="mk-reaction-picker" v-hotkey.global="keymap"> <div class="backdrop" ref="backdrop" @click="close"></div> <div class="popover" :class="{ compact, big }" ref="popover"> <p v-if="!compact">{{ title }}</p> @@ -31,28 +31,51 @@ export default Vue.extend({ type: Object, required: true }, + source: { required: true }, + compact: { type: Boolean, required: false, default: false }, + cb: { required: false }, + big: { type: Boolean, required: false, default: false } }, + data() { return { title: placeholder }; }, + + computed: { + keymap(): any { + return { + '1': () => this.react('like'), + '2': () => this.react('love'), + '3': () => this.react('laugh'), + '4': () => this.react('hmm'), + '5': () => this.react('surprise'), + '6': () => this.react('congrats'), + '7': () => this.react('angry'), + '8': () => this.react('confused'), + '9': () => this.react('rip'), + '0': () => this.react('pudding'), + }; + } + }, + mounted() { this.$nextTick(() => { const popover = this.$refs.popover as any; @@ -88,6 +111,7 @@ export default Vue.extend({ }); }); }, + methods: { react(reaction) { (this as any).api('notes/reactions/create', { @@ -95,15 +119,19 @@ export default Vue.extend({ reaction: reaction }).then(() => { if (this.cb) this.cb(); + this.$emit('closed'); this.destroyDom(); }); }, + onMouseover(e) { this.title = e.target.title; }, + onMouseout(e) { this.title = placeholder; }, + close() { (this.$refs.backdrop as any).style.pointerEvents = 'none'; anime({ @@ -120,7 +148,10 @@ export default Vue.extend({ scale: 0.5, duration: 200, easing: 'easeInBack', - complete: () => this.destroyDom() + complete: () => { + this.$emit('closed'); + this.destroyDom(); + } }); } } diff --git a/src/client/app/desktop/views/components/choose-file-from-drive-window.vue b/src/client/app/desktop/views/components/choose-file-from-drive-window.vue index b894f0e109..933d31f299 100644 --- a/src/client/app/desktop/views/components/choose-file-from-drive-window.vue +++ b/src/client/app/desktop/views/components/choose-file-from-drive-window.vue @@ -1,5 +1,5 @@ <template> -<mk-window ref="window" is-modal width="800px" height="500px" @closed="$destroy"> +<mk-window ref="window" is-modal width="800px" height="500px" @closed="destroyDom"> <span slot="header"> <span v-html="title" :class="$style.title"></span> <span :class="$style.count" v-if="multiple && files.length > 0">({{ files.length }}%i18n:@choose-file%)</span> diff --git a/src/client/app/desktop/views/components/choose-folder-from-drive-window.vue b/src/client/app/desktop/views/components/choose-folder-from-drive-window.vue index 0c4643fdcb..03d6fd1636 100644 --- a/src/client/app/desktop/views/components/choose-folder-from-drive-window.vue +++ b/src/client/app/desktop/views/components/choose-folder-from-drive-window.vue @@ -1,5 +1,5 @@ <template> -<mk-window ref="window" is-modal width="800px" height="500px" @closed="$destroy"> +<mk-window ref="window" is-modal width="800px" height="500px" @closed="destroyDom"> <span slot="header"> <span v-html="title" :class="$style.title"></span> </span> diff --git a/src/client/app/desktop/views/components/drive-window.vue b/src/client/app/desktop/views/components/drive-window.vue index 1f45b64324..191579538d 100644 --- a/src/client/app/desktop/views/components/drive-window.vue +++ b/src/client/app/desktop/views/components/drive-window.vue @@ -1,5 +1,5 @@ <template> -<mk-window ref="window" @closed="$destroy" width="800px" height="500px" :popout-url="popout"> +<mk-window ref="window" @closed="destroyDom" width="800px" height="500px" :popout-url="popout"> <template slot="header"> <p v-if="usage" :class="$style.info"><b>{{ usage.toFixed(1) }}%</b> %i18n:@used%</p> <span :class="$style.title">%fa:cloud%%i18n:@drive%</span> diff --git a/src/client/app/desktop/views/components/followers-window.vue b/src/client/app/desktop/views/components/followers-window.vue index fdab7bc1ce..d5214adb2f 100644 --- a/src/client/app/desktop/views/components/followers-window.vue +++ b/src/client/app/desktop/views/components/followers-window.vue @@ -1,5 +1,5 @@ <template> -<mk-window width="400px" height="550px" @closed="$destroy"> +<mk-window width="400px" height="550px" @closed="destroyDom"> <span slot="header" :class="$style.header"> <img :src="user.avatarUrl" alt=""/>{{ '%i18n:@followers%'.replace('{}', name) }} </span> diff --git a/src/client/app/desktop/views/components/following-window.vue b/src/client/app/desktop/views/components/following-window.vue index 7cca833a82..aa9f2bde7b 100644 --- a/src/client/app/desktop/views/components/following-window.vue +++ b/src/client/app/desktop/views/components/following-window.vue @@ -1,5 +1,5 @@ <template> -<mk-window width="400px" height="550px" @closed="$destroy"> +<mk-window width="400px" height="550px" @closed="destroyDom"> <span slot="header" :class="$style.header"> <img :src="user.avatarUrl" alt=""/>{{ '%i18n:@following%'.replace('{}', name) }} </span> diff --git a/src/client/app/desktop/views/components/game-window.vue b/src/client/app/desktop/views/components/game-window.vue index 7c6cb9cd40..594eae58f8 100644 --- a/src/client/app/desktop/views/components/game-window.vue +++ b/src/client/app/desktop/views/components/game-window.vue @@ -1,5 +1,5 @@ <template> -<mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="$destroy"> +<mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="destroyDom"> <span slot="header" :class="$style.header">%fa:gamepad%%i18n:@game%</span> <mk-reversi :class="$style.content" @gamed="g => game = g"/> </mk-window> diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index d45cc82e13..79c9a9a517 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -237,6 +237,10 @@ export default Vue.extend({ warp(date) { (this.$refs.tl as any).warp(date); + }, + + focus() { + (this.$refs.tl as any).focus(); } } }); diff --git a/src/client/app/desktop/views/components/input-dialog.vue b/src/client/app/desktop/views/components/input-dialog.vue index e2cf4e48fd..cf7c09ea56 100644 --- a/src/client/app/desktop/views/components/input-dialog.vue +++ b/src/client/app/desktop/views/components/input-dialog.vue @@ -1,5 +1,5 @@ <template> -<mk-window ref="window" is-modal width="500px" @before-close="beforeClose" @closed="$destroy"> +<mk-window ref="window" is-modal width="500px" @before-close="beforeClose" @closed="destroyDom"> <span slot="header" :class="$style.header"> %fa:i-cursor%{{ title }} </span> diff --git a/src/client/app/desktop/views/components/messaging-room-window.vue b/src/client/app/desktop/views/components/messaging-room-window.vue index 41b421b0e7..3706377607 100644 --- a/src/client/app/desktop/views/components/messaging-room-window.vue +++ b/src/client/app/desktop/views/components/messaging-room-window.vue @@ -1,5 +1,5 @@ <template> -<mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="$destroy"> +<mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="destroyDom"> <span slot="header" :class="$style.header">%fa:comments%%i18n:@title% {{ user | userName }}</span> <mk-messaging-room :user="user" :class="$style.content"/> </mk-window> diff --git a/src/client/app/desktop/views/components/messaging-window.vue b/src/client/app/desktop/views/components/messaging-window.vue index 9580c5061d..a8f0fc68b9 100644 --- a/src/client/app/desktop/views/components/messaging-window.vue +++ b/src/client/app/desktop/views/components/messaging-window.vue @@ -1,5 +1,5 @@ <template> -<mk-window ref="window" width="500px" height="560px" @closed="$destroy"> +<mk-window ref="window" width="500px" height="560px" @closed="destroyDom"> <span slot="header" :class="$style.header">%fa:comments%%i18n:@title%</span> <mk-messaging :class="$style.content" @navigate="navigate"/> </mk-window> diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 46a866f9a7..fadf47e628 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -1,5 +1,5 @@ <template> -<div class="note" tabindex="-1" :title="title" @keydown="onKeydown"> +<div class="note" tabindex="-1" v-hotkey="keymap" :title="title"> <div class="reply-to" v-if="p.reply && (!$store.getters.isSignedIn || $store.state.settings.showReplyTarget)"> <x-sub :note="p.reply"/> </div> @@ -111,6 +111,18 @@ export default Vue.extend({ }, computed: { + keymap(): any { + return { + 'r': this.reply, + 'a': this.react, + 'n': this.renote, + 'up': this.focusBefore, + 'shift+tab': this.focusBefore, + 'down': this.focusAfter, + 'tab': this.focusAfter, + }; + }, + isRenote(): boolean { return (this.note.renote && this.note.text == null && @@ -223,64 +235,39 @@ export default Vue.extend({ reply() { (this as any).os.new(MkPostFormWindow, { reply: this.p - }); + }).$once('closed', this.focus); }, renote() { (this as any).os.new(MkRenoteFormWindow, { note: this.p - }); + }).$once('closed', this.focus); }, react() { (this as any).os.new(MkReactionPicker, { source: this.$refs.reactButton, note: this.p - }); + }).$once('closed', this.focus); }, menu() { (this as any).os.new(MkNoteMenu, { source: this.$refs.menuButton, note: this.p - }); + }).$once('closed', this.focus); }, - onKeydown(e) { - let shouldBeCancel = true; + focus() { + this.$el.focus(); + }, - switch (true) { - case e.which == 38: // [↑] - case e.which == 74: // [j] - case e.which == 9 && e.shiftKey: // [Shift] + [Tab] - focus(this.$el, e => e.previousElementSibling); - break; + focusBefore() { + focus(this.$el, e => e.previousElementSibling); + }, - case e.which == 40: // [↓] - case e.which == 75: // [k] - case e.which == 9: // [Tab] - focus(this.$el, e => e.nextElementSibling); - break; - - case e.which == 81: // [q] - case e.which == 69: // [e] - this.renote(); - break; - - case e.which == 70: // [f] - case e.which == 76: // [l] - //this.like(); - break; - - case e.which == 82: // [r] - this.reply(); - break; - - default: - shouldBeCancel = false; - } - - if (shouldBeCancel) e.preventDefault(); + focusAfter() { + focus(this.$el, e => e.nextElementSibling); } } }); diff --git a/src/client/app/desktop/views/components/notes.vue b/src/client/app/desktop/views/components/notes.vue index ec9aa285d0..469f62c080 100644 --- a/src/client/app/desktop/views/components/notes.vue +++ b/src/client/app/desktop/views/components/notes.vue @@ -12,7 +12,7 @@ <!-- トランジションを有効にするとなぜかメモリリークする --> <component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notes" class="notes transition" tag="div"> <template v-for="(note, i) in _notes"> - <x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)"/> + <x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)" ref="note"/> <p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date"> <span>%fa:angle-up%{{ note._datetext }}</span> <span>%fa:angle-down%{{ _notes[i + 1]._datetext }}</span> @@ -89,7 +89,7 @@ export default Vue.extend({ }, focus() { - (this.$el as any).children[0].focus(); + (this.$refs.note as any)[0].focus(); }, onNoteUpdated(i, note) { diff --git a/src/client/app/desktop/views/components/post-form-window.vue b/src/client/app/desktop/views/components/post-form-window.vue index a88c96d1bf..ade84f6bb9 100644 --- a/src/client/app/desktop/views/components/post-form-window.vue +++ b/src/client/app/desktop/views/components/post-form-window.vue @@ -1,5 +1,5 @@ <template> -<mk-window class="mk-post-form-window" ref="window" is-modal @closed="$destroy"> +<mk-window class="mk-post-form-window" ref="window" is-modal @closed="onWindowClosed"> <span slot="header" class="mk-post-form-window--header"> <span class="icon" v-if="geo">%fa:map-marker-alt%</span> <span v-if="!reply">%i18n:@note%</span> @@ -53,6 +53,10 @@ export default Vue.extend({ }, onPosted() { (this.$refs.window as any).close(); + }, + onWindowClosed() { + this.$emit('closed'); + this.destroyDom(); } } }); diff --git a/src/client/app/desktop/views/components/progress-dialog.vue b/src/client/app/desktop/views/components/progress-dialog.vue index 2f59733d99..cc25ba8e30 100644 --- a/src/client/app/desktop/views/components/progress-dialog.vue +++ b/src/client/app/desktop/views/components/progress-dialog.vue @@ -1,5 +1,5 @@ <template> -<mk-window ref="window" :is-modal="false" :can-close="false" width="500px" @closed="$destroy"> +<mk-window ref="window" :is-modal="false" :can-close="false" width="500px" @closed="destroyDom"> <span slot="header">{{ title }}<mk-ellipsis/></span> <div :class="$style.body"> <p :class="$style.init" v-if="isNaN(value)">%i18n:@waiting%<mk-ellipsis/></p> diff --git a/src/client/app/desktop/views/components/received-follow-requests-window.vue b/src/client/app/desktop/views/components/received-follow-requests-window.vue index 26b7ec2590..d8a94f6cbe 100644 --- a/src/client/app/desktop/views/components/received-follow-requests-window.vue +++ b/src/client/app/desktop/views/components/received-follow-requests-window.vue @@ -1,5 +1,5 @@ <template> -<mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy"> +<mk-window ref="window" is-modal width="450px" height="500px" @closed="destroyDom"> <span slot="header">%fa:envelope R% %i18n:@title%</span> <div class="slpqaxdoxhvglersgjukmvizkqbmbokc" :data-darkmode="$store.state.device.darkmode"> diff --git a/src/client/app/desktop/views/components/renote-form-window.vue b/src/client/app/desktop/views/components/renote-form-window.vue index df9d2f7fc7..6c9cb59d4a 100644 --- a/src/client/app/desktop/views/components/renote-form-window.vue +++ b/src/client/app/desktop/views/components/renote-form-window.vue @@ -1,7 +1,7 @@ <template> -<mk-window ref="window" is-modal @closed="$destroy"> +<mk-window ref="window" is-modal @closed="onWindowClosed"> <span slot="header" :class="$style.header">%fa:retweet%%i18n:@title%</span> - <mk-renote-form ref="form" :note="note" @posted="onPosted" @canceled="onCanceled"/> + <mk-renote-form ref="form" :note="note" @posted="onPosted" @canceled="onCanceled" v-hotkey.global="keymap"/> </mk-window> </template> @@ -10,25 +10,32 @@ import Vue from 'vue'; export default Vue.extend({ props: ['note'], - mounted() { - document.addEventListener('keydown', this.onDocumentKeydown); - }, - beforeDestroy() { - document.removeEventListener('keydown', this.onDocumentKeydown); + + computed: { + keymap(): any { + return { + 'esc': this.close, + 'ctrl+enter': this.post + }; + } }, + methods: { - onDocumentKeydown(e) { - if (e.target.tagName != 'INPUT' && e.target.tagName != 'TEXTAREA') { - if (e.which == 27) { // Esc - (this.$refs.window as any).close(); - } - } + post() { + (this.$refs.form as any).ok(); + }, + close() { + (this.$refs.window as any).close(); }, onPosted() { (this.$refs.window as any).close(); }, onCanceled() { (this.$refs.window as any).close(); + }, + onWindowClosed() { + this.$emit('closed'); + this.destroyDom(); } } }); diff --git a/src/client/app/desktop/views/components/settings-window.vue b/src/client/app/desktop/views/components/settings-window.vue index b4cc570282..4247717748 100644 --- a/src/client/app/desktop/views/components/settings-window.vue +++ b/src/client/app/desktop/views/components/settings-window.vue @@ -1,5 +1,5 @@ <template> -<mk-window ref="window" is-modal width="700px" height="550px" @closed="$destroy"> +<mk-window ref="window" is-modal width="700px" height="550px" @closed="destroyDom"> <span slot="header" :class="$style.header">%fa:cog%%i18n:@settings%</span> <mk-settings :initial-page="initialPage" @done="close"/> </mk-window> diff --git a/src/client/app/desktop/views/components/timeline.core.vue b/src/client/app/desktop/views/components/timeline.core.vue index c8aa36f171..ff73bde95c 100644 --- a/src/client/app/desktop/views/components/timeline.core.vue +++ b/src/client/app/desktop/views/components/timeline.core.vue @@ -152,14 +152,11 @@ export default Vue.extend({ }); } - document.addEventListener('keydown', this.onKeydown); - this.fetch(); }, beforeDestroy() { this.$emit('beforeDestroy'); - document.removeEventListener('keydown', this.onKeydown); }, methods: { @@ -212,14 +209,6 @@ export default Vue.extend({ warp(date) { this.date = date; this.fetch(); - }, - - onKeydown(e) { - if (e.target.tagName != 'INPUT' && e.target.tagName != 'TEXTAREA') { - if (e.which == 84) { // t - this.focus(); - } - } } } }); diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue index ccc35f95ff..9f421a68ed 100644 --- a/src/client/app/desktop/views/components/timeline.vue +++ b/src/client/app/desktop/views/components/timeline.vue @@ -92,6 +92,10 @@ export default Vue.extend({ }); }, + focus() { + (this.$refs.tl as any).focus(); + }, + warp(date) { (this.$refs.tl as any).warp(date); }, diff --git a/src/client/app/desktop/views/components/ui.vue b/src/client/app/desktop/views/components/ui.vue index d410c3d980..a28cb3029e 100644 --- a/src/client/app/desktop/views/components/ui.vue +++ b/src/client/app/desktop/views/components/ui.vue @@ -1,5 +1,5 @@ <template> -<div class="mk-ui" :style="style"> +<div class="mk-ui" :style="style" v-hotkey.global="keymap"> <x-header class="header" v-show="!zenMode"/> <div class="content"> <slot></slot> @@ -16,11 +16,13 @@ export default Vue.extend({ components: { XHeader }, + data() { return { zenMode: false }; }, + computed: { style(): any { if (!this.$store.getters.isSignedIn || this.$store.state.i.wallpaperUrl == null) return {}; @@ -28,27 +30,24 @@ export default Vue.extend({ backgroundColor: this.$store.state.i.wallpaperColor && this.$store.state.i.wallpaperColor.length == 3 ? `rgb(${ this.$store.state.i.wallpaperColor.join(',') })` : null, backgroundImage: `url(${ this.$store.state.i.wallpaperUrl })` }; + }, + + keymap(): any { + return { + 'p': this.post, + 'n': this.post, + 'z': this.toggleZenMode + }; } }, - mounted() { - document.addEventListener('keydown', this.onKeydown); - }, - beforeDestroy() { - document.removeEventListener('keydown', this.onKeydown); - }, + methods: { - onKeydown(e) { - if (e.target.tagName == 'INPUT' || e.target.tagName == 'TEXTAREA') return; + post() { + (this as any).apis.post(); + }, - if (e.which == 80 || e.which == 78) { // p or n - e.preventDefault(); - (this as any).apis.post(); - } - - if (e.which == 90) { // z - e.preventDefault(); - this.zenMode = !this.zenMode; - } + toggleZenMode() { + this.zenMode = !this.zenMode; } } }); diff --git a/src/client/app/desktop/views/components/user-lists-window.vue b/src/client/app/desktop/views/components/user-lists-window.vue index 72ae9cf4e4..75253e0788 100644 --- a/src/client/app/desktop/views/components/user-lists-window.vue +++ b/src/client/app/desktop/views/components/user-lists-window.vue @@ -1,5 +1,5 @@ <template> -<mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy"> +<mk-window ref="window" is-modal width="450px" height="500px" @closed="destroyDom"> <span slot="header">%fa:list% %i18n:@title%</span> <div class="xkxvokkjlptzyewouewmceqcxhpgzprp" :data-darkmode="$store.state.device.darkmode"> diff --git a/src/client/app/desktop/views/components/window.vue b/src/client/app/desktop/views/components/window.vue index 30f0ec558f..e6886956eb 100644 --- a/src/client/app/desktop/views/components/window.vue +++ b/src/client/app/desktop/views/components/window.vue @@ -190,8 +190,8 @@ export default Vue.extend({ }); setTimeout(() => { - this.destroyDom(); this.$emit('closed'); + this.destroyDom(); }, 300); }, diff --git a/src/client/app/desktop/views/pages/home.vue b/src/client/app/desktop/views/pages/home.vue index c7ff0904e0..e595ef4c36 100644 --- a/src/client/app/desktop/views/pages/home.vue +++ b/src/client/app/desktop/views/pages/home.vue @@ -1,6 +1,6 @@ <template> <mk-ui> - <mk-home :mode="mode" @loaded="loaded"/> + <mk-home :mode="mode" @loaded="loaded" ref="home" v-hotkey.global="keymap"/> </mk-ui> </template> @@ -15,6 +15,13 @@ export default Vue.extend({ default: 'timeline' } }, + computed: { + keymap(): any { + return { + 't': this.focus + }; + } + }, mounted() { document.title = (this as any).os.instanceName; @@ -23,6 +30,9 @@ export default Vue.extend({ methods: { loaded() { Progress.done(); + }, + focus() { + this.$refs.home.focus(); } } }); diff --git a/src/client/app/init.ts b/src/client/app/init.ts index db3852da60..3a03f8492e 100644 --- a/src/client/app/init.ts +++ b/src/client/app/init.ts @@ -8,6 +8,7 @@ import VueRouter from 'vue-router'; import * as TreeView from 'vue-json-tree-view'; import VAnimateCss from 'v-animate-css'; import VModal from 'vue-js-modal'; +import VueHotkey from './common/hotkey'; import App from './app.vue'; import checkForUpdate from './common/scripts/check-for-update'; @@ -19,6 +20,7 @@ Vue.use(VueRouter); Vue.use(TreeView); Vue.use(VAnimateCss); Vue.use(VModal); +Vue.use(VueHotkey); // Register global directives require('./common/views/directives'); From 908872f374cec5f1bab5a36a33000348f0e54765 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 05:36:14 +0900 Subject: [PATCH 292/539] 8.47.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d5df0c69ca..992635cff3 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.46.0", - "clientVersion": "1.0.9851", + "version": "8.47.0", + "clientVersion": "1.0.9873", "codename": "nighthike", "main": "./built/index.js", "private": true, From fcea9dacb7c94296e875c2bfe92d671468718050 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 06:20:49 +0900 Subject: [PATCH 293/539] Clean up: Remove unused import --- src/client/app/desktop/views/pages/user/user.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/client/app/desktop/views/pages/user/user.vue b/src/client/app/desktop/views/pages/user/user.vue index afb5e674d9..28ccd78074 100644 --- a/src/client/app/desktop/views/pages/user/user.vue +++ b/src/client/app/desktop/views/pages/user/user.vue @@ -28,7 +28,6 @@ <script lang="ts"> import Vue from 'vue'; import parseAcct from '../../../../../../misc/acct/parse'; -import getUserName from '../../../../../../misc/get-user-name'; import Progress from '../../../../common/scripts/loading'; import XHeader from './user.header.vue'; import XTimeline from './user.timeline.vue'; From 1f2ebce8ed749d7e81e999944fc8a22ff39b87b7 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 06:29:47 +0900 Subject: [PATCH 294/539] Resolve #1302 --- .../app/desktop/views/pages/user/user.vue | 2 +- .../app/mobile/views/pages/user/home.vue | 2 +- src/docs/api/entities/user.yaml | 8 ++--- src/models/user.ts | 32 ++++++++++++++++--- src/server/api/endpoints/i/pin.ts | 14 +++++++- 5 files changed, 46 insertions(+), 12 deletions(-) diff --git a/src/client/app/desktop/views/pages/user/user.vue b/src/client/app/desktop/views/pages/user/user.vue index 28ccd78074..89dbd41b84 100644 --- a/src/client/app/desktop/views/pages/user/user.vue +++ b/src/client/app/desktop/views/pages/user/user.vue @@ -6,7 +6,7 @@ <main> <div class="main"> <x-header :user="user"/> - <mk-note-detail v-if="user.pinnedNote" :note="user.pinnedNote" :compact="true"/> + <mk-note-detail v-for="n in user.pinnedNotes" :key="n.id" :note="n" :compact="true"/> <x-timeline class="timeline" ref="tl" :user="user"/> </div> <div class="side"> diff --git a/src/client/app/mobile/views/pages/user/home.vue b/src/client/app/mobile/views/pages/user/home.vue index 8b57276b17..4118afef19 100644 --- a/src/client/app/mobile/views/pages/user/home.vue +++ b/src/client/app/mobile/views/pages/user/home.vue @@ -1,6 +1,6 @@ <template> <div class="root home"> - <mk-note-detail v-if="user.pinnedNote" :note="user.pinnedNote" :compact="true"/> + <mk-note-detail v-for="n in user.pinnedNotes" :key="n.id" :note="n" :compact="true"/> <section class="recent-notes"> <h2>%fa:R comments%%i18n:@recent-notes%</h2> <div> diff --git a/src/docs/api/entities/user.yaml b/src/docs/api/entities/user.yaml index c90b55ee88..e3755d8585 100644 --- a/src/docs/api/entities/user.yaml +++ b/src/docs/api/entities/user.yaml @@ -101,15 +101,15 @@ props: ja-JP: "投稿の数" en-US: "The number of the notes of this user" - pinnedNote: - type: "entity(Note)" + pinnedNotes: + type: "entity(Note)[]" optional: true desc: ja-JP: "ピン留めされた投稿" en-US: "The pinned note of this user" - pinnedNoteId: - type: "id(Note)" + pinnedNoteIds: + type: "id(Note)[]" optional: true desc: ja-JP: "ピン留めされた投稿のID" diff --git a/src/models/user.ts b/src/models/user.ts index 64197c91c2..b595fa8d71 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -35,6 +35,28 @@ User.createIndex('uri', { sparse: true, unique: true }); export default User; +// 後方互換性のため +User.findOne({ + pinnedNoteId: { $exists: true } +}).then(async x => { + if (x == null) return; + + const users = await User.find({ + pinnedNoteId: { $exists: true } + }); + + users.forEach(u => { + User.update({ _id: u._id }, { + $set: { + pinnedNoteIds: [(u as any).pinnedNoteId] + }, + $unset: { + pinnedNoteId: '' + } + }); + }); +}); + type IUserBase = { _id: mongo.ObjectID; createdAt: Date; @@ -53,7 +75,7 @@ type IUserBase = { wallpaperUrl?: string; data: any; description: string; - pinnedNoteId: mongo.ObjectID; + pinnedNoteIds: mongo.ObjectID[]; /** * 凍結されているか否か @@ -464,11 +486,11 @@ export const pack = ( } if (opts.detail) { - if (_user.pinnedNoteId) { - // Populate pinned note - _user.pinnedNote = packNote(_user.pinnedNoteId, meId, { + if (_user.pinnedNoteIds) { + // Populate pinned notes + _user.pinnedNotes = Promise.all(_user.pinnedNoteIds.map((id: mongo.ObjectId) => packNote(id, meId, { detail: true - }); + }))); } if (meId && !meId.equals(_user.id)) { diff --git a/src/server/api/endpoints/i/pin.ts b/src/server/api/endpoints/i/pin.ts index ae03a86336..8804d5aa70 100644 --- a/src/server/api/endpoints/i/pin.ts +++ b/src/server/api/endpoints/i/pin.ts @@ -21,9 +21,21 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res, return rej('note not found'); } + const pinnedNoteIds = user.pinnedNoteIds || []; + + if (pinnedNoteIds.some(id => id.equals(note._id))) { + return rej('already exists'); + } + + pinnedNoteIds.unshift(note._id); + + if (pinnedNoteIds.length > 5) { + pinnedNoteIds.pop(); + } + await User.update(user._id, { $set: { - pinnedNoteId: note._id + pinnedNoteIds: pinnedNoteIds } }); From 2a4c53c3a415e38783316e37ba7a2eab69068d75 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 06:30:52 +0900 Subject: [PATCH 295/539] 8.48.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 992635cff3..685293f526 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.47.0", - "clientVersion": "1.0.9873", + "version": "8.48.0", + "clientVersion": "1.0.9876", "codename": "nighthike", "main": "./built/index.js", "private": true, From 19c72627fc6e9f3c89b649b2f88bf5e066961e7a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 08:19:45 +0900 Subject: [PATCH 296/539] Improve keyboard shortcut --- .../app/common/views/components/reaction-picker.vue | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/client/app/common/views/components/reaction-picker.vue b/src/client/app/common/views/components/reaction-picker.vue index 58985658c6..c329241d8a 100644 --- a/src/client/app/common/views/components/reaction-picker.vue +++ b/src/client/app/common/views/components/reaction-picker.vue @@ -62,16 +62,27 @@ export default Vue.extend({ computed: { keymap(): any { return { + 'esc': this.close, '1': () => this.react('like'), + 'numpad 1': () => this.react('like'), '2': () => this.react('love'), + 'numpad 2': () => this.react('love'), '3': () => this.react('laugh'), + 'numpad 3': () => this.react('laugh'), '4': () => this.react('hmm'), + 'numpad 4': () => this.react('hmm'), '5': () => this.react('surprise'), + 'numpad 5': () => this.react('surprise'), '6': () => this.react('congrats'), + 'numpad 6': () => this.react('congrats'), '7': () => this.react('angry'), + 'numpad 7': () => this.react('angry'), '8': () => this.react('confused'), + 'numpad 8': () => this.react('confused'), '9': () => this.react('rip'), + 'numpad 9': () => this.react('rip'), '0': () => this.react('pudding'), + 'numpad 0': () => this.react('pudding'), }; } }, From 55e2ae1408e056295d37681814b62f24a50a617e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 09:11:52 +0900 Subject: [PATCH 297/539] Improve usability --- src/client/app/common/hotkey.ts | 6 +- src/client/app/common/keycode.ts | 3 +- .../views/components/reaction-picker.vue | 61 ++++++++++++++++++- .../desktop/views/components/notes.note.vue | 15 +++-- 4 files changed, 75 insertions(+), 10 deletions(-) diff --git a/src/client/app/common/hotkey.ts b/src/client/app/common/hotkey.ts index 10cbeea543..62726887d1 100644 --- a/src/client/app/common/hotkey.ts +++ b/src/client/app/common/hotkey.ts @@ -13,8 +13,10 @@ const getKeyMap = keymap => Object.keys(keymap).map(input => { case 'meta': result[keyName] = true; break; - default: + default: { result.keyCode = keyCode(keyName); + if (!Array.isArray(result.keyCode)) result.keyCode = [result.keyCode]; + } } }); @@ -45,7 +47,7 @@ export default { for (const hotkey of el._keymap) { if (el._hotkey_global && reservedKeyCodes.includes(`'${e.keyCode}'`)) break; - const callback = hotkey.keyCode === e.keyCode && + const callback = hotkey.keyCode.includes(e.keyCode) && !!hotkey.ctrl === e.ctrlKey && !!hotkey.alt === e.altKey && !!hotkey.shift === e.shiftKey && diff --git a/src/client/app/common/keycode.ts b/src/client/app/common/keycode.ts index c5ea6cb484..0324a5389a 100644 --- a/src/client/app/common/keycode.ts +++ b/src/client/app/common/keycode.ts @@ -67,8 +67,7 @@ export const codes = { 'left command': 91, 'right command': 93, 'numpad *': 106, - // 'numpad +': 107, - 'numpad +': 43, + 'numpad plus': [43, 107], 'numpad add': 43, // as a trick 'numpad -': 109, 'numpad .': 110, diff --git a/src/client/app/common/views/components/reaction-picker.vue b/src/client/app/common/views/components/reaction-picker.vue index c329241d8a..4e27fb36e3 100644 --- a/src/client/app/common/views/components/reaction-picker.vue +++ b/src/client/app/common/views/components/reaction-picker.vue @@ -3,7 +3,7 @@ <div class="backdrop" ref="backdrop" @click="close"></div> <div class="popover" :class="{ compact, big }" ref="popover"> <p v-if="!compact">{{ title }}</p> - <div> + <div ref="buttons" :class="{ showFocus }"> <button @click="react('like')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="1" title="%i18n:common.reactions.like%"><mk-reaction-icon reaction='like'/></button> <button @click="react('love')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="2" title="%i18n:common.reactions.love%"><mk-reaction-icon reaction='love'/></button> <button @click="react('laugh')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="3" title="%i18n:common.reactions.laugh%"><mk-reaction-icon reaction='laugh'/></button> @@ -50,12 +50,19 @@ export default Vue.extend({ type: Boolean, required: false, default: false + }, + + showFocus: { + type: Boolean, + required: false, + default: false } }, data() { return { - title: placeholder + title: placeholder, + focus: null }; }, @@ -63,6 +70,9 @@ export default Vue.extend({ keymap(): any { return { 'esc': this.close, + 'enter': this.choose, + 'space': this.choose, + 'numpad plus': this.choose, '1': () => this.react('like'), 'numpad 1': () => this.react('like'), '2': () => this.react('love'), @@ -83,12 +93,24 @@ export default Vue.extend({ 'numpad 9': () => this.react('rip'), '0': () => this.react('pudding'), 'numpad 0': () => this.react('pudding'), + 'up': this.focusUp, + 'right': this.focusRight, + 'down': this.focusDown, + 'left': this.focusLeft, }; } }, + watch: { + focus(i) { + this.$refs.buttons.childNodes[i].focus(); + } + }, + mounted() { this.$nextTick(() => { + this.focus = 0; + const popover = this.$refs.popover as any; const rect = this.source.getBoundingClientRect(); @@ -164,6 +186,26 @@ export default Vue.extend({ this.destroyDom(); } }); + }, + + focusUp() { + this.focus = this.focus == 0 ? 9 : this.focus < 5 ? (this.focus + 4) : (this.focus - 5); + }, + + focusDown() { + this.focus = this.focus == 9 ? 0 : this.focus >= 5 ? (this.focus - 4) : (this.focus + 5); + }, + + focusRight() { + this.focus = this.focus == 9 ? 0 : (this.focus + 1); + }, + + focusLeft() { + this.focus = this.focus == 0 ? 9 : (this.focus - 1); + }, + + choose() { + this.$refs.buttons.childNodes[this.focus].click(); } } }); @@ -249,6 +291,21 @@ root(isDark) width 240px text-align center + &.showFocus + > button:focus + z-index 1 + + &:after + content "" + pointer-events none + position absolute + top 0 + right 0 + bottom 0 + left 0 + border 2px solid rgba($theme-color, 0.3) + border-radius 4px + > button padding 0 width 40px diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index fadf47e628..b8c5f31511 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -48,7 +48,7 @@ <button class="renoteButton" @click="renote" title="%i18n:@renote%"> %fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p> </button> - <button class="reactionButton" :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%"> + <button class="reactionButton" :class="{ reacted: p.myReaction != null }" @click="react()" ref="reactButton" title="%i18n:@add-reaction%"> %fa:plus%<p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p> </button> <button @click="menu" ref="menuButton"> @@ -114,7 +114,8 @@ export default Vue.extend({ keymap(): any { return { 'r': this.reply, - 'a': this.react, + 'a': () => this.react(true), + 'numpad plus': () => this.react(true), 'n': this.renote, 'up': this.focusBefore, 'shift+tab': this.focusBefore, @@ -244,10 +245,12 @@ export default Vue.extend({ }).$once('closed', this.focus); }, - react() { + react(viaKeyboard = false) { + this.blur(); (this as any).os.new(MkReactionPicker, { source: this.$refs.reactButton, - note: this.p + note: this.p, + showFocus: viaKeyboard }).$once('closed', this.focus); }, @@ -262,6 +265,10 @@ export default Vue.extend({ this.$el.focus(); }, + blur() { + this.$el.blur(); + }, + focusBefore() { focus(this.$el, e => e.previousElementSibling); }, From f66c31c771d31678472dde87712c7109532c930f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 09:20:06 +0900 Subject: [PATCH 298/539] Improve usability & refactoring --- src/client/app/common/keycode.ts | 7 +--- .../views/components/reaction-picker.vue | 34 ++++++++----------- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/src/client/app/common/keycode.ts b/src/client/app/common/keycode.ts index 0324a5389a..55043ad76b 100644 --- a/src/client/app/common/keycode.ts +++ b/src/client/app/common/keycode.ts @@ -124,15 +124,10 @@ for (let i = 97; i < 123; i++) { // numbers for (let i = 48; i < 58; i++) { - codes[i - 48] = i; + codes[i - 48] = [i, (i - 48) + 96]; } // function keys for (let i = 1; i < 13; i++) { codes['f' + i] = i + 111; } - -// numpad keys -for (let i = 0; i < 10; i++) { - codes['numpad ' + i] = i + 96; -} diff --git a/src/client/app/common/views/components/reaction-picker.vue b/src/client/app/common/views/components/reaction-picker.vue index 4e27fb36e3..f415e89d0e 100644 --- a/src/client/app/common/views/components/reaction-picker.vue +++ b/src/client/app/common/views/components/reaction-picker.vue @@ -73,30 +73,20 @@ export default Vue.extend({ 'enter': this.choose, 'space': this.choose, 'numpad plus': this.choose, - '1': () => this.react('like'), - 'numpad 1': () => this.react('like'), - '2': () => this.react('love'), - 'numpad 2': () => this.react('love'), - '3': () => this.react('laugh'), - 'numpad 3': () => this.react('laugh'), - '4': () => this.react('hmm'), - 'numpad 4': () => this.react('hmm'), - '5': () => this.react('surprise'), - 'numpad 5': () => this.react('surprise'), - '6': () => this.react('congrats'), - 'numpad 6': () => this.react('congrats'), - '7': () => this.react('angry'), - 'numpad 7': () => this.react('angry'), - '8': () => this.react('confused'), - 'numpad 8': () => this.react('confused'), - '9': () => this.react('rip'), - 'numpad 9': () => this.react('rip'), - '0': () => this.react('pudding'), - 'numpad 0': () => this.react('pudding'), 'up': this.focusUp, 'right': this.focusRight, 'down': this.focusDown, 'left': this.focusLeft, + '1': () => this.react('like'), + '2': () => this.react('love'), + '3': () => this.react('laugh'), + '4': () => this.react('hmm'), + '5': () => this.react('surprise'), + '6': () => this.react('congrats'), + '7': () => this.react('angry'), + '8': () => this.react('confused'), + '9': () => this.react('rip'), + '0': () => this.react('pudding'), }; } }, @@ -104,6 +94,10 @@ export default Vue.extend({ watch: { focus(i) { this.$refs.buttons.childNodes[i].focus(); + + if (this.showFocus) { + this.title = this.$refs.buttons.childNodes[i].title; + } } }, From dc8f592c1f926b2393c27f1cdfc6f02d5078dbd8 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 09:21:02 +0900 Subject: [PATCH 299/539] 8.49.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 685293f526..64023ea980 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.48.0", - "clientVersion": "1.0.9876", + "version": "8.49.0", + "clientVersion": "1.0.9880", "codename": "nighthike", "main": "./built/index.js", "private": true, From 6ed3f9e41478b59bd27a3b8ae930091430b85e5b Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 12:34:41 +0900 Subject: [PATCH 300/539] =?UTF-8?q?=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF?= =?UTF-8?q?=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0=E3=81=AA=E3=81=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/app/common/hotkey.ts | 94 +++++++----- src/client/app/common/keycode.ts | 134 +++--------------- .../views/components/reaction-picker.vue | 2 +- .../desktop/views/components/notes.note.vue | 2 +- 4 files changed, 78 insertions(+), 154 deletions(-) diff --git a/src/client/app/common/hotkey.ts b/src/client/app/common/hotkey.ts index 62726887d1..66336fca6e 100644 --- a/src/client/app/common/hotkey.ts +++ b/src/client/app/common/hotkey.ts @@ -1,29 +1,42 @@ import keyCode from './keycode'; +import { concat } from '../../../prelude/array'; -const getKeyMap = keymap => Object.keys(keymap).map(input => { - const result = {} as any; +type pattern = { + which: string[]; + ctrl?: boolean; + shift?: boolean; + alt?: boolean; +}; - const { keyup, keydown } = keymap[input]; +type action = { + patterns: pattern[]; - input.split('+').forEach(keyName => { - switch (keyName.toLowerCase()) { - case 'ctrl': - case 'alt': - case 'shift': - case 'meta': - result[keyName] = true; - break; - default: { - result.keyCode = keyCode(keyName); - if (!Array.isArray(result.keyCode)) result.keyCode = [result.keyCode]; + callback: Function; +}; + +const getKeyMap = keymap => Object.entries(keymap).map(([patterns, callback]): action => { + const result = { + patterns: [], + callback: callback + } as action; + + result.patterns = patterns.split('|').map(part => { + const pattern = { + which: [] + } as pattern; + + part.trim().split('+').forEach(key => { + key = key.trim().toLowerCase(); + switch (key) { + case 'ctrl': pattern.ctrl = true; break; + case 'alt': pattern.alt = true; break; + case 'shift': pattern.shift = true; break; + default: pattern.which = keyCode(key).map(k => k.toLowerCase()); } - } - }); + }); - result.callback = { - keydown: keydown || keymap[input], - keyup - }; + return pattern; + }); return result; }); @@ -36,28 +49,39 @@ export default { bind(el, binding) { el._hotkey_global = binding.modifiers.global === true; - el._keymap = getKeyMap(binding.value); + const actions = getKeyMap(binding.value); - el.dataset.reservedKeyCodes = el._keymap.map(key => `'${key.keyCode}'`).join(' '); + const reservedKeys = concat(actions.map(a => a.patterns.map(p => p.which))); + + el.dataset.reservedKeys = reservedKeys.map(key => `'${key}'`).join(' '); el._keyHandler = e => { - const reservedKeyCodes = document.activeElement ? ((document.activeElement as any).dataset || {}).reservedKeyCodes || '' : ''; + const key = e.code.toLowerCase(); + + const targetReservedKeys = document.activeElement ? ((document.activeElement as any).dataset || {}).reservedKeys || '' : ''; if (document.activeElement && ignoreElemens.some(el => document.activeElement.matches(el))) return; - for (const hotkey of el._keymap) { - if (el._hotkey_global && reservedKeyCodes.includes(`'${e.keyCode}'`)) break; + for (const action of actions) { + if (el._hotkey_global && targetReservedKeys.includes(`'${key}'`)) break; - const callback = hotkey.keyCode.includes(e.keyCode) && - !!hotkey.ctrl === e.ctrlKey && - !!hotkey.alt === e.altKey && - !!hotkey.shift === e.shiftKey && - !!hotkey.meta === e.metaKey && - hotkey.callback[e.type]; + const matched = action.patterns.some(pattern => { + let matched = pattern.which.includes(key); + if (pattern.ctrl && !e.ctrlKey) matched = false; + if (pattern.shift && !e.shiftKey) matched = false; + if (pattern.alt && !e.altKey) matched = false; - if (callback) { - e.preventDefault(); - e.stopPropagation(); - callback(e); + if (matched) { + e.preventDefault(); + e.stopPropagation(); + action.callback(e); + return true; + } else { + return false; + } + }); + + if (matched) { + break; } } }; diff --git a/src/client/app/common/keycode.ts b/src/client/app/common/keycode.ts index 55043ad76b..5786c1dc0a 100644 --- a/src/client/app/common/keycode.ts +++ b/src/client/app/common/keycode.ts @@ -1,116 +1,20 @@ -export default searchInput => { - // Keyboard Events - if (searchInput && typeof searchInput === 'object') { - const hasKeyCode = searchInput.which || searchInput.keyCode || searchInput.charCode; - if (hasKeyCode) { - searchInput = hasKeyCode; - } +export default (input: string): string[] => { + if (Object.keys(aliases).some(a => a.toLowerCase() == input.toLowerCase())) { + const codes = aliases[input]; + return Array.isArray(codes) ? codes : [codes]; + } else { + return [input]; } - - // Numbers - // if (typeof searchInput === 'number') { - // return names[searchInput] - // } - - // Everything else (cast to string) - const search = String(searchInput); - - // check codes - const foundNamedKeyCodes = codes[search.toLowerCase()]; - if (foundNamedKeyCodes) { - return foundNamedKeyCodes; - } - - // check aliases - const foundNamedKeyAliases = aliases[search.toLowerCase()]; - if (foundNamedKeyAliases) { - return foundNamedKeyAliases; - } - - // weird character? - if (search.length === 1) { - return search.charCodeAt(0); - } - - return undefined; }; -/** - * Get by name - * - * exports.code['enter'] // => 13 - */ - -export const codes = { - 'backspace': 8, - 'tab': 9, - 'enter': 13, - 'shift': 16, - 'ctrl': 17, - 'alt': 18, - 'pause/break': 19, - 'caps lock': 20, - 'esc': 27, - 'space': 32, - 'page up': 33, - 'page down': 34, - 'end': 35, - 'home': 36, - 'left': 37, - 'up': 38, - 'right': 39, - 'down': 40, - // 'add': 43, - 'insert': 45, - 'delete': 46, - 'command': 91, - 'left command': 91, - 'right command': 93, - 'numpad *': 106, - 'numpad plus': [43, 107], - 'numpad add': 43, // as a trick - 'numpad -': 109, - 'numpad .': 110, - 'numpad /': 111, - 'num lock': 144, - 'scroll lock': 145, - 'my computer': 182, - 'my calculator': 183, - ';': 186, - '=': 187, - ',': 188, - '-': 189, - '.': 190, - '/': 191, - '`': 192, - '[': 219, - '\\': 220, - ']': 221, - "'": 222 -}; - -// Helper aliases - export const aliases = { - 'windows': 91, - '⇧': 16, - '⌥': 18, - '⌃': 17, - '⌘': 91, - 'ctl': 17, - 'control': 17, - 'option': 18, - 'pause': 19, - 'break': 19, - 'caps': 20, - 'return': 13, - 'escape': 27, - 'spc': 32, - 'pgup': 33, - 'pgdn': 34, - 'ins': 45, - 'del': 46, - 'cmd': 91 + 'esc': 'Escape', + 'enter': ['Enter', 'NumpadEnter'], + 'up': 'ArrowUp', + 'down': 'ArrowDown', + 'left': 'ArrowLeft', + 'right': 'ArrowRight', + 'plus': ['NumpadAdd', 'Semicolon'], }; /*! @@ -119,15 +23,11 @@ export const aliases = { // lower case chars for (let i = 97; i < 123; i++) { - codes[String.fromCharCode(i)] = i - 32; + const char = String.fromCharCode(i); + aliases[char] = `Key${char.toUpperCase()}`; } // numbers -for (let i = 48; i < 58; i++) { - codes[i - 48] = [i, (i - 48) + 96]; -} - -// function keys -for (let i = 1; i < 13; i++) { - codes['f' + i] = i + 111; +for (let i = 0; i < 10; i++) { + aliases[i] = [`Numpad${i}`, `Digit${i}`]; } diff --git a/src/client/app/common/views/components/reaction-picker.vue b/src/client/app/common/views/components/reaction-picker.vue index f415e89d0e..811f82283d 100644 --- a/src/client/app/common/views/components/reaction-picker.vue +++ b/src/client/app/common/views/components/reaction-picker.vue @@ -72,7 +72,7 @@ export default Vue.extend({ 'esc': this.close, 'enter': this.choose, 'space': this.choose, - 'numpad plus': this.choose, + 'plus': this.choose, 'up': this.focusUp, 'right': this.focusRight, 'down': this.focusDown, diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index b8c5f31511..26f6ef4554 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -115,7 +115,7 @@ export default Vue.extend({ return { 'r': this.reply, 'a': () => this.react(true), - 'numpad plus': () => this.react(true), + 'plus': () => this.react(true), 'n': this.renote, 'up': this.focusBefore, 'shift+tab': this.focusBefore, From 71a93b2b435a1747a710a593588c1daec8ef7878 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 12:42:56 +0900 Subject: [PATCH 301/539] Refactor & Usability improvements --- src/client/app/common/hotkey.ts | 3 ++- .../views/components/reaction-picker.vue | 18 +++++++++++------- .../desktop/views/components/notes.note.vue | 16 +++++++--------- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/client/app/common/hotkey.ts b/src/client/app/common/hotkey.ts index 66336fca6e..03806fb184 100644 --- a/src/client/app/common/hotkey.ts +++ b/src/client/app/common/hotkey.ts @@ -51,7 +51,8 @@ export default { const actions = getKeyMap(binding.value); - const reservedKeys = concat(actions.map(a => a.patterns.map(p => p.which))); + // flatten + const reservedKeys = concat(concat(actions.map(a => a.patterns.map(p => p.which)))); el.dataset.reservedKeys = reservedKeys.map(key => `'${key}'`).join(' '); diff --git a/src/client/app/common/views/components/reaction-picker.vue b/src/client/app/common/views/components/reaction-picker.vue index 811f82283d..ce0d2a8ea3 100644 --- a/src/client/app/common/views/components/reaction-picker.vue +++ b/src/client/app/common/views/components/reaction-picker.vue @@ -56,6 +56,12 @@ export default Vue.extend({ type: Boolean, required: false, default: false + }, + + animation: { + type: Boolean, + required: false, + default: true } }, @@ -70,9 +76,7 @@ export default Vue.extend({ keymap(): any { return { 'esc': this.close, - 'enter': this.choose, - 'space': this.choose, - 'plus': this.choose, + 'enter|space|plus': this.choose, 'up': this.focusUp, 'right': this.focusRight, 'down': this.focusDown, @@ -126,7 +130,7 @@ export default Vue.extend({ anime({ targets: this.$refs.backdrop, opacity: 1, - duration: 100, + duration: this.animation ? 100 : 0, easing: 'linear' }); @@ -134,7 +138,7 @@ export default Vue.extend({ targets: this.$refs.popover, opacity: 1, scale: [0.5, 1], - duration: 500 + duration: this.animation ? 500 : 0 }); }); }, @@ -164,7 +168,7 @@ export default Vue.extend({ anime({ targets: this.$refs.backdrop, opacity: 0, - duration: 200, + duration: this.animation ? 200 : 0, easing: 'linear' }); @@ -173,7 +177,7 @@ export default Vue.extend({ targets: this.$refs.popover, opacity: 0, scale: 0.5, - duration: 200, + duration: this.animation ? 200 : 0, easing: 'easeInBack', complete: () => { this.$emit('closed'); diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 26f6ef4554..18a1ce9e52 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -113,14 +113,11 @@ export default Vue.extend({ computed: { keymap(): any { return { - 'r': this.reply, - 'a': () => this.react(true), - 'plus': () => this.react(true), - 'n': this.renote, - 'up': this.focusBefore, - 'shift+tab': this.focusBefore, - 'down': this.focusAfter, - 'tab': this.focusAfter, + 'r|left': this.reply, + 'a|plus': () => this.react(true), + 'n|right': this.renote, + 'up|shift+tab': this.focusBefore, + 'down|tab': this.focusAfter, }; }, @@ -250,7 +247,8 @@ export default Vue.extend({ (this as any).os.new(MkReactionPicker, { source: this.$refs.reactButton, note: this.p, - showFocus: viaKeyboard + showFocus: viaKeyboard, + animation: !viaKeyboard }).$once('closed', this.focus); }, From bec48319ecb782ee997cdae108bf71347619b998 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 12:43:24 +0900 Subject: [PATCH 302/539] 8.50.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 64023ea980..68a06213a5 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.49.0", - "clientVersion": "1.0.9880", + "version": "8.50.0", + "clientVersion": "1.0.9883", "codename": "nighthike", "main": "./built/index.js", "private": true, From 11496d887e89ceccd64035f9e1836c5d415f4349 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Tue, 18 Sep 2018 13:08:27 +0900 Subject: [PATCH 303/539] Publish pinned notes (#2731) --- src/remote/activitypub/renderer/add.ts | 9 +++ .../renderer/ordered-collection.ts | 4 +- src/remote/activitypub/renderer/person.ts | 1 + src/remote/activitypub/renderer/remove.ts | 9 +++ src/remote/activitypub/type.ts | 1 + src/server/activitypub.ts | 4 ++ src/server/activitypub/featured.ts | 38 ++++++++++++ src/server/api/endpoints/i/pin.ts | 10 ++- src/services/i/pin.ts | 61 +++++++++++++++++++ 9 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 src/remote/activitypub/renderer/add.ts create mode 100644 src/remote/activitypub/renderer/remove.ts create mode 100644 src/server/activitypub/featured.ts create mode 100644 src/services/i/pin.ts diff --git a/src/remote/activitypub/renderer/add.ts b/src/remote/activitypub/renderer/add.ts new file mode 100644 index 0000000000..4d6fe392aa --- /dev/null +++ b/src/remote/activitypub/renderer/add.ts @@ -0,0 +1,9 @@ +import config from '../../../config'; +import { ILocalUser } from '../../../models/user'; + +export default (user: ILocalUser, target: any, object: any) => ({ + type: 'Add', + actor: `${config.url}/users/${user._id}`, + target, + object +}); diff --git a/src/remote/activitypub/renderer/ordered-collection.ts b/src/remote/activitypub/renderer/ordered-collection.ts index 3c448cf873..5461005983 100644 --- a/src/remote/activitypub/renderer/ordered-collection.ts +++ b/src/remote/activitypub/renderer/ordered-collection.ts @@ -4,8 +4,9 @@ * @param totalItems Total number of items * @param first URL of first page (optional) * @param last URL of last page (optional) + * @param orderedItems attached objects (optional) */ -export default function(id: string, totalItems: any, first: string, last: string) { +export default function(id: string, totalItems: any, first?: string, last?: string, orderedItems?: object) { const page: any = { id, type: 'OrderedCollection', @@ -14,6 +15,7 @@ export default function(id: string, totalItems: any, first: string, last: string if (first) page.first = first; if (last) page.last = last; + if (orderedItems) page.orderedItems = orderedItems; return page; } diff --git a/src/remote/activitypub/renderer/person.ts b/src/remote/activitypub/renderer/person.ts index 78918af368..52485e6959 100644 --- a/src/remote/activitypub/renderer/person.ts +++ b/src/remote/activitypub/renderer/person.ts @@ -21,6 +21,7 @@ export default async (user: ILocalUser) => { outbox: `${id}/outbox`, followers: `${id}/followers`, following: `${id}/following`, + featured: `${id}/collections/featured`, sharedInbox: `${config.url}/inbox`, url: `${config.url}/@${user.username}`, preferredUsername: user.username, diff --git a/src/remote/activitypub/renderer/remove.ts b/src/remote/activitypub/renderer/remove.ts new file mode 100644 index 0000000000..ed840be751 --- /dev/null +++ b/src/remote/activitypub/renderer/remove.ts @@ -0,0 +1,9 @@ +import config from '../../../config'; +import { ILocalUser } from '../../../models/user'; + +export default (user: ILocalUser, target: any, object: any) => ({ + type: 'Remove', + actor: `${config.url}/users/${user._id}`, + target, + object +}); diff --git a/src/remote/activitypub/type.ts b/src/remote/activitypub/type.ts index 28763d3e83..7bbea5fd18 100644 --- a/src/remote/activitypub/type.ts +++ b/src/remote/activitypub/type.ts @@ -53,6 +53,7 @@ export interface IPerson extends IObject { publicKey: any; followers: any; following: any; + featured?: any; outbox: any; endpoints: string[]; } diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts index 3d346693d8..2cbce8cfbc 100644 --- a/src/server/activitypub.ts +++ b/src/server/activitypub.ts @@ -13,6 +13,7 @@ import renderPerson from '../remote/activitypub/renderer/person'; import Outbox, { packActivity } from './activitypub/outbox'; import Followers from './activitypub/followers'; import Following from './activitypub/following'; +import Featured from './activitypub/featured'; // Init router const router = new Router(); @@ -102,6 +103,9 @@ router.get('/users/:user/followers', Followers); // following router.get('/users/:user/following', Following); +// featured +router.get('/users/:user/collections/featured', Featured); + // publickey router.get('/users/:user/publickey', async ctx => { const userId = new mongo.ObjectID(ctx.params.user); diff --git a/src/server/activitypub/featured.ts b/src/server/activitypub/featured.ts new file mode 100644 index 0000000000..93c3700206 --- /dev/null +++ b/src/server/activitypub/featured.ts @@ -0,0 +1,38 @@ +import * as mongo from 'mongodb'; +import * as Router from 'koa-router'; +import config from '../../config'; +import User from '../../models/user'; +import pack from '../../remote/activitypub/renderer'; +import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-collection'; +import { setResponseType } from '../activitypub'; +import Note from '../../models/note'; +import renderNote from '../../remote/activitypub/renderer/note'; + +export default async (ctx: Router.IRouterContext) => { + const userId = new mongo.ObjectID(ctx.params.user); + + // Verify user + const user = await User.findOne({ + _id: userId, + host: null + }); + + if (user === null) { + ctx.status = 404; + return; + } + + const pinnedNoteIds = user.pinnedNoteIds || []; + + const pinnedNotes = await Promise.all(pinnedNoteIds.map(id => Note.findOne({ _id: id }))); + + const renderedNotes = await Promise.all(pinnedNotes.map(note => renderNote(note))); + + const rendered = renderOrderedCollection( + `${config.url}/users/${userId}/collections/featured`, + renderedNotes.length, null, null, renderedNotes + ); + + ctx.body = pack(rendered); + setResponseType(ctx); +}; diff --git a/src/server/api/endpoints/i/pin.ts b/src/server/api/endpoints/i/pin.ts index 8804d5aa70..ce3b0318a9 100644 --- a/src/server/api/endpoints/i/pin.ts +++ b/src/server/api/endpoints/i/pin.ts @@ -2,6 +2,7 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; import User, { ILocalUser } from '../../../../models/user'; import Note from '../../../../models/note'; import { pack } from '../../../../models/user'; +import { deliverPinnedChange } from '../../../../services/i/pin'; /** * Pin note @@ -21,6 +22,9 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res, return rej('note not found'); } + let addedId; + let removedId; + const pinnedNoteIds = user.pinnedNoteIds || []; if (pinnedNoteIds.some(id => id.equals(note._id))) { @@ -28,9 +32,10 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res, } pinnedNoteIds.unshift(note._id); + addedId = note._id; if (pinnedNoteIds.length > 5) { - pinnedNoteIds.pop(); + removedId = pinnedNoteIds.pop(); } await User.update(user._id, { @@ -44,6 +49,9 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res, detail: true }); + // Send Add/Remove to followers + deliverPinnedChange(user._id, removedId, addedId); + // Send response res(iObj); }); diff --git a/src/services/i/pin.ts b/src/services/i/pin.ts new file mode 100644 index 0000000000..c6d3e11788 --- /dev/null +++ b/src/services/i/pin.ts @@ -0,0 +1,61 @@ +import config from '../../config'; +import * as mongo from 'mongodb'; +import User, { isLocalUser, isRemoteUser, ILocalUser } from '../../models/user'; +import Following from '../../models/following'; +import renderAdd from '../../remote/activitypub/renderer/add'; +import renderRemove from '../../remote/activitypub/renderer/remove'; +import packAp from '../../remote/activitypub/renderer'; +import { deliver } from '../../queue'; + +export async function deliverPinnedChange(userId: mongo.ObjectID, oldId: mongo.ObjectID, newId: mongo.ObjectID) { + const user = await User.findOne({ + _id: userId + }); + + if (!isLocalUser(user)) return; + + const queue = await CreateRemoteInboxes(user); + + if (queue.length < 1) return; + + const target = `${config.url}/users/${user._id}/collections/featured`; + + if (oldId) { + const oldItem = `${config.url}/notes/${oldId}`; + const content = packAp(renderRemove(user, target, oldItem)); + queue.forEach(inbox => { + deliver(user, content, inbox); + }); + } + + if (newId) { + const newItem = `${config.url}/notes/${newId}`; + const content = packAp(renderAdd(user, target, newItem)); + queue.forEach(inbox => { + deliver(user, content, inbox); + }); + } +} + +/** + * ローカルユーザーのリモートフォロワーのinboxリストを作成する + * @param user ローカルユーザー + */ +async function CreateRemoteInboxes(user: ILocalUser): Promise<string[]> { + const followers = await Following.find({ + followeeId: user._id + }); + + const queue: string[] = []; + + followers.map(following => { + const follower = following._follower; + + if (isRemoteUser(follower)) { + const inbox = follower.sharedInbox || follower.inbox; + if (!queue.includes(inbox)) queue.push(inbox); + } + }); + + return queue; +} From 8ba3fb13ebb780255f9b6f4ca89dc2f70b770098 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 13:12:41 +0900 Subject: [PATCH 304/539] Fix bug --- src/client/app/mobile/views/pages/home.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue index e61916fe18..43afc98b45 100644 --- a/src/client/app/mobile/views/pages/home.vue +++ b/src/client/app/mobile/views/pages/home.vue @@ -35,7 +35,7 @@ <span :data-active="src == 'mentions'" @click="src = 'mentions'">%fa:at% %i18n:@mentions%</span> <span :data-active="src == 'messages'" @click="src = 'messages'">%fa:envelope R% %i18n:@messages%</span> <template v-if="lists"> - <div class="hr"></div> + <div class="hr" v-if="lists.length > 0"></div> <span v-for="l in lists" :data-active="src == 'list' && list == l" @click="src = 'list'; list = l" :key="l.id">%fa:list% {{ l.title }}</span> </template> <div class="hr" v-if="$store.state.settings.tagTimelines && $store.state.settings.tagTimelines.length > 0"></div> From 429bf179dcc9ece40f043ade3e725a9765a195b6 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 13:14:17 +0900 Subject: [PATCH 305/539] Refactor: Better type annotations --- src/server/api/endpoints/i/pin.ts | 5 +++-- src/services/i/pin.ts | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/server/api/endpoints/i/pin.ts b/src/server/api/endpoints/i/pin.ts index ce3b0318a9..d075976b74 100644 --- a/src/server/api/endpoints/i/pin.ts +++ b/src/server/api/endpoints/i/pin.ts @@ -1,3 +1,4 @@ +import * as mongo from 'mongodb'; import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; import User, { ILocalUser } from '../../../../models/user'; import Note from '../../../../models/note'; @@ -22,8 +23,8 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res, return rej('note not found'); } - let addedId; - let removedId; + let addedId: mongo.ObjectID; + let removedId: mongo.ObjectID; const pinnedNoteIds = user.pinnedNoteIds || []; diff --git a/src/services/i/pin.ts b/src/services/i/pin.ts index c6d3e11788..5bf8d166bb 100644 --- a/src/services/i/pin.ts +++ b/src/services/i/pin.ts @@ -7,7 +7,7 @@ import renderRemove from '../../remote/activitypub/renderer/remove'; import packAp from '../../remote/activitypub/renderer'; import { deliver } from '../../queue'; -export async function deliverPinnedChange(userId: mongo.ObjectID, oldId: mongo.ObjectID, newId: mongo.ObjectID) { +export async function deliverPinnedChange(userId: mongo.ObjectID, oldId?: mongo.ObjectID, newId?: mongo.ObjectID) { const user = await User.findOne({ _id: userId }); From ccfd48232a63931b6c8f425f5b52cf8c4315885c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 13:14:42 +0900 Subject: [PATCH 306/539] 8.51.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 68a06213a5..f38dc1c118 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.50.0", - "clientVersion": "1.0.9883", + "version": "8.51.0", + "clientVersion": "1.0.9887", "codename": "nighthike", "main": "./built/index.js", "private": true, From 1ac033ff184a82840a584a12bed1e74960619f57 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 14:30:50 +0900 Subject: [PATCH 307/539] Improve keyboard shortcut --- .../desktop/views/components/notes.note.vue | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 18a1ce9e52..e53dbe1215 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -115,9 +115,19 @@ export default Vue.extend({ return { 'r|left': this.reply, 'a|plus': () => this.react(true), - 'n|right': this.renote, + 'q|n|right': this.renote, 'up|shift+tab': this.focusBefore, 'down|tab': this.focusAfter, + '1': () => this.reactDirectly('like'), + '2': () => this.reactDirectly('love'), + '3': () => this.reactDirectly('laugh'), + '4': () => this.reactDirectly('hmm'), + '5': () => this.reactDirectly('surprise'), + '6': () => this.reactDirectly('congrats'), + '7': () => this.reactDirectly('angry'), + '8': () => this.reactDirectly('confused'), + '9': () => this.reactDirectly('rip'), + '0': () => this.reactDirectly('pudding'), }; }, @@ -252,6 +262,13 @@ export default Vue.extend({ }).$once('closed', this.focus); }, + reactDirectly(reaction) { + (this as any).api('notes/reactions/create', { + noteId: this.p.id, + reaction: reaction + }); + }, + menu() { (this as any).os.new(MkNoteMenu, { source: this.$refs.menuButton, From 16c36163b4eedabdba337697cc85c2e513eae439 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 14:35:46 +0900 Subject: [PATCH 308/539] Fix bug --- src/client/app/desktop/views/components/notes.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/app/desktop/views/components/notes.vue b/src/client/app/desktop/views/components/notes.vue index 469f62c080..e6267ed204 100644 --- a/src/client/app/desktop/views/components/notes.vue +++ b/src/client/app/desktop/views/components/notes.vue @@ -10,7 +10,7 @@ </div> <!-- トランジションを有効にするとなぜかメモリリークする --> - <component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notes" class="notes transition" tag="div"> + <component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notes" class="notes transition" tag="div" ref="notes"> <template v-for="(note, i) in _notes"> <x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)" ref="note"/> <p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date"> @@ -89,7 +89,7 @@ export default Vue.extend({ }, focus() { - (this.$refs.note as any)[0].focus(); + (this.$refs.notes as any).children[0].focus ? (this.$refs.notes as any).children[0].focus() : (this.$refs.notes as any).$el.children[0].focus(); }, onNoteUpdated(i, note) { From f4045fb5b32b69664427d844a66d37258e19c5b1 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 14:39:18 +0900 Subject: [PATCH 309/539] Improve keyboard shortcuts --- src/client/app/desktop/views/components/notes.note.vue | 2 +- .../app/desktop/views/components/renote-form-window.vue | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index e53dbe1215..b96f3ab998 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -115,7 +115,7 @@ export default Vue.extend({ return { 'r|left': this.reply, 'a|plus': () => this.react(true), - 'q|n|right': this.renote, + 'q|right': this.renote, 'up|shift+tab': this.focusBefore, 'down|tab': this.focusAfter, '1': () => this.reactDirectly('like'), diff --git a/src/client/app/desktop/views/components/renote-form-window.vue b/src/client/app/desktop/views/components/renote-form-window.vue index 6c9cb59d4a..44ad2da800 100644 --- a/src/client/app/desktop/views/components/renote-form-window.vue +++ b/src/client/app/desktop/views/components/renote-form-window.vue @@ -15,7 +15,8 @@ export default Vue.extend({ keymap(): any { return { 'esc': this.close, - 'ctrl+enter': this.post + 'enter': this.post, + 'q': this.quote, }; } }, @@ -24,6 +25,9 @@ export default Vue.extend({ post() { (this.$refs.form as any).ok(); }, + quote() { + (this.$refs.form as any).onQuote(); + }, close() { (this.$refs.window as any).close(); }, From dba04cc59cb30d3acc9dd03be5c2be63718453e9 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 14:43:54 +0900 Subject: [PATCH 310/539] Improve keyboard shortcuts --- .../app/common/views/components/reaction-picker.vue | 8 ++++---- src/client/app/desktop/views/components/notes.note.vue | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/client/app/common/views/components/reaction-picker.vue b/src/client/app/common/views/components/reaction-picker.vue index ce0d2a8ea3..fff2c56f00 100644 --- a/src/client/app/common/views/components/reaction-picker.vue +++ b/src/client/app/common/views/components/reaction-picker.vue @@ -77,10 +77,10 @@ export default Vue.extend({ return { 'esc': this.close, 'enter|space|plus': this.choose, - 'up': this.focusUp, - 'right': this.focusRight, - 'down': this.focusDown, - 'left': this.focusLeft, + 'up|k': this.focusUp, + 'left|h|shift+tab': this.focusLeft, + 'right|l|tab': this.focusRight, + 'down|j': this.focusDown, '1': () => this.react('like'), '2': () => this.react('love'), '3': () => this.react('laugh'), diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index b96f3ab998..d60bce2545 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -116,8 +116,8 @@ export default Vue.extend({ 'r|left': this.reply, 'a|plus': () => this.react(true), 'q|right': this.renote, - 'up|shift+tab': this.focusBefore, - 'down|tab': this.focusAfter, + 'up|k|shift+tab': this.focusBefore, + 'down|j|tab': this.focusAfter, '1': () => this.reactDirectly('like'), '2': () => this.reactDirectly('love'), '3': () => this.reactDirectly('laugh'), From 5184a07cf2ba3e5faa703e2f0cfcf465187585ea Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 14:50:13 +0900 Subject: [PATCH 311/539] Improve usability --- .../desktop/views/components/notes.note.vue | 18 ++++++++++-------- .../views/components/post-form-window.vue | 18 ++++++++++++++++-- .../views/components/renote-form-window.vue | 15 +++++++++++++-- .../app/desktop/views/components/window.vue | 17 +++++++++++------ 4 files changed, 50 insertions(+), 18 deletions(-) diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index d60bce2545..bffa6affc9 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -40,12 +40,12 @@ </div> <footer> <mk-reactions-viewer :note="p" ref="reactionsViewer"/> - <button class="replyButton" @click="reply" title="%i18n:@reply%"> + <button class="replyButton" @click="reply()" title="%i18n:@reply%"> <template v-if="p.reply">%fa:reply-all%</template> <template v-else>%fa:reply%</template> <p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p> </button> - <button class="renoteButton" @click="renote" title="%i18n:@renote%"> + <button class="renoteButton" @click="renote()" title="%i18n:@renote%"> %fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p> </button> <button class="reactionButton" :class="{ reacted: p.myReaction != null }" @click="react()" ref="reactButton" title="%i18n:@add-reaction%"> @@ -113,9 +113,9 @@ export default Vue.extend({ computed: { keymap(): any { return { - 'r|left': this.reply, + 'r|left': () => this.reply(true), 'a|plus': () => this.react(true), - 'q|right': this.renote, + 'q|right': () => this.renote(true), 'up|k|shift+tab': this.focusBefore, 'down|j|tab': this.focusAfter, '1': () => this.reactDirectly('like'), @@ -240,15 +240,17 @@ export default Vue.extend({ } }, - reply() { + reply(viaKeyboard = false) { (this as any).os.new(MkPostFormWindow, { - reply: this.p + reply: this.p, + animation: !viaKeyboard }).$once('closed', this.focus); }, - renote() { + renote(viaKeyboard = false) { (this as any).os.new(MkRenoteFormWindow, { - note: this.p + note: this.p, + animation: !viaKeyboard }).$once('closed', this.focus); }, diff --git a/src/client/app/desktop/views/components/post-form-window.vue b/src/client/app/desktop/views/components/post-form-window.vue index ade84f6bb9..6b6bf3a24a 100644 --- a/src/client/app/desktop/views/components/post-form-window.vue +++ b/src/client/app/desktop/views/components/post-form-window.vue @@ -1,5 +1,5 @@ <template> -<mk-window class="mk-post-form-window" ref="window" is-modal @closed="onWindowClosed"> +<mk-window class="mk-post-form-window" ref="window" is-modal @closed="onWindowClosed" :animation="animation"> <span slot="header" class="mk-post-form-window--header"> <span class="icon" v-if="geo">%fa:map-marker-alt%</span> <span v-if="!reply">%i18n:@note%</span> @@ -25,7 +25,19 @@ import Vue from 'vue'; export default Vue.extend({ - props: ['reply'], + props: { + reply: { + type: Object, + required: true + }, + + animation: { + type: Boolean, + required: false, + default: true + } + }, + data() { return { uploadings: [], @@ -33,11 +45,13 @@ export default Vue.extend({ geo: null }; }, + mounted() { this.$nextTick(() => { (this.$refs.form as any).focus(); }); }, + methods: { onChangeUploadings(files) { this.uploadings = files; diff --git a/src/client/app/desktop/views/components/renote-form-window.vue b/src/client/app/desktop/views/components/renote-form-window.vue index 44ad2da800..b9760fcbe9 100644 --- a/src/client/app/desktop/views/components/renote-form-window.vue +++ b/src/client/app/desktop/views/components/renote-form-window.vue @@ -1,5 +1,5 @@ <template> -<mk-window ref="window" is-modal @closed="onWindowClosed"> +<mk-window ref="window" is-modal @closed="onWindowClosed" :animation="animation"> <span slot="header" :class="$style.header">%fa:retweet%%i18n:@title%</span> <mk-renote-form ref="form" :note="note" @posted="onPosted" @canceled="onCanceled" v-hotkey.global="keymap"/> </mk-window> @@ -9,7 +9,18 @@ import Vue from 'vue'; export default Vue.extend({ - props: ['note'], + props: { + note: { + type: Object, + required: true + }, + + animation: { + type: Boolean, + required: false, + default: true + } + }, computed: { keymap(): any { diff --git a/src/client/app/desktop/views/components/window.vue b/src/client/app/desktop/views/components/window.vue index e6886956eb..5eece3795f 100644 --- a/src/client/app/desktop/views/components/window.vue +++ b/src/client/app/desktop/views/components/window.vue @@ -76,6 +76,11 @@ export default Vue.extend({ name: { type: String, default: null + }, + animation: { + type: Boolean, + required: false, + default: true } }, @@ -142,7 +147,7 @@ export default Vue.extend({ anime({ targets: bg, opacity: 1, - duration: 100, + duration: this.animation ? 100 : 0, easing: 'linear' }); } @@ -152,7 +157,7 @@ export default Vue.extend({ targets: main, opacity: 1, scale: [1.1, 1], - duration: 200, + duration: this.animation ? 200 : 0, easing: 'easeOutQuad' }); @@ -160,7 +165,7 @@ export default Vue.extend({ setTimeout(() => { this.$emit('opened'); - }, 300); + }, this.animation ? 300 : 0); }, close() { @@ -174,7 +179,7 @@ export default Vue.extend({ anime({ targets: bg, opacity: 0, - duration: 300, + duration: this.animation ? 300 : 0, easing: 'linear' }); } @@ -185,14 +190,14 @@ export default Vue.extend({ targets: main, opacity: 0, scale: 0.8, - duration: 300, + duration: this.animation ? 300 : 0, easing: [0.5, -0.5, 1, 0.5] }); setTimeout(() => { this.$emit('closed'); this.destroyDom(); - }, 300); + }, this.animation ? 300 : 0); }, popout() { From 87b6ef0ec52b684b60a4d99d1fe9b4a82db6bc52 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 14:53:17 +0900 Subject: [PATCH 312/539] Improve keyboard shortcut --- src/client/app/desktop/views/components/notes.note.vue | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index bffa6affc9..a2ba85bdf9 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -115,6 +115,7 @@ export default Vue.extend({ return { 'r|left': () => this.reply(true), 'a|plus': () => this.react(true), + 'ctrl+q|ctrl+right': this.renoteDirectly, 'q|right': () => this.renote(true), 'up|k|shift+tab': this.focusBefore, 'down|j|tab': this.focusAfter, @@ -254,6 +255,12 @@ export default Vue.extend({ }).$once('closed', this.focus); }, + renoteDirectly() { + (this as any).api('notes/create', { + renoteId: this.p.id + }); + }, + react(viaKeyboard = false) { this.blur(); (this as any).os.new(MkReactionPicker, { From 0ed704d173f00b352e299c53e5e497dde5a460fb Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 14:54:01 +0900 Subject: [PATCH 313/539] 8.52.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index f38dc1c118..6dedee712a 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.51.0", - "clientVersion": "1.0.9887", + "version": "8.52.0", + "clientVersion": "1.0.9894", "codename": "nighthike", "main": "./built/index.js", "private": true, From 3b628ec3c464951a47896dca550ae1da66c05ec5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 15:02:15 +0900 Subject: [PATCH 314/539] =?UTF-8?q?=E5=B0=86=E6=9D=A5=E7=9A=84=E3=81=AB?= =?UTF-8?q?=E3=83=90=E3=82=B0=E3=81=AB=E7=B9=8B=E3=81=8C=E3=82=8A=E3=81=8B?= =?UTF-8?q?=E3=81=AD=E3=81=AA=E3=81=84=E6=8C=99=E5=8B=95=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/app/common/hotkey.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/client/app/common/hotkey.ts b/src/client/app/common/hotkey.ts index 03806fb184..e63fcc9f97 100644 --- a/src/client/app/common/hotkey.ts +++ b/src/client/app/common/hotkey.ts @@ -22,7 +22,10 @@ const getKeyMap = keymap => Object.entries(keymap).map(([patterns, callback]): a result.patterns = patterns.split('|').map(part => { const pattern = { - which: [] + which: [], + ctrl: false, + alt: false, + shift: false } as pattern; part.trim().split('+').forEach(key => { @@ -66,10 +69,10 @@ export default { if (el._hotkey_global && targetReservedKeys.includes(`'${key}'`)) break; const matched = action.patterns.some(pattern => { - let matched = pattern.which.includes(key); - if (pattern.ctrl && !e.ctrlKey) matched = false; - if (pattern.shift && !e.shiftKey) matched = false; - if (pattern.alt && !e.altKey) matched = false; + const matched = pattern.which.includes(key) && + pattern.ctrl == e.ctrlKey && + pattern.shift == e.shiftKey && + pattern.alt == e.altKey; if (matched) { e.preventDefault(); From 6ead1de383764bf4c7cbd3b2e453ed8bde6da0d3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 15:02:26 +0900 Subject: [PATCH 315/539] Improve readability --- src/client/app/desktop/views/components/notes.note.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index a2ba85bdf9..e2c61dabe8 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -115,8 +115,8 @@ export default Vue.extend({ return { 'r|left': () => this.reply(true), 'a|plus': () => this.react(true), - 'ctrl+q|ctrl+right': this.renoteDirectly, 'q|right': () => this.renote(true), + 'ctrl+q|ctrl+right': this.renoteDirectly, 'up|k|shift+tab': this.focusBefore, 'down|j|tab': this.focusAfter, '1': () => this.reactDirectly('like'), From 8bf4e5533851886057687b46a41f1cd88e4cd810 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 16:45:20 +0900 Subject: [PATCH 316/539] Improve keyboard shortcuts --- src/client/app/common/views/components/menu.vue | 4 ++-- .../app/common/views/components/reaction-picker.vue | 4 ++-- src/client/app/desktop/views/components/notes.note.vue | 10 ++++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/client/app/common/views/components/menu.vue b/src/client/app/common/views/components/menu.vue index fba7e235e0..ad5ec619ba 100644 --- a/src/client/app/common/views/components/menu.vue +++ b/src/client/app/common/views/components/menu.vue @@ -2,9 +2,9 @@ <div class="onchrpzrvnoruiaenfcqvccjfuupzzwv"> <div class="backdrop" ref="backdrop" @click="close"></div> <div class="popover" :class="{ hukidasi }" ref="popover"> - <template v-for="item in items"> + <template v-for="item, i in items"> <div v-if="item === null"></div> - <button v-if="item" @click="clicked(item.action)" v-html="item.icon ? item.icon + ' ' + item.text : item.text"></button> + <button v-if="item" @click="clicked(item.action)" v-html="item.icon ? item.icon + ' ' + item.text : item.text" :tabindex="i"></button> </template> </div> </div> diff --git a/src/client/app/common/views/components/reaction-picker.vue b/src/client/app/common/views/components/reaction-picker.vue index fff2c56f00..f732e40b9d 100644 --- a/src/client/app/common/views/components/reaction-picker.vue +++ b/src/client/app/common/views/components/reaction-picker.vue @@ -97,10 +97,10 @@ export default Vue.extend({ watch: { focus(i) { - this.$refs.buttons.childNodes[i].focus(); + this.$refs.buttons.children[i].focus(); if (this.showFocus) { - this.title = this.$refs.buttons.childNodes[i].title; + this.title = this.$refs.buttons.children[i].title; } } }, diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index e2c61dabe8..d1178a933a 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -51,7 +51,7 @@ <button class="reactionButton" :class="{ reacted: p.myReaction != null }" @click="react()" ref="reactButton" title="%i18n:@add-reaction%"> %fa:plus%<p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p> </button> - <button @click="menu" ref="menuButton"> + <button @click="menu()" ref="menuButton"> %fa:ellipsis-h% </button> <!-- <button title="%i18n:@detail"> @@ -114,11 +114,12 @@ export default Vue.extend({ keymap(): any { return { 'r|left': () => this.reply(true), - 'a|plus': () => this.react(true), + 'e|a|plus': () => this.react(true), 'q|right': () => this.renote(true), 'ctrl+q|ctrl+right': this.renoteDirectly, 'up|k|shift+tab': this.focusBefore, 'down|j|tab': this.focusAfter, + 'm|o': () => this.menu(true), '1': () => this.reactDirectly('like'), '2': () => this.reactDirectly('love'), '3': () => this.reactDirectly('laugh'), @@ -278,10 +279,11 @@ export default Vue.extend({ }); }, - menu() { + menu(viaKeyboard = false) { (this as any).os.new(MkNoteMenu, { source: this.$refs.menuButton, - note: this.p + note: this.p, + animation: !viaKeyboard }).$once('closed', this.focus); }, From 30608d3e22ed0d0af726200229c25794a789f5e7 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 18 Sep 2018 16:45:55 +0900 Subject: [PATCH 317/539] 8.53.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 6dedee712a..4da69b44a9 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.52.0", - "clientVersion": "1.0.9894", + "version": "8.53.0", + "clientVersion": "1.0.9898", "codename": "nighthike", "main": "./built/index.js", "private": true, From 7b9cea06ef94de28216ab9921879cd3c24ccca0f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 19 Sep 2018 02:26:06 +0900 Subject: [PATCH 318/539] Fix --- src/client/app/desktop/views/components/post-form-window.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/components/post-form-window.vue b/src/client/app/desktop/views/components/post-form-window.vue index 6b6bf3a24a..466d5e1fd8 100644 --- a/src/client/app/desktop/views/components/post-form-window.vue +++ b/src/client/app/desktop/views/components/post-form-window.vue @@ -28,7 +28,7 @@ export default Vue.extend({ props: { reply: { type: Object, - required: true + required: false }, animation: { From b0d60ef2c2a4f7a3cc25730a19791aed8fcc1a35 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 19 Sep 2018 02:27:19 +0900 Subject: [PATCH 319/539] Add new shortcut --- src/client/app/desktop/views/components/notes.note.vue | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index d1178a933a..1a670a9e7a 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -120,6 +120,7 @@ export default Vue.extend({ 'up|k|shift+tab': this.focusBefore, 'down|j|tab': this.focusAfter, 'm|o': () => this.menu(true), + 's': this.toggleShowContent, '1': () => this.reactDirectly('like'), '2': () => this.reactDirectly('love'), '3': () => this.reactDirectly('laugh'), @@ -287,6 +288,10 @@ export default Vue.extend({ }).$once('closed', this.focus); }, + toggleShowContent() { + this.showContent = !this.showContent; + }, + focus() { this.$el.focus(); }, From fd770b008e3b4a71c83dba71d588f9a6399a771c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 19 Sep 2018 02:32:44 +0900 Subject: [PATCH 320/539] Add new shortcut --- .../views/components/ui.header.notifications.vue | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/components/ui.header.notifications.vue b/src/client/app/desktop/views/components/ui.header.notifications.vue index 59a16df9ec..74dcd4111f 100644 --- a/src/client/app/desktop/views/components/ui.header.notifications.vue +++ b/src/client/app/desktop/views/components/ui.header.notifications.vue @@ -1,5 +1,5 @@ <template> -<div class="notifications"> +<div class="notifications" v-hotkey.global="keymap"> <button :data-active="isOpen" @click="toggle" title="%i18n:@title%"> %fa:R bell%<template v-if="hasUnreadNotification">%fa:circle%</template> </button> @@ -19,11 +19,19 @@ export default Vue.extend({ isOpen: false }; }, + computed: { hasUnreadNotification(): boolean { return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification; + }, + + keymap(): any { + return { + 'shift+n': this.toggle + }; } }, + methods: { toggle() { this.isOpen ? this.close() : this.open(); From 3c865d6054b0efdcd32fdde7fd0997dfa85694d5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 19 Sep 2018 02:35:32 +0900 Subject: [PATCH 321/539] Add new shortcut --- src/client/app/desktop/views/components/notes.note.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 1a670a9e7a..fdf41a52c9 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -119,6 +119,7 @@ export default Vue.extend({ 'ctrl+q|ctrl+right': this.renoteDirectly, 'up|k|shift+tab': this.focusBefore, 'down|j|tab': this.focusAfter, + 'esc': this.blur, 'm|o': () => this.menu(true), 's': this.toggleShowContent, '1': () => this.reactDirectly('like'), From 7bc9de03a6013cd0d4d979193f2429aa0532c403 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Wed, 19 Sep 2018 02:39:15 +0900 Subject: [PATCH 322/539] fix(package): update webpack to version 4.19.1 (#2732) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4da69b44a9..cf468ee98b 100644 --- a/package.json +++ b/package.json @@ -219,7 +219,7 @@ "vuex-persistedstate": "2.5.4", "web-push": "3.3.2", "webfinger.js": "2.6.6", - "webpack": "4.19.0", + "webpack": "4.19.1", "webpack-cli": "3.1.0", "websocket": "1.0.26", "ws": "6.0.0", From 89f6b03cd6f434857f2b76c622c5e9c1f8f5d2ce Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Wed, 19 Sep 2018 02:39:57 +0900 Subject: [PATCH 323/539] fix(package): update web-push to version 3.3.3 (#2733) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cf468ee98b..28f856ef0a 100644 --- a/package.json +++ b/package.json @@ -217,7 +217,7 @@ "vuewordcloud": "18.7.11", "vuex": "3.0.1", "vuex-persistedstate": "2.5.4", - "web-push": "3.3.2", + "web-push": "3.3.3", "webfinger.js": "2.6.6", "webpack": "4.19.1", "webpack-cli": "3.1.0", From a23b8cebbcc1fd4aed01464ed19943ca7ac69647 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 19 Sep 2018 02:41:09 +0900 Subject: [PATCH 324/539] 8.54.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 28f856ef0a..3fd494abf4 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.53.0", - "clientVersion": "1.0.9898", + "version": "8.54.0", + "clientVersion": "1.0.9905", "codename": "nighthike", "main": "./built/index.js", "private": true, From 609d68933e16852dc4779266bce4860d2ef72448 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 19 Sep 2018 02:51:06 +0900 Subject: [PATCH 325/539] Add new shortcut --- .../app/desktop/views/components/ui.header.account.vue | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/components/ui.header.account.vue b/src/client/app/desktop/views/components/ui.header.account.vue index 5e26389d89..1e8a45beaf 100644 --- a/src/client/app/desktop/views/components/ui.header.account.vue +++ b/src/client/app/desktop/views/components/ui.header.account.vue @@ -1,5 +1,5 @@ <template> -<div class="account"> +<div class="account" v-hotkey.global="keymap"> <button class="header" :data-active="isOpen" @click="toggle"> <span class="username">{{ $store.state.i.username }}<template v-if="!isOpen">%fa:angle-down%</template><template v-if="isOpen">%fa:angle-up%</template></span> <mk-avatar class="avatar" :user="$store.state.i"/> @@ -63,6 +63,13 @@ export default Vue.extend({ isOpen: false }; }, + computed: { + keymap(): any { + return { + 'a|m': this.toggle + }; + } + }, beforeDestroy() { this.close(); }, From 8414db57f00609377336896de20ffdf565d6c924 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Wed, 19 Sep 2018 07:17:19 +0900 Subject: [PATCH 326/539] Specify AP Cache-Control (#2735) --- src/server/activitypub.ts | 4 ++++ src/server/activitypub/featured.ts | 1 + src/server/activitypub/followers.ts | 1 + src/server/activitypub/following.ts | 1 + src/server/activitypub/outbox.ts | 2 ++ 5 files changed, 9 insertions(+) diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts index 2cbce8cfbc..adbc6639fa 100644 --- a/src/server/activitypub.ts +++ b/src/server/activitypub.ts @@ -75,6 +75,7 @@ router.get('/notes/:note', async (ctx, next) => { } ctx.body = pack(await renderNote(note, false)); + ctx.set('Cache-Control', 'public, max-age=180'); setResponseType(ctx); }); @@ -91,6 +92,7 @@ router.get('/notes/:note/activity', async ctx => { } ctx.body = pack(await packActivity(note)); + ctx.set('Cache-Control', 'public, max-age=180'); setResponseType(ctx); }); @@ -122,6 +124,7 @@ router.get('/users/:user/publickey', async ctx => { if (isLocalUser(user)) { ctx.body = pack(renderKey(user)); + ctx.set('Cache-Control', 'public, max-age=180'); setResponseType(ctx); } else { ctx.status = 400; @@ -136,6 +139,7 @@ async function userInfo(ctx: Router.IRouterContext, user: IUser) { } ctx.body = pack(await renderPerson(user as ILocalUser)); + ctx.set('Cache-Control', 'public, max-age=180'); setResponseType(ctx); } diff --git a/src/server/activitypub/featured.ts b/src/server/activitypub/featured.ts index 93c3700206..f400cc416f 100644 --- a/src/server/activitypub/featured.ts +++ b/src/server/activitypub/featured.ts @@ -34,5 +34,6 @@ export default async (ctx: Router.IRouterContext) => { ); ctx.body = pack(rendered); + ctx.set('Cache-Control', 'private, max-age=0, must-revalidate'); setResponseType(ctx); }; diff --git a/src/server/activitypub/followers.ts b/src/server/activitypub/followers.ts index eb58703443..fcc75fc5b1 100644 --- a/src/server/activitypub/followers.ts +++ b/src/server/activitypub/followers.ts @@ -78,6 +78,7 @@ export default async (ctx: Router.IRouterContext) => { // index page const rendered = renderOrderedCollection(partOf, user.followersCount, `${partOf}?page=true`, null); ctx.body = pack(rendered); + ctx.set('Cache-Control', 'private, max-age=0, must-revalidate'); setResponseType(ctx); } }; diff --git a/src/server/activitypub/following.ts b/src/server/activitypub/following.ts index 80878fd4ca..2c739ff07d 100644 --- a/src/server/activitypub/following.ts +++ b/src/server/activitypub/following.ts @@ -78,6 +78,7 @@ export default async (ctx: Router.IRouterContext) => { // index page const rendered = renderOrderedCollection(partOf, user.followingCount, `${partOf}?page=true`, null); ctx.body = pack(rendered); + ctx.set('Cache-Control', 'private, max-age=0, must-revalidate'); setResponseType(ctx); } }; diff --git a/src/server/activitypub/outbox.ts b/src/server/activitypub/outbox.ts index 1d062f61a1..aeb6f25dd4 100644 --- a/src/server/activitypub/outbox.ts +++ b/src/server/activitypub/outbox.ts @@ -88,6 +88,7 @@ export default async (ctx: Router.IRouterContext) => { ); ctx.body = pack(rendered); + ctx.set('Cache-Control', 'private, max-age=0, must-revalidate'); setResponseType(ctx); } else { // index page @@ -96,6 +97,7 @@ export default async (ctx: Router.IRouterContext) => { `${partOf}?page=true&since_id=000000000000000000000000` ); ctx.body = pack(rendered); + ctx.set('Cache-Control', 'private, max-age=0, must-revalidate'); setResponseType(ctx); } }; From a9a2f4820bc02620917aa6b1703bc5cfff4c36c9 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 19 Sep 2018 08:36:06 +0900 Subject: [PATCH 327/539] Add keyboard shortcut doc --- src/client/app/app.vue | 23 ++++++- src/docs/keyboard-shortcut.ja-JP.md | 96 +++++++++++++++++++++++++++++ src/docs/style.styl | 21 +++++++ 3 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 src/docs/keyboard-shortcut.ja-JP.md diff --git a/src/client/app/app.vue b/src/client/app/app.vue index 7a46e7dea0..9de01ef060 100644 --- a/src/client/app/app.vue +++ b/src/client/app/app.vue @@ -1,3 +1,24 @@ <template> -<router-view id="app"></router-view> +<router-view id="app" v-hotkey.global="keymap"></router-view> </template> + +<script lang="ts"> +import Vue from 'vue'; +import { url, lang } from './config'; + +export default Vue.extend({ + computed: { + keymap(): any { + return { + 'h|slash': this.help + }; + } + }, + + methods: { + help() { + window.open(`${url}/docs/${lang}/keyboard-shortcut`, '_blank'); + } + } +}); +</script> diff --git a/src/docs/keyboard-shortcut.ja-JP.md b/src/docs/keyboard-shortcut.ja-JP.md new file mode 100644 index 0000000000..59101dc290 --- /dev/null +++ b/src/docs/keyboard-shortcut.ja-JP.md @@ -0,0 +1,96 @@ +# Misskeyキーボードショートカットまとめ + +## グローバル +これらのショートカットは基本的にどこでも使えます。 +<table> + <thead> + <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr> + </thead> + <tbody> + <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr> + <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr> + <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr> + <tr><td><kbd class="key">A</kbd>, <kbd class="key">M</kbd></td><td>アカウントメニューを表示/隠す</td><td><b>A</b>ccount, <b>M</b>y, <b>M</b>e, <b>M</b>enu</td></tr> + <tr><td><kbd class="key">Z</kbd></td><td>上部のバーを隠す</td><td><b>Z</b>en</td></tr> + <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr> + </tbody> +</table> + +## 投稿にフォーカスされた状態 +<table> + <thead> + <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr> + </thead> + <tbody> + <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr> + <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr> + <tr><td><kbd class="key">←</kbd>, <kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr> + <tr><td><kbd class="key">→</kbd>, <kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr> + <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">→</kbd></kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr> + <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr> + <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr> + <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr> + <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr> + <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr> + </tbody> +</table> + +## Renoteフォーム +<table> + <thead> + <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr> + </thead> + <tbody> + <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr> + <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr> + <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr> + </tbody> +</table> + +## リアクションフォーム +デフォルトで「👍」にフォーカスが当たっている状態です。 +<table> + <thead> + <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr> + </thead> + <tbody> + <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr> + <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr> + <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr> + <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr> + <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr> + <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定(対応については後述)</td><td>-</td></tr> + <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr> + </tbody> +</table> + +## リアクションと数字キーの対応 +<table> + <thead> + <tr><th>数字キー</th><th>リアクション</th></tr> + </thead> + <tbody> + <tr><td><kbd class="key">1</kbd></td><td>👍</td></tr> + <tr><td><kbd class="key">2</kbd></td><td>❤️</td></tr> + <tr><td><kbd class="key">3</kbd></td><td>😆</td></tr> + <tr><td><kbd class="key">4</kbd></td><td>🤔</td></tr> + <tr><td><kbd class="key">5</kbd></td><td>😮</td></tr> + <tr><td><kbd class="key">6</kbd></td><td>🎉</td></tr> + <tr><td><kbd class="key">7</kbd></td><td>💢</td></tr> + <tr><td><kbd class="key">8</kbd></td><td>😥</td></tr> + <tr><td><kbd class="key">9</kbd></td><td>😇</td></tr> + <tr><td><kbd class="key">0</kbd></td><td>🍮 or 🍣</td></tr> + </tbody> +</table> + +# 例 +<table> + <thead> + <tr><th>ショートカット</th><th>動作</th></tr> + </thead> + <tbody> + <tr><td><kbd class="key">t</kbd><kbd class="key">+</kbd><kbd class="key">+</kbd></td><td>タイムラインの最新の投稿に👍する</td></tr> + <tr><td><kbd class="key">t</kbd><kbd class="key">1</kbd></td><td>タイムラインの最新の投稿に👍する</td></tr> + <tr><td><kbd class="key">t</kbd><kbd class="key">0</kbd></td><td>タイムラインの最新の投稿に🍮する</td></tr> + </tbody> +</table> diff --git a/src/docs/style.styl b/src/docs/style.styl index b01fe493ac..70d77b5499 100644 --- a/src/docs/style.styl +++ b/src/docs/style.styl @@ -128,3 +128,24 @@ pre > code display block padding 16px + +kbd.group + display inline-block + padding 4px + background #fbfbfb + border 1px solid #d6d6d6 + border-radius 4px + box-shadow 0 1px 1px rgba(0, 0, 0, 0.1) + +kbd.key + display inline-block + padding 6px 8px + background #fff + border solid 1px #cecece + border-radius 4px + box-shadow 0 1px 1px rgba(0, 0, 0, 0.1) + +td + > kbd.group, + > kbd.key + margin 4px From 195f676500699bc39beb6eab603ae49dc735ed67 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 19 Sep 2018 08:38:18 +0900 Subject: [PATCH 328/539] 8.55.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 3fd494abf4..802d1d233f 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.54.0", - "clientVersion": "1.0.9905", + "version": "8.55.0", + "clientVersion": "1.0.9909", "codename": "nighthike", "main": "./built/index.js", "private": true, From d9f0e158a35eec183da77e84a3b038fab645bf62 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 19 Sep 2018 14:18:34 +0900 Subject: [PATCH 329/539] Implement #2736 --- .../app/common/scripts/streaming/home.ts | 24 +++++++ .../desktop/views/components/notes.note.vue | 8 ++- .../app/desktop/views/components/timeline.vue | 11 +++- .../desktop/views/pages/deck/deck.note.vue | 8 ++- .../app/mobile/views/components/note.vue | 8 ++- .../app/mobile/views/components/ui.header.vue | 3 - src/client/app/mobile/views/pages/drive.vue | 6 +- .../app/mobile/views/pages/favorites.vue | 2 +- .../app/mobile/views/pages/games/reversi.vue | 2 +- src/client/app/mobile/views/pages/home.vue | 27 +++++++- .../app/mobile/views/pages/messaging-room.vue | 2 +- .../app/mobile/views/pages/messaging.vue | 2 +- src/client/app/mobile/views/pages/note.vue | 2 +- .../app/mobile/views/pages/notifications.vue | 2 +- .../app/mobile/views/pages/settings.vue | 2 +- src/client/app/mobile/views/pages/tag.vue | 2 +- src/client/app/mobile/views/pages/widgets.vue | 2 +- src/models/note-unread.ts | 17 +++++ src/models/note.ts | 4 +- src/models/user.ts | 8 ++- src/server/api/endpoints/i.ts | 1 + src/server/api/stream/home.ts | 4 ++ src/services/note/create.ts | 22 ++++--- src/services/note/read.ts | 62 +++++++++++++++++++ src/services/note/unread.ts | 47 ++++++++++++++ 25 files changed, 239 insertions(+), 39 deletions(-) create mode 100644 src/models/note-unread.ts create mode 100644 src/services/note/read.ts create mode 100644 src/services/note/unread.ts diff --git a/src/client/app/common/scripts/streaming/home.ts b/src/client/app/common/scripts/streaming/home.ts index dd18c70d70..26729507fb 100644 --- a/src/client/app/common/scripts/streaming/home.ts +++ b/src/client/app/common/scripts/streaming/home.ts @@ -50,6 +50,30 @@ export class HomeStream extends Stream { }); }); + this.on('unreadMention', () => { + os.store.dispatch('mergeMe', { + hasUnreadMentions: true + }); + }); + + this.on('readAllUnreadMentions', () => { + os.store.dispatch('mergeMe', { + hasUnreadMentions: false + }); + }); + + this.on('unreadSpecifiedNote', () => { + os.store.dispatch('mergeMe', { + hasUnreadSpecifiedNotes: true + }); + }); + + this.on('readAllUnreadSpecifiedNotes', () => { + os.store.dispatch('mergeMe', { + hasUnreadSpecifiedNotes: false + }); + }); + this.on('clientSettingUpdated', x => { os.store.commit('settings/set', { key: x.key, diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index fdf41a52c9..ac2c1ce97f 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -213,10 +213,14 @@ export default Vue.extend({ methods: { capture(withHandler = false) { if (this.$store.getters.isSignedIn) { - this.connection.send({ + const data = { type: 'capture', id: this.p.id - }); + } as any; + if ((this.p.visibleUserIds || []).includes(this.$store.state.i.id) || (this.p.mentions || []).includes(this.$store.state.i.id)) { + data.read = true; + } + this.connection.send(data); if (withHandler) this.connection.on('note-updated', this.onStreamNoteUpdated); } }, diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue index 9f421a68ed..7d683236bb 100644 --- a/src/client/app/desktop/views/components/timeline.vue +++ b/src/client/app/desktop/views/components/timeline.vue @@ -8,8 +8,8 @@ <span :data-active="src == 'tag'" @click="src = 'tag'" v-if="tagTl">%fa:hashtag% {{ tagTl.title }}</span> <span :data-active="src == 'list'" @click="src = 'list'" v-if="list">%fa:list% {{ list.title }}</span> <div class="buttons"> - <button :data-active="src == 'mentions'" @click="src = 'mentions'" title="%i18n:@mentions%">%fa:at%</button> - <button :data-active="src == 'messages'" @click="src = 'messages'" title="%i18n:@messages%">%fa:envelope R%</button> + <button :data-active="src == 'mentions'" @click="src = 'mentions'" title="%i18n:@mentions%">%fa:at%<i class="badge" v-if="$store.state.i.hasUnreadMentions">%fa:circle%</i></button> + <button :data-active="src == 'messages'" @click="src = 'messages'" title="%i18n:@messages%">%fa:envelope R%<i class="badge" v-if="$store.state.i.hasUnreadSpecifiedNotes">%fa:circle%</i></button> <button @click="chooseTag" title="%i18n:@hashtag%" ref="tagButton">%fa:hashtag%</button> <button @click="chooseList" title="%i18n:@list%" ref="listButton">%fa:list%</button> </div> @@ -202,6 +202,13 @@ root(isDark) line-height 42px color isDark ? #9baec8 : #ccc + > .badge + position absolute + top -4px + right 4px + font-size 10px + color $theme-color + &:hover color isDark ? #b2c1d5 : #aaa diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index 980fb03136..99274b0f41 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -147,10 +147,14 @@ export default Vue.extend({ methods: { capture(withHandler = false) { if (this.$store.getters.isSignedIn) { - this.connection.send({ + const data = { type: 'capture', id: this.p.id - }); + } as any; + if ((this.p.visibleUserIds || []).includes(this.$store.state.i.id) || (this.p.mentions || []).includes(this.$store.state.i.id)) { + data.read = true; + } + this.connection.send(data); if (withHandler) this.connection.on('note-updated', this.onStreamNoteUpdated); } }, diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 8787b39a93..0ce72cab11 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -160,10 +160,14 @@ export default Vue.extend({ methods: { capture(withHandler = false) { if (this.$store.getters.isSignedIn) { - this.connection.send({ + const data = { type: 'capture', id: this.p.id - }); + } as any; + if ((this.p.visibleUserIds || []).includes(this.$store.state.i.id) || (this.p.mentions || []).includes(this.$store.state.i.id)) { + data.read = true; + } + this.connection.send(data); if (withHandler) this.connection.on('note-updated', this.onStreamNoteUpdated); } }, diff --git a/src/client/app/mobile/views/components/ui.header.vue b/src/client/app/mobile/views/components/ui.header.vue index c9b3ab51ae..15c8299c2e 100644 --- a/src/client/app/mobile/views/components/ui.header.vue +++ b/src/client/app/mobile/views/components/ui.header.vue @@ -188,9 +188,6 @@ root(isDark) overflow hidden text-overflow ellipsis - [data-fa], [data-icon] - margin-right 4px - > img display inline-block vertical-align bottom diff --git a/src/client/app/mobile/views/pages/drive.vue b/src/client/app/mobile/views/pages/drive.vue index 27ac956043..c0fc7b48dc 100644 --- a/src/client/app/mobile/views/pages/drive.vue +++ b/src/client/app/mobile/views/pages/drive.vue @@ -1,9 +1,9 @@ <template> <mk-ui> <span slot="header"> - <template v-if="folder">%fa:R folder-open%{{ folder.name }}</template> - <template v-if="file"><mk-file-type-icon data-icon :type="file.type"/>{{ file.name }}</template> - <template v-if="!folder && !file">%fa:cloud%%i18n:@drive%</template> + <template v-if="folder"><span style="margin-right:4px;">%fa:R folder-open%</span>{{ folder.name }}</template> + <template v-if="file"><mk-file-type-icon data-icon :type="file.type" style="margin-right:4px;"/>{{ file.name }}</template> + <template v-if="!folder && !file"><span style="margin-right:4px;">%fa:cloud%</span>%i18n:@drive%</template> </span> <template slot="func"><button @click="fn">%fa:ellipsis-h%</button></template> <mk-drive diff --git a/src/client/app/mobile/views/pages/favorites.vue b/src/client/app/mobile/views/pages/favorites.vue index 6b9aec6a0c..53512e804c 100644 --- a/src/client/app/mobile/views/pages/favorites.vue +++ b/src/client/app/mobile/views/pages/favorites.vue @@ -1,6 +1,6 @@ <template> <mk-ui> - <span slot="header">%fa:star%%i18n:@title%</span> + <span slot="header"><span style="margin-right:4px;">%fa:star%</span>%i18n:@title%</span> <main> <template v-for="favorite in favorites"> diff --git a/src/client/app/mobile/views/pages/games/reversi.vue b/src/client/app/mobile/views/pages/games/reversi.vue index bdadc88a43..f3bba586de 100644 --- a/src/client/app/mobile/views/pages/games/reversi.vue +++ b/src/client/app/mobile/views/pages/games/reversi.vue @@ -1,6 +1,6 @@ <template> <mk-ui> - <span slot="header">%fa:gamepad%%i18n:@reversi%</span> + <span slot="header"><span style="margin-right:4px;">%fa:gamepad%</span>%i18n:@reversi%</span> <mk-reversi :game-id="$route.params.game" @nav="nav" :self-nav="false"/> </mk-ui> </template> diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue index 43afc98b45..ca62d4e2f8 100644 --- a/src/client/app/mobile/views/pages/home.vue +++ b/src/client/app/mobile/views/pages/home.vue @@ -1,7 +1,7 @@ <template> <mk-ui> <span slot="header" @click="showNav = true"> - <span> + <span :class="$style.title"> <span v-if="src == 'home'">%fa:home%%i18n:@home%</span> <span v-if="src == 'local'">%fa:R comments%%i18n:@local%</span> <span v-if="src == 'hybrid'">%fa:share-alt%%i18n:@hybrid%</span> @@ -15,6 +15,7 @@ <template v-if="!showNav">%fa:angle-down%</template> <template v-else>%fa:angle-up%</template> </span> + <i :class="$style.badge" v-if="$store.state.i.hasUnreadMentions || $store.state.i.hasUnreadSpecifiedNotes">%fa:circle%</i> </span> <template slot="func"> @@ -32,8 +33,8 @@ <span :data-active="src == 'hybrid'" @click="src = 'hybrid'" v-if="enableLocalTimeline">%fa:share-alt% %i18n:@hybrid%</span> <span :data-active="src == 'global'" @click="src = 'global'">%fa:globe% %i18n:@global%</span> <div class="hr"></div> - <span :data-active="src == 'mentions'" @click="src = 'mentions'">%fa:at% %i18n:@mentions%</span> - <span :data-active="src == 'messages'" @click="src = 'messages'">%fa:envelope R% %i18n:@messages%</span> + <span :data-active="src == 'mentions'" @click="src = 'mentions'">%fa:at% %i18n:@mentions%<i class="badge" v-if="$store.state.i.hasUnreadMentions">%fa:circle%</i></span> + <span :data-active="src == 'messages'" @click="src = 'messages'">%fa:envelope R% %i18n:@messages%<i class="badge" v-if="$store.state.i.hasUnreadSpecifiedNotes">%fa:circle%</i></span> <template v-if="lists"> <div class="hr" v-if="lists.length > 0"></div> <span v-for="l in lists" :data-active="src == 'list' && list == l" @click="src = 'list'; list = l" :key="l.id">%fa:list% {{ l.title }}</span> @@ -220,6 +221,11 @@ root(isDark) &:not([data-active]):hover background isDark ? #353e4a : #eee + > .badge + margin-left 6px + font-size 10px + color $theme-color + > .tl max-width 680px margin 0 auto @@ -238,3 +244,18 @@ main:not([data-darkmode]) root(false) </style> + +<style lang="stylus" module> +@import '~const.styl' + +.title + i + margin-right 4px + +.badge + margin-left 6px + font-size 10px + color $theme-color + vertical-align middle + +</style> diff --git a/src/client/app/mobile/views/pages/messaging-room.vue b/src/client/app/mobile/views/pages/messaging-room.vue index 401397d856..750ba26294 100644 --- a/src/client/app/mobile/views/pages/messaging-room.vue +++ b/src/client/app/mobile/views/pages/messaging-room.vue @@ -1,7 +1,7 @@ <template> <mk-ui> <span slot="header"> - <template v-if="user">%fa:R comments%{{ user | userName }}</template> + <template v-if="user"><span style="margin-right:4px;">%fa:R comments%</span>{{ user | userName }}</template> <template v-else><mk-ellipsis/></template> </span> <mk-messaging-room v-if="!fetching" :user="user" :is-naked="true"/> diff --git a/src/client/app/mobile/views/pages/messaging.vue b/src/client/app/mobile/views/pages/messaging.vue index 3883505281..98ae79fe6c 100644 --- a/src/client/app/mobile/views/pages/messaging.vue +++ b/src/client/app/mobile/views/pages/messaging.vue @@ -1,6 +1,6 @@ <template> <mk-ui> - <span slot="header">%fa:R comments%%i18n:@messaging%</span> + <span slot="header"><span style="margin-right:4px;">%fa:R comments%</span>%i18n:@messaging%</span> <mk-messaging @navigate="navigate" :header-top="48"/> </mk-ui> </template> diff --git a/src/client/app/mobile/views/pages/note.vue b/src/client/app/mobile/views/pages/note.vue index fee60b350e..d7307c79a8 100644 --- a/src/client/app/mobile/views/pages/note.vue +++ b/src/client/app/mobile/views/pages/note.vue @@ -1,6 +1,6 @@ <template> <mk-ui> - <span slot="header">%fa:R sticky-note%%i18n:@title%</span> + <span slot="header"><span style="margin-right:4px;">%fa:R sticky-note%</span>%i18n:@title%</span> <main v-if="!fetching"> <div> <mk-note-detail :note="note"/> diff --git a/src/client/app/mobile/views/pages/notifications.vue b/src/client/app/mobile/views/pages/notifications.vue index 4d3c8ee534..bddcd457bb 100644 --- a/src/client/app/mobile/views/pages/notifications.vue +++ b/src/client/app/mobile/views/pages/notifications.vue @@ -1,6 +1,6 @@ <template> <mk-ui> - <span slot="header">%fa:R bell%%i18n:@notifications%</span> + <span slot="header"><span style="margin-right:4px;">%fa:R bell%</span>%i18n:@notifications%</span> <template slot="func"><button @click="fn">%fa:check%</button></template> <main> diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index f315c058df..9e90416370 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -1,6 +1,6 @@ <template> <mk-ui> - <span slot="header">%fa:cog%%i18n:@settings%</span> + <span slot="header"><span style="margin-right:4px;">%fa:cog%</span>%i18n:@settings%</span> <main :data-darkmode="$store.state.device.darkmode"> <div class="signin-as" v-html="'%i18n:@signed-in-as%'.replace('{}', `<b>${name}</b>`)"></div> diff --git a/src/client/app/mobile/views/pages/tag.vue b/src/client/app/mobile/views/pages/tag.vue index a545e2b839..3f963501e0 100644 --- a/src/client/app/mobile/views/pages/tag.vue +++ b/src/client/app/mobile/views/pages/tag.vue @@ -1,6 +1,6 @@ <template> <mk-ui> - <span slot="header">%fa:hashtag%{{ $route.params.tag }}</span> + <span slot="header"><span style="margin-right:4px;">%fa:hashtag%</span>{{ $route.params.tag }}</span> <main> <p v-if="!fetching && empty">%fa:search% {{ '%i18n:no-posts-found%'.split('{}')[0] }}{{ q }}{{ '%i18n:no-posts-found%'.split('{}')[1] }}</p> diff --git a/src/client/app/mobile/views/pages/widgets.vue b/src/client/app/mobile/views/pages/widgets.vue index a83103632e..c649529c0e 100644 --- a/src/client/app/mobile/views/pages/widgets.vue +++ b/src/client/app/mobile/views/pages/widgets.vue @@ -1,6 +1,6 @@ <template> <mk-ui> - <span slot="header">%fa:home%%i18n:@dashboard%</span> + <span slot="header"><span style="margin-right:4px;">%fa:home%</span>%i18n:@dashboard%</span> <template slot="func"> <button @click="customizing = !customizing">%fa:cog%</button> </template> diff --git a/src/models/note-unread.ts b/src/models/note-unread.ts new file mode 100644 index 0000000000..62408d23b6 --- /dev/null +++ b/src/models/note-unread.ts @@ -0,0 +1,17 @@ +import * as mongo from 'mongodb'; +import db from '../db/mongodb'; + +const NoteUnread = db.get<INoteUnread>('noteUnreads'); +NoteUnread.createIndex(['userId', 'noteId'], { unique: true }); +export default NoteUnread; + +export interface INoteUnread { + _id: mongo.ObjectID; + noteId: mongo.ObjectID; + userId: mongo.ObjectID; + isSpecified: boolean; + + _note: { + userId: mongo.ObjectID; + }; +} diff --git a/src/models/note.ts b/src/models/note.ts index ce307d061a..ba88e9f481 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -295,8 +295,8 @@ export const pack = async ( delete _note._user; delete _note._reply; - delete _note.repost; - delete _note.mentions; + delete _note._renote; + delete _note._files; if (_note.geo) delete _note.geo.type; // Populate user diff --git a/src/models/user.ts b/src/models/user.ts index b595fa8d71..bacae485a8 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -348,7 +348,8 @@ export const pack = ( me?: string | mongo.ObjectID | IUser, options?: { detail?: boolean, - includeSecrets?: boolean + includeSecrets?: boolean, + includeHasUnreadNotes?: boolean } ) => new Promise<any>(async (resolve, reject) => { @@ -510,6 +511,11 @@ export const pack = ( } } + if (!opts.includeHasUnreadNotes) { + delete _user.hasUnreadSpecifiedNotes; + delete _user.hasUnreadMentions; + } + // resolve promises in _user object _user = await rap(_user); diff --git a/src/server/api/endpoints/i.ts b/src/server/api/endpoints/i.ts index 1f99ef2d8d..5aa2070650 100644 --- a/src/server/api/endpoints/i.ts +++ b/src/server/api/endpoints/i.ts @@ -22,6 +22,7 @@ export default (params: any, user: ILocalUser, app: IApp) => new Promise(async ( // Serialize res(await pack(user, user, { detail: true, + includeHasUnreadNotes: true, includeSecrets: isSecure })); diff --git a/src/server/api/stream/home.ts b/src/server/api/stream/home.ts index f1fced42d7..5575d0d523 100644 --- a/src/server/api/stream/home.ts +++ b/src/server/api/stream/home.ts @@ -9,6 +9,7 @@ import readNotification from '../common/read-notification'; import call from '../call'; import { IApp } from '../../../models/app'; import shouldMuteThisNote from '../../../misc/should-mute-this-note'; +import readNote from '../../../services/note/read'; const log = debug('misskey'); @@ -94,6 +95,9 @@ export default async function( if (!msg.id) return; log(`CAPTURE: ${msg.id} by @${user.username}`); subscriber.on(`note-stream:${msg.id}`, onNoteStream); + if (msg.read) { + readNote(user._id, msg.id); + } break; case 'decapture': diff --git a/src/services/note/create.ts b/src/services/note/create.ts index 7c1e71dcb3..b62b8c43ba 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -25,6 +25,7 @@ import { TextElementMention } from '../../mfm/parse/elements/mention'; import { TextElementHashtag } from '../../mfm/parse/elements/hashtag'; import { updateNoteStats } from '../update-chart'; import { erase, unique } from '../../prelude/array'; +import insertNoteUnread from './unread'; type NotificationType = 'reply' | 'renote' | 'quote' | 'mention'; @@ -170,6 +171,17 @@ export default async (user: IUser, data: Option, silent = false) => new Promise< // Increment notes count (user) incNotesCountOfUser(user); + // 未読通知を作成 + if (data.visibility == 'specified') { + data.visibleUsers.forEach(u => { + insertNoteUnread(u, note, true); + }); + } else { + mentionedUsers.forEach(u => { + insertNoteUnread(u, note, false); + }); + } + if (data.reply) { saveReply(data.reply, note); } @@ -314,16 +326,6 @@ async function publish(user: IUser, note: INote, noteObj: any, reply: INote, ren publishGlobalTimelineStream(noteObj); } - if (note.visibility == 'specified') { - visibleUsers.forEach(async (u) => { - const n = await pack(note, u, { - detail: true - }); - publishUserStream(u._id, 'note', n); - publishHybridTimelineStream(u._id, n); - }); - } - if (['public', 'home', 'followers'].includes(note.visibility)) { // フォロワーに配信 publishToFollowers(note, user, noteActivity); diff --git a/src/services/note/read.ts b/src/services/note/read.ts new file mode 100644 index 0000000000..46918bc38c --- /dev/null +++ b/src/services/note/read.ts @@ -0,0 +1,62 @@ +import * as mongo from 'mongodb'; +import { publishUserStream } from '../../stream'; +import User from '../../models/user'; +import NoteUnread from '../../models/note-unread'; + +/** + * Mark a note as read + */ +export default ( + user: string | mongo.ObjectID, + note: string | mongo.ObjectID +) => new Promise<any>(async (resolve, reject) => { + + const userId: mongo.ObjectID = mongo.ObjectID.prototype.isPrototypeOf(user) + ? user as mongo.ObjectID + : new mongo.ObjectID(user); + + const noteId: mongo.ObjectID = mongo.ObjectID.prototype.isPrototypeOf(note) + ? note as mongo.ObjectID + : new mongo.ObjectID(note); + + // Remove document + await NoteUnread.remove({ + userId: userId, + noteId: noteId + }); + + const count1 = await NoteUnread + .count({ + userId: userId, + isSpecified: false + }, { + limit: 1 + }); + + const count2 = await NoteUnread + .count({ + userId: userId, + isSpecified: true + }, { + limit: 1 + }); + + if (count1 == 0 || count2 == 0) { + User.update({ _id: userId }, { + $set: { + hasUnreadMentions: count1 != 0 || count2 != 0, + hasUnreadSpecifiedNotes: count2 != 0 + } + }); + } + + if (count1 == 0) { + // 全て既読になったイベントを発行 + publishUserStream(userId, 'readAllUnreadMentions'); + } + + if (count2 == 0) { + // 全て既読になったイベントを発行 + publishUserStream(userId, 'readAllUnreadSpecifiedNotes'); + } +}); diff --git a/src/services/note/unread.ts b/src/services/note/unread.ts new file mode 100644 index 0000000000..6e10c8b248 --- /dev/null +++ b/src/services/note/unread.ts @@ -0,0 +1,47 @@ +import NoteUnread from '../../models/note-unread'; +import User, { IUser } from '../../models/user'; +import { INote } from '../../models/note'; +import Mute from '../../models/mute'; +import { publishUserStream } from '../../stream'; + +export default async function(user: IUser, note: INote, isSpecified = false) { + const unread = await NoteUnread.insert({ + noteId: note._id, + userId: user._id, + isSpecified, + _note: { + userId: note.userId + } + }); + + // 3秒経っても既読にならなかったら「未読の投稿がありますよ」イベントを発行する + setTimeout(async () => { + const exist = await NoteUnread.findOne({ _id: unread._id }); + if (exist == null) return; + + //#region ただしミュートされているなら発行しない + const mute = await Mute.find({ + muterId: user._id + }); + const mutedUserIds = mute.map(m => m.muteeId.toString()); + if (mutedUserIds.includes(note.userId.toString())) return; + //#endregion + + User.update({ + _id: user._id + }, { + $set: isSpecified ? { + hasUnreadSpecifiedNotes: true, + hasUnreadMentions: true + } : { + hasUnreadMentions: true + } + }); + + publishUserStream(user._id, 'unreadMention', note._id); + + if (isSpecified) { + publishUserStream(user._id, 'unreadSpecifiedNote', note._id); + } + }, 3000); +} From ea3bcbbc375c35f94d3ecb957f85b8024d146386 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 19 Sep 2018 14:22:46 +0900 Subject: [PATCH 330/539] =?UTF-8?q?=E3=82=AD=E3=83=A3=E3=83=83=E3=82=B7?= =?UTF-8?q?=E3=83=A5=E3=81=AE=E8=A8=AD=E5=AE=9A=E3=82=92=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/web/docs.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/server/web/docs.ts b/src/server/web/docs.ts index 14ccbdd04f..3432861989 100644 --- a/src/server/web/docs.ts +++ b/src/server/web/docs.ts @@ -162,8 +162,7 @@ const router = new Router(); router.get('/assets/*', async ctx => { await send(ctx, ctx.params[0], { root: `${__dirname}/../../docs/assets/`, - maxage: ms('7 days'), - immutable: true + maxage: ms('1 days') }); }); From 7576569dc97a8e1390a7a841b1944187134ff9dd Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 19 Sep 2018 14:24:40 +0900 Subject: [PATCH 331/539] 8.56.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 802d1d233f..a20cc12ae7 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.55.0", - "clientVersion": "1.0.9909", + "version": "8.56.0", + "clientVersion": "1.0.9912", "codename": "nighthike", "main": "./built/index.js", "private": true, From faf29b768f0d774401b234a40eb227bf33cbe034 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 19 Sep 2018 17:29:03 +0900 Subject: [PATCH 332/539] Make admin can delete any note --- src/client/app/common/views/components/note-menu.vue | 5 +++++ src/server/api/endpoints/notes/delete.ts | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue index c9912fb1e2..08fae46dd6 100644 --- a/src/client/app/common/views/components/note-menu.vue +++ b/src/client/app/common/views/components/note-menu.vue @@ -33,12 +33,16 @@ export default Vue.extend({ text: '%i18n:@pin%', action: this.pin }); + } + + if (this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin) { items.push({ icon: '%fa:trash-alt R%', text: '%i18n:@delete%', action: this.del }); } + if (this.note.uri) { items.push({ icon: '%fa:external-link-square-alt%', @@ -48,6 +52,7 @@ export default Vue.extend({ } }); } + return items; } }, diff --git a/src/server/api/endpoints/notes/delete.ts b/src/server/api/endpoints/notes/delete.ts index 6d9826cf7b..741a8a1dc0 100644 --- a/src/server/api/endpoints/notes/delete.ts +++ b/src/server/api/endpoints/notes/delete.ts @@ -21,14 +21,17 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = // Fetch note const note = await Note.findOne({ - _id: noteId, - userId: user._id + _id: noteId }); if (note === null) { return rej('note not found'); } + if (!user.isAdmin && !note.userId.equals(user._id)) { + return rej('access denied'); + } + await deleteNote(user, note); res(); From cd7f8b080e50fa6f4ae094262d33cf7f750c4ea7 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 20 Sep 2018 04:56:24 +0900 Subject: [PATCH 333/539] Fix #2738 --- src/misc/should-mute-this-note.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/misc/should-mute-this-note.ts b/src/misc/should-mute-this-note.ts index c818115a3c..663e60af6d 100644 --- a/src/misc/should-mute-this-note.ts +++ b/src/misc/should-mute-this-note.ts @@ -1,13 +1,19 @@ +import * as mongo from 'mongodb'; + +function toString(id: any) { + return mongo.ObjectID.prototype.isPrototypeOf(id) ? (id as mongo.ObjectID).toHexString() : id; +} + export default function(note: any, mutedUserIds: string[]): boolean { - if (mutedUserIds.indexOf(note.userId) != -1) { + if (mutedUserIds.includes(toString(note.userId))) { return true; } - if (note.reply != null && mutedUserIds.indexOf(note.reply.userId) != -1) { + if (note.reply != null && mutedUserIds.includes(toString(note.reply.userId))) { return true; } - if (note.renote != null && mutedUserIds.indexOf(note.renote.userId) != -1) { + if (note.renote != null && mutedUserIds.includes(toString(note.renote.userId))) { return true; } From 54224826961e07b16679fdc083b6af2a30936241 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 20 Sep 2018 06:27:41 +0900 Subject: [PATCH 334/539] Resolve #1153 --- src/mfm/parse/elements/quote.ts | 2 +- test/mfm.ts | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/mfm/parse/elements/quote.ts b/src/mfm/parse/elements/quote.ts index ea99240d5f..aa932cbf8d 100644 --- a/src/mfm/parse/elements/quote.ts +++ b/src/mfm/parse/elements/quote.ts @@ -9,7 +9,7 @@ export type TextElementQuote = { }; export default function(text: string) { - const match = text.match(/^"([\s\S]+?)\n"/); + const match = text.match(/^"([\s\S]+?)\n"/) || text.match(/^>([\s\S]+?)\n\n/) || text.match(/^\n>([\s\S]+?)\n\n/) || text.match(/^>([\s\S]+?)$/); if (!match) return null; const quote = match[0]; return { diff --git a/test/mfm.ts b/test/mfm.ts index a015092f0c..25a7c290e4 100644 --- a/test/mfm.ts +++ b/test/mfm.ts @@ -87,6 +87,20 @@ describe('Text', () => { ], tokens2); }); + it('quote', () => { + const tokens1 = analyze('> foo\nbar\baz'); + assert.deepEqual([ + { type: 'quote', content: '> foo\nbar\baz', quote: 'foo\nbar\baz' } + ], tokens1); + + const tokens2 = analyze('before\n> foo\nbar\baz\n\nafter'); + assert.deepEqual([ + { type: 'text', content: 'before' }, + { type: 'quote', content: '\n> foo\nbar\baz\n\n', quote: 'foo\nbar\baz' }, + { type: 'text', content: 'after' } + ], tokens2); + }); + it('url', () => { const tokens = analyze('https://himasaku.net'); assert.deepEqual([{ From 51a1f30225f1124028aac69c7370574b09c25a29 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Thu, 20 Sep 2018 06:29:03 +0900 Subject: [PATCH 335/539] fix(package): update @types/webpack to version 4.4.12 (#2739) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a20cc12ae7..9162687c56 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "@types/systeminformation": "3.23.0", "@types/tmp": "0.0.33", "@types/uuid": "3.4.4", - "@types/webpack": "4.4.11", + "@types/webpack": "4.4.12", "@types/webpack-stream": "3.2.10", "@types/websocket": "0.0.40", "@types/ws": "6.0.1", From 6341807d02f17f420435194801476fa2cbb069c9 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 20 Sep 2018 16:16:01 +0900 Subject: [PATCH 336/539] :art: --- src/client/app/desktop/views/components/home.vue | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index 79c9a9a517..db1e404352 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -38,7 +38,7 @@ </div> </div> </div> - <div class="main"> + <div class="main" :class="{ withBg: $store.state.i.wallpaperUrl != null }"> <template v-if="customize"> <x-draggable v-for="place in ['left', 'right']" :list="widgets[place]" @@ -340,7 +340,10 @@ root(isDark) display flex justify-content center margin 0 auto - max-width 1220px + max-width 1230px + + &.withBg + background rgba(isDark ? #000 : #fff, 0.5) > * .customize-container From 77a0450b5d84d83d39b45485d9fe60103e30808e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 20 Sep 2018 16:21:51 +0900 Subject: [PATCH 337/539] :art: --- src/client/app/desktop/views/components/home.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index db1e404352..4f4f894065 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -340,7 +340,7 @@ root(isDark) display flex justify-content center margin 0 auto - max-width 1230px + max-width 1240px &.withBg background rgba(isDark ? #000 : #fff, 0.5) @@ -358,7 +358,7 @@ root(isDark) > .main padding 16px - width calc(100% - 275px * 2) + width calc(100% - 280px * 2) order 2 > .form @@ -374,7 +374,7 @@ root(isDark) border-radius 0 > *:not(.main) - width 275px + width 280px padding 16px 0 16px 0 > *:not(:last-child) From d058ecc4ea0bb2b242ba5cc525dc9442964b5939 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 20 Sep 2018 17:21:16 +0900 Subject: [PATCH 338/539] Resolve #2698 --- .../views/pages/admin/admin.dashboard.vue | 14 +++++++++- .../app/desktop/views/pages/welcome.vue | 24 +++++++++++++++++ src/client/app/mobile/views/pages/welcome.vue | 26 ++++++++++++++++++- src/models/meta.ts | 1 + src/server/api/endpoints/admin/update-meta.ts | 10 +++++++ src/server/api/endpoints/meta.ts | 3 ++- 6 files changed, 75 insertions(+), 3 deletions(-) diff --git a/src/client/app/desktop/views/pages/admin/admin.dashboard.vue b/src/client/app/desktop/views/pages/admin/admin.dashboard.vue index c86c30db17..5d0f6d451e 100644 --- a/src/client/app/desktop/views/pages/admin/admin.dashboard.vue +++ b/src/client/app/desktop/views/pages/admin/admin.dashboard.vue @@ -14,6 +14,14 @@ </div> <div class="form"> + <div> + <label> + <p>%i18n:@banner-url%</p> + <input v-model="bannerUrl"> + </label> + <button class="ui" @click="updateMeta">%i18n:@save%</button> + </div> + <div> <label> <input type="checkbox" v-model="disableRegistration" @change="updateMeta"> @@ -46,6 +54,7 @@ export default Vue.extend({ stats: null, disableRegistration: false, disableLocalTimeline: false, + bannerUrl: null, inviteCode: null, connection: null, connectionId: null @@ -58,6 +67,7 @@ export default Vue.extend({ (this as any).os.getMeta().then(meta => { this.disableRegistration = meta.disableRegistration; this.disableLocalTimeline = meta.disableLocalTimeline; + this.bannerUrl = meta.bannerUrl; }); (this as any).api('stats').then(stats => { @@ -76,7 +86,8 @@ export default Vue.extend({ updateMeta() { (this as any).api('admin/update-meta', { disableRegistration: this.disableRegistration, - disableLocalTimeline: this.disableLocalTimeline + disableLocalTimeline: this.disableLocalTimeline, + bannerUrl: this.bannerUrl }); } } @@ -114,6 +125,7 @@ export default Vue.extend({ > .form > div + padding 16px border-bottom solid 1px #eee </style> diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index ea1734f8c7..913fa6b21b 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -1,5 +1,7 @@ <template> <div class="mk-welcome"> + <div class="banner" :style="{ backgroundImage: banner ? `url(${banner})` : null }"></div> + <button @click="dark"> <template v-if="$store.state.device.darkmode">%fa:moon%</template> <template v-else>%fa:R moon%</template> @@ -154,6 +156,7 @@ export default Vue.extend({ return { meta: null, stats: null, + banner: null, copyright, host, name: 'Misskey', @@ -169,6 +172,7 @@ export default Vue.extend({ this.name = meta.name; this.description = meta.description; this.announcements = meta.broadcasts; + this.banner = meta.bannerUrl; }); (this as any).api('stats').then(stats => { @@ -308,6 +312,26 @@ root(isDark) //background-position center //background-size cover + > .banner + position absolute + top 0 + left 0 + width 100% + height 400px + background-position center + background-size cover + opacity 0.7 + + &:after + content "" + display block + position absolute + bottom 0 + left 0 + width 100% + height 100px + background linear-gradient(transparent, isDark ? #191b22 : #f7f7f7) + > .forkit position absolute top 0 diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue index 74f43f2c71..65a7af93a9 100644 --- a/src/client/app/mobile/views/pages/welcome.vue +++ b/src/client/app/mobile/views/pages/welcome.vue @@ -1,5 +1,7 @@ <template> <div class="wgwfgvvimdjvhjfwxropcwksnzftjqes"> + <div class="banner" :style="{ backgroundImage: banner ? `url(${banner})` : null }"></div> + <div> <img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"> <p class="host">{{ host }}</p> @@ -80,6 +82,7 @@ export default Vue.extend({ meta: null, copyright, stats: null, + banner: null, host, name: 'Misskey', description: '', @@ -93,6 +96,7 @@ export default Vue.extend({ this.name = meta.name; this.description = meta.description; this.announcements = meta.broadcasts; + this.banner = meta.bannerUrl; }); (this as any).api('stats').then(stats => { @@ -121,7 +125,27 @@ root(isDark) text-align center //background #fff - > div + > .banner + position absolute + top 0 + left 0 + width 100% + height 300px + background-position center + background-size cover + opacity 0.7 + + &:after + content "" + display block + position absolute + bottom 0 + left 0 + width 100% + height 100px + background linear-gradient(transparent, isDark ? #191b22 : #f7f7f7) + + > div:not(.banner) padding 32px margin 0 auto max-width 500px diff --git a/src/models/meta.ts b/src/models/meta.ts index 8ca68416f8..3c0347485c 100644 --- a/src/models/meta.ts +++ b/src/models/meta.ts @@ -14,4 +14,5 @@ export type IMeta = { disableRegistration?: boolean; disableLocalTimeline?: boolean; hidedTags?: string[]; + bannerUrl?: string; }; diff --git a/src/server/api/endpoints/admin/update-meta.ts b/src/server/api/endpoints/admin/update-meta.ts index 3f5cd56b2f..f0ebfbe936 100644 --- a/src/server/api/endpoints/admin/update-meta.ts +++ b/src/server/api/endpoints/admin/update-meta.ts @@ -34,6 +34,12 @@ export const meta = { 'ja-JP': '統計などで無視するハッシュタグ' } }), + + bannerUrl: $.str.optional.nullable.note({ + desc: { + 'ja-JP': 'インスタンスのバナー画像URL' + } + }), } }; @@ -59,6 +65,10 @@ export default (params: any) => new Promise(async (res, rej) => { set.hidedTags = ps.hidedTags; } + if (ps.bannerUrl !== undefined) { + set.bannerUrl = ps.bannerUrl; + } + await Meta.update({}, { $set: set }, { upsert: true }); diff --git a/src/server/api/endpoints/meta.ts b/src/server/api/endpoints/meta.ts index 18b0882f76..6c585d2c3a 100644 --- a/src/server/api/endpoints/meta.ts +++ b/src/server/api/endpoints/meta.ts @@ -38,6 +38,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => driveCapacityPerLocalUserMb: config.localDriveCapacityMb, recaptchaSitekey: config.recaptcha ? config.recaptcha.site_key : null, swPublickey: config.sw ? config.sw.public_key : null, - hidedTags: (me && me.isAdmin) ? meta.hidedTags : undefined + hidedTags: (me && me.isAdmin) ? meta.hidedTags : undefined, + bannerUrl: meta.bannerUrl }); }); From 6283b7668e0bc2b00dcb4e77d3e6b8678761664a Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Thu, 20 Sep 2018 17:23:26 +0900 Subject: [PATCH 339/539] fix(package): update @types/koa-router to version 7.0.32 (#2740) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9162687c56..6161db4feb 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@types/koa-logger": "3.1.0", "@types/koa-mount": "3.0.1", "@types/koa-multer": "1.0.0", - "@types/koa-router": "7.0.31", + "@types/koa-router": "7.0.32", "@types/koa-send": "4.1.1", "@types/koa-views": "2.0.3", "@types/koa__cors": "2.2.3", From 01131e2606c0ca1439d0e167aeb2ab5d78f3c204 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 20 Sep 2018 17:23:55 +0900 Subject: [PATCH 340/539] 8.57.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 6161db4feb..4688a04caa 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.56.0", - "clientVersion": "1.0.9912", + "version": "8.57.0", + "clientVersion": "1.0.9922", "codename": "nighthike", "main": "./built/index.js", "private": true, From 51b0244cf2003fcbeec813ea523954ad92952051 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Fri, 21 Sep 2018 04:30:29 +0900 Subject: [PATCH 341/539] fix(package): update websocket to version 1.0.28 (#2746) Closes #2743 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4688a04caa..351b3b31b0 100644 --- a/package.json +++ b/package.json @@ -221,7 +221,7 @@ "webfinger.js": "2.6.6", "webpack": "4.19.1", "webpack-cli": "3.1.0", - "websocket": "1.0.26", + "websocket": "1.0.28", "ws": "6.0.0", "xev": "2.0.1" }, From a5f817d8962ff16b68109f0b55267fa021c6d3e8 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 21 Sep 2018 08:33:24 +0900 Subject: [PATCH 342/539] Fix #2744 --- src/mfm/parse/elements/quote.ts | 17 ++++++++++++----- test/mfm.ts | 18 ++++++++++++++---- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/mfm/parse/elements/quote.ts b/src/mfm/parse/elements/quote.ts index aa932cbf8d..994ce98ca8 100644 --- a/src/mfm/parse/elements/quote.ts +++ b/src/mfm/parse/elements/quote.ts @@ -8,13 +8,20 @@ export type TextElementQuote = { quote: string }; -export default function(text: string) { - const match = text.match(/^"([\s\S]+?)\n"/) || text.match(/^>([\s\S]+?)\n\n/) || text.match(/^\n>([\s\S]+?)\n\n/) || text.match(/^>([\s\S]+?)$/); +export default function(text: string, index: number) { + const match = text.match(/^"([\s\S]+?)\n"/) || text.match(/^\n>([\s\S]+?)(\n\n|$)/) || + (index == 0 ? text.match(/^>([\s\S]+?)(\n\n|$)/) : null); + if (!match) return null; - const quote = match[0]; + + const quote = match[1] + .split('\n') + .map(line => line.replace(/^>+/g, '').trim()) + .join('\n'); + return { type: 'quote', - content: quote, - quote: match[1].trim(), + content: match[0], + quote: quote, } as TextElementQuote; } diff --git a/test/mfm.ts b/test/mfm.ts index 25a7c290e4..b0c793e44b 100644 --- a/test/mfm.ts +++ b/test/mfm.ts @@ -88,17 +88,27 @@ describe('Text', () => { }); it('quote', () => { - const tokens1 = analyze('> foo\nbar\baz'); + const tokens1 = analyze('> foo\nbar\nbaz'); assert.deepEqual([ - { type: 'quote', content: '> foo\nbar\baz', quote: 'foo\nbar\baz' } + { type: 'quote', content: '> foo\nbar\nbaz', quote: 'foo\nbar\nbaz' } ], tokens1); - const tokens2 = analyze('before\n> foo\nbar\baz\n\nafter'); + const tokens2 = analyze('before\n> foo\nbar\nbaz\n\nafter'); assert.deepEqual([ { type: 'text', content: 'before' }, - { type: 'quote', content: '\n> foo\nbar\baz\n\n', quote: 'foo\nbar\baz' }, + { type: 'quote', content: '\n> foo\nbar\nbaz\n\n', quote: 'foo\nbar\nbaz' }, { type: 'text', content: 'after' } ], tokens2); + + const tokens3 = analyze('piyo> foo\nbar\nbaz'); + assert.deepEqual([ + { type: 'text', content: 'piyo> foo\nbar\nbaz' } + ], tokens3); + + const tokens4 = analyze('> foo\n> bar\n> baz'); + assert.deepEqual([ + { type: 'quote', content: '> foo\n> bar\n> baz', quote: 'foo\nbar\nbaz' } + ], tokens4); }); it('url', () => { From 80b6e8090e93fbeb556171a8b7356cc8127bbd13 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Fri, 21 Sep 2018 08:35:06 +0900 Subject: [PATCH 343/539] fix(package): update @types/bcryptjs to version 2.4.2 (#2742) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 351b3b31b0..d3b31e75df 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@koa/cors": "2.2.2", "@prezzemolo/rap": "0.1.2", "@prezzemolo/zip": "0.0.3", - "@types/bcryptjs": "2.4.1", + "@types/bcryptjs": "2.4.2", "@types/dateformat": "1.0.1", "@types/debug": "0.0.30", "@types/deep-equal": "1.0.1", From 00a3f8d3929c55a165f6f00877c847162139d5c6 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 21 Sep 2018 08:37:26 +0900 Subject: [PATCH 344/539] Fix #2741 --- src/services/note/unread.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/services/note/unread.ts b/src/services/note/unread.ts index 6e10c8b248..2d50976283 100644 --- a/src/services/note/unread.ts +++ b/src/services/note/unread.ts @@ -5,6 +5,14 @@ import Mute from '../../models/mute'; import { publishUserStream } from '../../stream'; export default async function(user: IUser, note: INote, isSpecified = false) { + //#region ミュートしているなら無視 + const mute = await Mute.find({ + muterId: user._id + }); + const mutedUserIds = mute.map(m => m.muteeId.toString()); + if (mutedUserIds.includes(note.userId.toString())) return; + //#endregion + const unread = await NoteUnread.insert({ noteId: note._id, userId: user._id, @@ -19,14 +27,6 @@ export default async function(user: IUser, note: INote, isSpecified = false) { const exist = await NoteUnread.findOne({ _id: unread._id }); if (exist == null) return; - //#region ただしミュートされているなら発行しない - const mute = await Mute.find({ - muterId: user._id - }); - const mutedUserIds = mute.map(m => m.muteeId.toString()); - if (mutedUserIds.includes(note.userId.toString())) return; - //#endregion - User.update({ _id: user._id }, { From 382b1d2250bb532e5a7a291b83fb797fb775f7cc Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 21 Sep 2018 08:40:12 +0900 Subject: [PATCH 345/539] 8.57.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d3b31e75df..0c25f7dbeb 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.57.0", - "clientVersion": "1.0.9922", + "version": "8.57.1", + "clientVersion": "1.0.9928", "codename": "nighthike", "main": "./built/index.js", "private": true, From ecc235c545542c4083566d074a97ba0e97da701d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 21 Sep 2018 16:43:46 +0900 Subject: [PATCH 346/539] Fix bug --- src/server/api/endpoints/notes/delete.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/api/endpoints/notes/delete.ts b/src/server/api/endpoints/notes/delete.ts index 741a8a1dc0..2fe36897c0 100644 --- a/src/server/api/endpoints/notes/delete.ts +++ b/src/server/api/endpoints/notes/delete.ts @@ -1,7 +1,7 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; import Note from '../../../../models/note'; import deleteNote from '../../../../services/note/delete'; -import { ILocalUser } from '../../../../models/user'; +import User, { ILocalUser } from '../../../../models/user'; export const meta = { desc: { @@ -32,7 +32,7 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = return rej('access denied'); } - await deleteNote(user, note); + await deleteNote(await User.findOne({ _id: note.userId }), note); res(); }); From 0a870b8e7ee42c442d2519e025cea76d9fb78cb4 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Sat, 22 Sep 2018 05:11:53 +0900 Subject: [PATCH 347/539] fix(package): update @types/node to version 10.10.2 (#2750) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0c25f7dbeb..fdb3552b01 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "@types/mocha": "5.2.3", "@types/mongodb": "3.1.7", "@types/ms": "0.7.30", - "@types/node": "10.10.1", + "@types/node": "10.10.2", "@types/portscanner": "2.1.0", "@types/pug": "2.0.4", "@types/qrcode": "1.2.0", From 82d94b59634306fa8c76080af4fa1f2189b52ff2 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 22 Sep 2018 08:49:14 +0900 Subject: [PATCH 348/539] Fix #2747 --- src/client/app/desktop/views/pages/user/user.photos.vue | 2 +- src/client/app/mobile/views/pages/user/home.photos.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/app/desktop/views/pages/user/user.photos.vue b/src/client/app/desktop/views/pages/user/user.photos.vue index c5cd9e24fe..d4c5a47f92 100644 --- a/src/client/app/desktop/views/pages/user/user.photos.vue +++ b/src/client/app/desktop/views/pages/user/user.photos.vue @@ -4,7 +4,7 @@ <p class="initializing" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@loading%<mk-ellipsis/></p> <div class="stream" v-if="!fetching && images.length > 0"> <div v-for="image in images" class="img" - :style="`background-image: url(${image.url})`" + :style="`background-image: url(${image.thumbnailUrl})`" ></div> </div> <p class="empty" v-if="!fetching && images.length == 0">%i18n:@no-photos%</p> diff --git a/src/client/app/mobile/views/pages/user/home.photos.vue b/src/client/app/mobile/views/pages/user/home.photos.vue index e9025ec816..261a3f796c 100644 --- a/src/client/app/mobile/views/pages/user/home.photos.vue +++ b/src/client/app/mobile/views/pages/user/home.photos.vue @@ -4,7 +4,7 @@ <div class="stream" v-if="!fetching && images.length > 0"> <a v-for="image in images" class="img" - :style="`background-image: url(${image.media.url})`" + :style="`background-image: url(${image.media.thumbnailUrl})`" :href="image.note | notePage" ></a> </div> From 251629ab612e3345843b9a49dd29e01787310972 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 22 Sep 2018 15:58:11 +0900 Subject: [PATCH 349/539] :art: --- .../app/common/views/widgets/broadcast.vue | 58 ++++++++++--------- .../app/desktop/views/components/calendar.vue | 3 +- .../desktop/views/components/note-detail.vue | 3 +- .../app/desktop/views/components/timeline.vue | 4 +- .../desktop/views/components/ui.header.vue | 2 +- .../views/components/widget-container.vue | 5 +- .../pages/user/user.followers-you-know.vue | 3 +- .../desktop/views/pages/user/user.friends.vue | 3 +- .../desktop/views/pages/user/user.header.vue | 3 +- .../desktop/views/pages/user/user.photos.vue | 3 +- .../desktop/views/pages/user/user.profile.vue | 3 +- .../app/desktop/views/pages/user/user.vue | 6 +- .../app/desktop/views/widgets/profile.vue | 48 ++++++++------- 13 files changed, 67 insertions(+), 77 deletions(-) diff --git a/src/client/app/common/views/widgets/broadcast.vue b/src/client/app/common/views/widgets/broadcast.vue index f2fa720f52..c471229f15 100644 --- a/src/client/app/common/views/widgets/broadcast.vue +++ b/src/client/app/common/views/widgets/broadcast.vue @@ -1,25 +1,30 @@ <template> -<div class="anltbovirfeutcigvwgmgxipejaeozxi" - :data-found="announcements && announcements.length != 0" - :data-melt="props.design == 1" - :data-mobile="platform == 'mobile'" -> - <div class="icon"> - <svg height="32" version="1.1" viewBox="0 0 32 32" width="32"> - <path class="tower" d="M16.04,11.24c1.79,0,3.239-1.45,3.239-3.24S17.83,4.76,16.04,4.76c-1.79,0-3.24,1.45-3.24,3.24 C12.78,9.78,14.24,11.24,16.04,11.24z M16.04,13.84c-0.82,0-1.66-0.2-2.4-0.6L7.34,29.98h2.98l1.72-2h8l1.681,2H24.7L18.42,13.24 C17.66,13.64,16.859,13.84,16.04,13.84z M16.02,14.8l2.02,7.2h-4L16.02,14.8z M12.04,25.98l2-2h4l2,2H12.04z"></path> - <path class="wave a" d="M4.66,1.04c-0.508-0.508-1.332-0.508-1.84,0c-1.86,1.92-2.8,4.44-2.8,6.94c0,2.52,0.94,5.04,2.8,6.96 c0.5,0.52,1.32,0.52,1.82,0s0.5-1.36,0-1.88C3.28,11.66,2.6,9.82,2.6,7.98S3.28,4.3,4.64,2.9C5.157,2.391,5.166,1.56,4.66,1.04z"></path> - <path class="wave b" d="M9.58,12.22c0.5-0.5,0.5-1.34,0-1.84C8.94,9.72,8.62,8.86,8.62,8s0.32-1.72,0.96-2.38c0.5-0.52,0.5-1.34,0-1.84 C9.346,3.534,9.02,3.396,8.68,3.4c-0.32,0-0.66,0.12-0.9,0.38C6.64,4.94,6.08,6.48,6.08,8s0.58,3.06,1.7,4.22 C8.28,12.72,9.1,12.72,9.58,12.22z"></path> - <path class="wave c" d="M22.42,3.78c-0.5,0.5-0.5,1.34,0,1.84c0.641,0.66,0.96,1.52,0.96,2.38s-0.319,1.72-0.96,2.38c-0.5,0.52-0.5,1.34,0,1.84 c0.487,0.497,1.285,0.505,1.781,0.018c0.007-0.006,0.013-0.012,0.02-0.018c1.139-1.16,1.699-2.7,1.699-4.22s-0.561-3.06-1.699-4.22 c-0.494-0.497-1.297-0.5-1.794-0.007C22.424,3.775,22.422,3.778,22.42,3.78z"></path> - <path class="wave d" d="M29.18,1.06c-0.479-0.502-1.273-0.522-1.775-0.044c-0.016,0.015-0.029,0.029-0.045,0.044c-0.5,0.52-0.5,1.36,0,1.88 c1.361,1.4,2.041,3.24,2.041,5.08s-0.68,3.66-2.041,5.08c-0.5,0.52-0.5,1.36,0,1.88c0.509,0.508,1.332,0.508,1.841,0 c1.86-1.92,2.8-4.44,2.8-6.96C31.99,5.424,30.98,2.931,29.18,1.06z"></path> - </svg> - </div> - <p class="fetching" v-if="fetching">%i18n:@fetching%<mk-ellipsis/></p> - <h1 v-if="!fetching">{{ announcements.length == 0 ? '%i18n:@no-broadcasts%' : announcements[i].title }}</h1> - <p v-if="!fetching"> - <span v-if="announcements.length != 0" v-html="announcements[i].text"></span> - <template v-if="announcements.length == 0">%i18n:@have-a-nice-day%</template> - </p> - <a v-if="announcements.length > 1" @click="next">%i18n:@next% >></a> +<div class="anltbovirfeutcigvwgmgxipejaeozxi"> + <mk-widget-container :show-header="false" :naked="props.design == 1"> + <div class="anltbovirfeutcigvwgmgxipejaeozxi-body" + :data-found="announcements && announcements.length != 0" + :data-melt="props.design == 1" + :data-mobile="platform == 'mobile'" + :data-darkmode="$store.state.device.darkmode" + > + <div class="icon"> + <svg height="32" version="1.1" viewBox="0 0 32 32" width="32"> + <path class="tower" d="M16.04,11.24c1.79,0,3.239-1.45,3.239-3.24S17.83,4.76,16.04,4.76c-1.79,0-3.24,1.45-3.24,3.24 C12.78,9.78,14.24,11.24,16.04,11.24z M16.04,13.84c-0.82,0-1.66-0.2-2.4-0.6L7.34,29.98h2.98l1.72-2h8l1.681,2H24.7L18.42,13.24 C17.66,13.64,16.859,13.84,16.04,13.84z M16.02,14.8l2.02,7.2h-4L16.02,14.8z M12.04,25.98l2-2h4l2,2H12.04z"></path> + <path class="wave a" d="M4.66,1.04c-0.508-0.508-1.332-0.508-1.84,0c-1.86,1.92-2.8,4.44-2.8,6.94c0,2.52,0.94,5.04,2.8,6.96 c0.5,0.52,1.32,0.52,1.82,0s0.5-1.36,0-1.88C3.28,11.66,2.6,9.82,2.6,7.98S3.28,4.3,4.64,2.9C5.157,2.391,5.166,1.56,4.66,1.04z"></path> + <path class="wave b" d="M9.58,12.22c0.5-0.5,0.5-1.34,0-1.84C8.94,9.72,8.62,8.86,8.62,8s0.32-1.72,0.96-2.38c0.5-0.52,0.5-1.34,0-1.84 C9.346,3.534,9.02,3.396,8.68,3.4c-0.32,0-0.66,0.12-0.9,0.38C6.64,4.94,6.08,6.48,6.08,8s0.58,3.06,1.7,4.22 C8.28,12.72,9.1,12.72,9.58,12.22z"></path> + <path class="wave c" d="M22.42,3.78c-0.5,0.5-0.5,1.34,0,1.84c0.641,0.66,0.96,1.52,0.96,2.38s-0.319,1.72-0.96,2.38c-0.5,0.52-0.5,1.34,0,1.84 c0.487,0.497,1.285,0.505,1.781,0.018c0.007-0.006,0.013-0.012,0.02-0.018c1.139-1.16,1.699-2.7,1.699-4.22s-0.561-3.06-1.699-4.22 c-0.494-0.497-1.297-0.5-1.794-0.007C22.424,3.775,22.422,3.778,22.42,3.78z"></path> + <path class="wave d" d="M29.18,1.06c-0.479-0.502-1.273-0.522-1.775-0.044c-0.016,0.015-0.029,0.029-0.045,0.044c-0.5,0.52-0.5,1.36,0,1.88 c1.361,1.4,2.041,3.24,2.041,5.08s-0.68,3.66-2.041,5.08c-0.5,0.52-0.5,1.36,0,1.88c0.509,0.508,1.332,0.508,1.841,0 c1.86-1.92,2.8-4.44,2.8-6.96C31.99,5.424,30.98,2.931,29.18,1.06z"></path> + </svg> + </div> + <p class="fetching" v-if="fetching">%i18n:@fetching%<mk-ellipsis/></p> + <h1 v-if="!fetching">{{ announcements.length == 0 ? '%i18n:@no-broadcasts%' : announcements[i].title }}</h1> + <p v-if="!fetching"> + <span v-if="announcements.length != 0" v-html="announcements[i].text"></span> + <template v-if="announcements.length == 0">%i18n:@have-a-nice-day%</template> + </p> + <a v-if="announcements.length > 1" @click="next">%i18n:@next% >></a> + </div> + </mk-widget-container> </div> </template> @@ -68,11 +73,10 @@ export default define({ <style lang="stylus" scoped> root(isDark) padding 10px - border solid 1px #4078c0 - border-radius 6px + background isDark ? #253a50 : #f3f9ff &[data-melt] - border none + background transparent &[data-found] padding-left 50px @@ -133,7 +137,7 @@ root(isDark) z-index 1 margin 0 font-size 0.7em - color isDark ? #fff : #555 + color isDark ? #fff : #57616f &.fetching text-align center @@ -146,10 +150,10 @@ root(isDark) > p color #fff -.anltbovirfeutcigvwgmgxipejaeozxi[data-darkmode] +.anltbovirfeutcigvwgmgxipejaeozxi-body[data-darkmode] root(true) -.anltbovirfeutcigvwgmgxipejaeozxi:not([data-darkmode]) +.anltbovirfeutcigvwgmgxipejaeozxi-body:not([data-darkmode]) root(false) </style> diff --git a/src/client/app/desktop/views/components/calendar.vue b/src/client/app/desktop/views/components/calendar.vue index de9650b21b..0280f07a61 100644 --- a/src/client/app/desktop/views/components/calendar.vue +++ b/src/client/app/desktop/views/components/calendar.vue @@ -133,8 +133,7 @@ export default Vue.extend({ root(isDark) color isDark ? #c5ced6 : #777 background isDark ? #282C37 : #fff - border solid 1px rgba(#000, 0.075) - border-radius 6px + box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) overflow hidden &[data-melt] diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index 7307eeb7dc..670be422fe 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -231,8 +231,7 @@ root(isDark) overflow hidden text-align left background isDark ? #282C37 : #fff - border solid 1px rgba(#000, 0.1) - border-radius 8px + box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) > .read-more display block diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue index 7d683236bb..75324c6b1d 100644 --- a/src/client/app/desktop/views/components/timeline.vue +++ b/src/client/app/desktop/views/components/timeline.vue @@ -179,14 +179,12 @@ export default Vue.extend({ root(isDark) background isDark ? #282C37 : #fff - border solid 1px rgba(#000, 0.075) - border-radius 6px + box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) > header padding 0 8px z-index 10 background isDark ? #313543 : #fff - border-radius 6px 6px 0 0 box-shadow 0 1px isDark ? rgba(#000, 0.15) : rgba(#000, 0.08) > .buttons diff --git a/src/client/app/desktop/views/components/ui.header.vue b/src/client/app/desktop/views/components/ui.header.vue index ac8a6c7765..f1e37cc577 100644 --- a/src/client/app/desktop/views/components/ui.header.vue +++ b/src/client/app/desktop/views/components/ui.header.vue @@ -125,7 +125,7 @@ root(isDark) top 0 z-index 1000 width 100% - box-shadow 0 1px 1px rgba(#000, 0.075) + box-shadow 0 0px 8px rgba(#000, 0.2) > .warn display block diff --git a/src/client/app/desktop/views/components/widget-container.vue b/src/client/app/desktop/views/components/widget-container.vue index 7cfcd68eba..f9f07a919c 100644 --- a/src/client/app/desktop/views/components/widget-container.vue +++ b/src/client/app/desktop/views/components/widget-container.vue @@ -36,13 +36,12 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) background isDark ? #282C37 : #fff - border solid 1px rgba(#000, isDark ? 0.2 : 0.075) - border-radius 6px + box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) overflow hidden &.naked background transparent !important - border none !important + box-shadow none !important > header background isDark ? #313543 : #fff diff --git a/src/client/app/desktop/views/pages/user/user.followers-you-know.vue b/src/client/app/desktop/views/pages/user/user.followers-you-know.vue index 0e7e3f1d77..1c848000b2 100644 --- a/src/client/app/desktop/views/pages/user/user.followers-you-know.vue +++ b/src/client/app/desktop/views/pages/user/user.followers-you-know.vue @@ -38,8 +38,7 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) background isDark ? #282C37 : #fff - border solid 1px rgba(#000, 0.075) - border-radius 6px + box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) > .title z-index 1 diff --git a/src/client/app/desktop/views/pages/user/user.friends.vue b/src/client/app/desktop/views/pages/user/user.friends.vue index a238565588..499a276bfe 100644 --- a/src/client/app/desktop/views/pages/user/user.friends.vue +++ b/src/client/app/desktop/views/pages/user/user.friends.vue @@ -42,8 +42,7 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) background isDark ? #282C37 : #fff - border solid 1px rgba(#000, 0.075) - border-radius 6px + box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) overflow hidden > .title diff --git a/src/client/app/desktop/views/pages/user/user.header.vue b/src/client/app/desktop/views/pages/user/user.header.vue index 4b434ec219..ac7057d3b4 100644 --- a/src/client/app/desktop/views/pages/user/user.header.vue +++ b/src/client/app/desktop/views/pages/user/user.header.vue @@ -104,8 +104,7 @@ export default Vue.extend({ root(isDark) background isDark ? #282C37 : #fff - border 1px solid rgba(#000, 0.075) - border-radius 6px + box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) overflow hidden &[data-is-dark-background] diff --git a/src/client/app/desktop/views/pages/user/user.photos.vue b/src/client/app/desktop/views/pages/user/user.photos.vue index d4c5a47f92..fd4e5813b2 100644 --- a/src/client/app/desktop/views/pages/user/user.photos.vue +++ b/src/client/app/desktop/views/pages/user/user.photos.vue @@ -41,8 +41,7 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) background isDark ? #282C37 : #fff - border solid 1px rgba(#000, 0.075) - border-radius 6px + box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) overflow hidden > .title diff --git a/src/client/app/desktop/views/pages/user/user.profile.vue b/src/client/app/desktop/views/pages/user/user.profile.vue index efd5be4672..7674df3884 100644 --- a/src/client/app/desktop/views/pages/user/user.profile.vue +++ b/src/client/app/desktop/views/pages/user/user.profile.vue @@ -87,8 +87,7 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) background isDark ? #282C37 : #fff - border solid 1px rgba(#000, 0.075) - border-radius 6px + box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) > *:first-child border-top none !important diff --git a/src/client/app/desktop/views/pages/user/user.vue b/src/client/app/desktop/views/pages/user/user.vue index 89dbd41b84..89e7dbd47b 100644 --- a/src/client/app/desktop/views/pages/user/user.vue +++ b/src/client/app/desktop/views/pages/user/user.vue @@ -118,8 +118,7 @@ root(isDark) margin-right 16px > .timeline - border 1px solid rgba(#000, 0.075) - border-radius 6px + box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) > .side width 275px @@ -138,8 +137,7 @@ root(isDark) font-size 12px color #aaa background isDark ? #21242f : #fff - border solid 1px rgba(#000, 0.075) - border-radius 6px + box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) a color #999 diff --git a/src/client/app/desktop/views/widgets/profile.vue b/src/client/app/desktop/views/widgets/profile.vue index a22607b612..04ef18c8e3 100644 --- a/src/client/app/desktop/views/widgets/profile.vue +++ b/src/client/app/desktop/views/widgets/profile.vue @@ -1,20 +1,25 @@ <template> -<div class="mkw-profile" - :data-compact="props.design == 1 || props.design == 2" - :data-melt="props.design == 2" -> - <div class="banner" - :style="$store.state.i.bannerUrl ? `background-image: url(${$store.state.i.bannerUrl})` : ''" - title="%i18n:@update-banner%" - @click="() => os.apis.updateBanner()" - ></div> - <mk-avatar class="avatar" :user="$store.state.i" - :disable-link="true" - @click="() => os.apis.updateAvatar()" - title="%i18n:@update-avatar%" - /> - <router-link class="name" :to="$store.state.i | userPage">{{ $store.state.i | userName }}</router-link> - <p class="username">@{{ $store.state.i | acct }}</p> +<div class="egwyvoaaryotefqhqtmiyawwefemjfsd"> + <mk-widget-container :show-header="false" :naked="props.design == 2"> + <div class="egwyvoaaryotefqhqtmiyawwefemjfsd-body" + :data-compact="props.design == 1 || props.design == 2" + :data-melt="props.design == 2" + :data-darkmode="$store.state.device.darkmode" + > + <div class="banner" + :style="$store.state.i.bannerUrl ? `background-image: url(${$store.state.i.bannerUrl})` : ''" + title="%i18n:@update-banner%" + @click="() => os.apis.updateBanner()" + ></div> + <mk-avatar class="avatar" :user="$store.state.i" + :disable-link="true" + @click="() => os.apis.updateAvatar()" + title="%i18n:@update-avatar%" + /> + <router-link class="name" :to="$store.state.i | userPage">{{ $store.state.i | userName }}</router-link> + <p class="username">@{{ $store.state.i | acct }}</p> + </div> + </mk-widget-container> </div> </template> @@ -42,10 +47,6 @@ export default define({ <style lang="stylus" scoped> root(isDark) - overflow hidden - background isDark ? #282c37 : #fff - border solid 1px rgba(#000, 0.075) - border-radius 6px &[data-compact] > .banner:before @@ -75,9 +76,6 @@ root(isDark) display none &[data-melt] - background transparent !important - border none !important - > .banner visibility hidden @@ -120,10 +118,10 @@ root(isDark) font-size 0.9em color isDark ? #606984 : #999 -.mkw-profile[data-darkmode] +.egwyvoaaryotefqhqtmiyawwefemjfsd-body[data-darkmode] root(true) -.mkw-profile:not([data-darkmode]) +.egwyvoaaryotefqhqtmiyawwefemjfsd-body:not([data-darkmode]) root(false) </style> From aa5528d11eacbecc1310227f2671580cac02cc65 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 22 Sep 2018 19:59:37 +0900 Subject: [PATCH 350/539] :art: --- .../app/desktop/views/components/home.vue | 5 +-- .../desktop/views/components/ui.header.vue | 5 +-- .../app/desktop/views/components/ui.vue | 37 +++++++++++++------ 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index 4f4f894065..7d6a1e28a0 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -38,7 +38,7 @@ </div> </div> </div> - <div class="main" :class="{ withBg: $store.state.i.wallpaperUrl != null }"> + <div class="main"> <template v-if="customize"> <x-draggable v-for="place in ['left', 'right']" :list="widgets[place]" @@ -342,9 +342,6 @@ root(isDark) margin 0 auto max-width 1240px - &.withBg - background rgba(isDark ? #000 : #fff, 0.5) - > * .customize-container cursor move diff --git a/src/client/app/desktop/views/components/ui.header.vue b/src/client/app/desktop/views/components/ui.header.vue index f1e37cc577..c8b9bdb2a2 100644 --- a/src/client/app/desktop/views/components/ui.header.vue +++ b/src/client/app/desktop/views/components/ui.header.vue @@ -55,7 +55,7 @@ export default Vue.extend({ }, mounted() { - this.$store.commit('setUiHeaderHeight', 48); + this.$store.commit('setUiHeaderHeight', this.$el.offsetHeight); if (this.$store.getters.isSignedIn) { const ago = (new Date().getTime() - new Date(this.$store.state.i.lastUsedAt).getTime()) / 1000; @@ -120,8 +120,7 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) - position -webkit-sticky - position sticky + position fixed top 0 z-index 1000 width 100% diff --git a/src/client/app/desktop/views/components/ui.vue b/src/client/app/desktop/views/components/ui.vue index a28cb3029e..740eedf43f 100644 --- a/src/client/app/desktop/views/components/ui.vue +++ b/src/client/app/desktop/views/components/ui.vue @@ -1,5 +1,6 @@ <template> -<div class="mk-ui" :style="style" v-hotkey.global="keymap"> +<div class="mk-ui" v-hotkey.global="keymap"> + <div class="bg" v-if="$store.getters.isSignedIn && $store.state.i.wallpaperUrl" :style="style"></div> <x-header class="header" v-show="!zenMode"/> <div class="content"> <slot></slot> @@ -41,6 +42,16 @@ export default Vue.extend({ } }, + watch: { + '$store.state.uiHeaderHeight'() { + this.$el.style.paddingTop = this.$store.state.uiHeaderHeight + 'px'; + } + }, + + mounted() { + this.$el.style.paddingTop = this.$store.state.uiHeaderHeight + 'px'; + }, + methods: { post() { (this as any).apis.post(); @@ -55,20 +66,22 @@ export default Vue.extend({ <style lang="stylus" scoped> .mk-ui - display flex - flex-direction column - flex 1 - background-size cover - background-position center - background-attachment fixed + min-height 100vh + padding-top 48px + + > .bg + position fixed + top 0 + left 0 + width 100% + height 100vh + background-size cover + background-position center + background-attachment fixed + opacity 0.3 > .header @media (max-width 1000px) display none - > .content - display flex - flex-direction column - flex 1 - overflow hidden </style> From 93e5e4afc0d6c5175b1904eec1a6bd6e27d9f8c6 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 22 Sep 2018 20:11:13 +0900 Subject: [PATCH 351/539] :art: --- src/client/app/desktop/views/components/ui.vue | 5 ++++- src/client/app/desktop/views/pages/deck/deck.column.vue | 2 +- src/client/app/desktop/views/pages/deck/deck.vue | 7 ++++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/client/app/desktop/views/components/ui.vue b/src/client/app/desktop/views/components/ui.vue index 740eedf43f..2d1e98447b 100644 --- a/src/client/app/desktop/views/components/ui.vue +++ b/src/client/app/desktop/views/components/ui.vue @@ -1,7 +1,7 @@ <template> <div class="mk-ui" v-hotkey.global="keymap"> <div class="bg" v-if="$store.getters.isSignedIn && $store.state.i.wallpaperUrl" :style="style"></div> - <x-header class="header" v-show="!zenMode"/> + <x-header class="header" v-show="!zenMode" ref="header"/> <div class="content"> <slot></slot> </div> @@ -59,6 +59,9 @@ export default Vue.extend({ toggleZenMode() { this.zenMode = !this.zenMode; + this.$nextTick(() => { + this.$store.commit('setUiHeaderHeight', this.$refs.header.$el.offsetHeight); + }); } } }); diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index abb09775fb..04aa5e82d1 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -279,7 +279,7 @@ root(isDark) height 100% background isDark ? #282C37 : #fff border-radius 6px - box-shadow 0 2px 16px rgba(#000, 0.1) + //box-shadow 0 2px 16px rgba(#000, 0.1) overflow hidden &.draghover diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index e5aeba251a..810770a022 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -1,6 +1,6 @@ <template> <mk-ui :class="$style.root"> - <div class="qlvquzbjribqcaozciifydkngcwtyzje" :data-darkmode="$store.state.device.darkmode"> + <div class="qlvquzbjribqcaozciifydkngcwtyzje" :data-darkmode="$store.state.device.darkmode" :style="style"> <template v-for="ids in layout"> <div v-if="ids.length > 1" class="folder"> <template v-for="id, i in ids"> @@ -35,6 +35,11 @@ export default Vue.extend({ if (this.$store.state.settings.deck == null) return []; if (this.$store.state.settings.deck.layout == null) return this.$store.state.settings.deck.columns.map(c => [c.id]); return this.$store.state.settings.deck.layout; + }, + style(): any { + return { + height: `calc(100vh - ${this.$store.state.uiHeaderHeight}px)` + }; } }, From 3e5330a92bc19f0b0e6ff6dd1a4c4670b508dbf3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 22 Sep 2018 20:39:12 +0900 Subject: [PATCH 352/539] :art: --- locales/ja-JP.yml | 2 ++ .../app/desktop/views/components/calendar.vue | 3 ++- .../desktop/views/components/note-detail.vue | 3 ++- .../app/desktop/views/components/settings.vue | 12 +++++++++++ .../app/desktop/views/components/timeline.vue | 4 +++- .../desktop/views/components/ui.header.vue | 11 ++++++++-- .../views/components/widget-container.vue | 3 ++- .../pages/user/user.followers-you-know.vue | 3 ++- .../desktop/views/pages/user/user.friends.vue | 3 ++- .../desktop/views/pages/user/user.header.vue | 3 ++- .../desktop/views/pages/user/user.photos.vue | 3 ++- .../desktop/views/pages/user/user.profile.vue | 3 ++- .../views/pages/user/user.timeline.vue | 3 ++- .../app/desktop/views/pages/user/user.vue | 10 +++++----- .../app/desktop/views/pages/welcome.vue | 2 +- src/client/app/init.ts | 20 +++++++++++++++++++ src/client/app/store.ts | 2 ++ 17 files changed, 72 insertions(+), 18 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 11dd76d0e6..6ae38d45fd 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -779,6 +779,8 @@ desktop/views/components/settings.vue: choose-wallpaper: "壁紙を選択" delete-wallpaper: "壁紙を削除" dark-mode: "ダークモード" + use-shadow: "UIに影を使用" + rounded-corners: "UIの角を丸める" circle-icons: "円形のアイコンを使用" contrasted-acct: "ユーザー名にコントラストを付ける" gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" diff --git a/src/client/app/desktop/views/components/calendar.vue b/src/client/app/desktop/views/components/calendar.vue index 0280f07a61..e71983f821 100644 --- a/src/client/app/desktop/views/components/calendar.vue +++ b/src/client/app/desktop/views/components/calendar.vue @@ -133,7 +133,8 @@ export default Vue.extend({ root(isDark) color isDark ? #c5ced6 : #777 background isDark ? #282C37 : #fff - box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) + box-shadow var(--shadow) + border-radius var(--round) overflow hidden &[data-melt] diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index 670be422fe..80faae0d42 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -231,7 +231,8 @@ root(isDark) overflow hidden text-align left background isDark ? #282C37 : #fff - box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) + box-shadow var(--shadow) + border-radius var(--round) > .read-more display block diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index 312a7ed56e..cf10ea0f56 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -60,6 +60,8 @@ <button class="ui" @click="updateWallpaper">%i18n:@choose-wallpaper%</button> <button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button> <mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/> + <mk-switch v-model="useShadow" text="%i18n:@use-shadow%"/> + <mk-switch v-model="roundedCorners" text="%i18n:@rounded-corners%"/> <mk-switch v-model="circleIcons" text="%i18n:@circle-icons%"/> <mk-switch v-model="reduceMotion" text="%i18n:common.reduce-motion%"/> <mk-switch v-model="contrastedAcct" text="%i18n:@contrasted-acct%"/> @@ -316,6 +318,16 @@ export default Vue.extend({ set(value) { this.$store.commit('device/set', { key: 'alwaysShowNsfw', value }); } }, + useShadow: { + get() { return this.$store.state.settings.useShadow; }, + set(value) { this.$store.dispatch('settings/set', { key: 'useShadow', value }); } + }, + + roundedCorners: { + get() { return this.$store.state.settings.roundedCorners; }, + set(value) { this.$store.dispatch('settings/set', { key: 'roundedCorners', value }); } + }, + fetchOnScroll: { get() { return this.$store.state.settings.fetchOnScroll; }, set(value) { this.$store.dispatch('settings/set', { key: 'fetchOnScroll', value }); } diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue index 75324c6b1d..c008c175de 100644 --- a/src/client/app/desktop/views/components/timeline.vue +++ b/src/client/app/desktop/views/components/timeline.vue @@ -179,7 +179,9 @@ export default Vue.extend({ root(isDark) background isDark ? #282C37 : #fff - box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) + box-shadow var(--shadow) + border-radius var(--round) + overflow hidden > header padding 0 8px diff --git a/src/client/app/desktop/views/components/ui.header.vue b/src/client/app/desktop/views/components/ui.header.vue index c8b9bdb2a2..bec0ee37ad 100644 --- a/src/client/app/desktop/views/components/ui.header.vue +++ b/src/client/app/desktop/views/components/ui.header.vue @@ -1,5 +1,5 @@ <template> -<div class="header"> +<div class="header" :style="style"> <p class="warn" v-if="env != 'production'">%i18n:common.do-not-use-in-production%</p> <mk-special-message/> <div class="main" ref="main"> @@ -54,6 +54,14 @@ export default Vue.extend({ }; }, + computed: { + style(): any { + return { + 'box-shadow': this.$store.state.settings.useShadow ? '0 0px 8px rgba(0, 0, 0, 0.2)' : 'none' + }; + } + }, + mounted() { this.$store.commit('setUiHeaderHeight', this.$el.offsetHeight); @@ -124,7 +132,6 @@ root(isDark) top 0 z-index 1000 width 100% - box-shadow 0 0px 8px rgba(#000, 0.2) > .warn display block diff --git a/src/client/app/desktop/views/components/widget-container.vue b/src/client/app/desktop/views/components/widget-container.vue index f9f07a919c..fbf7691cd3 100644 --- a/src/client/app/desktop/views/components/widget-container.vue +++ b/src/client/app/desktop/views/components/widget-container.vue @@ -36,7 +36,8 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) background isDark ? #282C37 : #fff - box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) + box-shadow var(--shadow) + border-radius var(--round) overflow hidden &.naked diff --git a/src/client/app/desktop/views/pages/user/user.followers-you-know.vue b/src/client/app/desktop/views/pages/user/user.followers-you-know.vue index 1c848000b2..0965d801c9 100644 --- a/src/client/app/desktop/views/pages/user/user.followers-you-know.vue +++ b/src/client/app/desktop/views/pages/user/user.followers-you-know.vue @@ -38,7 +38,8 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) background isDark ? #282C37 : #fff - box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) + box-shadow var(--shadow) + border-radius var(--round) > .title z-index 1 diff --git a/src/client/app/desktop/views/pages/user/user.friends.vue b/src/client/app/desktop/views/pages/user/user.friends.vue index 499a276bfe..de37dc95c9 100644 --- a/src/client/app/desktop/views/pages/user/user.friends.vue +++ b/src/client/app/desktop/views/pages/user/user.friends.vue @@ -42,7 +42,8 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) background isDark ? #282C37 : #fff - box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) + box-shadow var(--shadow) + border-radius var(--round) overflow hidden > .title diff --git a/src/client/app/desktop/views/pages/user/user.header.vue b/src/client/app/desktop/views/pages/user/user.header.vue index ac7057d3b4..f727910e77 100644 --- a/src/client/app/desktop/views/pages/user/user.header.vue +++ b/src/client/app/desktop/views/pages/user/user.header.vue @@ -104,7 +104,8 @@ export default Vue.extend({ root(isDark) background isDark ? #282C37 : #fff - box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) + box-shadow var(--shadow) + border-radius var(--round) overflow hidden &[data-is-dark-background] diff --git a/src/client/app/desktop/views/pages/user/user.photos.vue b/src/client/app/desktop/views/pages/user/user.photos.vue index fd4e5813b2..591edfd829 100644 --- a/src/client/app/desktop/views/pages/user/user.photos.vue +++ b/src/client/app/desktop/views/pages/user/user.photos.vue @@ -41,7 +41,8 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) background isDark ? #282C37 : #fff - box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) + box-shadow var(--shadow) + border-radius var(--round) overflow hidden > .title diff --git a/src/client/app/desktop/views/pages/user/user.profile.vue b/src/client/app/desktop/views/pages/user/user.profile.vue index 7674df3884..1ea242270a 100644 --- a/src/client/app/desktop/views/pages/user/user.profile.vue +++ b/src/client/app/desktop/views/pages/user/user.profile.vue @@ -87,7 +87,8 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) background isDark ? #282C37 : #fff - box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) + box-shadow var(--shadow) + border-radius var(--round) > *:first-child border-top none !important diff --git a/src/client/app/desktop/views/pages/user/user.timeline.vue b/src/client/app/desktop/views/pages/user/user.timeline.vue index 54221380a7..be6adaac93 100644 --- a/src/client/app/desktop/views/pages/user/user.timeline.vue +++ b/src/client/app/desktop/views/pages/user/user.timeline.vue @@ -116,12 +116,13 @@ export default Vue.extend({ root(isDark) background isDark ? #282C37 : #fff + border-radius var(--round) + overflow hidden > header padding 0 8px z-index 10 background isDark ? #313543 : #fff - border-radius 6px 6px 0 0 box-shadow 0 1px isDark ? rgba(#000, 0.15) : rgba(#000, 0.08) > span diff --git a/src/client/app/desktop/views/pages/user/user.vue b/src/client/app/desktop/views/pages/user/user.vue index 89e7dbd47b..b1ebe2392e 100644 --- a/src/client/app/desktop/views/pages/user/user.vue +++ b/src/client/app/desktop/views/pages/user/user.vue @@ -88,17 +88,16 @@ root(isDark) margin-bottom 16px padding 14px 16px font-size 14px - border-radius 6px + box-shadow var(--shadow) + border-radius var(--round) &.is-suspended color isDark ? #ffb4b4 : #570808 background isDark ? #611d1d : #ffdbdb - border solid 1px isDark ? #d64a4a : #e09696 &.is-remote color isDark ? #ffbd3e : #573c08 background isDark ? #42321c : #fff0db - border solid 1px isDark ? #90733c : #dcbb7b > a font-weight bold @@ -118,7 +117,7 @@ root(isDark) margin-right 16px > .timeline - box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) + box-shadow var(--shadow) > .side width 275px @@ -137,7 +136,8 @@ root(isDark) font-size 12px color #aaa background isDark ? #21242f : #fff - box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) + box-shadow var(--shadow) + border-radius var(--round) a color #999 diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 913fa6b21b..baa27dd8df 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -355,7 +355,7 @@ root(isDark) .block color isDark ? #fff : #444 background isDark ? #282C37 : #fff - box-shadow 0 3px 8px rgba(0, 0, 0, 0.2) + box-shadow var(--shadow) //border-radius 8px overflow auto diff --git a/src/client/app/init.ts b/src/client/app/init.ts index 3a03f8492e..4e1d1b70c7 100644 --- a/src/client/app/init.ts +++ b/src/client/app/init.ts @@ -125,6 +125,26 @@ export default (callback: (launch: (router: VueRouter, api?: (os: MiOS) => API) }); //#endregion + //#region shadow + const shadow = '0 3px 8px rgba(0, 0, 0, 0.2)'; + if (os.store.state.settings.useShadow) document.documentElement.style.setProperty('--shadow', shadow); + os.store.watch(s => { + return s.settings.useShadow; + }, v => { + document.documentElement.style.setProperty('--shadow', v ? shadow : 'none'); + }); + //#endregion + + //#region rounded corners + const round = '6px'; + if (os.store.state.settings.roundedCorners) document.documentElement.style.setProperty('--round', round); + os.store.watch(s => { + return s.settings.roundedCorners; + }, v => { + document.documentElement.style.setProperty('--round', v ? round : '0'); + }); + //#endregion + Vue.mixin({ data() { return { diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 171620ae30..00c08409a6 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -16,6 +16,8 @@ const defaultSettings = { showPostFormOnTopOfTl: false, suggestRecentHashtags: true, showClockOnHeader: true, + useShadow: true, + roundedCorners: false, circleIcons: true, contrastedAcct: true, showFullAcct: false, From 7f2eb641316bb8b22a11cf6dbb2b2538f80d1de1 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Sat, 22 Sep 2018 20:42:05 +0900 Subject: [PATCH 353/539] fix(package): update @types/node to version 10.10.3 (#2753) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fdb3552b01..f40a5dd6a3 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "@types/mocha": "5.2.3", "@types/mongodb": "3.1.7", "@types/ms": "0.7.30", - "@types/node": "10.10.2", + "@types/node": "10.10.3", "@types/portscanner": "2.1.0", "@types/pug": "2.0.4", "@types/qrcode": "1.2.0", From 28cb9cae51ec94f4f6fe885443517c3ff06e7285 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 22 Sep 2018 20:44:05 +0900 Subject: [PATCH 354/539] 8.58.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index f40a5dd6a3..e0892f3b67 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.57.1", - "clientVersion": "1.0.9928", + "version": "8.58.0", + "clientVersion": "1.0.9945", "codename": "nighthike", "main": "./built/index.js", "private": true, From 8028c85c67737d7d6e19a2aacbd3a3f861bc1cb6 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 23 Sep 2018 07:59:48 +0900 Subject: [PATCH 355/539] =?UTF-8?q?=E3=83=80=E3=83=BC=E3=82=AF=E3=83=A2?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=81=AE=E3=82=AD=E3=83=BC=E3=83=9C=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=82=B7=E3=83=A7=E3=83=BC=E3=83=88=E3=82=AB=E3=83=83?= =?UTF-8?q?=E3=83=88=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/app/app.vue | 10 +++++++++- src/docs/keyboard-shortcut.ja-JP.md | 3 ++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/client/app/app.vue b/src/client/app/app.vue index 9de01ef060..e639c9f9ac 100644 --- a/src/client/app/app.vue +++ b/src/client/app/app.vue @@ -10,7 +10,8 @@ export default Vue.extend({ computed: { keymap(): any { return { - 'h|slash': this.help + 'h|slash': this.help, + 'd': this.dark }; } }, @@ -18,6 +19,13 @@ export default Vue.extend({ methods: { help() { window.open(`${url}/docs/${lang}/keyboard-shortcut`, '_blank'); + }, + + dark() { + this.$store.commit('device/set', { + key: 'darkmode', + value: !this.$store.state.device.darkmode + }); } } }); diff --git a/src/docs/keyboard-shortcut.ja-JP.md b/src/docs/keyboard-shortcut.ja-JP.md index 59101dc290..264387242c 100644 --- a/src/docs/keyboard-shortcut.ja-JP.md +++ b/src/docs/keyboard-shortcut.ja-JP.md @@ -1,4 +1,4 @@ -# Misskeyキーボードショートカットまとめ +# キーボードショートカット ## グローバル これらのショートカットは基本的にどこでも使えます。 @@ -11,6 +11,7 @@ <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr> <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr> <tr><td><kbd class="key">A</kbd>, <kbd class="key">M</kbd></td><td>アカウントメニューを表示/隠す</td><td><b>A</b>ccount, <b>M</b>y, <b>M</b>e, <b>M</b>enu</td></tr> + <tr><td><kbd class="key">D</kbd></td><td>ダークモード切り替え</td><td><b>D</b>ark</td></tr> <tr><td><kbd class="key">Z</kbd></td><td>上部のバーを隠す</td><td><b>Z</b>en</td></tr> <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr> </tbody> From e4e668b32753b31d7162b979cd4e6d1a3a280b9f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 23 Sep 2018 16:05:26 +0900 Subject: [PATCH 356/539] Improve performance --- src/services/note/read.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/services/note/read.ts b/src/services/note/read.ts index 46918bc38c..8622597bc0 100644 --- a/src/services/note/read.ts +++ b/src/services/note/read.ts @@ -20,11 +20,15 @@ export default ( : new mongo.ObjectID(note); // Remove document - await NoteUnread.remove({ + const res = await NoteUnread.remove({ userId: userId, noteId: noteId }); + if (res.deletedCount == 0) { + return; + } + const count1 = await NoteUnread .count({ userId: userId, From 49e82adc6c70c19de0897fc7768fd5e22a8a89f3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 23 Sep 2018 16:05:46 +0900 Subject: [PATCH 357/539] =?UTF-8?q?mentions=E3=82=92=E8=AA=AD=E3=81=BF?= =?UTF-8?q?=E8=BE=BC=E3=82=80=E3=81=A8=E3=81=8D=E3=82=82=E6=97=A2=E8=AA=AD?= =?UTF-8?q?=E3=81=AB=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/api/endpoints/notes/mentions.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/server/api/endpoints/notes/mentions.ts b/src/server/api/endpoints/notes/mentions.ts index 8675a9f562..d8d05b78ec 100644 --- a/src/server/api/endpoints/notes/mentions.ts +++ b/src/server/api/endpoints/notes/mentions.ts @@ -4,6 +4,7 @@ import { getFriendIds } from '../../common/get-friends'; import { pack } from '../../../../models/note'; import { ILocalUser } from '../../../../models/user'; import getParams from '../../get-params'; +import read from '../../../../services/note/read'; export const meta = { desc: { @@ -85,6 +86,8 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = sort: sort }); + mentions.forEach(note => read(user._id, note._id)); + // Serialize res(await Promise.all(mentions.map(mention => pack(mention, user)))); }); From 61e05cb50eba150b62c54f577e1f6041b7c2b4dc Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 23 Sep 2018 16:13:33 +0900 Subject: [PATCH 358/539] 8.59.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e0892f3b67..35f7368d9a 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.58.0", - "clientVersion": "1.0.9945", + "version": "8.59.0", + "clientVersion": "1.0.9949", "codename": "nighthike", "main": "./built/index.js", "private": true, From a2e2d5ba776bc27c31a3fd3cd45f563975f764bc Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 23 Sep 2018 19:55:15 +0900 Subject: [PATCH 359/539] =?UTF-8?q?=E9=9D=9E=E3=83=AD=E3=82=B0=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E6=99=82=E3=81=AE=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC?= =?UTF-8?q?=E3=83=9A=E3=83=BC=E3=82=B8=E3=81=AB=E3=82=A4=E3=83=B3=E3=82=B9?= =?UTF-8?q?=E3=82=BF=E3=83=B3=E3=82=B9=E3=81=AE=E7=B4=B9=E4=BB=8B=E3=82=92?= =?UTF-8?q?=E8=A1=A8=E7=A4=BA=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/common/views/components/index.ts | 2 + .../app/common/views/components/instance.vue | 57 +++++++++++++++++++ .../app/desktop/views/pages/user/user.vue | 5 ++ 3 files changed, 64 insertions(+) create mode 100644 src/client/app/common/views/components/instance.vue diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts index 6f8152cea2..0a3d0d0ae6 100644 --- a/src/client/app/common/views/components/index.ts +++ b/src/client/app/common/views/components/index.ts @@ -1,5 +1,6 @@ import Vue from 'vue'; +import instance from './instance.vue'; import cwButton from './cw-button.vue'; import tagCloud from './tag-cloud.vue'; import trends from './trends.vue'; @@ -43,6 +44,7 @@ import uiSelect from './ui/select.vue'; import formButton from './ui/form/button.vue'; import formRadio from './ui/form/radio.vue'; +Vue.component('mk-instance', instance); Vue.component('mk-cw-button', cwButton); Vue.component('mk-tag-cloud', tagCloud); Vue.component('mk-trends', trends); diff --git a/src/client/app/common/views/components/instance.vue b/src/client/app/common/views/components/instance.vue new file mode 100644 index 0000000000..14c6664eff --- /dev/null +++ b/src/client/app/common/views/components/instance.vue @@ -0,0 +1,57 @@ +<template> +<div class="nhasjydimbopojusarffqjyktglcuxjy" v-if="meta"> + <div class="banner" :style="{ backgroundImage: meta.bannerUrl ? `url(${meta.bannerUrl})` : null }"></div> + + <h1>{{ meta.name }}</h1> + <p v-html="meta.description || '%i18n:common.about%'"></p> + <router-link to="/">%i18n:@start%</router-link> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; + +export default Vue.extend({ + data() { + return { + meta: null + } + }, + created() { + (this as any).os.getMeta().then(meta => { + this.meta = meta; + }); + } +}); +</script> + +<style lang="stylus" scoped> +root(isDark) + color isDark ? #fff : #5b646f + background isDark ? #21242f : #fff + text-align center + + > .banner + height 100px + background-position center + background-size cover + + > h1 + margin 16px + font-size 16px + + > p + margin 16px + font-size 14px + + > a + display block + padding-bottom 16px + +.nhasjydimbopojusarffqjyktglcuxjy[data-darkmode] + root(true) + +.nhasjydimbopojusarffqjyktglcuxjy:not([data-darkmode]) + root(false) + +</style> diff --git a/src/client/app/desktop/views/pages/user/user.vue b/src/client/app/desktop/views/pages/user/user.vue index b1ebe2392e..a7065af5e7 100644 --- a/src/client/app/desktop/views/pages/user/user.vue +++ b/src/client/app/desktop/views/pages/user/user.vue @@ -10,6 +10,7 @@ <x-timeline class="timeline" ref="tl" :user="user"/> </div> <div class="side"> + <div class="instance" v-if="!$store.getters.isSignedIn"><mk-instance/></div> <x-profile :user="user"/> <x-twitter :user="user" v-if="user.host === null && user.twitter"/> <mk-calendar @chosen="warp" :start="new Date(user.createdAt)"/> @@ -131,6 +132,10 @@ root(isDark) font-size 0.8em color #aaa + > .instance + box-shadow var(--shadow) + border-radius var(--round) + > .nav padding 16px font-size 12px From cba0dd5e178c08842100f45c840e193032f21551 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Mon, 24 Sep 2018 07:35:39 +0900 Subject: [PATCH 360/539] Fix AP request error message is to long (#2760) --- src/remote/activitypub/resolver.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/remote/activitypub/resolver.ts b/src/remote/activitypub/resolver.ts index 9bbe474d35..e1c12e7e62 100644 --- a/src/remote/activitypub/resolver.ts +++ b/src/remote/activitypub/resolver.ts @@ -55,6 +55,8 @@ export default class Resolver { Accept: 'application/activity+json, application/ld+json' }, json: true + }).catch(e => { + throw new Error(`request error: ${e.message}`); }); if (object === null || ( From d93f76c1af1d9d632e834db51cf46c0fc8be5bd4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 24 Sep 2018 08:00:10 +0900 Subject: [PATCH 361/539] =?UTF-8?q?=E3=83=96=E3=83=AD=E3=83=83=E3=82=AB?= =?UTF-8?q?=E3=83=BC=E3=81=B8=E3=81=AE=E8=AD=A6=E5=91=8A=E3=81=AF=E3=83=AD?= =?UTF-8?q?=E3=82=B0=E3=82=A4=E3=83=B3=E6=99=82=E3=81=AE=E3=81=BF=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/app/common/scripts/fuck-ad-block.ts | 4 ++-- src/client/app/desktop/script.ts | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/client/app/common/scripts/fuck-ad-block.ts b/src/client/app/common/scripts/fuck-ad-block.ts index ed0904aeb3..0c802f1648 100644 --- a/src/client/app/common/scripts/fuck-ad-block.ts +++ b/src/client/app/common/scripts/fuck-ad-block.ts @@ -1,8 +1,8 @@ -require('fuckadblock'); - declare const fuckAdBlock: any; export default (os) => { + require('fuckadblock'); + function adBlockDetected() { os.apis.dialog({ title: '%fa:exclamation-triangle%%i18n:common.adblock.detected%', diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts index e32682286c..8b184a4aae 100644 --- a/src/client/app/desktop/script.ts +++ b/src/client/app/desktop/script.ts @@ -87,10 +87,12 @@ init(async (launch) => { updateBanner: updateBanner(os) })); - /** - * Fuck AD Block - */ - fuckAdBlock(os); + if (os.store.getters.isSignedIn) { + /** + * Fuck AD Block + */ + fuckAdBlock(os); + } /** * Init Notification From 722de350372d1ca0e13abd1d5c4e6cc71766f11a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 24 Sep 2018 08:02:07 +0900 Subject: [PATCH 362/539] Add stats link --- src/client/app/common/views/components/nav.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/client/app/common/views/components/nav.vue b/src/client/app/common/views/components/nav.vue index 27e66358e4..d52c8e27a4 100644 --- a/src/client/app/common/views/components/nav.vue +++ b/src/client/app/common/views/components/nav.vue @@ -2,6 +2,8 @@ <span class="mk-nav"> <a :href="aboutUrl">%i18n:@about%</a> <i>・</i> + <a href="/stats">%i18n:@stats%</a> + <i>・</i> <a :href="repositoryUrl">%i18n:@repository%</a> <i>・</i> <a :href="feedbackUrl" target="_blank">%i18n:@feedback%</a> From 56b8f8b07d162f068f770c01d0509b226c626af9 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 24 Sep 2018 08:04:45 +0900 Subject: [PATCH 363/539] 8.60.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 35f7368d9a..f7bef04973 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.59.0", - "clientVersion": "1.0.9949", + "version": "8.60.0", + "clientVersion": "1.0.9954", "codename": "nighthike", "main": "./built/index.js", "private": true, From 92484be87f909ee69d124a5318dedc0faf73b88c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 24 Sep 2018 16:02:01 +0900 Subject: [PATCH 364/539] Resolve #2762 --- src/services/note/create.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/services/note/create.ts b/src/services/note/create.ts index b62b8c43ba..2f2ac18e9b 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -118,6 +118,11 @@ export default async (user: IUser, data: Option, silent = false) => new Promise< return rej(); } + // Renote対象が「ホームまたは全体」以外の公開範囲ならreject + if (data.renote && data.renote.visibility != 'public' && data.renote.visibility != 'home') { + return rej(); + } + // リプライ対象が自分以外の非公開の投稿なら禁止 if (data.reply && data.reply.visibility == 'private' && !data.reply.userId.equals(user._id)) { return rej(); From 7b4c307c467281a0cedfb35f18a2446bf33e9a85 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 24 Sep 2018 16:07:23 +0900 Subject: [PATCH 365/539] :art: --- src/client/app/desktop/views/components/home.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index 7d6a1e28a0..c9b868422e 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -360,8 +360,8 @@ root(isDark) > .form margin-bottom 16px - border solid 1px rgba(#000, 0.075) - border-radius 4px + box-shadow var(--shadow) + border-radius var(--round) @media (max-width 700px) padding 0 From 59d67d314069c19dcc5c2c7d82f260a9f8c661cd Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 24 Sep 2018 16:26:12 +0900 Subject: [PATCH 366/539] =?UTF-8?q?=E3=83=94=E3=83=B3=E7=95=99=E3=82=81?= =?UTF-8?q?=E3=82=92=E8=A7=A3=E9=99=A4=E3=81=99=E3=82=8B=E3=81=93=E3=81=A8?= =?UTF-8?q?=E3=81=8C=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E3=81=97=E3=81=9F=E3=82=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 1 + .../app/common/views/components/note-menu.vue | 27 +++++++-- src/server/api/endpoints/i/pin.ts | 49 +++++++++------- src/server/api/endpoints/i/unpin.ts | 57 +++++++++++++++++++ .../api/endpoints/notes/favorites/create.ts | 18 ++++-- src/services/i/pin.ts | 22 ++----- 6 files changed, 128 insertions(+), 46 deletions(-) create mode 100644 src/server/api/endpoints/i/unpin.ts diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 6ae38d45fd..db2a155221 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -328,6 +328,7 @@ common/views/components/note-menu.vue: copy-link: "リンクをコピー" favorite: "お気に入り" pin: "ピン留め" + unpin: "ピン留め解除" delete: "削除" delete-confirm: "この投稿を削除しますか?" remote: "投稿元で見る" diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue index 08fae46dd6..a3e80e33de 100644 --- a/src/client/app/common/views/components/note-menu.vue +++ b/src/client/app/common/views/components/note-menu.vue @@ -28,11 +28,19 @@ export default Vue.extend({ }]; if (this.note.userId == this.$store.state.i.id) { - items.push({ - icon: '%fa:thumbtack%', - text: '%i18n:@pin%', - action: this.pin - }); + if (this.$store.state.i.pinnedNoteIds.includes(this.note.id)) { + items.push({ + icon: '%fa:thumbtack%', + text: '%i18n:@unpin%', + action: this.unpin + }); + } else { + items.push({ + icon: '%fa:thumbtack%', + text: '%i18n:@pin%', + action: this.pin + }); + } } if (this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin) { @@ -56,6 +64,7 @@ export default Vue.extend({ return items; } }, + methods: { detail() { this.$router.push(`/notes/${ this.note.id }`); @@ -73,6 +82,14 @@ export default Vue.extend({ }); }, + unpin() { + (this as any).api('i/unpin', { + noteId: this.note.id + }).then(() => { + this.destroyDom(); + }); + }, + del() { if (!window.confirm('%i18n:@delete-confirm%')) return; (this as any).api('notes/delete', { diff --git a/src/server/api/endpoints/i/pin.ts b/src/server/api/endpoints/i/pin.ts index d075976b74..f9ae032b11 100644 --- a/src/server/api/endpoints/i/pin.ts +++ b/src/server/api/endpoints/i/pin.ts @@ -1,21 +1,35 @@ -import * as mongo from 'mongodb'; import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; import User, { ILocalUser } from '../../../../models/user'; import Note from '../../../../models/note'; import { pack } from '../../../../models/user'; import { deliverPinnedChange } from '../../../../services/i/pin'; +import getParams from '../../get-params'; + +export const meta = { + desc: { + 'ja-JP': '指定した投稿をピン留めします。' + }, + + requireCredential: true, + + kind: 'account-write', + + params: { + noteId: $.type(ID).note({ + desc: { + 'ja-JP': '対象の投稿のID' + } + }) + } +}; -/** - * Pin note - */ export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => { - // Get 'noteId' parameter - const [noteId, noteIdErr] = $.type(ID).get(params.noteId); - if (noteIdErr) return rej('invalid noteId param'); + const [ps, psErr] = getParams(meta, params); + if (psErr) return rej(psErr); // Fetch pinee const note = await Note.findOne({ - _id: noteId, + _id: ps.noteId, userId: user._id }); @@ -23,21 +37,17 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res, return rej('note not found'); } - let addedId: mongo.ObjectID; - let removedId: mongo.ObjectID; - const pinnedNoteIds = user.pinnedNoteIds || []; + if (pinnedNoteIds.length > 5) { + return rej('cannot pin more notes'); + } + if (pinnedNoteIds.some(id => id.equals(note._id))) { return rej('already exists'); } pinnedNoteIds.unshift(note._id); - addedId = note._id; - - if (pinnedNoteIds.length > 5) { - removedId = pinnedNoteIds.pop(); - } await User.update(user._id, { $set: { @@ -45,14 +55,13 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res, } }); - // Serialize const iObj = await pack(user, user, { detail: true }); - // Send Add/Remove to followers - deliverPinnedChange(user._id, removedId, addedId); - // Send response res(iObj); + + // Send Add to followers + deliverPinnedChange(user._id, note._id, true); }); diff --git a/src/server/api/endpoints/i/unpin.ts b/src/server/api/endpoints/i/unpin.ts new file mode 100644 index 0000000000..82625ae5fb --- /dev/null +++ b/src/server/api/endpoints/i/unpin.ts @@ -0,0 +1,57 @@ +import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; +import User, { ILocalUser } from '../../../../models/user'; +import Note from '../../../../models/note'; +import { pack } from '../../../../models/user'; +import { deliverPinnedChange } from '../../../../services/i/pin'; +import getParams from '../../get-params'; + +export const meta = { + desc: { + 'ja-JP': '指定した投稿のピン留めを解除します。' + }, + + requireCredential: true, + + kind: 'account-write', + + params: { + noteId: $.type(ID).note({ + desc: { + 'ja-JP': '対象の投稿のID' + } + }) + } +}; + +export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => { + const [ps, psErr] = getParams(meta, params); + if (psErr) return rej(psErr); + + // Fetch unpinee + const note = await Note.findOne({ + _id: ps.noteId, + userId: user._id + }); + + if (note === null) { + return rej('note not found'); + } + + const pinnedNoteIds = (user.pinnedNoteIds || []).filter(id => !id.equals(note._id)); + + await User.update(user._id, { + $set: { + pinnedNoteIds: pinnedNoteIds + } + }); + + const iObj = await pack(user, user, { + detail: true + }); + + // Send response + res(iObj); + + // Send Remove to followers + deliverPinnedChange(user._id, note._id, false); +}); diff --git a/src/server/api/endpoints/notes/favorites/create.ts b/src/server/api/endpoints/notes/favorites/create.ts index daf7780abc..9aefb701ae 100644 --- a/src/server/api/endpoints/notes/favorites/create.ts +++ b/src/server/api/endpoints/notes/favorites/create.ts @@ -2,6 +2,7 @@ import $ from 'cafy'; import ID from '../../../../../misc/cafy-id'; import Favorite from '../../../../../models/favorite'; import Note from '../../../../../models/note'; import { ILocalUser } from '../../../../../models/user'; +import getParams from '../../../get-params'; export const meta = { desc: { @@ -11,17 +12,24 @@ export const meta = { requireCredential: true, - kind: 'favorite-write' + kind: 'favorite-write', + + params: { + noteId: $.type(ID).note({ + desc: { + 'ja-JP': '対象の投稿のID' + } + }) + } }; export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => { - // Get 'noteId' parameter - const [noteId, noteIdErr] = $.type(ID).get(params.noteId); - if (noteIdErr) return rej('invalid noteId param'); + const [ps, psErr] = getParams(meta, params); + if (psErr) return rej(psErr); // Get favoritee const note = await Note.findOne({ - _id: noteId + _id: ps.noteId }); if (note === null) { diff --git a/src/services/i/pin.ts b/src/services/i/pin.ts index 5bf8d166bb..8b7287e68d 100644 --- a/src/services/i/pin.ts +++ b/src/services/i/pin.ts @@ -7,7 +7,7 @@ import renderRemove from '../../remote/activitypub/renderer/remove'; import packAp from '../../remote/activitypub/renderer'; import { deliver } from '../../queue'; -export async function deliverPinnedChange(userId: mongo.ObjectID, oldId?: mongo.ObjectID, newId?: mongo.ObjectID) { +export async function deliverPinnedChange(userId: mongo.ObjectID, noteId: mongo.ObjectID, isAddition: boolean) { const user = await User.findOne({ _id: userId }); @@ -20,21 +20,11 @@ export async function deliverPinnedChange(userId: mongo.ObjectID, oldId?: mongo. const target = `${config.url}/users/${user._id}/collections/featured`; - if (oldId) { - const oldItem = `${config.url}/notes/${oldId}`; - const content = packAp(renderRemove(user, target, oldItem)); - queue.forEach(inbox => { - deliver(user, content, inbox); - }); - } - - if (newId) { - const newItem = `${config.url}/notes/${newId}`; - const content = packAp(renderAdd(user, target, newItem)); - queue.forEach(inbox => { - deliver(user, content, inbox); - }); - } + const item = `${config.url}/notes/${noteId}`; + const content = packAp(isAddition ? renderAdd(user, target, item) : renderRemove(user, target, item)); + queue.forEach(inbox => { + deliver(user, content, inbox); + }); } /** From 87091a2e030fb72b126bc6d393bff68ad2d40c1d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 24 Sep 2018 16:32:51 +0900 Subject: [PATCH 367/539] 8.61.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index f7bef04973..55b7b4687c 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.60.0", - "clientVersion": "1.0.9954", + "version": "8.61.0", + "clientVersion": "1.0.9958", "codename": "nighthike", "main": "./built/index.js", "private": true, From e6cc937ac26cd3fe0042b3068d3898b30110136f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 24 Sep 2018 20:57:32 +0900 Subject: [PATCH 368/539] Check meta key --- src/client/app/common/hotkey.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/client/app/common/hotkey.ts b/src/client/app/common/hotkey.ts index e63fcc9f97..dc1a34338a 100644 --- a/src/client/app/common/hotkey.ts +++ b/src/client/app/common/hotkey.ts @@ -59,7 +59,7 @@ export default { el.dataset.reservedKeys = reservedKeys.map(key => `'${key}'`).join(' '); - el._keyHandler = e => { + el._keyHandler = (e: KeyboardEvent) => { const key = e.code.toLowerCase(); const targetReservedKeys = document.activeElement ? ((document.activeElement as any).dataset || {}).reservedKeys || '' : ''; @@ -72,7 +72,8 @@ export default { const matched = pattern.which.includes(key) && pattern.ctrl == e.ctrlKey && pattern.shift == e.shiftKey && - pattern.alt == e.altKey; + pattern.alt == e.altKey && + e.metaKey == false; if (matched) { e.preventDefault(); From 5da18ba535244ad4d4b4498c39e495d4428b5dff Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 25 Sep 2018 20:44:26 +0900 Subject: [PATCH 369/539] Fix #2766 --- src/client/app/common/views/components/note-menu.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue index a3e80e33de..c8ed1225cc 100644 --- a/src/client/app/common/views/components/note-menu.vue +++ b/src/client/app/common/views/components/note-menu.vue @@ -28,7 +28,7 @@ export default Vue.extend({ }]; if (this.note.userId == this.$store.state.i.id) { - if (this.$store.state.i.pinnedNoteIds.includes(this.note.id)) { + if ((this.$store.state.i.pinnedNoteIds || []).includes(this.note.id)) { items.push({ icon: '%fa:thumbtack%', text: '%i18n:@unpin%', From afdacf14b7d114e542dbed60c029948b2ea5910d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 25 Sep 2018 21:09:38 +0900 Subject: [PATCH 370/539] Add excludeNsfw option --- src/client/app/desktop/views/pages/welcome.vue | 1 + src/client/app/mobile/views/pages/welcome.vue | 1 + src/models/note.ts | 1 + src/server/api/endpoints/drive/files/update.ts | 13 +++++++++++++ src/server/api/endpoints/notes/local-timeline.ts | 13 +++++++++++++ 5 files changed, 29 insertions(+) diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index baa27dd8df..7f5f4b9c37 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -187,6 +187,7 @@ export default Vue.extend({ (this as any).api('notes/local-timeline', { fileType: image, + excludeNsfw: true, limit: 6 }).then((notes: any[]) => { const files = concat(notes.map((n: any): any[] => n.files)); diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue index 65a7af93a9..82ccfeaff5 100644 --- a/src/client/app/mobile/views/pages/welcome.vue +++ b/src/client/app/mobile/views/pages/welcome.vue @@ -111,6 +111,7 @@ export default Vue.extend({ (this as any).api('notes/local-timeline', { fileType: image, + excludeNsfw: true, limit: 6 }).then((notes: any[]) => { const files = concat(notes.map((n: any): any[] => n.files)); diff --git a/src/models/note.ts b/src/models/note.ts index ba88e9f481..f67eeaaf6e 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -20,6 +20,7 @@ Note.createIndex('userId'); Note.createIndex('mentions'); Note.createIndex('visibleUserIds'); Note.createIndex('tagsLower'); +Note.createIndex('_files._id'); Note.createIndex('_files.contentType'); Note.createIndex({ createdAt: -1 diff --git a/src/server/api/endpoints/drive/files/update.ts b/src/server/api/endpoints/drive/files/update.ts index ba9abfec61..3c7932c341 100644 --- a/src/server/api/endpoints/drive/files/update.ts +++ b/src/server/api/endpoints/drive/files/update.ts @@ -4,6 +4,7 @@ import DriveFile, { validateFileName, pack } from '../../../../../models/drive-f import { publishDriveStream } from '../../../../../stream'; import { ILocalUser } from '../../../../../models/user'; import getParams from '../../../get-params'; +import Note from '../../../../../models/note'; export const meta = { desc: { @@ -93,6 +94,18 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = } }); + // ドライブのファイルが非正規化されているドキュメントも更新 + Note.find({ + '_files._id': file._id + }).then(notes => { + notes.forEach(note => { + note._files[note._files.findIndex(f => f._id.equals(file._id))] = file; + Note.findOneAndUpdate({ _id: note._id }, { + _files: note._files + }); + }); + }); + // Serialize const fileObj = await pack(file); diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts index ff10e6fbaa..505454a82f 100644 --- a/src/server/api/endpoints/notes/local-timeline.ts +++ b/src/server/api/endpoints/notes/local-timeline.ts @@ -30,6 +30,13 @@ export const meta = { } }), + excludeNsfw: $.bool.optional.note({ + default: false, + desc: { + 'ja-JP': 'true にすると、NSFW指定されたファイルを除外します(fileTypeが指定されている場合のみ有効)' + } + }), + limit: $.num.optional.range(1, 100).note({ default: 10 }), @@ -97,6 +104,12 @@ export default async (params: any, user: ILocalUser) => { query['_files.contentType'] = { $in: ps.fileType }; + + if (ps.excludeNsfw) { + query['_files.metadata.isSensitive'] = { + $ne: true + }; + } } if (ps.sinceId) { From 9ca6a6bf064634bab6611f4e70d20a62fd3b48ed Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 25 Sep 2018 21:23:26 +0900 Subject: [PATCH 371/539] =?UTF-8?q?=E3=82=B5=E3=83=BC=E3=83=90=E3=83=BC?= =?UTF-8?q?=E3=81=B8=E3=81=AE=E6=8E=A5=E7=B6=9A=E3=81=8C=E4=B8=8D=E5=AE=89?= =?UTF-8?q?=E5=AE=9A=E3=81=AA=E6=99=82=E3=81=AB=E3=82=B5=E3=82=A4=E3=83=B3?= =?UTF-8?q?=E3=82=A2=E3=82=A6=E3=83=88=E3=81=97=E3=81=AA=E3=81=84=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/app/mios.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/mios.ts b/src/client/app/mios.ts index 0f72cd2f34..ed9e3a6aeb 100644 --- a/src/client/app/mios.ts +++ b/src/client/app/mios.ts @@ -265,7 +265,7 @@ export default class MiOS extends EventEmitter { // When success .then(res => { // When failed to authenticate user - if (res.status !== 200) { + if (res.status !== 200 && res.status < 500) { return this.signout(); } From 31006507c0dde7b4316efdc62f01717632993dbb Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 25 Sep 2018 21:28:06 +0900 Subject: [PATCH 372/539] =?UTF-8?q?=E3=83=93=E3=83=AB=E3=83=89=E3=81=94?= =?UTF-8?q?=E3=81=A8=E3=81=AB=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7=E3=83=B3?= =?UTF-8?q?=E3=82=92=E5=A4=89=E3=81=88=E3=82=8B=E3=81=AE=E3=82=92=E5=BB=83?= =?UTF-8?q?=E6=AD=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webpack.config.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/webpack.config.ts b/webpack.config.ts index 325923084e..3822080574 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -5,7 +5,6 @@ import * as fs from 'fs'; import * as webpack from 'webpack'; import chalk from 'chalk'; -import rndstr from 'rndstr'; const { VueLoaderPlugin } = require('vue-loader'); const minifyHtml = require('html-minifier').minify; const WebpackOnBuildPlugin = require('on-build-webpack'); @@ -19,7 +18,7 @@ const constants = require('./src/const.json'); const locales = require('./locales'); const meta = require('./package.json'); -const version = `${meta.clientVersion}-${rndstr({ length: 8, chars: '0-9a-z' })}`; +const version = meta.clientVersion; const codename = meta.codename; declare var global: { From f6e4a1770e4a1359f730fdd194f0c8f95394b9d8 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 25 Sep 2018 21:38:31 +0900 Subject: [PATCH 373/539] 8.62.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 55b7b4687c..1b786d1a38 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.61.0", - "clientVersion": "1.0.9958", + "version": "8.62.0", + "clientVersion": "1.0.9964", "codename": "nighthike", "main": "./built/index.js", "private": true, From 2b07b3a873e5693556b56dd310944bf744f7d103 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 26 Sep 2018 18:59:37 +0900 Subject: [PATCH 374/539] wip --- src/client/app/app.vue | 7 ++- src/client/app/boot.js | 17 ++++--- src/client/app/common/scripts/theme.ts | 63 ++++++++++++++++++++++++++ src/client/app/desktop/style.styl | 27 +++-------- src/client/app/init.ts | 39 ---------------- src/client/theme/dark.json | 10 ++++ src/client/theme/light.json | 10 ++++ 7 files changed, 103 insertions(+), 70 deletions(-) create mode 100644 src/client/app/common/scripts/theme.ts create mode 100644 src/client/theme/dark.json create mode 100644 src/client/theme/light.json diff --git a/src/client/app/app.vue b/src/client/app/app.vue index e639c9f9ac..d8cd4f0796 100644 --- a/src/client/app/app.vue +++ b/src/client/app/app.vue @@ -5,6 +5,8 @@ <script lang="ts"> import Vue from 'vue'; import { url, lang } from './config'; +import applyTheme from './common/scripts/theme'; +import darkTheme from '../theme/dark.json'; export default Vue.extend({ computed: { @@ -22,10 +24,7 @@ export default Vue.extend({ }, dark() { - this.$store.commit('device/set', { - key: 'darkmode', - value: !this.$store.state.device.darkmode - }); + applyTheme(darkTheme); } } }); diff --git a/src/client/app/boot.js b/src/client/app/boot.js index 25aa26dd19..e122e0423a 100644 --- a/src/client/app/boot.js +++ b/src/client/app/boot.js @@ -20,6 +20,16 @@ const langs = LANGS; + //#region Apply theme + const theme = localStorage.getItem('theme'); + if (theme) { + Object.entries(JSON.parse(theme)).forEach(([k, v]) => { + if (k == 'meta') return; + document.documentElement.style.setProperty(`--${k}`, v.toString()); + }); + } + //#endregion + //#region Load settings let settings = null; const vuex = localStorage.getItem('vuex'); @@ -84,13 +94,6 @@ app = isMobile ? 'mobile' : 'desktop'; } - // Dark/Light - if (settings) { - if (settings.device.darkmode) { - document.documentElement.setAttribute('data-darkmode', 'true'); - } - } - // Script version const ver = localStorage.getItem('v') || VERSION; diff --git a/src/client/app/common/scripts/theme.ts b/src/client/app/common/scripts/theme.ts new file mode 100644 index 0000000000..bc70223519 --- /dev/null +++ b/src/client/app/common/scripts/theme.ts @@ -0,0 +1,63 @@ +export default function(theme: { [key: string]: string }) { + const props = compile(theme); + + Object.entries(props).forEach(([k, v]) => { + if (k == 'meta') return; + document.documentElement.style.setProperty(`--${k}`, v.toString()); + }); +} + +function compile(theme: { [key: string]: string }): { [key: string]: string } { + function getRgba(code: string): number[] { + // ref + if (code[0] == '@') { + return getRgba(theme[code.substr(1)]); + } + + let m; + + //#region #RGB + m = code.match(/^#([0-9a-f]{3})$/i)[1]; + if (m) { + return [ + parseInt(m.charAt(0), 16) * 0x11, + parseInt(m.charAt(1), 16) * 0x11, + parseInt(m.charAt(2), 16) * 0x11, + 255 + ]; + } + //#endregion + + //#region #RRGGBB + m = code.match(/^#([0-9a-f]{6})$/i)[1]; + if (m) { + return [ + parseInt(m.substr(0, 2), 16), + parseInt(m.substr(2, 2), 16), + parseInt(m.substr(4, 2), 16), + 255 + ]; + } + //#endregion + + return [0, 0, 0, 255]; + } + + const props = {}; + + Object.entries(theme).forEach(([k, v]) => { + if (k == 'meta') return; + const [r, g, b, a] = getRgba(v); + props[k] = genValue(r, g, b, a); + props[`${k}-r`] = r; + props[`${k}-g`] = g; + props[`${k}-b`] = b; + props[`${k}-a`] = a; + }); + + return props; +} + +function genValue(r: number, g: number, b: number, a: number): string { + return a != 255 ? `rgba(${r}, ${g}, ${b}, ${a})` : `#${r.toString(16)}${g.toString(16)}${b.toString(16)}`; +} diff --git a/src/client/app/desktop/style.styl b/src/client/app/desktop/style.styl index 3cd36482e4..626671fd25 100644 --- a/src/client/app/desktop/style.styl +++ b/src/client/app/desktop/style.styl @@ -11,34 +11,21 @@ html height 100% - background #f7f7f7 + background var(--bg) &, * &::-webkit-scrollbar width 6px height 6px + &::-webkit-scrollbar-track + background var(--scrollbarTrack) + &::-webkit-scrollbar-thumb - background rgba(0, 0, 0, 0.2) + background var(--scrollbarHandle) &:hover - background rgba(0, 0, 0, 0.4) + background var(--scrollbarHandleHover) &:active - background $theme-color - - &[data-darkmode] - background #191B22 - - &, * - &::-webkit-scrollbar-track - background-color #282C37 - - &::-webkit-scrollbar-thumb - background-color #454954 - - &:hover - background-color #535660 - - &:active - background-color $theme-color + background var(--primary) diff --git a/src/client/app/init.ts b/src/client/app/init.ts index 4e1d1b70c7..7468484b35 100644 --- a/src/client/app/init.ts +++ b/src/client/app/init.ts @@ -86,45 +86,6 @@ export default (callback: (launch: (router: VueRouter, api?: (os: MiOS) => API) const launch = (router: VueRouter, api?: (os: MiOS) => API) => { os.apis = api ? api(os) : null; - //#region Dark/Light - Vue.mixin({ - data() { - return { - _unwatchDarkmode_: null - }; - }, - mounted() { - const apply = v => { - if (this.$el.setAttribute == null) return; - if (v) { - this.$el.setAttribute('data-darkmode', 'true'); - } else { - this.$el.removeAttribute('data-darkmode'); - } - }; - - apply(os.store.state.device.darkmode); - - this._unwatchDarkmode_ = os.store.watch(s => { - return s.device.darkmode; - }, apply); - }, - beforeDestroy() { - this._unwatchDarkmode_(); - } - }); - - os.store.watch(s => { - return s.device.darkmode; - }, v => { - if (v) { - document.documentElement.setAttribute('data-darkmode', 'true'); - } else { - document.documentElement.removeAttribute('data-darkmode'); - } - }); - //#endregion - //#region shadow const shadow = '0 3px 8px rgba(0, 0, 0, 0.2)'; if (os.store.state.settings.useShadow) document.documentElement.style.setProperty('--shadow', shadow); diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json new file mode 100644 index 0000000000..4ea0a1a649 --- /dev/null +++ b/src/client/theme/dark.json @@ -0,0 +1,10 @@ +{ + "meta": { + "name": "Dark" + }, + "primary": "#fb4e4e", + "bg": "#191B22", + "scrollbarTrack": "#282C37", + "scrollbarHandle": "#454954", + "scrollbarHandleHover": "#535660" +} diff --git a/src/client/theme/light.json b/src/client/theme/light.json new file mode 100644 index 0000000000..00a74a53c5 --- /dev/null +++ b/src/client/theme/light.json @@ -0,0 +1,10 @@ +{ + "meta": { + "name": "Light" + }, + "primary": "#fb4e4e", + "bg": "#f7f7f7", + "scrollbarTrack": "#fff", + "scrollbarHandle": "#00000033", + "scrollbarHandleHover": "#00000066" +} From d2d3f7810eaa319fa562377436ad6c70e4736c06 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 26 Sep 2018 19:14:11 +0900 Subject: [PATCH 375/539] wip --- src/client/app/app.vue | 2 +- src/client/app/common/scripts/theme.ts | 18 ++++++++++-------- src/client/app/init.ts | 8 +++++++- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/client/app/app.vue b/src/client/app/app.vue index d8cd4f0796..bb8377c237 100644 --- a/src/client/app/app.vue +++ b/src/client/app/app.vue @@ -6,7 +6,7 @@ import Vue from 'vue'; import { url, lang } from './config'; import applyTheme from './common/scripts/theme'; -import darkTheme from '../theme/dark.json'; +const darkTheme = require('../theme/dark'); export default Vue.extend({ computed: { diff --git a/src/client/app/common/scripts/theme.ts b/src/client/app/common/scripts/theme.ts index bc70223519..7fbac7f574 100644 --- a/src/client/app/common/scripts/theme.ts +++ b/src/client/app/common/scripts/theme.ts @@ -5,6 +5,8 @@ export default function(theme: { [key: string]: string }) { if (k == 'meta') return; document.documentElement.style.setProperty(`--${k}`, v.toString()); }); + + localStorage.setItem('theme', JSON.stringify(props)); } function compile(theme: { [key: string]: string }): { [key: string]: string } { @@ -17,24 +19,24 @@ function compile(theme: { [key: string]: string }): { [key: string]: string } { let m; //#region #RGB - m = code.match(/^#([0-9a-f]{3})$/i)[1]; + m = code.match(/^#([0-9a-f]{3})$/i); if (m) { return [ - parseInt(m.charAt(0), 16) * 0x11, - parseInt(m.charAt(1), 16) * 0x11, - parseInt(m.charAt(2), 16) * 0x11, + parseInt(m[1].charAt(0), 16) * 0x11, + parseInt(m[1].charAt(1), 16) * 0x11, + parseInt(m[1].charAt(2), 16) * 0x11, 255 ]; } //#endregion //#region #RRGGBB - m = code.match(/^#([0-9a-f]{6})$/i)[1]; + m = code.match(/^#([0-9a-f]{6})$/i); if (m) { return [ - parseInt(m.substr(0, 2), 16), - parseInt(m.substr(2, 2), 16), - parseInt(m.substr(4, 2), 16), + parseInt(m[1].substr(0, 2), 16), + parseInt(m[1].substr(2, 2), 16), + parseInt(m[1].substr(4, 2), 16), 255 ]; } diff --git a/src/client/app/init.ts b/src/client/app/init.ts index 7468484b35..8d430ad7ff 100644 --- a/src/client/app/init.ts +++ b/src/client/app/init.ts @@ -8,12 +8,18 @@ import VueRouter from 'vue-router'; import * as TreeView from 'vue-json-tree-view'; import VAnimateCss from 'v-animate-css'; import VModal from 'vue-js-modal'; -import VueHotkey from './common/hotkey'; +import VueHotkey from './common/hotkey'; import App from './app.vue'; import checkForUpdate from './common/scripts/check-for-update'; import MiOS, { API } from './mios'; import { version, codename, lang } from './config'; +import applyTheme from './common/scripts/theme'; +const defaultTheme = require('../theme/light.json'); + +if (localStorage.getItem('theme') == null) { + applyTheme(defaultTheme); +} Vue.use(Vuex); Vue.use(VueRouter); From 904114740b2f87743c332e029a4c6817ebb9e17d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 26 Sep 2018 20:19:35 +0900 Subject: [PATCH 376/539] wip --- package.json | 2 + src/client/app/app.styl | 8 +- src/client/app/common/scripts/theme.ts | 67 +++++++--------- .../common/views/components/autocomplete.vue | 6 +- .../views/components/connect-failed.vue | 12 +-- .../app/common/views/components/forkit.vue | 6 +- .../components/games/reversi/reversi.game.vue | 10 +-- .../games/reversi/reversi.index.vue | 4 +- .../components/games/reversi/reversi.room.vue | 4 +- .../components/games/reversi/reversi.vue | 2 +- .../app/common/views/components/menu.vue | 10 +-- .../views/components/messaging-room.form.vue | 10 +-- .../components/messaging-room.message.vue | 4 +- .../views/components/messaging-room.vue | 10 +-- .../app/common/views/components/messaging.vue | 10 +-- .../common/views/components/note-header.vue | 2 +- .../common/views/components/poll-editor.vue | 22 ++--- .../app/common/views/components/poll.vue | 4 +- .../views/components/reaction-picker.vue | 6 +- .../app/common/views/components/signin.vue | 2 +- .../app/common/views/components/signup.vue | 2 +- .../app/common/views/components/switch.vue | 16 ++-- .../app/common/views/components/ui/button.vue | 16 ++-- .../app/common/views/components/ui/card.vue | 2 +- .../app/common/views/components/ui/form.vue | 2 +- .../views/components/ui/form/button.vue | 28 +++---- .../common/views/components/ui/form/radio.vue | 8 +- .../app/common/views/components/ui/input.vue | 6 +- .../app/common/views/components/ui/radio.vue | 6 +- .../app/common/views/components/ui/select.vue | 6 +- .../app/common/views/components/ui/switch.vue | 8 +- .../common/views/components/ui/textarea.vue | 6 +- .../app/common/views/components/uploader.vue | 30 +++---- .../views/components/visibility-chooser.vue | 6 +- src/client/app/common/views/pages/follow.vue | 22 ++--- .../app/common/views/widgets/analog-clock.vue | 2 +- .../app/common/views/widgets/calendar.vue | 4 +- src/client/app/common/views/widgets/memo.vue | 10 +-- src/client/app/desktop/ui.styl | 36 ++++----- .../app/desktop/views/components/calendar.vue | 10 +-- .../app/desktop/views/components/charts.vue | 4 +- .../choose-file-from-drive-window.vue | 32 ++++---- .../choose-folder-from-drive-window.vue | 20 ++--- .../views/components/context-menu.menu.vue | 12 +-- .../desktop/views/components/crop-window.vue | 24 +++--- .../app/desktop/views/components/dialog.vue | 10 +-- .../desktop/views/components/drive.file.vue | 12 +-- .../desktop/views/components/drive.folder.vue | 14 ++-- .../app/desktop/views/components/drive.vue | 8 +- .../views/components/follow-button.vue | 18 ++--- .../app/desktop/views/components/home.vue | 10 +-- .../desktop/views/components/input-dialog.vue | 30 +++---- .../desktop/views/components/note-detail.vue | 2 +- .../desktop/views/components/notes.note.vue | 8 +- .../app/desktop/views/components/notes.vue | 4 +- .../desktop/views/components/post-form.vue | 80 +++++++++---------- .../views/components/progress-dialog.vue | 22 ++--- .../desktop/views/components/renote-form.vue | 4 +- .../app/desktop/views/components/settings.vue | 4 +- .../views/components/timeline.core.vue | 2 +- .../app/desktop/views/components/timeline.vue | 12 +-- .../views/components/ui.header.account.vue | 12 +-- .../views/components/ui.header.nav.vue | 6 +- .../components/ui.header.notifications.vue | 4 +- .../views/components/ui.header.post.vue | 10 +-- .../views/components/ui.header.search.vue | 4 +- .../desktop/views/components/user-preview.vue | 4 +- .../desktop/views/components/users-list.vue | 6 +- .../app/desktop/views/components/window.vue | 6 +- .../views/pages/admin/admin.announcements.vue | 2 +- .../views/pages/admin/admin.dashboard.vue | 4 +- .../views/pages/admin/admin.hashtags.vue | 2 +- .../views/pages/admin/admin.suspend-user.vue | 2 +- .../pages/admin/admin.unsuspend-user.vue | 2 +- .../views/pages/admin/admin.unverify-user.vue | 2 +- .../views/pages/admin/admin.verify-user.vue | 2 +- .../app/desktop/views/pages/admin/admin.vue | 4 +- .../desktop/views/pages/deck/deck.column.vue | 8 +- .../desktop/views/pages/deck/deck.note.vue | 8 +- .../desktop/views/pages/deck/deck.notes.vue | 2 +- .../app/desktop/views/pages/deck/deck.vue | 2 +- .../views/pages/deck/deck.widgets-column.vue | 2 +- .../app/desktop/views/pages/selectdrive.vue | 32 ++++---- .../app/desktop/views/pages/stats/stats.vue | 4 +- .../desktop/views/pages/user/user.header.vue | 4 +- .../views/pages/user/user.timeline.vue | 6 +- .../app/desktop/views/pages/welcome.vue | 6 +- .../app/desktop/views/widgets/post-form.vue | 10 +-- .../app/mobile/views/components/dialog.vue | 10 +-- .../mobile/views/components/drive.file.vue | 4 +- .../mobile/views/components/follow-button.vue | 22 ++--- .../mobile/views/components/mute-button.vue | 24 +++--- .../mobile/views/components/note-detail.vue | 4 +- .../app/mobile/views/components/note.vue | 8 +- .../app/mobile/views/components/notes.vue | 2 +- .../app/mobile/views/components/post-form.vue | 6 +- .../app/mobile/views/components/ui.header.vue | 6 +- .../app/mobile/views/components/ui.nav.vue | 10 +-- .../mobile/views/components/users-list.vue | 6 +- .../app/mobile/views/pages/favorites.vue | 2 +- src/client/app/mobile/views/pages/home.vue | 12 +-- .../app/mobile/views/pages/notifications.vue | 2 +- .../views/pages/received-follow-requests.vue | 2 +- .../app/mobile/views/pages/user-list.vue | 2 +- .../app/mobile/views/pages/user-lists.vue | 2 +- src/client/app/mobile/views/pages/user.vue | 6 +- src/client/const.styl | 4 - src/client/style.styl | 14 ++-- src/client/theme/dark.json | 1 + src/client/theme/light.json | 1 + 110 files changed, 529 insertions(+), 536 deletions(-) delete mode 100644 src/client/const.styl diff --git a/package.json b/package.json index 1b786d1a38..a3e3b56be4 100644 --- a/package.json +++ b/package.json @@ -75,6 +75,7 @@ "@types/single-line-log": "1.1.0", "@types/speakeasy": "2.0.2", "@types/systeminformation": "3.23.0", + "@types/tinycolor2": "1.4.1", "@types/tmp": "0.0.33", "@types/uuid": "3.4.4", "@types/webpack": "4.4.12", @@ -194,6 +195,7 @@ "systeminformation": "3.45.6", "syuilo-password-strength": "0.0.1", "textarea-caret": "3.1.0", + "tinycolor2": "1.4.1", "tmp": "0.0.33", "ts-loader": "4.4.1", "ts-node": "7.0.1", diff --git a/src/client/app/app.styl b/src/client/app/app.styl index 3911f83a61..2f0095944c 100644 --- a/src/client/app/app.styl +++ b/src/client/app/app.styl @@ -27,7 +27,7 @@ body z-index 65536 .bar - background $theme-color + background var(--primary) position fixed z-index 65537 @@ -44,7 +44,7 @@ body right 0px width 100px height 100% - box-shadow 0 0 10px $theme-color, 0 0 5px $theme-color + box-shadow 0 0 10px var(--primary), 0 0 5px var(--primary) opacity 1 transform rotate(3deg) translate(0px, -4px) @@ -64,8 +64,8 @@ body box-sizing border-box border solid 2px transparent - border-top-color $theme-color - border-left-color $theme-color + border-top-color var(--primary) + border-left-color var(--primary) border-radius 50% animation progress-spinner 400ms linear infinite diff --git a/src/client/app/common/scripts/theme.ts b/src/client/app/common/scripts/theme.ts index 7fbac7f574..2cad547c01 100644 --- a/src/client/app/common/scripts/theme.ts +++ b/src/client/app/common/scripts/theme.ts @@ -1,3 +1,5 @@ +import * as tinycolor from 'tinycolor2'; + export default function(theme: { [key: string]: string }) { const props = compile(theme); @@ -10,56 +12,47 @@ export default function(theme: { [key: string]: string }) { } function compile(theme: { [key: string]: string }): { [key: string]: string } { - function getRgba(code: string): number[] { + function getColor(code: string): tinycolor.Instance { // ref if (code[0] == '@') { - return getRgba(theme[code.substr(1)]); + return getColor(theme[code.substr(1)]); } - let m; - - //#region #RGB - m = code.match(/^#([0-9a-f]{3})$/i); - if (m) { - return [ - parseInt(m[1].charAt(0), 16) * 0x11, - parseInt(m[1].charAt(1), 16) * 0x11, - parseInt(m[1].charAt(2), 16) * 0x11, - 255 - ]; - } - //#endregion - - //#region #RRGGBB - m = code.match(/^#([0-9a-f]{6})$/i); - if (m) { - return [ - parseInt(m[1].substr(0, 2), 16), - parseInt(m[1].substr(2, 2), 16), - parseInt(m[1].substr(4, 2), 16), - 255 - ]; - } - //#endregion - - return [0, 0, 0, 255]; + return tinycolor(code); } const props = {}; Object.entries(theme).forEach(([k, v]) => { if (k == 'meta') return; - const [r, g, b, a] = getRgba(v); - props[k] = genValue(r, g, b, a); - props[`${k}-r`] = r; - props[`${k}-g`] = g; - props[`${k}-b`] = b; - props[`${k}-a`] = a; + const c = getColor(v); + props[k] = genValue(c); + props[`${k}-r`] = c.toRgb().r; + props[`${k}-g`] = c.toRgb().g; + props[`${k}-b`] = c.toRgb().b; + props[`${k}-a`] = c.toRgb().a; }); + const primary = getColor(props['primary']); + + for (let i = 1; i < 10; i++) { + const color = primary.clone().setAlpha(i / 10); + props['primaryAlpha0' + i] = genValue(color); + } + + for (let i = 1; i < 100; i++) { + const color = primary.clone().lighten(i); + props['primaryLighten' + i] = genValue(color); + } + + for (let i = 1; i < 100; i++) { + const color = primary.clone().darken(i); + props['primaryDarken' + i] = genValue(color); + } + return props; } -function genValue(r: number, g: number, b: number, a: number): string { - return a != 255 ? `rgba(${r}, ${g}, ${b}, ${a})` : `#${r.toString(16)}${g.toString(16)}${b.toString(16)}`; +function genValue(c: tinycolor.Instance): string { + return c.toRgbString(); } diff --git a/src/client/app/common/views/components/autocomplete.vue b/src/client/app/common/views/components/autocomplete.vue index ea05afd6dc..99a87520a4 100644 --- a/src/client/app/common/views/components/autocomplete.vue +++ b/src/client/app/common/views/components/autocomplete.vue @@ -259,7 +259,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) position fixed @@ -302,13 +302,13 @@ root(isDark) background isDark ? rgba(#fff, 0.1) : rgba(#000, 0.1) &[data-selected='true'] - background $theme-color + background var(--primary) &, * color #fff !important &:active - background darken($theme-color, 10%) + background var(--primaryDarken10) &, * color #fff !important diff --git a/src/client/app/common/views/components/connect-failed.vue b/src/client/app/common/views/components/connect-failed.vue index 0f686926b0..36cae05665 100644 --- a/src/client/app/common/views/components/connect-failed.vue +++ b/src/client/app/common/views/components/connect-failed.vue @@ -39,7 +39,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .mk-connect-failed width 100% @@ -70,17 +70,17 @@ export default Vue.extend({ display block margin 1em auto 0 auto padding 8px 10px - color $theme-color-foreground - background $theme-color + color var(--primaryForeground) + background var(--primary) &:focus - outline solid 3px rgba($theme-color, 0.3) + outline solid 3px var(--primaryAlpha03) &:hover - background lighten($theme-color, 10%) + background var(--primaryLighten10) &:active - background darken($theme-color, 10%) + background var(--primaryDarken10) > .thanks display block diff --git a/src/client/app/common/views/components/forkit.vue b/src/client/app/common/views/components/forkit.vue index de627181ef..b303b48b79 100644 --- a/src/client/app/common/views/components/forkit.vue +++ b/src/client/app/common/views/components/forkit.vue @@ -9,7 +9,7 @@ </template> <style lang="stylus" scoped> -@import '~const.styl' + .a display block @@ -18,8 +18,8 @@ display block //fill #151513 //color #fff - fill $theme-color - color $theme-color-foreground + fill var(--primary) + color var(--primaryForeground) .octo-arm transform-origin 130px 106px diff --git a/src/client/app/common/views/components/games/reversi/reversi.game.vue b/src/client/app/common/views/components/games/reversi/reversi.game.vue index fea19d917e..bc230496a6 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.game.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.game.vue @@ -304,7 +304,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) text-align center @@ -399,14 +399,14 @@ root(isDark) cursor pointer &:hover - border-color darken($theme-color, 10%) - background $theme-color + border-color var(--primaryDarken10) + background var(--primary) &:active - background darken($theme-color, 10%) + background var(--primaryDarken10) &.prev - box-shadow 0 0 0 4px rgba($theme-color, 0.7) + box-shadow 0 0 0 4px var(--primaryAlpha07) &.isEnded border-color isDark ? #6a767f : #ddd diff --git a/src/client/app/common/views/components/games/reversi/reversi.index.vue b/src/client/app/common/views/components/games/reversi/reversi.index.vue index d23902aae7..f6c7f0e3c2 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.index.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.index.vue @@ -138,7 +138,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) > h1 @@ -200,7 +200,7 @@ root(isDark) user-select none &:focus - border-color $theme-color + border-color var(--primary) &:hover background isDark ? #313543 : #f5f5f5 diff --git a/src/client/app/common/views/components/games/reversi/reversi.room.vue b/src/client/app/common/views/components/games/reversi/reversi.room.vue index fef833d63e..d4b91ae7a7 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.room.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.room.vue @@ -252,7 +252,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) text-align center @@ -288,7 +288,7 @@ root(isDark) &:focus &:active - border-color $theme-color + border-color var(--primary) > div > .random diff --git a/src/client/app/common/views/components/games/reversi/reversi.vue b/src/client/app/common/views/components/games/reversi/reversi.vue index 223ec4597a..75d7d574c1 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.vue @@ -156,7 +156,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) color isDark ? #fff : #677f84 diff --git a/src/client/app/common/views/components/menu.vue b/src/client/app/common/views/components/menu.vue index ad5ec619ba..3b9f07d1ee 100644 --- a/src/client/app/common/views/components/menu.vue +++ b/src/client/app/common/views/components/menu.vue @@ -117,7 +117,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) $bg-color = isDark ? #2c303c : #fff @@ -182,13 +182,13 @@ root(isDark) color isDark ? #d6dce2 : #111 &:hover - color $theme-color-foreground - background $theme-color + color var(--primaryForeground) + background var(--primary) text-decoration none &:active - color $theme-color-foreground - background darken($theme-color, 10%) + color var(--primaryForeground) + background var(--primaryDarken10) > div margin 8px 0 diff --git a/src/client/app/common/views/components/messaging-room.form.vue b/src/client/app/common/views/components/messaging-room.form.vue index f183749fad..90668aee6e 100644 --- a/src/client/app/common/views/components/messaging-room.form.vue +++ b/src/client/app/common/views/components/messaging-room.form.vue @@ -195,7 +195,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) > textarea @@ -234,10 +234,10 @@ root(isDark) transition color 0.1s ease &:hover - color $theme-color + color var(--primary) &:active - color darken($theme-color, 10%) + color var(--primaryDarken10) transition color 0s ease .files @@ -293,10 +293,10 @@ root(isDark) transition color 0.1s ease &:hover - color $theme-color + color var(--primary) &:active - color darken($theme-color, 10%) + color var(--primaryDarken10) transition color 0s ease input[type=file] diff --git a/src/client/app/common/views/components/messaging-room.message.vue b/src/client/app/common/views/components/messaging-room.message.vue index 648d0eee18..e0528d5432 100644 --- a/src/client/app/common/views/components/messaging-room.message.vue +++ b/src/client/app/common/views/components/messaging-room.message.vue @@ -59,10 +59,10 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) - $me-balloon-color = $theme-color + $me-balloon-color = var(--primary) padding 10px 12px 10px 12px background-color transparent diff --git a/src/client/app/common/views/components/messaging-room.vue b/src/client/app/common/views/components/messaging-room.vue index 1de41855df..5bdf8b9034 100644 --- a/src/client/app/common/views/components/messaging-room.vue +++ b/src/client/app/common/views/components/messaging-room.vue @@ -262,7 +262,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) display flex @@ -386,15 +386,15 @@ root(isDark) cursor pointer line-height 32px font-size 12px - color $theme-color-foreground - background $theme-color + color var(--primaryForeground) + background var(--primary) border-radius 16px &:hover - background lighten($theme-color, 10%) + background var(--primaryLighten10) &:active - background darken($theme-color, 10%) + background var(--primaryDarken10) > [data-fa] position absolute diff --git a/src/client/app/common/views/components/messaging.vue b/src/client/app/common/views/components/messaging.vue index 6abfc92dca..7181ddd01c 100644 --- a/src/client/app/common/views/components/messaging.vue +++ b/src/client/app/common/views/components/messaging.vue @@ -167,7 +167,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) @@ -252,8 +252,8 @@ root(isDark) transition border 0.2s ease &:focus - color darken($theme-color, 20%) - border solid 1px $theme-color + color var(--primaryDarken20) + border solid 1px var(--primary) transition color 0, border 0 > .result @@ -287,7 +287,7 @@ root(isDark) &:hover &:focus color #fff - background $theme-color + background var(--primary) .name color #fff @@ -297,7 +297,7 @@ root(isDark) &:active color #fff - background darken($theme-color, 10%) + background var(--primaryDarken10) .name color #fff diff --git a/src/client/app/common/views/components/note-header.vue b/src/client/app/common/views/components/note-header.vue index d25bd430f2..f4a2f00876 100644 --- a/src/client/app/common/views/components/note-header.vue +++ b/src/client/app/common/views/components/note-header.vue @@ -42,7 +42,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) display flex diff --git a/src/client/app/common/views/components/poll-editor.vue b/src/client/app/common/views/components/poll-editor.vue index 30d9799fec..219f0a7fd5 100644 --- a/src/client/app/common/views/components/poll-editor.vue +++ b/src/client/app/common/views/components/poll-editor.vue @@ -68,7 +68,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) padding 8px @@ -105,42 +105,42 @@ root(isDark) font-size 14px color isDark ? #fff : #000 background isDark ? #191b22 : #fff - border solid 1px rgba($theme-color, 0.1) + border solid 1px var(--primaryAlpha01) border-radius 4px &:hover - border-color rgba($theme-color, 0.2) + border-color var(--primaryAlpha02) &:focus - border-color rgba($theme-color, 0.5) + border-color var(--primaryAlpha05) > button padding 4px 8px - color rgba($theme-color, 0.4) + color var(--primaryAlpha04) &:hover - color rgba($theme-color, 0.6) + color var(--primaryAlpha06) &:active - color darken($theme-color, 30%) + color var(--primaryDarken30) > .add margin 8px 0 0 0 vertical-align top - color $theme-color + color var(--primary) > .destroy position absolute top 0 right 0 padding 4px 8px - color rgba($theme-color, 0.4) + color var(--primaryAlpha04) &:hover - color rgba($theme-color, 0.6) + color var(--primaryAlpha06) &:active - color darken($theme-color, 30%) + color var(--primaryDarken30) .mk-poll-editor[data-darkmode] root(true) diff --git a/src/client/app/common/views/components/poll.vue b/src/client/app/common/views/components/poll.vue index 4fe51d219b..0e60932796 100644 --- a/src/client/app/common/views/components/poll.vue +++ b/src/client/app/common/views/components/poll.vue @@ -67,7 +67,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) @@ -99,7 +99,7 @@ root(isDark) top 0 left 0 height 100% - background $theme-color + background var(--primary) transition width 1s ease > span diff --git a/src/client/app/common/views/components/reaction-picker.vue b/src/client/app/common/views/components/reaction-picker.vue index f732e40b9d..a86850ac7c 100644 --- a/src/client/app/common/views/components/reaction-picker.vue +++ b/src/client/app/common/views/components/reaction-picker.vue @@ -210,7 +210,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + $border-color = rgba(27, 31, 35, 0.15) @@ -301,7 +301,7 @@ root(isDark) right 0 bottom 0 left 0 - border 2px solid rgba($theme-color, 0.3) + border 2px solid var(--primaryAlpha03) border-radius 4px > button @@ -315,7 +315,7 @@ root(isDark) background isDark ? #252731 : #eee &:active - background $theme-color + background var(--primary) box-shadow inset 0 0.15em 0.3em rgba(27, 31, 35, 0.15) .mk-reaction-picker[data-darkmode] diff --git a/src/client/app/common/views/components/signin.vue b/src/client/app/common/views/components/signin.vue index b1c6782e93..e02af8154c 100644 --- a/src/client/app/common/views/components/signin.vue +++ b/src/client/app/common/views/components/signin.vue @@ -68,7 +68,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .mk-signin color #555 diff --git a/src/client/app/common/views/components/signup.vue b/src/client/app/common/views/components/signup.vue index f603b9545c..e55d7ee3e3 100644 --- a/src/client/app/common/views/components/signup.vue +++ b/src/client/app/common/views/components/signup.vue @@ -151,7 +151,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .mk-signup min-width 302px diff --git a/src/client/app/common/views/components/switch.vue b/src/client/app/common/views/components/switch.vue index 32caab638a..aa60331cbc 100644 --- a/src/client/app/common/views/components/switch.vue +++ b/src/client/app/common/views/components/switch.vue @@ -85,7 +85,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) display flex @@ -102,21 +102,21 @@ root(isDark) &.checked > .button - background-color $theme-color - border-color $theme-color + background-color var(--primary) + border-color var(--primary) > .label > span - color $theme-color + color var(--primary) &:hover > .label > span - color darken($theme-color, 10%) + color var(--primaryDarken10) > .button - background darken($theme-color, 10%) - border-color darken($theme-color, 10%) + background var(--primaryDarken10) + border-color var(--primaryDarken10) &:hover > .label @@ -144,7 +144,7 @@ root(isDark) right -5px bottom -5px left -5px - border 2px solid rgba($theme-color, 0.3) + border 2px solid var(--primaryAlpha03) border-radius 14px > .button diff --git a/src/client/app/common/views/components/ui/button.vue b/src/client/app/common/views/components/ui/button.vue index e778750354..ae59214038 100644 --- a/src/client/app/common/views/components/ui/button.vue +++ b/src/client/app/common/views/components/ui/button.vue @@ -32,7 +32,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark, fill) > button @@ -49,23 +49,23 @@ root(isDark, fill) box-shadow none if fill - color $theme-color-foreground - background $theme-color + color var(--primaryForeground) + background var(--primary) &:hover - background lighten($theme-color, 5%) + background var(--primaryLighten5) &:active - background darken($theme-color, 5%) + background var(--primaryDarken5) else - color $theme-color + color var(--primary) background none &:hover - color darken($theme-color, 5%) + color var(--primaryDarken5) &:active - background rgba($theme-color, 0.3) + background var(--primaryAlpha03) .ui-button[data-darkmode] &.fill diff --git a/src/client/app/common/views/components/ui/card.vue b/src/client/app/common/views/components/ui/card.vue index aa16b557e1..a9e0493810 100644 --- a/src/client/app/common/views/components/ui/card.vue +++ b/src/client/app/common/views/components/ui/card.vue @@ -20,7 +20,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) margin 16px diff --git a/src/client/app/common/views/components/ui/form.vue b/src/client/app/common/views/components/ui/form.vue index fc8fdad9c4..5c5bbd7256 100644 --- a/src/client/app/common/views/components/ui/form.vue +++ b/src/client/app/common/views/components/ui/form.vue @@ -19,7 +19,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .ui-form > fieldset diff --git a/src/client/app/common/views/components/ui/form/button.vue b/src/client/app/common/views/components/ui/form/button.vue index 9c37b3118b..bccf36e52f 100644 --- a/src/client/app/common/views/components/ui/form/button.vue +++ b/src/client/app/common/views/components/ui/form/button.vue @@ -25,7 +25,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) display inline-block @@ -50,30 +50,30 @@ root(isDark) &:hover &:focus - color $theme-color - background rgba($theme-color, isDark ? 0.2 : 0.12) - border-color rgba($theme-color, isDark ? 0.5 : 0.3) + color var(--primary) + //background rgba(var(--primary-r), var(--primary-g), var(--primary-b), isDark ? 0.2 : 0.12) + //border-color rgba(var(--primary-r), var(--primary-g), var(--primary-b), isDark ? 0.5 : 0.3) &:active - color darken($theme-color, 20%) - background rgba($theme-color, 0.12) - border-color $theme-color + color var(--primaryDarken20) + //background rgba(var(--primary-r), var(--primary-g), var(--primary-b), 0.12) + border-color var(--primary) transition all 0s &.primary > button - border 1px solid $theme-color - background $theme-color - color $theme-color-foreground + border 1px solid var(--primary) + background var(--primary) + color var(--primaryForeground) &:hover &:focus - background lighten($theme-color, 20%) - border-color lighten($theme-color, 20%) + background var(--primaryLighten20) + border-color var(--primaryLighten20) &:active - background darken($theme-color, 20%) - border-color darken($theme-color, 20%) + background var(--primaryDarken20) + border-color var(--primaryDarken20) transition all 0s &.round diff --git a/src/client/app/common/views/components/ui/form/radio.vue b/src/client/app/common/views/components/ui/form/radio.vue index 831981bb3e..13cabbdc04 100644 --- a/src/client/app/common/views/components/ui/form/radio.vue +++ b/src/client/app/common/views/components/ui/form/radio.vue @@ -49,7 +49,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) display inline-flex @@ -70,15 +70,15 @@ root(isDark) &.checked > .button - border-color $theme-color + border-color var(--primary) &:after - background-color $theme-color + background-color var(--primary) transform scale(1) opacity 1 > .label - color $theme-color + color var(--primary) > input position absolute diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue index ce28bfb12a..98c9bf7f5a 100644 --- a/src/client/app/common/views/components/ui/input.vue +++ b/src/client/app/common/views/components/ui/input.vue @@ -155,7 +155,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark, fill) margin 32px 0 @@ -193,7 +193,7 @@ root(isDark, fill) left 0 right 0 height 2px - background $theme-color + background var(--primary) opacity 0 transform scaleX(0.12) transition border 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1) @@ -325,7 +325,7 @@ root(isDark, fill) transform scaleX(1) > .label - color $theme-color + color var(--primary) &.focused &.filled diff --git a/src/client/app/common/views/components/ui/radio.vue b/src/client/app/common/views/components/ui/radio.vue index dcdda1cf0e..ded6b5650c 100644 --- a/src/client/app/common/views/components/ui/radio.vue +++ b/src/client/app/common/views/components/ui/radio.vue @@ -51,7 +51,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) display inline-block @@ -68,10 +68,10 @@ root(isDark) &.checked > .button - border-color $theme-color + border-color var(--primary) &:after - background-color $theme-color + background-color var(--primary) transform scale(1) opacity 1 diff --git a/src/client/app/common/views/components/ui/select.vue b/src/client/app/common/views/components/ui/select.vue index 4273a4a0de..c32865c690 100644 --- a/src/client/app/common/views/components/ui/select.vue +++ b/src/client/app/common/views/components/ui/select.vue @@ -70,7 +70,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark, fill) margin 32px 0 @@ -113,7 +113,7 @@ root(isDark, fill) left 0 right 0 height 2px - background $theme-color + background var(--primary) opacity 0 transform scaleX(0.12) transition border 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1) @@ -190,7 +190,7 @@ root(isDark, fill) transform scaleX(1) > .label - color $theme-color + color var(--primary) &.focused &.filled diff --git a/src/client/app/common/views/components/ui/switch.vue b/src/client/app/common/views/components/ui/switch.vue index e88b867801..e358713d8f 100644 --- a/src/client/app/common/views/components/ui/switch.vue +++ b/src/client/app/common/views/components/ui/switch.vue @@ -56,7 +56,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) display flex @@ -79,11 +79,11 @@ root(isDark) &.checked > .button - background-color rgba($theme-color, 0.4) - border-color rgba($theme-color, 0.4) + background-color var(--primaryAlpha04) + border-color var(--primaryAlpha04) > * - background-color $theme-color + background-color var(--primary) transform translateX(14px) > input diff --git a/src/client/app/common/views/components/ui/textarea.vue b/src/client/app/common/views/components/ui/textarea.vue index 60fe1cdd82..53b7dcaf8c 100644 --- a/src/client/app/common/views/components/ui/textarea.vue +++ b/src/client/app/common/views/components/ui/textarea.vue @@ -63,7 +63,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark, fill) margin 42px 0 32px 0 @@ -97,7 +97,7 @@ root(isDark, fill) left 0 right 0 background none - border solid 2px $theme-color + border solid 2px var(--primary) border-radius 3px opacity 0 transition opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1) @@ -149,7 +149,7 @@ root(isDark, fill) opacity 1 > .label - color $theme-color + color var(--primary) &.focused &.filled diff --git a/src/client/app/common/views/components/uploader.vue b/src/client/app/common/views/components/uploader.vue index f4797d89f7..19b0d15708 100644 --- a/src/client/app/common/views/components/uploader.vue +++ b/src/client/app/common/views/components/uploader.vue @@ -81,7 +81,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .mk-uploader overflow auto @@ -100,7 +100,7 @@ export default Vue.extend({ margin 8px 0 0 0 padding 0 height 36px - box-shadow 0 -1px 0 rgba($theme-color, 0.1) + box-shadow 0 -1px 0 var(--primaryAlpha01) border-top solid 8px transparent &:first-child @@ -127,7 +127,7 @@ export default Vue.extend({ padding 0 max-width 256px font-size 0.8em - color rgba($theme-color, 0.7) + color var(--primaryAlpha07) white-space nowrap text-overflow ellipsis overflow hidden @@ -145,17 +145,17 @@ export default Vue.extend({ font-size 0.8em > .initing - color rgba($theme-color, 0.5) + color var(--primaryAlpha05) > .kb - color rgba($theme-color, 0.5) + color var(--primaryAlpha05) > .percentage display inline-block width 48px text-align right - color rgba($theme-color, 0.7) + color var(--primaryAlpha07) &:after content '%' @@ -174,10 +174,10 @@ export default Vue.extend({ overflow hidden &::-webkit-progress-value - background $theme-color + background var(--primary) &::-webkit-progress-bar - background rgba($theme-color, 0.1) + background var(--primaryAlpha01) > .progress display block @@ -191,13 +191,13 @@ export default Vue.extend({ border-radius 4px background linear-gradient( 45deg, - lighten($theme-color, 30%) 25%, - $theme-color 25%, - $theme-color 50%, - lighten($theme-color, 30%) 50%, - lighten($theme-color, 30%) 75%, - $theme-color 75%, - $theme-color + var(--primaryLighten30) 25%, + var(--primary) 25%, + var(--primary) 50%, + var(--primaryLighten30) 50%, + var(--primaryLighten30) 75%, + var(--primary) 75%, + var(--primary) ) background-size 32px 32px animation bg 1.5s linear infinite diff --git a/src/client/app/common/views/components/visibility-chooser.vue b/src/client/app/common/views/components/visibility-chooser.vue index 1830b1832e..d0a892fd56 100644 --- a/src/client/app/common/views/components/visibility-chooser.vue +++ b/src/client/app/common/views/components/visibility-chooser.vue @@ -127,7 +127,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + $border-color = rgba(27, 31, 35, 0.15) @@ -199,8 +199,8 @@ root(isDark) background isDark ? #21242b : #ddd &.active - color $theme-color-foreground - background $theme-color + color var(--primaryForeground) + background var(--primary) > * user-select none diff --git a/src/client/app/common/views/pages/follow.vue b/src/client/app/common/views/pages/follow.vue index 80a870a257..d81e4c0820 100644 --- a/src/client/app/common/views/pages/follow.vue +++ b/src/client/app/common/views/pages/follow.vue @@ -107,7 +107,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) padding 32px @@ -173,29 +173,29 @@ root(isDark) min-width 150px font-size 14px font-weight bold - color $theme-color + color var(--primary) background transparent outline none - border solid 1px $theme-color + border solid 1px var(--primary) border-radius 36px &:hover - background rgba($theme-color, 0.1) + background var(--primaryAlpha01) &:active - background rgba($theme-color, 0.2) + background var(--primaryAlpha02) &.active - color $theme-color-foreground - background $theme-color + color var(--primaryForeground) + background var(--primary) &:hover - background lighten($theme-color, 10%) - border-color lighten($theme-color, 10%) + background var(--primaryLighten10) + border-color var(--primaryLighten10) &:active - background darken($theme-color, 10%) - border-color darken($theme-color, 10%) + background var(--primaryDarken10) + border-color var(--primaryDarken10) &.wait cursor wait !important diff --git a/src/client/app/common/views/widgets/analog-clock.vue b/src/client/app/common/views/widgets/analog-clock.vue index 04223f0d21..1725c2f1af 100644 --- a/src/client/app/common/views/widgets/analog-clock.vue +++ b/src/client/app/common/views/widgets/analog-clock.vue @@ -26,7 +26,7 @@ export default define({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) .mkw-analog-clock--body diff --git a/src/client/app/common/views/widgets/calendar.vue b/src/client/app/common/views/widgets/calendar.vue index eb15030370..a24524d1c5 100644 --- a/src/client/app/common/views/widgets/calendar.vue +++ b/src/client/app/common/views/widgets/calendar.vue @@ -116,7 +116,7 @@ export default define({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) &[data-special='on-new-years-day'] @@ -182,7 +182,7 @@ root(isDark) > .val height 4px - background $theme-color + background var(--primary) transition width .3s cubic-bezier(0.23, 1, 0.32, 1) &:nth-child(1) diff --git a/src/client/app/common/views/widgets/memo.vue b/src/client/app/common/views/widgets/memo.vue index 30f0d3b009..079522d39b 100644 --- a/src/client/app/common/views/widgets/memo.vue +++ b/src/client/app/common/views/widgets/memo.vue @@ -57,7 +57,7 @@ export default define({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) .mkw-memo--body @@ -83,8 +83,8 @@ root(isDark) margin 0 padding 0 10px height 28px - color $theme-color-foreground - background $theme-color !important + color var(--primaryForeground) + background var(--primary) !important outline none border none border-radius 4px @@ -92,10 +92,10 @@ root(isDark) cursor pointer &:hover - background lighten($theme-color, 10%) !important + background var(--primaryLighten10) !important &:active - background darken($theme-color, 10%) !important + background var(--primaryDarken10) !important transition background 0s ease &:disabled diff --git a/src/client/app/desktop/ui.styl b/src/client/app/desktop/ui.styl index b66c8f4025..3ab5d79c5d 100644 --- a/src/client/app/desktop/ui.styl +++ b/src/client/app/desktop/ui.styl @@ -1,5 +1,3 @@ -@import "../../const" - button font-family sans-serif @@ -34,7 +32,7 @@ button.ui right -5px bottom -5px left -5px - border 2px solid rgba($theme-color, 0.3) + border 2px solid var(--primaryAlpha03) border-radius 8px &:disabled @@ -50,20 +48,20 @@ button.ui border-color #dcdcdc &.primary - color $theme-color-foreground - background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%) - border solid 1px lighten($theme-color, 15%) + color var(--primaryForeground) + //background linear-gradient(to bottom, var(--primaryLighten25) 0%, var(--primaryLighten10) 100%) + border solid 1px var(--primaryLighten15) &:not(:disabled) font-weight bold &:hover:not(:disabled) - background linear-gradient(to bottom, lighten($theme-color, 8%) 0%, darken($theme-color, 8%) 100%) - border-color $theme-color + //background linear-gradient(to bottom, var(--primaryLighten8) 0%, var(--primaryDarken8) 100%) + border-color var(--primary) &:active:not(:disabled) - background $theme-color - border-color $theme-color + background var(--primary) + border-color var(--primary) input:not([type]).ui input[type='text'].ui @@ -86,7 +84,7 @@ textarea.ui border-color #b0b0b0 &:focus - border-color $theme-color + border-color var(--primary) textarea.ui min-width 100% @@ -140,17 +138,17 @@ html[data-darkmode] border-color #151a1d &.primary - color $theme-color-foreground - background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%) - border solid 1px lighten($theme-color, 15%) + color var(--primaryForeground) + //background linear-gradient(to bottom, var(--primaryLighten25) 0%, var(--primaryLighten10) 100%) + border solid 1px var(--primaryLighten15) &:hover:not(:disabled) - background linear-gradient(to bottom, lighten($theme-color, 8%) 0%, darken($theme-color, 8%) 100%) - border-color $theme-color + //background linear-gradient(to bottom, var(--primaryLighten8) 0%, var(--primaryDarken8) 100%) + border-color var(--primary) &:active:not(:disabled) - background $theme-color - border-color $theme-color + background var(--primary) + border-color var(--primary) input:not([type]).ui input[type='text'].ui @@ -174,7 +172,7 @@ html[data-darkmode] border-color #b0b0b0 &:focus - border-color $theme-color + border-color var(--primary) .ui.from.group > p:first-child diff --git a/src/client/app/desktop/views/components/calendar.vue b/src/client/app/desktop/views/components/calendar.vue index e71983f821..2414ced0c9 100644 --- a/src/client/app/desktop/views/components/calendar.vue +++ b/src/client/app/desktop/views/components/calendar.vue @@ -128,7 +128,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) color isDark ? #c5ced6 : #777 @@ -241,14 +241,14 @@ root(isDark) &[data-today] > div - color $theme-color-foreground - background $theme-color + color var(--primaryForeground) + background var(--primary) &:hover > div - background lighten($theme-color, 10%) + background var(--primaryLighten10) &:active > div - background darken($theme-color, 10%) + background var(--primaryDarken10) .mk-calendar[data-darkmode] root(true) diff --git a/src/client/app/desktop/views/components/charts.vue b/src/client/app/desktop/views/components/charts.vue index e401095363..6d6f3a3596 100644 --- a/src/client/app/desktop/views/components/charts.vue +++ b/src/client/app/desktop/views/components/charts.vue @@ -649,7 +649,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .gkgckalzgidaygcxnugepioremxvxvpt padding 32px @@ -675,7 +675,7 @@ export default Vue.extend({ * &:not(.active) - color $theme-color + color var(--primary) cursor pointer > div diff --git a/src/client/app/desktop/views/components/choose-file-from-drive-window.vue b/src/client/app/desktop/views/components/choose-file-from-drive-window.vue index 933d31f299..806f7f5c3f 100644 --- a/src/client/app/desktop/views/components/choose-file-from-drive-window.vue +++ b/src/client/app/desktop/views/components/choose-file-from-drive-window.vue @@ -59,7 +59,7 @@ export default Vue.extend({ </script> <style lang="stylus" module> -@import '~const.styl' + .title > [data-fa] @@ -74,7 +74,7 @@ export default Vue.extend({ .footer height 72px - background lighten($theme-color, 95%) + background var(--primaryLighten95) .upload display inline-block @@ -87,7 +87,7 @@ export default Vue.extend({ width 40px height 40px font-size 1em - color rgba($theme-color, 0.5) + color var(--primaryAlpha05) background transparent outline none border solid 1px transparent @@ -95,13 +95,13 @@ export default Vue.extend({ &:hover background transparent - border-color rgba($theme-color, 0.3) + border-color var(--primaryAlpha03) &:active - color rgba($theme-color, 0.6) + color var(--primaryAlpha06) background transparent - border-color rgba($theme-color, 0.5) - box-shadow 0 2px 4px rgba(darken($theme-color, 50%), 0.15) inset + border-color var(--primaryAlpha05) + //box-shadow 0 2px 4px rgba(var(--primaryDarken50), 0.15) inset &:focus &:after @@ -112,7 +112,7 @@ export default Vue.extend({ right -5px bottom -5px left -5px - border 2px solid rgba($theme-color, 0.3) + border 2px solid var(--primaryAlpha03) border-radius 8px .ok @@ -138,7 +138,7 @@ export default Vue.extend({ right -5px bottom -5px left -5px - border 2px solid rgba($theme-color, 0.3) + border 2px solid var(--primaryAlpha03) border-radius 8px &:disabled @@ -147,20 +147,20 @@ export default Vue.extend({ .ok right 16px - color $theme-color-foreground - background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%) - border solid 1px lighten($theme-color, 15%) + color var(--primaryForeground) + background linear-gradient(to bottom, var(--primaryLighten25) 0%, var(--primaryLighten10) 100%) + border solid 1px var(--primaryLighten15) &:not(:disabled) font-weight bold &:hover:not(:disabled) - background linear-gradient(to bottom, lighten($theme-color, 8%) 0%, darken($theme-color, 8%) 100%) - border-color $theme-color + background linear-gradient(to bottom, var(--primaryLighten8) 0%, var(--primaryDarken8) 100%) + border-color var(--primary) &:active:not(:disabled) - background $theme-color - border-color $theme-color + background var(--primary) + border-color var(--primary) .cancel right 148px diff --git a/src/client/app/desktop/views/components/choose-folder-from-drive-window.vue b/src/client/app/desktop/views/components/choose-folder-from-drive-window.vue index 03d6fd1636..b970218e58 100644 --- a/src/client/app/desktop/views/components/choose-folder-from-drive-window.vue +++ b/src/client/app/desktop/views/components/choose-folder-from-drive-window.vue @@ -37,7 +37,7 @@ export default Vue.extend({ </script> <style lang="stylus" module> -@import '~const.styl' + .title > [data-fa] @@ -48,7 +48,7 @@ export default Vue.extend({ .footer height 72px - background lighten($theme-color, 95%) + background var(--primaryLighten95) .ok .cancel @@ -73,7 +73,7 @@ export default Vue.extend({ right -5px bottom -5px left -5px - border 2px solid rgba($theme-color, 0.3) + border 2px solid var(--primaryAlpha03) border-radius 8px &:disabled @@ -82,20 +82,20 @@ export default Vue.extend({ .ok right 16px - color $theme-color-foreground - background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%) - border solid 1px lighten($theme-color, 15%) + color var(--primaryForeground) + background linear-gradient(to bottom, var(--primaryLighten25) 0%, var(--primaryLighten10) 100%) + border solid 1px var(--primaryLighten15) &:not(:disabled) font-weight bold &:hover:not(:disabled) - background linear-gradient(to bottom, lighten($theme-color, 8%) 0%, darken($theme-color, 8%) 100%) - border-color $theme-color + background linear-gradient(to bottom, var(--primaryLighten8) 0%, var(--primaryDarken8) 100%) + border-color var(--primary) &:active:not(:disabled) - background $theme-color - border-color $theme-color + background var(--primary) + border-color var(--primary) .cancel right 148px diff --git a/src/client/app/desktop/views/components/context-menu.menu.vue b/src/client/app/desktop/views/components/context-menu.menu.vue index e7deec675e..b65a8e1dea 100644 --- a/src/client/app/desktop/views/components/context-menu.menu.vue +++ b/src/client/app/desktop/views/components/context-menu.menu.vue @@ -31,7 +31,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) $width = 240px @@ -69,7 +69,7 @@ root(isDark) &:active > p, a - background $theme-color + background var(--primary) > p, a display block @@ -90,14 +90,14 @@ root(isDark) &:hover > p, a text-decoration none - background $theme-color - color $theme-color-foreground + background var(--primary) + color var(--primaryForeground) &:active > p, a text-decoration none - background darken($theme-color, 10%) - color $theme-color-foreground + background var(--primaryDarken10) + color var(--primaryForeground) li > ul visibility hidden diff --git a/src/client/app/desktop/views/components/crop-window.vue b/src/client/app/desktop/views/components/crop-window.vue index 4fa258549f..629c3b013a 100644 --- a/src/client/app/desktop/views/components/crop-window.vue +++ b/src/client/app/desktop/views/components/crop-window.vue @@ -61,7 +61,7 @@ export default Vue.extend({ </script> <style lang="stylus" module> -@import '~const.styl' + .header > [data-fa] @@ -73,7 +73,7 @@ export default Vue.extend({ .actions height 72px - background lighten($theme-color, 95%) + background var(--primaryLighten95) .ok .cancel @@ -98,7 +98,7 @@ export default Vue.extend({ right -5px bottom -5px left -5px - border 2px solid rgba($theme-color, 0.3) + border 2px solid var(--primaryAlpha03) border-radius 8px &:disabled @@ -111,20 +111,20 @@ export default Vue.extend({ .ok right 16px - color $theme-color-foreground - background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%) - border solid 1px lighten($theme-color, 15%) + color var(--primaryForeground) + background linear-gradient(to bottom, var(--primaryLighten25) 0%, var(--primaryLighten10) 100%) + border solid 1px var(--primaryLighten15) &:not(:disabled) font-weight bold &:hover:not(:disabled) - background linear-gradient(to bottom, lighten($theme-color, 8%) 0%, darken($theme-color, 8%) 100%) - border-color $theme-color + background linear-gradient(to bottom, var(--primaryLighten8) 0%, var(--primaryDarken8) 100%) + border-color var(--primary) &:active:not(:disabled) - background $theme-color - border-color $theme-color + background var(--primary) + border-color var(--primary) .cancel .skip @@ -155,11 +155,11 @@ export default Vue.extend({ } .cropper-view-box { - outline-color: $theme-color; + outline-color: var(--primary); } .cropper-line, .cropper-point { - background-color: $theme-color; + background-color: var(--primary); } .cropper-bg { diff --git a/src/client/app/desktop/views/components/dialog.vue b/src/client/app/desktop/views/components/dialog.vue index bbb1e0030c..baa6f911fe 100644 --- a/src/client/app/desktop/views/components/dialog.vue +++ b/src/client/app/desktop/views/components/dialog.vue @@ -91,7 +91,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .mk-dialog > .bg @@ -144,20 +144,20 @@ export default Vue.extend({ margin 0 0.375em &:hover - color $theme-color + color var(--primary) &:active - color darken($theme-color, 10%) + color var(--primaryDarken10) transition color 0s ease </style> <style lang="stylus" module> -@import '~const.styl' + .header margin 1em 0 - color $theme-color + color var(--primary) // color #43A4EC font-weight bold diff --git a/src/client/app/desktop/views/components/drive.file.vue b/src/client/app/desktop/views/components/drive.file.vue index 3ac8923c51..225130baf7 100644 --- a/src/client/app/desktop/views/components/drive.file.vue +++ b/src/client/app/desktop/views/components/drive.file.vue @@ -200,7 +200,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) padding 8px 0 0 0 @@ -237,13 +237,13 @@ root(isDark) background #ce2212 &[data-is-selected] - background $theme-color + background var(--primary) &:hover - background lighten($theme-color, 10%) + background var(--primaryLighten10) &:active - background darken($theme-color, 10%) + background var(--primaryDarken10) > .label &:before @@ -251,7 +251,7 @@ root(isDark) display none > .name - color $theme-color-foreground + color var(--primaryForeground) &[data-is-contextmenu-showing] &:after @@ -262,7 +262,7 @@ root(isDark) right -4px bottom -4px left -4px - border 2px dashed rgba($theme-color, 0.3) + border 2px dashed var(--primaryAlpha03) border-radius 4px > .label diff --git a/src/client/app/desktop/views/components/drive.folder.vue b/src/client/app/desktop/views/components/drive.folder.vue index e6b71f9426..cb49215cbb 100644 --- a/src/client/app/desktop/views/components/drive.folder.vue +++ b/src/client/app/desktop/views/components/drive.folder.vue @@ -214,12 +214,12 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) padding 8px height 64px - background isDark ? rgba($theme-color, 0.2) : lighten($theme-color, 95%) + background isDark ? var(--primaryAlpha02) : var(--primaryLighten95) border-radius 4px &, * @@ -229,10 +229,10 @@ root(isDark) pointer-events none &:hover - background isDark ? rgba(lighten($theme-color, 10%), 0.2) : lighten($theme-color, 90%) + //background isDark ? rgba(var(--primaryLighten10), 0.2) : var(--primaryLighten90) &:active - background isDark ? rgba(darken($theme-color, 10%), 0.2) : lighten($theme-color, 85%) + //background isDark ? rgba(var(--primaryDarken10), 0.2) : var(--primaryLighten85) &[data-is-contextmenu-showing] &[data-draghover] @@ -244,16 +244,16 @@ root(isDark) right -4px bottom -4px left -4px - border 2px dashed rgba($theme-color, 0.3) + border 2px dashed var(--primaryAlpha03) border-radius 4px &[data-draghover] - background isDark ? rgba(darken($theme-color, 10%), 0.2) : lighten($theme-color, 90%) + //background isDark ? rgba(var(--primaryDarken10), 0.2) : var(--primaryLighten90) > .name margin 0 font-size 0.9em - color isDark ? #fff : darken($theme-color, 30%) + color isDark ? #fff : var(--primaryDarken30) > [data-fa] margin-right 4px diff --git a/src/client/app/desktop/views/components/drive.vue b/src/client/app/desktop/views/components/drive.vue index cb289027d4..ccfdb3159f 100644 --- a/src/client/app/desktop/views/components/drive.vue +++ b/src/client/app/desktop/views/components/drive.vue @@ -585,7 +585,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) @@ -697,8 +697,8 @@ root(isDark) z-index 128 top 0 left 0 - border solid 1px $theme-color - background rgba($theme-color, 0.5) + border solid 1px var(--primary) + background var(--primaryAlpha05) pointer-events none > .contents @@ -769,7 +769,7 @@ root(isDark) top 38px width 100% height calc(100% - 38px) - border dashed 2px rgba($theme-color, 0.5) + border dashed 2px var(--primaryAlpha05) pointer-events none > .mk-uploader diff --git a/src/client/app/desktop/views/components/follow-button.vue b/src/client/app/desktop/views/components/follow-button.vue index 1db4b0cfa4..014b536f59 100644 --- a/src/client/app/desktop/views/components/follow-button.vue +++ b/src/client/app/desktop/views/components/follow-button.vue @@ -101,7 +101,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) display block @@ -126,7 +126,7 @@ root(isDark) right -5px bottom -5px left -5px - border 2px solid rgba($theme-color, 0.3) + border 2px solid var(--primaryAlpha03) border-radius 8px &:not(.active) @@ -143,20 +143,20 @@ root(isDark) border-color isDark ? #151a1d : #dcdcdc &.active - color $theme-color-foreground - background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%) - border solid 1px lighten($theme-color, 15%) + color var(--primaryForeground) + background linear-gradient(to bottom, var(--primaryLighten25) 0%, var(--primaryLighten10) 100%) + border solid 1px var(--primaryLighten15) &:not(:disabled) font-weight bold &:hover:not(:disabled) - background linear-gradient(to bottom, lighten($theme-color, 8%) 0%, darken($theme-color, 8%) 100%) - border-color $theme-color + background linear-gradient(to bottom, var(--primaryLighten8) 0%, var(--primaryDarken8) 100%) + border-color var(--primary) &:active:not(:disabled) - background $theme-color - border-color $theme-color + background var(--primary) + border-color var(--primary) &.wait cursor wait !important diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index c9b868422e..3d77da52d9 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -247,7 +247,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) display block @@ -292,15 +292,15 @@ root(isDark) padding 0 16px line-height 48px text-decoration none - color $theme-color-foreground - background $theme-color + color var(--primaryForeground) + background var(--primary) transition background 0.1s ease &:hover - background lighten($theme-color, 10%) + background var(--primaryLighten10) &:active - background darken($theme-color, 10%) + background var(--primaryDarken10) transition background 0s ease > [data-fa] diff --git a/src/client/app/desktop/views/components/input-dialog.vue b/src/client/app/desktop/views/components/input-dialog.vue index cf7c09ea56..976e897fe8 100644 --- a/src/client/app/desktop/views/components/input-dialog.vue +++ b/src/client/app/desktop/views/components/input-dialog.vue @@ -76,7 +76,7 @@ export default Vue.extend({ <style lang="stylus" module> -@import '~const.styl' + .header > [data-fa] @@ -96,25 +96,25 @@ export default Vue.extend({ color #333 background #fff outline none - border solid 1px rgba($theme-color, 0.1) + border solid 1px var(--primaryAlpha01) border-radius 4px transition border-color .3s ease &:hover - border-color rgba($theme-color, 0.2) + border-color var(--primaryAlpha02) transition border-color .1s ease &:focus - color $theme-color - border-color rgba($theme-color, 0.5) + color var(--primary) + border-color var(--primaryAlpha05) transition border-color 0s ease &::-webkit-input-placeholder - color rgba($theme-color, 0.3) + color var(--primaryAlpha03) .actions height 72px - background lighten($theme-color, 95%) + background var(--primaryLighten95) .ok .cancel @@ -139,7 +139,7 @@ export default Vue.extend({ right -5px bottom -5px left -5px - border 2px solid rgba($theme-color, 0.3) + border 2px solid var(--primaryAlpha03) border-radius 8px &:disabled @@ -148,20 +148,20 @@ export default Vue.extend({ .ok right 16px - color $theme-color-foreground - background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%) - border solid 1px lighten($theme-color, 15%) + color var(--primaryForeground) + background linear-gradient(to bottom, var(--primaryLighten25) 0%, var(--primaryLighten10) 100%) + border solid 1px var(--primaryLighten15) &:not(:disabled) font-weight bold &:hover:not(:disabled) - background linear-gradient(to bottom, lighten($theme-color, 8%) 0%, darken($theme-color, 8%) 100%) - border-color $theme-color + background linear-gradient(to bottom, var(--primaryLighten8) 0%, var(--primaryDarken8) 100%) + border-color var(--primary) &:active:not(:disabled) - background $theme-color - border-color $theme-color + background var(--primary) + border-color var(--primary) .cancel right 148px diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index 80faae0d42..f004ca88ee 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -225,7 +225,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) overflow hidden diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index ac2c1ce97f..a91212221b 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -317,7 +317,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) margin 0 @@ -348,7 +348,7 @@ root(isDark) right 2px bottom 2px left 2px - border 2px solid rgba($theme-color, 0.3) + border 2px solid var(--primaryAlpha03) border-radius 4px > .renote @@ -557,7 +557,7 @@ root(isDark) padding 0 4px margin-left 4px font-size 80% - color $theme-color-foreground - background $theme-color + color var(--primaryForeground) + background var(--primary) border-radius 4px </style> diff --git a/src/client/app/desktop/views/components/notes.vue b/src/client/app/desktop/views/components/notes.vue index e6267ed204..2e3ffd171b 100644 --- a/src/client/app/desktop/views/components/notes.vue +++ b/src/client/app/desktop/views/components/notes.vue @@ -216,7 +216,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) .transition @@ -250,7 +250,7 @@ root(isDark) position sticky z-index 100 height 3px - background $theme-color + background var(--primary) > footer > button diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index 8db85aeaca..fdd6e75318 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -434,12 +434,12 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) display block padding 16px - background isDark ? #282C37 : lighten($theme-color, 95%) + background isDark ? #282C37 : var(--primaryLighten95) &:after content "" @@ -456,23 +456,23 @@ root(isDark) color isDark ? #fff : #333 background isDark ? #191d23 : #fff outline none - border solid 1px rgba($theme-color, 0.1) + border solid 1px var(--primaryAlpha01) border-radius 4px transition border-color .2s ease &:hover - border-color rgba($theme-color, 0.2) + border-color var(--primaryAlpha02) transition border-color .1s ease &:focus - border-color rgba($theme-color, 0.5) + border-color var(--primaryAlpha05) transition border-color 0s ease &:disabled opacity 0.5 &::-webkit-input-placeholder - color rgba($theme-color, 0.3) + color var(--primaryAlpha03) > input margin-bottom 8px @@ -486,17 +486,17 @@ root(isDark) &:hover & + * & + * + * - border-color rgba($theme-color, 0.2) + border-color var(--primaryAlpha02) transition border-color .1s ease &:focus & + * & + * + * - border-color rgba($theme-color, 0.5) + border-color var(--primaryAlpha05) transition border-color 0s ease &.with - border-bottom solid 1px rgba($theme-color, 0.1) !important + border-bottom solid 1px var(--primaryAlpha01) !important border-radius 4px 4px 0 0 > .visibleUsers @@ -514,7 +514,7 @@ root(isDark) font-size 14px > b - color isDark ? #9baec8 : darken($theme-color, 20%) + color isDark ? #9baec8 : var(--primaryDarken20) > * margin-right 8px @@ -523,14 +523,14 @@ root(isDark) > .files margin 0 padding 0 - background isDark ? #181b23 : lighten($theme-color, 98%) - border solid 1px rgba($theme-color, 0.1) + background isDark ? #181b23 : var(--primaryLighten98) + border solid 1px var(--primaryAlpha01) border-top none border-radius 0 0 4px 4px transition border-color .3s ease &.with - border-bottom solid 1px rgba($theme-color, 0.1) !important + border-bottom solid 1px var(--primaryAlpha01) !important border-radius 0 > .remain @@ -540,7 +540,7 @@ root(isDark) right 8px margin 0 padding 0 - color rgba($theme-color, 0.4) + color var(--primaryAlpha04) > div padding 4px @@ -574,8 +574,8 @@ root(isDark) cursor pointer > .mk-poll-editor - background isDark ? #181b23 : lighten($theme-color, 98%) - border solid 1px rgba($theme-color, 0.1) + background isDark ? #181b23 : var(--primaryLighten98) + border solid 1px var(--primaryAlpha01) border-top none border-radius 0 0 4px 4px transition border-color .3s ease @@ -583,7 +583,7 @@ root(isDark) > .mk-uploader margin 8px 0 0 0 padding 8px - border solid 1px rgba($theme-color, 0.2) + border solid 1px var(--primaryAlpha02) border-radius 4px input[type='file'] @@ -600,22 +600,22 @@ root(isDark) width 110px height 40px font-size 1em - color $theme-color-foreground - background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%) + color var(--primaryForeground) + background linear-gradient(to bottom, var(--primaryLighten25) 0%, var(--primaryLighten10) 100%) outline none - border solid 1px lighten($theme-color, 15%) + border solid 1px var(--primaryLighten15) border-radius 4px &:not(:disabled) font-weight bold &:hover:not(:disabled) - background linear-gradient(to bottom, lighten($theme-color, 8%) 0%, darken($theme-color, 8%) 100%) - border-color $theme-color + background linear-gradient(to bottom, var(--primaryLighten8) 0%, var(--primaryDarken8) 100%) + border-color var(--primary) &:active:not(:disabled) - background $theme-color - border-color $theme-color + background var(--primary) + border-color var(--primary) &:focus &:after @@ -626,7 +626,7 @@ root(isDark) right -5px bottom -5px left -5px - border 2px solid rgba($theme-color, 0.3) + border 2px solid var(--primaryAlpha03) border-radius 8px &:disabled @@ -636,13 +636,13 @@ root(isDark) &.wait background linear-gradient( 45deg, - darken($theme-color, 10%) 25%, - $theme-color 25%, - $theme-color 50%, - darken($theme-color, 10%) 50%, - darken($theme-color, 10%) 75%, - $theme-color 75%, - $theme-color + var(--primaryDarken10) 25%, + var(--primary) 25%, + var(--primary) 50%, + var(--primaryDarken10) 50%, + var(--primaryDarken10) 75%, + var(--primary) 75%, + var(--primary) ) background-size 32px 32px animation stripe-bg 1.5s linear infinite @@ -661,7 +661,7 @@ root(isDark) right 138px margin 0 line-height 40px - color rgba($theme-color, 0.5) + color var(--primaryAlpha05) &.over color #ec3828 @@ -679,7 +679,7 @@ root(isDark) width 40px height 40px font-size 1em - color isDark ? $theme-color : rgba($theme-color, 0.5) + color isDark ? var(--primary) : var(--primaryAlpha05) background transparent outline none border solid 1px transparent @@ -687,12 +687,12 @@ root(isDark) &:hover background transparent - border-color isDark ? rgba($theme-color, 0.5) : rgba($theme-color, 0.3) + border-color isDark ? var(--primaryAlpha05) : var(--primaryAlpha03) &:active - color rgba($theme-color, 0.6) - background isDark ? transparent : linear-gradient(to bottom, lighten($theme-color, 80%) 0%, lighten($theme-color, 90%) 100%) - border-color rgba($theme-color, 0.5) + color var(--primaryAlpha06) + background isDark ? transparent : linear-gradient(to bottom, var(--primaryLighten80) 0%, var(--primaryLighten90) 100%) + border-color var(--primaryAlpha05) box-shadow 0 2px 4px rgba(#000, 0.15) inset &:focus @@ -704,7 +704,7 @@ root(isDark) right -5px bottom -5px left -5px - border 2px solid rgba($theme-color, 0.3) + border 2px solid var(--primaryAlpha03) border-radius 8px > .dropzone @@ -713,7 +713,7 @@ root(isDark) top 0 width 100% height 100% - border dashed 2px rgba($theme-color, 0.5) + border dashed 2px var(--primaryAlpha05) pointer-events none .mk-post-form[data-darkmode] diff --git a/src/client/app/desktop/views/components/progress-dialog.vue b/src/client/app/desktop/views/components/progress-dialog.vue index cc25ba8e30..feda6050bc 100644 --- a/src/client/app/desktop/views/components/progress-dialog.vue +++ b/src/client/app/desktop/views/components/progress-dialog.vue @@ -37,7 +37,7 @@ export default Vue.extend({ </script> <style lang="stylus" module> -@import '~const.styl' + .body padding 18px 24px 24px 24px @@ -53,7 +53,7 @@ export default Vue.extend({ margin 0 0 4px 0 text-align center line-height 16px - color rgba($theme-color, 0.7) + color var(--primaryAlpha07) &:after content '%' @@ -69,21 +69,21 @@ export default Vue.extend({ overflow hidden &::-webkit-progress-value - background $theme-color + background var(--primary) &::-webkit-progress-bar - background rgba($theme-color, 0.1) + background var(--primaryAlpha01) .waiting background linear-gradient( 45deg, - lighten($theme-color, 30%) 25%, - $theme-color 25%, - $theme-color 50%, - lighten($theme-color, 30%) 50%, - lighten($theme-color, 30%) 75%, - $theme-color 75%, - $theme-color + var(--primaryLighten30) 25%, + var(--primary) 25%, + var(--primary) 50%, + var(--primaryLighten30) 50%, + var(--primaryLighten30) 75%, + var(--primary) 75%, + var(--primary) ) background-size 32px 32px animation progress-dialog-tag-progress-waiting 1.5s linear infinite diff --git a/src/client/app/desktop/views/components/renote-form.vue b/src/client/app/desktop/views/components/renote-form.vue index c5192ecaac..ad23740f13 100644 --- a/src/client/app/desktop/views/components/renote-form.vue +++ b/src/client/app/desktop/views/components/renote-form.vue @@ -57,7 +57,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) @@ -66,7 +66,7 @@ root(isDark) > footer height 72px - background isDark ? #313543 : lighten($theme-color, 95%) + background isDark ? #313543 : var(--primaryLighten95) > .quote position absolute diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index cf10ea0f56..4b8ee3c9cd 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -492,7 +492,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) display flex @@ -524,7 +524,7 @@ root(isDark) &.active margin-left 8px - color $theme-color !important + color var(--primary) !important > .pages width 100% diff --git a/src/client/app/desktop/views/components/timeline.core.vue b/src/client/app/desktop/views/components/timeline.core.vue index ff73bde95c..aef873dd11 100644 --- a/src/client/app/desktop/views/components/timeline.core.vue +++ b/src/client/app/desktop/views/components/timeline.core.vue @@ -215,7 +215,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .mk-timeline-core > .mk-friends-maker diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue index c008c175de..32ed89ef0b 100644 --- a/src/client/app/desktop/views/components/timeline.vue +++ b/src/client/app/desktop/views/components/timeline.vue @@ -175,7 +175,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) background isDark ? #282C37 : #fff @@ -207,7 +207,7 @@ root(isDark) top -4px right 4px font-size 10px - color $theme-color + color var(--primary) &:hover color isDark ? #b2c1d5 : #aaa @@ -216,7 +216,7 @@ root(isDark) color isDark ? #b2c1d5 : #999 &[data-active] - color $theme-color + color var(--primary) cursor default &:before @@ -227,7 +227,7 @@ root(isDark) left 0 width 100% height 2px - background $theme-color + background var(--primary) > span display inline-block @@ -237,7 +237,7 @@ root(isDark) user-select none &[data-active] - color $theme-color + color var(--primary) cursor default font-weight bold @@ -249,7 +249,7 @@ root(isDark) left -8px width calc(100% + 16px) height 2px - background $theme-color + background var(--primary) &:not([data-active]) color isDark ? #9aa2a7 : #6f7477 diff --git a/src/client/app/desktop/views/components/ui.header.account.vue b/src/client/app/desktop/views/components/ui.header.account.vue index 1e8a45beaf..301efeb3e2 100644 --- a/src/client/app/desktop/views/components/ui.header.account.vue +++ b/src/client/app/desktop/views/components/ui.header.account.vue @@ -127,7 +127,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) > .header @@ -249,8 +249,8 @@ root(isDark) padding 2px 8px font-size 90% font-style normal - background $theme-color - color $theme-color-foreground + background var(--primary) + color var(--primaryForeground) border-radius 8px > [data-fa]:first-child @@ -269,11 +269,11 @@ root(isDark) &:hover, &:active text-decoration none - background $theme-color - color $theme-color-foreground + background var(--primary) + color var(--primaryForeground) &:active - background darken($theme-color, 10%) + background var(--primaryDarken10) &.signout $color = #e64137 diff --git a/src/client/app/desktop/views/components/ui.header.nav.vue b/src/client/app/desktop/views/components/ui.header.nav.vue index 6292b764c6..f41d4b8ecf 100644 --- a/src/client/app/desktop/views/components/ui.header.nav.vue +++ b/src/client/app/desktop/views/components/ui.header.nav.vue @@ -95,7 +95,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) display inline-block @@ -120,7 +120,7 @@ root(isDark) &.active > a - border-bottom solid 3px $theme-color + border-bottom solid 3px var(--primary) > a display inline-block @@ -147,7 +147,7 @@ root(isDark) > [data-fa]:last-child margin-left 5px font-size 10px - color $theme-color + color var(--primary) @media (max-width 1100px) margin-left -5px diff --git a/src/client/app/desktop/views/components/ui.header.notifications.vue b/src/client/app/desktop/views/components/ui.header.notifications.vue index 74dcd4111f..f9b68fa0e9 100644 --- a/src/client/app/desktop/views/components/ui.header.notifications.vue +++ b/src/client/app/desktop/views/components/ui.header.notifications.vue @@ -61,7 +61,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) @@ -93,7 +93,7 @@ root(isDark) margin-left -5px vertical-align super font-size 10px - color $theme-color + color var(--primary) > .pop $bgcolor = isDark ? #282c37 : #fff diff --git a/src/client/app/desktop/views/components/ui.header.post.vue b/src/client/app/desktop/views/components/ui.header.post.vue index 3665488542..9527792a34 100644 --- a/src/client/app/desktop/views/components/ui.header.post.vue +++ b/src/client/app/desktop/views/components/ui.header.post.vue @@ -17,7 +17,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .note display inline-block @@ -33,8 +33,8 @@ export default Vue.extend({ font-size 1.2em font-weight normal text-decoration none - color $theme-color-foreground - background $theme-color !important + color var(--primaryForeground) + background var(--primary) !important outline none border none border-radius 4px @@ -45,10 +45,10 @@ export default Vue.extend({ pointer-events none &:hover - background lighten($theme-color, 10%) !important + background var(--primaryLighten10) !important &:active - background darken($theme-color, 10%) !important + background var(--primaryDarken10) !important transition background 0s ease </style> diff --git a/src/client/app/desktop/views/components/ui.header.search.vue b/src/client/app/desktop/views/components/ui.header.search.vue index 9a36e52fcc..d5794dc882 100644 --- a/src/client/app/desktop/views/components/ui.header.search.vue +++ b/src/client/app/desktop/views/components/ui.header.search.vue @@ -28,7 +28,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) > [data-fa] display block @@ -67,7 +67,7 @@ root(isDark) background isDark ? rgba(#fff, 0.04) : rgba(#000, 0.08) &:focus - box-shadow 0 0 0 2px rgba($theme-color, 0.5) !important + box-shadow 0 0 0 2px var(--primaryAlpha05) !important .search[data-darkmode] root(true) diff --git a/src/client/app/desktop/views/components/user-preview.vue b/src/client/app/desktop/views/components/user-preview.vue index f6d6d68a7f..f988bb21e9 100644 --- a/src/client/app/desktop/views/components/user-preview.vue +++ b/src/client/app/desktop/views/components/user-preview.vue @@ -83,7 +83,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) position absolute @@ -151,7 +151,7 @@ root(isDark) > span font-size 1em - color $theme-color + color var(--primary) > .mk-follow-button position absolute diff --git a/src/client/app/desktop/views/components/users-list.vue b/src/client/app/desktop/views/components/users-list.vue index 05e2f4e5b3..1316f277b7 100644 --- a/src/client/app/desktop/views/components/users-list.vue +++ b/src/client/app/desktop/views/components/users-list.vue @@ -69,7 +69,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .mk-users-list height 100% @@ -104,8 +104,8 @@ export default Vue.extend({ &[data-active] font-weight bold - color $theme-color - border-color $theme-color + color var(--primary) + border-color var(--primary) cursor default > span diff --git a/src/client/app/desktop/views/components/window.vue b/src/client/app/desktop/views/components/window.vue index 5eece3795f..2b01c24ca8 100644 --- a/src/client/app/desktop/views/components/window.vue +++ b/src/client/app/desktop/views/components/window.vue @@ -463,7 +463,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) display block @@ -494,9 +494,9 @@ root(isDark) &:not([data-is-modal]) > .body if isDark - box-shadow 0 0 0px 1px rgba($theme-color, 0.5), 0 2px 12px 0 rgba(#000, 0.5) + box-shadow 0 0 0px 1px var(--primaryAlpha05), 0 2px 12px 0 rgba(#000, 0.5) else - box-shadow 0 0 0px 1px rgba($theme-color, 0.5), 0 2px 6px 0 rgba(#000, 0.2) + box-shadow 0 0 0px 1px var(--primaryAlpha05), 0 2px 6px 0 rgba(#000, 0.2) > .handle $size = 8px diff --git a/src/client/app/desktop/views/pages/admin/admin.announcements.vue b/src/client/app/desktop/views/pages/admin/admin.announcements.vue index 532400deb2..272016b3f9 100644 --- a/src/client/app/desktop/views/pages/admin/admin.announcements.vue +++ b/src/client/app/desktop/views/pages/admin/admin.announcements.vue @@ -31,7 +31,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .qldxjjsrseehkusjuoooapmsprvfrxyl textarea diff --git a/src/client/app/desktop/views/pages/admin/admin.dashboard.vue b/src/client/app/desktop/views/pages/admin/admin.dashboard.vue index 5d0f6d451e..f5734012bd 100644 --- a/src/client/app/desktop/views/pages/admin/admin.dashboard.vue +++ b/src/client/app/desktop/views/pages/admin/admin.dashboard.vue @@ -95,7 +95,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .obdskegsannmntldydackcpzezagxqfy > .stats @@ -112,7 +112,7 @@ export default Vue.extend({ > *:first-child display block - color $theme-color + color var(--primary) > *:last-child font-size 70% diff --git a/src/client/app/desktop/views/pages/admin/admin.hashtags.vue b/src/client/app/desktop/views/pages/admin/admin.hashtags.vue index c6bf20361f..f491b85959 100644 --- a/src/client/app/desktop/views/pages/admin/admin.hashtags.vue +++ b/src/client/app/desktop/views/pages/admin/admin.hashtags.vue @@ -31,7 +31,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .jdnqwkzlnxcfftthoybjxrebyolvoucw textarea diff --git a/src/client/app/desktop/views/pages/admin/admin.suspend-user.vue b/src/client/app/desktop/views/pages/admin/admin.suspend-user.vue index 8d8e37e181..32295e3795 100644 --- a/src/client/app/desktop/views/pages/admin/admin.suspend-user.vue +++ b/src/client/app/desktop/views/pages/admin/admin.suspend-user.vue @@ -39,7 +39,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + header margin 10px 0 diff --git a/src/client/app/desktop/views/pages/admin/admin.unsuspend-user.vue b/src/client/app/desktop/views/pages/admin/admin.unsuspend-user.vue index ec423969be..d6905fe9c0 100644 --- a/src/client/app/desktop/views/pages/admin/admin.unsuspend-user.vue +++ b/src/client/app/desktop/views/pages/admin/admin.unsuspend-user.vue @@ -39,7 +39,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + header margin 10px 0 diff --git a/src/client/app/desktop/views/pages/admin/admin.unverify-user.vue b/src/client/app/desktop/views/pages/admin/admin.unverify-user.vue index e8204e69f4..d0cf635a98 100644 --- a/src/client/app/desktop/views/pages/admin/admin.unverify-user.vue +++ b/src/client/app/desktop/views/pages/admin/admin.unverify-user.vue @@ -39,7 +39,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + header margin 10px 0 diff --git a/src/client/app/desktop/views/pages/admin/admin.verify-user.vue b/src/client/app/desktop/views/pages/admin/admin.verify-user.vue index 91fb04af80..9c0b0209b7 100644 --- a/src/client/app/desktop/views/pages/admin/admin.verify-user.vue +++ b/src/client/app/desktop/views/pages/admin/admin.verify-user.vue @@ -39,7 +39,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + header margin 10px 0 diff --git a/src/client/app/desktop/views/pages/admin/admin.vue b/src/client/app/desktop/views/pages/admin/admin.vue index 510252b447..b874915f05 100644 --- a/src/client/app/desktop/views/pages/admin/admin.vue +++ b/src/client/app/desktop/views/pages/admin/admin.vue @@ -70,7 +70,7 @@ export default Vue.extend({ </script> <style lang="stylus"> -@import '~const.styl' + .mk-admin display flex @@ -106,7 +106,7 @@ export default Vue.extend({ &.active margin-left 8px - color $theme-color !important + color var(--primary) !important > main width 100% diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 04aa5e82d1..10454b1cc6 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -269,7 +269,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) $header-height = 42px @@ -283,10 +283,10 @@ root(isDark) overflow hidden &.draghover - box-shadow 0 0 0 2px rgba($theme-color, 0.8) + box-shadow 0 0 0 2px var(--primaryAlpha08) &.dragging - box-shadow 0 0 0 2px rgba($theme-color, 0.4) + box-shadow 0 0 0 2px var(--primaryAlpha04) &.dropready * @@ -329,7 +329,7 @@ root(isDark) pointer-events none &.indicate - box-shadow 0 3px 0 0 $theme-color + box-shadow 0 3px 0 0 var(--primary) > span [data-fa] diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index 99274b0f41..82e816cc8c 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -214,7 +214,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + mediaRoot(isDark) font-size 13px @@ -368,8 +368,8 @@ root(isDark) padding 0 4px margin-left 4px font-size 80% - color $theme-color-foreground - background $theme-color + color var(--primaryForeground) + background var(--primary) border-radius 4px .mk-url-preview @@ -430,7 +430,7 @@ root(isDark) color #999 &.reacted - color $theme-color + color var(--primary) .zyjjkidcqjnlegkqebitfviomuqmseqk[data-darkmode] root(true) diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue index 2e7e30f12a..58f13dd57b 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notes.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue @@ -195,7 +195,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) .transition diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index 810770a022..48c80c82c4 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -221,7 +221,7 @@ export default Vue.extend({ </style> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) display flex diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue index 15397232e0..fe190bf892 100644 --- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue @@ -135,7 +135,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) .gqpwvtwtprsbmnssnbicggtwqhmylhnq diff --git a/src/client/app/desktop/views/pages/selectdrive.vue b/src/client/app/desktop/views/pages/selectdrive.vue index c846f2418f..b82ed0a208 100644 --- a/src/client/app/desktop/views/pages/selectdrive.vue +++ b/src/client/app/desktop/views/pages/selectdrive.vue @@ -54,7 +54,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .mkp-selectdrive display block @@ -72,7 +72,7 @@ export default Vue.extend({ left 0 width 100% height 72px - background lighten($theme-color, 95%) + background var(--primaryLighten95) .upload display inline-block @@ -85,7 +85,7 @@ export default Vue.extend({ width 40px height 40px font-size 1em - color rgba($theme-color, 0.5) + color var(--primaryAlpha05) background transparent outline none border solid 1px transparent @@ -93,13 +93,13 @@ export default Vue.extend({ &:hover background transparent - border-color rgba($theme-color, 0.3) + border-color var(--primaryAlpha03) &:active - color rgba($theme-color, 0.6) + color var(--primaryAlpha06) background transparent - border-color rgba($theme-color, 0.5) - box-shadow 0 2px 4px rgba(darken($theme-color, 50%), 0.15) inset + border-color var(--primaryAlpha05) + //box-shadow 0 2px 4px rgba(var(--primaryDarken50), 0.15) inset &:focus &:after @@ -110,7 +110,7 @@ export default Vue.extend({ right -5px bottom -5px left -5px - border 2px solid rgba($theme-color, 0.3) + border 2px solid var(--primaryAlpha03) border-radius 8px .ok @@ -136,7 +136,7 @@ export default Vue.extend({ right -5px bottom -5px left -5px - border 2px solid rgba($theme-color, 0.3) + border 2px solid var(--primaryAlpha03) border-radius 8px &:disabled @@ -145,20 +145,20 @@ export default Vue.extend({ .ok right 16px - color $theme-color-foreground - background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%) - border solid 1px lighten($theme-color, 15%) + color var(--primaryForeground) + background linear-gradient(to bottom, var(--primaryLighten25) 0%, var(--primaryLighten10) 100%) + border solid 1px var(--primaryLighten15) &:not(:disabled) font-weight bold &:hover:not(:disabled) - background linear-gradient(to bottom, lighten($theme-color, 8%) 0%, darken($theme-color, 8%) 100%) - border-color $theme-color + background linear-gradient(to bottom, var(--primaryLighten8) 0%, var(--primaryDarken8) 100%) + border-color var(--primary) &:active:not(:disabled) - background $theme-color - border-color $theme-color + background var(--primary) + border-color var(--primary) .cancel right 148px diff --git a/src/client/app/desktop/views/pages/stats/stats.vue b/src/client/app/desktop/views/pages/stats/stats.vue index 7a4e4ab5ce..219885fb9e 100644 --- a/src/client/app/desktop/views/pages/stats/stats.vue +++ b/src/client/app/desktop/views/pages/stats/stats.vue @@ -34,7 +34,7 @@ export default Vue.extend({ </script> <style lang="stylus"> -@import '~const.styl' + .tcrwdhwpuxrwmcttxjcsehgpagpstqey width 100% @@ -54,7 +54,7 @@ export default Vue.extend({ > *:first-child display block - color $theme-color + color var(--primary) > *:last-child font-size 70% diff --git a/src/client/app/desktop/views/pages/user/user.header.vue b/src/client/app/desktop/views/pages/user/user.header.vue index f727910e77..30dc74212d 100644 --- a/src/client/app/desktop/views/pages/user/user.header.vue +++ b/src/client/app/desktop/views/pages/user/user.header.vue @@ -100,7 +100,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) background isDark ? #282C37 : #fff @@ -208,7 +208,7 @@ root(isDark) margin-right 4px font-size 1rem font-weight bold - color $theme-color + color var(--primary) .header[data-darkmode] root(true) diff --git a/src/client/app/desktop/views/pages/user/user.timeline.vue b/src/client/app/desktop/views/pages/user/user.timeline.vue index be6adaac93..3cde6cc10c 100644 --- a/src/client/app/desktop/views/pages/user/user.timeline.vue +++ b/src/client/app/desktop/views/pages/user/user.timeline.vue @@ -112,7 +112,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) background isDark ? #282C37 : #fff @@ -133,7 +133,7 @@ root(isDark) user-select none &[data-active] - color $theme-color + color var(--primary) cursor default font-weight bold @@ -145,7 +145,7 @@ root(isDark) left -8px width calc(100% + 16px) height 2px - background $theme-color + background var(--primary) &:not([data-active]) color isDark ? #9aa2a7 : #6f7477 diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 7f5f4b9c37..05c32a7bd1 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -303,7 +303,7 @@ export default Vue.extend({ </style> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) display flex @@ -385,7 +385,7 @@ root(isDark) > .main grid-row 1 grid-column 1 / 3 - border-top solid 5px $theme-color + border-top solid 5px var(--primary) > div padding 32px @@ -426,7 +426,7 @@ root(isDark) cursor pointer &:hover - color $theme-color + color var(--primary) > .char display block diff --git a/src/client/app/desktop/views/widgets/post-form.vue b/src/client/app/desktop/views/widgets/post-form.vue index 19a2790d95..a763f4d17c 100644 --- a/src/client/app/desktop/views/widgets/post-form.vue +++ b/src/client/app/desktop/views/widgets/post-form.vue @@ -68,7 +68,7 @@ export default define({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .mkw-post-form background #fff @@ -107,8 +107,8 @@ export default define({ margin 0 padding 0 10px height 28px - color $theme-color-foreground - background $theme-color !important + color var(--primaryForeground) + background var(--primary) !important outline none border none border-radius 4px @@ -116,10 +116,10 @@ export default define({ cursor pointer &:hover - background lighten($theme-color, 10%) !important + background var(--primaryLighten10) !important &:active - background darken($theme-color, 10%) !important + background var(--primaryDarken10) !important transition background 0s ease </style> diff --git a/src/client/app/mobile/views/components/dialog.vue b/src/client/app/mobile/views/components/dialog.vue index 6a0d74c752..fff44a28c3 100644 --- a/src/client/app/mobile/views/components/dialog.vue +++ b/src/client/app/mobile/views/components/dialog.vue @@ -91,7 +91,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .mk-dialog > .bg @@ -145,20 +145,20 @@ export default Vue.extend({ margin 0 0.375em &:hover - color $theme-color + color var(--primary) &:active - color darken($theme-color, 10%) + color var(--primaryDarken10) transition color 0s ease </style> <style lang="stylus" module> -@import '~const.styl' + .header margin 0 0 1em 0 - color $theme-color + color var(--primary) // color #43A4EC font-weight bold diff --git a/src/client/app/mobile/views/components/drive.file.vue b/src/client/app/mobile/views/components/drive.file.vue index 4375cfdd7b..ba58cf59a0 100644 --- a/src/client/app/mobile/views/components/drive.file.vue +++ b/src/client/app/mobile/views/components/drive.file.vue @@ -63,7 +63,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) display block @@ -150,7 +150,7 @@ root(isDark) color #bf4633 &[data-is-selected] - background $theme-color + background var(--primary) &, * color #fff !important diff --git a/src/client/app/mobile/views/components/follow-button.vue b/src/client/app/mobile/views/components/follow-button.vue index ff7260edb5..cff830d998 100644 --- a/src/client/app/mobile/views/components/follow-button.vue +++ b/src/client/app/mobile/views/components/follow-button.vue @@ -93,7 +93,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .mk-follow-button display block @@ -105,29 +105,29 @@ export default Vue.extend({ line-height 36px font-size 14px font-weight bold - color $theme-color + color var(--primary) background transparent outline none - border solid 1px $theme-color + border solid 1px var(--primary) border-radius 36px &:hover - background rgba($theme-color, 0.1) + background var(--primaryAlpha01) &:active - background rgba($theme-color, 0.2) + background var(--primaryAlpha02) &.active - color $theme-color-foreground - background $theme-color + color var(--primaryForeground) + background var(--primary) &:hover - background lighten($theme-color, 10%) - border-color lighten($theme-color, 10%) + background var(--primaryLighten10) + border-color var(--primaryLighten10) &:active - background darken($theme-color, 10%) - border-color darken($theme-color, 10%) + background var(--primaryDarken10) + border-color var(--primaryDarken10) &.wait cursor wait !important diff --git a/src/client/app/mobile/views/components/mute-button.vue b/src/client/app/mobile/views/components/mute-button.vue index 3cb568615d..316fbda8f1 100644 --- a/src/client/app/mobile/views/components/mute-button.vue +++ b/src/client/app/mobile/views/components/mute-button.vue @@ -41,11 +41,11 @@ export default Vue.extend({ <style lang="stylus" scoped> -@import '~const.styl' + .mk-mute-button display block - user-select none + user-select none cursor pointer padding 0 16px margin 0 @@ -53,27 +53,27 @@ export default Vue.extend({ line-height 36px font-size 14px font-weight bold - color $theme-color + color var(--primary) background transparent outline none - border solid 1px $theme-color + border solid 1px var(--primary) border-radius 36px &:hover - background rgba($theme-color, 0.1) + background var(--primaryAlpha01) &:active - background rgba($theme-color, 0.2) + background var(--primaryAlpha02) &.active - color $theme-color-foreground - background $theme-color + color var(--primaryForeground) + background var(--primary) &:hover - background lighten($theme-color, 10%) - border-color lighten($theme-color, 10%) + background var(--primaryLighten10) + border-color var(--primaryLighten10) &:active - background darken($theme-color, 10%) - border-color darken($theme-color, 10%) + background var(--primaryDarken10) + border-color var(--primaryDarken10) </style> diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index 68be9f8ac4..6daf375ed2 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -223,7 +223,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) overflow hidden @@ -422,7 +422,7 @@ root(isDark) color #999 &.reacted - color $theme-color + color var(--primary) > .replies > * diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 0ce72cab11..2bfd8f8acc 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -228,7 +228,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) font-size 12px @@ -395,8 +395,8 @@ root(isDark) padding 0 4px margin-left 4px font-size 80% - color $theme-color-foreground - background $theme-color + color var(--primaryForeground) + background var(--primary) border-radius 4px .mk-url-preview @@ -457,7 +457,7 @@ root(isDark) color #999 &.reacted - color $theme-color + color var(--primary) .note[data-darkmode] root(true) diff --git a/src/client/app/mobile/views/components/notes.vue b/src/client/app/mobile/views/components/notes.vue index 401df3ae5b..83674a33dc 100644 --- a/src/client/app/mobile/views/components/notes.vue +++ b/src/client/app/mobile/views/components/notes.vue @@ -217,7 +217,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) overflow hidden diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 1294273a2a..742163696e 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -324,7 +324,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) max-width 500px @@ -376,8 +376,8 @@ root(isDark) padding 0 16px line-height 34px vertical-align bottom - color $theme-color-foreground - background $theme-color + color var(--primaryForeground) + background var(--primary) border-radius 4px &:disabled diff --git a/src/client/app/mobile/views/components/ui.header.vue b/src/client/app/mobile/views/components/ui.header.vue index 15c8299c2e..b859c22887 100644 --- a/src/client/app/mobile/views/components/ui.header.vue +++ b/src/client/app/mobile/views/components/ui.header.vue @@ -118,7 +118,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) $height = 48px @@ -134,7 +134,7 @@ root(isDark) > .indicator height 3px - background $theme-color + background var(--primary) > .warn display block @@ -216,7 +216,7 @@ root(isDark) left 8px pointer-events none font-size 10px - color $theme-color + color var(--primary) > button:last-child display block diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue index c3ae05fef6..29dcf18021 100644 --- a/src/client/app/mobile/views/components/ui.nav.vue +++ b/src/client/app/mobile/views/components/ui.nav.vue @@ -121,7 +121,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) $color = isDark ? #c9d2e0 : #777 @@ -198,11 +198,11 @@ root(isDark) text-decoration none &[data-active] - color $theme-color-foreground - background $theme-color + color var(--primaryForeground) + background var(--primary) > [data-fa]:last-child - color $theme-color-foreground + color var(--primaryForeground) > [data-fa]:first-child margin-right 0.5em @@ -212,7 +212,7 @@ root(isDark) > [data-fa].circle margin-left 6px font-size 10px - color $theme-color + color var(--primary) > [data-fa]:last-child position absolute diff --git a/src/client/app/mobile/views/components/users-list.vue b/src/client/app/mobile/views/components/users-list.vue index a57b821293..f06f5245b8 100644 --- a/src/client/app/mobile/views/components/users-list.vue +++ b/src/client/app/mobile/views/components/users-list.vue @@ -65,7 +65,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + .mk-users-list @@ -87,8 +87,8 @@ export default Vue.extend({ &[data-active] font-weight bold - color $theme-color - border-color $theme-color + color var(--primary) + border-color var(--primary) > span display inline-block diff --git a/src/client/app/mobile/views/pages/favorites.vue b/src/client/app/mobile/views/pages/favorites.vue index 53512e804c..a25f70147b 100644 --- a/src/client/app/mobile/views/pages/favorites.vue +++ b/src/client/app/mobile/views/pages/favorites.vue @@ -71,7 +71,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + main width 100% diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue index ca62d4e2f8..c2ab5d5623 100644 --- a/src/client/app/mobile/views/pages/home.vue +++ b/src/client/app/mobile/views/pages/home.vue @@ -154,7 +154,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) > .nav @@ -215,8 +215,8 @@ root(isDark) color isDark ? #cdd0d8 : #666 &[data-active] - color $theme-color-foreground - background $theme-color + color var(--primaryForeground) + background var(--primary) &:not([data-active]):hover background isDark ? #353e4a : #eee @@ -224,7 +224,7 @@ root(isDark) > .badge margin-left 6px font-size 10px - color $theme-color + color var(--primary) > .tl max-width 680px @@ -246,7 +246,7 @@ main:not([data-darkmode]) </style> <style lang="stylus" module> -@import '~const.styl' + .title i @@ -255,7 +255,7 @@ main:not([data-darkmode]) .badge margin-left 6px font-size 10px - color $theme-color + color var(--primary) vertical-align middle </style> diff --git a/src/client/app/mobile/views/pages/notifications.vue b/src/client/app/mobile/views/pages/notifications.vue index bddcd457bb..ce33332faf 100644 --- a/src/client/app/mobile/views/pages/notifications.vue +++ b/src/client/app/mobile/views/pages/notifications.vue @@ -34,7 +34,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + main width 100% diff --git a/src/client/app/mobile/views/pages/received-follow-requests.vue b/src/client/app/mobile/views/pages/received-follow-requests.vue index 77938c3d60..c2b2606fd8 100644 --- a/src/client/app/mobile/views/pages/received-follow-requests.vue +++ b/src/client/app/mobile/views/pages/received-follow-requests.vue @@ -52,7 +52,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + main width 100% diff --git a/src/client/app/mobile/views/pages/user-list.vue b/src/client/app/mobile/views/pages/user-list.vue index 1c6a829cd5..f8c8aafa61 100644 --- a/src/client/app/mobile/views/pages/user-list.vue +++ b/src/client/app/mobile/views/pages/user-list.vue @@ -53,7 +53,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + main width 100% diff --git a/src/client/app/mobile/views/pages/user-lists.vue b/src/client/app/mobile/views/pages/user-lists.vue index 5ee0636dea..fc80f5d1c6 100644 --- a/src/client/app/mobile/views/pages/user-lists.vue +++ b/src/client/app/mobile/views/pages/user-lists.vue @@ -51,7 +51,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + main width 100% diff --git a/src/client/app/mobile/views/pages/user.vue b/src/client/app/mobile/views/pages/user.vue index c1082f31a9..1ff81fc0c6 100644 --- a/src/client/app/mobile/views/pages/user.vue +++ b/src/client/app/mobile/views/pages/user.vue @@ -115,7 +115,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -@import '~const.styl' + root(isDark) $bg = isDark ? #22252f : #f7f7f7 @@ -275,8 +275,8 @@ root(isDark) &[data-active] font-weight bold - color $theme-color - border-color $theme-color + color var(--primary) + border-color var(--primary) > .body max-width 680px diff --git a/src/client/const.styl b/src/client/const.styl deleted file mode 100644 index b6560701d9..0000000000 --- a/src/client/const.styl +++ /dev/null @@ -1,4 +0,0 @@ -json('../const.json') - -$theme-color = themeColor -$theme-color-foreground = themeColorForeground diff --git a/src/client/style.styl b/src/client/style.styl index 6d1e53e5a6..111e167204 100644 --- a/src/client/style.styl +++ b/src/client/style.styl @@ -1,10 +1,8 @@ @charset 'utf-8' -@import "./const" - /* ::selection - background $theme-color + background var(--primary) color #fff */ @@ -24,10 +22,8 @@ html, body a text-decoration none - color $theme-color + color var(--primary) cursor pointer - tap-highlight-color rgba($theme-color, 0.7) !important - -webkit-tap-highlight-color rgba($theme-color, 0.7) !important &:hover text-decoration underline @@ -35,3 +31,9 @@ a * cursor pointer +@css { + a { + tap-highlight-color: rgba(var(--primary-r), var(--primary-g), var(--primary-b), 0.7) !important; + -webkit-tap-highlight-color: rgba(var(--primary-r), var(--primary-g), var(--primary-b), 0.7) !important; + } +} diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 4ea0a1a649..ffe0ffa3ce 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -3,6 +3,7 @@ "name": "Dark" }, "primary": "#fb4e4e", + "primaryForeground": "#fff", "bg": "#191B22", "scrollbarTrack": "#282C37", "scrollbarHandle": "#454954", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 00a74a53c5..f4d061e5ce 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -3,6 +3,7 @@ "name": "Light" }, "primary": "#fb4e4e", + "primaryForeground": "#fff", "bg": "#f7f7f7", "scrollbarTrack": "#fff", "scrollbarHandle": "#00000033", From f5f2215b47ce4590788dce2af1c8e4e586548e77 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 26 Sep 2018 20:28:13 +0900 Subject: [PATCH 377/539] wip --- src/client/app/common/views/components/autocomplete.vue | 2 +- .../common/views/components/games/reversi/reversi.index.vue | 4 ++-- .../common/views/components/games/reversi/reversi.room.vue | 4 ++-- src/client/app/common/views/components/messaging-room.vue | 2 +- src/client/app/common/views/components/messaging.vue | 2 +- src/client/app/common/views/components/ui/card.vue | 2 +- src/client/app/common/views/components/welcome-timeline.vue | 2 +- src/client/app/common/views/pages/follow.vue | 2 +- src/client/app/common/views/widgets/donation.vue | 2 +- src/client/app/common/views/widgets/memo.vue | 2 +- src/client/app/common/views/widgets/nav.vue | 2 +- src/client/app/desktop/views/components/calendar.vue | 2 +- src/client/app/desktop/views/components/context-menu.vue | 2 +- src/client/app/desktop/views/components/drive.vue | 2 +- src/client/app/desktop/views/components/note-detail.vue | 2 +- src/client/app/desktop/views/components/notes.note.vue | 2 +- src/client/app/desktop/views/components/notes.vue | 2 +- src/client/app/desktop/views/components/timeline.vue | 4 ++-- src/client/app/desktop/views/components/ui-notification.vue | 2 +- src/client/app/desktop/views/components/ui.header.account.vue | 2 +- .../app/desktop/views/components/ui.header.notifications.vue | 2 +- src/client/app/desktop/views/components/user-preview.vue | 4 ++-- src/client/app/desktop/views/components/widget-container.vue | 4 ++-- src/client/app/desktop/views/components/window.vue | 4 ++-- src/client/app/desktop/views/pages/deck/deck.column.vue | 4 ++-- src/client/app/desktop/views/pages/deck/deck.notes.vue | 2 +- .../app/desktop/views/pages/user/user.followers-you-know.vue | 2 +- src/client/app/desktop/views/pages/user/user.friends.vue | 2 +- src/client/app/desktop/views/pages/user/user.header.vue | 2 +- src/client/app/desktop/views/pages/user/user.photos.vue | 2 +- src/client/app/desktop/views/pages/user/user.profile.vue | 2 +- src/client/app/desktop/views/pages/user/user.timeline.vue | 4 ++-- src/client/app/desktop/views/pages/welcome.vue | 4 ++-- src/client/app/desktop/views/widgets/profile.vue | 2 +- src/client/app/mobile/views/components/drive-file-chooser.vue | 2 +- src/client/app/mobile/views/components/drive.vue | 4 ++-- src/client/app/mobile/views/components/note-card.vue | 2 +- src/client/app/mobile/views/components/note-detail.vue | 2 +- src/client/app/mobile/views/components/notes.vue | 2 +- src/client/app/mobile/views/components/post-form.vue | 2 +- src/client/app/mobile/views/components/widget-container.vue | 2 +- src/client/app/mobile/views/pages/user/home.vue | 2 +- src/client/theme/dark.json | 4 +++- src/client/theme/light.json | 4 +++- 44 files changed, 58 insertions(+), 54 deletions(-) diff --git a/src/client/app/common/views/components/autocomplete.vue b/src/client/app/common/views/components/autocomplete.vue index 99a87520a4..bba6f4f7b2 100644 --- a/src/client/app/common/views/components/autocomplete.vue +++ b/src/client/app/common/views/components/autocomplete.vue @@ -267,7 +267,7 @@ root(isDark) max-width 100% margin-top calc(1em + 8px) overflow hidden - background isDark ? #313543 : #fff + background var(--faceHeader) border solid 1px rgba(#000, 0.1) border-radius 4px transition top 0.1s ease, left 0.1s ease diff --git a/src/client/app/common/views/components/games/reversi/reversi.index.vue b/src/client/app/common/views/components/games/reversi/reversi.index.vue index f6c7f0e3c2..44a1262636 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.index.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.index.vue @@ -190,7 +190,7 @@ root(isDark) margin 8px 0 padding 8px color isDark ? #fff : #677f84 - background isDark ? #282c37 : #fff + background var(--face) box-shadow 0 2px 16px rgba(#000, isDark ? 0.7 : 0.15) border-radius 6px cursor pointer @@ -222,7 +222,7 @@ root(isDark) margin 8px 0 padding 8px color isDark ? #fff : #677f84 - background isDark ? #282c37 : #fff + background var(--face) box-shadow 0 2px 16px rgba(#000, isDark ? 0.7 : 0.15) border-radius 6px cursor pointer diff --git a/src/client/app/common/views/components/games/reversi/reversi.room.vue b/src/client/app/common/views/components/games/reversi/reversi.room.vue index d4b91ae7a7..072f3eda12 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.room.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.room.vue @@ -273,7 +273,7 @@ root(isDark) > select width 100% padding 12px 14px - background isDark ? #282C37 : #fff + background var(--face) border 1px solid isDark ? #6a707d : #dcdfe6 border-radius 4px color isDark ? #fff : #606266 @@ -331,7 +331,7 @@ root(isDark) .card max-width 400px border-radius 4px - background isDark ? #282C37 : #fff + background var(--face) color isDark ? #fff : #303133 box-shadow 0 2px 12px 0 rgba(#000, isDark ? 0.7 : 0.1) diff --git a/src/client/app/common/views/components/messaging-room.vue b/src/client/app/common/views/components/messaging-room.vue index 5bdf8b9034..52abfa4e1d 100644 --- a/src/client/app/common/views/components/messaging-room.vue +++ b/src/client/app/common/views/components/messaging-room.vue @@ -369,7 +369,7 @@ root(isDark) max-width 600px margin 0 auto padding 0 - background rgba(isDark ? #282c37 : #fff, 0.95) + //background rgba(var(--face), 0.95) background-clip content-box > .new-message diff --git a/src/client/app/common/views/components/messaging.vue b/src/client/app/common/views/components/messaging.vue index 7181ddd01c..a984c980b1 100644 --- a/src/client/app/common/views/components/messaging.vue +++ b/src/client/app/common/views/components/messaging.vue @@ -329,7 +329,7 @@ root(isDark) > a display block text-decoration none - background isDark ? #282c37 : #fff + background var(--face) border-bottom solid 1px isDark ? #1c2023 : #eee * diff --git a/src/client/app/common/views/components/ui/card.vue b/src/client/app/common/views/components/ui/card.vue index a9e0493810..be24027f6c 100644 --- a/src/client/app/common/views/components/ui/card.vue +++ b/src/client/app/common/views/components/ui/card.vue @@ -25,7 +25,7 @@ export default Vue.extend({ root(isDark) margin 16px color isDark ? #fff : #000 - background isDark ? #282C37 : #fff + background var(--face) box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12) > header diff --git a/src/client/app/common/views/components/welcome-timeline.vue b/src/client/app/common/views/components/welcome-timeline.vue index 965ec78559..938ab602f0 100644 --- a/src/client/app/common/views/components/welcome-timeline.vue +++ b/src/client/app/common/views/components/welcome-timeline.vue @@ -91,7 +91,7 @@ export default Vue.extend({ transform translateY(-30px) root(isDark) - background isDark ? #282C37 : #fff + background var(--face) > div > * diff --git a/src/client/app/common/views/pages/follow.vue b/src/client/app/common/views/pages/follow.vue index d81e4c0820..5e2d448d8b 100644 --- a/src/client/app/common/views/pages/follow.vue +++ b/src/client/app/common/views/pages/follow.vue @@ -116,7 +116,7 @@ root(isDark) text-align center color isDark ? #9baec8 : #868c8c - $bg = isDark ? #282C37 : #fff + $bg = var(--face) @media (max-width 400px) padding 16px diff --git a/src/client/app/common/views/widgets/donation.vue b/src/client/app/common/views/widgets/donation.vue index 544ca1bd9d..a91aa8e749 100644 --- a/src/client/app/common/views/widgets/donation.vue +++ b/src/client/app/common/views/widgets/donation.vue @@ -31,7 +31,7 @@ export default define({ <style lang="stylus" scoped> root(isDark) - background isDark ? #282c37 : #fff + background var(--face) border solid 1px isDark ? #c3831c : #ead8bb border-radius 6px diff --git a/src/client/app/common/views/widgets/memo.vue b/src/client/app/common/views/widgets/memo.vue index 079522d39b..42df683883 100644 --- a/src/client/app/common/views/widgets/memo.vue +++ b/src/client/app/common/views/widgets/memo.vue @@ -70,7 +70,7 @@ root(isDark) min-width 100% padding 16px color isDark ? #fff : #222 - background isDark ? #282c37 : #fff + background var(--face) border none border-bottom solid 1px isDark ? #1c2023 : #eee border-radius 0 diff --git a/src/client/app/common/views/widgets/nav.vue b/src/client/app/common/views/widgets/nav.vue index 0cbf7c158e..04dfe97c72 100644 --- a/src/client/app/common/views/widgets/nav.vue +++ b/src/client/app/common/views/widgets/nav.vue @@ -21,7 +21,7 @@ root(isDark) padding 16px font-size 12px color isDark ? #9aa4b3 : #aaa - background isDark ? #282c37 : #fff + background var(--face) a color isDark ? #9aa4b3 : #999 diff --git a/src/client/app/desktop/views/components/calendar.vue b/src/client/app/desktop/views/components/calendar.vue index 2414ced0c9..cd73ab350b 100644 --- a/src/client/app/desktop/views/components/calendar.vue +++ b/src/client/app/desktop/views/components/calendar.vue @@ -132,7 +132,7 @@ export default Vue.extend({ root(isDark) color isDark ? #c5ced6 : #777 - background isDark ? #282C37 : #fff + background var(--face) box-shadow var(--shadow) border-radius var(--round) overflow hidden diff --git a/src/client/app/desktop/views/components/context-menu.vue b/src/client/app/desktop/views/components/context-menu.vue index 49aeac143f..170dcf55a1 100644 --- a/src/client/app/desktop/views/components/context-menu.vue +++ b/src/client/app/desktop/views/components/context-menu.vue @@ -82,7 +82,7 @@ root(isDark) z-index 4096 width $width font-size 0.8em - background isDark ? #282c37 : #fff + background var(--face) border-radius 0 4px 4px 4px box-shadow 2px 2px 8px rgba(#000, 0.2) opacity 0 diff --git a/src/client/app/desktop/views/components/drive.vue b/src/client/app/desktop/views/components/drive.vue index ccfdb3159f..a1748963aa 100644 --- a/src/client/app/desktop/views/components/drive.vue +++ b/src/client/app/desktop/views/components/drive.vue @@ -596,7 +596,7 @@ root(isDark) overflow auto font-size 0.9em color isDark ? #d2d9dc : #555 - background isDark ? #282c37 : #fff + background var(--face) box-shadow 0 1px 0 rgba(#000, 0.05) &, * diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index f004ca88ee..35eb6ac45d 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -230,7 +230,7 @@ export default Vue.extend({ root(isDark) overflow hidden text-align left - background isDark ? #282C37 : #fff + background var(--face) box-shadow var(--shadow) border-radius var(--round) diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index a91212221b..13a8641170 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -322,7 +322,7 @@ export default Vue.extend({ root(isDark) margin 0 padding 0 - background isDark ? #282C37 : #fff + background var(--face) border-bottom solid 1px isDark ? #1c2023 : #eaeaea &[data-round] diff --git a/src/client/app/desktop/views/components/notes.vue b/src/client/app/desktop/views/components/notes.vue index 2e3ffd171b..0bd45b1c21 100644 --- a/src/client/app/desktop/views/components/notes.vue +++ b/src/client/app/desktop/views/components/notes.vue @@ -260,7 +260,7 @@ root(isDark) width 100% text-align center color #ccc - background isDark ? #282C37 : #fff + background var(--face) border-top solid 1px isDark ? #1c2023 : #eaeaea border-bottom-left-radius 6px border-bottom-right-radius 6px diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue index 32ed89ef0b..7800eae52d 100644 --- a/src/client/app/desktop/views/components/timeline.vue +++ b/src/client/app/desktop/views/components/timeline.vue @@ -178,7 +178,7 @@ export default Vue.extend({ root(isDark) - background isDark ? #282C37 : #fff + background var(--face) box-shadow var(--shadow) border-radius var(--round) overflow hidden @@ -186,7 +186,7 @@ root(isDark) > header padding 0 8px z-index 10 - background isDark ? #313543 : #fff + background var(--faceHeader) box-shadow 0 1px isDark ? rgba(#000, 0.15) : rgba(#000, 0.08) > .buttons diff --git a/src/client/app/desktop/views/components/ui-notification.vue b/src/client/app/desktop/views/components/ui-notification.vue index 7519124870..883a880e5d 100644 --- a/src/client/app/desktop/views/components/ui-notification.vue +++ b/src/client/app/desktop/views/components/ui-notification.vue @@ -47,7 +47,7 @@ root(isDark) padding 128px 0 0 0 width 500px color rgba(isDark ? #fff : #000, 0.6) - background rgba(isDark ? #282C37 : #fff, 0.9) + //background rgba(var(--face), 0.9) border-radius 0 0 8px 8px box-shadow 0 2px 4px rgba(#000, isDark ? 0.4 : 0.2) transform translateY(-64px) diff --git a/src/client/app/desktop/views/components/ui.header.account.vue b/src/client/app/desktop/views/components/ui.header.account.vue index 301efeb3e2..c728fa42be 100644 --- a/src/client/app/desktop/views/components/ui.header.account.vue +++ b/src/client/app/desktop/views/components/ui.header.account.vue @@ -177,7 +177,7 @@ root(isDark) transition filter 100ms ease > .menu - $bgcolor = isDark ? #282c37 : #fff + $bgcolor = var(--face) display block position absolute top 56px diff --git a/src/client/app/desktop/views/components/ui.header.notifications.vue b/src/client/app/desktop/views/components/ui.header.notifications.vue index f9b68fa0e9..2a38655f3a 100644 --- a/src/client/app/desktop/views/components/ui.header.notifications.vue +++ b/src/client/app/desktop/views/components/ui.header.notifications.vue @@ -96,7 +96,7 @@ root(isDark) color var(--primary) > .pop - $bgcolor = isDark ? #282c37 : #fff + $bgcolor = var(--face) display block position absolute top 56px diff --git a/src/client/app/desktop/views/components/user-preview.vue b/src/client/app/desktop/views/components/user-preview.vue index f988bb21e9..01b6cdbdc5 100644 --- a/src/client/app/desktop/views/components/user-preview.vue +++ b/src/client/app/desktop/views/components/user-preview.vue @@ -90,7 +90,7 @@ root(isDark) z-index 2048 margin-top -8px width 250px - background isDark ? #282c37 : #fff + background var(--face) background-clip content-box border solid 1px rgba(#000, 0.1) border-radius 4px @@ -111,7 +111,7 @@ root(isDark) z-index 2 width 58px height 58px - border solid 3px isDark ? #282c37 : #fff + border solid 3px var(--face) border-radius 8px > .title diff --git a/src/client/app/desktop/views/components/widget-container.vue b/src/client/app/desktop/views/components/widget-container.vue index fbf7691cd3..d17b9c91d8 100644 --- a/src/client/app/desktop/views/components/widget-container.vue +++ b/src/client/app/desktop/views/components/widget-container.vue @@ -35,7 +35,7 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) - background isDark ? #282C37 : #fff + background var(--face) box-shadow var(--shadow) border-radius var(--round) overflow hidden @@ -45,7 +45,7 @@ root(isDark) box-shadow none !important > header - background isDark ? #313543 : #fff + background var(--faceHeader) > .title z-index 1 diff --git a/src/client/app/desktop/views/components/window.vue b/src/client/app/desktop/views/components/window.vue index 2b01c24ca8..15aa158073 100644 --- a/src/client/app/desktop/views/components/window.vue +++ b/src/client/app/desktop/views/components/window.vue @@ -562,7 +562,7 @@ root(isDark) > .body height 100% overflow hidden - background isDark ? #282C37 : #fff + background var(--face) border-radius 6px if isDark @@ -578,7 +578,7 @@ root(isDark) overflow hidden white-space nowrap cursor move - background isDark ? #313543 : #fff + background var(--faceHeader) border-radius 6px 6px 0 0 box-shadow 0 1px 0 rgba(#000, 0.1) diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 10454b1cc6..1cf8900ee5 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -277,7 +277,7 @@ root(isDark) width 330px min-width 330px height 100% - background isDark ? #282C37 : #fff + background var(--face) border-radius 6px //box-shadow 0 2px 16px rgba(#000, 0.1) overflow hidden @@ -318,7 +318,7 @@ root(isDark) padding 0 16px font-size 14px color isDark ? #e3e5e8 : #888 - background isDark ? #313543 : #fff + background var(--faceHeader) box-shadow 0 1px rgba(#000, 0.15) cursor pointer diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue index 58f13dd57b..1217e0d4da 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notes.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue @@ -232,7 +232,7 @@ root(isDark) width 100% text-align center color #ccc - background isDark ? #282C37 : #fff + background var(--face) border-top solid 1px isDark ? #1c2023 : #eaeaea border-bottom-left-radius 6px border-bottom-right-radius 6px diff --git a/src/client/app/desktop/views/pages/user/user.followers-you-know.vue b/src/client/app/desktop/views/pages/user/user.followers-you-know.vue index 0965d801c9..212e21a7a9 100644 --- a/src/client/app/desktop/views/pages/user/user.followers-you-know.vue +++ b/src/client/app/desktop/views/pages/user/user.followers-you-know.vue @@ -37,7 +37,7 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) - background isDark ? #282C37 : #fff + background var(--face) box-shadow var(--shadow) border-radius var(--round) diff --git a/src/client/app/desktop/views/pages/user/user.friends.vue b/src/client/app/desktop/views/pages/user/user.friends.vue index de37dc95c9..0a329b3d8e 100644 --- a/src/client/app/desktop/views/pages/user/user.friends.vue +++ b/src/client/app/desktop/views/pages/user/user.friends.vue @@ -41,7 +41,7 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) - background isDark ? #282C37 : #fff + background var(--face) box-shadow var(--shadow) border-radius var(--round) overflow hidden diff --git a/src/client/app/desktop/views/pages/user/user.header.vue b/src/client/app/desktop/views/pages/user/user.header.vue index 30dc74212d..ec46e955b5 100644 --- a/src/client/app/desktop/views/pages/user/user.header.vue +++ b/src/client/app/desktop/views/pages/user/user.header.vue @@ -103,7 +103,7 @@ export default Vue.extend({ root(isDark) - background isDark ? #282C37 : #fff + background var(--face) box-shadow var(--shadow) border-radius var(--round) overflow hidden diff --git a/src/client/app/desktop/views/pages/user/user.photos.vue b/src/client/app/desktop/views/pages/user/user.photos.vue index 591edfd829..99e064446d 100644 --- a/src/client/app/desktop/views/pages/user/user.photos.vue +++ b/src/client/app/desktop/views/pages/user/user.photos.vue @@ -40,7 +40,7 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) - background isDark ? #282C37 : #fff + background var(--face) box-shadow var(--shadow) border-radius var(--round) overflow hidden diff --git a/src/client/app/desktop/views/pages/user/user.profile.vue b/src/client/app/desktop/views/pages/user/user.profile.vue index 1ea242270a..e5ea8d1cc9 100644 --- a/src/client/app/desktop/views/pages/user/user.profile.vue +++ b/src/client/app/desktop/views/pages/user/user.profile.vue @@ -86,7 +86,7 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) - background isDark ? #282C37 : #fff + background var(--face) box-shadow var(--shadow) border-radius var(--round) diff --git a/src/client/app/desktop/views/pages/user/user.timeline.vue b/src/client/app/desktop/views/pages/user/user.timeline.vue index 3cde6cc10c..fe3ca9154b 100644 --- a/src/client/app/desktop/views/pages/user/user.timeline.vue +++ b/src/client/app/desktop/views/pages/user/user.timeline.vue @@ -115,14 +115,14 @@ export default Vue.extend({ root(isDark) - background isDark ? #282C37 : #fff + background var(--face) border-radius var(--round) overflow hidden > header padding 0 8px z-index 10 - background isDark ? #313543 : #fff + background var(--faceHeader) box-shadow 0 1px isDark ? rgba(#000, 0.15) : rgba(#000, 0.08) > span diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 05c32a7bd1..405fcb76d0 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -355,7 +355,7 @@ root(isDark) .block color isDark ? #fff : #444 - background isDark ? #282C37 : #fff + background var(--face) box-shadow var(--shadow) //border-radius 8px overflow auto @@ -364,7 +364,7 @@ root(isDark) z-index 1 padding 0 16px line-height 48px - background isDark ? #313543 : #fff + background var(--faceHeader) if !isDark box-shadow 0 1px 0px rgba(0, 0, 0, 0.1) diff --git a/src/client/app/desktop/views/widgets/profile.vue b/src/client/app/desktop/views/widgets/profile.vue index 04ef18c8e3..aea0c90e34 100644 --- a/src/client/app/desktop/views/widgets/profile.vue +++ b/src/client/app/desktop/views/widgets/profile.vue @@ -100,7 +100,7 @@ root(isDark) left 16px width 58px height 58px - border solid 3px isDark ? #282c37 : #fff + border solid 3px var(--face) border-radius 8px cursor pointer diff --git a/src/client/app/mobile/views/components/drive-file-chooser.vue b/src/client/app/mobile/views/components/drive-file-chooser.vue index 92ac211af2..6d3fc2343a 100644 --- a/src/client/app/mobile/views/components/drive-file-chooser.vue +++ b/src/client/app/mobile/views/components/drive-file-chooser.vue @@ -59,7 +59,7 @@ root(isDark) > .body width 100% height 100% - background isDark ? #282c37 : #fff + background var(--face) > header border-bottom solid 1px isDark ? #1b1f29 : #eee diff --git a/src/client/app/mobile/views/components/drive.vue b/src/client/app/mobile/views/components/drive.vue index 36a6ea2f40..76d6c2737d 100644 --- a/src/client/app/mobile/views/components/drive.vue +++ b/src/client/app/mobile/views/components/drive.vue @@ -474,7 +474,7 @@ export default Vue.extend({ <style lang="stylus" scoped> root(isDark) - background isDark ? #282c37 : #fff + background var(--face) > nav display block @@ -490,7 +490,7 @@ root(isDark) color rgba(isDark ? #fff : #000, 0.67) -webkit-backdrop-filter blur(12px) backdrop-filter blur(12px) - background-color rgba(isDark ? #313543 : #fff, 0.75) + //background-color rgba(var(--faceHeader), 0.75) border-bottom solid 1px rgba(#000, 0.13) > p diff --git a/src/client/app/mobile/views/components/note-card.vue b/src/client/app/mobile/views/components/note-card.vue index e8427798cd..e30e6c1c8f 100644 --- a/src/client/app/mobile/views/components/note-card.vue +++ b/src/client/app/mobile/views/components/note-card.vue @@ -32,7 +32,7 @@ root(isDark) width 150px //height 120px font-size 12px - background isDark ? #282c37 : #fff + background var(--face) border-radius 4px > a diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index 6daf375ed2..f0a91e82d4 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -229,7 +229,7 @@ root(isDark) overflow hidden width 100% text-align left - background isDark ? #282C37 : #fff + background var(--face) border-radius 8px box-shadow 0 0 2px rgba(#000, 0.1) diff --git a/src/client/app/mobile/views/components/notes.vue b/src/client/app/mobile/views/components/notes.vue index 83674a33dc..539141954b 100644 --- a/src/client/app/mobile/views/components/notes.vue +++ b/src/client/app/mobile/views/components/notes.vue @@ -221,7 +221,7 @@ export default Vue.extend({ root(isDark) overflow hidden - background isDark ? #282C37 : #fff + background var(--face) border-radius 8px box-shadow 0 0 2px rgba(#000, 0.1) diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 742163696e..6ada5e60ee 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -342,7 +342,7 @@ root(isDark) margin 32px auto > .form - background isDark ? #282C37 : #fff + background var(--face) border-radius 8px box-shadow 0 0 2px rgba(#000, 0.1) diff --git a/src/client/app/mobile/views/components/widget-container.vue b/src/client/app/mobile/views/components/widget-container.vue index a713a10621..bf7adf5fcb 100644 --- a/src/client/app/mobile/views/components/widget-container.vue +++ b/src/client/app/mobile/views/components/widget-container.vue @@ -45,7 +45,7 @@ root(isDark) font-size 15px font-weight normal color isDark ? #b8c5cc : #465258 - background isDark ? #282c37 : #fff + background var(--face) border-radius 8px 8px 0 0 > [data-fa] diff --git a/src/client/app/mobile/views/pages/user/home.vue b/src/client/app/mobile/views/pages/user/home.vue index 4118afef19..d19ccfd522 100644 --- a/src/client/app/mobile/views/pages/user/home.vue +++ b/src/client/app/mobile/views/pages/user/home.vue @@ -81,7 +81,7 @@ root(isDark) font-size 15px font-weight normal color isDark ? #b8c5cc : #465258 - background isDark ? #282c37 : #fff + background var(--face) border-radius 8px 8px 0 0 @media (min-width 500px) diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index ffe0ffa3ce..fca316c5bc 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -7,5 +7,7 @@ "bg": "#191B22", "scrollbarTrack": "#282C37", "scrollbarHandle": "#454954", - "scrollbarHandleHover": "#535660" + "scrollbarHandleHover": "#535660", + "face": "#282c37", + "faceHeader": "#313543" } diff --git a/src/client/theme/light.json b/src/client/theme/light.json index f4d061e5ce..b091d87389 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -7,5 +7,7 @@ "bg": "#f7f7f7", "scrollbarTrack": "#fff", "scrollbarHandle": "#00000033", - "scrollbarHandleHover": "#00000066" + "scrollbarHandleHover": "#00000066", + "face": "#fff", + "faceHeader": "#fff" } From 297019c22c06de45d66a68cc855227c5def56f1c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 26 Sep 2018 20:38:16 +0900 Subject: [PATCH 378/539] example commit --- src/client/app/mobile/views/pages/settings.vue | 4 ++-- src/client/theme/dark.json | 4 +++- src/client/theme/light.json | 4 +++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index 9e90416370..9849c82490 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -331,8 +331,8 @@ root(isDark) margin 16px padding 16px text-align center - color isDark ? #49ab63 : #2c662d - background isDark ? #273c34 : #fcfff5 + color var(--mobileSignedInAsFg) + background var(--mobileSignedInAsBg) box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12) > .signout diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index fca316c5bc..f94f3d7f9c 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -9,5 +9,7 @@ "scrollbarHandle": "#454954", "scrollbarHandleHover": "#535660", "face": "#282c37", - "faceHeader": "#313543" + "faceHeader": "#313543", + "mobileSignedInAsBg": "#273c34", + "mobileSignedInAsFg": "#49ab63" } diff --git a/src/client/theme/light.json b/src/client/theme/light.json index b091d87389..4a3db8a308 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -9,5 +9,7 @@ "scrollbarHandle": "#00000033", "scrollbarHandleHover": "#00000066", "face": "#fff", - "faceHeader": "#fff" + "faceHeader": "#fff", + "mobileSignedInAsBg": "#fcfff5", + "mobileSignedInAsFg": "#2c662d" } From 77b441f14c9823cf8caac7eb5f0146435fea06b3 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Wed, 26 Sep 2018 20:39:59 +0900 Subject: [PATCH 379/539] =?UTF-8?q?=E3=83=AA=E3=83=97=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E3=81=A7=E5=85=83=E3=81=AE=E5=85=AC=E9=96=8B=E7=AF=84=E5=9B=B2?= =?UTF-8?q?=E3=82=92=E5=BC=95=E3=81=8D=E7=B6=99=E3=81=90=20(#2775)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ホーム/フォロワー限定へのリプライは公開範囲を引き継ぐように * ダイレクトへのリプライはダイレクトでリプライ先ユーザーを初期設定するように * 非公開へのリプライでも元の公開範囲を引き継ぐ --- .../app/desktop/views/components/post-form.vue | 12 ++++++++++++ src/client/app/mobile/views/components/post-form.vue | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index 8db85aeaca..7bf76e4829 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -178,6 +178,18 @@ export default Vue.extend({ }); } + // 公開以外へのリプライ時は元の公開範囲を引き継ぐ + if (this.reply && ['home', 'followers', 'specified', 'private'].includes(this.reply.visibility)) { + this.visibility = this.reply.visibility; + } + + // ダイレクトへのリプライはリプライ先ユーザーを初期設定 + if (this.reply && this.reply.visibility === 'specified') { + (this as any).api('users/show', { userId: this.reply.userId }).then(user => { + this.visibleUsers.push(user); + }); + } + this.$nextTick(() => { // 書きかけの投稿を復元 if (!this.instant) { diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 1294273a2a..72ec142572 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -173,6 +173,18 @@ export default Vue.extend({ }); } + // 公開以外へのリプライ時は元の公開範囲を引き継ぐ + if (this.reply && ['home', 'followers', 'specified', 'private'].includes(this.reply.visibility)) { + this.visibility = this.reply.visibility; + } + + // ダイレクトへのリプライはリプライ先ユーザーを初期設定 + if (this.reply && this.reply.visibility === 'specified') { + (this as any).api('users/show', { userId: this.reply.userId }).then(user => { + this.visibleUsers.push(user); + }); + } + this.focus(); this.$nextTick(() => { From b6e33e93dea72844e0efb2a66d0f8faada12ac6c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 26 Sep 2018 20:47:11 +0900 Subject: [PATCH 380/539] wip --- src/client/app/mobile/views/pages/settings.vue | 4 ++-- src/client/theme/dark.json | 4 +++- src/client/theme/light.json | 4 +++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index 9849c82490..0a44a592e1 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -339,8 +339,8 @@ root(isDark) margin 16px padding 16px text-align center - color isDark ? #ff5f56 : #cc2727 - background isDark ? #652222 : #fff6f5 + color var(--mobileSignedInAsFg) + background var(--mobileSignedInAsBg) box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12) > footer diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index f94f3d7f9c..5d0272a375 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -11,5 +11,7 @@ "face": "#282c37", "faceHeader": "#313543", "mobileSignedInAsBg": "#273c34", - "mobileSignedInAsFg": "#49ab63" + "mobileSignedInAsFg": "#49ab63", + "mobileSignoutBg": "#652222", + "mobileSignoutFg": "#ff5f56" } diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 4a3db8a308..4cba3be499 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -11,5 +11,7 @@ "face": "#fff", "faceHeader": "#fff", "mobileSignedInAsBg": "#fcfff5", - "mobileSignedInAsFg": "#2c662d" + "mobileSignedInAsFg": "#2c662d", + "mobileSignoutBg": "#fff6f5", + "mobileSignoutFg": "#cc2727" } From 3cbdfcb43d4b4435d9ecd50657607979317d2749 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 00:54:37 +0900 Subject: [PATCH 381/539] wip --- src/client/app/common/views/components/note-header.vue | 2 +- src/client/app/desktop/views/components/notes.note.vue | 2 +- src/client/app/desktop/views/components/notes.vue | 4 ++-- src/client/app/desktop/views/pages/deck/deck.note.vue | 2 +- src/client/app/desktop/views/pages/deck/deck.notes.vue | 4 ++-- .../app/desktop/views/pages/deck/deck.notifications.vue | 4 ++-- src/client/app/mobile/views/components/note.vue | 2 +- src/client/app/mobile/views/components/notes.vue | 4 ++-- src/client/app/mobile/views/components/notifications.vue | 4 ++-- src/client/theme/dark.json | 1 + src/client/theme/light.json | 1 + 11 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/client/app/common/views/components/note-header.vue b/src/client/app/common/views/components/note-header.vue index f4a2f00876..48dfae5f84 100644 --- a/src/client/app/common/views/components/note-header.vue +++ b/src/client/app/common/views/components/note-header.vue @@ -110,7 +110,7 @@ root(isDark) > .app margin-right 8px padding-right 8px - border-right solid 1px isDark ? #1c2023 : #eaeaea + border-right solid 1px var(--faceDivider) > .visibility margin-left 8px diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 13a8641170..4f2b0241e8 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -323,7 +323,7 @@ root(isDark) margin 0 padding 0 background var(--face) - border-bottom solid 1px isDark ? #1c2023 : #eaeaea + border-bottom solid 1px var(--faceDivider) &[data-round] &:first-child diff --git a/src/client/app/desktop/views/components/notes.vue b/src/client/app/desktop/views/components/notes.vue index 0bd45b1c21..d0148eef58 100644 --- a/src/client/app/desktop/views/components/notes.vue +++ b/src/client/app/desktop/views/components/notes.vue @@ -237,7 +237,7 @@ root(isDark) text-align center color isDark ? #666b79 : #aaa background isDark ? #242731 : #fdfdfd - border-bottom solid 1px isDark ? #1c2023 : #eaeaea + border-bottom solid 1px var(--faceDivider) span margin 0 16px @@ -261,7 +261,7 @@ root(isDark) text-align center color #ccc background var(--face) - border-top solid 1px isDark ? #1c2023 : #eaeaea + border-top solid 1px var(--faceDivider) border-bottom-left-radius 6px border-bottom-right-radius 6px diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index 82e816cc8c..04ddcd488d 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -228,7 +228,7 @@ mediaRoot(isDark) root(isDark) font-size 13px - border-bottom solid 1px isDark ? #1c2023 : #eaeaea + border-bottom solid 1px var(--faceDivider) &:last-of-type border-bottom none diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue index 1217e0d4da..214ec3cdf7 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notes.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue @@ -216,7 +216,7 @@ root(isDark) text-align center color isDark ? #666b79 : #aaa background isDark ? #242731 : #fdfdfd - border-bottom solid 1px isDark ? #1c2023 : #eaeaea + border-bottom solid 1px var(--faceDivider) span margin 0 16px @@ -233,7 +233,7 @@ root(isDark) text-align center color #ccc background var(--face) - border-top solid 1px isDark ? #1c2023 : #eaeaea + border-top solid 1px var(--faceDivider) border-bottom-left-radius 6px border-bottom-right-radius 6px diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications.vue b/src/client/app/desktop/views/pages/deck/deck.notifications.vue index f73f221b7b..8a28061260 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notifications.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notifications.vue @@ -169,7 +169,7 @@ root(isDark) > .notifications > .notification:not(:last-child) - border-bottom solid 1px isDark ? #1c2023 : #eaeaea + border-bottom solid 1px var(--faceDivider) > .date display block @@ -179,7 +179,7 @@ root(isDark) font-size 0.8em color isDark ? #666b79 : #aaa background isDark ? #242731 : #fdfdfd - border-bottom solid 1px isDark ? #1c2023 : #eaeaea + border-bottom solid 1px var(--faceDivider) span margin 0 16px diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 2bfd8f8acc..a8b733fae7 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -232,7 +232,7 @@ export default Vue.extend({ root(isDark) font-size 12px - border-bottom solid 1px isDark ? #1c2023 : #eaeaea + border-bottom solid 1px var(--faceDivider) &:last-of-type border-bottom none diff --git a/src/client/app/mobile/views/components/notes.vue b/src/client/app/mobile/views/components/notes.vue index 539141954b..8841b0e6bf 100644 --- a/src/client/app/mobile/views/components/notes.vue +++ b/src/client/app/mobile/views/components/notes.vue @@ -245,7 +245,7 @@ root(isDark) font-size 0.9em color isDark ? #666b79 : #aaa background isDark ? #242731 : #fdfdfd - border-bottom solid 1px isDark ? #1c2023 : #eaeaea + border-bottom solid 1px var(--faceDivider) span margin 0 16px @@ -276,7 +276,7 @@ root(isDark) > footer text-align center - border-top solid 1px isDark ? #1c2023 : #eaeaea + border-top solid 1px var(--faceDivider) &:empty display none diff --git a/src/client/app/mobile/views/components/notifications.vue b/src/client/app/mobile/views/components/notifications.vue index 11ac23f4b1..8243a9bfb3 100644 --- a/src/client/app/mobile/views/components/notifications.vue +++ b/src/client/app/mobile/views/components/notifications.vue @@ -126,7 +126,7 @@ root(isDark) > .notifications > .mk-notification:not(:last-child) - border-bottom solid 1px isDark ? #1c2023 : #eaeaea + border-bottom solid 1px var(--faceDivider) > .date display block @@ -136,7 +136,7 @@ root(isDark) font-size 0.8em color isDark ? #666b79 : #aaa background isDark ? #242731 : #fdfdfd - border-bottom solid 1px isDark ? #1c2023 : #eaeaea + border-bottom solid 1px var(--faceDivider) span margin 0 16px diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 5d0272a375..cf9306558b 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -10,6 +10,7 @@ "scrollbarHandleHover": "#535660", "face": "#282c37", "faceHeader": "#313543", + "faceDivider": "rgba(0, 0, 0, 0.3)", "mobileSignedInAsBg": "#273c34", "mobileSignedInAsFg": "#49ab63", "mobileSignoutBg": "#652222", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 4cba3be499..64ebd8e293 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -10,6 +10,7 @@ "scrollbarHandleHover": "#00000066", "face": "#fff", "faceHeader": "#fff", + "faceDivider": "rgba(0, 0, 0, 0.082)", "mobileSignedInAsBg": "#fcfff5", "mobileSignedInAsFg": "#2c662d", "mobileSignoutBg": "#fff6f5", From 0a64f638c64ff41075ec95d0305a196c7366a55a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 01:32:04 +0900 Subject: [PATCH 382/539] wip --- src/client/app/app.vue | 8 ++++++- src/client/app/common/scripts/theme.ts | 21 +++++++++++++++++-- .../app/common/views/components/menu.vue | 18 +++++----------- .../views/components/reaction-picker.vue | 20 ++++++------------ .../views/components/visibility-chooser.vue | 2 +- .../app/desktop/views/components/home.vue | 2 +- .../desktop/views/components/ui.header.vue | 2 +- src/client/theme/dark.json | 10 +++++++-- src/client/theme/halloween.json | 17 +++++++++++++++ src/client/theme/light.json | 6 ++++++ 10 files changed, 71 insertions(+), 35 deletions(-) create mode 100644 src/client/theme/halloween.json diff --git a/src/client/app/app.vue b/src/client/app/app.vue index bb8377c237..9b6af27ece 100644 --- a/src/client/app/app.vue +++ b/src/client/app/app.vue @@ -7,13 +7,15 @@ import Vue from 'vue'; import { url, lang } from './config'; import applyTheme from './common/scripts/theme'; const darkTheme = require('../theme/dark'); +const halloweenTheme = require('../theme/halloween'); export default Vue.extend({ computed: { keymap(): any { return { 'h|slash': this.help, - 'd': this.dark + 'd': this.dark, + 'x': this.test }; } }, @@ -25,6 +27,10 @@ export default Vue.extend({ dark() { applyTheme(darkTheme); + }, + + test() { + applyTheme(halloweenTheme); } } }); diff --git a/src/client/app/common/scripts/theme.ts b/src/client/app/common/scripts/theme.ts index 2cad547c01..a08028ff9a 100644 --- a/src/client/app/common/scripts/theme.ts +++ b/src/client/app/common/scripts/theme.ts @@ -1,6 +1,23 @@ import * as tinycolor from 'tinycolor2'; +const lightTheme = require('../../../theme/light'); +const darkTheme = require('../../../theme/dark'); + +type Theme = { + meta: { + id: string; + name: string; + inherit: string; + }; +} & { + [key: string]: string; +}; + +export default function(theme: Theme) { + if (theme.meta.inherit) { + const inherit = [lightTheme, darkTheme].find(x => x.meta.id == theme.meta.inherit); + theme = Object.assign({}, inherit, theme); + } -export default function(theme: { [key: string]: string }) { const props = compile(theme); Object.entries(props).forEach(([k, v]) => { @@ -11,7 +28,7 @@ export default function(theme: { [key: string]: string }) { localStorage.setItem('theme', JSON.stringify(props)); } -function compile(theme: { [key: string]: string }): { [key: string]: string } { +function compile(theme: Theme): { [key: string]: string } { function getColor(code: string): tinycolor.Instance { // ref if (code[0] == '@') { diff --git a/src/client/app/common/views/components/menu.vue b/src/client/app/common/views/components/menu.vue index 3b9f07d1ee..be2c03f54c 100644 --- a/src/client/app/common/views/components/menu.vue +++ b/src/client/app/common/views/components/menu.vue @@ -117,10 +117,8 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) - $bg-color = isDark ? #2c303c : #fff +.onchrpzrvnoruiaenfcqvccjfuupzzwv + $bg-color = var(--popupBg) $border-color = rgba(27, 31, 35, 0.15) position initial @@ -132,7 +130,7 @@ root(isDark) z-index 10000 width 100% height 100% - background rgba(#000, isDark ? 0.5 : 0.1) + background var(--modalBackdrop) opacity 0 > .popover @@ -179,7 +177,7 @@ root(isDark) display block padding 8px 16px width 100% - color isDark ? #d6dce2 : #111 + color var(--popupFg) &:hover color var(--primaryForeground) @@ -193,12 +191,6 @@ root(isDark) > div margin 8px 0 height 1px - background isDark ? #1c2023 : #eee - -.onchrpzrvnoruiaenfcqvccjfuupzzwv[data-darkmode] - root(true) - -.onchrpzrvnoruiaenfcqvccjfuupzzwv:not([data-darkmode]) - root(false) + background var(--faceDivider) </style> diff --git a/src/client/app/common/views/components/reaction-picker.vue b/src/client/app/common/views/components/reaction-picker.vue index a86850ac7c..13e8cf1f07 100644 --- a/src/client/app/common/views/components/reaction-picker.vue +++ b/src/client/app/common/views/components/reaction-picker.vue @@ -210,11 +210,9 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - $border-color = rgba(27, 31, 35, 0.15) -root(isDark) +.mk-reaction-picker position initial > .backdrop @@ -224,11 +222,11 @@ root(isDark) z-index 10000 width 100% height 100% - background isDark ? rgba(#000, 0.4) : rgba(#000, 0.1) + background var(--modalBackdrop) opacity 0 > .popover - $bgcolor = isDark ? #2c303c : #fff + $bgcolor = var(--popupBg) position absolute z-index 10001 background $bgcolor @@ -281,8 +279,8 @@ root(isDark) margin 0 padding 8px 10px font-size 14px - color isDark ? #d6dce2 : #586069 - border-bottom solid 1px isDark ? #1c2023 : #e1e4e8 + color var(--popupFg) + border-bottom solid 1px var(--faceDivider) > div padding 4px @@ -312,16 +310,10 @@ root(isDark) border-radius 2px &:hover - background isDark ? #252731 : #eee + background var(--reactionPickerButtonHoverBg) &:active background var(--primary) box-shadow inset 0 0.15em 0.3em rgba(27, 31, 35, 0.15) -.mk-reaction-picker[data-darkmode] - root(true) - -.mk-reaction-picker:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/components/visibility-chooser.vue b/src/client/app/common/views/components/visibility-chooser.vue index d0a892fd56..5faf09fa11 100644 --- a/src/client/app/common/views/components/visibility-chooser.vue +++ b/src/client/app/common/views/components/visibility-chooser.vue @@ -145,7 +145,7 @@ root(isDark) opacity 0 > .popover - $bgcolor = isDark ? #2c303c : #fff + $bgcolor = var(--popupBg) position absolute z-index 10001 width 240px diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index 3d77da52d9..a07af02ea6 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -280,7 +280,7 @@ root(isDark) width 100% height 48px color isDark ? #fff : #000 - background isDark ? #313543 : #f7f7f7 + background var(--desktopHeaderBg) box-shadow 0 1px 1px rgba(#000, 0.075) > a diff --git a/src/client/app/desktop/views/components/ui.header.vue b/src/client/app/desktop/views/components/ui.header.vue index bec0ee37ad..264da8bef8 100644 --- a/src/client/app/desktop/views/components/ui.header.vue +++ b/src/client/app/desktop/views/components/ui.header.vue @@ -151,7 +151,7 @@ root(isDark) z-index 1000 width 100% height 48px - background isDark ? #313543 : #f7f7f7 + background var(--desktopHeaderBg) > .main z-index 1001 diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index cf9306558b..18b674fef4 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -1,16 +1,22 @@ { "meta": { + "id": "9978f7f9-5616-44fd-a704-cc5985efdd63", "name": "Dark" }, "primary": "#fb4e4e", "primaryForeground": "#fff", - "bg": "#191B22", - "scrollbarTrack": "#282C37", + "bg": "#191b22", + "scrollbarTrack": "#282c37", "scrollbarHandle": "#454954", "scrollbarHandleHover": "#535660", "face": "#282c37", "faceHeader": "#313543", "faceDivider": "rgba(0, 0, 0, 0.3)", + "popupBg": "#2c303c", + "popupFg": "#d6dce2", + "reactionPickerButtonHoverBg": "rgba(0, 0, 0, 0.18)", + "modalBackdrop": "rgba(0, 0, 0, 0.5)", + "desktopHeaderBg": "#313543", "mobileSignedInAsBg": "#273c34", "mobileSignedInAsFg": "#49ab63", "mobileSignoutBg": "#652222", diff --git a/src/client/theme/halloween.json b/src/client/theme/halloween.json new file mode 100644 index 0000000000..d38bd849ed --- /dev/null +++ b/src/client/theme/halloween.json @@ -0,0 +1,17 @@ +{ + "meta": { + "id": "42e4f09b-67d5-498c-af7d-29faa54745b0", + "name": "Halloween", + "inherit": "9978f7f9-5616-44fd-a704-cc5985efdd63" + }, + "primary": "#fb8d4e", + "primaryForeground": "#fff", + "bg": "#1b1a35", + "face": "#282c37", + "faceHeader": "#313543", + "faceDivider": "rgba(0, 0, 0, 0.3)", + "popupBg": "#2c303c", + "popupFg": "#d6dce2", + "reactionPickerButtonHoverBg": "rgba(0, 0, 0, 0.18)", + "desktopHeaderBg": "#0c0b19" +} diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 64ebd8e293..b012629faf 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -1,5 +1,6 @@ { "meta": { + "id": "406cfea3-a4e7-486c-9057-30ede1353c3f", "name": "Light" }, "primary": "#fb4e4e", @@ -11,6 +12,11 @@ "face": "#fff", "faceHeader": "#fff", "faceDivider": "rgba(0, 0, 0, 0.082)", + "popupBg": "#fff", + "popupFg": "#586069", + "reactionPickerButtonHoverBg": "#eee", + "modalBackdrop": "rgba(0, 0, 0, 0.1)", + "desktopHeaderBg": "#f7f7f7", "mobileSignedInAsBg": "#fcfff5", "mobileSignedInAsFg": "#2c662d", "mobileSignoutBg": "#fff6f5", From dabda21eb7e67d098c789f22db22014143798e1e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 01:44:05 +0900 Subject: [PATCH 383/539] wip --- .../common/views/components/autocomplete.vue | 22 ++++++------------- src/client/theme/dark.json | 6 ++++- src/client/theme/light.json | 6 ++++- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/client/app/common/views/components/autocomplete.vue b/src/client/app/common/views/components/autocomplete.vue index bba6f4f7b2..bc0120c9ab 100644 --- a/src/client/app/common/views/components/autocomplete.vue +++ b/src/client/app/common/views/components/autocomplete.vue @@ -259,9 +259,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.mk-autocomplete position fixed z-index 65535 max-width 100% @@ -299,7 +297,7 @@ root(isDark) text-overflow ellipsis &:hover - background isDark ? rgba(#fff, 0.1) : rgba(#000, 0.1) + background var(--autocompleteItemHoverBg) &[data-selected='true'] background var(--primary) @@ -325,15 +323,15 @@ root(isDark) .name margin 0 8px 0 0 - color isDark ? rgba(#fff, 0.8) : rgba(#000, 0.8) + color var(--autocompleteItemText) .username - color isDark ? rgba(#fff, 0.3) : rgba(#000, 0.3) + color var(--autocompleteItemTextSub) > .hashtags > li .name - color isDark ? rgba(#fff, 0.8) : rgba(#000, 0.8) + color var(--autocompleteItemText) > .emojis > li @@ -343,15 +341,9 @@ root(isDark) width 24px .name - color isDark ? rgba(#fff, 0.8) : rgba(#000, 0.8) + color var(--autocompleteItemText) .alias margin 0 0 0 8px - color isDark ? rgba(#fff, 0.3) : rgba(#000, 0.3) - -.mk-autocomplete[data-darkmode] - root(true) - -.mk-autocomplete:not([data-darkmode]) - root(false) + color var(--autocompleteItemTextSub) </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 18b674fef4..5a8e1ce8f6 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -14,8 +14,12 @@ "faceDivider": "rgba(0, 0, 0, 0.3)", "popupBg": "#2c303c", "popupFg": "#d6dce2", - "reactionPickerButtonHoverBg": "rgba(0, 0, 0, 0.18)", "modalBackdrop": "rgba(0, 0, 0, 0.5)", + + "autocompleteItemHoverBg": "rgba(255, 255, 255, 0.1)", + "autocompleteItemText": "rgba(255, 255, 255, 0.8)", + "autocompleteItemTextSub": "rgba(255, 255, 255, 0.3)", + "reactionPickerButtonHoverBg": "rgba(255, 255, 255, 0.18)", "desktopHeaderBg": "#313543", "mobileSignedInAsBg": "#273c34", "mobileSignedInAsFg": "#49ab63", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index b012629faf..4ae10b5cad 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -14,8 +14,12 @@ "faceDivider": "rgba(0, 0, 0, 0.082)", "popupBg": "#fff", "popupFg": "#586069", - "reactionPickerButtonHoverBg": "#eee", "modalBackdrop": "rgba(0, 0, 0, 0.1)", + + "autocompleteItemHoverBg": "rgba(0, 0, 0, 0.1)", + "autocompleteItemText": "rgba(0, 0, 0, 0.8)", + "autocompleteItemTextSub": "rgba(0, 0, 0, 0.3)", + "reactionPickerButtonHoverBg": "#eee", "desktopHeaderBg": "#f7f7f7", "mobileSignedInAsBg": "#fcfff5", "mobileSignedInAsFg": "#2c662d", From 3304cc106ec75c2bfceeb47336afc250fc392c86 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 01:54:10 +0900 Subject: [PATCH 384/539] wip --- src/client/app/common/views/components/avatar.vue | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/client/app/common/views/components/avatar.vue b/src/client/app/common/views/components/avatar.vue index a2b0fc6bd3..ca09af87de 100644 --- a/src/client/app/common/views/components/avatar.vue +++ b/src/client/app/common/views/components/avatar.vue @@ -58,6 +58,9 @@ export default Vue.extend({ }; } }, + mounted() { + this.$el.style.color = `rgb(${this.user.avatarColor.slice(0, 3).join(',')})`; + }, methods: { onClick(e) { this.$emit('click', e); @@ -67,8 +70,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - -root(isDark) +.mk-avatar display inline-block vertical-align bottom @@ -79,7 +81,7 @@ root(isDark) &.cat::before, &.cat::after background #df548f - border solid 4px isDark ? #e0eefd : #202224 + border solid 4px currentColor box-sizing border-box content '' display inline-block @@ -105,9 +107,4 @@ root(isDark) transition border-radius 1s ease z-index 1 -.mk-avatar[data-darkmode] - root(true) - -.mk-avatar:not([data-darkmode]) - root(false) </style> From 4dde54e344773d6e6a39713453292d3f128df3f9 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 01:58:37 +0900 Subject: [PATCH 385/539] Clean up --- .../app/desktop/views/pages/deck/deck.note.vue | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index 04ddcd488d..a02636a42d 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -314,19 +314,6 @@ root(isDark) > .text margin-right 8px - > .toggle - display inline-block - padding 4px 8px - font-size 0.7em - color isDark ? #393f4f : #fff - background isDark ? #687390 : #b1b9c1 - border-radius 2px - cursor pointer - user-select none - - &:hover - background isDark ? #707b97 : #bbc4ce - > .content > .text From 97d68d7b31d4db1b0cdd07a0196c63d4493a621f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 02:02:07 +0900 Subject: [PATCH 386/539] example commit --- .../app/common/views/components/cw-button.vue | 14 ++++---------- src/client/theme/dark.json | 3 +++ src/client/theme/light.json | 3 +++ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/client/app/common/views/components/cw-button.vue b/src/client/app/common/views/components/cw-button.vue index 06087edc93..79917f82ab 100644 --- a/src/client/app/common/views/components/cw-button.vue +++ b/src/client/app/common/views/components/cw-button.vue @@ -22,23 +22,17 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.nrvgflfuaxwgkxoynpnumyookecqrrvh display inline-block padding 4px 8px font-size 0.7em - color isDark ? #393f4f : #fff - background isDark ? #687390 : #b1b9c1 + color var(--cwButtonFg) + background var(--cwButtonBg) border-radius 2px cursor pointer user-select none &:hover - background isDark ? #707b97 : #bbc4ce - -.nrvgflfuaxwgkxoynpnumyookecqrrvh[data-darkmode] - root(true) - -.nrvgflfuaxwgkxoynpnumyookecqrrvh:not([data-darkmode]) - root(false) + background var(--cwButtonHoverBg) </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 5a8e1ce8f6..14caf19224 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -19,6 +19,9 @@ "autocompleteItemHoverBg": "rgba(255, 255, 255, 0.1)", "autocompleteItemText": "rgba(255, 255, 255, 0.8)", "autocompleteItemTextSub": "rgba(255, 255, 255, 0.3)", + "cwButtonBg": "#687390", + "cwButtonFg": "#393f4f", + "cwButtonHoverBg": "#707b97", "reactionPickerButtonHoverBg": "rgba(255, 255, 255, 0.18)", "desktopHeaderBg": "#313543", "mobileSignedInAsBg": "#273c34", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 4ae10b5cad..7a039ef294 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -19,6 +19,9 @@ "autocompleteItemHoverBg": "rgba(0, 0, 0, 0.1)", "autocompleteItemText": "rgba(0, 0, 0, 0.8)", "autocompleteItemTextSub": "rgba(0, 0, 0, 0.3)", + "cwButtonBg": "#b1b9c1", + "cwButtonFg": "#fff", + "cwButtonHoverBg": "#bbc4ce", "reactionPickerButtonHoverBg": "#eee", "desktopHeaderBg": "#f7f7f7", "mobileSignedInAsBg": "#fcfff5", From 15a8b4c6e56c3a5e055cc007275b28bb8841e319 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 02:18:54 +0900 Subject: [PATCH 387/539] wip --- .../common/views/components/note-header.vue | 24 +++++++------------ src/client/theme/dark.json | 7 ++++++ src/client/theme/light.json | 7 ++++++ 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/client/app/common/views/components/note-header.vue b/src/client/app/common/views/components/note-header.vue index 48dfae5f84..8192d88412 100644 --- a/src/client/app/common/views/components/note-header.vue +++ b/src/client/app/common/views/components/note-header.vue @@ -42,9 +42,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.bvonvjxbwzaiskogyhbwgyxvcgserpmu display flex align-items baseline white-space nowrap @@ -61,7 +59,7 @@ root(isDark) margin 0 .5em 0 0 padding 0 overflow hidden - color isDark ? #fff : #627079 + color var(--noteHeaderName) font-size 1em font-weight bold text-decoration none @@ -82,19 +80,19 @@ root(isDark) margin 0 .5em 0 0 padding 1px 6px font-size 80% - color isDark ? #758188 : #aaa - border solid 1px isDark ? #57616f : #ddd + color var(--noteHeaderBadgeFg) + background var(--noteHeaderBadgeBg) border-radius 3px &.is-admin - border-color isDark ? #d42c41 : #f56a7b - color isDark ? #d42c41 : #f56a7b + background var(--noteHeaderAdminBg) + color var(--noteHeaderAdminFg) > .username margin 0 .5em 0 0 overflow hidden text-overflow ellipsis - color isDark ? #606984 : #ccc + color var(--noteHeaderAcct) flex-shrink 2147483647 > .info @@ -102,7 +100,7 @@ root(isDark) font-size 0.9em > * - color isDark ? #606984 : #c0c0c0 + color var(--noteHeaderInfo) > .mobile margin-right 8px @@ -115,10 +113,4 @@ root(isDark) > .visibility margin-left 8px -.bvonvjxbwzaiskogyhbwgyxvcgserpmu[data-darkmode] - root(true) - -.bvonvjxbwzaiskogyhbwgyxvcgserpmu:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 14caf19224..aeaf547b72 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -16,6 +16,13 @@ "popupFg": "#d6dce2", "modalBackdrop": "rgba(0, 0, 0, 0.5)", + "noteHeaderName": "#fff", + "noteHeaderBadgeFg": "#758188", + "noteHeaderBadgeBg": "rgba(0, 0, 0, 0.25)", + "noteHeaderAdminFg": "#f15f71", + "noteHeaderAdminBg": "#5d282e", + "noteHeaderAcct": "#606984", + "noteHeaderInfo": "#606984", "autocompleteItemHoverBg": "rgba(255, 255, 255, 0.1)", "autocompleteItemText": "rgba(255, 255, 255, 0.8)", "autocompleteItemTextSub": "rgba(255, 255, 255, 0.3)", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 7a039ef294..d4803389da 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -16,6 +16,13 @@ "popupFg": "#586069", "modalBackdrop": "rgba(0, 0, 0, 0.1)", + "noteHeaderName": "#627079", + "noteHeaderBadgeFg": "#aaa", + "noteHeaderBadgeBg": "rgba(0, 0, 0, 0.05)", + "noteHeaderAdminFg": "#f15f71", + "noteHeaderAdminBg": "#5d282e", + "noteHeaderAcct": "#ccc", + "noteHeaderInfo": "#c0c0c0", "autocompleteItemHoverBg": "rgba(0, 0, 0, 0.1)", "autocompleteItemText": "rgba(0, 0, 0, 0.8)", "autocompleteItemTextSub": "rgba(0, 0, 0, 0.3)", From 49f8cfb0db79653caf0a1cb158041d51856912ef Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 02:35:13 +0900 Subject: [PATCH 388/539] wip --- .../app/desktop/views/components/notes.vue | 18 +++++------------- src/client/theme/dark.json | 4 ++++ src/client/theme/light.json | 4 ++++ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/client/app/desktop/views/components/notes.vue b/src/client/app/desktop/views/components/notes.vue index d0148eef58..31b3a3ab18 100644 --- a/src/client/app/desktop/views/components/notes.vue +++ b/src/client/app/desktop/views/components/notes.vue @@ -216,9 +216,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.mk-notes .transition .mk-notes-enter .mk-notes-leave-to @@ -235,8 +233,8 @@ root(isDark) line-height 32px font-size 14px text-align center - color isDark ? #666b79 : #aaa - background isDark ? #242731 : #fdfdfd + color var(--dateDividerFg) + background var(--dateDividerBg) border-bottom solid 1px var(--faceDivider) span @@ -266,15 +264,9 @@ root(isDark) border-bottom-right-radius 6px &:hover - background isDark ? #2e3440 : #f5f5f5 + background var(--footerButtonHover) &:active - background isDark ? #21242b : #eee - -.mk-notes[data-darkmode] - root(true) - -.mk-notes:not([data-darkmode]) - root(false) + background var(--footerButtonActive) </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index aeaf547b72..b3d233d45f 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -15,6 +15,10 @@ "popupBg": "#2c303c", "popupFg": "#d6dce2", "modalBackdrop": "rgba(0, 0, 0, 0.5)", + "dateDividerBg": "#242731", + "dateDividerFg": "#666b79", + "footerButtonHover": "#2e3440", + "footerButtonActive": "#21242b", "noteHeaderName": "#fff", "noteHeaderBadgeFg": "#758188", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index d4803389da..87f384a200 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -15,6 +15,10 @@ "popupBg": "#fff", "popupFg": "#586069", "modalBackdrop": "rgba(0, 0, 0, 0.1)", + "dateDividerBg": "#fdfdfd", + "dateDividerFg": "#aaa", + "footerButtonHover": "#f5f5f5", + "footerButtonActive": "#eee", "noteHeaderName": "#627079", "noteHeaderBadgeFg": "#aaa", From 1eb6ad58d5699ec22b41265b4b8c687641015109 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 02:46:53 +0900 Subject: [PATCH 389/539] wip --- src/client/app/desktop/views/components/note-detail.vue | 4 ++-- src/client/app/desktop/views/components/notes.note.vue | 4 ++-- src/client/app/desktop/views/pages/deck/deck.note.vue | 4 ++-- src/client/app/mobile/views/components/note-detail.vue | 4 ++-- src/client/app/mobile/views/components/note.vue | 4 ++-- src/client/theme/dark.json | 2 ++ src/client/theme/halloween.json | 2 ++ src/client/theme/light.json | 2 ++ 8 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index 35eb6ac45d..5e7c8b42ca 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -263,8 +263,8 @@ root(isDark) border-bottom 1px solid isDark ? #1c2023 : #eef0f2 > .renote - color #9dbb00 - background isDark ? linear-gradient(to bottom, #314027 0%, #282c37 100%) : linear-gradient(to bottom, #edfde2 0%, #fff 100%) + color var(--renoteText) + background linear-gradient(to bottom, var(--renoteGradient) 0%, var(--face) 100%) > p margin 0 diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 4f2b0241e8..17f7e2235a 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -357,8 +357,8 @@ root(isDark) padding 16px 32px 8px 32px line-height 28px white-space pre - color #9dbb00 - background isDark ? linear-gradient(to bottom, #314027 0%, #282c37 100%) : linear-gradient(to bottom, #edfde2 0%, #fff 100%) + color var(--renoteText) + background linear-gradient(to bottom, var(--renoteGradient) 0%, var(--face) 100%) .avatar display inline-block diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index a02636a42d..f1c4a5979a 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -246,8 +246,8 @@ root(isDark) padding 8px 16px 0 16px line-height 28px white-space pre - color #9dbb00 - background isDark ? linear-gradient(to bottom, #314027 0%, #282c37 100%) : linear-gradient(to bottom, #edfde2 0%, #fff 100%) + color var(--renoteText) + background linear-gradient(to bottom, var(--renoteGradient) 0%, var(--face) 100%) .avatar flex-shrink 0 diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index f0a91e82d4..c56d10093d 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -266,8 +266,8 @@ root(isDark) border-bottom 1px solid isDark ? #1c2023 : #eef0f2 > .renote - color #9dbb00 - background isDark ? linear-gradient(to bottom, #314027 0%, #282c37 100%) : linear-gradient(to bottom, #edfde2 0%, #fff 100%) + color var(--renoteText) + background linear-gradient(to bottom, var(--renoteGradient) 0%, var(--face) 100%) > p margin 0 diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index a8b733fae7..8b7c559997 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -256,8 +256,8 @@ root(isDark) padding 8px 16px line-height 28px white-space pre - color #9dbb00 - background isDark ? linear-gradient(to bottom, #314027 0%, #282c37 100%) : linear-gradient(to bottom, #edfde2 0%, #fff 100%) + color var(--renoteText) + background linear-gradient(to bottom, var(--renoteGradient) 0%, var(--face) 100%) @media (min-width 500px) padding 16px diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index b3d233d45f..533910de76 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -14,6 +14,8 @@ "faceDivider": "rgba(0, 0, 0, 0.3)", "popupBg": "#2c303c", "popupFg": "#d6dce2", + "renoteGradient": "#314027", + "renoteText": "#9dbb00", "modalBackdrop": "rgba(0, 0, 0, 0.5)", "dateDividerBg": "#242731", "dateDividerFg": "#666b79", diff --git a/src/client/theme/halloween.json b/src/client/theme/halloween.json index d38bd849ed..18d214d041 100644 --- a/src/client/theme/halloween.json +++ b/src/client/theme/halloween.json @@ -12,6 +12,8 @@ "faceDivider": "rgba(0, 0, 0, 0.3)", "popupBg": "#2c303c", "popupFg": "#d6dce2", + "renoteGradient": "#5d2d1a", + "renoteText": "#ff6c00", "reactionPickerButtonHoverBg": "rgba(0, 0, 0, 0.18)", "desktopHeaderBg": "#0c0b19" } diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 87f384a200..df85fb973d 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -14,6 +14,8 @@ "faceDivider": "rgba(0, 0, 0, 0.082)", "popupBg": "#fff", "popupFg": "#586069", + "renoteGradient": "#edfde2", + "renoteText": "#9dbb00", "modalBackdrop": "rgba(0, 0, 0, 0.1)", "dateDividerBg": "#fdfdfd", "dateDividerFg": "#aaa", From 0ef64a6d0b7f95c2427536feee657164b759d0d3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 11:55:17 +0900 Subject: [PATCH 390/539] wip --- .../views/components/welcome-timeline.vue | 2 +- .../desktop/views/components/note-detail.vue | 36 +++++++++---------- .../views/components/notes.note.sub.vue | 2 +- .../desktop/views/components/notes.note.vue | 14 ++++---- .../views/pages/deck/deck.note.sub.vue | 2 +- .../desktop/views/pages/deck/deck.note.vue | 2 +- .../mobile/views/components/note-detail.vue | 22 ++++++------ .../app/mobile/views/components/note.sub.vue | 2 +- .../app/mobile/views/components/note.vue | 2 +- src/client/theme/dark.json | 7 ++++ src/client/theme/halloween.json | 6 ++-- src/client/theme/light.json | 7 ++++ 12 files changed, 57 insertions(+), 47 deletions(-) diff --git a/src/client/app/common/views/components/welcome-timeline.vue b/src/client/app/common/views/components/welcome-timeline.vue index 938ab602f0..ca1b6eb928 100644 --- a/src/client/app/common/views/components/welcome-timeline.vue +++ b/src/client/app/common/views/components/welcome-timeline.vue @@ -137,7 +137,7 @@ root(isDark) overflow hidden font-weight bold text-overflow ellipsis - color isDark ? #fff : #627079 + color var(--noteHeaderName) > .username margin 0 .5em 0 0 diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index 5e7c8b42ca..9222d8fab9 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -225,8 +225,6 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - root(isDark) overflow hidden text-align left @@ -243,24 +241,24 @@ root(isDark) text-align center color #999 cursor pointer - background isDark ? #21242d : #fafafa + background var(--subNoteBg) outline none border none - border-bottom solid 1px isDark ? #1c2023 : #eef0f2 - border-radius 6px 6px 0 0 + border-bottom solid 1px var(--faceDivider) + border-radius var(--round) var(--round) 0 0 &:hover - background isDark ? #2e3440 : #f6f6f6 + box-shadow 0 0 0 100px inset rgba(0, 0, 0, 0.05) &:active - background isDark ? #21242b : #f0f0f0 + box-shadow 0 0 0 100px inset rgba(0, 0, 0, 0.1) &:disabled - color isDark ? #21242b : #ccc + cursor wait > .conversation > * - border-bottom 1px solid isDark ? #1c2023 : #eef0f2 + border-bottom 1px solid var(--faceDivider) > .renote color var(--renoteText) @@ -287,7 +285,7 @@ root(isDark) padding-top 8px > .reply-to - border-bottom 1px solid isDark ? #1c2023 : #eef0f2 + border-bottom 1px solid var(--faceDivider) > article padding 28px 32px 18px 32px @@ -299,7 +297,7 @@ root(isDark) &:hover > footer > button - color isDark ? #707b97 : #888 + color var(--noteActionsHighlighted) > .avatar width 60px @@ -316,7 +314,7 @@ root(isDark) display inline-block margin 0 line-height 24px - color isDark ? #fff : #627079 + color var(--noteHeaderName) font-size 18px font-weight 700 text-align left @@ -394,20 +392,20 @@ root(isDark) background transparent border none font-size 1em - color isDark ? #606984 : #ccc + color var(--noteActions) cursor pointer &:hover - color isDark ? #a1a8bf : #444 + color var(--noteActionsHover) &.replyButton:hover - color #0af + color var(--noteActionsReplyHover) &.renoteButton:hover - color #8d0 + color var(--noteActionsRenoteHover) &.reactionButton:hover - color #fa0 + color var(--noteActionsReactionHover) > .count display inline @@ -415,11 +413,11 @@ root(isDark) color #999 &.reacted, &.reacted:hover - color #fa0 + color var(--noteActionsReactionHover) > .replies > * - border-top 1px solid isDark ? #1c2023 : #eef0f2 + border-top 1px solid var(--faceDivider) .mk-note-detail[data-darkmode] root(true) diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue index 8f01ddd43c..13e2991683 100644 --- a/src/client/app/desktop/views/components/notes.note.sub.vue +++ b/src/client/app/desktop/views/components/notes.note.sub.vue @@ -47,7 +47,7 @@ root(isDark) margin 0 padding 16px 32px font-size 0.9em - background isDark ? #21242d : #fcfcfc + background var(--subNoteBg) > .avatar flex-shrink 0 diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 17f7e2235a..160de5199d 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -398,7 +398,7 @@ root(isDark) &:hover > .main > footer > button - color isDark ? #707b97 : #888 + color var(--noteActionsHighlighted) > .avatar flex-shrink 0 @@ -500,22 +500,22 @@ root(isDark) padding 0 8px line-height 32px font-size 1em - color isDark ? #606984 : #ddd + color var(--noteActions) background transparent border none cursor pointer &:hover - color isDark ? #a1a8bf : #444 + color var(--noteActionsHover) &.replyButton:hover - color #0af + color var(--noteActionsReplyHover) &.renoteButton:hover - color #8d0 + color var(--noteActionsRenoteHover) &.reactionButton:hover - color #fa0 + color var(--noteActionsReactionHover) > .count display inline @@ -523,7 +523,7 @@ root(isDark) color #999 &.reacted, &.reacted:hover - color #fa0 + color var(--noteActionsReactionHover) > .detail padding-top 4px diff --git a/src/client/app/desktop/views/pages/deck/deck.note.sub.vue b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue index 3ba9ae914e..f1bf60d528 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.sub.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue @@ -33,7 +33,7 @@ root(isDark) display flex padding 16px font-size 10px - background isDark ? #21242d : #fcfcfc + background var(--subNoteBg) &.smart > .main diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index f1c4a5979a..ffb284fb42 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -402,7 +402,7 @@ root(isDark) border none box-shadow none font-size 1em - color isDark ? #606984 : #ddd + color var(--noteActions) cursor pointer &:not(:last-child) diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index c56d10093d..472c18088d 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -223,8 +223,6 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - root(isDark) overflow hidden width 100% @@ -248,22 +246,22 @@ root(isDark) text-align center color #999 cursor pointer - background isDark ? #21242d : #fafafa + background var(--subNoteBg) outline none border none - border-bottom solid 1px isDark ? #1c2023 : #eef0f2 + border-bottom solid 1px var(--faceDivider) border-radius 6px 6px 0 0 box-shadow none &:hover - background isDark ? #16181d : #f6f6f6 + box-shadow 0 0 0 100px inset rgba(0, 0, 0, 0.05) - &:disabled - color #ccc + &:active + box-shadow 0 0 0 100px inset rgba(0, 0, 0, 0.1) > .conversation > * - border-bottom 1px solid isDark ? #1c2023 : #eef0f2 + border-bottom 1px solid var(--faceDivider) > .renote color var(--renoteText) @@ -290,7 +288,7 @@ root(isDark) padding-top 8px > .reply-to - border-bottom 1px solid isDark ? #1c2023 : #eef0f2 + border-bottom 1px solid var(--faceDivider) > article padding 14px 16px 9px 16px @@ -323,7 +321,7 @@ root(isDark) > .name display inline-block margin .4em 0 - color isDark ? #fff : #627079 + color var(--noteHeaderName) font-size 16px font-weight bold text-align left @@ -407,7 +405,7 @@ root(isDark) border none box-shadow none font-size 1em - color isDark ? #606984 : #ddd + color var(--noteActions) cursor pointer &:not(:last-child) @@ -426,7 +424,7 @@ root(isDark) > .replies > * - border-top 1px solid isDark ? #1c2023 : #eef0f2 + border-top 1px solid var(--faceDivider) .mk-note-detail[data-darkmode] root(true) diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue index c25f827dad..2f38c9e97d 100644 --- a/src/client/app/mobile/views/components/note.sub.vue +++ b/src/client/app/mobile/views/components/note.sub.vue @@ -45,7 +45,7 @@ root(isDark) display flex padding 16px font-size 10px - background isDark ? #21242d : #fcfcfc + background var(--subNoteBg) @media (min-width 350px) font-size 12px diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 8b7c559997..859fc88043 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -442,7 +442,7 @@ root(isDark) border none box-shadow none font-size 1em - color isDark ? #606984 : #ddd + color var(--noteActions) cursor pointer &:not(:last-child) diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 533910de76..77a41228d0 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -14,8 +14,15 @@ "faceDivider": "rgba(0, 0, 0, 0.3)", "popupBg": "#2c303c", "popupFg": "#d6dce2", + "subNoteBg": "rgba(0, 0, 0, 0.18)", "renoteGradient": "#314027", "renoteText": "#9dbb00", + "noteActions": "#606984", + "noteActionsHover": "#a1a8bf", + "noteActionsReplyHover": "#0af", + "noteActionsRenoteHover": "#8d0", + "noteActionsReactionHover": "#fa0", + "noteActionsHighlighted": "#707b97", "modalBackdrop": "rgba(0, 0, 0, 0.5)", "dateDividerBg": "#242731", "dateDividerFg": "#666b79", diff --git a/src/client/theme/halloween.json b/src/client/theme/halloween.json index 18d214d041..7c26fbf6e6 100644 --- a/src/client/theme/halloween.json +++ b/src/client/theme/halloween.json @@ -7,9 +7,9 @@ "primary": "#fb8d4e", "primaryForeground": "#fff", "bg": "#1b1a35", - "face": "#282c37", - "faceHeader": "#313543", - "faceDivider": "rgba(0, 0, 0, 0.3)", + "face": "#2e2a3e", + "faceHeader": "#36314e", + "dateDividerBg": "#26253c", "popupBg": "#2c303c", "popupFg": "#d6dce2", "renoteGradient": "#5d2d1a", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index df85fb973d..28cc71bdb7 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -14,8 +14,15 @@ "faceDivider": "rgba(0, 0, 0, 0.082)", "popupBg": "#fff", "popupFg": "#586069", + "subNoteBg": "rgba(0, 0, 0, 0.01)", "renoteGradient": "#edfde2", "renoteText": "#9dbb00", + "noteActions": "#ddd", + "noteActionsHover": "#444", + "noteActionsReplyHover": "#0af", + "noteActionsRenoteHover": "#8d0", + "noteActionsReactionHover": "#fa0", + "noteActionsHighlighted": "#888", "modalBackdrop": "rgba(0, 0, 0, 0.1)", "dateDividerBg": "#fdfdfd", "dateDividerFg": "#aaa", From df6c9b1a1cf7b4ff8cdbf562e004bbf3635d841b Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 12:55:10 +0900 Subject: [PATCH 391/539] wip --- .../components/games/reversi/reversi.room.vue | 6 +- .../app/common/views/components/index.ts | 2 - .../app/common/views/components/switch.vue | 199 ------------------ .../app/common/views/components/ui/button.vue | 2 - .../app/common/views/components/ui/switch.vue | 17 +- .../views/components/settings.profile.vue | 8 +- .../app/desktop/views/components/settings.vue | 44 ++-- .../views/pages/deck/deck.tl-column.vue | 4 +- src/client/theme/dark.json | 5 +- src/client/theme/halloween.json | 1 + src/client/theme/light.json | 5 +- 11 files changed, 42 insertions(+), 251 deletions(-) delete mode 100644 src/client/app/common/views/components/switch.vue diff --git a/src/client/app/common/views/components/games/reversi/reversi.room.vue b/src/client/app/common/views/components/games/reversi/reversi.room.vue index 072f3eda12..b407046ba9 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.room.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.room.vue @@ -47,9 +47,9 @@ </header> <div> - <mk-switch v-model="game.settings.isLlotheo" @change="updateSettings" text="%i18n:@is-llotheo%"/> - <mk-switch v-model="game.settings.loopedBoard" @change="updateSettings" text="%i18n:@looped-map%"/> - <mk-switch v-model="game.settings.canPutEverywhere" @change="updateSettings" text="%i18n:@can-put-everywhere%"/> + <ui-switch v-model="game.settings.isLlotheo" @change="updateSettings">%i18n:@is-llotheo%</ui-switch> + <ui-switch v-model="game.settings.loopedBoard" @change="updateSettings">%i18n:@looped-map%</ui-switch> + <ui-switch v-model="game.settings.canPutEverywhere" @change="updateSettings">%i18n:@can-put-everywhere%</ui-switch> </div> </div> diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts index 0a3d0d0ae6..4c1c0afa80 100644 --- a/src/client/app/common/views/components/index.ts +++ b/src/client/app/common/views/components/index.ts @@ -30,7 +30,6 @@ import messagingRoom from './messaging-room.vue'; import urlPreview from './url-preview.vue'; import twitterSetting from './twitter-setting.vue'; import fileTypeIcon from './file-type-icon.vue'; -import Switch from './switch.vue'; import Reversi from './games/reversi/reversi.vue'; import welcomeTimeline from './welcome-timeline.vue'; import uiInput from './ui/input.vue'; @@ -74,7 +73,6 @@ Vue.component('mk-messaging-room', messagingRoom); Vue.component('mk-url-preview', urlPreview); Vue.component('mk-twitter-setting', twitterSetting); Vue.component('mk-file-type-icon', fileTypeIcon); -Vue.component('mk-switch', Switch); Vue.component('mk-reversi', Reversi); Vue.component('mk-welcome-timeline', welcomeTimeline); Vue.component('ui-input', uiInput); diff --git a/src/client/app/common/views/components/switch.vue b/src/client/app/common/views/components/switch.vue deleted file mode 100644 index aa60331cbc..0000000000 --- a/src/client/app/common/views/components/switch.vue +++ /dev/null @@ -1,199 +0,0 @@ -<template> -<div - class="mk-switch" - :class="{ disabled, checked }" - role="switch" - :aria-checked="checked" - :aria-disabled="disabled" - @click="switchValue" - @mouseover="mouseenter" -> - <input - type="checkbox" - @change="handleChange" - ref="input" - :disabled="disabled" - @keydown.enter="switchValue" - > - <span class="button"> - <span :style="{ transform }"></span> - </span> - <span class="label"> - <span :aria-hidden="!checked">{{ text }}</span> - <p :aria-hidden="!checked"> - <slot></slot> - </p> - </span> -</div> -</template> - -<script lang="ts"> -import Vue from 'vue'; -export default Vue.extend({ - props: { - value: { - type: Boolean, - default: false - }, - disabled: { - type: Boolean, - default: false - }, - text: String - },/* - created() { - if (!~[true, false].indexOf(this.value)) { - this.$emit('input', false); - } - },*/ - computed: { - checked(): boolean { - return this.value; - }, - transform(): string { - return this.checked ? 'translate3d(20px, 0, 0)' : ''; - } - }, - watch: { - value() { - (this.$el).style.transition = 'all 0.3s'; - (this.$refs.input as any).checked = this.checked; - } - }, - mounted() { - (this.$refs.input as any).checked = this.checked; - }, - methods: { - mouseenter() { - (this.$el).style.transition = 'all 0s'; - }, - handleChange() { - (this.$el).style.transition = 'all 0.3s'; - this.$emit('input', !this.checked); - this.$emit('change', !this.checked); - this.$nextTick(() => { - // set input's checked property - // in case parent refuses to change component's value - (this.$refs.input as any).checked = this.checked; - }); - }, - switchValue() { - !this.disabled && this.handleChange(); - } - } -}); -</script> - -<style lang="stylus" scoped> - - -root(isDark) - display flex - margin 12px 0 - cursor pointer - transition all 0.3s - - > * - user-select none - - &.disabled - opacity 0.6 - cursor not-allowed - - &.checked - > .button - background-color var(--primary) - border-color var(--primary) - - > .label - > span - color var(--primary) - - &:hover - > .label - > span - color var(--primaryDarken10) - - > .button - background var(--primaryDarken10) - border-color var(--primaryDarken10) - - &:hover - > .label - > span - color isDark ? #fff : #2e3338 - - > .button - $color = isDark ? #15181d : #ced2da - background $color - border-color $color - - > input - position absolute - width 0 - height 0 - opacity 0 - margin 0 - - &:focus + .button - &:after - content "" - pointer-events none - position absolute - top -5px - right -5px - bottom -5px - left -5px - border 2px solid var(--primaryAlpha03) - border-radius 14px - - > .button - $color = isDark ? #1c1f25 : #dcdfe6 - - display inline-block - margin 0 - width 40px - min-width 40px - height 20px - min-height 20px - background $color - border 1px solid $color - outline none - border-radius 10px - transition inherit - - > * - position absolute - top 1px - left 1px - border-radius 100% - transition transform 0.3s - width 16px - height 16px - background-color #fff - - > .label - margin-left 8px - display block - font-size 15px - cursor pointer - transition inherit - - > span - display block - line-height 20px - color isDark ? #c4ccd2 : #4a535a - transition inherit - - > p - margin 0 - //font-size 90% - color isDark ? #78858e : #9daab3 - -.mk-switch[data-darkmode] - root(true) - -.mk-switch:not([data-darkmode]) - root(false) - -</style> diff --git a/src/client/app/common/views/components/ui/button.vue b/src/client/app/common/views/components/ui/button.vue index ae59214038..c411f0f5c9 100644 --- a/src/client/app/common/views/components/ui/button.vue +++ b/src/client/app/common/views/components/ui/button.vue @@ -32,8 +32,6 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - root(isDark, fill) > button display block diff --git a/src/client/app/common/views/components/ui/switch.vue b/src/client/app/common/views/components/ui/switch.vue index e358713d8f..2ee787cb76 100644 --- a/src/client/app/common/views/components/ui/switch.vue +++ b/src/client/app/common/views/components/ui/switch.vue @@ -56,9 +56,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.ui-switch display flex margin 32px 0 cursor pointer @@ -99,7 +97,7 @@ root(isDark) margin 3px 0 0 0 width 34px height 14px - background isDark ? rgba(#fff, 0.15) : rgba(#000, 0.25) + background var(--switchTrack) outline none border-radius 14px transition inherit @@ -125,18 +123,11 @@ root(isDark) > span display block line-height 20px - color isDark ? #c4ccd2 : rgba(#000, 0.75) + color currentColor transition inherit > p margin 0 - //font-size 90% - color isDark ? #78858e : #9daab3 - -.ui-switch[data-darkmode] - root(true) - -.ui-switch:not([data-darkmode]) - root(false) + opacity 0.7 </style> diff --git a/src/client/app/desktop/views/components/settings.profile.vue b/src/client/app/desktop/views/components/settings.profile.vue index d47b5b224b..9dd2798557 100644 --- a/src/client/app/desktop/views/components/settings.profile.vue +++ b/src/client/app/desktop/views/components/settings.profile.vue @@ -24,13 +24,13 @@ <button class="ui primary" @click="save">%i18n:@save%</button> <section> <h2>%i18n:@locked-account%</h2> - <mk-switch v-model="$store.state.i.isLocked" @change="onChangeIsLocked" text="%i18n:@is-locked%"/> + <ui-switch v-model="$store.state.i.isLocked" @change="onChangeIsLocked">%i18n:@is-locked%</ui-switch> </section> <section> <h2>%i18n:@other%</h2> - <mk-switch v-model="$store.state.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/> - <mk-switch v-model="$store.state.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/> - <mk-switch v-model="alwaysMarkNsfw" text="%i18n:common.always-mark-nsfw%"/> + <ui-switch v-model="$store.state.i.isBot" @change="onChangeIsBot">%i18n:@is-bot%</ui-switch> + <ui-switch v-model="$store.state.i.isCat" @change="onChangeIsCat">%i18n:@is-cat%</ui-switch> + <ui-switch v-model="alwaysMarkNsfw">%i18n:common.always-mark-nsfw%</ui-switch> </section> </div> </template> diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index 4b8ee3c9cd..4efaa75c4b 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -30,7 +30,7 @@ <section> <header>%i18n:@note-visibility%</header> - <mk-switch v-model="rememberNoteVisibility" text="%i18n:@remember-note-visibility%"/> + <ui-switch v-model="rememberNoteVisibility">%i18n:@remember-note-visibility%</ui-switch> <section> <header>%i18n:@default-note-visibility%</header> <ui-select v-model="defaultNoteVisibility"> @@ -59,30 +59,30 @@ <div class="div"> <button class="ui" @click="updateWallpaper">%i18n:@choose-wallpaper%</button> <button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button> - <mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/> - <mk-switch v-model="useShadow" text="%i18n:@use-shadow%"/> - <mk-switch v-model="roundedCorners" text="%i18n:@rounded-corners%"/> - <mk-switch v-model="circleIcons" text="%i18n:@circle-icons%"/> - <mk-switch v-model="reduceMotion" text="%i18n:common.reduce-motion%"/> - <mk-switch v-model="contrastedAcct" text="%i18n:@contrasted-acct%"/> - <mk-switch v-model="showFullAcct" text="%i18n:common.show-full-acct%"/> - <mk-switch v-model="gradientWindowHeader" text="%i18n:@gradient-window-header%"/> - <mk-switch v-model="iLikeSushi" text="%i18n:common.i-like-sushi%"/> + <ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch> + <ui-switch v-model="useShadow">%i18n:@use-shadow%</ui-switch> + <ui-switch v-model="roundedCorners">%i18n:@rounded-corners%</ui-switch> + <ui-switch v-model="circleIcons">%i18n:@circle-icons%</ui-switch> + <ui-switch v-model="reduceMotion">%i18n:common.reduce-motion%</ui-switch> + <ui-switch v-model="contrastedAcct">%i18n:@contrasted-acct%</ui-switch> + <ui-switch v-model="showFullAcct">%i18n:common.show-full-acct%</ui-switch> + <ui-switch v-model="gradientWindowHeader">%i18n:@gradient-window-header%</ui-switch> + <ui-switch v-model="iLikeSushi">%i18n:common.i-like-sushi%</ui-switch> </div> - <mk-switch v-model="showPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/> - <mk-switch v-model="suggestRecentHashtags" text="%i18n:@suggest-recent-hashtags%"/> - <mk-switch v-model="showClockOnHeader" text="%i18n:@show-clock-on-header%"/> - <mk-switch v-model="alwaysShowNsfw" text="%i18n:common.always-show-nsfw%"/> - <mk-switch v-model="showReplyTarget" text="%i18n:@show-reply-target%"/> - <mk-switch v-model="showMyRenotes" text="%i18n:@show-my-renotes%"/> - <mk-switch v-model="showRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/> - <mk-switch v-model="showLocalRenotes" text="%i18n:@show-local-renotes%"/> + <ui-switch v-model="showPostFormOnTopOfTl">%i18n:@post-form-on-timeline%</ui-switch> + <ui-switch v-model="suggestRecentHashtags">%i18n:@suggest-recent-hashtags%</ui-switch> + <ui-switch v-model="showClockOnHeader">%i18n:@show-clock-on-header%</ui-switch> + <ui-switch v-model="alwaysShowNsfw">%i18n:common.always-show-nsfw%</ui-switch> + <ui-switch v-model="showReplyTarget">%i18n:@show-reply-target%</ui-switch> + <ui-switch v-model="showMyRenotes">%i18n:@show-my-renotes%</ui-switch> + <ui-switch v-model="showRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch> + <ui-switch v-model="showLocalRenotes">%i18n:@show-local-renotes%</ui-switch> <mk-switch v-model="showMaps" text="%i18n:@show-maps%"> <span>%i18n:@show-maps-desc%</span> </mk-switch> - <mk-switch v-model="disableAnimatedMfm" text="%i18n:common.disable-animated-mfm%"/> - <mk-switch v-model="games_reversi_showBoardLabels" text="%i18n:common.show-reversi-board-labels%"/> - <mk-switch v-model="games_reversi_useContrastStones" text="%i18n:common.use-contrast-reversi-stones%"/> + <ui-switch v-model="disableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch> + <ui-switch v-model="games_reversi_showBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch> + <ui-switch v-model="games_reversi_useContrastStones">%i18n:common.use-contrast-reversi-stones%</ui-switch> </section> <section class="web" v-show="page == 'web'"> @@ -102,7 +102,7 @@ <section class="web" v-show="page == 'web'"> <h1>%i18n:@mobile%</h1> - <mk-switch v-model="disableViaMobile" text="%i18n:@disable-via-mobile%"/> + <ui-switch v-model="disableViaMobile">%i18n:@disable-via-mobile%</ui-switch> </section> <section class="web" v-show="page == 'web'"> diff --git a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue index 550b1be628..d245e3ecf5 100644 --- a/src/client/app/desktop/views/pages/deck/deck.tl-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.tl-column.vue @@ -11,8 +11,8 @@ </span> <div class="editor" style="padding:0 12px" v-if="edit"> - <mk-switch v-model="column.isMediaOnly" @change="onChangeSettings" text="%i18n:@is-media-only%"/> - <mk-switch v-model="column.isMediaView" @change="onChangeSettings" text="%i18n:@is-media-view%"/> + <ui-switch v-model="column.isMediaOnly" @change="onChangeSettings">%i18n:@is-media-only%</ui-switch> + <ui-switch v-model="column.isMediaView" @change="onChangeSettings">%i18n:@is-media-view%</ui-switch> </div> <x-list-tl v-if="column.type == 'list'" :list="column.list" :media-only="column.isMediaOnly" :media-view="column.isMediaView"/> <x-hashtag-tl v-if="column.type == 'hashtag'" :tag-tl="$store.state.settings.tagTimelines.find(x => x.id == column.tagTlId)" :media-only="column.isMediaOnly" :media-view="column.isMediaView"/> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 77a41228d0..a3877093f5 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -1,7 +1,8 @@ { "meta": { "id": "9978f7f9-5616-44fd-a704-cc5985efdd63", - "name": "Dark" + "name": "Dark", + "author": "syuilo" }, "primary": "#fb4e4e", "primaryForeground": "#fff", @@ -28,7 +29,7 @@ "dateDividerFg": "#666b79", "footerButtonHover": "#2e3440", "footerButtonActive": "#21242b", - + "switchTrack": "rgba(255, 255, 255, 0.15)", "noteHeaderName": "#fff", "noteHeaderBadgeFg": "#758188", "noteHeaderBadgeBg": "rgba(0, 0, 0, 0.25)", diff --git a/src/client/theme/halloween.json b/src/client/theme/halloween.json index 7c26fbf6e6..b156eb1aa8 100644 --- a/src/client/theme/halloween.json +++ b/src/client/theme/halloween.json @@ -2,6 +2,7 @@ "meta": { "id": "42e4f09b-67d5-498c-af7d-29faa54745b0", "name": "Halloween", + "author": "syuilo", "inherit": "9978f7f9-5616-44fd-a704-cc5985efdd63" }, "primary": "#fb8d4e", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 28cc71bdb7..7dcf2d3f44 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -1,7 +1,8 @@ { "meta": { "id": "406cfea3-a4e7-486c-9057-30ede1353c3f", - "name": "Light" + "name": "Light", + "author": "syuilo" }, "primary": "#fb4e4e", "primaryForeground": "#fff", @@ -28,7 +29,7 @@ "dateDividerFg": "#aaa", "footerButtonHover": "#f5f5f5", "footerButtonActive": "#eee", - + "switchTrack": "rgba(0, 0, 0, 0.25)", "noteHeaderName": "#627079", "noteHeaderBadgeFg": "#aaa", "noteHeaderBadgeBg": "rgba(0, 0, 0, 0.05)", From 76a25917c03f3bd4e46ff53300f5a1a1fc8a883a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 13:54:53 +0900 Subject: [PATCH 392/539] wip --- src/client/app/desktop/views/components/notes.vue | 4 ++-- src/client/theme/dark.json | 2 -- src/client/theme/light.json | 2 -- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/client/app/desktop/views/components/notes.vue b/src/client/app/desktop/views/components/notes.vue index 31b3a3ab18..84b13ed84e 100644 --- a/src/client/app/desktop/views/components/notes.vue +++ b/src/client/app/desktop/views/components/notes.vue @@ -264,9 +264,9 @@ export default Vue.extend({ border-bottom-right-radius 6px &:hover - background var(--footerButtonHover) + box-shadow 0 0 0 100px inset rgba(0, 0, 0, 0.05) &:active - background var(--footerButtonActive) + box-shadow 0 0 0 100px inset rgba(0, 0, 0, 0.1) </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index a3877093f5..c9e9835136 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -27,8 +27,6 @@ "modalBackdrop": "rgba(0, 0, 0, 0.5)", "dateDividerBg": "#242731", "dateDividerFg": "#666b79", - "footerButtonHover": "#2e3440", - "footerButtonActive": "#21242b", "switchTrack": "rgba(255, 255, 255, 0.15)", "noteHeaderName": "#fff", "noteHeaderBadgeFg": "#758188", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 7dcf2d3f44..6aef10d9a6 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -27,8 +27,6 @@ "modalBackdrop": "rgba(0, 0, 0, 0.1)", "dateDividerBg": "#fdfdfd", "dateDividerFg": "#aaa", - "footerButtonHover": "#f5f5f5", - "footerButtonActive": "#eee", "switchTrack": "rgba(0, 0, 0, 0.25)", "noteHeaderName": "#627079", "noteHeaderBadgeFg": "#aaa", From 4fe2f29478fbf81cb21450170b551ed21211a854 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 14:32:48 +0900 Subject: [PATCH 393/539] wip --- .../app/desktop/views/components/calendar.vue | 4 ++-- .../desktop/views/components/note-detail.vue | 18 +++++--------- .../desktop/views/components/note-preview.vue | 2 +- .../views/components/notes.note.sub.vue | 2 +- .../desktop/views/components/notes.note.vue | 6 ++--- .../desktop/views/components/post-form.vue | 8 +++---- .../app/desktop/views/components/timeline.vue | 23 +++++------------- .../views/components/widget-container.vue | 4 ++-- .../desktop/views/pages/deck/deck.column.vue | 4 ++-- .../desktop/views/pages/deck/deck.note.vue | 6 ++--- .../views/pages/deck/deck.notification.vue | 4 ++-- .../mobile/views/components/note-detail.vue | 20 ++++++---------- .../mobile/views/components/note-preview.vue | 2 +- .../app/mobile/views/components/note.sub.vue | 2 +- .../app/mobile/views/components/note.vue | 6 ++--- .../mobile/views/components/notification.vue | 4 ++-- src/client/theme/dark.json | 24 +++++++++++++------ src/client/theme/halloween.json | 2 +- src/client/theme/light.json | 24 +++++++++++++------ 19 files changed, 80 insertions(+), 85 deletions(-) diff --git a/src/client/app/desktop/views/components/calendar.vue b/src/client/app/desktop/views/components/calendar.vue index cd73ab350b..6b753068fa 100644 --- a/src/client/app/desktop/views/components/calendar.vue +++ b/src/client/app/desktop/views/components/calendar.vue @@ -166,10 +166,10 @@ root(isDark) width 42px font-size 0.9em line-height 42px - color isDark ? #9baec8 : #ccc + color var(--faceTextButton) &:hover - color isDark ? #b2c1d5 : #aaa + color var(--faceTextButtonHover) &:active color isDark ? #b2c1d5 : #999 diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index 9222d8fab9..50ad793f0b 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -225,7 +225,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.mk-note-detail overflow hidden text-align left background var(--face) @@ -327,14 +327,14 @@ root(isDark) display block text-align left margin 0 - color isDark ? #606984 : #ccc + color var(--noteHeaderAcct) > .time position absolute top 0 right 32px font-size 1em - color isDark ? #606984 : #c0c0c0 + color var(--noteHeaderInfo) > .body padding 8px 0 @@ -345,7 +345,7 @@ root(isDark) margin 0 padding 0 overflow-wrap break-word - color isDark ? #fff : #717171 + color var(--noteText) > .text margin-right 8px @@ -358,14 +358,14 @@ root(isDark) padding 0 overflow-wrap break-word font-size 1.5em - color isDark ? #fff : #717171 + color var(--noteText) > .renote margin 8px 0 > * padding 16px - border dashed 1px #c0dac6 + border dashed 1px vat(--quoteBorder) border-radius 8px > .location @@ -419,10 +419,4 @@ root(isDark) > * border-top 1px solid var(--faceDivider) -.mk-note-detail[data-darkmode] - root(true) - -.mk-note-detail:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue index 6c84165356..f64657fb47 100644 --- a/src/client/app/desktop/views/components/note-preview.vue +++ b/src/client/app/desktop/views/components/note-preview.vue @@ -71,7 +71,7 @@ root(isDark) margin 0 padding 0 overflow-wrap break-word - color isDark ? #fff : #717171 + color var(--noteText) > .text margin-right 8px diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue index 13e2991683..70709f8738 100644 --- a/src/client/app/desktop/views/components/notes.note.sub.vue +++ b/src/client/app/desktop/views/components/notes.note.sub.vue @@ -72,7 +72,7 @@ root(isDark) margin 0 padding 0 overflow-wrap break-word - color isDark ? #fff : #717171 + color var(--noteText) > .text margin-right 8px diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 160de5199d..5daaadb971 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -426,7 +426,7 @@ root(isDark) margin 0 padding 0 overflow-wrap break-word - color isDark ? #fff : #717171 + color var(--noteText) > .text margin-right 8px @@ -439,7 +439,7 @@ root(isDark) margin 0 padding 0 overflow-wrap break-word - color isDark ? #fff : #717171 + color var(--noteText) >>> .title display block @@ -491,7 +491,7 @@ root(isDark) > * padding 16px - border dashed 1px isDark ? #4e945e : #c0dac6 + border dashed 1px vat(--quoteBorder) border-radius 8px > footer diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index fdd6e75318..5a5f9d63db 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -434,12 +434,10 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - root(isDark) display block padding 16px - background isDark ? #282C37 : var(--primaryLighten95) + background var(--desktopPostFormBg) &:after content "" @@ -453,8 +451,8 @@ root(isDark) width 100% padding 12px font-size 16px - color isDark ? #fff : #333 - background isDark ? #191d23 : #fff + color var(--desktopPostFormTextareaFg) + background var(--desktopPostFormTextareaBg) outline none border solid 1px var(--primaryAlpha01) border-radius 4px diff --git a/src/client/app/desktop/views/components/timeline.vue b/src/client/app/desktop/views/components/timeline.vue index 7800eae52d..3e4c45d228 100644 --- a/src/client/app/desktop/views/components/timeline.vue +++ b/src/client/app/desktop/views/components/timeline.vue @@ -175,9 +175,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.mk-timeline background var(--face) box-shadow var(--shadow) border-radius var(--round) @@ -187,7 +185,7 @@ root(isDark) padding 0 8px z-index 10 background var(--faceHeader) - box-shadow 0 1px isDark ? rgba(#000, 0.15) : rgba(#000, 0.08) + box-shadow 0 1px var(--desktopTimelineHeaderShadow) > .buttons position absolute @@ -200,7 +198,7 @@ root(isDark) padding 0 8px font-size 0.9em line-height 42px - color isDark ? #9baec8 : #ccc + color var(--faceTextButton) > .badge position absolute @@ -210,10 +208,7 @@ root(isDark) color var(--primary) &:hover - color isDark ? #b2c1d5 : #aaa - - &:active - color isDark ? #b2c1d5 : #999 + color var(--faceTextButtonHover) &[data-active] color var(--primary) @@ -252,16 +247,10 @@ root(isDark) background var(--primary) &:not([data-active]) - color isDark ? #9aa2a7 : #6f7477 + color var(--desktopTimelineSrc) cursor pointer &:hover - color isDark ? #d9dcde : #525a5f - -.mk-timeline[data-darkmode] - root(true) - -.mk-timeline:not([data-darkmode]) - root(false) + color var(--desktopTimelineSrcHover) </style> diff --git a/src/client/app/desktop/views/components/widget-container.vue b/src/client/app/desktop/views/components/widget-container.vue index d17b9c91d8..156823799f 100644 --- a/src/client/app/desktop/views/components/widget-container.vue +++ b/src/client/app/desktop/views/components/widget-container.vue @@ -72,10 +72,10 @@ root(isDark) width 42px font-size 0.9em line-height 42px - color isDark ? #9baec8 : #ccc + color var(--faceTextButton) &:hover - color isDark ? #b2c1d5 : #aaa + color var(--faceTextButtonHover) &:active color isDark ? #b2c1d5 : #999 diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 1cf8900ee5..fb521db25b 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -344,10 +344,10 @@ root(isDark) width $header-height line-height $header-height font-size 16px - color isDark ? #9baec8 : #ccc + color var(--faceTextButton) &:hover - color isDark ? #b2c1d5 : #aaa + color var(--faceTextButtonHover) &:active color isDark ? #b2c1d5 : #999 diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index ffb284fb42..bdc4368e7b 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -309,7 +309,7 @@ root(isDark) margin 0 padding 0 overflow-wrap break-word - color isDark ? #fff : #717171 + color var(--noteText) > .text margin-right 8px @@ -321,7 +321,7 @@ root(isDark) margin 0 padding 0 overflow-wrap break-word - color isDark ? #fff : #717171 + color var(--noteText) >>> .title display block @@ -387,7 +387,7 @@ root(isDark) > * padding 16px - border dashed 1px isDark ? #4e945e : #c0dac6 + border dashed 1px vat(--quoteBorder) border-radius 8px > .app diff --git a/src/client/app/desktop/views/pages/deck/deck.notification.vue b/src/client/app/desktop/views/pages/deck/deck.notification.vue index d0093ff282..ff10ac2aa6 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notification.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notification.vue @@ -146,10 +146,10 @@ root(isDark) font-size 0.9em > .note-preview - color isDark ? #fff : #717171 + color var(--noteText) > .note-ref - color isDark ? #fff : #717171 + color var(--noteText) [data-fa] font-size 1em diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index 472c18088d..ade518b1fc 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -223,7 +223,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.mk-note-detail overflow hidden width 100% text-align left @@ -334,7 +334,7 @@ root(isDark) display block text-align left margin 0 - color isDark ? #606984 : #ccc + color var(--noteHeaderAcct) > .body padding 8px 0 @@ -345,7 +345,7 @@ root(isDark) margin 0 padding 0 overflow-wrap break-word - color isDark ? #fff : #717171 + color var(--noteText) > .text margin-right 8px @@ -358,7 +358,7 @@ root(isDark) padding 0 overflow-wrap break-word font-size 16px - color isDark ? #fff : #717171 + color var(--noteText) @media (min-width 500px) font-size 24px @@ -368,7 +368,7 @@ root(isDark) > * padding 16px - border dashed 1px #c0dac6 + border dashed 1px vat(--quoteBorder) border-radius 8px > .location @@ -393,7 +393,7 @@ root(isDark) > .time font-size 16px - color isDark ? #606984 : #c0c0c0 + color var(--noteHeaderInfo) > footer font-size 1.2em @@ -412,7 +412,7 @@ root(isDark) margin-right 28px &:hover - color isDark ? #9198af : #666 + color var(--noteActionsHover) > .count display inline @@ -426,10 +426,4 @@ root(isDark) > * border-top 1px solid var(--faceDivider) -.mk-note-detail[data-darkmode] - root(true) - -.mk-note-detail:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue index 4c03593a9e..0b3278ff41 100644 --- a/src/client/app/mobile/views/components/note-preview.vue +++ b/src/client/app/mobile/views/components/note-preview.vue @@ -88,7 +88,7 @@ root(isDark) margin 0 padding 0 overflow-wrap break-word - color isDark ? #fff : #717171 + color var(--noteText) > .text margin-right 8px diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue index 2f38c9e97d..8c2e3b496d 100644 --- a/src/client/app/mobile/views/components/note.sub.vue +++ b/src/client/app/mobile/views/components/note.sub.vue @@ -95,7 +95,7 @@ root(isDark) margin 0 padding 0 overflow-wrap break-word - color isDark ? #fff : #717171 + color var(--noteText) > .text margin-right 8px diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 859fc88043..ed175b4f6f 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -349,7 +349,7 @@ root(isDark) margin 0 padding 0 overflow-wrap break-word - color isDark ? #fff : #717171 + color var(--noteText) > .text margin-right 8px @@ -361,7 +361,7 @@ root(isDark) margin 0 padding 0 overflow-wrap break-word - color isDark ? #fff : #717171 + color var(--noteText) >>> .title display block @@ -427,7 +427,7 @@ root(isDark) > * padding 16px - border dashed 1px isDark ? #4e945e : #c0dac6 + border dashed 1px vat(--quoteBorder) border-radius 8px > .app diff --git a/src/client/app/mobile/views/components/notification.vue b/src/client/app/mobile/views/components/notification.vue index ee90c6b46b..7b73012e06 100644 --- a/src/client/app/mobile/views/components/notification.vue +++ b/src/client/app/mobile/views/components/notification.vue @@ -158,10 +158,10 @@ root(isDark) font-size 0.9em > .note-preview - color isDark ? #fff : #717171 + color var(--noteText) > .note-ref - color isDark ? #fff : #717171 + color var(--noteText) [data-fa] font-size 1em diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index c9e9835136..88bde9d684 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -13,11 +13,22 @@ "face": "#282c37", "faceHeader": "#313543", "faceDivider": "rgba(0, 0, 0, 0.3)", + "faceTextButton": "#9baec8", + "faceTextButtonHover": "#b2c1d5", "popupBg": "#2c303c", "popupFg": "#d6dce2", "subNoteBg": "rgba(0, 0, 0, 0.18)", "renoteGradient": "#314027", "renoteText": "#9dbb00", + "quoteBorder": "#4e945e", + "noteText": "#fff", + "noteHeaderName": "#fff", + "noteHeaderBadgeFg": "#758188", + "noteHeaderBadgeBg": "rgba(0, 0, 0, 0.25)", + "noteHeaderAdminFg": "#f15f71", + "noteHeaderAdminBg": "#5d282e", + "noteHeaderAcct": "#606984", + "noteHeaderInfo": "#606984", "noteActions": "#606984", "noteActionsHover": "#a1a8bf", "noteActionsReplyHover": "#0af", @@ -28,13 +39,6 @@ "dateDividerBg": "#242731", "dateDividerFg": "#666b79", "switchTrack": "rgba(255, 255, 255, 0.15)", - "noteHeaderName": "#fff", - "noteHeaderBadgeFg": "#758188", - "noteHeaderBadgeBg": "rgba(0, 0, 0, 0.25)", - "noteHeaderAdminFg": "#f15f71", - "noteHeaderAdminBg": "#5d282e", - "noteHeaderAcct": "#606984", - "noteHeaderInfo": "#606984", "autocompleteItemHoverBg": "rgba(255, 255, 255, 0.1)", "autocompleteItemText": "rgba(255, 255, 255, 0.8)", "autocompleteItemTextSub": "rgba(255, 255, 255, 0.3)", @@ -43,6 +47,12 @@ "cwButtonHoverBg": "#707b97", "reactionPickerButtonHoverBg": "rgba(255, 255, 255, 0.18)", "desktopHeaderBg": "#313543", + "desktopPostFormBg": "@face", + "desktopPostFormTextareaBg": "rgba(0, 0, 0, 0.25)", + "desktopPostFormTextareaFg": "#fff", + "desktopTimelineHeaderShadow": "rgba(0, 0, 0, 0.15)", + "desktopTimelineSrc": "@faceTextButton", + "desktopTimelineSrcHover": "@faceTextButtonHover", "mobileSignedInAsBg": "#273c34", "mobileSignedInAsFg": "#49ab63", "mobileSignoutBg": "#652222", diff --git a/src/client/theme/halloween.json b/src/client/theme/halloween.json index b156eb1aa8..474fc7ea8f 100644 --- a/src/client/theme/halloween.json +++ b/src/client/theme/halloween.json @@ -8,7 +8,7 @@ "primary": "#fb8d4e", "primaryForeground": "#fff", "bg": "#1b1a35", - "face": "#2e2a3e", + "face": "#322e44", "faceHeader": "#36314e", "dateDividerBg": "#26253c", "popupBg": "#2c303c", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 6aef10d9a6..3374a62e36 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -13,11 +13,22 @@ "face": "#fff", "faceHeader": "#fff", "faceDivider": "rgba(0, 0, 0, 0.082)", + "faceTextButton": "#ccc", + "faceTextButtonHover": "#aaa", "popupBg": "#fff", "popupFg": "#586069", "subNoteBg": "rgba(0, 0, 0, 0.01)", "renoteGradient": "#edfde2", "renoteText": "#9dbb00", + "quoteBorder": "#c0dac6", + "noteText": "#717171", + "noteHeaderName": "#627079", + "noteHeaderBadgeFg": "#aaa", + "noteHeaderBadgeBg": "rgba(0, 0, 0, 0.05)", + "noteHeaderAdminFg": "#f15f71", + "noteHeaderAdminBg": "#5d282e", + "noteHeaderAcct": "#ccc", + "noteHeaderInfo": "#c0c0c0", "noteActions": "#ddd", "noteActionsHover": "#444", "noteActionsReplyHover": "#0af", @@ -28,13 +39,6 @@ "dateDividerBg": "#fdfdfd", "dateDividerFg": "#aaa", "switchTrack": "rgba(0, 0, 0, 0.25)", - "noteHeaderName": "#627079", - "noteHeaderBadgeFg": "#aaa", - "noteHeaderBadgeBg": "rgba(0, 0, 0, 0.05)", - "noteHeaderAdminFg": "#f15f71", - "noteHeaderAdminBg": "#5d282e", - "noteHeaderAcct": "#ccc", - "noteHeaderInfo": "#c0c0c0", "autocompleteItemHoverBg": "rgba(0, 0, 0, 0.1)", "autocompleteItemText": "rgba(0, 0, 0, 0.8)", "autocompleteItemTextSub": "rgba(0, 0, 0, 0.3)", @@ -43,6 +47,12 @@ "cwButtonHoverBg": "#bbc4ce", "reactionPickerButtonHoverBg": "#eee", "desktopHeaderBg": "#f7f7f7", + "desktopPostFormBg": "#fff6f6", + "desktopPostFormTextareaBg": "#fff", + "desktopPostFormTextareaFg": "#333", + "desktopTimelineHeaderShadow": "rgba(0, 0, 0, 0.08)", + "desktopTimelineSrc": "#6f7477", + "desktopTimelineSrcHover": "#525a5f", "mobileSignedInAsBg": "#fcfff5", "mobileSignedInAsFg": "#2c662d", "mobileSignoutBg": "#fff6f5", From 7b8a2aef0f9ed4d848d749769fd9dc6774b1e65a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 14:52:10 +0900 Subject: [PATCH 394/539] wip --- locales/ja-JP.yml | 1 - .../app/desktop/views/components/settings.vue | 8 +------- .../views/components/widget-container.vue | 20 +++---------------- .../app/desktop/views/components/window.vue | 15 ++++---------- .../desktop/views/pages/deck/deck.column.vue | 2 +- .../pages/user/user.followers-you-know.vue | 2 +- .../desktop/views/pages/user/user.friends.vue | 2 +- .../desktop/views/pages/user/user.photos.vue | 2 +- src/client/app/store.ts | 1 - src/client/theme/dark.json | 3 +++ src/client/theme/light.json | 3 +++ 11 files changed, 18 insertions(+), 41 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index db2a155221..f5d0a180d8 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -784,7 +784,6 @@ desktop/views/components/settings.vue: rounded-corners: "UIの角を丸める" circle-icons: "円形のアイコンを使用" contrasted-acct: "ユーザー名にコントラストを付ける" - gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" suggest-recent-hashtags: "最近のハッシュタグを投稿フォームに表示する" show-clock-on-header: "右上に時計を表示する" diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index 4efaa75c4b..e95e7a735d 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -66,7 +66,6 @@ <ui-switch v-model="reduceMotion">%i18n:common.reduce-motion%</ui-switch> <ui-switch v-model="contrastedAcct">%i18n:@contrasted-acct%</ui-switch> <ui-switch v-model="showFullAcct">%i18n:common.show-full-acct%</ui-switch> - <ui-switch v-model="gradientWindowHeader">%i18n:@gradient-window-header%</ui-switch> <ui-switch v-model="iLikeSushi">%i18n:common.i-like-sushi%</ui-switch> </div> <ui-switch v-model="showPostFormOnTopOfTl">%i18n:@post-form-on-timeline%</ui-switch> @@ -421,12 +420,7 @@ export default Vue.extend({ disableViaMobile: { get() { return this.$store.state.settings.disableViaMobile; }, set(value) { this.$store.dispatch('settings/set', { key: 'disableViaMobile', value }); } - }, - - gradientWindowHeader: { - get() { return this.$store.state.settings.gradientWindowHeader; }, - set(value) { this.$store.dispatch('settings/set', { key: 'gradientWindowHeader', value }); } - }, + } }, created() { (this as any).os.getMeta().then(meta => { diff --git a/src/client/app/desktop/views/components/widget-container.vue b/src/client/app/desktop/views/components/widget-container.vue index 156823799f..cfcb2785c5 100644 --- a/src/client/app/desktop/views/components/widget-container.vue +++ b/src/client/app/desktop/views/components/widget-container.vue @@ -1,6 +1,6 @@ <template> <div class="mk-widget-container" :class="{ naked }"> - <header :class="{ withGradient }" v-if="showHeader"> + <header v-if="showHeader"> <div class="title"><slot name="header"></slot></div> <slot name="func"></slot> </header> @@ -20,15 +20,6 @@ export default Vue.extend({ type: Boolean, default: false } - }, - computed: { - withGradient(): boolean { - return this.$store.getters.isSignedIn - ? this.$store.state.settings.gradientWindowHeader != null - ? this.$store.state.settings.gradientWindowHeader - : false - : false; - } } }); </script> @@ -54,7 +45,7 @@ root(isDark) line-height 42px font-size 0.9em font-weight bold - color isDark ? #e3e5e8 : #888 + color var(--faceHeaderText) box-shadow 0 1px rgba(#000, 0.07) > [data-fa] @@ -78,12 +69,7 @@ root(isDark) color var(--faceTextButtonHover) &:active - color isDark ? #b2c1d5 : #999 - - &.withGradient - > .title - background isDark ? linear-gradient(to bottom, #313543, #1d2027) : linear-gradient(to bottom, #fff, #ececec) - box-shadow 0 1px rgba(#000, 0.11) + color var(--faceTextButtonActive) .mk-widget-container[data-darkmode] root(true) diff --git a/src/client/app/desktop/views/components/window.vue b/src/client/app/desktop/views/components/window.vue index 15aa158073..5547445537 100644 --- a/src/client/app/desktop/views/components/window.vue +++ b/src/client/app/desktop/views/components/window.vue @@ -4,7 +4,6 @@ <div class="main" ref="main" tabindex="-1" :data-is-modal="isModal" @mousedown="onBodyMousedown" @keydown="onKeydown" :style="{ width, height }"> <div class="body"> <header ref="header" - :class="{ withGradient: $store.state.settings.gradientWindowHeader }" @contextmenu.prevent="() => {}" @mousedown.prevent="onHeaderMousedown" > <h1><slot name="header"></slot></h1> @@ -463,8 +462,6 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - root(isDark) display block @@ -582,10 +579,6 @@ root(isDark) border-radius 6px 6px 0 0 box-shadow 0 1px 0 rgba(#000, 0.1) - &.withGradient - background isDark ? linear-gradient(to bottom, #313543, #1d2027) : linear-gradient(to bottom, #fff, #ececec) - box-shadow 0 1px 0 rgba(#000, 0.15) - &, * user-select none @@ -600,7 +593,7 @@ root(isDark) font-size 1em line-height $header-height font-weight normal - color isDark ? #e3e5e8 : #666 + color var(--desktopWindowTitle) > div:last-child position absolute @@ -615,16 +608,16 @@ root(isDark) padding 0 cursor pointer font-size 1em - color isDark ? #9baec8 : rgba(#000, 0.4) + color var(--faceTextButton) border none outline none background transparent &:hover - color isDark ? #b2c1d5 : rgba(#000, 0.6) + color var(--faceTextButtonHover) &:active - color isDark ? #b2c1d5 : darken(#000, 30%) + color var(--faceTextButtonActive) > [data-fa] padding 0 diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index fb521db25b..2dba7d2522 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -317,7 +317,7 @@ root(isDark) line-height $header-height padding 0 16px font-size 14px - color isDark ? #e3e5e8 : #888 + color var(--faceHeaderText) background var(--faceHeader) box-shadow 0 1px rgba(#000, 0.15) cursor pointer diff --git a/src/client/app/desktop/views/pages/user/user.followers-you-know.vue b/src/client/app/desktop/views/pages/user/user.followers-you-know.vue index 212e21a7a9..b90d0a831e 100644 --- a/src/client/app/desktop/views/pages/user/user.followers-you-know.vue +++ b/src/client/app/desktop/views/pages/user/user.followers-you-know.vue @@ -48,7 +48,7 @@ root(isDark) line-height 42px font-size 0.9em font-weight bold - color isDark ? #e3e5e8 : #888 + color var(--faceHeaderText) box-shadow 0 1px rgba(#000, 0.07) > i diff --git a/src/client/app/desktop/views/pages/user/user.friends.vue b/src/client/app/desktop/views/pages/user/user.friends.vue index 0a329b3d8e..9b466053f7 100644 --- a/src/client/app/desktop/views/pages/user/user.friends.vue +++ b/src/client/app/desktop/views/pages/user/user.friends.vue @@ -54,7 +54,7 @@ root(isDark) font-size 0.9em font-weight bold background isDark ? #313543 : inherit - color isDark ? #e3e5e8 : #888 + color var(--faceHeaderText) box-shadow 0 1px rgba(#000, 0.07) > i diff --git a/src/client/app/desktop/views/pages/user/user.photos.vue b/src/client/app/desktop/views/pages/user/user.photos.vue index 99e064446d..6e9d09e79f 100644 --- a/src/client/app/desktop/views/pages/user/user.photos.vue +++ b/src/client/app/desktop/views/pages/user/user.photos.vue @@ -53,7 +53,7 @@ root(isDark) font-size 0.9em font-weight bold background: isDark ? #313543 : inherit - color isDark ? #e3e5e8 : #888 + color var(--faceHeaderText) box-shadow 0 1px rgba(#000, 0.07) > i diff --git a/src/client/app/store.ts b/src/client/app/store.ts index 00c08409a6..fbcc53d7be 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -21,7 +21,6 @@ const defaultSettings = { circleIcons: true, contrastedAcct: true, showFullAcct: false, - gradientWindowHeader: false, showReplyTarget: true, showMyRenotes: true, showRenotedMyNotes: true, diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 88bde9d684..d563409564 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -12,9 +12,11 @@ "scrollbarHandleHover": "#535660", "face": "#282c37", "faceHeader": "#313543", + "faceHeaderText": "#e3e5e8", "faceDivider": "rgba(0, 0, 0, 0.3)", "faceTextButton": "#9baec8", "faceTextButtonHover": "#b2c1d5", + "faceTextButtonActive": "#b2c1d5", "popupBg": "#2c303c", "popupFg": "#d6dce2", "subNoteBg": "rgba(0, 0, 0, 0.18)", @@ -53,6 +55,7 @@ "desktopTimelineHeaderShadow": "rgba(0, 0, 0, 0.15)", "desktopTimelineSrc": "@faceTextButton", "desktopTimelineSrcHover": "@faceTextButtonHover", + "desktopWindowTitle": "@faceHeaderText", "mobileSignedInAsBg": "#273c34", "mobileSignedInAsFg": "#49ab63", "mobileSignoutBg": "#652222", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 3374a62e36..bdcf282e3d 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -12,9 +12,11 @@ "scrollbarHandleHover": "#00000066", "face": "#fff", "faceHeader": "#fff", + "faceHeaderText": "#888", "faceDivider": "rgba(0, 0, 0, 0.082)", "faceTextButton": "#ccc", "faceTextButtonHover": "#aaa", + "faceTextButtonActive": "#999", "popupBg": "#fff", "popupFg": "#586069", "subNoteBg": "rgba(0, 0, 0, 0.01)", @@ -53,6 +55,7 @@ "desktopTimelineHeaderShadow": "rgba(0, 0, 0, 0.08)", "desktopTimelineSrc": "#6f7477", "desktopTimelineSrcHover": "#525a5f", + "desktopWindowTitle": "#666", "mobileSignedInAsBg": "#fcfff5", "mobileSignedInAsFg": "#2c662d", "mobileSignoutBg": "#fff6f5", From 9e319006f350e357e75654b2c5e28d803c08a617 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 15:19:11 +0900 Subject: [PATCH 395/539] wip --- .../views/components/ui.header.account.vue | 7 +-- .../views/components/ui.header.nav.vue | 14 +---- .../components/ui.header.notifications.vue | 18 +----- .../views/components/ui.header.search.vue | 19 ++---- .../desktop/views/components/ui.header.vue | 63 +------------------ src/client/theme/dark.json | 6 ++ src/client/theme/light.json | 6 ++ 7 files changed, 27 insertions(+), 106 deletions(-) diff --git a/src/client/app/desktop/views/components/ui.header.account.vue b/src/client/app/desktop/views/components/ui.header.account.vue index c728fa42be..77221f81d2 100644 --- a/src/client/app/desktop/views/components/ui.header.account.vue +++ b/src/client/app/desktop/views/components/ui.header.account.vue @@ -134,7 +134,7 @@ root(isDark) display block margin 0 padding 0 - color #9eaba8 + color var(--desktopHeaderFg) border none background transparent cursor pointer @@ -144,14 +144,11 @@ root(isDark) &:hover &[data-active='true'] - color isDark ? #fff : darken(#9eaba8, 20%) + color var(--desktopHeaderHoverFg) > .avatar filter saturate(150%) - &:active - color isDark ? #fff : darken(#9eaba8, 30%) - > .username display block float left diff --git a/src/client/app/desktop/views/components/ui.header.nav.vue b/src/client/app/desktop/views/components/ui.header.nav.vue index f41d4b8ecf..4f679db938 100644 --- a/src/client/app/desktop/views/components/ui.header.nav.vue +++ b/src/client/app/desktop/views/components/ui.header.nav.vue @@ -95,9 +95,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.nav display inline-block margin 0 padding 0 @@ -129,7 +127,7 @@ root(isDark) padding 0 24px font-size 13px font-variant small-caps - color isDark ? #b8c5ca : #9eaba8 + color var(--desktopHeaderFg) text-decoration none transition none cursor pointer @@ -138,7 +136,7 @@ root(isDark) pointer-events none &:hover - color isDark ? #fff : darken(#9eaba8, 20%) + color var(--desktopHeaderHoverFg) text-decoration none > [data-fa]:first-child @@ -162,10 +160,4 @@ root(isDark) @media (max-width 700px) padding 0 12px -.nav[data-darkmode] - root(true) - -.nav:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/components/ui.header.notifications.vue b/src/client/app/desktop/views/components/ui.header.notifications.vue index 2a38655f3a..c59a49556d 100644 --- a/src/client/app/desktop/views/components/ui.header.notifications.vue +++ b/src/client/app/desktop/views/components/ui.header.notifications.vue @@ -61,16 +61,13 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) - +.notifications > button display block margin 0 padding 0 width 32px - color #9eaba8 + color var(--desktopHeaderFg) border none background transparent cursor pointer @@ -80,10 +77,7 @@ root(isDark) &:hover &[data-active='true'] - color isDark ? #fff : darken(#9eaba8, 20%) - - &:active - color isDark ? #fff : darken(#9eaba8, 30%) + color var(--desktopHeaderHoverFg) > [data-fa].bell font-size 1.2em @@ -135,10 +129,4 @@ root(isDark) font-size 1rem overflow auto -.notifications[data-darkmode] - root(true) - -.notifications:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/components/ui.header.search.vue b/src/client/app/desktop/views/components/ui.header.search.vue index d5794dc882..d22efbf84f 100644 --- a/src/client/app/desktop/views/components/ui.header.search.vue +++ b/src/client/app/desktop/views/components/ui.header.search.vue @@ -28,8 +28,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - -root(isDark) +.search > [data-fa] display block position absolute @@ -38,7 +37,7 @@ root(isDark) width 48px text-align center line-height 48px - color #9eaba8 + color var(--desktopHeaderFg) pointer-events none > * @@ -52,26 +51,20 @@ root(isDark) width 14em height 32px font-size 1em - background rgba(#000, 0.05) + background var(--desktopHeaderSearchBg) outline none - //border solid 1px #ddd border none border-radius 16px transition color 0.5s ease, border 0.5s ease - color isDark ? #fff : #000 + color var(--desktopHeaderSearchFg) &::placeholder - color #9eaba8 + color var(--desktopHeaderFg) &:hover - background isDark ? rgba(#fff, 0.04) : rgba(#000, 0.08) + background var(--desktopHeaderSearchHoverBg) &:focus box-shadow 0 0 0 2px var(--primaryAlpha05) !important -.search[data-darkmode] - root(true) - -.search:not([data-darkmode]) - root(false) </style> diff --git a/src/client/app/desktop/views/components/ui.header.vue b/src/client/app/desktop/views/components/ui.header.vue index 264da8bef8..5089232b06 100644 --- a/src/client/app/desktop/views/components/ui.header.vue +++ b/src/client/app/desktop/views/components/ui.header.vue @@ -5,7 +5,6 @@ <div class="main" ref="main"> <div class="backdrop"></div> <div class="main"> - <p ref="welcomeback" v-if="$store.getters.isSignedIn">%i18n:@welcome-back%<b>{{ $store.state.i | userName }}</b>%i18n:@adjective%</p> <div class="container" ref="mainContainer"> <div class="left"> <x-nav/> @@ -64,55 +63,6 @@ export default Vue.extend({ mounted() { this.$store.commit('setUiHeaderHeight', this.$el.offsetHeight); - - if (this.$store.getters.isSignedIn) { - const ago = (new Date().getTime() - new Date(this.$store.state.i.lastUsedAt).getTime()) / 1000; - const isHisasiburi = ago >= 3600; - this.$store.state.i.lastUsedAt = new Date(); - - if (isHisasiburi) { - (this.$refs.welcomeback as any).style.display = 'block'; - (this.$refs.main as any).style.overflow = 'hidden'; - - anime({ - targets: this.$refs.welcomeback, - top: '0', - opacity: 1, - delay: 1000, - duration: 500, - easing: 'easeOutQuad' - }); - - anime({ - targets: this.$refs.mainContainer, - opacity: 0, - delay: 1000, - duration: 500, - easing: 'easeOutQuad' - }); - - setTimeout(() => { - anime({ - targets: this.$refs.welcomeback, - top: '-48px', - opacity: 0, - duration: 500, - complete: () => { - (this.$refs.welcomeback as any).style.display = 'none'; - (this.$refs.main as any).style.overflow = 'initial'; - }, - easing: 'easeInQuad' - }); - - anime({ - targets: this.$refs.mainContainer, - opacity: 1, - duration: 500, - easing: 'easeInQuad' - }); - }, 2500); - } - } }, methods: { @@ -161,17 +111,6 @@ root(isDark) font-size 0.9rem user-select none - > p - display none - position absolute - top 48px - width 100% - line-height 48px - margin 0 - text-align center - color isDark ? #fff : #888 - opacity 0 - > .container display flex width 100% @@ -190,7 +129,7 @@ root(isDark) display block width 48px height 48px - background-image isDark ? url('/assets/desktop/header-icon.dark.svg') : url('/assets/desktop/header-icon.light.svg') + background-image var(--desktopHeaderIcon) background-size 24px background-position center background-repeat no-repeat diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index d563409564..403a5ded1d 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -49,6 +49,12 @@ "cwButtonHoverBg": "#707b97", "reactionPickerButtonHoverBg": "rgba(255, 255, 255, 0.18)", "desktopHeaderBg": "#313543", + "desktopHeaderFg": "#b8c5ca", + "desktopHeaderHoverFg": "#fff", + "desktopHeaderIcon": "url('/assets/desktop/header-icon.dark.svg')", + "desktopHeaderSearchBg": "rgba(0, 0, 0, 0.05)", + "desktopHeaderSearchHoverBg": "rgba(255, 255, 255, 0.04)", + "desktopHeaderSearchFg": "#fff", "desktopPostFormBg": "@face", "desktopPostFormTextareaBg": "rgba(0, 0, 0, 0.25)", "desktopPostFormTextareaFg": "#fff", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index bdcf282e3d..f9f9a9a52d 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -49,6 +49,12 @@ "cwButtonHoverBg": "#bbc4ce", "reactionPickerButtonHoverBg": "#eee", "desktopHeaderBg": "#f7f7f7", + "desktopHeaderFg": "#9eaba8", + "desktopHeaderHoverFg": "#7b8c88", + "desktopHeaderIcon": "url('/assets/desktop/header-icon.light.svg')", + "desktopHeaderSearchBg": "rgba(0, 0, 0, 0.05)", + "desktopHeaderSearchHoverBg": "rgba(0, 0, 0, 0.08)", + "desktopHeaderSearchFg": "#000", "desktopPostFormBg": "#fff6f6", "desktopPostFormTextareaBg": "#fff", "desktopPostFormTextareaFg": "#333", From a36d73cb5271b09a75d656043d8e928f9f821c66 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 16:49:18 +0900 Subject: [PATCH 396/539] wip --- .../app/common/views/widgets/calendar.vue | 2 +- .../app/desktop/views/components/calendar.vue | 45 +++++++------------ .../views/components/notifications.vue | 22 ++++----- .../desktop/views/pages/deck/deck.notes.vue | 4 +- .../views/pages/deck/deck.notifications.vue | 4 +- .../app/mobile/views/components/notes.vue | 4 +- .../mobile/views/components/notifications.vue | 14 ++---- src/client/theme/dark.json | 7 ++- src/client/theme/halloween.json | 2 +- src/client/theme/light.json | 5 +++ 10 files changed, 47 insertions(+), 62 deletions(-) diff --git a/src/client/app/common/views/widgets/calendar.vue b/src/client/app/common/views/widgets/calendar.vue index a24524d1c5..238b493a61 100644 --- a/src/client/app/common/views/widgets/calendar.vue +++ b/src/client/app/common/views/widgets/calendar.vue @@ -124,7 +124,7 @@ root(isDark) .mkw-calendar--body padding 16px 0 - color isDark ? #c5ced6 : #777 + color var(--calendarDay) &:after content "" diff --git a/src/client/app/desktop/views/components/calendar.vue b/src/client/app/desktop/views/components/calendar.vue index 6b753068fa..e2f1329b3b 100644 --- a/src/client/app/desktop/views/components/calendar.vue +++ b/src/client/app/desktop/views/components/calendar.vue @@ -128,10 +128,8 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) - color isDark ? #c5ced6 : #777 +.mk-calendar + color var(--calendarDay) background var(--face) box-shadow var(--shadow) border-radius var(--round) @@ -149,12 +147,10 @@ root(isDark) line-height 42px font-size 0.9em font-weight bold - color isDark ? #c5ced6 : #888 + color var(--faceHeaderText) + background var(--faceHeader) box-shadow 0 1px rgba(#000, 0.07) - if isDark - background #313543 - > [data-fa] margin-right 4px @@ -172,7 +168,7 @@ root(isDark) color var(--faceTextButtonHover) &:active - color isDark ? #b2c1d5 : #999 + color var(--faceTextButtonActive) &:first-of-type left 0 @@ -195,49 +191,46 @@ root(isDark) font-size 14px &.weekday - color isDark ? #43d5dc : #19a2a9 + color var(--calendarWeek) &[data-is-donichi] - color isDark ? #ff6679 : #ef95a0 + color var(--calendarSaturdayOrSunday) &[data-today] - box-shadow 0 0 0 1px isDark ? #43d5dc : #19a2a9 inset + box-shadow 0 0 0 1px var(--calendarWeek) inset border-radius 6px &[data-is-donichi] - box-shadow 0 0 0 1px isDark ? #ff6679 : #ef95a0 inset + box-shadow 0 0 0 1px var(--calendarSaturdayOrSunday) inset &.day cursor pointer - color isDark ? #c5ced6 : #777 + color var(--calendarDay) > div border-radius 6px &:hover > div - background rgba(#000, isDark ? 0.1 : 0.025) + background var(--faceClearButtonHover) &:active > div - background rgba(#000, isDark ? 0.2 : 0.05) + background var(--faceClearButtonActive) &[data-is-donichi] - color isDark ? #ff6679 : #ef95a0 + color var(--calendarSaturdayOrSunday) &[data-is-out-of-range] cursor default - color rgba(isDark ? #c5ced6 : #777, 0.5) - - &[data-is-donichi] - color rgba(isDark ? #ff6679 : #ef95a0, 0.5) + opacity 0.5 &[data-selected] font-weight bold > div - background rgba(#000, isDark ? 0.1 : 0.025) + background var(--faceClearButtonHover) &:active > div - background rgba(#000, isDark ? 0.2 : 0.05) + background var(--faceClearButtonActive) &[data-today] > div @@ -250,10 +243,4 @@ root(isDark) &:active > div background var(--primaryDarken10) -.mk-calendar[data-darkmode] - root(true) - -.mk-calendar:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/components/notifications.vue b/src/client/app/desktop/views/components/notifications.vue index 2eb80dcd01..1f3f62395a 100644 --- a/src/client/app/desktop/views/components/notifications.vue +++ b/src/client/app/desktop/views/components/notifications.vue @@ -191,7 +191,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.mk-notifications .transition .mk-notifications-enter .mk-notifications-leave-to @@ -208,7 +208,7 @@ root(isDark) padding 16px overflow-wrap break-word font-size 13px - border-bottom solid 1px isDark ? #1c2023 : rgba(#000, 0.05) + border-bottom solid 1px var(--faceDivider) &:last-child border-bottom none @@ -219,7 +219,7 @@ root(isDark) top 16px right 12px vertical-align top - color isDark ? #606984 : rgba(#000, 0.6) + color var(--noteHeaderInfo) font-size small &:after @@ -249,10 +249,10 @@ root(isDark) margin-right 4px .note-preview - color isDark ? #c2cad4 : rgba(#000, 0.7) + color var(--noteText) .note-ref - color isDark ? #c2cad4 : rgba(#000, 0.7) + color var(--noteText) [data-fa] font-size 1em @@ -283,9 +283,9 @@ root(isDark) line-height 32px text-align center font-size 0.8em - color isDark ? #666b79 : #aaa - background isDark ? #242731 : #fdfdfd - border-bottom solid 1px isDark ? #1c2023 : rgba(#000, 0.05) + color var(--dateDividerFg) + background var(--dateDividerBg) + border-bottom solid 1px var(--faceDivider) span margin 0 16px @@ -327,10 +327,4 @@ root(isDark) > [data-fa] margin-right 4px -.mk-notifications[data-darkmode] - root(true) - -.mk-notifications:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue index 214ec3cdf7..7e171a2397 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notes.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue @@ -214,8 +214,8 @@ root(isDark) line-height 32px font-size 14px text-align center - color isDark ? #666b79 : #aaa - background isDark ? #242731 : #fdfdfd + color var(--dateDividerFg) + background var(--dateDividerBg) border-bottom solid 1px var(--faceDivider) span diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications.vue b/src/client/app/desktop/views/pages/deck/deck.notifications.vue index 8a28061260..aa48571a5b 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notifications.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notifications.vue @@ -177,8 +177,8 @@ root(isDark) line-height 32px text-align center font-size 0.8em - color isDark ? #666b79 : #aaa - background isDark ? #242731 : #fdfdfd + color var(--dateDividerFg) + background var(--dateDividerBg) border-bottom solid 1px var(--faceDivider) span diff --git a/src/client/app/mobile/views/components/notes.vue b/src/client/app/mobile/views/components/notes.vue index 8841b0e6bf..9153b1d551 100644 --- a/src/client/app/mobile/views/components/notes.vue +++ b/src/client/app/mobile/views/components/notes.vue @@ -243,8 +243,8 @@ root(isDark) line-height 32px text-align center font-size 0.9em - color isDark ? #666b79 : #aaa - background isDark ? #242731 : #fdfdfd + color var(--dateDividerFg) + background var(--dateDividerBg) border-bottom solid 1px var(--faceDivider) span diff --git a/src/client/app/mobile/views/components/notifications.vue b/src/client/app/mobile/views/components/notifications.vue index 8243a9bfb3..bfb6c1e62a 100644 --- a/src/client/app/mobile/views/components/notifications.vue +++ b/src/client/app/mobile/views/components/notifications.vue @@ -104,9 +104,9 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.mk-notifications margin 0 auto - background isDark ? #282C37 :#fff + background var(--face) border-radius 8px box-shadow 0 0 2px rgba(#000, 0.1) overflow hidden @@ -134,8 +134,8 @@ root(isDark) line-height 32px text-align center font-size 0.8em - color isDark ? #666b79 : #aaa - background isDark ? #242731 : #fdfdfd + color var(--dateDividerFg) + background var(--dateDividerBg) border-bottom solid 1px var(--faceDivider) span @@ -169,10 +169,4 @@ root(isDark) > [data-fa] margin-right 4px -.mk-notifications[data-darkmode] - root(true) - -.mk-notifications:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 403a5ded1d..ef5170e71e 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -17,6 +17,8 @@ "faceTextButton": "#9baec8", "faceTextButtonHover": "#b2c1d5", "faceTextButtonActive": "#b2c1d5", + "faceClearButtonHover": "rgba(0, 0, 0, 0.1)", + "faceClearButtonActive": "rgba(0, 0, 0, 0.2)", "popupBg": "#2c303c", "popupFg": "#d6dce2", "subNoteBg": "rgba(0, 0, 0, 0.18)", @@ -48,11 +50,14 @@ "cwButtonFg": "#393f4f", "cwButtonHoverBg": "#707b97", "reactionPickerButtonHoverBg": "rgba(255, 255, 255, 0.18)", + "calendarWeek": "#43d5dc", + "calendarSaturdayOrSunday": "#ff6679", + "calendarDay": "#c5ced6", "desktopHeaderBg": "#313543", "desktopHeaderFg": "#b8c5ca", "desktopHeaderHoverFg": "#fff", "desktopHeaderIcon": "url('/assets/desktop/header-icon.dark.svg')", - "desktopHeaderSearchBg": "rgba(0, 0, 0, 0.05)", + "desktopHeaderSearchBg": "rgba(0, 0, 0, 0.1)", "desktopHeaderSearchHoverBg": "rgba(255, 255, 255, 0.04)", "desktopHeaderSearchFg": "#fff", "desktopPostFormBg": "@face", diff --git a/src/client/theme/halloween.json b/src/client/theme/halloween.json index 474fc7ea8f..420a03d2cd 100644 --- a/src/client/theme/halloween.json +++ b/src/client/theme/halloween.json @@ -16,5 +16,5 @@ "renoteGradient": "#5d2d1a", "renoteText": "#ff6c00", "reactionPickerButtonHoverBg": "rgba(0, 0, 0, 0.18)", - "desktopHeaderBg": "#0c0b19" + "desktopHeaderBg": "#36314e" } diff --git a/src/client/theme/light.json b/src/client/theme/light.json index f9f9a9a52d..bbffc8e143 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -17,6 +17,8 @@ "faceTextButton": "#ccc", "faceTextButtonHover": "#aaa", "faceTextButtonActive": "#999", + "faceClearButtonHover": "rgba(0, 0, 0, 0.025)", + "faceClearButtonActive": "rgba(0, 0, 0, 0.05)", "popupBg": "#fff", "popupFg": "#586069", "subNoteBg": "rgba(0, 0, 0, 0.01)", @@ -48,6 +50,9 @@ "cwButtonFg": "#fff", "cwButtonHoverBg": "#bbc4ce", "reactionPickerButtonHoverBg": "#eee", + "calendarWeek": "#19a2a9", + "calendarSaturdayOrSunday": "#ef95a0", + "calendarDay": "#777", "desktopHeaderBg": "#f7f7f7", "desktopHeaderFg": "#9eaba8", "desktopHeaderHoverFg": "#7b8c88", From 5f289e47676b790b6ac2d6c8cb887300e190fd73 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 16:58:00 +0900 Subject: [PATCH 397/539] wip --- .../views/components/visibility-chooser.vue | 19 +++++-------------- src/client/theme/halloween.json | 4 ++-- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/client/app/common/views/components/visibility-chooser.vue b/src/client/app/common/views/components/visibility-chooser.vue index 5faf09fa11..02f33bfbc0 100644 --- a/src/client/app/common/views/components/visibility-chooser.vue +++ b/src/client/app/common/views/components/visibility-chooser.vue @@ -127,11 +127,9 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - $border-color = rgba(27, 31, 35, 0.15) -root(isDark) +.mk-visibility-chooser position initial > .backdrop @@ -141,7 +139,7 @@ root(isDark) z-index 10000 width 100% height 100% - background isDark ? rgba(#000, 0.4) : rgba(#000, 0.1) + background var(--modalBackdrop) opacity 0 > .popover @@ -189,14 +187,14 @@ root(isDark) display flex padding 8px 14px font-size 12px - color isDark ? #fff : #666 + color var(--popupFg) cursor pointer &:hover - background isDark ? #252731 : #eee + background var(--faceClearButtonHover) &:active - background isDark ? #21242b : #ddd + background var(--faceClearButtonActive) &.active color var(--primaryForeground) @@ -222,11 +220,4 @@ root(isDark) > span:last-child:not(:first-child) opacity 0.6 - -.mk-visibility-chooser[data-darkmode] - root(true) - -.mk-visibility-chooser:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/halloween.json b/src/client/theme/halloween.json index 420a03d2cd..154755fe90 100644 --- a/src/client/theme/halloween.json +++ b/src/client/theme/halloween.json @@ -5,13 +5,13 @@ "author": "syuilo", "inherit": "9978f7f9-5616-44fd-a704-cc5985efdd63" }, - "primary": "#fb8d4e", + "primary": "#d67036", "primaryForeground": "#fff", "bg": "#1b1a35", "face": "#322e44", "faceHeader": "#36314e", "dateDividerBg": "#26253c", - "popupBg": "#2c303c", + "popupBg": "@face", "popupFg": "#d6dce2", "renoteGradient": "#5d2d1a", "renoteText": "#ff6c00", From 5b0b83faa7af45ddae740a203651eedff9863b41 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 17:29:57 +0900 Subject: [PATCH 398/539] wip --- .../app/common/views/components/messaging.vue | 26 +++++-------------- .../app/common/views/components/ui/card.vue | 19 ++++---------- src/client/theme/dark.json | 1 + src/client/theme/light.json | 1 + 4 files changed, 14 insertions(+), 33 deletions(-) diff --git a/src/client/app/common/views/components/messaging.vue b/src/client/app/common/views/components/messaging.vue index a984c980b1..8e5393e6e5 100644 --- a/src/client/app/common/views/components/messaging.vue +++ b/src/client/app/common/views/components/messaging.vue @@ -204,12 +204,10 @@ root(isDark) left 0 z-index 1 width 100% - background #fff box-shadow 0 0px 2px rgba(#000, 0.2) > .form - padding 8px - background isDark ? #282c37 : #f7f7f7 + background rgba(0, 0, 0, 0.02) > label display block @@ -229,32 +227,22 @@ root(isDark) bottom 0 left 0 width 1em - line-height 56px + line-height 48px margin auto color #555 > input margin 0 - padding 0 0 0 32px + padding 0 0 0 42px width 100% font-size 1em - line-height 38px - color #000 + line-height 48px + color var(--faceText) outline none - background isDark ? #191b22 : #fff - border solid 1px isDark ? #495156 : #eee + background transparent + border none border-radius 5px box-shadow none - transition color 0.5s ease, border 0.5s ease - - &:hover - border solid 1px isDark ? #b0b0b0 : #ddd - transition border 0.2s ease - - &:focus - color var(--primaryDarken20) - border solid 1px var(--primary) - transition color 0, border 0 > .result display block diff --git a/src/client/app/common/views/components/ui/card.vue b/src/client/app/common/views/components/ui/card.vue index be24027f6c..a37a38d340 100644 --- a/src/client/app/common/views/components/ui/card.vue +++ b/src/client/app/common/views/components/ui/card.vue @@ -20,11 +20,9 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.ui-card margin 16px - color isDark ? #fff : #000 + color var(--faceText) background var(--face) box-shadow 0 3px 1px -2px rgba(#000, 0.2), 0 2px 2px 0 rgba(#000, 0.14), 0 1px 5px 0 rgba(#000, 0.12) @@ -32,14 +30,14 @@ root(isDark) padding 16px font-weight bold font-size 20px - color isDark ? #fff : #444 + color var(--faceText) @media (min-width 500px) padding 24px 32px > section padding 20px 16px - border-top solid 1px isDark ? rgba(#000, 0.3) : rgba(#000, 0.1) + border-top solid 1px var(--faceDivider) @media (min-width 500px) padding 32px @@ -50,12 +48,5 @@ root(isDark) > header margin-bottom 16px font-weight bold - color isDark ? #fff : #444 - -.ui-card[data-darkmode] - root(true) - -.ui-card:not([data-darkmode]) - root(false) - + color var(--faceText) </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index ef5170e71e..7e0df42365 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -11,6 +11,7 @@ "scrollbarHandle": "#454954", "scrollbarHandleHover": "#535660", "face": "#282c37", + "faceText": "#fff", "faceHeader": "#313543", "faceHeaderText": "#e3e5e8", "faceDivider": "rgba(0, 0, 0, 0.3)", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index bbffc8e143..482276f638 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -11,6 +11,7 @@ "scrollbarHandle": "#00000033", "scrollbarHandleHover": "#00000066", "face": "#fff", + "faceText": "#444", "faceHeader": "#fff", "faceHeaderText": "#888", "faceDivider": "rgba(0, 0, 0, 0.082)", From f3eeadcd8f3f0513250dc6ed13cabd6636da3a89 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 17:42:51 +0900 Subject: [PATCH 399/539] wip --- .../app/common/views/components/messaging.vue | 28 +++++++------------ .../desktop/views/components/post-form.vue | 4 +-- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/client/app/common/views/components/messaging.vue b/src/client/app/common/views/components/messaging.vue index 8e5393e6e5..91453e16ec 100644 --- a/src/client/app/common/views/components/messaging.vue +++ b/src/client/app/common/views/components/messaging.vue @@ -167,9 +167,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.mk-messaging &[data-compact] font-size 0.8em @@ -318,20 +316,20 @@ root(isDark) display block text-decoration none background var(--face) - border-bottom solid 1px isDark ? #1c2023 : #eee + border-bottom solid 1px var(--faceDivider) * pointer-events none user-select none &:hover - background isDark ? #1e2129 : #fafafa + box-shadow 0 0 0 100px inset rgba(0, 0, 0, 0.05) - > .avatar + .avatar filter saturate(200%) &:active - background isDark ? #14161b : #eee + box-shadow 0 0 0 100px inset rgba(0, 0, 0, 0.1) &[data-is-read] &[data-is-me] @@ -371,17 +369,17 @@ root(isDark) overflow hidden text-overflow ellipsis font-size 1em - color isDark ? #fff : rgba(#000, 0.9) + color var(--noteHeaderName) font-weight bold transition all 0.1s ease > .username margin 0 8px - color isDark ? #606984 : rgba(#000, 0.5) + color var(--noteHeaderAcct) > .mk-time margin 0 0 0 auto - color isDark ? #606984 : rgba(#000, 0.5) + color var(--noteHeaderInfo) font-size 80% > .avatar @@ -401,10 +399,10 @@ root(isDark) overflow hidden overflow-wrap break-word font-size 1.1em - color isDark ? #fff : rgba(#000, 0.8) + color var(--faceText) .me - color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.4) + opacity 0.7 > .image display block @@ -449,10 +447,4 @@ root(isDark) > .avatar margin 0 12px 0 0 -.mk-messaging[data-darkmode] - root(true) - -.mk-messaging:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index 5a5f9d63db..0d600dd08e 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -503,7 +503,7 @@ root(isDark) > span margin-right 16px - color isDark ? #fff : #666 + color var(--primary) > .hashtags margin 0 0 8px 0 @@ -512,7 +512,7 @@ root(isDark) font-size 14px > b - color isDark ? #9baec8 : var(--primaryDarken20) + color var(--primary) > * margin-right 8px From cc6af402be152702488645f87fa9464e52caf36e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 18:01:23 +0900 Subject: [PATCH 400/539] wip --- src/client/app/desktop/views/components/post-form.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index 0d600dd08e..5dd40c9ba5 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -521,7 +521,7 @@ root(isDark) > .files margin 0 padding 0 - background isDark ? #181b23 : var(--primaryLighten98) + background var(--desktopPostFormTextareaBg) border solid 1px var(--primaryAlpha01) border-top none border-radius 0 0 4px 4px @@ -572,7 +572,7 @@ root(isDark) cursor pointer > .mk-poll-editor - background isDark ? #181b23 : var(--primaryLighten98) + background var(--desktopPostFormTextareaBg) border solid 1px var(--primaryAlpha01) border-top none border-radius 0 0 4px 4px From 459b374d612e53cfd4244649ac2c812618f827f5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 19:14:35 +0900 Subject: [PATCH 401/539] wip --- src/client/app/common/scripts/theme.ts | 17 +++++++++++++++++ .../app/common/views/widgets/broadcast.vue | 14 ++++---------- src/client/theme/dark.json | 19 +++++++++++++------ src/client/theme/halloween.json | 16 +++++++--------- src/client/theme/light.json | 19 +++++++++++++------ 5 files changed, 54 insertions(+), 31 deletions(-) diff --git a/src/client/app/common/scripts/theme.ts b/src/client/app/common/scripts/theme.ts index a08028ff9a..db1cd7c394 100644 --- a/src/client/app/common/scripts/theme.ts +++ b/src/client/app/common/scripts/theme.ts @@ -7,6 +7,7 @@ type Theme = { id: string; name: string; inherit: string; + vars: any; }; } & { [key: string]: string; @@ -34,6 +35,22 @@ function compile(theme: Theme): { [key: string]: string } { if (code[0] == '@') { return getColor(theme[code.substr(1)]); } + if (code[0] == '$') { + return getColor(theme.meta.vars[code.substr(1)]); + } + + // func + if (code[0] == ':') { + const parts = code.split('<'); + const func = parts.shift().substr(1); + const arg = parseInt(parts.shift(), 10); + const color = getColor(parts.join('<')); + + switch (func) { + case 'darken': return color.darken(arg); + case 'lighten': return color.lighten(arg); + } + } return tinycolor(code); } diff --git a/src/client/app/common/views/widgets/broadcast.vue b/src/client/app/common/views/widgets/broadcast.vue index c471229f15..65e37bfc69 100644 --- a/src/client/app/common/views/widgets/broadcast.vue +++ b/src/client/app/common/views/widgets/broadcast.vue @@ -71,9 +71,9 @@ export default define({ </script> <style lang="stylus" scoped> -root(isDark) +.anltbovirfeutcigvwgmgxipejaeozxi-body padding 10px - background isDark ? #253a50 : #f3f9ff + background var(--announcementsBg) &[data-melt] background transparent @@ -130,14 +130,14 @@ root(isDark) margin 0 font-size 0.95em font-weight normal - color isDark ? #539eff : #4078c0 + color var(--announcementsTitle) > p display block z-index 1 margin 0 font-size 0.7em - color isDark ? #fff : #57616f + color var(--announcementsText) &.fetching text-align center @@ -150,10 +150,4 @@ root(isDark) > p color #fff -.anltbovirfeutcigvwgmgxipejaeozxi-body[data-darkmode] - root(true) - -.anltbovirfeutcigvwgmgxipejaeozxi-body:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 7e0df42365..c4d1fa9d62 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -2,17 +2,21 @@ "meta": { "id": "9978f7f9-5616-44fd-a704-cc5985efdd63", "name": "Dark", - "author": "syuilo" + "author": "syuilo", + "vars": { + "primary": "#fb4e4e", + "secondary": "#282C37" + } }, - "primary": "#fb4e4e", + "primary": "$primary", "primaryForeground": "#fff", - "bg": "#191b22", + "bg": ":darken<8<$secondary", "scrollbarTrack": "#282c37", "scrollbarHandle": "#454954", "scrollbarHandleHover": "#535660", - "face": "#282c37", + "face": "$secondary", "faceText": "#fff", - "faceHeader": "#313543", + "faceHeader": ":lighten<5<$secondary", "faceHeaderText": "#e3e5e8", "faceDivider": "rgba(0, 0, 0, 0.3)", "faceTextButton": "#9baec8", @@ -20,7 +24,7 @@ "faceTextButtonActive": "#b2c1d5", "faceClearButtonHover": "rgba(0, 0, 0, 0.1)", "faceClearButtonActive": "rgba(0, 0, 0, 0.2)", - "popupBg": "#2c303c", + "popupBg": ":lighten<5<$secondary", "popupFg": "#d6dce2", "subNoteBg": "rgba(0, 0, 0, 0.18)", "renoteGradient": "#314027", @@ -54,6 +58,9 @@ "calendarWeek": "#43d5dc", "calendarSaturdayOrSunday": "#ff6679", "calendarDay": "#c5ced6", + "announcementsBg": "#253a50", + "announcementsTitle": "#539eff", + "announcementsText": "#fff", "desktopHeaderBg": "#313543", "desktopHeaderFg": "#b8c5ca", "desktopHeaderHoverFg": "#fff", diff --git a/src/client/theme/halloween.json b/src/client/theme/halloween.json index 154755fe90..81c773f574 100644 --- a/src/client/theme/halloween.json +++ b/src/client/theme/halloween.json @@ -3,18 +3,16 @@ "id": "42e4f09b-67d5-498c-af7d-29faa54745b0", "name": "Halloween", "author": "syuilo", - "inherit": "9978f7f9-5616-44fd-a704-cc5985efdd63" + "inherit": "9978f7f9-5616-44fd-a704-cc5985efdd63", + "vars": { + "primary": "#d67036", + "primaryForeground": "#fff", + "secondary": "#1f1d30", + "text": "#b1bee3" + } }, - "primary": "#d67036", - "primaryForeground": "#fff", "bg": "#1b1a35", - "face": "#322e44", - "faceHeader": "#36314e", - "dateDividerBg": "#26253c", - "popupBg": "@face", - "popupFg": "#d6dce2", "renoteGradient": "#5d2d1a", "renoteText": "#ff6c00", - "reactionPickerButtonHoverBg": "rgba(0, 0, 0, 0.18)", "desktopHeaderBg": "#36314e" } diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 482276f638..a7037b8e54 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -2,17 +2,21 @@ "meta": { "id": "406cfea3-a4e7-486c-9057-30ede1353c3f", "name": "Light", - "author": "syuilo" + "author": "syuilo", + "vars": { + "primary": "#fb4e4e", + "secondary": "#fff" + } }, - "primary": "#fb4e4e", + "primary": "$primary", "primaryForeground": "#fff", - "bg": "#f7f7f7", + "bg": ":darken<8<$secondary", "scrollbarTrack": "#fff", "scrollbarHandle": "#00000033", "scrollbarHandleHover": "#00000066", - "face": "#fff", + "face": "$secondary", "faceText": "#444", - "faceHeader": "#fff", + "faceHeader": ":lighten<5<$secondary", "faceHeaderText": "#888", "faceDivider": "rgba(0, 0, 0, 0.082)", "faceTextButton": "#ccc", @@ -20,7 +24,7 @@ "faceTextButtonActive": "#999", "faceClearButtonHover": "rgba(0, 0, 0, 0.025)", "faceClearButtonActive": "rgba(0, 0, 0, 0.05)", - "popupBg": "#fff", + "popupBg": ":lighten<5<$secondary", "popupFg": "#586069", "subNoteBg": "rgba(0, 0, 0, 0.01)", "renoteGradient": "#edfde2", @@ -54,6 +58,9 @@ "calendarWeek": "#19a2a9", "calendarSaturdayOrSunday": "#ef95a0", "calendarDay": "#777", + "announcementsBg": "#f3f9ff", + "announcementsTitle": "#4078c0", + "announcementsText": "#57616f", "desktopHeaderBg": "#f7f7f7", "desktopHeaderFg": "#9eaba8", "desktopHeaderHoverFg": "#7b8c88", From 7a0a8b5d2b1d9f4f0bbacdb6b30cfbedab75f59d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 19:32:06 +0900 Subject: [PATCH 402/539] wip --- .../app/common/views/components/google.vue | 20 +++++++------------ src/client/theme/dark.json | 16 +++++++++++++++ src/client/theme/light.json | 16 +++++++++++++++ 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/client/app/common/views/components/google.vue b/src/client/app/common/views/components/google.vue index 8272961ef2..ac71a5e56d 100644 --- a/src/client/app/common/views/components/google.vue +++ b/src/client/app/common/views/components/google.vue @@ -26,7 +26,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.mk-google display flex margin 8px 0 @@ -37,31 +37,25 @@ root(isDark) height 40px font-family sans-serif font-size 16px - color isDark ? #dee4e8 : #55595c - background isDark ? #191b22 : #fff - border solid 1px isDark ? #495156 : #dadada + color var(--googleSearchFg) + background var(--googleSearchBg) + border solid 1px var(--googleSearchBorder) border-radius 4px 0 0 4px &:hover - border-color isDark ? #777c86 : #b0b0b0 + border-color var(--googleSearchHoverBorder) > button flex-shrink 0 padding 0 16px - border solid 1px isDark ? #495156 : #dadada + border solid 1px var(--googleSearchBorder) border-left none border-radius 0 4px 4px 0 &:hover - background-color isDark ? #2e3440 : #eee + background-color var(--googleSearchHoverButton) &:active box-shadow 0 2px 4px rgba(#000, 0.15) inset -.mk-google[data-darkmode] - root(true) - -.mk-google:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index c4d1fa9d62..0422eb021b 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -38,29 +38,45 @@ "noteHeaderAdminBg": "#5d282e", "noteHeaderAcct": "#606984", "noteHeaderInfo": "#606984", + "noteActions": "#606984", "noteActionsHover": "#a1a8bf", "noteActionsReplyHover": "#0af", "noteActionsRenoteHover": "#8d0", "noteActionsReactionHover": "#fa0", "noteActionsHighlighted": "#707b97", + "modalBackdrop": "rgba(0, 0, 0, 0.5)", + "dateDividerBg": "#242731", "dateDividerFg": "#666b79", + "switchTrack": "rgba(255, 255, 255, 0.15)", + "autocompleteItemHoverBg": "rgba(255, 255, 255, 0.1)", "autocompleteItemText": "rgba(255, 255, 255, 0.8)", "autocompleteItemTextSub": "rgba(255, 255, 255, 0.3)", + "cwButtonBg": "#687390", "cwButtonFg": "#393f4f", "cwButtonHoverBg": "#707b97", + "reactionPickerButtonHoverBg": "rgba(255, 255, 255, 0.18)", + "calendarWeek": "#43d5dc", "calendarSaturdayOrSunday": "#ff6679", "calendarDay": "#c5ced6", + "announcementsBg": "#253a50", "announcementsTitle": "#539eff", "announcementsText": "#fff", + + "googleSearchBg": "rgba(0, 0, 0, 0.2)", + "googleSearchFg": "#dee4e8", + "googleSearchBorder": "rgba(255, 255, 255, 0.2)", + "googleSearchHoverBorder": "rgba(255, 255, 255, 0.3)", + "googleSearchHoverButton": "rgba(255, 255, 255, 0.1)", + "desktopHeaderBg": "#313543", "desktopHeaderFg": "#b8c5ca", "desktopHeaderHoverFg": "#fff", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index a7037b8e54..83e4ee05c3 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -38,29 +38,45 @@ "noteHeaderAdminBg": "#5d282e", "noteHeaderAcct": "#ccc", "noteHeaderInfo": "#c0c0c0", + "noteActions": "#ddd", "noteActionsHover": "#444", "noteActionsReplyHover": "#0af", "noteActionsRenoteHover": "#8d0", "noteActionsReactionHover": "#fa0", "noteActionsHighlighted": "#888", + "modalBackdrop": "rgba(0, 0, 0, 0.1)", + "dateDividerBg": "#fdfdfd", "dateDividerFg": "#aaa", + "switchTrack": "rgba(0, 0, 0, 0.25)", + "autocompleteItemHoverBg": "rgba(0, 0, 0, 0.1)", "autocompleteItemText": "rgba(0, 0, 0, 0.8)", "autocompleteItemTextSub": "rgba(0, 0, 0, 0.3)", + "cwButtonBg": "#b1b9c1", "cwButtonFg": "#fff", "cwButtonHoverBg": "#bbc4ce", + "reactionPickerButtonHoverBg": "#eee", + "calendarWeek": "#19a2a9", "calendarSaturdayOrSunday": "#ef95a0", "calendarDay": "#777", + "announcementsBg": "#f3f9ff", "announcementsTitle": "#4078c0", "announcementsText": "#57616f", + + "googleSearchBg": "#fff", + "googleSearchFg": "#55595c", + "googleSearchBorder": "rgba(0, 0, 0, 0.2)", + "googleSearchHoverBorder": "rgba(0, 0, 0, 0.3)", + "googleSearchHoverButton": "rgba(0, 0, 0, 0.05)", + "desktopHeaderBg": "#f7f7f7", "desktopHeaderFg": "#9eaba8", "desktopHeaderHoverFg": "#7b8c88", From b032f78769d7d70b2265cb5318276fa582c20bf7 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 21:43:11 +0900 Subject: [PATCH 403/539] wip --- .../components/messaging-room.message.vue | 20 ++----- .../views/components/messaging-room.vue | 36 ++++------- .../app/mobile/views/components/ui.header.vue | 60 ------------------- src/client/theme/dark.json | 8 +++ src/client/theme/halloween.json | 1 - src/client/theme/light.json | 8 +++ 6 files changed, 30 insertions(+), 103 deletions(-) diff --git a/src/client/app/common/views/components/messaging-room.message.vue b/src/client/app/common/views/components/messaging-room.message.vue index e0528d5432..77bf55c52c 100644 --- a/src/client/app/common/views/components/messaging-room.message.vue +++ b/src/client/app/common/views/components/messaging-room.message.vue @@ -59,9 +59,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.message $me-balloon-color = var(--primary) padding 10px 12px 10px 12px @@ -179,7 +177,7 @@ root(isDark) display block margin 2px 0 0 0 font-size 10px - color isDark ? rgba(#fff, 0.4) : rgba(#000, 0.4) + color var(--messagingRoomMessageInfo) > [data-fa] margin-left 4px @@ -192,7 +190,7 @@ root(isDark) padding-left 66px > .balloon - $color = isDark ? #2d3338 : #eee + $color = var(--messagingRoomMessageBg) float left background $color @@ -208,8 +206,7 @@ root(isDark) > .content > .text - if isDark - color #fff + color var(--messagingRoomMessageFg) > footer text-align left @@ -250,18 +247,9 @@ root(isDark) > .read user-select none - margin 0 4px 0 0 - color isDark ? rgba(#fff, 0.5) : rgba(#000, 0.5) - font-size 11px &[data-is-deleted] > .balloon opacity 0.5 -.message[data-darkmode] - root(true) - -.message:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/components/messaging-room.vue b/src/client/app/common/views/components/messaging-room.vue index 52abfa4e1d..98661bc39d 100644 --- a/src/client/app/common/views/components/messaging-room.vue +++ b/src/client/app/common/views/components/messaging-room.vue @@ -262,14 +262,12 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.mk-messaging-room display flex flex 1 flex-direction column height 100% - background isDark ? #191b22 : #fff + background var(--messagingRoomBg) > .body width 100% @@ -277,24 +275,15 @@ root(isDark) margin 0 auto flex 1 - > .init - width 100% - margin 0 - padding 16px 8px 8px 8px - text-align center - font-size 0.8em - color rgba(isDark ? #fff : #000, 0.4) - - [data-fa] - margin-right 4px - + > .init, > .empty width 100% margin 0 padding 16px 8px 8px 8px text-align center font-size 0.8em - color rgba(isDark ? #fff : #000, 0.4) + color var(--messagingRoomInfo) + opacity 0.5 [data-fa] margin-right 4px @@ -305,7 +294,8 @@ root(isDark) padding 16px text-align center font-size 0.8em - color rgba(isDark ? #fff : #000, 0.4) + color var(--messagingRoomInfo) + opacity 0.5 [data-fa] margin-right 4px @@ -349,7 +339,7 @@ root(isDark) left 0 right 0 margin 0 auto - background rgba(isDark ? #fff : #000, 0.1) + background var(--messagingRoomDateDividerLine) > span display inline-block @@ -357,8 +347,8 @@ root(isDark) padding 0 16px //font-weight bold line-height 32px - color rgba(isDark ? #fff : #000, 0.3) - background isDark ? #191b22 : #fff + color var(--messagingRoomDateDividerText) + background var(--messagingRoomBg) > footer position -webkit-sticky @@ -410,10 +400,4 @@ root(isDark) transition opacity 0.5s opacity 0 -.mk-messaging-room[data-darkmode] - root(true) - -.mk-messaging-room:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/mobile/views/components/ui.header.vue b/src/client/app/mobile/views/components/ui.header.vue index b859c22887..d3e258f052 100644 --- a/src/client/app/mobile/views/components/ui.header.vue +++ b/src/client/app/mobile/views/components/ui.header.vue @@ -4,7 +4,6 @@ <mk-special-message/> <div class="main" ref="main"> <div class="backdrop"></div> - <p ref="welcomeback" v-if="$store.getters.isSignedIn">%i18n:@welcome-back%<b>{{ $store.state.i | userName }}</b>%i18n:@adjective%</p> <div class="content" ref="mainContainer"> <button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button> <template v-if="hasUnreadNotification || hasUnreadMessagingMessage || hasGameInvitation">%fa:circle%</template> @@ -50,53 +49,6 @@ export default Vue.extend({ this.connection.on('reversi_invited', this.onReversiInvited); this.connection.on('reversi_no_invites', this.onReversiNoInvites); - - const ago = (new Date().getTime() - new Date(this.$store.state.i.lastUsedAt).getTime()) / 1000; - const isHisasiburi = ago >= 3600; - this.$store.state.i.lastUsedAt = new Date(); - - if (isHisasiburi) { - (this.$refs.welcomeback as any).style.display = 'block'; - (this.$refs.main as any).style.overflow = 'hidden'; - - anime({ - targets: this.$refs.welcomeback, - top: '0', - opacity: 1, - delay: 1000, - duration: 500, - easing: 'easeOutQuad' - }); - - anime({ - targets: this.$refs.mainContainer, - opacity: 0, - delay: 1000, - duration: 500, - easing: 'easeOutQuad' - }); - - setTimeout(() => { - anime({ - targets: this.$refs.welcomeback, - top: '-48px', - opacity: 0, - duration: 500, - complete: () => { - (this.$refs.welcomeback as any).style.display = 'none'; - (this.$refs.main as any).style.overflow = 'initial'; - }, - easing: 'easeInQuad' - }); - - anime({ - targets: this.$refs.mainContainer, - opacity: 1, - duration: 500, - easing: 'easeInQuad' - }); - }, 2500); - } } }, beforeDestroy() { @@ -159,18 +111,6 @@ root(isDark) //background-color rgba(#1b2023, 0.75) background-color isDark ? #313543 : #595f6f - > p - display none - position absolute - z-index 1002 - top $height - width 100% - line-height $height - margin 0 - text-align center - color #fff - opacity 0 - > .content z-index 1001 diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 0422eb021b..7a9a06187f 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -77,6 +77,14 @@ "googleSearchHoverBorder": "rgba(255, 255, 255, 0.3)", "googleSearchHoverButton": "rgba(255, 255, 255, 0.1)", + "messagingRoomBg": "@bg", + "messagingRoomInfo": "#fff", + "messagingRoomDateDividerLine": "rgba(255, 255, 255, 0.1)", + "messagingRoomDateDividerText": "rgba(255, 255, 255, 0.3)", + "messagingRoomMessageInfo": "rgba(255, 255, 255, 0.4)", + "messagingRoomMessageBg": "$secondary", + "messagingRoomMessageFg": "#fff", + "desktopHeaderBg": "#313543", "desktopHeaderFg": "#b8c5ca", "desktopHeaderHoverFg": "#fff", diff --git a/src/client/theme/halloween.json b/src/client/theme/halloween.json index 81c773f574..327d04cad6 100644 --- a/src/client/theme/halloween.json +++ b/src/client/theme/halloween.json @@ -11,7 +11,6 @@ "text": "#b1bee3" } }, - "bg": "#1b1a35", "renoteGradient": "#5d2d1a", "renoteText": "#ff6c00", "desktopHeaderBg": "#36314e" diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 83e4ee05c3..ca0dad0718 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -77,6 +77,14 @@ "googleSearchHoverBorder": "rgba(0, 0, 0, 0.3)", "googleSearchHoverButton": "rgba(0, 0, 0, 0.05)", + "messagingRoomBg": "#fff", + "messagingRoomInfo": "#000", + "messagingRoomDateDividerLine": "rgba(0, 0, 0, 0.1)", + "messagingRoomDateDividerText": "rgba(0, 0, 0, 0.3)", + "messagingRoomMessageInfo": "rgba(0, 0, 0, 0.4)", + "messagingRoomMessageBg": "#eee", + "messagingRoomMessageFg": "#333", + "desktopHeaderBg": "#f7f7f7", "desktopHeaderFg": "#9eaba8", "desktopHeaderHoverFg": "#7b8c88", From ef74653a4bb80215482b25c2028924c5c04717e3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 22:25:10 +0900 Subject: [PATCH 404/539] wip --- src/client/app/common/scripts/theme.ts | 3 ++- .../app/desktop/views/components/settings.vue | 27 +++++++------------ src/client/theme/dark.json | 7 ++++- src/client/theme/light.json | 7 ++++- 4 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/client/app/common/scripts/theme.ts b/src/client/app/common/scripts/theme.ts index db1cd7c394..f27ded8685 100644 --- a/src/client/app/common/scripts/theme.ts +++ b/src/client/app/common/scripts/theme.ts @@ -43,12 +43,13 @@ function compile(theme: Theme): { [key: string]: string } { if (code[0] == ':') { const parts = code.split('<'); const func = parts.shift().substr(1); - const arg = parseInt(parts.shift(), 10); + const arg = parseFloat(parts.shift()); const color = getColor(parts.join('<')); switch (func) { case 'darken': return color.darken(arg); case 'lighten': return color.lighten(arg); + case 'alpha': return color.setAlpha(arg); } } diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index e95e7a735d..4d839f1dc9 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -486,9 +486,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.mk-settings display flex width 100% height 100% @@ -499,13 +497,13 @@ root(isDark) height 100% padding 16px 0 0 0 overflow auto - border-right solid 1px isDark ? #1c2023 : #ddd + border-right solid 1px var(--faceDivider) > p display block padding 10px 16px margin 0 - color isDark ? #9aa2a7 : #666 + color var(--desktopSettingsNavItem) cursor pointer user-select none transition margin-left 0.2s ease @@ -514,7 +512,7 @@ root(isDark) margin-right 4px &:hover - color isDark ? #fff : #555 + color var(--desktopSettingsNavItemHover) &.active margin-left 8px @@ -528,14 +526,13 @@ root(isDark) > section margin 32px - color isDark ? #c4ccd2 : #4a535a + color var(--text) > h1 margin 0 0 1em 0 padding 0 0 8px 0 font-size 1em - color isDark ? #e3e7ea : #555 - border-bottom solid 1px isDark ? #1c2023 : #eee + border-bottom solid 1px var(--faceDivider) &, >>> * .ui.button.block @@ -548,18 +545,12 @@ root(isDark) margin 0 0 1em 0 padding 0 0 8px 0 font-size 1em - color isDark ? #e3e7ea : #555 - border-bottom solid 1px isDark ? #1c2023 : #eee + color var(--text) + border-bottom solid 1px var(--faceDivider) > .web > .div - border-bottom solid 1px isDark ? #1c2023 : #eee + border-bottom solid 1px var(--faceDivider) margin 16px 0 -.mk-settings[data-darkmode] - root(true) - -.mk-settings:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 7a9a06187f..8962235f2f 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -5,12 +5,14 @@ "author": "syuilo", "vars": { "primary": "#fb4e4e", - "secondary": "#282C37" + "secondary": "#282C37", + "text": "#d0e0ea" } }, "primary": "$primary", "primaryForeground": "#fff", "bg": ":darken<8<$secondary", + "text": "$text", "scrollbarTrack": "#282c37", "scrollbarHandle": "#454954", "scrollbarHandleHover": "#535660", @@ -99,6 +101,9 @@ "desktopTimelineSrc": "@faceTextButton", "desktopTimelineSrcHover": "@faceTextButtonHover", "desktopWindowTitle": "@faceHeaderText", + "desktopSettingsNavItem": ":alpha<0.8<$text", + "desktopSettingsNavItemHover": ":lighten<10<$text", + "mobileSignedInAsBg": "#273c34", "mobileSignedInAsFg": "#49ab63", "mobileSignoutBg": "#652222", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index ca0dad0718..11b001ceb1 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -5,12 +5,14 @@ "author": "syuilo", "vars": { "primary": "#fb4e4e", - "secondary": "#fff" + "secondary": "#fff", + "text": "#666" } }, "primary": "$primary", "primaryForeground": "#fff", "bg": ":darken<8<$secondary", + "text": "$text", "scrollbarTrack": "#fff", "scrollbarHandle": "#00000033", "scrollbarHandleHover": "#00000066", @@ -99,6 +101,9 @@ "desktopTimelineSrc": "#6f7477", "desktopTimelineSrcHover": "#525a5f", "desktopWindowTitle": "#666", + "desktopSettingsNavItem": ":alpha<0.8<$text", + "desktopSettingsNavItemHover": ":darken<10<$text", + "mobileSignedInAsBg": "#fcfff5", "mobileSignedInAsFg": "#2c662d", "mobileSignoutBg": "#fff6f5", From 0c7111b438d8a1242008412dfa01504f2a116cd7 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 22:30:52 +0900 Subject: [PATCH 405/539] wip --- src/client/app/common/scripts/theme.ts | 4 ---- src/client/style.styl | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/client/app/common/scripts/theme.ts b/src/client/app/common/scripts/theme.ts index f27ded8685..7a1c6abb76 100644 --- a/src/client/app/common/scripts/theme.ts +++ b/src/client/app/common/scripts/theme.ts @@ -62,10 +62,6 @@ function compile(theme: Theme): { [key: string]: string } { if (k == 'meta') return; const c = getColor(v); props[k] = genValue(c); - props[`${k}-r`] = c.toRgb().r; - props[`${k}-g`] = c.toRgb().g; - props[`${k}-b`] = c.toRgb().b; - props[`${k}-a`] = c.toRgb().a; }); const primary = getColor(props['primary']); diff --git a/src/client/style.styl b/src/client/style.styl index 111e167204..8ebba2f15e 100644 --- a/src/client/style.styl +++ b/src/client/style.styl @@ -33,7 +33,7 @@ a @css { a { - tap-highlight-color: rgba(var(--primary-r), var(--primary-g), var(--primary-b), 0.7) !important; - -webkit-tap-highlight-color: rgba(var(--primary-r), var(--primary-g), var(--primary-b), 0.7) !important; + tap-highlight-color: var(--primaryAlpha07) !important; + -webkit-tap-highlight-color: var(--primaryAlpha07) !important; } } From 1e9eeeb980fc416efcda68b4020d65425c0e8e31 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 22:50:34 +0900 Subject: [PATCH 406/539] wip --- .../views/components/messaging-room.form.vue | 2 +- .../common/views/components/poll-editor.vue | 2 +- .../common/views/components/ui/form/radio.vue | 2 +- .../app/common/views/components/ui/input.vue | 10 ++++---- .../app/common/views/components/ui/radio.vue | 2 +- .../app/common/views/components/ui/select.vue | 4 ++-- .../common/views/components/ui/textarea.vue | 24 +++++++------------ .../common/views/components/url-preview.vue | 18 +++++--------- src/client/theme/dark.json | 12 +++++++++- src/client/theme/halloween.json | 1 + src/client/theme/light.json | 10 ++++++++ 11 files changed, 47 insertions(+), 40 deletions(-) diff --git a/src/client/app/common/views/components/messaging-room.form.vue b/src/client/app/common/views/components/messaging-room.form.vue index 90668aee6e..8e62587c20 100644 --- a/src/client/app/common/views/components/messaging-room.form.vue +++ b/src/client/app/common/views/components/messaging-room.form.vue @@ -209,7 +209,7 @@ root(isDark) padding 8px resize none font-size 1em - color isDark ? #fff : #000 + color var(--inputText) outline none border none border-top solid 1px isDark ? #4b5056 : #eee diff --git a/src/client/app/common/views/components/poll-editor.vue b/src/client/app/common/views/components/poll-editor.vue index 219f0a7fd5..7f52c62c23 100644 --- a/src/client/app/common/views/components/poll-editor.vue +++ b/src/client/app/common/views/components/poll-editor.vue @@ -103,7 +103,7 @@ root(isDark) padding 6px 8px width 300px font-size 14px - color isDark ? #fff : #000 + color var(--inputText) background isDark ? #191b22 : #fff border solid 1px var(--primaryAlpha01) border-radius 4px diff --git a/src/client/app/common/views/components/ui/form/radio.vue b/src/client/app/common/views/components/ui/form/radio.vue index 13cabbdc04..5728a8171b 100644 --- a/src/client/app/common/views/components/ui/form/radio.vue +++ b/src/client/app/common/views/components/ui/form/radio.vue @@ -62,7 +62,7 @@ root(isDark) &:hover > .button - border solid 2px isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54) + border solid 2px var(--inputLabel) &.disabled opacity 0.6 diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue index 98c9bf7f5a..d7b83d81cd 100644 --- a/src/client/app/common/views/components/ui/input.vue +++ b/src/client/app/common/views/components/ui/input.vue @@ -167,7 +167,7 @@ root(isDark, fill) width 24px text-align center line-height 32px - color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54) + color var(--inputLabel) &:not(:empty) + .input margin-left 28px @@ -183,7 +183,7 @@ root(isDark, fill) left 0 right 0 height 1px - background isDark ? rgba(#fff, 0.7) : rgba(#000, 0.42) + background var(--inputBorder) &:after content '' @@ -242,7 +242,7 @@ root(isDark, fill) transition-duration 0.3s font-size 16px line-height 32px - color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54) + color var(--inputLabel) pointer-events none //will-change transform transform-origin top left @@ -257,7 +257,7 @@ root(isDark, fill) font-weight fill ? bold : normal font-size 16px line-height 32px - color isDark ? #fff : #000 + color var(--inputText) background transparent border none border-radius 0 @@ -280,7 +280,7 @@ root(isDark, fill) top 0 font-size 16px line-height fill ? 44px : 32px - color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54) + color var(--inputLabel) pointer-events none &:empty diff --git a/src/client/app/common/views/components/ui/radio.vue b/src/client/app/common/views/components/ui/radio.vue index ded6b5650c..3a4407abc0 100644 --- a/src/client/app/common/views/components/ui/radio.vue +++ b/src/client/app/common/views/components/ui/radio.vue @@ -87,7 +87,7 @@ root(isDark) width 20px height 20px background none - border solid 2px isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54) + border solid 2px var(--inputLabel) border-radius 100% transition inherit diff --git a/src/client/app/common/views/components/ui/select.vue b/src/client/app/common/views/components/ui/select.vue index c32865c690..bdb730fea9 100644 --- a/src/client/app/common/views/components/ui/select.vue +++ b/src/client/app/common/views/components/ui/select.vue @@ -103,7 +103,7 @@ root(isDark, fill) left 0 right 0 height 1px - background isDark ? rgba(#fff, 0.7) : rgba(#000, 0.42) + background var(--inputBorder) &:after content '' @@ -143,7 +143,7 @@ root(isDark, fill) font-weight fill ? bold : normal font-size 16px height 32px - color isDark ? #fff : #000 + color var(--inputText) background transparent border none border-radius 0 diff --git a/src/client/app/common/views/components/ui/textarea.vue b/src/client/app/common/views/components/ui/textarea.vue index 53b7dcaf8c..67898ee059 100644 --- a/src/client/app/common/views/components/ui/textarea.vue +++ b/src/client/app/common/views/components/ui/textarea.vue @@ -63,9 +63,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark, fill) +root(fill) margin 42px 0 32px 0 > .input @@ -84,7 +82,7 @@ root(isDark, fill) left 0 right 0 background none - border solid 1px isDark ? rgba(#fff, 0.7) : rgba(#000, 0.42) + border solid 1px var(--inputBorder) border-radius 3px pointer-events none @@ -112,7 +110,7 @@ root(isDark, fill) transition-duration 0.3s font-size 16px line-height 32px - color isDark ? rgba(#fff, 0.7) : rgba(#000, 0.54) + color var(--inputLabel) pointer-events none //will-change transform transform-origin top left @@ -126,7 +124,7 @@ root(isDark, fill) font inherit font-weight fill ? bold : normal font-size 16px - color isDark ? #fff : #000 + color var(--inputText) background transparent border none border-radius 0 @@ -159,16 +157,10 @@ root(isDark, fill) left 0 !important transform scale(0.75) -.ui-textarea[data-darkmode] - &.fill - root(true, true) - &:not(.fill) - root(true, false) +.ui-textarea.fill + root(true) -.ui-textarea:not([data-darkmode]) - &.fill - root(false, true) - &:not(.fill) - root(false, false) +.ui-textarea:not(.fill) + root(false) </style> diff --git a/src/client/app/common/views/components/url-preview.vue b/src/client/app/common/views/components/url-preview.vue index f9b8415b5b..86489cf8be 100644 --- a/src/client/app/common/views/components/url-preview.vue +++ b/src/client/app/common/views/components/url-preview.vue @@ -200,17 +200,17 @@ export default Vue.extend({ top 0 width 100% -root(isDark) +.mk-url-preview > a display block font-size 14px - border solid 1px isDark ? #191b1f : #eee + border solid 1px var(--urlPreviewBorder) border-radius 4px overflow hidden &:hover text-decoration none - border-color isDark ? #4f5561 : #ddd + border-color var(--urlPreviewBorderHover) > article > header > h1 text-decoration underline @@ -235,11 +235,11 @@ root(isDark) > h1 margin 0 font-size 1em - color isDark ? #d6dae0 : #555 + color var(--urlPreviewTitle) > p margin 0 - color isDark ? #a4aab3 : #777 + color var(--urlPreviewText) font-size 0.8em > footer @@ -256,7 +256,7 @@ root(isDark) > p display inline-block margin 0 - color isDark ? #b0b4bf : #666 + color var(--urlPreviewInfo) font-size 0.8em line-height 16px vertical-align top @@ -322,10 +322,4 @@ root(isDark) width 12px height 12px -.mk-url-preview[data-darkmode] - root(true) - -.mk-url-preview:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 8962235f2f..44a8e0e568 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -6,9 +6,10 @@ "vars": { "primary": "#fb4e4e", "secondary": "#282C37", - "text": "#d0e0ea" + "text": "#d6dae0" } }, + "primary": "$primary", "primaryForeground": "#fff", "bg": ":darken<8<$secondary", @@ -54,6 +55,9 @@ "dateDividerFg": "#666b79", "switchTrack": "rgba(255, 255, 255, 0.15)", + "inputBorder": "rgba(255, 255, 255, 0.7)", + "inputLabel": "rgba(255, 255, 255, 0.7)", + "inputText": "#fff", "autocompleteItemHoverBg": "rgba(255, 255, 255, 0.1)", "autocompleteItemText": "rgba(255, 255, 255, 0.8)", @@ -65,6 +69,12 @@ "reactionPickerButtonHoverBg": "rgba(255, 255, 255, 0.18)", + "urlPreviewBorder": "rgba(0, 0, 0, 0.4)", + "urlPreviewBorderHover": "rgba(255, 255, 255, 0.2)", + "urlPreviewTitle": "$text", + "urlPreviewText": ":alpha<0.7<$text", + "urlPreviewInfo": ":alpha<0.8<$text", + "calendarWeek": "#43d5dc", "calendarSaturdayOrSunday": "#ff6679", "calendarDay": "#c5ced6", diff --git a/src/client/theme/halloween.json b/src/client/theme/halloween.json index 327d04cad6..1fc60c00ad 100644 --- a/src/client/theme/halloween.json +++ b/src/client/theme/halloween.json @@ -11,6 +11,7 @@ "text": "#b1bee3" } }, + "renoteGradient": "#5d2d1a", "renoteText": "#ff6c00", "desktopHeaderBg": "#36314e" diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 11b001ceb1..8dd4b1fe7b 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -9,6 +9,7 @@ "text": "#666" } }, + "primary": "$primary", "primaryForeground": "#fff", "bg": ":darken<8<$secondary", @@ -54,6 +55,9 @@ "dateDividerFg": "#aaa", "switchTrack": "rgba(0, 0, 0, 0.25)", + "inputBorder": "rgba(0, 0, 0, 0.42)", + "inputLabel": "rgba(0, 0, 0, 0.54)", + "inputText": "#000", "autocompleteItemHoverBg": "rgba(0, 0, 0, 0.1)", "autocompleteItemText": "rgba(0, 0, 0, 0.8)", @@ -65,6 +69,12 @@ "reactionPickerButtonHoverBg": "#eee", + "urlPreviewBorder": "rgba(0, 0, 0, 0.1)", + "urlPreviewBorderHover": "rgba(0, 0, 0, 0.2)", + "urlPreviewTitle": "$text", + "urlPreviewText": ":alpha<0.7<$text", + "urlPreviewInfo": ":alpha<0.8<$text", + "calendarWeek": "#19a2a9", "calendarSaturdayOrSunday": "#ef95a0", "calendarDay": "#777", From e82a44c03d9b17bb3a9852cccec5edbb2cf76be2 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 22:55:17 +0900 Subject: [PATCH 407/539] wip --- .../desktop/views/components/ui.header.account.vue | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/client/app/desktop/views/components/ui.header.account.vue b/src/client/app/desktop/views/components/ui.header.account.vue index 77221f81d2..a541dea121 100644 --- a/src/client/app/desktop/views/components/ui.header.account.vue +++ b/src/client/app/desktop/views/components/ui.header.account.vue @@ -127,9 +127,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.account > .header display block margin 0 @@ -217,7 +215,7 @@ root(isDark) & + ul padding-top 10px - border-top solid 1px isDark ? #1c2023 : #eee + border-top solid 1px var(--faceDivider) > li display block @@ -231,7 +229,7 @@ root(isDark) padding 0 28px margin 0 line-height 40px - color isDark ? #c8cece : #868C8C + color var(--text) cursor pointer * @@ -287,10 +285,4 @@ root(isDark) transform-origin: center -16px; } -.account[data-darkmode] - root(true) - -.account:not([data-darkmode]) - root(false) - </style> From 74be1c81b111bca81047b21083249d8be4b35ed8 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 22:59:56 +0900 Subject: [PATCH 408/539] wip --- .../common/views/components/reactions-viewer.vue | 15 ++++----------- src/client/theme/dark.json | 2 ++ src/client/theme/light.json | 2 ++ 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/client/app/common/views/components/reactions-viewer.vue b/src/client/app/common/views/components/reactions-viewer.vue index c30fa2a1dc..9212a84b31 100644 --- a/src/client/app/common/views/components/reactions-viewer.vue +++ b/src/client/app/common/views/components/reactions-viewer.vue @@ -39,10 +39,9 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) - $borderColor = isDark ? #5e6673 : #eee - border-top dashed 1px $borderColor - border-bottom dashed 1px $borderColor +.mk-reactions-viewer + border-top dashed 1px var(--reactionViewerBorder) + border-bottom dashed 1px var(--reactionViewerBorder) margin 4px 0 &:empty @@ -60,12 +59,6 @@ root(isDark) > span margin-left 4px font-size 1.2em - color isDark ? #d1d5dc : #444 - -.mk-reactions-viewer[data-darkmode] - root(true) - -.mk-reactions-viewer:not([data-darkmode]) - root(false) + color var(--text) </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 44a8e0e568..39828e364e 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -69,6 +69,8 @@ "reactionPickerButtonHoverBg": "rgba(255, 255, 255, 0.18)", + "reactionViewerBorder": "rgba(255, 255, 255, 0.1)", + "urlPreviewBorder": "rgba(0, 0, 0, 0.4)", "urlPreviewBorderHover": "rgba(255, 255, 255, 0.2)", "urlPreviewTitle": "$text", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 8dd4b1fe7b..2c45a57705 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -69,6 +69,8 @@ "reactionPickerButtonHoverBg": "#eee", + "reactionViewerBorder": "rgba(0, 0, 0, 0.1)", + "urlPreviewBorder": "rgba(0, 0, 0, 0.1)", "urlPreviewBorderHover": "rgba(0, 0, 0, 0.2)", "urlPreviewTitle": "$text", From a0305c4c040f769f1992cdd2eea70095af802365 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 23:02:59 +0900 Subject: [PATCH 409/539] wip --- src/client/app/common/views/components/instance.vue | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/client/app/common/views/components/instance.vue b/src/client/app/common/views/components/instance.vue index 14c6664eff..c3935cce0e 100644 --- a/src/client/app/common/views/components/instance.vue +++ b/src/client/app/common/views/components/instance.vue @@ -26,9 +26,9 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) - color isDark ? #fff : #5b646f - background isDark ? #21242f : #fff +.nhasjydimbopojusarffqjyktglcuxjy + color var(--text) + background var(--face) text-align center > .banner @@ -48,10 +48,4 @@ root(isDark) display block padding-bottom 16px -.nhasjydimbopojusarffqjyktglcuxjy[data-darkmode] - root(true) - -.nhasjydimbopojusarffqjyktglcuxjy:not([data-darkmode]) - root(false) - </style> From 32942709bfdb799f1ac26a087ffd4d73b558fcb5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 23:09:23 +0900 Subject: [PATCH 410/539] wip --- src/client/app/desktop/views/components/note-detail.vue | 2 +- src/client/app/desktop/views/components/notes.note.vue | 8 ++++---- .../app/desktop/views/components/sub-note-content.vue | 2 +- src/client/app/desktop/views/pages/deck/deck.note.vue | 6 +++--- src/client/app/mobile/views/components/note-detail.vue | 2 +- src/client/app/mobile/views/components/note.vue | 6 +++--- .../app/mobile/views/components/sub-note-content.vue | 2 +- src/client/theme/dark.json | 2 ++ src/client/theme/halloween.json | 1 + src/client/theme/light.json | 2 ++ 10 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index 50ad793f0b..0c4b560e98 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -365,7 +365,7 @@ export default Vue.extend({ > * padding 16px - border dashed 1px vat(--quoteBorder) + border dashed 1px var(--quoteBorder) border-radius 8px > .location diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 5daaadb971..7e4f42533f 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -447,7 +447,7 @@ root(isDark) padding 4px font-size 90% text-align center - background isDark ? #2f3944 : #eef1f3 + background var(--mfmTitleBg) border-radius 4px >>> .code @@ -461,12 +461,12 @@ root(isDark) > .reply margin-right 8px - color isDark ? #99abbf : #717171 + color var(--text) > .rp margin-left 4px font-style oblique - color #a0bf46 + color var(--renoteText) > .location margin 4px 0 @@ -491,7 +491,7 @@ root(isDark) > * padding 16px - border dashed 1px vat(--quoteBorder) + border dashed 1px var(--quoteBorder) border-radius 8px > footer diff --git a/src/client/app/desktop/views/components/sub-note-content.vue b/src/client/app/desktop/views/components/sub-note-content.vue index 6889dc231e..fd8e658056 100644 --- a/src/client/app/desktop/views/components/sub-note-content.vue +++ b/src/client/app/desktop/views/components/sub-note-content.vue @@ -38,7 +38,7 @@ export default Vue.extend({ > .rp margin-left 4px font-style oblique - color #a0bf46 + color var(--renoteText) mk-poll font-size 80% diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index bdc4368e7b..3bc4f26823 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -329,7 +329,7 @@ root(isDark) padding 4px font-size 90% text-align center - background isDark ? #2f3944 : #eef1f3 + background var(--mfmTitleBg) border-radius 4px >>> .code @@ -348,7 +348,7 @@ root(isDark) > .rp margin-left 4px font-style oblique - color #a0bf46 + color var(--renoteText) [data-is-me]:after content "you" @@ -387,7 +387,7 @@ root(isDark) > * padding 16px - border dashed 1px vat(--quoteBorder) + border dashed 1px var(--quoteBorder) border-radius 8px > .app diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index ade518b1fc..48d6d32868 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -368,7 +368,7 @@ export default Vue.extend({ > * padding 16px - border dashed 1px vat(--quoteBorder) + border dashed 1px var(--quoteBorder) border-radius 8px > .location diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index ed175b4f6f..b1c5835692 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -369,7 +369,7 @@ root(isDark) padding 4px font-size 90% text-align center - background isDark ? #2f3944 : #eef1f3 + background var(--mfmTitleBg) border-radius 4px >>> .code @@ -388,7 +388,7 @@ root(isDark) > .rp margin-left 4px font-style oblique - color #a0bf46 + color var(--renoteText) [data-is-me]:after content "you" @@ -427,7 +427,7 @@ root(isDark) > * padding 16px - border dashed 1px vat(--quoteBorder) + border dashed 1px var(--quoteBorder) border-radius 8px > .app diff --git a/src/client/app/mobile/views/components/sub-note-content.vue b/src/client/app/mobile/views/components/sub-note-content.vue index 4d0aa25f34..2238edf278 100644 --- a/src/client/app/mobile/views/components/sub-note-content.vue +++ b/src/client/app/mobile/views/components/sub-note-content.vue @@ -37,7 +37,7 @@ export default Vue.extend({ > .rp margin-left 4px font-style oblique - color #a0bf46 + color var(--renoteText) mk-poll font-size 80% diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 39828e364e..1eb41ea52e 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -91,6 +91,8 @@ "googleSearchHoverBorder": "rgba(255, 255, 255, 0.3)", "googleSearchHoverButton": "rgba(255, 255, 255, 0.1)", + "mfmTitleBg": "rgba(0, 0, 0, 0.2)", + "messagingRoomBg": "@bg", "messagingRoomInfo": "#fff", "messagingRoomDateDividerLine": "rgba(255, 255, 255, 0.1)", diff --git a/src/client/theme/halloween.json b/src/client/theme/halloween.json index 1fc60c00ad..1bd00357e2 100644 --- a/src/client/theme/halloween.json +++ b/src/client/theme/halloween.json @@ -14,5 +14,6 @@ "renoteGradient": "#5d2d1a", "renoteText": "#ff6c00", + "quoteBorder": "#c3631c", "desktopHeaderBg": "#36314e" } diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 2c45a57705..556bd24506 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -91,6 +91,8 @@ "googleSearchHoverBorder": "rgba(0, 0, 0, 0.3)", "googleSearchHoverButton": "rgba(0, 0, 0, 0.05)", + "mfmTitleBg": "rgba(0, 0, 0, 0.07)", + "messagingRoomBg": "#fff", "messagingRoomInfo": "#000", "messagingRoomDateDividerLine": "rgba(0, 0, 0, 0.1)", From 38a6aa26bc3d8fb70215474a667ad06080660cea Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 23:17:33 +0900 Subject: [PATCH 411/539] wip --- .../app/desktop/views/components/notes.note.vue | 14 +++----------- .../app/desktop/views/pages/deck/deck.note.vue | 4 ++-- src/client/app/mobile/views/components/note.vue | 4 ++-- src/client/theme/dark.json | 2 ++ src/client/theme/light.json | 2 ++ 5 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 7e4f42533f..b628d045aa 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -317,9 +317,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.note margin 0 padding 0 background var(--face) @@ -456,8 +454,8 @@ root(isDark) >>> .quote margin 8px padding 6px 12px - color isDark ? #6f808e : #aaa - border-left solid 3px isDark ? #637182 : #eee + color var(--mfmQuote) + border-left solid 3px var(--mfmQuoteLine) > .reply margin-right 8px @@ -529,12 +527,6 @@ root(isDark) padding-top 4px background rgba(#000, 0.0125) -.note[data-darkmode] - root(true) - -.note:not([data-darkmode]) - root(false) - </style> <style lang="stylus" module> diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index 3bc4f26823..c6925d5cec 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -338,8 +338,8 @@ root(isDark) >>> .quote margin 8px padding 6px 12px - color isDark ? #6f808e : #aaa - border-left solid 3px isDark ? #637182 : #eee + color var(--mfmQuote) + border-left solid 3px var(--mfmQuoteLine) > .reply margin-right 8px diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index b1c5835692..8bb9f43fab 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -378,8 +378,8 @@ root(isDark) >>> .quote margin 8px padding 6px 12px - color isDark ? #6f808e : #aaa - border-left solid 3px isDark ? #637182 : #eee + color var(--mfmQuote) + border-left solid 3px var(--mfmQuoteLine) > .reply margin-right 8px diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 1eb41ea52e..d79e348b07 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -92,6 +92,8 @@ "googleSearchHoverButton": "rgba(255, 255, 255, 0.1)", "mfmTitleBg": "rgba(0, 0, 0, 0.2)", + "mfmQuote": ":alpha<0.7<$text", + "mfmQuoteLine": ":alpha<0.6<$text", "messagingRoomBg": "@bg", "messagingRoomInfo": "#fff", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 556bd24506..7d15d49ae7 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -92,6 +92,8 @@ "googleSearchHoverButton": "rgba(0, 0, 0, 0.05)", "mfmTitleBg": "rgba(0, 0, 0, 0.07)", + "mfmQuote": ":alpha<0.6<$text", + "mfmQuoteLine": ":alpha<0.5<$text", "messagingRoomBg": "#fff", "messagingRoomInfo": "#000", From 61e5cb2041523a091ba2eb434684abc3933776df Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 27 Sep 2018 23:55:05 +0900 Subject: [PATCH 412/539] wip --- .../app/desktop/views/pages/welcome.vue | 57 ++++++------------- 1 file changed, 17 insertions(+), 40 deletions(-) diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 405fcb76d0..261642cab4 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -134,12 +134,12 @@ </article> </modal> - <modal name="signup" :class="$store.state.device.darkmode ? 'modal-dark' : 'modal-light'" width="450px" height="auto" scrollable> + <modal name="signup" class="modal" width="450px" height="auto" scrollable> <header class="formHeader">%i18n:@signup%</header> <mk-signup class="form"/> </modal> - <modal name="signin" :class="$store.state.device.darkmode ? 'modal-dark' : 'modal-light'" width="450px" height="auto" scrollable> + <modal name="signin" class="modal" width="450px" height="auto" scrollable> <header class="formHeader">%i18n:@signin%</header> <mk-signin class="form"/> </modal> @@ -226,23 +226,7 @@ export default Vue.extend({ .v--modal-overlay background rgba(0, 0, 0, 0.6) -.modal-light - .v--modal-box - color #777 - - .formHeader - border-bottom solid 1px #eee - -.modal-dark - .v--modal-box - background #313543 - color #fff - - .formHeader - border-bottom solid 1px rgba(#000, 0.2) - -.modal-light -.modal-dark +.modal .form padding 24px 48px 48px 48px @@ -252,6 +236,13 @@ export default Vue.extend({ margin 0 48px font-size 1.5em + .v--modal-box + background var(--face) + color var(--text) + + .formHeader + border-bottom solid 1px rgba(#000, 0.2) + .v--modal-overlay.about .v--modal-box.v--modal margin 32px 0 @@ -303,15 +294,9 @@ export default Vue.extend({ </style> <style lang="stylus" scoped> - - -root(isDark) +.mk-welcome display flex min-height 100vh - //background-color #00070F - //background-image url('/assets/bg.jpg') - //background-position center - //background-size cover > .banner position absolute @@ -331,7 +316,7 @@ root(isDark) left 0 width 100% height 100px - background linear-gradient(transparent, isDark ? #191b22 : #f7f7f7) + background linear-gradient(transparent, var(--bg)) > .forkit position absolute @@ -345,7 +330,7 @@ root(isDark) left 16px padding 16px font-size 18px - color isDark ? #fff : #444 + color var(--text) > main margin 0 auto @@ -354,7 +339,7 @@ root(isDark) max-width 1200px .block - color isDark ? #fff : #444 + color var(--text) background var(--face) box-shadow var(--shadow) //border-radius 8px @@ -365,9 +350,7 @@ root(isDark) padding 0 16px line-height 48px background var(--faceHeader) - - if !isDark - box-shadow 0 1px 0px rgba(0, 0, 0, 0.1) + box-shadow 0 1px 0px rgba(0, 0, 0, 0.1) & + div max-height calc(100% - 48px) @@ -406,7 +389,7 @@ root(isDark) > .stats margin-left 16px padding-left 16px - border-left solid 1px isDark ? #fff : #444 + border-left solid 1px var(--faceDivider) > * margin-right 16px @@ -449,7 +432,7 @@ root(isDark) > div padding 0 0 16px 0 margin 0 0 16px 0 - border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05) + border-bottom 1px solid var(--faceDivider) > h1 margin 0 @@ -518,10 +501,4 @@ root(isDark) display block margin 0 -.mk-welcome[data-darkmode] - root(true) - -.mk-welcome:not([data-darkmode]) - root(false) - </style> From cbf5d4b71d807e53e2252e8767364f7a7e761b34 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 00:48:17 +0900 Subject: [PATCH 413/539] wip --- package.json | 1 + .../app/desktop/views/pages/welcome.vue | 8 +- src/client/assets/title.light.svg | 140 ------------------ .../assets/{title.dark.svg => title.svg} | 16 +- webpack.config.ts | 2 + 5 files changed, 16 insertions(+), 151 deletions(-) delete mode 100644 src/client/assets/title.light.svg rename src/client/assets/{title.dark.svg => title.svg} (92%) diff --git a/package.json b/package.json index a3e3b56be4..347e9d0c24 100644 --- a/package.json +++ b/package.json @@ -214,6 +214,7 @@ "vue-loader": "15.4.2", "vue-router": "3.0.1", "vue-style-loader": "4.1.2", + "vue-svg-inline-loader": "1.1.3", "vue-template-compiler": "2.5.17", "vuedraggable": "2.16.0", "vuewordcloud": "18.7.11", diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index 261642cab4..f8f49bf997 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -14,7 +14,7 @@ <div class="main block"> <div> <h1 v-if="name != 'Misskey'">{{ name }}</h1> - <h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1> + <h1 v-else><img svg-inline src="../../../../assets/title.svg" :alt="name"></h1> <div class="info"> <span><b>{{ host }}</b> - <span v-html="'%i18n:@powered-by-misskey%'"></span></span> @@ -377,9 +377,11 @@ export default Vue.extend({ > h1 margin 0 - > img + > svg margin -8px 0 0 -16px - max-width 280px + width 280px + height 100px + fill currentColor > .info margin 0 auto 16px auto diff --git a/src/client/assets/title.light.svg b/src/client/assets/title.light.svg deleted file mode 100644 index 95ad11c399..0000000000 --- a/src/client/assets/title.light.svg +++ /dev/null @@ -1,140 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="614.71039" - height="205.08009" - viewBox="0 0 162.64213 54.260776" - version="1.1" - id="svg8" - inkscape:version="0.92.1 r15371" - sodipodi:docname="misskey.svg" - inkscape:export-filename="C:\Users\Takumiya_Cho\Desktop\misskey.png" - inkscape:export-xdpi="96" - inkscape:export-ydpi="96"> - <defs - id="defs2"> - <inkscape:path-effect - effect="simplify" - id="path-effect5115" - is_visible="true" - steps="1" - threshold="0.000408163" - smooth_angles="360" - helper_size="0" - simplify_individual_paths="false" - simplify_just_coalesce="false" - simplifyindividualpaths="false" - simplifyJustCoalesce="false" /> - <inkscape:path-effect - effect="simplify" - id="path-effect5104" - is_visible="true" - steps="1" - threshold="0.000408163" - smooth_angles="360" - helper_size="0" - simplify_individual_paths="false" - simplify_just_coalesce="false" - simplifyindividualpaths="false" - simplifyJustCoalesce="false" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.9899495" - inkscape:cx="370.82839" - inkscape:cy="79.043895" - inkscape:document-units="mm" - inkscape:current-layer="layer1" - showgrid="false" - units="px" - inkscape:snap-bbox="true" - inkscape:bbox-nodes="true" - inkscape:snap-bbox-edge-midpoints="false" - inkscape:snap-smooth-nodes="true" - inkscape:snap-center="true" - inkscape:snap-page="true" - inkscape:window-width="1920" - inkscape:window-height="1017" - inkscape:window-x="-8" - inkscape:window-y="1072" - inkscape:window-maximized="1" - inkscape:object-paths="true" - inkscape:bbox-paths="true" - fit-margin-top="50" - fit-margin-left="50" - fit-margin-bottom="20" - fit-margin-right="50" /> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="レイヤー 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-11.097531,-173.29664)"> - <g - transform="matrix(0.28612302,0,0,0.28612302,17.176981,141.74334)" - id="text4489-6" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#212d3a;fill-opacity:1;stroke:none;stroke-width:0.92471898px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - aria-label="Mi"> - <path - sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz" - inkscape:connector-curvature="0" - id="path5210" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#212d3a;fill-opacity:1;stroke-width:0.92471898px" - d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" /> - <path - inkscape:connector-curvature="0" - id="path5212" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#212d3a;fill-opacity:1;stroke-width:0.92471898px" - d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" /> - </g> - <path - inkscape:connector-curvature="0" - id="path5199" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#212d3a;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 72.022691,200.53715 q 0.968125,0.24203 2.420312,0.5244 2.420313,0.40339 3.791824,1.29083 2.581666,1.69422 2.581666,5.08266 0,2.74302 -1.815234,4.47758 -2.097604,2.01693 -5.849089,2.01693 -2.743021,0 -6.131458,-0.76644 -1.089141,-0.24203 -1.774896,-1.08914 -0.645417,-0.84711 -0.645417,-1.89591 0,-1.29083 0.887448,-2.17828 0.927786,-0.92779 2.178281,-0.92779 0.363047,0 0.685756,0.0807 1.169817,0.24203 4.477578,0.60508 0.443724,0 0.968125,-0.0403 0.201693,0 0.201693,-0.24203 0.04034,-0.20169 -0.242032,-0.28237 -1.37151,-0.24203 -2.541328,-0.5244 -1.331172,-0.28237 -1.895911,-0.48406 -1.12948,-0.32271 -1.895912,-0.84711 -2.581667,-1.69422 -2.622005,-5.08266 0,-2.70268 1.855573,-4.47758 2.258958,-2.17828 6.413828,-1.97659 2.783359,0.12102 5.566719,0.7261 1.048802,0.24203 1.734557,1.08914 0.685756,0.84711 0.685756,1.93625 0,1.25049 -0.927787,2.17828 -0.887448,0.88745 -2.178281,0.88745 -0.322709,0 -0.645417,-0.0807 -1.169818,-0.24203 -4.517917,-0.56474 -0.403385,-0.0403 -0.766432,0 -0.322708,0.0403 -0.322708,0.24203 0.04034,0.24203 0.322708,0.32271 z" /> - <path - inkscape:connector-curvature="0" - id="path5201" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#212d3a;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 89.577027,200.53715 q 0.968125,0.24203 2.420312,0.5244 2.420313,0.40339 3.791823,1.29083 2.581667,1.69422 2.581667,5.08266 0,2.74302 -1.815234,4.47758 -2.097604,2.01693 -5.849089,2.01693 -2.743021,0 -6.131458,-0.76644 -1.089141,-0.24203 -1.774896,-1.08914 -0.645417,-0.84711 -0.645417,-1.89591 0,-1.29083 0.887448,-2.17828 0.927786,-0.92779 2.178281,-0.92779 0.363047,0 0.685755,0.0807 1.169818,0.24203 4.477579,0.60508 0.443724,0 0.968125,-0.0403 0.201692,0 0.201692,-0.24203 0.04034,-0.20169 -0.242031,-0.28237 -1.37151,-0.24203 -2.541328,-0.5244 -1.331172,-0.28237 -1.895912,-0.48406 -1.129479,-0.32271 -1.895911,-0.84711 -2.581667,-1.69422 -2.622005,-5.08266 0,-2.70268 1.855573,-4.47758 2.258958,-2.17828 6.413828,-1.97659 2.783359,0.12102 5.566719,0.7261 1.048802,0.24203 1.734557,1.08914 0.685755,0.84711 0.685755,1.93625 0,1.25049 -0.927786,2.17828 -0.887448,0.88745 -2.178281,0.88745 -0.322709,0 -0.645417,-0.0807 -1.169818,-0.24203 -4.517917,-0.56474 -0.403385,-0.0403 -0.766432,0 -0.322708,0.0403 -0.322708,0.24203 0.04034,0.24203 0.322708,0.32271 z" /> - <path - inkscape:connector-curvature="0" - id="path5203" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#212d3a;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 115.65209,203.87137 q 0.12101,0.0807 2.86404,2.78336 1.25049,1.21016 1.25049,2.94471 0,1.61354 -1.16982,2.86404 -1.16982,1.21016 -2.90437,1.21016 -1.65388,0 -2.86404,-1.16982 l -4.03385,-3.91284 q -0.16136,-0.12102 -0.32271,-0.12102 -0.32271,0 -0.32271,1.21016 0,1.69422 -1.21016,2.90438 -1.21015,1.16981 -2.90437,1.16981 -1.69422,0 -2.90438,-1.16981 -1.169807,-1.21016 -1.169807,-2.90438 v -18.79776 q 0,-1.69422 1.169807,-2.86404 1.21016,-1.21015 2.90438,-1.21015 1.69422,0 2.90437,1.21015 1.21016,1.16982 1.21016,2.86404 v 6.29281 q 0,0.40339 0.28237,0.5244 0.24203,0.12102 0.5244,-0.0807 0.16135,-0.0807 4.84063,-3.18675 1.0488,-0.64542 2.25895,-0.64542 2.21862,0 3.42878,1.81524 0.64542,1.0488 0.64542,2.25896 0,2.21862 -1.81524,3.42877 l -2.54133,1.61354 v 0.0403 l -0.0807,0.0403 q -0.56474,0.36305 -0.0403,0.88745 z" /> - <path - inkscape:connector-curvature="0" - id="path5205" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#212d3a;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 131.25181,213.92955 q -4.19521,0 -7.18026,-2.94472 -2.94472,-2.98505 -2.94472,-7.18026 0,-4.15487 2.94472,-7.09958 2.98505,-2.98505 7.18026,-2.98505 4.15487,0 6.97857,2.78335 0.92778,0.92779 0.92778,2.25896 0,1.33118 -0.92778,2.25896 l -4.67928,4.63893 q -1.00846,1.00847 -2.01692,1.00847 -1.45219,0 -2.25896,-0.80677 -0.80677,-0.80677 -0.80677,-2.13795 0,-1.29083 0.92778,-2.21862 l 0.80678,-0.84711 q 0.16135,-0.12101 0.0807,-0.24203 -0.12101,-0.0807 -0.32271,-0.0403 -0.80677,0.20169 -1.37151,0.80677 -1.12948,1.08914 -1.12948,2.622 0,1.5732 1.08915,2.70268 1.12947,1.08914 2.70268,1.08914 1.53286,0 2.622,-1.12947 0.92779,-0.92779 2.25896,-0.92779 1.33117,0 2.25896,0.92779 0.92779,0.92778 0.92779,2.25895 0,1.33118 -0.92779,2.25896 -2.98505,2.94472 -7.13992,2.94472 z" /> - <path - inkscape:connector-curvature="0" - id="path5207" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#212d3a;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 160.51049,198.1433 v 5.60705 q 0,0.56474 -0.0807,1.21016 v 7.38195 q 0,4.51792 -2.74302,7.2206 -2.70268,2.70269 -7.30128,2.70269 -2.66234,0 -4.80028,-1.00847 -2.13795,-0.96812 -2.13795,-3.3481 0,-0.80677 0.36305,-1.53286 0.96812,-2.17828 3.3481,-2.17828 0.56474,0 1.5732,0.32271 1.00847,0.3227 1.65388,0.3227 1.69422,0 2.21862,-0.72609 0.20169,-0.28237 0.0807,-0.44372 -0.16136,-0.24204 -0.56474,-0.16136 -0.68576,0.12102 -1.49253,0.12102 -4.07419,0 -6.97856,-2.90438 -2.90438,-2.90437 -2.90438,-6.97857 v -5.60705 q 0,-1.69422 1.16982,-2.86404 1.21015,-1.21016 2.90437,-1.21016 1.69422,0 2.90438,1.21016 1.21015,1.16982 1.21015,2.86404 v 5.60705 q 0,0.68576 0.48407,1.21016 0.5244,0.48406 1.21015,0.48406 0.7261,0 1.21016,-0.48406 0.48406,-0.5244 0.48406,-1.21016 v -5.60705 q 0,-1.69422 1.21016,-2.86404 1.21015,-1.21016 2.90437,-1.21016 1.69422,0 2.86404,1.21016 1.21016,1.16982 1.21016,2.86404 z" /> - </g> -</svg> diff --git a/src/client/assets/title.dark.svg b/src/client/assets/title.svg similarity index 92% rename from src/client/assets/title.dark.svg rename to src/client/assets/title.svg index 10139024ad..0e4e0b8b3b 100644 --- a/src/client/assets/title.dark.svg +++ b/src/client/assets/title.svg @@ -97,44 +97,44 @@ <g transform="matrix(0.28612302,0,0,0.28612302,17.176981,141.74334)" id="text4489-6" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#fff;fill-opacity:1;stroke:none;stroke-width:0.92471898px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill-opacity:1;stroke:none;stroke-width:0.92471898px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" aria-label="Mi"> <path sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz" inkscape:connector-curvature="0" id="path5210" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#fff;fill-opacity:1;stroke-width:0.92471898px" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill-opacity:1;stroke-width:0.92471898px" d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" /> <path inkscape:connector-curvature="0" id="path5212" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#fff;fill-opacity:1;stroke-width:0.92471898px" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill-opacity:1;stroke-width:0.92471898px" d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" /> </g> <path inkscape:connector-curvature="0" id="path5199" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#fff;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="m 72.022691,200.53715 q 0.968125,0.24203 2.420312,0.5244 2.420313,0.40339 3.791824,1.29083 2.581666,1.69422 2.581666,5.08266 0,2.74302 -1.815234,4.47758 -2.097604,2.01693 -5.849089,2.01693 -2.743021,0 -6.131458,-0.76644 -1.089141,-0.24203 -1.774896,-1.08914 -0.645417,-0.84711 -0.645417,-1.89591 0,-1.29083 0.887448,-2.17828 0.927786,-0.92779 2.178281,-0.92779 0.363047,0 0.685756,0.0807 1.169817,0.24203 4.477578,0.60508 0.443724,0 0.968125,-0.0403 0.201693,0 0.201693,-0.24203 0.04034,-0.20169 -0.242032,-0.28237 -1.37151,-0.24203 -2.541328,-0.5244 -1.331172,-0.28237 -1.895911,-0.48406 -1.12948,-0.32271 -1.895912,-0.84711 -2.581667,-1.69422 -2.622005,-5.08266 0,-2.70268 1.855573,-4.47758 2.258958,-2.17828 6.413828,-1.97659 2.783359,0.12102 5.566719,0.7261 1.048802,0.24203 1.734557,1.08914 0.685756,0.84711 0.685756,1.93625 0,1.25049 -0.927787,2.17828 -0.887448,0.88745 -2.178281,0.88745 -0.322709,0 -0.645417,-0.0807 -1.169818,-0.24203 -4.517917,-0.56474 -0.403385,-0.0403 -0.766432,0 -0.322708,0.0403 -0.322708,0.24203 0.04034,0.24203 0.322708,0.32271 z" /> <path inkscape:connector-curvature="0" id="path5201" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#fff;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="m 89.577027,200.53715 q 0.968125,0.24203 2.420312,0.5244 2.420313,0.40339 3.791823,1.29083 2.581667,1.69422 2.581667,5.08266 0,2.74302 -1.815234,4.47758 -2.097604,2.01693 -5.849089,2.01693 -2.743021,0 -6.131458,-0.76644 -1.089141,-0.24203 -1.774896,-1.08914 -0.645417,-0.84711 -0.645417,-1.89591 0,-1.29083 0.887448,-2.17828 0.927786,-0.92779 2.178281,-0.92779 0.363047,0 0.685755,0.0807 1.169818,0.24203 4.477579,0.60508 0.443724,0 0.968125,-0.0403 0.201692,0 0.201692,-0.24203 0.04034,-0.20169 -0.242031,-0.28237 -1.37151,-0.24203 -2.541328,-0.5244 -1.331172,-0.28237 -1.895912,-0.48406 -1.129479,-0.32271 -1.895911,-0.84711 -2.581667,-1.69422 -2.622005,-5.08266 0,-2.70268 1.855573,-4.47758 2.258958,-2.17828 6.413828,-1.97659 2.783359,0.12102 5.566719,0.7261 1.048802,0.24203 1.734557,1.08914 0.685755,0.84711 0.685755,1.93625 0,1.25049 -0.927786,2.17828 -0.887448,0.88745 -2.178281,0.88745 -0.322709,0 -0.645417,-0.0807 -1.169818,-0.24203 -4.517917,-0.56474 -0.403385,-0.0403 -0.766432,0 -0.322708,0.0403 -0.322708,0.24203 0.04034,0.24203 0.322708,0.32271 z" /> <path inkscape:connector-curvature="0" id="path5203" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#fff;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="m 115.65209,203.87137 q 0.12101,0.0807 2.86404,2.78336 1.25049,1.21016 1.25049,2.94471 0,1.61354 -1.16982,2.86404 -1.16982,1.21016 -2.90437,1.21016 -1.65388,0 -2.86404,-1.16982 l -4.03385,-3.91284 q -0.16136,-0.12102 -0.32271,-0.12102 -0.32271,0 -0.32271,1.21016 0,1.69422 -1.21016,2.90438 -1.21015,1.16981 -2.90437,1.16981 -1.69422,0 -2.90438,-1.16981 -1.169807,-1.21016 -1.169807,-2.90438 v -18.79776 q 0,-1.69422 1.169807,-2.86404 1.21016,-1.21015 2.90438,-1.21015 1.69422,0 2.90437,1.21015 1.21016,1.16982 1.21016,2.86404 v 6.29281 q 0,0.40339 0.28237,0.5244 0.24203,0.12102 0.5244,-0.0807 0.16135,-0.0807 4.84063,-3.18675 1.0488,-0.64542 2.25895,-0.64542 2.21862,0 3.42878,1.81524 0.64542,1.0488 0.64542,2.25896 0,2.21862 -1.81524,3.42877 l -2.54133,1.61354 v 0.0403 l -0.0807,0.0403 q -0.56474,0.36305 -0.0403,0.88745 z" /> <path inkscape:connector-curvature="0" id="path5205" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#fff;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="m 131.25181,213.92955 q -4.19521,0 -7.18026,-2.94472 -2.94472,-2.98505 -2.94472,-7.18026 0,-4.15487 2.94472,-7.09958 2.98505,-2.98505 7.18026,-2.98505 4.15487,0 6.97857,2.78335 0.92778,0.92779 0.92778,2.25896 0,1.33118 -0.92778,2.25896 l -4.67928,4.63893 q -1.00846,1.00847 -2.01692,1.00847 -1.45219,0 -2.25896,-0.80677 -0.80677,-0.80677 -0.80677,-2.13795 0,-1.29083 0.92778,-2.21862 l 0.80678,-0.84711 q 0.16135,-0.12101 0.0807,-0.24203 -0.12101,-0.0807 -0.32271,-0.0403 -0.80677,0.20169 -1.37151,0.80677 -1.12948,1.08914 -1.12948,2.622 0,1.5732 1.08915,2.70268 1.12947,1.08914 2.70268,1.08914 1.53286,0 2.622,-1.12947 0.92779,-0.92779 2.25896,-0.92779 1.33117,0 2.25896,0.92779 0.92779,0.92778 0.92779,2.25895 0,1.33118 -0.92779,2.25896 -2.98505,2.94472 -7.13992,2.94472 z" /> <path inkscape:connector-curvature="0" id="path5207" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#fff;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:136.34428406px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill-opacity:1;stroke:none;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="m 160.51049,198.1433 v 5.60705 q 0,0.56474 -0.0807,1.21016 v 7.38195 q 0,4.51792 -2.74302,7.2206 -2.70268,2.70269 -7.30128,2.70269 -2.66234,0 -4.80028,-1.00847 -2.13795,-0.96812 -2.13795,-3.3481 0,-0.80677 0.36305,-1.53286 0.96812,-2.17828 3.3481,-2.17828 0.56474,0 1.5732,0.32271 1.00847,0.3227 1.65388,0.3227 1.69422,0 2.21862,-0.72609 0.20169,-0.28237 0.0807,-0.44372 -0.16136,-0.24204 -0.56474,-0.16136 -0.68576,0.12102 -1.49253,0.12102 -4.07419,0 -6.97856,-2.90438 -2.90438,-2.90437 -2.90438,-6.97857 v -5.60705 q 0,-1.69422 1.16982,-2.86404 1.21015,-1.21016 2.90437,-1.21016 1.69422,0 2.90438,1.21016 1.21015,1.16982 1.21015,2.86404 v 5.60705 q 0,0.68576 0.48407,1.21016 0.5244,0.48406 1.21015,0.48406 0.7261,0 1.21016,-0.48406 0.48406,-0.5244 0.48406,-1.21016 v -5.60705 q 0,-1.69422 1.21016,-2.86404 1.21015,-1.21016 2.90437,-1.21016 1.69422,0 2.86404,1.21016 1.21016,1.16982 1.21016,2.86404 z" /> </g> </svg> diff --git a/webpack.config.ts b/webpack.config.ts index 3822080574..3b14ee4a8a 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -134,6 +134,8 @@ module.exports = { preserveWhitespace: false } } + }, { + loader: 'vue-svg-inline-loader' }, { loader: 'replace', query: { From f4bf824e79af6d8d7fb8fbb33f600f5ddb322a03 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 00:51:17 +0900 Subject: [PATCH 414/539] wip --- src/client/app/desktop/views/pages/welcome.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/app/desktop/views/pages/welcome.vue b/src/client/app/desktop/views/pages/welcome.vue index f8f49bf997..65651f7ffc 100644 --- a/src/client/app/desktop/views/pages/welcome.vue +++ b/src/client/app/desktop/views/pages/welcome.vue @@ -95,7 +95,7 @@ </div> </main> - <modal name="about" :class="$store.state.device.darkmode ? ['about', 'modal-dark'] : ['about', 'modal-light']" width="800px" height="auto" scrollable> + <modal name="about" class="about modal" width="800px" height="auto" scrollable> <article class="fpdezooorhntlzyeszemrsqdlgbysvxq"> <h1>%i18n:common.intro.title%</h1> <p v-html="'%i18n:common.intro.about%'"></p> @@ -258,7 +258,7 @@ export default Vue.extend({ > section > h2 - border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05) + border-bottom 1px solid var(--faceDivider) > section display grid @@ -267,7 +267,7 @@ export default Vue.extend({ gap 32px margin-bottom 32px padding-bottom 32px - border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05) + border-bottom 1px solid var(--faceDivider) &:nth-child(odd) grid-template-columns 1fr 180px From d1dce76e2814012f7350563f23834c77d6da18ad Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 01:05:09 +0900 Subject: [PATCH 415/539] wip --- src/client/app/mobile/style.styl | 10 +----- .../app/mobile/views/components/ui.nav.vue | 4 +-- src/client/app/mobile/views/pages/welcome.vue | 31 ++++++++++--------- src/client/theme/dark.json | 2 ++ src/client/theme/light.json | 2 ++ 5 files changed, 23 insertions(+), 26 deletions(-) diff --git a/src/client/app/mobile/style.styl b/src/client/app/mobile/style.styl index df8f4a8fae..095e5266fd 100644 --- a/src/client/app/mobile/style.styl +++ b/src/client/app/mobile/style.styl @@ -8,12 +8,4 @@ html height 100% - background #ececed !important - - &[data-darkmode] - background #191B22 !important - -body - display flex - flex-direction column - min-height 100% + background var(--bg) diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue index 29dcf18021..a84dc7349a 100644 --- a/src/client/app/mobile/views/components/ui.nav.vue +++ b/src/client/app/mobile/views/components/ui.nav.vue @@ -226,8 +226,8 @@ root(isDark) .announcements > article - background isDark ? rgba(30, 129, 216, 0.2) : rgba(155, 196, 232, 0.2) - color isDark ? #fff : #3f4967 + background var(--mobileAnnouncement) + color var(--mobileAnnouncementFg) padding 16px margin 8px 0 font-size 12px diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue index 82ccfeaff5..4e24f70ffc 100644 --- a/src/client/app/mobile/views/pages/welcome.vue +++ b/src/client/app/mobile/views/pages/welcome.vue @@ -3,7 +3,7 @@ <div class="banner" :style="{ backgroundImage: banner ? `url(${banner})` : null }"></div> <div> - <img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"> + <img svg-inline src="../../../../assets/title.svg" :alt="name"> <p class="host">{{ host }}</p> <div class="about"> <h2>{{ name }}</h2> @@ -144,16 +144,17 @@ root(isDark) left 0 width 100% height 100px - background linear-gradient(transparent, isDark ? #191b22 : #f7f7f7) + background linear-gradient(transparent, var(--bg)) > div:not(.banner) padding 32px margin 0 auto max-width 500px - > img + > svg display block - max-width 200px + width 200px + height 50px margin 0 auto > .host @@ -169,8 +170,8 @@ root(isDark) > .about margin-top 16px padding 16px - color #555 - background #fff + color var(--text) + background var(--face) border-radius 6px > h2 @@ -238,7 +239,7 @@ root(isDark) margin 16px 0 padding 8px font-size 14px - color #444 + color var(--text) background rgba(#000, 0.1) border-radius 6px @@ -249,9 +250,9 @@ root(isDark) margin 16px 0 > article - background isDark ? rgba(30, 129, 216, 0.2) : rgba(155, 196, 232, 0.2) + background var(--mobileAnnouncement) border-radius 6px - color isDark ? #fff : #3f4967 + color var(--mobileAnnouncementFg) padding 16px margin 8px 0 font-size 12px @@ -263,10 +264,10 @@ root(isDark) margin 16px 0 padding 32px font-size 14px - background #fff + background var(--face) border-radius 6px overflow hidden - color #3a3e46 + color var(--text) > h1 margin 0 @@ -279,12 +280,12 @@ root(isDark) > section > h2 - border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05) + border-bottom 1px solid var(--faceDivider) > section margin-bottom 16px padding-bottom 16px - border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05) + border-bottom 1px solid var(--faceDivider) > h3 margin-bottom 8px @@ -301,7 +302,7 @@ root(isDark) > .info padding 16px 0 - border solid 2px #ddd + border solid 2px rgba(0, 0, 0, 0.1) border-radius 8px > * @@ -309,7 +310,7 @@ root(isDark) > footer text-align center - color #444 + color var(--text) > small display block diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index d79e348b07..3074eb22ae 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -120,6 +120,8 @@ "desktopSettingsNavItem": ":alpha<0.8<$text", "desktopSettingsNavItemHover": ":lighten<10<$text", + "mobileAnnouncement": "rgba(30, 129, 216, 0.2)", + "mobileAnnouncementFg": "#fff", "mobileSignedInAsBg": "#273c34", "mobileSignedInAsFg": "#49ab63", "mobileSignoutBg": "#652222", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 7d15d49ae7..9f41ee8f22 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -120,6 +120,8 @@ "desktopSettingsNavItem": ":alpha<0.8<$text", "desktopSettingsNavItemHover": ":darken<10<$text", + "mobileAnnouncement": "rgba(155, 196, 232, 0.2)", + "mobileAnnouncementFg": "#3f4967", "mobileSignedInAsBg": "#fcfff5", "mobileSignedInAsFg": "#2c662d", "mobileSignoutBg": "#fff6f5", From 9ea7de3564caa063ee9549ae808ea731379e2516 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 10:14:58 +0900 Subject: [PATCH 416/539] wip --- .../app/common/views/components/media-banner.vue | 9 ++------- .../common/views/components/welcome-timeline.vue | 16 +++++----------- src/client/theme/dark.json | 11 +++++++---- src/client/theme/halloween.json | 3 +-- src/client/theme/light.json | 11 +++++++---- 5 files changed, 22 insertions(+), 28 deletions(-) diff --git a/src/client/app/common/views/components/media-banner.vue b/src/client/app/common/views/components/media-banner.vue index 211dbf0208..0f5981d3c4 100644 --- a/src/client/app/common/views/components/media-banner.vue +++ b/src/client/app/common/views/components/media-banner.vue @@ -43,7 +43,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.mk-media-banner width 100% border-radius 4px margin-top 4px @@ -71,7 +71,7 @@ root(isDark) font-size 1.6em > .download - background isDark ? #21242d : #f7f7f7 + background var(--noteAttachedFile) > .sensitive background #111 @@ -82,9 +82,4 @@ root(isDark) display block width 100% -.mk-media-banner[data-darkmode] - root(true) - -.mk-media-banner:not([data-darkmode]) - root(false) </style> diff --git a/src/client/app/common/views/components/welcome-timeline.vue b/src/client/app/common/views/components/welcome-timeline.vue index ca1b6eb928..6934fb4856 100644 --- a/src/client/app/common/views/components/welcome-timeline.vue +++ b/src/client/app/common/views/components/welcome-timeline.vue @@ -90,7 +90,7 @@ export default Vue.extend({ opacity 0 transform translateY(-30px) -root(isDark) +.mk-welcome-timeline background var(--face) > div @@ -101,8 +101,8 @@ root(isDark) padding 16px overflow-wrap break-word font-size .9em - color isDark ? #fff : #4C4C4C - border-bottom 1px solid isDark ? rgba(#000, 0.1) : rgba(#000, 0.05) + color var(--noteText) + border-bottom 1px solid var(--faceDivider) &:after content "" @@ -141,22 +141,16 @@ root(isDark) > .username margin 0 .5em 0 0 - color isDark ? #606984 : #ccc + color var(--noteHeaderAcct) > .info margin-left auto font-size 0.9em > .created-at - color isDark ? #606984 : #c0c0c0 + color var(--noteHeaderInfo) > .text text-align left -.mk-welcome-timeline[data-darkmode] - root(true) - -.mk-welcome-timeline:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 3074eb22ae..498c9ecdd9 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -29,6 +29,7 @@ "faceClearButtonActive": "rgba(0, 0, 0, 0.2)", "popupBg": ":lighten<5<$secondary", "popupFg": "#d6dce2", + "subNoteBg": "rgba(0, 0, 0, 0.18)", "renoteGradient": "#314027", "renoteText": "#9dbb00", @@ -49,10 +50,12 @@ "noteActionsReactionHover": "#fa0", "noteActionsHighlighted": "#707b97", + "noteAttachedFile": "rgba(255, 255, 255, 0.1)", + "modalBackdrop": "rgba(0, 0, 0, 0.5)", - "dateDividerBg": "#242731", - "dateDividerFg": "#666b79", + "dateDividerBg": ":darken<2<$secondary", + "dateDividerFg": ":alpha<0.7<$text", "switchTrack": "rgba(255, 255, 255, 0.15)", "inputBorder": "rgba(255, 255, 255, 0.7)", @@ -103,8 +106,8 @@ "messagingRoomMessageBg": "$secondary", "messagingRoomMessageFg": "#fff", - "desktopHeaderBg": "#313543", - "desktopHeaderFg": "#b8c5ca", + "desktopHeaderBg": ":lighten<5<$secondary", + "desktopHeaderFg": "$text", "desktopHeaderHoverFg": "#fff", "desktopHeaderIcon": "url('/assets/desktop/header-icon.dark.svg')", "desktopHeaderSearchBg": "rgba(0, 0, 0, 0.1)", diff --git a/src/client/theme/halloween.json b/src/client/theme/halloween.json index 1bd00357e2..6e92db95ff 100644 --- a/src/client/theme/halloween.json +++ b/src/client/theme/halloween.json @@ -14,6 +14,5 @@ "renoteGradient": "#5d2d1a", "renoteText": "#ff6c00", - "quoteBorder": "#c3631c", - "desktopHeaderBg": "#36314e" + "quoteBorder": "#c3631c" } diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 9f41ee8f22..d05ee995f6 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -29,6 +29,7 @@ "faceClearButtonActive": "rgba(0, 0, 0, 0.05)", "popupBg": ":lighten<5<$secondary", "popupFg": "#586069", + "subNoteBg": "rgba(0, 0, 0, 0.01)", "renoteGradient": "#edfde2", "renoteText": "#9dbb00", @@ -49,10 +50,12 @@ "noteActionsReactionHover": "#fa0", "noteActionsHighlighted": "#888", + "noteAttachedFile": "rgba(0, 0, 0, 0.05)", + "modalBackdrop": "rgba(0, 0, 0, 0.1)", - "dateDividerBg": "#fdfdfd", - "dateDividerFg": "#aaa", + "dateDividerBg": ":darken<2<$secondary", + "dateDividerFg": ":alpha<0.7<$text", "switchTrack": "rgba(0, 0, 0, 0.25)", "inputBorder": "rgba(0, 0, 0, 0.42)", @@ -103,8 +106,8 @@ "messagingRoomMessageBg": "#eee", "messagingRoomMessageFg": "#333", - "desktopHeaderBg": "#f7f7f7", - "desktopHeaderFg": "#9eaba8", + "desktopHeaderBg": ":lighten<5<$secondary", + "desktopHeaderFg": "$text", "desktopHeaderHoverFg": "#7b8c88", "desktopHeaderIcon": "url('/assets/desktop/header-icon.light.svg')", "desktopHeaderSearchBg": "rgba(0, 0, 0, 0.05)", From 18be0d36f34138b0a60c39609a649b98367e1356 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 10:50:59 +0900 Subject: [PATCH 417/539] wip --- src/client/theme/dark.json | 8 +++++--- src/client/theme/light.json | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 498c9ecdd9..8a39648037 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -14,9 +14,11 @@ "primaryForeground": "#fff", "bg": ":darken<8<$secondary", "text": "$text", - "scrollbarTrack": "#282c37", - "scrollbarHandle": "#454954", - "scrollbarHandleHover": "#535660", + + "scrollbarTrack": ":darken<5<$secondary", + "scrollbarHandle": ":lighten<5<$secondary", + "scrollbarHandleHover": ":lighten<10<$secondary", + "face": "$secondary", "faceText": "#fff", "faceHeader": ":lighten<5<$secondary", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index d05ee995f6..f5003ae2ec 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -14,9 +14,11 @@ "primaryForeground": "#fff", "bg": ":darken<8<$secondary", "text": "$text", + "scrollbarTrack": "#fff", "scrollbarHandle": "#00000033", "scrollbarHandleHover": "#00000066", + "face": "$secondary", "faceText": "#444", "faceHeader": ":lighten<5<$secondary", From fccfe19e13db9b7e22829193d3ebd2bb3cad3453 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 11:18:56 +0900 Subject: [PATCH 418/539] wip --- src/client/app/common/views/widgets/nav.vue | 14 +++----- .../common/views/widgets/posts-monitor.vue | 10 ++---- src/client/app/common/views/widgets/rss.vue | 16 +++------ .../views/widgets/server.cpu-memory.vue | 10 ++---- .../views/pages/admin/admin.cpu-memory.vue | 2 +- src/client/app/mobile/views/pages/user.vue | 34 +++++++------------ src/client/theme/dark.json | 9 +++++ src/client/theme/light.json | 9 +++++ 8 files changed, 45 insertions(+), 59 deletions(-) diff --git a/src/client/app/common/views/widgets/nav.vue b/src/client/app/common/views/widgets/nav.vue index 04dfe97c72..12003db3f2 100644 --- a/src/client/app/common/views/widgets/nav.vue +++ b/src/client/app/common/views/widgets/nav.vue @@ -16,23 +16,17 @@ export default define({ </script> <style lang="stylus" scoped> -root(isDark) +.mkw-nav .mkw-nav--body padding 16px font-size 12px - color isDark ? #9aa4b3 : #aaa + color var(--text) background var(--face) a - color isDark ? #9aa4b3 : #999 + color var(--text) i - color isDark ? #9aa4b3 : #ccc - -.mkw-nav[data-darkmode] - root(true) - -.mkw-nav:not([data-darkmode]) - root(false) + color var(--text) </style> diff --git a/src/client/app/common/views/widgets/posts-monitor.vue b/src/client/app/common/views/widgets/posts-monitor.vue index 801307be54..09f766696b 100644 --- a/src/client/app/common/views/widgets/posts-monitor.vue +++ b/src/client/app/common/views/widgets/posts-monitor.vue @@ -173,7 +173,7 @@ export default define({ </script> <style lang="stylus" scoped> -root(isDark) +.qpdmibaztplkylerhdbllwcokyrfxeyj &.dual > svg width 50% @@ -192,7 +192,7 @@ root(isDark) > text font-size 5px - fill isDark ? rgba(#fff, 0.55) : rgba(#000, 0.55) + fill var(--chartCaption) > tspan opacity 0.5 @@ -202,10 +202,4 @@ root(isDark) display block clear both -.qpdmibaztplkylerhdbllwcokyrfxeyj[data-darkmode] - root(true) - -.qpdmibaztplkylerhdbllwcokyrfxeyj:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/widgets/rss.vue b/src/client/app/common/views/widgets/rss.vue index a777388cdb..448eee9fb6 100644 --- a/src/client/app/common/views/widgets/rss.vue +++ b/src/client/app/common/views/widgets/rss.vue @@ -65,7 +65,7 @@ export default define({ </script> <style lang="stylus" scoped> -root(isDark) +.mkw-rss .mkw-rss--body .feed padding 12px 16px @@ -74,8 +74,8 @@ root(isDark) > a display block padding 4px 0 - color isDark ? #9aa4b3 : #666 - border-bottom dashed 1px isDark ? #1c2023 : #eee + color var(--text) + border-bottom dashed 1px var(--faceDivider) &:last-child border-bottom none @@ -90,7 +90,7 @@ root(isDark) margin-right 4px &[data-mobile] - background isDark ? #21242f : #f3f3f3 + background var(--face) .feed padding 0 @@ -100,12 +100,6 @@ root(isDark) border-bottom none &:nth-child(even) - background isDark ? rgba(#000, 0.05) : rgba(#fff, 0.7) - -.mkw-rss[data-darkmode] - root(true) - -.mkw-rss:not([data-darkmode]) - root(false) + background rgba(#000, 0.05) </style> diff --git a/src/client/app/common/views/widgets/server.cpu-memory.vue b/src/client/app/common/views/widgets/server.cpu-memory.vue index b0421d6150..55aa1ea895 100644 --- a/src/client/app/common/views/widgets/server.cpu-memory.vue +++ b/src/client/app/common/views/widgets/server.cpu-memory.vue @@ -129,7 +129,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.cpu-memory > svg display block padding 10px @@ -144,7 +144,7 @@ root(isDark) > text font-size 5px - fill isDark ? rgba(#fff, 0.55) : rgba(#000, 0.55) + fill var(--chartCaption) > tspan opacity 0.5 @@ -154,10 +154,4 @@ root(isDark) display block clear both -.cpu-memory[data-darkmode] - root(true) - -.cpu-memory:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/pages/admin/admin.cpu-memory.vue b/src/client/app/desktop/views/pages/admin/admin.cpu-memory.vue index d14ce12553..ebaa11478d 100644 --- a/src/client/app/desktop/views/pages/admin/admin.cpu-memory.vue +++ b/src/client/app/desktop/views/pages/admin/admin.cpu-memory.vue @@ -125,7 +125,7 @@ root(isDark) > text font-size 10px - fill isDark ? rgba(#fff, 0.55) : rgba(#000, 0.55) + fill var(--chartCaption) > tspan opacity 0.5 diff --git a/src/client/app/mobile/views/pages/user.vue b/src/client/app/mobile/views/pages/user.vue index 1ff81fc0c6..d7edda1a74 100644 --- a/src/client/app/mobile/views/pages/user.vue +++ b/src/client/app/mobile/views/pages/user.vue @@ -115,10 +115,8 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) - $bg = isDark ? #22252f : #f7f7f7 +main + $bg = var(--face) > .is-suspended > .is-remote @@ -148,7 +146,7 @@ root(isDark) > .banner padding-bottom 33.3% - background-color isDark ? #5f7273 : #cacaca + background-color rgba(0, 0, 0, 0.1) background-size cover background-position center @@ -198,26 +196,26 @@ root(isDark) margin 0 line-height 22px font-size 20px - color isDark ? #fff : #757c82 + color var(--mobileUserPageName) > .username display inline-block line-height 20px font-size 16px font-weight bold - color isDark ? #657786 : #969ea5 + color var(--mobileUserPageAcct) > .followed margin-left 8px padding 2px 4px font-size 12px - color isDark ? #657786 : #fff - background isDark ? #f8f8f8 : #a7bec7 + color var(--mobileUserPageFollowedFg) + background var(--mobileUserPageFollowedBg) border-radius 4px > .description margin 8px 0 - color isDark ? #fff : #757c82 + color var(--mobileUserPageDescription) > .info margin 8px 0 @@ -225,14 +223,14 @@ root(isDark) > p display inline margin 0 16px 0 0 - color isDark ? #a9b9c1 : #90989c + color var(--text) > i margin-right 4px > .status > a - color isDark ? #657786 : #818a92 + color var(--text) &:not(:last-child) margin-right 16px @@ -240,7 +238,7 @@ root(isDark) > b margin-right 4px font-size 16px - color isDark ? #fff : #787e86 + color var(--mobileUserPageStatusHighlight) > i font-size 14px @@ -249,7 +247,7 @@ root(isDark) position -webkit-sticky position sticky top 47px - box-shadow 0 4px 4px isDark ? rgba(#000, 0.3) : rgba(#000, 0.07) + box-shadow 0 4px 4px var(--mobileUserPageHeaderShadow) background-color $bg z-index 2 @@ -266,7 +264,7 @@ root(isDark) line-height 48px font-size 12px text-decoration none - color isDark ? #657786 : #9ca1a5 + color var(--text) border-bottom solid 2px transparent @media (min-width 400px) @@ -289,10 +287,4 @@ root(isDark) @media (min-width 600px) padding 32px -main[data-darkmode] - root(true) - -main:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 8a39648037..896ac7a920 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -86,6 +86,8 @@ "calendarSaturdayOrSunday": "#ff6679", "calendarDay": "#c5ced6", + "chartCaption": ":alpha<0.6<$text", + "announcementsBg": "#253a50", "announcementsTitle": "#539eff", "announcementsText": "#fff", @@ -125,6 +127,13 @@ "desktopSettingsNavItem": ":alpha<0.8<$text", "desktopSettingsNavItemHover": ":lighten<10<$text", + "mobileUserPageName": "#fff", + "mobileUserPageAcct": "$text", + "mobileUserPageDescription": "$text", + "mobileUserPageFollowedBg": "rgba(0, 0, 0, 0.3)", + "mobileUserPageFollowedFg": "$text", + "mobileUserPageStatusHighlight": "#fff", + "mobileUserPageHeaderShadow": "rgba(0, 0, 0, 0.3)", "mobileAnnouncement": "rgba(30, 129, 216, 0.2)", "mobileAnnouncementFg": "#fff", "mobileSignedInAsBg": "#273c34", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index f5003ae2ec..fe018b5476 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -86,6 +86,8 @@ "calendarSaturdayOrSunday": "#ef95a0", "calendarDay": "#777", + "chartCaption": ":alpha<0.6<$text", + "announcementsBg": "#f3f9ff", "announcementsTitle": "#4078c0", "announcementsText": "#57616f", @@ -125,6 +127,13 @@ "desktopSettingsNavItem": ":alpha<0.8<$text", "desktopSettingsNavItemHover": ":darken<10<$text", + "mobileUserPageName": "#757c82", + "mobileUserPageAcct": "#969ea5", + "mobileUserPageDescription": "#757c82", + "mobileUserPageFollowedBg": "#a7bec7", + "mobileUserPageFollowedFg": "#fff", + "mobileUserPageStatusHighlight": "#787e86", + "mobileUserPageHeaderShadow": "rgba(0, 0, 0, 0.07)", "mobileAnnouncement": "rgba(155, 196, 232, 0.2)", "mobileAnnouncementFg": "#3f4967", "mobileSignedInAsBg": "#fcfff5", From 436773837b5f121168a7d23ce3e3b817ededc12a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 11:23:30 +0900 Subject: [PATCH 419/539] wip --- .../app/mobile/views/components/ui.nav.vue | 16 ++++------------ src/client/theme/dark.json | 2 ++ src/client/theme/light.json | 2 ++ 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue index a84dc7349a..ba122cc3e2 100644 --- a/src/client/app/mobile/views/components/ui.nav.vue +++ b/src/client/app/mobile/views/components/ui.nav.vue @@ -121,10 +121,8 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) - $color = isDark ? #c9d2e0 : #777 +.nav + $color = var(--text) .backdrop position fixed @@ -133,7 +131,7 @@ root(isDark) z-index 1025 width 100% height 100% - background isDark ? rgba(#000, 0.7) : rgba(#000, 0.2) + background var(--mobileNavBackdrop) .body position fixed @@ -144,7 +142,7 @@ root(isDark) height 100% overflow auto -webkit-overflow-scrolling touch - background isDark ? #16191f : #fff + background var(--secondary) .me display block @@ -265,10 +263,4 @@ root(isDark) opacity: 0; } -.nav[data-darkmode] - root(true) - -.nav:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 896ac7a920..f5294f27cd 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -12,6 +12,7 @@ "primary": "$primary", "primaryForeground": "#fff", + "secondary": "$secondary", "bg": ":darken<8<$secondary", "text": "$text", @@ -127,6 +128,7 @@ "desktopSettingsNavItem": ":alpha<0.8<$text", "desktopSettingsNavItemHover": ":lighten<10<$text", + "mobileNavBackdrop": "rgba(0, 0, 0, 0.7)", "mobileUserPageName": "#fff", "mobileUserPageAcct": "$text", "mobileUserPageDescription": "$text", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index fe018b5476..4776b2f3b3 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -12,6 +12,7 @@ "primary": "$primary", "primaryForeground": "#fff", + "secondary": "$secondary", "bg": ":darken<8<$secondary", "text": "$text", @@ -127,6 +128,7 @@ "desktopSettingsNavItem": ":alpha<0.8<$text", "desktopSettingsNavItemHover": ":darken<10<$text", + "mobileNavBackdrop": "rgba(0, 0, 0, 0.2)", "mobileUserPageName": "#757c82", "mobileUserPageAcct": "#969ea5", "mobileUserPageDescription": "#757c82", From 7ca5e33a3afdc57ea27cda2c004a3e6e8d688342 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 11:40:47 +0900 Subject: [PATCH 420/539] wip --- .../app/mobile/views/components/ui.header.vue | 15 +++------------ src/client/theme/dark.json | 2 ++ src/client/theme/light.json | 2 ++ 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/client/app/mobile/views/components/ui.header.vue b/src/client/app/mobile/views/components/ui.header.vue index d3e258f052..7fd68002e7 100644 --- a/src/client/app/mobile/views/components/ui.header.vue +++ b/src/client/app/mobile/views/components/ui.header.vue @@ -70,9 +70,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.header $height = 48px position fixed @@ -98,7 +96,7 @@ root(isDark) color #fff > .main - color rgba(#fff, 0.9) + color var(--mobileHeaderFg) > .backdrop position absolute @@ -108,8 +106,7 @@ root(isDark) height $height -webkit-backdrop-filter blur(12px) backdrop-filter blur(12px) - //background-color rgba(#1b2023, 0.75) - background-color isDark ? #313543 : #595f6f + background-color var(--mobileHeaderBg) > .content z-index 1001 @@ -171,10 +168,4 @@ root(isDark) line-height $height border-left solid 1px rgba(#000, 0.1) -.header[data-darkmode] - root(true) - -.header:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index f5294f27cd..65e12d5247 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -128,6 +128,8 @@ "desktopSettingsNavItem": ":alpha<0.8<$text", "desktopSettingsNavItemHover": ":lighten<10<$text", + "mobileHeaderBg": ":lighten<5<$secondary", + "mobileHeaderFg": "$text", "mobileNavBackdrop": "rgba(0, 0, 0, 0.7)", "mobileUserPageName": "#fff", "mobileUserPageAcct": "$text", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 4776b2f3b3..4817663529 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -128,6 +128,8 @@ "desktopSettingsNavItem": ":alpha<0.8<$text", "desktopSettingsNavItemHover": ":darken<10<$text", + "mobileHeaderBg": ":lighten<5<$secondary", + "mobileHeaderFg": "$text", "mobileNavBackdrop": "rgba(0, 0, 0, 0.2)", "mobileUserPageName": "#757c82", "mobileUserPageAcct": "#969ea5", From 016c7fd2c436c0a70d24e469ac42fe8bda42592f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 11:43:15 +0900 Subject: [PATCH 421/539] wip --- src/client/app/mobile/views/pages/user/home.vue | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/client/app/mobile/views/pages/user/home.vue b/src/client/app/mobile/views/pages/user/home.vue index d19ccfd522..2c7134ed43 100644 --- a/src/client/app/mobile/views/pages/user/home.vue +++ b/src/client/app/mobile/views/pages/user/home.vue @@ -54,7 +54,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.root.home max-width 600px margin 0 auto @@ -65,7 +65,7 @@ root(isDark) margin 0 0 16px 0 > section - background isDark ? #21242f : #eee + background var(--face) border-radius 8px box-shadow 0 4px 16px rgba(#000, 0.1) @@ -80,8 +80,8 @@ root(isDark) padding 8px 10px font-size 15px font-weight normal - color isDark ? #b8c5cc : #465258 - background var(--face) + color var(--text) + background var(--faceHeader) border-radius 8px 8px 0 0 @media (min-width 500px) @@ -98,12 +98,6 @@ root(isDark) display block margin 16px text-align center - color isDark ? #cad2da : #929aa0 - -.root.home[data-darkmode] - root(true) - -.root.home:not([data-darkmode]) - root(false) + color var(--text) </style> From 47d4de75da5bd2b6aafb5cdc6eabf6fec6932f1e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 11:44:23 +0900 Subject: [PATCH 422/539] wip --- .../views/components/widget-container.vue | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/src/client/app/mobile/views/components/widget-container.vue b/src/client/app/mobile/views/components/widget-container.vue index bf7adf5fcb..2a4025002b 100644 --- a/src/client/app/mobile/views/components/widget-container.vue +++ b/src/client/app/mobile/views/components/widget-container.vue @@ -25,8 +25,8 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) - background isDark ? #21242f : #eee +.mk-widget-container + background var(--face) border-radius 8px box-shadow 0 4px 16px rgba(#000, 0.1) overflow hidden @@ -35,17 +35,14 @@ root(isDark) background transparent !important box-shadow none !important - &.hideHeader - background isDark ? #21242f : #fff - > header > .title margin 0 padding 8px 10px font-size 15px font-weight normal - color isDark ? #b8c5cc : #465258 - background var(--face) + color var(--faceHeaderText) + background var(--faceHeader) border-radius 8px 8px 0 0 > [data-fa] @@ -65,10 +62,4 @@ root(isDark) font-size 15px color #465258 -.mk-widget-container[data-darkmode] - root(true) - -.mk-widget-container:not([data-darkmode]) - root(false) - </style> From fe8c384618597b044c004970fa39a78b0e6c5ec7 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 11:45:34 +0900 Subject: [PATCH 423/539] wip --- src/client/app/mobile/views/pages/settings.vue | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index 0a44a592e1..a3b508e37e 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -322,7 +322,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +main margin 0 auto max-width 600px width 100% @@ -346,12 +346,7 @@ root(isDark) > footer margin 16px text-align center - color isDark ? #c9d2e0 : #888 - -main[data-darkmode] - root(true) - -main:not([data-darkmode]) - root(false) + color var(--text) + opacity 0.7 </style> From d715af0620d1c18b5a5820193d1503bae94fd05e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 11:49:32 +0900 Subject: [PATCH 424/539] wip --- src/client/app/mobile/views/pages/home.vue | 22 ++++++---------------- src/client/theme/dark.json | 1 + src/client/theme/light.json | 1 + 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue index c2ab5d5623..616a3aee1b 100644 --- a/src/client/app/mobile/views/pages/home.vue +++ b/src/client/app/mobile/views/pages/home.vue @@ -154,9 +154,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +main > .nav > .pointer position fixed @@ -176,7 +174,7 @@ root(isDark) border-top solid $size transparent border-left solid $size transparent border-right solid $size transparent - border-bottom solid $size isDark ? #272f3a : #fff + border-bottom solid $size var(--popupBg) > .bg position fixed @@ -198,7 +196,7 @@ root(isDark) margin 0 auto overflow auto -webkit-overflow-scrolling touch - background isDark ? #272f3a : #fff + background var(--popupBg) border-radius 8px box-shadow 0 0 16px rgba(#000, 0.1) @@ -207,19 +205,19 @@ root(isDark) > .hr margin 8px 0 - border-top solid 1px isDark ? rgba(#000, 0.3) : rgba(#000, 0.1) + border-top solid 1px var(--faceDivider) > *:not(.hr) display block padding 8px 16px - color isDark ? #cdd0d8 : #666 + color var(--text) &[data-active] color var(--primaryForeground) background var(--primary) &:not([data-active]):hover - background isDark ? #353e4a : #eee + background var(--mobileHomeTlItemHover) > .badge margin-left 6px @@ -237,17 +235,9 @@ root(isDark) @media (min-width 600px) padding 32px -main[data-darkmode] - root(true) - -main:not([data-darkmode]) - root(false) - </style> <style lang="stylus" module> - - .title i margin-right 4px diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 65e12d5247..6aa9bf86b6 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -131,6 +131,7 @@ "mobileHeaderBg": ":lighten<5<$secondary", "mobileHeaderFg": "$text", "mobileNavBackdrop": "rgba(0, 0, 0, 0.7)", + "mobileHomeTlItemHover": "rgba(255, 255, 255, 0.1)", "mobileUserPageName": "#fff", "mobileUserPageAcct": "$text", "mobileUserPageDescription": "$text", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 4817663529..1cd77c7d61 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -131,6 +131,7 @@ "mobileHeaderBg": ":lighten<5<$secondary", "mobileHeaderFg": "$text", "mobileNavBackdrop": "rgba(0, 0, 0, 0.2)", + "mobileHomeTlItemHover": "rgba(0, 0, 0, 0.05)", "mobileUserPageName": "#757c82", "mobileUserPageAcct": "#969ea5", "mobileUserPageDescription": "#757c82", From b4a4d784c3ec847dd19b4b692d66a52c09c9dcb5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 12:07:28 +0900 Subject: [PATCH 425/539] wip --- .../app/mobile/views/components/post-form.vue | 24 +++++++------------ src/client/theme/dark.json | 2 ++ src/client/theme/light.json | 2 ++ 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 6ada5e60ee..fe8e30a41d 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -324,9 +324,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.mk-post-form max-width 500px width calc(100% - 16px) margin 8px auto @@ -349,20 +347,20 @@ root(isDark) > header z-index 1000 height 50px - box-shadow 0 1px 0 0 isDark ? rgba(#000, 0.2) : rgba(#000, 0.1) + box-shadow 0 1px 0 0 var(--mobilePostFormDivider) > .cancel padding 0 width 50px line-height 50px font-size 24px - color isDark ? #9baec8 : #555 + color var(--text) > div position absolute top 0 right 0 - color #657786 + color var(--text) > .text-count line-height 50px @@ -396,7 +394,7 @@ root(isDark) > span margin-right 16px - color isDark ? #fff : #666 + color var(--text) > input z-index 1 @@ -408,11 +406,11 @@ root(isDark) margin 0 width 100% font-size 16px - color isDark ? #fff : #333 - background isDark ? #191d23 : #fff + color var(--inputText) + background var(--mobilePostFormTextareaBg) border none border-radius 0 - box-shadow 0 1px 0 0 isDark ? rgba(#000, 0.2) : rgba(#000, 0.1) + box-shadow 0 1px 0 0 var(--mobilePostFormDivider) &:disabled opacity 0.5 @@ -481,10 +479,4 @@ root(isDark) > * margin-right 8px -.mk-post-form[data-darkmode] - root(true) - -.mk-post-form:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 6aa9bf86b6..3d3c9b37c7 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -131,6 +131,8 @@ "mobileHeaderBg": ":lighten<5<$secondary", "mobileHeaderFg": "$text", "mobileNavBackdrop": "rgba(0, 0, 0, 0.7)", + "mobilePostFormDivider": "rgba(0, 0, 0, 0.2)", + "mobilePostFormTextareaBg": "rgba(0, 0, 0, 0.3)", "mobileHomeTlItemHover": "rgba(255, 255, 255, 0.1)", "mobileUserPageName": "#fff", "mobileUserPageAcct": "$text", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 1cd77c7d61..d4dd246542 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -131,6 +131,8 @@ "mobileHeaderBg": ":lighten<5<$secondary", "mobileHeaderFg": "$text", "mobileNavBackdrop": "rgba(0, 0, 0, 0.2)", + "mobilePostFormDivider": "rgba(0, 0, 0, 0.1)", + "mobilePostFormTextareaBg": "#fff", "mobileHomeTlItemHover": "rgba(0, 0, 0, 0.05)", "mobileUserPageName": "#757c82", "mobileUserPageAcct": "#969ea5", From 5df85b5febd86cd34bcc59737f4ae974689e2a0e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 12:10:15 +0900 Subject: [PATCH 426/539] wip --- .../app/common/views/components/poll-editor.vue | 12 ++---------- src/client/theme/dark.json | 2 ++ src/client/theme/light.json | 2 ++ 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/client/app/common/views/components/poll-editor.vue b/src/client/app/common/views/components/poll-editor.vue index 7f52c62c23..b5c57d48a5 100644 --- a/src/client/app/common/views/components/poll-editor.vue +++ b/src/client/app/common/views/components/poll-editor.vue @@ -68,9 +68,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.mk-poll-editor padding 8px > .caution @@ -104,7 +102,7 @@ root(isDark) width 300px font-size 14px color var(--inputText) - background isDark ? #191b22 : #fff + background var(--pollEditorInputBg) border solid 1px var(--primaryAlpha01) border-radius 4px @@ -142,10 +140,4 @@ root(isDark) &:active color var(--primaryDarken30) -.mk-poll-editor[data-darkmode] - root(true) - -.mk-poll-editor:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 3d3c9b37c7..8700d396a8 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -77,6 +77,8 @@ "reactionViewerBorder": "rgba(255, 255, 255, 0.1)", + "pollEditorInputBg": "rgba(0, 0, 0, 0.25)", + "urlPreviewBorder": "rgba(0, 0, 0, 0.4)", "urlPreviewBorderHover": "rgba(255, 255, 255, 0.2)", "urlPreviewTitle": "$text", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index d4dd246542..d55b75ab08 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -77,6 +77,8 @@ "reactionViewerBorder": "rgba(0, 0, 0, 0.1)", + "pollEditorInputBg": "#fff", + "urlPreviewBorder": "rgba(0, 0, 0, 0.1)", "urlPreviewBorderHover": "rgba(0, 0, 0, 0.2)", "urlPreviewTitle": "$text", From 76097416802a8afcd09bc69994c6632ce0f73902 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 12:13:08 +0900 Subject: [PATCH 427/539] wip --- .../app/desktop/views/components/note-preview.vue | 2 +- .../app/desktop/views/components/notes.note.sub.vue | 2 +- .../app/desktop/views/pages/deck/deck.note.sub.vue | 2 +- .../app/mobile/views/components/note-preview.vue | 2 +- src/client/app/mobile/views/components/note.sub.vue | 10 ++-------- src/client/theme/dark.json | 1 + src/client/theme/light.json | 1 + 7 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue index f64657fb47..7e5a1db8d4 100644 --- a/src/client/app/desktop/views/components/note-preview.vue +++ b/src/client/app/desktop/views/components/note-preview.vue @@ -81,7 +81,7 @@ root(isDark) cursor default margin 0 padding 0 - color isDark ? #959ba7 : #717171 + color var(--subNoteText) .qiziqtywpuaucsgarwajitwaakggnisj[data-darkmode] root(true) diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue index 70709f8738..a0c4cc2fad 100644 --- a/src/client/app/desktop/views/components/notes.note.sub.vue +++ b/src/client/app/desktop/views/components/notes.note.sub.vue @@ -82,7 +82,7 @@ root(isDark) cursor default margin 0 padding 0 - color isDark ? #959ba7 : #717171 + color var(--subNoteText) pre max-height 120px diff --git a/src/client/app/desktop/views/pages/deck/deck.note.sub.vue b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue index f1bf60d528..0b6a13beaf 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.sub.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue @@ -62,7 +62,7 @@ root(isDark) > .text margin 0 padding 0 - color isDark ? #959ba7 : #717171 + color var(--subNoteText) pre max-height 120px diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue index 0b3278ff41..1c73779251 100644 --- a/src/client/app/mobile/views/components/note-preview.vue +++ b/src/client/app/mobile/views/components/note-preview.vue @@ -98,7 +98,7 @@ root(isDark) cursor default margin 0 padding 0 - color isDark ? #959ba7 : #717171 + color var(--subNoteText) .yohlumlkhizgfkvvscwfcrcggkotpvry[data-darkmode] root(true) diff --git a/src/client/app/mobile/views/components/note.sub.vue b/src/client/app/mobile/views/components/note.sub.vue index 8c2e3b496d..24f5be160c 100644 --- a/src/client/app/mobile/views/components/note.sub.vue +++ b/src/client/app/mobile/views/components/note.sub.vue @@ -41,7 +41,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.zlrxdaqttccpwhpaagdmkawtzklsccam display flex padding 16px font-size 10px @@ -104,16 +104,10 @@ root(isDark) > .text margin 0 padding 0 - color isDark ? #959ba7 : #717171 + color var(--subNoteText) pre max-height 120px font-size 80% -.zlrxdaqttccpwhpaagdmkawtzklsccam[data-darkmode] - root(true) - -.zlrxdaqttccpwhpaagdmkawtzklsccam:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 8700d396a8..b4c9fd5606 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -34,6 +34,7 @@ "popupFg": "#d6dce2", "subNoteBg": "rgba(0, 0, 0, 0.18)", + "subNoteText": ":alpha<0.7<$text", "renoteGradient": "#314027", "renoteText": "#9dbb00", "quoteBorder": "#4e945e", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index d55b75ab08..6aec07e74d 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -34,6 +34,7 @@ "popupFg": "#586069", "subNoteBg": "rgba(0, 0, 0, 0.01)", + "subNoteText": ":alpha<0.7<$text", "renoteGradient": "#edfde2", "renoteText": "#9dbb00", "quoteBorder": "#c0dac6", From 29476ea3da691416ff9abb8c953b8ecb13c908b1 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 12:20:22 +0900 Subject: [PATCH 428/539] wip --- .../app/desktop/views/pages/deck/deck.note.vue | 2 +- .../app/mobile/views/components/note-card.vue | 13 ++++--------- src/client/app/mobile/views/components/note.vue | 14 +++----------- 3 files changed, 8 insertions(+), 21 deletions(-) diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index c6925d5cec..2555c6f7e0 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -343,7 +343,7 @@ root(isDark) > .reply margin-right 8px - color isDark ? #99abbf : #717171 + color var(--noteText) > .rp margin-left 4px diff --git a/src/client/app/mobile/views/components/note-card.vue b/src/client/app/mobile/views/components/note-card.vue index e30e6c1c8f..de9c9c1450 100644 --- a/src/client/app/mobile/views/components/note-card.vue +++ b/src/client/app/mobile/views/components/note-card.vue @@ -27,17 +27,18 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.mk-note-card display inline-block width 150px //height 120px font-size 12px background var(--face) border-radius 4px + box-shadow 0 2px 8px rgba(0, 0, 0, 0.2) > a display block - color isDark ? #fff : #2c3940 + color var(--noteText) &:hover text-decoration none @@ -75,17 +76,11 @@ root(isDark) left 0 width 100% height 20px - background isDark ? linear-gradient(to bottom, rgba(#282c37, 0) 0%, #282c37 100%) : linear-gradient(to bottom, rgba(#fff, 0) 0%, #fff 100%) + background linear-gradient(to bottom, transparent 0%, var(--face) 100%) > .mk-time display inline-block padding 8px color #aaa -.mk-note-card[data-darkmode] - root(true) - -.mk-note-card:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 8bb9f43fab..4af19ade29 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -228,9 +228,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.note font-size 12px border-bottom solid 1px var(--faceDivider) @@ -383,7 +381,7 @@ root(isDark) > .reply margin-right 8px - color isDark ? #99abbf : #717171 + color var(--noteText) > .rp margin-left 4px @@ -449,7 +447,7 @@ root(isDark) margin-right 28px &:hover - color isDark ? #9198af : #666 + color var(--noteActionsHover) > .count display inline @@ -459,12 +457,6 @@ root(isDark) &.reacted color var(--primary) -.note[data-darkmode] - root(true) - -.note:not([data-darkmode]) - root(false) - </style> <style lang="stylus" module> From 1eef90f6cbdbf06bbc1c7e03398e9e1243664fe1 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 14:03:55 +0900 Subject: [PATCH 429/539] wip --- .../views/components/drive.file-detail.vue | 42 +++++++------------ .../mobile/views/components/drive.file.vue | 19 +++------ .../mobile/views/components/drive.folder.vue | 10 +---- .../app/mobile/views/components/drive.vue | 20 ++++----- .../mobile/views/components/notification.vue | 10 +---- .../views/pages/received-follow-requests.vue | 4 +- src/client/theme/dark.json | 1 + src/client/theme/light.json | 1 + 8 files changed, 36 insertions(+), 71 deletions(-) diff --git a/src/client/app/mobile/views/components/drive.file-detail.vue b/src/client/app/mobile/views/components/drive.file-detail.vue index 8108892597..de46297fcb 100644 --- a/src/client/app/mobile/views/components/drive.file-detail.vue +++ b/src/client/app/mobile/views/components/drive.file-detail.vue @@ -134,10 +134,10 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.pyvicwrksnfyhpfgkjwqknuururpaztw > .preview padding 8px - background isDark ? #191b22 : #f0f0f0 + background var(--bg) > img display block @@ -148,9 +148,10 @@ root(isDark) > footer padding 8px 8px 0 8px - font-size 0.8em - color isDark ? #606984 : #888 text-align center + font-size 0.8em + color var(--text) + opacity 0.7 > .separator display inline @@ -178,12 +179,12 @@ root(isDark) > .info padding 14px font-size 0.8em - border-top solid 1px isDark ? #1c2023 : #dfdfdf + border-top solid 1px var(--faceDivider) > div max-width 500px margin 0 auto - color isDark ? #9397a2 : #9d9d9d + color var(--text) > .separator padding 0 4px @@ -198,7 +199,7 @@ root(isDark) > .menu padding 14px - border-top solid 1px isDark ? #1c2023 : #dfdfdf + border-top solid 1px var(--faceDivider) > div max-width 500px @@ -209,31 +210,26 @@ root(isDark) width 100% padding 10px 16px margin 0 0 12px 0 - color isDark ? #dfe3e8 : #333 + color var(--primaryForeground) font-size 0.9em text-align center text-decoration none - text-shadow 0 1px 0 isDark ? rgba(0, 0, 0, 0.9) : rgba(255, 255, 255, 0.9) - background-image isDark ? linear-gradient(#292f3c, #1b2025) : linear-gradient(#fafafa, #eaeaea) - border 1px solid isDark ? #121417 : #ddd - border-bottom-color isDark ? #060606 : #cecece + background var(--primary) + border none border-radius 3px &:last-child margin-bottom 0 &:active - background-color #767676 - background-image none - border-color #444 - box-shadow 0 1px 3px rgba(#000, 0.075), inset 0 0 5px rgba(#000, 0.2) + background var(--primaryDarken10) > [data-fa] margin-right 4px > .hash padding 14px - border-top solid 1px isDark ? #1c2023 : #dfdfdf + border-top solid 1px var(--faceDivider) > div max-width 500px @@ -243,7 +239,7 @@ root(isDark) display block margin 0 padding 0 - color isDark ? #a8b7d0 : #555 + color var(--text) font-size 0.9em > [data-fa] @@ -264,7 +260,7 @@ root(isDark) > .exif padding 14px - border-top solid 1px isDark ? #1c2023 : #dfdfdf + border-top solid 1px var(--faceDivider) > div max-width 500px @@ -274,7 +270,7 @@ root(isDark) display block margin 0 padding 0 - color isDark ? #a8b7d0 : #555 + color var(--text) font-size 0.9em > [data-fa] @@ -292,10 +288,4 @@ root(isDark) border-radius 2px background #f5f5f5 -.pyvicwrksnfyhpfgkjwqknuururpaztw[data-darkmode] - root(true) - -.pyvicwrksnfyhpfgkjwqknuururpaztw:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/mobile/views/components/drive.file.vue b/src/client/app/mobile/views/components/drive.file.vue index ba58cf59a0..68978bb944 100644 --- a/src/client/app/mobile/views/components/drive.file.vue +++ b/src/client/app/mobile/views/components/drive.file.vue @@ -63,9 +63,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.vupkuhvjnjyqaqhsiogfbywvjxynrgsm display block text-decoration none !important @@ -103,7 +101,7 @@ root(isDark) padding 0 font-size 0.9em font-weight bold - color isDark ? #fff : #555 + color var(--text) text-overflow ellipsis overflow-wrap break-word @@ -127,21 +125,22 @@ root(isDark) display block margin 4px 0 0 0 font-size 0.7em + color var(--text) > .separator padding 0 4px > .type - color #9D9D9D + opacity 0.7 > .mk-file-type-icon margin-right 4px > .data-size - color #9D9D9D + opacity 0.7 > .created-at - color #BDBDBD + opacity 0.7 > [data-fa] margin-right 2px @@ -155,10 +154,4 @@ root(isDark) &, * color #fff !important -.vupkuhvjnjyqaqhsiogfbywvjxynrgsm[data-darkmode] - root(true) - -.vupkuhvjnjyqaqhsiogfbywvjxynrgsm:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/mobile/views/components/drive.folder.vue b/src/client/app/mobile/views/components/drive.folder.vue index f76ecba6ad..05dcbd083e 100644 --- a/src/client/app/mobile/views/components/drive.folder.vue +++ b/src/client/app/mobile/views/components/drive.folder.vue @@ -24,9 +24,9 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.jvwxssxsytqlqvrpiymarjlzlsxskqsr display block - color isDark ? #fff : #777 + color var(--text) text-decoration none !important * @@ -55,10 +55,4 @@ root(isDark) > * height 100% -.jvwxssxsytqlqvrpiymarjlzlsxskqsr[data-darkmode] - root(true) - -.jvwxssxsytqlqvrpiymarjlzlsxskqsr:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/mobile/views/components/drive.vue b/src/client/app/mobile/views/components/drive.vue index 76d6c2737d..8919462511 100644 --- a/src/client/app/mobile/views/components/drive.vue +++ b/src/client/app/mobile/views/components/drive.vue @@ -473,7 +473,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.kmmwchoexgckptowjmjgfsygeltxfeqs background var(--face) > nav @@ -487,10 +487,10 @@ root(isDark) overflow auto white-space nowrap font-size 0.9em - color rgba(isDark ? #fff : #000, 0.67) + color var(--text) -webkit-backdrop-filter blur(12px) backdrop-filter blur(12px) - //background-color rgba(var(--faceHeader), 0.75) + background-color var(--mobileDriveNavBg) border-bottom solid 1px rgba(#000, 0.13) > p @@ -516,7 +516,7 @@ root(isDark) opacity 0.5 > .info - border-bottom solid 1px isDark ? #1c2023 : #eee + border-bottom solid 1px var(--faceDivider) &:empty display none @@ -527,15 +527,15 @@ root(isDark) margin 0 auto padding 4px 16px font-size 10px - color isDark ? #606984 : #777 + color var(--text) > .folders > .folder - border-bottom solid 1px isDark ? #1c2023 : #eee + border-bottom solid 1px var(--faceDivider) > .files > .file - border-bottom solid 1px isDark ? #1c2023 : #eee + border-bottom solid 1px var(--faceDivider) > .more display block @@ -591,10 +591,4 @@ root(isDark) > .file display none -.kmmwchoexgckptowjmjgfsygeltxfeqs[data-darkmode] - root(true) - -.kmmwchoexgckptowjmjgfsygeltxfeqs:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/mobile/views/components/notification.vue b/src/client/app/mobile/views/components/notification.vue index 7b73012e06..4a09104341 100644 --- a/src/client/app/mobile/views/components/notification.vue +++ b/src/client/app/mobile/views/components/notification.vue @@ -105,7 +105,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.mk-notification > .notification padding 16px font-size 12px @@ -154,7 +154,7 @@ root(isDark) > .mk-time margin-left auto - color isDark ? #606984 : #c0c0c0 + color var(--noteHeaderInfo) font-size 0.9em > .note-preview @@ -182,10 +182,4 @@ root(isDark) > div > header i color #888 -.mk-notification[data-darkmode] - root(true) - -.mk-notification:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/mobile/views/pages/received-follow-requests.vue b/src/client/app/mobile/views/pages/received-follow-requests.vue index c2b2606fd8..beaf6bba57 100644 --- a/src/client/app/mobile/views/pages/received-follow-requests.vue +++ b/src/client/app/mobile/views/pages/received-follow-requests.vue @@ -52,8 +52,6 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - main width 100% max-width 680px @@ -69,7 +67,7 @@ main > div display flex padding 16px - border solid 1px isDark ? #1c2023 : #eee + border solid 1px var(--faceDivider) border-radius 4px > span diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index b4c9fd5606..f8b3420e7c 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -136,6 +136,7 @@ "mobileNavBackdrop": "rgba(0, 0, 0, 0.7)", "mobilePostFormDivider": "rgba(0, 0, 0, 0.2)", "mobilePostFormTextareaBg": "rgba(0, 0, 0, 0.3)", + "mobileDriveNavBg": ":alpha<0.75<$secondary", "mobileHomeTlItemHover": "rgba(255, 255, 255, 0.1)", "mobileUserPageName": "#fff", "mobileUserPageAcct": "$text", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 6aec07e74d..7652c6027d 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -136,6 +136,7 @@ "mobileNavBackdrop": "rgba(0, 0, 0, 0.2)", "mobilePostFormDivider": "rgba(0, 0, 0, 0.1)", "mobilePostFormTextareaBg": "#fff", + "mobileDriveNavBg": ":alpha<0.75<$secondary", "mobileHomeTlItemHover": "rgba(0, 0, 0, 0.05)", "mobileUserPageName": "#757c82", "mobileUserPageAcct": "#969ea5", From c627288bdeb23167edc04101cd985f02f4bc8ede Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 14:26:20 +0900 Subject: [PATCH 430/539] wip --- src/client/app/common/views/pages/follow.vue | 2 +- .../common/views/widgets/posts-monitor.vue | 2 +- .../received-follow-requests-window.vue | 2 +- .../views/components/user-lists-window.vue | 2 +- .../app/desktop/views/pages/deck/deck.vue | 2 +- .../desktop/views/pages/user/user.friends.vue | 17 +++++------- .../desktop/views/pages/user/user.header.vue | 18 ++++--------- .../desktop/views/pages/user/user.photos.vue | 10 ++----- .../desktop/views/pages/user/user.profile.vue | 12 +++------ .../views/pages/user/user.timeline.vue | 16 +++--------- .../app/desktop/views/pages/user/user.vue | 26 +++++++------------ .../app/desktop/views/widgets/polls.vue | 12 +++------ .../app/desktop/views/widgets/profile.vue | 16 ++++-------- .../app/desktop/views/widgets/users.vue | 15 ++++------- .../views/components/drive-file-chooser.vue | 14 +++------- src/client/app/mobile/views/pages/home.vue | 2 +- .../app/mobile/views/pages/settings.vue | 2 +- src/client/app/mobile/views/pages/user.vue | 2 +- src/client/theme/dark.json | 5 ++++ src/client/theme/light.json | 5 ++++ 20 files changed, 65 insertions(+), 117 deletions(-) diff --git a/src/client/app/common/views/pages/follow.vue b/src/client/app/common/views/pages/follow.vue index 5e2d448d8b..ef7ee111e2 100644 --- a/src/client/app/common/views/pages/follow.vue +++ b/src/client/app/common/views/pages/follow.vue @@ -1,5 +1,5 @@ <template> -<div class="syxhndwprovvuqhmyvveewmbqayniwkv" v-if="!fetching" :data-darkmode="$store.state.device.darkmode"> +<div class="syxhndwprovvuqhmyvveewmbqayniwkv" v-if="!fetching"> <div class="signed-in-as" v-html="'%i18n:@signed-in-as%'.replace('{}', `<b>${myName}`)"></div> <main> diff --git a/src/client/app/common/views/widgets/posts-monitor.vue b/src/client/app/common/views/widgets/posts-monitor.vue index 09f766696b..18df1241a9 100644 --- a/src/client/app/common/views/widgets/posts-monitor.vue +++ b/src/client/app/common/views/widgets/posts-monitor.vue @@ -4,7 +4,7 @@ <template slot="header">%fa:chart-line%%i18n:@title%</template> <button slot="func" @click="toggle" title="%i18n:@toggle%">%fa:sort%</button> - <div class="qpdmibaztplkylerhdbllwcokyrfxeyj" :class="{ dual: props.view == 0 }" :data-darkmode="$store.state.device.darkmode"> + <div class="qpdmibaztplkylerhdbllwcokyrfxeyj" :class="{ dual: props.view == 0 }"> <svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" v-show="props.view != 2"> <defs> <linearGradient :id="localGradientId" x1="0" x2="0" y1="1" y2="0"> diff --git a/src/client/app/desktop/views/components/received-follow-requests-window.vue b/src/client/app/desktop/views/components/received-follow-requests-window.vue index d8a94f6cbe..8ade6a7210 100644 --- a/src/client/app/desktop/views/components/received-follow-requests-window.vue +++ b/src/client/app/desktop/views/components/received-follow-requests-window.vue @@ -2,7 +2,7 @@ <mk-window ref="window" is-modal width="450px" height="500px" @closed="destroyDom"> <span slot="header">%fa:envelope R% %i18n:@title%</span> - <div class="slpqaxdoxhvglersgjukmvizkqbmbokc" :data-darkmode="$store.state.device.darkmode"> + <div class="slpqaxdoxhvglersgjukmvizkqbmbokc"> <div v-for="req in requests"> <router-link :key="req.id" :to="req.follower | userPage">{{ req.follower | userName }}</router-link> <span> diff --git a/src/client/app/desktop/views/components/user-lists-window.vue b/src/client/app/desktop/views/components/user-lists-window.vue index 75253e0788..4f944981a5 100644 --- a/src/client/app/desktop/views/components/user-lists-window.vue +++ b/src/client/app/desktop/views/components/user-lists-window.vue @@ -2,7 +2,7 @@ <mk-window ref="window" is-modal width="450px" height="500px" @closed="destroyDom"> <span slot="header">%fa:list% %i18n:@title%</span> - <div class="xkxvokkjlptzyewouewmceqcxhpgzprp" :data-darkmode="$store.state.device.darkmode"> + <div class="xkxvokkjlptzyewouewmceqcxhpgzprp"> <button class="ui" @click="add">%i18n:@create-list%</button> <a v-for="list in lists" :key="list.id" @click="choice(list)">{{ list.title }}</a> </div> diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index 48c80c82c4..cd3336079b 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -1,6 +1,6 @@ <template> <mk-ui :class="$style.root"> - <div class="qlvquzbjribqcaozciifydkngcwtyzje" :data-darkmode="$store.state.device.darkmode" :style="style"> + <div class="qlvquzbjribqcaozciifydkngcwtyzje" :style="style"> <template v-for="ids in layout"> <div v-if="ids.length > 1" class="folder"> <template v-for="id, i in ids"> diff --git a/src/client/app/desktop/views/pages/user/user.friends.vue b/src/client/app/desktop/views/pages/user/user.friends.vue index 9b466053f7..36ae360248 100644 --- a/src/client/app/desktop/views/pages/user/user.friends.vue +++ b/src/client/app/desktop/views/pages/user/user.friends.vue @@ -40,7 +40,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.hozptpaliadatkehcmcayizwzwwctpbc background var(--face) box-shadow var(--shadow) border-radius var(--round) @@ -53,7 +53,7 @@ root(isDark) line-height 42px font-size 0.9em font-weight bold - background isDark ? #313543 : inherit + background var(--faceHeader) color var(--faceHeaderText) box-shadow 0 1px rgba(#000, 0.07) @@ -72,7 +72,7 @@ root(isDark) > .user padding 16px - border-bottom solid 1px isDark ? #21242f : #eee + border-bottom solid 1px var(--faceDivider) &:last-child border-bottom none @@ -98,24 +98,19 @@ root(isDark) margin 0 font-size 16px line-height 24px - color isDark ? #ccc : #555 + color var(--text) > .username display block margin 0 font-size 15px line-height 16px - color isDark ? #555 : #ccc + color var(--text) + opacity 0.7 > .mk-follow-button position absolute top 16px right 16px -.hozptpaliadatkehcmcayizwzwwctpbc[data-darkmode] - root(true) - -.hozptpaliadatkehcmcayizwzwwctpbc:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/pages/user/user.header.vue b/src/client/app/desktop/views/pages/user/user.header.vue index ec46e955b5..76eb8f9e1c 100644 --- a/src/client/app/desktop/views/pages/user/user.header.vue +++ b/src/client/app/desktop/views/pages/user/user.header.vue @@ -100,9 +100,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.header background var(--face) box-shadow var(--shadow) border-radius var(--round) @@ -182,12 +180,12 @@ root(isDark) > .body padding 16px 16px 16px 154px - color isDark ? #c5ced6 : #555 + color var(--text) > .status margin-top 16px padding-top 16px - border-top solid 1px rgba(#000, isDark ? 0.2 : 0.1) + border-top solid 1px var(--faceDivider) font-size 80% > * @@ -196,13 +194,13 @@ root(isDark) margin-right 16px &:not(:last-child) - border-right solid 1px rgba(#000, isDark ? 0.2 : 0.1) + border-right solid 1px var(--faceDivider) &.clickable cursor pointer &:hover - color isDark ? #fff : #000 + color var(--faceTextButtonHover) > b margin-right 4px @@ -210,10 +208,4 @@ root(isDark) font-weight bold color var(--primary) -.header[data-darkmode] - root(true) - -.header:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/pages/user/user.photos.vue b/src/client/app/desktop/views/pages/user/user.photos.vue index 6e9d09e79f..628d5b6d95 100644 --- a/src/client/app/desktop/views/pages/user/user.photos.vue +++ b/src/client/app/desktop/views/pages/user/user.photos.vue @@ -39,7 +39,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.dzsuvbsrrrwobdxifudxuefculdfiaxd background var(--face) box-shadow var(--shadow) border-radius var(--round) @@ -52,7 +52,7 @@ root(isDark) line-height 42px font-size 0.9em font-weight bold - background: isDark ? #313543 : inherit + background var(--faceHeader) color var(--faceHeaderText) box-shadow 0 1px rgba(#000, 0.07) @@ -87,10 +87,4 @@ root(isDark) > i margin-right 4px -.dzsuvbsrrrwobdxifudxuefculdfiaxd[data-darkmode] - root(true) - -.dzsuvbsrrrwobdxifudxuefculdfiaxd:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/pages/user/user.profile.vue b/src/client/app/desktop/views/pages/user/user.profile.vue index e5ea8d1cc9..fe10b54378 100644 --- a/src/client/app/desktop/views/pages/user/user.profile.vue +++ b/src/client/app/desktop/views/pages/user/user.profile.vue @@ -85,7 +85,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.profile background var(--face) box-shadow var(--shadow) border-radius var(--round) @@ -96,7 +96,7 @@ root(isDark) > .friend-form padding 16px text-align center - border-bottom solid 1px isDark ? #21242f : #eee + border-bottom solid 1px var(--faceDivider) > .followed margin 12px 0 0 0 @@ -114,7 +114,7 @@ root(isDark) > .action-form padding 16px text-align center - border-bottom solid 1px isDark ? #21242f : #eee + border-bottom solid 1px var(--faceDivider) > * width 100% @@ -122,10 +122,4 @@ root(isDark) &:not(:last-child) margin-bottom 12px -.profile[data-darkmode] - root(true) - -.profile:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/pages/user/user.timeline.vue b/src/client/app/desktop/views/pages/user/user.timeline.vue index fe3ca9154b..608c12b7e2 100644 --- a/src/client/app/desktop/views/pages/user/user.timeline.vue +++ b/src/client/app/desktop/views/pages/user/user.timeline.vue @@ -112,9 +112,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.oh5y2r7l5lx8j6jj791ykeiwgihheguk background var(--face) border-radius var(--round) overflow hidden @@ -123,7 +121,7 @@ root(isDark) padding 0 8px z-index 10 background var(--faceHeader) - box-shadow 0 1px isDark ? rgba(#000, 0.15) : rgba(#000, 0.08) + box-shadow 0 1px var(--desktopTimelineHeaderShadow) > span display inline-block @@ -148,11 +146,11 @@ root(isDark) background var(--primary) &:not([data-active]) - color isDark ? #9aa2a7 : #6f7477 + color var(--desktopTimelineSrc) cursor pointer &:hover - color isDark ? #d9dcde : #525a5f + color var(--desktopTimelineSrcHover) > .loading padding 64px 0 @@ -171,10 +169,4 @@ root(isDark) font-size 3em color #ccc -.oh5y2r7l5lx8j6jj791ykeiwgihheguk[data-darkmode] - root(true) - -.oh5y2r7l5lx8j6jj791ykeiwgihheguk:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/pages/user/user.vue b/src/client/app/desktop/views/pages/user/user.vue index a7065af5e7..a8da890936 100644 --- a/src/client/app/desktop/views/pages/user/user.vue +++ b/src/client/app/desktop/views/pages/user/user.vue @@ -1,6 +1,6 @@ <template> <mk-ui> - <div class="xygkxeaeontfaokvqmiblezmhvhostak" v-if="!fetching" :data-darkmode="$store.state.device.darkmode"> + <div class="xygkxeaeontfaokvqmiblezmhvhostak" v-if="!fetching"> <div class="is-suspended" v-if="user.isSuspended">%fa:exclamation-triangle% %i18n:@is-suspended%</div> <div class="is-remote" v-if="user.host != null">%fa:exclamation-triangle% %i18n:@is-remote%<a :href="user.url || user.uri" target="_blank">%i18n:@view-remote%</a></div> <main> @@ -79,7 +79,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.xygkxeaeontfaokvqmiblezmhvhostak width 980px padding 16px margin 0 auto @@ -93,12 +93,12 @@ root(isDark) border-radius var(--round) &.is-suspended - color isDark ? #ffb4b4 : #570808 - background isDark ? #611d1d : #ffdbdb + color var(--suspendedInfoFg) + background var(--suspendedInfoBg) &.is-remote - color isDark ? #ffbd3e : #573c08 - background isDark ? #42321c : #fff0db + color var(--remoteInfoFg) + background var(--remoteInfoBg) > a font-weight bold @@ -139,21 +139,15 @@ root(isDark) > .nav padding 16px font-size 12px - color #aaa - background isDark ? #21242f : #fff + color var(--text) + background var(--face) box-shadow var(--shadow) border-radius var(--round) a - color #999 + color var(--text)99 i - color #ccc - -.xygkxeaeontfaokvqmiblezmhvhostak[data-darkmode] - root(true) - -.xygkxeaeontfaokvqmiblezmhvhostak:not([data-darkmode]) - root(false) + color var(--text) </style> diff --git a/src/client/app/desktop/views/widgets/polls.vue b/src/client/app/desktop/views/widgets/polls.vue index 8ff0bb5d0d..c10ac1ca17 100644 --- a/src/client/app/desktop/views/widgets/polls.vue +++ b/src/client/app/desktop/views/widgets/polls.vue @@ -4,7 +4,7 @@ <template slot="header">%fa:chart-pie%%i18n:@title%</template> <button slot="func" title="%i18n:@refresh%" @click="fetch">%fa:sync%</button> - <div class="mkw-polls--body" :data-darkmode="$store.state.device.darkmode"> + <div class="mkw-polls--body"> <div class="poll" v-if="!fetching && poll != null"> <p v-if="poll.text"><router-link :to="poll | notePage">{{ poll.text }}</router-link></p> <p v-if="!poll.text"><router-link :to="poll | notePage">%fa:link%</router-link></p> @@ -64,11 +64,11 @@ export default define({ </script> <style lang="stylus" scoped> -root(isDark) +.mkw-polls--body > .poll padding 16px font-size 12px - color isDark ? #9ea4ad : #555 + color var(--text) > p margin 0 0 8px 0 @@ -91,10 +91,4 @@ root(isDark) > [data-fa] margin-right 4px -.mkw-polls--body[data-darkmode] - root(true) - -.mkw-polls--body:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/widgets/profile.vue b/src/client/app/desktop/views/widgets/profile.vue index aea0c90e34..fa35138c31 100644 --- a/src/client/app/desktop/views/widgets/profile.vue +++ b/src/client/app/desktop/views/widgets/profile.vue @@ -46,8 +46,7 @@ export default define({ </script> <style lang="stylus" scoped> -root(isDark) - +.egwyvoaaryotefqhqtmiyawwefemjfsd-body &[data-compact] > .banner:before content "" @@ -88,7 +87,7 @@ root(isDark) > .banner height 100px - background-color isDark ? #303e4a : #f5f5f5 + background-color var(--primaryDarken10) background-size cover background-position center cursor pointer @@ -109,19 +108,14 @@ root(isDark) margin 10px 0 0 84px line-height 16px font-weight bold - color isDark ? #fff : #555 + color var(--text) > .username display block margin 4px 0 8px 84px line-height 16px font-size 0.9em - color isDark ? #606984 : #999 - -.egwyvoaaryotefqhqtmiyawwefemjfsd-body[data-darkmode] - root(true) - -.egwyvoaaryotefqhqtmiyawwefemjfsd-body:not([data-darkmode]) - root(false) + color var(--text) + opacity 0.7 </style> diff --git a/src/client/app/desktop/views/widgets/users.vue b/src/client/app/desktop/views/widgets/users.vue index 328fa56697..28c6372b6f 100644 --- a/src/client/app/desktop/views/widgets/users.vue +++ b/src/client/app/desktop/views/widgets/users.vue @@ -73,11 +73,11 @@ export default define({ </script> <style lang="stylus" scoped> -root(isDark) +.mkw-users .mkw-users--body > .user padding 16px - border-bottom solid 1px isDark ? #1c2023 : #eee + border-bottom solid 1px var(--faceDivider) &:last-child border-bottom none @@ -103,14 +103,15 @@ root(isDark) margin 0 font-size 16px line-height 24px - color isDark ? #fff : #555 + color var(--text) > .username display block margin 0 font-size 15px line-height 16px - color isDark ? #606984 : #ccc + color var(--text) + opacity 0.7 > .mk-follow-button position absolute @@ -132,10 +133,4 @@ root(isDark) > [data-fa] margin-right 4px -.mkw-users[data-darkmode] - root(true) - -.mkw-users:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/mobile/views/components/drive-file-chooser.vue b/src/client/app/mobile/views/components/drive-file-chooser.vue index 6d3fc2343a..5fca19939e 100644 --- a/src/client/app/mobile/views/components/drive-file-chooser.vue +++ b/src/client/app/mobile/views/components/drive-file-chooser.vue @@ -46,7 +46,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.cdxzvcfawjxdyxsekbxbfgtplebnoneb position fixed z-index 20000 top 0 @@ -59,11 +59,11 @@ root(isDark) > .body width 100% height 100% - background var(--face) + background var(--faceHeader) > header - border-bottom solid 1px isDark ? #1b1f29 : #eee - color isDark ? #fff : #111 + border-bottom solid 1px var(--faceDivider) + color var(--text) > h1 margin 0 @@ -96,10 +96,4 @@ root(isDark) overflow scroll -webkit-overflow-scrolling touch -.cdxzvcfawjxdyxsekbxbfgtplebnoneb[data-darkmode] - root(true) - -.cdxzvcfawjxdyxsekbxbfgtplebnoneb:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue index 616a3aee1b..edba8585bd 100644 --- a/src/client/app/mobile/views/pages/home.vue +++ b/src/client/app/mobile/views/pages/home.vue @@ -22,7 +22,7 @@ <button @click="fn">%fa:pencil-alt%</button> </template> - <main :data-darkmode="$store.state.device.darkmode"> + <main> <div class="nav" v-if="showNav"> <div class="bg" @click="showNav = false"></div> <div class="pointer"></div> diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index a3b508e37e..b83eaf6d33 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -1,7 +1,7 @@ <template> <mk-ui> <span slot="header"><span style="margin-right:4px;">%fa:cog%</span>%i18n:@settings%</span> - <main :data-darkmode="$store.state.device.darkmode"> + <main> <div class="signin-as" v-html="'%i18n:@signed-in-as%'.replace('{}', `<b>${name}</b>`)"></div> <div> diff --git a/src/client/app/mobile/views/pages/user.vue b/src/client/app/mobile/views/pages/user.vue index d7edda1a74..a2a6bd7a83 100644 --- a/src/client/app/mobile/views/pages/user.vue +++ b/src/client/app/mobile/views/pages/user.vue @@ -1,7 +1,7 @@ <template> <mk-ui> <template slot="header" v-if="!fetching"><img :src="user.avatarUrl" alt="">{{ user | userName }}</template> - <main v-if="!fetching" :data-darkmode="$store.state.device.darkmode"> + <main v-if="!fetching"> <div class="is-suspended" v-if="user.isSuspended"><p>%fa:exclamation-triangle% %i18n:@is-suspended%</p></div> <div class="is-remote" v-if="user.host != null"><p>%fa:exclamation-triangle% %i18n:@is-remote%<a :href="user.url || user.uri" target="_blank">%i18n:@view-remote%</a></p></div> <header> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index f8b3420e7c..462999a64f 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -106,6 +106,11 @@ "mfmQuote": ":alpha<0.7<$text", "mfmQuoteLine": ":alpha<0.6<$text", + "suspendedInfoBg": "#611d1d", + "suspendedInfoFg": "#ffb4b4", + "remoteInfoBg": "#42321c", + "remoteInfoFg": "#ffbd3e", + "messagingRoomBg": "@bg", "messagingRoomInfo": "#fff", "messagingRoomDateDividerLine": "rgba(255, 255, 255, 0.1)", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 7652c6027d..60824e0a84 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -106,6 +106,11 @@ "mfmQuote": ":alpha<0.6<$text", "mfmQuoteLine": ":alpha<0.5<$text", + "suspendedInfoBg": "#ffdbdb", + "suspendedInfoFg": "#570808", + "remoteInfoBg": "#fff0db", + "remoteInfoFg": "#573c08", + "messagingRoomBg": "#fff", "messagingRoomInfo": "#000", "messagingRoomDateDividerLine": "rgba(0, 0, 0, 0.1)", From 13f258308ea5dc158a61f7e89b634450171d30ad Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 15:34:34 +0900 Subject: [PATCH 431/539] wip --- src/client/app/desktop/script.ts | 2 - .../received-follow-requests-window.vue | 11 +- .../desktop/views/components/renote-form.vue | 13 +- .../views/components/ui-notification.vue | 14 +- .../views/components/user-lists-window.vue | 11 +- .../desktop/views/components/user-preview.vue | 21 +-- .../desktop/views/pages/deck/deck.column.vue | 14 +- .../desktop/views/pages/deck/deck.note.vue | 20 +-- .../desktop/views/pages/deck/deck.notes.vue | 14 +- .../views/pages/deck/deck.notification.vue | 2 +- .../app/desktop/views/pages/deck/deck.vue | 16 +-- .../views/pages/deck/deck.widgets-column.vue | 13 +- .../desktop/views/pages/user-list.users.vue | 125 ------------------ .../app/desktop/views/pages/user-list.vue | 71 ---------- src/client/theme/dark.json | 6 + src/client/theme/light.json | 8 +- 16 files changed, 45 insertions(+), 316 deletions(-) delete mode 100644 src/client/app/desktop/views/pages/user-list.users.vue delete mode 100644 src/client/app/desktop/views/pages/user-list.vue diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts index 8b184a4aae..05aa928fa3 100644 --- a/src/client/app/desktop/script.ts +++ b/src/client/app/desktop/script.ts @@ -29,7 +29,6 @@ import MkUser from './views/pages/user/user.vue'; import MkFavorites from './views/pages/favorites.vue'; import MkSelectDrive from './views/pages/selectdrive.vue'; import MkDrive from './views/pages/drive.vue'; -import MkUserList from './views/pages/user-list.vue'; import MkHomeCustomize from './views/pages/home-customize.vue'; import MkMessagingRoom from './views/pages/messaging-room.vue'; import MkNote from './views/pages/note.vue'; @@ -63,7 +62,6 @@ init(async (launch) => { { path: '/i/messaging/:user', component: MkMessagingRoom }, { path: '/i/drive', component: MkDrive }, { path: '/i/drive/folder/:folder', component: MkDrive }, - { path: '/i/lists/:list', component: MkUserList }, { path: '/selectdrive', component: MkSelectDrive }, { path: '/search', component: MkSearch }, { path: '/tags/:tag', component: MkTag }, diff --git a/src/client/app/desktop/views/components/received-follow-requests-window.vue b/src/client/app/desktop/views/components/received-follow-requests-window.vue index 8ade6a7210..3df1329c48 100644 --- a/src/client/app/desktop/views/components/received-follow-requests-window.vue +++ b/src/client/app/desktop/views/components/received-follow-requests-window.vue @@ -47,8 +47,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - -root(isDark) +.slpqaxdoxhvglersgjukmvizkqbmbokc padding 16px > button @@ -57,16 +56,10 @@ root(isDark) > div display flex padding 16px - border solid 1px isDark ? #1c2023 : #eee + border solid 1px var(--faceDivider) border-radius 4px > span margin 0 0 0 auto -.slpqaxdoxhvglersgjukmvizkqbmbokc[data-darkmode] - root(true) - -.slpqaxdoxhvglersgjukmvizkqbmbokc:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/components/renote-form.vue b/src/client/app/desktop/views/components/renote-form.vue index ad23740f13..6717ced3b1 100644 --- a/src/client/app/desktop/views/components/renote-form.vue +++ b/src/client/app/desktop/views/components/renote-form.vue @@ -57,16 +57,13 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) - +.mk-renote-form > .preview margin 16px 22px > footer height 72px - background isDark ? #313543 : var(--primaryLighten95) + background var(--desktopRenoteFormFooter) > .quote position absolute @@ -87,10 +84,4 @@ root(isDark) &.ok right 16px -.mk-renote-form[data-darkmode] - root(true) - -.mk-renote-form:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/components/ui-notification.vue b/src/client/app/desktop/views/components/ui-notification.vue index 883a880e5d..dafede4c36 100644 --- a/src/client/app/desktop/views/components/ui-notification.vue +++ b/src/client/app/desktop/views/components/ui-notification.vue @@ -36,7 +36,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.mk-ui-notification display block position fixed z-index 10000 @@ -46,10 +46,10 @@ root(isDark) margin 0 auto padding 128px 0 0 0 width 500px - color rgba(isDark ? #fff : #000, 0.6) - //background rgba(var(--face), 0.9) + color var(--desktopNotificationFg) + background var(--desktopNotificationBg) border-radius 0 0 8px 8px - box-shadow 0 2px 4px rgba(#000, isDark ? 0.4 : 0.2) + box-shadow 0 2px 4px var(--desktopNotificationShadow) transform translateY(-64px) opacity 0 @@ -58,10 +58,4 @@ root(isDark) line-height 64px text-align center -.mk-ui-notification[data-darkmode] - root(true) - -.mk-ui-notification:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/components/user-lists-window.vue b/src/client/app/desktop/views/components/user-lists-window.vue index 4f944981a5..9c384314cf 100644 --- a/src/client/app/desktop/views/components/user-lists-window.vue +++ b/src/client/app/desktop/views/components/user-lists-window.vue @@ -47,8 +47,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - -root(isDark) +.xkxvokkjlptzyewouewmceqcxhpgzprp padding 16px > button @@ -57,13 +56,7 @@ root(isDark) > a display block padding 16px - border solid 1px isDark ? #1c2023 : #eee + border solid 1px var(--faceDivider) border-radius 4px -.xkxvokkjlptzyewouewmceqcxhpgzprp[data-darkmode] - root(true) - -.xkxvokkjlptzyewouewmceqcxhpgzprp:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/components/user-preview.vue b/src/client/app/desktop/views/components/user-preview.vue index 01b6cdbdc5..7f5e79eae1 100644 --- a/src/client/app/desktop/views/components/user-preview.vue +++ b/src/client/app/desktop/views/components/user-preview.vue @@ -83,9 +83,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.mk-user-preview position absolute z-index 2048 margin-top -8px @@ -99,7 +97,7 @@ root(isDark) > .banner height 84px - background-color isDark ? #1c1e26 : #f5f5f5 + background-color rgba(0, 0, 0, 0.1) background-size cover background-position center @@ -123,19 +121,20 @@ root(isDark) margin 0 font-weight bold line-height 16px - color isDark ? #fff : #656565 + color var(--text) > .username display block margin 0 line-height 16px font-size 0.8em - color isDark ? #606984 : #999 + color var(--text) + opacity 0.7 > .description padding 0 16px font-size 0.7em - color isDark ? #9ea4ad : #555 + color var(--text) > .status padding 8px 16px @@ -147,7 +146,7 @@ root(isDark) > p margin 0 font-size 0.7em - color #aaa + color var(--text) > span font-size 1em @@ -158,10 +157,4 @@ root(isDark) top 92px right 8px -.mk-user-preview[data-darkmode] - root(true) - -.mk-user-preview:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 2dba7d2522..1b939f2f58 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -269,9 +269,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.dnpfarvgbnfmyzbdquhhzyxcmstpdqzs $header-height = 42px width 330px @@ -301,7 +299,7 @@ root(isDark) min-width 285px &.naked - background rgba(#000, isDark ? 0.25 : 0.1) + background var(--deckAcrylicColumnBg) > header background transparent @@ -350,7 +348,7 @@ root(isDark) color var(--faceTextButtonHover) &:active - color isDark ? #b2c1d5 : #999 + color var(--faceTextButtonActive) > .toggleActive margin-left -16px @@ -364,10 +362,4 @@ root(isDark) overflow auto overflow-x hidden -.dnpfarvgbnfmyzbdquhhzyxcmstpdqzs[data-darkmode] - root(true) - -.dnpfarvgbnfmyzbdquhhzyxcmstpdqzs:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index 2555c6f7e0..eac0e78f0f 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -214,9 +214,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -mediaRoot(isDark) +.srwrkujossgfuhrbnvqkybtzxpblgchi font-size 13px margin 4px 12px @@ -226,7 +224,7 @@ mediaRoot(isDark) &:last-child margin-bottom 12px -root(isDark) +.zyjjkidcqjnlegkqebitfviomuqmseqk font-size 13px border-bottom solid 1px var(--faceDivider) @@ -409,7 +407,7 @@ root(isDark) margin-right 28px &:hover - color isDark ? #9198af : #666 + color var(--noteActionsHover) > .count display inline @@ -419,16 +417,4 @@ root(isDark) &.reacted color var(--primary) -.zyjjkidcqjnlegkqebitfviomuqmseqk[data-darkmode] - root(true) - -.zyjjkidcqjnlegkqebitfviomuqmseqk:not([data-darkmode]) - root(false) - -.srwrkujossgfuhrbnvqkybtzxpblgchi[data-darkmode] - mediaRoot(true) - -.srwrkujossgfuhrbnvqkybtzxpblgchi:not([data-darkmode]) - mediaRoot(false) - </style> diff --git a/src/client/app/desktop/views/pages/deck/deck.notes.vue b/src/client/app/desktop/views/pages/deck/deck.notes.vue index 7e171a2397..884be3a841 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notes.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notes.vue @@ -195,9 +195,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.eamppglmnmimdhrlzhplwpvyeaqmmhxu .transition .mk-notes-enter .mk-notes-leave-to @@ -238,15 +236,9 @@ root(isDark) border-bottom-right-radius 6px &:hover - background isDark ? #2e3440 : #f5f5f5 + box-shadow 0 0 0 100px inset rgba(0, 0, 0, 0.05) &:active - background isDark ? #21242b : #eee - -.eamppglmnmimdhrlzhplwpvyeaqmmhxu[data-darkmode] - root(true) - -.eamppglmnmimdhrlzhplwpvyeaqmmhxu:not([data-darkmode]) - root(false) + box-shadow 0 0 0 100px inset rgba(0, 0, 0, 0.1) </style> diff --git a/src/client/app/desktop/views/pages/deck/deck.notification.vue b/src/client/app/desktop/views/pages/deck/deck.notification.vue index ff10ac2aa6..b318579b3e 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notification.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notification.vue @@ -142,7 +142,7 @@ root(isDark) > .mk-time margin-left auto - color isDark ? #606984 : #c0c0c0 + color var(--noteHeaderInfo) font-size 0.9em > .note-preview diff --git a/src/client/app/desktop/views/pages/deck/deck.vue b/src/client/app/desktop/views/pages/deck/deck.vue index cd3336079b..22b4c50bb4 100644 --- a/src/client/app/desktop/views/pages/deck/deck.vue +++ b/src/client/app/desktop/views/pages/deck/deck.vue @@ -221,9 +221,7 @@ export default Vue.extend({ </style> <style lang="stylus" scoped> - - -root(isDark) +.qlvquzbjribqcaozciifydkngcwtyzje display flex flex 1 padding 16px 0 16px 16px @@ -251,18 +249,12 @@ root(isDark) > button padding 0 16px - color isDark ? #93a0a5 : #888 + color var(--faceTextButton) &:hover - color isDark ? #b8c5ca : #777 + color var(--faceTextButtonHover) &:active - color isDark ? #fff : #555 - -.qlvquzbjribqcaozciifydkngcwtyzje[data-darkmode] - root(true) - -.qlvquzbjribqcaozciifydkngcwtyzje:not([data-darkmode]) - root(false) + color var(--faceTextButtonActive) </style> diff --git a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue index fe190bf892..e1fecc98bc 100644 --- a/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.widgets-column.vue @@ -135,9 +135,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.wtdtxvecapixsepjtcupubtsmometobz .gqpwvtwtprsbmnssnbicggtwqhmylhnq > header padding 16px @@ -169,14 +167,5 @@ root(isDark) background rgba(#000, 0.7) border-radius 4px - > header - color isDark ? #fff : #000 - -.wtdtxvecapixsepjtcupubtsmometobz[data-darkmode] - root(true) - -.wtdtxvecapixsepjtcupubtsmometobz:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/pages/user-list.users.vue b/src/client/app/desktop/views/pages/user-list.users.vue deleted file mode 100644 index 7d9a4606a1..0000000000 --- a/src/client/app/desktop/views/pages/user-list.users.vue +++ /dev/null @@ -1,125 +0,0 @@ -<template> -<div> - <mk-widget-container> - <template slot="header">%fa:users% %i18n:@users%</template> - <button slot="func" title="%i18n:@add-user%" @click="add">%fa:plus%</button> - - <div data-id="d0b63759-a822-4556-a5ce-373ab966e08a"> - <p class="fetching" v-if="fetching">%fa:spinner .pulse .fw% %i18n:common.loading%<mk-ellipsis/></p> - <template v-else-if="users.length != 0"> - <div class="user" v-for="_user in users"> - <mk-avatar class="avatar" :user="_user"/> - <div class="body"> - <router-link class="name" :to="_user | userPage" v-user-preview="_user.id">{{ _user | userName }}</router-link> - <p class="username">@{{ _user | acct }}</p> - </div> - </div> - </template> - <p class="empty" v-else>%i18n:@no-one%</p> - </div> - </mk-widget-container> -</div> -</template> - -<script lang="ts"> -import Vue from 'vue'; - -export default Vue.extend({ - props: { - list: { - type: Object, - required: true - } - }, - data() { - return { - fetching: true, - users: [] - }; - }, - mounted() { - (this as any).api('users/show', { - userIds: this.list.userIds - }).then(users => { - this.users = users; - this.fetching = false; - }); - }, - methods: { - add() { - (this as any).apis.input({ - title: '%i18n:@username%', - }).then(async (username: string) => { - if (username.startsWith('@')) username = username.slice(1); - const user = await (this as any).api('users/show', { - username - }); - - (this as any).api('users/lists/push', { - listId: this.list.id, - userId: user.id - }); - }); - } - } -}); -</script> - -<style lang="stylus" scoped> -root(isDark) - > .user - padding 16px - border-bottom solid 1px isDark ? #1c2023 : #eee - - &:last-child - border-bottom none - - &:after - content "" - display block - clear both - - > .avatar - display block - float left - margin 0 12px 0 0 - width 42px - height 42px - border-radius 8px - - > .body - float left - width calc(100% - 54px) - - > .name - margin 0 - font-size 16px - line-height 24px - color isDark ? #fff : #555 - - > .username - display block - margin 0 - font-size 15px - line-height 16px - color isDark ? #606984 : #ccc - - > .empty - margin 0 - padding 16px - text-align center - color #aaa - - > .fetching - margin 0 - padding 16px - text-align center - color #aaa - -[data-id="d0b63759-a822-4556-a5ce-373ab966e08a"][data-darkmode] - root(true) - -[data-id="d0b63759-a822-4556-a5ce-373ab966e08a"]:not([data-darkmode]) - root(false) - -</style> diff --git a/src/client/app/desktop/views/pages/user-list.vue b/src/client/app/desktop/views/pages/user-list.vue deleted file mode 100644 index 2241b84e5e..0000000000 --- a/src/client/app/desktop/views/pages/user-list.vue +++ /dev/null @@ -1,71 +0,0 @@ -<template> -<mk-ui> - <div v-if="!fetching" data-id="02010e15-cc48-4245-8636-16078a9b623c"> - <div> - <div><h1>{{ list.title }}</h1></div> - <x-users :list="list"/> - </div> - <main> - <mk-user-list-timeline :list="list"/> - </main> - </div> -</mk-ui> -</template> - -<script lang="ts"> -import Vue from 'vue'; -import XUsers from './user-list.users.vue'; - -export default Vue.extend({ - components: { - XUsers - }, - data() { - return { - fetching: true, - list: null - }; - }, - watch: { - $route: 'fetch' - }, - mounted() { - this.fetch(); - }, - methods: { - fetch() { - this.fetching = true; - - (this as any).api('users/lists/show', { - listId: this.$route.params.list - }).then(list => { - this.list = list; - this.fetching = false; - }); - } - } -}); -</script> - -<style lang="stylus" scoped> -[data-id="02010e15-cc48-4245-8636-16078a9b623c"] - display flex - justify-content center - margin 0 auto - max-width 1200px - - > main - > div > div - > *:not(:last-child) - margin-bottom 16px - - > main - padding 16px - width calc(100% - 275px * 2) - - > div - width 275px - margin 0 - padding 16px 0 16px 16px - -</style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 462999a64f..97ec96827a 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -126,9 +126,13 @@ "desktopHeaderSearchBg": "rgba(0, 0, 0, 0.1)", "desktopHeaderSearchHoverBg": "rgba(255, 255, 255, 0.04)", "desktopHeaderSearchFg": "#fff", + "desktopNotificationBg": ":alpha<0.9<$secondary", + "desktopNotificationFg": ":alpha<0.7<$text", + "desktopNotificationShadow": "rgba(0, 0, 0, 0.4)", "desktopPostFormBg": "@face", "desktopPostFormTextareaBg": "rgba(0, 0, 0, 0.25)", "desktopPostFormTextareaFg": "#fff", + "desktopRenoteFormFooter": ":lighten<5<$secondary", "desktopTimelineHeaderShadow": "rgba(0, 0, 0, 0.15)", "desktopTimelineSrc": "@faceTextButton", "desktopTimelineSrcHover": "@faceTextButtonHover", @@ -136,6 +140,8 @@ "desktopSettingsNavItem": ":alpha<0.8<$text", "desktopSettingsNavItemHover": ":lighten<10<$text", + "deckAcrylicColumnBg": "rgba(0, 0, 0, 0.25)", + "mobileHeaderBg": ":lighten<5<$secondary", "mobileHeaderFg": "$text", "mobileNavBackdrop": "rgba(0, 0, 0, 0.7)", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 60824e0a84..52822bc5fe 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -126,9 +126,13 @@ "desktopHeaderSearchBg": "rgba(0, 0, 0, 0.05)", "desktopHeaderSearchHoverBg": "rgba(0, 0, 0, 0.08)", "desktopHeaderSearchFg": "#000", - "desktopPostFormBg": "#fff6f6", + "desktopNotificationBg": ":alpha<0.9<$secondary", + "desktopNotificationFg": ":alpha<0.7<$text", + "desktopNotificationShadow": "rgba(0, 0, 0, 0.2)", + "desktopPostFormBg": ":lighten<33<$primary", "desktopPostFormTextareaBg": "#fff", "desktopPostFormTextareaFg": "#333", + "desktopRenoteFormFooter": ":lighten<33<$primary", "desktopTimelineHeaderShadow": "rgba(0, 0, 0, 0.08)", "desktopTimelineSrc": "#6f7477", "desktopTimelineSrcHover": "#525a5f", @@ -136,6 +140,8 @@ "desktopSettingsNavItem": ":alpha<0.8<$text", "desktopSettingsNavItemHover": ":darken<10<$text", + "deckAcrylicColumnBg": "rgba(0, 0, 0, 0.1)", + "mobileHeaderBg": ":lighten<5<$secondary", "mobileHeaderFg": "$text", "mobileNavBackdrop": "rgba(0, 0, 0, 0.2)", From 0343de95b8843124adcbec1f1665369cdb185718 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 15:56:50 +0900 Subject: [PATCH 432/539] wip --- .../app/desktop/views/components/post-form.vue | 14 ++++---------- src/client/theme/dark.json | 3 +++ src/client/theme/light.json | 3 +++ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index 5dd40c9ba5..b2a6fed8e8 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -434,7 +434,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.mk-post-form display block padding 16px background var(--desktopPostFormBg) @@ -677,7 +677,7 @@ root(isDark) width 40px height 40px font-size 1em - color isDark ? var(--primary) : var(--primaryAlpha05) + color var(--desktopPostFormTransparentButtonFg) background transparent outline none border solid 1px transparent @@ -685,11 +685,11 @@ root(isDark) &:hover background transparent - border-color isDark ? var(--primaryAlpha05) : var(--primaryAlpha03) + border-color var(--primaryAlpha03) &:active color var(--primaryAlpha06) - background isDark ? transparent : linear-gradient(to bottom, var(--primaryLighten80) 0%, var(--primaryLighten90) 100%) + background linear-gradient(to bottom, var(--desktopPostFormTransparentButtonActiveGradientStart) 0%, var(--desktopPostFormTransparentButtonActiveGradientEnd) 100%) border-color var(--primaryAlpha05) box-shadow 0 2px 4px rgba(#000, 0.15) inset @@ -714,10 +714,4 @@ root(isDark) border dashed 2px var(--primaryAlpha05) pointer-events none -.mk-post-form[data-darkmode] - root(true) - -.mk-post-form:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 97ec96827a..ee5e1fb42c 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -132,6 +132,9 @@ "desktopPostFormBg": "@face", "desktopPostFormTextareaBg": "rgba(0, 0, 0, 0.25)", "desktopPostFormTextareaFg": "#fff", + "desktopPostFormTransparentButtonFg": "$primary", + "desktopPostFormTransparentButtonActiveGradientStart": ":darken<8<$secondary", + "desktopPostFormTransparentButtonActiveGradientEnd": ":darken<3<$secondary", "desktopRenoteFormFooter": ":lighten<5<$secondary", "desktopTimelineHeaderShadow": "rgba(0, 0, 0, 0.15)", "desktopTimelineSrc": "@faceTextButton", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 52822bc5fe..4cfba2c1f6 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -132,6 +132,9 @@ "desktopPostFormBg": ":lighten<33<$primary", "desktopPostFormTextareaBg": "#fff", "desktopPostFormTextareaFg": "#333", + "desktopPostFormTransparentButtonFg": ":alpha<0.5<$primary", + "desktopPostFormTransparentButtonActiveGradientStart": ":lighten<30<$primary", + "desktopPostFormTransparentButtonActiveGradientEnd": ":lighten<33<$primary", "desktopRenoteFormFooter": ":lighten<33<$primary", "desktopTimelineHeaderShadow": "rgba(0, 0, 0, 0.08)", "desktopTimelineSrc": "#6f7477", From 99a2c5b3fa552f2abe449cb3f5b3d40270be5478 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 15:58:23 +0900 Subject: [PATCH 433/539] wip --- src/client/app/desktop/views/components/home.vue | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index a07af02ea6..bdaf2ddf47 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -247,9 +247,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.mk-home display block &[data-customize] @@ -279,7 +277,7 @@ root(isDark) left 0 width 100% height 48px - color isDark ? #fff : #000 + color var(--text) background var(--desktopHeaderBg) box-shadow 0 1px 1px rgba(#000, 0.075) @@ -320,7 +318,7 @@ root(isDark) line-height 48px &.trash - border-left solid 1px isDark ? #1c2023 : #ddd + border-left solid 1px var(--faceDivider) > div width 100% @@ -395,10 +393,4 @@ root(isDark) max-width 700px margin 0 auto -.mk-home[data-darkmode] - root(true) - -.mk-home:not([data-darkmode]) - root(false) - </style> From 671c7cf06b4f7f6248f9a961f79af1cc78a7b598 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 16:08:09 +0900 Subject: [PATCH 434/539] wip --- .../views/components/follow-button.vue | 33 +++++++------------ 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/src/client/app/desktop/views/components/follow-button.vue b/src/client/app/desktop/views/components/follow-button.vue index 014b536f59..45e63ad928 100644 --- a/src/client/app/desktop/views/components/follow-button.vue +++ b/src/client/app/desktop/views/components/follow-button.vue @@ -101,9 +101,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.mk-follow-button display block cursor pointer padding 0 @@ -130,33 +128,30 @@ root(isDark) border-radius 8px &:not(.active) - color isDark ? #fff : #888 - background isDark ? linear-gradient(to bottom, #313543 0%, #282c37 100%) : linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%) - border solid 1px isDark ? #1c2023 : #e2e2e2 + color var(--primary) + border solid 1px var(--primary) &:hover - background isDark ? linear-gradient(to bottom, #2c2f3c 0%, #22262f 100%) : linear-gradient(to bottom, #f9f9f9 0%, #ececec 100%) - border-color isDark ? #151a1d : #dcdcdc + background var(--primaryAlpha03) &:active - background isDark ? #22262f : #ececec - border-color isDark ? #151a1d : #dcdcdc + background var(--primaryAlpha05) &.active color var(--primaryForeground) - background linear-gradient(to bottom, var(--primaryLighten25) 0%, var(--primaryLighten10) 100%) - border solid 1px var(--primaryLighten15) + background var(--primary) + border solid 1px var(--primary) &:not(:disabled) font-weight bold &:hover:not(:disabled) - background linear-gradient(to bottom, var(--primaryLighten8) 0%, var(--primaryDarken8) 100%) - border-color var(--primary) + background var(--primaryLighten5) + border-color var(--primaryLighten5) &:active:not(:disabled) - background var(--primary) - border-color var(--primary) + background var(--primaryDarken5) + border-color var(--primaryDarken5) &.wait cursor wait !important @@ -167,10 +162,4 @@ root(isDark) height 38px line-height 38px -.mk-follow-button[data-darkmode] - root(true) - -.mk-follow-button:not([data-darkmode]) - root(false) - </style> From e0d3fd17ce5df8ac7e2adc5c4434cd8b050e5a86 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 16:13:47 +0900 Subject: [PATCH 435/539] wio --- src/client/app/desktop/views/components/drive.vue | 15 +++------------ src/client/theme/dark.json | 1 + src/client/theme/light.json | 1 + 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/client/app/desktop/views/components/drive.vue b/src/client/app/desktop/views/components/drive.vue index a1748963aa..f9b7eea64e 100644 --- a/src/client/app/desktop/views/components/drive.vue +++ b/src/client/app/desktop/views/components/drive.vue @@ -585,17 +585,14 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) - +.mk-drive > nav display block z-index 2 width 100% overflow auto font-size 0.9em - color isDark ? #d2d9dc : #555 + color var(--text) background var(--face) box-shadow 0 1px 0 rgba(#000, 0.05) @@ -674,7 +671,7 @@ root(isDark) padding 8px height calc(100% - 38px) overflow auto - background isDark ? #191b22 : #fff + background var(--desktopDriveBg) &, * user-select none @@ -780,10 +777,4 @@ root(isDark) > input display none -.mk-drive[data-darkmode] - root(true) - -.mk-drive:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index ee5e1fb42c..151001350d 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -140,6 +140,7 @@ "desktopTimelineSrc": "@faceTextButton", "desktopTimelineSrcHover": "@faceTextButtonHover", "desktopWindowTitle": "@faceHeaderText", + "desktopDriveBg": "@bg", "desktopSettingsNavItem": ":alpha<0.8<$text", "desktopSettingsNavItemHover": ":lighten<10<$text", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 4cfba2c1f6..0f26f8b165 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -140,6 +140,7 @@ "desktopTimelineSrc": "#6f7477", "desktopTimelineSrcHover": "#525a5f", "desktopWindowTitle": "#666", + "desktopDriveBg": "#fff", "desktopSettingsNavItem": ":alpha<0.8<$text", "desktopSettingsNavItemHover": ":darken<10<$text", From 3f4de3b1cc9b33f741c28aa7c3f92ffdb5fbcd17 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 17:49:37 +0900 Subject: [PATCH 436/539] wip --- .../desktop/views/components/drive.folder.vue | 20 ++++++------------- src/client/theme/dark.json | 4 ++++ src/client/theme/light.json | 4 ++++ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/client/app/desktop/views/components/drive.folder.vue b/src/client/app/desktop/views/components/drive.folder.vue index cb49215cbb..cfc2b64ff4 100644 --- a/src/client/app/desktop/views/components/drive.folder.vue +++ b/src/client/app/desktop/views/components/drive.folder.vue @@ -214,12 +214,10 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.ynntpczxvnusfwdyxsfuhvcmuypqopdd padding 8px height 64px - background isDark ? var(--primaryAlpha02) : var(--primaryLighten95) + background var(--desktopDriveFolderBg) border-radius 4px &, * @@ -229,10 +227,10 @@ root(isDark) pointer-events none &:hover - //background isDark ? rgba(var(--primaryLighten10), 0.2) : var(--primaryLighten90) + background var(--desktopDriveFolderHoverBg) &:active - //background isDark ? rgba(var(--primaryDarken10), 0.2) : var(--primaryLighten85) + background var(--desktopDriveFolderActiveBg) &[data-is-contextmenu-showing] &[data-draghover] @@ -248,22 +246,16 @@ root(isDark) border-radius 4px &[data-draghover] - //background isDark ? rgba(var(--primaryDarken10), 0.2) : var(--primaryLighten90) + background var(--desktopDriveFolderActiveBg) > .name margin 0 font-size 0.9em - color isDark ? #fff : var(--primaryDarken30) + color var(--desktopDriveFolderFg) > [data-fa] margin-right 4px margin-left 2px text-align left -.ynntpczxvnusfwdyxsfuhvcmuypqopdd[data-darkmode] - root(true) - -.ynntpczxvnusfwdyxsfuhvcmuypqopdd:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 151001350d..29d4fc2e5d 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -141,6 +141,10 @@ "desktopTimelineSrcHover": "@faceTextButtonHover", "desktopWindowTitle": "@faceHeaderText", "desktopDriveBg": "@bg", + "desktopDriveFolderBg": ":alpha<0.2<$primary", + "desktopDriveFolderHoverBg": ":alpha<0.3<$primary", + "desktopDriveFolderActiveBg": ":alpha<0.3<:darken<10<$primary", + "desktopDriveFolderFg": "#fff", "desktopSettingsNavItem": ":alpha<0.8<$text", "desktopSettingsNavItemHover": ":lighten<10<$text", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 0f26f8b165..e4116480e2 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -141,6 +141,10 @@ "desktopTimelineSrcHover": "#525a5f", "desktopWindowTitle": "#666", "desktopDriveBg": "#fff", + "desktopDriveFolderBg": ":lighten<31<$primary", + "desktopDriveFolderHoverBg": ":lighten<27<$primary", + "desktopDriveFolderActiveBg": ":lighten<25<$primary", + "desktopDriveFolderFg": ":darken<10<$primary", "desktopSettingsNavItem": ":alpha<0.8<$text", "desktopSettingsNavItemHover": ":darken<10<$text", From 8e3dd75c8577633acbe2dfefd41119e3991de8a5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 19:59:19 +0900 Subject: [PATCH 437/539] wip --- .../components/games/reversi/reversi.game.vue | 22 ++---- .../games/reversi/reversi.index.vue | 34 ++++----- .../components/games/reversi/reversi.room.vue | 37 ++++------ .../components/games/reversi/reversi.vue | 14 +--- .../views/components/messaging-room.form.vue | 12 +--- .../app/common/views/components/poll.vue | 17 ++--- .../app/common/views/components/tag-cloud.vue | 8 +-- .../app/common/views/components/trends.vue | 15 ++-- .../app/common/views/components/ui/button.vue | 14 ++-- .../views/components/ui/form/button.vue | 20 ++---- .../common/views/components/ui/form/radio.vue | 12 +--- .../app/common/views/components/ui/input.vue | 16 ++--- .../app/common/views/components/ui/radio.vue | 10 +-- .../app/common/views/components/ui/select.vue | 16 ++--- src/client/app/common/views/pages/follow.vue | 13 +--- .../app/common/views/widgets/analog-clock.vue | 10 +-- .../app/common/views/widgets/calendar.vue | 15 ++-- .../app/common/views/widgets/donation.vue | 72 +++++++------------ src/client/app/common/views/widgets/memo.vue | 14 +--- .../app/common/views/widgets/server.cpu.vue | 10 +-- .../app/common/views/widgets/server.disk.vue | 10 +-- .../common/views/widgets/server.memory.vue | 10 +-- .../app/common/views/widgets/server.pie.vue | 10 +-- .../views/components/context-menu.menu.vue | 16 ++--- .../desktop/views/components/context-menu.vue | 10 +-- .../desktop/views/components/drive.file.vue | 12 +--- .../desktop/views/components/note-preview.vue | 8 +-- .../views/components/notes.note.sub.vue | 8 +-- .../views/components/post-form-window.vue | 11 +-- .../views/components/settings.tags.vue | 9 +-- .../desktop/views/components/ui.header.vue | 8 +-- .../views/components/widget-container.vue | 8 +-- .../app/desktop/views/components/window.vue | 19 +---- .../views/pages/admin/admin.cpu-memory.vue | 8 +-- .../desktop/views/pages/deck/deck.column.vue | 5 +- .../views/pages/deck/deck.note.sub.vue | 8 +-- .../views/pages/deck/deck.notification.vue | 8 +-- .../views/pages/deck/deck.notifications.vue | 9 +-- .../pages/user/user.followers-you-know.vue | 8 +-- .../app/desktop/views/widgets/trends.vue | 8 +-- .../mobile/views/components/note-preview.vue | 8 +-- .../app/mobile/views/components/notes.vue | 10 +-- src/client/app/mobile/views/pages/welcome.vue | 9 +-- src/client/theme/dark.json | 30 +++++++- src/client/theme/light.json | 30 +++++++- 45 files changed, 200 insertions(+), 461 deletions(-) diff --git a/src/client/app/common/views/components/games/reversi/reversi.game.vue b/src/client/app/common/views/components/games/reversi/reversi.game.vue index bc230496a6..751abe2ecd 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.game.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.game.vue @@ -304,9 +304,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.xqnhankfuuilcwvhgsopeqncafzsquya text-align center > .go-index @@ -319,7 +317,7 @@ root(isDark) > header padding 8px - border-bottom dashed 1px isDark ? #4c5761 : #c4cdd4 + border-bottom dashed 1px var(--reversiGameHeaderLine) a color inherit @@ -386,16 +384,16 @@ root(isDark) user-select none &.empty - border solid 2px isDark ? #51595f : #eee + border solid 2px var(--reversiGameEmptyCell) &.empty.can - background isDark ? #51595f : #eee + background var(--reversiGameEmptyCell) &.empty.myTurn - border-color isDark ? #6a767f : #ddd + border-color var(--reversiGameEmptyCellMyTurn) &.can - background isDark ? #51595f : #eee + background var(--reversiGameEmptyCellCanPut) cursor pointer &:hover @@ -409,7 +407,7 @@ root(isDark) box-shadow 0 0 0 4px var(--primaryAlpha07) &.isEnded - border-color isDark ? #6a767f : #ddd + border-color var(--reversiGameEmptyCellMyTurn) &.none border-color transparent !important @@ -458,10 +456,4 @@ root(isDark) margin 0 8px min-width 70px -.xqnhankfuuilcwvhgsopeqncafzsquya[data-darkmode] - root(true) - -.xqnhankfuuilcwvhgsopeqncafzsquya:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/components/games/reversi/reversi.index.vue b/src/client/app/common/views/components/games/reversi/reversi.index.vue index 44a1262636..3725aa6cb4 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.index.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.index.vue @@ -138,9 +138,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.phgnkghfpyvkrvwiajkiuoxyrdaqpzcx > h1 margin 0 padding 24px @@ -148,7 +146,7 @@ root(isDark) text-align center font-weight normal color #fff - background linear-gradient(to bottom, isDark ? #45730e : #8bca3e, isDark ? #464300 : #d6cf31) + background linear-gradient(to bottom, var(--reversiBannerGradientStart), var(--reversiBannerGradientEnd)) & + p margin 0 @@ -156,7 +154,7 @@ root(isDark) margin-bottom 12px text-align center font-size 14px - border-bottom solid 1px isDark ? #535f65 : #d3d9dc + border-bottom solid 1px var(--faceDivider) > .play margin 0 auto @@ -171,14 +169,14 @@ root(isDark) padding 16px font-size 14px text-align left - background isDark ? #282c37 : #f5f5f5 + background var(--reversiDescBg) border-radius 8px > section margin 0 auto padding 0 16px 16px 16px max-width 500px - border-top solid 1px isDark ? #535f65 : #d3d9dc + border-top solid 1px var(--faceDivider) > h2 margin 0 @@ -189,9 +187,9 @@ root(isDark) .invitation margin 8px 0 padding 8px - color isDark ? #fff : #677f84 + color var(--text) background var(--face) - box-shadow 0 2px 16px rgba(#000, isDark ? 0.7 : 0.15) + box-shadow 0 2px 16px var(--reversiListItemShadow) border-radius 6px cursor pointer @@ -203,10 +201,10 @@ root(isDark) border-color var(--primary) &:hover - background isDark ? #313543 : #f5f5f5 + box-shadow 0 0 0 100px inset rgba(0, 0, 0, 0.05) &:active - background isDark ? #1e222b : #eee + box-shadow 0 0 0 100px inset rgba(0, 0, 0, 0.1) > .avatar width 32px @@ -221,9 +219,9 @@ root(isDark) display block margin 8px 0 padding 8px - color isDark ? #fff : #677f84 + color var(--text) background var(--face) - box-shadow 0 2px 16px rgba(#000, isDark ? 0.7 : 0.15) + box-shadow 0 2px 16px var(--reversiListItemShadow) border-radius 6px cursor pointer @@ -232,10 +230,10 @@ root(isDark) user-select none &:hover - background isDark ? #313543 : #f5f5f5 + box-shadow 0 0 0 100px inset rgba(0, 0, 0, 0.05) &:active - background isDark ? #1e222b : #eee + box-shadow 0 0 0 100px inset rgba(0, 0, 0, 0.1) > .avatar width 32px @@ -246,10 +244,4 @@ root(isDark) margin 0 8px line-height 32px -.phgnkghfpyvkrvwiajkiuoxyrdaqpzcx[data-darkmode] - root(true) - -.phgnkghfpyvkrvwiajkiuoxyrdaqpzcx:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/components/games/reversi/reversi.room.vue b/src/client/app/common/views/components/games/reversi/reversi.room.vue index b407046ba9..236141ee28 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.room.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.room.vue @@ -252,11 +252,9 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.urbixznjwwuukfsckrwzwsqzsxornqij text-align center - background isDark ? #191b22 : #f9f9f9 + background var(--bg) > header padding 8px @@ -274,9 +272,9 @@ root(isDark) width 100% padding 12px 14px background var(--face) - border 1px solid isDark ? #6a707d : #dcdfe6 + border 1px solid var(--reversiMapSelectBorder) border-radius 4px - color isDark ? #fff : #606266 + color var(--text) cursor pointer transition border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) -webkit-appearance none @@ -284,7 +282,7 @@ root(isDark) appearance none &:hover - border-color isDark ? #a7aebd : #c0c4cc + border-color var(--reversiMapSelectHoverBorder) &:focus &:active @@ -294,7 +292,8 @@ root(isDark) > .random padding 32px 0 font-size 64px - color isDark ? #4e5961 : #d8d8d8 + color var(--text) + opacity 0.7 > .board display grid @@ -302,11 +301,11 @@ root(isDark) width 300px height 300px margin 0 auto - color isDark ? #fff : #444 + color var(--text) > div background transparent - border solid 2px isDark ? #6a767f : #ddd + border solid 2px var(--faceDivider) border-radius 6px overflow hidden cursor pointer @@ -332,31 +331,25 @@ root(isDark) max-width 400px border-radius 4px background var(--face) - color isDark ? #fff : #303133 - box-shadow 0 2px 12px 0 rgba(#000, isDark ? 0.7 : 0.1) + color var(--text) + box-shadow 0 2px 12px 0 var(--reversiRoomFormShadow) > header padding 18px 20px - border-bottom 1px solid isDark ? #1c2023 : #ebeef5 + border-bottom 1px solid var(--faceDivider) > div padding 20px - color isDark ? #fff : #606266 + color var(--text) > footer position sticky bottom 0 padding 16px - background rgba(isDark ? #191b22 : #fff, 0.9) - border-top solid 1px isDark ? #606266 : #c4cdd4 + background var(--reversiRoomFooterBg) + border-top solid 1px var(--faceDivider) > .status margin 0 0 16px 0 -.urbixznjwwuukfsckrwzwsqzsxornqij[data-darkmode] - root(true) - -.urbixznjwwuukfsckrwzwsqzsxornqij:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/components/games/reversi/reversi.vue b/src/client/app/common/views/components/games/reversi/reversi.vue index 75d7d574c1..6eb9511ce9 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.vue @@ -156,11 +156,9 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) - color isDark ? #fff : #677f84 - background isDark ? #191b22 : #fff +.vchtoekanapleubgzioubdtmlkribzfd + color var(--text) + background var(--bg) > .matching > h1 @@ -177,10 +175,4 @@ root(isDark) text-align center border-top dashed 1px #c4cdd4 -.vchtoekanapleubgzioubdtmlkribzfd[data-darkmode] - root(true) - -.vchtoekanapleubgzioubdtmlkribzfd:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/components/messaging-room.form.vue b/src/client/app/common/views/components/messaging-room.form.vue index 8e62587c20..c93fd7f78d 100644 --- a/src/client/app/common/views/components/messaging-room.form.vue +++ b/src/client/app/common/views/components/messaging-room.form.vue @@ -195,9 +195,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.mk-messaging-form > textarea cursor auto display block @@ -212,7 +210,7 @@ root(isDark) color var(--inputText) outline none border none - border-top solid 1px isDark ? #4b5056 : #eee + border-top solid 1px var(--faceDivider) border-radius 0 box-shadow none background transparent @@ -302,10 +300,4 @@ root(isDark) input[type=file] display none -.mk-messaging-form[data-darkmode] - root(true) - -.mk-messaging-form:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/components/poll.vue b/src/client/app/common/views/components/poll.vue index 0e60932796..0dc2622f9b 100644 --- a/src/client/app/common/views/components/poll.vue +++ b/src/client/app/common/views/components/poll.vue @@ -67,10 +67,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) - +.mk-poll > ul display block margin 0 @@ -82,8 +79,8 @@ root(isDark) margin 4px 0 padding 4px 8px width 100% - color isDark ? #fff : #000 - border solid 1px isDark ? #5e636f : #eee + color var(--pollChoiceText) + border solid 1px var(--pollChoiceBorder) border-radius 4px overflow hidden cursor pointer @@ -110,7 +107,7 @@ root(isDark) margin-left 4px > p - color isDark ? #a3aebf : #000 + color var(--text) a color inherit @@ -125,10 +122,4 @@ root(isDark) &:active background transparent -.mk-poll[data-darkmode] - root(true) - -.mk-poll:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/components/tag-cloud.vue b/src/client/app/common/views/components/tag-cloud.vue index 5f2cc5276a..5cc828082f 100644 --- a/src/client/app/common/views/components/tag-cloud.vue +++ b/src/client/app/common/views/components/tag-cloud.vue @@ -63,7 +63,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.jtivnzhfwquxpsfidertopbmwmchmnmo height 100% width 100% @@ -81,10 +81,4 @@ root(isDark) height 100% width 100% -.jtivnzhfwquxpsfidertopbmwmchmnmo[data-darkmode] - root(true) - -.jtivnzhfwquxpsfidertopbmwmchmnmo:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/components/trends.vue b/src/client/app/common/views/components/trends.vue index 0042dbe853..3d36d7449c 100644 --- a/src/client/app/common/views/components/trends.vue +++ b/src/client/app/common/views/components/trends.vue @@ -49,13 +49,14 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.csqvmxybqbycalfhkxvyfrgbrdalkaoc > .fetching > .empty margin 0 padding 16px text-align center - color #aaa + color var(--text) + opacity 0.7 > [data-fa] margin-right 4px @@ -70,13 +71,13 @@ root(isDark) padding 14px 16px &:not(:last-child) - border-bottom solid 1px isDark ? #393f4f : #eee + border-bottom solid 1px var(--faceDivider) > .tag flex 1 overflow hidden font-size 14px - color isDark ? #9baec8 : #65727b + color var(--text) > a display block @@ -94,10 +95,4 @@ root(isDark) > .chart height 30px -.csqvmxybqbycalfhkxvyfrgbrdalkaoc[data-darkmode] - root(true) - -.csqvmxybqbycalfhkxvyfrgbrdalkaoc:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/components/ui/button.vue b/src/client/app/common/views/components/ui/button.vue index c411f0f5c9..4934a1bdfa 100644 --- a/src/client/app/common/views/components/ui/button.vue +++ b/src/client/app/common/views/components/ui/button.vue @@ -32,7 +32,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark, fill) +root(fill) > button display block width 100% @@ -65,16 +65,10 @@ root(isDark, fill) &:active background var(--primaryAlpha03) -.ui-button[data-darkmode] +.ui-button &.fill - root(true, true) + root(true) &:not(.fill) - root(true, false) - -.ui-button:not([data-darkmode]) - &.fill - root(false, true) - &:not(.fill) - root(false, false) + root(false) </style> diff --git a/src/client/app/common/views/components/ui/form/button.vue b/src/client/app/common/views/components/ui/form/button.vue index bccf36e52f..3fd7b47629 100644 --- a/src/client/app/common/views/components/ui/form/button.vue +++ b/src/client/app/common/views/components/ui/form/button.vue @@ -25,9 +25,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.nvemkhtwcnnpkdrwfcbzuwhfulejhmzg display inline-block & + .nvemkhtwcnnpkdrwfcbzuwhfulejhmzg @@ -38,11 +36,11 @@ root(isDark) margin 0 padding 12px 20px font-size 14px - border 1px solid isDark ? #6d727d : #dcdfe6 + border 1px solid var(--formButtonBorder) border-radius 4px outline none box-shadow none - color isDark ? #fff : #606266 + color var(--text) transition 0.1s * @@ -51,12 +49,12 @@ root(isDark) &:hover &:focus color var(--primary) - //background rgba(var(--primary-r), var(--primary-g), var(--primary-b), isDark ? 0.2 : 0.12) - //border-color rgba(var(--primary-r), var(--primary-g), var(--primary-b), isDark ? 0.5 : 0.3) + background var(--formButtonHoverBg) + border-color var(--formButtonHoverBorder) &:active color var(--primaryDarken20) - //background rgba(var(--primary-r), var(--primary-g), var(--primary-b), 0.12) + background var(--formButtonActiveBg) border-color var(--primary) transition all 0s @@ -80,10 +78,4 @@ root(isDark) > button border-radius 64px -.nvemkhtwcnnpkdrwfcbzuwhfulejhmzg[data-darkmode] - root(true) - -.nvemkhtwcnnpkdrwfcbzuwhfulejhmzg:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/components/ui/form/radio.vue b/src/client/app/common/views/components/ui/form/radio.vue index 5728a8171b..396b2997e5 100644 --- a/src/client/app/common/views/components/ui/form/radio.vue +++ b/src/client/app/common/views/components/ui/form/radio.vue @@ -49,9 +49,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.uywduthvrdnlpsvsjkqigicixgyfctto display inline-flex margin 0 16px 0 0 cursor pointer @@ -93,7 +91,7 @@ root(isDark) width 20px height 20px background none - border solid 2px isDark ? rgba(#fff, 0.6) : rgba(#000, 0.4) + border solid 2px var(--radioBorder) border-radius 100% transition inherit @@ -117,10 +115,4 @@ root(isDark) line-height 20px cursor pointer -.uywduthvrdnlpsvsjkqigicixgyfctto[data-darkmode] - root(true) - -.uywduthvrdnlpsvsjkqigicixgyfctto:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue index d7b83d81cd..d7e72409f0 100644 --- a/src/client/app/common/views/components/ui/input.vue +++ b/src/client/app/common/views/components/ui/input.vue @@ -155,9 +155,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark, fill) +root(fill) margin 32px 0 > .icon @@ -335,16 +333,10 @@ root(isDark, fill) left 0 !important transform scale(0.75) -.ui-input[data-darkmode] +.ui-input &.fill - root(true, true) + root(true) &:not(.fill) - root(true, false) - -.ui-input:not([data-darkmode]) - &.fill - root(false, true) - &:not(.fill) - root(false, false) + root(false) </style> diff --git a/src/client/app/common/views/components/ui/radio.vue b/src/client/app/common/views/components/ui/radio.vue index 3a4407abc0..868a339aa4 100644 --- a/src/client/app/common/views/components/ui/radio.vue +++ b/src/client/app/common/views/components/ui/radio.vue @@ -51,9 +51,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.ui-radio display inline-block margin 0 32px 0 0 cursor pointer @@ -111,10 +109,4 @@ root(isDark) line-height 20px cursor pointer -.ui-radio[data-darkmode] - root(true) - -.ui-radio:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/components/ui/select.vue b/src/client/app/common/views/components/ui/select.vue index bdb730fea9..8c1b8c0269 100644 --- a/src/client/app/common/views/components/ui/select.vue +++ b/src/client/app/common/views/components/ui/select.vue @@ -70,9 +70,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark, fill) +root(fill) margin 32px 0 > .icon @@ -200,16 +198,10 @@ root(isDark, fill) left 0 !important transform scale(0.75) -.ui-select[data-darkmode] +.ui-select &.fill - root(true, true) + root(true) &:not(.fill) - root(true, false) - -.ui-select:not([data-darkmode]) - &.fill - root(false, true) - &:not(.fill) - root(false, false) + root(false) </style> diff --git a/src/client/app/common/views/pages/follow.vue b/src/client/app/common/views/pages/follow.vue index ef7ee111e2..cb4785f468 100644 --- a/src/client/app/common/views/pages/follow.vue +++ b/src/client/app/common/views/pages/follow.vue @@ -107,14 +107,12 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.syxhndwprovvuqhmyvveewmbqayniwkv padding 32px max-width 500px margin 0 auto text-align center - color isDark ? #9baec8 : #868c8c + color var(--text) $bg = var(--face) @@ -124,7 +122,6 @@ root(isDark) > .signed-in-as margin-bottom 16px font-size 14px - color isDark ? #9baec8 : #9daab3 > main margin-bottom 16px @@ -204,10 +201,4 @@ root(isDark) * pointer-events none -.syxhndwprovvuqhmyvveewmbqayniwkv[data-darkmode] - root(true) - -.syxhndwprovvuqhmyvveewmbqayniwkv:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/widgets/analog-clock.vue b/src/client/app/common/views/widgets/analog-clock.vue index 1725c2f1af..cfcdd5a1b6 100644 --- a/src/client/app/common/views/widgets/analog-clock.vue +++ b/src/client/app/common/views/widgets/analog-clock.vue @@ -26,16 +26,8 @@ export default define({ </script> <style lang="stylus" scoped> - - -root(isDark) +.mkw-analog-clock .mkw-analog-clock--body padding 8px -.mkw-analog-clock[data-darkmode] - root(true) - -.mkw-analog-clock:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/widgets/calendar.vue b/src/client/app/common/views/widgets/calendar.vue index 238b493a61..308d73bad8 100644 --- a/src/client/app/common/views/widgets/calendar.vue +++ b/src/client/app/common/views/widgets/calendar.vue @@ -116,9 +116,7 @@ export default define({ </script> <style lang="stylus" scoped> - - -root(isDark) +.mkw-calendar &[data-special='on-new-years-day'] border-color #ef95a0 @@ -169,7 +167,8 @@ root(isDark) margin 0 0 2px 0 font-size 12px line-height 18px - color isDark ? #7a8692 : #888 + color var(--text) + opacity 0.8 > b margin-left 2px @@ -177,7 +176,7 @@ root(isDark) > .meter width 100% overflow hidden - background isDark ? #1c1f25 : #eee + background var(--materBg) border-radius 8px > .val @@ -197,10 +196,4 @@ root(isDark) > .meter > .val background #41ddde -.mkw-calendar[data-darkmode] - root(true) - -.mkw-calendar:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/widgets/donation.vue b/src/client/app/common/views/widgets/donation.vue index a91aa8e749..b025b41e7d 100644 --- a/src/client/app/common/views/widgets/donation.vue +++ b/src/client/app/common/views/widgets/donation.vue @@ -1,13 +1,15 @@ <template> -<div class="mkw-donation" :data-mobile="platform == 'mobile'"> - <article> - <h1>%fa:heart%%i18n:@title%</h1> - <p v-if="meta"> - {{ '%i18n:@text%'.substr(0, '%i18n:@text%'.indexOf('{')) }} - <a :href="meta.maintainer.url">{{ meta.maintainer.name }}</a> - {{ '%i18n:@text%'.substr('%i18n:@text%'.indexOf('}') + 1) }} - </p> - </article> +<div> + <mk-widget-container :show-header="false"> + <article class="dolfvtibguprpxxhfndqaosjitixjohx"> + <h1>%fa:heart%%i18n:@title%</h1> + <p v-if="meta"> + {{ '%i18n:@text%'.substr(0, '%i18n:@text%'.indexOf('{')) }} + <a :href="meta.maintainer.url">{{ meta.maintainer.name }}</a> + {{ '%i18n:@text%'.substr('%i18n:@text%'.indexOf('}') + 1) }} + </p> + </article> + </mk-widget-container> </div> </template> @@ -30,46 +32,22 @@ export default define({ </script> <style lang="stylus" scoped> -root(isDark) - background var(--face) - border solid 1px isDark ? #c3831c : #ead8bb - border-radius 6px +.dolfvtibguprpxxhfndqaosjitixjohx + padding 20px + background var(--donationBg) + color var(--donationFg) - > article - padding 20px + > h1 + margin 0 0 5px 0 + font-size 1em - > h1 - margin 0 0 5px 0 - font-size 1em - color isDark ? #b2bac1 : #888 + > [data-fa] + margin-right 0.25em - > [data-fa] - margin-right 0.25em - - > p - display block - z-index 1 - margin 0 - font-size 0.8em - color isDark ? #a1a6ab : #999 - - &[data-mobile] - border none - background #ead8bb - border-radius 8px - box-shadow 0 0 0 1px rgba(#000, 0.2) - - > article - > h1 - color #7b8871 - - > p - color #777d71 - -.mkw-donation[data-darkmode] - root(true) - -.mkw-donation:not([data-darkmode]) - root(false) + > p + display block + z-index 1 + margin 0 + font-size 0.8em </style> diff --git a/src/client/app/common/views/widgets/memo.vue b/src/client/app/common/views/widgets/memo.vue index 42df683883..be8b18a4e9 100644 --- a/src/client/app/common/views/widgets/memo.vue +++ b/src/client/app/common/views/widgets/memo.vue @@ -57,9 +57,7 @@ export default define({ </script> <style lang="stylus" scoped> - - -root(isDark) +.mkw-memo .mkw-memo--body padding-bottom 28px + 16px @@ -69,10 +67,10 @@ root(isDark) max-width 100% min-width 100% padding 16px - color isDark ? #fff : #222 + color var(--inputText) background var(--face) border none - border-bottom solid 1px isDark ? #1c2023 : #eee + border-bottom solid 1px var(--faceDivider) border-radius 0 > button @@ -102,10 +100,4 @@ root(isDark) opacity 0.7 cursor default -.mkw-memo[data-darkmode] - root(true) - -.mkw-memo:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/widgets/server.cpu.vue b/src/client/app/common/views/widgets/server.cpu.vue index b9748bdf7c..2034aee0eb 100644 --- a/src/client/app/common/views/widgets/server.cpu.vue +++ b/src/client/app/common/views/widgets/server.cpu.vue @@ -38,7 +38,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.cpu > .pie padding 10px height 100px @@ -52,7 +52,7 @@ root(isDark) > p margin 0 font-size 12px - color isDark ? #a8b4bd : #505050 + color var(--chartCaption) &:first-child font-weight bold @@ -65,10 +65,4 @@ root(isDark) display block clear both -.cpu[data-darkmode] - root(true) - -.cpu:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/widgets/server.disk.vue b/src/client/app/common/views/widgets/server.disk.vue index 99ce624051..667576ab76 100644 --- a/src/client/app/common/views/widgets/server.disk.vue +++ b/src/client/app/common/views/widgets/server.disk.vue @@ -46,7 +46,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.disk > .pie padding 10px height 100px @@ -60,7 +60,7 @@ root(isDark) > p margin 0 font-size 12px - color isDark ? #a8b4bd : #505050 + color var(--chartCaption) &:first-child font-weight bold @@ -73,10 +73,4 @@ root(isDark) display block clear both -.disk[data-darkmode] - root(true) - -.disk:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/widgets/server.memory.vue b/src/client/app/common/views/widgets/server.memory.vue index 8a60621343..9e12884cf9 100644 --- a/src/client/app/common/views/widgets/server.memory.vue +++ b/src/client/app/common/views/widgets/server.memory.vue @@ -46,7 +46,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.memory > .pie padding 10px height 100px @@ -60,7 +60,7 @@ root(isDark) > p margin 0 font-size 12px - color isDark ? #a8b4bd : #505050 + color var(--chartCaption) &:first-child font-weight bold @@ -73,10 +73,4 @@ root(isDark) display block clear both -.memory[data-darkmode] - root(true) - -.memory:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/common/views/widgets/server.pie.vue b/src/client/app/common/views/widgets/server.pie.vue index d557c52ea5..ce342fd41b 100644 --- a/src/client/app/common/views/widgets/server.pie.vue +++ b/src/client/app/common/views/widgets/server.pie.vue @@ -45,7 +45,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +svg display block height 100% @@ -56,12 +56,6 @@ root(isDark) > text font-size 0.15px - fill isDark ? rgba(#fff, 0.6) : rgba(#000, 0.6) - -svg[data-darkmode] - root(true) - -svg:not([data-darkmode]) - root(false) + fill var(--chartCaption) </style> diff --git a/src/client/app/desktop/views/components/context-menu.menu.vue b/src/client/app/desktop/views/components/context-menu.menu.vue index b65a8e1dea..9e4541a752 100644 --- a/src/client/app/desktop/views/components/context-menu.menu.vue +++ b/src/client/app/desktop/views/components/context-menu.menu.vue @@ -31,9 +31,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.menu $width = 240px $item-height = 38px $padding = 10px @@ -48,7 +46,7 @@ root(isDark) &.divider margin-top $padding padding-top $padding - border-top solid 1px isDark ? #1c2023 : #eee + border-top solid 1px var(--faceDivider) &.nest > p @@ -77,7 +75,7 @@ root(isDark) margin 0 padding 0 32px 0 38px line-height $item-height - color isDark ? #c8cece : #868C8C + color var(--text) text-decoration none cursor pointer @@ -106,17 +104,11 @@ root(isDark) left $width margin-top -($padding) width $width - background isDark ? #282c37 :#fff + background var(--popupBg) border-radius 0 4px 4px 4px box-shadow 2px 2px 8px rgba(#000, 0.2) transition visibility 0s linear 0.2s -.menu[data-darkmode] - root(true) - -.menu:not([data-darkmode]) - root(false) - </style> <style lang="stylus" module> diff --git a/src/client/app/desktop/views/components/context-menu.vue b/src/client/app/desktop/views/components/context-menu.vue index 170dcf55a1..b0a34866cd 100644 --- a/src/client/app/desktop/views/components/context-menu.vue +++ b/src/client/app/desktop/views/components/context-menu.vue @@ -71,7 +71,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.context-menu $width = 240px $item-height = 38px $padding = 10px @@ -82,15 +82,9 @@ root(isDark) z-index 4096 width $width font-size 0.8em - background var(--face) + background var(--popupBg) border-radius 0 4px 4px 4px box-shadow 2px 2px 8px rgba(#000, 0.2) opacity 0 -.context-menu[data-darkmode] - root(true) - -.context-menu:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/components/drive.file.vue b/src/client/app/desktop/views/components/drive.file.vue index 225130baf7..d7e24cfe71 100644 --- a/src/client/app/desktop/views/components/drive.file.vue +++ b/src/client/app/desktop/views/components/drive.file.vue @@ -200,9 +200,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.gvfdktuvdgwhmztnuekzkswkjygptfcv padding 8px 0 0 0 height 180px border-radius 4px @@ -337,16 +335,10 @@ root(isDark) font-size 0.8em text-align center word-break break-all - color isDark ? #fff : #444 + color var(--text) overflow hidden > .ext opacity 0.5 -.gvfdktuvdgwhmztnuekzkswkjygptfcv[data-darkmode] - root(true) - -.gvfdktuvdgwhmztnuekzkswkjygptfcv:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue index 7e5a1db8d4..4c1c7e7b2d 100644 --- a/src/client/app/desktop/views/components/note-preview.vue +++ b/src/client/app/desktop/views/components/note-preview.vue @@ -47,7 +47,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.qiziqtywpuaucsgarwajitwaakggnisj display flex font-size 0.9em @@ -83,10 +83,4 @@ root(isDark) padding 0 color var(--subNoteText) -.qiziqtywpuaucsgarwajitwaakggnisj[data-darkmode] - root(true) - -.qiziqtywpuaucsgarwajitwaakggnisj:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue index a0c4cc2fad..ee52670f8f 100644 --- a/src/client/app/desktop/views/components/notes.note.sub.vue +++ b/src/client/app/desktop/views/components/notes.note.sub.vue @@ -42,7 +42,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.tkfdzaxtkdeianobciwadajxzbddorql display flex margin 0 padding 16px 32px @@ -88,10 +88,4 @@ root(isDark) max-height 120px font-size 80% -.tkfdzaxtkdeianobciwadajxzbddorql[data-darkmode] - root(true) - -.tkfdzaxtkdeianobciwadajxzbddorql:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/components/post-form-window.vue b/src/client/app/desktop/views/components/post-form-window.vue index 466d5e1fd8..a5d191f2f3 100644 --- a/src/client/app/desktop/views/components/post-form-window.vue +++ b/src/client/app/desktop/views/components/post-form-window.vue @@ -77,7 +77,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.mk-post-form-window .mk-post-form-window--header .icon margin-right 8px @@ -94,15 +94,6 @@ root(isDark) .mk-post-form-window--body .notePreview - if isDark - margin 16px 22px 0 22px - else margin 16px 22px -.mk-post-form-window[data-darkmode] - root(true) - -.mk-post-form-window:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/components/settings.tags.vue b/src/client/app/desktop/views/components/settings.tags.vue index a7234f7d87..dfc69a387e 100644 --- a/src/client/app/desktop/views/components/settings.tags.vue +++ b/src/client/app/desktop/views/components/settings.tags.vue @@ -47,8 +47,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - -root(isDark) +.vfcitkilproprqtbnpoertpsziierwzi > .timeline padding-bottom 16px border-bottom solid 1px rgba(#000, 0.1) @@ -56,10 +55,4 @@ root(isDark) > .add margin-top 16px -.vfcitkilproprqtbnpoertpsziierwzi[data-darkmode] - root(true) - -.vfcitkilproprqtbnpoertpsziierwzi:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/components/ui.header.vue b/src/client/app/desktop/views/components/ui.header.vue index 5089232b06..1b96e06486 100644 --- a/src/client/app/desktop/views/components/ui.header.vue +++ b/src/client/app/desktop/views/components/ui.header.vue @@ -77,7 +77,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.header position fixed top 0 z-index 1000 @@ -151,10 +151,4 @@ root(isDark) > .mk-ui-header-search display none -.header[data-darkmode] - root(true) - -.header:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/components/widget-container.vue b/src/client/app/desktop/views/components/widget-container.vue index cfcb2785c5..a506357039 100644 --- a/src/client/app/desktop/views/components/widget-container.vue +++ b/src/client/app/desktop/views/components/widget-container.vue @@ -25,7 +25,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.mk-widget-container background var(--face) box-shadow var(--shadow) border-radius var(--round) @@ -71,10 +71,4 @@ root(isDark) &:active color var(--faceTextButtonActive) -.mk-widget-container[data-darkmode] - root(true) - -.mk-widget-container:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/components/window.vue b/src/client/app/desktop/views/components/window.vue index 5547445537..a1893ffd6b 100644 --- a/src/client/app/desktop/views/components/window.vue +++ b/src/client/app/desktop/views/components/window.vue @@ -462,7 +462,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.mk-window display block > .bg @@ -490,10 +490,7 @@ root(isDark) &:focus &:not([data-is-modal]) > .body - if isDark - box-shadow 0 0 0px 1px var(--primaryAlpha05), 0 2px 12px 0 rgba(#000, 0.5) - else - box-shadow 0 0 0px 1px var(--primaryAlpha05), 0 2px 6px 0 rgba(#000, 0.2) + box-shadow 0 0 0px 1px var(--primaryAlpha05), 0 2px 12px 0 var(--desktopWindowShadow) > .handle $size = 8px @@ -561,11 +558,7 @@ root(isDark) overflow hidden background var(--face) border-radius 6px - - if isDark - box-shadow 0 2px 12px 0 rgba(#000, 0.5) - else - box-shadow 0 2px 6px 0 rgba(#000, 0.2) + box-shadow 0 2px 12px 0 rgba(#000, 0.5) > header $header-height = 40px @@ -632,10 +625,4 @@ root(isDark) > .main > .body > .content height calc(100% - 40px) -.mk-window[data-darkmode] - root(true) - -.mk-window:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/pages/admin/admin.cpu-memory.vue b/src/client/app/desktop/views/pages/admin/admin.cpu-memory.vue index ebaa11478d..63b24cea47 100644 --- a/src/client/app/desktop/views/pages/admin/admin.cpu-memory.vue +++ b/src/client/app/desktop/views/pages/admin/admin.cpu-memory.vue @@ -111,7 +111,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.zyknedwtlthezamcjlolyusmipqmjgxz > svg display block width 50% @@ -135,10 +135,4 @@ root(isDark) display block clear both -.zyknedwtlthezamcjlolyusmipqmjgxz[data-darkmode] - root(true) - -.zyknedwtlthezamcjlolyusmipqmjgxz:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/pages/deck/deck.column.vue b/src/client/app/desktop/views/pages/deck/deck.column.vue index 1b939f2f58..c372ef490e 100644 --- a/src/client/app/desktop/views/pages/deck/deck.column.vue +++ b/src/client/app/desktop/views/pages/deck/deck.column.vue @@ -305,9 +305,8 @@ export default Vue.extend({ background transparent box-shadow none - if !isDark - > button - color #bbb + > button + color var(--text) > header display flex diff --git a/src/client/app/desktop/views/pages/deck/deck.note.sub.vue b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue index 0b6a13beaf..445bf7e365 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.sub.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.sub.vue @@ -29,7 +29,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.fnlfosztlhtptnongximhlbykxblytcq display flex padding 16px font-size 10px @@ -68,10 +68,4 @@ root(isDark) max-height 120px font-size 80% -.fnlfosztlhtptnongximhlbykxblytcq[data-darkmode] - root(true) - -.fnlfosztlhtptnongximhlbykxblytcq:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/pages/deck/deck.notification.vue b/src/client/app/desktop/views/pages/deck/deck.notification.vue index b318579b3e..149bd10293 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notification.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notification.vue @@ -109,7 +109,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.dsfykdcjpuwfvpefwufddclpjhzktmpw > .notification padding 16px font-size 13px @@ -170,10 +170,4 @@ root(isDark) > div > header i color #888 -.dsfykdcjpuwfvpefwufddclpjhzktmpw[data-darkmode] - root(true) - -.dsfykdcjpuwfvpefwufddclpjhzktmpw:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications.vue b/src/client/app/desktop/views/pages/deck/deck.notifications.vue index aa48571a5b..1417cc3ee8 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notifications.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notifications.vue @@ -155,8 +155,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) - +.oxynyeqmfvracxnglgulyqfgqxnxmehl .transition .mk-notifications-enter .mk-notifications-leave-to @@ -221,10 +220,4 @@ root(isDark) > [data-fa] margin-right 4px -.oxynyeqmfvracxnglgulyqfgqxnxmehl[data-darkmode] - root(true) - -.oxynyeqmfvracxnglgulyqfgqxnxmehl:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/pages/user/user.followers-you-know.vue b/src/client/app/desktop/views/pages/user/user.followers-you-know.vue index b90d0a831e..cf05006c00 100644 --- a/src/client/app/desktop/views/pages/user/user.followers-you-know.vue +++ b/src/client/app/desktop/views/pages/user/user.followers-you-know.vue @@ -36,7 +36,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.vahgrswmbzfdlmomxnqftuueyvwaafth background var(--face) box-shadow var(--shadow) border-radius var(--round) @@ -77,10 +77,4 @@ root(isDark) > i margin-right 4px -.vahgrswmbzfdlmomxnqftuueyvwaafth[data-darkmode] - root(true) - -.vahgrswmbzfdlmomxnqftuueyvwaafth:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/desktop/views/widgets/trends.vue b/src/client/app/desktop/views/widgets/trends.vue index aeaab63ac4..a886796132 100644 --- a/src/client/app/desktop/views/widgets/trends.vue +++ b/src/client/app/desktop/views/widgets/trends.vue @@ -67,7 +67,7 @@ export default define({ </script> <style lang="stylus" scoped> -root(isDark) +.mkw-trends .mkw-trends--body > .note padding 16px @@ -98,10 +98,4 @@ root(isDark) > [data-fa] margin-right 4px -.mkw-trends[data-darkmode] - root(true) - -.mkw-trends:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/mobile/views/components/note-preview.vue b/src/client/app/mobile/views/components/note-preview.vue index 1c73779251..525f54998e 100644 --- a/src/client/app/mobile/views/components/note-preview.vue +++ b/src/client/app/mobile/views/components/note-preview.vue @@ -36,7 +36,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.yohlumlkhizgfkvvscwfcrcggkotpvry display flex margin 0 padding 0 @@ -100,10 +100,4 @@ root(isDark) padding 0 color var(--subNoteText) -.yohlumlkhizgfkvvscwfcrcggkotpvry[data-darkmode] - root(true) - -.yohlumlkhizgfkvvscwfcrcggkotpvry:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/mobile/views/components/notes.vue b/src/client/app/mobile/views/components/notes.vue index 9153b1d551..8f0a1ef196 100644 --- a/src/client/app/mobile/views/components/notes.vue +++ b/src/client/app/mobile/views/components/notes.vue @@ -217,9 +217,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - -root(isDark) +.mk-notes overflow hidden background var(--face) border-radius 8px @@ -293,10 +291,4 @@ root(isDark) &:disabled opacity 0.7 -.mk-notes[data-darkmode] - root(true) - -.mk-notes:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue index 4e24f70ffc..32f74bfe3a 100644 --- a/src/client/app/mobile/views/pages/welcome.vue +++ b/src/client/app/mobile/views/pages/welcome.vue @@ -122,9 +122,8 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(isDark) +.wgwfgvvimdjvhjfwxropcwksnzftjqes text-align center - //background #fff > .banner position absolute @@ -317,10 +316,4 @@ root(isDark) margin 16px 0 0 0 opacity 0.7 -.wgwfgvvimdjvhjfwxropcwksnzftjqes[data-darkmode] - root(true) - -.wgwfgvvimdjvhjfwxropcwksnzftjqes:not([data-darkmode]) - root(false) - </style> diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 29d4fc2e5d..72aedbce99 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -62,6 +62,7 @@ "dateDividerFg": ":alpha<0.7<$text", "switchTrack": "rgba(255, 255, 255, 0.15)", + "radioBorder": "rgba(255, 255, 255, 0.6)", "inputBorder": "rgba(255, 255, 255, 0.7)", "inputLabel": "rgba(255, 255, 255, 0.7)", "inputText": "#fff", @@ -80,6 +81,9 @@ "pollEditorInputBg": "rgba(0, 0, 0, 0.25)", + "pollChoiceText": "#fff", + "pollChoiceBorder": "rgba(255, 255, 255, 0.1)", + "urlPreviewBorder": "rgba(0, 0, 0, 0.4)", "urlPreviewBorderHover": "rgba(255, 255, 255, 0.2)", "urlPreviewTitle": "$text", @@ -90,12 +94,17 @@ "calendarSaturdayOrSunday": "#ff6679", "calendarDay": "#c5ced6", + "materBg": "rgba(0, 0, 0, 0.3)", + "chartCaption": ":alpha<0.6<$text", "announcementsBg": "#253a50", "announcementsTitle": "#539eff", "announcementsText": "#fff", + "donationBg": "#5d5242", + "donationFg": "#e4dbce", + "googleSearchBg": "rgba(0, 0, 0, 0.2)", "googleSearchFg": "#dee4e8", "googleSearchBorder": "rgba(255, 255, 255, 0.2)", @@ -119,6 +128,11 @@ "messagingRoomMessageBg": "$secondary", "messagingRoomMessageFg": "#fff", + "formButtonBorder": "rgba(255, 255, 255, 0.1)", + "formButtonHoverBg": ":alpha<0.2<$primary", + "formButtonHoverBorder": ":alpha<0.5<$primary", + "formButtonActiveBg": ":alpha<0.12<$primary", + "desktopHeaderBg": ":lighten<5<$secondary", "desktopHeaderFg": "$text", "desktopHeaderHoverFg": "#fff", @@ -140,6 +154,7 @@ "desktopTimelineSrc": "@faceTextButton", "desktopTimelineSrcHover": "@faceTextButtonHover", "desktopWindowTitle": "@faceHeaderText", + "desktopWindowShadow": "rgba(0, 0, 0, 0.5)", "desktopDriveBg": "@bg", "desktopDriveFolderBg": ":alpha<0.2<$primary", "desktopDriveFolderHoverBg": ":alpha<0.3<$primary", @@ -169,5 +184,18 @@ "mobileSignedInAsBg": "#273c34", "mobileSignedInAsFg": "#49ab63", "mobileSignoutBg": "#652222", - "mobileSignoutFg": "#ff5f56" + "mobileSignoutFg": "#ff5f56", + + "reversiBannerGradientStart": "#45730e", + "reversiBannerGradientEnd": "#464300", + "reversiDescBg": "rgba(255, 255, 255, 0.1)", + "reversiListItemShadow": "rgba(0, 0, 0, 0.7)", + "reversiMapSelectBorder": "rgba(255, 255, 255, 0.1)", + "reversiMapSelectHoverBorder": "rgba(255, 255, 255, 0.2)", + "reversiRoomFormShadow": "rgba(0, 0, 0, 0.7)", + "reversiRoomFooterBg": ":alpha<0.9<$secondary", + "reversiGameHeaderLine": ":alpha<0.5<$secondary", + "reversiGameEmptyCell": ":lighten<2<$secondary", + "reversiGameEmptyCellMyTurn": ":lighten<5<$secondary", + "reversiGameEmptyCellCanPut": ":lighten<4<$secondary" } diff --git a/src/client/theme/light.json b/src/client/theme/light.json index e4116480e2..4690054cbf 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -62,6 +62,7 @@ "dateDividerFg": ":alpha<0.7<$text", "switchTrack": "rgba(0, 0, 0, 0.25)", + "radioBorder": "rgba(0, 0, 0, 0.4)", "inputBorder": "rgba(0, 0, 0, 0.42)", "inputLabel": "rgba(0, 0, 0, 0.54)", "inputText": "#000", @@ -80,6 +81,9 @@ "pollEditorInputBg": "#fff", + "pollChoiceText": "#000", + "pollChoiceBorder": "rgba(0, 0, 0, 0.1)", + "urlPreviewBorder": "rgba(0, 0, 0, 0.1)", "urlPreviewBorderHover": "rgba(0, 0, 0, 0.2)", "urlPreviewTitle": "$text", @@ -90,12 +94,17 @@ "calendarSaturdayOrSunday": "#ef95a0", "calendarDay": "#777", + "materBg": "rgba(0, 0, 0, 0.1)", + "chartCaption": ":alpha<0.6<$text", "announcementsBg": "#f3f9ff", "announcementsTitle": "#4078c0", "announcementsText": "#57616f", + "donationBg": "#fbead4", + "donationFg": "#777d71", + "googleSearchBg": "#fff", "googleSearchFg": "#55595c", "googleSearchBorder": "rgba(0, 0, 0, 0.2)", @@ -119,6 +128,11 @@ "messagingRoomMessageBg": "#eee", "messagingRoomMessageFg": "#333", + "formButtonBorder": "rgba(0, 0, 0, 0.1)", + "formButtonHoverBg": ":alpha<0.12<$primary", + "formButtonHoverBorder": ":alpha<0.3<$primary", + "formButtonActiveBg": ":alpha<0.12<$primary", + "desktopHeaderBg": ":lighten<5<$secondary", "desktopHeaderFg": "$text", "desktopHeaderHoverFg": "#7b8c88", @@ -140,6 +154,7 @@ "desktopTimelineSrc": "#6f7477", "desktopTimelineSrcHover": "#525a5f", "desktopWindowTitle": "#666", + "desktopWindowShadow": "rgba(0, 0, 0, 0.2)", "desktopDriveBg": "#fff", "desktopDriveFolderBg": ":lighten<31<$primary", "desktopDriveFolderHoverBg": ":lighten<27<$primary", @@ -169,5 +184,18 @@ "mobileSignedInAsBg": "#fcfff5", "mobileSignedInAsFg": "#2c662d", "mobileSignoutBg": "#fff6f5", - "mobileSignoutFg": "#cc2727" + "mobileSignoutFg": "#cc2727", + + "reversiBannerGradientStart": "#8bca3e", + "reversiBannerGradientEnd": "#d6cf31", + "reversiDescBg": "rgba(0, 0, 0, 0.1)", + "reversiListItemShadow": "rgba(0, 0, 0, 0.15)", + "reversiMapSelectBorder": "rgba(0, 0, 0, 0.1)", + "reversiMapSelectHoverBorder": "rgba(0, 0, 0, 0.2)", + "reversiRoomFormShadow": "rgba(0, 0, 0, 0.1)", + "reversiRoomFooterBg": ":alpha<0.9<$secondary", + "reversiGameHeaderLine": "#c4cdd4", + "reversiGameEmptyCell": "rgba(0, 0, 0, 0.06)", + "reversiGameEmptyCellMyTurn": "rgba(0, 0, 0, 0.12)", + "reversiGameEmptyCellCanPut": "rgba(0, 0, 0, 0.9)" } From ec652dd0ace7ccf57d4d32d8855192748cbbb0b3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 20:03:14 +0900 Subject: [PATCH 438/539] wip --- .../app/desktop/assets/header-icon.light.svg | 150 ------------------ .../{header-icon.dark.svg => header-icon.svg} | 8 +- .../desktop/views/components/ui.header.vue | 11 +- src/client/theme/dark.json | 1 - src/client/theme/light.json | 1 - 5 files changed, 10 insertions(+), 161 deletions(-) delete mode 100644 src/client/app/desktop/assets/header-icon.light.svg rename src/client/app/desktop/assets/{header-icon.dark.svg => header-icon.svg} (94%) diff --git a/src/client/app/desktop/assets/header-icon.light.svg b/src/client/app/desktop/assets/header-icon.light.svg deleted file mode 100644 index 61e2026243..0000000000 --- a/src/client/app/desktop/assets/header-icon.light.svg +++ /dev/null @@ -1,150 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="512" - height="512" - viewBox="0 0 135.46667 135.46667" - version="1.1" - id="svg8" - inkscape:version="0.92.1 r15371" - sodipodi:docname="header-icon.light.svg" - inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\32.png" - inkscape:export-xdpi="6" - inkscape:export-ydpi="6"> - <defs - id="defs2"> - <inkscape:path-effect - effect="simplify" - id="path-effect5115" - is_visible="true" - steps="1" - threshold="0.000408163" - smooth_angles="360" - helper_size="0" - simplify_individual_paths="false" - simplify_just_coalesce="false" - simplifyindividualpaths="false" - simplifyJustCoalesce="false" /> - <inkscape:path-effect - effect="simplify" - id="path-effect5111" - is_visible="true" - steps="1" - threshold="0.000408163" - smooth_angles="360" - helper_size="0" - simplify_individual_paths="false" - simplify_just_coalesce="false" - simplifyindividualpaths="false" - simplifyJustCoalesce="false" /> - <inkscape:path-effect - effect="simplify" - id="path-effect5104" - is_visible="true" - steps="1" - threshold="0.000408163" - smooth_angles="360" - helper_size="0" - simplify_individual_paths="false" - simplify_just_coalesce="false" - simplifyindividualpaths="false" - simplifyJustCoalesce="false" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="1.4142136" - inkscape:cx="114.309" - inkscape:cy="251.50613" - inkscape:document-units="px" - inkscape:current-layer="g4502" - showgrid="true" - units="px" - inkscape:snap-bbox="true" - inkscape:bbox-nodes="true" - inkscape:snap-bbox-edge-midpoints="false" - inkscape:snap-smooth-nodes="true" - inkscape:snap-center="true" - inkscape:snap-page="true" - inkscape:window-width="1920" - inkscape:window-height="1027" - inkscape:window-x="-8" - inkscape:window-y="1072" - inkscape:window-maximized="1" - inkscape:snap-object-midpoints="true" - inkscape:snap-midpoints="true" - inkscape:object-paths="true" - fit-margin-top="0" - fit-margin-left="0" - fit-margin-right="0" - fit-margin-bottom="0" - objecttolerance="1" - guidetolerance="1" - inkscape:snap-nodes="false" - inkscape:snap-others="false"> - <inkscape:grid - type="xygrid" - id="grid4504" - spacingx="4.2333334" - spacingy="4.2333334" - empcolor="#ff3fff" - empopacity="0.25098039" - empspacing="4" /> - </sodipodi:namedview> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="レイヤー 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-30.809093,-111.78601)"> - <g - id="g4502" - transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)"> - <g - style="fill:#000000;fill-opacity:1" - transform="translate(-1.3333333e-6,-1.3439941e-6)" - id="g5125"> - <g - transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)" - id="text4489" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - aria-label="Mi"> - <path - sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz" - inkscape:connector-curvature="0" - id="path5210" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#000000;fill-opacity:1;stroke-width:0.28950602px" - d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" /> - <path - inkscape:connector-curvature="0" - id="path5212" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#000000;fill-opacity:1;stroke-width:0.28950602px" - d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" /> - </g> - </g> - </g> - </g> -</svg> diff --git a/src/client/app/desktop/assets/header-icon.dark.svg b/src/client/app/desktop/assets/header-icon.svg similarity index 94% rename from src/client/app/desktop/assets/header-icon.dark.svg rename to src/client/app/desktop/assets/header-icon.svg index fa42856fa5..d677d2d163 100644 --- a/src/client/app/desktop/assets/header-icon.dark.svg +++ b/src/client/app/desktop/assets/header-icon.svg @@ -124,24 +124,24 @@ id="g4502" transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)"> <g - style="fill:#ffffff;fill-opacity:1" + style="fill-opacity:1" transform="translate(-1.3333333e-6,-1.3439941e-6)" id="g5125"> <g transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)" id="text4489" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" aria-label="Mi"> <path sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz" inkscape:connector-curvature="0" id="path5210" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#ffffff;fill-opacity:1;stroke-width:0.28950602px" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill-opacity:1;stroke-width:0.28950602px" d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" /> <path inkscape:connector-curvature="0" id="path5212" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#ffffff;fill-opacity:1;stroke-width:0.28950602px" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill-opacity:1;stroke-width:0.28950602px" d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" /> </g> </g> diff --git a/src/client/app/desktop/views/components/ui.header.vue b/src/client/app/desktop/views/components/ui.header.vue index 1b96e06486..d38aebec8b 100644 --- a/src/client/app/desktop/views/components/ui.header.vue +++ b/src/client/app/desktop/views/components/ui.header.vue @@ -10,7 +10,9 @@ <x-nav/> </div> <div class="center"> - <div class="icon" @click="goToTop"></div> + <div class="icon" @click="goToTop"> + <img svg-inline src="../../assets/header-icon.svg"/> + </div> </div> <div class="right"> <x-search/> @@ -129,13 +131,12 @@ export default Vue.extend({ display block width 48px height 48px - background-image var(--desktopHeaderIcon) - background-size 24px - background-position center - background-repeat no-repeat opacity 0.3 cursor pointer + > svg + fill currentColor + > .left, > .center left 0 diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 72aedbce99..c43de3024e 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -136,7 +136,6 @@ "desktopHeaderBg": ":lighten<5<$secondary", "desktopHeaderFg": "$text", "desktopHeaderHoverFg": "#fff", - "desktopHeaderIcon": "url('/assets/desktop/header-icon.dark.svg')", "desktopHeaderSearchBg": "rgba(0, 0, 0, 0.1)", "desktopHeaderSearchHoverBg": "rgba(255, 255, 255, 0.04)", "desktopHeaderSearchFg": "#fff", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 4690054cbf..2e4f4b8cc9 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -136,7 +136,6 @@ "desktopHeaderBg": ":lighten<5<$secondary", "desktopHeaderFg": "$text", "desktopHeaderHoverFg": "#7b8c88", - "desktopHeaderIcon": "url('/assets/desktop/header-icon.light.svg')", "desktopHeaderSearchBg": "rgba(0, 0, 0, 0.05)", "desktopHeaderSearchHoverBg": "rgba(0, 0, 0, 0.08)", "desktopHeaderSearchFg": "#000", From 8317a219a54f5ea85daa500f891ff480a0156f5b Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 20:11:11 +0900 Subject: [PATCH 439/539] wip --- src/client/app/desktop/views/components/ui.header.vue | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/client/app/desktop/views/components/ui.header.vue b/src/client/app/desktop/views/components/ui.header.vue index d38aebec8b..4cfcda0f1a 100644 --- a/src/client/app/desktop/views/components/ui.header.vue +++ b/src/client/app/desktop/views/components/ui.header.vue @@ -130,12 +130,15 @@ export default Vue.extend({ margin auto display block width 48px - height 48px - opacity 0.3 + text-align center cursor pointer + opacity 0.5 > svg - fill currentColor + width 24px + height 48px + vertical-align top + fill var(--desktopHeaderFg) > .left, > .center From 0c63ec8157f0c54d780faf69aad63f4bcd7fd683 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 20:39:32 +0900 Subject: [PATCH 440/539] wip --- .../app/common/views/components/ui/button.vue | 82 ++++---- .../app/common/views/widgets/broadcast.vue | 1 - src/client/app/desktop/style.styl | 2 - src/client/app/desktop/ui.styl | 179 ------------------ .../desktop/views/components/post-form.vue | 10 +- .../desktop/views/components/renote-form.vue | 6 +- .../app/desktop/views/widgets/profile.vue | 1 - src/client/app/init.css | 6 +- src/client/theme/dark.json | 4 + src/client/theme/light.json | 4 + 10 files changed, 66 insertions(+), 229 deletions(-) delete mode 100644 src/client/app/desktop/ui.styl diff --git a/src/client/app/common/views/components/ui/button.vue b/src/client/app/common/views/components/ui/button.vue index 4934a1bdfa..a165d100a4 100644 --- a/src/client/app/common/views/components/ui/button.vue +++ b/src/client/app/common/views/components/ui/button.vue @@ -1,9 +1,7 @@ <template> -<div class="ui-button" :class="[styl]"> - <button :type="type" @click="$emit('click')"> - <slot></slot> - </button> -</div> +<button class="dmtdnykelhudezerjlfpbhgovrgnqqgr" :class="[styl, { inline, primary }]" :type="type" @click="$emit('click')"> + <slot></slot> +</button> </template> <script lang="ts"> @@ -13,6 +11,16 @@ export default Vue.extend({ type: { type: String, required: false + }, + primary: { + type: Boolean, + required: false, + default: false + }, + inline: { + type: Boolean, + required: false, + default: false } }, data() { @@ -32,21 +40,36 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -root(fill) - > button - display block - width 100% - margin 0 - padding 0 - font-weight bold - font-size 16px - line-height 44px - border none - border-radius 6px - outline none - box-shadow none +.dmtdnykelhudezerjlfpbhgovrgnqqgr + display block + width 100% + margin 0 + padding 0 + font-weight normal + font-size 16px + border none + border-radius 6px + outline none + box-shadow none - if fill + &.inline + display inline-block + width auto + + &.primary + font-weight bold + + &.fill + color var(--text) + background var(--buttonBg) + + &:hover + background var(--buttonHoverBg) + + &:active + background var(--buttonActiveBg) + + &.primary color var(--primaryForeground) background var(--primary) @@ -55,20 +78,15 @@ root(fill) &:active background var(--primaryDarken5) - else - color var(--primary) - background none - &:hover - color var(--primaryDarken5) - - &:active - background var(--primaryAlpha03) - -.ui-button - &.fill - root(true) &:not(.fill) - root(false) + color var(--primary) + background none + + &:hover + color var(--primaryDarken5) + + &:active + background var(--primaryAlpha03) </style> diff --git a/src/client/app/common/views/widgets/broadcast.vue b/src/client/app/common/views/widgets/broadcast.vue index 65e37bfc69..620b09ff0e 100644 --- a/src/client/app/common/views/widgets/broadcast.vue +++ b/src/client/app/common/views/widgets/broadcast.vue @@ -5,7 +5,6 @@ :data-found="announcements && announcements.length != 0" :data-melt="props.design == 1" :data-mobile="platform == 'mobile'" - :data-darkmode="$store.state.device.darkmode" > <div class="icon"> <svg height="32" version="1.1" viewBox="0 0 32 32" width="32"> diff --git a/src/client/app/desktop/style.styl b/src/client/app/desktop/style.styl index 626671fd25..96481a9808 100644 --- a/src/client/app/desktop/style.styl +++ b/src/client/app/desktop/style.styl @@ -1,8 +1,6 @@ @import "../app" @import "../reset" -@import "./ui" - *::input-placeholder color #D8CBC5 diff --git a/src/client/app/desktop/ui.styl b/src/client/app/desktop/ui.styl deleted file mode 100644 index 3ab5d79c5d..0000000000 --- a/src/client/app/desktop/ui.styl +++ /dev/null @@ -1,179 +0,0 @@ -button - font-family sans-serif - - * - pointer-events none - -button.ui -.button.ui - display inline-block - cursor pointer - padding 0 14px - margin 0 - min-width 100px - line-height 38px - font-size 14px - color #888 - text-decoration none - background linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%) - border solid 1px #e2e2e2 - border-radius 4px - outline none - - &.block - display block - - &:focus - &:after - content "" - pointer-events none - position absolute - top -5px - right -5px - bottom -5px - left -5px - border 2px solid var(--primaryAlpha03) - border-radius 8px - - &:disabled - opacity 0.7 - cursor default - - &:hover - background linear-gradient(to bottom, #f9f9f9 0%, #ececec 100%) - border-color #dcdcdc - - &:active - background #ececec - border-color #dcdcdc - - &.primary - color var(--primaryForeground) - //background linear-gradient(to bottom, var(--primaryLighten25) 0%, var(--primaryLighten10) 100%) - border solid 1px var(--primaryLighten15) - - &:not(:disabled) - font-weight bold - - &:hover:not(:disabled) - //background linear-gradient(to bottom, var(--primaryLighten8) 0%, var(--primaryDarken8) 100%) - border-color var(--primary) - - &:active:not(:disabled) - background var(--primary) - border-color var(--primary) - -input:not([type]).ui -input[type='text'].ui -input[type='password'].ui -input[type='email'].ui -input[type='date'].ui -input[type='number'].ui -textarea.ui - display block - padding 10px - width 100% - height 40px - font-family sans-serif - font-size 16px - color #55595c - border solid 1px #dadada - border-radius 4px - - &:hover - border-color #b0b0b0 - - &:focus - border-color var(--primary) - -textarea.ui - min-width 100% - max-width 100% - min-height 64px - -.ui.info - display block - margin 1em 0 - padding 0 1em - font-size 90% - color rgba(#000, 0.87) - background #f8f8f9 - border solid 1px rgba(34, 36, 38, 0.22) - border-radius 4px - - > p - opacity 0.8 - - > [data-fa]:first-child - margin-right 0.25em - - &.warn - color #573a08 - background #FFFAF3 - border-color #C9BA9B - -.ui.from.group - display block - margin 16px 0 - - > p:first-child - margin 0 0 6px 0 - font-size 90% - font-weight bold - color rgba(#373a3c, 0.9) - -html[data-darkmode] - button.ui - .button.ui - color #fff - background linear-gradient(to bottom, #313543 0%, #282c37 100%) - border-color #1c2023 - - &:hover - background linear-gradient(to bottom, #2c2f3c 0%, #22262f 100%) - border-color #151a1d - - &:active - background #22262f - border-color #151a1d - - &.primary - color var(--primaryForeground) - //background linear-gradient(to bottom, var(--primaryLighten25) 0%, var(--primaryLighten10) 100%) - border solid 1px var(--primaryLighten15) - - &:hover:not(:disabled) - //background linear-gradient(to bottom, var(--primaryLighten8) 0%, var(--primaryDarken8) 100%) - border-color var(--primary) - - &:active:not(:disabled) - background var(--primary) - border-color var(--primary) - - input:not([type]).ui - input[type='text'].ui - input[type='password'].ui - input[type='email'].ui - input[type='date'].ui - input[type='number'].ui - textarea.ui - display block - padding 10px - width 100% - height 40px - font-family sans-serif - font-size 16px - color #dee4e8 - background #191b22 - border solid 1px #495156 - border-radius 4px - - &:hover - border-color #b0b0b0 - - &:focus - border-color var(--primary) - - .ui.from.group - > p:first-child - color #c0c7cc diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index b2a6fed8e8..6cb73ebc43 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -599,21 +599,19 @@ export default Vue.extend({ height 40px font-size 1em color var(--primaryForeground) - background linear-gradient(to bottom, var(--primaryLighten25) 0%, var(--primaryLighten10) 100%) + background var(--primary) outline none - border solid 1px var(--primaryLighten15) + border none border-radius 4px &:not(:disabled) font-weight bold &:hover:not(:disabled) - background linear-gradient(to bottom, var(--primaryLighten8) 0%, var(--primaryDarken8) 100%) - border-color var(--primary) + background var(--primaryLighten5) &:active:not(:disabled) - background var(--primary) - border-color var(--primary) + background var(--primaryDarken5) &:focus &:after diff --git a/src/client/app/desktop/views/components/renote-form.vue b/src/client/app/desktop/views/components/renote-form.vue index 6717ced3b1..68d485bada 100644 --- a/src/client/app/desktop/views/components/renote-form.vue +++ b/src/client/app/desktop/views/components/renote-form.vue @@ -4,8 +4,8 @@ <template v-if="!quote"> <footer> <a class="quote" v-if="!quote" @click="onQuote">%i18n:@quote%</a> - <button class="ui cancel" @click="cancel">%i18n:@cancel%</button> - <button class="ui primary ok" @click="ok" :disabled="wait">{{ wait ? '%i18n:@reposting%' : '%i18n:@renote%' }}</button> + <ui-button class="button cancel" inline @click="cancel">%i18n:@cancel%</ui-button> + <ui-button class="button ok" inline primary @click="ok" :disabled="wait">{{ wait ? '%i18n:@reposting%' : '%i18n:@renote%' }}</ui-button> </footer> </template> <template v-if="quote"> @@ -71,7 +71,7 @@ export default Vue.extend({ left 28px line-height 40px - button + > .button display block position absolute bottom 16px diff --git a/src/client/app/desktop/views/widgets/profile.vue b/src/client/app/desktop/views/widgets/profile.vue index fa35138c31..91354324ce 100644 --- a/src/client/app/desktop/views/widgets/profile.vue +++ b/src/client/app/desktop/views/widgets/profile.vue @@ -4,7 +4,6 @@ <div class="egwyvoaaryotefqhqtmiyawwefemjfsd-body" :data-compact="props.design == 1 || props.design == 2" :data-melt="props.design == 2" - :data-darkmode="$store.state.device.darkmode" > <div class="banner" :style="$store.state.i.bannerUrl ? `background-image: url(${$store.state.i.bannerUrl})` : ''" diff --git a/src/client/app/init.css b/src/client/app/init.css index 6ee25d64e2..92bb1d8cf4 100644 --- a/src/client/app/init.css +++ b/src/client/app/init.css @@ -32,7 +32,7 @@ body > noscript { left: 0; width: 100%; height: 100%; - background: #fff; + background: var(--bg); cursor: wait; } #ini > svg { @@ -47,10 +47,6 @@ body > noscript { animation: ini 0.6s infinite linear; } -html[data-darkmode] #ini { - background: #191b22; -} - @keyframes ini { from { transform: rotate(0deg); diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index c43de3024e..015225ddab 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -67,6 +67,10 @@ "inputLabel": "rgba(255, 255, 255, 0.7)", "inputText": "#fff", + "buttonBg": "rgba(255, 255, 255, 0.05)", + "buttonHoverBg": "rgba(255, 255, 255, 0.1)", + "buttonActiveBg": "rgba(255, 255, 255, 0.15)", + "autocompleteItemHoverBg": "rgba(255, 255, 255, 0.1)", "autocompleteItemText": "rgba(255, 255, 255, 0.8)", "autocompleteItemTextSub": "rgba(255, 255, 255, 0.3)", diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 2e4f4b8cc9..3d131f066a 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -67,6 +67,10 @@ "inputLabel": "rgba(0, 0, 0, 0.54)", "inputText": "#000", + "buttonBg": "rgba(0, 0, 0, 0.05)", + "buttonHoverBg": "rgba(0, 0, 0, 0.1)", + "buttonActiveBg": "rgba(0, 0, 0, 0.15)", + "autocompleteItemHoverBg": "rgba(0, 0, 0, 0.1)", "autocompleteItemText": "rgba(0, 0, 0, 0.8)", "autocompleteItemTextSub": "rgba(0, 0, 0, 0.3)", From d5818214f3237d4f9445446b8a38b8e9d41cac4a Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Fri, 28 Sep 2018 20:54:14 +0900 Subject: [PATCH 441/539] Fix 'URL is not defined' in MFM (#2782) --- src/mfm/html-to-mfm.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mfm/html-to-mfm.ts b/src/mfm/html-to-mfm.ts index 6da1dbdad3..aa887c5560 100644 --- a/src/mfm/html-to-mfm.ts +++ b/src/mfm/html-to-mfm.ts @@ -1,4 +1,5 @@ const parse5 = require('parse5'); +import { URL } from 'url'; export default function(html: string): string { if (html == null) return null; From 1fa4d0d3f8552c9e82f763f8a086cb916d0e9250 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 28 Sep 2018 21:48:53 +0900 Subject: [PATCH 442/539] wip --- locales/ja-JP.yml | 1 - .../components/games/reversi/reversi.room.vue | 2 +- .../app/common/views/components/ui/switch.vue | 2 +- .../app/desktop/views/components/settings.vue | 60 ++++++++++--------- 4 files changed, 35 insertions(+), 30 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index f5d0a180d8..0f83ba8419 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -792,7 +792,6 @@ desktop/views/components/settings.vue: show-renoted-my-notes: "自分の投稿のRenoteをタイムラインに表示する" show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する" show-maps: "マップの自動展開" - show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。" sound: "サウンド" enable-sounds: "サウンドを有効にする" diff --git a/src/client/app/common/views/components/games/reversi/reversi.room.vue b/src/client/app/common/views/components/games/reversi/reversi.room.vue index 236141ee28..9f0d9c23fb 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.room.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.room.vue @@ -60,7 +60,7 @@ <div> <template v-for="item in form"> - <mk-switch v-if="item.type == 'switch'" v-model="item.value" :key="item.id" :text="item.label" @change="onChangeForm(item)">{{ item.desc || '' }}</mk-switch> + <ui-switch v-if="item.type == 'switch'" v-model="item.value" :key="item.id" :text="item.label" @change="onChangeForm(item)">{{ item.desc || '' }}</ui-switch> <div class="card" v-if="item.type == 'radio'" :key="item.id"> <header> diff --git a/src/client/app/common/views/components/ui/switch.vue b/src/client/app/common/views/components/ui/switch.vue index 2ee787cb76..935f219833 100644 --- a/src/client/app/common/views/components/ui/switch.vue +++ b/src/client/app/common/views/components/ui/switch.vue @@ -19,7 +19,7 @@ <span class="label"> <span :aria-hidden="!checked"><slot></slot></span> <p :aria-hidden="!checked"> - <slot name="text"></slot> + <slot name="desc"></slot> </p> </span> </div> diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index 4d839f1dc9..c7d82590ea 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -21,12 +21,14 @@ <section class="web" v-show="page == 'web'"> <h1>%i18n:@behaviour%</h1> - <mk-switch v-model="fetchOnScroll" text="%i18n:@fetch-on-scroll%"> - <span>%i18n:@fetch-on-scroll-desc%</span> - </mk-switch> - <mk-switch v-model="autoPopout" text="%i18n:@auto-popout%"> - <span>%i18n:@auto-popout-desc%</span> - </mk-switch> + <ui-switch v-model="fetchOnScroll"> + %i18n:@fetch-on-scroll% + <span slot="desc">%i18n:@fetch-on-scroll-desc%</span> + </ui-switch> + <ui-switch v-model="autoPopout"> + %i18n:@auto-popout% + <span slot="desc">%i18n:@auto-popout-desc%</span> + </ui-switch> <section> <header>%i18n:@note-visibility%</header> @@ -45,9 +47,10 @@ <details> <summary>%i18n:@advanced%</summary> - <mk-switch v-model="apiViaStream" text="%i18n:@api-via-stream%"> - <span>%i18n:@api-via-stream-desc%</span> - </mk-switch> + <ui-switch v-model="apiViaStream"> + %i18n:@api-via-stream% + <span slot="desc">%i18n:@api-via-stream-desc%</span> + </ui-switch> </details> </section> @@ -76,9 +79,7 @@ <ui-switch v-model="showMyRenotes">%i18n:@show-my-renotes%</ui-switch> <ui-switch v-model="showRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch> <ui-switch v-model="showLocalRenotes">%i18n:@show-local-renotes%</ui-switch> - <mk-switch v-model="showMaps" text="%i18n:@show-maps%"> - <span>%i18n:@show-maps-desc%</span> - </mk-switch> + <ui-switch v-model="showMaps">%i18n:@show-maps%</ui-switch> <ui-switch v-model="disableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch> <ui-switch v-model="games_reversi_showBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch> <ui-switch v-model="games_reversi_useContrastStones">%i18n:common.use-contrast-reversi-stones%</ui-switch> @@ -86,9 +87,10 @@ <section class="web" v-show="page == 'web'"> <h1>%i18n:@sound%</h1> - <mk-switch v-model="enableSounds" text="%i18n:@enable-sounds%"> - <span>%i18n:@enable-sounds-desc%</span> - </mk-switch> + <ui-switch v-model="enableSounds"> + %i18n:@enable-sounds% + <span slot="desc">%i18n:@enable-sounds-desc%</span> + </ui-switch> <label>%i18n:@volume%</label> <input type="range" v-model="soundVolume" @@ -130,9 +132,10 @@ <section class="notification" v-show="page == 'notification'"> <h1>%i18n:@notification%</h1> - <mk-switch v-model="$store.state.i.settings.autoWatch" @change="onChangeAutoWatch" text="%i18n:@auto-watch%"> - <span>%i18n:@auto-watch-desc%</span> - </mk-switch> + <ui-switch v-model="$store.state.i.settings.autoWatch" @change="onChangeAutoWatch"> + %i18n:@auto-watch% + <span slot="desc">%i18n:@auto-watch-desc%</span> + </ui-switch> </section> <section class="drive" v-show="page == 'drive'"> @@ -200,20 +203,23 @@ </button> <details> <summary>%i18n:@update-settings%</summary> - <mk-switch v-model="preventUpdate" text="%i18n:@prevent-update%"> - <span>%i18n:@prevent-update-desc%</span> - </mk-switch> + <ui-switch v-model="preventUpdate"> + %i18n:@prevent-update% + <span slot="desc">%i18n:@prevent-update-desc%</span> + </ui-switch> </details> </section> <section class="other" v-show="page == 'other'"> <h1>%i18n:@advanced-settings%</h1> - <mk-switch v-model="debug" text="%i18n:@debug-mode%"> - <span>%i18n:@debug-mode-desc%</span> - </mk-switch> - <mk-switch v-model="enableExperimentalFeatures" text="%i18n:@experimental%"> - <span>%i18n:@experimental-desc%</span> - </mk-switch> + <ui-switch v-model="debug"> + %i18n:@debug-mode% + <span slot="desc">%i18n:@debug-mode-desc%</span> + </ui-switch> + <ui-switch v-model="enableExperimentalFeatures"> + %i18n:@experimental% + <span slot="desc">%i18n:@experimental-desc%</span> + </ui-switch> </section> </div> </div> From 6a82e94c5489d4879cbbf86091cd15c7d144f284 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 29 Sep 2018 00:01:11 +0900 Subject: [PATCH 443/539] wip --- locales/ja-JP.yml | 24 +++ package.json | 1 + src/client/app/app.vue | 12 +- .../app/common/views/components/avatar.vue | 4 +- .../app/common/views/components/index.ts | 2 + .../app/common/views/components/theme.vue | 179 ++++++++++++++++++ .../app/common/views/components/ui/button.vue | 12 +- .../app/desktop/views/components/settings.vue | 5 + src/client/app/init.ts | 35 +++- .../app/mobile/views/pages/settings.vue | 7 + src/client/app/store.ts | 3 + src/client/app/{common/scripts => }/theme.ts | 27 ++- src/client/theme/dark.json | 2 +- src/client/theme/halloween.json | 3 +- src/client/theme/light.json | 2 +- 15 files changed, 287 insertions(+), 31 deletions(-) create mode 100644 src/client/app/common/views/components/theme.vue rename src/client/app/{common/scripts => }/theme.ts (74%) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 0f83ba8419..46dea949d2 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -285,6 +285,28 @@ common/views/components/media-banner.vue: sensitive: "閲覧注意" click-to-show: "クリックして表示" +common/views/components/theme.vue: + light-theme: "非ダークモード時に使用するテーマ" + dark-theme: "ダークモード時に使用するテーマ" + install-a-theme: "テーマのインストール" + theme-code: "テーマコード" + install: "インストール" + create-a-theme: "テーマの作成" + save-created-theme: "テーマを保存" + primary-color: "プライマリ カラー" + secondary-color: "セカンダリ カラー" + text-color: "文字色" + base-theme: "ベーステーマ" + base-theme-light: "Light" + base-theme-dark: "Dark" + theme-name: "テーマ名" + preview-created-theme: "プレビュー" + invalid-theme: "テーマが正しくありません。" + already-installed: "既にそのテーマはインストールされています。" + saved: "保存しました" + installed-themes: "インストールされたテーマ" + select-theme: "テーマを選択してください" + common/views/components/cw-button.vue: hide: "隠す" show: "もっと見る" @@ -762,6 +784,7 @@ desktop/views/components/settings.vue: 2fa: "二段階認証" other: "その他" license: "ライセンス" + theme: "テーマ" behaviour: "動作" fetch-on-scroll: "スクロールで自動読み込み" @@ -1417,6 +1440,7 @@ mobile/views/pages/settings.vue: notification-position: "通知の表示" notification-position-bottom: "下" notification-position-top: "上" + theme: "テーマ" behavior: "動作" fetch-on-scroll: "スクロールで自動読み込み" note-visibility: "投稿の公開範囲" diff --git a/package.json b/package.json index 347e9d0c24..e19283cf64 100644 --- a/package.json +++ b/package.json @@ -208,6 +208,7 @@ "v-animate-css": "0.0.2", "vue": "2.5.17", "vue-chartjs": "3.4.0", + "vue-color": "2.6.0", "vue-cropperjs": "2.2.2", "vue-js-modal": "1.3.26", "vue-json-tree-view": "2.1.4", diff --git a/src/client/app/app.vue b/src/client/app/app.vue index 9b6af27ece..778e9f29cf 100644 --- a/src/client/app/app.vue +++ b/src/client/app/app.vue @@ -14,8 +14,7 @@ export default Vue.extend({ keymap(): any { return { 'h|slash': this.help, - 'd': this.dark, - 'x': this.test + 'd': this.dark }; } }, @@ -26,11 +25,10 @@ export default Vue.extend({ }, dark() { - applyTheme(darkTheme); - }, - - test() { - applyTheme(halloweenTheme); + this.$store.commit('device/set', { + key: 'darkmode', + value: !this.$store.state.device.darkmode + }); } } }); diff --git a/src/client/app/common/views/components/avatar.vue b/src/client/app/common/views/components/avatar.vue index ca09af87de..ac018abcfc 100644 --- a/src/client/app/common/views/components/avatar.vue +++ b/src/client/app/common/views/components/avatar.vue @@ -59,7 +59,9 @@ export default Vue.extend({ } }, mounted() { - this.$el.style.color = `rgb(${this.user.avatarColor.slice(0, 3).join(',')})`; + if (this.user.avatarColor) { + this.$el.style.color = `rgb(${this.user.avatarColor.slice(0, 3).join(',')})`; + } }, methods: { onClick(e) { diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts index 4c1c0afa80..0dea38a7a1 100644 --- a/src/client/app/common/views/components/index.ts +++ b/src/client/app/common/views/components/index.ts @@ -1,5 +1,6 @@ import Vue from 'vue'; +import theme from './theme.vue'; import instance from './instance.vue'; import cwButton from './cw-button.vue'; import tagCloud from './tag-cloud.vue'; @@ -43,6 +44,7 @@ import uiSelect from './ui/select.vue'; import formButton from './ui/form/button.vue'; import formRadio from './ui/form/radio.vue'; +Vue.component('mk-theme', theme); Vue.component('mk-instance', instance); Vue.component('mk-cw-button', cwButton); Vue.component('mk-tag-cloud', tagCloud); diff --git a/src/client/app/common/views/components/theme.vue b/src/client/app/common/views/components/theme.vue new file mode 100644 index 0000000000..27888d1e85 --- /dev/null +++ b/src/client/app/common/views/components/theme.vue @@ -0,0 +1,179 @@ +<template> +<div class="nicnklzforebnpfgasiypmpdaaglujqm"> + <label> + <span>%i18n:@light-theme%</span> + <ui-select v-model="light" placeholder="%i18n:@light-theme%"> + <option v-for="x in themes" :value="x.meta.id" :key="x.meta.id">{{ x.meta.name }}</option> + </ui-select> + </label> + + <label> + <span>%i18n:@dark-theme%</span> + <ui-select v-model="dark" placeholder="%i18n:@dark-theme%"> + <option v-for="x in themes" :value="x.meta.id" :key="x.meta.id">{{ x.meta.name }}</option> + </ui-select> + </label> + + <details class="creator"> + <summary>%i18n:@create-a-theme%</summary> + <div> + <span>%i18n:@base-theme%:</span> + <ui-radio v-model="myThemeBase" value="light">%i18n:@base-theme-light%</ui-radio> + <ui-radio v-model="myThemeBase" value="dark">%i18n:@base-theme-dark%</ui-radio> + </div> + <div> + <ui-input v-model="myThemeName"> + <span>%i18n:@theme-name%</span> + </ui-input> + </div> + <div> + <div style="padding-bottom:8px;">%i18n:@primary-color%:</div> + <color-picker v-model="myThemePrimary"/> + </div> + <div> + <div style="padding-bottom:8px;">%i18n:@secondary-color%:</div> + <color-picker v-model="myThemeSecondary"/> + </div> + <div> + <div style="padding-bottom:8px;">%i18n:@text-color%:</div> + <color-picker v-model="myThemeText"/> + </div> + <ui-button @click="preview()">%i18n:@preview-created-theme%</ui-button> + <ui-button primary @click="gen()">%i18n:@save-created-theme%</ui-button> + </details> + + <details> + <summary>%i18n:@install-a-theme%</summary> + <ui-textarea v-model="installThemeCode"> + <span>%i18n:@theme-code%</span> + </ui-textarea> + <ui-button @click="install()">%i18n:@install%</ui-button> + </details> + + <details> + <summary>%i18n:@installed-themes%</summary> + <ui-select v-model="selectedInstalledTheme" placeholder="%i18n:@select-theme%"> + <option v-for="x in installedThemes" :value="x.meta.id" :key="x.meta.id">{{ x.meta.name }}</option> + </ui-select> + <ui-textarea readonly :value="selectedInstalledThemeCode"> + <span>%i18n:@theme-code%</span> + </ui-textarea> + </details> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; +import { apiUrl, docsUrl } from '../../../config'; +import { lightTheme, darkTheme, builtinThemes, applyTheme } from '../../../theme'; +import { Chrome } from 'vue-color'; +import * as uuid from 'uuid'; +import * as tinycolor from 'tinycolor2'; + +export default Vue.extend({ + components: { + ColorPicker: Chrome + }, + + data() { + return { + installThemeCode: null, + selectedInstalledTheme: null, + myThemeBase: 'light', + myThemeName: '', + myThemePrimary: lightTheme.meta.vars.primary, + myThemeSecondary: lightTheme.meta.vars.secondary, + myThemeText: lightTheme.meta.vars.text + }; + }, + + computed: { + themes(): any { + return this.$store.state.device.themes.concat(builtinThemes); + }, + + installedThemes(): any { + return this.$store.state.device.themes; + }, + + light: { + get() { return this.$store.state.device.lightTheme; }, + set(value) { this.$store.commit('device/set', { key: 'lightTheme', value }); } + }, + + dark: { + get() { return this.$store.state.device.darkTheme; }, + set(value) { this.$store.commit('device/set', { key: 'darkTheme', value }); } + }, + + selectedInstalledThemeCode() { + if (this.selectedInstalledTheme == null) return null; + return JSON.stringify(this.installedThemes.find(x => x.meta.id == this.selectedInstalledTheme)); + }, + + myTheme(): any { + return { + meta: { + name: this.myThemeName, + author: this.$store.state.i.name, + base: this.myThemeBase, + vars: { + primary: tinycolor(typeof this.myThemePrimary == 'string' ? this.myThemePrimary : this.myThemePrimary.rgba).toRgbString(), + secondary: tinycolor(typeof this.myThemeSecondary == 'string' ? this.myThemeSecondary : this.myThemeSecondary.rgba).toRgbString(), + text: tinycolor(typeof this.myThemeText == 'string' ? this.myThemeText : this.myThemeText.rgba).toRgbString() + } + } + }; + } + }, + + watch: { + myThemeBase(v) { + const theme = v == 'light' ? lightTheme : darkTheme; + this.myThemePrimary = theme.meta.vars.primary; + this.myThemeSecondary = theme.meta.vars.secondary; + this.myThemeText = theme.meta.vars.text; + } + }, + + methods: { + install() { + const theme = JSON.parse(this.installThemeCode); + if (theme.meta == null || theme.meta.id == null) { + alert('%i18n:@invalid-theme%'); + return; + } + if (this.$store.state.device.themes.some(t => t.meta.id == theme.meta.id)) { + alert('%i18n:@already-installed%'); + return; + } + const themes = this.$store.state.device.themes.concat(theme); + this.$store.commit('device/set', { + key: 'themes', value: themes + }); + }, + + preview() { + applyTheme(this.myTheme, false); + }, + + gen() { + const theme = this.myTheme; + theme.meta.id = uuid(); + const themes = this.$store.state.device.themes.concat(theme); + this.$store.commit('device/set', { + key: 'themes', value: themes + }); + alert('%i18n:@saved%'); + } + } +}); +</script> + +<style lang="stylus" scoped> +.nicnklzforebnpfgasiypmpdaaglujqm + > .creator + > div + padding 16px 0 + border-bottom solid 1px var(--faceDivider) +</style> diff --git a/src/client/app/common/views/components/ui/button.vue b/src/client/app/common/views/components/ui/button.vue index a165d100a4..47644b32b5 100644 --- a/src/client/app/common/views/components/ui/button.vue +++ b/src/client/app/common/views/components/ui/button.vue @@ -27,14 +27,6 @@ export default Vue.extend({ return { styl: 'fill' }; - }, - inject: { - isCardChild: { default: false } - }, - created() { - if (this.isCardChild) { - this.styl = 'line'; - } } }); </script> @@ -43,6 +35,7 @@ export default Vue.extend({ .dmtdnykelhudezerjlfpbhgovrgnqqgr display block width 100% + min-height 40px margin 0 padding 0 font-weight normal @@ -52,6 +45,9 @@ export default Vue.extend({ outline none box-shadow none + &:not(.inline) + .dmtdnykelhudezerjlfpbhgovrgnqqgr + margin-top 16px + &.inline display inline-block width auto diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue index c7d82590ea..1cb8d4d4c8 100644 --- a/src/client/app/desktop/views/components/settings.vue +++ b/src/client/app/desktop/views/components/settings.vue @@ -19,6 +19,11 @@ <x-profile/> </section> + <section class="web" v-show="page == 'web'"> + <h1>%i18n:@theme%</h1> + <mk-theme/> + </section> + <section class="web" v-show="page == 'web'"> <h1>%i18n:@behaviour%</h1> <ui-switch v-model="fetchOnScroll"> diff --git a/src/client/app/init.ts b/src/client/app/init.ts index 8d430ad7ff..802f7b42eb 100644 --- a/src/client/app/init.ts +++ b/src/client/app/init.ts @@ -14,11 +14,11 @@ import App from './app.vue'; import checkForUpdate from './common/scripts/check-for-update'; import MiOS, { API } from './mios'; import { version, codename, lang } from './config'; -import applyTheme from './common/scripts/theme'; -const defaultTheme = require('../theme/light.json'); +import { builtinThemes, applyTheme } from './theme'; +const lightTheme = require('../theme/light.json'); if (localStorage.getItem('theme') == null) { - applyTheme(defaultTheme); + applyTheme(lightTheme); } Vue.use(Vuex); @@ -92,6 +92,35 @@ export default (callback: (launch: (router: VueRouter, api?: (os: MiOS) => API) const launch = (router: VueRouter, api?: (os: MiOS) => API) => { os.apis = api ? api(os) : null; + //#region theme + os.store.watch(s => { + return s.device.darkmode; + }, v => { + const themes = os.store.state.device.themes.concat(builtinThemes); + const dark = themes.find(t => t.meta.id == os.store.state.device.darkTheme); + const light = themes.find(t => t.meta.id == os.store.state.device.lightTheme); + applyTheme(v ? dark : light); + }); + os.store.watch(s => { + return s.device.lightTheme; + }, v => { + const themes = os.store.state.device.themes.concat(builtinThemes); + const theme = themes.find(t => t.meta.id == v); + if (!os.store.state.device.darkmode) { + applyTheme(theme); + } + }); + os.store.watch(s => { + return s.device.darkTheme; + }, v => { + const themes = os.store.state.device.themes.concat(builtinThemes); + const theme = themes.find(t => t.meta.id == v); + if (os.store.state.device.darkmode) { + applyTheme(theme); + } + }); + //#endregion + //#region shadow const shadow = '0 3px 8px rgba(0, 0, 0, 0.2)'; if (os.store.state.settings.useShadow) document.documentElement.style.setProperty('--shadow', shadow); diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index b83eaf6d33..94fa38cec9 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -23,6 +23,13 @@ <ui-switch v-model="games_reversi_useContrastStones">%i18n:common.use-contrast-reversi-stones%</ui-switch> </section> + <section> + <header>%i18n:@theme%</header> + <div> + <mk-theme/> + </div> + </section> + <section> <header>%i18n:@timeline%</header> <div> diff --git a/src/client/app/store.ts b/src/client/app/store.ts index fbcc53d7be..545261225a 100644 --- a/src/client/app/store.ts +++ b/src/client/app/store.ts @@ -44,6 +44,9 @@ const defaultDeviceSettings = { apiViaStream: true, autoPopout: false, darkmode: false, + darkTheme: 'dark', + lightTheme: 'light', + themes: [], enableSounds: true, soundVolume: 0.5, lang: null, diff --git a/src/client/app/common/scripts/theme.ts b/src/client/app/theme.ts similarity index 74% rename from src/client/app/common/scripts/theme.ts rename to src/client/app/theme.ts index 7a1c6abb76..1147ff300d 100644 --- a/src/client/app/common/scripts/theme.ts +++ b/src/client/app/theme.ts @@ -1,22 +1,21 @@ import * as tinycolor from 'tinycolor2'; -const lightTheme = require('../../../theme/light'); -const darkTheme = require('../../../theme/dark'); type Theme = { meta: { id: string; name: string; - inherit: string; + author: string; + base?: string; vars: any; }; } & { [key: string]: string; }; -export default function(theme: Theme) { - if (theme.meta.inherit) { - const inherit = [lightTheme, darkTheme].find(x => x.meta.id == theme.meta.inherit); - theme = Object.assign({}, inherit, theme); +export function applyTheme(theme: Theme, persisted = true) { + if (theme.meta.base) { + const base = [lightTheme, darkTheme].find(x => x.meta.id == theme.meta.base); + theme = Object.assign({}, base, theme); } const props = compile(theme); @@ -26,7 +25,9 @@ export default function(theme: Theme) { document.documentElement.style.setProperty(`--${k}`, v.toString()); }); - localStorage.setItem('theme', JSON.stringify(props)); + if (persisted) { + localStorage.setItem('theme', JSON.stringify(props)); + } } function compile(theme: Theme): { [key: string]: string } { @@ -87,3 +88,13 @@ function compile(theme: Theme): { [key: string]: string } { function genValue(c: tinycolor.Instance): string { return c.toRgbString(); } + +export const lightTheme = require('../theme/light.json'); +export const darkTheme = require('../theme/dark.json'); +export const halloweenTheme = require('../theme/halloween.json'); + +export const builtinThemes = [ + lightTheme, + darkTheme, + halloweenTheme +]; diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json index 015225ddab..74447b8f2f 100644 --- a/src/client/theme/dark.json +++ b/src/client/theme/dark.json @@ -1,6 +1,6 @@ { "meta": { - "id": "9978f7f9-5616-44fd-a704-cc5985efdd63", + "id": "dark", "name": "Dark", "author": "syuilo", "vars": { diff --git a/src/client/theme/halloween.json b/src/client/theme/halloween.json index 6e92db95ff..fb34db57a8 100644 --- a/src/client/theme/halloween.json +++ b/src/client/theme/halloween.json @@ -3,10 +3,9 @@ "id": "42e4f09b-67d5-498c-af7d-29faa54745b0", "name": "Halloween", "author": "syuilo", - "inherit": "9978f7f9-5616-44fd-a704-cc5985efdd63", + "base": "dark", "vars": { "primary": "#d67036", - "primaryForeground": "#fff", "secondary": "#1f1d30", "text": "#b1bee3" } diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 3d131f066a..1b6604e642 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -1,6 +1,6 @@ { "meta": { - "id": "406cfea3-a4e7-486c-9057-30ede1353c3f", + "id": "light", "name": "Light", "author": "syuilo", "vars": { From 7b426532710c69e5b08407e33f21fa592f976e99 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 29 Sep 2018 00:03:28 +0900 Subject: [PATCH 444/539] wip --- src/client/theme/light.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/theme/light.json b/src/client/theme/light.json index 1b6604e642..b853aa9a26 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -43,7 +43,7 @@ "noteHeaderBadgeFg": "#aaa", "noteHeaderBadgeBg": "rgba(0, 0, 0, 0.05)", "noteHeaderAdminFg": "#f15f71", - "noteHeaderAdminBg": "#5d282e", + "noteHeaderAdminBg": "#ffdfdf", "noteHeaderAcct": "#ccc", "noteHeaderInfo": "#c0c0c0", From 094d873f2e7dbcc6c250260d21524afb15cca47f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 29 Sep 2018 00:20:49 +0900 Subject: [PATCH 445/539] wip --- src/client/app/common/views/components/ui/button.vue | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/client/app/common/views/components/ui/button.vue b/src/client/app/common/views/components/ui/button.vue index 47644b32b5..b29f8bb1c9 100644 --- a/src/client/app/common/views/components/ui/button.vue +++ b/src/client/app/common/views/components/ui/button.vue @@ -45,6 +45,18 @@ export default Vue.extend({ outline none box-shadow none + &:focus + &:after + content "" + pointer-events none + position absolute + top -5px + right -5px + bottom -5px + left -5px + border 2px solid var(--primaryAlpha03) + border-radius 10px + &:not(.inline) + .dmtdnykelhudezerjlfpbhgovrgnqqgr margin-top 16px From 57669c9c0302392c1e12008fd01578cfd1d3f157 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 29 Sep 2018 00:44:23 +0900 Subject: [PATCH 446/539] wip --- src/client/app/theme.ts | 2 ++ src/client/theme/light.json | 10 +++++----- src/client/theme/pink.json | 17 +++++++++++++++++ 3 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 src/client/theme/pink.json diff --git a/src/client/app/theme.ts b/src/client/app/theme.ts index 1147ff300d..555f8411f2 100644 --- a/src/client/app/theme.ts +++ b/src/client/app/theme.ts @@ -91,10 +91,12 @@ function genValue(c: tinycolor.Instance): string { export const lightTheme = require('../theme/light.json'); export const darkTheme = require('../theme/dark.json'); +export const pinkTheme = require('../theme/pink.json'); export const halloweenTheme = require('../theme/halloween.json'); export const builtinThemes = [ lightTheme, darkTheme, + pinkTheme, halloweenTheme ]; diff --git a/src/client/theme/light.json b/src/client/theme/light.json index b853aa9a26..0d50dc5caa 100644 --- a/src/client/theme/light.json +++ b/src/client/theme/light.json @@ -39,16 +39,16 @@ "renoteText": "#9dbb00", "quoteBorder": "#c0dac6", "noteText": "#717171", - "noteHeaderName": "#627079", + "noteHeaderName": ":darken<2<$text", "noteHeaderBadgeFg": "#aaa", "noteHeaderBadgeBg": "rgba(0, 0, 0, 0.05)", "noteHeaderAdminFg": "#f15f71", "noteHeaderAdminBg": "#ffdfdf", - "noteHeaderAcct": "#ccc", - "noteHeaderInfo": "#c0c0c0", + "noteHeaderAcct": ":alpha<0.7<@noteHeaderName", + "noteHeaderInfo": ":alpha<0.7<@noteHeaderName", - "noteActions": "#ddd", - "noteActionsHover": "#444", + "noteActions": ":alpha<0.3<$text", + "noteActionsHover": ":alpha<0.9<$text", "noteActionsReplyHover": "#0af", "noteActionsRenoteHover": "#8d0", "noteActionsReactionHover": "#fa0", diff --git a/src/client/theme/pink.json b/src/client/theme/pink.json new file mode 100644 index 0000000000..ddb56b46e1 --- /dev/null +++ b/src/client/theme/pink.json @@ -0,0 +1,17 @@ +{ + "meta": { + "id": "e9c8c01d-9c15-48d0-9b5c-3d00843b5b36", + "name": "Pink", + "author": "syuilo", + "base": "light", + "vars": { + "primary": "rgb(251, 78, 112)", + "secondary": "rgb(255, 218, 240)", + "text": "rgb(113, 91, 102)" + } + }, + + "renoteGradient": "#ffb1c9", + "renoteText": "#ff588d", + "quoteBorder": "#ff6c9b" +} From f26e64190575c53601fbfccba539a95568813007 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 29 Sep 2018 00:48:02 +0900 Subject: [PATCH 447/539] wip --- .../app/desktop/views/components/settings.profile.vue | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/client/app/desktop/views/components/settings.profile.vue b/src/client/app/desktop/views/components/settings.profile.vue index 9dd2798557..5f465a52bb 100644 --- a/src/client/app/desktop/views/components/settings.profile.vue +++ b/src/client/app/desktop/views/components/settings.profile.vue @@ -6,22 +6,19 @@ <button class="ui" @click="updateAvatar">%i18n:@choice-avatar%</button> </label> <label class="ui from group"> - <p>%i18n:@name%</p> - <input v-model="name" type="text" class="ui"/> + <ui-input v-model="name" type="text">%i18n:@name%</ui-input> </label> <label class="ui from group"> - <p>%i18n:@location%</p> - <input v-model="location" type="text" class="ui"/> + <ui-input v-model="location" type="text">%i18n:@location%</ui-input> </label> <label class="ui from group"> - <p>%i18n:@description%</p> - <textarea v-model="description" class="ui"></textarea> + <ui-textarea v-model="description">%i18n:@description%</ui-textarea> </label> <label class="ui from group"> <p>%i18n:@birthday%</p> <input type="date" v-model="birthday"/> </label> - <button class="ui primary" @click="save">%i18n:@save%</button> + <ui-button primary @click="save">%i18n:@save%</ui-button> <section> <h2>%i18n:@locked-account%</h2> <ui-switch v-model="$store.state.i.isLocked" @change="onChangeIsLocked">%i18n:@is-locked%</ui-switch> From b8b4991a464c90dcea82b8ddaf026fee591d44ea Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 29 Sep 2018 00:51:13 +0900 Subject: [PATCH 448/539] 8.63.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e19283cf64..e827011257 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.62.0", - "clientVersion": "1.0.9964", + "version": "8.63.0", + "clientVersion": "1.0.10040", "codename": "nighthike", "main": "./built/index.js", "private": true, From 25dd19dd8c931ffabb6137ff92d63bbf67ed7883 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sat, 29 Sep 2018 09:11:06 +0900 Subject: [PATCH 449/539] :art: --- .../app/common/views/components/signin.vue | 6 +++--- .../app/common/views/components/signup.vue | 8 ++++---- .../app/common/views/components/ui/input.vue | 16 ++++++---------- .../app/common/views/components/ui/select.vue | 16 ++++++---------- src/client/app/mobile/views/pages/drive.vue | 1 - .../app/mobile/views/pages/games/reversi.vue | 1 - 6 files changed, 19 insertions(+), 29 deletions(-) diff --git a/src/client/app/common/views/components/signin.vue b/src/client/app/common/views/components/signin.vue index e02af8154c..7025ecea33 100644 --- a/src/client/app/common/views/components/signin.vue +++ b/src/client/app/common/views/components/signin.vue @@ -1,16 +1,16 @@ <template> <form class="mk-signin" :class="{ signing }" @submit.prevent="onSubmit"> <div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }" v-show="withAvatar"></div> - <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @input="onUsernameChange"> + <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @input="onUsernameChange" styl="fill"> <span>%i18n:@username%</span> <span slot="prefix">@</span> <span slot="suffix">@{{ host }}</span> </ui-input> - <ui-input v-model="password" type="password" required> + <ui-input v-model="password" type="password" required styl="fill"> <span>%i18n:@password%</span> <span slot="prefix">%fa:lock%</span> </ui-input> - <ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/> + <ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required styl="fill"/> <ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button> <p style="margin: 8px 0;">%i18n:@or% <a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p> </form> diff --git a/src/client/app/common/views/components/signup.vue b/src/client/app/common/views/components/signup.vue index e55d7ee3e3..b817ca729d 100644 --- a/src/client/app/common/views/components/signup.vue +++ b/src/client/app/common/views/components/signup.vue @@ -1,12 +1,12 @@ <template> <form class="mk-signup" @submit.prevent="onSubmit" :autocomplete="Math.random()"> <template v-if="meta"> - <ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required> + <ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required styl="fill"> <span>%i18n:@invitation-code%</span> <span slot="prefix">%fa:id-card-alt%</span> <p slot="text" v-html="'%i18n:@invitation-info%'.replace('{}', meta.maintainer.url)"></p> </ui-input> - <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername"> + <ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername" styl="fill"> <span>%i18n:@username%</span> <span slot="prefix">@</span> <span slot="suffix">@{{ host }}</span> @@ -18,7 +18,7 @@ <p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-short%</p> <p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-long%</p> </ui-input> - <ui-input v-model="password" type="password" :autocomplete="Math.random()" required @input="onChangePassword" :with-password-meter="true"> + <ui-input v-model="password" type="password" :autocomplete="Math.random()" required @input="onChangePassword" :with-password-meter="true" styl="fill"> <span>%i18n:@password%</span> <span slot="prefix">%fa:lock%</span> <div slot="text"> @@ -27,7 +27,7 @@ <p slot="text" v-if="passwordStrength == 'high'" style="color:#3CB7B5">%fa:check .fw% %i18n:@strong-password%</p> </div> </ui-input> - <ui-input v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @input="onChangePasswordRetype"> + <ui-input v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @input="onChangePasswordRetype" styl="fill"> <span>%i18n:@password% (%i18n:@retype%)</span> <span slot="prefix">%fa:lock%</span> <div slot="text"> diff --git a/src/client/app/common/views/components/ui/input.vue b/src/client/app/common/views/components/ui/input.vue index d7e72409f0..abbd5a2feb 100644 --- a/src/client/app/common/views/components/ui/input.vue +++ b/src/client/app/common/views/components/ui/input.vue @@ -71,14 +71,18 @@ export default Vue.extend({ type: Boolean, required: false, default: false + }, + styl: { + type: String, + required: false, + default: 'line' } }, data() { return { v: this.value, focused: false, - passwordStrength: '', - styl: 'fill' + passwordStrength: '' }; }, computed: { @@ -117,14 +121,6 @@ export default Vue.extend({ } } }, - inject: { - isCardChild: { default: false } - }, - created() { - if (this.isCardChild) { - this.styl = 'line'; - } - }, mounted() { if (this.$refs.prefix) { this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px'; diff --git a/src/client/app/common/views/components/ui/select.vue b/src/client/app/common/views/components/ui/select.vue index 8c1b8c0269..da6f9696b5 100644 --- a/src/client/app/common/views/components/ui/select.vue +++ b/src/client/app/common/views/components/ui/select.vue @@ -29,13 +29,17 @@ export default Vue.extend({ required: { type: Boolean, required: false + }, + styl: { + type: String, + required: false, + default: 'line' } }, data() { return { v: this.value, - focused: false, - styl: 'fill' + focused: false }; }, computed: { @@ -48,14 +52,6 @@ export default Vue.extend({ this.v = v; } }, - inject: { - isCardChild: { default: false } - }, - created() { - if (this.isCardChild) { - this.styl = 'line'; - } - }, mounted() { if (this.$refs.prefix) { this.$refs.label.style.left = (this.$refs.prefix.offsetLeft + this.$refs.prefix.offsetWidth) + 'px'; diff --git a/src/client/app/mobile/views/pages/drive.vue b/src/client/app/mobile/views/pages/drive.vue index c0fc7b48dc..bf02adca9d 100644 --- a/src/client/app/mobile/views/pages/drive.vue +++ b/src/client/app/mobile/views/pages/drive.vue @@ -44,7 +44,6 @@ export default Vue.extend({ }, mounted() { document.title = `${(this as any).os.instanceName} Drive`; - document.documentElement.style.background = '#fff'; }, beforeDestroy() { window.removeEventListener('popstate', this.onPopState); diff --git a/src/client/app/mobile/views/pages/games/reversi.vue b/src/client/app/mobile/views/pages/games/reversi.vue index f3bba586de..7f8f919005 100644 --- a/src/client/app/mobile/views/pages/games/reversi.vue +++ b/src/client/app/mobile/views/pages/games/reversi.vue @@ -11,7 +11,6 @@ import Vue from 'vue'; export default Vue.extend({ mounted() { document.title = `${(this as any).os.instanceName} %i18n:@reversi%`; - document.documentElement.style.background = '#fff'; }, methods: { nav(game, actualNav) { From 1e2b484929410d3c1cf37a0809b84952ee3ad1cd Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Sat, 29 Sep 2018 16:52:58 +0900 Subject: [PATCH 450/539] =?UTF-8?q?profile=20banner=20=E3=81=8C=E6=BF=83?= =?UTF-8?q?=E3=81=99=E3=81=8E=E3=82=8B=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=20(#2783)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/app/desktop/views/widgets/profile.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/desktop/views/widgets/profile.vue b/src/client/app/desktop/views/widgets/profile.vue index 91354324ce..30b7b95d35 100644 --- a/src/client/app/desktop/views/widgets/profile.vue +++ b/src/client/app/desktop/views/widgets/profile.vue @@ -86,7 +86,7 @@ export default define({ > .banner height 100px - background-color var(--primaryDarken10) + background-color var(--primaryAlpha01) background-size cover background-position center cursor pointer From 579b61a8063acfbba0bf1ea6429857b6b2c13800 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 30 Sep 2018 14:46:18 +0900 Subject: [PATCH 451/539] Update tests --- test/mfm.ts | 51 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/test/mfm.ts b/test/mfm.ts index b0c793e44b..dc0947e5e9 100644 --- a/test/mfm.ts +++ b/test/mfm.ts @@ -54,20 +54,45 @@ describe('Text', () => { ], tokens2); }); - it('mention', () => { - const tokens = analyze('@himawari お腹ペコい'); - assert.deepEqual([ - { type: 'mention', content: '@himawari', username: 'himawari', host: null }, - { type: 'text', content: ' お腹ペコい' } - ], tokens); - }); + describe('mention', () => { + it('local', () => { + const tokens = analyze('@himawari お腹ペコい'); + assert.deepEqual([ + { type: 'mention', content: '@himawari', username: 'himawari', host: null }, + { type: 'text', content: ' お腹ペコい' } + ], tokens); + }); - it('remote mention', () => { - const tokens = analyze('@hima_sub@namori.net お腹ペコい'); - assert.deepEqual([ - { type: 'mention', content: '@hima_sub@namori.net', username: 'hima_sub', host: 'namori.net' }, - { type: 'text', content: ' お腹ペコい' } - ], tokens); + it('remote', () => { + const tokens = analyze('@hima_sub@namori.net お腹ペコい'); + assert.deepEqual([ + { type: 'mention', content: '@hima_sub@namori.net', username: 'hima_sub', host: 'namori.net' }, + { type: 'text', content: ' お腹ペコい' } + ], tokens); + }); +/* + it('ignore', () => { + const tokens = analyze('idolm@ster'); + assert.deepEqual([ + { type: 'text', content: 'idolm@ster' } + ], tokens); + + const tokens2 = analyze('@a\n@b\n@c'); + assert.deepEqual([ + { type: 'mention', content: '@a', username: 'a', host: null }, + { type: 'text', content: '\n' }, + { type: 'mention', content: '@b', username: 'b', host: null }, + { type: 'text', content: '\n' }, + { type: 'mention', content: '@c', username: 'c', host: null } + ], tokens2); + + const tokens3 = analyze('**x**@a'); + assert.deepEqual([ + { type: 'bold', content: '**x**', bold: 'x' }, + { type: 'mention', content: '@a', username: 'a', host: null } + ], tokens3); + }); +*/ }); it('hashtag', () => { From 1b9b8912aef0bce4346fb0f11a3a1e9c3bd1cf50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Acid=20Chicken=20=28=E7=A1=AB=E9=85=B8=E9=B6=8F=29?= <root@acid-chicken.com> Date: Sun, 30 Sep 2018 22:45:24 +0900 Subject: [PATCH 452/539] Update post-form.vue (#2790) --- src/client/app/desktop/views/components/post-form.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue index f50dfaf8fb..e25cc33579 100644 --- a/src/client/app/desktop/views/components/post-form.vue +++ b/src/client/app/desktop/views/components/post-form.vue @@ -450,6 +450,7 @@ export default Vue.extend({ display block padding 16px background var(--desktopPostFormBg) + overflow hidden &:after content "" From ff76c815b15a4bb3ceda0ef3cf6d5adb73f535e2 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 30 Sep 2018 23:03:21 +0900 Subject: [PATCH 453/539] =?UTF-8?q?=E3=83=86=E3=83=BC=E3=83=9E=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=82=B9=E3=83=88=E3=83=BC=E3=83=AB=E6=99=82=E3=81=AE?= =?UTF-8?q?=E5=8B=95=E4=BD=9C=E3=82=92=E3=82=8F=E3=81=8B=E3=82=8A=E3=82=84?= =?UTF-8?q?=E3=81=99=E3=81=8F=E3=81=97=E3=81=9F=E3=82=8A=E3=83=86=E3=83=BC?= =?UTF-8?q?=E3=83=9E=E3=82=92=E3=82=A2=E3=83=B3=E3=82=A4=E3=83=B3=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=83=BC=E3=83=AB=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F=E3=82=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 3 +++ src/client/app/common/views/components/theme.vue | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 46dea949d2..366c4a33cd 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -291,6 +291,7 @@ common/views/components/theme.vue: install-a-theme: "テーマのインストール" theme-code: "テーマコード" install: "インストール" + installed: "「{}」をインストールしました" create-a-theme: "テーマの作成" save-created-theme: "テーマを保存" primary-color: "プライマリ カラー" @@ -306,6 +307,8 @@ common/views/components/theme.vue: saved: "保存しました" installed-themes: "インストールされたテーマ" select-theme: "テーマを選択してください" + uninstall: "アンインストール" + uninstalled: "「{}」をアンインストールしました" common/views/components/cw-button.vue: hide: "隠す" diff --git a/src/client/app/common/views/components/theme.vue b/src/client/app/common/views/components/theme.vue index 27888d1e85..56b07da498 100644 --- a/src/client/app/common/views/components/theme.vue +++ b/src/client/app/common/views/components/theme.vue @@ -58,13 +58,13 @@ <ui-textarea readonly :value="selectedInstalledThemeCode"> <span>%i18n:@theme-code%</span> </ui-textarea> + <ui-button @click="uninstall()">%i18n:@uninstall%</ui-button> </details> </div> </template> <script lang="ts"> import Vue from 'vue'; -import { apiUrl, docsUrl } from '../../../config'; import { lightTheme, darkTheme, builtinThemes, applyTheme } from '../../../theme'; import { Chrome } from 'vue-color'; import * as uuid from 'uuid'; @@ -151,6 +151,16 @@ export default Vue.extend({ this.$store.commit('device/set', { key: 'themes', value: themes }); + alert('%i18n:@installed%'.replace('{}', theme.meta.name)); + }, + + uninstall() { + const theme = this.installedThemes.find(x => x.meta.id == this.selectedInstalledTheme); + const themes = this.$store.state.device.themes.filter(t => t.meta.id != theme.meta.id); + this.$store.commit('device/set', { + key: 'themes', value: themes + }); + alert('%i18n:@uninstalled%'.replace('{}', theme.meta.name)); }, preview() { From 110aadd65c01b7dd7b539bf994acd71d526500f2 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 1 Oct 2018 00:15:17 +0900 Subject: [PATCH 454/539] 8.64.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e827011257..1c45fc7aff 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.63.0", - "clientVersion": "1.0.10040", + "version": "8.64.0", + "clientVersion": "1.0.10046", "codename": "nighthike", "main": "./built/index.js", "private": true, From cd0b9a8e3f539ac0f31a57800e7745ed585ccc3a Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Mon, 1 Oct 2018 19:28:24 +0900 Subject: [PATCH 455/539] =?UTF-8?q?=E9=9D=9E=E6=89=BF=E8=AA=8D=E5=88=B6?= =?UTF-8?q?=E3=82=A2=E3=82=AB=E3=82=A6=E3=83=B3=E3=83=88=E3=81=AE=E3=83=AA?= =?UTF-8?q?=E3=83=A2=E3=83=BC=E3=83=88=E3=83=95=E3=82=A9=E3=83=AD=E3=83=BC?= =?UTF-8?q?=E3=81=A7=E3=81=AF=E3=83=95=E3=82=A9=E3=83=AD=E3=83=BC=E8=A8=B1?= =?UTF-8?q?=E5=8F=AF=E5=BE=85=E3=81=A1=E3=81=A8=E8=A1=A8=E7=A4=BA=E3=81=97?= =?UTF-8?q?=E3=81=AA=E3=81=84=20(#2796)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/en-US.yml | 3 +++ locales/ja-JP.yml | 3 +++ src/client/app/common/views/pages/follow.vue | 3 ++- src/client/app/desktop/views/components/follow-button.vue | 3 ++- src/client/app/mobile/views/components/follow-button.vue | 3 ++- 5 files changed, 12 insertions(+), 3 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index 9b4ae5c381..50c489726d 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -439,6 +439,7 @@ common/views/pages/follow.vue: following: "Following" follow: "Follow" request-pending: "Pending follow request" + follow-processing: "Processing follow" follow-request: "Follow request" desktop: banner-crop-title: "Crop the part that appears as a banner" @@ -565,6 +566,7 @@ desktop/views/components/follow-button.vue: following: "Following" follow: "Follow" request-pending: "Pending follow request" + follow-processing: "Processing follow" follow-request: "Follow request" desktop/views/components/followers-window.vue: followers: "{}'s followers" @@ -1044,6 +1046,7 @@ mobile/views/components/follow-button.vue: following: "Following" follow: "Follow" request-pending: "Pending follow request" + follow-processing: "Processing follow" follow-request: "Follow request" mobile/views/components/friends-maker.vue: title: "Let's follow them" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 366c4a33cd..08d3c51733 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -514,6 +514,7 @@ common/views/pages/follow.vue: following: "フォロー中" follow: "フォロー" request-pending: "フォロー許可待ち" + follow-processing: "フォロー処理中" follow-request: "フォロー申請" desktop: @@ -656,6 +657,7 @@ desktop/views/components/follow-button.vue: following: "フォロー中" follow: "フォロー" request-pending: "フォロー許可待ち" + follow-processing: "フォロー処理中" follow-request: "フォロー申請" desktop/views/components/followers-window.vue: @@ -1232,6 +1234,7 @@ mobile/views/components/follow-button.vue: following: "フォロー中" follow: "フォロー" request-pending: "フォロー許可待ち" + follow-processing: "フォロー処理中" follow-request: "フォロー申請" mobile/views/components/friends-maker.vue: diff --git a/src/client/app/common/views/pages/follow.vue b/src/client/app/common/views/pages/follow.vue index cb4785f468..92f24fb538 100644 --- a/src/client/app/common/views/pages/follow.vue +++ b/src/client/app/common/views/pages/follow.vue @@ -19,7 +19,8 @@ @click="onClick" :disabled="followWait"> <template v-if="!followWait"> - <template v-if="user.hasPendingFollowRequestFromYou">%fa:hourglass-half% %i18n:@request-pending%</template> + <template v-if="user.hasPendingFollowRequestFromYou && user.isLocked">%fa:hourglass-half% %i18n:@request-pending%</template> + <template v-else-if="user.hasPendingFollowRequestFromYou && !user.isLocked">%fa:hourglass-start% %i18n:@follow-processing%</template> <template v-else-if="user.isFollowing">%fa:minus% %i18n:@following%</template> <template v-else-if="!user.isFollowing && user.isLocked">%fa:plus% %i18n:@follow-request%</template> <template v-else-if="!user.isFollowing && !user.isLocked">%fa:plus% %i18n:@follow%</template> diff --git a/src/client/app/desktop/views/components/follow-button.vue b/src/client/app/desktop/views/components/follow-button.vue index 45e63ad928..4d4bd5cc5a 100644 --- a/src/client/app/desktop/views/components/follow-button.vue +++ b/src/client/app/desktop/views/components/follow-button.vue @@ -5,7 +5,8 @@ :disabled="wait" > <template v-if="!wait"> - <template v-if="u.hasPendingFollowRequestFromYou">%fa:hourglass-half%<template v-if="size == 'big'"> %i18n:@request-pending%</template></template> + <template v-if="u.hasPendingFollowRequestFromYou && u.isLocked">%fa:hourglass-half%<template v-if="size == 'big'"> %i18n:@request-pending%</template></template> + <template v-else-if="u.hasPendingFollowRequestFromYou && !u.isLocked">%fa:hourglass-start%<template v-if="size == 'big'"> %i18n:@follow-processing%</template></template> <template v-else-if="u.isFollowing">%fa:minus%<template v-if="size == 'big'"> %i18n:@following%</template></template> <template v-else-if="!u.isFollowing && u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow-request%</template></template> <template v-else-if="!u.isFollowing && !u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow%</template></template> diff --git a/src/client/app/mobile/views/components/follow-button.vue b/src/client/app/mobile/views/components/follow-button.vue index cff830d998..aea2d285e4 100644 --- a/src/client/app/mobile/views/components/follow-button.vue +++ b/src/client/app/mobile/views/components/follow-button.vue @@ -5,7 +5,8 @@ :disabled="wait" > <template v-if="!wait"> - <template v-if="u.hasPendingFollowRequestFromYou">%fa:hourglass-half% %i18n:@request-pending%</template> + <template v-if="u.hasPendingFollowRequestFromYou && u.isLocked">%fa:hourglass-half% %i18n:@request-pending%</template> + <template v-else-if="u.hasPendingFollowRequestFromYou && !u.isLocked">%fa:hourglass-start% %i18n:@follow-processing%</template> <template v-else-if="u.isFollowing">%fa:minus% %i18n:@following%</template> <template v-else-if="!u.isFollowing && u.isLocked">%fa:plus% %i18n:@follow-request%</template> <template v-else-if="!u.isFollowing && !u.isLocked">%fa:plus% %i18n:@follow%</template> From 35362ed3c7e8962c9b44eddaf3a5810327c94aad Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo <tsukadayoshio@gmail.com> Date: Mon, 1 Oct 2018 19:29:02 +0900 Subject: [PATCH 456/539] Better example settings for TLS certification (#2793) --- .config/example.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.config/example.yml b/.config/example.yml index ecb1dd1934..692833635b 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -101,8 +101,8 @@ drive: # TLS # https: # # path for certification -# key: example-tls-key -# cert: example-tls-cert +# key: /etc/letsencrypt/live/example.tld/privkey.pem +# cert: /etc/letsencrypt/live/example.tld/fullchain.pem # Elasticsearch # elasticsearch: From f56adce51fd3c6276261747a6ae6dd556b947fab Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 2 Oct 2018 00:34:37 +0900 Subject: [PATCH 457/539] 9.0.0 --- CHANGELOG.md | 6 ++++++ package.json | 4 ++-- src/models/note.ts | 15 --------------- src/models/stats.ts | 5 ----- src/models/user.ts | 22 ---------------------- 5 files changed, 8 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84cf61f028..c492e43839 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ ChangeLog This document describes breaking changes only. +9.0.0 +----- + +Misskey v8.64.0 を使っている方は、9.0.0に際しては特にすべきことはありません。 +Misskey v8.64.0 に満たないバージョンをお使いの方は、一旦8.64.0にアップデートして(そして起動して)から9.0.0に再度アップデートしてください。 + 8.0.0 ----- diff --git a/package.json b/package.json index 1c45fc7aff..17603790f0 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "8.64.0", - "clientVersion": "1.0.10046", + "version": "9.0.0", + "clientVersion": "1.0.10049", "codename": "nighthike", "main": "./built/index.js", "private": true, diff --git a/src/models/note.ts b/src/models/note.ts index f67eeaaf6e..0efabc97d8 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -27,21 +27,6 @@ Note.createIndex({ }); export default Note; -// 後方互換性のため -Note.findOne({ - fileIds: { $exists: true } -}).then(n => { - if (n == null) { - Note.update({}, { - $rename: { - mediaIds: 'fileIds' - } - }, { - multi: true - }); - } -}); - export function isValidText(text: string): boolean { return length(text.trim()) <= 1000 && text.trim() != ''; } diff --git a/src/models/stats.ts b/src/models/stats.ts index c4c838caeb..492784555e 100644 --- a/src/models/stats.ts +++ b/src/models/stats.ts @@ -3,11 +3,6 @@ import db from '../db/mongodb'; const Stats = db.get<IStats>('stats'); -// 後方互換性のため -Stats.dropIndex({ date: -1 } as any).catch((e: mongo.MongoError) => { - if (e.code !== 27) throw e; -}); - Stats.createIndex({ span: -1, date: -1 }, { unique: true }); export default Stats; diff --git a/src/models/user.ts b/src/models/user.ts index bacae485a8..8ff91d3f45 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -35,28 +35,6 @@ User.createIndex('uri', { sparse: true, unique: true }); export default User; -// 後方互換性のため -User.findOne({ - pinnedNoteId: { $exists: true } -}).then(async x => { - if (x == null) return; - - const users = await User.find({ - pinnedNoteId: { $exists: true } - }); - - users.forEach(u => { - User.update({ _id: u._id }, { - $set: { - pinnedNoteIds: [(u as any).pinnedNoteId] - }, - $unset: { - pinnedNoteId: '' - } - }); - }); -}); - type IUserBase = { _id: mongo.ObjectID; createdAt: Date; From f2b9863eea4a7fe6e317ff91c1ecd12568b973c9 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Tue, 2 Oct 2018 11:59:12 +0900 Subject: [PATCH 458/539] Better deployment option descriptions. (#2800) --- .config/example.yml | 68 ++++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/.config/example.yml b/.config/example.yml index 692833635b..ebad171839 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -7,27 +7,51 @@ maintainer: repository_url: https://github.com/syuilo/misskey # Repository URL feedback_url: https://github.com/syuilo/misskey/issues # Feedback URL (e.g. github issue) -# URL and Port settings overview -# e.g., If you want to realize following structure: -# -# +--- https://example.com:123 ----------+ -# +------+ |+-------------+ +---------------+| -# | User | ---> || Proxy (123) | ---> | Misskey (456) || -# +------+ |+-------------+ +---------------+| -# +--------------------------------------+ -# -# You need to set 'https://example.com:123' to 'url' prop and -# You need to set 456 to 'port' prop. -# -# In other words, the 'url' prop should be the final accessible URL seen by a user. -# 'port' prop is a port that the Misskey server should actually listen -# on and it is not necessarily the port that a user accesses. -url: http://localhost/ +# Final accessible URL seen by a user. +url: https://example.tld/ + + +### Port and TLS settings ###################################### +# +# Misskey supports two deployment options for public. +# + +# Option 1: With Reverse Proxy +# +# +----- https://example.tld/ ------------+ +# +------+ |+-------------+ +----------------+| +# | User | ---> || Proxy (443) | ---> | Misskey (3000) || +# +------+ |+-------------+ +----------------+| +# +---------------------------------------+ +# +# You need to setup reverse proxy. (eg. Nginx) +# You do not define 'https' section. + +# Option 2: Standalone +# +# +- https://example.tld/ -+ +# +------+ | +---------------+ | +# | User | ---> | | Misskey (443) | | +# +------+ | +---------------+ | +# +------------------------+ +# +# You need to run Misskey as root. +# You need to set Certificate in 'https' section. + +# To use option 1, uncomment below line. +# port: 3000 # A port that your Misskey server should listen. + +# To use option 2, uncomment below lines. +# port: 443 +# +# https: +# # path for certification +# key: /etc/letsencrypt/live/example.tld/privkey.pem +# cert: /etc/letsencrypt/live/example.tld/fullchain.pem + +################################################################ -# A port that your Misskey server should listen. -# This value is not a port to use when accessing with a browser. -port: 80 mongodb: host: localhost @@ -98,12 +122,6 @@ drive: # Below settings are optional # -# TLS -# https: -# # path for certification -# key: /etc/letsencrypt/live/example.tld/privkey.pem -# cert: /etc/letsencrypt/live/example.tld/fullchain.pem - # Elasticsearch # elasticsearch: # host: localhost From 6b96bd01854ecfb7b0ee816831ff4634af8af856 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 2 Oct 2018 16:04:31 +0900 Subject: [PATCH 459/539] =?UTF-8?q?=E3=83=86=E3=83=BC=E3=83=9E=E3=81=AB?= =?UTF-8?q?=E9=96=A2=E3=81=97=E3=81=A6=E5=BC=B7=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 + src/client/app/app.vue | 3 - src/client/app/boot.js | 1 - .../app/common/views/components/theme.vue | 103 ++++++--- src/client/app/init.ts | 11 +- src/client/app/theme.ts | 62 +++--- src/client/theme/dark.json | 204 ----------------- src/client/theme/dark.json5 | 207 ++++++++++++++++++ src/client/theme/halloween.json | 17 -- src/client/theme/halloween.json5 | 21 ++ src/client/theme/light.json | 204 ----------------- src/client/theme/light.json5 | 207 ++++++++++++++++++ src/client/theme/pink.json | 17 -- src/client/theme/pink.json5 | 20 ++ webpack.config.ts | 3 + 15 files changed, 569 insertions(+), 513 deletions(-) delete mode 100644 src/client/theme/dark.json create mode 100644 src/client/theme/dark.json5 delete mode 100644 src/client/theme/halloween.json create mode 100644 src/client/theme/halloween.json5 delete mode 100644 src/client/theme/light.json create mode 100644 src/client/theme/light.json5 delete mode 100644 src/client/theme/pink.json create mode 100644 src/client/theme/pink.json5 diff --git a/package.json b/package.json index 17603790f0..c12b8861c6 100644 --- a/package.json +++ b/package.json @@ -134,6 +134,8 @@ "is-url": "1.2.4", "js-yaml": "3.12.0", "jsdom": "11.12.0", + "json5": "2.1.0", + "json5-loader": "1.0.1", "koa": "2.5.1", "koa-bodyparser": "4.2.1", "koa-compress": "3.0.0", diff --git a/src/client/app/app.vue b/src/client/app/app.vue index 778e9f29cf..e639c9f9ac 100644 --- a/src/client/app/app.vue +++ b/src/client/app/app.vue @@ -5,9 +5,6 @@ <script lang="ts"> import Vue from 'vue'; import { url, lang } from './config'; -import applyTheme from './common/scripts/theme'; -const darkTheme = require('../theme/dark'); -const halloweenTheme = require('../theme/halloween'); export default Vue.extend({ computed: { diff --git a/src/client/app/boot.js b/src/client/app/boot.js index e122e0423a..6e06a88aa3 100644 --- a/src/client/app/boot.js +++ b/src/client/app/boot.js @@ -24,7 +24,6 @@ const theme = localStorage.getItem('theme'); if (theme) { Object.entries(JSON.parse(theme)).forEach(([k, v]) => { - if (k == 'meta') return; document.documentElement.style.setProperty(`--${k}`, v.toString()); }); } diff --git a/src/client/app/common/views/components/theme.vue b/src/client/app/common/views/components/theme.vue index 56b07da498..293238e542 100644 --- a/src/client/app/common/views/components/theme.vue +++ b/src/client/app/common/views/components/theme.vue @@ -3,14 +3,14 @@ <label> <span>%i18n:@light-theme%</span> <ui-select v-model="light" placeholder="%i18n:@light-theme%"> - <option v-for="x in themes" :value="x.meta.id" :key="x.meta.id">{{ x.meta.name }}</option> + <option v-for="x in themes" :value="x.id" :key="x.id">{{ x.name }}</option> </ui-select> </label> <label> <span>%i18n:@dark-theme%</span> <ui-select v-model="dark" placeholder="%i18n:@dark-theme%"> - <option v-for="x in themes" :value="x.meta.id" :key="x.meta.id">{{ x.meta.name }}</option> + <option v-for="x in themes" :value="x.id" :key="x.id">{{ x.name }}</option> </ui-select> </label> @@ -53,7 +53,7 @@ <details> <summary>%i18n:@installed-themes%</summary> <ui-select v-model="selectedInstalledTheme" placeholder="%i18n:@select-theme%"> - <option v-for="x in installedThemes" :value="x.meta.id" :key="x.meta.id">{{ x.meta.name }}</option> + <option v-for="x in installedThemes" :value="x.id" :key="x.id">{{ x.name }}</option> </ui-select> <ui-textarea readonly :value="selectedInstalledThemeCode"> <span>%i18n:@theme-code%</span> @@ -65,10 +65,25 @@ <script lang="ts"> import Vue from 'vue'; -import { lightTheme, darkTheme, builtinThemes, applyTheme } from '../../../theme'; +import { lightTheme, darkTheme, builtinThemes, applyTheme, Theme } from '../../../theme'; import { Chrome } from 'vue-color'; import * as uuid from 'uuid'; import * as tinycolor from 'tinycolor2'; +import * as JSON5 from 'json5'; + +// 後方互換性のため +function convertOldThemedefinition(t) { + const t2 = { + id: t.meta.id, + name: t.meta.name, + author: t.meta.author, + base: t.meta.base, + vars: t.meta.vars, + props: t + }; + delete t2.props.meta; + return t2; +} export default Vue.extend({ components: { @@ -81,18 +96,18 @@ export default Vue.extend({ selectedInstalledTheme: null, myThemeBase: 'light', myThemeName: '', - myThemePrimary: lightTheme.meta.vars.primary, - myThemeSecondary: lightTheme.meta.vars.secondary, - myThemeText: lightTheme.meta.vars.text + myThemePrimary: lightTheme.vars.primary, + myThemeSecondary: lightTheme.vars.secondary, + myThemeText: lightTheme.vars.text }; }, computed: { - themes(): any { + themes(): Theme[] { return this.$store.state.device.themes.concat(builtinThemes); }, - installedThemes(): any { + installedThemes(): Theme[] { return this.$store.state.device.themes; }, @@ -108,20 +123,18 @@ export default Vue.extend({ selectedInstalledThemeCode() { if (this.selectedInstalledTheme == null) return null; - return JSON.stringify(this.installedThemes.find(x => x.meta.id == this.selectedInstalledTheme)); + return JSON5.stringify(this.installedThemes.find(x => x.id == this.selectedInstalledTheme), null, '\t'); }, myTheme(): any { return { - meta: { - name: this.myThemeName, - author: this.$store.state.i.name, - base: this.myThemeBase, - vars: { - primary: tinycolor(typeof this.myThemePrimary == 'string' ? this.myThemePrimary : this.myThemePrimary.rgba).toRgbString(), - secondary: tinycolor(typeof this.myThemeSecondary == 'string' ? this.myThemeSecondary : this.myThemeSecondary.rgba).toRgbString(), - text: tinycolor(typeof this.myThemeText == 'string' ? this.myThemeText : this.myThemeText.rgba).toRgbString() - } + name: this.myThemeName, + author: this.$store.state.i.name, + base: this.myThemeBase, + vars: { + primary: tinycolor(typeof this.myThemePrimary == 'string' ? this.myThemePrimary : this.myThemePrimary.rgba).toRgbString(), + secondary: tinycolor(typeof this.myThemeSecondary == 'string' ? this.myThemeSecondary : this.myThemeSecondary.rgba).toRgbString(), + text: tinycolor(typeof this.myThemeText == 'string' ? this.myThemeText : this.myThemeText.rgba).toRgbString() } }; } @@ -130,37 +143,67 @@ export default Vue.extend({ watch: { myThemeBase(v) { const theme = v == 'light' ? lightTheme : darkTheme; - this.myThemePrimary = theme.meta.vars.primary; - this.myThemeSecondary = theme.meta.vars.secondary; - this.myThemeText = theme.meta.vars.text; + this.myThemePrimary = theme.vars.primary; + this.myThemeSecondary = theme.vars.secondary; + this.myThemeText = theme.vars.text; } }, + beforeCreate() { + // migrate old theme definitions + // 後方互換性のため + this.$store.commit('device/set', { + key: 'themes', value: this.$store.state.device.themes.map(t => { + if (t.id == null) { + return convertOldThemedefinition(t); + } else { + return t; + } + }) + }); + }, + methods: { install() { - const theme = JSON.parse(this.installThemeCode); - if (theme.meta == null || theme.meta.id == null) { + let theme; + + try { + theme = JSON5.parse(this.installThemeCode); + } catch (e) { alert('%i18n:@invalid-theme%'); return; } - if (this.$store.state.device.themes.some(t => t.meta.id == theme.meta.id)) { + + // 後方互換性のため + if (theme.id == null && theme.meta != null) { + theme = convertOldThemedefinition(theme); + } + + if (theme.id == null) { + alert('%i18n:@invalid-theme%'); + return; + } + + if (this.$store.state.device.themes.some(t => t.id == theme.id)) { alert('%i18n:@already-installed%'); return; } + const themes = this.$store.state.device.themes.concat(theme); this.$store.commit('device/set', { key: 'themes', value: themes }); - alert('%i18n:@installed%'.replace('{}', theme.meta.name)); + + alert('%i18n:@installed%'.replace('{}', theme.name)); }, uninstall() { - const theme = this.installedThemes.find(x => x.meta.id == this.selectedInstalledTheme); - const themes = this.$store.state.device.themes.filter(t => t.meta.id != theme.meta.id); + const theme = this.installedThemes.find(x => x.id == this.selectedInstalledTheme); + const themes = this.$store.state.device.themes.filter(t => t.id != theme.id); this.$store.commit('device/set', { key: 'themes', value: themes }); - alert('%i18n:@uninstalled%'.replace('{}', theme.meta.name)); + alert('%i18n:@uninstalled%'.replace('{}', theme.name)); }, preview() { @@ -169,7 +212,7 @@ export default Vue.extend({ gen() { const theme = this.myTheme; - theme.meta.id = uuid(); + theme.id = uuid(); const themes = this.$store.state.device.themes.concat(theme); this.$store.commit('device/set', { key: 'themes', value: themes diff --git a/src/client/app/init.ts b/src/client/app/init.ts index 802f7b42eb..c2381067da 100644 --- a/src/client/app/init.ts +++ b/src/client/app/init.ts @@ -14,8 +14,7 @@ import App from './app.vue'; import checkForUpdate from './common/scripts/check-for-update'; import MiOS, { API } from './mios'; import { version, codename, lang } from './config'; -import { builtinThemes, applyTheme } from './theme'; -const lightTheme = require('../theme/light.json'); +import { builtinThemes, lightTheme, applyTheme } from './theme'; if (localStorage.getItem('theme') == null) { applyTheme(lightTheme); @@ -97,15 +96,15 @@ export default (callback: (launch: (router: VueRouter, api?: (os: MiOS) => API) return s.device.darkmode; }, v => { const themes = os.store.state.device.themes.concat(builtinThemes); - const dark = themes.find(t => t.meta.id == os.store.state.device.darkTheme); - const light = themes.find(t => t.meta.id == os.store.state.device.lightTheme); + const dark = themes.find(t => t.id == os.store.state.device.darkTheme); + const light = themes.find(t => t.id == os.store.state.device.lightTheme); applyTheme(v ? dark : light); }); os.store.watch(s => { return s.device.lightTheme; }, v => { const themes = os.store.state.device.themes.concat(builtinThemes); - const theme = themes.find(t => t.meta.id == v); + const theme = themes.find(t => t.id == v); if (!os.store.state.device.darkmode) { applyTheme(theme); } @@ -114,7 +113,7 @@ export default (callback: (launch: (router: VueRouter, api?: (os: MiOS) => API) return s.device.darkTheme; }, v => { const themes = os.store.state.device.themes.concat(builtinThemes); - const theme = themes.find(t => t.meta.id == v); + const theme = themes.find(t => t.id == v); if (os.store.state.device.darkmode) { applyTheme(theme); } diff --git a/src/client/app/theme.ts b/src/client/app/theme.ts index 555f8411f2..828ce33862 100644 --- a/src/client/app/theme.ts +++ b/src/client/app/theme.ts @@ -1,27 +1,40 @@ import * as tinycolor from 'tinycolor2'; -type Theme = { - meta: { - id: string; - name: string; - author: string; - base?: string; - vars: any; - }; -} & { - [key: string]: string; +export type Theme = { + id: string; + name: string; + author: string; + desc?: string; + base?: 'dark' | 'light'; + vars: { [key: string]: string }; + props: { [key: string]: string }; }; +export const lightTheme: Theme = require('../theme/light.json5'); +export const darkTheme: Theme = require('../theme/dark.json5'); +export const pinkTheme: Theme = require('../theme/pink.json5'); +export const halloweenTheme: Theme = require('../theme/halloween.json5'); + +export const builtinThemes = [ + lightTheme, + darkTheme, + pinkTheme, + halloweenTheme +]; + export function applyTheme(theme: Theme, persisted = true) { - if (theme.meta.base) { - const base = [lightTheme, darkTheme].find(x => x.meta.id == theme.meta.base); - theme = Object.assign({}, base, theme); + // Deep copy + const _theme = JSON.parse(JSON.stringify(theme)); + + if (_theme.base) { + const base = [lightTheme, darkTheme].find(x => x.id == _theme.base); + _theme.vars = Object.assign({}, base.vars, _theme.vars); + _theme.props = Object.assign({}, base.props, _theme.props); } - const props = compile(theme); + const props = compile(_theme); Object.entries(props).forEach(([k, v]) => { - if (k == 'meta') return; document.documentElement.style.setProperty(`--${k}`, v.toString()); }); @@ -34,10 +47,10 @@ function compile(theme: Theme): { [key: string]: string } { function getColor(code: string): tinycolor.Instance { // ref if (code[0] == '@') { - return getColor(theme[code.substr(1)]); + return getColor(theme.props[code.substr(1)]); } if (code[0] == '$') { - return getColor(theme.meta.vars[code.substr(1)]); + return getColor(theme.vars[code.substr(1)]); } // func @@ -59,8 +72,7 @@ function compile(theme: Theme): { [key: string]: string } { const props = {}; - Object.entries(theme).forEach(([k, v]) => { - if (k == 'meta') return; + Object.entries(theme.props).forEach(([k, v]) => { const c = getColor(v); props[k] = genValue(c); }); @@ -88,15 +100,3 @@ function compile(theme: Theme): { [key: string]: string } { function genValue(c: tinycolor.Instance): string { return c.toRgbString(); } - -export const lightTheme = require('../theme/light.json'); -export const darkTheme = require('../theme/dark.json'); -export const pinkTheme = require('../theme/pink.json'); -export const halloweenTheme = require('../theme/halloween.json'); - -export const builtinThemes = [ - lightTheme, - darkTheme, - pinkTheme, - halloweenTheme -]; diff --git a/src/client/theme/dark.json b/src/client/theme/dark.json deleted file mode 100644 index 74447b8f2f..0000000000 --- a/src/client/theme/dark.json +++ /dev/null @@ -1,204 +0,0 @@ -{ - "meta": { - "id": "dark", - "name": "Dark", - "author": "syuilo", - "vars": { - "primary": "#fb4e4e", - "secondary": "#282C37", - "text": "#d6dae0" - } - }, - - "primary": "$primary", - "primaryForeground": "#fff", - "secondary": "$secondary", - "bg": ":darken<8<$secondary", - "text": "$text", - - "scrollbarTrack": ":darken<5<$secondary", - "scrollbarHandle": ":lighten<5<$secondary", - "scrollbarHandleHover": ":lighten<10<$secondary", - - "face": "$secondary", - "faceText": "#fff", - "faceHeader": ":lighten<5<$secondary", - "faceHeaderText": "#e3e5e8", - "faceDivider": "rgba(0, 0, 0, 0.3)", - "faceTextButton": "#9baec8", - "faceTextButtonHover": "#b2c1d5", - "faceTextButtonActive": "#b2c1d5", - "faceClearButtonHover": "rgba(0, 0, 0, 0.1)", - "faceClearButtonActive": "rgba(0, 0, 0, 0.2)", - "popupBg": ":lighten<5<$secondary", - "popupFg": "#d6dce2", - - "subNoteBg": "rgba(0, 0, 0, 0.18)", - "subNoteText": ":alpha<0.7<$text", - "renoteGradient": "#314027", - "renoteText": "#9dbb00", - "quoteBorder": "#4e945e", - "noteText": "#fff", - "noteHeaderName": "#fff", - "noteHeaderBadgeFg": "#758188", - "noteHeaderBadgeBg": "rgba(0, 0, 0, 0.25)", - "noteHeaderAdminFg": "#f15f71", - "noteHeaderAdminBg": "#5d282e", - "noteHeaderAcct": "#606984", - "noteHeaderInfo": "#606984", - - "noteActions": "#606984", - "noteActionsHover": "#a1a8bf", - "noteActionsReplyHover": "#0af", - "noteActionsRenoteHover": "#8d0", - "noteActionsReactionHover": "#fa0", - "noteActionsHighlighted": "#707b97", - - "noteAttachedFile": "rgba(255, 255, 255, 0.1)", - - "modalBackdrop": "rgba(0, 0, 0, 0.5)", - - "dateDividerBg": ":darken<2<$secondary", - "dateDividerFg": ":alpha<0.7<$text", - - "switchTrack": "rgba(255, 255, 255, 0.15)", - "radioBorder": "rgba(255, 255, 255, 0.6)", - "inputBorder": "rgba(255, 255, 255, 0.7)", - "inputLabel": "rgba(255, 255, 255, 0.7)", - "inputText": "#fff", - - "buttonBg": "rgba(255, 255, 255, 0.05)", - "buttonHoverBg": "rgba(255, 255, 255, 0.1)", - "buttonActiveBg": "rgba(255, 255, 255, 0.15)", - - "autocompleteItemHoverBg": "rgba(255, 255, 255, 0.1)", - "autocompleteItemText": "rgba(255, 255, 255, 0.8)", - "autocompleteItemTextSub": "rgba(255, 255, 255, 0.3)", - - "cwButtonBg": "#687390", - "cwButtonFg": "#393f4f", - "cwButtonHoverBg": "#707b97", - - "reactionPickerButtonHoverBg": "rgba(255, 255, 255, 0.18)", - - "reactionViewerBorder": "rgba(255, 255, 255, 0.1)", - - "pollEditorInputBg": "rgba(0, 0, 0, 0.25)", - - "pollChoiceText": "#fff", - "pollChoiceBorder": "rgba(255, 255, 255, 0.1)", - - "urlPreviewBorder": "rgba(0, 0, 0, 0.4)", - "urlPreviewBorderHover": "rgba(255, 255, 255, 0.2)", - "urlPreviewTitle": "$text", - "urlPreviewText": ":alpha<0.7<$text", - "urlPreviewInfo": ":alpha<0.8<$text", - - "calendarWeek": "#43d5dc", - "calendarSaturdayOrSunday": "#ff6679", - "calendarDay": "#c5ced6", - - "materBg": "rgba(0, 0, 0, 0.3)", - - "chartCaption": ":alpha<0.6<$text", - - "announcementsBg": "#253a50", - "announcementsTitle": "#539eff", - "announcementsText": "#fff", - - "donationBg": "#5d5242", - "donationFg": "#e4dbce", - - "googleSearchBg": "rgba(0, 0, 0, 0.2)", - "googleSearchFg": "#dee4e8", - "googleSearchBorder": "rgba(255, 255, 255, 0.2)", - "googleSearchHoverBorder": "rgba(255, 255, 255, 0.3)", - "googleSearchHoverButton": "rgba(255, 255, 255, 0.1)", - - "mfmTitleBg": "rgba(0, 0, 0, 0.2)", - "mfmQuote": ":alpha<0.7<$text", - "mfmQuoteLine": ":alpha<0.6<$text", - - "suspendedInfoBg": "#611d1d", - "suspendedInfoFg": "#ffb4b4", - "remoteInfoBg": "#42321c", - "remoteInfoFg": "#ffbd3e", - - "messagingRoomBg": "@bg", - "messagingRoomInfo": "#fff", - "messagingRoomDateDividerLine": "rgba(255, 255, 255, 0.1)", - "messagingRoomDateDividerText": "rgba(255, 255, 255, 0.3)", - "messagingRoomMessageInfo": "rgba(255, 255, 255, 0.4)", - "messagingRoomMessageBg": "$secondary", - "messagingRoomMessageFg": "#fff", - - "formButtonBorder": "rgba(255, 255, 255, 0.1)", - "formButtonHoverBg": ":alpha<0.2<$primary", - "formButtonHoverBorder": ":alpha<0.5<$primary", - "formButtonActiveBg": ":alpha<0.12<$primary", - - "desktopHeaderBg": ":lighten<5<$secondary", - "desktopHeaderFg": "$text", - "desktopHeaderHoverFg": "#fff", - "desktopHeaderSearchBg": "rgba(0, 0, 0, 0.1)", - "desktopHeaderSearchHoverBg": "rgba(255, 255, 255, 0.04)", - "desktopHeaderSearchFg": "#fff", - "desktopNotificationBg": ":alpha<0.9<$secondary", - "desktopNotificationFg": ":alpha<0.7<$text", - "desktopNotificationShadow": "rgba(0, 0, 0, 0.4)", - "desktopPostFormBg": "@face", - "desktopPostFormTextareaBg": "rgba(0, 0, 0, 0.25)", - "desktopPostFormTextareaFg": "#fff", - "desktopPostFormTransparentButtonFg": "$primary", - "desktopPostFormTransparentButtonActiveGradientStart": ":darken<8<$secondary", - "desktopPostFormTransparentButtonActiveGradientEnd": ":darken<3<$secondary", - "desktopRenoteFormFooter": ":lighten<5<$secondary", - "desktopTimelineHeaderShadow": "rgba(0, 0, 0, 0.15)", - "desktopTimelineSrc": "@faceTextButton", - "desktopTimelineSrcHover": "@faceTextButtonHover", - "desktopWindowTitle": "@faceHeaderText", - "desktopWindowShadow": "rgba(0, 0, 0, 0.5)", - "desktopDriveBg": "@bg", - "desktopDriveFolderBg": ":alpha<0.2<$primary", - "desktopDriveFolderHoverBg": ":alpha<0.3<$primary", - "desktopDriveFolderActiveBg": ":alpha<0.3<:darken<10<$primary", - "desktopDriveFolderFg": "#fff", - "desktopSettingsNavItem": ":alpha<0.8<$text", - "desktopSettingsNavItemHover": ":lighten<10<$text", - - "deckAcrylicColumnBg": "rgba(0, 0, 0, 0.25)", - - "mobileHeaderBg": ":lighten<5<$secondary", - "mobileHeaderFg": "$text", - "mobileNavBackdrop": "rgba(0, 0, 0, 0.7)", - "mobilePostFormDivider": "rgba(0, 0, 0, 0.2)", - "mobilePostFormTextareaBg": "rgba(0, 0, 0, 0.3)", - "mobileDriveNavBg": ":alpha<0.75<$secondary", - "mobileHomeTlItemHover": "rgba(255, 255, 255, 0.1)", - "mobileUserPageName": "#fff", - "mobileUserPageAcct": "$text", - "mobileUserPageDescription": "$text", - "mobileUserPageFollowedBg": "rgba(0, 0, 0, 0.3)", - "mobileUserPageFollowedFg": "$text", - "mobileUserPageStatusHighlight": "#fff", - "mobileUserPageHeaderShadow": "rgba(0, 0, 0, 0.3)", - "mobileAnnouncement": "rgba(30, 129, 216, 0.2)", - "mobileAnnouncementFg": "#fff", - "mobileSignedInAsBg": "#273c34", - "mobileSignedInAsFg": "#49ab63", - "mobileSignoutBg": "#652222", - "mobileSignoutFg": "#ff5f56", - - "reversiBannerGradientStart": "#45730e", - "reversiBannerGradientEnd": "#464300", - "reversiDescBg": "rgba(255, 255, 255, 0.1)", - "reversiListItemShadow": "rgba(0, 0, 0, 0.7)", - "reversiMapSelectBorder": "rgba(255, 255, 255, 0.1)", - "reversiMapSelectHoverBorder": "rgba(255, 255, 255, 0.2)", - "reversiRoomFormShadow": "rgba(0, 0, 0, 0.7)", - "reversiRoomFooterBg": ":alpha<0.9<$secondary", - "reversiGameHeaderLine": ":alpha<0.5<$secondary", - "reversiGameEmptyCell": ":lighten<2<$secondary", - "reversiGameEmptyCellMyTurn": ":lighten<5<$secondary", - "reversiGameEmptyCellCanPut": ":lighten<4<$secondary" -} diff --git a/src/client/theme/dark.json5 b/src/client/theme/dark.json5 new file mode 100644 index 0000000000..2042bd7931 --- /dev/null +++ b/src/client/theme/dark.json5 @@ -0,0 +1,207 @@ +{ + id: 'dark', + + name: 'Dark', + author: 'syuilo', + desc: 'Default dark theme', + + vars: { + primary: '#fb4e4e', + secondary: '#282C37', + text: '#d6dae0', + }, + + props: { + primary: '$primary', + primaryForeground: '#fff', + secondary: '$secondary', + bg: ':darken<8<$secondary', + text: '$text', + + scrollbarTrack: ':darken<5<$secondary', + scrollbarHandle: ':lighten<5<$secondary', + scrollbarHandleHover: ':lighten<10<$secondary', + + face: '$secondary', + faceText: '#fff', + faceHeader: ':lighten<5<$secondary', + faceHeaderText: '#e3e5e8', + faceDivider: 'rgba(0, 0, 0, 0.3)', + faceTextButton: '$text', + faceTextButtonHover: ':lighten<10<$text', + faceTextButtonActive: ':darken<10<$text', + faceClearButtonHover: 'rgba(0, 0, 0, 0.1)', + faceClearButtonActive: 'rgba(0, 0, 0, 0.2)', + popupBg: ':lighten<5<$secondary', + popupFg: '#d6dce2', + + subNoteBg: 'rgba(0, 0, 0, 0.18)', + subNoteText: ':alpha<0.7<$text', + renoteGradient: '#314027', + renoteText: '#9dbb00', + quoteBorder: '#4e945e', + noteText: '#fff', + noteHeaderName: '#fff', + noteHeaderBadgeFg: '#758188', + noteHeaderBadgeBg: 'rgba(0, 0, 0, 0.25)', + noteHeaderAdminFg: '#f15f71', + noteHeaderAdminBg: '#5d282e', + noteHeaderAcct: '#606984', + noteHeaderInfo: '#606984', + + noteActions: '#606984', + noteActionsHover: '#a1a8bf', + noteActionsReplyHover: '#0af', + noteActionsRenoteHover: '#8d0', + noteActionsReactionHover: '#fa0', + noteActionsHighlighted: '#707b97', + + noteAttachedFile: 'rgba(255, 255, 255, 0.1)', + + modalBackdrop: 'rgba(0, 0, 0, 0.5)', + + dateDividerBg: ':darken<2<$secondary', + dateDividerFg: ':alpha<0.7<$text', + + switchTrack: 'rgba(255, 255, 255, 0.15)', + radioBorder: 'rgba(255, 255, 255, 0.6)', + inputBorder: 'rgba(255, 255, 255, 0.7)', + inputLabel: 'rgba(255, 255, 255, 0.7)', + inputText: '#fff', + + buttonBg: 'rgba(255, 255, 255, 0.05)', + buttonHoverBg: 'rgba(255, 255, 255, 0.1)', + buttonActiveBg: 'rgba(255, 255, 255, 0.15)', + + autocompleteItemHoverBg: 'rgba(255, 255, 255, 0.1)', + autocompleteItemText: 'rgba(255, 255, 255, 0.8)', + autocompleteItemTextSub: 'rgba(255, 255, 255, 0.3)', + + cwButtonBg: '#687390', + cwButtonFg: '#393f4f', + cwButtonHoverBg: '#707b97', + + reactionPickerButtonHoverBg: 'rgba(255, 255, 255, 0.18)', + + reactionViewerBorder: 'rgba(255, 255, 255, 0.1)', + + pollEditorInputBg: 'rgba(0, 0, 0, 0.25)', + + pollChoiceText: '#fff', + pollChoiceBorder: 'rgba(255, 255, 255, 0.1)', + + urlPreviewBorder: 'rgba(0, 0, 0, 0.4)', + urlPreviewBorderHover: 'rgba(255, 255, 255, 0.2)', + urlPreviewTitle: '$text', + urlPreviewText: ':alpha<0.7<$text', + urlPreviewInfo: ':alpha<0.8<$text', + + calendarWeek: '#43d5dc', + calendarSaturdayOrSunday: '#ff6679', + calendarDay: '#c5ced6', + + materBg: 'rgba(0, 0, 0, 0.3)', + + chartCaption: ':alpha<0.6<$text', + + announcementsBg: '#253a50', + announcementsTitle: '#539eff', + announcementsText: '#fff', + + donationBg: '#5d5242', + donationFg: '#e4dbce', + + googleSearchBg: 'rgba(0, 0, 0, 0.2)', + googleSearchFg: '#dee4e8', + googleSearchBorder: 'rgba(255, 255, 255, 0.2)', + googleSearchHoverBorder: 'rgba(255, 255, 255, 0.3)', + googleSearchHoverButton: 'rgba(255, 255, 255, 0.1)', + + mfmTitleBg: 'rgba(0, 0, 0, 0.2)', + mfmQuote: ':alpha<0.7<$text', + mfmQuoteLine: ':alpha<0.6<$text', + + suspendedInfoBg: '#611d1d', + suspendedInfoFg: '#ffb4b4', + remoteInfoBg: '#42321c', + remoteInfoFg: '#ffbd3e', + + messagingRoomBg: '@bg', + messagingRoomInfo: '#fff', + messagingRoomDateDividerLine: 'rgba(255, 255, 255, 0.1)', + messagingRoomDateDividerText: 'rgba(255, 255, 255, 0.3)', + messagingRoomMessageInfo: 'rgba(255, 255, 255, 0.4)', + messagingRoomMessageBg: '$secondary', + messagingRoomMessageFg: '#fff', + + formButtonBorder: 'rgba(255, 255, 255, 0.1)', + formButtonHoverBg: ':alpha<0.2<$primary', + formButtonHoverBorder: ':alpha<0.5<$primary', + formButtonActiveBg: ':alpha<0.12<$primary', + + desktopHeaderBg: ':lighten<5<$secondary', + desktopHeaderFg: '$text', + desktopHeaderHoverFg: '#fff', + desktopHeaderSearchBg: 'rgba(0, 0, 0, 0.1)', + desktopHeaderSearchHoverBg: 'rgba(255, 255, 255, 0.04)', + desktopHeaderSearchFg: '#fff', + desktopNotificationBg: ':alpha<0.9<$secondary', + desktopNotificationFg: ':alpha<0.7<$text', + desktopNotificationShadow: 'rgba(0, 0, 0, 0.4)', + desktopPostFormBg: '@face', + desktopPostFormTextareaBg: 'rgba(0, 0, 0, 0.25)', + desktopPostFormTextareaFg: '#fff', + desktopPostFormTransparentButtonFg: '$primary', + desktopPostFormTransparentButtonActiveGradientStart: ':darken<8<$secondary', + desktopPostFormTransparentButtonActiveGradientEnd: ':darken<3<$secondary', + desktopRenoteFormFooter: ':lighten<5<$secondary', + desktopTimelineHeaderShadow: 'rgba(0, 0, 0, 0.15)', + desktopTimelineSrc: '@faceTextButton', + desktopTimelineSrcHover: '@faceTextButtonHover', + desktopWindowTitle: '@faceHeaderText', + desktopWindowShadow: 'rgba(0, 0, 0, 0.5)', + desktopDriveBg: '@bg', + desktopDriveFolderBg: ':alpha<0.2<$primary', + desktopDriveFolderHoverBg: ':alpha<0.3<$primary', + desktopDriveFolderActiveBg: ':alpha<0.3<:darken<10<$primary', + desktopDriveFolderFg: '#fff', + desktopSettingsNavItem: ':alpha<0.8<$text', + desktopSettingsNavItemHover: ':lighten<10<$text', + + deckAcrylicColumnBg: 'rgba(0, 0, 0, 0.25)', + + mobileHeaderBg: ':lighten<5<$secondary', + mobileHeaderFg: '$text', + mobileNavBackdrop: 'rgba(0, 0, 0, 0.7)', + mobilePostFormDivider: 'rgba(0, 0, 0, 0.2)', + mobilePostFormTextareaBg: 'rgba(0, 0, 0, 0.3)', + mobileDriveNavBg: ':alpha<0.75<$secondary', + mobileHomeTlItemHover: 'rgba(255, 255, 255, 0.1)', + mobileUserPageName: '#fff', + mobileUserPageAcct: '$text', + mobileUserPageDescription: '$text', + mobileUserPageFollowedBg: 'rgba(0, 0, 0, 0.3)', + mobileUserPageFollowedFg: '$text', + mobileUserPageStatusHighlight: '#fff', + mobileUserPageHeaderShadow: 'rgba(0, 0, 0, 0.3)', + mobileAnnouncement: 'rgba(30, 129, 216, 0.2)', + mobileAnnouncementFg: '#fff', + mobileSignedInAsBg: '#273c34', + mobileSignedInAsFg: '#49ab63', + mobileSignoutBg: '#652222', + mobileSignoutFg: '#ff5f56', + + reversiBannerGradientStart: '#45730e', + reversiBannerGradientEnd: '#464300', + reversiDescBg: 'rgba(255, 255, 255, 0.1)', + reversiListItemShadow: 'rgba(0, 0, 0, 0.7)', + reversiMapSelectBorder: 'rgba(255, 255, 255, 0.1)', + reversiMapSelectHoverBorder: 'rgba(255, 255, 255, 0.2)', + reversiRoomFormShadow: 'rgba(0, 0, 0, 0.7)', + reversiRoomFooterBg: ':alpha<0.9<$secondary', + reversiGameHeaderLine: ':alpha<0.5<$secondary', + reversiGameEmptyCell: ':lighten<2<$secondary', + reversiGameEmptyCellMyTurn: ':lighten<5<$secondary', + reversiGameEmptyCellCanPut: ':lighten<4<$secondary', + }, +} diff --git a/src/client/theme/halloween.json b/src/client/theme/halloween.json deleted file mode 100644 index fb34db57a8..0000000000 --- a/src/client/theme/halloween.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "meta": { - "id": "42e4f09b-67d5-498c-af7d-29faa54745b0", - "name": "Halloween", - "author": "syuilo", - "base": "dark", - "vars": { - "primary": "#d67036", - "secondary": "#1f1d30", - "text": "#b1bee3" - } - }, - - "renoteGradient": "#5d2d1a", - "renoteText": "#ff6c00", - "quoteBorder": "#c3631c" -} diff --git a/src/client/theme/halloween.json5 b/src/client/theme/halloween.json5 new file mode 100644 index 0000000000..608105903a --- /dev/null +++ b/src/client/theme/halloween.json5 @@ -0,0 +1,21 @@ +{ + id: '42e4f09b-67d5-498c-af7d-29faa54745b0', + + name: 'Halloween', + author: 'syuilo', + desc: 'Hello, Happy Halloween!', + + base: 'dark', + + vars: { + primary: '#d67036', + secondary: '#1f1d30', + text: '#b1bee3', + }, + + props: { + renoteGradient: '#5d2d1a', + renoteText: '#ff6c00', + quoteBorder: '#c3631c', + }, +} diff --git a/src/client/theme/light.json b/src/client/theme/light.json deleted file mode 100644 index 0d50dc5caa..0000000000 --- a/src/client/theme/light.json +++ /dev/null @@ -1,204 +0,0 @@ -{ - "meta": { - "id": "light", - "name": "Light", - "author": "syuilo", - "vars": { - "primary": "#fb4e4e", - "secondary": "#fff", - "text": "#666" - } - }, - - "primary": "$primary", - "primaryForeground": "#fff", - "secondary": "$secondary", - "bg": ":darken<8<$secondary", - "text": "$text", - - "scrollbarTrack": "#fff", - "scrollbarHandle": "#00000033", - "scrollbarHandleHover": "#00000066", - - "face": "$secondary", - "faceText": "#444", - "faceHeader": ":lighten<5<$secondary", - "faceHeaderText": "#888", - "faceDivider": "rgba(0, 0, 0, 0.082)", - "faceTextButton": "#ccc", - "faceTextButtonHover": "#aaa", - "faceTextButtonActive": "#999", - "faceClearButtonHover": "rgba(0, 0, 0, 0.025)", - "faceClearButtonActive": "rgba(0, 0, 0, 0.05)", - "popupBg": ":lighten<5<$secondary", - "popupFg": "#586069", - - "subNoteBg": "rgba(0, 0, 0, 0.01)", - "subNoteText": ":alpha<0.7<$text", - "renoteGradient": "#edfde2", - "renoteText": "#9dbb00", - "quoteBorder": "#c0dac6", - "noteText": "#717171", - "noteHeaderName": ":darken<2<$text", - "noteHeaderBadgeFg": "#aaa", - "noteHeaderBadgeBg": "rgba(0, 0, 0, 0.05)", - "noteHeaderAdminFg": "#f15f71", - "noteHeaderAdminBg": "#ffdfdf", - "noteHeaderAcct": ":alpha<0.7<@noteHeaderName", - "noteHeaderInfo": ":alpha<0.7<@noteHeaderName", - - "noteActions": ":alpha<0.3<$text", - "noteActionsHover": ":alpha<0.9<$text", - "noteActionsReplyHover": "#0af", - "noteActionsRenoteHover": "#8d0", - "noteActionsReactionHover": "#fa0", - "noteActionsHighlighted": "#888", - - "noteAttachedFile": "rgba(0, 0, 0, 0.05)", - - "modalBackdrop": "rgba(0, 0, 0, 0.1)", - - "dateDividerBg": ":darken<2<$secondary", - "dateDividerFg": ":alpha<0.7<$text", - - "switchTrack": "rgba(0, 0, 0, 0.25)", - "radioBorder": "rgba(0, 0, 0, 0.4)", - "inputBorder": "rgba(0, 0, 0, 0.42)", - "inputLabel": "rgba(0, 0, 0, 0.54)", - "inputText": "#000", - - "buttonBg": "rgba(0, 0, 0, 0.05)", - "buttonHoverBg": "rgba(0, 0, 0, 0.1)", - "buttonActiveBg": "rgba(0, 0, 0, 0.15)", - - "autocompleteItemHoverBg": "rgba(0, 0, 0, 0.1)", - "autocompleteItemText": "rgba(0, 0, 0, 0.8)", - "autocompleteItemTextSub": "rgba(0, 0, 0, 0.3)", - - "cwButtonBg": "#b1b9c1", - "cwButtonFg": "#fff", - "cwButtonHoverBg": "#bbc4ce", - - "reactionPickerButtonHoverBg": "#eee", - - "reactionViewerBorder": "rgba(0, 0, 0, 0.1)", - - "pollEditorInputBg": "#fff", - - "pollChoiceText": "#000", - "pollChoiceBorder": "rgba(0, 0, 0, 0.1)", - - "urlPreviewBorder": "rgba(0, 0, 0, 0.1)", - "urlPreviewBorderHover": "rgba(0, 0, 0, 0.2)", - "urlPreviewTitle": "$text", - "urlPreviewText": ":alpha<0.7<$text", - "urlPreviewInfo": ":alpha<0.8<$text", - - "calendarWeek": "#19a2a9", - "calendarSaturdayOrSunday": "#ef95a0", - "calendarDay": "#777", - - "materBg": "rgba(0, 0, 0, 0.1)", - - "chartCaption": ":alpha<0.6<$text", - - "announcementsBg": "#f3f9ff", - "announcementsTitle": "#4078c0", - "announcementsText": "#57616f", - - "donationBg": "#fbead4", - "donationFg": "#777d71", - - "googleSearchBg": "#fff", - "googleSearchFg": "#55595c", - "googleSearchBorder": "rgba(0, 0, 0, 0.2)", - "googleSearchHoverBorder": "rgba(0, 0, 0, 0.3)", - "googleSearchHoverButton": "rgba(0, 0, 0, 0.05)", - - "mfmTitleBg": "rgba(0, 0, 0, 0.07)", - "mfmQuote": ":alpha<0.6<$text", - "mfmQuoteLine": ":alpha<0.5<$text", - - "suspendedInfoBg": "#ffdbdb", - "suspendedInfoFg": "#570808", - "remoteInfoBg": "#fff0db", - "remoteInfoFg": "#573c08", - - "messagingRoomBg": "#fff", - "messagingRoomInfo": "#000", - "messagingRoomDateDividerLine": "rgba(0, 0, 0, 0.1)", - "messagingRoomDateDividerText": "rgba(0, 0, 0, 0.3)", - "messagingRoomMessageInfo": "rgba(0, 0, 0, 0.4)", - "messagingRoomMessageBg": "#eee", - "messagingRoomMessageFg": "#333", - - "formButtonBorder": "rgba(0, 0, 0, 0.1)", - "formButtonHoverBg": ":alpha<0.12<$primary", - "formButtonHoverBorder": ":alpha<0.3<$primary", - "formButtonActiveBg": ":alpha<0.12<$primary", - - "desktopHeaderBg": ":lighten<5<$secondary", - "desktopHeaderFg": "$text", - "desktopHeaderHoverFg": "#7b8c88", - "desktopHeaderSearchBg": "rgba(0, 0, 0, 0.05)", - "desktopHeaderSearchHoverBg": "rgba(0, 0, 0, 0.08)", - "desktopHeaderSearchFg": "#000", - "desktopNotificationBg": ":alpha<0.9<$secondary", - "desktopNotificationFg": ":alpha<0.7<$text", - "desktopNotificationShadow": "rgba(0, 0, 0, 0.2)", - "desktopPostFormBg": ":lighten<33<$primary", - "desktopPostFormTextareaBg": "#fff", - "desktopPostFormTextareaFg": "#333", - "desktopPostFormTransparentButtonFg": ":alpha<0.5<$primary", - "desktopPostFormTransparentButtonActiveGradientStart": ":lighten<30<$primary", - "desktopPostFormTransparentButtonActiveGradientEnd": ":lighten<33<$primary", - "desktopRenoteFormFooter": ":lighten<33<$primary", - "desktopTimelineHeaderShadow": "rgba(0, 0, 0, 0.08)", - "desktopTimelineSrc": "#6f7477", - "desktopTimelineSrcHover": "#525a5f", - "desktopWindowTitle": "#666", - "desktopWindowShadow": "rgba(0, 0, 0, 0.2)", - "desktopDriveBg": "#fff", - "desktopDriveFolderBg": ":lighten<31<$primary", - "desktopDriveFolderHoverBg": ":lighten<27<$primary", - "desktopDriveFolderActiveBg": ":lighten<25<$primary", - "desktopDriveFolderFg": ":darken<10<$primary", - "desktopSettingsNavItem": ":alpha<0.8<$text", - "desktopSettingsNavItemHover": ":darken<10<$text", - - "deckAcrylicColumnBg": "rgba(0, 0, 0, 0.1)", - - "mobileHeaderBg": ":lighten<5<$secondary", - "mobileHeaderFg": "$text", - "mobileNavBackdrop": "rgba(0, 0, 0, 0.2)", - "mobilePostFormDivider": "rgba(0, 0, 0, 0.1)", - "mobilePostFormTextareaBg": "#fff", - "mobileDriveNavBg": ":alpha<0.75<$secondary", - "mobileHomeTlItemHover": "rgba(0, 0, 0, 0.05)", - "mobileUserPageName": "#757c82", - "mobileUserPageAcct": "#969ea5", - "mobileUserPageDescription": "#757c82", - "mobileUserPageFollowedBg": "#a7bec7", - "mobileUserPageFollowedFg": "#fff", - "mobileUserPageStatusHighlight": "#787e86", - "mobileUserPageHeaderShadow": "rgba(0, 0, 0, 0.07)", - "mobileAnnouncement": "rgba(155, 196, 232, 0.2)", - "mobileAnnouncementFg": "#3f4967", - "mobileSignedInAsBg": "#fcfff5", - "mobileSignedInAsFg": "#2c662d", - "mobileSignoutBg": "#fff6f5", - "mobileSignoutFg": "#cc2727", - - "reversiBannerGradientStart": "#8bca3e", - "reversiBannerGradientEnd": "#d6cf31", - "reversiDescBg": "rgba(0, 0, 0, 0.1)", - "reversiListItemShadow": "rgba(0, 0, 0, 0.15)", - "reversiMapSelectBorder": "rgba(0, 0, 0, 0.1)", - "reversiMapSelectHoverBorder": "rgba(0, 0, 0, 0.2)", - "reversiRoomFormShadow": "rgba(0, 0, 0, 0.1)", - "reversiRoomFooterBg": ":alpha<0.9<$secondary", - "reversiGameHeaderLine": "#c4cdd4", - "reversiGameEmptyCell": "rgba(0, 0, 0, 0.06)", - "reversiGameEmptyCellMyTurn": "rgba(0, 0, 0, 0.12)", - "reversiGameEmptyCellCanPut": "rgba(0, 0, 0, 0.9)" -} diff --git a/src/client/theme/light.json5 b/src/client/theme/light.json5 new file mode 100644 index 0000000000..1e795ee8c5 --- /dev/null +++ b/src/client/theme/light.json5 @@ -0,0 +1,207 @@ +{ + id: 'light', + + name: 'Light', + author: 'syuilo', + desc: 'Default light theme', + + vars: { + primary: '#fb4e4e', + secondary: '#fff', + text: '#666', + }, + + props: { + primary: '$primary', + primaryForeground: '#fff', + secondary: '$secondary', + bg: ':darken<8<$secondary', + text: '$text', + + scrollbarTrack: '#fff', + scrollbarHandle: '#00000033', + scrollbarHandleHover: '#00000066', + + face: '$secondary', + faceText: '#444', + faceHeader: ':lighten<5<$secondary', + faceHeaderText: '#888', + faceDivider: 'rgba(0, 0, 0, 0.082)', + faceTextButton: '#ccc', + faceTextButtonHover: '#aaa', + faceTextButtonActive: '#999', + faceClearButtonHover: 'rgba(0, 0, 0, 0.025)', + faceClearButtonActive: 'rgba(0, 0, 0, 0.05)', + popupBg: ':lighten<5<$secondary', + popupFg: '#586069', + + subNoteBg: 'rgba(0, 0, 0, 0.01)', + subNoteText: ':alpha<0.7<$text', + renoteGradient: '#edfde2', + renoteText: '#9dbb00', + quoteBorder: '#c0dac6', + noteText: '#717171', + noteHeaderName: ':darken<2<$text', + noteHeaderBadgeFg: '#aaa', + noteHeaderBadgeBg: 'rgba(0, 0, 0, 0.05)', + noteHeaderAdminFg: '#f15f71', + noteHeaderAdminBg: '#ffdfdf', + noteHeaderAcct: ':alpha<0.7<@noteHeaderName', + noteHeaderInfo: ':alpha<0.7<@noteHeaderName', + + noteActions: ':alpha<0.3<$text', + noteActionsHover: ':alpha<0.9<$text', + noteActionsReplyHover: '#0af', + noteActionsRenoteHover: '#8d0', + noteActionsReactionHover: '#fa0', + noteActionsHighlighted: '#888', + + noteAttachedFile: 'rgba(0, 0, 0, 0.05)', + + modalBackdrop: 'rgba(0, 0, 0, 0.1)', + + dateDividerBg: ':darken<2<$secondary', + dateDividerFg: ':alpha<0.7<$text', + + switchTrack: 'rgba(0, 0, 0, 0.25)', + radioBorder: 'rgba(0, 0, 0, 0.4)', + inputBorder: 'rgba(0, 0, 0, 0.42)', + inputLabel: 'rgba(0, 0, 0, 0.54)', + inputText: '#000', + + buttonBg: 'rgba(0, 0, 0, 0.05)', + buttonHoverBg: 'rgba(0, 0, 0, 0.1)', + buttonActiveBg: 'rgba(0, 0, 0, 0.15)', + + autocompleteItemHoverBg: 'rgba(0, 0, 0, 0.1)', + autocompleteItemText: 'rgba(0, 0, 0, 0.8)', + autocompleteItemTextSub: 'rgba(0, 0, 0, 0.3)', + + cwButtonBg: '#b1b9c1', + cwButtonFg: '#fff', + cwButtonHoverBg: '#bbc4ce', + + reactionPickerButtonHoverBg: '#eee', + + reactionViewerBorder: 'rgba(0, 0, 0, 0.1)', + + pollEditorInputBg: '#fff', + + pollChoiceText: '#000', + pollChoiceBorder: 'rgba(0, 0, 0, 0.1)', + + urlPreviewBorder: 'rgba(0, 0, 0, 0.1)', + urlPreviewBorderHover: 'rgba(0, 0, 0, 0.2)', + urlPreviewTitle: '$text', + urlPreviewText: ':alpha<0.7<$text', + urlPreviewInfo: ':alpha<0.8<$text', + + calendarWeek: '#19a2a9', + calendarSaturdayOrSunday: '#ef95a0', + calendarDay: '#777', + + materBg: 'rgba(0, 0, 0, 0.1)', + + chartCaption: ':alpha<0.6<$text', + + announcementsBg: '#f3f9ff', + announcementsTitle: '#4078c0', + announcementsText: '#57616f', + + donationBg: '#fbead4', + donationFg: '#777d71', + + googleSearchBg: '#fff', + googleSearchFg: '#55595c', + googleSearchBorder: 'rgba(0, 0, 0, 0.2)', + googleSearchHoverBorder: 'rgba(0, 0, 0, 0.3)', + googleSearchHoverButton: 'rgba(0, 0, 0, 0.05)', + + mfmTitleBg: 'rgba(0, 0, 0, 0.07)', + mfmQuote: ':alpha<0.6<$text', + mfmQuoteLine: ':alpha<0.5<$text', + + suspendedInfoBg: '#ffdbdb', + suspendedInfoFg: '#570808', + remoteInfoBg: '#fff0db', + remoteInfoFg: '#573c08', + + messagingRoomBg: '#fff', + messagingRoomInfo: '#000', + messagingRoomDateDividerLine: 'rgba(0, 0, 0, 0.1)', + messagingRoomDateDividerText: 'rgba(0, 0, 0, 0.3)', + messagingRoomMessageInfo: 'rgba(0, 0, 0, 0.4)', + messagingRoomMessageBg: '#eee', + messagingRoomMessageFg: '#333', + + formButtonBorder: 'rgba(0, 0, 0, 0.1)', + formButtonHoverBg: ':alpha<0.12<$primary', + formButtonHoverBorder: ':alpha<0.3<$primary', + formButtonActiveBg: ':alpha<0.12<$primary', + + desktopHeaderBg: ':lighten<5<$secondary', + desktopHeaderFg: '$text', + desktopHeaderHoverFg: '#7b8c88', + desktopHeaderSearchBg: 'rgba(0, 0, 0, 0.05)', + desktopHeaderSearchHoverBg: 'rgba(0, 0, 0, 0.08)', + desktopHeaderSearchFg: '#000', + desktopNotificationBg: ':alpha<0.9<$secondary', + desktopNotificationFg: ':alpha<0.7<$text', + desktopNotificationShadow: 'rgba(0, 0, 0, 0.2)', + desktopPostFormBg: ':lighten<33<$primary', + desktopPostFormTextareaBg: '#fff', + desktopPostFormTextareaFg: '#333', + desktopPostFormTransparentButtonFg: ':alpha<0.5<$primary', + desktopPostFormTransparentButtonActiveGradientStart: ':lighten<30<$primary', + desktopPostFormTransparentButtonActiveGradientEnd: ':lighten<33<$primary', + desktopRenoteFormFooter: ':lighten<33<$primary', + desktopTimelineHeaderShadow: 'rgba(0, 0, 0, 0.08)', + desktopTimelineSrc: '#6f7477', + desktopTimelineSrcHover: '#525a5f', + desktopWindowTitle: '#666', + desktopWindowShadow: 'rgba(0, 0, 0, 0.2)', + desktopDriveBg: '#fff', + desktopDriveFolderBg: ':lighten<31<$primary', + desktopDriveFolderHoverBg: ':lighten<27<$primary', + desktopDriveFolderActiveBg: ':lighten<25<$primary', + desktopDriveFolderFg: ':darken<10<$primary', + desktopSettingsNavItem: ':alpha<0.8<$text', + desktopSettingsNavItemHover: ':darken<10<$text', + + deckAcrylicColumnBg: 'rgba(0, 0, 0, 0.1)', + + mobileHeaderBg: ':lighten<5<$secondary', + mobileHeaderFg: '$text', + mobileNavBackdrop: 'rgba(0, 0, 0, 0.2)', + mobilePostFormDivider: 'rgba(0, 0, 0, 0.1)', + mobilePostFormTextareaBg: '#fff', + mobileDriveNavBg: ':alpha<0.75<$secondary', + mobileHomeTlItemHover: 'rgba(0, 0, 0, 0.05)', + mobileUserPageName: '#757c82', + mobileUserPageAcct: '#969ea5', + mobileUserPageDescription: '#757c82', + mobileUserPageFollowedBg: '#a7bec7', + mobileUserPageFollowedFg: '#fff', + mobileUserPageStatusHighlight: '#787e86', + mobileUserPageHeaderShadow: 'rgba(0, 0, 0, 0.07)', + mobileAnnouncement: 'rgba(155, 196, 232, 0.2)', + mobileAnnouncementFg: '#3f4967', + mobileSignedInAsBg: '#fcfff5', + mobileSignedInAsFg: '#2c662d', + mobileSignoutBg: '#fff6f5', + mobileSignoutFg: '#cc2727', + + reversiBannerGradientStart: '#8bca3e', + reversiBannerGradientEnd: '#d6cf31', + reversiDescBg: 'rgba(0, 0, 0, 0.1)', + reversiListItemShadow: 'rgba(0, 0, 0, 0.15)', + reversiMapSelectBorder: 'rgba(0, 0, 0, 0.1)', + reversiMapSelectHoverBorder: 'rgba(0, 0, 0, 0.2)', + reversiRoomFormShadow: 'rgba(0, 0, 0, 0.1)', + reversiRoomFooterBg: ':alpha<0.9<$secondary', + reversiGameHeaderLine: '#c4cdd4', + reversiGameEmptyCell: 'rgba(0, 0, 0, 0.06)', + reversiGameEmptyCellMyTurn: 'rgba(0, 0, 0, 0.12)', + reversiGameEmptyCellCanPut: 'rgba(0, 0, 0, 0.9)', + }, +} diff --git a/src/client/theme/pink.json b/src/client/theme/pink.json deleted file mode 100644 index ddb56b46e1..0000000000 --- a/src/client/theme/pink.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "meta": { - "id": "e9c8c01d-9c15-48d0-9b5c-3d00843b5b36", - "name": "Pink", - "author": "syuilo", - "base": "light", - "vars": { - "primary": "rgb(251, 78, 112)", - "secondary": "rgb(255, 218, 240)", - "text": "rgb(113, 91, 102)" - } - }, - - "renoteGradient": "#ffb1c9", - "renoteText": "#ff588d", - "quoteBorder": "#ff6c9b" -} diff --git a/src/client/theme/pink.json5 b/src/client/theme/pink.json5 new file mode 100644 index 0000000000..2e136fba5d --- /dev/null +++ b/src/client/theme/pink.json5 @@ -0,0 +1,20 @@ +{ + id: 'e9c8c01d-9c15-48d0-9b5c-3d00843b5b36', + + name: 'Pink', + author: 'syuilo', + + base: 'light', + + vars: { + primary: 'rgb(251, 78, 112)', + secondary: 'rgb(255, 218, 240)', + text: 'rgb(113, 91, 102)', + }, + + props: { + renoteGradient: '#ffb1c9', + renoteText: '#ff588d', + quoteBorder: '#ff6c9b', + }, +} diff --git a/webpack.config.ts b/webpack.config.ts index 3b14ee4a8a..e1163133c0 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -196,6 +196,9 @@ module.exports = { }, { test: /\.(eot|woff|woff2|svg|ttf)([\?]?.*)$/, loader: 'url-loader' + }, { + test: /\.json5$/, + loader: 'json5-loader' }, { test: /\.ts$/, exclude: /node_modules/, From 38139ee6c9c835bd30dbc64fb790bd08dc1916df Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 2 Oct 2018 16:10:45 +0900 Subject: [PATCH 460/539] =?UTF-8?q?=E3=83=86=E3=83=BC=E3=83=9E=E3=81=AB?= =?UTF-8?q?=E9=96=A2=E3=81=97=E3=81=A6=E5=BC=B7=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 2 ++ .../app/common/views/components/theme.vue | 31 +++++++++++++------ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 08d3c51733..1453f1b0bb 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -309,6 +309,8 @@ common/views/components/theme.vue: select-theme: "テーマを選択してください" uninstall: "アンインストール" uninstalled: "「{}」をアンインストールしました" + author: "作者" + desc: "説明" common/views/components/cw-button.vue: hide: "隠す" diff --git a/src/client/app/common/views/components/theme.vue b/src/client/app/common/views/components/theme.vue index 293238e542..7cec1529bb 100644 --- a/src/client/app/common/views/components/theme.vue +++ b/src/client/app/common/views/components/theme.vue @@ -52,13 +52,21 @@ <details> <summary>%i18n:@installed-themes%</summary> - <ui-select v-model="selectedInstalledTheme" placeholder="%i18n:@select-theme%"> + <ui-select v-model="selectedInstalledThemeId" placeholder="%i18n:@select-theme%"> <option v-for="x in installedThemes" :value="x.id" :key="x.id">{{ x.name }}</option> </ui-select> - <ui-textarea readonly :value="selectedInstalledThemeCode"> - <span>%i18n:@theme-code%</span> - </ui-textarea> - <ui-button @click="uninstall()">%i18n:@uninstall%</ui-button> + <template v-if="selectedInstalledTheme"> + <ui-input readonly :value="selectedInstalledTheme.author"> + <span>%i18n:@author%</span> + </ui-input> + <ui-textarea v-if="selectedInstalledTheme.desc" readonly :value="selectedInstalledTheme.desc"> + <span>%i18n:@desc%</span> + </ui-textarea> + <ui-textarea readonly :value="selectedInstalledThemeCode"> + <span>%i18n:@theme-code%</span> + </ui-textarea> + <ui-button @click="uninstall()">%i18n:@uninstall%</ui-button> + </template> </details> </div> </template> @@ -93,7 +101,7 @@ export default Vue.extend({ data() { return { installThemeCode: null, - selectedInstalledTheme: null, + selectedInstalledThemeId: null, myThemeBase: 'light', myThemeName: '', myThemePrimary: lightTheme.vars.primary, @@ -121,15 +129,20 @@ export default Vue.extend({ set(value) { this.$store.commit('device/set', { key: 'darkTheme', value }); } }, + selectedInstalledTheme() { + if (this.selectedInstalledThemeId == null) return null; + return this.installedThemes.find(x => x.id == this.selectedInstalledThemeId); + }, + selectedInstalledThemeCode() { if (this.selectedInstalledTheme == null) return null; - return JSON5.stringify(this.installedThemes.find(x => x.id == this.selectedInstalledTheme), null, '\t'); + return JSON5.stringify(this.selectedInstalledTheme, null, '\t'); }, myTheme(): any { return { name: this.myThemeName, - author: this.$store.state.i.name, + author: this.$store.state.i.username, base: this.myThemeBase, vars: { primary: tinycolor(typeof this.myThemePrimary == 'string' ? this.myThemePrimary : this.myThemePrimary.rgba).toRgbString(), @@ -198,7 +211,7 @@ export default Vue.extend({ }, uninstall() { - const theme = this.installedThemes.find(x => x.id == this.selectedInstalledTheme); + const theme = this.selectedInstalledTheme; const themes = this.$store.state.device.themes.filter(t => t.id != theme.id); this.$store.commit('device/set', { key: 'themes', value: themes From 6e04549a9b287113cf98aa3e0825647b492b8106 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 2 Oct 2018 16:13:14 +0900 Subject: [PATCH 461/539] Enable JSON5 syntax --- .gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index 58a7812fdf..e0f637f9e5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,3 +3,4 @@ *.ai -diff -text yarn.lock -diff -text package-lock.json -diff -text +*.json5 linguist-language=JavaScript From b5745877ca7ce3c9cd4fb88ba6d4700ff0a9445e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 2 Oct 2018 16:23:55 +0900 Subject: [PATCH 462/539] :art: --- .../app/common/views/components/theme.vue | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/client/app/common/views/components/theme.vue b/src/client/app/common/views/components/theme.vue index 7cec1529bb..5cc779ee8e 100644 --- a/src/client/app/common/views/components/theme.vue +++ b/src/client/app/common/views/components/theme.vue @@ -15,7 +15,7 @@ </label> <details class="creator"> - <summary>%i18n:@create-a-theme%</summary> + <summary>%fa:palette% %i18n:@create-a-theme%</summary> <div> <span>%i18n:@base-theme%:</span> <ui-radio v-model="myThemeBase" value="light">%i18n:@base-theme-light%</ui-radio> @@ -38,20 +38,20 @@ <div style="padding-bottom:8px;">%i18n:@text-color%:</div> <color-picker v-model="myThemeText"/> </div> - <ui-button @click="preview()">%i18n:@preview-created-theme%</ui-button> - <ui-button primary @click="gen()">%i18n:@save-created-theme%</ui-button> + <ui-button @click="preview()">%fa:eye% %i18n:@preview-created-theme%</ui-button> + <ui-button primary @click="gen()">%fa:save R% %i18n:@save-created-theme%</ui-button> </details> <details> - <summary>%i18n:@install-a-theme%</summary> + <summary>%fa:download% %i18n:@install-a-theme%</summary> <ui-textarea v-model="installThemeCode"> <span>%i18n:@theme-code%</span> </ui-textarea> - <ui-button @click="install()">%i18n:@install%</ui-button> + <ui-button @click="install()">%fa:check% %i18n:@install%</ui-button> </details> <details> - <summary>%i18n:@installed-themes%</summary> + <summary>%fa:folder-open% %i18n:@installed-themes%</summary> <ui-select v-model="selectedInstalledThemeId" placeholder="%i18n:@select-theme%"> <option v-for="x in installedThemes" :value="x.id" :key="x.id">{{ x.name }}</option> </ui-select> @@ -65,7 +65,7 @@ <ui-textarea readonly :value="selectedInstalledThemeCode"> <span>%i18n:@theme-code%</span> </ui-textarea> - <ui-button @click="uninstall()">%i18n:@uninstall%</ui-button> + <ui-button @click="uninstall()">%fa:trash-alt R% %i18n:@uninstall%</ui-button> </template> </details> </div> @@ -238,6 +238,11 @@ export default Vue.extend({ <style lang="stylus" scoped> .nicnklzforebnpfgasiypmpdaaglujqm + > details + margin-top 16px + padding-top 16px + border-top solid 1px var(--faceDivider) + > .creator > div padding 16px 0 From c09a2a37fe3ab130969dd143b0ee65706871951f Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Tue, 2 Oct 2018 16:27:36 +0900 Subject: [PATCH 463/539] =?UTF-8?q?=E3=83=AA=E3=83=A2=E3=83=BC=E3=83=88?= =?UTF-8?q?=E3=81=AE=E3=83=94=E3=83=B3=E7=95=99=E3=82=81=E6=8A=95=E7=A8=BF?= =?UTF-8?q?=E5=8F=96=E5=BE=97=E5=AF=BE=E5=BF=9C=20(#2798)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fetch featured * Handle featured change * Fix typo --- src/models/user.ts | 1 + src/remote/activitypub/kernel/add/index.ts | 22 ++++++ src/remote/activitypub/kernel/index.ts | 10 +++ src/remote/activitypub/kernel/remove/index.ts | 22 ++++++ src/remote/activitypub/models/note.ts | 4 +- src/remote/activitypub/models/person.ts | 46 +++++++++++- src/remote/activitypub/resolver.ts | 4 +- src/remote/activitypub/type.ts | 10 +++ src/server/api/endpoints/i/pin.ts | 40 ++-------- src/server/api/endpoints/i/unpin.ts | 30 ++------ src/services/i/pin.ts | 73 ++++++++++++++++++- 11 files changed, 199 insertions(+), 63 deletions(-) create mode 100644 src/remote/activitypub/kernel/add/index.ts create mode 100644 src/remote/activitypub/kernel/remove/index.ts diff --git a/src/models/user.ts b/src/models/user.ts index 8ff91d3f45..d2124bda74 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -113,6 +113,7 @@ export interface ILocalUser extends IUserBase { export interface IRemoteUser extends IUserBase { inbox: string; sharedInbox?: string; + featured?: string; endpoints: string[]; uri: string; url?: string; diff --git a/src/remote/activitypub/kernel/add/index.ts b/src/remote/activitypub/kernel/add/index.ts new file mode 100644 index 0000000000..eb2dba5b21 --- /dev/null +++ b/src/remote/activitypub/kernel/add/index.ts @@ -0,0 +1,22 @@ +import { IRemoteUser } from '../../../../models/user'; +import { IAdd } from '../../type'; +import { resolveNote } from '../../models/note'; +import { addPinned } from '../../../../services/i/pin'; + +export default async (actor: IRemoteUser, activity: IAdd): Promise<void> => { + if ('actor' in activity && actor.uri !== activity.actor) { + throw new Error('invalid actor'); + } + + if (activity.target == null) { + throw new Error('target is null'); + } + + if (activity.target === actor.featured) { + const note = await resolveNote(activity.object); + await addPinned(actor, note._id); + return; + } + + throw new Error(`unknown target: ${activity.target}`); +}; diff --git a/src/remote/activitypub/kernel/index.ts b/src/remote/activitypub/kernel/index.ts index 752a9bd2e2..52b0efc730 100644 --- a/src/remote/activitypub/kernel/index.ts +++ b/src/remote/activitypub/kernel/index.ts @@ -8,6 +8,8 @@ import like from './like'; import announce from './announce'; import accept from './accept'; import reject from './reject'; +import add from './add'; +import remove from './remove'; const self = async (actor: IRemoteUser, activity: Object): Promise<void> => { switch (activity.type) { @@ -31,6 +33,14 @@ const self = async (actor: IRemoteUser, activity: Object): Promise<void> => { await reject(actor, activity); break; + case 'Add': + await add(actor, activity).catch(err => console.log(err)); + break; + + case 'Remove': + await remove(actor, activity).catch(err => console.log(err)); + break; + case 'Announce': await announce(actor, activity); break; diff --git a/src/remote/activitypub/kernel/remove/index.ts b/src/remote/activitypub/kernel/remove/index.ts new file mode 100644 index 0000000000..91b207c80d --- /dev/null +++ b/src/remote/activitypub/kernel/remove/index.ts @@ -0,0 +1,22 @@ +import { IRemoteUser } from '../../../../models/user'; +import { IRemove } from '../../type'; +import { resolveNote } from '../../models/note'; +import { removePinned } from '../../../../services/i/pin'; + +export default async (actor: IRemoteUser, activity: IRemove): Promise<void> => { + if ('actor' in activity && actor.uri !== activity.actor) { + throw new Error('invalid actor'); + } + + if (activity.target == null) { + throw new Error('target is null'); + } + + if (activity.target === actor.featured) { + const note = await resolveNote(activity.object); + await removePinned(actor, note._id); + return; + } + + throw new Error(`unknown target: ${activity.target}`); +}; diff --git a/src/remote/activitypub/models/note.ts b/src/remote/activitypub/models/note.ts index b4afda765a..d49cf53079 100644 --- a/src/remote/activitypub/models/note.ts +++ b/src/remote/activitypub/models/note.ts @@ -56,7 +56,7 @@ export async function createNote(value: any, resolver?: Resolver, silent = false log(`Creating the Note: ${note.id}`); // 投稿者をフェッチ - const actor = await resolvePerson(note.attributedTo) as IRemoteUser; + const actor = await resolvePerson(note.attributedTo, null, resolver) as IRemoteUser; // 投稿者が凍結されていたらスキップ if (actor.isSuspended) { @@ -73,7 +73,7 @@ export async function createNote(value: any, resolver?: Resolver, silent = false visibility = 'followers'; } else { visibility = 'specified'; - visibleUsers = await Promise.all(note.to.map(uri => resolvePerson(uri))); + visibleUsers = await Promise.all(note.to.map(uri => resolvePerson(uri, null, resolver))); } } //#endergion diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts index dff38f5460..ee95e43ad3 100644 --- a/src/remote/activitypub/models/person.ts +++ b/src/remote/activitypub/models/person.ts @@ -3,15 +3,16 @@ import { toUnicode } from 'punycode'; import * as debug from 'debug'; import config from '../../../config'; -import User, { validateUsername, isValidName, IUser, IRemoteUser } from '../../../models/user'; +import User, { validateUsername, isValidName, IUser, IRemoteUser, isRemoteUser } from '../../../models/user'; import Resolver from '../resolver'; import { resolveImage } from './image'; -import { isCollectionOrOrderedCollection, IPerson } from '../type'; +import { isCollectionOrOrderedCollection, isCollection, IPerson } from '../type'; import { IDriveFile } from '../../../models/drive-file'; import Meta from '../../../models/meta'; import htmlToMFM from '../../../mfm/html-to-mfm'; import { updateUserStats } from '../../../services/update-chart'; import { URL } from 'url'; +import { resolveNote } from './note'; const log = debug('misskey:activitypub'); @@ -155,6 +156,7 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU }, inbox: person.inbox, sharedInbox: person.sharedInbox, + featured: person.featured, endpoints: person.endpoints, uri: person.id, url: person.url, @@ -211,6 +213,7 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU user.bannerUrl = bannerUrl; //#endregion + await updateFeatured(user._id).catch(err => console.log(err)); return user; } @@ -282,6 +285,7 @@ export async function updatePerson(uri: string, resolver?: Resolver, hint?: obje updatedAt: new Date(), inbox: person.inbox, sharedInbox: person.sharedInbox, + featured: person.featured, avatarId: avatar ? avatar._id : null, bannerId: banner ? banner._id : null, avatarUrl: (avatar && avatar.metadata.thumbnailUrl) ? avatar.metadata.thumbnailUrl : (avatar && avatar.metadata.url) ? avatar.metadata.url : null, @@ -303,6 +307,8 @@ export async function updatePerson(uri: string, resolver?: Resolver, hint?: obje }, } }); + + await updateFeatured(exist._id).catch(err => console.log(err)); } /** @@ -311,7 +317,7 @@ export async function updatePerson(uri: string, resolver?: Resolver, hint?: obje * Misskeyに対象のPersonが登録されていればそれを返し、そうでなければ * リモートサーバーからフェッチしてMisskeyに登録しそれを返します。 */ -export async function resolvePerson(uri: string, verifier?: string): Promise<IUser> { +export async function resolvePerson(uri: string, verifier?: string, resolver?: Resolver): Promise<IUser> { if (typeof uri !== 'string') throw 'uri is not string'; //#region このサーバーに既に登録されていたらそれを返す @@ -323,5 +329,37 @@ export async function resolvePerson(uri: string, verifier?: string): Promise<IUs //#endregion // リモートサーバーからフェッチしてきて登録 - return await createPerson(uri); + if (resolver == null) resolver = new Resolver(); + return await createPerson(uri, resolver); +} + +export async function updateFeatured(userId: mongo.ObjectID) { + const user = await User.findOne({ _id: userId }); + if (!isRemoteUser(user)) return; + if (!user.featured) return; + + log(`Updating the featured: ${user.uri}`); + + const resolver = new Resolver(); + + // Resolve to (Ordered)Collection Object + const collection = await resolver.resolveCollection(user.featured); + if (!isCollectionOrOrderedCollection(collection)) throw new Error(`Object is not Collection or OrderedCollection`); + + // Resolve to Object(may be Note) arrays + const unresolvedItems = isCollection(collection) ? collection.items : collection.orderedItems; + const items = await resolver.resolve(unresolvedItems); + if (!Array.isArray(items)) throw new Error(`Collection items is not an array`); + + // Resolve and regist Notes + const featuredNotes = await Promise.all(items + .filter(item => item.type === 'Note') + .slice(0, 5) + .map(item => resolveNote(item, resolver))); + + await User.update({ _id: user._id }, { + $set: { + pinnedNoteIds: featuredNotes.map(note => note._id) + } + }); } diff --git a/src/remote/activitypub/resolver.ts b/src/remote/activitypub/resolver.ts index e1c12e7e62..215e5e8704 100644 --- a/src/remote/activitypub/resolver.ts +++ b/src/remote/activitypub/resolver.ts @@ -19,11 +19,11 @@ export default class Resolver { switch (collection.type) { case 'Collection': - collection.objects = collection.object.items; + collection.objects = collection.items; break; case 'OrderedCollection': - collection.objects = collection.object.orderedItems; + collection.objects = collection.orderedItems; break; default: diff --git a/src/remote/activitypub/type.ts b/src/remote/activitypub/type.ts index 7bbea5fd18..5c06ee4ffe 100644 --- a/src/remote/activitypub/type.ts +++ b/src/remote/activitypub/type.ts @@ -91,6 +91,14 @@ export interface IReject extends IActivity { type: 'Reject'; } +export interface IAdd extends IActivity { + type: 'Add'; +} + +export interface IRemove extends IActivity { + type: 'Remove'; +} + export interface ILike extends IActivity { type: 'Like'; _misskey_reaction: string; @@ -109,5 +117,7 @@ export type Object = IFollow | IAccept | IReject | + IAdd | + IRemove | ILike | IAnnounce; diff --git a/src/server/api/endpoints/i/pin.ts b/src/server/api/endpoints/i/pin.ts index f9ae032b11..bf729ca091 100644 --- a/src/server/api/endpoints/i/pin.ts +++ b/src/server/api/endpoints/i/pin.ts @@ -1,8 +1,7 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; -import User, { ILocalUser } from '../../../../models/user'; -import Note from '../../../../models/note'; +import { ILocalUser } from '../../../../models/user'; import { pack } from '../../../../models/user'; -import { deliverPinnedChange } from '../../../../services/i/pin'; +import { addPinned } from '../../../../services/i/pin'; import getParams from '../../get-params'; export const meta = { @@ -27,41 +26,18 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res, const [ps, psErr] = getParams(meta, params); if (psErr) return rej(psErr); - // Fetch pinee - const note = await Note.findOne({ - _id: ps.noteId, - userId: user._id - }); - - if (note === null) { - return rej('note not found'); + // Processing + try { + await addPinned(user, ps.noteId); + } catch (e) { + return rej(e.message); } - const pinnedNoteIds = user.pinnedNoteIds || []; - - if (pinnedNoteIds.length > 5) { - return rej('cannot pin more notes'); - } - - if (pinnedNoteIds.some(id => id.equals(note._id))) { - return rej('already exists'); - } - - pinnedNoteIds.unshift(note._id); - - await User.update(user._id, { - $set: { - pinnedNoteIds: pinnedNoteIds - } - }); - + // Serialize const iObj = await pack(user, user, { detail: true }); // Send response res(iObj); - - // Send Add to followers - deliverPinnedChange(user._id, note._id, true); }); diff --git a/src/server/api/endpoints/i/unpin.ts b/src/server/api/endpoints/i/unpin.ts index 82625ae5fb..2a81993e4b 100644 --- a/src/server/api/endpoints/i/unpin.ts +++ b/src/server/api/endpoints/i/unpin.ts @@ -1,8 +1,7 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; -import User, { ILocalUser } from '../../../../models/user'; -import Note from '../../../../models/note'; +import { ILocalUser } from '../../../../models/user'; import { pack } from '../../../../models/user'; -import { deliverPinnedChange } from '../../../../services/i/pin'; +import { removePinned } from '../../../../services/i/pin'; import getParams from '../../get-params'; export const meta = { @@ -27,31 +26,18 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res, const [ps, psErr] = getParams(meta, params); if (psErr) return rej(psErr); - // Fetch unpinee - const note = await Note.findOne({ - _id: ps.noteId, - userId: user._id - }); - - if (note === null) { - return rej('note not found'); + // Processing + try { + await removePinned(user, ps.noteId); + } catch (e) { + return rej(e.message); } - const pinnedNoteIds = (user.pinnedNoteIds || []).filter(id => !id.equals(note._id)); - - await User.update(user._id, { - $set: { - pinnedNoteIds: pinnedNoteIds - } - }); - + // Serialize const iObj = await pack(user, user, { detail: true }); // Send response res(iObj); - - // Send Remove to followers - deliverPinnedChange(user._id, note._id, false); }); diff --git a/src/services/i/pin.ts b/src/services/i/pin.ts index 8b7287e68d..a39cc1e597 100644 --- a/src/services/i/pin.ts +++ b/src/services/i/pin.ts @@ -1,12 +1,83 @@ import config from '../../config'; import * as mongo from 'mongodb'; -import User, { isLocalUser, isRemoteUser, ILocalUser } from '../../models/user'; +import User, { isLocalUser, isRemoteUser, ILocalUser, IUser } from '../../models/user'; +import Note from '../../models/note'; import Following from '../../models/following'; import renderAdd from '../../remote/activitypub/renderer/add'; import renderRemove from '../../remote/activitypub/renderer/remove'; import packAp from '../../remote/activitypub/renderer'; import { deliver } from '../../queue'; +/** + * 指定した投稿をピン留めします + * @param user + * @param noteId + */ +export async function addPinned(user: IUser, noteId: mongo.ObjectID) { + // Fetch pinee + const note = await Note.findOne({ + _id: noteId, + userId: user._id + }); + + if (note === null) { + throw new Error('note not found'); + } + + const pinnedNoteIds = user.pinnedNoteIds || []; + + if (pinnedNoteIds.length > 5) { + throw new Error('cannot pin more notes'); + } + + if (pinnedNoteIds.some(id => id.equals(note._id))) { + throw new Error('already exists'); + } + + pinnedNoteIds.unshift(note._id); + + await User.update(user._id, { + $set: { + pinnedNoteIds: pinnedNoteIds + } + }); + + // Deliver to remote followers + if (isLocalUser(user)) { + deliverPinnedChange(user._id, note._id, true); + } +} + +/** + * 指定した投稿のピン留めを解除します + * @param user + * @param noteId + */ +export async function removePinned(user: IUser, noteId: mongo.ObjectID) { + // Fetch unpinee + const note = await Note.findOne({ + _id: noteId, + userId: user._id + }); + + if (note === null) { + throw new Error('note not found'); + } + + const pinnedNoteIds = (user.pinnedNoteIds || []).filter(id => !id.equals(note._id)); + + await User.update(user._id, { + $set: { + pinnedNoteIds: pinnedNoteIds + } + }); + + // Deliver to remote followers + if (isLocalUser(user)) { + deliverPinnedChange(user._id, noteId, false); + } +} + export async function deliverPinnedChange(userId: mongo.ObjectID, noteId: mongo.ObjectID, isAddition: boolean) { const user = await User.findOne({ _id: userId From 89d5df20a5e9f5d0152ef286acde7138d64e1e98 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Tue, 2 Oct 2018 16:29:05 +0900 Subject: [PATCH 464/539] 9.1.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index c12b8861c6..d57b93c8bc 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "9.0.0", - "clientVersion": "1.0.10049", + "version": "9.1.0", + "clientVersion": "1.0.10056", "codename": "nighthike", "main": "./built/index.js", "private": true, From 7e50e03cfb019f764bb6205c606ecf01a6cb438b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Acid=20Chicken=20=28=E7=A1=AB=E9=85=B8=E9=B6=8F=29?= <root@acid-chicken.com> Date: Tue, 2 Oct 2018 20:23:27 +0900 Subject: [PATCH 465/539] Update README.md [AUTOGEN] (#2801) --- README.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 4de6151080..5247671dda 100644 --- a/README.md +++ b/README.md @@ -73,17 +73,17 @@ Please see [Contribution guide](./CONTRIBUTING.md). <table><tr> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=Yd60FK_SWfQO56SeiJpy1tDHOnCV4xdEywQe8gn5_Wo%3D" alt="negao"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13099460/43cecdbaa63a40d79bf50a96b9910b9d/1?token-time=2145916800&token-hash=d6P5MWHHsCMxUuBAEPAoVc5wLUR19mIhqAq7Ma9h9rI%3D" alt="ne_moni"></td> -<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/1?token-time=2145916800&token-hash=f03BFb4S2FUx9YEt87TnEmifb4h33OywGBW2akQVtQY%3D" alt="Melilot"></td> -<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/2?token-time=2145916800&token-hash=rwZ8qvbm_kpA4ib3kc07tVKupXeySpY5ATQFGxfL9v0%3D" alt="Axella"></td> +<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/2?token-time=2145916800&token-hash=mgPdX9TqZxEg4TTPuc477dxhIgYk9246qafjWZEqZ7g%3D" alt="Melilot"></td> +<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/2?token-time=2145916800&token-hash=rwZ8qvbm_kpA4ib3kc07tVKupXeySpY5ATQFGxfL9v0%3D" alt="Xeltica"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/3384329/8b713330cb27404ea6e9fac50ff96efe/1?token-time=2145916800&token-hash=0eu4-m1gTWA9PhptVZt6rdKcusqcD7RB87rJT23VVFI%3D" alt="べすれい"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=GgJ_NmUB6_nnRNLVGUWjV-WX91On7BOu59LKncYV9fE%3D" alt="gutfuckllc"></td> <td><img src="https://c8.patreon.com/2/100/12718187" alt="Peter G."></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=zwSu01tOtn5xTUucDZHuPsCxF2HBEMVs9ROJKTlEV_o%3D" alt="nemu"></td> </tr><tr> -<td><a href="https://www.patreon.com/user?u=12731202">negao</a></td> +<td><a href="https://www.patreon.com/negao">negao</a></td> <td><a href="https://www.patreon.com/user?u=13099460">ne_moni</a></td> <td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td> -<td><a href="https://www.patreon.com/AxellaMC">Axella</a></td> +<td><a href="https://www.patreon.com/AxellaMC">Xeltica</a></td> <td><a href="https://www.patreon.com/user?u=3384329">べすれい</a></td> <td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td> <td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td> @@ -91,19 +91,17 @@ Please see [Contribution guide](./CONTRIBUTING.md). </tr></table> <table><tr> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/2?token-time=2145916800&token-hash=zElv7ZcPL3viGsXbNG_KWiKrbV0vvw1gk0panx8DJoo%3D" alt="Naoki Kosaka"></td> -<td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12931605/ead494101f364dffa90efe49e36fb494/1?token-time=2145916800&token-hash=NzSFPjIlodXyv41rwK61aZWVZWfI4surJaNj8vWKvqM%3D" alt="Reiju"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=UERBN4OyP7Nh5XwwdDg0N0IE5cD6_qUQMO81Z5Wizso%3D" alt="Hiratake"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D" alt="dansup"></td> <td><img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=tMosUojzUYJCH_3t--tvYA-SMCyrS__hzSndyaRSnbo%3D" alt="Takashi Shibuya"></td> </tr><tr> <td><a href="https://www.patreon.com/user?u=5881381">Naoki Kosaka</a></td> -<td><a href="https://www.patreon.com/user?u=12931605">Reiju</a></td> <td><a href="https://www.patreon.com/hiratake">Hiratake</a></td> <td><a href="https://www.patreon.com/dansup">dansup</a></td> <td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td> </tr></table> -**Last updated:** Sun, 02 Sep 2018 05:30:06 UTC +**Last updated:** Tue, 02 Oct 2018 09:25:07 UTC <!-- PATREON_END --> :four_leaf_clover: Copyright From 7d11c8b767a43837d336099790e89e7b550554a4 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Tue, 2 Oct 2018 23:42:46 +0900 Subject: [PATCH 466/539] Improve admin UI (#2802) --- .../views/pages/admin/admin.announcements.vue | 17 ++++++++++++-- .../views/pages/admin/admin.dashboard.vue | 8 ++++++- .../views/pages/admin/admin.hashtags.vue | 4 ++++ .../views/pages/admin/admin.suspend-user.vue | 22 ++++++++++++------- .../pages/admin/admin.unsuspend-user.vue | 21 ++++++++++++------ .../views/pages/admin/admin.unverify-user.vue | 22 ++++++++++++------- .../views/pages/admin/admin.verify-user.vue | 22 ++++++++++++------- .../app/desktop/views/pages/admin/admin.vue | 12 +++++++--- 8 files changed, 91 insertions(+), 37 deletions(-) diff --git a/src/client/app/desktop/views/pages/admin/admin.announcements.vue b/src/client/app/desktop/views/pages/admin/admin.announcements.vue index 272016b3f9..722fa227cf 100644 --- a/src/client/app/desktop/views/pages/admin/admin.announcements.vue +++ b/src/client/app/desktop/views/pages/admin/admin.announcements.vue @@ -1,7 +1,7 @@ <template> <div class="qldxjjsrseehkusjuoooapmsprvfrxyl mk-admin-card"> <header>%i18n:@announcements%</header> - <textarea v-model="broadcasts"></textarea> + <textarea v-model="broadcasts" placeholder='[ { "title": "Title1", "text": "Text1" }, { "title": "Title2", "text": "Text2" } ]'></textarea> <button class="ui" @click="save">%i18n:@save%</button> </div> </template> @@ -22,8 +22,21 @@ export default Vue.extend({ }, methods: { save() { + let json; + + try { + json = JSON.parse(this.broadcasts); + } catch (e) { + (this as any).os.apis.dialog({ text: `Failed: ${e}` }); + return; + } + (this as any).api('admin/update-meta', { - broadcasts: JSON.parse(this.broadcasts) + broadcasts: json + }).then(() => { + (this as any).os.apis.dialog({ text: `Saved` }); + }.catch(e => { + (this as any).os.apis.dialog({ text: `Failed ${e}` }); }); } } diff --git a/src/client/app/desktop/views/pages/admin/admin.dashboard.vue b/src/client/app/desktop/views/pages/admin/admin.dashboard.vue index f5734012bd..1b0c5f8125 100644 --- a/src/client/app/desktop/views/pages/admin/admin.dashboard.vue +++ b/src/client/app/desktop/views/pages/admin/admin.dashboard.vue @@ -13,7 +13,7 @@ <x-cpu-memory :connection="connection"/> </div> - <div class="form"> + <div v-if="this.$store.state.i && this.$store.state.i.isAdmin" class="form"> <div> <label> <p>%i18n:@banner-url%</p> @@ -81,6 +81,8 @@ export default Vue.extend({ invite() { (this as any).api('admin/invite').then(x => { this.inviteCode = x.code; + }).catch(e => { + (this as any).os.apis.dialog({ text: `Failed ${e}` }); }); }, updateMeta() { @@ -88,6 +90,10 @@ export default Vue.extend({ disableRegistration: this.disableRegistration, disableLocalTimeline: this.disableLocalTimeline, bannerUrl: this.bannerUrl + }).then(() => { + (this as any).os.apis.dialog({ text: `Saved` }); + }).catch(e => { + (this as any).os.apis.dialog({ text: `Failed ${e}` }); }); } } diff --git a/src/client/app/desktop/views/pages/admin/admin.hashtags.vue b/src/client/app/desktop/views/pages/admin/admin.hashtags.vue index f491b85959..10bab1cbd7 100644 --- a/src/client/app/desktop/views/pages/admin/admin.hashtags.vue +++ b/src/client/app/desktop/views/pages/admin/admin.hashtags.vue @@ -24,6 +24,10 @@ export default Vue.extend({ save() { (this as any).api('admin/update-meta', { hidedTags: this.hidedTags.split('\n') + }).then(() => { + (this as any).os.apis.dialog({ text: `Saved` }); + }).catch(e => { + (this as any).os.apis.dialog({ text: `Failed ${e}` }); }); } } diff --git a/src/client/app/desktop/views/pages/admin/admin.suspend-user.vue b/src/client/app/desktop/views/pages/admin/admin.suspend-user.vue index 32295e3795..a8ff937bbe 100644 --- a/src/client/app/desktop/views/pages/admin/admin.suspend-user.vue +++ b/src/client/app/desktop/views/pages/admin/admin.suspend-user.vue @@ -21,18 +21,24 @@ export default Vue.extend({ async suspendUser() { this.suspending = true; - const user = await (this as any).os.api( - "users/show", - parseAcct(this.username) - ); + const process = async () => { + const user = await (this as any).os.api( + "users/show", + parseAcct(this.username) + ); - await (this as any).os.api("admin/suspend-user", { - userId: user.id + await (this as any).os.api("admin/suspend-user", { + userId: user.id + }); + + (this as any).os.apis.dialog({ text: "%i18n:@suspended%" }); + }; + + await process().catch(e => { + (this as any).os.apis.dialog({ text: `Failed: ${e}` }); }); this.suspending = false; - - (this as any).os.apis.dialog({ text: "%i18n:@suspended%" }); } } }); diff --git a/src/client/app/desktop/views/pages/admin/admin.unsuspend-user.vue b/src/client/app/desktop/views/pages/admin/admin.unsuspend-user.vue index d6905fe9c0..146f5a41d4 100644 --- a/src/client/app/desktop/views/pages/admin/admin.unsuspend-user.vue +++ b/src/client/app/desktop/views/pages/admin/admin.unsuspend-user.vue @@ -21,18 +21,25 @@ export default Vue.extend({ async unsuspendUser() { this.unsuspending = true; - const user = await (this as any).os.api( - "users/show", - parseAcct(this.username) - ); + const process = async () => { + const user = await (this as any).os.api( + "users/show", + parseAcct(this.username) + ); - await (this as any).os.api("admin/unsuspend-user", { - userId: user.id + await (this as any).os.api("admin/unsuspend-user", { + userId: user.id + }); + + (this as any).os.apis.dialog({ text: "%i18n:@unsuspended%" }); + }; + + await process().catch(e => { + (this as any).os.apis.dialog({ text: `Failed: ${e}` }); }); this.unsuspending = false; - (this as any).os.apis.dialog({ text: "%i18n:@unsuspended%" }); } } }); diff --git a/src/client/app/desktop/views/pages/admin/admin.unverify-user.vue b/src/client/app/desktop/views/pages/admin/admin.unverify-user.vue index d0cf635a98..5e0fdae5c1 100644 --- a/src/client/app/desktop/views/pages/admin/admin.unverify-user.vue +++ b/src/client/app/desktop/views/pages/admin/admin.unverify-user.vue @@ -21,18 +21,24 @@ export default Vue.extend({ async unverifyUser() { this.unverifying = true; - const user = await (this as any).os.api( - "users/show", - parseAcct(this.username) - ); + const process = async () => { + const user = await (this as any).os.api( + "users/show", + parseAcct(this.username) + ); - await (this as any).os.api("admin/unverify-user", { - userId: user.id + await (this as any).os.api("admin/unverify-user", { + userId: user.id + }); + + (this as any).os.apis.dialog({ text: "%i18n:@unverified%" }); + }; + + await process().catch(e => { + (this as any).os.apis.dialog({ text: `Failed: ${e}` }); }); this.unverifying = false; - - (this as any).os.apis.dialog({ text: "%i18n:@unverified%" }); } } }); diff --git a/src/client/app/desktop/views/pages/admin/admin.verify-user.vue b/src/client/app/desktop/views/pages/admin/admin.verify-user.vue index 9c0b0209b7..d237a5f9c1 100644 --- a/src/client/app/desktop/views/pages/admin/admin.verify-user.vue +++ b/src/client/app/desktop/views/pages/admin/admin.verify-user.vue @@ -21,18 +21,24 @@ export default Vue.extend({ async verifyUser() { this.verifying = true; - const user = await (this as any).os.api( - "users/show", - parseAcct(this.username) - ); + const process = async () => { + const user = await (this as any).os.api( + "users/show", + parseAcct(this.username) + ); - await (this as any).os.api("admin/verify-user", { - userId: user.id + await (this as any).os.api("admin/verify-user", { + userId: user.id + }); + + (this as any).os.apis.dialog({ text: "%i18n:@verified%" }); + }; + + await process().catch(e => { + (this as any).os.apis.dialog({ text: `Failed: ${e}` }); }); this.verifying = false; - - (this as any).os.apis.dialog({ text: "%i18n:@verified%" }); } } }); diff --git a/src/client/app/desktop/views/pages/admin/admin.vue b/src/client/app/desktop/views/pages/admin/admin.vue index b874915f05..ad417e5121 100644 --- a/src/client/app/desktop/views/pages/admin/admin.vue +++ b/src/client/app/desktop/views/pages/admin/admin.vue @@ -3,9 +3,15 @@ <nav> <ul> <li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }">%fa:chalkboard .fw%%i18n:@dashboard%</li> - <li @click="nav('users')" :class="{ active: page == 'users' }">%fa:users .fw%%i18n:@users%</li> - <li @click="nav('announcements')" :class="{ active: page == 'announcements' }">%fa:broadcast-tower .fw%%i18n:@announcements%</li> - <li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }">%fa:hashtag .fw%%i18n:@hashtags%</li> + + <li v-if="this.$store.state.i && this.$store.state.i.isAdmin" + @click="nav('users')" :class="{ active: page == 'users' }">%fa:users .fw%%i18n:@users%</li> + + <li v-if="this.$store.state.i && this.$store.state.i.isAdmin" + @click="nav('announcements')" :class="{ active: page == 'announcements' }">%fa:broadcast-tower .fw%%i18n:@announcements%</li> + + <li v-if="this.$store.state.i && this.$store.state.i.isAdmin" + @click="nav('hashtags')" :class="{ active: page == 'hashtags' }">%fa:hashtag .fw%%i18n:@hashtags%</li> <!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }">%fa:cloud .fw%%i18n:@drive%</li> --> <!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> --> From 274cf1af1c4aaa41a01784920115f5cec5923fe3 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 3 Oct 2018 02:57:31 +0900 Subject: [PATCH 467/539] =?UTF-8?q?=E3=83=86=E3=83=BC=E3=83=9E=E9=96=A2?= =?UTF-8?q?=E9=80=A3=E3=81=AE=E6=A9=9F=E8=83=BD=E3=82=92=E5=BC=B7=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 3 ++ .../app/common/views/components/theme.vue | 41 ++++++++++++++++--- .../app/common/views/components/ui/button.vue | 18 ++++++-- 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 1453f1b0bb..65f72eced1 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -311,6 +311,9 @@ common/views/components/theme.vue: uninstalled: "「{}」をアンインストールしました" author: "作者" desc: "説明" + export: "エクスポート" + import: "インポート" + import-by-code: "またはコードをペースト" common/views/components/cw-button.vue: hide: "隠す" diff --git a/src/client/app/common/views/components/theme.vue b/src/client/app/common/views/components/theme.vue index 5cc779ee8e..39d8e8aa97 100644 --- a/src/client/app/common/views/components/theme.vue +++ b/src/client/app/common/views/components/theme.vue @@ -44,10 +44,13 @@ <details> <summary>%fa:download% %i18n:@install-a-theme%</summary> + <ui-button @click="import_()">%fa:file-import% %i18n:@import%</ui-button> + <input ref="file" type="file" style="display:none;" @change="onUpdateImportFile"/> + <p>%i18n:@import-by-code%:</p> <ui-textarea v-model="installThemeCode"> <span>%i18n:@theme-code%</span> </ui-textarea> - <ui-button @click="install()">%fa:check% %i18n:@install%</ui-button> + <ui-button @click="() => install(this.installThemeCode)">%fa:check% %i18n:@install%</ui-button> </details> <details> @@ -65,6 +68,7 @@ <ui-textarea readonly :value="selectedInstalledThemeCode"> <span>%i18n:@theme-code%</span> </ui-textarea> + <ui-button @click="export_()" link :download="`${selectedInstalledTheme.name}.misskeytheme`" ref="export">%fa:box% %i18n:@export%</ui-button> <ui-button @click="uninstall()">%fa:trash-alt R% %i18n:@uninstall%</ui-button> </template> </details> @@ -177,11 +181,11 @@ export default Vue.extend({ }, methods: { - install() { + install(code) { let theme; try { - theme = JSON5.parse(this.installThemeCode); + theme = JSON5.parse(code); } catch (e) { alert('%i18n:@invalid-theme%'); return; @@ -219,6 +223,29 @@ export default Vue.extend({ alert('%i18n:@uninstalled%'.replace('{}', theme.name)); }, + import_() { + (this.$refs.file as any).click(); + } + + export_() { + const blob = new Blob([this.selectedInstalledThemeCode], { + type: 'application/json5' + }); + this.$refs.export.$el.href = window.URL.createObjectURL(blob); + }, + + onUpdateImportFile() { + const f = (this.$refs.file as any).files[0]; + + const reader = new FileReader(); + + reader.onload = e => { + this.install(e.target.result); + }; + + reader.readAsText(f); + }, + preview() { applyTheme(this.myTheme, false); }, @@ -239,10 +266,14 @@ export default Vue.extend({ <style lang="stylus" scoped> .nicnklzforebnpfgasiypmpdaaglujqm > details - margin-top 16px - padding-top 16px border-top solid 1px var(--faceDivider) + > summary + padding 16px 0 + + > *:last-child + margin-bottom 16px + > .creator > div padding 16px 0 diff --git a/src/client/app/common/views/components/ui/button.vue b/src/client/app/common/views/components/ui/button.vue index b29f8bb1c9..a509632520 100644 --- a/src/client/app/common/views/components/ui/button.vue +++ b/src/client/app/common/views/components/ui/button.vue @@ -1,7 +1,7 @@ <template> -<button class="dmtdnykelhudezerjlfpbhgovrgnqqgr" :class="[styl, { inline, primary }]" :type="type" @click="$emit('click')"> +<component class="dmtdnykelhudezerjlfpbhgovrgnqqgr" :is="link ? 'a' : 'button'" :class="[styl, { inline, primary }]" :type="type" @click="$emit('click')"> <slot></slot> -</button> +</component> </template> <script lang="ts"> @@ -21,6 +21,11 @@ export default Vue.extend({ type: Boolean, required: false, default: false + }, + link: { + type: Boolean, + required: false, + default: false } }, data() { @@ -35,15 +40,20 @@ export default Vue.extend({ .dmtdnykelhudezerjlfpbhgovrgnqqgr display block width 100% - min-height 40px margin 0 - padding 0 + padding 8px + text-align center font-weight normal font-size 16px border none border-radius 6px outline none box-shadow none + text-decoration none + user-select none + + * + pointer-events none &:focus &:after From a2a25eb5f81ddea039a62c6d05566dbdc9fa9c63 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 3 Oct 2018 03:00:55 +0900 Subject: [PATCH 468/539] Improve usability --- src/client/app/common/views/components/theme.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/common/views/components/theme.vue b/src/client/app/common/views/components/theme.vue index 39d8e8aa97..b2defb212f 100644 --- a/src/client/app/common/views/components/theme.vue +++ b/src/client/app/common/views/components/theme.vue @@ -45,7 +45,7 @@ <details> <summary>%fa:download% %i18n:@install-a-theme%</summary> <ui-button @click="import_()">%fa:file-import% %i18n:@import%</ui-button> - <input ref="file" type="file" style="display:none;" @change="onUpdateImportFile"/> + <input ref="file" type="file" accept=".misskeytheme" style="display:none;" @change="onUpdateImportFile"/> <p>%i18n:@import-by-code%:</p> <ui-textarea v-model="installThemeCode"> <span>%i18n:@theme-code%</span> From 16b6b1f2b3d83a6a113a229edbcabbd11675c66d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 3 Oct 2018 03:07:46 +0900 Subject: [PATCH 469/539] =?UTF-8?q?=E3=83=86=E3=83=BC=E3=83=9E=E9=96=A2?= =?UTF-8?q?=E9=80=A3=E6=A9=9F=E8=83=BD=E3=81=AE=E5=BC=B7=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 1 + src/client/app/common/views/components/theme.vue | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 65f72eced1..62c6355c3b 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -314,6 +314,7 @@ common/views/components/theme.vue: export: "エクスポート" import: "インポート" import-by-code: "またはコードをペースト" + theme-name-required: "テーマ名は必須です。" common/views/components/cw-button.vue: hide: "隠す" diff --git a/src/client/app/common/views/components/theme.vue b/src/client/app/common/views/components/theme.vue index b2defb212f..4b0e6da24c 100644 --- a/src/client/app/common/views/components/theme.vue +++ b/src/client/app/common/views/components/theme.vue @@ -25,6 +25,9 @@ <ui-input v-model="myThemeName"> <span>%i18n:@theme-name%</span> </ui-input> + <ui-textarea v-model="myThemeDesc"> + <span>%i18n:@desc%</span> + </ui-textarea> </div> <div> <div style="padding-bottom:8px;">%i18n:@primary-color%:</div> @@ -108,6 +111,7 @@ export default Vue.extend({ selectedInstalledThemeId: null, myThemeBase: 'light', myThemeName: '', + myThemeDesc: '', myThemePrimary: lightTheme.vars.primary, myThemeSecondary: lightTheme.vars.secondary, myThemeText: lightTheme.vars.text @@ -147,6 +151,7 @@ export default Vue.extend({ return { name: this.myThemeName, author: this.$store.state.i.username, + desc: this.myThemeDesc, base: this.myThemeBase, vars: { primary: tinycolor(typeof this.myThemePrimary == 'string' ? this.myThemePrimary : this.myThemePrimary.rgba).toRgbString(), @@ -252,6 +257,10 @@ export default Vue.extend({ gen() { const theme = this.myTheme; + if (theme.name == null || theme.name.trim() == '') { + alert('%i18n:@theme-name-required%'); + return; + } theme.id = uuid(); const themes = this.$store.state.device.themes.concat(theme); this.$store.commit('device/set', { From 31de5304975dff5d1991a44b18be0c7c6ab5b650 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 3 Oct 2018 03:09:04 +0900 Subject: [PATCH 470/539] 9.2.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d57b93c8bc..c60bc24fe3 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "9.1.0", - "clientVersion": "1.0.10056", + "version": "9.2.0", + "clientVersion": "1.0.10062", "codename": "nighthike", "main": "./built/index.js", "private": true, From 9a57efa6d92080aa444954a9737748e30e921d92 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 3 Oct 2018 03:13:10 +0900 Subject: [PATCH 471/539] :v: --- src/client/theme/pink.json5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/theme/pink.json5 b/src/client/theme/pink.json5 index 2e136fba5d..e228b4b4fa 100644 --- a/src/client/theme/pink.json5 +++ b/src/client/theme/pink.json5 @@ -1,7 +1,7 @@ { id: 'e9c8c01d-9c15-48d0-9b5c-3d00843b5b36', - name: 'Pink', + name: 'Strawberry Milk', author: 'syuilo', base: 'light', From e8138803927dd605facf9354361baa44812e21c6 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Wed, 3 Oct 2018 12:37:23 +0900 Subject: [PATCH 472/539] =?UTF-8?q?6=E5=80=8B=E3=83=94=E3=83=B3=E7=95=99?= =?UTF-8?q?=E3=82=81=E3=81=A7=E3=81=8D=E3=81=A6=E3=81=97=E3=81=BE=E3=81=86?= =?UTF-8?q?=E3=81=AE=E4=BF=AE=E6=AD=A3=20(#2804)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/i/pin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/i/pin.ts b/src/services/i/pin.ts index a39cc1e597..142fc18511 100644 --- a/src/services/i/pin.ts +++ b/src/services/i/pin.ts @@ -26,7 +26,7 @@ export async function addPinned(user: IUser, noteId: mongo.ObjectID) { const pinnedNoteIds = user.pinnedNoteIds || []; - if (pinnedNoteIds.length > 5) { + if (pinnedNoteIds.length >= 5) { throw new Error('cannot pin more notes'); } From ed6450244df3ea171865be7ff958e448748b3f89 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Wed, 3 Oct 2018 12:39:03 +0900 Subject: [PATCH 473/539] Feature flags feature (#2803) --- src/server/api/endpoints/meta.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/server/api/endpoints/meta.ts b/src/server/api/endpoints/meta.ts index 6c585d2c3a..9baf3c252f 100644 --- a/src/server/api/endpoints/meta.ts +++ b/src/server/api/endpoints/meta.ts @@ -39,6 +39,15 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => recaptchaSitekey: config.recaptcha ? config.recaptcha.site_key : null, swPublickey: config.sw ? config.sw.public_key : null, hidedTags: (me && me.isAdmin) ? meta.hidedTags : undefined, - bannerUrl: meta.bannerUrl + bannerUrl: meta.bannerUrl, + features: { + registration: !meta.disableRegistration, + localTimeLine: !meta.disableLocalTimeline, + elasticsearch: config.elasticsearch ? true : false, + recaptcha: config.recaptcha ? true : false, + objectStorage: config.drive && config.drive.storage === 'minio', + twitter: config.twitter ? true : false, + serviceWorker: config.sw ? true : false + } }); }); From 3537b3de8ece177be252235a17938d71db6a59f4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 3 Oct 2018 22:05:17 +0900 Subject: [PATCH 474/539] Clean up --- gulpfile.ts | 4 +- src/client/app/base.pug | 3 - src/client/app/safe.js | 10 --- src/client/assets/code-highlight.css | 93 ---------------------------- 4 files changed, 1 insertion(+), 109 deletions(-) delete mode 100644 src/client/assets/code-highlight.css diff --git a/gulpfile.ts b/gulpfile.ts index 8a4a74d26c..356996314e 100644 --- a/gulpfile.ts +++ b/gulpfile.ts @@ -166,9 +166,7 @@ gulp.task('build:client:pug', [ .pipe(pug({ locals: { themeColor: constants.themeColor, - facss: fa.dom.css(), - //hljscss: fs.readFileSync('./node_modules/highlight.js/styles/default.css', 'utf8') - hljscss: fs.readFileSync('./src/client/assets/code-highlight.css', 'utf8') + facss: fa.dom.css() } })) .pipe(htmlmin({ diff --git a/src/client/app/base.pug b/src/client/app/base.pug index 11b150bc67..ee9d4b6f6d 100644 --- a/src/client/app/base.pug +++ b/src/client/app/base.pug @@ -34,9 +34,6 @@ html //- FontAwesome style style #{facss} - //- highlight.js style - style #{hljscss} - body noscript: p | JavaScriptを有効にしてください diff --git a/src/client/app/safe.js b/src/client/app/safe.js index 3d73fa1a9c..026fc66c6e 100644 --- a/src/client/app/safe.js +++ b/src/client/app/safe.js @@ -12,16 +12,6 @@ if (!('fetch' in window)) { 'To run Misskey, please update your browser to latest version or try other browsers.'); } -// Detect Edge -if (navigator.userAgent.toLowerCase().indexOf('edge') != -1) { - alert( - '現在、お使いのブラウザ(Microsoft Edge)ではMisskeyは正しく動作しません。' + - 'サポートしているブラウザ: Google Chrome, Mozilla Firefox, Apple Safari など' + - '\n\n' + - 'Currently, Misskey cannot run correctly on your browser (Microsoft Edge). ' + - 'Supported browsers: Google Chrome, Mozilla Firefox, Apple Safari, etc'); -} - // Check whether cookie enabled if (!navigator.cookieEnabled) { alert( diff --git a/src/client/assets/code-highlight.css b/src/client/assets/code-highlight.css deleted file mode 100644 index f0807dc9c3..0000000000 --- a/src/client/assets/code-highlight.css +++ /dev/null @@ -1,93 +0,0 @@ -.hljs { - font-family: Consolas, 'Courier New', Courier, Monaco, monospace; -} - -.hljs, -.hljs-subst { - color: #444; -} - -.hljs-comment { - color: #888888; -} - -.hljs-keyword { - color: #2973b7; -} - -.hljs-number { - color: #ae81ff; -} - -.hljs-string { - color: #e96900; -} - -.hljs-regexp { - color: #e9003f; -} - -.hljs-attribute, -.hljs-selector-tag, -.hljs-meta-keyword, -.hljs-doctag, -.hljs-name { - font-weight: bold; -} - -.hljs-type, -.hljs-selector-id, -.hljs-selector-class, -.hljs-quote, -.hljs-template-tag, -.hljs-deletion { - color: #880000; -} - -.hljs-title, -.hljs-section { - color: #880000; - font-weight: bold; -} - -.hljs-symbol, -.hljs-variable, -.hljs-template-variable, -.hljs-link, -.hljs-selector-attr, -.hljs-selector-pseudo { - color: #BC6060; -} - -/* Language color: hue: 90; */ - -.hljs-literal { - color: #78A960; -} - -.hljs-built_in, -.hljs-bullet, -.hljs-code, -.hljs-addition { - color: #397300; -} - -/* Meta color: hue: 200 */ - -.hljs-meta { - color: #1f7199; -} - -.hljs-meta-string { - color: #4d99bf; -} - -/* Misc effects */ - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} From 06a7c2e1386904a7550e9e1b6a2e9ac751eb045e Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 3 Oct 2018 22:14:05 +0900 Subject: [PATCH 475/539] Revert "Enable JSON5 syntax" This reverts commit 6e04549a9b287113cf98aa3e0825647b492b8106. --- .gitattributes | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index e0f637f9e5..58a7812fdf 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,4 +3,3 @@ *.ai -diff -text yarn.lock -diff -text package-lock.json -diff -text -*.json5 linguist-language=JavaScript From 30c0f9869174127f917505fed79194127c1a0eb0 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 3 Oct 2018 22:54:10 +0900 Subject: [PATCH 476/539] Fix bug --- src/models/note.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models/note.ts b/src/models/note.ts index 0efabc97d8..67ee525c31 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -294,7 +294,7 @@ export const pack = async ( } // Populate files - _note.files = Promise.all(_note.fileIds.map((fileId: mongo.ObjectID) => + _note.files = Promise.all((_note.fileIds || []).map((fileId: mongo.ObjectID) => packFile(fileId) )); From 0eefd2922cd5abc5bbc07f100b61176d95c52493 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 3 Oct 2018 22:55:08 +0900 Subject: [PATCH 477/539] 9.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c60bc24fe3..a101d1102e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "9.2.0", + "version": "9.3.0", "clientVersion": "1.0.10062", "codename": "nighthike", "main": "./built/index.js", From d4b8e47bcbbd600e958ef309163595df43fe2d51 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 3 Oct 2018 23:01:47 +0900 Subject: [PATCH 478/539] Fix --- gulpfile.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/gulpfile.ts b/gulpfile.ts index 356996314e..c47d90a1cc 100644 --- a/gulpfile.ts +++ b/gulpfile.ts @@ -2,7 +2,6 @@ * Gulp tasks */ -import * as fs from 'fs'; import * as gulp from 'gulp'; import * as gutil from 'gulp-util'; import * as ts from 'gulp-typescript'; From 7e50646edeb93d7f092caad212b7c7a50fd2553f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Wed, 3 Oct 2018 23:01:58 +0900 Subject: [PATCH 479/539] 9.3.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a101d1102e..3d2c256463 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "9.3.0", + "version": "9.3.1", "clientVersion": "1.0.10062", "codename": "nighthike", "main": "./built/index.js", From baad11288af8ae1b950ecb5a62e23a70bee7d51d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 4 Oct 2018 00:39:11 +0900 Subject: [PATCH 480/539] =?UTF-8?q?=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1?= =?UTF-8?q?=E3=83=B3=E3=83=88=E3=81=8C=E8=A6=8B=E3=81=A4=E3=81=8B=E3=82=89?= =?UTF-8?q?=E3=81=AA=E3=81=8F=E3=81=A6=E3=82=82=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=81=AB=E3=81=9B=E3=81=9Anull=E3=82=92=E8=BF=94=E3=81=99?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/models/note.ts | 17 ++++++++++++++++- src/models/user.ts | 14 ++++++++------ src/server/api/endpoints/notes.ts | 4 ++-- src/server/api/endpoints/notes/conversation.ts | 4 ++-- .../api/endpoints/notes/global-timeline.ts | 4 ++-- .../api/endpoints/notes/hybrid-timeline.ts | 4 ++-- .../api/endpoints/notes/local-timeline.ts | 4 ++-- src/server/api/endpoints/notes/mentions.ts | 4 ++-- src/server/api/endpoints/notes/replies.ts | 4 ++-- src/server/api/endpoints/notes/reposts.ts | 5 ++--- src/server/api/endpoints/notes/search.ts | 4 ++-- src/server/api/endpoints/notes/search_by_tag.ts | 4 ++-- src/server/api/endpoints/notes/timeline.ts | 4 ++-- .../api/endpoints/notes/user-list-timeline.ts | 4 ++-- src/server/api/endpoints/users/notes.ts | 4 ++-- 15 files changed, 50 insertions(+), 34 deletions(-) diff --git a/src/models/note.ts b/src/models/note.ts index 67ee525c31..75518d709f 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -226,6 +226,17 @@ export const hideNote = async (packedNote: any, meId: mongo.ObjectID) => { } }; +export const packMany = async ( + notes: (string | mongo.ObjectID | INote)[], + me?: string | mongo.ObjectID | IUser, + options?: { + detail?: boolean; + skipHide?: boolean; + } +) => { + return (await Promise.all(notes.map(n => pack(n, me, options)))).filter(x => x != null); +}; + /** * Pack a note for API response * @@ -271,7 +282,11 @@ export const pack = async ( _note = deepcopy(note); } - if (!_note) throw `invalid note arg ${note}`; + // 投稿がデータベース上に見つからなかったとき + if (_note == null) { + console.warn(`note not found on database: ${note}`); + return null; + } const id = _note._id; diff --git a/src/models/user.ts b/src/models/user.ts index d2124bda74..3e8aefc4b1 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -3,7 +3,7 @@ const deepcopy = require('deepcopy'); const sequential = require('promise-sequential'); import rap from '@prezzemolo/rap'; import db from '../db/mongodb'; -import Note, { pack as packNote, deleteNote } from './note'; +import Note, { packMany as packNoteMany, deleteNote } from './note'; import Following, { deleteFollowing } from './following'; import Mute, { deleteMute } from './mute'; import { getFriendIds } from '../server/api/common/get-friends'; @@ -361,9 +361,11 @@ export const pack = ( _user = deepcopy(user); } - // TODO: ここでエラーにするのではなくダミーのユーザーデータを返す - // SEE: https://github.com/syuilo/misskey/issues/1432 - if (!_user) return reject('invalid user arg.'); + // ユーザーがデータベース上に見つからなかったとき + if (_user == null) { + console.warn(`user not found on database: ${user}`); + return null; + } // Me const meId: mongo.ObjectID = me @@ -468,9 +470,9 @@ export const pack = ( if (opts.detail) { if (_user.pinnedNoteIds) { // Populate pinned notes - _user.pinnedNotes = Promise.all(_user.pinnedNoteIds.map((id: mongo.ObjectId) => packNote(id, meId, { + _user.pinnedNotes = packNoteMany(_user.pinnedNoteIds, meId, { detail: true - }))); + }); } if (meId && !meId.equals(_user.id)) { diff --git a/src/server/api/endpoints/notes.ts b/src/server/api/endpoints/notes.ts index 5fa58d19de..d65710d33f 100644 --- a/src/server/api/endpoints/notes.ts +++ b/src/server/api/endpoints/notes.ts @@ -1,5 +1,5 @@ import $ from 'cafy'; import ID from '../../../misc/cafy-id'; -import Note, { pack } from '../../../models/note'; +import Note, { packMany } from '../../../models/note'; import getParams from '../get-params'; export const meta = { @@ -116,5 +116,5 @@ export default (params: any) => new Promise(async (res, rej) => { }); // Serialize - res(await Promise.all(notes.map(note => pack(note)))); + res(await packMany(notes)); }); diff --git a/src/server/api/endpoints/notes/conversation.ts b/src/server/api/endpoints/notes/conversation.ts index 2782d14155..0c23f9e5fc 100644 --- a/src/server/api/endpoints/notes/conversation.ts +++ b/src/server/api/endpoints/notes/conversation.ts @@ -1,5 +1,5 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; -import Note, { pack, INote } from '../../../../models/note'; +import Note, { packMany, INote } from '../../../../models/note'; import { ILocalUser } from '../../../../models/user'; /** @@ -52,5 +52,5 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = } // Serialize - res(await Promise.all(conversation.map(note => pack(note, user)))); + res(await packMany(conversation, user)); }); diff --git a/src/server/api/endpoints/notes/global-timeline.ts b/src/server/api/endpoints/notes/global-timeline.ts index 5d93cd78ec..8362143bb2 100644 --- a/src/server/api/endpoints/notes/global-timeline.ts +++ b/src/server/api/endpoints/notes/global-timeline.ts @@ -1,7 +1,7 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; import Note from '../../../../models/note'; import Mute from '../../../../models/mute'; -import { pack } from '../../../../models/note'; +import { packMany } from '../../../../models/note'; import { ILocalUser } from '../../../../models/user'; import getParams from '../../get-params'; import { countIf } from '../../../../prelude/array'; @@ -113,5 +113,5 @@ export default async (params: any, user: ILocalUser) => { }); // Serialize - return await Promise.all(timeline.map(note => pack(note, user))); + return await packMany(timeline, user); }; diff --git a/src/server/api/endpoints/notes/hybrid-timeline.ts b/src/server/api/endpoints/notes/hybrid-timeline.ts index 5e39d8c78a..14b4432b33 100644 --- a/src/server/api/endpoints/notes/hybrid-timeline.ts +++ b/src/server/api/endpoints/notes/hybrid-timeline.ts @@ -2,7 +2,7 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; import Note from '../../../../models/note'; import Mute from '../../../../models/mute'; import { getFriends } from '../../common/get-friends'; -import { pack } from '../../../../models/note'; +import { packMany } from '../../../../models/note'; import { ILocalUser } from '../../../../models/user'; import getParams from '../../get-params'; import { countIf } from '../../../../prelude/array'; @@ -240,5 +240,5 @@ export default async (params: any, user: ILocalUser) => { }); // Serialize - return await Promise.all(timeline.map(note => pack(note, user))); + return await packMany(timeline, user); }; diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts index 505454a82f..8ab07d8ea7 100644 --- a/src/server/api/endpoints/notes/local-timeline.ts +++ b/src/server/api/endpoints/notes/local-timeline.ts @@ -1,7 +1,7 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; import Note from '../../../../models/note'; import Mute from '../../../../models/mute'; -import { pack } from '../../../../models/note'; +import { packMany } from '../../../../models/note'; import { ILocalUser } from '../../../../models/user'; import getParams from '../../get-params'; import { countIf } from '../../../../prelude/array'; @@ -141,5 +141,5 @@ export default async (params: any, user: ILocalUser) => { }); // Serialize - return await Promise.all(timeline.map(note => pack(note, user))); + return await packMany(timeline, user); }; diff --git a/src/server/api/endpoints/notes/mentions.ts b/src/server/api/endpoints/notes/mentions.ts index d8d05b78ec..592a94263d 100644 --- a/src/server/api/endpoints/notes/mentions.ts +++ b/src/server/api/endpoints/notes/mentions.ts @@ -1,7 +1,7 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; import Note from '../../../../models/note'; import { getFriendIds } from '../../common/get-friends'; -import { pack } from '../../../../models/note'; +import { packMany } from '../../../../models/note'; import { ILocalUser } from '../../../../models/user'; import getParams from '../../get-params'; import read from '../../../../services/note/read'; @@ -89,5 +89,5 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = mentions.forEach(note => read(user._id, note._id)); // Serialize - res(await Promise.all(mentions.map(mention => pack(mention, user)))); + res(await packMany(mentions, user)); }); diff --git a/src/server/api/endpoints/notes/replies.ts b/src/server/api/endpoints/notes/replies.ts index 44c80afc4a..b2f8f94f69 100644 --- a/src/server/api/endpoints/notes/replies.ts +++ b/src/server/api/endpoints/notes/replies.ts @@ -1,5 +1,5 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; -import Note, { pack } from '../../../../models/note'; +import Note, { packMany } from '../../../../models/note'; import { ILocalUser } from '../../../../models/user'; /** @@ -30,5 +30,5 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = const ids = (note._replyIds || []).slice(offset, offset + limit); // Serialize - res(await Promise.all(ids.map(id => pack(id, user)))); + res(await packMany(ids, user)); }); diff --git a/src/server/api/endpoints/notes/reposts.ts b/src/server/api/endpoints/notes/reposts.ts index 05e68302ba..2c6e1a499f 100644 --- a/src/server/api/endpoints/notes/reposts.ts +++ b/src/server/api/endpoints/notes/reposts.ts @@ -1,5 +1,5 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; -import Note, { pack } from '../../../../models/note'; +import Note, { packMany } from '../../../../models/note'; import { ILocalUser } from '../../../../models/user'; /** @@ -62,6 +62,5 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = }); // Serialize - res(await Promise.all(renotes.map(async note => - await pack(note, user)))); + res(await packMany(renotes, user)); }); diff --git a/src/server/api/endpoints/notes/search.ts b/src/server/api/endpoints/notes/search.ts index 9124899ad8..2755a70483 100644 --- a/src/server/api/endpoints/notes/search.ts +++ b/src/server/api/endpoints/notes/search.ts @@ -2,7 +2,7 @@ import $ from 'cafy'; import * as mongo from 'mongodb'; import Note from '../../../../models/note'; import { ILocalUser } from '../../../../models/user'; -import { pack } from '../../../../models/note'; +import { packMany } from '../../../../models/note'; import es from '../../../../db/elasticsearch'; export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => { @@ -60,6 +60,6 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => } }); - res(await Promise.all(notes.map(note => pack(note, me)))); + res(await packMany(notes, me)); }); }); diff --git a/src/server/api/endpoints/notes/search_by_tag.ts b/src/server/api/endpoints/notes/search_by_tag.ts index 0703210017..d380f27f9c 100644 --- a/src/server/api/endpoints/notes/search_by_tag.ts +++ b/src/server/api/endpoints/notes/search_by_tag.ts @@ -3,7 +3,7 @@ import Note from '../../../../models/note'; import User, { ILocalUser } from '../../../../models/user'; import Mute from '../../../../models/mute'; import { getFriendIds } from '../../common/get-friends'; -import { pack } from '../../../../models/note'; +import { packMany } from '../../../../models/note'; import getParams from '../../get-params'; import { erase } from '../../../../prelude/array'; @@ -363,5 +363,5 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => }); // Serialize - res(await Promise.all(notes.map(note => pack(note, me)))); + res(await packMany(notes, me)); }); diff --git a/src/server/api/endpoints/notes/timeline.ts b/src/server/api/endpoints/notes/timeline.ts index 5f3844987c..44a504eb18 100644 --- a/src/server/api/endpoints/notes/timeline.ts +++ b/src/server/api/endpoints/notes/timeline.ts @@ -2,7 +2,7 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; import Note from '../../../../models/note'; import Mute from '../../../../models/mute'; import { getFriends } from '../../common/get-friends'; -import { pack } from '../../../../models/note'; +import { packMany } from '../../../../models/note'; import { ILocalUser } from '../../../../models/user'; import getParams from '../../get-params'; import { countIf } from '../../../../prelude/array'; @@ -237,5 +237,5 @@ export default async (params: any, user: ILocalUser) => { }); // Serialize - return await Promise.all(timeline.map(note => pack(note, user))); + return await packMany(timeline, user); }; diff --git a/src/server/api/endpoints/notes/user-list-timeline.ts b/src/server/api/endpoints/notes/user-list-timeline.ts index 61192d7d3e..6758b4eb73 100644 --- a/src/server/api/endpoints/notes/user-list-timeline.ts +++ b/src/server/api/endpoints/notes/user-list-timeline.ts @@ -1,7 +1,7 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; import Note from '../../../../models/note'; import Mute from '../../../../models/mute'; -import { pack } from '../../../../models/note'; +import { packMany } from '../../../../models/note'; import UserList from '../../../../models/user-list'; import { ILocalUser } from '../../../../models/user'; import getParams from '../../get-params'; @@ -242,5 +242,5 @@ export default async (params: any, user: ILocalUser) => { }); // Serialize - return await Promise.all(timeline.map(note => pack(note, user))); + return await packMany(timeline, user); }; diff --git a/src/server/api/endpoints/users/notes.ts b/src/server/api/endpoints/users/notes.ts index 1ab7786a18..1bfe832c51 100644 --- a/src/server/api/endpoints/users/notes.ts +++ b/src/server/api/endpoints/users/notes.ts @@ -1,6 +1,6 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; import getHostLower from '../../common/get-host-lower'; -import Note, { pack } from '../../../../models/note'; +import Note, { packMany } from '../../../../models/note'; import User, { ILocalUser } from '../../../../models/user'; import getParams from '../../get-params'; import { countIf } from '../../../../prelude/array'; @@ -181,5 +181,5 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => }); // Serialize - res(await Promise.all(notes.map(note => pack(note, me)))); + res(await packMany(notes, me)); }); From 80105239dc3d506d87b4a5ea313ee1af55ef2f3f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 4 Oct 2018 00:39:48 +0900 Subject: [PATCH 481/539] 9.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3d2c256463..30e5d84627 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "9.3.1", + "version": "9.4.0", "clientVersion": "1.0.10062", "codename": "nighthike", "main": "./built/index.js", From f0115a5e21bb98708668aa139051338d5e2d007a Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Thu, 4 Oct 2018 12:45:47 +0900 Subject: [PATCH 482/539] fix(package): update webpack to version 4.20.2 (#2814) Closes #2768 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 30e5d84627..49a62d8552 100644 --- a/package.json +++ b/package.json @@ -225,7 +225,7 @@ "vuex-persistedstate": "2.5.4", "web-push": "3.3.3", "webfinger.js": "2.6.6", - "webpack": "4.19.1", + "webpack": "4.20.2", "webpack-cli": "3.1.0", "websocket": "1.0.28", "ws": "6.0.0", From a85efa1392c78d96869b91f0007ee87b55298adc Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Thu, 4 Oct 2018 12:48:52 +0900 Subject: [PATCH 483/539] fix(package): update gulp-htmlmin to version 5.0.1 (#2815) Closes #2669 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 49a62d8552..ede154331b 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "fuckadblock": "3.2.1", "gulp": "3.9.1", "gulp-cssnano": "2.1.3", - "gulp-htmlmin": "4.0.0", + "gulp-htmlmin": "5.0.1", "gulp-imagemin": "4.1.0", "gulp-mocha": "6.0.0", "gulp-pug": "4.0.1", From 436962e4b8f53994ca9fb3254d84b64ec0d68eda Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Thu, 4 Oct 2018 12:49:05 +0900 Subject: [PATCH 484/539] fix(package): update nan to version 2.11.1 (#2784) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ede154331b..42cb8609da 100644 --- a/package.json +++ b/package.json @@ -159,7 +159,7 @@ "mongodb": "3.1.1", "monk": "6.0.6", "ms": "2.1.1", - "nan": "2.11.0", + "nan": "2.11.1", "nested-property": "0.0.7", "nprogress": "0.2.0", "object-assign-deep": "0.4.0", From 4105237027cfed92f1f7c187a9922d24a856fb55 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Thu, 4 Oct 2018 12:49:38 +0900 Subject: [PATCH 485/539] fix(package): update koa-mount to version 4.0.0 (#2776) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 42cb8609da..997de25e73 100644 --- a/package.json +++ b/package.json @@ -142,7 +142,7 @@ "koa-favicon": "2.0.1", "koa-json-body": "5.3.0", "koa-logger": "3.2.0", - "koa-mount": "3.0.0", + "koa-mount": "4.0.0", "koa-multer": "1.0.2", "koa-router": "7.4.0", "koa-send": "5.0.0", From d53689332f106461b2191fcfbe1d0053fefd99df Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Thu, 4 Oct 2018 12:49:56 +0900 Subject: [PATCH 486/539] fix(package): update diskusage to version 0.2.5 (#2767) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 997de25e73..89c22f4172 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "debug": "4.0.1", "deep-equal": "1.0.1", "deepcopy": "0.6.3", - "diskusage": "0.2.4", + "diskusage": "0.2.5", "dompurify": "1.0.5", "double-ended-queue": "2.1.0-0", "elasticsearch": "15.1.1", From cf66343b31f45dfaa1a73ac36019d3e323200ec4 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Thu, 4 Oct 2018 12:50:25 +0900 Subject: [PATCH 487/539] fix(package): update qrcode to version 1.3.0 (#2799) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 89c22f4172..70383b6ac2 100644 --- a/package.json +++ b/package.json @@ -171,7 +171,7 @@ "promise-sequential": "1.1.1", "pug": "2.0.3", "punycode": "2.1.1", - "qrcode": "1.2.2", + "qrcode": "1.3.0", "ratelimiter": "3.2.0", "recaptcha-promise": "0.1.3", "reconnecting-websocket": "3.2.2", From d6f6c2672521b650f456af023769b4c0173734dc Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Thu, 4 Oct 2018 12:50:32 +0900 Subject: [PATCH 488/539] fix(package): update @types/qrcode to version 1.3.0 (#2813) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 70383b6ac2..22a4dbc00b 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "@types/node": "10.10.3", "@types/portscanner": "2.1.0", "@types/pug": "2.0.4", - "@types/qrcode": "1.2.0", + "@types/qrcode": "1.3.0", "@types/ratelimiter": "2.1.28", "@types/redis": "2.8.6", "@types/request": "2.47.1", From 8b7e6b200efc83681dc5e53aac737e38c067fd27 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Thu, 4 Oct 2018 12:51:19 +0900 Subject: [PATCH 489/539] fix(package): update jsdom to version 12.1.0 (#2788) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 22a4dbc00b..d8dfa4d689 100644 --- a/package.json +++ b/package.json @@ -133,7 +133,7 @@ "is-root": "2.0.0", "is-url": "1.2.4", "js-yaml": "3.12.0", - "jsdom": "11.12.0", + "jsdom": "12.1.0", "json5": "2.1.0", "json5-loader": "1.0.1", "koa": "2.5.1", From a0278154a3cfc9d17e0a6e0013d24d058f162f48 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Thu, 4 Oct 2018 12:52:27 +0900 Subject: [PATCH 490/539] fix(package): update webpack-cli to version 3.1.2 (#2816) Closes #2757 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d8dfa4d689..987020b9a3 100644 --- a/package.json +++ b/package.json @@ -225,8 +225,8 @@ "vuex-persistedstate": "2.5.4", "web-push": "3.3.3", "webfinger.js": "2.6.6", + "webpack-cli": "3.1.2", "webpack": "4.20.2", - "webpack-cli": "3.1.0", "websocket": "1.0.28", "ws": "6.0.0", "xev": "2.0.1" From 44f86a94f4ec99c95755791fdaaeed9ff5967e26 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Thu, 4 Oct 2018 12:52:57 +0900 Subject: [PATCH 491/539] fix(package): update @types/node to version 10.11.4 (#2817) Closes #2765 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 987020b9a3..96d41e4576 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "@types/mocha": "5.2.3", "@types/mongodb": "3.1.7", "@types/ms": "0.7.30", - "@types/node": "10.10.3", + "@types/node": "10.11.4", "@types/portscanner": "2.1.0", "@types/pug": "2.0.4", "@types/qrcode": "1.3.0", From 4ab0dbe7e3ebf77d2030e6e1c097f7040cb4ac4e Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Thu, 4 Oct 2018 12:53:17 +0900 Subject: [PATCH 492/539] fix(package): update @types/webpack to version 4.4.14 (#2818) Closes #2778 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 96d41e4576..6b123bc533 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "@types/tinycolor2": "1.4.1", "@types/tmp": "0.0.33", "@types/uuid": "3.4.4", - "@types/webpack": "4.4.12", + "@types/webpack": "4.4.14", "@types/webpack-stream": "3.2.10", "@types/websocket": "0.0.40", "@types/ws": "6.0.1", From c1ef1bf605653964384a0e1a50a072e1d825ee05 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Thu, 4 Oct 2018 12:53:50 +0900 Subject: [PATCH 493/539] fix(package): update typescript-eslint-parser to version 19.0.2 (#2819) Closes #2772 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6b123bc533..e808609881 100644 --- a/package.json +++ b/package.json @@ -203,7 +203,7 @@ "ts-node": "7.0.1", "tslint": "5.10.0", "typescript": "2.9.2", - "typescript-eslint-parser": "18.0.0", + "typescript-eslint-parser": "19.0.2", "uglify-es": "3.3.9", "url-loader": "1.1.1", "uuid": "3.3.2", From e8afa2c940ec967dda18c0f87cacdb42d8311ca5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 4 Oct 2018 13:33:59 +0900 Subject: [PATCH 494/539] Improve pack function of favorite --- src/models/favorite.ts | 13 +++++++++++++ src/server/api/endpoints/i/favorites.ts | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/models/favorite.ts b/src/models/favorite.ts index b2d2fc93e8..2c07959be7 100644 --- a/src/models/favorite.ts +++ b/src/models/favorite.ts @@ -41,6 +41,13 @@ export async function deleteFavorite(favorite: string | mongo.ObjectID | IFavori }); } +export const packMany = async ( + favorites: any[], + me: any +) => { + return (await Promise.all(favorites.map(f => pack(f, me)))).filter(x => x != null); +}; + /** * Pack a favorite for API response */ @@ -70,5 +77,11 @@ export const pack = ( // Populate note _favorite.note = await packNote(_favorite.noteId, me); + // (データベースの不具合などで)投稿が見つからなかったら + if (_favorite.note == null) { + console.warn(`favorite: note not found on database: ${_favorite.noteId}`); + return resolve(null); + } + resolve(_favorite); }); diff --git a/src/server/api/endpoints/i/favorites.ts b/src/server/api/endpoints/i/favorites.ts index 32c1a55fb0..e7cf8a71a7 100644 --- a/src/server/api/endpoints/i/favorites.ts +++ b/src/server/api/endpoints/i/favorites.ts @@ -1,5 +1,5 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; -import Favorite, { pack } from '../../../../models/favorite'; +import Favorite, { packMany } from '../../../../models/favorite'; import { ILocalUser } from '../../../../models/user'; export const meta = { @@ -55,5 +55,5 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = .find(query, { limit, sort }); // Serialize - res(await Promise.all(favorites.map(favorite => pack(favorite, user)))); + res(await packMany(favorites, user)); }); From 546d494587841afebe910f58d92b48fc6ad89a2d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 4 Oct 2018 13:40:13 +0900 Subject: [PATCH 495/539] Improve default theme definition (light) --- src/client/theme/light.json5 | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/client/theme/light.json5 b/src/client/theme/light.json5 index 1e795ee8c5..90d0d40187 100644 --- a/src/client/theme/light.json5 +++ b/src/client/theme/light.json5 @@ -23,13 +23,13 @@ scrollbarHandleHover: '#00000066', face: '$secondary', - faceText: '#444', + faceText: '$text', faceHeader: ':lighten<5<$secondary', - faceHeaderText: '#888', + faceHeaderText: '$text', faceDivider: 'rgba(0, 0, 0, 0.082)', - faceTextButton: '#ccc', - faceTextButtonHover: '#aaa', - faceTextButtonActive: '#999', + faceTextButton: ':alpha<0.7<$text', + faceTextButtonHover: ':alpha<0.7<:darken<7<$text', + faceTextButtonActive: ':alpha<0.7<:darken<10<$text', faceClearButtonHover: 'rgba(0, 0, 0, 0.025)', faceClearButtonActive: 'rgba(0, 0, 0, 0.05)', popupBg: ':lighten<5<$secondary', @@ -40,7 +40,7 @@ renoteGradient: '#edfde2', renoteText: '#9dbb00', quoteBorder: '#c0dac6', - noteText: '#717171', + noteText: '$text', noteHeaderName: ':darken<2<$text', noteHeaderBadgeFg: '#aaa', noteHeaderBadgeBg: 'rgba(0, 0, 0, 0.05)', @@ -141,7 +141,7 @@ desktopHeaderBg: ':lighten<5<$secondary', desktopHeaderFg: '$text', - desktopHeaderHoverFg: '#7b8c88', + desktopHeaderHoverFg: ':darken<7<$text', desktopHeaderSearchBg: 'rgba(0, 0, 0, 0.05)', desktopHeaderSearchHoverBg: 'rgba(0, 0, 0, 0.08)', desktopHeaderSearchFg: '#000', @@ -156,9 +156,9 @@ desktopPostFormTransparentButtonActiveGradientEnd: ':lighten<33<$primary', desktopRenoteFormFooter: ':lighten<33<$primary', desktopTimelineHeaderShadow: 'rgba(0, 0, 0, 0.08)', - desktopTimelineSrc: '#6f7477', - desktopTimelineSrcHover: '#525a5f', - desktopWindowTitle: '#666', + desktopTimelineSrc: '$text', + desktopTimelineSrcHover: ':darken<7<$text', + desktopWindowTitle: '$text', desktopWindowShadow: 'rgba(0, 0, 0, 0.2)', desktopDriveBg: '#fff', desktopDriveFolderBg: ':lighten<31<$primary', From 35489ef5b7dde1ffda11cb1ab83fc26c17e41196 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 4 Oct 2018 13:48:26 +0900 Subject: [PATCH 496/539] Improve default theme definition (dark) --- src/client/theme/dark.json5 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/client/theme/dark.json5 b/src/client/theme/dark.json5 index 2042bd7931..72362a2305 100644 --- a/src/client/theme/dark.json5 +++ b/src/client/theme/dark.json5 @@ -46,15 +46,15 @@ noteHeaderBadgeBg: 'rgba(0, 0, 0, 0.25)', noteHeaderAdminFg: '#f15f71', noteHeaderAdminBg: '#5d282e', - noteHeaderAcct: '#606984', - noteHeaderInfo: '#606984', + noteHeaderAcct: ':alpha<0.65<$text', + noteHeaderInfo: ':alpha<0.5<$text', - noteActions: '#606984', - noteActionsHover: '#a1a8bf', + noteActions: ':alpha<0.45<$text', + noteActionsHover: ':alpha<0.6<$text', noteActionsReplyHover: '#0af', noteActionsRenoteHover: '#8d0', noteActionsReactionHover: '#fa0', - noteActionsHighlighted: '#707b97', + noteActionsHighlighted: ':alpha<0.7<$text', noteAttachedFile: 'rgba(255, 255, 255, 0.1)', From fce7dc0f4e69053c7306289189b4fa4891f57339 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 4 Oct 2018 13:53:48 +0900 Subject: [PATCH 497/539] Improve error handling of pack function of notification --- src/models/favorite.ts | 2 +- src/models/notification.ts | 12 ++++++++++++ src/server/api/endpoints/i/notifications.ts | 4 ++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/models/favorite.ts b/src/models/favorite.ts index 2c07959be7..2c10674bcb 100644 --- a/src/models/favorite.ts +++ b/src/models/favorite.ts @@ -79,7 +79,7 @@ export const pack = ( // (データベースの不具合などで)投稿が見つからなかったら if (_favorite.note == null) { - console.warn(`favorite: note not found on database: ${_favorite.noteId}`); + console.warn(`in packaging favorite: note not found on database: ${_favorite.noteId}`); return resolve(null); } diff --git a/src/models/notification.ts b/src/models/notification.ts index 835c89cd56..57be4bef10 100644 --- a/src/models/notification.ts +++ b/src/models/notification.ts @@ -77,6 +77,12 @@ export async function deleteNotification(notification: string | mongo.ObjectID | }); } +export const packMany = async ( + notifications: any[] +) => { + return (await Promise.all(notifications.map(n => pack(n)))).filter(x => x != null); +}; + /** * Pack a notification for API response */ @@ -123,6 +129,12 @@ export const pack = (notification: any) => new Promise<any>(async (resolve, reje case 'poll_vote': // Populate note _notification.note = await packNote(_notification.noteId, me); + + // (データベースの不具合などで)投稿が見つからなかったら + if (_notification.note == null) { + console.warn(`in packaging notification: note not found on database: ${_notification.noteId}`); + return resolve(null); + } break; default: console.error(`Unknown type: ${_notification.type}`); diff --git a/src/server/api/endpoints/i/notifications.ts b/src/server/api/endpoints/i/notifications.ts index 46242b9d9f..5cc836e362 100644 --- a/src/server/api/endpoints/i/notifications.ts +++ b/src/server/api/endpoints/i/notifications.ts @@ -1,7 +1,7 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; import Notification from '../../../../models/notification'; import Mute from '../../../../models/mute'; -import { pack } from '../../../../models/notification'; +import { packMany } from '../../../../models/notification'; import { getFriendIds } from '../../common/get-friends'; import read from '../../common/read-notification'; import { ILocalUser } from '../../../../models/user'; @@ -83,7 +83,7 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = }); // Serialize - res(await Promise.all(notifications.map(notification => pack(notification)))); + res(await packMany(notifications)); // Mark all as read if (notifications.length > 0 && markAsRead) { From 401d0b1298ddfc0ef6391105f75ea98285afb08d Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Thu, 4 Oct 2018 13:55:25 +0900 Subject: [PATCH 498/539] 9.5.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e808609881..8e0a8e6250 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "9.4.0", - "clientVersion": "1.0.10062", + "version": "9.5.0", + "clientVersion": "1.0.10090", "codename": "nighthike", "main": "./built/index.js", "private": true, From baf9b658018e6b7d4bc2645eef871e9a57ef23db Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 5 Oct 2018 01:43:47 +0900 Subject: [PATCH 499/539] Improve error handling of packaging functions --- package.json | 2 +- src/models/drive-file.ts | 15 ++++++++++++++- src/models/note.ts | 12 ++++++++---- src/models/user.ts | 2 +- src/server/api/endpoints/drive/files.ts | 5 ++--- src/server/api/endpoints/drive/stream.ts | 4 ++-- 6 files changed, 28 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 8e0a8e6250..e04d9d8b4e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "9.5.0", + "version": "9.6.0", "clientVersion": "1.0.10090", "codename": "nighthike", "main": "./built/index.js", diff --git a/src/models/drive-file.ts b/src/models/drive-file.ts index 215b49b305..c11121126f 100644 --- a/src/models/drive-file.ts +++ b/src/models/drive-file.ts @@ -127,6 +127,15 @@ export async function deleteDriveFile(driveFile: string | mongo.ObjectID | IDriv }); } +export const packMany = async ( + files: any[], + options?: { + detail: boolean + } +) => { + return (await Promise.all(files.map(f => pack(f, options)))).filter(x => x != null); +}; + /** * Pack a drive file for API response */ @@ -155,7 +164,11 @@ export const pack = ( _file = deepcopy(file); } - if (!_file) return reject('invalid file arg.'); + // (データベースの欠損などで)ファイルがデータベース上に見つからなかったとき + if (_file == null) { + console.warn(`in packaging driveFile: driveFile not found on database: ${_file}`); + return null; + } // rendered target let _target: any = {}; diff --git a/src/models/note.ts b/src/models/note.ts index 75518d709f..43b8753195 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -7,7 +7,7 @@ import { IUser, pack as packUser } from './user'; import { pack as packApp } from './app'; import PollVote, { deletePollVote } from './poll-vote'; import Reaction, { deleteNoteReaction } from './note-reaction'; -import { pack as packFile, IDriveFile } from './drive-file'; +import { packMany as packFileMany, IDriveFile } from './drive-file'; import NoteWatching, { deleteNoteWatching } from './note-watching'; import NoteReaction from './note-reaction'; import Favorite, { deleteFavorite } from './favorite'; @@ -309,9 +309,7 @@ export const pack = async ( } // Populate files - _note.files = Promise.all((_note.fileIds || []).map((fileId: mongo.ObjectID) => - packFile(fileId) - )); + _note.files = packFileMany(_note.fileIds || []); // 後方互換性のため _note.mediaIds = _note.fileIds; @@ -380,6 +378,12 @@ export const pack = async ( // resolve promises in _note object _note = await rap(_note); + // (データベースの欠損などで)ユーザーがデータベース上に見つからなかったとき + if (_note.user == null) { + console.warn(`in packaging note: note user not found on database: note(${_note.id})`); + return null; + } + if (_note.user.isCat && _note.text) { _note.text = _note.text.replace(/な/g, 'にゃ').replace(/ナ/g, 'ニャ').replace(/ナ/g, 'ニャ'); } diff --git a/src/models/user.ts b/src/models/user.ts index 3e8aefc4b1..642a993f65 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -361,7 +361,7 @@ export const pack = ( _user = deepcopy(user); } - // ユーザーがデータベース上に見つからなかったとき + // (データベースの欠損などで)ユーザーがデータベース上に見つからなかったとき if (_user == null) { console.warn(`user not found on database: ${user}`); return null; diff --git a/src/server/api/endpoints/drive/files.ts b/src/server/api/endpoints/drive/files.ts index dc6a602e10..de0bde086b 100644 --- a/src/server/api/endpoints/drive/files.ts +++ b/src/server/api/endpoints/drive/files.ts @@ -1,5 +1,5 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; -import DriveFile, { pack } from '../../../../models/drive-file'; +import DriveFile, { packMany } from '../../../../models/drive-file'; import { ILocalUser } from '../../../../models/user'; export const meta = { @@ -73,6 +73,5 @@ export default async (params: any, user: ILocalUser) => { }); // Serialize - const _files = await Promise.all(files.map(file => pack(file))); - return _files; + return await packMany(files); }; diff --git a/src/server/api/endpoints/drive/stream.ts b/src/server/api/endpoints/drive/stream.ts index a9f3f7e9a5..3ac7dd0234 100644 --- a/src/server/api/endpoints/drive/stream.ts +++ b/src/server/api/endpoints/drive/stream.ts @@ -1,5 +1,5 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; -import DriveFile, { pack } from '../../../../models/drive-file'; +import DriveFile, { packMany } from '../../../../models/drive-file'; import { ILocalUser } from '../../../../models/user'; export const meta = { @@ -63,5 +63,5 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = }); // Serialize - res(await Promise.all(files.map(file => pack(file)))); + res(await packMany(files)); }); From f243ce66e77d2a2eeee08d160b9d764c2d1084d5 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Fri, 5 Oct 2018 01:58:41 +0900 Subject: [PATCH 500/539] =?UTF-8?q?ActivityPub=E3=81=AEHTTP=E3=83=AA?= =?UTF-8?q?=E3=82=AF=E3=82=A8=E3=82=B9=E3=83=88=E3=81=AE=E5=BC=B7=E5=8C=96?= =?UTF-8?q?=20(#2820)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix error handling in AP deliver * Set timeout to resolver * Tune looks --- src/queue/processors/http/deliver.ts | 23 +++++++++++------------ src/remote/activitypub/request.ts | 12 +++++++++++- src/remote/activitypub/resolver.ts | 2 ++ 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/queue/processors/http/deliver.ts b/src/queue/processors/http/deliver.ts index e14a162105..621219fec6 100644 --- a/src/queue/processors/http/deliver.ts +++ b/src/queue/processors/http/deliver.ts @@ -7,19 +7,18 @@ export default async (job: bq.Job, done: any): Promise<void> => { await request(job.data.user, job.data.to, job.data.content); done(); } catch (res) { - if (res == null || !res.hasOwnProperty('statusCode')) { - console.warn(`deliver failed (unknown): ${res}`); - return done(); - } - - if (res.statusCode == null) return done(); - if (res.statusCode >= 400 && res.statusCode < 500) { - // HTTPステータスコード4xxはクライアントエラーであり、それはつまり - // 何回再送しても成功することはないということなのでエラーにはしないでおく - done(); + if (res != null && res.hasOwnProperty('statusCode')) { + if (res.statusCode >= 400 && res.statusCode < 500) { + // HTTPステータスコード4xxはクライアントエラーであり、それはつまり + // 何回再送しても成功することはないということなのでエラーにはしないでおく + done(); + } else { + console.warn(`deliver failed: ${res.statusCode} ${res.statusMessage} to=${job.data.to}`); + done(res.statusMessage); + } } else { - console.warn(`deliver failed: ${res.statusMessage}`); - done(res.statusMessage); + console.warn(`deliver failed: ${res} to=${job.data.to}`); + done(); } } }; diff --git a/src/remote/activitypub/request.ts b/src/remote/activitypub/request.ts index 07f0ecca8b..177b6f458e 100644 --- a/src/remote/activitypub/request.ts +++ b/src/remote/activitypub/request.ts @@ -12,6 +12,8 @@ const log = debug('misskey:activitypub:deliver'); export default (user: ILocalUser, url: string, object: any) => new Promise((resolve, reject) => { log(`--> ${url}`); + const timeout = 10 * 1000; + const { protocol, hostname, port, pathname, search } = new URL(url); const data = JSON.stringify(object); @@ -26,6 +28,7 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso port, method: 'POST', path: pathname + search, + timeout, headers: { 'User-Agent': config.user_agent, 'Content-Type': 'application/activity+json', @@ -35,7 +38,7 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso log(`${url} --> ${res.statusCode}`); if (res.statusCode >= 400) { - reject(); + reject(res); } else { resolve(); } @@ -53,5 +56,12 @@ export default (user: ILocalUser, url: string, object: any) => new Promise((reso sig = sig.replace(/^Signature /, ''); req.setHeader('Signature', sig); + req.on('timeout', () => req.abort()); + + req.on('error', e => { + if (req.aborted) reject('timeout'); + reject(e); + }); + req.end(data); }); diff --git a/src/remote/activitypub/resolver.ts b/src/remote/activitypub/resolver.ts index 215e5e8704..ff26971758 100644 --- a/src/remote/activitypub/resolver.ts +++ b/src/remote/activitypub/resolver.ts @@ -7,6 +7,7 @@ const log = debug('misskey:activitypub:resolver'); export default class Resolver { private history: Set<string>; + private timeout = 10 * 1000; constructor() { this.history = new Set(); @@ -50,6 +51,7 @@ export default class Resolver { const object = await request({ url: value, + timeout: this.timeout, headers: { 'User-Agent': config.user_agent, Accept: 'application/activity+json, application/ld+json' From 11b84a04b3f81c4717d9a0fd7c78ffb2fa13fa03 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 5 Oct 2018 01:59:26 +0900 Subject: [PATCH 501/539] 9.7.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e04d9d8b4e..c5583c5a1f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "9.6.0", + "version": "9.7.0", "clientVersion": "1.0.10090", "codename": "nighthike", "main": "./built/index.js", From d2aca3c28b97bc92d77e14fcc04dfc8c8c95823f Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Fri, 5 Oct 2018 02:43:54 +0900 Subject: [PATCH 502/539] fix(package): update vue-svg-inline-loader to version 1.1.4 (#2821) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c5583c5a1f..92d8fcd100 100644 --- a/package.json +++ b/package.json @@ -217,7 +217,7 @@ "vue-loader": "15.4.2", "vue-router": "3.0.1", "vue-style-loader": "4.1.2", - "vue-svg-inline-loader": "1.1.3", + "vue-svg-inline-loader": "1.1.4", "vue-template-compiler": "2.5.17", "vuedraggable": "2.16.0", "vuewordcloud": "18.7.11", From 02e7e3b9712b1c30f2183952c3325ef2ebe6ea21 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Fri, 5 Oct 2018 03:21:45 +0900 Subject: [PATCH 503/539] Clean up --- .../app/desktop/views/pages/admin/admin.announcements.vue | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/client/app/desktop/views/pages/admin/admin.announcements.vue b/src/client/app/desktop/views/pages/admin/admin.announcements.vue index 722fa227cf..5c1ed74b29 100644 --- a/src/client/app/desktop/views/pages/admin/admin.announcements.vue +++ b/src/client/app/desktop/views/pages/admin/admin.announcements.vue @@ -44,8 +44,6 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - .qldxjjsrseehkusjuoooapmsprvfrxyl textarea width 100% From 4794748c73f83377a5664fce6eb8f7413bbaaf95 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 5 Oct 2018 04:50:23 +0900 Subject: [PATCH 504/539] Fix bug --- src/models/drive-file.ts | 2 +- src/models/user.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/models/drive-file.ts b/src/models/drive-file.ts index c11121126f..0d0886ad0b 100644 --- a/src/models/drive-file.ts +++ b/src/models/drive-file.ts @@ -167,7 +167,7 @@ export const pack = ( // (データベースの欠損などで)ファイルがデータベース上に見つからなかったとき if (_file == null) { console.warn(`in packaging driveFile: driveFile not found on database: ${_file}`); - return null; + return resolve(null); } // rendered target diff --git a/src/models/user.ts b/src/models/user.ts index 642a993f65..e0ce561421 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -364,7 +364,7 @@ export const pack = ( // (データベースの欠損などで)ユーザーがデータベース上に見つからなかったとき if (_user == null) { console.warn(`user not found on database: ${user}`); - return null; + return resolve(null); } // Me From e5591618ee397be8c824e027662a1fe8450a3f63 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 5 Oct 2018 04:50:50 +0900 Subject: [PATCH 505/539] 9.7.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 92d8fcd100..27bf5c0f13 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <i@syuilo.com>", - "version": "9.7.0", + "version": "9.7.1", "clientVersion": "1.0.10090", "codename": "nighthike", "main": "./built/index.js", From 63a8d556e513bef14ff941edb06e120fc784227c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 5 Oct 2018 12:10:00 +0900 Subject: [PATCH 506/539] :art: --- .../views/components/drive.file-detail.vue | 30 +++---------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/src/client/app/mobile/views/components/drive.file-detail.vue b/src/client/app/mobile/views/components/drive.file-detail.vue index de46297fcb..7425afe1e2 100644 --- a/src/client/app/mobile/views/components/drive.file-detail.vue +++ b/src/client/app/mobile/views/components/drive.file-detail.vue @@ -38,10 +38,10 @@ </div> <div class="menu"> <div> - <a :href="`${file.url}?download`" :download="file.name">%fa:download%%i18n:@download%</a> - <button @click="rename">%fa:pencil-alt%%i18n:@rename%</button> - <button @click="move">%fa:R folder-open%%i18n:@move%</button> - <button @click="del">%fa:trash-alt R%%i18n:@delete%</button> + <ui-button link :href="`${file.url}?download`" :download="file.name">%fa:download% %i18n:@download%</ui-button> + <ui-button @click="rename">%fa:pencil-alt% %i18n:@rename%</ui-button> + <ui-button @click="move">%fa:R folder-open% %i18n:@move%</ui-button> + <ui-button @click="del">%fa:trash-alt R% %i18n:@delete%</ui-button> </div> </div> <div class="exif" v-show="exif"> @@ -205,28 +205,6 @@ export default Vue.extend({ max-width 500px margin 0 auto - > * - display block - width 100% - padding 10px 16px - margin 0 0 12px 0 - color var(--primaryForeground) - font-size 0.9em - text-align center - text-decoration none - background var(--primary) - border none - border-radius 3px - - &:last-child - margin-bottom 0 - - &:active - background var(--primaryDarken10) - - > [data-fa] - margin-right 4px - > .hash padding 14px border-top solid 1px var(--faceDivider) From 48e4dc75f43c0682421b865a7a142d5062ef38d4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Fri, 5 Oct 2018 19:13:59 +0900 Subject: [PATCH 507/539] Better japanese --- locales/ja-JP.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 62c6355c3b..99c865e2b5 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -564,13 +564,13 @@ desktop/views/components/charts.vue: notes: "投稿の増減 (統合)" local-notes: "投稿の増減 (ローカル)" remote-notes: "投稿の増減 (リモート)" - notes-total: "投稿の累計" + notes-total: "投稿の積算" users: "ユーザーの増減" - users-total: "ユーザーの累計" + users-total: "ユーザーの積算" drive: "ドライブ使用量の増減" - drive-total: "ドライブ使用量の累計" + drive-total: "ドライブ使用量の積算" drive-files: "ドライブのファイル数の増減" - drive-files-total: "ドライブのファイル数の累計" + drive-files-total: "ドライブのファイル数の積算" network-requests: "リクエスト" network-time: "応答時間" network-usage: "通信量" From 0b98a2364b22d882df70a5829ef01eedc634cf94 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Sat, 6 Oct 2018 20:36:11 +0900 Subject: [PATCH 508/539] =?UTF-8?q?Fix=20=E3=81=8A=E7=9F=A5=E3=82=89?= =?UTF-8?q?=E3=81=9B=E3=81=8C=E7=A2=BA=E8=AA=8D=E4=B8=AD...=E3=81=AE?= =?UTF-8?q?=E3=81=BE=E3=81=BE=E3=81=AB=E3=81=AA=E3=82=8B(Announcement=20Fe?= =?UTF-8?q?tching...)=20(#2831)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/api/endpoints/meta.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api/endpoints/meta.ts b/src/server/api/endpoints/meta.ts index 9baf3c252f..c76d7f2e8f 100644 --- a/src/server/api/endpoints/meta.ts +++ b/src/server/api/endpoints/meta.ts @@ -32,7 +32,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => model: os.cpus()[0].model, cores: os.cpus().length }, - broadcasts: meta.broadcasts, + broadcasts: meta.broadcasts || [], disableRegistration: meta.disableRegistration, disableLocalTimeline: meta.disableLocalTimeline, driveCapacityPerLocalUserMb: config.localDriveCapacityMb, From d0570d7fe3a3bf3c6b0312dece74bacc04c3534a Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Sun, 7 Oct 2018 11:06:17 +0900 Subject: [PATCH 509/539] V10 (#2826) * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * Update CHANGELOG.md * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * Update CHANGELOG.md * Update CHANGELOG.md * wip * Update CHANGELOG.md * wip * wip * wip * wip --- CHANGELOG.md | 82 +++++ package.json | 3 +- .../common/scripts/compose-notification.ts | 6 +- .../app/common/scripts/note-subscriber.ts | 105 ++++++ src/client/app/common/scripts/stream.ts | 318 +++++++++++++++++ .../app/common/scripts/streaming/drive.ts | 34 -- .../streaming/games/reversi/reversi-game.ts | 13 - .../streaming/games/reversi/reversi.ts | 31 -- .../scripts/streaming/global-timeline.ts | 34 -- .../app/common/scripts/streaming/hashtag.ts | 13 - .../app/common/scripts/streaming/home.ts | 126 ------- .../scripts/streaming/hybrid-timeline.ts | 34 -- .../scripts/streaming/local-timeline.ts | 34 -- .../scripts/streaming/messaging-index.ts | 34 -- .../app/common/scripts/streaming/messaging.ts | 20 -- .../common/scripts/streaming/notes-stats.ts | 30 -- .../common/scripts/streaming/server-stats.ts | 30 -- .../scripts/streaming/stream-manager.ts | 109 ------ .../app/common/scripts/streaming/stream.ts | 137 -------- .../app/common/scripts/streaming/user-list.ts | 17 - .../games/reversi/reversi.gameroom.vue | 8 +- .../games/reversi/reversi.index.vue | 9 +- .../components/games/reversi/reversi.vue | 8 +- .../views/components/messaging-room.vue | 8 +- .../app/common/views/components/messaging.vue | 10 +- .../app/common/views/components/signin.vue | 2 +- .../app/common/views/components/signup.vue | 4 +- .../views/components/stream-indicator.vue | 2 +- .../views/components/welcome-timeline.vue | 9 +- .../app/common/views/widgets/photo-stream.vue | 11 +- .../common/views/widgets/posts-monitor.vue | 8 +- .../app/common/views/widgets/server.vue | 8 +- src/client/app/config.ts | 2 +- src/client/app/desktop/script.ts | 84 ++--- .../app/desktop/views/components/drive.vue | 13 +- .../views/components/follow-button.vue | 11 +- .../app/desktop/views/components/home.vue | 6 +- .../desktop/views/components/note-detail.vue | 3 + .../desktop/views/components/notes.note.vue | 86 +---- .../views/components/notifications.vue | 14 +- .../views/components/settings.signins.vue | 12 +- .../views/components/timeline.core.vue | 61 +--- .../views/components/ui.header.nav.vue | 12 +- .../views/components/user-list-timeline.vue | 1 - .../views/pages/admin/admin.dashboard.vue | 8 +- .../desktop/views/pages/deck/deck.direct.vue | 10 +- .../views/pages/deck/deck.hashtag-tl.vue | 3 +- .../desktop/views/pages/deck/deck.list-tl.vue | 1 - .../views/pages/deck/deck.mentions.vue | 10 +- .../desktop/views/pages/deck/deck.note.vue | 68 +--- .../views/pages/deck/deck.notifications.vue | 11 +- .../app/desktop/views/pages/deck/deck.tl.vue | 21 +- src/client/app/mios.ts | 135 ++----- .../app/mobile/views/components/drive.vue | 13 +- .../mobile/views/components/follow-button.vue | 10 +- .../mobile/views/components/note-detail.vue | 3 + .../app/mobile/views/components/note.vue | 86 +---- .../mobile/views/components/notifications.vue | 17 +- .../app/mobile/views/components/ui.header.vue | 17 +- .../app/mobile/views/components/ui.nav.vue | 10 +- src/client/app/mobile/views/components/ui.vue | 17 +- .../views/components/user-list-timeline.vue | 1 - .../app/mobile/views/pages/home.timeline.vue | 60 +--- src/client/app/tsconfig.json | 3 +- src/docs/stream.ja-JP.md | 8 +- src/notify.ts | 6 +- src/server/api/call.ts | 4 + .../api/common/read-messaging-message.ts | 4 +- src/server/api/common/read-notification.ts | 4 +- .../api/endpoints/games/reversi/match.ts | 6 +- .../api/endpoints/i/regenerate_token.ts | 4 +- src/server/api/endpoints/i/update.ts | 4 +- .../api/endpoints/i/update_client_setting.ts | 4 +- src/server/api/endpoints/i/update_home.ts | 4 +- .../api/endpoints/i/update_mobile_home.ts | 4 +- src/server/api/endpoints/i/update_widget.ts | 4 +- .../endpoints/messaging/messages/create.ts | 10 +- src/server/api/endpoints/notes/polls/vote.ts | 5 +- .../notifications/mark_all_as_read.ts | 4 +- src/server/api/private/signin.ts | 4 +- src/server/api/service/twitter.ts | 6 +- src/server/api/stream/channel.ts | 39 ++ src/server/api/stream/channels/drive.ts | 12 + .../api/stream/channels/games/reversi-game.ts | 309 ++++++++++++++++ .../api/stream/channels/games/reversi.ts | 30 ++ .../api/stream/channels/global-timeline.ts | 39 ++ src/server/api/stream/channels/hashtag.ts | 33 ++ .../api/stream/channels/home-timeline.ts | 39 ++ .../api/stream/channels/hybrid-timeline.ts | 41 +++ src/server/api/stream/channels/index.ts | 31 ++ .../api/stream/channels/local-timeline.ts | 39 ++ src/server/api/stream/channels/main.ts | 25 ++ .../api/stream/channels/messaging-index.ts | 12 + src/server/api/stream/channels/messaging.ts | 26 ++ src/server/api/stream/channels/notes-stats.ts | 34 ++ .../api/stream/channels/server-stats.ts | 37 ++ src/server/api/stream/channels/user-list.ts | 14 + src/server/api/stream/drive.ts | 9 - src/server/api/stream/games/reversi-game.ts | 332 ------------------ src/server/api/stream/games/reversi.ts | 28 -- src/server/api/stream/global-timeline.ts | 27 -- src/server/api/stream/hashtag.ts | 40 --- src/server/api/stream/home.ts | 110 ------ src/server/api/stream/hybrid-timeline.ts | 38 -- src/server/api/stream/index.ts | 213 +++++++++++ src/server/api/stream/local-timeline.ts | 35 -- src/server/api/stream/messaging-index.ts | 9 - src/server/api/stream/messaging.ts | 25 -- src/server/api/stream/notes-stats.ts | 35 -- src/server/api/stream/server-stats.ts | 38 -- src/server/api/stream/user-list.ts | 13 - src/server/api/streaming.ts | 75 +--- src/services/drive/add-file.ts | 6 +- src/services/following/create.ts | 6 +- src/services/following/delete.ts | 4 +- src/services/following/requests/accept.ts | 6 +- src/services/following/requests/cancel.ts | 4 +- src/services/following/requests/create.ts | 6 +- src/services/following/requests/reject.ts | 4 +- src/services/note/create.ts | 14 +- src/services/note/delete.ts | 2 +- src/services/note/reaction/create.ts | 4 +- src/services/note/read.ts | 6 +- src/services/note/unread.ts | 6 +- src/stream.ts | 36 +- tsconfig.json | 3 +- 126 files changed, 1812 insertions(+), 2273 deletions(-) create mode 100644 src/client/app/common/scripts/note-subscriber.ts create mode 100644 src/client/app/common/scripts/stream.ts delete mode 100644 src/client/app/common/scripts/streaming/drive.ts delete mode 100644 src/client/app/common/scripts/streaming/games/reversi/reversi-game.ts delete mode 100644 src/client/app/common/scripts/streaming/games/reversi/reversi.ts delete mode 100644 src/client/app/common/scripts/streaming/global-timeline.ts delete mode 100644 src/client/app/common/scripts/streaming/hashtag.ts delete mode 100644 src/client/app/common/scripts/streaming/home.ts delete mode 100644 src/client/app/common/scripts/streaming/hybrid-timeline.ts delete mode 100644 src/client/app/common/scripts/streaming/local-timeline.ts delete mode 100644 src/client/app/common/scripts/streaming/messaging-index.ts delete mode 100644 src/client/app/common/scripts/streaming/messaging.ts delete mode 100644 src/client/app/common/scripts/streaming/notes-stats.ts delete mode 100644 src/client/app/common/scripts/streaming/server-stats.ts delete mode 100644 src/client/app/common/scripts/streaming/stream-manager.ts delete mode 100644 src/client/app/common/scripts/streaming/stream.ts delete mode 100644 src/client/app/common/scripts/streaming/user-list.ts create mode 100644 src/server/api/stream/channel.ts create mode 100644 src/server/api/stream/channels/drive.ts create mode 100644 src/server/api/stream/channels/games/reversi-game.ts create mode 100644 src/server/api/stream/channels/games/reversi.ts create mode 100644 src/server/api/stream/channels/global-timeline.ts create mode 100644 src/server/api/stream/channels/hashtag.ts create mode 100644 src/server/api/stream/channels/home-timeline.ts create mode 100644 src/server/api/stream/channels/hybrid-timeline.ts create mode 100644 src/server/api/stream/channels/index.ts create mode 100644 src/server/api/stream/channels/local-timeline.ts create mode 100644 src/server/api/stream/channels/main.ts create mode 100644 src/server/api/stream/channels/messaging-index.ts create mode 100644 src/server/api/stream/channels/messaging.ts create mode 100644 src/server/api/stream/channels/notes-stats.ts create mode 100644 src/server/api/stream/channels/server-stats.ts create mode 100644 src/server/api/stream/channels/user-list.ts delete mode 100644 src/server/api/stream/drive.ts delete mode 100644 src/server/api/stream/games/reversi-game.ts delete mode 100644 src/server/api/stream/games/reversi.ts delete mode 100644 src/server/api/stream/global-timeline.ts delete mode 100644 src/server/api/stream/hashtag.ts delete mode 100644 src/server/api/stream/home.ts delete mode 100644 src/server/api/stream/hybrid-timeline.ts create mode 100644 src/server/api/stream/index.ts delete mode 100644 src/server/api/stream/local-timeline.ts delete mode 100644 src/server/api/stream/messaging-index.ts delete mode 100644 src/server/api/stream/messaging.ts delete mode 100644 src/server/api/stream/notes-stats.ts delete mode 100644 src/server/api/stream/server-stats.ts delete mode 100644 src/server/api/stream/user-list.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index c492e43839..b26010b146 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,88 @@ ChangeLog This document describes breaking changes only. +10.0.0 +------ + +ストリーミングAPIに破壊的変更があります。運営者がすべきことはありません。 + +変更は以下の通りです + +* ストリーミングでやり取りする際の snake_case が全て camelCase に +* リバーシのストリームエンドポイント名が reversi → gamesReversi、reversiGame → gamesReversiGame に +* ストリーミングの個々のエンドポイントが廃止され、一旦元となるストリームに接続してから、個々のチャンネル(今までのエンドポイント)に接続します。詳細は後述します。 +* ストリームから流れてくる、キャプチャした投稿の更新イベントに投稿自体のデータは含まれず、代わりにアクションが設定されるようになります。詳細は後述します。 +* ストリームに接続する際に追加で指定していたパラメータ(トークン除く)が、URLにクエリとして含むのではなくチャンネル接続時にパラメータ指定するように + +### 個々のエンドポイントが廃止されることによる新しいストリーミングAPIの利用方法 +具体的には、まず https://example.misskey/streaming にwebsocket接続します。 +次に、例えば「messaging」ストリーム(チャンネルと呼びます)に接続したいときは、ストリームに次のようなデータを送信します: +``` javascript +{ + type: 'connect', + body: { + channel: 'messaging', + id: 'foobar', + params: { + otherparty: 'xxxxxxxxxxxx' + } + } +} +``` +ここで、`id`にはそのチャンネルとやり取りするための任意のIDを設定します。 +IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。 +`params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。 + +チャンネルにメッセージを送信するには、次のようなデータを送信します: +``` javascript +{ + type: 'channel', + body: { + id: 'foobar', + type: 'something', + body: { + some: 'thing' + } + } +} +``` +ここで、`id`にはチャンネルに接続するときに指定したIDを設定します。 + +逆に、チャンネルからメッセージが流れてくると、次のようなデータが受信されます: +``` javascript +{ + type: 'channel', + body: { + id: 'foobar', + type: 'something', + body: { + some: 'thing' + } + } +} +``` +ここで、`id`にはチャンネルに接続するときに指定したIDが設定されています。 + +### 投稿のキャプチャに関する変更 +投稿の更新イベントに投稿情報は含まれなくなりました。代わりに、その投稿が「リアクションされた」「アンケートに投票された」「削除された」といったアクション情報が設定されます。 + +具体的には次のようなデータが受信されます: +``` javascript +{ + type: 'noteUpdated', + body: { + id: 'xxxxxxxxxxx', + type: 'reacted', + body: { + reaction: 'hmm' + } + } +} +``` + +* reacted ... 投稿にリアクションされた。`reaction`プロパティにリアクションコードが含まれます。 +* pollVoted ... アンケートに投票された。`choice`プロパティに選択肢ID、`userId`に投票者IDが含まれます。 + 9.0.0 ----- diff --git a/package.json b/package.json index 27bf5c0f13..dc76ad0f81 100644 --- a/package.json +++ b/package.json @@ -83,6 +83,7 @@ "@types/websocket": "0.0.40", "@types/ws": "6.0.1", "animejs": "2.2.0", + "autobind-decorator": "2.1.0", "autosize": "4.0.2", "autwh": "0.1.0", "bcryptjs": "2.4.3", @@ -225,8 +226,8 @@ "vuex-persistedstate": "2.5.4", "web-push": "3.3.3", "webfinger.js": "2.6.6", - "webpack-cli": "3.1.2", "webpack": "4.20.2", + "webpack-cli": "3.1.2", "websocket": "1.0.28", "ws": "6.0.0", "xev": "2.0.1" diff --git a/src/client/app/common/scripts/compose-notification.ts b/src/client/app/common/scripts/compose-notification.ts index f42af94370..65087cc98e 100644 --- a/src/client/app/common/scripts/compose-notification.ts +++ b/src/client/app/common/scripts/compose-notification.ts @@ -13,21 +13,21 @@ type Notification = { export default function(type, data): Notification { switch (type) { - case 'drive_file_created': + case 'driveFileCreated': return { title: '%i18n:common.notification.file-uploaded%', body: data.name, icon: data.url }; - case 'unread_messaging_message': + case 'unreadMessagingMessage': return { title: '%i18n:common.notification.message-from%'.split("{}")[0] + `${getUserName(data.user)}` + '%i18n:common.notification.message-from%'.split("{}")[1] , body: data.text, // TODO: getMessagingMessageSummary(data), icon: data.user.avatarUrl }; - case 'reversi_invited': + case 'reversiInvited': return { title: '%i18n:common.notification.reversi-invited%', body: '%i18n:common.notification.reversi-invited-by%'.split("{}")[0] + `${getUserName(data.parent)}` + '%i18n:common.notification.reversi-invited-by%'.split("{}")[1], diff --git a/src/client/app/common/scripts/note-subscriber.ts b/src/client/app/common/scripts/note-subscriber.ts new file mode 100644 index 0000000000..5fc82942d5 --- /dev/null +++ b/src/client/app/common/scripts/note-subscriber.ts @@ -0,0 +1,105 @@ +import Vue from 'vue'; + +export default prop => ({ + data() { + return { + connection: null + }; + }, + + computed: { + $_ns_note_(): any { + return this[prop]; + }, + + $_ns_isRenote(): boolean { + return (this.$_ns_note_.renote && + this.$_ns_note_.text == null && + this.$_ns_note_.fileIds.length == 0 && + this.$_ns_note_.poll == null); + }, + + $_ns_target(): any { + return this._ns_isRenote ? this.$_ns_note_.renote : this.$_ns_note_; + }, + }, + + created() { + if (this.$store.getters.isSignedIn) { + this.connection = (this as any).os.stream; + } + }, + + mounted() { + this.capture(true); + + if (this.$store.getters.isSignedIn) { + this.connection.on('_connected_', this.onStreamConnected); + } + }, + + beforeDestroy() { + this.decapture(true); + + if (this.$store.getters.isSignedIn) { + this.connection.off('_connected_', this.onStreamConnected); + } + }, + + methods: { + capture(withHandler = false) { + if (this.$store.getters.isSignedIn) { + const data = { + id: this.$_ns_target.id + } as any; + + if ( + (this.$_ns_target.visibleUserIds || []).includes(this.$store.state.i.id) || + (this.$_ns_target.mentions || []).includes(this.$store.state.i.id) + ) { + data.read = true; + } + + this.connection.send('sn', data); + if (withHandler) this.connection.on('noteUpdated', this.onStreamNoteUpdated); + } + }, + + decapture(withHandler = false) { + if (this.$store.getters.isSignedIn) { + this.connection.send('un', { + id: this.$_ns_target.id + }); + if (withHandler) this.connection.off('noteUpdated', this.onStreamNoteUpdated); + } + }, + + onStreamConnected() { + this.capture(); + }, + + onStreamNoteUpdated(data) { + const { type, id, body } = data; + + if (id !== this.$_ns_target.id) return; + + switch (type) { + case 'reacted': { + const reaction = body.reaction; + if (this.$_ns_target.reactionCounts == null) Vue.set(this.$_ns_target, 'reactionCounts', {}); + this.$_ns_target.reactionCounts[reaction] = (this.$_ns_target.reactionCounts[reaction] || 0) + 1; + break; + } + + case 'pollVoted': { + if (body.userId == this.$store.state.i.id) return; + const choice = body.choice; + this.$_ns_target.poll.choices.find(c => c.id === choice).votes++; + break; + } + } + + this.$emit(`update:${prop}`, this.$_ns_note_); + }, + } +}); diff --git a/src/client/app/common/scripts/stream.ts b/src/client/app/common/scripts/stream.ts new file mode 100644 index 0000000000..7dc130937b --- /dev/null +++ b/src/client/app/common/scripts/stream.ts @@ -0,0 +1,318 @@ +import autobind from 'autobind-decorator'; +import { EventEmitter } from 'eventemitter3'; +import * as ReconnectingWebsocket from 'reconnecting-websocket'; +import { wsUrl } from '../../config'; +import MiOS from '../../mios'; + +/** + * Misskey stream connection + */ +export default class Stream extends EventEmitter { + private stream: ReconnectingWebsocket; + private state: string; + private buffer: any[]; + private sharedConnections: SharedConnection[] = []; + private nonSharedConnections: NonSharedConnection[] = []; + + constructor(os: MiOS) { + super(); + + this.state = 'initializing'; + this.buffer = []; + + const user = os.store.state.i; + + this.stream = new ReconnectingWebsocket(wsUrl + (user ? `?i=${user.token}` : '')); + this.stream.addEventListener('open', this.onOpen); + this.stream.addEventListener('close', this.onClose); + this.stream.addEventListener('message', this.onMessage); + + if (user) { + const main = this.useSharedConnection('main'); + + // 自分の情報が更新されたとき + main.on('meUpdated', i => { + os.store.dispatch('mergeMe', i); + }); + + main.on('readAllNotifications', () => { + os.store.dispatch('mergeMe', { + hasUnreadNotification: false + }); + }); + + main.on('unreadNotification', () => { + os.store.dispatch('mergeMe', { + hasUnreadNotification: true + }); + }); + + main.on('readAllMessagingMessages', () => { + os.store.dispatch('mergeMe', { + hasUnreadMessagingMessage: false + }); + }); + + main.on('unreadMessagingMessage', () => { + os.store.dispatch('mergeMe', { + hasUnreadMessagingMessage: true + }); + }); + + main.on('unreadMention', () => { + os.store.dispatch('mergeMe', { + hasUnreadMentions: true + }); + }); + + main.on('readAllUnreadMentions', () => { + os.store.dispatch('mergeMe', { + hasUnreadMentions: false + }); + }); + + main.on('unreadSpecifiedNote', () => { + os.store.dispatch('mergeMe', { + hasUnreadSpecifiedNotes: true + }); + }); + + main.on('readAllUnreadSpecifiedNotes', () => { + os.store.dispatch('mergeMe', { + hasUnreadSpecifiedNotes: false + }); + }); + + main.on('clientSettingUpdated', x => { + os.store.commit('settings/set', { + key: x.key, + value: x.value + }); + }); + + main.on('homeUpdated', x => { + os.store.commit('settings/setHome', x); + }); + + main.on('mobileHomeUpdated', x => { + os.store.commit('settings/setMobileHome', x); + }); + + main.on('widgetUpdated', x => { + os.store.commit('settings/setWidget', { + id: x.id, + data: x.data + }); + }); + + // トークンが再生成されたとき + // このままではMisskeyが利用できないので強制的にサインアウトさせる + main.on('myTokenRegenerated', () => { + alert('%i18n:common.my-token-regenerated%'); + os.signout(); + }); + } + } + + public useSharedConnection = (channel: string): SharedConnection => { + const existConnection = this.sharedConnections.find(c => c.channel === channel); + + if (existConnection) { + existConnection.use(); + return existConnection; + } else { + const connection = new SharedConnection(this, channel); + connection.use(); + this.sharedConnections.push(connection); + return connection; + } + } + + @autobind + public removeSharedConnection(connection: SharedConnection) { + this.sharedConnections = this.sharedConnections.filter(c => c.id !== connection.id); + } + + public connectToChannel = (channel: string, params?: any): NonSharedConnection => { + const connection = new NonSharedConnection(this, channel, params); + this.nonSharedConnections.push(connection); + return connection; + } + + @autobind + public disconnectToChannel(connection: NonSharedConnection) { + this.nonSharedConnections = this.nonSharedConnections.filter(c => c.id !== connection.id); + } + + /** + * Callback of when open connection + */ + @autobind + private onOpen() { + const isReconnect = this.state == 'reconnecting'; + + this.state = 'connected'; + this.emit('_connected_'); + + // バッファーを処理 + const _buffer = [].concat(this.buffer); // Shallow copy + this.buffer = []; // Clear buffer + _buffer.forEach(data => { + this.send(data); // Resend each buffered messages + }); + + // チャンネル再接続 + if (isReconnect) { + this.sharedConnections.forEach(c => { + c.connect(); + }); + this.nonSharedConnections.forEach(c => { + c.connect(); + }); + } + } + + /** + * Callback of when close connection + */ + @autobind + private onClose() { + this.state = 'reconnecting'; + this.emit('_disconnected_'); + } + + /** + * Callback of when received a message from connection + */ + @autobind + private onMessage(message) { + const { type, body } = JSON.parse(message.data); + + if (type == 'channel') { + const id = body.id; + const connection = this.sharedConnections.find(c => c.id === id) || this.nonSharedConnections.find(c => c.id === id); + connection.emit(body.type, body.body); + } else { + this.emit(type, body); + } + } + + /** + * Send a message to connection + */ + @autobind + public send(typeOrPayload, payload?) { + const data = payload === undefined ? typeOrPayload : { + type: typeOrPayload, + body: payload + }; + + // まだ接続が確立されていなかったらバッファリングして次に接続した時に送信する + if (this.state != 'connected') { + this.buffer.push(data); + return; + } + + this.stream.send(JSON.stringify(data)); + } + + /** + * Close this connection + */ + @autobind + public close() { + this.stream.removeEventListener('open', this.onOpen); + this.stream.removeEventListener('message', this.onMessage); + } +} + +abstract class Connection extends EventEmitter { + public channel: string; + public id: string; + protected params: any; + protected stream: Stream; + + constructor(stream: Stream, channel: string, params?: any) { + super(); + + this.stream = stream; + this.channel = channel; + this.params = params; + this.id = Math.random().toString(); + this.connect(); + } + + @autobind + public connect() { + this.stream.send('connect', { + channel: this.channel, + id: this.id, + params: this.params + }); + } + + @autobind + public send(typeOrPayload, payload?) { + const data = payload === undefined ? typeOrPayload : { + type: typeOrPayload, + body: payload + }; + + this.stream.send('channel', { + id: this.id, + body: data + }); + } + + public abstract dispose: () => void; +} + +class SharedConnection extends Connection { + private users = 0; + private disposeTimerId: any; + + constructor(stream: Stream, channel: string) { + super(stream, channel); + } + + @autobind + public use() { + this.users++; + + // タイマー解除 + if (this.disposeTimerId) { + clearTimeout(this.disposeTimerId); + this.disposeTimerId = null; + } + } + + @autobind + public dispose() { + this.users--; + + // そのコネクションの利用者が誰もいなくなったら + if (this.users === 0) { + // また直ぐに再利用される可能性があるので、一定時間待ち、 + // 新たな利用者が現れなければコネクションを切断する + this.disposeTimerId = setTimeout(() => { + this.disposeTimerId = null; + this.removeAllListeners(); + this.stream.send('disconnect', { id: this.id }); + this.stream.removeSharedConnection(this); + }, 3000); + } + } +} + +class NonSharedConnection extends Connection { + constructor(stream: Stream, channel: string, params?: any) { + super(stream, channel, params); + } + + @autobind + public dispose() { + this.removeAllListeners(); + this.stream.send('disconnect', { id: this.id }); + this.stream.disconnectToChannel(this); + } +} diff --git a/src/client/app/common/scripts/streaming/drive.ts b/src/client/app/common/scripts/streaming/drive.ts deleted file mode 100644 index 50fff05737..0000000000 --- a/src/client/app/common/scripts/streaming/drive.ts +++ /dev/null @@ -1,34 +0,0 @@ -import Stream from './stream'; -import StreamManager from './stream-manager'; -import MiOS from '../../../mios'; - -/** - * Drive stream connection - */ -export class DriveStream extends Stream { - constructor(os: MiOS, me) { - super(os, 'drive', { - i: me.token - }); - } -} - -export class DriveStreamManager extends StreamManager<DriveStream> { - private me; - private os: MiOS; - - constructor(os: MiOS, me) { - super(); - - this.me = me; - this.os = os; - } - - public getConnection() { - if (this.connection == null) { - this.connection = new DriveStream(this.os, this.me); - } - - return this.connection; - } -} diff --git a/src/client/app/common/scripts/streaming/games/reversi/reversi-game.ts b/src/client/app/common/scripts/streaming/games/reversi/reversi-game.ts deleted file mode 100644 index adfa75ff3b..0000000000 --- a/src/client/app/common/scripts/streaming/games/reversi/reversi-game.ts +++ /dev/null @@ -1,13 +0,0 @@ -import Stream from '../../stream'; -import MiOS from '../../../../../mios'; - -export class ReversiGameStream extends Stream { - constructor(os: MiOS, me, game) { - super(os, 'games/reversi-game', me ? { - i: me.token, - game: game.id - } : { - game: game.id - }); - } -} diff --git a/src/client/app/common/scripts/streaming/games/reversi/reversi.ts b/src/client/app/common/scripts/streaming/games/reversi/reversi.ts deleted file mode 100644 index 1f4fd8c63e..0000000000 --- a/src/client/app/common/scripts/streaming/games/reversi/reversi.ts +++ /dev/null @@ -1,31 +0,0 @@ -import StreamManager from '../../stream-manager'; -import Stream from '../../stream'; -import MiOS from '../../../../../mios'; - -export class ReversiStream extends Stream { - constructor(os: MiOS, me) { - super(os, 'games/reversi', { - i: me.token - }); - } -} - -export class ReversiStreamManager extends StreamManager<ReversiStream> { - private me; - private os: MiOS; - - constructor(os: MiOS, me) { - super(); - - this.me = me; - this.os = os; - } - - public getConnection() { - if (this.connection == null) { - this.connection = new ReversiStream(this.os, this.me); - } - - return this.connection; - } -} diff --git a/src/client/app/common/scripts/streaming/global-timeline.ts b/src/client/app/common/scripts/streaming/global-timeline.ts deleted file mode 100644 index a639f1595c..0000000000 --- a/src/client/app/common/scripts/streaming/global-timeline.ts +++ /dev/null @@ -1,34 +0,0 @@ -import Stream from './stream'; -import StreamManager from './stream-manager'; -import MiOS from '../../../mios'; - -/** - * Global timeline stream connection - */ -export class GlobalTimelineStream extends Stream { - constructor(os: MiOS, me) { - super(os, 'global-timeline', { - i: me.token - }); - } -} - -export class GlobalTimelineStreamManager extends StreamManager<GlobalTimelineStream> { - private me; - private os: MiOS; - - constructor(os: MiOS, me) { - super(); - - this.me = me; - this.os = os; - } - - public getConnection() { - if (this.connection == null) { - this.connection = new GlobalTimelineStream(this.os, this.me); - } - - return this.connection; - } -} diff --git a/src/client/app/common/scripts/streaming/hashtag.ts b/src/client/app/common/scripts/streaming/hashtag.ts deleted file mode 100644 index 276b8f8d3d..0000000000 --- a/src/client/app/common/scripts/streaming/hashtag.ts +++ /dev/null @@ -1,13 +0,0 @@ -import Stream from './stream'; -import MiOS from '../../../mios'; - -export class HashtagStream extends Stream { - constructor(os: MiOS, me, q) { - super(os, 'hashtag', me ? { - i: me.token, - q: JSON.stringify(q) - } : { - q: JSON.stringify(q) - }); - } -} diff --git a/src/client/app/common/scripts/streaming/home.ts b/src/client/app/common/scripts/streaming/home.ts deleted file mode 100644 index 26729507fb..0000000000 --- a/src/client/app/common/scripts/streaming/home.ts +++ /dev/null @@ -1,126 +0,0 @@ -import Stream from './stream'; -import StreamManager from './stream-manager'; -import MiOS from '../../../mios'; - -/** - * Home stream connection - */ -export class HomeStream extends Stream { - constructor(os: MiOS, me) { - super(os, '', { - i: me.token - }); - - // 最終利用日時を更新するため定期的にaliveメッセージを送信 - setInterval(() => { - this.send({ type: 'alive' }); - me.lastUsedAt = new Date(); - }, 1000 * 60); - - // 自分の情報が更新されたとき - this.on('meUpdated', i => { - if (os.debug) { - console.log('I updated:', i); - } - - os.store.dispatch('mergeMe', i); - }); - - this.on('read_all_notifications', () => { - os.store.dispatch('mergeMe', { - hasUnreadNotification: false - }); - }); - - this.on('unread_notification', () => { - os.store.dispatch('mergeMe', { - hasUnreadNotification: true - }); - }); - - this.on('read_all_messaging_messages', () => { - os.store.dispatch('mergeMe', { - hasUnreadMessagingMessage: false - }); - }); - - this.on('unread_messaging_message', () => { - os.store.dispatch('mergeMe', { - hasUnreadMessagingMessage: true - }); - }); - - this.on('unreadMention', () => { - os.store.dispatch('mergeMe', { - hasUnreadMentions: true - }); - }); - - this.on('readAllUnreadMentions', () => { - os.store.dispatch('mergeMe', { - hasUnreadMentions: false - }); - }); - - this.on('unreadSpecifiedNote', () => { - os.store.dispatch('mergeMe', { - hasUnreadSpecifiedNotes: true - }); - }); - - this.on('readAllUnreadSpecifiedNotes', () => { - os.store.dispatch('mergeMe', { - hasUnreadSpecifiedNotes: false - }); - }); - - this.on('clientSettingUpdated', x => { - os.store.commit('settings/set', { - key: x.key, - value: x.value - }); - }); - - this.on('home_updated', x => { - os.store.commit('settings/setHome', x); - }); - - this.on('mobile_home_updated', x => { - os.store.commit('settings/setMobileHome', x); - }); - - this.on('widgetUpdated', x => { - os.store.commit('settings/setWidget', { - id: x.id, - data: x.data - }); - }); - - // トークンが再生成されたとき - // このままではMisskeyが利用できないので強制的にサインアウトさせる - this.on('my_token_regenerated', () => { - alert('%i18n:common.my-token-regenerated%'); - os.signout(); - }); - } -} - -export class HomeStreamManager extends StreamManager<HomeStream> { - private me; - private os: MiOS; - - constructor(os: MiOS, me) { - super(); - - this.me = me; - this.os = os; - } - - public getConnection() { - if (this.connection == null) { - this.connection = new HomeStream(this.os, this.me); - } - - return this.connection; - } -} diff --git a/src/client/app/common/scripts/streaming/hybrid-timeline.ts b/src/client/app/common/scripts/streaming/hybrid-timeline.ts deleted file mode 100644 index cd290797c4..0000000000 --- a/src/client/app/common/scripts/streaming/hybrid-timeline.ts +++ /dev/null @@ -1,34 +0,0 @@ -import Stream from './stream'; -import StreamManager from './stream-manager'; -import MiOS from '../../../mios'; - -/** - * Hybrid timeline stream connection - */ -export class HybridTimelineStream extends Stream { - constructor(os: MiOS, me) { - super(os, 'hybrid-timeline', { - i: me.token - }); - } -} - -export class HybridTimelineStreamManager extends StreamManager<HybridTimelineStream> { - private me; - private os: MiOS; - - constructor(os: MiOS, me) { - super(); - - this.me = me; - this.os = os; - } - - public getConnection() { - if (this.connection == null) { - this.connection = new HybridTimelineStream(this.os, this.me); - } - - return this.connection; - } -} diff --git a/src/client/app/common/scripts/streaming/local-timeline.ts b/src/client/app/common/scripts/streaming/local-timeline.ts deleted file mode 100644 index 41c36aa14c..0000000000 --- a/src/client/app/common/scripts/streaming/local-timeline.ts +++ /dev/null @@ -1,34 +0,0 @@ -import Stream from './stream'; -import StreamManager from './stream-manager'; -import MiOS from '../../../mios'; - -/** - * Local timeline stream connection - */ -export class LocalTimelineStream extends Stream { - constructor(os: MiOS, me) { - super(os, 'local-timeline', me ? { - i: me.token - } : {}); - } -} - -export class LocalTimelineStreamManager extends StreamManager<LocalTimelineStream> { - private me; - private os: MiOS; - - constructor(os: MiOS, me) { - super(); - - this.me = me; - this.os = os; - } - - public getConnection() { - if (this.connection == null) { - this.connection = new LocalTimelineStream(this.os, this.me); - } - - return this.connection; - } -} diff --git a/src/client/app/common/scripts/streaming/messaging-index.ts b/src/client/app/common/scripts/streaming/messaging-index.ts deleted file mode 100644 index addcccb952..0000000000 --- a/src/client/app/common/scripts/streaming/messaging-index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import Stream from './stream'; -import StreamManager from './stream-manager'; -import MiOS from '../../../mios'; - -/** - * Messaging index stream connection - */ -export class MessagingIndexStream extends Stream { - constructor(os: MiOS, me) { - super(os, 'messaging-index', { - i: me.token - }); - } -} - -export class MessagingIndexStreamManager extends StreamManager<MessagingIndexStream> { - private me; - private os: MiOS; - - constructor(os: MiOS, me) { - super(); - - this.me = me; - this.os = os; - } - - public getConnection() { - if (this.connection == null) { - this.connection = new MessagingIndexStream(this.os, this.me); - } - - return this.connection; - } -} diff --git a/src/client/app/common/scripts/streaming/messaging.ts b/src/client/app/common/scripts/streaming/messaging.ts deleted file mode 100644 index a59377d867..0000000000 --- a/src/client/app/common/scripts/streaming/messaging.ts +++ /dev/null @@ -1,20 +0,0 @@ -import Stream from './stream'; -import MiOS from '../../../mios'; - -/** - * Messaging stream connection - */ -export class MessagingStream extends Stream { - constructor(os: MiOS, me, otherparty) { - super(os, 'messaging', { - i: me.token, - otherparty - }); - - (this as any).on('_connected_', () => { - this.send({ - i: me.token - }); - }); - } -} diff --git a/src/client/app/common/scripts/streaming/notes-stats.ts b/src/client/app/common/scripts/streaming/notes-stats.ts deleted file mode 100644 index 9e3e78a709..0000000000 --- a/src/client/app/common/scripts/streaming/notes-stats.ts +++ /dev/null @@ -1,30 +0,0 @@ -import Stream from './stream'; -import StreamManager from './stream-manager'; -import MiOS from '../../../mios'; - -/** - * Notes stats stream connection - */ -export class NotesStatsStream extends Stream { - constructor(os: MiOS) { - super(os, 'notes-stats'); - } -} - -export class NotesStatsStreamManager extends StreamManager<NotesStatsStream> { - private os: MiOS; - - constructor(os: MiOS) { - super(); - - this.os = os; - } - - public getConnection() { - if (this.connection == null) { - this.connection = new NotesStatsStream(this.os); - } - - return this.connection; - } -} diff --git a/src/client/app/common/scripts/streaming/server-stats.ts b/src/client/app/common/scripts/streaming/server-stats.ts deleted file mode 100644 index 9983dfcaf0..0000000000 --- a/src/client/app/common/scripts/streaming/server-stats.ts +++ /dev/null @@ -1,30 +0,0 @@ -import Stream from './stream'; -import StreamManager from './stream-manager'; -import MiOS from '../../../mios'; - -/** - * Server stats stream connection - */ -export class ServerStatsStream extends Stream { - constructor(os: MiOS) { - super(os, 'server-stats'); - } -} - -export class ServerStatsStreamManager extends StreamManager<ServerStatsStream> { - private os: MiOS; - - constructor(os: MiOS) { - super(); - - this.os = os; - } - - public getConnection() { - if (this.connection == null) { - this.connection = new ServerStatsStream(this.os); - } - - return this.connection; - } -} diff --git a/src/client/app/common/scripts/streaming/stream-manager.ts b/src/client/app/common/scripts/streaming/stream-manager.ts deleted file mode 100644 index 8dd06f67d3..0000000000 --- a/src/client/app/common/scripts/streaming/stream-manager.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { EventEmitter } from 'eventemitter3'; -import * as uuid from 'uuid'; -import Connection from './stream'; -import { erase } from '../../../../../prelude/array'; - -/** - * ストリーム接続を管理するクラス - * 複数の場所から同じストリームを利用する際、接続をまとめたりする - */ -export default abstract class StreamManager<T extends Connection> extends EventEmitter { - private _connection: T = null; - - private disposeTimerId: any; - - /** - * コネクションを必要としているユーザー - */ - private users = []; - - protected set connection(connection: T) { - this._connection = connection; - - if (this._connection == null) { - this.emit('disconnected'); - } else { - this.emit('connected', this._connection); - - this._connection.on('_connected_', () => { - this.emit('_connected_'); - }); - - this._connection.on('_disconnected_', () => { - this.emit('_disconnected_'); - }); - - this._connection.user = 'Managed'; - } - } - - protected get connection() { - return this._connection; - } - - /** - * コネクションを持っているか否か - */ - public get hasConnection() { - return this._connection != null; - } - - public get state(): string { - if (!this.hasConnection) return 'no-connection'; - return this._connection.state; - } - - /** - * コネクションを要求します - */ - public abstract getConnection(): T; - - /** - * 現在接続しているコネクションを取得します - */ - public borrow() { - return this._connection; - } - - /** - * コネクションを要求するためのユーザーIDを発行します - */ - public use() { - // タイマー解除 - if (this.disposeTimerId) { - clearTimeout(this.disposeTimerId); - this.disposeTimerId = null; - } - - // ユーザーID生成 - const userId = uuid(); - - this.users.push(userId); - - this._connection.user = `Managed (${ this.users.length })`; - - return userId; - } - - /** - * コネクションを利用し終わってもう必要ないことを通知します - * @param userId use で発行したユーザーID - */ - public dispose(userId) { - this.users = erase(userId, this.users); - - this._connection.user = `Managed (${ this.users.length })`; - - // 誰もコネクションの利用者がいなくなったら - if (this.users.length == 0) { - // また直ぐに再利用される可能性があるので、一定時間待ち、 - // 新たな利用者が現れなければコネクションを切断する - this.disposeTimerId = setTimeout(() => { - this.disposeTimerId = null; - - this.connection.close(); - this.connection = null; - }, 3000); - } - } -} diff --git a/src/client/app/common/scripts/streaming/stream.ts b/src/client/app/common/scripts/streaming/stream.ts deleted file mode 100644 index 4ab78f1190..0000000000 --- a/src/client/app/common/scripts/streaming/stream.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { EventEmitter } from 'eventemitter3'; -import * as uuid from 'uuid'; -import * as ReconnectingWebsocket from 'reconnecting-websocket'; -import { wsUrl } from '../../../config'; -import MiOS from '../../../mios'; - -/** - * Misskey stream connection - */ -export default class Connection extends EventEmitter { - public state: string; - private buffer: any[]; - public socket: ReconnectingWebsocket; - public name: string; - public connectedAt: Date; - public user: string = null; - public in: number = 0; - public out: number = 0; - public inout: Array<{ - type: 'in' | 'out', - at: Date, - data: string - }> = []; - public id: string; - public isSuspended = false; - private os: MiOS; - - constructor(os: MiOS, endpoint, params?) { - super(); - - //#region BIND - this.onOpen = this.onOpen.bind(this); - this.onClose = this.onClose.bind(this); - this.onMessage = this.onMessage.bind(this); - this.send = this.send.bind(this); - this.close = this.close.bind(this); - //#endregion - - this.id = uuid(); - this.os = os; - this.name = endpoint; - this.state = 'initializing'; - this.buffer = []; - - const query = params - ? Object.keys(params) - .map(k => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`) - .join('&') - : null; - - this.socket = new ReconnectingWebsocket(`${wsUrl}/${endpoint}${query ? `?${query}` : ''}`); - this.socket.addEventListener('open', this.onOpen); - this.socket.addEventListener('close', this.onClose); - this.socket.addEventListener('message', this.onMessage); - - // Register this connection for debugging - this.os.registerStreamConnection(this); - } - - /** - * Callback of when open connection - */ - private onOpen() { - this.state = 'connected'; - this.emit('_connected_'); - - this.connectedAt = new Date(); - - // バッファーを処理 - const _buffer = [].concat(this.buffer); // Shallow copy - this.buffer = []; // Clear buffer - _buffer.forEach(data => { - this.send(data); // Resend each buffered messages - - if (this.os.debug) { - this.out++; - this.inout.push({ type: 'out', at: new Date(), data }); - } - }); - } - - /** - * Callback of when close connection - */ - private onClose() { - this.state = 'reconnecting'; - this.emit('_disconnected_'); - } - - /** - * Callback of when received a message from connection - */ - private onMessage(message) { - if (this.isSuspended) return; - - if (this.os.debug) { - this.in++; - this.inout.push({ type: 'in', at: new Date(), data: message.data }); - } - - try { - const msg = JSON.parse(message.data); - if (msg.type) this.emit(msg.type, msg.body); - } catch (e) { - // noop - } - } - - /** - * Send a message to connection - */ - public send(data) { - if (this.isSuspended) return; - - // まだ接続が確立されていなかったらバッファリングして次に接続した時に送信する - if (this.state != 'connected') { - this.buffer.push(data); - return; - } - - if (this.os.debug) { - this.out++; - this.inout.push({ type: 'out', at: new Date(), data }); - } - - this.socket.send(JSON.stringify(data)); - } - - /** - * Close this connection - */ - public close() { - this.os.unregisterStreamConnection(this); - this.socket.removeEventListener('open', this.onOpen); - this.socket.removeEventListener('message', this.onMessage); - } -} diff --git a/src/client/app/common/scripts/streaming/user-list.ts b/src/client/app/common/scripts/streaming/user-list.ts deleted file mode 100644 index 30a52b98dd..0000000000 --- a/src/client/app/common/scripts/streaming/user-list.ts +++ /dev/null @@ -1,17 +0,0 @@ -import Stream from './stream'; -import MiOS from '../../mios'; - -export class UserListStream extends Stream { - constructor(os: MiOS, me, listId) { - super(os, 'user-list', { - i: me.token, - listId - }); - - (this as any).on('_connected_', () => { - this.send({ - i: me.token - }); - }); - } -} diff --git a/src/client/app/common/views/components/games/reversi/reversi.gameroom.vue b/src/client/app/common/views/components/games/reversi/reversi.gameroom.vue index 1539c88de0..0a18e0b19a 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.gameroom.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.gameroom.vue @@ -9,7 +9,6 @@ import Vue from 'vue'; import XGame from './reversi.game.vue'; import XRoom from './reversi.room.vue'; -import { ReversiGameStream } from '../../../../scripts/streaming/games/reversi/reversi-game'; export default Vue.extend({ components: { @@ -34,12 +33,13 @@ export default Vue.extend({ }, created() { this.g = this.game; - this.connection = new ReversiGameStream((this as any).os, this.$store.state.i, this.game); + this.connection = (this as any).os.stream.connectToChannel('gamesReversiGame', { + gameId: this.game.id + }); this.connection.on('started', this.onStarted); }, beforeDestroy() { - this.connection.off('started', this.onStarted); - this.connection.close(); + this.connection.dispose(); }, methods: { onStarted(game) { diff --git a/src/client/app/common/views/components/games/reversi/reversi.index.vue b/src/client/app/common/views/components/games/reversi/reversi.index.vue index 3725aa6cb4..a040162802 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.index.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.index.vue @@ -59,15 +59,13 @@ export default Vue.extend({ myGames: [], matching: null, invitations: [], - connection: null, - connectionId: null + connection: null }; }, mounted() { if (this.$store.getters.isSignedIn) { - this.connection = (this as any).os.streams.reversiStream.getConnection(); - this.connectionId = (this as any).os.streams.reversiStream.use(); + this.connection = (this as any).os.stream.useSharedConnection('gamesReversi'); this.connection.on('invited', this.onInvited); @@ -90,8 +88,7 @@ export default Vue.extend({ beforeDestroy() { if (this.connection) { - this.connection.off('invited', this.onInvited); - (this as any).os.streams.reversiStream.dispose(this.connectionId); + this.connection.dispose(); } }, diff --git a/src/client/app/common/views/components/games/reversi/reversi.vue b/src/client/app/common/views/components/games/reversi/reversi.vue index 6eb9511ce9..f2156bc41b 100644 --- a/src/client/app/common/views/components/games/reversi/reversi.vue +++ b/src/client/app/common/views/components/games/reversi/reversi.vue @@ -47,7 +47,6 @@ export default Vue.extend({ game: null, matching: null, connection: null, - connectionId: null, pingClock: null }; }, @@ -66,8 +65,7 @@ export default Vue.extend({ this.fetch(); if (this.$store.getters.isSignedIn) { - this.connection = (this as any).os.streams.reversiStream.getConnection(); - this.connectionId = (this as any).os.streams.reversiStream.use(); + this.connection = (this as any).os.stream.useSharedConnection('gamesReversi'); this.connection.on('matched', this.onMatched); @@ -84,9 +82,7 @@ export default Vue.extend({ beforeDestroy() { if (this.connection) { - this.connection.off('matched', this.onMatched); - (this as any).os.streams.reversiStream.dispose(this.connectionId); - + this.connection.dispose(); clearInterval(this.pingClock); } }, diff --git a/src/client/app/common/views/components/messaging-room.vue b/src/client/app/common/views/components/messaging-room.vue index 98661bc39d..c2cd79e116 100644 --- a/src/client/app/common/views/components/messaging-room.vue +++ b/src/client/app/common/views/components/messaging-room.vue @@ -30,7 +30,6 @@ <script lang="ts"> import Vue from 'vue'; -import { MessagingStream } from '../../scripts/streaming/messaging'; import XMessage from './messaging-room.message.vue'; import XForm from './messaging-room.form.vue'; import { url } from '../../../config'; @@ -72,7 +71,7 @@ export default Vue.extend({ }, mounted() { - this.connection = new MessagingStream((this as any).os, this.$store.state.i, this.user.id); + this.connection =((this as any).os.stream.connectToChannel('messaging', { otherparty: this.user.id }); this.connection.on('message', this.onMessage); this.connection.on('read', this.onRead); @@ -92,9 +91,7 @@ export default Vue.extend({ }, beforeDestroy() { - this.connection.off('message', this.onMessage); - this.connection.off('read', this.onRead); - this.connection.close(); + this.connection.dispose(); if (this.isNaked) { window.removeEventListener('scroll', this.onScroll); @@ -166,6 +163,7 @@ export default Vue.extend({ }, onMessage(message) { + console.log(message); // サウンドを再生する if (this.$store.state.device.enableSounds) { const sound = new Audio(`${url}/assets/message.mp3`); diff --git a/src/client/app/common/views/components/messaging.vue b/src/client/app/common/views/components/messaging.vue index 91453e16ec..f5b5e232f6 100644 --- a/src/client/app/common/views/components/messaging.vue +++ b/src/client/app/common/views/components/messaging.vue @@ -71,13 +71,11 @@ export default Vue.extend({ messages: [], q: null, result: [], - connection: null, - connectionId: null + connection: null }; }, mounted() { - this.connection = (this as any).os.streams.messagingIndexStream.getConnection(); - this.connectionId = (this as any).os.streams.messagingIndexStream.use(); + this.connection = (this as any).os.stream.useSharedConnection('messagingIndex'); this.connection.on('message', this.onMessage); this.connection.on('read', this.onRead); @@ -88,9 +86,7 @@ export default Vue.extend({ }); }, beforeDestroy() { - this.connection.off('message', this.onMessage); - this.connection.off('read', this.onRead); - (this as any).os.streams.messagingIndexStream.dispose(this.connectionId); + this.connection.dispose(); }, methods: { getAcct, diff --git a/src/client/app/common/views/components/signin.vue b/src/client/app/common/views/components/signin.vue index 7025ecea33..9224f82cb9 100644 --- a/src/client/app/common/views/components/signin.vue +++ b/src/client/app/common/views/components/signin.vue @@ -56,7 +56,7 @@ export default Vue.extend({ username: this.username, password: this.password, token: this.user && this.user.twoFactorEnabled ? this.token : undefined - }).then(() => { + }, true).then(() => { location.reload(); }).catch(() => { alert('%i18n:@login-failed%'); diff --git a/src/client/app/common/views/components/signup.vue b/src/client/app/common/views/components/signup.vue index b817ca729d..8e06b13491 100644 --- a/src/client/app/common/views/components/signup.vue +++ b/src/client/app/common/views/components/signup.vue @@ -131,11 +131,11 @@ export default Vue.extend({ password: this.password, invitationCode: this.invitationCode, 'g-recaptcha-response': this.meta.recaptchaSitekey != null ? (window as any).grecaptcha.getResponse() : null - }).then(() => { + }, true).then(() => { (this as any).api('signin', { username: this.username, password: this.password - }).then(() => { + }, true).then(() => { location.href = '/'; }); }).catch(() => { diff --git a/src/client/app/common/views/components/stream-indicator.vue b/src/client/app/common/views/components/stream-indicator.vue index d573db32e6..0f25b37cc9 100644 --- a/src/client/app/common/views/components/stream-indicator.vue +++ b/src/client/app/common/views/components/stream-indicator.vue @@ -22,7 +22,7 @@ import * as anime from 'animejs'; export default Vue.extend({ computed: { stream() { - return (this as any).os.stream; + return (this as any).os.stream.useSharedConnection('main'); } }, created() { diff --git a/src/client/app/common/views/components/welcome-timeline.vue b/src/client/app/common/views/components/welcome-timeline.vue index 6934fb4856..4a66db57b8 100644 --- a/src/client/app/common/views/components/welcome-timeline.vue +++ b/src/client/app/common/views/components/welcome-timeline.vue @@ -38,23 +38,20 @@ export default Vue.extend({ return { fetching: true, notes: [], - connection: null, - connectionId: null + connection: null }; }, mounted() { this.fetch(); - this.connection = (this as any).os.streams.localTimelineStream.getConnection(); - this.connectionId = (this as any).os.streams.localTimelineStream.use(); + this.connection = (this as any).os.stream.useSharedConnection('localTimeline'); this.connection.on('note', this.onNote); }, beforeDestroy() { - this.connection.off('note', this.onNote); - (this as any).os.streams.localTimelineStream.dispose(this.connectionId); + this.connection.dispose(); }, methods: { diff --git a/src/client/app/common/views/widgets/photo-stream.vue b/src/client/app/common/views/widgets/photo-stream.vue index 3e24c58e8e..047b01df4f 100644 --- a/src/client/app/common/views/widgets/photo-stream.vue +++ b/src/client/app/common/views/widgets/photo-stream.vue @@ -24,15 +24,13 @@ export default define({ return { images: [], fetching: true, - connection: null, - connectionId: null + connection: null }; }, mounted() { - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); + this.connection = (this as any).os.stream.useSharedConnection('main'); - this.connection.on('drive_file_created', this.onDriveFileCreated); + this.connection.on('driveFileCreated', this.onDriveFileCreated); (this as any).api('drive/stream', { type: 'image/*', @@ -43,8 +41,7 @@ export default define({ }); }, beforeDestroy() { - this.connection.off('drive_file_created', this.onDriveFileCreated); - (this as any).os.stream.dispose(this.connectionId); + this.connection.dispose(); }, methods: { onDriveFileCreated(file) { diff --git a/src/client/app/common/views/widgets/posts-monitor.vue b/src/client/app/common/views/widgets/posts-monitor.vue index 18df1241a9..1c70e6dbc4 100644 --- a/src/client/app/common/views/widgets/posts-monitor.vue +++ b/src/client/app/common/views/widgets/posts-monitor.vue @@ -82,7 +82,6 @@ export default define({ data() { return { connection: null, - connectionId: null, viewBoxY: 30, stats: [], fediGradientId: uuid(), @@ -110,8 +109,7 @@ export default define({ } }, mounted() { - this.connection = (this as any).os.streams.notesStatsStream.getConnection(); - this.connectionId = (this as any).os.streams.notesStatsStream.use(); + this.connection = (this as any).os.stream.useSharedConnection('notesStats'); this.connection.on('stats', this.onStats); this.connection.on('statsLog', this.onStatsLog); @@ -121,9 +119,7 @@ export default define({ }); }, beforeDestroy() { - this.connection.off('stats', this.onStats); - this.connection.off('statsLog', this.onStatsLog); - (this as any).os.streams.notesStatsStream.dispose(this.connectionId); + this.connection.dispose(); }, methods: { toggle() { diff --git a/src/client/app/common/views/widgets/server.vue b/src/client/app/common/views/widgets/server.vue index d796a3ae05..62d75e2bf6 100644 --- a/src/client/app/common/views/widgets/server.vue +++ b/src/client/app/common/views/widgets/server.vue @@ -45,8 +45,7 @@ export default define({ return { fetching: true, meta: null, - connection: null, - connectionId: null + connection: null }; }, mounted() { @@ -55,11 +54,10 @@ export default define({ this.fetching = false; }); - this.connection = (this as any).os.streams.serverStatsStream.getConnection(); - this.connectionId = (this as any).os.streams.serverStatsStream.use(); + this.connection = (this as any).os.stream.useSharedConnection('serverStats'); }, beforeDestroy() { - (this as any).os.streams.serverStatsStream.dispose(this.connectionId); + this.connection.dispose(); }, methods: { toggle() { diff --git a/src/client/app/config.ts b/src/client/app/config.ts index a326c521db..c3bc427eab 100644 --- a/src/client/app/config.ts +++ b/src/client/app/config.ts @@ -12,7 +12,7 @@ export const host = address.host; export const hostname = address.hostname; export const url = address.origin; export const apiUrl = url + '/api'; -export const wsUrl = url.replace('http://', 'ws://').replace('https://', 'wss://'); +export const wsUrl = url.replace('http://', 'ws://').replace('https://', 'wss://') + '/streaming'; export const lang = _LANG_; export const langs = _LANGS_; export const themeColor = _THEME_COLOR_; diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts index 05aa928fa3..85c81d73a2 100644 --- a/src/client/app/desktop/script.ts +++ b/src/client/app/desktop/script.ts @@ -9,7 +9,6 @@ import './style.styl'; import init from '../init'; import fuckAdBlock from '../common/scripts/fuck-ad-block'; -import { HomeStreamManager } from '../common/scripts/streaming/home'; import composeNotification from '../common/scripts/compose-notification'; import chooseDriveFolder from './api/choose-drive-folder'; @@ -37,6 +36,7 @@ import MkTag from './views/pages/tag.vue'; import MkReversi from './views/pages/games/reversi.vue'; import MkShare from './views/pages/share.vue'; import MkFollow from '../common/views/pages/follow.vue'; +import MiOS from '../mios'; /** * init @@ -102,62 +102,56 @@ init(async (launch) => { } if ((Notification as any).permission == 'granted') { - registerNotifications(os.stream); + registerNotifications(os); } } }, true); -function registerNotifications(stream: HomeStreamManager) { +function registerNotifications(os: MiOS) { + const stream = os.stream; + if (stream == null) return; - if (stream.hasConnection) { - attach(stream.borrow()); - } + const connection = stream.useSharedConnection('main'); - stream.on('connected', connection => { - attach(connection); + connection.on('notification', notification => { + const _n = composeNotification('notification', notification); + const n = new Notification(_n.title, { + body: _n.body, + icon: _n.icon + }); + setTimeout(n.close.bind(n), 6000); }); - function attach(connection) { - connection.on('notification', notification => { - const _n = composeNotification('notification', notification); - const n = new Notification(_n.title, { - body: _n.body, - icon: _n.icon - }); - setTimeout(n.close.bind(n), 6000); + connection.on('driveFileCreated', file => { + const _n = composeNotification('driveFileCreated', file); + const n = new Notification(_n.title, { + body: _n.body, + icon: _n.icon }); + setTimeout(n.close.bind(n), 5000); + }); - connection.on('drive_file_created', file => { - const _n = composeNotification('drive_file_created', file); - const n = new Notification(_n.title, { - body: _n.body, - icon: _n.icon - }); - setTimeout(n.close.bind(n), 5000); + connection.on('unreadMessagingMessage', message => { + const _n = composeNotification('unreadMessagingMessage', message); + const n = new Notification(_n.title, { + body: _n.body, + icon: _n.icon }); + n.onclick = () => { + n.close(); + /*(riot as any).mount(document.body.appendChild(document.createElement('mk-messaging-room-window')), { + user: message.user + });*/ + }; + setTimeout(n.close.bind(n), 7000); + }); - connection.on('unread_messaging_message', message => { - const _n = composeNotification('unread_messaging_message', message); - const n = new Notification(_n.title, { - body: _n.body, - icon: _n.icon - }); - n.onclick = () => { - n.close(); - /*(riot as any).mount(document.body.appendChild(document.createElement('mk-messaging-room-window')), { - user: message.user - });*/ - }; - setTimeout(n.close.bind(n), 7000); + connection.on('reversiInvited', matching => { + const _n = composeNotification('reversiInvited', matching); + const n = new Notification(_n.title, { + body: _n.body, + icon: _n.icon }); - - connection.on('reversi_invited', matching => { - const _n = composeNotification('reversi_invited', matching); - const n = new Notification(_n.title, { - body: _n.body, - icon: _n.icon - }); - }); - } + }); } diff --git a/src/client/app/desktop/views/components/drive.vue b/src/client/app/desktop/views/components/drive.vue index f9b7eea64e..1376a04d99 100644 --- a/src/client/app/desktop/views/components/drive.vue +++ b/src/client/app/desktop/views/components/drive.vue @@ -98,8 +98,7 @@ export default Vue.extend({ hierarchyFolders: [], selectedFiles: [], uploadings: [], - connection: null, - connectionId: null, + connection: null /** * ドロップされようとしているか @@ -116,8 +115,7 @@ export default Vue.extend({ }; }, mounted() { - this.connection = (this as any).os.streams.driveStream.getConnection(); - this.connectionId = (this as any).os.streams.driveStream.use(); + this.connection = (this as any).os.stream.useSharedConnection('drive'); this.connection.on('file_created', this.onStreamDriveFileCreated); this.connection.on('file_updated', this.onStreamDriveFileUpdated); @@ -132,12 +130,7 @@ export default Vue.extend({ } }, beforeDestroy() { - this.connection.off('file_created', this.onStreamDriveFileCreated); - this.connection.off('file_updated', this.onStreamDriveFileUpdated); - this.connection.off('file_deleted', this.onStreamDriveFileDeleted); - this.connection.off('folder_created', this.onStreamDriveFolderCreated); - this.connection.off('folder_updated', this.onStreamDriveFolderUpdated); - (this as any).os.streams.driveStream.dispose(this.connectionId); + this.connection.dispose(); }, methods: { onContextmenu(e) { diff --git a/src/client/app/desktop/views/components/follow-button.vue b/src/client/app/desktop/views/components/follow-button.vue index 4d4bd5cc5a..4d3d61dfe0 100644 --- a/src/client/app/desktop/views/components/follow-button.vue +++ b/src/client/app/desktop/views/components/follow-button.vue @@ -34,23 +34,18 @@ export default Vue.extend({ return { u: this.user, wait: false, - connection: null, - connectionId: null + connection: null }; }, mounted() { - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); - + this.connection = (this as any).os.stream.useSharedConnection('main'); this.connection.on('follow', this.onFollow); this.connection.on('unfollow', this.onUnfollow); }, beforeDestroy() { - this.connection.off('follow', this.onFollow); - this.connection.off('unfollow', this.onUnfollow); - (this as any).os.stream.dispose(this.connectionId); + this.connection.dispose(); }, methods: { diff --git a/src/client/app/desktop/views/components/home.vue b/src/client/app/desktop/views/components/home.vue index bdaf2ddf47..9008e26263 100644 --- a/src/client/app/desktop/views/components/home.vue +++ b/src/client/app/desktop/views/components/home.vue @@ -141,7 +141,6 @@ export default Vue.extend({ data() { return { connection: null, - connectionId: null, widgetAdderSelected: null, trash: [] }; @@ -176,12 +175,11 @@ export default Vue.extend({ }, mounted() { - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); + this.connection = (this as any).os.stream.useSharedConnection('main'); }, beforeDestroy() { - (this as any).os.stream.dispose(this.connectionId); + this.connection.dispose(); }, methods: { diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue index 0c4b560e98..b119f23d7a 100644 --- a/src/client/app/desktop/views/components/note-detail.vue +++ b/src/client/app/desktop/views/components/note-detail.vue @@ -93,12 +93,15 @@ import MkNoteMenu from '../../../common/views/components/note-menu.vue'; import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; import XSub from './notes.note.sub.vue'; import { sum } from '../../../../../prelude/array'; +import noteSubscriber from '../../../common/scripts/note-subscriber'; export default Vue.extend({ components: { XSub }, + mixins: [noteSubscriber('note')], + props: { note: { type: Object, diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index b628d045aa..3892260181 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -77,6 +77,7 @@ import MkNoteMenu from '../../../common/views/components/note-menu.vue'; import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; import XSub from './notes.note.sub.vue'; import { sum } from '../../../../../prelude/array'; +import noteSubscriber from '../../../common/scripts/note-subscriber'; function focus(el, fn) { const target = fn(el); @@ -94,6 +95,8 @@ export default Vue.extend({ XSub }, + mixins: [noteSubscriber('note')], + props: { note: { type: Object, @@ -104,9 +107,7 @@ export default Vue.extend({ data() { return { showContent: false, - isDetailOpened: false, - connection: null, - connectionId: null + isDetailOpened: false }; }, @@ -168,86 +169,7 @@ export default Vue.extend({ } }, - created() { - if (this.$store.getters.isSignedIn) { - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); - } - }, - - mounted() { - this.capture(true); - - if (this.$store.getters.isSignedIn) { - this.connection.on('_connected_', this.onStreamConnected); - } - - // Draw map - if (this.p.geo) { - const shouldShowMap = this.$store.getters.isSignedIn ? this.$store.state.settings.showMaps : true; - if (shouldShowMap) { - (this as any).os.getGoogleMaps().then(maps => { - const uluru = new maps.LatLng(this.p.geo.coordinates[1], this.p.geo.coordinates[0]); - const map = new maps.Map(this.$refs.map, { - center: uluru, - zoom: 15 - }); - new maps.Marker({ - position: uluru, - map: map - }); - }); - } - } - }, - - beforeDestroy() { - this.decapture(true); - - if (this.$store.getters.isSignedIn) { - this.connection.off('_connected_', this.onStreamConnected); - (this as any).os.stream.dispose(this.connectionId); - } - }, - methods: { - capture(withHandler = false) { - if (this.$store.getters.isSignedIn) { - const data = { - type: 'capture', - id: this.p.id - } as any; - if ((this.p.visibleUserIds || []).includes(this.$store.state.i.id) || (this.p.mentions || []).includes(this.$store.state.i.id)) { - data.read = true; - } - this.connection.send(data); - if (withHandler) this.connection.on('note-updated', this.onStreamNoteUpdated); - } - }, - - decapture(withHandler = false) { - if (this.$store.getters.isSignedIn) { - this.connection.send({ - type: 'decapture', - id: this.p.id - }); - if (withHandler) this.connection.off('note-updated', this.onStreamNoteUpdated); - } - }, - - onStreamConnected() { - this.capture(); - }, - - onStreamNoteUpdated(data) { - const note = data.note; - if (note.id == this.note.id) { - this.$emit('update:note', note); - } else if (note.id == this.note.renoteId) { - this.note.renote = note; - } - }, - reply(viaKeyboard = false) { (this as any).os.new(MkPostFormWindow, { reply: this.p, diff --git a/src/client/app/desktop/views/components/notifications.vue b/src/client/app/desktop/views/components/notifications.vue index 1f3f62395a..95b8e1355a 100644 --- a/src/client/app/desktop/views/components/notifications.vue +++ b/src/client/app/desktop/views/components/notifications.vue @@ -118,10 +118,10 @@ export default Vue.extend({ notifications: [], moreNotifications: false, connection: null, - connectionId: null, getNoteSummary }; }, + computed: { _notifications(): any[] { return (this.notifications as any).map(notification => { @@ -133,9 +133,9 @@ export default Vue.extend({ }); } }, + mounted() { - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); + this.connection = (this as any).os.stream.useSharedConnection('main'); this.connection.on('notification', this.onNotification); @@ -153,10 +153,11 @@ export default Vue.extend({ this.fetching = false; }); }, + beforeDestroy() { - this.connection.off('notification', this.onNotification); - (this as any).os.stream.dispose(this.connectionId); + this.connection.dispose(); }, + methods: { fetchMoreNotifications() { this.fetchingMoreNotifications = true; @@ -177,10 +178,11 @@ export default Vue.extend({ this.fetchingMoreNotifications = false; }); }, + onNotification(notification) { // TODO: ユーザーが画面を見てないと思われるとき(ブラウザやタブがアクティブじゃないなど)は送信しない this.connection.send({ - type: 'read_notification', + type: 'readNotification', id: notification.id }); diff --git a/src/client/app/desktop/views/components/settings.signins.vue b/src/client/app/desktop/views/components/settings.signins.vue index a414c95c27..7d1bb4f4e7 100644 --- a/src/client/app/desktop/views/components/settings.signins.vue +++ b/src/client/app/desktop/views/components/settings.signins.vue @@ -23,25 +23,25 @@ export default Vue.extend({ return { fetching: true, signins: [], - connection: null, - connectionId: null + connection: null }; }, + mounted() { (this as any).api('i/signin_history').then(signins => { this.signins = signins; this.fetching = false; }); - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); + this.connection = (this as any).os.stream.useSharedConnection('main'); this.connection.on('signin', this.onSignin); }, + beforeDestroy() { - this.connection.off('signin', this.onSignin); - (this as any).os.stream.dispose(this.connectionId); + this.connection.dispose(); }, + methods: { onSignin(signin) { this.signins.unshift(signin); diff --git a/src/client/app/desktop/views/components/timeline.core.vue b/src/client/app/desktop/views/components/timeline.core.vue index aef873dd11..2c17e936eb 100644 --- a/src/client/app/desktop/views/components/timeline.core.vue +++ b/src/client/app/desktop/views/components/timeline.core.vue @@ -15,7 +15,6 @@ <script lang="ts"> import Vue from 'vue'; -import { HashtagStream } from '../../../common/scripts/streaming/hashtag'; const fetchLimit = 10; @@ -35,9 +34,7 @@ export default Vue.extend({ fetching: true, moreFetching: false, existMore: false, - streamManager: null, connection: null, - connectionId: null, date: null, baseQuery: { includeMyRenotes: this.$store.state.settings.showMyRenotes, @@ -69,69 +66,33 @@ export default Vue.extend({ this.query = { query: this.tagTl.query }; - this.connection = new HashtagStream((this as any).os, this.$store.state.i, this.tagTl.query); + this.connection = (this as any).os.stream.connectToChannel('hashtag', { q: this.tagTl.query }); this.connection.on('note', prepend); - this.$once('beforeDestroy', () => { - this.connection.off('note', prepend); - this.connection.close(); - }); } else if (this.src == 'home') { this.endpoint = 'notes/timeline'; const onChangeFollowing = () => { this.fetch(); }; - this.streamManager = (this as any).os.stream; - this.connection = this.streamManager.getConnection(); - this.connectionId = this.streamManager.use(); + this.connection = (this as any).os.stream.useSharedConnection('homeTimeline'); this.connection.on('note', prepend); this.connection.on('follow', onChangeFollowing); this.connection.on('unfollow', onChangeFollowing); - this.$once('beforeDestroy', () => { - this.connection.off('note', prepend); - this.connection.off('follow', onChangeFollowing); - this.connection.off('unfollow', onChangeFollowing); - this.streamManager.dispose(this.connectionId); - }); } else if (this.src == 'local') { this.endpoint = 'notes/local-timeline'; - this.streamManager = (this as any).os.streams.localTimelineStream; - this.connection = this.streamManager.getConnection(); - this.connectionId = this.streamManager.use(); + this.connection = (this as any).os.stream.useSharedConnection('localTimeline'); this.connection.on('note', prepend); - this.$once('beforeDestroy', () => { - this.connection.off('note', prepend); - this.streamManager.dispose(this.connectionId); - }); } else if (this.src == 'hybrid') { this.endpoint = 'notes/hybrid-timeline'; - this.streamManager = (this as any).os.streams.hybridTimelineStream; - this.connection = this.streamManager.getConnection(); - this.connectionId = this.streamManager.use(); + this.connection = (this as any).os.stream.useSharedConnection('hybridTimeline'); this.connection.on('note', prepend); - this.$once('beforeDestroy', () => { - this.connection.off('note', prepend); - this.streamManager.dispose(this.connectionId); - }); } else if (this.src == 'global') { this.endpoint = 'notes/global-timeline'; - this.streamManager = (this as any).os.streams.globalTimelineStream; - this.connection = this.streamManager.getConnection(); - this.connectionId = this.streamManager.use(); + this.connection = (this as any).os.stream.useSharedConnection('globalTimeline'); this.connection.on('note', prepend); - this.$once('beforeDestroy', () => { - this.connection.off('note', prepend); - this.streamManager.dispose(this.connectionId); - }); } else if (this.src == 'mentions') { this.endpoint = 'notes/mentions'; - this.streamManager = (this as any).os.stream; - this.connection = this.streamManager.getConnection(); - this.connectionId = this.streamManager.use(); + this.connection = (this as any).os.stream.useSharedConnection('main'); this.connection.on('mention', prepend); - this.$once('beforeDestroy', () => { - this.connection.off('mention', prepend); - this.streamManager.dispose(this.connectionId); - }); } else if (this.src == 'messages') { this.endpoint = 'notes/mentions'; this.query = { @@ -142,21 +103,15 @@ export default Vue.extend({ prepend(note); } }; - this.streamManager = (this as any).os.stream; - this.connection = this.streamManager.getConnection(); - this.connectionId = this.streamManager.use(); + this.connection = (this as any).os.stream.useSharedConnection('main'); this.connection.on('mention', onNote); - this.$once('beforeDestroy', () => { - this.connection.off('mention', onNote); - this.streamManager.dispose(this.connectionId); - }); } this.fetch(); }, beforeDestroy() { - this.$emit('beforeDestroy'); + this.connection.dispose(); }, methods: { diff --git a/src/client/app/desktop/views/components/ui.header.nav.vue b/src/client/app/desktop/views/components/ui.header.nav.vue index 4f679db938..122570a696 100644 --- a/src/client/app/desktop/views/components/ui.header.nav.vue +++ b/src/client/app/desktop/views/components/ui.header.nav.vue @@ -42,8 +42,7 @@ export default Vue.extend({ data() { return { hasGameInvitations: false, - connection: null, - connectionId: null + connection: null }; }, computed: { @@ -53,18 +52,15 @@ export default Vue.extend({ }, mounted() { if (this.$store.getters.isSignedIn) { - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); + this.connection = (this as any).os.stream.useSharedConnection('main'); - this.connection.on('reversi_invited', this.onReversiInvited); + this.connection.on('reversiInvited', this.onReversiInvited); this.connection.on('reversi_no_invites', this.onReversiNoInvites); } }, beforeDestroy() { if (this.$store.getters.isSignedIn) { - this.connection.off('reversi_invited', this.onReversiInvited); - this.connection.off('reversi_no_invites', this.onReversiNoInvites); - (this as any).os.stream.dispose(this.connectionId); + this.connection.dispose(); } }, methods: { diff --git a/src/client/app/desktop/views/components/user-list-timeline.vue b/src/client/app/desktop/views/components/user-list-timeline.vue index 0a6f758763..3407851fc5 100644 --- a/src/client/app/desktop/views/components/user-list-timeline.vue +++ b/src/client/app/desktop/views/components/user-list-timeline.vue @@ -6,7 +6,6 @@ <script lang="ts"> import Vue from 'vue'; -import { UserListStream } from '../../../common/scripts/streaming/user-list'; const fetchLimit = 10; diff --git a/src/client/app/desktop/views/pages/admin/admin.dashboard.vue b/src/client/app/desktop/views/pages/admin/admin.dashboard.vue index 1b0c5f8125..c0075220bc 100644 --- a/src/client/app/desktop/views/pages/admin/admin.dashboard.vue +++ b/src/client/app/desktop/views/pages/admin/admin.dashboard.vue @@ -56,13 +56,11 @@ export default Vue.extend({ disableLocalTimeline: false, bannerUrl: null, inviteCode: null, - connection: null, - connectionId: null + connection: null }; }, created() { - this.connection = (this as any).os.streams.serverStatsStream.getConnection(); - this.connectionId = (this as any).os.streams.serverStatsStream.use(); + this.connection = (this as any).os.stream.useSharedConnection('serverStats'); (this as any).os.getMeta().then(meta => { this.disableRegistration = meta.disableRegistration; @@ -75,7 +73,7 @@ export default Vue.extend({ }); }, beforeDestroy() { - (this as any).os.streams.serverStatsStream.dispose(this.connectionId); + this.connection.dispose(); }, methods: { invite() { diff --git a/src/client/app/desktop/views/pages/deck/deck.direct.vue b/src/client/app/desktop/views/pages/deck/deck.direct.vue index ec9e6b9c3d..c771e58a6e 100644 --- a/src/client/app/desktop/views/pages/deck/deck.direct.vue +++ b/src/client/app/desktop/views/pages/deck/deck.direct.vue @@ -21,23 +21,19 @@ export default Vue.extend({ fetching: true, moreFetching: false, existMore: false, - connection: null, - connectionId: null + connection: null }; }, mounted() { - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); - + this.connection = (this as any).os.stream.useSharedConnection('main'); this.connection.on('mention', this.onNote); this.fetch(); }, beforeDestroy() { - this.connection.off('mention', this.onNote); - (this as any).os.stream.dispose(this.connectionId); + this.connection.dispose(); }, methods: { diff --git a/src/client/app/desktop/views/pages/deck/deck.hashtag-tl.vue b/src/client/app/desktop/views/pages/deck/deck.hashtag-tl.vue index f38d5a6df5..02d99d3883 100644 --- a/src/client/app/desktop/views/pages/deck/deck.hashtag-tl.vue +++ b/src/client/app/desktop/views/pages/deck/deck.hashtag-tl.vue @@ -5,7 +5,6 @@ <script lang="ts"> import Vue from 'vue'; import XNotes from './deck.notes.vue'; -import { HashtagStream } from '../../../../common/scripts/streaming/hashtag'; const fetchLimit = 10; @@ -48,7 +47,7 @@ export default Vue.extend({ mounted() { if (this.connection) this.connection.close(); - this.connection = new HashtagStream((this as any).os, this.$store.state.i, this.tagTl.query); + this.connection = (this as any).os.stream.connectToChannel('hashtag', this.tagTl.query); this.connection.on('note', this.onNote); this.fetch(); diff --git a/src/client/app/desktop/views/pages/deck/deck.list-tl.vue b/src/client/app/desktop/views/pages/deck/deck.list-tl.vue index e82e76e4d0..e543130310 100644 --- a/src/client/app/desktop/views/pages/deck/deck.list-tl.vue +++ b/src/client/app/desktop/views/pages/deck/deck.list-tl.vue @@ -5,7 +5,6 @@ <script lang="ts"> import Vue from 'vue'; import XNotes from './deck.notes.vue'; -import { UserListStream } from '../../../../common/scripts/streaming/user-list'; const fetchLimit = 10; diff --git a/src/client/app/desktop/views/pages/deck/deck.mentions.vue b/src/client/app/desktop/views/pages/deck/deck.mentions.vue index cecb75f067..17b572f146 100644 --- a/src/client/app/desktop/views/pages/deck/deck.mentions.vue +++ b/src/client/app/desktop/views/pages/deck/deck.mentions.vue @@ -21,23 +21,19 @@ export default Vue.extend({ fetching: true, moreFetching: false, existMore: false, - connection: null, - connectionId: null + connection: null }; }, mounted() { - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); - + this.connection = (this as any).os.stream.useSharedConnection('main'); this.connection.on('mention', this.onNote); this.fetch(); }, beforeDestroy() { - this.connection.off('mention', this.onNote); - (this as any).os.stream.dispose(this.connectionId); + this.connection.dispose(); }, methods: { diff --git a/src/client/app/desktop/views/pages/deck/deck.note.vue b/src/client/app/desktop/views/pages/deck/deck.note.vue index eac0e78f0f..e843ac54fe 100644 --- a/src/client/app/desktop/views/pages/deck/deck.note.vue +++ b/src/client/app/desktop/views/pages/deck/deck.note.vue @@ -70,12 +70,15 @@ import parse from '../../../../../../mfm/parse'; import MkNoteMenu from '../../../../common/views/components/note-menu.vue'; import MkReactionPicker from '../../../../common/views/components/reaction-picker.vue'; import XSub from './deck.note.sub.vue'; +import noteSubscriber from '../../../../common/scripts/note-subscriber'; export default Vue.extend({ components: { XSub }, + mixins: [noteSubscriber('note')], + props: { note: { type: Object, @@ -90,9 +93,7 @@ export default Vue.extend({ data() { return { - showContent: false, - connection: null, - connectionId: null + showContent: false }; }, @@ -120,68 +121,7 @@ export default Vue.extend({ } }, - created() { - if (this.$store.getters.isSignedIn) { - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); - } - }, - - mounted() { - this.capture(true); - - if (this.$store.getters.isSignedIn) { - this.connection.on('_connected_', this.onStreamConnected); - } - }, - - beforeDestroy() { - this.decapture(true); - - if (this.$store.getters.isSignedIn) { - this.connection.off('_connected_', this.onStreamConnected); - (this as any).os.stream.dispose(this.connectionId); - } - }, - methods: { - capture(withHandler = false) { - if (this.$store.getters.isSignedIn) { - const data = { - type: 'capture', - id: this.p.id - } as any; - if ((this.p.visibleUserIds || []).includes(this.$store.state.i.id) || (this.p.mentions || []).includes(this.$store.state.i.id)) { - data.read = true; - } - this.connection.send(data); - if (withHandler) this.connection.on('note-updated', this.onStreamNoteUpdated); - } - }, - - decapture(withHandler = false) { - if (this.$store.getters.isSignedIn) { - this.connection.send({ - type: 'decapture', - id: this.p.id - }); - if (withHandler) this.connection.off('note-updated', this.onStreamNoteUpdated); - } - }, - - onStreamConnected() { - this.capture(); - }, - - onStreamNoteUpdated(data) { - const note = data.note; - if (note.id == this.note.id) { - this.$emit('update:note', note); - } else if (note.id == this.note.renoteId) { - this.note.renote = note; - } - }, - reply() { (this as any).apis.post({ reply: this.p diff --git a/src/client/app/desktop/views/pages/deck/deck.notifications.vue b/src/client/app/desktop/views/pages/deck/deck.notifications.vue index 1417cc3ee8..29de691fe2 100644 --- a/src/client/app/desktop/views/pages/deck/deck.notifications.vue +++ b/src/client/app/desktop/views/pages/deck/deck.notifications.vue @@ -38,8 +38,7 @@ export default Vue.extend({ notifications: [], queue: [], moreNotifications: false, - connection: null, - connectionId: null + connection: null }; }, @@ -62,8 +61,7 @@ export default Vue.extend({ }, mounted() { - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); + this.connection = (this as any).os.stream.useSharedConnection('main'); this.connection.on('notification', this.onNotification); @@ -86,8 +84,7 @@ export default Vue.extend({ }, beforeDestroy() { - this.connection.off('notification', this.onNotification); - (this as any).os.stream.dispose(this.connectionId); + this.connection.dispose(); this.column.$off('top', this.onTop); this.column.$off('bottom', this.onBottom); @@ -117,7 +114,7 @@ export default Vue.extend({ onNotification(notification) { // TODO: ユーザーが画面を見てないと思われるとき(ブラウザやタブがアクティブじゃないなど)は送信しない this.connection.send({ - type: 'read_notification', + type: 'readNotification', id: notification.id }); diff --git a/src/client/app/desktop/views/pages/deck/deck.tl.vue b/src/client/app/desktop/views/pages/deck/deck.tl.vue index 120ceb7fc2..8aed80fa1b 100644 --- a/src/client/app/desktop/views/pages/deck/deck.tl.vue +++ b/src/client/app/desktop/views/pages/deck/deck.tl.vue @@ -36,18 +36,17 @@ export default Vue.extend({ fetching: true, moreFetching: false, existMore: false, - connection: null, - connectionId: null + connection: null }; }, computed: { stream(): any { switch (this.src) { - case 'home': return (this as any).os.stream; - case 'local': return (this as any).os.streams.localTimelineStream; - case 'hybrid': return (this as any).os.streams.hybridTimelineStream; - case 'global': return (this as any).os.streams.globalTimelineStream; + case 'home': return (this as any).os.stream.useSharedConnection('homeTimeline'); + case 'local': return (this as any).os.stream.useSharedConnection('localTimeline'); + case 'hybrid': return (this as any).os.stream.useSharedConnection('hybridTimeline'); + case 'global': return (this as any).os.stream.useSharedConnection('globalTimeline'); } }, @@ -68,8 +67,7 @@ export default Vue.extend({ }, mounted() { - this.connection = this.stream.getConnection(); - this.connectionId = this.stream.use(); + this.connection = this.stream; this.connection.on('note', this.onNote); if (this.src == 'home') { @@ -81,12 +79,7 @@ export default Vue.extend({ }, beforeDestroy() { - this.connection.off('note', this.onNote); - if (this.src == 'home') { - this.connection.off('follow', this.onChangeFollowing); - this.connection.off('unfollow', this.onChangeFollowing); - } - this.stream.dispose(this.connectionId); + this.connection.dispose(); }, methods: { diff --git a/src/client/app/mios.ts b/src/client/app/mios.ts index ed9e3a6aeb..42171e71fa 100644 --- a/src/client/app/mios.ts +++ b/src/client/app/mios.ts @@ -1,3 +1,4 @@ +import autobind from 'autobind-decorator'; import Vue from 'vue'; import { EventEmitter } from 'eventemitter3'; import * as uuid from 'uuid'; @@ -5,19 +6,9 @@ import * as uuid from 'uuid'; import initStore from './store'; import { apiUrl, version, lang } from './config'; import Progress from './common/scripts/loading'; -import Connection from './common/scripts/streaming/stream'; -import { HomeStreamManager } from './common/scripts/streaming/home'; -import { DriveStreamManager } from './common/scripts/streaming/drive'; -import { ServerStatsStreamManager } from './common/scripts/streaming/server-stats'; -import { NotesStatsStreamManager } from './common/scripts/streaming/notes-stats'; -import { MessagingIndexStreamManager } from './common/scripts/streaming/messaging-index'; -import { ReversiStreamManager } from './common/scripts/streaming/games/reversi/reversi'; import Err from './common/views/components/connect-failed.vue'; -import { LocalTimelineStreamManager } from './common/scripts/streaming/local-timeline'; -import { HybridTimelineStreamManager } from './common/scripts/streaming/hybrid-timeline'; -import { GlobalTimelineStreamManager } from './common/scripts/streaming/global-timeline'; -import { erase } from '../../prelude/array'; +import Stream from './common/scripts/stream'; //#region api requests let spinner = null; @@ -102,30 +93,7 @@ export default class MiOS extends EventEmitter { /** * A connection manager of home stream */ - public stream: HomeStreamManager; - - /** - * Connection managers - */ - public streams: { - localTimelineStream: LocalTimelineStreamManager; - hybridTimelineStream: HybridTimelineStreamManager; - globalTimelineStream: GlobalTimelineStreamManager; - driveStream: DriveStreamManager; - serverStatsStream: ServerStatsStreamManager; - notesStatsStream: NotesStatsStreamManager; - messagingIndexStream: MessagingIndexStreamManager; - reversiStream: ReversiStreamManager; - } = { - localTimelineStream: null, - hybridTimelineStream: null, - globalTimelineStream: null, - driveStream: null, - serverStatsStream: null, - notesStatsStream: null, - messagingIndexStream: null, - reversiStream: null - }; + public stream: Stream; /** * A registration of service worker @@ -151,71 +119,36 @@ export default class MiOS extends EventEmitter { this.shouldRegisterSw = shouldRegisterSw; - //#region BIND - this.log = this.log.bind(this); - this.logInfo = this.logInfo.bind(this); - this.logWarn = this.logWarn.bind(this); - this.logError = this.logError.bind(this); - this.init = this.init.bind(this); - this.api = this.api.bind(this); - this.getMeta = this.getMeta.bind(this); - this.registerSw = this.registerSw.bind(this); - //#endregion - if (this.debug) { (window as any).os = this; } } - private googleMapsIniting = false; - - public getGoogleMaps() { - return new Promise((res, rej) => { - if ((window as any).google && (window as any).google.maps) { - res((window as any).google.maps); - } else { - this.once('init-google-maps', () => { - res((window as any).google.maps); - }); - - //#region load google maps api - if (!this.googleMapsIniting) { - this.googleMapsIniting = true; - (window as any).initGoogleMaps = () => { - this.emit('init-google-maps'); - }; - const head = document.getElementsByTagName('head')[0]; - const script = document.createElement('script'); - script.setAttribute('src', `https://maps.googleapis.com/maps/api/js?key=${googleMapsApiKey}&callback=initGoogleMaps`); - script.setAttribute('async', 'true'); - script.setAttribute('defer', 'true'); - head.appendChild(script); - } - //#endregion - } - }); - } - + @autobind public log(...args) { if (!this.debug) return; console.log.apply(null, args); } + @autobind public logInfo(...args) { if (!this.debug) return; console.info.apply(null, args); } + @autobind public logWarn(...args) { if (!this.debug) return; console.warn.apply(null, args); } + @autobind public logError(...args) { if (!this.debug) return; console.error.apply(null, args); } + @autobind public signout() { this.store.dispatch('logout'); location.href = '/'; @@ -225,27 +158,10 @@ export default class MiOS extends EventEmitter { * Initialize MiOS (boot) * @param callback A function that call when initialized */ + @autobind public async init(callback) { this.store = initStore(this); - //#region Init stream managers - this.streams.serverStatsStream = new ServerStatsStreamManager(this); - this.streams.notesStatsStream = new NotesStatsStreamManager(this); - this.streams.localTimelineStream = new LocalTimelineStreamManager(this, this.store.state.i); - - this.once('signedin', () => { - // Init home stream manager - this.stream = new HomeStreamManager(this, this.store.state.i); - - // Init other stream manager - this.streams.hybridTimelineStream = new HybridTimelineStreamManager(this, this.store.state.i); - this.streams.globalTimelineStream = new GlobalTimelineStreamManager(this, this.store.state.i); - this.streams.driveStream = new DriveStreamManager(this, this.store.state.i); - this.streams.messagingIndexStream = new MessagingIndexStreamManager(this, this.store.state.i); - this.streams.reversiStream = new ReversiStreamManager(this, this.store.state.i); - }); - //#endregion - // ユーザーをフェッチしてコールバックする const fetchme = (token, cb) => { let me = null; @@ -296,6 +212,8 @@ export default class MiOS extends EventEmitter { const fetched = () => { this.emit('signedin'); + this.stream = new Stream(this); + // Finish init callback(); @@ -328,6 +246,8 @@ export default class MiOS extends EventEmitter { } else { // Finish init callback(); + + this.stream = new Stream(this); } }); } @@ -336,6 +256,7 @@ export default class MiOS extends EventEmitter { /** * Register service worker */ + @autobind private registerSw() { // Check whether service worker and push manager supported const isSwSupported = @@ -418,7 +339,8 @@ export default class MiOS extends EventEmitter { * @param endpoint エンドポイント名 * @param data パラメータ */ - public api(endpoint: string, data: { [x: string]: any } = {}): Promise<{ [x: string]: any }> { + @autobind + public api(endpoint: string, data: { [x: string]: any } = {}, forceFetch = false): Promise<{ [x: string]: any }> { if (++pending === 1) { spinner = document.createElement('div'); spinner.setAttribute('id', 'wait'); @@ -430,13 +352,12 @@ export default class MiOS extends EventEmitter { }; const promise = new Promise((resolve, reject) => { - const viaStream = this.stream && this.stream.hasConnection && this.store.state.device.apiViaStream; + const viaStream = this.stream && this.store.state.device.apiViaStream && !forceFetch; if (viaStream) { - const stream = this.stream.borrow(); const id = Math.random().toString(); - stream.once(`api-res:${id}`, res => { + this.stream.once(`api:${id}`, res => { if (res == null || Object.keys(res).length == 0) { resolve(null); } else if (res.res) { @@ -446,11 +367,10 @@ export default class MiOS extends EventEmitter { } }); - stream.send({ - type: 'api', - id, - endpoint, - data + this.stream.send('api', { + id: id, + ep: endpoint, + data: data }); } else { // Append a credential @@ -503,6 +423,7 @@ export default class MiOS extends EventEmitter { * Misskeyのメタ情報を取得します * @param force キャッシュを無視するか否か */ + @autobind public getMeta(force = false) { return new Promise<{ [x: string]: any }>(async (res, rej) => { if (this.isMetaFetching) { @@ -530,16 +451,6 @@ export default class MiOS extends EventEmitter { } }); } - - public connections: Connection[] = []; - - public registerStreamConnection(connection: Connection) { - this.connections.push(connection); - } - - public unregisterStreamConnection(connection: Connection) { - this.connections = erase(connection, this.connections); - } } class WindowSystem extends EventEmitter { diff --git a/src/client/app/mobile/views/components/drive.vue b/src/client/app/mobile/views/components/drive.vue index 8919462511..469f6da240 100644 --- a/src/client/app/mobile/views/components/drive.vue +++ b/src/client/app/mobile/views/components/drive.vue @@ -81,8 +81,7 @@ export default Vue.extend({ hierarchyFolders: [], selectedFiles: [], info: null, - connection: null, - connectionId: null, + connection: null fetching: true, fetchingMoreFiles: false, @@ -102,8 +101,7 @@ export default Vue.extend({ } }, mounted() { - this.connection = (this as any).os.streams.driveStream.getConnection(); - this.connectionId = (this as any).os.streams.driveStream.use(); + this.connection = (this as any).os.stream.useSharedConnection('drive'); this.connection.on('file_created', this.onStreamDriveFileCreated); this.connection.on('file_updated', this.onStreamDriveFileUpdated); @@ -124,12 +122,7 @@ export default Vue.extend({ } }, beforeDestroy() { - this.connection.off('file_created', this.onStreamDriveFileCreated); - this.connection.off('file_updated', this.onStreamDriveFileUpdated); - this.connection.off('file_deleted', this.onStreamDriveFileDeleted); - this.connection.off('folder_created', this.onStreamDriveFolderCreated); - this.connection.off('folder_updated', this.onStreamDriveFolderUpdated); - (this as any).os.streams.driveStream.dispose(this.connectionId); + this.connection.dispose(); }, methods: { onStreamDriveFileCreated(file) { diff --git a/src/client/app/mobile/views/components/follow-button.vue b/src/client/app/mobile/views/components/follow-button.vue index aea2d285e4..3c8b2f98e6 100644 --- a/src/client/app/mobile/views/components/follow-button.vue +++ b/src/client/app/mobile/views/components/follow-button.vue @@ -28,21 +28,17 @@ export default Vue.extend({ return { u: this.user, wait: false, - connection: null, - connectionId: null + connection: null }; }, mounted() { - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); + this.connection = (this as any).os.stream.useSharedConnection('main'); this.connection.on('follow', this.onFollow); this.connection.on('unfollow', this.onUnfollow); }, beforeDestroy() { - this.connection.off('follow', this.onFollow); - this.connection.off('unfollow', this.onUnfollow); - (this as any).os.stream.dispose(this.connectionId); + this.connection.dispose(); }, methods: { diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index 48d6d32868..082f72f1a9 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -92,12 +92,15 @@ import MkNoteMenu from '../../../common/views/components/note-menu.vue'; import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; import XSub from './note.sub.vue'; import { sum } from '../../../../../prelude/array'; +import noteSubscriber from '../../../common/scripts/note-subscriber'; export default Vue.extend({ components: { XSub }, + mixins: [noteSubscriber('note')], + props: { note: { type: Object, diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 4af19ade29..db1be4a00e 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -69,19 +69,20 @@ import MkNoteMenu from '../../../common/views/components/note-menu.vue'; import MkReactionPicker from '../../../common/views/components/reaction-picker.vue'; import XSub from './note.sub.vue'; import { sum } from '../../../../../prelude/array'; +import noteSubscriber from '../../../common/scripts/note-subscriber'; export default Vue.extend({ components: { XSub }, + mixins: [noteSubscriber('note')], + props: ['note'], data() { return { - showContent: false, - connection: null, - connectionId: null + showContent: false }; }, @@ -115,86 +116,7 @@ export default Vue.extend({ } }, - created() { - if (this.$store.getters.isSignedIn) { - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); - } - }, - - mounted() { - this.capture(true); - - if (this.$store.getters.isSignedIn) { - this.connection.on('_connected_', this.onStreamConnected); - } - - // Draw map - if (this.p.geo) { - const shouldShowMap = this.$store.getters.isSignedIn ? this.$store.state.settings.showMaps : true; - if (shouldShowMap) { - (this as any).os.getGoogleMaps().then(maps => { - const uluru = new maps.LatLng(this.p.geo.coordinates[1], this.p.geo.coordinates[0]); - const map = new maps.Map(this.$refs.map, { - center: uluru, - zoom: 15 - }); - new maps.Marker({ - position: uluru, - map: map - }); - }); - } - } - }, - - beforeDestroy() { - this.decapture(true); - - if (this.$store.getters.isSignedIn) { - this.connection.off('_connected_', this.onStreamConnected); - (this as any).os.stream.dispose(this.connectionId); - } - }, - methods: { - capture(withHandler = false) { - if (this.$store.getters.isSignedIn) { - const data = { - type: 'capture', - id: this.p.id - } as any; - if ((this.p.visibleUserIds || []).includes(this.$store.state.i.id) || (this.p.mentions || []).includes(this.$store.state.i.id)) { - data.read = true; - } - this.connection.send(data); - if (withHandler) this.connection.on('note-updated', this.onStreamNoteUpdated); - } - }, - - decapture(withHandler = false) { - if (this.$store.getters.isSignedIn) { - this.connection.send({ - type: 'decapture', - id: this.p.id - }); - if (withHandler) this.connection.off('note-updated', this.onStreamNoteUpdated); - } - }, - - onStreamConnected() { - this.capture(); - }, - - onStreamNoteUpdated(data) { - const note = data.note; - if (note.id == this.note.id) { - this.$emit('update:note', note); - } else if (note.id == this.note.renoteId) { - this.note.renote = note; - } - }, - reply() { (this as any).apis.post({ reply: this.p diff --git a/src/client/app/mobile/views/components/notifications.vue b/src/client/app/mobile/views/components/notifications.vue index bfb6c1e62a..e1a2967071 100644 --- a/src/client/app/mobile/views/components/notifications.vue +++ b/src/client/app/mobile/views/components/notifications.vue @@ -23,6 +23,7 @@ <script lang="ts"> import Vue from 'vue'; + export default Vue.extend({ data() { return { @@ -30,10 +31,10 @@ export default Vue.extend({ fetchingMoreNotifications: false, notifications: [], moreNotifications: false, - connection: null, - connectionId: null + connection: null }; }, + computed: { _notifications(): any[] { return (this.notifications as any).map(notification => { @@ -45,9 +46,9 @@ export default Vue.extend({ }); } }, + mounted() { - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); + this.connection = (this as any).os.stream.useSharedConnection('main'); this.connection.on('notification', this.onNotification); @@ -66,10 +67,11 @@ export default Vue.extend({ this.$emit('fetched'); }); }, + beforeDestroy() { - this.connection.off('notification', this.onNotification); - (this as any).os.stream.dispose(this.connectionId); + this.connection.dispose(); }, + methods: { fetchMoreNotifications() { this.fetchingMoreNotifications = true; @@ -90,10 +92,11 @@ export default Vue.extend({ this.fetchingMoreNotifications = false; }); }, + onNotification(notification) { // TODO: ユーザーが画面を見てないと思われるとき(ブラウザやタブがアクティブじゃないなど)は送信しない this.connection.send({ - type: 'read_notification', + type: 'readNotification', id: notification.id }); diff --git a/src/client/app/mobile/views/components/ui.header.vue b/src/client/app/mobile/views/components/ui.header.vue index 7fd68002e7..9793d03a8c 100644 --- a/src/client/app/mobile/views/components/ui.header.vue +++ b/src/client/app/mobile/views/components/ui.header.vue @@ -24,44 +24,47 @@ import { env } from '../../../config'; export default Vue.extend({ props: ['func'], + data() { return { hasGameInvitation: false, connection: null, - connectionId: null, env: env }; }, + computed: { hasUnreadNotification(): boolean { return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification; }, + hasUnreadMessagingMessage(): boolean { return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadMessagingMessage; } }, + mounted() { this.$store.commit('setUiHeaderHeight', this.$refs.root.offsetHeight); if (this.$store.getters.isSignedIn) { - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); + this.connection = (this as any).os.stream.useSharedConnection('main'); - this.connection.on('reversi_invited', this.onReversiInvited); + this.connection.on('reversiInvited', this.onReversiInvited); this.connection.on('reversi_no_invites', this.onReversiNoInvites); } }, + beforeDestroy() { if (this.$store.getters.isSignedIn) { - this.connection.off('reversi_invited', this.onReversiInvited); - this.connection.off('reversi_no_invites', this.onReversiNoInvites); - (this as any).os.stream.dispose(this.connectionId); + this.connection.dispose(); } }, + methods: { onReversiInvited() { this.hasGameInvitation = true; }, + onReversiNoInvites() { this.hasGameInvitation = false; } diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue index ba122cc3e2..c9c0c082b2 100644 --- a/src/client/app/mobile/views/components/ui.nav.vue +++ b/src/client/app/mobile/views/components/ui.nav.vue @@ -57,7 +57,6 @@ export default Vue.extend({ return { hasGameInvitation: false, connection: null, - connectionId: null, aboutUrl: `/docs/${lang}/about`, announcements: [] }; @@ -79,19 +78,16 @@ export default Vue.extend({ }); if (this.$store.getters.isSignedIn) { - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); + this.connection = (this as any).os.stream.useSharedConnection('main'); - this.connection.on('reversi_invited', this.onReversiInvited); + this.connection.on('reversiInvited', this.onReversiInvited); this.connection.on('reversi_no_invites', this.onReversiNoInvites); } }, beforeDestroy() { if (this.$store.getters.isSignedIn) { - this.connection.off('reversi_invited', this.onReversiInvited); - this.connection.off('reversi_no_invites', this.onReversiNoInvites); - (this as any).os.stream.dispose(this.connectionId); + this.connection.dispose(); } }, diff --git a/src/client/app/mobile/views/components/ui.vue b/src/client/app/mobile/views/components/ui.vue index d2af15d235..b16c246b10 100644 --- a/src/client/app/mobile/views/components/ui.vue +++ b/src/client/app/mobile/views/components/ui.vue @@ -23,40 +23,43 @@ export default Vue.extend({ XHeader, XNav }, + props: ['title'], + data() { return { isDrawerOpening: false, - connection: null, - connectionId: null + connection: null }; }, + watch: { '$store.state.uiHeaderHeight'() { this.$el.style.paddingTop = this.$store.state.uiHeaderHeight + 'px'; } }, + mounted() { this.$el.style.paddingTop = this.$store.state.uiHeaderHeight + 'px'; if (this.$store.getters.isSignedIn) { - this.connection = (this as any).os.stream.getConnection(); - this.connectionId = (this as any).os.stream.use(); + this.connection = (this as any).os.stream.useSharedConnection('main'); this.connection.on('notification', this.onNotification); } }, + beforeDestroy() { if (this.$store.getters.isSignedIn) { - this.connection.off('notification', this.onNotification); - (this as any).os.stream.dispose(this.connectionId); + this.connection.dispose(); } }, + methods: { onNotification(notification) { // TODO: ユーザーが画面を見てないと思われるとき(ブラウザやタブがアクティブじゃないなど)は送信しない this.connection.send({ - type: 'read_notification', + type: 'readNotification', id: notification.id }); diff --git a/src/client/app/mobile/views/components/user-list-timeline.vue b/src/client/app/mobile/views/components/user-list-timeline.vue index 9b3f11f5c2..97200eb5b3 100644 --- a/src/client/app/mobile/views/components/user-list-timeline.vue +++ b/src/client/app/mobile/views/components/user-list-timeline.vue @@ -6,7 +6,6 @@ <script lang="ts"> import Vue from 'vue'; -import { UserListStream } from '../../../common/scripts/streaming/user-list'; const fetchLimit = 10; diff --git a/src/client/app/mobile/views/pages/home.timeline.vue b/src/client/app/mobile/views/pages/home.timeline.vue index 225abcff6b..1979747bf7 100644 --- a/src/client/app/mobile/views/pages/home.timeline.vue +++ b/src/client/app/mobile/views/pages/home.timeline.vue @@ -13,7 +13,6 @@ <script lang="ts"> import Vue from 'vue'; -import { HashtagStream } from '../../../common/scripts/streaming/hashtag'; const fetchLimit = 10; @@ -35,7 +34,6 @@ export default Vue.extend({ existMore: false, streamManager: null, connection: null, - connectionId: null, unreadCount: 0, date: null, baseQuery: { @@ -68,69 +66,33 @@ export default Vue.extend({ this.query = { query: this.tagTl.query }; - this.connection = new HashtagStream((this as any).os, this.$store.state.i, this.tagTl.query); + this.connection = (this as any).os.stream.connectToChannel('hashtag', { q: this.tagTl.query }); this.connection.on('note', prepend); - this.$once('beforeDestroy', () => { - this.connection.off('note', prepend); - this.connection.close(); - }); } else if (this.src == 'home') { this.endpoint = 'notes/timeline'; const onChangeFollowing = () => { this.fetch(); }; - this.streamManager = (this as any).os.stream; - this.connection = this.streamManager.getConnection(); - this.connectionId = this.streamManager.use(); + this.connection = (this as any).os.stream.useSharedConnection('homeTimeline'); this.connection.on('note', prepend); this.connection.on('follow', onChangeFollowing); this.connection.on('unfollow', onChangeFollowing); - this.$once('beforeDestroy', () => { - this.connection.off('note', prepend); - this.connection.off('follow', onChangeFollowing); - this.connection.off('unfollow', onChangeFollowing); - this.streamManager.dispose(this.connectionId); - }); } else if (this.src == 'local') { this.endpoint = 'notes/local-timeline'; - this.streamManager = (this as any).os.streams.localTimelineStream; - this.connection = this.streamManager.getConnection(); - this.connectionId = this.streamManager.use(); + this.connection = (this as any).os.stream.useSharedConnection('localTimeline'); this.connection.on('note', prepend); - this.$once('beforeDestroy', () => { - this.connection.off('note', prepend); - this.streamManager.dispose(this.connectionId); - }); } else if (this.src == 'hybrid') { this.endpoint = 'notes/hybrid-timeline'; - this.streamManager = (this as any).os.streams.hybridTimelineStream; - this.connection = this.streamManager.getConnection(); - this.connectionId = this.streamManager.use(); + this.connection = (this as any).os.stream.useSharedConnection('hybridTimeline'); this.connection.on('note', prepend); - this.$once('beforeDestroy', () => { - this.connection.off('note', prepend); - this.streamManager.dispose(this.connectionId); - }); } else if (this.src == 'global') { this.endpoint = 'notes/global-timeline'; - this.streamManager = (this as any).os.streams.globalTimelineStream; - this.connection = this.streamManager.getConnection(); - this.connectionId = this.streamManager.use(); + this.connection = (this as any).os.stream.useSharedConnection('globalTimeline'); this.connection.on('note', prepend); - this.$once('beforeDestroy', () => { - this.connection.off('note', prepend); - this.streamManager.dispose(this.connectionId); - }); } else if (this.src == 'mentions') { this.endpoint = 'notes/mentions'; - this.streamManager = (this as any).os.stream; - this.connection = this.streamManager.getConnection(); - this.connectionId = this.streamManager.use(); + this.connection = (this as any).os.stream.useSharedConnection('main'); this.connection.on('mention', prepend); - this.$once('beforeDestroy', () => { - this.connection.off('mention', prepend); - this.streamManager.dispose(this.connectionId); - }); } else if (this.src == 'messages') { this.endpoint = 'notes/mentions'; this.query = { @@ -141,21 +103,15 @@ export default Vue.extend({ prepend(note); } }; - this.streamManager = (this as any).os.stream; - this.connection = this.streamManager.getConnection(); - this.connectionId = this.streamManager.use(); + this.connection = (this as any).os.stream.useSharedConnection('main'); this.connection.on('mention', onNote); - this.$once('beforeDestroy', () => { - this.connection.off('mention', onNote); - this.streamManager.dispose(this.connectionId); - }); } this.fetch(); }, beforeDestroy() { - this.$emit('beforeDestroy'); + this.connection.dispose(); }, methods: { diff --git a/src/client/app/tsconfig.json b/src/client/app/tsconfig.json index e31b52dab1..4a05469673 100644 --- a/src/client/app/tsconfig.json +++ b/src/client/app/tsconfig.json @@ -14,7 +14,8 @@ "removeComments": false, "noLib": false, "strict": true, - "strictNullChecks": false + "strictNullChecks": false, + "experimentalDecorators": true }, "compileOnSave": false, "include": [ diff --git a/src/docs/stream.ja-JP.md b/src/docs/stream.ja-JP.md index c720299932..a8b0eb0cdc 100644 --- a/src/docs/stream.ja-JP.md +++ b/src/docs/stream.ja-JP.md @@ -55,7 +55,7 @@ APIへリクエストすると、レスポンスがストリームから次の ```json { - type: 'api-res:xxxxxxxxxxxxxxxx', + type: 'api:xxxxxxxxxxxxxxxx', body: { ... } @@ -95,7 +95,7 @@ Misskeyは投稿のキャプチャと呼ばれる仕組みを提供していま ```json { - type: 'note-updated', + type: 'noteUpdated', body: { note: { ... @@ -108,7 +108,7 @@ Misskeyは投稿のキャプチャと呼ばれる仕組みを提供していま --- -このように、投稿の情報が更新されると、`note-updated`イベントが流れてくるようになります。`note-updated`イベントが発生するのは、以下の場合です: +このように、投稿の情報が更新されると、`noteUpdated`イベントが流れてくるようになります。`noteUpdated`イベントが発生するのは、以下の場合です: - 投稿にリアクションが付いた - 投稿に添付されたアンケートに投票がされた @@ -153,7 +153,7 @@ Misskeyは投稿のキャプチャと呼ばれる仕組みを提供していま `body`プロパティの中に、投稿情報が含まれています。 -### `read_all_notifications` +### `readAllNotifications` 自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。 diff --git a/src/notify.ts b/src/notify.ts index ea7423655e..eaef63e3c3 100644 --- a/src/notify.ts +++ b/src/notify.ts @@ -2,7 +2,7 @@ import * as mongo from 'mongodb'; import Notification from './models/notification'; import Mute from './models/mute'; import { pack } from './models/notification'; -import { publishUserStream } from './stream'; +import { publishMainStream } from './stream'; import User from './models/user'; import pushSw from './push-sw'; @@ -30,7 +30,7 @@ export default ( const packed = await pack(notification); // Publish notification event - publishUserStream(notifiee, 'notification', packed); + publishMainStream(notifiee, 'notification', packed); // Update flag User.update({ _id: notifiee }, { @@ -54,7 +54,7 @@ export default ( } //#endregion - publishUserStream(notifiee, 'unread_notification', packed); + publishMainStream(notifiee, 'unreadNotification', packed); pushSw(notifiee, 'notification', packed); } diff --git a/src/server/api/call.ts b/src/server/api/call.ts index ee79e0a13c..7419bdc95d 100644 --- a/src/server/api/call.ts +++ b/src/server/api/call.ts @@ -9,6 +9,10 @@ export default (endpoint: string, user: IUser, app: IApp, data: any, file?: any) const ep = endpoints.find(e => e.name === endpoint); + if (ep == null) { + return rej('ENDPOINT_NOT_FOUND'); + } + if (ep.meta.secure && !isSecure) { return rej('ACCESS_DENIED'); } diff --git a/src/server/api/common/read-messaging-message.ts b/src/server/api/common/read-messaging-message.ts index 005240a37c..075e369832 100644 --- a/src/server/api/common/read-messaging-message.ts +++ b/src/server/api/common/read-messaging-message.ts @@ -1,7 +1,7 @@ import * as mongo from 'mongodb'; import Message from '../../../models/messaging-message'; import { IMessagingMessage as IMessage } from '../../../models/messaging-message'; -import { publishUserStream } from '../../../stream'; +import { publishMainStream } from '../../../stream'; import { publishMessagingStream } from '../../../stream'; import { publishMessagingIndexStream } from '../../../stream'; import User from '../../../models/user'; @@ -71,6 +71,6 @@ export default ( }); // 全ての(いままで未読だった)自分宛てのメッセージを(これで)読みましたよというイベントを発行 - publishUserStream(userId, 'read_all_messaging_messages'); + publishMainStream(userId, 'readAllMessagingMessages'); } }); diff --git a/src/server/api/common/read-notification.ts b/src/server/api/common/read-notification.ts index 0b0f3e4e5a..2d58ada4ce 100644 --- a/src/server/api/common/read-notification.ts +++ b/src/server/api/common/read-notification.ts @@ -1,6 +1,6 @@ import * as mongo from 'mongodb'; import { default as Notification, INotification } from '../../../models/notification'; -import { publishUserStream } from '../../../stream'; +import { publishMainStream } from '../../../stream'; import Mute from '../../../models/mute'; import User from '../../../models/user'; @@ -66,6 +66,6 @@ export default ( }); // 全ての(いままで未読だった)通知を(これで)読みましたよというイベントを発行 - publishUserStream(userId, 'read_all_notifications'); + publishMainStream(userId, 'readAllNotifications'); } }); diff --git a/src/server/api/endpoints/games/reversi/match.ts b/src/server/api/endpoints/games/reversi/match.ts index aba400af1d..d7483a0bfd 100644 --- a/src/server/api/endpoints/games/reversi/match.ts +++ b/src/server/api/endpoints/games/reversi/match.ts @@ -2,7 +2,7 @@ import $ from 'cafy'; import ID from '../../../../../misc/cafy-id'; import Matching, { pack as packMatching } from '../../../../../models/games/reversi/matching'; import ReversiGame, { pack as packGame } from '../../../../../models/games/reversi/game'; import User, { ILocalUser } from '../../../../../models/user'; -import { publishUserStream, publishReversiStream } from '../../../../../stream'; +import { publishMainStream, publishReversiStream } from '../../../../../stream'; import { eighteight } from '../../../../../games/reversi/maps'; export const meta = { @@ -58,7 +58,7 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = }); if (other == 0) { - publishUserStream(user._id, 'reversi_no_invites'); + publishMainStream(user._id, 'reversi_no_invites'); } } else { // Fetch child @@ -94,6 +94,6 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = // 招待 publishReversiStream(child._id, 'invited', packed); - publishUserStream(child._id, 'reversi_invited', packed); + publishMainStream(child._id, 'reversiInvited', packed); } }); diff --git a/src/server/api/endpoints/i/regenerate_token.ts b/src/server/api/endpoints/i/regenerate_token.ts index fe4a5cd118..2d85f06cfa 100644 --- a/src/server/api/endpoints/i/regenerate_token.ts +++ b/src/server/api/endpoints/i/regenerate_token.ts @@ -1,7 +1,7 @@ import $ from 'cafy'; import * as bcrypt from 'bcryptjs'; import User, { ILocalUser } from '../../../../models/user'; -import { publishUserStream } from '../../../../stream'; +import { publishMainStream } from '../../../../stream'; import generateUserToken from '../../common/generate-native-user-token'; export const meta = { @@ -33,5 +33,5 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res, res(); // Publish event - publishUserStream(user._id, 'my_token_regenerated'); + publishMainStream(user._id, 'myTokenRegenerated'); }); diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index c1be0b6ebc..548ce5cadb 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -1,6 +1,6 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id'; import User, { isValidName, isValidDescription, isValidLocation, isValidBirthday, pack, ILocalUser } from '../../../../models/user'; -import { publishUserStream } from '../../../../stream'; +import { publishMainStream } from '../../../../stream'; import DriveFile from '../../../../models/drive-file'; import acceptAllFollowRequests from '../../../../services/following/requests/accept-all'; import { IApp } from '../../../../models/app'; @@ -177,7 +177,7 @@ export default async (params: any, user: ILocalUser, app: IApp) => new Promise(a res(iObj); // Publish meUpdated event - publishUserStream(user._id, 'meUpdated', iObj); + publishMainStream(user._id, 'meUpdated', iObj); // 鍵垢を解除したとき、溜まっていたフォローリクエストがあるならすべて承認 if (user.isLocked && ps.isLocked === false) { diff --git a/src/server/api/endpoints/i/update_client_setting.ts b/src/server/api/endpoints/i/update_client_setting.ts index aed93c792f..2c05299dff 100644 --- a/src/server/api/endpoints/i/update_client_setting.ts +++ b/src/server/api/endpoints/i/update_client_setting.ts @@ -1,6 +1,6 @@ import $ from 'cafy'; import User, { ILocalUser } from '../../../../models/user'; -import { publishUserStream } from '../../../../stream'; +import { publishMainStream } from '../../../../stream'; export const meta = { requireCredential: true, @@ -26,7 +26,7 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res, res(); // Publish event - publishUserStream(user._id, 'clientSettingUpdated', { + publishMainStream(user._id, 'clientSettingUpdated', { key: name, value }); diff --git a/src/server/api/endpoints/i/update_home.ts b/src/server/api/endpoints/i/update_home.ts index ffca9b90b3..27afc9fe5a 100644 --- a/src/server/api/endpoints/i/update_home.ts +++ b/src/server/api/endpoints/i/update_home.ts @@ -1,6 +1,6 @@ import $ from 'cafy'; import User, { ILocalUser } from '../../../../models/user'; -import { publishUserStream } from '../../../../stream'; +import { publishMainStream } from '../../../../stream'; export const meta = { requireCredential: true, @@ -25,5 +25,5 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res, res(); - publishUserStream(user._id, 'home_updated', home); + publishMainStream(user._id, 'homeUpdated', home); }); diff --git a/src/server/api/endpoints/i/update_mobile_home.ts b/src/server/api/endpoints/i/update_mobile_home.ts index 0b72fbe2c1..1d4df389e4 100644 --- a/src/server/api/endpoints/i/update_mobile_home.ts +++ b/src/server/api/endpoints/i/update_mobile_home.ts @@ -1,6 +1,6 @@ import $ from 'cafy'; import User, { ILocalUser } from '../../../../models/user'; -import { publishUserStream } from '../../../../stream'; +import { publishMainStream } from '../../../../stream'; export const meta = { requireCredential: true, @@ -24,5 +24,5 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res, res(); - publishUserStream(user._id, 'mobile_home_updated', home); + publishMainStream(user._id, 'mobileHomeUpdated', home); }); diff --git a/src/server/api/endpoints/i/update_widget.ts b/src/server/api/endpoints/i/update_widget.ts index 5cbe7c07a3..92499493eb 100644 --- a/src/server/api/endpoints/i/update_widget.ts +++ b/src/server/api/endpoints/i/update_widget.ts @@ -1,6 +1,6 @@ import $ from 'cafy'; import User, { ILocalUser } from '../../../../models/user'; -import { publishUserStream } from '../../../../stream'; +import { publishMainStream } from '../../../../stream'; export const meta = { requireCredential: true, @@ -73,7 +73,7 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res, //#endregion if (widget) { - publishUserStream(user._id, 'widgetUpdated', { + publishMainStream(user._id, 'widgetUpdated', { id, data }); diff --git a/src/server/api/endpoints/messaging/messages/create.ts b/src/server/api/endpoints/messaging/messages/create.ts index 9a49e09248..f504f92326 100644 --- a/src/server/api/endpoints/messaging/messages/create.ts +++ b/src/server/api/endpoints/messaging/messages/create.ts @@ -6,7 +6,7 @@ import User, { ILocalUser } from '../../../../../models/user'; import Mute from '../../../../../models/mute'; import DriveFile from '../../../../../models/drive-file'; import { pack } from '../../../../../models/messaging-message'; -import { publishUserStream } from '../../../../../stream'; +import { publishMainStream } from '../../../../../stream'; import { publishMessagingStream, publishMessagingIndexStream } from '../../../../../stream'; import pushSw from '../../../../../push-sw'; @@ -88,12 +88,12 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = // 自分のストリーム publishMessagingStream(message.userId, message.recipientId, 'message', messageObj); publishMessagingIndexStream(message.userId, 'message', messageObj); - publishUserStream(message.userId, 'messaging_message', messageObj); + publishMainStream(message.userId, 'messagingMessage', messageObj); // 相手のストリーム publishMessagingStream(message.recipientId, message.userId, 'message', messageObj); publishMessagingIndexStream(message.recipientId, 'message', messageObj); - publishUserStream(message.recipientId, 'messaging_message', messageObj); + publishMainStream(message.recipientId, 'messagingMessage', messageObj); // Update flag User.update({ _id: recipient._id }, { @@ -117,8 +117,8 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = } //#endregion - publishUserStream(message.recipientId, 'unread_messaging_message', messageObj); - pushSw(message.recipientId, 'unread_messaging_message', messageObj); + publishMainStream(message.recipientId, 'unreadMessagingMessage', messageObj); + pushSw(message.recipientId, 'unreadMessagingMessage', messageObj); } }, 3000); diff --git a/src/server/api/endpoints/notes/polls/vote.ts b/src/server/api/endpoints/notes/polls/vote.ts index ab80e7f5d0..3b78d62fd3 100644 --- a/src/server/api/endpoints/notes/polls/vote.ts +++ b/src/server/api/endpoints/notes/polls/vote.ts @@ -72,7 +72,10 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = $inc: inc }); - publishNoteStream(note._id, 'poll_voted'); + publishNoteStream(note._id, 'pollVoted', { + choice: choice, + userId: user._id.toHexString() + }); // Notify notify(note.userId, user._id, 'poll_vote', { diff --git a/src/server/api/endpoints/notifications/mark_all_as_read.ts b/src/server/api/endpoints/notifications/mark_all_as_read.ts index e2bde777b3..6487cd8b48 100644 --- a/src/server/api/endpoints/notifications/mark_all_as_read.ts +++ b/src/server/api/endpoints/notifications/mark_all_as_read.ts @@ -1,5 +1,5 @@ import Notification from '../../../../models/notification'; -import { publishUserStream } from '../../../../stream'; +import { publishMainStream } from '../../../../stream'; import User, { ILocalUser } from '../../../../models/user'; export const meta = { @@ -40,5 +40,5 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = }); // 全ての通知を読みましたよというイベントを発行 - publishUserStream(user._id, 'read_all_notifications'); + publishMainStream(user._id, 'readAllNotifications'); }); diff --git a/src/server/api/private/signin.ts b/src/server/api/private/signin.ts index c42fb7bd8c..0e44c2ddd6 100644 --- a/src/server/api/private/signin.ts +++ b/src/server/api/private/signin.ts @@ -3,7 +3,7 @@ import * as bcrypt from 'bcryptjs'; import * as speakeasy from 'speakeasy'; import User, { ILocalUser } from '../../../models/user'; import Signin, { pack } from '../../../models/signin'; -import { publishUserStream } from '../../../stream'; +import { publishMainStream } from '../../../stream'; import signin from '../common/signin'; import config from '../../../config'; @@ -87,5 +87,5 @@ export default async (ctx: Koa.Context) => { }); // Publish signin event - publishUserStream(user._id, 'signin', await pack(record)); + publishMainStream(user._id, 'signin', await pack(record)); }; diff --git a/src/server/api/service/twitter.ts b/src/server/api/service/twitter.ts index aad2846bb4..f71e588628 100644 --- a/src/server/api/service/twitter.ts +++ b/src/server/api/service/twitter.ts @@ -4,7 +4,7 @@ import * as uuid from 'uuid'; import autwh from 'autwh'; import redis from '../../../db/redis'; import User, { pack, ILocalUser } from '../../../models/user'; -import { publishUserStream } from '../../../stream'; +import { publishMainStream } from '../../../stream'; import config from '../../../config'; import signin from '../common/signin'; @@ -49,7 +49,7 @@ router.get('/disconnect/twitter', async ctx => { ctx.body = `Twitterの連携を解除しました :v:`; // Publish i updated event - publishUserStream(user._id, 'meUpdated', await pack(user, user, { + publishMainStream(user._id, 'meUpdated', await pack(user, user, { detail: true, includeSecrets: true })); @@ -174,7 +174,7 @@ if (config.twitter == null) { ctx.body = `Twitter: @${result.screenName} を、Misskey: @${user.username} に接続しました!`; // Publish i updated event - publishUserStream(user._id, 'meUpdated', await pack(user, user, { + publishMainStream(user._id, 'meUpdated', await pack(user, user, { detail: true, includeSecrets: true })); diff --git a/src/server/api/stream/channel.ts b/src/server/api/stream/channel.ts new file mode 100644 index 0000000000..e2726060dc --- /dev/null +++ b/src/server/api/stream/channel.ts @@ -0,0 +1,39 @@ +import autobind from 'autobind-decorator'; +import Connection from '.'; + +/** + * Stream channel + */ +export default abstract class Channel { + protected connection: Connection; + public id: string; + + protected get user() { + return this.connection.user; + } + + protected get subscriber() { + return this.connection.subscriber; + } + + constructor(id: string, connection: Connection) { + this.id = id; + this.connection = connection; + } + + @autobind + public send(typeOrPayload: any, payload?: any) { + const type = payload === undefined ? typeOrPayload.type : typeOrPayload; + const body = payload === undefined ? typeOrPayload.body : payload; + + this.connection.sendMessageToWs('channel', { + id: this.id, + type: type, + body: body + }); + } + + public abstract init(params: any): void; + public dispose?(): void; + public onMessage?(type: string, body: any): void; +} diff --git a/src/server/api/stream/channels/drive.ts b/src/server/api/stream/channels/drive.ts new file mode 100644 index 0000000000..807fc93cd0 --- /dev/null +++ b/src/server/api/stream/channels/drive.ts @@ -0,0 +1,12 @@ +import autobind from 'autobind-decorator'; +import Channel from '../channel'; + +export default class extends Channel { + @autobind + public async init(params: any) { + // Subscribe drive stream + this.subscriber.on(`driveStream:${this.user._id}`, data => { + this.send(data); + }); + } +} diff --git a/src/server/api/stream/channels/games/reversi-game.ts b/src/server/api/stream/channels/games/reversi-game.ts new file mode 100644 index 0000000000..11f1fb1feb --- /dev/null +++ b/src/server/api/stream/channels/games/reversi-game.ts @@ -0,0 +1,309 @@ +import autobind from 'autobind-decorator'; +import * as CRC32 from 'crc-32'; +import ReversiGame, { pack } from '../../../../../models/games/reversi/game'; +import { publishReversiGameStream } from '../../../../../stream'; +import Reversi from '../../../../../games/reversi/core'; +import * as maps from '../../../../../games/reversi/maps'; +import Channel from '../../channel'; + +export default class extends Channel { + private gameId: string; + + @autobind + public async init(params: any) { + this.gameId = params.gameId as string; + + // Subscribe game stream + this.subscriber.on(`reversiGameStream:${this.gameId}`, data => { + this.send(data); + }); + } + + @autobind + public onMessage(type: string, body: any) { + switch (type) { + case 'accept': this.accept(true); break; + case 'cancel-accept': this.accept(false); break; + case 'update-settings': this.updateSettings(body.settings); break; + case 'init-form': this.initForm(body); break; + case 'update-form': this.updateForm(body.id, body.value); break; + case 'message': this.message(body); break; + case 'set': this.set(body.pos); break; + case 'check': this.check(body.crc32); break; + } + } + + @autobind + private async updateSettings(settings: any) { + const game = await ReversiGame.findOne({ _id: this.gameId }); + + if (game.isStarted) return; + if (!game.user1Id.equals(this.user._id) && !game.user2Id.equals(this.user._id)) return; + if (game.user1Id.equals(this.user._id) && game.user1Accepted) return; + if (game.user2Id.equals(this.user._id) && game.user2Accepted) return; + + await ReversiGame.update({ _id: this.gameId }, { + $set: { + settings + } + }); + + publishReversiGameStream(this.gameId, 'updateSettings', settings); + } + + @autobind + private async initForm(form: any) { + const game = await ReversiGame.findOne({ _id: this.gameId }); + + if (game.isStarted) return; + if (!game.user1Id.equals(this.user._id) && !game.user2Id.equals(this.user._id)) return; + + const set = game.user1Id.equals(this.user._id) ? { + form1: form + } : { + form2: form + }; + + await ReversiGame.update({ _id: this.gameId }, { + $set: set + }); + + publishReversiGameStream(this.gameId, 'initForm', { + userId: this.user._id, + form + }); + } + + @autobind + private async updateForm(id: string, value: any) { + const game = await ReversiGame.findOne({ _id: this.gameId }); + + if (game.isStarted) return; + if (!game.user1Id.equals(this.user._id) && !game.user2Id.equals(this.user._id)) return; + + const form = game.user1Id.equals(this.user._id) ? game.form2 : game.form1; + + const item = form.find((i: any) => i.id == id); + + if (item == null) return; + + item.value = value; + + const set = game.user1Id.equals(this.user._id) ? { + form2: form + } : { + form1: form + }; + + await ReversiGame.update({ _id: this.gameId }, { + $set: set + }); + + publishReversiGameStream(this.gameId, 'updateForm', { + userId: this.user._id, + id, + value + }); + } + + @autobind + private async message(message: any) { + message.id = Math.random(); + publishReversiGameStream(this.gameId, 'message', { + userId: this.user._id, + message + }); + } + + @autobind + private async accept(accept: boolean) { + const game = await ReversiGame.findOne({ _id: this.gameId }); + + if (game.isStarted) return; + + let bothAccepted = false; + + if (game.user1Id.equals(this.user._id)) { + await ReversiGame.update({ _id: this.gameId }, { + $set: { + user1Accepted: accept + } + }); + + publishReversiGameStream(this.gameId, 'changeAccepts', { + user1: accept, + user2: game.user2Accepted + }); + + if (accept && game.user2Accepted) bothAccepted = true; + } else if (game.user2Id.equals(this.user._id)) { + await ReversiGame.update({ _id: this.gameId }, { + $set: { + user2Accepted: accept + } + }); + + publishReversiGameStream(this.gameId, 'changeAccepts', { + user1: game.user1Accepted, + user2: accept + }); + + if (accept && game.user1Accepted) bothAccepted = true; + } else { + return; + } + + if (bothAccepted) { + // 3秒後、まだacceptされていたらゲーム開始 + setTimeout(async () => { + const freshGame = await ReversiGame.findOne({ _id: this.gameId }); + if (freshGame == null || freshGame.isStarted || freshGame.isEnded) return; + if (!freshGame.user1Accepted || !freshGame.user2Accepted) return; + + let bw: number; + if (freshGame.settings.bw == 'random') { + bw = Math.random() > 0.5 ? 1 : 2; + } else { + bw = freshGame.settings.bw as number; + } + + function getRandomMap() { + const mapCount = Object.entries(maps).length; + const rnd = Math.floor(Math.random() * mapCount); + return Object.values(maps)[rnd].data; + } + + const map = freshGame.settings.map != null ? freshGame.settings.map : getRandomMap(); + + await ReversiGame.update({ _id: this.gameId }, { + $set: { + startedAt: new Date(), + isStarted: true, + black: bw, + 'settings.map': map + } + }); + + //#region 盤面に最初から石がないなどして始まった瞬間に勝敗が決定する場合があるのでその処理 + const o = new Reversi(map, { + isLlotheo: freshGame.settings.isLlotheo, + canPutEverywhere: freshGame.settings.canPutEverywhere, + loopedBoard: freshGame.settings.loopedBoard + }); + + if (o.isEnded) { + let winner; + if (o.winner === true) { + winner = freshGame.black == 1 ? freshGame.user1Id : freshGame.user2Id; + } else if (o.winner === false) { + winner = freshGame.black == 1 ? freshGame.user2Id : freshGame.user1Id; + } else { + winner = null; + } + + await ReversiGame.update({ + _id: this.gameId + }, { + $set: { + isEnded: true, + winnerId: winner + } + }); + + publishReversiGameStream(this.gameId, 'ended', { + winnerId: winner, + game: await pack(this.gameId, this.user) + }); + } + //#endregion + + publishReversiGameStream(this.gameId, 'started', await pack(this.gameId, this.user)); + }, 3000); + } + } + + // 石を打つ + @autobind + private async set(pos: number) { + const game = await ReversiGame.findOne({ _id: this.gameId }); + + if (!game.isStarted) return; + if (game.isEnded) return; + if (!game.user1Id.equals(this.user._id) && !game.user2Id.equals(this.user._id)) return; + + const o = new Reversi(game.settings.map, { + isLlotheo: game.settings.isLlotheo, + canPutEverywhere: game.settings.canPutEverywhere, + loopedBoard: game.settings.loopedBoard + }); + + game.logs.forEach(log => { + o.put(log.color, log.pos); + }); + + const myColor = + (game.user1Id.equals(this.user._id) && game.black == 1) || (game.user2Id.equals(this.user._id) && game.black == 2) + ? true + : false; + + if (!o.canPut(myColor, pos)) return; + o.put(myColor, pos); + + let winner; + if (o.isEnded) { + if (o.winner === true) { + winner = game.black == 1 ? game.user1Id : game.user2Id; + } else if (o.winner === false) { + winner = game.black == 1 ? game.user2Id : game.user1Id; + } else { + winner = null; + } + } + + const log = { + at: new Date(), + color: myColor, + pos + }; + + const crc32 = CRC32.str(game.logs.map(x => x.pos.toString()).join('') + pos.toString()); + + await ReversiGame.update({ + _id: this.gameId + }, { + $set: { + crc32, + isEnded: o.isEnded, + winnerId: winner + }, + $push: { + logs: log + } + }); + + publishReversiGameStream(this.gameId, 'set', Object.assign(log, { + next: o.turn + })); + + if (o.isEnded) { + publishReversiGameStream(this.gameId, 'ended', { + winnerId: winner, + game: await pack(this.gameId, this.user) + }); + } + } + + @autobind + private async check(crc32: string) { + const game = await ReversiGame.findOne({ _id: this.gameId }); + + if (!game.isStarted) return; + + // 互換性のため + if (game.crc32 == null) return; + + if (crc32 !== game.crc32) { + this.send('rescue', await pack(game, this.user)); + } + } +} diff --git a/src/server/api/stream/channels/games/reversi.ts b/src/server/api/stream/channels/games/reversi.ts new file mode 100644 index 0000000000..d75025c944 --- /dev/null +++ b/src/server/api/stream/channels/games/reversi.ts @@ -0,0 +1,30 @@ +import autobind from 'autobind-decorator'; +import * as mongo from 'mongodb'; +import Matching, { pack } from '../../../../../models/games/reversi/matching'; +import { publishMainStream } from '../../../../../stream'; +import Channel from '../../channel'; + +export default class extends Channel { + @autobind + public async init(params: any) { + // Subscribe reversi stream + this.subscriber.on(`reversiStream:${this.user._id}`, data => { + this.send(data); + }); + } + + @autobind + public async onMessage(type: string, body: any) { + switch (type) { + case 'ping': + if (body.id == null) return; + const matching = await Matching.findOne({ + parentId: this.user._id, + childId: new mongo.ObjectID(body.id) + }); + if (matching == null) return; + publishMainStream(matching.childId, 'reversiInvited', await pack(matching, matching.childId)); + break; + } + } +} diff --git a/src/server/api/stream/channels/global-timeline.ts b/src/server/api/stream/channels/global-timeline.ts new file mode 100644 index 0000000000..ab0fe5d094 --- /dev/null +++ b/src/server/api/stream/channels/global-timeline.ts @@ -0,0 +1,39 @@ +import autobind from 'autobind-decorator'; +import Mute from '../../../../models/mute'; +import { pack } from '../../../../models/note'; +import shouldMuteThisNote from '../../../../misc/should-mute-this-note'; +import Channel from '../channel'; + +export default class extends Channel { + private mutedUserIds: string[] = []; + + @autobind + public async init(params: any) { + // Subscribe events + this.subscriber.on('globalTimeline', this.onNote); + + const mute = await Mute.find({ muterId: this.user._id }); + this.mutedUserIds = mute.map(m => m.muteeId.toString()); + } + + @autobind + private async onNote(note: any) { + // Renoteなら再pack + if (note.renoteId != null) { + note.renote = await pack(note.renoteId, this.user, { + detail: true + }); + } + + // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する + if (shouldMuteThisNote(note, this.mutedUserIds)) return; + + this.send('note', note); + } + + @autobind + public dispose() { + // Unsubscribe events + this.subscriber.off('globalTimeline', this.onNote); + } +} diff --git a/src/server/api/stream/channels/hashtag.ts b/src/server/api/stream/channels/hashtag.ts new file mode 100644 index 0000000000..652b0caa5b --- /dev/null +++ b/src/server/api/stream/channels/hashtag.ts @@ -0,0 +1,33 @@ +import autobind from 'autobind-decorator'; +import Mute from '../../../../models/mute'; +import { pack } from '../../../../models/note'; +import shouldMuteThisNote from '../../../../misc/should-mute-this-note'; +import Channel from '../channel'; + +export default class extends Channel { + @autobind + public async init(params: any) { + const mute = this.user ? await Mute.find({ muterId: this.user._id }) : null; + const mutedUserIds = mute ? mute.map(m => m.muteeId.toString()) : []; + + const q: Array<string[]> = params.q; + + // Subscribe stream + this.subscriber.on('hashtag', async note => { + const matched = q.some(tags => tags.every(tag => note.tags.map((t: string) => t.toLowerCase()).includes(tag.toLowerCase()))); + if (!matched) return; + + // Renoteなら再pack + if (note.renoteId != null) { + note.renote = await pack(note.renoteId, this.user, { + detail: true + }); + } + + // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する + if (shouldMuteThisNote(note, mutedUserIds)) return; + + this.send('note', note); + }); + } +} diff --git a/src/server/api/stream/channels/home-timeline.ts b/src/server/api/stream/channels/home-timeline.ts new file mode 100644 index 0000000000..4c674e75ef --- /dev/null +++ b/src/server/api/stream/channels/home-timeline.ts @@ -0,0 +1,39 @@ +import autobind from 'autobind-decorator'; +import Mute from '../../../../models/mute'; +import { pack } from '../../../../models/note'; +import shouldMuteThisNote from '../../../../misc/should-mute-this-note'; +import Channel from '../channel'; + +export default class extends Channel { + private mutedUserIds: string[] = []; + + @autobind + public async init(params: any) { + // Subscribe events + this.subscriber.on(`homeTimeline:${this.user._id}`, this.onNote); + + const mute = await Mute.find({ muterId: this.user._id }); + this.mutedUserIds = mute.map(m => m.muteeId.toString()); + } + + @autobind + private async onNote(note: any) { + // Renoteなら再pack + if (note.renoteId != null) { + note.renote = await pack(note.renoteId, this.user, { + detail: true + }); + } + + // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する + if (shouldMuteThisNote(note, this.mutedUserIds)) return; + + this.send('note', note); + } + + @autobind + public dispose() { + // Unsubscribe events + this.subscriber.off(`homeTimeline:${this.user._id}`, this.onNote); + } +} diff --git a/src/server/api/stream/channels/hybrid-timeline.ts b/src/server/api/stream/channels/hybrid-timeline.ts new file mode 100644 index 0000000000..0b12ab3a8f --- /dev/null +++ b/src/server/api/stream/channels/hybrid-timeline.ts @@ -0,0 +1,41 @@ +import autobind from 'autobind-decorator'; +import Mute from '../../../../models/mute'; +import { pack } from '../../../../models/note'; +import shouldMuteThisNote from '../../../../misc/should-mute-this-note'; +import Channel from '../channel'; + +export default class extends Channel { + private mutedUserIds: string[] = []; + + @autobind + public async init(params: any) { + // Subscribe events + this.subscriber.on('hybridTimeline', this.onNewNote); + this.subscriber.on(`hybridTimeline:${this.user._id}`, this.onNewNote); + + const mute = await Mute.find({ muterId: this.user._id }); + this.mutedUserIds = mute.map(m => m.muteeId.toString()); + } + + @autobind + private async onNewNote(note: any) { + // Renoteなら再pack + if (note.renoteId != null) { + note.renote = await pack(note.renoteId, this.user, { + detail: true + }); + } + + // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する + if (shouldMuteThisNote(note, this.mutedUserIds)) return; + + this.send('note', note); + } + + @autobind + public dispose() { + // Unsubscribe events + this.subscriber.off('hybridTimeline', this.onNewNote); + this.subscriber.off(`hybridTimeline:${this.user._id}`, this.onNewNote); + } +} diff --git a/src/server/api/stream/channels/index.ts b/src/server/api/stream/channels/index.ts new file mode 100644 index 0000000000..7e71590d00 --- /dev/null +++ b/src/server/api/stream/channels/index.ts @@ -0,0 +1,31 @@ +import main from './main'; +import homeTimeline from './home-timeline'; +import localTimeline from './local-timeline'; +import hybridTimeline from './hybrid-timeline'; +import globalTimeline from './global-timeline'; +import notesStats from './notes-stats'; +import serverStats from './server-stats'; +import userList from './user-list'; +import messaging from './messaging'; +import messagingIndex from './messaging-index'; +import drive from './drive'; +import hashtag from './hashtag'; +import gamesReversi from './games/reversi'; +import gamesReversiGame from './games/reversi-game'; + +export default { + main, + homeTimeline, + localTimeline, + hybridTimeline, + globalTimeline, + notesStats, + serverStats, + userList, + messaging, + messagingIndex, + drive, + hashtag, + gamesReversi, + gamesReversiGame +}; diff --git a/src/server/api/stream/channels/local-timeline.ts b/src/server/api/stream/channels/local-timeline.ts new file mode 100644 index 0000000000..769ec6392f --- /dev/null +++ b/src/server/api/stream/channels/local-timeline.ts @@ -0,0 +1,39 @@ +import autobind from 'autobind-decorator'; +import Mute from '../../../../models/mute'; +import { pack } from '../../../../models/note'; +import shouldMuteThisNote from '../../../../misc/should-mute-this-note'; +import Channel from '../channel'; + +export default class extends Channel { + private mutedUserIds: string[] = []; + + @autobind + public async init(params: any) { + // Subscribe events + this.subscriber.on('localTimeline', this.onNote); + + const mute = this.user ? await Mute.find({ muterId: this.user._id }) : null; + this.mutedUserIds = mute ? mute.map(m => m.muteeId.toString()) : []; + } + + @autobind + private async onNote(note: any) { + // Renoteなら再pack + if (note.renoteId != null) { + note.renote = await pack(note.renoteId, this.user, { + detail: true + }); + } + + // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する + if (shouldMuteThisNote(note, this.mutedUserIds)) return; + + this.send('note', note); + } + + @autobind + public dispose() { + // Unsubscribe events + this.subscriber.off('localTimeline', this.onNote); + } +} diff --git a/src/server/api/stream/channels/main.ts b/src/server/api/stream/channels/main.ts new file mode 100644 index 0000000000..a6c5b12760 --- /dev/null +++ b/src/server/api/stream/channels/main.ts @@ -0,0 +1,25 @@ +import autobind from 'autobind-decorator'; +import Mute from '../../../../models/mute'; +import Channel from '../channel'; + +export default class extends Channel { + @autobind + public async init(params: any) { + const mute = await Mute.find({ muterId: this.user._id }); + const mutedUserIds = mute.map(m => m.muteeId.toString()); + + // Subscribe main stream channel + this.subscriber.on(`mainStream:${this.user._id}`, async data => { + const { type, body } = data; + + switch (type) { + case 'notification': { + if (!mutedUserIds.includes(body.userId)) { + this.send('notification', body); + } + break; + } + } + }); + } +} diff --git a/src/server/api/stream/channels/messaging-index.ts b/src/server/api/stream/channels/messaging-index.ts new file mode 100644 index 0000000000..6e87cca7f4 --- /dev/null +++ b/src/server/api/stream/channels/messaging-index.ts @@ -0,0 +1,12 @@ +import autobind from 'autobind-decorator'; +import Channel from '../channel'; + +export default class extends Channel { + @autobind + public async init(params: any) { + // Subscribe messaging index stream + this.subscriber.on(`messagingIndexStream:${this.user._id}`, data => { + this.send(data); + }); + } +} diff --git a/src/server/api/stream/channels/messaging.ts b/src/server/api/stream/channels/messaging.ts new file mode 100644 index 0000000000..e1a78c8678 --- /dev/null +++ b/src/server/api/stream/channels/messaging.ts @@ -0,0 +1,26 @@ +import autobind from 'autobind-decorator'; +import read from '../../common/read-messaging-message'; +import Channel from '../channel'; + +export default class extends Channel { + private otherpartyId: string; + + @autobind + public async init(params: any) { + this.otherpartyId = params.otherparty as string; + + // Subscribe messaging stream + this.subscriber.on(`messagingStream:${this.user._id}-${this.otherpartyId}`, data => { + this.send(data); + }); + } + + @autobind + public onMessage(type: string, body: any) { + switch (type) { + case 'read': + read(this.user._id, this.otherpartyId, body.id); + break; + } + } +} diff --git a/src/server/api/stream/channels/notes-stats.ts b/src/server/api/stream/channels/notes-stats.ts new file mode 100644 index 0000000000..cc68d9886d --- /dev/null +++ b/src/server/api/stream/channels/notes-stats.ts @@ -0,0 +1,34 @@ +import autobind from 'autobind-decorator'; +import Xev from 'xev'; +import Channel from '../channel'; + +const ev = new Xev(); + +export default class extends Channel { + @autobind + public async init(params: any) { + ev.addListener('notesStats', this.onStats); + } + + @autobind + private onStats(stats: any) { + this.send('stats', stats); + } + + @autobind + public onMessage(type: string, body: any) { + switch (type) { + case 'requestLog': + ev.once(`notesStatsLog:${body.id}`, statsLog => { + this.send('statsLog', statsLog); + }); + ev.emit('requestNotesStatsLog', body.id); + break; + } + } + + @autobind + public dispose() { + ev.removeListener('notesStats', this.onStats); + } +} diff --git a/src/server/api/stream/channels/server-stats.ts b/src/server/api/stream/channels/server-stats.ts new file mode 100644 index 0000000000..28a566e8ae --- /dev/null +++ b/src/server/api/stream/channels/server-stats.ts @@ -0,0 +1,37 @@ +import autobind from 'autobind-decorator'; +import Xev from 'xev'; +import Channel from '../channel'; + +const ev = new Xev(); + +export default class extends Channel { + @autobind + public async init(params: any) { + ev.addListener('serverStats', this.onStats); + } + + @autobind + private onStats(stats: any) { + this.send('stats', stats); + } + + @autobind + public onMessage(type: string, body: any) { + switch (type) { + case 'requestLog': + ev.once(`serverStatsLog:${body.id}`, statsLog => { + this.send('statsLog', statsLog); + }); + ev.emit('requestServerStatsLog', { + id: body.id, + length: body.length + }); + break; + } + } + + @autobind + public dispose() { + ev.removeListener('serverStats', this.onStats); + } +} diff --git a/src/server/api/stream/channels/user-list.ts b/src/server/api/stream/channels/user-list.ts new file mode 100644 index 0000000000..4ace308923 --- /dev/null +++ b/src/server/api/stream/channels/user-list.ts @@ -0,0 +1,14 @@ +import autobind from 'autobind-decorator'; +import Channel from '../channel'; + +export default class extends Channel { + @autobind + public async init(params: any) { + const listId = params.listId as string; + + // Subscribe stream + this.subscriber.on(`userListStream:${listId}`, data => { + this.send(data); + }); + } +} diff --git a/src/server/api/stream/drive.ts b/src/server/api/stream/drive.ts deleted file mode 100644 index 28c241e1bc..0000000000 --- a/src/server/api/stream/drive.ts +++ /dev/null @@ -1,9 +0,0 @@ -import * as websocket from 'websocket'; -import Xev from 'xev'; - -export default function(request: websocket.request, connection: websocket.connection, subscriber: Xev, user: any): void { - // Subscribe drive stream - subscriber.on(`drive-stream:${user._id}`, data => { - connection.send(JSON.stringify(data)); - }); -} diff --git a/src/server/api/stream/games/reversi-game.ts b/src/server/api/stream/games/reversi-game.ts deleted file mode 100644 index 5cbbf42d59..0000000000 --- a/src/server/api/stream/games/reversi-game.ts +++ /dev/null @@ -1,332 +0,0 @@ -import * as websocket from 'websocket'; -import Xev from 'xev'; -import * as CRC32 from 'crc-32'; -import ReversiGame, { pack } from '../../../../models/games/reversi/game'; -import { publishReversiGameStream } from '../../../../stream'; -import Reversi from '../../../../games/reversi/core'; -import * as maps from '../../../../games/reversi/maps'; -import { ParsedUrlQuery } from 'querystring'; - -export default function(request: websocket.request, connection: websocket.connection, subscriber: Xev, user?: any): void { - const q = request.resourceURL.query as ParsedUrlQuery; - const gameId = q.game as string; - - // Subscribe game stream - subscriber.on(`reversi-game-stream:${gameId}`, data => { - connection.send(JSON.stringify(data)); - }); - - connection.on('message', async (data) => { - const msg = JSON.parse(data.utf8Data); - - switch (msg.type) { - case 'accept': - accept(true); - break; - - case 'cancel-accept': - accept(false); - break; - - case 'update-settings': - if (msg.settings == null) return; - updateSettings(msg.settings); - break; - - case 'init-form': - if (msg.body == null) return; - initForm(msg.body); - break; - - case 'update-form': - if (msg.id == null || msg.value === undefined) return; - updateForm(msg.id, msg.value); - break; - - case 'message': - if (msg.body == null) return; - message(msg.body); - break; - - case 'set': - if (msg.pos == null) return; - set(msg.pos); - break; - - case 'check': - if (msg.crc32 == null) return; - check(msg.crc32); - break; - } - }); - - async function updateSettings(settings: any) { - const game = await ReversiGame.findOne({ _id: gameId }); - - if (game.isStarted) return; - if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) return; - if (game.user1Id.equals(user._id) && game.user1Accepted) return; - if (game.user2Id.equals(user._id) && game.user2Accepted) return; - - await ReversiGame.update({ _id: gameId }, { - $set: { - settings - } - }); - - publishReversiGameStream(gameId, 'update-settings', settings); - } - - async function initForm(form: any) { - const game = await ReversiGame.findOne({ _id: gameId }); - - if (game.isStarted) return; - if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) return; - - const set = game.user1Id.equals(user._id) ? { - form1: form - } : { - form2: form - }; - - await ReversiGame.update({ _id: gameId }, { - $set: set - }); - - publishReversiGameStream(gameId, 'init-form', { - userId: user._id, - form - }); - } - - async function updateForm(id: string, value: any) { - const game = await ReversiGame.findOne({ _id: gameId }); - - if (game.isStarted) return; - if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) return; - - const form = game.user1Id.equals(user._id) ? game.form2 : game.form1; - - const item = form.find((i: any) => i.id == id); - - if (item == null) return; - - item.value = value; - - const set = game.user1Id.equals(user._id) ? { - form2: form - } : { - form1: form - }; - - await ReversiGame.update({ _id: gameId }, { - $set: set - }); - - publishReversiGameStream(gameId, 'update-form', { - userId: user._id, - id, - value - }); - } - - async function message(message: any) { - message.id = Math.random(); - publishReversiGameStream(gameId, 'message', { - userId: user._id, - message - }); - } - - async function accept(accept: boolean) { - const game = await ReversiGame.findOne({ _id: gameId }); - - if (game.isStarted) return; - - let bothAccepted = false; - - if (game.user1Id.equals(user._id)) { - await ReversiGame.update({ _id: gameId }, { - $set: { - user1Accepted: accept - } - }); - - publishReversiGameStream(gameId, 'change-accepts', { - user1: accept, - user2: game.user2Accepted - }); - - if (accept && game.user2Accepted) bothAccepted = true; - } else if (game.user2Id.equals(user._id)) { - await ReversiGame.update({ _id: gameId }, { - $set: { - user2Accepted: accept - } - }); - - publishReversiGameStream(gameId, 'change-accepts', { - user1: game.user1Accepted, - user2: accept - }); - - if (accept && game.user1Accepted) bothAccepted = true; - } else { - return; - } - - if (bothAccepted) { - // 3秒後、まだacceptされていたらゲーム開始 - setTimeout(async () => { - const freshGame = await ReversiGame.findOne({ _id: gameId }); - if (freshGame == null || freshGame.isStarted || freshGame.isEnded) return; - if (!freshGame.user1Accepted || !freshGame.user2Accepted) return; - - let bw: number; - if (freshGame.settings.bw == 'random') { - bw = Math.random() > 0.5 ? 1 : 2; - } else { - bw = freshGame.settings.bw as number; - } - - function getRandomMap() { - const mapCount = Object.entries(maps).length; - const rnd = Math.floor(Math.random() * mapCount); - return Object.values(maps)[rnd].data; - } - - const map = freshGame.settings.map != null ? freshGame.settings.map : getRandomMap(); - - await ReversiGame.update({ _id: gameId }, { - $set: { - startedAt: new Date(), - isStarted: true, - black: bw, - 'settings.map': map - } - }); - - //#region 盤面に最初から石がないなどして始まった瞬間に勝敗が決定する場合があるのでその処理 - const o = new Reversi(map, { - isLlotheo: freshGame.settings.isLlotheo, - canPutEverywhere: freshGame.settings.canPutEverywhere, - loopedBoard: freshGame.settings.loopedBoard - }); - - if (o.isEnded) { - let winner; - if (o.winner === true) { - winner = freshGame.black == 1 ? freshGame.user1Id : freshGame.user2Id; - } else if (o.winner === false) { - winner = freshGame.black == 1 ? freshGame.user2Id : freshGame.user1Id; - } else { - winner = null; - } - - await ReversiGame.update({ - _id: gameId - }, { - $set: { - isEnded: true, - winnerId: winner - } - }); - - publishReversiGameStream(gameId, 'ended', { - winnerId: winner, - game: await pack(gameId, user) - }); - } - //#endregion - - publishReversiGameStream(gameId, 'started', await pack(gameId, user)); - }, 3000); - } - } - - // 石を打つ - async function set(pos: number) { - const game = await ReversiGame.findOne({ _id: gameId }); - - if (!game.isStarted) return; - if (game.isEnded) return; - if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) return; - - const o = new Reversi(game.settings.map, { - isLlotheo: game.settings.isLlotheo, - canPutEverywhere: game.settings.canPutEverywhere, - loopedBoard: game.settings.loopedBoard - }); - - game.logs.forEach(log => { - o.put(log.color, log.pos); - }); - - const myColor = - (game.user1Id.equals(user._id) && game.black == 1) || (game.user2Id.equals(user._id) && game.black == 2) - ? true - : false; - - if (!o.canPut(myColor, pos)) return; - o.put(myColor, pos); - - let winner; - if (o.isEnded) { - if (o.winner === true) { - winner = game.black == 1 ? game.user1Id : game.user2Id; - } else if (o.winner === false) { - winner = game.black == 1 ? game.user2Id : game.user1Id; - } else { - winner = null; - } - } - - const log = { - at: new Date(), - color: myColor, - pos - }; - - const crc32 = CRC32.str(game.logs.map(x => x.pos.toString()).join('') + pos.toString()); - - await ReversiGame.update({ - _id: gameId - }, { - $set: { - crc32, - isEnded: o.isEnded, - winnerId: winner - }, - $push: { - logs: log - } - }); - - publishReversiGameStream(gameId, 'set', Object.assign(log, { - next: o.turn - })); - - if (o.isEnded) { - publishReversiGameStream(gameId, 'ended', { - winnerId: winner, - game: await pack(gameId, user) - }); - } - } - - async function check(crc32: string) { - const game = await ReversiGame.findOne({ _id: gameId }); - - if (!game.isStarted) return; - - // 互換性のため - if (game.crc32 == null) return; - - if (crc32 !== game.crc32) { - connection.send(JSON.stringify({ - type: 'rescue', - body: await pack(game, user) - })); - } - } -} diff --git a/src/server/api/stream/games/reversi.ts b/src/server/api/stream/games/reversi.ts deleted file mode 100644 index f467613b21..0000000000 --- a/src/server/api/stream/games/reversi.ts +++ /dev/null @@ -1,28 +0,0 @@ -import * as mongo from 'mongodb'; -import * as websocket from 'websocket'; -import Xev from 'xev'; -import Matching, { pack } from '../../../../models/games/reversi/matching'; -import { publishUserStream } from '../../../../stream'; - -export default function(request: websocket.request, connection: websocket.connection, subscriber: Xev, user: any): void { - // Subscribe reversi stream - subscriber.on(`reversi-stream:${user._id}`, data => { - connection.send(JSON.stringify(data)); - }); - - connection.on('message', async (data) => { - const msg = JSON.parse(data.utf8Data); - - switch (msg.type) { - case 'ping': - if (msg.id == null) return; - const matching = await Matching.findOne({ - parentId: user._id, - childId: new mongo.ObjectID(msg.id) - }); - if (matching == null) return; - publishUserStream(matching.childId, 'reversi_invited', await pack(matching, matching.childId)); - break; - } - }); -} diff --git a/src/server/api/stream/global-timeline.ts b/src/server/api/stream/global-timeline.ts deleted file mode 100644 index 03852fb181..0000000000 --- a/src/server/api/stream/global-timeline.ts +++ /dev/null @@ -1,27 +0,0 @@ -import * as websocket from 'websocket'; -import Xev from 'xev'; - -import { IUser } from '../../../models/user'; -import Mute from '../../../models/mute'; -import shouldMuteThisNote from '../../../misc/should-mute-this-note'; - -export default async function( - request: websocket.request, - connection: websocket.connection, - subscriber: Xev, - user: IUser -) { - const mute = await Mute.find({ muterId: user._id }); - const mutedUserIds = mute.map(m => m.muteeId.toString()); - - // Subscribe stream - subscriber.on('global-timeline', async note => { - // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する - if (shouldMuteThisNote(note, mutedUserIds)) return; - - connection.send(JSON.stringify({ - type: 'note', - body: note - })); - }); -} diff --git a/src/server/api/stream/hashtag.ts b/src/server/api/stream/hashtag.ts deleted file mode 100644 index 54da4f9ad9..0000000000 --- a/src/server/api/stream/hashtag.ts +++ /dev/null @@ -1,40 +0,0 @@ -import * as websocket from 'websocket'; -import Xev from 'xev'; - -import { IUser } from '../../../models/user'; -import Mute from '../../../models/mute'; -import { pack } from '../../../models/note'; -import shouldMuteThisNote from '../../../misc/should-mute-this-note'; - -export default async function( - request: websocket.request, - connection: websocket.connection, - subscriber: Xev, - user?: IUser -) { - const mute = user ? await Mute.find({ muterId: user._id }) : null; - const mutedUserIds = mute ? mute.map(m => m.muteeId.toString()) : []; - - const q: Array<string[]> = JSON.parse((request.resourceURL.query as any).q); - - // Subscribe stream - subscriber.on('hashtag', async note => { - const matched = q.some(tags => tags.every(tag => note.tags.map((t: string) => t.toLowerCase()).includes(tag.toLowerCase()))); - if (!matched) return; - - // Renoteなら再pack - if (note.renoteId != null) { - note.renote = await pack(note.renoteId, user, { - detail: true - }); - } - - // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する - if (shouldMuteThisNote(note, mutedUserIds)) return; - - connection.send(JSON.stringify({ - type: 'note', - body: note - })); - }); -} diff --git a/src/server/api/stream/home.ts b/src/server/api/stream/home.ts deleted file mode 100644 index 5575d0d523..0000000000 --- a/src/server/api/stream/home.ts +++ /dev/null @@ -1,110 +0,0 @@ -import * as websocket from 'websocket'; -import Xev from 'xev'; -import * as debug from 'debug'; - -import User, { IUser } from '../../../models/user'; -import Mute from '../../../models/mute'; -import { pack as packNote, pack } from '../../../models/note'; -import readNotification from '../common/read-notification'; -import call from '../call'; -import { IApp } from '../../../models/app'; -import shouldMuteThisNote from '../../../misc/should-mute-this-note'; -import readNote from '../../../services/note/read'; - -const log = debug('misskey'); - -export default async function( - request: websocket.request, - connection: websocket.connection, - subscriber: Xev, - user: IUser, - app: IApp -) { - const mute = await Mute.find({ muterId: user._id }); - const mutedUserIds = mute.map(m => m.muteeId.toString()); - - async function onNoteStream(noteId: any) { - const note = await packNote(noteId, user, { - detail: true - }); - - connection.send(JSON.stringify({ - type: 'note-updated', - body: { - note: note - } - })); - } - - // Subscribe Home stream channel - subscriber.on(`user-stream:${user._id}`, async x => { - // Renoteなら再pack - if (x.type == 'note' && x.body.renoteId != null) { - x.body.renote = await pack(x.body.renoteId, user, { - detail: true - }); - } - - //#region 流れてきたメッセージがミュートしているユーザーが関わるものだったら無視する - if (x.type == 'note') { - if (shouldMuteThisNote(x.body, mutedUserIds)) return; - } else if (x.type == 'notification') { - if (mutedUserIds.includes(x.body.userId)) { - return; - } - } - //#endregion - - connection.send(JSON.stringify(x)); - }); - - connection.on('message', async data => { - const msg = JSON.parse(data.utf8Data); - - switch (msg.type) { - case 'api': - // 新鮮なデータを利用するためにユーザーをフェッチ - call(msg.endpoint, await User.findOne({ _id: user._id }), app, msg.data).then(res => { - connection.send(JSON.stringify({ - type: `api-res:${msg.id}`, - body: { res } - })); - }).catch(e => { - connection.send(JSON.stringify({ - type: `api-res:${msg.id}`, - body: { e } - })); - }); - break; - - case 'alive': - // Update lastUsedAt - User.update({ _id: user._id }, { - $set: { - 'lastUsedAt': new Date() - } - }); - break; - - case 'read_notification': - if (!msg.id) return; - readNotification(user._id, msg.id); - break; - - case 'capture': - if (!msg.id) return; - log(`CAPTURE: ${msg.id} by @${user.username}`); - subscriber.on(`note-stream:${msg.id}`, onNoteStream); - if (msg.read) { - readNote(user._id, msg.id); - } - break; - - case 'decapture': - if (!msg.id) return; - log(`DECAPTURE: ${msg.id} by @${user.username}`); - subscriber.off(`note-stream:${msg.id}`, onNoteStream); - break; - } - }); -} diff --git a/src/server/api/stream/hybrid-timeline.ts b/src/server/api/stream/hybrid-timeline.ts deleted file mode 100644 index 045b822783..0000000000 --- a/src/server/api/stream/hybrid-timeline.ts +++ /dev/null @@ -1,38 +0,0 @@ -import * as websocket from 'websocket'; -import Xev from 'xev'; - -import { IUser } from '../../../models/user'; -import Mute from '../../../models/mute'; -import { pack } from '../../../models/note'; -import shouldMuteThisNote from '../../../misc/should-mute-this-note'; - -export default async function( - request: websocket.request, - connection: websocket.connection, - subscriber: Xev, - user: IUser -) { - const mute = await Mute.find({ muterId: user._id }); - const mutedUserIds = mute.map(m => m.muteeId.toString()); - - // Subscribe stream - subscriber.on('hybrid-timeline', onEvent); - subscriber.on(`hybrid-timeline:${user._id}`, onEvent); - - async function onEvent(note: any) { - // Renoteなら再pack - if (note.renoteId != null) { - note.renote = await pack(note.renoteId, user, { - detail: true - }); - } - - // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する - if (shouldMuteThisNote(note, mutedUserIds)) return; - - connection.send(JSON.stringify({ - type: 'note', - body: note - })); - } -} diff --git a/src/server/api/stream/index.ts b/src/server/api/stream/index.ts new file mode 100644 index 0000000000..bd99f2755e --- /dev/null +++ b/src/server/api/stream/index.ts @@ -0,0 +1,213 @@ +import autobind from 'autobind-decorator'; +import * as websocket from 'websocket'; +import Xev from 'xev'; +import * as debug from 'debug'; + +import User, { IUser } from '../../../models/user'; +import readNotification from '../common/read-notification'; +import call from '../call'; +import { IApp } from '../../../models/app'; +import readNote from '../../../services/note/read'; + +import Channel from './channel'; +import channels from './channels'; + +const log = debug('misskey'); + +/** + * Main stream connection + */ +export default class Connection { + public user?: IUser; + public app: IApp; + private wsConnection: websocket.connection; + public subscriber: Xev; + private channels: Channel[] = []; + private subscribingNotes: any = {}; + + constructor( + wsConnection: websocket.connection, + subscriber: Xev, + user: IUser, + app: IApp + ) { + this.wsConnection = wsConnection; + this.user = user; + this.app = app; + this.subscriber = subscriber; + + this.wsConnection.on('message', this.onWsConnectionMessage); + } + + /** + * クライアントからメッセージ受信時 + */ + @autobind + private async onWsConnectionMessage(data: websocket.IMessage) { + const { type, body } = JSON.parse(data.utf8Data); + + switch (type) { + case 'api': this.onApiRequest(body); break; + case 'alive': this.onAlive(); break; + case 'readNotification': this.onReadNotification(body); break; + case 'subNote': this.onSubscribeNote(body); break; + case 'sn': this.onSubscribeNote(body); break; // alias + case 'unsubNote': this.onUnsubscribeNote(body); break; + case 'un': this.onUnsubscribeNote(body); break; // alias + case 'connect': this.onChannelConnectRequested(body); break; + case 'disconnect': this.onChannelDisconnectRequested(body); break; + case 'channel': this.onChannelMessageRequested(body); break; + } + } + + /** + * APIリクエスト要求時 + */ + @autobind + private async onApiRequest(payload: any) { + // 新鮮なデータを利用するためにユーザーをフェッチ + const user = this.user ? await User.findOne({ _id: this.user._id }) : null; + + const endpoint = payload.endpoint || payload.ep; // alias + + // 呼び出し + call(endpoint, user, this.app, payload.data).then(res => { + this.sendMessageToWs(`api:${payload.id}`, { res }); + }).catch(e => { + this.sendMessageToWs(`api:${payload.id}`, { e }); + }); + } + + @autobind + private onAlive() { + // Update lastUsedAt + User.update({ _id: this.user._id }, { + $set: { + 'lastUsedAt': new Date() + } + }); + } + + @autobind + private onReadNotification(payload: any) { + if (!payload.id) return; + readNotification(this.user._id, payload.id); + } + + /** + * 投稿購読要求時 + */ + @autobind + private onSubscribeNote(payload: any) { + if (!payload.id) return; + + if (this.subscribingNotes[payload.id] == null) { + this.subscribingNotes[payload.id] = 0; + } + + this.subscribingNotes[payload.id]++; + + if (this.subscribingNotes[payload.id] == 1) { + this.subscriber.on(`noteStream:${payload.id}`, this.onNoteStreamMessage); + } + + if (payload.read) { + readNote(this.user._id, payload.id); + } + } + + /** + * 投稿購読解除要求時 + */ + @autobind + private onUnsubscribeNote(payload: any) { + if (!payload.id) return; + + this.subscribingNotes[payload.id]--; + if (this.subscribingNotes[payload.id] <= 0) { + delete this.subscribingNotes[payload.id]; + this.subscriber.off(`noteStream:${payload.id}`, this.onNoteStreamMessage); + } + } + + @autobind + private async onNoteStreamMessage(data: any) { + this.sendMessageToWs('noteUpdated', { + id: data.body.id, + type: data.type, + body: data.body.body, + }); + } + + /** + * チャンネル接続要求時 + */ + @autobind + private onChannelConnectRequested(payload: any) { + const { channel, id, params } = payload; + log(`CH CONNECT: ${id} ${channel} by @${this.user.username}`); + this.connectChannel(id, params, (channels as any)[channel]); + } + + /** + * チャンネル切断要求時 + */ + @autobind + private onChannelDisconnectRequested(payload: any) { + const { id } = payload; + log(`CH DISCONNECT: ${id} by @${this.user.username}`); + this.disconnectChannel(id); + } + + /** + * クライアントにメッセージ送信 + */ + @autobind + public sendMessageToWs(type: string, payload: any) { + this.wsConnection.send(JSON.stringify({ + type: type, + body: payload + })); + } + + /** + * チャンネルに接続 + */ + @autobind + private connectChannel(id: string, params: any, channelClass: { new(id: string, connection: Connection): Channel }) { + const channel = new channelClass(id, this); + this.channels.push(channel); + channel.init(params); + } + + /** + * チャンネルから切断 + */ + @autobind + private disconnectChannel(id: string) { + const channel = this.channels.find(c => c.id === id); + + if (channel) { + if (channel.dispose) channel.dispose(); + this.channels = this.channels.filter(c => c.id !== id); + } + } + + @autobind + private onChannelMessageRequested(data: any) { + const channel = this.channels.find(c => c.id === data.id); + if (channel != null && channel.onMessage != null) { + channel.onMessage(data.type, data.body); + } + } + + /** + * ストリームが切れたとき + */ + @autobind + public dispose() { + this.channels.forEach(c => { + if (c.dispose) c.dispose(); + }); + } +} diff --git a/src/server/api/stream/local-timeline.ts b/src/server/api/stream/local-timeline.ts deleted file mode 100644 index ae054a5f9f..0000000000 --- a/src/server/api/stream/local-timeline.ts +++ /dev/null @@ -1,35 +0,0 @@ -import * as websocket from 'websocket'; -import Xev from 'xev'; - -import { IUser } from '../../../models/user'; -import Mute from '../../../models/mute'; -import { pack } from '../../../models/note'; -import shouldMuteThisNote from '../../../misc/should-mute-this-note'; - -export default async function( - request: websocket.request, - connection: websocket.connection, - subscriber: Xev, - user?: IUser -) { - const mute = user ? await Mute.find({ muterId: user._id }) : null; - const mutedUserIds = mute ? mute.map(m => m.muteeId.toString()) : []; - - // Subscribe stream - subscriber.on('local-timeline', async note => { - // Renoteなら再pack - if (note.renoteId != null) { - note.renote = await pack(note.renoteId, user, { - detail: true - }); - } - - // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する - if (shouldMuteThisNote(note, mutedUserIds)) return; - - connection.send(JSON.stringify({ - type: 'note', - body: note - })); - }); -} diff --git a/src/server/api/stream/messaging-index.ts b/src/server/api/stream/messaging-index.ts deleted file mode 100644 index 9af63f2812..0000000000 --- a/src/server/api/stream/messaging-index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import * as websocket from 'websocket'; -import Xev from 'xev'; - -export default function(request: websocket.request, connection: websocket.connection, subscriber: Xev, user: any): void { - // Subscribe messaging index stream - subscriber.on(`messaging-index-stream:${user._id}`, data => { - connection.send(JSON.stringify(data)); - }); -} diff --git a/src/server/api/stream/messaging.ts b/src/server/api/stream/messaging.ts deleted file mode 100644 index 8b352cea3c..0000000000 --- a/src/server/api/stream/messaging.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as websocket from 'websocket'; -import Xev from 'xev'; -import read from '../common/read-messaging-message'; -import { ParsedUrlQuery } from 'querystring'; - -export default function(request: websocket.request, connection: websocket.connection, subscriber: Xev, user: any): void { - const q = request.resourceURL.query as ParsedUrlQuery; - const otherparty = q.otherparty as string; - - // Subscribe messaging stream - subscriber.on(`messaging-stream:${user._id}-${otherparty}`, data => { - connection.send(JSON.stringify(data)); - }); - - connection.on('message', async (data) => { - const msg = JSON.parse(data.utf8Data); - - switch (msg.type) { - case 'read': - if (!msg.id) return; - read(user._id, otherparty, msg.id); - break; - } - }); -} diff --git a/src/server/api/stream/notes-stats.ts b/src/server/api/stream/notes-stats.ts deleted file mode 100644 index ba99403226..0000000000 --- a/src/server/api/stream/notes-stats.ts +++ /dev/null @@ -1,35 +0,0 @@ -import * as websocket from 'websocket'; -import Xev from 'xev'; - -const ev = new Xev(); - -export default function(request: websocket.request, connection: websocket.connection): void { - const onStats = (stats: any) => { - connection.send(JSON.stringify({ - type: 'stats', - body: stats - })); - }; - - connection.on('message', async data => { - const msg = JSON.parse(data.utf8Data); - - switch (msg.type) { - case 'requestLog': - ev.once(`notesStatsLog:${msg.id}`, statsLog => { - connection.send(JSON.stringify({ - type: 'statsLog', - body: statsLog - })); - }); - ev.emit('requestNotesStatsLog', msg.id); - break; - } - }); - - ev.addListener('notesStats', onStats); - - connection.on('close', () => { - ev.removeListener('notesStats', onStats); - }); -} diff --git a/src/server/api/stream/server-stats.ts b/src/server/api/stream/server-stats.ts deleted file mode 100644 index d4fbeefa04..0000000000 --- a/src/server/api/stream/server-stats.ts +++ /dev/null @@ -1,38 +0,0 @@ -import * as websocket from 'websocket'; -import Xev from 'xev'; - -const ev = new Xev(); - -export default function(request: websocket.request, connection: websocket.connection): void { - const onStats = (stats: any) => { - connection.send(JSON.stringify({ - type: 'stats', - body: stats - })); - }; - - connection.on('message', async data => { - const msg = JSON.parse(data.utf8Data); - - switch (msg.type) { - case 'requestLog': - ev.once(`serverStatsLog:${msg.id}`, statsLog => { - connection.send(JSON.stringify({ - type: 'statsLog', - body: statsLog - })); - }); - ev.emit('requestServerStatsLog', { - id: msg.id, - length: msg.length - }); - break; - } - }); - - ev.addListener('serverStats', onStats); - - connection.on('close', () => { - ev.removeListener('serverStats', onStats); - }); -} diff --git a/src/server/api/stream/user-list.ts b/src/server/api/stream/user-list.ts deleted file mode 100644 index 30f94d5251..0000000000 --- a/src/server/api/stream/user-list.ts +++ /dev/null @@ -1,13 +0,0 @@ -import * as websocket from 'websocket'; -import Xev from 'xev'; -import { ParsedUrlQuery } from 'querystring'; - -export default function(request: websocket.request, connection: websocket.connection, subscriber: Xev, user: any): void { - const q = request.resourceURL.query as ParsedUrlQuery; - const listId = q.listId as string; - - // Subscribe stream - subscriber.on(`user-list-stream:${listId}`, data => { - connection.send(JSON.stringify(data)); - }); -} diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts index 09ec23a743..4518d21c3f 100644 --- a/src/server/api/streaming.ts +++ b/src/server/api/streaming.ts @@ -2,26 +2,12 @@ import * as http from 'http'; import * as websocket from 'websocket'; import Xev from 'xev'; -import homeStream from './stream/home'; -import localTimelineStream from './stream/local-timeline'; -import hybridTimelineStream from './stream/hybrid-timeline'; -import globalTimelineStream from './stream/global-timeline'; -import userListStream from './stream/user-list'; -import driveStream from './stream/drive'; -import messagingStream from './stream/messaging'; -import messagingIndexStream from './stream/messaging-index'; -import reversiGameStream from './stream/games/reversi-game'; -import reversiStream from './stream/games/reversi'; -import serverStatsStream from './stream/server-stats'; -import notesStatsStream from './stream/notes-stats'; -import hashtagStream from './stream/hashtag'; +import MainStreamConnection from './stream'; import { ParsedUrlQuery } from 'querystring'; import authenticate from './authenticate'; module.exports = (server: http.Server) => { - /** - * Init websocket server - */ + // Init websocket server const ws = new websocket.server({ httpServer: server }); @@ -29,20 +15,16 @@ module.exports = (server: http.Server) => { ws.on('request', async (request) => { const connection = request.accept(); - if (request.resourceURL.pathname === '/server-stats') { - serverStatsStream(request, connection); - return; - } - - if (request.resourceURL.pathname === '/notes-stats') { - notesStatsStream(request, connection); - return; - } - const ev = new Xev(); + const q = request.resourceURL.query as ParsedUrlQuery; + const [user, app] = await authenticate(q.i as string); + + const main = new MainStreamConnection(connection, ev, user, app); + connection.once('close', () => { ev.removeAllListeners(); + main.dispose(); }); connection.on('message', async (data) => { @@ -50,46 +32,5 @@ module.exports = (server: http.Server) => { connection.send('pong'); } }); - - const q = request.resourceURL.query as ParsedUrlQuery; - const [user, app] = await authenticate(q.i as string); - - if (request.resourceURL.pathname === '/games/reversi-game') { - reversiGameStream(request, connection, ev, user); - return; - } - - if (request.resourceURL.pathname === '/local-timeline') { - localTimelineStream(request, connection, ev, user); - return; - } - - if (request.resourceURL.pathname === '/hashtag') { - hashtagStream(request, connection, ev, user); - return; - } - - if (user == null) { - connection.send('authentication-failed'); - connection.close(); - return; - } - - const channel: any = - request.resourceURL.pathname === '/' ? homeStream : - request.resourceURL.pathname === '/hybrid-timeline' ? hybridTimelineStream : - request.resourceURL.pathname === '/global-timeline' ? globalTimelineStream : - request.resourceURL.pathname === '/user-list' ? userListStream : - request.resourceURL.pathname === '/drive' ? driveStream : - request.resourceURL.pathname === '/messaging' ? messagingStream : - request.resourceURL.pathname === '/messaging-index' ? messagingIndexStream : - request.resourceURL.pathname === '/games/reversi' ? reversiStream : - null; - - if (channel !== null) { - channel(request, connection, ev, user, app); - } else { - connection.close(); - } }); }; diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index 666a6ca742..f8c54b2af4 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -12,7 +12,7 @@ import * as sharp from 'sharp'; import DriveFile, { IMetadata, getDriveFileBucket, IDriveFile } from '../../models/drive-file'; import DriveFolder from '../../models/drive-folder'; import { pack } from '../../models/drive-file'; -import { publishUserStream, publishDriveStream } from '../../stream'; +import { publishMainStream, publishDriveStream } from '../../stream'; import { isLocalUser, IUser, IRemoteUser } from '../../models/user'; import delFile from './delete-file'; import config from '../../config'; @@ -383,8 +383,8 @@ export default async function( log(`drive file has been created ${driveFile._id}`); pack(driveFile).then(packedFile => { - // Publish drive_file_created event - publishUserStream(user._id, 'drive_file_created', packedFile); + // Publish driveFileCreated event + publishMainStream(user._id, 'driveFileCreated', packedFile); publishDriveStream(user._id, 'file_created', packedFile); }); diff --git a/src/services/following/create.ts b/src/services/following/create.ts index dd2fa544dc..637e3e8093 100644 --- a/src/services/following/create.ts +++ b/src/services/following/create.ts @@ -2,7 +2,7 @@ import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../ import Following from '../../models/following'; import FollowingLog from '../../models/following-log'; import FollowedLog from '../../models/followed-log'; -import { publishUserStream } from '../../stream'; +import { publishMainStream } from '../../stream'; import notify from '../../notify'; import pack from '../../remote/activitypub/renderer'; import renderFollow from '../../remote/activitypub/renderer/follow'; @@ -61,12 +61,12 @@ export default async function(follower: IUser, followee: IUser) { // Publish follow event if (isLocalUser(follower)) { - packUser(followee, follower).then(packed => publishUserStream(follower._id, 'follow', packed)); + packUser(followee, follower).then(packed => publishMainStream(follower._id, 'follow', packed)); } // Publish followed event if (isLocalUser(followee)) { - packUser(follower, followee).then(packed => publishUserStream(followee._id, 'followed', packed)), + packUser(follower, followee).then(packed => publishMainStream(followee._id, 'followed', packed)), // 通知を作成 notify(followee._id, follower._id, 'follow'); diff --git a/src/services/following/delete.ts b/src/services/following/delete.ts index 7c285e9eac..2a67acbf05 100644 --- a/src/services/following/delete.ts +++ b/src/services/following/delete.ts @@ -2,7 +2,7 @@ import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../ import Following from '../../models/following'; import FollowingLog from '../../models/following-log'; import FollowedLog from '../../models/followed-log'; -import { publishUserStream } from '../../stream'; +import { publishMainStream } from '../../stream'; import pack from '../../remote/activitypub/renderer'; import renderFollow from '../../remote/activitypub/renderer/follow'; import renderUndo from '../../remote/activitypub/renderer/undo'; @@ -52,7 +52,7 @@ export default async function(follower: IUser, followee: IUser) { // Publish unfollow event if (isLocalUser(follower)) { - packUser(followee, follower).then(packed => publishUserStream(follower._id, 'unfollow', packed)); + packUser(followee, follower).then(packed => publishMainStream(follower._id, 'unfollow', packed)); } if (isLocalUser(follower) && isRemoteUser(followee)) { diff --git a/src/services/following/requests/accept.ts b/src/services/following/requests/accept.ts index 5e38879a49..e7c8df844a 100644 --- a/src/services/following/requests/accept.ts +++ b/src/services/following/requests/accept.ts @@ -7,7 +7,7 @@ import { deliver } from '../../../queue'; import Following from '../../../models/following'; import FollowingLog from '../../../models/following-log'; import FollowedLog from '../../../models/followed-log'; -import { publishUserStream } from '../../../stream'; +import { publishMainStream } from '../../../stream'; export default async function(followee: IUser, follower: IUser) { const following = await Following.insert({ @@ -74,7 +74,7 @@ export default async function(followee: IUser, follower: IUser) { packUser(followee, followee, { detail: true - }).then(packed => publishUserStream(followee._id, 'meUpdated', packed)); + }).then(packed => publishMainStream(followee._id, 'meUpdated', packed)); - packUser(followee, follower).then(packed => publishUserStream(follower._id, 'follow', packed)); + packUser(followee, follower).then(packed => publishMainStream(follower._id, 'follow', packed)); } diff --git a/src/services/following/requests/cancel.ts b/src/services/following/requests/cancel.ts index 9655a95f04..def02d59d9 100644 --- a/src/services/following/requests/cancel.ts +++ b/src/services/following/requests/cancel.ts @@ -4,7 +4,7 @@ import pack from '../../../remote/activitypub/renderer'; import renderFollow from '../../../remote/activitypub/renderer/follow'; import renderUndo from '../../../remote/activitypub/renderer/undo'; import { deliver } from '../../../queue'; -import { publishUserStream } from '../../../stream'; +import { publishMainStream } from '../../../stream'; export default async function(followee: IUser, follower: IUser) { if (isRemoteUser(followee)) { @@ -34,5 +34,5 @@ export default async function(followee: IUser, follower: IUser) { packUser(followee, followee, { detail: true - }).then(packed => publishUserStream(followee._id, 'meUpdated', packed)); + }).then(packed => publishMainStream(followee._id, 'meUpdated', packed)); } diff --git a/src/services/following/requests/create.ts b/src/services/following/requests/create.ts index 946c22568c..5e613fd053 100644 --- a/src/services/following/requests/create.ts +++ b/src/services/following/requests/create.ts @@ -1,5 +1,5 @@ import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../../models/user'; -import { publishUserStream } from '../../../stream'; +import { publishMainStream } from '../../../stream'; import notify from '../../../notify'; import pack from '../../../remote/activitypub/renderer'; import renderFollow from '../../../remote/activitypub/renderer/follow'; @@ -33,11 +33,11 @@ export default async function(follower: IUser, followee: IUser) { // Publish receiveRequest event if (isLocalUser(followee)) { - packUser(follower, followee).then(packed => publishUserStream(followee._id, 'receiveFollowRequest', packed)); + packUser(follower, followee).then(packed => publishMainStream(followee._id, 'receiveFollowRequest', packed)); packUser(followee, followee, { detail: true - }).then(packed => publishUserStream(followee._id, 'meUpdated', packed)); + }).then(packed => publishMainStream(followee._id, 'meUpdated', packed)); // 通知を作成 notify(followee._id, follower._id, 'receiveFollowRequest'); diff --git a/src/services/following/requests/reject.ts b/src/services/following/requests/reject.ts index eda6716321..91a49db997 100644 --- a/src/services/following/requests/reject.ts +++ b/src/services/following/requests/reject.ts @@ -4,7 +4,7 @@ import pack from '../../../remote/activitypub/renderer'; import renderFollow from '../../../remote/activitypub/renderer/follow'; import renderReject from '../../../remote/activitypub/renderer/reject'; import { deliver } from '../../../queue'; -import { publishUserStream } from '../../../stream'; +import { publishMainStream } from '../../../stream'; export default async function(followee: IUser, follower: IUser) { if (isRemoteUser(follower)) { @@ -23,5 +23,5 @@ export default async function(followee: IUser, follower: IUser) { } }); - packUser(followee, follower).then(packed => publishUserStream(follower._id, 'unfollow', packed)); + packUser(followee, follower).then(packed => publishMainStream(follower._id, 'unfollow', packed)); } diff --git a/src/services/note/create.ts b/src/services/note/create.ts index 2f2ac18e9b..3dc411d434 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -1,7 +1,7 @@ import es from '../../db/elasticsearch'; import Note, { pack, INote } from '../../models/note'; import User, { isLocalUser, IUser, isRemoteUser, IRemoteUser, ILocalUser } from '../../models/user'; -import { publishUserStream, publishLocalTimelineStream, publishHybridTimelineStream, publishGlobalTimelineStream, publishUserListStream, publishHashtagStream } from '../../stream'; +import { publishMainStream, publishHomeTimelineStream, publishLocalTimelineStream, publishHybridTimelineStream, publishGlobalTimelineStream, publishUserListStream, publishHashtagStream } from '../../stream'; import Following from '../../models/following'; import { deliver } from '../../queue'; import renderNote from '../../remote/activitypub/renderer/note'; @@ -234,7 +234,7 @@ export default async (user: IUser, data: Option, silent = false) => new Promise< // 通知 if (isLocalUser(data.reply._user)) { nm.push(data.reply.userId, 'reply'); - publishUserStream(data.reply.userId, 'reply', noteObj); + publishMainStream(data.reply.userId, 'reply', noteObj); } } @@ -257,7 +257,7 @@ export default async (user: IUser, data: Option, silent = false) => new Promise< // Publish event if (!user._id.equals(data.renote.userId) && isLocalUser(data.renote._user)) { - publishUserStream(data.renote.userId, 'renote', noteObj); + publishMainStream(data.renote.userId, 'renote', noteObj); } } @@ -306,11 +306,11 @@ async function publish(user: IUser, note: INote, noteObj: any, reply: INote, ren detail: true }); // Publish event to myself's stream - publishUserStream(note.userId, 'note', detailPackedNote); + publishHomeTimelineStream(note.userId, detailPackedNote); publishHybridTimelineStream(note.userId, detailPackedNote); } else { // Publish event to myself's stream - publishUserStream(note.userId, 'note', noteObj); + publishHomeTimelineStream(note.userId, noteObj); // Publish note to local and hybrid timeline stream if (note.visibility != 'home') { @@ -495,7 +495,7 @@ async function publishToFollowers(note: INote, user: IUser, noteActivity: any) { } // Publish event to followers stream - publishUserStream(following.followerId, 'note', detailPackedNote); + publishHomeTimelineStream(following.followerId, detailPackedNote); if (isRemoteUser(user) || note.visibility != 'public') { publishHybridTimelineStream(following.followerId, detailPackedNote); @@ -526,7 +526,7 @@ function createMentionedEvents(mentionedUsers: IUser[], note: INote, nm: Notific detail: true }); - publishUserStream(u._id, 'mention', detailPackedNote); + publishMainStream(u._id, 'mention', detailPackedNote); // Create notification nm.push(u._id, 'mention'); diff --git a/src/services/note/delete.ts b/src/services/note/delete.ts index b164d59781..b5cf42ec28 100644 --- a/src/services/note/delete.ts +++ b/src/services/note/delete.ts @@ -30,7 +30,7 @@ export default async function(user: IUser, note: INote) { } }); - publishNoteStream(note._id, 'deleted'); + publishNoteStream(note._id, 'deleted', {}); //#region ローカルの投稿なら削除アクティビティを配送 if (isLocalUser(user)) { diff --git a/src/services/note/reaction/create.ts b/src/services/note/reaction/create.ts index 5b6267b0dd..6884014e33 100644 --- a/src/services/note/reaction/create.ts +++ b/src/services/note/reaction/create.ts @@ -43,7 +43,9 @@ export default async (user: IUser, note: INote, reaction: string) => new Promise $inc: inc }); - publishNoteStream(note._id, 'reacted'); + publishNoteStream(note._id, 'reacted', { + reaction: reaction + }); // リアクションされたユーザーがローカルユーザーなら通知を作成 if (isLocalUser(note._user)) { diff --git a/src/services/note/read.ts b/src/services/note/read.ts index 8622597bc0..caf5cf318f 100644 --- a/src/services/note/read.ts +++ b/src/services/note/read.ts @@ -1,5 +1,5 @@ import * as mongo from 'mongodb'; -import { publishUserStream } from '../../stream'; +import { publishMainStream } from '../../stream'; import User from '../../models/user'; import NoteUnread from '../../models/note-unread'; @@ -56,11 +56,11 @@ export default ( if (count1 == 0) { // 全て既読になったイベントを発行 - publishUserStream(userId, 'readAllUnreadMentions'); + publishMainStream(userId, 'readAllUnreadMentions'); } if (count2 == 0) { // 全て既読になったイベントを発行 - publishUserStream(userId, 'readAllUnreadSpecifiedNotes'); + publishMainStream(userId, 'readAllUnreadSpecifiedNotes'); } }); diff --git a/src/services/note/unread.ts b/src/services/note/unread.ts index 2d50976283..5953f61fe1 100644 --- a/src/services/note/unread.ts +++ b/src/services/note/unread.ts @@ -2,7 +2,7 @@ import NoteUnread from '../../models/note-unread'; import User, { IUser } from '../../models/user'; import { INote } from '../../models/note'; import Mute from '../../models/mute'; -import { publishUserStream } from '../../stream'; +import { publishMainStream } from '../../stream'; export default async function(user: IUser, note: INote, isSpecified = false) { //#region ミュートしているなら無視 @@ -38,10 +38,10 @@ export default async function(user: IUser, note: INote, isSpecified = false) { } }); - publishUserStream(user._id, 'unreadMention', note._id); + publishMainStream(user._id, 'unreadMention', note._id); if (isSpecified) { - publishUserStream(user._id, 'unreadSpecifiedNote', note._id); + publishMainStream(user._id, 'unreadSpecifiedNote', note._id); } }, 3000); } diff --git a/src/stream.ts b/src/stream.ts index 8a8d8b4cf0..4cd8fc8b2c 100644 --- a/src/stream.ts +++ b/src/stream.ts @@ -31,52 +31,59 @@ class Publisher { this.ev.emit(channel, message); } - public publishUserStream = (userId: ID, type: string, value?: any): void => { - this.publish(`user-stream:${userId}`, type, typeof value === 'undefined' ? null : value); + public publishMainStream = (userId: ID, type: string, value?: any): void => { + this.publish(`mainStream:${userId}`, type, typeof value === 'undefined' ? null : value); } public publishDriveStream = (userId: ID, type: string, value?: any): void => { - this.publish(`drive-stream:${userId}`, type, typeof value === 'undefined' ? null : value); + this.publish(`driveStream:${userId}`, type, typeof value === 'undefined' ? null : value); } - public publishNoteStream = (noteId: ID, type: string): void => { - this.publish(`note-stream:${noteId}`, null, noteId); + public publishNoteStream = (noteId: ID, type: string, value: any): void => { + this.publish(`noteStream:${noteId}`, type, { + id: noteId, + body: value + }); } public publishUserListStream = (listId: ID, type: string, value?: any): void => { - this.publish(`user-list-stream:${listId}`, type, typeof value === 'undefined' ? null : value); + this.publish(`userListStream:${listId}`, type, typeof value === 'undefined' ? null : value); } public publishMessagingStream = (userId: ID, otherpartyId: ID, type: string, value?: any): void => { - this.publish(`messaging-stream:${userId}-${otherpartyId}`, type, typeof value === 'undefined' ? null : value); + this.publish(`messagingStream:${userId}-${otherpartyId}`, type, typeof value === 'undefined' ? null : value); } public publishMessagingIndexStream = (userId: ID, type: string, value?: any): void => { - this.publish(`messaging-index-stream:${userId}`, type, typeof value === 'undefined' ? null : value); + this.publish(`messagingIndexStream:${userId}`, type, typeof value === 'undefined' ? null : value); } public publishReversiStream = (userId: ID, type: string, value?: any): void => { - this.publish(`reversi-stream:${userId}`, type, typeof value === 'undefined' ? null : value); + this.publish(`reversiStream:${userId}`, type, typeof value === 'undefined' ? null : value); } public publishReversiGameStream = (gameId: ID, type: string, value?: any): void => { - this.publish(`reversi-game-stream:${gameId}`, type, typeof value === 'undefined' ? null : value); + this.publish(`reversiGameStream:${gameId}`, type, typeof value === 'undefined' ? null : value); + } + + public publishHomeTimelineStream = (userId: ID, note: any): void => { + this.publish(`homeTimeline:${userId}`, null, note); } public publishLocalTimelineStream = async (note: any): Promise<void> => { const meta = await this.getMeta(); if (meta.disableLocalTimeline) return; - this.publish('local-timeline', null, note); + this.publish('localTimeline', null, note); } public publishHybridTimelineStream = async (userId: ID, note: any): Promise<void> => { const meta = await this.getMeta(); if (meta.disableLocalTimeline) return; - this.publish(userId ? `hybrid-timeline:${userId}` : 'hybrid-timeline', null, note); + this.publish(userId ? `hybridTimeline:${userId}` : 'hybridTimeline', null, note); } public publishGlobalTimelineStream = (note: any): void => { - this.publish('global-timeline', null, note); + this.publish('globalTimeline', null, note); } public publishHashtagStream = (note: any): void => { @@ -88,7 +95,7 @@ const publisher = new Publisher(); export default publisher; -export const publishUserStream = publisher.publishUserStream; +export const publishMainStream = publisher.publishMainStream; export const publishDriveStream = publisher.publishDriveStream; export const publishNoteStream = publisher.publishNoteStream; export const publishUserListStream = publisher.publishUserListStream; @@ -96,6 +103,7 @@ export const publishMessagingStream = publisher.publishMessagingStream; export const publishMessagingIndexStream = publisher.publishMessagingIndexStream; export const publishReversiStream = publisher.publishReversiStream; export const publishReversiGameStream = publisher.publishReversiGameStream; +export const publishHomeTimelineStream = publisher.publishHomeTimelineStream; export const publishLocalTimelineStream = publisher.publishLocalTimelineStream; export const publishHybridTimelineStream = publisher.publishHybridTimelineStream; export const publishGlobalTimelineStream = publisher.publishGlobalTimelineStream; diff --git a/tsconfig.json b/tsconfig.json index 76221c282a..ff4eaf917a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,8 @@ "removeComments": false, "noLib": false, "strict": true, - "strictNullChecks": false + "strictNullChecks": false, + "experimentalDecorators": true }, "compileOnSave": false, "include": [ From 3e897727ca7c8b0b5ba11c9d1866dc87ea136c22 Mon Sep 17 00:00:00 2001 From: sei0o inoue <sei0okun@gmail.com> Date: Sun, 7 Oct 2018 16:51:46 +0900 Subject: [PATCH 510/539] Fix #2773 (#2841) * Added an API endpoint to check the existence of the file * fix #2773: Now we can prevent users from posting the same images * bug fix --- src/client/app/common/scripts/get-md5.ts | 8 ++ .../app/common/views/components/uploader.vue | 94 ++++++++++++------- .../endpoints/drive/files/check_existence.ts | 38 ++++++++ 3 files changed, 106 insertions(+), 34 deletions(-) create mode 100644 src/client/app/common/scripts/get-md5.ts create mode 100644 src/server/api/endpoints/drive/files/check_existence.ts diff --git a/src/client/app/common/scripts/get-md5.ts b/src/client/app/common/scripts/get-md5.ts new file mode 100644 index 0000000000..24ac04c1ad --- /dev/null +++ b/src/client/app/common/scripts/get-md5.ts @@ -0,0 +1,8 @@ +const crypto = require('crypto'); + +export default (data: ArrayBuffer) => { + const buf = new Buffer(data); + const hash = crypto.createHash("md5"); + hash.update(buf); + return hash.digest("hex"); +}; \ No newline at end of file diff --git a/src/client/app/common/views/components/uploader.vue b/src/client/app/common/views/components/uploader.vue index 19b0d15708..fed6477c05 100644 --- a/src/client/app/common/views/components/uploader.vue +++ b/src/client/app/common/views/components/uploader.vue @@ -20,6 +20,7 @@ <script lang="ts"> import Vue from 'vue'; import { apiUrl } from '../../../config'; +import getMD5 from '../../scripts/get-md5'; export default Vue.extend({ data() { @@ -28,53 +29,78 @@ export default Vue.extend({ }; }, methods: { - upload(file, folder) { + checkExistence(fileData: ArrayBuffer): Promise<any> { + return new Promise((resolve, reject) => { + const data = new FormData(); + data.append('md5', getMD5(fileData)); + + (this as any).api('drive/files/check_existence', { + md5: getMD5(fileData) + }).then(resp => { + resolve(resp.file); + }); + }); + }, + + upload(file: File, folder: any) { if (folder && typeof folder == 'object') folder = folder.id; const id = Math.random(); - const ctx = { - id: id, - name: file.name || 'untitled', - progress: undefined, - img: undefined - }; - - this.uploads.push(ctx); - this.$emit('change', this.uploads); - const reader = new FileReader(); reader.onload = (e: any) => { - ctx.img = e.target.result; - }; - reader.readAsDataURL(file); + this.checkExistence(e.target.result).then(result => { + console.log(result); + if (result !== null) { + this.$emit('uploaded', result); + return; + } - const data = new FormData(); - data.append('i', this.$store.state.i.token); - data.append('file', file); + // Upload if the file didn't exist yet + const buf = new Uint8Array(e.target.result); + let bin = ""; + // We use for-of loop instead of apply() to avoid RangeError + // SEE: https://stackoverflow.com/questions/9267899/arraybuffer-to-base64-encoded-string + for (const byte of buf) bin += String.fromCharCode(byte); + const ctx = { + id: id, + name: file.name || 'untitled', + progress: undefined, + img: 'data:*/*;base64,' + btoa(bin) + }; - if (folder) data.append('folderId', folder); + this.uploads.push(ctx); + this.$emit('change', this.uploads); - const xhr = new XMLHttpRequest(); - xhr.open('POST', apiUrl + '/drive/files/create', true); - xhr.onload = (e: any) => { - const driveFile = JSON.parse(e.target.response); + const data = new FormData(); + data.append('i', this.$store.state.i.token); + data.append('file', file); - this.$emit('uploaded', driveFile); + if (folder) data.append('folderId', folder); - this.uploads = this.uploads.filter(x => x.id != id); - this.$emit('change', this.uploads); - }; + const xhr = new XMLHttpRequest(); + xhr.open('POST', apiUrl + '/drive/files/create', true); + xhr.onload = (e: any) => { + const driveFile = JSON.parse(e.target.response); - xhr.upload.onprogress = e => { - if (e.lengthComputable) { - if (ctx.progress == undefined) ctx.progress = {}; - ctx.progress.max = e.total; - ctx.progress.value = e.loaded; - } - }; + this.$emit('uploaded', driveFile); - xhr.send(data); + this.uploads = this.uploads.filter(x => x.id != id); + this.$emit('change', this.uploads); + }; + + xhr.upload.onprogress = e => { + if (e.lengthComputable) { + if (ctx.progress == undefined) ctx.progress = {}; + ctx.progress.max = e.total; + ctx.progress.value = e.loaded; + } + }; + + xhr.send(data); + }) + } + reader.readAsArrayBuffer(file); } } }); diff --git a/src/server/api/endpoints/drive/files/check_existence.ts b/src/server/api/endpoints/drive/files/check_existence.ts new file mode 100644 index 0000000000..73d75b7caf --- /dev/null +++ b/src/server/api/endpoints/drive/files/check_existence.ts @@ -0,0 +1,38 @@ +import $ from 'cafy'; +import DriveFile, { pack } from '../../../../../models/drive-file'; +import { ILocalUser } from '../../../../../models/user'; + +export const meta = { + desc: { + 'ja-JP': '与えられたMD5ハッシュ値を持つファイルがドライブに存在するかどうかを返します。', + 'en-US': 'Returns whether the file with the given MD5 hash exists in the user\'s drive.' + }, + + requireCredential: true, + + kind: 'drive-read', + + params: { + md5: $.str.note({ + desc: { + 'ja-JP': 'ファイルのMD5ハッシュ' + } + }) + } +}; + +export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => { + const [md5, md5Err] = $.str.get(params.md5); + if (md5Err) return rej('invalid md5 param'); + + const file = await DriveFile.findOne({ + md5: md5, + 'metadata.userId': user._id + }); + + if (file === null) { + res({ file: null }); + } else { + res({ file: await pack(file) }); + } +}); From 10af684804bbc5dc059e0f258a0a32d54f080f35 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 7 Oct 2018 17:06:28 +0900 Subject: [PATCH 511/539] Improve readability a little --- src/server/api/stream/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/server/api/stream/index.ts b/src/server/api/stream/index.ts index bd99f2755e..04136b3506 100644 --- a/src/server/api/stream/index.ts +++ b/src/server/api/stream/index.ts @@ -182,6 +182,7 @@ export default class Connection { /** * チャンネルから切断 + * @param id チャンネルコネクションID */ @autobind private disconnectChannel(id: string) { @@ -193,6 +194,10 @@ export default class Connection { } } + /** + * チャンネルへメッセージ送信要求時 + * @param data メッセージ + */ @autobind private onChannelMessageRequested(data: any) { const channel = this.channels.find(c => c.id === data.id); From e05acb8d18059c01e5789db043db82e4abfbd9d5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 7 Oct 2018 17:19:52 +0900 Subject: [PATCH 512/539] =?UTF-8?q?=E5=BE=8C=E6=96=B9=E4=BA=92=E6=8F=9B?= =?UTF-8?q?=E6=80=A7=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/api/stream/index.ts | 4 ++-- src/server/api/streaming.ts | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/server/api/stream/index.ts b/src/server/api/stream/index.ts index 04136b3506..743d77b2a3 100644 --- a/src/server/api/stream/index.ts +++ b/src/server/api/stream/index.ts @@ -174,7 +174,7 @@ export default class Connection { * チャンネルに接続 */ @autobind - private connectChannel(id: string, params: any, channelClass: { new(id: string, connection: Connection): Channel }) { + public connectChannel(id: string, params: any, channelClass: { new(id: string, connection: Connection): Channel }) { const channel = new channelClass(id, this); this.channels.push(channel); channel.init(params); @@ -185,7 +185,7 @@ export default class Connection { * @param id チャンネルコネクションID */ @autobind - private disconnectChannel(id: string) { + public disconnectChannel(id: string) { const channel = this.channels.find(c => c.id === id); if (channel) { diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts index 4518d21c3f..b7793eb284 100644 --- a/src/server/api/streaming.ts +++ b/src/server/api/streaming.ts @@ -5,6 +5,7 @@ import Xev from 'xev'; import MainStreamConnection from './stream'; import { ParsedUrlQuery } from 'querystring'; import authenticate from './authenticate'; +import channels from './stream/channels'; module.exports = (server: http.Server) => { // Init websocket server @@ -22,6 +23,27 @@ module.exports = (server: http.Server) => { const main = new MainStreamConnection(connection, ev, user, app); + // 後方互換性のため + if (request.resourceURL.pathname !== '/streaming') { + main.sendMessageToWs = (type: string, payload: any) => { + if (type == 'channel') { + type = payload.type; + payload = payload.body; + } + connection.send(JSON.stringify({ + type: type, + body: payload + })); + }; + if (request.resourceURL.pathname === '/') { + main.connectChannel(Math.random().toString(), null, + request.resourceURL.pathname === '/' ? channels.homeTimeline : + request.resourceURL.pathname === '/local-timeline' ? channels.localTimeline : + request.resourceURL.pathname === '/hybrid-timeline' ? channels.hybridTimeline : + request.resourceURL.pathname === '/global-timeline' ? channels.globalTimeline : null); + } + } + connection.once('close', () => { ev.removeAllListeners(); main.dispose(); From 75cd580c3adca8dc8de69fdf0d5d023e2b16d38c Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 7 Oct 2018 19:30:24 +0900 Subject: [PATCH 513/539] Improve theming --- src/client/app/mobile/views/components/post-form.vue | 2 +- src/client/theme/dark.json5 | 1 + src/client/theme/light.json5 | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index e4ec1aa576..3de920cf22 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -478,7 +478,7 @@ export default Vue.extend({ width 48px height 48px font-size 20px - color #657786 + color var(--mobilePostFormButton) background transparent outline none border none diff --git a/src/client/theme/dark.json5 b/src/client/theme/dark.json5 index 72362a2305..1f4585d14d 100644 --- a/src/client/theme/dark.json5 +++ b/src/client/theme/dark.json5 @@ -175,6 +175,7 @@ mobileNavBackdrop: 'rgba(0, 0, 0, 0.7)', mobilePostFormDivider: 'rgba(0, 0, 0, 0.2)', mobilePostFormTextareaBg: 'rgba(0, 0, 0, 0.3)', + mobilePostFormButton: '$text', mobileDriveNavBg: ':alpha<0.75<$secondary', mobileHomeTlItemHover: 'rgba(255, 255, 255, 0.1)', mobileUserPageName: '#fff', diff --git a/src/client/theme/light.json5 b/src/client/theme/light.json5 index 90d0d40187..acb2a6d682 100644 --- a/src/client/theme/light.json5 +++ b/src/client/theme/light.json5 @@ -175,6 +175,7 @@ mobileNavBackdrop: 'rgba(0, 0, 0, 0.2)', mobilePostFormDivider: 'rgba(0, 0, 0, 0.1)', mobilePostFormTextareaBg: '#fff', + mobilePostFormButton: '$text', mobileDriveNavBg: ':alpha<0.75<$secondary', mobileHomeTlItemHover: 'rgba(0, 0, 0, 0.05)', mobileUserPageName: '#757c82', From 0adcb646fe57771d4c6c9e3192d2761831bd6064 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 7 Oct 2018 19:35:25 +0900 Subject: [PATCH 514/539] Fix bug --- .../app/common/views/components/stream-indicator.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/client/app/common/views/components/stream-indicator.vue b/src/client/app/common/views/components/stream-indicator.vue index 0f25b37cc9..12bf78f130 100644 --- a/src/client/app/common/views/components/stream-indicator.vue +++ b/src/client/app/common/views/components/stream-indicator.vue @@ -1,14 +1,14 @@ <template> <div class="mk-stream-indicator"> - <p v-if=" stream.state == 'initializing' "> + <p v-if="stream.state == 'initializing'"> %fa:spinner .pulse% <span>%i18n:@connecting%<mk-ellipsis/></span> </p> - <p v-if=" stream.state == 'reconnecting' "> + <p v-if="stream.state == 'reconnecting'"> %fa:spinner .pulse% <span>%i18n:@reconnecting%<mk-ellipsis/></span> </p> - <p v-if=" stream.state == 'connected' "> + <p v-if="stream.state == 'connected'"> %fa:check% <span>%i18n:@connected%</span> </p> @@ -22,7 +22,7 @@ import * as anime from 'animejs'; export default Vue.extend({ computed: { stream() { - return (this as any).os.stream.useSharedConnection('main'); + return (this as any).os.stream; } }, created() { From 1c65cb3e3637c097e876c38147cd1b95b4d356ca Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 7 Oct 2018 19:58:00 +0900 Subject: [PATCH 515/539] Resolve #2843 --- src/services/i/pin.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/services/i/pin.ts b/src/services/i/pin.ts index 142fc18511..ff390eb781 100644 --- a/src/services/i/pin.ts +++ b/src/services/i/pin.ts @@ -24,7 +24,15 @@ export async function addPinned(user: IUser, noteId: mongo.ObjectID) { throw new Error('note not found'); } - const pinnedNoteIds = user.pinnedNoteIds || []; + let pinnedNoteIds = user.pinnedNoteIds || []; + + //#region 現在ピン留め投稿している投稿が実際にデータベースに存在しているのかチェック + // データベースの欠損などで存在していない場合があるので。 + // 存在していなかったらピン留め投稿から外す + const pinnedNotes = (await Promise.all(pinnedNoteIds.map(id => Note.findOne({ _id: id })))).filter(x => x != null); + + pinnedNoteIds = pinnedNoteIds.filter(id => pinnedNotes.some(n => n._id.equals(id))); + //#endregion if (pinnedNoteIds.length >= 5) { throw new Error('cannot pin more notes'); From b6a330928db0cf62ac0cfe484cd5e148edb9ce12 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Sun, 7 Oct 2018 20:08:42 +0900 Subject: [PATCH 516/539] =?UTF-8?q?=E6=8A=95=E7=A8=BF=E3=81=AE=E5=89=8A?= =?UTF-8?q?=E9=99=A4=E3=82=A4=E3=83=99=E3=83=B3=E3=83=88=E3=82=92=E5=8F=97?= =?UTF-8?q?=E3=81=91=E5=8F=96=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/app/common/scripts/note-subscriber.ts | 11 +++++++++++ .../app/desktop/views/components/notes.note.vue | 2 +- src/client/app/mobile/views/components/note.vue | 2 +- src/services/note/delete.ts | 8 ++++++-- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/client/app/common/scripts/note-subscriber.ts b/src/client/app/common/scripts/note-subscriber.ts index 5fc82942d5..c41897e70f 100644 --- a/src/client/app/common/scripts/note-subscriber.ts +++ b/src/client/app/common/scripts/note-subscriber.ts @@ -97,6 +97,17 @@ export default prop => ({ this.$_ns_target.poll.choices.find(c => c.id === choice).votes++; break; } + + case 'deleted': { + Vue.set(this.$_ns_target, 'deletedAt', body.deletedAt); + this.$_ns_target.text = null; + this.$_ns_target.tags = []; + this.$_ns_target.fileIds = []; + this.$_ns_target.poll = null; + this.$_ns_target.geo = null; + this.$_ns_target.cw = null; + break; + } } this.$emit(`update:${prop}`, this.$_ns_note_); diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue index 3892260181..2db1479823 100644 --- a/src/client/app/desktop/views/components/notes.note.vue +++ b/src/client/app/desktop/views/components/notes.note.vue @@ -38,7 +38,7 @@ <mk-url-preview v-for="url in urls" :url="url" :key="url"/> </div> </div> - <footer> + <footer v-if="p.deletedAt == null"> <mk-reactions-viewer :note="p" ref="reactionsViewer"/> <button class="replyButton" @click="reply()" title="%i18n:@reply%"> <template v-if="p.reply">%fa:reply-all%</template> diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index db1be4a00e..f370fbf874 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -39,7 +39,7 @@ </div> <span class="app" v-if="p.app">via <b>{{ p.app.name }}</b></span> </div> - <footer> + <footer v-if="p.deletedAt == null"> <mk-reactions-viewer :note="p" ref="reactionsViewer"/> <button @click="reply"> <template v-if="p.reply">%fa:reply-all%</template> diff --git a/src/services/note/delete.ts b/src/services/note/delete.ts index b5cf42ec28..2b99b4b85e 100644 --- a/src/services/note/delete.ts +++ b/src/services/note/delete.ts @@ -15,12 +15,14 @@ import config from '../../config'; * @param note 投稿 */ export default async function(user: IUser, note: INote) { + const deletedAt = new Date(); + await Note.update({ _id: note._id, userId: user._id }, { $set: { - deletedAt: new Date(), + deletedAt: deletedAt, text: null, tags: [], fileIds: [], @@ -30,7 +32,9 @@ export default async function(user: IUser, note: INote) { } }); - publishNoteStream(note._id, 'deleted', {}); + publishNoteStream(note._id, 'deleted', { + deletedAt: deletedAt + }); //#region ローカルの投稿なら削除アクティビティを配送 if (isLocalUser(user)) { From b9f5fca3333283cda2ccbd7843f7496dd9eae574 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Sun, 7 Oct 2018 20:20:55 +0900 Subject: [PATCH 517/539] =?UTF-8?q?ActivityPub=E3=82=AA=E3=83=96=E3=82=B8?= =?UTF-8?q?=E3=82=A7=E3=82=AF=E3=83=88=E6=8E=A1=E7=95=AAAPI=20(#2832)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Show ActivityPub object API * Add missing return --- src/server/api/endpoints/ap/show.ts | 116 ++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 src/server/api/endpoints/ap/show.ts diff --git a/src/server/api/endpoints/ap/show.ts b/src/server/api/endpoints/ap/show.ts new file mode 100644 index 0000000000..1f390d01aa --- /dev/null +++ b/src/server/api/endpoints/ap/show.ts @@ -0,0 +1,116 @@ +import $ from 'cafy'; +import getParams from '../../get-params'; +import config from '../../../../config'; +import * as mongo from 'mongodb'; +import User, { pack as packUser, IUser } from '../../../../models/user'; +import { createPerson } from '../../../../remote/activitypub/models/person'; +import Note, { pack as packNote, INote } from '../../../../models/note'; +import { createNote } from '../../../../remote/activitypub/models/note'; +import Resolver from '../../../../remote/activitypub/resolver'; + +export const meta = { + desc: { + 'ja-JP': 'URIを指定してActivityPubオブジェクトを参照します。' + }, + + requireCredential: false, + + params: { + uri: $.str.note({ + desc: { + 'ja-JP': 'ActivityPubオブジェクトのURI' + } + }), + }, +}; + +export default (params: any) => new Promise(async (res, rej) => { + const [ps, psErr] = getParams(meta, params); + if (psErr) return rej(psErr); + + const object = await fetchAny(ps.uri); + if (object !== null) return res(object); + + return rej('object not found'); +}); + +/*** + * URIからUserかNoteを解決する + */ +async function fetchAny(uri: string) { + // URIがこのサーバーを指しているなら、ローカルユーザーIDとしてDBからフェッチ + if (uri.startsWith(config.url + '/')) { + const id = new mongo.ObjectID(uri.split('/').pop()); + const [ user, note ] = await Promise.all([ + User.findOne({ _id: id }), + Note.findOne({ _id: id }) + ]); + + const packed = await mergePack(user, note); + if (packed !== null) return packed; + } + + // URI(AP Object id)としてDB検索 + { + const [ user, note ] = await Promise.all([ + User.findOne({ uri: uri }), + Note.findOne({ uri: uri }) + ]); + + const packed = await mergePack(user, note); + if (packed !== null) return packed; + } + + // リモートから一旦オブジェクトフェッチ + const resolver = new Resolver(); + const object = await resolver.resolve(uri) as any; + + // /@user のような正規id以外で取得できるURIが指定されていた場合、ここで初めて正規URIが確定する + // これはDBに存在する可能性があるため再度DB検索 + if (uri !== object.id) { + const [ user, note ] = await Promise.all([ + User.findOne({ uri: object.id }), + Note.findOne({ uri: object.id }) + ]); + + const packed = await mergePack(user, note); + if (packed !== null) return packed; + } + + // それでもみつからなければ新規であるため登録 + if (object.type === 'Person') { + const user = await createPerson(object.id); + return { + type: 'User', + object: user + }; + } + + if (object.type === 'Note') { + const note = await createNote(object.id); + return { + type: 'Note', + object: note + }; + } + + return null; +} + +async function mergePack(user: IUser, note: INote) { + if (user !== null) { + return { + type: 'User', + object: await packUser(user, null, { detail: true }) + }; + } + + if (note !== null) { + return { + type: 'Note', + object: await packNote(note, null, { detail: true }) + }; + } + + return null; +} From ccf04d63ec14b83e52aa736404d797780fc358ea Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Sun, 7 Oct 2018 20:23:13 +0900 Subject: [PATCH 518/539] fix(package): update ws to version 6.1.0 (#2823) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dc76ad0f81..b19c97c481 100644 --- a/package.json +++ b/package.json @@ -229,7 +229,7 @@ "webpack": "4.20.2", "webpack-cli": "3.1.2", "websocket": "1.0.28", - "ws": "6.0.0", + "ws": "6.1.0", "xev": "2.0.1" }, "greenkeeper": { From 3199819ded083bc94ce91427a79e114e2015a905 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Sun, 7 Oct 2018 20:26:35 +0900 Subject: [PATCH 519/539] fix(package): update reconnecting-websocket to version 4.1.5 (#2845) Closes #2785 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b19c97c481..977164c001 100644 --- a/package.json +++ b/package.json @@ -175,7 +175,7 @@ "qrcode": "1.3.0", "ratelimiter": "3.2.0", "recaptcha-promise": "0.1.3", - "reconnecting-websocket": "3.2.2", + "reconnecting-websocket": "4.1.5", "redis": "2.8.0", "request": "2.88.0", "request-promise-native": "1.0.5", From ec541d3cd04495d53201a6abce20dbf56e2b5ae3 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Sun, 7 Oct 2018 20:26:47 +0900 Subject: [PATCH 520/539] fix(package): update systeminformation to version 3.45.7 (#2825) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 977164c001..53c7cd6ef1 100644 --- a/package.json +++ b/package.json @@ -195,7 +195,7 @@ "stylus": "0.54.5", "stylus-loader": "3.0.2", "summaly": "2.2.0", - "systeminformation": "3.45.6", + "systeminformation": "3.45.7", "syuilo-password-strength": "0.0.1", "textarea-caret": "3.1.0", "tinycolor2": "1.4.1", From 599386190a8d2ee680036567dddbbf12a67520ca Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Sun, 7 Oct 2018 20:27:05 +0900 Subject: [PATCH 521/539] fix(package): update file-loader to version 2.0.0 (#2827) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 53c7cd6ef1..04e756d157 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ "eslint-plugin-vue": "4.7.1", "eventemitter3": "3.1.0", "exif-js": "2.3.0", - "file-loader": "1.1.11", + "file-loader": "2.0.0", "file-type": "9.0.0", "fuckadblock": "3.2.1", "gulp": "3.9.1", From f5cbcf3452a044f92fb29ecceb47e4908eb48833 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Sun, 7 Oct 2018 20:29:43 +0900 Subject: [PATCH 522/539] fix(package): update vue-svg-inline-loader to version 1.2.0 (#2844) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 04e756d157..42eb8f7943 100644 --- a/package.json +++ b/package.json @@ -218,7 +218,7 @@ "vue-loader": "15.4.2", "vue-router": "3.0.1", "vue-style-loader": "4.1.2", - "vue-svg-inline-loader": "1.1.4", + "vue-svg-inline-loader": "1.2.0", "vue-template-compiler": "2.5.17", "vuedraggable": "2.16.0", "vuewordcloud": "18.7.11", From 361ab00c61ff89a2bf731365b010ecf63b05a105 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Sun, 7 Oct 2018 20:31:57 +0900 Subject: [PATCH 523/539] fix(package): update @types/debug to version 0.0.31 (#2822) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 42eb8f7943..b7287a6492 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "@prezzemolo/zip": "0.0.3", "@types/bcryptjs": "2.4.2", "@types/dateformat": "1.0.1", - "@types/debug": "0.0.30", + "@types/debug": "0.0.31", "@types/deep-equal": "1.0.1", "@types/double-ended-queue": "2.1.0", "@types/elasticsearch": "5.0.26", From 305915611e98094eea832d0441f1d0990096f8ab Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 8 Oct 2018 00:58:10 +0900 Subject: [PATCH 524/539] Fix bug --- src/server/api/stream/index.ts | 2 ++ src/server/api/streaming.ts | 15 +++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/server/api/stream/index.ts b/src/server/api/stream/index.ts index 743d77b2a3..ef6397fcd9 100644 --- a/src/server/api/stream/index.ts +++ b/src/server/api/stream/index.ts @@ -24,6 +24,7 @@ export default class Connection { public subscriber: Xev; private channels: Channel[] = []; private subscribingNotes: any = {}; + public sendMessageToWsOverride: any = null; // 後方互換性のため constructor( wsConnection: websocket.connection, @@ -164,6 +165,7 @@ export default class Connection { */ @autobind public sendMessageToWs(type: string, payload: any) { + if (this.sendMessageToWsOverride) return this.sendMessageToWsOverride(type, payload); // 後方互換性のため this.wsConnection.send(JSON.stringify({ type: type, body: payload diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts index b7793eb284..8bfa5574f1 100644 --- a/src/server/api/streaming.ts +++ b/src/server/api/streaming.ts @@ -25,7 +25,7 @@ module.exports = (server: http.Server) => { // 後方互換性のため if (request.resourceURL.pathname !== '/streaming') { - main.sendMessageToWs = (type: string, payload: any) => { + main.sendMessageToWsOverride = (type: string, payload: any) => { if (type == 'channel') { type = payload.type; payload = payload.body; @@ -35,13 +35,12 @@ module.exports = (server: http.Server) => { body: payload })); }; - if (request.resourceURL.pathname === '/') { - main.connectChannel(Math.random().toString(), null, - request.resourceURL.pathname === '/' ? channels.homeTimeline : - request.resourceURL.pathname === '/local-timeline' ? channels.localTimeline : - request.resourceURL.pathname === '/hybrid-timeline' ? channels.hybridTimeline : - request.resourceURL.pathname === '/global-timeline' ? channels.globalTimeline : null); - } + + main.connectChannel(Math.random().toString(), null, + request.resourceURL.pathname === '/' ? channels.homeTimeline : + request.resourceURL.pathname === '/local-timeline' ? channels.localTimeline : + request.resourceURL.pathname === '/hybrid-timeline' ? channels.hybridTimeline : + request.resourceURL.pathname === '/global-timeline' ? channels.globalTimeline : null); } connection.once('close', () => { From 4182a0cf4c068926ed21c22d63643e12479480d8 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 8 Oct 2018 01:03:07 +0900 Subject: [PATCH 525/539] Fix --- .../app/desktop/views/components/media-video.vue | 11 ++--------- .../app/mobile/views/components/media-video.vue | 5 +++-- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/client/app/desktop/views/components/media-video.vue b/src/client/app/desktop/views/components/media-video.vue index 1ff762abc2..7859a59254 100644 --- a/src/client/app/desktop/views/components/media-video.vue +++ b/src/client/app/desktop/views/components/media-video.vue @@ -6,19 +6,12 @@ </div> </div> <div class="vwxdhznewyashiknzolsoihtlpicqepe" v-else> - <video class="video" - :src="video.url" - :title="video.name" - controls - @dblclick.prevent="onClick" - ref="video" - v-if="inlinePlayable" /> <a class="thumbnail" :href="video.url" :style="imageStyle" @click.prevent="onClick" :title="video.name" - v-else> + > %fa:R play-circle% </a> </div> @@ -46,7 +39,7 @@ export default Vue.extend({ computed: { imageStyle(): any { return { - 'background-image': `url(${this.video.url})` + 'background-image': null // TODO `url(${this.video.thumbnailUrl})` }; } }, diff --git a/src/client/app/mobile/views/components/media-video.vue b/src/client/app/mobile/views/components/media-video.vue index 1e2c1ea7b0..59ba695b93 100644 --- a/src/client/app/mobile/views/components/media-video.vue +++ b/src/client/app/mobile/views/components/media-video.vue @@ -9,7 +9,8 @@ :href="video.url" target="_blank" :style="imageStyle" - :title="video.name"> + :title="video.name" +> %fa:R play-circle% </a> </template> @@ -32,7 +33,7 @@ export default Vue.extend({ computed: { imageStyle(): any { return { - 'background-image': `url(${this.video.url})` + 'background-image': null // TODO `url(${this.video.thumbnailUrl})` }; } } From 03d0ce1f89d04880b55ede067d26cf486744acc5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 8 Oct 2018 01:10:30 +0900 Subject: [PATCH 526/539] Improve theme --- src/client/theme/pink.json5 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/client/theme/pink.json5 b/src/client/theme/pink.json5 index e228b4b4fa..71e963dc91 100644 --- a/src/client/theme/pink.json5 +++ b/src/client/theme/pink.json5 @@ -1,20 +1,20 @@ { id: 'e9c8c01d-9c15-48d0-9b5c-3d00843b5b36', - name: 'Strawberry Milk', - author: 'syuilo', + name: 'Lavender', + author: 'sokuyuku & syuilo', base: 'light', vars: { - primary: 'rgb(251, 78, 112)', - secondary: 'rgb(255, 218, 240)', - text: 'rgb(113, 91, 102)', + primary: 'rgb(206, 147, 191)', + secondary: 'rgb(253, 242, 243)', + text: 'rgb(161, 139, 146)', }, props: { - renoteGradient: '#ffb1c9', - renoteText: '#ff588d', - quoteBorder: '#ff6c9b', + renoteGradient: '#f7e4ec', + renoteText: '$primary', + quoteBorder: '$primary', }, } From a780e7b936c826d7919b38d60dbd60c627f4dd6f Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 8 Oct 2018 01:14:46 +0900 Subject: [PATCH 527/539] Clean up --- src/client/app/common/views/components/messaging-room.vue | 1 - src/client/app/common/views/components/uploader.vue | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/client/app/common/views/components/messaging-room.vue b/src/client/app/common/views/components/messaging-room.vue index c2cd79e116..488dff528f 100644 --- a/src/client/app/common/views/components/messaging-room.vue +++ b/src/client/app/common/views/components/messaging-room.vue @@ -163,7 +163,6 @@ export default Vue.extend({ }, onMessage(message) { - console.log(message); // サウンドを再生する if (this.$store.state.device.enableSounds) { const sound = new Audio(`${url}/assets/message.mp3`); diff --git a/src/client/app/common/views/components/uploader.vue b/src/client/app/common/views/components/uploader.vue index fed6477c05..b812064bbb 100644 --- a/src/client/app/common/views/components/uploader.vue +++ b/src/client/app/common/views/components/uploader.vue @@ -50,7 +50,6 @@ export default Vue.extend({ const reader = new FileReader(); reader.onload = (e: any) => { this.checkExistence(e.target.result).then(result => { - console.log(result); if (result !== null) { this.$emit('uploaded', result); return; @@ -58,7 +57,7 @@ export default Vue.extend({ // Upload if the file didn't exist yet const buf = new Uint8Array(e.target.result); - let bin = ""; + let bin = ''; // We use for-of loop instead of apply() to avoid RangeError // SEE: https://stackoverflow.com/questions/9267899/arraybuffer-to-base64-encoded-string for (const byte of buf) bin += String.fromCharCode(byte); @@ -107,8 +106,6 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> - - .mk-uploader overflow auto From 674764a0354fac94116271bbac303c25cb2406cc Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 8 Oct 2018 01:16:32 +0900 Subject: [PATCH 528/539] Fix --- src/client/app/common/scripts/stream.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/app/common/scripts/stream.ts b/src/client/app/common/scripts/stream.ts index 7dc130937b..3b1a94adf9 100644 --- a/src/client/app/common/scripts/stream.ts +++ b/src/client/app/common/scripts/stream.ts @@ -1,6 +1,6 @@ import autobind from 'autobind-decorator'; import { EventEmitter } from 'eventemitter3'; -import * as ReconnectingWebsocket from 'reconnecting-websocket'; +import ReconnectingWebsocket from 'reconnecting-websocket'; import { wsUrl } from '../../config'; import MiOS from '../../mios'; From 2ede3c0864539945c1944ab0ee33439830ab44a4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 8 Oct 2018 01:25:34 +0900 Subject: [PATCH 529/539] Clean up --- src/models/note.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/models/note.ts b/src/models/note.ts index 43b8753195..6c16ab054b 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -220,7 +220,6 @@ export const hideNote = async (packedNote: any, meId: mongo.ObjectID) => { packedNote.poll = null; packedNote.cw = null; packedNote.tags = []; - packedNote.tagsLower = []; packedNote.geo = null; packedNote.isHidden = true; } @@ -294,6 +293,9 @@ export const pack = async ( _note.id = _note._id; delete _note._id; + delete _note.prev; + delete _note.next; + delete _note.tagsLower; delete _note._user; delete _note._reply; delete _note._renote; From 1003fd393e7b8b1c0b686e4689e95d935bf4419b Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 8 Oct 2018 01:56:36 +0900 Subject: [PATCH 530/539] Fix bug --- src/server/api/stream/channels/main.ts | 6 +++--- src/stream.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/server/api/stream/channels/main.ts b/src/server/api/stream/channels/main.ts index a6c5b12760..fd0984c833 100644 --- a/src/server/api/stream/channels/main.ts +++ b/src/server/api/stream/channels/main.ts @@ -14,12 +14,12 @@ export default class extends Channel { switch (type) { case 'notification': { - if (!mutedUserIds.includes(body.userId)) { - this.send('notification', body); - } + if (mutedUserIds.includes(body.userId)) return; break; } } + + this.send(type, body); }); } } diff --git a/src/stream.ts b/src/stream.ts index 4cd8fc8b2c..45b353d904 100644 --- a/src/stream.ts +++ b/src/stream.ts @@ -25,7 +25,7 @@ class Publisher { private publish = (channel: string, type: string, value?: any): void => { const message = type == null ? value : value == null ? - { type: type } : + { type: type, body: null } : { type: type, body: value }; this.ev.emit(channel, message); From 39bdfb6e0d3270b37c614bc0d54749faeb6c0623 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 8 Oct 2018 02:10:46 +0900 Subject: [PATCH 531/539] Improve usability --- src/notify.ts | 4 ++-- src/server/api/endpoints/messaging/messages/create.ts | 4 ++-- src/services/note/unread.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/notify.ts b/src/notify.ts index eaef63e3c3..522f4c52dd 100644 --- a/src/notify.ts +++ b/src/notify.ts @@ -39,7 +39,7 @@ export default ( } }); - // 3秒経っても(今回作成した)通知が既読にならなかったら「未読の通知がありますよ」イベントを発行する + // 2秒経っても(今回作成した)通知が既読にならなかったら「未読の通知がありますよ」イベントを発行する setTimeout(async () => { const fresh = await Notification.findOne({ _id: notification._id }, { isRead: true }); if (!fresh.isRead) { @@ -58,5 +58,5 @@ export default ( pushSw(notifiee, 'notification', packed); } - }, 3000); + }, 2000); }); diff --git a/src/server/api/endpoints/messaging/messages/create.ts b/src/server/api/endpoints/messaging/messages/create.ts index f504f92326..cb115cf987 100644 --- a/src/server/api/endpoints/messaging/messages/create.ts +++ b/src/server/api/endpoints/messaging/messages/create.ts @@ -102,7 +102,7 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = } }); - // 3秒経っても(今回作成した)メッセージが既読にならなかったら「未読のメッセージがありますよ」イベントを発行する + // 2秒経っても(今回作成した)メッセージが既読にならなかったら「未読のメッセージがありますよ」イベントを発行する setTimeout(async () => { const freshMessage = await Message.findOne({ _id: message._id }, { isRead: true }); if (!freshMessage.isRead) { @@ -120,7 +120,7 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) = publishMainStream(message.recipientId, 'unreadMessagingMessage', messageObj); pushSw(message.recipientId, 'unreadMessagingMessage', messageObj); } - }, 3000); + }, 2000); // 履歴作成(自分) History.update({ diff --git a/src/services/note/unread.ts b/src/services/note/unread.ts index 5953f61fe1..e84ac2a4bf 100644 --- a/src/services/note/unread.ts +++ b/src/services/note/unread.ts @@ -22,7 +22,7 @@ export default async function(user: IUser, note: INote, isSpecified = false) { } }); - // 3秒経っても既読にならなかったら「未読の投稿がありますよ」イベントを発行する + // 2秒経っても既読にならなかったら「未読の投稿がありますよ」イベントを発行する setTimeout(async () => { const exist = await NoteUnread.findOne({ _id: unread._id }); if (exist == null) return; @@ -43,5 +43,5 @@ export default async function(user: IUser, note: INote, isSpecified = false) { if (isSpecified) { publishMainStream(user._id, 'unreadSpecifiedNote', note._id); } - }, 3000); + }, 2000); } From c4d4293c46bed1a1c13db56f6512f98f36fcdabd Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Mon, 8 Oct 2018 02:31:42 +0900 Subject: [PATCH 532/539] fix(package): update file-type to version 10.0.0 (#2846) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b7287a6492..88a9c07e16 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "eventemitter3": "3.1.0", "exif-js": "2.3.0", "file-loader": "2.0.0", - "file-type": "9.0.0", + "file-type": "10.0.0", "fuckadblock": "3.2.1", "gulp": "3.9.1", "gulp-cssnano": "2.1.3", From e00b5f11cb97749bb8b1907d3671109033e3829a Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 8 Oct 2018 08:58:12 +0900 Subject: [PATCH 533/539] =?UTF-8?q?=E4=BA=92=E6=8F=9B=E6=80=A7=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/api/streaming.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts index 8bfa5574f1..aed0e674f9 100644 --- a/src/server/api/streaming.ts +++ b/src/server/api/streaming.ts @@ -30,6 +30,9 @@ module.exports = (server: http.Server) => { type = payload.type; payload = payload.body; } + if (type.startsWith('api:')) { + type = payload.type.replace('api:', 'api-res:'); + } connection.send(JSON.stringify({ type: type, body: payload From 65e46b5cec9b759122c5a000039ebcc7a8ae53d4 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 8 Oct 2018 09:02:11 +0900 Subject: [PATCH 534/539] oops --- src/server/api/streaming.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts index aed0e674f9..c8c4a8a294 100644 --- a/src/server/api/streaming.ts +++ b/src/server/api/streaming.ts @@ -31,7 +31,7 @@ module.exports = (server: http.Server) => { payload = payload.body; } if (type.startsWith('api:')) { - type = payload.type.replace('api:', 'api-res:'); + type = type.replace('api:', 'api-res:'); } connection.send(JSON.stringify({ type: type, From d9edc1eb1d89831f53039cbc31f3132067f41ff5 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 8 Oct 2018 09:08:02 +0900 Subject: [PATCH 535/539] Improve theme --- src/client/app/desktop/views/components/ui.header.clock.vue | 2 +- src/client/theme/dark.json5 | 2 +- src/client/theme/light.json5 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/app/desktop/views/components/ui.header.clock.vue b/src/client/app/desktop/views/components/ui.header.clock.vue index 1c3f12f2f2..b8b638bc41 100644 --- a/src/client/app/desktop/views/components/ui.header.clock.vue +++ b/src/client/app/desktop/views/components/ui.header.clock.vue @@ -89,7 +89,7 @@ export default Vue.extend({ display table-cell vertical-align middle height 48px - color #9eaba8 + color var(--desktopHeaderFg) > .yyyymmdd opacity 0.7 diff --git a/src/client/theme/dark.json5 b/src/client/theme/dark.json5 index 1f4585d14d..f993e5ef1f 100644 --- a/src/client/theme/dark.json5 +++ b/src/client/theme/dark.json5 @@ -98,7 +98,7 @@ calendarWeek: '#43d5dc', calendarSaturdayOrSunday: '#ff6679', - calendarDay: '#c5ced6', + calendarDay: '$text', materBg: 'rgba(0, 0, 0, 0.3)', diff --git a/src/client/theme/light.json5 b/src/client/theme/light.json5 index acb2a6d682..db851b66c4 100644 --- a/src/client/theme/light.json5 +++ b/src/client/theme/light.json5 @@ -98,7 +98,7 @@ calendarWeek: '#19a2a9', calendarSaturdayOrSunday: '#ef95a0', - calendarDay: '#777', + calendarDay: '$text', materBg: 'rgba(0, 0, 0, 0.1)', From 9b3af6efcdb656a545d98292ceb59a06f6b7e0a7 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <greenkeeper[bot]@users.noreply.github.com> Date: Mon, 8 Oct 2018 14:50:32 +0900 Subject: [PATCH 536/539] fix(package): update jsdom to version 12.2.0 (#2848) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 88a9c07e16..9a552e943e 100644 --- a/package.json +++ b/package.json @@ -134,7 +134,7 @@ "is-root": "2.0.0", "is-url": "1.2.4", "js-yaml": "3.12.0", - "jsdom": "12.1.0", + "jsdom": "12.2.0", "json5": "2.1.0", "json5-loader": "1.0.1", "koa": "2.5.1", From 567cedc7cc82057d47e2891b8f19e32f2d584d7b Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 8 Oct 2018 15:23:10 +0900 Subject: [PATCH 537/539] Improve usability --- locales/ja-JP.yml | 2 ++ .../app/common/views/components/theme.vue | 24 ++++++++++++++++--- src/client/theme/dark.json5 | 1 + src/client/theme/light.json5 | 1 + 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 99c865e2b5..f9cc57d370 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -288,6 +288,8 @@ common/views/components/media-banner.vue: common/views/components/theme.vue: light-theme: "非ダークモード時に使用するテーマ" dark-theme: "ダークモード時に使用するテーマ" + light-themes: "明るいテーマ" + dark-themes: "暗いテーマ" install-a-theme: "テーマのインストール" theme-code: "テーマコード" install: "インストール" diff --git a/src/client/app/common/views/components/theme.vue b/src/client/app/common/views/components/theme.vue index 4b0e6da24c..9eda3c5796 100644 --- a/src/client/app/common/views/components/theme.vue +++ b/src/client/app/common/views/components/theme.vue @@ -3,14 +3,24 @@ <label> <span>%i18n:@light-theme%</span> <ui-select v-model="light" placeholder="%i18n:@light-theme%"> - <option v-for="x in themes" :value="x.id" :key="x.id">{{ x.name }}</option> + <optgroup label="%i18n:@light-themes%"> + <option v-for="x in lightThemes" :value="x.id" :key="x.id">{{ x.name }}</option> + </optgroup> + <optgroup label="%i18n:@dark-themes%"> + <option v-for="x in darkThemes" :value="x.id" :key="x.id">{{ x.name }}</option> + </optgroup> </ui-select> </label> <label> <span>%i18n:@dark-theme%</span> <ui-select v-model="dark" placeholder="%i18n:@dark-theme%"> - <option v-for="x in themes" :value="x.id" :key="x.id">{{ x.name }}</option> + <optgroup label="%i18n:@dark-themes%"> + <option v-for="x in darkThemes" :value="x.id" :key="x.id">{{ x.name }}</option> + </optgroup> + <optgroup label="%i18n:@light-themes%"> + <option v-for="x in lightThemes" :value="x.id" :key="x.id">{{ x.name }}</option> + </optgroup> </ui-select> </label> @@ -120,7 +130,15 @@ export default Vue.extend({ computed: { themes(): Theme[] { - return this.$store.state.device.themes.concat(builtinThemes); + return builtinThemes.concat(this.$store.state.device.themes); + }, + + darkThemes(): Theme[] { + return this.themes.filter(t => t.base == 'dark' || t.kind == 'dark'); + }, + + lightThemes(): Theme[] { + return this.themes.filter(t => t.base == 'light' || t.kind == 'light'); }, installedThemes(): Theme[] { diff --git a/src/client/theme/dark.json5 b/src/client/theme/dark.json5 index f993e5ef1f..4fa38a3ae0 100644 --- a/src/client/theme/dark.json5 +++ b/src/client/theme/dark.json5 @@ -4,6 +4,7 @@ name: 'Dark', author: 'syuilo', desc: 'Default dark theme', + kind: 'dark', vars: { primary: '#fb4e4e', diff --git a/src/client/theme/light.json5 b/src/client/theme/light.json5 index db851b66c4..9f17a63dda 100644 --- a/src/client/theme/light.json5 +++ b/src/client/theme/light.json5 @@ -4,6 +4,7 @@ name: 'Light', author: 'syuilo', desc: 'Default light theme', + kind: 'light', vars: { primary: '#fb4e4e', From a70ced8e90dfdff9744bc3ce674d3bb2afa83ab2 Mon Sep 17 00:00:00 2001 From: syuilo <syuilotan@yahoo.co.jp> Date: Mon, 8 Oct 2018 15:23:20 +0900 Subject: [PATCH 538/539] Add new theme --- src/client/app/theme.ts | 2 ++ src/client/theme/black.json5 | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 src/client/theme/black.json5 diff --git a/src/client/app/theme.ts b/src/client/app/theme.ts index 828ce33862..9c5be74fa1 100644 --- a/src/client/app/theme.ts +++ b/src/client/app/theme.ts @@ -13,12 +13,14 @@ export type Theme = { export const lightTheme: Theme = require('../theme/light.json5'); export const darkTheme: Theme = require('../theme/dark.json5'); export const pinkTheme: Theme = require('../theme/pink.json5'); +export const blackTheme: Theme = require('../theme/black.json5'); export const halloweenTheme: Theme = require('../theme/halloween.json5'); export const builtinThemes = [ lightTheme, darkTheme, pinkTheme, + blackTheme, halloweenTheme ]; diff --git a/src/client/theme/black.json5 b/src/client/theme/black.json5 new file mode 100644 index 0000000000..91a812f88a --- /dev/null +++ b/src/client/theme/black.json5 @@ -0,0 +1,20 @@ +{ + id: 'bb5a8287-a072-4b0a-8ae5-ea2a0d33f4f2', + + name: 'Future', + author: 'syuilo', + + base: 'dark', + + vars: { + primary: 'rgb(94, 158, 185)', + secondary: 'rgb(22, 24, 30)', + text: 'rgb(214, 218, 224)', + }, + + props: { + renoteGradient: '#0a2d3c', + renoteText: '$primary', + quoteBorder: '$primary', + }, +} From c6239c8ad9a6d08e466f9713772f85e55de3aab3 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Mon, 8 Oct 2018 15:36:33 +0900 Subject: [PATCH 539/539] fix(package): update @types/mongodb to version 3.1.10 (#2849) Closes #2752 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9a552e943e..63ab3854f5 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "@types/minio": "7.0.0", "@types/mkdirp": "0.5.2", "@types/mocha": "5.2.3", - "@types/mongodb": "3.1.7", + "@types/mongodb": "3.1.10", "@types/ms": "0.7.30", "@types/node": "10.11.4", "@types/portscanner": "2.1.0",