0% found this document useful (0 votes)
28 views29 pages

New CC

It is cloud computing external file in ms word

Uploaded by

rakwalakshay8
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
28 views29 pages

New CC

It is cloud computing external file in ms word

Uploaded by

rakwalakshay8
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 29

PRACTICAL FILE

OF
CLOUD COMPUTING(CS-711)

BACJELORS OF TECHNOLOGY
IN
COMPUTER SCIENCE AND ENGINEERING

L.R ENGINEERING AND TECHNOLOGY,SOLAN

SUBMITTED TO: MS. Tammana Kanwar

SUBMITTED BY: Aditya Jaswal

ROLL NO. 21011503001(7-sem)


INDEX
Sr. No. Experiments Date Signatures
1. Introduction to
Cloud Computing

2. Hello World
Program In
Salesforce Apex

3. Implementation
of SOAP web
services in
C#/JAVA

4. Implementation
of Para-
Virtualization
using Vm ware
Workstation/
Oracle’s Virtual
Box and Guest
O.S
5. Installation and
configuration of
Hadoop
6. Create an
Application (Ex:
Word-Count)
using Hadoop
Map/Reduce
7. Case Study:
PAAS (Google
App
Engine/Facebook
)
8. Case Study:
Amazon Web
Services

Experiment-1
AIM: Introduction to cloud computing
Cloud computing
Cloud Computing is a network of remote servers hosted on the internet for storing and
retrieving data. The cloud provides a number of IT services such as servers, databases,
software, virtual storage, and networking, among others.

In layman's terms, Cloud Computing is defined as a virtual platform that allows you to store
and access your data over the internet without any limitations.

Companies that offer all the services mentioned above are called cloud providers. They
provide us with the ability to store and retrieve data and run applications, managing them
through configuration portals. Two of the best cloud providers available today are Amazon
Web Services and Microsoft Azure.

Benefits Of Cloud Computing:


Cloud platforms offer some significant benefits today, which are driving businesses to adope
Cloud Computing. Those major benefits include:
 Speed
 Cost
 Scalability
 Accessibility
 Better security
Cloud Computing provides an alternative to the on-premises data center. With an on-
premises datacenter, we have to manage everything, such as purchasing and
installing hardware, virtualization, installing the operating system, and any other
required applications, setting up the network, configuring the firewall, and setting up
storage for data. After doing all the set-up, we become responsible for maintaining it
through its entire lifecycle.

Types of Cloud Computing:

Cloud Computing is multiplying, resulting in it being classified into several different


categories. However, out of various categories, there are six that stand out.

These six categories are further divided into two parts:

 The category of cloud-based deployment


 The category of cloud-based services.

Cloud Computing is divided into three categories based on deployment, including:

 Public cloud

 Private cloud

 Hybrid cloud

The remaining three categories are divided based on the services they offer,
including:

 Infrastructure as a Service (IaaS)


 Platform as a Service (PaaS)
 Software as a Service (SaaS)
Now that you have a better idea of what the cloud categories are let's learn more about
them in-depth.
Cloud Computing Services Providers:
A few of the most popular cloud computing service providers include:
EXPERIMENT-2
AIM:- Hello World Program In Salesforce Apex.
Step 1:- To write code press CTRL+E to open “Open Execute Anonymous
Window”.
System.debug(‘Hello World’);

Step 2:- For the Output click on execute button.

Step 3:- Check the check-box Debug Only


Step 4:- The output of the program should be-
EXPERIMENT – 3
AIM: Implementation of SOAP Web services in C#/JAVA Applications.
SOAP Web Services:
SOAP is an acronym for Simple Object Access Protocol. It is an XML-

based messaging protocol for exchanging information among computers. SOAP is an

application of the XML specification.

SOAP can be used in a variety of messaging systems and can be delivered via a variety of

transport protocols, the initial focus of SOAP is remote procedure calls transported via

HTTP.

Creating a SOAP web service or an API using JAVA that evaluates the
eligibility of loan for a customer

1. CustomerRequest.javaClass

package com.soapws.example.loaneligibility;

import javax.xml.bind.annotation.XmlAccessType;

import javax.xml.bind.annotation.XmlAccessorType;

import javax.xml.bind.annotation.XmlElement;

import javax.xml.bind.annotation.XmlRootElement;

import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)

@XmlType(name = "", propOrder = {

"customerName",

"age",

"yearlyIncome",

"cibilScore",
"employmentMode"

})

@XmlRootElement(name = "CustomerRequest")

