Bugfixes
This commit is contained in:
parent
efbe340c09
commit
829be1817f
2
Makefile
2
Makefile
@ -13,7 +13,7 @@ ghdist:
|
|||||||
cd dist && git checkout gh-pages
|
cd dist && git checkout gh-pages
|
||||||
|
|
||||||
publish:
|
publish:
|
||||||
./node_modules/gulp/bin/gulp.js build
|
./node_modules/gulp/bin/gulp.js publish
|
||||||
echo -n "Please open http://localhost:8000/dist/index.html and check if everything works fine." && read -e
|
echo -n "Please open http://localhost:8000/dist/index.html and check if everything works fine." && read -e
|
||||||
./node_modules/gulp/bin/gulp.js deploy
|
./node_modules/gulp/bin/gulp.js deploy
|
||||||
|
|
||||||
|
@ -5,8 +5,7 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||||
<title>Telegram Web</title>
|
<title>Telegram Web</title>
|
||||||
|
|
||||||
<!-- build:css css/app.css -->
|
<!-- build:css css/badbrowser.css -->
|
||||||
<link rel="stylesheet" href="vendor/angular/angular-csp.css"/>
|
|
||||||
<link rel="stylesheet" href="vendor/bootstrap/css/bootstrap.css"/>
|
<link rel="stylesheet" href="vendor/bootstrap/css/bootstrap.css"/>
|
||||||
<link rel="stylesheet" href="css/app.css"/>
|
<link rel="stylesheet" href="css/app.css"/>
|
||||||
<!-- endbuild -->
|
<!-- endbuild -->
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="en" manifest="webogram.appcache" ng-csp="" xmlns:ng="http://angularjs.org" id="ng-app">
|
<html lang="en" manifest="webogram.appcache" ng-csp="" xmlns:ng="http://angularjs.org" id="ng-app" style="display: none;">
|
||||||
<head>
|
<head>
|
||||||
<!--[if lte IE 9]>
|
<!--[if lte IE 9]>
|
||||||
<meta HTTP-EQUIV="REFRESH" content="0; url=badbrowser.html">
|
<meta HTTP-EQUIV="REFRESH" content="0; url=badbrowser.html">
|
||||||
@ -17,12 +17,6 @@
|
|||||||
|
|
||||||
<link rel="manifest" href="manifest.json"/>
|
<link rel="manifest" href="manifest.json"/>
|
||||||
|
|
||||||
<style>
|
|
||||||
html {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<!-- <link rel="stylesheet" href="css/font.css"/> -->
|
<!-- <link rel="stylesheet" href="css/font.css"/> -->
|
||||||
<!-- <link href="https://fonts.googleapis.com/css?family=Open+Sans:400,600&subset=cyrillic,cyrillic-ext,latin,latin-ext" rel="stylesheet" type="text/css"> -->
|
<!-- <link href="https://fonts.googleapis.com/css?family=Open+Sans:400,600&subset=cyrillic,cyrillic-ext,latin,latin-ext" rel="stylesheet" type="text/css"> -->
|
||||||
|
|
||||||
|
@ -501,28 +501,24 @@ angular.module('myApp.directives', ['myApp.filters'])
|
|||||||
.directive('myReplyMessage', function (AppMessagesManager, AppPeersManager, $rootScope) {
|
.directive('myReplyMessage', function (AppMessagesManager, AppPeersManager, $rootScope) {
|
||||||
return {
|
return {
|
||||||
templateUrl: templateUrl('reply_message'),
|
templateUrl: templateUrl('reply_message'),
|
||||||
scope: {
|
scope: {},
|
||||||
'replyMessage': '=myReplyMessage'
|
|
||||||
},
|
|
||||||
link: link
|
link: link
|
||||||
}
|
}
|
||||||
|
|
||||||
function link ($scope, element, attrs) {
|
function link ($scope, element, attrs) {
|
||||||
if (attrs.watch) {
|
if (attrs.watch) {
|
||||||
$scope.$watch('replyMessage', function () {
|
$scope.$parent.$watch(attrs.myReplyMessage, function (mid) {
|
||||||
checkMessage($scope, element)
|
checkMessage($scope, element, mid)
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
checkMessage($scope, element)
|
var mid = $scope.$parent.$eval(attrs.myReplyMessage)
|
||||||
|
checkMessage($scope, element, mid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkMessage ($scope, element) {
|
function checkMessage ($scope, element, mid) {
|
||||||
var message = $scope.replyMessage
|
var message = $scope.replyMessage = AppMessagesManager.wrapSingleMessage(mid)
|
||||||
if (!message.loading) {
|
if (message.loading) {
|
||||||
updateMessage($scope, element)
|
|
||||||
} else {
|
|
||||||
var mid = message.mid
|
|
||||||
var stopWaiting = $scope.$on('messages_downloaded', function (e, mids) {
|
var stopWaiting = $scope.$on('messages_downloaded', function (e, mids) {
|
||||||
if (mids.indexOf(mid) != -1) {
|
if (mids.indexOf(mid) != -1) {
|
||||||
$scope.replyMessage = AppMessagesManager.wrapForDialog(mid)
|
$scope.replyMessage = AppMessagesManager.wrapForDialog(mid)
|
||||||
@ -530,6 +526,8 @@ angular.module('myApp.directives', ['myApp.filters'])
|
|||||||
stopWaiting()
|
stopWaiting()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
} else {
|
||||||
|
updateMessage($scope, element)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -559,18 +557,14 @@ angular.module('myApp.directives', ['myApp.filters'])
|
|||||||
.directive('myPinnedMessage', function (AppMessagesManager, AppPeersManager, $rootScope) {
|
.directive('myPinnedMessage', function (AppMessagesManager, AppPeersManager, $rootScope) {
|
||||||
return {
|
return {
|
||||||
templateUrl: templateUrl('pinned_message'),
|
templateUrl: templateUrl('pinned_message'),
|
||||||
scope: {
|
scope: {},
|
||||||
'pinnedMessage': '=myPinnedMessage'
|
|
||||||
},
|
|
||||||
link: link
|
link: link
|
||||||
}
|
}
|
||||||
|
|
||||||
function link ($scope, element, attrs) {
|
function link ($scope, element, attrs) {
|
||||||
var message = $scope.pinnedMessage
|
var mid = $scope.$parent.$eval(attrs.myPinnedMessage)
|
||||||
if (!message.loading) {
|
var message = $scope.pinnedMessage = AppMessagesManager.wrapSingleMessage(mid)
|
||||||
updateMessage($scope, element)
|
if (message.loading) {
|
||||||
} else {
|
|
||||||
var mid = message.mid
|
|
||||||
var stopWaiting = $scope.$on('messages_downloaded', function (e, mids) {
|
var stopWaiting = $scope.$on('messages_downloaded', function (e, mids) {
|
||||||
if (mids.indexOf(mid) != -1) {
|
if (mids.indexOf(mid) != -1) {
|
||||||
$scope.pinnedMessage = AppMessagesManager.wrapForDialog(mid)
|
$scope.pinnedMessage = AppMessagesManager.wrapForDialog(mid)
|
||||||
@ -578,6 +572,8 @@ angular.module('myApp.directives', ['myApp.filters'])
|
|||||||
stopWaiting()
|
stopWaiting()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
} else {
|
||||||
|
updateMessage($scope, element)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1455,8 +1455,6 @@ angular.module('izhukov.utils', [])
|
|||||||
if (!entities.length) {
|
if (!entities.length) {
|
||||||
newText = newText.trim()
|
newText = newText.trim()
|
||||||
}
|
}
|
||||||
console.warn(dT(), newText, entities);
|
|
||||||
// throw new Error(11);
|
|
||||||
return newText
|
return newText
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1819,8 +1817,6 @@ angular.module('izhukov.utils', [])
|
|||||||
|
|
||||||
code.push(text.substr(lastOffset))
|
code.push(text.substr(lastOffset))
|
||||||
|
|
||||||
console.log(code, entities)
|
|
||||||
|
|
||||||
return code.join('')
|
return code.join('')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
console.log('push worker')
|
console.log('push worker placeholder')
|
||||||
|
@ -213,8 +213,10 @@ angular.module('myApp.services')
|
|||||||
var offsetDate = 0
|
var offsetDate = 0
|
||||||
var offsetID = 0
|
var offsetID = 0
|
||||||
var offsetPeerID = 0
|
var offsetPeerID = 0
|
||||||
|
var offsetIndex = 0
|
||||||
if (dialogsOffsetDate) {
|
if (dialogsOffsetDate) {
|
||||||
offsetDate = dialogsOffsetDate + ServerTimeManager.serverTimeOffset
|
offsetDate = dialogsOffsetDate + ServerTimeManager.serverTimeOffset
|
||||||
|
offsetIndex = dialogsOffsetDate * 0x10000
|
||||||
}
|
}
|
||||||
return MtpApiManager.invokeApi('messages.getDialogs', {
|
return MtpApiManager.invokeApi('messages.getDialogs', {
|
||||||
offset_date: offsetDate,
|
offset_date: offsetDate,
|
||||||
@ -233,8 +235,13 @@ angular.module('myApp.services')
|
|||||||
saveMessages(dialogsResult.messages)
|
saveMessages(dialogsResult.messages)
|
||||||
|
|
||||||
var maxSeenIdIncremented = offsetDate ? true : false
|
var maxSeenIdIncremented = offsetDate ? true : false
|
||||||
|
var hasPrepend = false
|
||||||
angular.forEach(dialogsResult.dialogs, function (dialog) {
|
angular.forEach(dialogsResult.dialogs, function (dialog) {
|
||||||
saveConversation(dialog)
|
saveConversation(dialog)
|
||||||
|
if (offsetIndex && dialog.index > offsetIndex) {
|
||||||
|
newDialogsToHandle[dialog.peerID] = dialog
|
||||||
|
hasPrepend = true
|
||||||
|
}
|
||||||
|
|
||||||
if (!maxSeenIdIncremented &&
|
if (!maxSeenIdIncremented &&
|
||||||
!AppPeersManager.isChannel(AppPeersManager.getPeerID(dialog.peer))) {
|
!AppPeersManager.isChannel(AppPeersManager.getPeerID(dialog.peer))) {
|
||||||
@ -248,6 +255,11 @@ angular.module('myApp.services')
|
|||||||
dialogs.length >= dialogsResult.count) {
|
dialogs.length >= dialogsResult.count) {
|
||||||
allDialogsLoaded = true
|
allDialogsLoaded = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hasPrepend &&
|
||||||
|
!newDialogsHandlePromise) {
|
||||||
|
newDialogsHandlePromise = $timeout(handleNewDialogs, 0)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2143,11 +2155,6 @@ angular.module('myApp.services')
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var replyToMsgID = message.reply_to_mid
|
|
||||||
if (replyToMsgID) {
|
|
||||||
message.reply_to_msg = wrapSingleMessage(replyToMsgID)
|
|
||||||
}
|
|
||||||
|
|
||||||
return messagesForHistory[msgID] = message
|
return messagesForHistory[msgID] = message
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
</span>
|
</span>
|
||||||
|
|
||||||
|
|
||||||
<a class="im_message_reply_wrap" my-reply-message="historyMessage.reply_to_msg" ng-if="::historyMessage.reply_to_mid"></a>
|
<a class="im_message_reply_wrap" my-reply-message="::historyMessage.reply_to_mid" ng-if="::historyMessage.reply_to_mid"></a>
|
||||||
|
|
||||||
<div ng-if="::historyMessage.fwdFromID || false" class="im_message_fwd_from">
|
<div ng-if="::historyMessage.fwdFromID || false" class="im_message_fwd_from">
|
||||||
<span class="copyonly"><span my-i18n="message_forwarded_message"></span>: </span>
|
<span class="copyonly"><span my-i18n="message_forwarded_message"></span>: </span>
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
<span ng-switch-when="messageActionChannelDeletePhoto" my-i18n="message_service_removed_channel_photo"></span>
|
<span ng-switch-when="messageActionChannelDeletePhoto" my-i18n="message_service_removed_channel_photo"></span>
|
||||||
|
|
||||||
<span ng-switch-when="messageActionPinMessage" my-i18n="message_service_pinned_message">
|
<span ng-switch-when="messageActionPinMessage" my-i18n="message_service_pinned_message">
|
||||||
<my-i18n-param name="message"><a class="im_service_message_pinned" my-pinned-message="historyMessage.reply_to_msg"></a></my-i18n-param>
|
<my-i18n-param name="message"><a class="im_service_message_pinned" my-pinned-message="::historyMessage.reply_to_mid"></a></my-i18n-param>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
<a class="im_message_author" my-peer-link="historyMessage.fromID" short="historyMessage.toID > 0" color="historyMessage.toID < 0" no-watch="true"></a>
|
<a class="im_message_author" my-peer-link="historyMessage.fromID" short="historyMessage.toID > 0" color="historyMessage.toID < 0" no-watch="true"></a>
|
||||||
<a ng-if="::historyMessage.viaBotID && !historyMessage.fwdFromID" class="im_message_author_via" my-i18n="message_via_bot" ng-click="selectInlineBot(historyMessage.viaBotID, $event)"><my-i18n-param name="bot"><span class="im_message_fwd_author" my-peer-link="historyMessage.viaBotID" username="true" no-watch="true"></span></my-i18n-param></a>
|
<a ng-if="::historyMessage.viaBotID && !historyMessage.fwdFromID" class="im_message_author_via" my-i18n="message_via_bot" ng-click="selectInlineBot(historyMessage.viaBotID, $event)"><my-i18n-param name="bot"><span class="im_message_fwd_author" my-peer-link="historyMessage.viaBotID" username="true" no-watch="true"></span></my-i18n-param></a>
|
||||||
|
|
||||||
<a class="im_message_reply_wrap" my-reply-message="historyMessage.reply_to_msg" ng-if="::historyMessage.reply_to_mid"></a>
|
<a class="im_message_reply_wrap" my-reply-message="::historyMessage.reply_to_mid" ng-if="::historyMessage.reply_to_mid"></a>
|
||||||
|
|
||||||
<div ng-if="::!!historyMessage.fwdFromID && !historyMessage.media" class="im_message_fwd_header" ng-switch="!!historyMessage.viaBotID" my-i18n>
|
<div ng-if="::!!historyMessage.fwdFromID && !historyMessage.media" class="im_message_fwd_header" ng-switch="!!historyMessage.viaBotID" my-i18n>
|
||||||
<span ng-switch-when="true" my-i18n-format="message_forwarded_via_message_mobile"></span>
|
<span ng-switch-when="true" my-i18n-format="message_forwarded_via_message_mobile"></span>
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
<span ng-switch-when="messageActionChannelDeletePhoto" my-i18n="message_service_removed_channel_photo"></span>
|
<span ng-switch-when="messageActionChannelDeletePhoto" my-i18n="message_service_removed_channel_photo"></span>
|
||||||
|
|
||||||
<span ng-switch-when="messageActionPinMessage" my-i18n="message_service_pinned_message">
|
<span ng-switch-when="messageActionPinMessage" my-i18n="message_service_pinned_message">
|
||||||
<my-i18n-param name="message"><a my-pinned-message="historyMessage.reply_to_msg"></a></my-i18n-param>
|
<my-i18n-param name="message"><a my-pinned-message="historyMessage.reply_to_mid"></a></my-i18n-param>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span ng-switch-default my-i18n="message_service_unsupported_action">
|
<span ng-switch-default my-i18n="message_service_unsupported_action">
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*! nanoScrollerJS - v0.8.4 - 2014
|
/*! nanoScrollerJS - v0.8.4 - 2014
|
||||||
* http://jamesflorentino.github.com/nanoScrollerJS/
|
* http://jamesflorentino.github.com/nanoScrollerJS/
|
||||||
* Copyright (c) 2014 James Florentino; Licensed MIT */
|
* Copyright (c) 2014 James Florentino; Licensed MIT */
|
||||||
(function($, window, document) {
|
;(function($, window, document) {
|
||||||
"use strict";
|
"use strict";
|
||||||
var BROWSER_IS_IE7, BROWSER_SCROLLBAR_WIDTH, DOMSCROLL, DOWN, DRAG, ENTER, KEYDOWN, KEYUP, MOUSEDOWN, MOUSEENTER, MOUSEMOVE, MOUSEUP, MOUSEWHEEL, NanoScroll, PANEDOWN, RESIZE, SCROLL, SCROLLBAR, TOUCHMOVE, UP, WHEEL, cAF, defaults, getBrowserScrollbarWidth, hasTransform, isFFWithBuggyScrollbar, rAF, transform, _elementStyle, _prefixStyle, _vendor;
|
var BROWSER_IS_IE7, BROWSER_SCROLLBAR_WIDTH, DOMSCROLL, DOWN, DRAG, ENTER, KEYDOWN, KEYUP, MOUSEDOWN, MOUSEENTER, MOUSEMOVE, MOUSEUP, MOUSEWHEEL, NanoScroll, PANEDOWN, RESIZE, SCROLL, SCROLLBAR, TOUCHMOVE, UP, WHEEL, cAF, defaults, getBrowserScrollbarWidth, hasTransform, isFFWithBuggyScrollbar, rAF, transform, _elementStyle, _prefixStyle, _vendor;
|
||||||
defaults = {
|
defaults = {
|
||||||
|
36
gulpfile.js
36
gulpfile.js
@ -7,6 +7,8 @@ var http = require('http')
|
|||||||
var st = require('st')
|
var st = require('st')
|
||||||
var del = require('del')
|
var del = require('del')
|
||||||
var runSequence = require('run-sequence')
|
var runSequence = require('run-sequence')
|
||||||
|
var swPrecache = require('sw-precache')
|
||||||
|
|
||||||
|
|
||||||
// The generated file is being created at src
|
// The generated file is being created at src
|
||||||
// so it can be fetched by usemin.
|
// so it can be fetched by usemin.
|
||||||
@ -19,6 +21,19 @@ gulp.task('templates', function () {
|
|||||||
}))
|
}))
|
||||||
.pipe(gulp.dest('app/js'))
|
.pipe(gulp.dest('app/js'))
|
||||||
})
|
})
|
||||||
|
gulp.task('clean-templates', function () {
|
||||||
|
return del(['app/js/templates.js'])
|
||||||
|
})
|
||||||
|
|
||||||
|
gulp.task('usemin-index', function () {
|
||||||
|
return gulp.src('app/index.html')
|
||||||
|
.pipe($.usemin({
|
||||||
|
html: [$.minifyHtml({empty: true})],
|
||||||
|
js: ['concat', $.ngAnnotate()/*, $.uglify({outSourceMap: false})*/],
|
||||||
|
css: ['concat', $.minifyCss({compatibility: true, keepBreaks: true})]
|
||||||
|
}))
|
||||||
|
.pipe(gulp.dest('dist'))
|
||||||
|
})
|
||||||
|
|
||||||
gulp.task('usemin-badbrowser', function() {
|
gulp.task('usemin-badbrowser', function() {
|
||||||
return gulp.src('app/badbrowser.html')
|
return gulp.src('app/badbrowser.html')
|
||||||
@ -29,16 +44,6 @@ gulp.task('usemin-badbrowser', function() {
|
|||||||
.pipe(gulp.dest('dist'));
|
.pipe(gulp.dest('dist'));
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('usemin', function () {
|
|
||||||
return gulp.src('app/index.html')
|
|
||||||
.pipe($.usemin({
|
|
||||||
html: [$.minifyHtml({empty: true})],
|
|
||||||
js: ['concat', $.ngAnnotate(), $.uglify({outSourceMap: false})],
|
|
||||||
css: ['concat', $.minifyCss({compatibility: true, keepBreaks: true})]
|
|
||||||
}))
|
|
||||||
.pipe(gulp.dest('dist'))
|
|
||||||
})
|
|
||||||
|
|
||||||
// ulimit -n 10240 on OS X
|
// ulimit -n 10240 on OS X
|
||||||
gulp.task('imagemin', function () {
|
gulp.task('imagemin', function () {
|
||||||
return gulp.src(['app/img/**/*', '!app/img/screenshot*', '!app/img/*.wav'])
|
return gulp.src(['app/img/**/*', '!app/img/screenshot*', '!app/img/*.wav'])
|
||||||
@ -172,7 +177,8 @@ var fileGlobs = [
|
|||||||
'!dist/*.html',
|
'!dist/*.html',
|
||||||
'!dist/fonts/*',
|
'!dist/fonts/*',
|
||||||
'!dist/img/icons/icon*.png',
|
'!dist/img/icons/icon*.png',
|
||||||
'!dist/js/background.js'
|
'!dist/js/background.js',
|
||||||
|
'!dist/css/badbrowser.css'
|
||||||
]
|
]
|
||||||
|
|
||||||
function writeServiceWorkerFile (rootDir, handleFetch, callback) {
|
function writeServiceWorkerFile (rootDir, handleFetch, callback) {
|
||||||
@ -181,7 +187,8 @@ function writeServiceWorkerFile (rootDir, handleFetch, callback) {
|
|||||||
handleFetch: handleFetch,
|
handleFetch: handleFetch,
|
||||||
logger: $.util.log,
|
logger: $.util.log,
|
||||||
staticFileGlobs: fileGlobs,
|
staticFileGlobs: fileGlobs,
|
||||||
stripPrefix: rootDir + '/',
|
stripPrefix: './' + rootDir + '/',
|
||||||
|
importScripts: ['js/lib/push_worker.js'],
|
||||||
verbose: true
|
verbose: true
|
||||||
}
|
}
|
||||||
swPrecache.write(path.join(rootDir, 'service_worker.js'), config, callback)
|
swPrecache.write(path.join(rootDir, 'service_worker.js'), config, callback)
|
||||||
@ -272,16 +279,17 @@ gulp.task('build', ['clean'], function (callback) {
|
|||||||
runSequence(
|
runSequence(
|
||||||
['less', 'templates'],
|
['less', 'templates'],
|
||||||
'enable-production',
|
'enable-production',
|
||||||
'usemin',
|
'usemin-index',
|
||||||
'usemin-badbrowser',
|
'usemin-badbrowser',
|
||||||
['copy', 'copy-locales', 'copy-images', 'disable-production'],
|
['copy', 'copy-locales', 'copy-images', 'disable-production'],
|
||||||
|
'clean-templates',
|
||||||
callback
|
callback
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
gulp.task('package', ['cleanup-dist'])
|
gulp.task('package', ['cleanup-dist'])
|
||||||
|
|
||||||
gulp.task('offline', ['add-appcache-manifest', 'generate-service-worker'])
|
gulp.task('publish', ['add-appcache-manifest', 'generate-service-worker'])
|
||||||
|
|
||||||
gulp.task('deploy', function () {
|
gulp.task('deploy', function () {
|
||||||
return gulp.src('./dist/**/*')
|
return gulp.src('./dist/**/*')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user