Skip to content

Scala 2.12 support #1381

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 32 commits into from
Feb 18, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
825b2f9
Experiment of blocking-slick
takezoe Aug 12, 2016
bfbf901
Replace returning with returningId which is provided by blocking-slick
takezoe Aug 12, 2016
4f78a36
Fix for date columns
takezoe Aug 12, 2016
7764118
Fix all compilation error and it works!
takezoe Aug 12, 2016
89dfaee
Turn to use returning instead of returningId
takezoe Aug 12, 2016
7937944
Move dataColumnType import statement to the top
takezoe Aug 13, 2016
161e6dc
Use Slick2 compatible API
takezoe Aug 13, 2016
4eba707
Use Rep[U].run method
takezoe Aug 13, 2016
4bef6a4
Remove unused code
takezoe Aug 13, 2016
e612991
Remove unused code
takezoe Aug 13, 2016
6370a72
Fix test case
takezoe Aug 13, 2016
f4a489f
Bump blocking-slick to 0.0.2
takezoe Aug 13, 2016
c2538e7
Fix runtime error in issue sorting
takezoe Aug 13, 2016
2b5f74b
Fix test case
takezoe Aug 13, 2016
34bcc85
Revert to Rep[U].run
takezoe Aug 14, 2016
5a94125
Merge branch 'master' into slick-3.1-blocking
takezoe Sep 10, 2016
47a5535
(refs #1346) Update libraries for Scala 2.12
takezoe Nov 11, 2016
7fa921e
Merge branch 'master' into slick-3.1-blocking
takezoe Nov 11, 2016
5698692
Merge branch 'slick-3.1-blocking'
takezoe Dec 14, 2016
1d03e83
(refs #1346)Update to use blocking-slick for Scala 2.12 support
takezoe Dec 14, 2016
e93e32b
(refs #1346)Update libraries
takezoe Dec 27, 2016
1e3bd9e
(refs #1346)Fix warnings
takezoe Dec 27, 2016
892f2d5
(refs #1346)Fix tests
takezoe Dec 27, 2016
cad4d76
Merge branch 'master'
takezoe Dec 27, 2016
e72a192
Merge branch 'master'
takezoe Feb 6, 2017
202f56b
Bump blocking-slick
takezoe Feb 6, 2017
afad27e
Bump to blocking-slick 0.0.6
takezoe Feb 7, 2017
e8888ac
Fix import statements
takezoe Feb 8, 2017
7d9f308
Cleaned up code around webhook
takezoe Feb 8, 2017
7a6a247
Fix issues sorting
takezoe Feb 9, 2017
79d41ba
Bump blocking-slick
takezoe Feb 12, 2017
ea4414f
Bump blocking-slick to 0.0.7
takezoe Feb 12, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 39 additions & 38 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
val Organization = "io.github.gitbucket"
val Name = "gitbucket"
val GitBucketVersion = "4.9.0"
val ScalatraVersion = "2.4.1"
val ScalatraVersion = "2.5.0"
val JettyVersion = "9.3.9.v20160517"

lazy val root = (project in file(".")).enablePlugins(SbtTwirl, JettyPlugin)
Expand All @@ -10,7 +10,7 @@ sourcesInBase := false
organization := Organization
name := Name
version := GitBucketVersion
scalaVersion := "2.11.8"
scalaVersion := "2.12.0"

// dependency settings
resolvers ++= Seq(
Expand All @@ -21,45 +21,46 @@ resolvers ++= Seq(
"amateras-snapshot" at "http://amateras.sourceforge.jp/mvn-snapshot/"
)
libraryDependencies ++= Seq(
"org.scala-lang.modules" %% "scala-java8-compat" % "0.7.0",
"org.eclipse.jgit" % "org.eclipse.jgit.http.server" % "4.6.0.201612231935-r",
"org.eclipse.jgit" % "org.eclipse.jgit.archive" % "4.6.0.201612231935-r",
"org.scalatra" %% "scalatra" % ScalatraVersion,
"org.scalatra" %% "scalatra-json" % ScalatraVersion,
"org.json4s" %% "json4s-jackson" % "3.3.0",
"io.github.gitbucket" %% "scalatra-forms" % "1.0.0",
"commons-io" % "commons-io" % "2.4",
"io.github.gitbucket" % "solidbase" % "1.0.0",
"io.github.gitbucket" % "markedj" % "1.0.9",
"org.apache.commons" % "commons-compress" % "1.11",
"org.apache.commons" % "commons-email" % "1.4",
"org.apache.httpcomponents" % "httpclient" % "4.5.1",
"org.apache.sshd" % "apache-sshd" % "1.2.0",
"org.apache.tika" % "tika-core" % "1.13",
"com.typesafe.slick" %% "slick" % "2.1.0",
"com.novell.ldap" % "jldap" % "2009-10-07",
"com.h2database" % "h2" % "1.4.192",
"mysql" % "mysql-connector-java" % "5.1.39",
"org.postgresql" % "postgresql" % "9.4.1208",
"ch.qos.logback" % "logback-classic" % "1.1.7",
"com.zaxxer" % "HikariCP" % "2.4.6",
"com.typesafe" % "config" % "1.3.0",
"com.typesafe.akka" %% "akka-actor" % "2.3.15",
"fr.brouillard.oss.security.xhub" % "xhub4j-core" % "1.0.0",
"com.github.bkromhout" % "java-diff-utils" % "2.1.1",
"org.cache2k" % "cache2k-all" % "1.0.0.CR1",
"com.enragedginger" %% "akka-quartz-scheduler" % "1.4.0-akka-2.3.x" exclude("c3p0","c3p0"),
"net.coobird" % "thumbnailator" % "0.4.8",
"org.eclipse.jetty" % "jetty-webapp" % JettyVersion % "provided",
"javax.servlet" % "javax.servlet-api" % "3.1.0" % "provided",
"junit" % "junit" % "4.12" % "test",
"org.scalatra" %% "scalatra-scalatest" % ScalatraVersion % "test",
"com.wix" % "wix-embedded-mysql" % "2.1.4" % "test",
"ru.yandex.qatools.embed" % "postgresql-embedded" % "1.14" % "test"
"org.scala-lang.modules" %% "scala-java8-compat" % "0.8.0",
"org.eclipse.jgit" % "org.eclipse.jgit.http.server" % "4.6.0.201612231935-r",
"org.eclipse.jgit" % "org.eclipse.jgit.archive" % "4.6.0.201612231935-r",
"org.scalatra" %% "scalatra" % ScalatraVersion,
"org.scalatra" %% "scalatra-json" % ScalatraVersion,
"org.json4s" %% "json4s-jackson" % "3.5.0",
"io.github.gitbucket" %% "scalatra-forms" % "1.1.0",
"commons-io" % "commons-io" % "2.4",
"io.github.gitbucket" % "solidbase" % "1.0.0",
"io.github.gitbucket" % "markedj" % "1.0.9",
"org.apache.commons" % "commons-compress" % "1.11",
"org.apache.commons" % "commons-email" % "1.4",
"org.apache.httpcomponents" % "httpclient" % "4.5.1",
"org.apache.sshd" % "apache-sshd" % "1.2.0",
"org.apache.tika" % "tika-core" % "1.13",
"com.github.takezoe" %% "blocking-slick-32" % "0.0.7",
"joda-time" % "joda-time" % "2.9.6",
"com.novell.ldap" % "jldap" % "2009-10-07",
"com.h2database" % "h2" % "1.4.192",
"mysql" % "mysql-connector-java" % "5.1.39",
"org.postgresql" % "postgresql" % "9.4.1208",
"ch.qos.logback" % "logback-classic" % "1.1.7",
"com.zaxxer" % "HikariCP" % "2.4.6",
"com.typesafe" % "config" % "1.3.0",
"com.typesafe.akka" %% "akka-actor" % "2.4.12",
"fr.brouillard.oss.security.xhub" % "xhub4j-core" % "1.0.0",
"com.github.bkromhout" % "java-diff-utils" % "2.1.1",
"org.cache2k" % "cache2k-all" % "1.0.0.CR1",
"com.enragedginger" %% "akka-quartz-scheduler" % "1.6.0-akka-2.4.x" exclude("c3p0","c3p0"),
"net.coobird" % "thumbnailator" % "0.4.8",
"org.eclipse.jetty" % "jetty-webapp" % JettyVersion % "provided",
"javax.servlet" % "javax.servlet-api" % "3.1.0" % "provided",
"junit" % "junit" % "4.12" % "test",
"org.scalatra" %% "scalatra-scalatest" % ScalatraVersion % "test",
"com.wix" % "wix-embedded-mysql" % "2.1.4" % "test",
"ru.yandex.qatools.embed" % "postgresql-embedded" % "1.14" % "test"
)

// Compiler settings
scalacOptions := Seq("-deprecation", "-language:postfixOps", "-Ybackend:GenBCode", "-Ydelambdafy:method", "-target:jvm-1.8")
scalacOptions := Seq("-deprecation", "-language:postfixOps", "-Ydelambdafy:method", "-target:jvm-1.8")
javacOptions in compile ++= Seq("-target", "8", "-source", "8")
javaOptions in Jetty += "-Dlogback.configurationFile=/logback-dev.xml"

Expand Down
2 changes: 1 addition & 1 deletion project/build.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
sbt.version=0.13.12
sbt.version=0.13.13
6 changes: 3 additions & 3 deletions project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
scalacOptions ++= Seq("-unchecked", "-deprecation", "-feature")

addSbtPlugin("com.typesafe.sbt" % "sbt-twirl" % "1.0.4")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")
addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "2.1.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-twirl" % "1.3.0")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.3")
addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "2.1.1")
addSbtPlugin("fi.gekkio.sbtplugins" % "sbt-jrebel-plugin" % "0.10.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-pgp" % "0.8.3")
addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.0.0-M15")
3 changes: 2 additions & 1 deletion src/main/scala/gitbucket/core/model/AccessToken.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ package gitbucket.core.model


trait AccessTokenComponent { self: Profile =>
import profile.simple._
import profile.api._

lazy val AccessTokens = TableQuery[AccessTokens]

class AccessTokens(tag: Tag) extends Table[AccessToken](tag, "ACCESS_TOKEN") {
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/gitbucket/core/model/Account.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package gitbucket.core.model

trait AccountComponent { self: Profile =>
import profile.simple._
import profile.api._
import self._

lazy val Accounts = TableQuery[Accounts]
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/gitbucket/core/model/Activity.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package gitbucket.core.model

trait ActivityComponent extends TemplateComponent { self: Profile =>
import profile.simple._
import profile.api._
import self._

lazy val Activities = TableQuery[Activities]
Expand Down
14 changes: 7 additions & 7 deletions src/main/scala/gitbucket/core/model/BasicTemplate.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package gitbucket.core.model

protected[model] trait TemplateComponent { self: Profile =>
import profile.simple._
import profile.api._

trait BasicTemplate { self: Table[_] =>
val userName = column[String]("USER_NAME")
Expand All @@ -10,7 +10,7 @@ protected[model] trait TemplateComponent { self: Profile =>
def byRepository(owner: String, repository: String) =
(userName === owner.bind) && (repositoryName === repository.bind)

def byRepository(userName: Column[String], repositoryName: Column[String]) =
def byRepository(userName: Rep[String], repositoryName: Rep[String]) =
(this.userName === userName) && (this.repositoryName === repositoryName)
}

Expand All @@ -20,7 +20,7 @@ protected[model] trait TemplateComponent { self: Profile =>
def byIssue(owner: String, repository: String, issueId: Int) =
byRepository(owner, repository) && (this.issueId === issueId.bind)

def byIssue(userName: Column[String], repositoryName: Column[String], issueId: Column[Int]) =
def byIssue(userName: Rep[String], repositoryName: Rep[String], issueId: Rep[Int]) =
byRepository(userName, repositoryName) && (this.issueId === issueId)
}

Expand All @@ -31,7 +31,7 @@ protected[model] trait TemplateComponent { self: Profile =>
def byLabel(owner: String, repository: String, labelId: Int) =
byRepository(owner, repository) && (this.labelId === labelId.bind)

def byLabel(userName: Column[String], repositoryName: Column[String], labelId: Column[Int]) =
def byLabel(userName: Rep[String], repositoryName: Rep[String], labelId: Rep[Int]) =
byRepository(userName, repositoryName) && (this.labelId === labelId)

def byLabel(owner: String, repository: String, labelName: String) =
Expand All @@ -44,7 +44,7 @@ protected[model] trait TemplateComponent { self: Profile =>
def byMilestone(owner: String, repository: String, milestoneId: Int) =
byRepository(owner, repository) && (this.milestoneId === milestoneId.bind)

def byMilestone(userName: Column[String], repositoryName: Column[String], milestoneId: Column[Int]) =
def byMilestone(userName: Rep[String], repositoryName: Rep[String], milestoneId: Rep[Int]) =
byRepository(userName, repositoryName) && (this.milestoneId === milestoneId)
}

Expand All @@ -54,13 +54,13 @@ protected[model] trait TemplateComponent { self: Profile =>
def byCommit(owner: String, repository: String, commitId: String) =
byRepository(owner, repository) && (this.commitId === commitId)

def byCommit(owner: Column[String], repository: Column[String], commitId: Column[String]) =
def byCommit(owner: Rep[String], repository: Rep[String], commitId: Rep[String]) =
byRepository(userName, repositoryName) && (this.commitId === commitId)
}

trait BranchTemplate extends BasicTemplate{ self: Table[_] =>
val branch = column[String]("BRANCH")
def byBranch(owner: String, repository: String, branchName: String) = byRepository(owner, repository) && (branch === branchName.bind)
def byBranch(owner: Column[String], repository: Column[String], branchName: Column[String]) = byRepository(owner, repository) && (this.branch === branchName)
def byBranch(owner: Rep[String], repository: Rep[String], branchName: Rep[String]) = byRepository(owner, repository) && (this.branch === branchName)
}
}
4 changes: 2 additions & 2 deletions src/main/scala/gitbucket/core/model/Collaborator.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package gitbucket.core.model

trait CollaboratorComponent extends TemplateComponent { self: Profile =>
import profile.simple._
import profile.api._

lazy val Collaborators = TableQuery[Collaborators]

Expand Down Expand Up @@ -37,4 +37,4 @@ object Role {
//
// def valueOf(name: String): Option[Permission] = map.get(name)

}
}
12 changes: 4 additions & 8 deletions src/main/scala/gitbucket/core/model/Comment.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,10 @@ trait Comment {
}

trait IssueCommentComponent extends TemplateComponent { self: Profile =>
import profile.simple._
import profile.api._
import self._

lazy val IssueComments = new TableQuery(tag => new IssueComments(tag)){
def autoInc = this returning this.map(_.commentId)
}
lazy val IssueComments = TableQuery[IssueComments]

class IssueComments(tag: Tag) extends Table[IssueComment](tag, "ISSUE_COMMENT") with IssueTemplate {
val commentId = column[Int]("COMMENT_ID", O AutoInc)
Expand Down Expand Up @@ -39,12 +37,10 @@ case class IssueComment (
) extends Comment

trait CommitCommentComponent extends TemplateComponent { self: Profile =>
import profile.simple._
import profile.api._
import self._

lazy val CommitComments = new TableQuery(tag => new CommitComments(tag)){
def autoInc = this returning this.map(_.commentId)
}
lazy val CommitComments = TableQuery[CommitComments]

class CommitComments(tag: Tag) extends Table[CommitComment](tag, "COMMIT_COMMENT") with CommitTemplate {
val commentId = column[Int]("COMMENT_ID", O AutoInc)
Expand Down
6 changes: 1 addition & 5 deletions src/main/scala/gitbucket/core/model/CommitStatus.scala
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package gitbucket.core.model

import scala.slick.jdbc._

trait CommitStatusComponent extends TemplateComponent { self: Profile =>
import profile.simple._
import profile.api._
import self._

implicit val commitStateColumnType = MappedColumnType.base[CommitState, String](b => b.name , i => CommitState(i))
Expand Down Expand Up @@ -89,7 +87,5 @@ object CommitState {
}
}

implicit val getResult: GetResult[CommitState] = GetResult(r => CommitState(r.<<))
implicit val getResultOpt: GetResult[Option[CommitState]] = GetResult(r => r.<<?[String].map(CommitState(_)))
}

2 changes: 1 addition & 1 deletion src/main/scala/gitbucket/core/model/GroupMembers.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package gitbucket.core.model

trait GroupMemberComponent { self: Profile =>
import profile.simple._
import profile.api._

lazy val GroupMembers = TableQuery[GroupMembers]

Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/gitbucket/core/model/Issue.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package gitbucket.core.model

trait IssueComponent extends TemplateComponent { self: Profile =>
import profile.simple._
import profile.api._
import self._

lazy val IssueId = TableQuery[IssueId]
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/gitbucket/core/model/IssueLabels.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package gitbucket.core.model

trait IssueLabelComponent extends TemplateComponent { self: Profile =>
import profile.simple._
import profile.api._

lazy val IssueLabels = TableQuery[IssueLabels]

Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/gitbucket/core/model/Labels.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package gitbucket.core.model

trait LabelComponent extends TemplateComponent { self: Profile =>
import profile.simple._
import profile.api._

lazy val Labels = TableQuery[Labels]

Expand All @@ -12,7 +12,7 @@ trait LabelComponent extends TemplateComponent { self: Profile =>
def * = (userName, repositoryName, labelId, labelName, color) <> (Label.tupled, Label.unapply)

def byPrimaryKey(owner: String, repository: String, labelId: Int) = byLabel(owner, repository, labelId)
def byPrimaryKey(userName: Column[String], repositoryName: Column[String], labelId: Column[Int]) = byLabel(userName, repositoryName, labelId)
def byPrimaryKey(userName: Rep[String], repositoryName: Rep[String], labelId: Rep[Int]) = byLabel(userName, repositoryName, labelId)
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/gitbucket/core/model/Milestone.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package gitbucket.core.model

trait MilestoneComponent extends TemplateComponent { self: Profile =>
import profile.simple._
import profile.api._
import self._

lazy val Milestones = TableQuery[Milestones]
Expand All @@ -15,7 +15,7 @@ trait MilestoneComponent extends TemplateComponent { self: Profile =>
def * = (userName, repositoryName, milestoneId, title, description.?, dueDate.?, closedDate.?) <> (Milestone.tupled, Milestone.unapply)

def byPrimaryKey(owner: String, repository: String, milestoneId: Int) = byMilestone(owner, repository, milestoneId)
def byPrimaryKey(userName: Column[String], repositoryName: Column[String], milestoneId: Column[Int]) = byMilestone(userName, repositoryName, milestoneId)
def byPrimaryKey(userName: Rep[String], repositoryName: Rep[String], milestoneId: Rep[Int]) = byMilestone(userName, repositoryName, milestoneId)
}
}

Expand Down
9 changes: 5 additions & 4 deletions src/main/scala/gitbucket/core/model/Profile.scala
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package gitbucket.core.model

import gitbucket.core.util.DatabaseConfig
import com.github.takezoe.slick.blocking.BlockingJdbcProfile

trait Profile {
val profile: slick.driver.JdbcProfile
import profile.simple._
val profile: BlockingJdbcProfile
import profile.blockingApi._

/**
* java.util.Date Mapped Column Types
Expand All @@ -17,8 +18,8 @@ trait Profile {
/**
* Extends Column to add conditional condition
*/
implicit class RichColumn(c1: Column[Boolean]){
def &&(c2: => Column[Boolean], guard: => Boolean): Column[Boolean] = if(guard) c1 && c2 else c1
implicit class RichColumn(c1: Rep[Boolean]){
def &&(c2: => Rep[Boolean], guard: => Boolean): Rep[Boolean] = if(guard) c1 && c2 else c1
}

/**
Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/gitbucket/core/model/ProtectedBranch.scala
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package gitbucket.core.model

trait ProtectedBranchComponent extends TemplateComponent { self: Profile =>
import profile.simple._
import profile.api._
import self._

lazy val ProtectedBranches = TableQuery[ProtectedBranches]
class ProtectedBranches(tag: Tag) extends Table[ProtectedBranch](tag, "PROTECTED_BRANCH") with BranchTemplate {
val statusCheckAdmin = column[Boolean]("STATUS_CHECK_ADMIN")
def * = (userName, repositoryName, branch, statusCheckAdmin) <> (ProtectedBranch.tupled, ProtectedBranch.unapply)
def byPrimaryKey(userName: String, repositoryName: String, branch: String) = byBranch(userName, repositoryName, branch)
def byPrimaryKey(userName: Column[String], repositoryName: Column[String], branch: Column[String]) = byBranch(userName, repositoryName, branch)
def byPrimaryKey(userName: Rep[String], repositoryName: Rep[String], branch: Rep[String]) = byBranch(userName, repositoryName, branch)
}

lazy val ProtectedBranchContexts = TableQuery[ProtectedBranchContexts]
Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/gitbucket/core/model/PullRequest.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package gitbucket.core.model

trait PullRequestComponent extends TemplateComponent { self: Profile =>
import profile.simple._
import profile.api._

lazy val PullRequests = TableQuery[PullRequests]

Expand All @@ -15,7 +15,7 @@ trait PullRequestComponent extends TemplateComponent { self: Profile =>
def * = (userName, repositoryName, issueId, branch, requestUserName, requestRepositoryName, requestBranch, commitIdFrom, commitIdTo) <> (PullRequest.tupled, PullRequest.unapply)

def byPrimaryKey(userName: String, repositoryName: String, issueId: Int) = byIssue(userName, repositoryName, issueId)
def byPrimaryKey(userName: Column[String], repositoryName: Column[String], issueId: Column[Int]) = byIssue(userName, repositoryName, issueId)
def byPrimaryKey(userName: Rep[String], repositoryName: Rep[String], issueId: Rep[Int]) = byIssue(userName, repositoryName, issueId)
}
}

Expand Down
Loading