SlideShare ist ein Scribd-Unternehmen logo
1 von 69
Massively
Continuous Integration
From 3 days to 30 minutes
•Software   as a Service
•Project   Management
•Collaborative   Work Management
How we use Selenium
 •1,100   Selenium 1 tests
 •800   Selenium 2 tests
 •40,000    hours per month
 •Release   Acceptance + CI
Then
Scripted scenarios
Slow, brittle
Monthly Releases
3-5 days acceptance
Manual administration
Now
Tight unit-like UI tests
Fast, Robust
Daily releases
30-45 minutes
Sign-off and go
“True” Continuous Integration

       •How   often do I integrate?
       •What   tests tell me I’m integrated?
       •What   must I know to release?
Pipeline Priorities
  •Performance   (Cycle Time)
  •Scalability

  •Visibility

  •Accountability
ATTASK’S PIPE
BUILD -- DEPLOY -- TEST -- DESTROY
Commit




ATTASK’S PIPE
BUILD -- DEPLOY -- TEST -- DESTROY
Commit
                   Build Installer

                    Build Tests




ATTASK’S PIPE
BUILD -- DEPLOY -- TEST -- DESTROY
Selenium Grid

                   Grid + AtTask
    Commit
                   Build Installer

                    Build Tests




ATTASK’S PIPE
BUILD -- DEPLOY -- TEST -- DESTROY
Selenium Grid

                   Grid + AtTask
    Commit                           Install
                   Build Installer

                    Build Tests




ATTASK’S PIPE
BUILD -- DEPLOY -- TEST -- DESTROY
Selenium Grid

                   Grid + AtTask
    Commit                             Install
                   Build Installer

                    Build Tests



                                           Unit


                                     Integration
                                     1/4          3/4

                                     2/4          4/4




ATTASK’S PIPE
BUILD -- DEPLOY -- TEST -- DESTROY
Selenium Grid                        Selenium IE

                   Grid + AtTask
    Commit                             Install          Selenium FF
                   Build Installer

                    Build Tests                         Other tests



                                           Unit


                                     Integration
                                     1/4          3/4

                                     2/4          4/4




ATTASK’S PIPE
BUILD -- DEPLOY -- TEST -- DESTROY
Selenium Grid                        Selenium IE

                   Grid + AtTask
    Commit                             Install          Selenium FF   Tear Down
                   Build Installer

                    Build Tests                         Other tests



                                           Unit


                                     Integration
                                     1/4          3/4

                                     2/4          4/4




ATTASK’S PIPE
BUILD -- DEPLOY -- TEST -- DESTROY
AIRPORT SECURITY
NOBODY LIKES TO WAIT IN LINE
Selenium Grid                        Selenium IE

           Grid + AtTask
  Commit                       Install          Selenium FF   Tear Down
           Build Installer

            Build Tests                         Other tests



                                   Unit


                             Integration
                             1/4          3/4

                             2/4          4/4




SERIAL VS PARALLEL
Selenium Grid                        Selenium IE

           Grid + AtTask
  Commit                       Install          Selenium FF   Tear Down
           Build Installer

            Build Tests                         Other tests



                                   Unit


                             Integration
                             1/4          3/4

                             2/4          4/4




SERIAL VS PARALLEL
CYCLE TIME
CYCLE TIME
CYCLE TIME
JENKINS, EC2, AND ATTASK
A MATCH MADE IN HEAVEN
JENKINS, EC2, AND ATTASK
A MATCH MADE IN HEAVEN
JENKINS DYNAMIC SLAVE ALLOCATION
JENKINS DYNAMIC SLAVE ALLOCATION
SLAVE




JENKINS DYNAMIC SLAVE ALLOCATION
SLAVE

                    SLAVE

                    SLAVE

                    SLAVE


JENKINS DYNAMIC SLAVE ALLOCATION
JENKINS DYNAMIC SLAVE ALLOCATION
From 3 days to 30 minutes
with Selenium 2
SELENIUM 1 (1800 TESTS)




TESTING WITH SELENIUM 1
SELENIUM 1 (1800 TESTS)

                               4 HOURS




              SLOW



TESTING WITH SELENIUM 1
TRANSITIONING TO SELENIUM 2
TRANSITIONING TO SELENIUM 2
TRANSITIONING TO SELENIUM 2
SELENIUM 1 (1800 TESTS)

                               4 HOURS




TRANSITIONING TO SELENIUM 2
SELENIUM 1 (1800 TESTS)

                                    4 HOURS



      SELENIUM 2 (750 TESTS)

             30 MINUTES
                               WHERE DID THE
                                TESTS GO?



TRANSITIONING TO SELENIUM 2
TRANSITIONING TO SELENIUM 2
2.1 MINUTES