public class CustomerRequest {

@XmlElement(required = true)

protected String customerName;

protected int age;

protected long yearlyIncome;

protected int cibilScore;

@XmlElement(required = true)

protected String employmentMode;

public String getCustomerName() {

return customerName;

public void setCustomerName(String value) {

this.customerName = value;

public int getAge() {

return age;

public void setAge(int value) {

this.age = value;

public long getYearly Income() {

return yearlyIncome;

public void setYearly Income(long value) {


this.yearlyIncome = value;

public int getCibilScore() {

return cibilScore;

public void setCibilScore(int value) {

this.cibilScore = value;

public String getEmploymentMode() {

return employmentMode;

public void setEmploymentMode(String value) {

this.employmentMode = value;

2. Acknowldgement.javaClass
package com.soapws.example.loaneligibility;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccess Type; import
javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import
javax.xml.bind.annotation.XmlRootElement;

import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)

@XmlType(name = "", propOrder = {

"isEligible",

"approved Amount",

"criteriaMismatch"

)}

@XmlRootElement(name = "Acknowledgement")
public class Acknowledgement {

protected booleanisEligible;

protected long approved Amount;

@XmlElement(name = "CriteriaMismatch", required = true)

protected List<String>criteriaMismatch;

public booleanisIsEligible() {

return isEligible;

public void setIsEligible(boolean value) {

this.isEligible = value;

public long getApproved Amount() {

return approved Amount;

public void setApproved Amount(long value) {

this.approved Amount = value;

public List<String>getCriteriaMismatch() {

if (criteriaMismatchnull) {

criteriaMismatch = new ArrayList<String>();

return this.criteriaMismatch;

3. ObjectFactory.java Class
package com.soapws.example;

import javax.xml.bind.annotation.XmlRegistry;

@XmlRegistry

public class ObjectFactory {

public ObjectFactory() {
}

public CustomerRequestcreateCustomerRequest() {

return new CustomerRequest();

public Acknowledgement createAcknowledgement() {

return new Acknowledgement();

Now from service package we have a service class


Loan EligibilityService.java Class
package com.soapws.example.service;

import java.util.List;

import org.springframework.stereotype.Service;

import com.javatechie.spring.soap.api.loaneligibility.Acknowledgement;

import com.javatechie.spring.soap.api.loaneligibility. Customer Request;

@Service

public class LoanEligibilityService {

public Acknowledgement checkLoan Eligibility(CustomerRequest request) {

Acknowledgement = new Acknowledgement();

List<String>mismatchCriteriaList = acknowledgement.getCriteriaMismatch();

if (!(request.getAge() >30 &&request.getAge() <= 60)) {

mismatchCriteriaList.add("Person age should in between 30 to 60");

if (!(request.getYearlyIncome() >200000)) {

mismatchCriteriaList.add("minimum income should be more than


200000”);

if (!(request.getCibilScore() > 500)) {


mismatchCriteriaList.add("Low CIBIL Score please try after 6
month”);
}

if (mismatchCriteriaList.size() > 0) {
acknowledgement.setApproved Amount(0);
acknowledgement.setIsEligible(false);
} else {

acknowledgement.setApproved Amount(500000);
acknowledgement.setIsEligible(true);
mismatchCriteriaList.clear();

return acknowledgement;

Loan EligibilityIndicatorEndPoint.java Class


package com.soap.example.endpoint;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;

import com.javatechie.spring.soap.api.loaneligibility.Acknowledgement;
import com.javatechie.spring.soap.api.loaneligibility. CustomerRequest;
import com.javatechie.spring.soap.api.service.LoanEligibilityService;

@Endpoint
public class Loan EligibilityindicatorEndpoint {

private static final String NAMESPACE =


"http://www.javatechie.com/spring/soap/api/loan Eligibility";
@Autowired
private LoanEligibilityService service;

@PayloadRoot(namespace = NAMESPACE, localPart = "CustomerRequest")


@ResponsePayload
public Acknowledgement getLoanStatus(@RequestPayload Customer Request
request) {
return service.checkLoanEligibility(request);
}

SoapWsConfig.java Class
package com.soapws.example.config;

import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation. Configuration;

import org.springframework.core.io.ClassPathResource;
import org.springframework.ws.config.annotation.EnableWs;
import org.springframework.ws.transport.http.MessageDispatcherServlet;
import org.springframework.ws.wsdl.wsdl11.Default Wsdl11 Definition;
import org.springframework.xml.xsd.SimpleXsdSchema;
import org.springframework.xml.xsd.XsdSchema;

@Configuration
@EnableWs
public class SoapWSConfig {

@Bean
public
ServletRegistrationBean<MessageDispatcherServlet messageDispatcherServlet(Application
Context context) {

MessageDispatcherServlet servlet = new MessageDispatcherServlet();


servlet.setApplicationContext(context);
servlet.setTransformWsdl Locations(true);
return new ServletRegistrationBean<MessageDispatcherServlet>(servlet,

“/ws/*”);

@Bean(name = "loanEligibility")
public DefaultWsdl11 Definition default Wsdl11 Definition(XsdSchema schema) {
DefaultWsd111 Definition defaultWsdl11 Definition = new
Default Wsdl11 Definition();
defaultWsdl11 Definition.setPortTypeName("LoanEligibilityindicator");
defaultWsdl11Definition.setLocationUri("/ws");

defaultWsdl11 Definition.setTargetNamespace("http://www.javatechie.com/spring/soa
p/api/loanEligibility");

defaultWsdl11 Definition.setSchema(schema);
return default Wsdl11 Definition;
}

@Bean
public XsdSchemaschema() {
return new SimpleXsdSchema(new ClassPathResource("loaneligibility.xsd"));

Now the xsd file for handing the loan requests in runtime can be illustrated
as:
Loaneligibility.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schemaxmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com/spring/soap/api/loanEligibility"
xmlns:tns="http://www.example.com/spring/soap/api/loanEligibility"
elementFormDefault="qualified">

<xsd:element name="Customer Request">


<xsd:complexType>
<xsd:sequence>
<xsd:element name="customerName" type="xsd:string" />
<xsd:element name="age" type="xsd:int" />
<xsd:element name="yearlyIncome" type="xsd:long" />
<xsd:element name="cibilScore" type="xsd:int" />
<xsd:element name="employmentMode" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:element name="Acknowledgement">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="isEligible" type="xsd:boolean"/>
<xsd:element name="approved Amount" type="xsd:long" />
<xsd:element name="CriteriaMismatch" type="xsd:string"
maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

Now the Main class or executer class:


SpringBootSopa WsApplication.java Class
package com.soapws.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class SpringBootSopaWsApplication {

public static void main(String[] args) {

SpringApplication.run(SpringBootSopaWsApplication.class, args);}}
Experiment-4
Aim: Implementation of Para- Virtual using VM Ware Workstation/
Oracle’s Virtual Box and Guest O.s
Paravirtualization:
Paravirtualization is the category of CPU virtualization which uses
hyper calls for operations to handle instructions and compile time.
For achieving the paravirtualization, download the virtual box and set
up the virtual OS file for setup.
Implementation of paravirtualization using the Oracle Virtual box:
1. Open a virtual box and set up an OS for virtualization.For example-
Linux, Windows, etc.

2. The virtual workspace has been created successfully. Now select the OS
and click on Start to open the virtually installed OS application in virtual-
box window. This is Ubuntu’s virtual environments home screen on the
Oracle Virtual box this OS will behave like the native OS of the machine
on which it is installed.
We can perform data-driven or oriented task on this OS securely.
 It provides less isolation compared to full virtualization.
 It is more streamlined.
 The guest operating system has to be modemed and only a
few operating systems support it.

3. The paravirtualization has been achieved and the functions performed on


this will be partially isolated and files can be shared between the native
and the virtual OS using a share folder.
EXPERIMENT -6
AIM: Create an application using Hadoop Map/Reduce.
For creating an application and running it using Hadoop, we need to follow some hierarchical steps:
STEP-1
Start DFS and YARN services using the commands:
• start-dfs
• start-yarn
STEP-2
Create input directory in HDFS and copy the input text file into the input directory of HDFS.

Copying file to hdfs:

STEP-3 : Create a map-reduce program using Java in any IDE.


WC_mapper.java class

package com.Hadoop.wordcount;

import java.io.IOException;

import java.util.StringTokenizer;
import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.Long Writable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapred.MapReduceBase;

import org.apache.hadoop.mapred.Mapper;

import org.apache.hadoop.mapred.OutputCollector;

import org.apache.hadoop.mapred.Reporter;

public class WC_Mapper extends MapReduceBase implements Mapper LongWritable, Text, Text,
IntWritable>{

private final static IntWritable one = new IntWritable(1);

private Text word = new Text();

public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter
reporter) throws IOException { String line = value.toString();

StringTokenizer tokenizer = new StringTokenizer(line); while (tokenizer.hasMoreTokens())


{ word.set(tokenizer.nextToken()); output.collect(word, one);

}}}

WC reducer.java Class:

package com.Hadoop.wordcount;

import java.io.IOException;

import java.util. Iterator,

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapred.MapReduceBasc,

import org.apache.hadoop.mapred. OutputCollector,

import org.apache.hadoop.mapred. Reducer


import org.apache.hadoop.mapred. Reporter,

public class WC_Reducer extendsMapReduceBase implements Reducer Text, Int Writable, Text, Int
Writable> { public void reduce(Text key, Iterator<Int Writable values, OutputCollector<Text, Int
Writable> output, Reporter reporter) throws IOException { int sum=0; while (values.hasNext()) {

sum+=values.next().get();

output.collect(key,newIntWritable(sum));

WC Runner.java Class

package com.Hadoop.wordcount;

import java.io.IOException;

import org.apache.hadoop.fs.Path,

import org.apache.hadoop.io.Int Writable,

import org.apache.hadoop.io. Text,

import import org.apache.hadoop.mapred. FilelnputFormat;

org.apache.hadoop.mapred.FileOutputFormat;

import org.apache.hadoop.mapred.JobClient;

import org.apache.hadoop.mapred.JobConf;

import org.apache.hadoop.mapred. TextInputFormat;

import org.apache.hadoop.mapred. TextOutputFormat;

public class WC Runner{

public static void main(String[] args) throws IOException{

JobConf conf=new JobConf(WC Runner.class);

conf.setJobName("WordCount");

conf.setOutput KeyClass(Text.class);

conf.setOutputValueClass(Int Writable.class);
conf.setMapperClass(WC_Mapper.class);

conf.setCombinerClass(WC_Reducer.class);

conf.setReducerClass(WC_Reducer.class);

conf.setInputFormat TextInputFormat.class);

conf.setOutputFormat(TextOutputFormat.clam);

FileInputFormat.setInputPaths(conf.new Path(args[0]));

FileOutputFormat.setOutputPath(conf.new Path(args[1]));

JobClient.runJob(conf);

}}

Create the jar file of this program and name it countworddemo.jar. and run it like below:

Now hit http://localhost:8088 in the web browser,the output will be:


Experiment-5
Aim: Installation and Configuration of Hadoop.
Hadoop is an open source framework som Apache and is used to store process and analyze
data that are very huge in volume.
To install and configured Hadoop we need to perform the following steps:

Step 1: Install Java using the official Oracle website and check if it is installed successfully
using the Java version on command prompt and output will be like this:

Step 2: Download Hadoop using the official Apache website :

Step 3: Set Environment Variables:


You must configure environment variables after downloading and unpacking Hadoop.
Launch the Start menu, type “Edit the system environment variables,” and select the result.
This will launch the System Properties dialogue box. Click on “Environment Variables” button
to open.
Click “New” under System Variables to add a new variable. Enter the variable name
“HADOOP_HOME” and the path to the Hadoop folder as the variable value. Then press “OK.”
Then, under System Variables, locate the “Path” variable and click “Edit.” Click “New” in the
Edit Environment Variable window and enter “%HADOOP_HOME%bin” as the variable value.
To close all the windows, use the “OK” button.

Step 4: Setup Hadoop


You must configure Hadoop in this phase by modifying several configuration files. Navigate
to the “etc/hadoop” folder in the Hadoop folder. You must make changes to three files:

 core-site.xml

Step 5 : Format Hadoop NameNode


You must format the NameNode before you can start Hadoop. Navigate to the Hadoop bin
folder using a command prompt. Execute this command:

Step 6: Start Hadoop


To start Hadoop, open a command prompt and navigate to the Hadoop bin folder. Run the
following command:

This command will start all the required Hadoop services, including the NameNode,
DataNode, and JobTracker. Wait for a few minutes until all the services are started.

Step 7: Verify Hadoop Installation


To ensure that Hadoop is properly installed, open a web browser and go
to http://localhost:50070/. This will launch the web interface for the Hadoop NameNode.
You should see a page with Hadoop cluster information.
Remember to get the most recent stable version of Hadoop, install Java, configure
Hadoop, format the NameNode, and start Hadoop services. Finally, check the NameNode
web interface to ensure that Hadoop is properly installed.
Hadoop installed and configure successfully….
EXPERIMENT - 7
AIM: Case study: PAAS (Google app Engine, Facebook)
Google app Engine:
Google App Engine is a platform as a service (PaaS) cloud computing
platform for developing and hosting web applications in Google-managed data centers.
Applications run on several servers while being sandboxed. Web applications can be
automatically scaled by App Engine, which allocates more resources as needed to meet the
growing demand as the number of requests for a certain application rises. Up to a specific
threshold of utilized resources, Google App Engine is free.

Fees are charged for additional storage, bandwidth, or instance hours required by the
application. It was first released as a preview version in April 2008, and came out of preview
in September 2011.

Technology and Framework:Currently, the supported programming languages are


Python, Java (and, by extension, other JVM languages such as Groovy, JRuby, Scala,
Clojure, Jython, and PHP via a special version of Quercus), and Go. Google has
said that it plans to support more languages in the future and that the Google
App Engine has been written to be language-independent.
Reliability and Support
All billed High-Replication Datastore App Engine applications have a 99.95%
uptime SLA.
Portability Concerns
 Developers worry that the applications will not be portable from App
Engine and fear being locked into the technology.
 There are a number of projects to create open-source back-ends for the
various proprietary/closed APIs of the app engine, especially the data
store.
 AppScale and TyphoonAE are two of the open-source efforts.
 Web2py web framework offers migration between SQL Databases and
Google App Engine, however, it doesn't support several App Engine-
specific features such as transactions and namespaces.

Differences with another application hosting:


 Compared to other scalable hosting services such as Amazon EC2, App
Engine provides more infrastructure to make it easy to write scalable
applications, but can only run a limited range of applications designed for
that infrastructure.
 App Engine's infrastructure removes many of the system administration
and development challenges of building applications to scale to hundreds
of requests per second and beyond.
 While other services let users install and configure nearly any *NIX
compatible software, App Engine requires developers to use only its
supported languages, APIs, and frameworks.

 Current APIs allow storing and retrieving data from a BigTable non-
relational database; making HTTP requests; sending e-mail; manipulating
images; and caching.

 Per-day and per-minute quotas restrict bandwidth and CPU use, number
of requests served, number of concurrent requests, and calls to the various
APIs, and individual requests are terminated if they take more than 60
seconds or return more than 32MB of data.
Experiment-8
AIM: Case Study Amazon Web Services
Amazon Web Services:
Amazon Web Services (AWS) is a subsidiary of Amazon providing on-demand cloud
computing platforms and APIs to individuals, companies, and governments, on a metered
pay-as-you-go basis.
Amazon Web Services (AWS) is the world's most comprehensive and broadly adopted cloud
platform, offering over 175 fully-featured services from data centers globally. Millions of
customers including the fastest-growing startups, largest enterprises, and leading government
agencies faster. are using AWS to lower costs, necome more agile, and innovate

In 2010, Netflix became the first company to announce publicly that it would run all of its
infrastructure on AWS. After that, customers began to sign up even more quickly, and AWS
developed the market share that put it far ahead of all the other competitors who began to
offer their own cloud computing services.
AWS Regions:

Benefits of Amazon Web Services:

• Most functionality like compute, storage, and databases-to emerging technologies, such as
machine learning and artificial intelligence, data lakes and analytics, and the Internet of
Things.

The largest community of customers and partners.


• Most secure, its core infrastructure is built to satisfy the security requirements for the
military, global banks, and other high-sensitivity organizations.
➤ This is backed by a deep set of cloud security tools, with 230 security, compliance, and
governance services and features.

➤ AWS supports 90 security standards and compliance sertifications, and all 117 AWS
services that store customer data offer the ability to encrypt that data.
• Fastest pace of innovation-With AWS, you can leverage the latest technologies to
experiment and innovate more quickly.
• Most proven operational expertise
• Agility & Elasticity

Important Points:
• Amazon Web Services (AWS) is the undisputed market leader in cloud computing,
from overall market share to most expansive cloud offering.
• It has vast resources, allowing it to design and execute new solutions at a dizzying
pace, sometimes or often faster than customers can understand or incorporate them.
• The company offers a complete range of laas and PaaS services.
• Among the best known are its Elastic Compute Cloud (EC2), Elastic Beanstalk,
Simple Storage Service (S3), Elastic Block Store (EBS), Glacier storage, Relational
Database Service (RDS), and DynamoDB NoSQL database.
• It also offers cloud services related to networking, analytics and machine learning, the
Internet of Things (IoT), mobile services, development, cloud management, cloud
security and more.

When Not to Use AWS:


• If AWS has a weakness, it is its lack of offerings for hybrid cloud deployments.
• Most enterprises will be pursuing a hybrid cloud, multi-cloud strategy, and Amazon's
competitors Microsoft Azure and IBM have an advantage in this area.

AWS Use Cases:


In every field, the AWS service is used. Below are some areas and some top companies that
use AWS.
• Aerospace (NASA, Maxar, ESA, etc.)
• Gaming (MPL, FanFight, etc.)
• Education (Coursera, BYJU's, etc.)
• Telecommunication (Pinterest, Vodafone, Aircel, etc.)
• Entertainment (Netflix, Hotstar, etc.)
• Media (BBC, The Hindu, Punjab Kesri etc.)
• Software (Share chat, Slack etc.

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy