SlideShare a Scribd company logo
1 of 87
Introducción a Scala
   Colombia JUG JavaDay 2012
Contenido

• Introducción
• Estructuras de control
• Programación orientada a objetos
• Programación funcional
Introducción
Mario Arias
@dh44t
http://cobaltolabs.com
http://neuronica.wordpress.com
¿Que es Scala?

Scala (Scalable Language).
Scala es un lenguaje diseñado para la JVM,
que combina los paradigmas de la
programación orientada a objetos con la
programación funcional
¿Quien lo diseño?

Martin Odersky (@odersky) en la EPFL.
TypeSafe es la empresa que desarrolla y da
soporte a Scala y otras tecnologías
relacionadas
Características
•   Orientado a objetos
•   Funcional
•   Escalable
•   Tipeado estático*
•   Extensible
•   Productivo
•   Open Source
http://typesafe.com/technology/scala
Hola Mundo!

object HelloWorld {
    def main(args: Array[String]) {
        println("Hello World")
    }
}
Hola Mundo! (II)

object HelloWorldApp extends App {
    println("Hello World")
}
Hola Mundo! (III)

println("Hello World")
REPL
     Read Evaluation Print Loop

Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_04).

Type in expressions to have them evaluated.

Type :help for more information.




scala>   println("Hello World!")

Hello World!
Estructuras de control
Sentencias y
         Expresiones

• Sentencias son bloques de código que se
  ejecutan
• Expresiones son bloques de código que se
  ejecutan y que retornan un valor
Variables

var i:Int = 1
var name:String = “Bonifacio”
var age:Int = _
Variables (II)

//Inferencia de tipos
var i = 1
var name = “Bonifacio”
var age = _ //Error
Variables (III)
//JavaScript
var i = 1;
i = “Bonifacio”;

//Scala
var i = 1
i = “Bonifacio” //Error
Valores
//Scala
val i:Int = 1
val name:String = “Bonifacio”


//Java
final int i = 1;
final String name = “Bonifacio”;
Valores (II)

//inferencia de tipos
val i = 1
val name = “Bonifacio”
Métodos


def duplicar(i:Int):Int = {
    return i*2
}
Métodos (II)


def duplicar(i:Int) = {
    return i*2
}
Métodos (III)


def duplicar(i:Int) = {
    i*2
}
Métodos (IV)


def duplicar(i:Int) = i*2
Métodos (V)


def imprimir(i:Int):Unit = {
    println(i*2)
}
Métodos (V)


def imprimir(i:Int){
    println(i*2)
}
Invocación
duplicar(1)
duplicar{1}
duplicar{
    val i = 5
    val j = i - 3
    j * i
}
Invocación (II)
multiplicar(2, 3)
multiplicar{2, 3}// Error
toString()
toString
if

if (1 > 2) {
    println("Uno es mayor a dos")
} else {
    println("Dos es mayor a uno")
}
if (II)
val resultado:String = if (1 > 2) {
    "Uno es mayor a dos"
} else {
    "Dos es mayor a uno"
}
println(resultado)
match

def desc(i: Int): String = i match {
    case 1 => "Uno"
    case 2 => "Dos"
    case _ => "Otro"
}
match (II)

def desc2(n: String): Int = n match {
    case "Uno" => 1
    case "Dos" => 2
    case _ => -1
}
match (III)

def desc3(i: Int): String = i match {
    case 1 => "Uno"
    case 2 => "Dos"
    case z => z + " ?"
}
match (IV)
def desc4(i: Int): String = i match {
    case 1 => "Uno"
    case 2 => "Dos"
    case z if z % 2 == 0 => "Par"
    case _ => "Impar"
}
match (V)

def desc5(a: Any): String = a match {
    case i: Int => desc4(i)
    case i: String => i
    case i => i.toString
}
while

var i = 0
while (i < 5) {
    println("i = " + i)
    i += 1
}
do while

var i = 0
do {
  println("i = " + i)
   i += 1
} while (i < 5)
for
for (i <- 0 to 9) {
    println("i = " + i)
}


for (i <- 0 until 9) {
    println("i = " + i)
}
for (II)

val langs = Array("Java", "Scala", "Python", "Groovy")

for (lang <- langs) {

    println("lang = " + lang)

}
for (III)

for (lang <- langs if lang.size > 4) {
    println("lang = " + lang)
}
for (IV)
for {
    lang <- langs
      if lang.size > 4
      upper = lang.toUpperCase
} {
      println("lang = " + lang)
      println("upper = " + upper)
}
for yield

val upperLanguages =
  for (lang <- langs)
  yield lang.toUpperCase
try catch

try{
//operaciones peligrosas
} catch{
    case e:NumberFormatException => //
    case e:Exception => //
}
Programación orientada
      a objetos
¿Java es un lenguaje
orientado a objetos
       puro?
NO
¿Que es un lenguaje
  orientado a objetos
         puro?

• Todo es un objeto
• Todas las operaciones son métodos de
  dichos objetos
¿Por qué Java no lo es?

• Primitivos
• Miembros estáticos
• Operaciones matemáticas
• y otras operaciones
Primitivos
 Java      Scala
  byte     Byte
 short     Short
   int      Int
  long     Long
  char     Char
 float      Float
double    Double
boolean   Boolean
Miembros Estaticos
//Java

public class Helper{

    public static void metodo(){}

}




//Scala

object Helper{

    def metodo(){}

}
Operaciones
       matemáticas


val i = 2 + 3
val j = 2.+(3)
instanceof
//Java
if(i instanceof String) {//}




//Scala
if(i.isInstanceOf[String]){//}
cast
//Java
(String)x
((String)x).toUpperCase()



//Scala
x.asInstanceOf[String]
x.asInstanceOf[String].toUpperCase
clases

class Perro{
    var nombre:String = _
    def hablar(){
        println(nombre + “ dice: Gua”)
    }
}
modificadores de
    alcance
    Java             Scala
   public        “por defecto”
 protected         protected
   private          private
“por defecto”   private[paquete]
    N.D.          private[this]
constructor


class Perro(val nombre:String) {

    println("Acaba de nacer el perrito " + nombre)

}
constructor (II)


class Perro(val nombre:String) {

    println("Acaba de nacer el perrito " + nombre)

    def this() = this(“Sin nombre”)

}
trait
trait Cuadrupedo{

    def caminar()

}

class Perro extends Cuadrupedo {

    def caminar(){

        println(“Caminando...”)

    }

}
trait (II)

trait Cuadrupedo{

    def caminar(){

        println(“Caminando...”)

    }

}

class Perro extends Cuadrupedo {

}
trait (III)

class Perro extends Cuadrupedo with Mamifero {

}

class Gato extends Cuadrupedo with Mamifero {

}

class Tortuga extends Cuadrupedo with Reptil {

}
trait (IV)

trait UserServiceAware{

    @Inject var userService:UserService = _

}



class UserController extends UserServiceAware{}

class UserEndPoint extends UserServiceAware{}
trait (V)

val robot = new Robot with Cuadrupedo
robot.caminar()
duck typing


Si camina como pato y nada como pato es un pato
duck typing (II)
#Python

class Perro:

    def hablar(self):

          print "Gua"



class Persona:

    def hablar(self):

          print "Hola"
duck typing (III)
#Python
def hacer_hablar(hablador):
    hablador.hablar()


hacer_hablar(Perro())
hacer_hablar(Persona())
hacer_hablar(1) #Error de ejecución
Tipos estructurales
class Perro{
    def hablar(){println(“Guau”)}
}


class Persona{
    def hablar(){println(“Hola”)}
}
Tipos estructurales(II)

 def hacerHablar(hablador:{def hablar()}){

     hablador.hablar()

 }

 hacerHablar(new Perro)

 hacerHablar(new Persona)

 hacerhablar(1) //Error de compilación
Tipos estructurales(III)


def isHablarDefinido(x:Any):Boolean = {

    x.isInstanceOf[{def hablar()}]

}
apply
val langs = Array("Java", "Scala", "Python", "Groovy")

langs(0)

langs.apply(0)
Genéricos

trait Listener[T]{
    def action(event:T)
}
Genéricos (II)

trait Listener[T <: MiClase]{
    def action(event:T)
}
Funciones implícitas

 Funciones implícitas son funciones que usan para
convertir de un tipo a otro en forma transparente
Funciones implícitas (II)


println("Desde el segundo JavaDay".andTheMusic())
Funciones implícitas (III)

class CarolinaCruzLike(val s: String) {
    def andTheMusic(): String = {
        s + " and the music"
    }
}
Funciones implícitas (IV)


implicit def stringToCaroCruz(s: String) = {

    new CarolinaCruzLike(s)

}
Funciones implícitas (V)

println("Desde el segundo JavaDay".andTheMusic())



println{

    stringToCaroCruz("Desde el segundo JavaDay")

    .andTheMusic()

}
Programación Funcional
¿Que es?
Programación funcional es un paradigma de
programación que trata todo operación como una
evaluación de una función aritmética y tiene sus raíces
en el calculo lambda
Función
val duplicar = {i: Int => i * 2}


val duplicar: (Int) => Int =
{i => i * 2}


duplicar(2)
Composición
val duplicar = {i: Int => i * 2}
val mas5 = {i: Int => i + 5}
val duplicarMas5 = duplicar andThen mas5
duplicarMas5(2)
val mas5duplicar = duplicar compose mas5
mas5duplicar(2)
Colecciones

val numeros = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)

numeros.foreach((i: Int) => {

 println("i = " + i)

})

numeros.foreach(i => println("i = " + i))
Colecciones (II)

//Java

List<String> langs = Arrays.asList("Java", "Scala", "Python", "Groovy");

List<String> upperLangs = new ArrayList<String>();

for (String lang : langs) {

    upperLangs.add(lang.toUpperCase());

}
Colecciones (III)


val langs = List("Java", "Scala", "Python", "Groovy")

val upperLangs = langs.map(lang => lang.toUpperCase)
Colecciones (IV)
Método               Descripción

            Ejecuta una función en todos los
foreach
                       elementos
              Colección nueva aplicando una
  map
               función a todos los elementos
              Colección nueva con todos los
 filter     elementos que cumplen una función
                       T => Boolean
              Colección nueva con todos los
filterNot      elementos que no cumplen una
                   función T => Boolean
Colecciones (V)
Método              Descripción


            Valida que todos los elementos
 forall
          cumplen una función T => Boolean

           Valida que al menos un elemento
 exists
           cumpla una función T => Boolean

          Retorna cuantos elementos cumplen
 count
               una función T => Boolean
Función como
                parámetro
def operar(f: (Int, Int) => Int): Int = {
    f(5, 8)
}


operar((a, b) => {a + b})
operar((a, b) => {a * b})
Bloque como
                 parámetro
def cronometrar(block: => Unit) {

    val start = System.currentTimeMillis()

    block

    println(System.currentTimeMillis() - start)

}



cronometrar{

    unMetodoMuyDemorado()

}
¿Como quedaron?


       or

More Related Content

What's hot

Programar java
Programar javaProgramar java
Programar javavloor
 
Progav tema2
Progav tema2Progav tema2
Progav tema2ESAP
 
Programar java
Programar javaProgramar java
Programar javavloor
 
1 Introducción a los Lenguajes de Programación y a la Programación Orientada ...
1 Introducción a los Lenguajes de Programación y a la Programación Orientada ...1 Introducción a los Lenguajes de Programación y a la Programación Orientada ...
1 Introducción a los Lenguajes de Programación y a la Programación Orientada ...Jose Emilio Labra Gayo
 
Java 8 introducción a expresiones lambdas y api stream
Java 8  introducción a expresiones lambdas y api streamJava 8  introducción a expresiones lambdas y api stream
Java 8 introducción a expresiones lambdas y api streamEudris Cabrera
 
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez.NET UY Meetup
 
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...Eudris Cabrera
 
02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcional02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcionalJuan Rodríguez
 
Java fundamentos -15 consejos practicos open saturday 2018
Java fundamentos -15 consejos practicos open saturday 2018Java fundamentos -15 consejos practicos open saturday 2018
Java fundamentos -15 consejos practicos open saturday 2018Eudris Cabrera
 

What's hot (20)

2 Introducción al lenguaje Ruby
2 Introducción al lenguaje Ruby2 Introducción al lenguaje Ruby
2 Introducción al lenguaje Ruby
 
Programar java
Programar javaProgramar java
Programar java
 
Progav tema2
Progav tema2Progav tema2
Progav tema2
 
Programar java
Programar javaProgramar java
Programar java
 
Curso de Python
Curso de PythonCurso de Python
Curso de Python
 
1 Introducción a los Lenguajes de Programación y a la Programación Orientada ...
1 Introducción a los Lenguajes de Programación y a la Programación Orientada ...1 Introducción a los Lenguajes de Programación y a la Programación Orientada ...
1 Introducción a los Lenguajes de Programación y a la Programación Orientada ...
 
Java 8 introducción a expresiones lambdas y api stream
Java 8  introducción a expresiones lambdas y api streamJava 8  introducción a expresiones lambdas y api stream
Java 8 introducción a expresiones lambdas y api stream
 
Introduccion lenguaje java
Introduccion lenguaje javaIntroduccion lenguaje java
Introduccion lenguaje java
 
Poo 1
Poo 1Poo 1
Poo 1
 
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
 
Ruby para Java Developers
Ruby para Java DevelopersRuby para Java Developers
Ruby para Java Developers
 
Javascript
JavascriptJavascript
Javascript
 
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
 
02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcional02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcional
 
Python
Python Python
Python
 
Semana 1 Estructuras de Datos en Java
Semana 1   Estructuras de Datos en JavaSemana 1   Estructuras de Datos en Java
Semana 1 Estructuras de Datos en Java
 
Java fundamentos -15 consejos practicos open saturday 2018
Java fundamentos -15 consejos practicos open saturday 2018Java fundamentos -15 consejos practicos open saturday 2018
Java fundamentos -15 consejos practicos open saturday 2018
 
Semana 1 Estructuras de Control en Java
Semana 1   Estructuras de Control en JavaSemana 1   Estructuras de Control en Java
Semana 1 Estructuras de Control en Java
 
Ruby intro
Ruby introRuby intro
Ruby intro
 
Java Basico Platzi
Java Basico PlatziJava Basico Platzi
Java Basico Platzi
 

Viewers also liked

Successful direct market flower production for great plains vegetable growers...
Successful direct market flower production for great plains vegetable growers...Successful direct market flower production for great plains vegetable growers...
Successful direct market flower production for great plains vegetable growers...Mark Cain
 
Market bouquets from spring to fall mark cain ssawg 2016
Market bouquets from spring to fall   mark cain ssawg 2016Market bouquets from spring to fall   mark cain ssawg 2016
Market bouquets from spring to fall mark cain ssawg 2016Mark Cain
 
india' s foriculture
india' s foricultureindia' s foriculture
india' s foriculturePraveen Raj
 
Floriculture industry
Floriculture industryFloriculture industry
Floriculture industryAbarna Abi
 
Specialty Cut Flower Production and Marketing
Specialty Cut Flower Production and MarketingSpecialty Cut Flower Production and Marketing
Specialty Cut Flower Production and MarketingGardening
 
agriculture ppt
 agriculture ppt agriculture ppt
agriculture ppticon66rt
 

Viewers also liked (13)

JOGUITOPAR / TROPICAL FLOWER PRODUCTION
JOGUITOPAR / TROPICAL FLOWER PRODUCTIONJOGUITOPAR / TROPICAL FLOWER PRODUCTION
JOGUITOPAR / TROPICAL FLOWER PRODUCTION
 
Successful direct market flower production for great plains vegetable growers...
Successful direct market flower production for great plains vegetable growers...Successful direct market flower production for great plains vegetable growers...
Successful direct market flower production for great plains vegetable growers...
 
Market bouquets from spring to fall mark cain ssawg 2016
Market bouquets from spring to fall   mark cain ssawg 2016Market bouquets from spring to fall   mark cain ssawg 2016
Market bouquets from spring to fall mark cain ssawg 2016
 
Shahzad Flower Farms
Shahzad Flower FarmsShahzad Flower Farms
Shahzad Flower Farms
 
india' s foriculture
india' s foricultureindia' s foriculture
india' s foriculture
 
Tribes of Maharashtra
Tribes of MaharashtraTribes of Maharashtra
Tribes of Maharashtra
 
Significance of Soil Survey and Land Use Planning for Sustainable Agriculture...
Significance of Soil Survey and Land Use Planning for Sustainable Agriculture...Significance of Soil Survey and Land Use Planning for Sustainable Agriculture...
Significance of Soil Survey and Land Use Planning for Sustainable Agriculture...
 
Indian agriculture
Indian agricultureIndian agriculture
Indian agriculture
 
Floriculture
Floriculture Floriculture
Floriculture
 
Floriculture industry
Floriculture industryFloriculture industry
Floriculture industry
 
Maharashtra
MaharashtraMaharashtra
Maharashtra
 
Specialty Cut Flower Production and Marketing
Specialty Cut Flower Production and MarketingSpecialty Cut Flower Production and Marketing
Specialty Cut Flower Production and Marketing
 
agriculture ppt
 agriculture ppt agriculture ppt
agriculture ppt
 

Similar to Introducción a Scala

Dart como alternativa a TypeScript (Codemotion 2016)
Dart como alternativa a TypeScript (Codemotion 2016)Dart como alternativa a TypeScript (Codemotion 2016)
Dart como alternativa a TypeScript (Codemotion 2016)Rafael Bermúdez Míguez
 
Scala en proyectos de vinculación Ancap-UR - 2013-03
Scala en proyectos de vinculación Ancap-UR - 2013-03Scala en proyectos de vinculación Ancap-UR - 2013-03
Scala en proyectos de vinculación Ancap-UR - 2013-03Germán Ferrari
 
Semana03 prog ii
Semana03 prog iiSemana03 prog ii
Semana03 prog iiPropia
 
Fundamentos de Scala (Scala Basics) (español) Catecbol
Fundamentos de Scala (Scala Basics) (español) CatecbolFundamentos de Scala (Scala Basics) (español) Catecbol
Fundamentos de Scala (Scala Basics) (español) CatecbolJean-Paul Calbimonte
 
ORM Doctrine
ORM DoctrineORM Doctrine
ORM DoctrineDecharlas
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyJose Juan R. Zuñiga
 
Curso Swift
Curso SwiftCurso Swift
Curso SwiftPlatzi
 
Android+Kotlin - Meetup 12 de Octubre del 2017 Buenos Aires Argentina
Android+Kotlin - Meetup 12 de Octubre del 2017 Buenos Aires ArgentinaAndroid+Kotlin - Meetup 12 de Octubre del 2017 Buenos Aires Argentina
Android+Kotlin - Meetup 12 de Octubre del 2017 Buenos Aires ArgentinaPablo Veliz
 
Lenguaje de programacion java, conceptos
Lenguaje de programacion java, conceptosLenguaje de programacion java, conceptos
Lenguaje de programacion java, conceptosmellcv
 

Similar to Introducción a Scala (20)

Dart como alternativa a TypeScript (Codemotion 2016)
Dart como alternativa a TypeScript (Codemotion 2016)Dart como alternativa a TypeScript (Codemotion 2016)
Dart como alternativa a TypeScript (Codemotion 2016)
 
Scala en proyectos de vinculación Ancap-UR - 2013-03
Scala en proyectos de vinculación Ancap-UR - 2013-03Scala en proyectos de vinculación Ancap-UR - 2013-03
Scala en proyectos de vinculación Ancap-UR - 2013-03
 
Los lenguajes de la web
Los lenguajes de la webLos lenguajes de la web
Los lenguajes de la web
 
Tests en Java con Groovy y Spock
Tests en Java con Groovy y SpockTests en Java con Groovy y Spock
Tests en Java con Groovy y Spock
 
JAVA.PPT
JAVA.PPTJAVA.PPT
JAVA.PPT
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
 
Semana03 prog ii
Semana03 prog iiSemana03 prog ii
Semana03 prog ii
 
Java world
Java worldJava world
Java world
 
Pensando funcionalmente
Pensando funcionalmentePensando funcionalmente
Pensando funcionalmente
 
Fundamentos de Scala (Scala Basics) (español) Catecbol
Fundamentos de Scala (Scala Basics) (español) CatecbolFundamentos de Scala (Scala Basics) (español) Catecbol
Fundamentos de Scala (Scala Basics) (español) Catecbol
 
Pf con scala
Pf con scalaPf con scala
Pf con scala
 
Javascript C#
Javascript C#Javascript C#
Javascript C#
 
ORM Doctrine
ORM DoctrineORM Doctrine
ORM Doctrine
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con Groovy
 
Curso Swift
Curso SwiftCurso Swift
Curso Swift
 
Java 8
Java 8Java 8
Java 8
 
Android+Kotlin - Meetup 12 de Octubre del 2017 Buenos Aires Argentina
Android+Kotlin - Meetup 12 de Octubre del 2017 Buenos Aires ArgentinaAndroid+Kotlin - Meetup 12 de Octubre del 2017 Buenos Aires Argentina
Android+Kotlin - Meetup 12 de Octubre del 2017 Buenos Aires Argentina
 
Grupo1
Grupo1Grupo1
Grupo1
 
Lenguaje de programacion java, conceptos
Lenguaje de programacion java, conceptosLenguaje de programacion java, conceptos
Lenguaje de programacion java, conceptos
 

Introducción a Scala

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n