TRANSITIONING TO SELENIUM 2
2.1 MINUTES             34 SECONDS




TRANSITIONING TO SELENIUM 2
2.1 MINUTES                  34 SECONDS

                    WITH GRID...




TRANSITIONING TO SELENIUM 2
2.1 MINUTES                  34 SECONDS

                    WITH GRID...



       8 SECONDS



TRANSITIONING TO SELENIUM 2
2.1 MINUTES                  34 SECONDS

                    WITH GRID...



       8 SECONDS                   2.4 SECONDS



TRANSITIONING TO SELENIUM 2
Scalability
  •To   the cloud with Amazon Cloud Formations
   •Dynamic   Selenium Grids
   •Dynamic   AtTask Environments
JSON
PARTLY CLOUDY WITH A CHANCE OF RAIN
JSON
PARTLY CLOUDY WITH A CHANCE OF RAIN
Scalability

         Selenium Grid                        Selenium IE

         Grid + AtTask
Commit                       Install          Selenium FF   Tear Down
         Build Installer

          Build Tests                         Other tests



                                 Unit


                           Integration
                           1/4          3/4

                           2/4          4/4
Scalability
               Selenium Grid


               Grid + AtTask
      Commit
               Build Installer


                Build Tests
SLAVE




IT’S RAINING GRIDS
SLAVE




IT’S RAINING GRIDS
SELENIUM GRID
   SLAVE


                     SELENIUM GRID




IT’S RAINING GRIDS
SELENIUM GRID
   SLAVE


                     SELENIUM GRID




IT’S RAINING GRIDS
SELENIUM GRID
   SLAVE


                     SELENIUM GRID




IT’S RAINING GRIDS
SLAVE




               SELENIUM GRID


   SLAVE
                                  SLAVE
               SELENIUM GRID




   SLAVE                           SLAVE




IT’S RAINING GRIDS
Visibility
  •Selenium    results in Jenkins
  •Description      plugin
   •Theres   my commit!
  •View    plugin
   •All   the jobs on one line, oh the humanity!
Visibility
  •Selenium    results in Jenkins
  •Description      plugin
   •Theres   my commit!
  •View    plugin
   •All   the jobs on one line, oh the humanity!
Visibility
  •Selenium    results in Jenkins
  •Description      plugin
   •Theres   my commit!
  •View    plugin
   •All   the jobs on one line, oh the humanity!
Accountability
 •Claim   / Blame test results using AtTask
Accountability
 •Claim   / Blame test results using AtTask
Accountability
 •Claim   / Blame test results using AtTask
Gotchas
 •Watch    your integration points
 •Get   the right skill set
 •Align   process w/ tools
 •Continuous    Investment
What does it cost?
 •3   FTE
  •Two      human, one machine(s)
 •Keeping      costs down
  •Efficient    machine sizes
  •Rock-solid    tear down
  •Elasticity
Return on investment
 •5   days (40 hours) to certify one release...
  •10   engineers
  •$40   per hour
  •$20,000

 •30   minutes to certify one release...
  •10   engineers
  •$40   per hour
  •$250
To release 12 times in a year...
  $240,000 TO CERTIFY            $3000 TO TEST
                          $160,000 FOR TWO FTE
                                 $77,000 FOR CI

To release 24 times in a year...
  $480,000 TO CERTIFY            $6000 TO TEST
                          $160,000 FOR TWO FTE
                                 $77,000 FOR CI

To release 100 times in a year...
  $2,000,000 TO CERTIFY         $25000 TO TEST
                          $160,000 FOR TWO FTE
                                 $77,000 FOR CI
100 deployments annually



               $2,000,000
100 deployments annually



  $265,000     $2,000,000
100 deployments annually



     $265,000
Where to go from here
 •Continuous    Delivery
  •Thoughtworks

 •Application   Lifecycle Management
 •Infrastructure   CI
 •OpenStack
Tools Manifest
•AtTask          contributions...
 •EC2       -   wiki.jenkins-ci.org/display/JENKINS/Amazon+EC2+Plugin


 •CloudFormation                   -   wiki.jenkins-ci.org/display/JENKINS/AWS+Cloudformation+Plugin


 •Pipeline           View -     github.com/JoelJ/PipelineDashboard


 •Description              Setter -      github.com/JoelJ/DescriptionSetter


 •GIT   -       /wiki.jenkins-ci.org/display/JENKINS/Git+Plugin


 •AtTask           for Jenkins -         Coming soon...
Q&A

Weitere ähnliche Inhalte

Ähnlich wie Massively Continuous Integration: From 3 days to 30 minutes

Boston selenium meetup: Selenium 2
Boston selenium meetup: Selenium 2Boston selenium meetup: Selenium 2
Boston selenium meetup: Selenium 2
epall
 

Ähnlich wie Massively Continuous Integration: From 3 days to 30 minutes (20)

Getting Started with Dockerization of Selenium Tests Execution - Testwarez 2019
Getting Started with Dockerization of Selenium Tests Execution - Testwarez 2019Getting Started with Dockerization of Selenium Tests Execution - Testwarez 2019
Getting Started with Dockerization of Selenium Tests Execution - Testwarez 2019
 
Rocket Fuelled Cucumbers
Rocket Fuelled CucumbersRocket Fuelled Cucumbers
Rocket Fuelled Cucumbers
 
ATDD with Behat and Selenium (LDNSE6)
ATDD with Behat and Selenium (LDNSE6)ATDD with Behat and Selenium (LDNSE6)
ATDD with Behat and Selenium (LDNSE6)
 
How to Dockerize Parallel Execution of Selenium Tests - SQA Days EU, Rgia, La...
How to Dockerize Parallel Execution of Selenium Tests - SQA Days EU, Rgia, La...How to Dockerize Parallel Execution of Selenium Tests - SQA Days EU, Rgia, La...
How to Dockerize Parallel Execution of Selenium Tests - SQA Days EU, Rgia, La...
 
Integration testing for salt states using aws ec2 container service
Integration testing for salt states using aws ec2 container serviceIntegration testing for salt states using aws ec2 container service
Integration testing for salt states using aws ec2 container service
 
Be flexible with zalenium, a dockerized selenium grid infrastructure
Be flexible with zalenium, a dockerized selenium grid infrastructureBe flexible with zalenium, a dockerized selenium grid infrastructure
Be flexible with zalenium, a dockerized selenium grid infrastructure
 
Kubernetes your tests! automation with docker on google cloud platform
Kubernetes your tests! automation with docker on google cloud platformKubernetes your tests! automation with docker on google cloud platform
Kubernetes your tests! automation with docker on google cloud platform
 
Unit testing for Cocoa developers
Unit testing for Cocoa developersUnit testing for Cocoa developers
Unit testing for Cocoa developers
 
Boston selenium meetup: Selenium 2
Boston selenium meetup: Selenium 2Boston selenium meetup: Selenium 2
Boston selenium meetup: Selenium 2
 
Quick tour to front end unit testing using jasmine
Quick tour to front end unit testing using jasmineQuick tour to front end unit testing using jasmine
Quick tour to front end unit testing using jasmine
 
The history of selenium
The history of seleniumThe history of selenium
The history of selenium
 
Taking a Test Drive: iOS Dev UK guide to TDD
Taking a Test Drive: iOS Dev UK guide to TDDTaking a Test Drive: iOS Dev UK guide to TDD
Taking a Test Drive: iOS Dev UK guide to TDD
 
Testing with Jenkins, Selenium and Continuous Deployment
Testing with Jenkins, Selenium and Continuous DeploymentTesting with Jenkins, Selenium and Continuous Deployment
Testing with Jenkins, Selenium and Continuous Deployment
 
How to Un-Flake Flaky Tests - A New Hire's Toolkit
How to Un-Flake Flaky Tests - A New Hire's ToolkitHow to Un-Flake Flaky Tests - A New Hire's Toolkit
How to Un-Flake Flaky Tests - A New Hire's Toolkit
 
The history of testing framework in Ruby
The history of testing framework in RubyThe history of testing framework in Ruby
The history of testing framework in Ruby
 
Selenium RC - Web Application Testing Tool
Selenium RC - Web Application Testing ToolSelenium RC - Web Application Testing Tool
Selenium RC - Web Application Testing Tool
 
Selenium Classroom Training
Selenium Classroom TrainingSelenium Classroom Training
Selenium Classroom Training
 
How to Un-Flake Flaky Tests - A New Hire's Toolkit
How to Un-Flake Flaky Tests - A New Hire's ToolkitHow to Un-Flake Flaky Tests - A New Hire's Toolkit
How to Un-Flake Flaky Tests - A New Hire's Toolkit
 
Selenium
SeleniumSelenium
Selenium
 
Selenium-Grid-Extras
Selenium-Grid-ExtrasSelenium-Grid-Extras
Selenium-Grid-Extras
 

Mehr von seleniumconf

Using Selenium to Improve a Teams Development Cycle
Using Selenium to Improve a Teams Development CycleUsing Selenium to Improve a Teams Development Cycle
Using Selenium to Improve a Teams Development Cycle
seleniumconf
 
Building Quality with Foundations of Mud
Building Quality with Foundations of MudBuilding Quality with Foundations of Mud
Building Quality with Foundations of Mud
seleniumconf
 
More Than Automation - How Good Acceptance Tests Can Make Your Team Happier
More Than Automation - How Good Acceptance Tests Can Make Your Team HappierMore Than Automation - How Good Acceptance Tests Can Make Your Team Happier
More Than Automation - How Good Acceptance Tests Can Make Your Team Happier
seleniumconf
 
Building a Selenium Community One Meetup at a Time
Building a Selenium Community One Meetup at a TimeBuilding a Selenium Community One Meetup at a Time
Building a Selenium Community One Meetup at a Time
seleniumconf
 
Introduction to selenium_grid_workshop
Introduction to selenium_grid_workshopIntroduction to selenium_grid_workshop
Introduction to selenium_grid_workshop
seleniumconf
 
Automated Security Testing
Automated Security TestingAutomated Security Testing
Automated Security Testing
seleniumconf
 
Selenium: State of the Union
Selenium: State of the UnionSelenium: State of the Union
Selenium: State of the Union
seleniumconf
 
Introducing Selenium Builder – the Future of Test Development
Introducing Selenium Builder – the Future of Test DevelopmentIntroducing Selenium Builder – the Future of Test Development
Introducing Selenium Builder – the Future of Test Development
seleniumconf
 
Self-Generating Test Artifacts for Selenium/WebDriver
Self-Generating Test Artifacts for Selenium/WebDriverSelf-Generating Test Artifacts for Selenium/WebDriver
Self-Generating Test Artifacts for Selenium/WebDriver
seleniumconf
 
Automated Web App Performance Testing Using WebDriver
Automated Web App Performance Testing Using WebDriverAutomated Web App Performance Testing Using WebDriver
Automated Web App Performance Testing Using WebDriver
seleniumconf
 
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...
seleniumconf
 
Building a Driver: Lessons Learned From Developing the Internet Explorer Driver
Building a Driver: Lessons Learned From Developing the Internet Explorer DriverBuilding a Driver: Lessons Learned From Developing the Internet Explorer Driver
Building a Driver: Lessons Learned From Developing the Internet Explorer Driver
seleniumconf
 

Mehr von seleniumconf (12)

Using Selenium to Improve a Teams Development Cycle
Using Selenium to Improve a Teams Development CycleUsing Selenium to Improve a Teams Development Cycle
Using Selenium to Improve a Teams Development Cycle
 
Building Quality with Foundations of Mud
Building Quality with Foundations of MudBuilding Quality with Foundations of Mud
Building Quality with Foundations of Mud
 
More Than Automation - How Good Acceptance Tests Can Make Your Team Happier
More Than Automation - How Good Acceptance Tests Can Make Your Team HappierMore Than Automation - How Good Acceptance Tests Can Make Your Team Happier
More Than Automation - How Good Acceptance Tests Can Make Your Team Happier
 
Building a Selenium Community One Meetup at a Time
Building a Selenium Community One Meetup at a TimeBuilding a Selenium Community One Meetup at a Time
Building a Selenium Community One Meetup at a Time
 
Introduction to selenium_grid_workshop
Introduction to selenium_grid_workshopIntroduction to selenium_grid_workshop
Introduction to selenium_grid_workshop
 
Automated Security Testing
Automated Security TestingAutomated Security Testing
Automated Security Testing
 
Selenium: State of the Union
Selenium: State of the UnionSelenium: State of the Union
Selenium: State of the Union
 
Introducing Selenium Builder – the Future of Test Development
Introducing Selenium Builder – the Future of Test DevelopmentIntroducing Selenium Builder – the Future of Test Development
Introducing Selenium Builder – the Future of Test Development
 
Self-Generating Test Artifacts for Selenium/WebDriver
Self-Generating Test Artifacts for Selenium/WebDriverSelf-Generating Test Artifacts for Selenium/WebDriver
Self-Generating Test Artifacts for Selenium/WebDriver
 
Automated Web App Performance Testing Using WebDriver
Automated Web App Performance Testing Using WebDriverAutomated Web App Performance Testing Using WebDriver
Automated Web App Performance Testing Using WebDriver
 
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...
 
Building a Driver: Lessons Learned From Developing the Internet Explorer Driver
Building a Driver: Lessons Learned From Developing the Internet Explorer DriverBuilding a Driver: Lessons Learned From Developing the Internet Explorer Driver
Building a Driver: Lessons Learned From Developing the Internet Explorer Driver
 

Kürzlich hochgeladen

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 

Kürzlich hochgeladen (20)

04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 

Massively Continuous Integration: From 3 days to 30 minutes

Hinweis der Redaktion

  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
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n
  129. \n
  130. \n
  131. \n
  132. \n