Merge pull request #42 from vivekshresta/master

Changes to GatewayResourceProfile
diff --git a/.travis.yml b/.travis.yml
index 9b65b65..dabb811 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -12,3 +12,6 @@
   - ./lint_js.sh
   - ./build_js.sh
   - ./test_js.sh
+  # Need to build the frontend client before running some of the Django tests
+  # that use the Django test Client
+  - python manage.py test
diff --git a/Dockerfile b/Dockerfile
index c430bfe..97ea19d 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -3,6 +3,7 @@
 RUN apk add yarn
 
 # build api javascript
+# api must come first, then common, since the others depend on these
 WORKDIR /code/django_airavata/apps/api
 COPY ./django_airavata/apps/api/package.json ./django_airavata/apps/api/yarn.lock ./
 RUN yarn
@@ -16,11 +17,11 @@
 COPY ./django_airavata/static/common/ .
 RUN yarn run build
 
-# build admin javascript
-WORKDIR /code/django_airavata/apps/admin
-COPY ./django_airavata/apps/admin/package.json ./django_airavata/apps/admin/yarn.lock ./
+# build dataparsers javascript
+WORKDIR /code/django_airavata/apps/dataparsers
+COPY ./django_airavata/apps/dataparsers/package.json ./django_airavata/apps/dataparsers/yarn.lock ./
 RUN yarn
-COPY ./django_airavata/apps/admin/ .
+COPY ./django_airavata/apps/dataparsers/ .
 RUN yarn run build
 
 # build groups javascript
@@ -31,12 +32,21 @@
 RUN yarn run build
 
 # build workspace/django-airavata-workspace-plugin-api javascript
+# This one must come before workspace build
 WORKDIR /code/django_airavata/apps/workspace/django-airavata-workspace-plugin-api
 COPY ./django_airavata/apps/workspace/django-airavata-workspace-plugin-api/package.json ./django_airavata/apps/workspace/django-airavata-workspace-plugin-api/yarn.lock ./
 RUN yarn
 COPY ./django_airavata/apps/workspace/django-airavata-workspace-plugin-api/ .
 RUN yarn run build
 
+# build admin javascript
+# To reuse cache best, putting the two most volatile apps, admin and workspace, last
+WORKDIR /code/django_airavata/apps/admin
+COPY ./django_airavata/apps/admin/package.json ./django_airavata/apps/admin/yarn.lock ./
+RUN yarn
+COPY ./django_airavata/apps/admin/ .
+RUN yarn run build
+
 # build workspace javascript
 WORKDIR /code/django_airavata/apps/workspace
 COPY ./django_airavata/apps/workspace/package.json ./django_airavata/apps/workspace/yarn.lock ./
@@ -44,13 +54,6 @@
 COPY ./django_airavata/apps/workspace/ .
 RUN yarn run build
 
-# build dataparsers javascript
-WORKDIR /code/django_airavata/apps/dataparsers
-COPY ./django_airavata/apps/dataparsers/package.json ./django_airavata/apps/dataparsers/yarn.lock ./
-RUN yarn
-COPY ./django_airavata/apps/dataparsers/ .
-RUN yarn run build
-
 
 
 FROM python:3.6.5 as server-stage
diff --git a/airavata/api/credential/__init__.py b/airavata/api/credential/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/airavata/api/credential/__init__.py
diff --git a/airavata/api/credential/store/CredentialStoreService-remote b/airavata/api/credential/store/CredentialStoreService-remote
new file mode 100755
index 0000000..2d43132
--- /dev/null
+++ b/airavata/api/credential/store/CredentialStoreService-remote
@@ -0,0 +1,208 @@
+#!/usr/bin/env python
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+import sys
+import pprint
+if sys.version_info[0] > 2:
+    from urllib.parse import urlparse
+else:
+    from urlparse import urlparse
+from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient
+from thrift.protocol.TBinaryProtocol import TBinaryProtocol
+
+from airavata.api.credential.store import CredentialStoreService
+from airavata.api.credential.store.ttypes import *
+
+if len(sys.argv) <= 1 or sys.argv[1] == '--help':
+    print('')
+    print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]')
+    print('')
+    print('Functions:')
+    print('  CredentialSummary getCredentialSummary(string tokenId, string gatewayId)')
+    print('   getAllCredentialSummaries(SummaryType type,  accessibleTokenIds, string gatewayId)')
+    print('  string addSSHCredential(SSHCredential sshCredential)')
+    print('  string addCertificateCredential(CertificateCredential certificateCredential)')
+    print('  string addPasswordCredential(PasswordCredential passwordCredential)')
+    print('  SSHCredential getSSHCredential(string tokenId, string gatewayId)')
+    print('  CertificateCredential getCertificateCredential(string tokenId, string gatewayId)')
+    print('  PasswordCredential getPasswordCredential(string tokenId, string gatewayId)')
+    print('   getAllCredentialSummaryForGateway(SummaryType type, string gatewayId)')
+    print('   getAllCredentialSummaryForUserInGateway(SummaryType type, string gatewayId, string userId)')
+    print('   getAllPWDCredentialsForGateway(string gatewayId)')
+    print('  bool deleteSSHCredential(string tokenId, string gatewayId)')
+    print('  bool deletePWDCredential(string tokenId, string gatewayId)')
+    print('  string getAPIVersion()')
+    print('')
+    sys.exit(0)
+
+pp = pprint.PrettyPrinter(indent=2)
+host = 'localhost'
+port = 9090
+uri = ''
+framed = False
+ssl = False
+validate = True
+ca_certs = None
+keyfile = None
+certfile = None
+http = False
+argi = 1
+
+if sys.argv[argi] == '-h':
+    parts = sys.argv[argi + 1].split(':')
+    host = parts[0]
+    if len(parts) > 1:
+        port = int(parts[1])
+    argi += 2
+
+if sys.argv[argi] == '-u':
+    url = urlparse(sys.argv[argi + 1])
+    parts = url[1].split(':')
+    host = parts[0]
+    if len(parts) > 1:
+        port = int(parts[1])
+    else:
+        port = 80
+    uri = url[2]
+    if url[4]:
+        uri += '?%s' % url[4]
+    http = True
+    argi += 2
+
+if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':
+    framed = True
+    argi += 1
+
+if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl':
+    ssl = True
+    argi += 1
+
+if sys.argv[argi] == '-novalidate':
+    validate = False
+    argi += 1
+
+if sys.argv[argi] == '-ca_certs':
+    ca_certs = sys.argv[argi+1]
+    argi += 2
+
+if sys.argv[argi] == '-keyfile':
+    keyfile = sys.argv[argi+1]
+    argi += 2
+
+if sys.argv[argi] == '-certfile':
+    certfile = sys.argv[argi+1]
+    argi += 2
+
+cmd = sys.argv[argi]
+args = sys.argv[argi + 1:]
+
+if http:
+    transport = THttpClient.THttpClient(host, port, uri)
+else:
+    if ssl:
+        socket = TSSLSocket.TSSLSocket(host, port, validate=validate, ca_certs=ca_certs, keyfile=keyfile, certfile=certfile)
+    else:
+        socket = TSocket.TSocket(host, port)
+    if framed:
+        transport = TTransport.TFramedTransport(socket)
+    else:
+        transport = TTransport.TBufferedTransport(socket)
+protocol = TBinaryProtocol(transport)
+client = CredentialStoreService.Client(protocol)
+transport.open()
+
+if cmd == 'getCredentialSummary':
+    if len(args) != 2:
+        print('getCredentialSummary requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.getCredentialSummary(args[0], args[1],))
+
+elif cmd == 'getAllCredentialSummaries':
+    if len(args) != 3:
+        print('getAllCredentialSummaries requires 3 args')
+        sys.exit(1)
+    pp.pprint(client.getAllCredentialSummaries(eval(args[0]), eval(args[1]), args[2],))
+
+elif cmd == 'addSSHCredential':
+    if len(args) != 1:
+        print('addSSHCredential requires 1 args')
+        sys.exit(1)
+    pp.pprint(client.addSSHCredential(eval(args[0]),))
+
+elif cmd == 'addCertificateCredential':
+    if len(args) != 1:
+        print('addCertificateCredential requires 1 args')
+        sys.exit(1)
+    pp.pprint(client.addCertificateCredential(eval(args[0]),))
+
+elif cmd == 'addPasswordCredential':
+    if len(args) != 1:
+        print('addPasswordCredential requires 1 args')
+        sys.exit(1)
+    pp.pprint(client.addPasswordCredential(eval(args[0]),))
+
+elif cmd == 'getSSHCredential':
+    if len(args) != 2:
+        print('getSSHCredential requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.getSSHCredential(args[0], args[1],))
+
+elif cmd == 'getCertificateCredential':
+    if len(args) != 2:
+        print('getCertificateCredential requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.getCertificateCredential(args[0], args[1],))
+
+elif cmd == 'getPasswordCredential':
+    if len(args) != 2:
+        print('getPasswordCredential requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.getPasswordCredential(args[0], args[1],))
+
+elif cmd == 'getAllCredentialSummaryForGateway':
+    if len(args) != 2:
+        print('getAllCredentialSummaryForGateway requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.getAllCredentialSummaryForGateway(eval(args[0]), args[1],))
+
+elif cmd == 'getAllCredentialSummaryForUserInGateway':
+    if len(args) != 3:
+        print('getAllCredentialSummaryForUserInGateway requires 3 args')
+        sys.exit(1)
+    pp.pprint(client.getAllCredentialSummaryForUserInGateway(eval(args[0]), args[1], args[2],))
+
+elif cmd == 'getAllPWDCredentialsForGateway':
+    if len(args) != 1:
+        print('getAllPWDCredentialsForGateway requires 1 args')
+        sys.exit(1)
+    pp.pprint(client.getAllPWDCredentialsForGateway(args[0],))
+
+elif cmd == 'deleteSSHCredential':
+    if len(args) != 2:
+        print('deleteSSHCredential requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.deleteSSHCredential(args[0], args[1],))
+
+elif cmd == 'deletePWDCredential':
+    if len(args) != 2:
+        print('deletePWDCredential requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.deletePWDCredential(args[0], args[1],))
+
+elif cmd == 'getAPIVersion':
+    if len(args) != 0:
+        print('getAPIVersion requires 0 args')
+        sys.exit(1)
+    pp.pprint(client.getAPIVersion())
+
+else:
+    print('Unrecognized method %s' % cmd)
+    sys.exit(1)
+
+transport.close()
diff --git a/airavata/api/credential/store/CredentialStoreService.py b/airavata/api/credential/store/CredentialStoreService.py
new file mode 100644
index 0000000..434741f
--- /dev/null
+++ b/airavata/api/credential/store/CredentialStoreService.py
@@ -0,0 +1,2851 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+import airavata.base.api.BaseAPI
+import logging
+from .ttypes import *
+from thrift.Thrift import TProcessor
+from thrift.transport import TTransport
+
+
+class Iface(airavata.base.api.BaseAPI.Iface):
+    def getCredentialSummary(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+    def getAllCredentialSummaries(self, type, accessibleTokenIds, gatewayId):
+        """
+        Parameters:
+         - type
+         - accessibleTokenIds
+         - gatewayId
+        """
+        pass
+
+    def addSSHCredential(self, sshCredential):
+        """
+        This method is to add SSHCredential which will return the token Id in success
+
+
+        Parameters:
+         - sshCredential
+        """
+        pass
+
+    def addCertificateCredential(self, certificateCredential):
+        """
+        Parameters:
+         - certificateCredential
+        """
+        pass
+
+    def addPasswordCredential(self, passwordCredential):
+        """
+        Parameters:
+         - passwordCredential
+        """
+        pass
+
+    def getSSHCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+    def getCertificateCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+    def getPasswordCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+    def getAllCredentialSummaryForGateway(self, type, gatewayId):
+        """
+        Parameters:
+         - type
+         - gatewayId
+        """
+        pass
+
+    def getAllCredentialSummaryForUserInGateway(self, type, gatewayId, userId):
+        """
+        Parameters:
+         - type
+         - gatewayId
+         - userId
+        """
+        pass
+
+    def getAllPWDCredentialsForGateway(self, gatewayId):
+        """
+        Parameters:
+         - gatewayId
+        """
+        pass
+
+    def deleteSSHCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+    def deletePWDCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        pass
+
+
+class Client(airavata.base.api.BaseAPI.Client, Iface):
+    def __init__(self, iprot, oprot=None):
+        airavata.base.api.BaseAPI.Client.__init__(self, iprot, oprot)
+
+    def getCredentialSummary(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_getCredentialSummary(tokenId, gatewayId)
+        return self.recv_getCredentialSummary()
+
+    def send_getCredentialSummary(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('getCredentialSummary', TMessageType.CALL, self._seqid)
+        args = getCredentialSummary_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getCredentialSummary(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getCredentialSummary_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getCredentialSummary failed: unknown result")
+
+    def getAllCredentialSummaries(self, type, accessibleTokenIds, gatewayId):
+        """
+        Parameters:
+         - type
+         - accessibleTokenIds
+         - gatewayId
+        """
+        self.send_getAllCredentialSummaries(type, accessibleTokenIds, gatewayId)
+        return self.recv_getAllCredentialSummaries()
+
+    def send_getAllCredentialSummaries(self, type, accessibleTokenIds, gatewayId):
+        self._oprot.writeMessageBegin('getAllCredentialSummaries', TMessageType.CALL, self._seqid)
+        args = getAllCredentialSummaries_args()
+        args.type = type
+        args.accessibleTokenIds = accessibleTokenIds
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getAllCredentialSummaries(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getAllCredentialSummaries_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllCredentialSummaries failed: unknown result")
+
+    def addSSHCredential(self, sshCredential):
+        """
+        This method is to add SSHCredential which will return the token Id in success
+
+
+        Parameters:
+         - sshCredential
+        """
+        self.send_addSSHCredential(sshCredential)
+        return self.recv_addSSHCredential()
+
+    def send_addSSHCredential(self, sshCredential):
+        self._oprot.writeMessageBegin('addSSHCredential', TMessageType.CALL, self._seqid)
+        args = addSSHCredential_args()
+        args.sshCredential = sshCredential
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_addSSHCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = addSSHCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "addSSHCredential failed: unknown result")
+
+    def addCertificateCredential(self, certificateCredential):
+        """
+        Parameters:
+         - certificateCredential
+        """
+        self.send_addCertificateCredential(certificateCredential)
+        return self.recv_addCertificateCredential()
+
+    def send_addCertificateCredential(self, certificateCredential):
+        self._oprot.writeMessageBegin('addCertificateCredential', TMessageType.CALL, self._seqid)
+        args = addCertificateCredential_args()
+        args.certificateCredential = certificateCredential
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_addCertificateCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = addCertificateCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "addCertificateCredential failed: unknown result")
+
+    def addPasswordCredential(self, passwordCredential):
+        """
+        Parameters:
+         - passwordCredential
+        """
+        self.send_addPasswordCredential(passwordCredential)
+        return self.recv_addPasswordCredential()
+
+    def send_addPasswordCredential(self, passwordCredential):
+        self._oprot.writeMessageBegin('addPasswordCredential', TMessageType.CALL, self._seqid)
+        args = addPasswordCredential_args()
+        args.passwordCredential = passwordCredential
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_addPasswordCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = addPasswordCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "addPasswordCredential failed: unknown result")
+
+    def getSSHCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_getSSHCredential(tokenId, gatewayId)
+        return self.recv_getSSHCredential()
+
+    def send_getSSHCredential(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('getSSHCredential', TMessageType.CALL, self._seqid)
+        args = getSSHCredential_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getSSHCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getSSHCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getSSHCredential failed: unknown result")
+
+    def getCertificateCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_getCertificateCredential(tokenId, gatewayId)
+        return self.recv_getCertificateCredential()
+
+    def send_getCertificateCredential(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('getCertificateCredential', TMessageType.CALL, self._seqid)
+        args = getCertificateCredential_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getCertificateCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getCertificateCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getCertificateCredential failed: unknown result")
+
+    def getPasswordCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_getPasswordCredential(tokenId, gatewayId)
+        return self.recv_getPasswordCredential()
+
+    def send_getPasswordCredential(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('getPasswordCredential', TMessageType.CALL, self._seqid)
+        args = getPasswordCredential_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getPasswordCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getPasswordCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getPasswordCredential failed: unknown result")
+
+    def getAllCredentialSummaryForGateway(self, type, gatewayId):
+        """
+        Parameters:
+         - type
+         - gatewayId
+        """
+        self.send_getAllCredentialSummaryForGateway(type, gatewayId)
+        return self.recv_getAllCredentialSummaryForGateway()
+
+    def send_getAllCredentialSummaryForGateway(self, type, gatewayId):
+        self._oprot.writeMessageBegin('getAllCredentialSummaryForGateway', TMessageType.CALL, self._seqid)
+        args = getAllCredentialSummaryForGateway_args()
+        args.type = type
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getAllCredentialSummaryForGateway(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getAllCredentialSummaryForGateway_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllCredentialSummaryForGateway failed: unknown result")
+
+    def getAllCredentialSummaryForUserInGateway(self, type, gatewayId, userId):
+        """
+        Parameters:
+         - type
+         - gatewayId
+         - userId
+        """
+        self.send_getAllCredentialSummaryForUserInGateway(type, gatewayId, userId)
+        return self.recv_getAllCredentialSummaryForUserInGateway()
+
+    def send_getAllCredentialSummaryForUserInGateway(self, type, gatewayId, userId):
+        self._oprot.writeMessageBegin('getAllCredentialSummaryForUserInGateway', TMessageType.CALL, self._seqid)
+        args = getAllCredentialSummaryForUserInGateway_args()
+        args.type = type
+        args.gatewayId = gatewayId
+        args.userId = userId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getAllCredentialSummaryForUserInGateway(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getAllCredentialSummaryForUserInGateway_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllCredentialSummaryForUserInGateway failed: unknown result")
+
+    def getAllPWDCredentialsForGateway(self, gatewayId):
+        """
+        Parameters:
+         - gatewayId
+        """
+        self.send_getAllPWDCredentialsForGateway(gatewayId)
+        return self.recv_getAllPWDCredentialsForGateway()
+
+    def send_getAllPWDCredentialsForGateway(self, gatewayId):
+        self._oprot.writeMessageBegin('getAllPWDCredentialsForGateway', TMessageType.CALL, self._seqid)
+        args = getAllPWDCredentialsForGateway_args()
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getAllPWDCredentialsForGateway(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getAllPWDCredentialsForGateway_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllPWDCredentialsForGateway failed: unknown result")
+
+    def deleteSSHCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_deleteSSHCredential(tokenId, gatewayId)
+        return self.recv_deleteSSHCredential()
+
+    def send_deleteSSHCredential(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('deleteSSHCredential', TMessageType.CALL, self._seqid)
+        args = deleteSSHCredential_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_deleteSSHCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = deleteSSHCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "deleteSSHCredential failed: unknown result")
+
+    def deletePWDCredential(self, tokenId, gatewayId):
+        """
+        Parameters:
+         - tokenId
+         - gatewayId
+        """
+        self.send_deletePWDCredential(tokenId, gatewayId)
+        return self.recv_deletePWDCredential()
+
+    def send_deletePWDCredential(self, tokenId, gatewayId):
+        self._oprot.writeMessageBegin('deletePWDCredential', TMessageType.CALL, self._seqid)
+        args = deletePWDCredential_args()
+        args.tokenId = tokenId
+        args.gatewayId = gatewayId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_deletePWDCredential(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = deletePWDCredential_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.csException is not None:
+            raise result.csException
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "deletePWDCredential failed: unknown result")
+
+
+class Processor(airavata.base.api.BaseAPI.Processor, Iface, TProcessor):
+    def __init__(self, handler):
+        airavata.base.api.BaseAPI.Processor.__init__(self, handler)
+        self._processMap["getCredentialSummary"] = Processor.process_getCredentialSummary
+        self._processMap["getAllCredentialSummaries"] = Processor.process_getAllCredentialSummaries
+        self._processMap["addSSHCredential"] = Processor.process_addSSHCredential
+        self._processMap["addCertificateCredential"] = Processor.process_addCertificateCredential
+        self._processMap["addPasswordCredential"] = Processor.process_addPasswordCredential
+        self._processMap["getSSHCredential"] = Processor.process_getSSHCredential
+        self._processMap["getCertificateCredential"] = Processor.process_getCertificateCredential
+        self._processMap["getPasswordCredential"] = Processor.process_getPasswordCredential
+        self._processMap["getAllCredentialSummaryForGateway"] = Processor.process_getAllCredentialSummaryForGateway
+        self._processMap["getAllCredentialSummaryForUserInGateway"] = Processor.process_getAllCredentialSummaryForUserInGateway
+        self._processMap["getAllPWDCredentialsForGateway"] = Processor.process_getAllPWDCredentialsForGateway
+        self._processMap["deleteSSHCredential"] = Processor.process_deleteSSHCredential
+        self._processMap["deletePWDCredential"] = Processor.process_deletePWDCredential
+
+    def process(self, iprot, oprot):
+        (name, type, seqid) = iprot.readMessageBegin()
+        if name not in self._processMap:
+            iprot.skip(TType.STRUCT)
+            iprot.readMessageEnd()
+            x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name))
+            oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)
+            x.write(oprot)
+            oprot.writeMessageEnd()
+            oprot.trans.flush()
+            return
+        else:
+            self._processMap[name](self, seqid, iprot, oprot)
+        return True
+
+    def process_getCredentialSummary(self, seqid, iprot, oprot):
+        args = getCredentialSummary_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getCredentialSummary_result()
+        try:
+            result.success = self._handler.getCredentialSummary(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getCredentialSummary", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getAllCredentialSummaries(self, seqid, iprot, oprot):
+        args = getAllCredentialSummaries_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getAllCredentialSummaries_result()
+        try:
+            result.success = self._handler.getAllCredentialSummaries(args.type, args.accessibleTokenIds, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getAllCredentialSummaries", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_addSSHCredential(self, seqid, iprot, oprot):
+        args = addSSHCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = addSSHCredential_result()
+        try:
+            result.success = self._handler.addSSHCredential(args.sshCredential)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("addSSHCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_addCertificateCredential(self, seqid, iprot, oprot):
+        args = addCertificateCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = addCertificateCredential_result()
+        try:
+            result.success = self._handler.addCertificateCredential(args.certificateCredential)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("addCertificateCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_addPasswordCredential(self, seqid, iprot, oprot):
+        args = addPasswordCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = addPasswordCredential_result()
+        try:
+            result.success = self._handler.addPasswordCredential(args.passwordCredential)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("addPasswordCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getSSHCredential(self, seqid, iprot, oprot):
+        args = getSSHCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getSSHCredential_result()
+        try:
+            result.success = self._handler.getSSHCredential(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getSSHCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getCertificateCredential(self, seqid, iprot, oprot):
+        args = getCertificateCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getCertificateCredential_result()
+        try:
+            result.success = self._handler.getCertificateCredential(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getCertificateCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getPasswordCredential(self, seqid, iprot, oprot):
+        args = getPasswordCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getPasswordCredential_result()
+        try:
+            result.success = self._handler.getPasswordCredential(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getPasswordCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getAllCredentialSummaryForGateway(self, seqid, iprot, oprot):
+        args = getAllCredentialSummaryForGateway_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getAllCredentialSummaryForGateway_result()
+        try:
+            result.success = self._handler.getAllCredentialSummaryForGateway(args.type, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getAllCredentialSummaryForGateway", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getAllCredentialSummaryForUserInGateway(self, seqid, iprot, oprot):
+        args = getAllCredentialSummaryForUserInGateway_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getAllCredentialSummaryForUserInGateway_result()
+        try:
+            result.success = self._handler.getAllCredentialSummaryForUserInGateway(args.type, args.gatewayId, args.userId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getAllCredentialSummaryForUserInGateway", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getAllPWDCredentialsForGateway(self, seqid, iprot, oprot):
+        args = getAllPWDCredentialsForGateway_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getAllPWDCredentialsForGateway_result()
+        try:
+            result.success = self._handler.getAllPWDCredentialsForGateway(args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getAllPWDCredentialsForGateway", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_deleteSSHCredential(self, seqid, iprot, oprot):
+        args = deleteSSHCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = deleteSSHCredential_result()
+        try:
+            result.success = self._handler.deleteSSHCredential(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("deleteSSHCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_deletePWDCredential(self, seqid, iprot, oprot):
+        args = deletePWDCredential_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = deletePWDCredential_result()
+        try:
+            result.success = self._handler.deletePWDCredential(args.tokenId, args.gatewayId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.credential.store.error.ttypes.CredentialStoreException as csException:
+            msg_type = TMessageType.REPLY
+            result.csException = csException
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("deletePWDCredential", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+# HELPER FUNCTIONS AND STRUCTURES
+
+
+class getCredentialSummary_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getCredentialSummary_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getCredentialSummary_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRUCT, 'success', (airavata.model.credential.store.ttypes.CredentialSummary, airavata.model.credential.store.ttypes.CredentialSummary.thrift_spec), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRUCT:
+                    self.success = airavata.model.credential.store.ttypes.CredentialSummary()
+                    self.success.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getCredentialSummary_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRUCT, 0)
+            self.success.write(oprot)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaries_args(object):
+    """
+    Attributes:
+     - type
+     - accessibleTokenIds
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.I32, 'type', None, None, ),  # 1
+        (2, TType.LIST, 'accessibleTokenIds', (TType.STRING, 'UTF8', False), None, ),  # 2
+        (3, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 3
+    )
+
+    def __init__(self, type=None, accessibleTokenIds=None, gatewayId=None,):
+        self.type = type
+        self.accessibleTokenIds = accessibleTokenIds
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.I32:
+                    self.type = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.LIST:
+                    self.accessibleTokenIds = []
+                    (_etype3, _size0) = iprot.readListBegin()
+                    for _i4 in range(_size0):
+                        _elem5 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.accessibleTokenIds.append(_elem5)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaries_args')
+        if self.type is not None:
+            oprot.writeFieldBegin('type', TType.I32, 1)
+            oprot.writeI32(self.type)
+            oprot.writeFieldEnd()
+        if self.accessibleTokenIds is not None:
+            oprot.writeFieldBegin('accessibleTokenIds', TType.LIST, 2)
+            oprot.writeListBegin(TType.STRING, len(self.accessibleTokenIds))
+            for iter6 in self.accessibleTokenIds:
+                oprot.writeString(iter6.encode('utf-8') if sys.version_info[0] == 2 else iter6)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 3)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.type is None:
+            raise TProtocolException(message='Required field type is unset!')
+        if self.accessibleTokenIds is None:
+            raise TProtocolException(message='Required field accessibleTokenIds is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaries_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.credential.store.ttypes.CredentialSummary, airavata.model.credential.store.ttypes.CredentialSummary.thrift_spec), False), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.LIST:
+                    self.success = []
+                    (_etype10, _size7) = iprot.readListBegin()
+                    for _i11 in range(_size7):
+                        _elem12 = airavata.model.credential.store.ttypes.CredentialSummary()
+                        _elem12.read(iprot)
+                        self.success.append(_elem12)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaries_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.LIST, 0)
+            oprot.writeListBegin(TType.STRUCT, len(self.success))
+            for iter13 in self.success:
+                iter13.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addSSHCredential_args(object):
+    """
+    Attributes:
+     - sshCredential
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRUCT, 'sshCredential', (airavata.model.credential.store.ttypes.SSHCredential, airavata.model.credential.store.ttypes.SSHCredential.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, sshCredential=None,):
+        self.sshCredential = sshCredential
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRUCT:
+                    self.sshCredential = airavata.model.credential.store.ttypes.SSHCredential()
+                    self.sshCredential.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addSSHCredential_args')
+        if self.sshCredential is not None:
+            oprot.writeFieldBegin('sshCredential', TType.STRUCT, 1)
+            self.sshCredential.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.sshCredential is None:
+            raise TProtocolException(message='Required field sshCredential is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addSSHCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRING:
+                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addSSHCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRING, 0)
+            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addCertificateCredential_args(object):
+    """
+    Attributes:
+     - certificateCredential
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRUCT, 'certificateCredential', (airavata.model.credential.store.ttypes.CertificateCredential, airavata.model.credential.store.ttypes.CertificateCredential.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, certificateCredential=None,):
+        self.certificateCredential = certificateCredential
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRUCT:
+                    self.certificateCredential = airavata.model.credential.store.ttypes.CertificateCredential()
+                    self.certificateCredential.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addCertificateCredential_args')
+        if self.certificateCredential is not None:
+            oprot.writeFieldBegin('certificateCredential', TType.STRUCT, 1)
+            self.certificateCredential.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.certificateCredential is None:
+            raise TProtocolException(message='Required field certificateCredential is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addCertificateCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRING:
+                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addCertificateCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRING, 0)
+            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addPasswordCredential_args(object):
+    """
+    Attributes:
+     - passwordCredential
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRUCT, 'passwordCredential', (airavata.model.credential.store.ttypes.PasswordCredential, airavata.model.credential.store.ttypes.PasswordCredential.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, passwordCredential=None,):
+        self.passwordCredential = passwordCredential
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRUCT:
+                    self.passwordCredential = airavata.model.credential.store.ttypes.PasswordCredential()
+                    self.passwordCredential.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addPasswordCredential_args')
+        if self.passwordCredential is not None:
+            oprot.writeFieldBegin('passwordCredential', TType.STRUCT, 1)
+            self.passwordCredential.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.passwordCredential is None:
+            raise TProtocolException(message='Required field passwordCredential is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class addPasswordCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRING:
+                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('addPasswordCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRING, 0)
+            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getSSHCredential_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getSSHCredential_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getSSHCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRUCT, 'success', (airavata.model.credential.store.ttypes.SSHCredential, airavata.model.credential.store.ttypes.SSHCredential.thrift_spec), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRUCT:
+                    self.success = airavata.model.credential.store.ttypes.SSHCredential()
+                    self.success.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getSSHCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRUCT, 0)
+            self.success.write(oprot)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getCertificateCredential_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getCertificateCredential_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getCertificateCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRUCT, 'success', (airavata.model.credential.store.ttypes.CertificateCredential, airavata.model.credential.store.ttypes.CertificateCredential.thrift_spec), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRUCT:
+                    self.success = airavata.model.credential.store.ttypes.CertificateCredential()
+                    self.success.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getCertificateCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRUCT, 0)
+            self.success.write(oprot)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getPasswordCredential_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getPasswordCredential_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getPasswordCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.STRUCT, 'success', (airavata.model.credential.store.ttypes.PasswordCredential, airavata.model.credential.store.ttypes.PasswordCredential.thrift_spec), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRUCT:
+                    self.success = airavata.model.credential.store.ttypes.PasswordCredential()
+                    self.success.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getPasswordCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRUCT, 0)
+            self.success.write(oprot)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaryForGateway_args(object):
+    """
+    Attributes:
+     - type
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.I32, 'type', None, None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, type=None, gatewayId=None,):
+        self.type = type
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.I32:
+                    self.type = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaryForGateway_args')
+        if self.type is not None:
+            oprot.writeFieldBegin('type', TType.I32, 1)
+            oprot.writeI32(self.type)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.type is None:
+            raise TProtocolException(message='Required field type is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaryForGateway_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.credential.store.ttypes.CredentialSummary, airavata.model.credential.store.ttypes.CredentialSummary.thrift_spec), False), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.LIST:
+                    self.success = []
+                    (_etype17, _size14) = iprot.readListBegin()
+                    for _i18 in range(_size14):
+                        _elem19 = airavata.model.credential.store.ttypes.CredentialSummary()
+                        _elem19.read(iprot)
+                        self.success.append(_elem19)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaryForGateway_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.LIST, 0)
+            oprot.writeListBegin(TType.STRUCT, len(self.success))
+            for iter20 in self.success:
+                iter20.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaryForUserInGateway_args(object):
+    """
+    Attributes:
+     - type
+     - gatewayId
+     - userId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.I32, 'type', None, None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+        (3, TType.STRING, 'userId', 'UTF8', None, ),  # 3
+    )
+
+    def __init__(self, type=None, gatewayId=None, userId=None,):
+        self.type = type
+        self.gatewayId = gatewayId
+        self.userId = userId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.I32:
+                    self.type = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRING:
+                    self.userId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaryForUserInGateway_args')
+        if self.type is not None:
+            oprot.writeFieldBegin('type', TType.I32, 1)
+            oprot.writeI32(self.type)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        if self.userId is not None:
+            oprot.writeFieldBegin('userId', TType.STRING, 3)
+            oprot.writeString(self.userId.encode('utf-8') if sys.version_info[0] == 2 else self.userId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.type is None:
+            raise TProtocolException(message='Required field type is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        if self.userId is None:
+            raise TProtocolException(message='Required field userId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllCredentialSummaryForUserInGateway_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.credential.store.ttypes.CredentialSummary, airavata.model.credential.store.ttypes.CredentialSummary.thrift_spec), False), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.LIST:
+                    self.success = []
+                    (_etype24, _size21) = iprot.readListBegin()
+                    for _i25 in range(_size21):
+                        _elem26 = airavata.model.credential.store.ttypes.CredentialSummary()
+                        _elem26.read(iprot)
+                        self.success.append(_elem26)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllCredentialSummaryForUserInGateway_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.LIST, 0)
+            oprot.writeListBegin(TType.STRUCT, len(self.success))
+            for iter27 in self.success:
+                iter27.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllPWDCredentialsForGateway_args(object):
+    """
+    Attributes:
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 1
+    )
+
+    def __init__(self, gatewayId=None,):
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllPWDCredentialsForGateway_args')
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 1)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getAllPWDCredentialsForGateway_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.MAP, 'success', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.MAP:
+                    self.success = {}
+                    (_ktype29, _vtype30, _size28) = iprot.readMapBegin()
+                    for _i32 in range(_size28):
+                        _key33 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        _val34 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.success[_key33] = _val34
+                    iprot.readMapEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getAllPWDCredentialsForGateway_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.MAP, 0)
+            oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.success))
+            for kiter35, viter36 in self.success.items():
+                oprot.writeString(kiter35.encode('utf-8') if sys.version_info[0] == 2 else kiter35)
+                oprot.writeString(viter36.encode('utf-8') if sys.version_info[0] == 2 else viter36)
+            oprot.writeMapEnd()
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class deleteSSHCredential_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('deleteSSHCredential_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class deleteSSHCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.BOOL, 'success', None, None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.BOOL:
+                    self.success = iprot.readBool()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('deleteSSHCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.BOOL, 0)
+            oprot.writeBool(self.success)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class deletePWDCredential_args(object):
+    """
+    Attributes:
+     - tokenId
+     - gatewayId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'tokenId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'gatewayId', 'UTF8', None, ),  # 2
+    )
+
+    def __init__(self, tokenId=None, gatewayId=None,):
+        self.tokenId = tokenId
+        self.gatewayId = gatewayId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.tokenId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.gatewayId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('deletePWDCredential_args')
+        if self.tokenId is not None:
+            oprot.writeFieldBegin('tokenId', TType.STRING, 1)
+            oprot.writeString(self.tokenId.encode('utf-8') if sys.version_info[0] == 2 else self.tokenId)
+            oprot.writeFieldEnd()
+        if self.gatewayId is not None:
+            oprot.writeFieldBegin('gatewayId', TType.STRING, 2)
+            oprot.writeString(self.gatewayId.encode('utf-8') if sys.version_info[0] == 2 else self.gatewayId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.tokenId is None:
+            raise TProtocolException(message='Required field tokenId is unset!')
+        if self.gatewayId is None:
+            raise TProtocolException(message='Required field gatewayId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class deletePWDCredential_result(object):
+    """
+    Attributes:
+     - success
+     - csException
+    """
+
+    thrift_spec = (
+        (0, TType.BOOL, 'success', None, None, ),  # 0
+        (1, TType.STRUCT, 'csException', (airavata.api.credential.store.error.ttypes.CredentialStoreException, airavata.api.credential.store.error.ttypes.CredentialStoreException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, csException=None,):
+        self.success = success
+        self.csException = csException
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.BOOL:
+                    self.success = iprot.readBool()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.csException = airavata.api.credential.store.error.ttypes.CredentialStoreException()
+                    self.csException.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('deletePWDCredential_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.BOOL, 0)
+            oprot.writeBool(self.success)
+            oprot.writeFieldEnd()
+        if self.csException is not None:
+            oprot.writeFieldBegin('csException', TType.STRUCT, 1)
+            self.csException.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
diff --git a/airavata/api/credential/store/__init__.py b/airavata/api/credential/store/__init__.py
new file mode 100644
index 0000000..5d704d6
--- /dev/null
+++ b/airavata/api/credential/store/__init__.py
@@ -0,0 +1 @@
+__all__ = ['ttypes', 'constants', 'CredentialStoreService']
diff --git a/airavata/api/credential/store/constants.py b/airavata/api/credential/store/constants.py
new file mode 100644
index 0000000..6cfae29
--- /dev/null
+++ b/airavata/api/credential/store/constants.py
@@ -0,0 +1,13 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+from .ttypes import *
+CS_CPI_VERSION = "0.18.0"
diff --git a/airavata/api/credential/store/error/__init__.py b/airavata/api/credential/store/error/__init__.py
new file mode 100644
index 0000000..adefd8e
--- /dev/null
+++ b/airavata/api/credential/store/error/__init__.py
@@ -0,0 +1 @@
+__all__ = ['ttypes', 'constants']
diff --git a/airavata/api/credential/store/error/constants.py b/airavata/api/credential/store/error/constants.py
new file mode 100644
index 0000000..eb0d35a
--- /dev/null
+++ b/airavata/api/credential/store/error/constants.py
@@ -0,0 +1,12 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+from .ttypes import *
diff --git a/airavata/api/credential/store/error/ttypes.py b/airavata/api/credential/store/error/ttypes.py
new file mode 100644
index 0000000..87f6b46
--- /dev/null
+++ b/airavata/api/credential/store/error/ttypes.py
@@ -0,0 +1,78 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+
+from thrift.transport import TTransport
+
+
+class CredentialStoreException(TException):
+    """
+    Attributes:
+     - message
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'message', 'UTF8', None, ),  # 1
+    )
+
+    def __init__(self, message=None,):
+        self.message = message
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.message = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('CredentialStoreException')
+        if self.message is not None:
+            oprot.writeFieldBegin('message', TType.STRING, 1)
+            oprot.writeString(self.message.encode('utf-8') if sys.version_info[0] == 2 else self.message)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.message is None:
+            raise TProtocolException(message='Required field message is unset!')
+        return
+
+    def __str__(self):
+        return repr(self)
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
diff --git a/airavata/api/credential/store/ttypes.py b/airavata/api/credential/store/ttypes.py
new file mode 100644
index 0000000..ef69474
--- /dev/null
+++ b/airavata/api/credential/store/ttypes.py
@@ -0,0 +1,16 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+import airavata.model.credential.store.ttypes
+import airavata.api.credential.store.error.ttypes
+import airavata.base.api.ttypes
+
+from thrift.transport import TTransport
diff --git a/airavata/model/appcatalog/groupresourceprofile/ttypes.py b/airavata/model/appcatalog/groupresourceprofile/ttypes.py
index e2841da..61df7f6 100644
--- a/airavata/model/appcatalog/groupresourceprofile/ttypes.py
+++ b/airavata/model/appcatalog/groupresourceprofile/ttypes.py
@@ -118,6 +118,132 @@
         return not (self == other)
 
 
+class ComputeResourceReservation(object):
+    """
+    Attributes:
+     - reservationId
+     - reservationName
+     - queueNames
+     - startTime
+     - endTime
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'reservationId', 'UTF8', "DO_NOT_SET_AT_CLIENTS", ),  # 1
+        (2, TType.STRING, 'reservationName', 'UTF8', None, ),  # 2
+        (3, TType.LIST, 'queueNames', (TType.STRING, 'UTF8', False), None, ),  # 3
+        (4, TType.I64, 'startTime', None, None, ),  # 4
+        (5, TType.I64, 'endTime', None, None, ),  # 5
+    )
+
+    def __init__(self, reservationId=thrift_spec[1][4], reservationName=None, queueNames=None, startTime=None, endTime=None,):
+        self.reservationId = reservationId
+        self.reservationName = reservationName
+        self.queueNames = queueNames
+        self.startTime = startTime
+        self.endTime = endTime
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.reservationId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.reservationName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.LIST:
+                    self.queueNames = []
+                    (_etype3, _size0) = iprot.readListBegin()
+                    for _i4 in range(_size0):
+                        _elem5 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.queueNames.append(_elem5)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.I64:
+                    self.startTime = iprot.readI64()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 5:
+                if ftype == TType.I64:
+                    self.endTime = iprot.readI64()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('ComputeResourceReservation')
+        if self.reservationId is not None:
+            oprot.writeFieldBegin('reservationId', TType.STRING, 1)
+            oprot.writeString(self.reservationId.encode('utf-8') if sys.version_info[0] == 2 else self.reservationId)
+            oprot.writeFieldEnd()
+        if self.reservationName is not None:
+            oprot.writeFieldBegin('reservationName', TType.STRING, 2)
+            oprot.writeString(self.reservationName.encode('utf-8') if sys.version_info[0] == 2 else self.reservationName)
+            oprot.writeFieldEnd()
+        if self.queueNames is not None:
+            oprot.writeFieldBegin('queueNames', TType.LIST, 3)
+            oprot.writeListBegin(TType.STRING, len(self.queueNames))
+            for iter6 in self.queueNames:
+                oprot.writeString(iter6.encode('utf-8') if sys.version_info[0] == 2 else iter6)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.startTime is not None:
+            oprot.writeFieldBegin('startTime', TType.I64, 4)
+            oprot.writeI64(self.startTime)
+            oprot.writeFieldEnd()
+        if self.endTime is not None:
+            oprot.writeFieldBegin('endTime', TType.I64, 5)
+            oprot.writeI64(self.endTime)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.reservationId is None:
+            raise TProtocolException(message='Required field reservationId is unset!')
+        if self.reservationName is None:
+            raise TProtocolException(message='Required field reservationName is unset!')
+        if self.queueNames is None:
+            raise TProtocolException(message='Required field queueNames is unset!')
+        if self.startTime is None:
+            raise TProtocolException(message='Required field startTime is unset!')
+        if self.endTime is None:
+            raise TProtocolException(message='Required field endTime is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
 class GroupComputeResourcePreference(object):
     """
     Attributes:
@@ -133,12 +259,10 @@
      - resourceSpecificCredentialStoreToken
      - usageReportingGatewayId
      - qualityOfService
-     - reservation
-     - reservationStartTime
-     - reservationEndTime
      - sshAccountProvisioner
      - groupSSHAccountProvisionerConfigs
      - sshAccountProvisionerAdditionalInfo
+     - reservations
     """
 
     thrift_spec = (
@@ -155,15 +279,16 @@
         (10, TType.STRING, 'resourceSpecificCredentialStoreToken', 'UTF8', None, ),  # 10
         (11, TType.STRING, 'usageReportingGatewayId', 'UTF8', None, ),  # 11
         (12, TType.STRING, 'qualityOfService', 'UTF8', None, ),  # 12
-        (13, TType.STRING, 'reservation', 'UTF8', None, ),  # 13
-        (14, TType.I64, 'reservationStartTime', None, None, ),  # 14
-        (15, TType.I64, 'reservationEndTime', None, None, ),  # 15
+        None,  # 13
+        None,  # 14
+        None,  # 15
         (16, TType.STRING, 'sshAccountProvisioner', 'UTF8', None, ),  # 16
         (17, TType.LIST, 'groupSSHAccountProvisionerConfigs', (TType.STRUCT, (GroupAccountSSHProvisionerConfig, GroupAccountSSHProvisionerConfig.thrift_spec), False), None, ),  # 17
         (18, TType.STRING, 'sshAccountProvisionerAdditionalInfo', 'UTF8', None, ),  # 18
+        (19, TType.LIST, 'reservations', (TType.STRUCT, (ComputeResourceReservation, ComputeResourceReservation.thrift_spec), False), None, ),  # 19
     )
 
-    def __init__(self, computeResourceId=None, groupResourceProfileId=thrift_spec[2][4], overridebyAiravata=thrift_spec[3][4], loginUserName=None, preferredJobSubmissionProtocol=None, preferredDataMovementProtocol=None, preferredBatchQueue=None, scratchLocation=None, allocationProjectNumber=None, resourceSpecificCredentialStoreToken=None, usageReportingGatewayId=None, qualityOfService=None, reservation=None, reservationStartTime=None, reservationEndTime=None, sshAccountProvisioner=None, groupSSHAccountProvisionerConfigs=None, sshAccountProvisionerAdditionalInfo=None,):
+    def __init__(self, computeResourceId=None, groupResourceProfileId=thrift_spec[2][4], overridebyAiravata=thrift_spec[3][4], loginUserName=None, preferredJobSubmissionProtocol=None, preferredDataMovementProtocol=None, preferredBatchQueue=None, scratchLocation=None, allocationProjectNumber=None, resourceSpecificCredentialStoreToken=None, usageReportingGatewayId=None, qualityOfService=None, sshAccountProvisioner=None, groupSSHAccountProvisionerConfigs=None, sshAccountProvisionerAdditionalInfo=None, reservations=None,):
         self.computeResourceId = computeResourceId
         self.groupResourceProfileId = groupResourceProfileId
         self.overridebyAiravata = overridebyAiravata
@@ -176,12 +301,10 @@
         self.resourceSpecificCredentialStoreToken = resourceSpecificCredentialStoreToken
         self.usageReportingGatewayId = usageReportingGatewayId
         self.qualityOfService = qualityOfService
-        self.reservation = reservation
-        self.reservationStartTime = reservationStartTime
-        self.reservationEndTime = reservationEndTime
         self.sshAccountProvisioner = sshAccountProvisioner
         self.groupSSHAccountProvisionerConfigs = groupSSHAccountProvisionerConfigs
         self.sshAccountProvisionerAdditionalInfo = sshAccountProvisionerAdditionalInfo
+        self.reservations = reservations
 
     def read(self, iprot):
         if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
@@ -252,21 +375,6 @@
                     self.qualityOfService = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                 else:
                     iprot.skip(ftype)
-            elif fid == 13:
-                if ftype == TType.STRING:
-                    self.reservation = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
-                else:
-                    iprot.skip(ftype)
-            elif fid == 14:
-                if ftype == TType.I64:
-                    self.reservationStartTime = iprot.readI64()
-                else:
-                    iprot.skip(ftype)
-            elif fid == 15:
-                if ftype == TType.I64:
-                    self.reservationEndTime = iprot.readI64()
-                else:
-                    iprot.skip(ftype)
             elif fid == 16:
                 if ftype == TType.STRING:
                     self.sshAccountProvisioner = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
@@ -275,11 +383,11 @@
             elif fid == 17:
                 if ftype == TType.LIST:
                     self.groupSSHAccountProvisionerConfigs = []
-                    (_etype3, _size0) = iprot.readListBegin()
-                    for _i4 in range(_size0):
-                        _elem5 = GroupAccountSSHProvisionerConfig()
-                        _elem5.read(iprot)
-                        self.groupSSHAccountProvisionerConfigs.append(_elem5)
+                    (_etype10, _size7) = iprot.readListBegin()
+                    for _i11 in range(_size7):
+                        _elem12 = GroupAccountSSHProvisionerConfig()
+                        _elem12.read(iprot)
+                        self.groupSSHAccountProvisionerConfigs.append(_elem12)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -288,6 +396,17 @@
                     self.sshAccountProvisionerAdditionalInfo = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                 else:
                     iprot.skip(ftype)
+            elif fid == 19:
+                if ftype == TType.LIST:
+                    self.reservations = []
+                    (_etype16, _size13) = iprot.readListBegin()
+                    for _i17 in range(_size13):
+                        _elem18 = ComputeResourceReservation()
+                        _elem18.read(iprot)
+                        self.reservations.append(_elem18)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
             else:
                 iprot.skip(ftype)
             iprot.readFieldEnd()
@@ -346,18 +465,6 @@
             oprot.writeFieldBegin('qualityOfService', TType.STRING, 12)
             oprot.writeString(self.qualityOfService.encode('utf-8') if sys.version_info[0] == 2 else self.qualityOfService)
             oprot.writeFieldEnd()
-        if self.reservation is not None:
-            oprot.writeFieldBegin('reservation', TType.STRING, 13)
-            oprot.writeString(self.reservation.encode('utf-8') if sys.version_info[0] == 2 else self.reservation)
-            oprot.writeFieldEnd()
-        if self.reservationStartTime is not None:
-            oprot.writeFieldBegin('reservationStartTime', TType.I64, 14)
-            oprot.writeI64(self.reservationStartTime)
-            oprot.writeFieldEnd()
-        if self.reservationEndTime is not None:
-            oprot.writeFieldBegin('reservationEndTime', TType.I64, 15)
-            oprot.writeI64(self.reservationEndTime)
-            oprot.writeFieldEnd()
         if self.sshAccountProvisioner is not None:
             oprot.writeFieldBegin('sshAccountProvisioner', TType.STRING, 16)
             oprot.writeString(self.sshAccountProvisioner.encode('utf-8') if sys.version_info[0] == 2 else self.sshAccountProvisioner)
@@ -365,14 +472,21 @@
         if self.groupSSHAccountProvisionerConfigs is not None:
             oprot.writeFieldBegin('groupSSHAccountProvisionerConfigs', TType.LIST, 17)
             oprot.writeListBegin(TType.STRUCT, len(self.groupSSHAccountProvisionerConfigs))
-            for iter6 in self.groupSSHAccountProvisionerConfigs:
-                iter6.write(oprot)
+            for iter19 in self.groupSSHAccountProvisionerConfigs:
+                iter19.write(oprot)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.sshAccountProvisionerAdditionalInfo is not None:
             oprot.writeFieldBegin('sshAccountProvisionerAdditionalInfo', TType.STRING, 18)
             oprot.writeString(self.sshAccountProvisionerAdditionalInfo.encode('utf-8') if sys.version_info[0] == 2 else self.sshAccountProvisionerAdditionalInfo)
             oprot.writeFieldEnd()
+        if self.reservations is not None:
+            oprot.writeFieldBegin('reservations', TType.LIST, 19)
+            oprot.writeListBegin(TType.STRUCT, len(self.reservations))
+            for iter20 in self.reservations:
+                iter20.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
         oprot.writeFieldStop()
         oprot.writeStructEnd()
 
@@ -447,10 +561,10 @@
             elif fid == 4:
                 if ftype == TType.LIST:
                     self.allowedBatchQueues = []
-                    (_etype10, _size7) = iprot.readListBegin()
-                    for _i11 in range(_size7):
-                        _elem12 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
-                        self.allowedBatchQueues.append(_elem12)
+                    (_etype24, _size21) = iprot.readListBegin()
+                    for _i25 in range(_size21):
+                        _elem26 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.allowedBatchQueues.append(_elem26)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -479,8 +593,8 @@
         if self.allowedBatchQueues is not None:
             oprot.writeFieldBegin('allowedBatchQueues', TType.LIST, 4)
             oprot.writeListBegin(TType.STRING, len(self.allowedBatchQueues))
-            for iter13 in self.allowedBatchQueues:
-                oprot.writeString(iter13.encode('utf-8') if sys.version_info[0] == 2 else iter13)
+            for iter27 in self.allowedBatchQueues:
+                oprot.writeString(iter27.encode('utf-8') if sys.version_info[0] == 2 else iter27)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         oprot.writeFieldStop()
@@ -730,33 +844,33 @@
             elif fid == 4:
                 if ftype == TType.LIST:
                     self.computePreferences = []
-                    (_etype17, _size14) = iprot.readListBegin()
-                    for _i18 in range(_size14):
-                        _elem19 = GroupComputeResourcePreference()
-                        _elem19.read(iprot)
-                        self.computePreferences.append(_elem19)
+                    (_etype31, _size28) = iprot.readListBegin()
+                    for _i32 in range(_size28):
+                        _elem33 = GroupComputeResourcePreference()
+                        _elem33.read(iprot)
+                        self.computePreferences.append(_elem33)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
             elif fid == 5:
                 if ftype == TType.LIST:
                     self.computeResourcePolicies = []
-                    (_etype23, _size20) = iprot.readListBegin()
-                    for _i24 in range(_size20):
-                        _elem25 = ComputeResourcePolicy()
-                        _elem25.read(iprot)
-                        self.computeResourcePolicies.append(_elem25)
+                    (_etype37, _size34) = iprot.readListBegin()
+                    for _i38 in range(_size34):
+                        _elem39 = ComputeResourcePolicy()
+                        _elem39.read(iprot)
+                        self.computeResourcePolicies.append(_elem39)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
             elif fid == 6:
                 if ftype == TType.LIST:
                     self.batchQueueResourcePolicies = []
-                    (_etype29, _size26) = iprot.readListBegin()
-                    for _i30 in range(_size26):
-                        _elem31 = BatchQueueResourcePolicy()
-                        _elem31.read(iprot)
-                        self.batchQueueResourcePolicies.append(_elem31)
+                    (_etype43, _size40) = iprot.readListBegin()
+                    for _i44 in range(_size40):
+                        _elem45 = BatchQueueResourcePolicy()
+                        _elem45.read(iprot)
+                        self.batchQueueResourcePolicies.append(_elem45)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -800,22 +914,22 @@
         if self.computePreferences is not None:
             oprot.writeFieldBegin('computePreferences', TType.LIST, 4)
             oprot.writeListBegin(TType.STRUCT, len(self.computePreferences))
-            for iter32 in self.computePreferences:
-                iter32.write(oprot)
+            for iter46 in self.computePreferences:
+                iter46.write(oprot)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.computeResourcePolicies is not None:
             oprot.writeFieldBegin('computeResourcePolicies', TType.LIST, 5)
             oprot.writeListBegin(TType.STRUCT, len(self.computeResourcePolicies))
-            for iter33 in self.computeResourcePolicies:
-                iter33.write(oprot)
+            for iter47 in self.computeResourcePolicies:
+                iter47.write(oprot)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.batchQueueResourcePolicies is not None:
             oprot.writeFieldBegin('batchQueueResourcePolicies', TType.LIST, 6)
             oprot.writeListBegin(TType.STRUCT, len(self.batchQueueResourcePolicies))
-            for iter34 in self.batchQueueResourcePolicies:
-                iter34.write(oprot)
+            for iter48 in self.batchQueueResourcePolicies:
+                iter48.write(oprot)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.creationTime is not None:
diff --git a/airavata/model/application/io/ttypes.py b/airavata/model/application/io/ttypes.py
index 8c9017a..17f1760 100644
--- a/airavata/model/application/io/ttypes.py
+++ b/airavata/model/application/io/ttypes.py
@@ -74,6 +74,8 @@
     metaData:
       Any metadat. This is typically ignore by Airavata and is used by gateways for application configuration.
 
+    overrideFilename:
+      Rename input file to given value when staging to compute resource.
 
     Attributes:
      - name
@@ -89,6 +91,7 @@
      - dataStaged
      - storageResourceId
      - isReadOnly
+     - overrideFilename
     """
 
     thrift_spec = (
@@ -106,9 +109,10 @@
         (11, TType.BOOL, 'dataStaged', None, None, ),  # 11
         (12, TType.STRING, 'storageResourceId', 'UTF8', None, ),  # 12
         (13, TType.BOOL, 'isReadOnly', None, None, ),  # 13
+        (14, TType.STRING, 'overrideFilename', 'UTF8', None, ),  # 14
     )
 
-    def __init__(self, name=None, value=None, type=None, applicationArgument=None, standardInput=None, userFriendlyDescription=None, metaData=None, inputOrder=None, isRequired=None, requiredToAddedToCommandLine=None, dataStaged=None, storageResourceId=None, isReadOnly=None,):
+    def __init__(self, name=None, value=None, type=None, applicationArgument=None, standardInput=None, userFriendlyDescription=None, metaData=None, inputOrder=None, isRequired=None, requiredToAddedToCommandLine=None, dataStaged=None, storageResourceId=None, isReadOnly=None, overrideFilename=None,):
         self.name = name
         self.value = value
         self.type = type
@@ -122,6 +126,7 @@
         self.dataStaged = dataStaged
         self.storageResourceId = storageResourceId
         self.isReadOnly = isReadOnly
+        self.overrideFilename = overrideFilename
 
     def read(self, iprot):
         if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
@@ -197,6 +202,11 @@
                     self.isReadOnly = iprot.readBool()
                 else:
                     iprot.skip(ftype)
+            elif fid == 14:
+                if ftype == TType.STRING:
+                    self.overrideFilename = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
             else:
                 iprot.skip(ftype)
             iprot.readFieldEnd()
@@ -259,6 +269,10 @@
             oprot.writeFieldBegin('isReadOnly', TType.BOOL, 13)
             oprot.writeBool(self.isReadOnly)
             oprot.writeFieldEnd()
+        if self.overrideFilename is not None:
+            oprot.writeFieldBegin('overrideFilename', TType.STRING, 14)
+            oprot.writeString(self.overrideFilename.encode('utf-8') if sys.version_info[0] == 2 else self.overrideFilename)
+            oprot.writeFieldEnd()
         oprot.writeFieldStop()
         oprot.writeStructEnd()
 
diff --git a/airavata/model/sharing/ttypes.py b/airavata/model/sharing/ttypes.py
index 1f2f0e9..661367f 100644
--- a/airavata/model/sharing/ttypes.py
+++ b/airavata/model/sharing/ttypes.py
@@ -190,6 +190,7 @@
     <li>description : A short description for the domain</li>
     <li>createdTime : Will be set by the system</li>
     <li>updatedTime : Will be set by the system</li>
+    <li>initialUserGroupId : New users will automatically be added to this group</li>
 
 
     Attributes:
@@ -198,6 +199,7 @@
      - description
      - createdTime
      - updatedTime
+     - initialUserGroupId
     """
 
     thrift_spec = (
@@ -207,14 +209,16 @@
         (3, TType.STRING, 'description', 'UTF8', None, ),  # 3
         (4, TType.I64, 'createdTime', None, None, ),  # 4
         (5, TType.I64, 'updatedTime', None, None, ),  # 5
+        (6, TType.STRING, 'initialUserGroupId', 'UTF8', None, ),  # 6
     )
 
-    def __init__(self, domainId=thrift_spec[1][4], name=None, description=None, createdTime=None, updatedTime=None,):
+    def __init__(self, domainId=thrift_spec[1][4], name=None, description=None, createdTime=None, updatedTime=None, initialUserGroupId=None,):
         self.domainId = domainId
         self.name = name
         self.description = description
         self.createdTime = createdTime
         self.updatedTime = updatedTime
+        self.initialUserGroupId = initialUserGroupId
 
     def read(self, iprot):
         if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
@@ -250,6 +254,11 @@
                     self.updatedTime = iprot.readI64()
                 else:
                     iprot.skip(ftype)
+            elif fid == 6:
+                if ftype == TType.STRING:
+                    self.initialUserGroupId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
             else:
                 iprot.skip(ftype)
             iprot.readFieldEnd()
@@ -280,6 +289,10 @@
             oprot.writeFieldBegin('updatedTime', TType.I64, 5)
             oprot.writeI64(self.updatedTime)
             oprot.writeFieldEnd()
+        if self.initialUserGroupId is not None:
+            oprot.writeFieldBegin('initialUserGroupId', TType.STRING, 6)
+            oprot.writeString(self.initialUserGroupId.encode('utf-8') if sys.version_info[0] == 2 else self.initialUserGroupId)
+            oprot.writeFieldEnd()
         oprot.writeFieldStop()
         oprot.writeStructEnd()
 
diff --git a/airavata/service/profile/user/cpi/UserProfileService.py b/airavata/service/profile/user/cpi/UserProfileService.py
index ca8b8b0..98f33fb 100644
--- a/airavata/service/profile/user/cpi/UserProfileService.py
+++ b/airavata/service/profile/user/cpi/UserProfileService.py
@@ -31,6 +31,10 @@
 
     def addUserProfile(self, authzToken, userProfile):
         """
+        This method is deprecated and will be removed in future versions of Airavata. Please use
+        the initializeUserProfile method which fetches the information about the user profile from
+        IAM service - @Deprecated
+
         Parameters:
          - authzToken
          - userProfile
@@ -154,6 +158,10 @@
 
     def addUserProfile(self, authzToken, userProfile):
         """
+        This method is deprecated and will be removed in future versions of Airavata. Please use
+        the initializeUserProfile method which fetches the information about the user profile from
+        IAM service - @Deprecated
+
         Parameters:
          - authzToken
          - userProfile
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputePreference.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputePreference.vue
index 794a552..a6bd744 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputePreference.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputePreference.vue
@@ -1,5 +1,5 @@
 <template>
-  <div>
+  <div class="has-fixed-footer">
     <div class="row">
       <div class="col">
         <h1 class="h4 mb-4">
@@ -7,10 +7,9 @@
             v-if="localGroupResourceProfile"
             class="group-resource-profile-name text-muted text-uppercase"
           >
-            <i
-              class="fa fa-server"
-              aria-hidden="true"
-            ></i> {{ localGroupResourceProfile.groupResourceProfileName }}</div>
+            <i class="fa fa-server" aria-hidden="true"></i>
+            {{ localGroupResourceProfile.groupResourceProfileName }}
+          </div>
           {{ computeResource.hostName }}
         </h1>
       </div>
@@ -22,7 +21,9 @@
             <b-form-group
               label="Login Username"
               label-for="login-username"
-              :invalid-feedback="validationFeedback.loginUserName.invalidFeedback"
+              :invalid-feedback="
+                validationFeedback.loginUserName.invalidFeedback
+              "
               :state="validationFeedback.loginUserName.state"
             >
               <b-form-input
@@ -42,16 +43,26 @@
               <ssh-credential-selector
                 v-model="data.resourceSpecificCredentialStoreToken"
                 v-if="localGroupResourceProfile"
-                :null-option-default-credential-token="localGroupResourceProfile.defaultCredentialStoreToken"
-                :null-option-disabled="!localGroupResourceProfile.defaultCredentialStoreToken"
+                :null-option-default-credential-token="
+                  localGroupResourceProfile.defaultCredentialStoreToken
+                "
+                :null-option-disabled="
+                  !localGroupResourceProfile.defaultCredentialStoreToken
+                "
               >
                 <template
                   slot="null-option-label"
                   slot-scope="nullOptionLabelScope"
                 >
                   <span v-if="nullOptionLabelScope.defaultCredentialSummary">
-                    Use the default SSH credential for {{ localGroupResourceProfile.groupResourceProfileName }} ({{
-                    nullOptionLabelScope.defaultCredentialSummary.description }})
+                    Use the default SSH credential for
+                    {{ localGroupResourceProfile.groupResourceProfileName }} ({{
+                      nullOptionLabelScope.defaultCredentialSummary.username
+                    }}
+                    -
+                    {{
+                      nullOptionLabelScope.defaultCredentialSummary.description
+                    }})
                   </span>
                   <span v-else>
                     Select a SSH credential
@@ -73,7 +84,9 @@
             <b-form-group
               label="Scratch Location"
               label-for="scratch-location"
-              :invalid-feedback="validationFeedback.scratchLocation.invalidFeedback"
+              :invalid-feedback="
+                validationFeedback.scratchLocation.invalidFeedback
+              "
               :state="validationFeedback.scratchLocation.state"
             >
               <b-form-input
@@ -104,15 +117,27 @@
                 :key="batchQueue.queueName"
               >
                 <b-form-checkbox
-                  :checked="localComputeResourcePolicy.allowedBatchQueues.includes(batchQueue.queueName)"
+                  :checked="
+                    localComputeResourcePolicy.allowedBatchQueues.includes(
+                      batchQueue.queueName
+                    )
+                  "
                   @input="batchQueueChecked(batchQueue, $event)"
                 >
                   {{ batchQueue.queueName }}
                 </b-form-checkbox>
                 <batch-queue-resource-policy
-                  v-if="localComputeResourcePolicy.allowedBatchQueues.includes(batchQueue.queueName)"
+                  v-if="
+                    localComputeResourcePolicy.allowedBatchQueues.includes(
+                      batchQueue.queueName
+                    )
+                  "
                   :batch-queue="batchQueue"
-                  :value="localBatchQueueResourcePolicies.find(pol => pol.queuename === batchQueue.queueName)"
+                  :value="
+                    localBatchQueueResourcePolicies.find(
+                      pol => pol.queuename === batchQueue.queueName
+                    )
+                  "
                   @input="updatedBatchQueueResourcePolicy(batchQueue, $event)"
                   @valid="recordValidBatchQueueResourcePolicy(batchQueue)"
                   @invalid="recordInvalidBatchQueueResourcePolicy(batchQueue)"
@@ -124,24 +149,35 @@
       </div>
     </div>
     <div class="row">
-      <div class="col d-flex justify-content-end">
-        <b-button
-          variant="primary"
-          @click="save"
-          :disabled="!valid"
-        >Save</b-button>
-        <b-button
-          class="ml-2"
-          variant="danger"
-          @click="remove"
-        >Delete</b-button>
-        <b-button
-          class="ml-2"
-          variant="secondary"
-          @click="cancel"
-        >Cancel</b-button>
+      <div class="col">
+        <div class="card">
+          <div class="card-body">
+            <compute-resource-reservation-list
+              :reservations="data.reservations"
+              :queues="queueNames"
+              @added="addReservation"
+              @deleted="deleteReservation"
+              @updated="updateReservation"
+              @valid="reservationsInvalid = false"
+              @invalid="reservationsInvalid = true"
+            />
+          </div>
+        </div>
       </div>
     </div>
+    <div class="fixed-footer">
+      <b-button variant="primary" @click="save" :disabled="!valid"
+        >Save</b-button
+      >
+      <delete-button class="ml-2" @delete="remove">
+        Are you sure you want to remove the preferences for compute resource
+        <strong>{{ computeResource.hostName }}</strong
+        >?
+      </delete-button>
+      <b-button class="ml-2" variant="secondary" @click="cancel"
+        >Cancel</b-button
+      >
+    </div>
   </div>
 </template>
 
@@ -149,19 +185,23 @@
 import DjangoAiravataAPI from "django-airavata-api";
 import BatchQueueResourcePolicy from "./BatchQueueResourcePolicy.vue";
 import SSHCredentialSelector from "../../credentials/SSHCredentialSelector.vue";
+import ComputeResourceReservationList from "./ComputeResourceReservationList";
 
 import { models, services, errors } from "django-airavata-api";
 import {
   mixins,
   notifications,
-  errors as uiErrors
+  errors as uiErrors,
+  components
 } from "django-airavata-common-ui";
 
 export default {
   name: "compute-preference",
   components: {
     BatchQueueResourcePolicy,
-    "ssh-credential-selector": SSHCredentialSelector
+    "delete-button": components.DeleteButton,
+    "ssh-credential-selector": SSHCredentialSelector,
+    ComputeResourceReservationList
   },
   props: {
     id: {
@@ -232,7 +272,8 @@
         jobSubmissionInterfaces: []
       },
       validationErrors: null,
-      invalidBatchQueueResourcePolicies: []
+      invalidBatchQueueResourcePolicies: [],
+      reservationsInvalid: false
     };
   },
   computed: {
@@ -248,13 +289,17 @@
     valid() {
       return (
         this.allowedInvalidBatchQueueResourcePolicies.length === 0 &&
-        Object.keys(this.groupComputeResourceValidation).length === 0
+        Object.keys(this.groupComputeResourceValidation).length === 0 &&
+        !this.reservationsInvalid
       );
     },
     allowedInvalidBatchQueueResourcePolicies() {
       return this.invalidBatchQueueResourcePolicies.filter(queueName =>
         this.localComputeResourcePolicy.allowedBatchQueues.includes(queueName)
       );
+    },
+    queueNames() {
+      return this.computeResource.batchQueues.map(bq => bq.queueName);
     }
   },
   mixins: [mixins.VModelMixin],
@@ -436,6 +481,24 @@
       } else {
         this.$emit("invalid");
       }
+    },
+    addReservation(reservation) {
+      this.data.reservations.push(reservation);
+      this.data.reservations.sort((a, b) =>
+        a.startTime < b.startTime ? -1 : 1
+      );
+    },
+    deleteReservation(reservation) {
+      const reservationIndex = this.data.reservations.findIndex(
+        r => r.key === reservation.key
+      );
+      this.data.reservations.splice(reservationIndex, 1);
+    },
+    updateReservation(reservation) {
+      const reservationIndex = this.data.reservations.findIndex(
+        r => r.key === reservation.key
+      );
+      this.data.reservations.splice(reservationIndex, 1, reservation);
     }
   },
   beforeRouteEnter: function(to, from, next) {
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputeResourceReservationEditor.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputeResourceReservationEditor.vue
new file mode 100644
index 0000000..04b9a93
--- /dev/null
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputeResourceReservationEditor.vue
@@ -0,0 +1,158 @@
+<template>
+  <b-form>
+    <b-form-group
+      label="Reservation name"
+      label-for="reservation-name"
+      :invalid-feedback="nameValidationFeedback"
+      :state="nameValidationState"
+    >
+      <b-form-input
+        id="reservation-name"
+        v-model="data.reservationName"
+        type="text"
+        @input="nameInputBegins = true"
+        :state="nameValidationState"
+      />
+    </b-form-group>
+    <b-form-group
+      label="Start Time"
+      label-for="start-time"
+      :invalid-feedback="getValidationFeedback('startTime')"
+      :state="getValidationState('startTime')"
+    >
+      <datetime
+        id="start-time"
+        type="datetime"
+        :value="startTimeAsString"
+        input-class="form-control"
+        :format="{
+          year: 'numeric',
+          month: '2-digit',
+          day: 'numeric',
+          hour: 'numeric',
+          minute: '2-digit',
+          timeZoneName: 'short'
+        }"
+        :phrases="{ ok: 'Continue', cancel: 'Exit' }"
+        :hour-step="1"
+        :minute-step="30"
+        :week-start="7"
+        use12-hour
+        auto
+        @input="data.startTime = stringToDate($event)"
+      ></datetime>
+    </b-form-group>
+    <b-form-group
+      label="End Time"
+      label-for="end-time"
+      :invalid-feedback="getValidationFeedback('endTime')"
+      :state="getValidationState('endTime')"
+    >
+      <datetime
+        id="end-time"
+        type="datetime"
+        :value="endTimeAsString"
+        :input-class="{
+          'form-control': true,
+          'is-invalid': getValidationState('endTime')
+        }"
+        :format="{
+          year: 'numeric',
+          month: '2-digit',
+          day: 'numeric',
+          hour: 'numeric',
+          minute: '2-digit',
+          timeZoneName: 'short'
+        }"
+        :phrases="{ ok: 'Continue', cancel: 'Exit' }"
+        :hour-step="1"
+        :minute-step="30"
+        :week-start="7"
+        :min-datetime="startTimeAsString"
+        use12-hour
+        auto
+        @input="data.endTime = stringToDate($event)"
+      ></datetime>
+    </b-form-group>
+    <b-form-group
+      label="Queues"
+      label-for="queues"
+      :invalid-feedback="getValidationFeedback('queueNames')"
+      :state="getValidationState('queueNames')"
+    >
+      <b-form-checkbox-group
+        id="queues"
+        v-model="data.queueNames"
+        :options="queueNameOptions"
+        :state="getValidationState('queueNames')"
+      />
+    </b-form-group>
+  </b-form>
+</template>
+
+<script>
+import { mixins, utils } from "django-airavata-common-ui";
+import { Datetime } from "vue-datetime";
+import "vue-datetime/dist/vue-datetime.css";
+
+export default {
+  name: "compute-resource-reservation-editor",
+  mixins: [mixins.VModelMixin],
+  components: {
+    datetime: Datetime
+  },
+  props: {
+    queues: {
+      type: Array,
+      required: true
+    }
+  },
+  data() {
+    return {
+      nameInputBegins: false
+    };
+  },
+  created() {
+    this.$on("input", this.valuesChanged);
+  },
+  computed: {
+    startTimeAsString() {
+      return this.data.startTime.toISOString();
+    },
+    endTimeAsString() {
+      return this.data.endTime.toISOString();
+    },
+    nameValidationFeedback() {
+      return this.getValidationFeedback("reservationName");
+    },
+    nameValidationState() {
+      if (this.nameInputBegins === false) {
+        return null;
+      }
+      return this.getValidationState("reservationName");
+    },
+    queueNameOptions() {
+      return this.queues.slice().sort();
+    }
+  },
+  methods: {
+    stringToDate(datetimeString) {
+      return new Date(datetimeString);
+    },
+    getValidationFeedback: function(properties) {
+      return utils.getProperty(this.data.validate(), properties);
+    },
+    getValidationState: function(properties) {
+      return this.getValidationFeedback(properties) ? "invalid" : null;
+    },
+    valuesChanged() {
+      const validationResults = this.data.validate();
+      if (Object.keys(validationResults).length === 0) {
+        this.$emit("valid");
+      } else {
+        this.$emit("invalid");
+      }
+    }
+  }
+};
+</script>
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputeResourceReservationList.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputeResourceReservationList.vue
new file mode 100644
index 0000000..b75aa5b
--- /dev/null
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputeResourceReservationList.vue
@@ -0,0 +1,248 @@
+<template>
+  <list-layout
+    @add-new-item="addNewReservation"
+    :items="decoratedReservations"
+    title="Reservations"
+    new-item-button-text="New Reservation"
+    :new-button-disabled="readonly"
+  >
+    <template slot="additional-buttons">
+      <delete-button
+        class="mr-2"
+        @delete="deleteAllExpiredReservations"
+        label="Delete All Expired"
+        :disabled="expiredReservations.length === 0"
+      >
+        Are you sure you want to delete all expired reservations?
+      </delete-button>
+    </template>
+    <template slot="new-item-editor">
+      <b-card v-if="showNewItemEditor" title="New Reservation">
+        <compute-resource-reservation-editor
+          v-model="newReservation"
+          :queues="queues"
+          @valid="
+            newReservationValid = true;
+            validate();
+          "
+          @invalid="
+            newReservationValid = false;
+            validate();
+          "
+        />
+        <div class="row">
+          <div class="col">
+            <b-button
+              variant="primary"
+              @click="saveNewReservation"
+              :disabled="isSaveDisabled"
+            >
+              Add
+            </b-button>
+            <b-button variant="secondary" @click="cancelNewReservation">
+              Cancel
+            </b-button>
+          </div>
+        </div>
+      </b-card>
+    </template>
+    <template slot="item-list" slot-scope="slotProps">
+      <b-table hover :fields="fields" :items="slotProps.items">
+        <template slot="reservationName" slot-scope="data">
+          {{ data.value }}
+          <b-badge v-if="data.item.isExpired">Expired</b-badge>
+          <b-badge v-if="data.item.isActive" variant="success">Active</b-badge>
+          <b-badge v-if="data.item.isUpcoming" variant="info">Upcoming</b-badge>
+        </template>
+        <template slot="queueNames" slot-scope="data">
+          <ul v-for="queueName in data.item.queueNames" :key="queueName">
+            <li>{{ queueName }}</li>
+          </ul>
+        </template>
+        <template slot="action" slot-scope="data">
+          <b-link
+            v-if="!readonly"
+            class="action-link"
+            @click="toggleDetails(data)"
+            :disabled="isReservationInvalid(data.item.key)"
+          >
+            Edit
+            <i class="fa fa-edit" aria-hidden="true"></i>
+          </b-link>
+          <delete-link
+            v-if="!readonly"
+            class="action-link"
+            @delete="deleteReservation(data.item)"
+          >
+            Are you sure you want to delete reservation
+            <strong>{{ data.item.reservationName }}</strong
+            >?
+          </delete-link>
+        </template>
+        <template slot="row-details" slot-scope="row">
+          <b-card>
+            <compute-resource-reservation-editor
+              :value="row.item"
+              @input="updatedReservation"
+              :queues="queues"
+              @valid="removeInvalidReservation(row.item.key)"
+              @invalid="recordInvalidReservation(row.item.key)"
+            />
+            <b-button
+              size="sm"
+              @click="toggleDetails(row)"
+              :disabled="isReservationInvalid(row.item.key)"
+              >Close</b-button
+            >
+          </b-card>
+        </template>
+      </b-table>
+    </template>
+  </list-layout>
+</template>
+
+<script>
+import { models } from "django-airavata-api";
+import { components, layouts, utils } from "django-airavata-common-ui";
+import ComputeResourceReservationEditor from "./ComputeResourceReservationEditor";
+
+export default {
+  name: "compute-resource-reservation-list",
+  components: {
+    "delete-link": components.DeleteLink,
+    "human-date": components.HumanDate,
+    "list-layout": layouts.ListLayout,
+    ComputeResourceReservationEditor,
+    "delete-button": components.DeleteButton
+  },
+  props: {
+    reservations: {
+      type: Array,
+      required: true
+    },
+    queues: {
+      type: Array,
+      required: true
+    },
+    readonly: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      showingDetails: {},
+      showNewItemEditor: false,
+      newReservation: null,
+      newReservationValid: false,
+      invalidReservations: [] // list of ComputeResourceReservation.key
+    };
+  },
+  computed: {
+    fields() {
+      return [
+        {
+          label: "Name",
+          key: "reservationName"
+        },
+        {
+          label: "Queues",
+          key: "queueNames"
+        },
+        {
+          label: "Start Time",
+          key: "startTime",
+          formatter: value =>
+            utils.dateFormatters.dateTimeInMinutesWithTimeZone.format(value)
+        },
+        {
+          label: "End Time",
+          key: "endTime",
+          formatter: value =>
+            utils.dateFormatters.dateTimeInMinutesWithTimeZone.format(value)
+        },
+        {
+          label: "Action",
+          key: "action"
+        }
+      ];
+    },
+    decoratedReservations() {
+      return this.reservations
+        ? this.reservations.map(res => {
+            const resClone = res.clone();
+            resClone._showDetails = this.showingDetails[resClone.key];
+            return resClone;
+          })
+        : [];
+    },
+    isSaveDisabled() {
+      return !this.newReservationValid;
+    },
+    valid() {
+      return (
+        (!this.showNewItemEditor || this.newReservationValid) &&
+        this.invalidReservations.length === 0
+      );
+    },
+    expiredReservations() {
+      return this.reservations
+        ? this.reservations.filter(r => r.isExpired)
+        : [];
+    }
+  },
+  created() {},
+  methods: {
+    updatedReservation(newValue) {
+      this.$emit("updated", newValue);
+    },
+    toggleDetails(row) {
+      row.toggleDetails();
+      this.showingDetails[row.item.key] = !this.showingDetails[row.item.key];
+    },
+    deleteReservation(reservation) {
+      this.removeInvalidReservation(reservation.key);
+      this.$emit("deleted", reservation);
+    },
+    addNewReservation() {
+      this.newReservation = new models.ComputeResourceReservation();
+      this.newReservationValid = false;
+      this.newReservation.queueNames = this.queues.slice();
+      this.showNewItemEditor = true;
+    },
+    saveNewReservation() {
+      this.$emit("added", this.newReservation);
+      this.showNewItemEditor = false;
+    },
+    cancelNewReservation() {
+      this.showNewItemEditor = false;
+    },
+    recordInvalidReservation(reservationKey) {
+      if (this.invalidReservations.indexOf(reservationKey) < 0) {
+        this.invalidReservations.push(reservationKey);
+      }
+      this.validate();
+    },
+    removeInvalidReservation(reservationKey) {
+      const index = this.invalidReservations.indexOf(reservationKey);
+      if (index >= 0) {
+        this.invalidReservations.splice(index, 1);
+      }
+      this.validate();
+    },
+    isReservationInvalid(reservationKey) {
+      return this.invalidReservations.indexOf(reservationKey) >= 0;
+    },
+    validate() {
+      if (this.valid) {
+        this.$emit("valid");
+      } else {
+        this.$emit("invalid");
+      }
+    },
+    deleteAllExpiredReservations() {
+      this.expiredReservations.forEach(this.deleteReservation);
+    }
+  }
+};
+</script>
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputeResourceReservationsSummary.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputeResourceReservationsSummary.vue
new file mode 100644
index 0000000..0cd71f2
--- /dev/null
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputeResourceReservationsSummary.vue
@@ -0,0 +1,45 @@
+<template>
+  <div>
+    <div v-if="expiredReservations.length > 0">
+      {{ expiredReservations.length }} expired
+    </div>
+    <div v-if="activeReservations.length > 0">
+      {{ activeReservations.length }} active ({{
+        activeReservationNames.join(", ")
+      }})
+    </div>
+    <div v-if="upcomingReservations.length > 0">
+      {{ upcomingReservations.length }} upcoming
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "compute-resource-reservations-summary",
+  props: {
+    reservations: {
+      type: Array,
+      required: true
+    }
+  },
+  computed: {
+    expiredReservations() {
+      return this.reservations
+        ? this.reservations.filter(r => r.isExpired)
+        : [];
+    },
+    activeReservations() {
+      return this.reservations ? this.reservations.filter(r => r.isActive) : [];
+    },
+    activeReservationNames() {
+      return this.activeReservations.map(r => r.reservationName);
+    },
+    upcomingReservations() {
+      return this.reservations
+        ? this.reservations.filter(r => r.isUpcoming)
+        : [];
+    }
+  }
+};
+</script>
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/GroupComputeResourcePreference.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/GroupComputeResourcePreference.vue
index 7bca11c..b2dbd67 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/GroupComputeResourcePreference.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/GroupComputeResourcePreference.vue
@@ -1,8 +1,11 @@
 <template>
-  <div>
+  <div class="has-fixed-footer">
     <div class="row">
       <div class="col">
-        <h1 class="h4 mb-4">{{ title }}</h1>
+        <h1 class="h4">{{ title }}</h1>
+        <div v-if="owner" class="text-muted mb-2">
+          Created by <span :title="ownerTitle">{{ ownerUserId }}</span>
+        </div>
       </div>
     </div>
     <div class="row">
@@ -10,11 +13,23 @@
         <div class="card">
           <div class="card-body">
             <b-form-group label="Name" label-for="profile-name">
-              <b-form-input id="profile-name" type="text" v-model="data.groupResourceProfileName" required placeholder="Name of this Group Resource Profile">
+              <b-form-input
+                id="profile-name"
+                type="text"
+                v-model="data.groupResourceProfileName"
+                required
+                placeholder="Name of this Group Resource Profile"
+              >
               </b-form-input>
             </b-form-group>
-            <b-form-group label="Default SSH Credential" label-for="default-credential-store-token">
-              <ssh-credential-selector id="default-credential-store-token" v-model="data.defaultCredentialStoreToken">
+            <b-form-group
+              label="Default SSH Credential"
+              label-for="default-credential-store-token"
+            >
+              <ssh-credential-selector
+                id="default-credential-store-token"
+                v-model="data.defaultCredentialStoreToken"
+              >
               </ssh-credential-selector>
             </b-form-group>
             <share-button ref="shareButton" :entity-id="id" />
@@ -22,46 +37,87 @@
         </div>
       </div>
     </div>
-    <list-layout :items="data.computePreferences" title="Compute Preferences" new-item-button-text="New Compute Preference"
-      @add-new-item="createComputePreference">
+    <list-layout
+      :items="data.computePreferences"
+      title="Compute Preferences"
+      new-item-button-text="New Compute Preference"
+      @add-new-item="createComputePreference"
+    >
       <template slot="item-list" slot-scope="slotProps">
-
-        <b-table hover :fields="computePreferencesFields" :items="slotProps.items" sort-by="computeResourceId">
+        <b-table
+          hover
+          :fields="computePreferencesFields"
+          :items="slotProps.items"
+          sort-by="computeResourceId"
+        >
           <template slot="policy" slot-scope="row">
-            <compute-resource-policy-summary :compute-resource-id="row.item.computeResourceId" :group-resource-profile="data" />
+            <compute-resource-policy-summary
+              :compute-resource-id="row.item.computeResourceId"
+              :group-resource-profile="data"
+            />
+          </template>
+          <template slot="reservations" slot-scope="row">
+            <compute-resource-reservations-summary :reservations="row.value" />
           </template>
           <template slot="action" slot-scope="row">
-            <router-link class="action-link" :to="{
+            <router-link
+              class="action-link"
+              :to="{
                 name: 'compute_preference',
                 params: {
                   value: row.item,
                   id: id,
                   host_id: row.item.computeResourceId,
                   groupResourceProfile: data,
-                  computeResourcePolicy: data.getComputeResourcePolicy(row.item.computeResourceId),
-                  batchQueueResourcePolicies: data.getBatchQueueResourcePolicies(row.item.computeResourceId)
+                  computeResourcePolicy: data.getComputeResourcePolicy(
+                    row.item.computeResourceId
+                  ),
+                  batchQueueResourcePolicies: data.getBatchQueueResourcePolicies(
+                    row.item.computeResourceId
+                  )
                 }
-              }">
+              }"
+            >
               Edit
               <i class="fa fa-edit" aria-hidden="true"></i>
             </router-link>
-            <a href="#" class="action-link text-danger" @click.prevent="removeComputePreference(row.item.computeResourceId)">
-              Delete
-              <i class="fa fa-trash" aria-hidden="true"></i>
-            </a>
+            <delete-link
+              class="action-link"
+              @delete="removeComputePreference(row.item.computeResourceId)"
+            >
+              Are you sure you want to remove the preferences for compute
+              resource
+              <strong>{{
+                getComputeResourceName(row.item.computeResourceId)
+              }}</strong
+              >?
+            </delete-link>
           </template>
         </b-table>
       </template>
     </list-layout>
-    <div class="row">
-      <div class="col d-flex justify-content-end">
-        <b-button variant="primary" @click="saveGroupResourceProfile">Save</b-button>
-        <b-button v-if="id" class="ml-2" variant="danger" @click="removeGroupResourceProfile">Delete</b-button>
-        <b-button class="ml-2" variant="secondary" @click="cancel">Cancel</b-button>
-      </div>
+    <div class="fixed-footer">
+      <b-button variant="primary" @click="saveGroupResourceProfile"
+        >Save</b-button
+      >
+      <delete-button
+        v-if="id"
+        class="ml-2"
+        @delete="removeGroupResourceProfile"
+      >
+        Are you sure you want to remove Group Resource Profile
+        <strong>{{ data.groupResourceProfileName }}</strong
+        >?
+      </delete-button>
+      <b-button class="ml-2" variant="secondary" @click="cancel"
+        >Cancel</b-button
+      >
     </div>
-    <compute-resources-modal ref="modalSelectComputeResource" @selected="onSelectComputeResource"
-      :excluded-resource-ids="excludedComputeResourceIds" />
+    <compute-resources-modal
+      ref="modalSelectComputeResource"
+      @selected="onSelectComputeResource"
+      :excluded-resource-ids="excludedComputeResourceIds"
+    />
   </div>
 </template>
 
@@ -69,6 +125,7 @@
 import { components as comps, layouts } from "django-airavata-common-ui";
 import { models, services } from "django-airavata-api";
 import ComputeResourcePolicySummary from "./ComputeResourcePolicySummary.vue";
+import ComputeResourceReservationsSummary from "./ComputeResourceReservationsSummary.vue";
 import ComputeResourcesModal from "../ComputeResourcesModal.vue";
 import SSHCredentialSelector from "../../credentials/SSHCredentialSelector.vue";
 
@@ -88,10 +145,16 @@
   mounted: function() {
     if (this.id) {
       if (!this.value.groupResourceProfileId) {
-        services.GroupResourceProfileService
-          .retrieve({ lookup: this.id })
-          .then(grp => (this.data = grp));
+        services.GroupResourceProfileService.retrieve({ lookup: this.id }).then(
+          grp => (this.data = grp)
+        );
       }
+      // Load information about the owner of this GroupResourceProfile
+      services.SharedEntityService.retrieve({
+        lookup: this.id
+      }).then(sharedEntity => {
+        this.sharedEntity = sharedEntity;
+      });
     }
   },
   data: function() {
@@ -99,6 +162,7 @@
     return {
       data: data,
       service: services.GroupResourceProfileService,
+      sharedEntity: null,
       computePreferencesFields: [
         {
           label: "Name",
@@ -119,6 +183,10 @@
           key: "policy" // custom rendering
         },
         {
+          label: "Reservations",
+          key: "reservations" // custom rendering
+        },
+        {
           label: "Action",
           key: "action"
         }
@@ -127,11 +195,14 @@
   },
 
   components: {
+    "delete-button": comps.DeleteButton,
+    "delete-link": comps.DeleteLink,
     "share-button": comps.ShareButton,
     "list-layout": layouts.ListLayout,
     ComputeResourcePolicySummary,
     ComputeResourcesModal,
-    "ssh-credential-selector": SSHCredentialSelector
+    "ssh-credential-selector": SSHCredentialSelector,
+    ComputeResourceReservationsSummary
   },
   computed: {
     excludedComputeResourceIds() {
@@ -146,6 +217,24 @@
       return this.id
         ? this.data.groupResourceProfileName
         : "New Group Resource Profile";
+    },
+    owner() {
+      return this.sharedEntity && this.sharedEntity.owner
+        ? this.sharedEntity.owner
+        : null;
+    },
+    ownerUserId() {
+      return this.owner ? this.owner.userId : null;
+    },
+    ownerTitle() {
+      return this.owner
+        ? this.owner.firstName +
+            " " +
+            this.owner.lastName +
+            " (" +
+            this.owner.email +
+            ")"
+        : null;
     }
   },
   methods: {
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationDeploymentsList.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationDeploymentsList.vue
index 4fcfbdb..5847ca4 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationDeploymentsList.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationDeploymentsList.vue
@@ -17,8 +17,8 @@
               Edit
               <i class="fa fa-edit" aria-hidden="true"></i>
             </router-link>
-            <delete-link v-if="data.item.userHasWriteAccess" @delete="removeApplicationDeployment(data.item)">
-              Are you sure you want to remove the {{ getComputeResourceName(data.item.computeHostId) }} deployment?
+            <delete-link v-if="data.item.userHasWriteAccess" @delete="removeApplicationDeployment(data.item)" class="action-link">
+              Are you sure you want to remove the <strong>{{ getComputeResourceName(data.item.computeHostId) }}</strong> deployment?
             </delete-link>
           </template>
         </b-table>
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationEditorContainer.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationEditorContainer.vue
index a71bda2..240543f 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationEditorContainer.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationEditorContainer.vue
@@ -33,7 +33,7 @@
           Save
         </b-button>
         <delete-button class="editor-button" v-if="id" :disabled="readonly" @delete="deleteApplication">
-          Are you sure you want to delete the {{ appModule ? appModule.appModuleName : "" }} application?
+          Are you sure you want to delete the <strong>{{ appModule ? appModule.appModuleName : "" }}</strong> application?
         </delete-button>
         <b-button class="editor-button" variant="secondary" @click="cancel">
           Cancel
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationInputFieldEditor.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationInputFieldEditor.vue
index 2f6f472..1d50b2d 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationInputFieldEditor.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationInputFieldEditor.vue
@@ -11,16 +11,19 @@
         <span class="sr-only">Delete</span>
       </b-link>
     </div>
-    <b-collapse :visible="!collapse">
+    <b-collapse :id="id+'-collapse'" :visible="!collapse">
       <b-form-group label="Name" :label-for="id+'-name'">
         <b-form-input :id="id+'-name'" type="text" v-model="data.name" ref="nameInput" required :disabled="readonly"></b-form-input>
       </b-form-group>
-      <b-form-group label="Initial Value" :label-for="id+'-value'">
-        <b-form-input :id="id+'-value'" type="text" v-model="data.value" :disabled="readonly"></b-form-input>
-      </b-form-group>
       <b-form-group label="Type" :label-for="id+'-type'">
         <b-form-select :id="id+'-type'" v-model="data.type" :options="inputTypeOptions" :disabled="readonly" />
       </b-form-group>
+      <b-form-group label="Initial Value" :label-for="id+'-value'" v-if="showValueField">
+        <b-form-input :id="id+'-value'" type="text" v-model="data.value" :disabled="readonly"></b-form-input>
+      </b-form-group>
+      <b-form-group label="Override Filename" :label-for="id+'-value'" v-if="showOverrideFilenameField">
+        <b-form-input :id="id+'-override-filename'" type="text" v-model="data.overrideFilename" :disabled="readonly"></b-form-input>
+      </b-form-group>
       <b-form-group label="Application Argument" :label-for="id+'-argument'">
         <b-form-input :id="id+'-argument'" type="text" v-model="data.applicationArgument" :disabled="readonly"></b-form-input>
       </b-form-group>
@@ -102,6 +105,12 @@
     },
     id() {
       return "id-" + this.data.key;
+    },
+    showValueField() {
+      return this.data.type.isSimpleValueType
+    },
+    showOverrideFilenameField() {
+      return this.data.type === models.DataType.URI;
     }
   },
   methods: {
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationInterfaceEditor.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationInterfaceEditor.vue
index 99faa51..ad6e17a 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationInterfaceEditor.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/ApplicationInterfaceEditor.vue
@@ -91,7 +91,7 @@
   },
   data() {
     return {
-      focusApplicationInputIndex: null,
+      focusApplicationInputKey: null,
       focusApplicationOutputKey: null,
       dragOptions: {
         handle: ".drag-handle"
@@ -113,8 +113,9 @@
       Object.assign(input, newValue);
     },
     addApplicationInput() {
-      this.data.applicationInputs.push(new models.InputDataObjectType());
-      this.focusApplicationInputIndex = this.data.applicationInputs.length - 1;
+      const appInput = new models.InputDataObjectType();
+      this.data.applicationInputs.push(appInput);
+      this.focusApplicationInputKey = appInput.key;
     },
     deleteInput(input) {
       const inputIndex = this.data.applicationInputs.findIndex(
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/JSONEditor.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/JSONEditor.vue
index 54f8941..88b240c 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/JSONEditor.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/applications/JSONEditor.vue
@@ -8,7 +8,6 @@
   props: {
     value: {
       type: Object,
-      required: true
     },
     id: String,
     rows: Number,
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/credentials/SSHCredentialSelector.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/credentials/SSHCredentialSelector.vue
index f4b9ca0..2042e23 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/credentials/SSHCredentialSelector.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/credentials/SSHCredentialSelector.vue
@@ -1,11 +1,25 @@
 <template>
   <div>
     <b-input-group>
-      <b-form-select v-model="data" :options="credentialStoreTokenOptions" :disabled="readonly">
-        <option v-if="nullOption" slot="first" :value="null" :disabled="nullOptionDisabled">
-          <slot name="null-option-label" :defaultCredentialSummary="defaultCredentialSummary">
+      <b-form-select
+        v-model="data"
+        :options="credentialStoreTokenOptions"
+        :disabled="readonly"
+      >
+        <option
+          v-if="nullOption"
+          slot="first"
+          :value="null"
+          :disabled="nullOptionDisabled"
+        >
+          <slot
+            name="null-option-label"
+            :defaultCredentialSummary="defaultCredentialSummary"
+          >
             <span v-if="defaultCredentialSummary">
-              Use the default SSH credential ({{ defaultCredentialSummary.description }})
+              Use the default SSH credential ({{
+                createCredentialDescription(defaultCredentialSummary)
+              }})
             </span>
             <span v-else>
               Unset the default SSH credential
@@ -16,12 +30,19 @@
       <b-input-group-append>
         <clipboard-copy-button variant="secondary" :text="copySSHPublicKeyText">
         </clipboard-copy-button>
-        <b-button v-if="!readonly" variant="secondary" @click="showNewSSHCredentialModal">
+        <b-button
+          v-if="!readonly"
+          variant="secondary"
+          @click="showNewSSHCredentialModal"
+        >
           <i class="fa fa-plus"></i>
         </b-button>
       </b-input-group-append>
     </b-input-group>
-    <new-ssh-credential-modal ref="newSSHCredentialModal" @new="createSSHCredential" />
+    <new-ssh-credential-modal
+      ref="newSSHCredentialModal"
+      @new="createSSHCredential"
+    />
   </div>
 </template>
 
@@ -69,7 +90,7 @@
         ? this.credentials.map(summary => {
             return {
               value: summary.token,
-              text: summary.description ? summary.description : `No description (${summary.token})`
+              text: this.createCredentialDescription(summary)
             };
           })
         : [];
@@ -94,8 +115,8 @@
       return this.selectedCredential
         ? this.selectedCredential.publicKey.trim()
         : this.defaultCredentialSummary
-          ? this.defaultCredentialSummary.publicKey.trim()
-          : null;
+        ? this.defaultCredentialSummary.publicKey.trim()
+        : null;
     }
   },
   methods: {
@@ -107,6 +128,15 @@
         this.credentials.push(cred);
         this.data = cred.token;
       });
+    },
+    createCredentialDescription(summary) {
+      return (
+        summary.username +
+        " - " +
+        (summary.description
+          ? summary.description
+          : `No description (${summary.token})`)
+      );
     }
   },
   created() {
@@ -118,4 +148,3 @@
   }
 };
 </script>
-
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/dashboards/ComputeResourcePreferenceDashboard.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/dashboards/ComputeResourcePreferenceDashboard.vue
index c72813d..a2c1225 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/dashboards/ComputeResourcePreferenceDashboard.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/dashboards/ComputeResourcePreferenceDashboard.vue
@@ -1,20 +1,35 @@
 <template>
-  <list-layout @add-new-item="newGroupResourcePreference" :items="groupResourceProfiles" title="Group Resource Profiles" new-item-button-text="New Group Resource Profile">
+  <list-layout
+    @add-new-item="newGroupResourcePreference"
+    :items="groupResourceProfiles"
+    title="Group Resource Profiles"
+    new-item-button-text="New Group Resource Profile"
+  >
     <template slot="item-list" slot-scope="slotProps">
-
       <b-table striped hover :fields="fields" :items="slotProps.items">
         <template slot="updatedTime" slot-scope="data">
-          <human-date :date="data.value"/>
+          <human-date :date="data.value" />
         </template>
         <template slot="action" slot-scope="data">
-          <router-link class="action-link" v-if="data.item.userHasWriteAccess" :to="{name: 'group_resource_preference', params: {value: data.item, id: data.item.groupResourceProfileId}}">
+          <router-link
+            class="action-link"
+            v-if="data.item.userHasWriteAccess"
+            :to="{
+              name: 'group_resource_preference',
+              params: { value: data.item, id: data.item.groupResourceProfileId }
+            }"
+          >
             Edit
             <i class="fa fa-edit" aria-hidden="true"></i>
           </router-link>
-          <a href="#" class="action-link text-danger" @click.prevent="removeGroupResourceProfile(data.item)" v-if="data.item.userHasWriteAccess">
-            Delete
-            <i class="fa fa-trash" aria-hidden="true"></i>
-          </a>
+          <delete-link
+            v-if="data.item.userHasWriteAccess"
+            class="action-link"
+            @delete="removeGroupResourceProfile(data.item)"
+          >
+            Are you sure you want to delete Group Resource Profile
+            <strong>{{ data.item.groupResourceProfileName }}</strong>?
+          </delete-link>
         </template>
       </b-table>
     </template>
@@ -28,6 +43,7 @@
 export default {
   name: "compute-resource-preference",
   components: {
+    "delete-link": components.DeleteLink,
     "human-date": components.HumanDate,
     "list-layout": layouts.ListLayout
   },
@@ -41,7 +57,7 @@
         },
         {
           label: "Updated",
-          key: "updatedTime",
+          key: "updatedTime"
         },
         {
           label: "Action",
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/gatewayprofile/StoragePreferenceEditor.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/gatewayprofile/StoragePreferenceEditor.vue
index ba9f0a1..b94509e 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/gatewayprofile/StoragePreferenceEditor.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/gatewayprofile/StoragePreferenceEditor.vue
@@ -14,7 +14,7 @@
         :null-option-default-credential-token="defaultCredentialStoreToken" :null-option-disabled="!defaultCredentialStoreToken">
         <template slot="null-option-label" slot-scope="nullOptionLabelScope">
           <span v-if="nullOptionLabelScope.defaultCredentialSummary">
-            Use the gateway's default SSH credential ({{ nullOptionLabelScope.defaultCredentialSummary.description }})
+            Use the gateway's default SSH credential ({{nullOptionLabelScope.defaultCredentialSummary.username}} - {{ nullOptionLabelScope.defaultCredentialSummary.description }})
           </span>
           <span v-else>
             Select a SSH credential
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/gatewayprofile/StoragePreferenceList.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/gatewayprofile/StoragePreferenceList.vue
index 1d09eda..f26221c 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/gatewayprofile/StoragePreferenceList.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/gatewayprofile/StoragePreferenceList.vue
@@ -33,8 +33,8 @@
             Edit
             <i class="fa fa-edit" aria-hidden="true"></i>
           </b-link>
-          <delete-link v-if="!readonly" @delete="deleteStoragePreference(data.item.storageResourceId)">
-            Are you sure you want to delete the storage preference for {{ getStorageResourceName(data.item.storageResourceId) }}?
+          <delete-link v-if="!readonly" class="action-link" @delete="deleteStoragePreference(data.item.storageResourceId)">
+            Are you sure you want to delete the storage preference for <strong>{{ getStorageResourceName(data.item.storageResourceId) }}</strong>?
           </delete-link>
         </template>
         <template slot="row-details" slot-scope="row">
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/statistics/ExperimentDetailsView.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/statistics/ExperimentDetailsView.vue
index 471555a..0320c49 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/statistics/ExperimentDetailsView.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/statistics/ExperimentDetailsView.vue
@@ -142,6 +142,10 @@
       <th scope="row">Node Count</th>
       <td>{{ experiment.userConfigurationData.computationalResourceScheduling.nodeCount }}</td>
     </tr>
+    <tr v-if="experiment.userConfigurationData.computationalResourceScheduling.totalPhysicalMemory">
+      <th scope="row">Total Physical Memory</th>
+      <td>{{ experiment.userConfigurationData.computationalResourceScheduling.totalPhysicalMemory.toLocaleString() }} MB</td>
+    </tr>
     <tr>
       <th scope="row">Queue</th>
       <td>{{ experiment.userConfigurationData.computationalResourceScheduling.queueName }}</td>
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/DeleteUserPanel.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/DeleteUserPanel.vue
index 30fc748..ecb59d8 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/DeleteUserPanel.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/DeleteUserPanel.vue
@@ -4,7 +4,7 @@
       This will remove {{ username }} from the identity service.
     </p>
     <delete-button @delete="deleteUser">
-      Are you sure you want to delete {{ username }}?
+      Are you sure you want to delete <strong>{{ username }}</strong>?
     </delete-button>
   </b-card>
 </template>
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/UserDetailsContainer.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/UserDetailsContainer.vue
index 9bd2eba..77fab42 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/UserDetailsContainer.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/UserDetailsContainer.vue
@@ -1,14 +1,20 @@
 <template>
   <div>
-    <user-group-membership-editor
-      v-if="iamUserProfile.airavataUserProfileExists"
-      v-model="localIAMUserProfile.groups"
-      :editable-groups="editableGroups"
-      :airavata-internal-user-id="iamUserProfile.airavataInternalUserId"
-      @input="groupsUpdated"
-    />
+    <b-card header="Edit Groups">
+      <user-group-membership-editor
+        v-if="iamUserProfile.airavataUserProfileExists"
+        v-model="localIAMUserProfile.groups"
+        :editable-groups="editableGroups"
+        :airavata-internal-user-id="iamUserProfile.airavataInternalUserId"
+      />
+      <b-button @click="groupsUpdated" variant="primary" :disabled="!areGroupsUpdated">Save</b-button>
+    </b-card>
     <activate-user-panel
-      v-if="iamUserProfile.enabled && iamUserProfile.emailVerified && !iamUserProfile.airavataUserProfileExists"
+      v-if="
+        iamUserProfile.enabled &&
+          iamUserProfile.emailVerified &&
+          !iamUserProfile.airavataUserProfileExists
+      "
       :username="iamUserProfile.userId"
       @activate-user="$emit('enable-user', $event)"
     />
@@ -64,7 +70,33 @@
     groupsUpdated() {
       this.$emit("groups-updated", this.localIAMUserProfile);
     }
+  },
+  computed: {
+    currentGroupIds() {
+      const groupIds = this.iamUserProfile.groups.map(g => g.id);
+      groupIds.sort();
+      return groupIds;
+    },
+    updatedGroupIds() {
+      const groupIds = this.localIAMUserProfile.groups.map(g => g.id);
+      groupIds.sort();
+      return groupIds;
+    },
+    areGroupsUpdated() {
+      for (const groupId of this.currentGroupIds) {
+        // Check if a group was removed
+        if (this.updatedGroupIds.indexOf(groupId) < 0) {
+          return true;
+        }
+      }
+      for (const groupId of this.updatedGroupIds) {
+        // Check if a group was added
+        if (this.currentGroupIds.indexOf(groupId) < 0) {
+          return true;
+        }
+      }
+      return false;
+    }
   }
 };
 </script>
-
diff --git a/django_airavata/apps/admin/vue.config.js b/django_airavata/apps/admin/vue.config.js
index 61f0d8e..f3e326d 100644
--- a/django_airavata/apps/admin/vue.config.js
+++ b/django_airavata/apps/admin/vue.config.js
@@ -7,7 +7,6 @@
       ? "http://localhost:9000/static/django_airavata_admin/dist/"
       : "/static/django_airavata_admin/dist/",
   outputDir: "./static/django_airavata_admin/dist",
-  productionSourceMap: false,
   css: {
     loaderOptions: {
       postcss: {
diff --git a/django_airavata/apps/api/data_products_helper.py b/django_airavata/apps/api/data_products_helper.py
index 30ab128..6dcdd84 100644
--- a/django_airavata/apps/api/data_products_helper.py
+++ b/django_airavata/apps/api/data_products_helper.py
@@ -1,4 +1,6 @@
+import copy
 import logging
+import mimetypes
 import os
 from urllib.parse import urlparse
 
@@ -19,30 +21,34 @@
 TMP_INPUT_FILE_UPLOAD_DIR = "tmp"
 
 
-def save(request, path, file, name=None):
+def save(request, path, file, name=None, content_type=None):
     "Save file in path in the user's storage."
     username = request.user.username
     full_path = datastore.save(username, path, file, name=name)
-    data_product = _save_data_product(request, full_path, name=name)
+    data_product = _save_data_product(request, full_path, name=name,
+                                      content_type=content_type)
     return data_product
 
 
-def move_from_filepath(request, source_path, target_path, name=None):
+def move_from_filepath(request, source_path, target_path, name=None,
+                       content_type=None):
     "Move a file from filesystem into user's storage."
     username = request.user.username
     file_name = name if name is not None else os.path.basename(source_path)
     full_path = datastore.move_external(
         source_path, username, target_path, file_name)
-    data_product = _save_data_product(request, full_path, name=file_name)
+    data_product = _save_data_product(request, full_path, name=file_name,
+                                      content_type=content_type)
     return data_product
 
 
-def save_input_file_upload(request, file, name=None):
+def save_input_file_upload(request, file, name=None, content_type=None):
     """Save input file in staging area for input file uploads."""
     username = request.user.username
     file_name = name if name is not None else os.path.basename(file.name)
     full_path = datastore.save(username, TMP_INPUT_FILE_UPLOAD_DIR, file)
-    data_product = _save_data_product(request, full_path, name=file_name)
+    data_product = _save_data_product(request, full_path, name=file_name,
+                                      content_type=content_type)
     return data_product
 
 
@@ -54,7 +60,7 @@
                                request.user.username,
                                TMP_INPUT_FILE_UPLOAD_DIR,
                                name=name)
-    return _save_data_product(request, full_path, name=name)
+    return _save_copy_of_data_product(request, full_path, data_product)
 
 
 def is_input_file_upload(request, data_product):
@@ -77,21 +83,23 @@
         path,
         file_name)
     _delete_data_product(data_product.ownerName, source_path)
-    data_product = _save_data_product(request, full_path, name=file_name)
+    data_product = _save_copy_of_data_product(request, full_path, data_product)
     return data_product
 
 
-def move_input_file_upload_from_filepath(request, source_path, name=None):
+def move_input_file_upload_from_filepath(request, source_path, name=None,
+                                         content_type=None):
     "Move a file from filesystem into user's input file staging area."
     username = request.user.username
     file_name = name if name is not None else os.path.basename(source_path)
     full_path = datastore.move_external(
         source_path, username, TMP_INPUT_FILE_UPLOAD_DIR, file_name)
-    data_product = _save_data_product(request, full_path, name=file_name)
+    data_product = _save_data_product(request, full_path, name=file_name,
+                                      content_type=content_type)
     return data_product
 
 
-def open(request, data_product):
+def open_file(request, data_product):
     "Return file object for replica if it exists in user storage."
     path = _get_replica_filepath(data_product)
     return datastore.open(data_product.ownerName, path)
@@ -196,19 +204,43 @@
     return product_uri
 
 
-def _save_data_product(request, full_path, name=None):
+def _save_data_product(request, full_path, name=None, content_type=None):
     "Create, register and record in DB a data product for full_path."
     data_product = _create_data_product(
-        request.user.username, full_path, name=name)
+        request.user.username, full_path, name=name, content_type=content_type)
+    product_uri = _register_data_product(request, full_path, data_product)
+    data_product.productUri = product_uri
+    return data_product
+
+
+def _register_data_product(request, full_path, data_product):
     product_uri = request.airavata_client.registerDataProduct(
         request.authz_token, data_product)
-    data_product.productUri = product_uri
     user_file_instance = models.User_Files(
         username=request.user.username,
         file_path=full_path,
         file_dpu=product_uri)
     user_file_instance.save()
-    return data_product
+    return product_uri
+
+
+def _save_copy_of_data_product(request, full_path, data_product):
+    """Save copy of a data product with a different path."""
+    data_product_copy = _copy_data_product(request, data_product, full_path)
+    product_uri = _register_data_product(request, full_path, data_product_copy)
+    data_product_copy.productUri = product_uri
+    return data_product_copy
+
+
+def _copy_data_product(request, data_product, full_path):
+    """Create an unsaved copy of a data product with different path."""
+    data_product_copy = copy.copy(data_product)
+    data_product_copy.productUri = None
+    data_product_copy.ownerName = request.user.username
+    data_replica_location = _create_replica_location(
+        full_path, data_product_copy.productName)
+    data_product_copy.replicaLocations = [data_replica_location]
+    return data_product_copy
 
 
 def _delete_data_product(username, full_path):
@@ -220,7 +252,8 @@
         user_file.delete()
 
 
-def _create_data_product(username, full_path, name=None):
+def _create_data_product(username, full_path, name=None,
+                         content_type=None):
     data_product = DataProductModel()
     data_product.gatewayId = settings.GATEWAY_ID
     data_product.ownerName = username
@@ -230,6 +263,31 @@
         file_name = os.path.basename(full_path)
     data_product.productName = file_name
     data_product.dataProductType = DataProductType.FILE
+    final_content_type = _determine_content_type(full_path, content_type)
+    if final_content_type is not None:
+        data_product.productMetadata = {'mime-type': final_content_type}
+    data_replica_location = _create_replica_location(full_path, file_name)
+    data_product.replicaLocations = [data_replica_location]
+    return data_product
+
+
+def _determine_content_type(full_path, content_type=None):
+    result = content_type
+    if result is None:
+        # Try to guess the content-type from file extension
+        guessed_type, encoding = mimetypes.guess_type(full_path)
+        result = guessed_type
+    if result is None or result == 'application/octet-stream':
+        # Check if file is Unicode text by trying to read some of it
+        try:
+            open(full_path, 'r').read(1024)
+            result = 'text/plain'
+        except UnicodeDecodeError:
+            logger.debug(f"Failed to read as Unicode text: {full_path}")
+    return result
+
+
+def _create_replica_location(full_path, file_name):
     data_replica_location = DataReplicaLocationModel()
     data_replica_location.storageResourceId = \
         settings.GATEWAY_DATA_STORE_RESOURCE_ID
@@ -242,8 +300,7 @@
     data_replica_location.filePath = \
         "file://{}:{}".format(settings.GATEWAY_DATA_STORE_HOSTNAME,
                               full_path)
-    data_product.replicaLocations = [data_replica_location]
-    return data_product
+    return data_replica_location
 
 
 def _get_replica_filepath(data_product):
diff --git a/django_airavata/apps/api/output_views.py b/django_airavata/apps/api/output_views.py
index 2375bd2..0863b63 100644
--- a/django_airavata/apps/api/output_views.py
+++ b/django_airavata/apps/api/output_views.py
@@ -1,3 +1,5 @@
+import collections
+import inspect
 import json
 import logging
 import os
@@ -158,7 +160,8 @@
 def generate_data(request,
                   output_view_provider_id,
                   experiment_output_name,
-                  experiment_id):
+                  experiment_id,
+                  **kwargs):
     output_view_provider = _get_output_view_provider(output_view_provider_id)
     # TODO if output_view_provider is None, return 404
     experiment = request.airavata_client.getExperiment(
@@ -169,16 +172,20 @@
     # TODO: handle experiment_output not found by name
     experiment_output = experiment_output[0]
     # TODO: add experiment_output_dir
+    # convert the extra/interactive arguments to appropriate types
+    kwargs = _convert_params_to_type(output_view_provider, kwargs)
     return _generate_data(request,
                           output_view_provider,
                           experiment_output,
-                          experiment)
+                          experiment,
+                          **kwargs)
 
 
 def _generate_data(request,
                    output_view_provider,
                    experiment_output,
-                   experiment):
+                   experiment,
+                   **kwargs):
     # TODO: handle URI_COLLECTION also
     logger.debug("getting data product for {}".format(experiment_output.value))
     output_file = None
@@ -193,11 +200,87 @@
         data_product = request.airavata_client.getDataProduct(
             request.authz_token, experiment_output.value)
         if data_products_helper.exists(request, data_product):
-            output_file = data_products_helper.open(request, data_product)
+            output_file = data_products_helper.open_file(request, data_product)
         elif settings.DEBUG and test_output_file is not None:
             output_file = open(test_output_file, 'rb')
     # TODO: change interface to provide output_file as a path
     # TODO: convert experiment and experiment_output to dict/JSON
-    data = output_view_provider.generate_data(
-        request, experiment_output, experiment, output_file=output_file)
+    data = output_view_provider.generate_data(request,
+                                              experiment_output,
+                                              experiment,
+                                              output_file=output_file,
+                                              **kwargs)
+    _process_interactive_params(data)
     return data
+
+
+def _process_interactive_params(data):
+    if 'interactive' in data:
+        _convert_options(data)
+        for param in data['interactive']:
+            if 'type' not in param:
+                param['type'] = _infer_interactive_param_type(param)
+            # integer type implicitly has a step size of 1
+            if param['type'] == "integer" and 'step' not in param:
+                param['step'] = 1
+
+
+def _convert_options(data):
+    """Convert interactive options to explicit text/value dicts."""
+    for param in data['interactive']:
+        if 'options' in param and isinstance(param['options'][0], str):
+            param['options'] = _convert_options_strings(param['options'])
+        elif 'options' in param and isinstance(
+                param['options'][0], collections.Sequence):
+            param['options'] = _convert_options_sequences(param['options'])
+
+
+def _convert_options_strings(options):
+    return [{"text": o, "value": o} for o in options]
+
+
+def _convert_options_sequences(options):
+    return [{"text": o[0], "value": o[1]} for o in options]
+
+
+def _infer_interactive_param_type(param):
+    v = param['value']
+    # Boolean test must come first since bools are also integers
+    if isinstance(v, bool):
+        return "boolean"
+    elif isinstance(v, float):
+        return "float"
+    elif isinstance(v, int):
+        return "integer"
+    elif isinstance(v, str):
+        return "string"
+
+
+def _convert_params_to_type(output_view_provider, params):
+    method_sig = inspect.signature(output_view_provider.generate_data)
+    method_params = method_sig.parameters
+    # Special query parameter _meta holds type information for interactive
+    # parameters (will only be present if there are interactive parameters)
+    meta = json.loads(params.pop("_meta", "{}"))
+    for k, v in params.items():
+        meta_type = meta[k]['type'] if k in meta else None
+        default_value = None
+        if (k in method_params and
+            method_params[k].default is not inspect.Parameter.empty and
+                method_params[k].default is not None):
+            default_value = method_params[k].default
+        # TODO: handle lists?
+        # Handle boolean and numeric values, converting from string
+        if meta_type == 'boolean' or isinstance(default_value, bool):
+            params[k] = v == "true"
+        elif meta_type == 'float' or isinstance(default_value, float):
+            params[k] = float(v)
+        elif meta_type == 'integer' or isinstance(default_value, int):
+            params[k] = int(v)
+        elif meta_type == 'string' or isinstance(default_value, str):
+            params[k] = v
+        else:
+            logger.warning(
+                f"Unrecognized type for parameter {k}: "
+                f"meta_type={meta_type}, default_value={default_value}")
+    return params
diff --git a/django_airavata/apps/api/serializers.py b/django_airavata/apps/api/serializers.py
index 58b1470..e1323a5 100644
--- a/django_airavata/apps/api/serializers.py
+++ b/django_airavata/apps/api/serializers.py
@@ -27,6 +27,7 @@
     StoragePreference
 )
 from airavata.model.appcatalog.groupresourceprofile.ttypes import (
+    ComputeResourceReservation,
     GroupComputeResourcePreference,
     GroupResourceProfile
 )
@@ -567,9 +568,15 @@
     lastAccessTime = UTCPosixTimestampDateTimeField()
 
 
+class ComputeResourceReservationSerializer(
+        thrift_utils.create_serializer_class(ComputeResourceReservation)):
+    startTime = UTCPosixTimestampDateTimeField(allow_null=True)
+    endTime = UTCPosixTimestampDateTimeField(allow_null=True)
+
+
 class GroupComputeResourcePreferenceSerializer(
         thrift_utils.create_serializer_class(GroupComputeResourcePreference)):
-    pass
+    reservations = ComputeResourceReservationSerializer(many=True)
 
 
 class GroupResourceProfileSerializer(
@@ -625,9 +632,21 @@
 
     def get_userHasWriteAccess(self, groupResourceProfile):
         request = self.context['request']
-        return request.airavata_client.userHasAccess(
+        write_access = request.airavata_client.userHasAccess(
             request.authz_token, groupResourceProfile.groupResourceProfileId,
             ResourcePermissionType.WRITE)
+        if not write_access:
+            return False
+        # Check that user has READ access to all tokens in this
+        # GroupResourceProfile
+        tokens = set([groupResourceProfile.defaultCredentialStoreToken] +
+                     [cp.resourceSpecificCredentialStoreToken
+                      for cp in groupResourceProfile.computePreferences])
+
+        def check_token(token):
+            return token is None or request.airavata_client.userHasAccess(
+                request.authz_token, token, ResourcePermissionType.READ)
+        return all(map(check_token, tokens))
 
 
 class UserPermissionSerializer(serializers.Serializer):
diff --git a/django_airavata/apps/api/signals.py b/django_airavata/apps/api/signals.py
index 3967e20..f01df92 100644
--- a/django_airavata/apps/api/signals.py
+++ b/django_airavata/apps/api/signals.py
@@ -1,15 +1,20 @@
-"""Signal receivers for the api app."""
+"""Signal and receivers for the api app."""
 
 import logging
 
 from django.contrib.auth.signals import user_logged_in
-from django.dispatch import receiver
+from django.dispatch import Signal, receiver
 
 from . import data_products_helper
 
 log = logging.getLogger(__name__)
 
 
+# Signals
+user_added_to_group = Signal(providing_args=["user", "groups", "request"])
+
+
+# Receivers
 @receiver(user_logged_in)
 def create_user_storage_dir(sender, request, user, **kwargs):
     """Create user's home direct in gateway storage."""
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/index.js b/django_airavata/apps/api/static/django_airavata_api/js/index.js
index 5107811..a6be8d5 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/index.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/index.js
@@ -11,6 +11,7 @@
 import BatchQueueResourcePolicy from "./models/BatchQueueResourcePolicy";
 import CommandObject from "./models/CommandObject";
 import ComputeResourcePolicy from "./models/ComputeResourcePolicy";
+import ComputeResourceReservation from "./models/ComputeResourceReservation";
 import DataProduct from "./models/DataProduct";
 import DataType from "./models/DataType";
 import Experiment from "./models/Experiment";
@@ -68,6 +69,7 @@
   BatchQueueResourcePolicy,
   CommandObject,
   ComputeResourcePolicy,
+  ComputeResourceReservation,
   DataProduct,
   DataType,
   Experiment,
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/BaseModel.js b/django_airavata/apps/api/static/django_airavata_api/js/models/BaseModel.js
index f922b5f..de985a4 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/BaseModel.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/BaseModel.js
@@ -1,118 +1,145 @@
-import BaseEnum from './BaseEnum'
+import BaseEnum from "./BaseEnum";
 
 export default class BaseModel {
-
-    /**
-     * Create and optionally populate fields of a model instance.
-     * - fields: an Array of field definitions. Each field definition can either
-     *   be just the name of the field as a string, or an object with the
-     *   following properties:
-     *   - name (required)
-     *   - type (required: one of 'string', 'boolean', 'number', 'date', or a class reference)
-     *   - list (optional, boolean)
-     *   - default (optional, the default value to be used, if not specified then null is used)
-     * - data: a data object, typically a deserialized JSON response
-     */
-    constructor(fields, data={}){
-        fields.forEach(fieldDefinition => {
-            if (typeof fieldDefinition === 'string') {
-                this[fieldDefinition] = this.convertSimpleField(data[fieldDefinition], null);
-            } else { // fieldDefinition must be an object
-                let fieldName = fieldDefinition.name;
-                let fieldType = fieldDefinition.type;
-                let fieldIsList = typeof fieldDefinition.list !== 'undefined' ? fieldDefinition.list : false;
-                let fieldDefault = typeof fieldDefinition.default !== 'undefined' ? this.getDefaultValue(fieldDefinition.default) : null;
-                let fieldValue = data[fieldName];
-                if (fieldIsList) {
-                    this[fieldName] = fieldValue ? fieldValue.map(item => this.convertField(fieldType, item, fieldDefault)) : fieldDefault;
-                } else {
-                    this[fieldName] = this.convertField(fieldType, fieldValue, fieldDefault);
-                }
-            }
-        });
-    }
-
-    convertField(fieldType, fieldValue, fieldDefault) {
-        if (fieldValue === null || typeof fieldValue === 'undefined') {
-            return fieldDefault;
-        } else if (fieldType === 'string' || fieldType === 'boolean' || fieldType === 'number') {
-            return this.convertSimpleField(fieldValue, fieldDefault);
-        } else if (fieldType === 'date') {
-            return this.convertDateField(fieldValue, fieldDefault);
-        } else if (typeof fieldType === 'function') {
-            // Assume that it is another BaseModel class
-            return this.convertModelField(fieldType, fieldValue, fieldDefault);
-        }
-    }
-
-    convertSimpleField(fieldValue, fieldDefault) {
-        return typeof fieldValue !== 'undefined' ? fieldValue : fieldDefault;
-    }
-
-    convertDateField(fieldValue, fieldDefault) {
-        return typeof fieldValue !== 'undefined' ? new Date(fieldValue) : fieldDefault;
-    }
-
-    convertModelField(modelClass, fieldValue, fieldDefault) {
-        if (typeof fieldValue !== 'undefined') {
-            if (modelClass.prototype instanceof BaseEnum) {
-                // When cloning the fieldValue is an enum instance
-                if (fieldValue instanceof BaseEnum){
-                    return fieldValue;
-                }
-                let enumValue = null;
-                if (typeof fieldValue === 'string') {
-                    // convert by name if type is string
-                    enumValue = modelClass.byName(fieldValue);
-                } else {
-                    // Otherwise it is an integer that we need to convert to enum
-                    enumValue = modelClass.byValue(fieldValue);
-                }
-                if (!enumValue) {
-                    // enum wasn't found, construct an enum instance from the value
-                    return new BaseEnum(`Unknown value: ${fieldValue}`, fieldValue);
-                } else {
-                    return enumValue;
-                }
-            } else if (fieldValue instanceof modelClass) {
-                // No conversion necessary, just return the fieldValue
-                return fieldValue;
-            } else {
-                return new modelClass(fieldValue);
-            }
-        }
-        return fieldDefault;
-    }
-
-    getDefaultValue(fieldDefault) {
-        if (typeof fieldDefault === 'function') {
-            return fieldDefault();
+  /**
+   * Create and optionally populate fields of a model instance.
+   * - fields: an Array of field definitions. Each field definition can either
+   *   be just the name of the field as a string, or an object with the
+   *   following properties:
+   *   - name (required)
+   *   - type (required: one of 'string', 'boolean', 'number', 'date', or a class reference)
+   *   - list (optional, boolean)
+   *   - default (optional, the default value to be used, if not specified then null is used)
+   * - data: a data object, typically a deserialized JSON response
+   */
+  constructor(fields, data = {}) {
+    fields.forEach(fieldDefinition => {
+      if (typeof fieldDefinition === "string") {
+        this[fieldDefinition] = this.convertSimpleField(
+          data[fieldDefinition],
+          null
+        );
+      } else {
+        // fieldDefinition must be an object
+        let fieldName = fieldDefinition.name;
+        let fieldType = fieldDefinition.type;
+        let fieldIsList =
+          typeof fieldDefinition.list !== "undefined"
+            ? fieldDefinition.list
+            : false;
+        let fieldDefault =
+          typeof fieldDefinition.default !== "undefined"
+            ? this.getDefaultValue(fieldDefinition.default)
+            : null;
+        let fieldValue = data[fieldName];
+        if (fieldIsList) {
+          this[fieldName] = fieldValue
+            ? fieldValue.map(item =>
+                this.convertField(fieldType, item, fieldDefault)
+              )
+            : fieldDefault;
         } else {
-            return fieldDefault;
+          this[fieldName] = this.convertField(
+            fieldType,
+            fieldValue,
+            fieldDefault
+          );
         }
-    }
+      }
+    });
+  }
 
-    static defaultNewInstance(classRef) {
-        return () => new classRef();
+  convertField(fieldType, fieldValue, fieldDefault) {
+    if (fieldValue === null || typeof fieldValue === "undefined") {
+      return fieldDefault;
+    } else if (
+      fieldType === "string" ||
+      fieldType === "boolean" ||
+      fieldType === "number"
+    ) {
+      return this.convertSimpleField(fieldValue, fieldDefault);
+    } else if (fieldType === "date") {
+      return this.convertDateField(fieldValue, fieldDefault);
+    } else if (typeof fieldType === "function") {
+      // Assume that it is another BaseModel class
+      return this.convertModelField(fieldType, fieldValue, fieldDefault);
     }
+  }
 
-    /**
-     * Override to provide validation. If there are validation errors this
-     * method should return a dictionary where keys are property names and
-     * values are an array of error messages.
-     */
-    validate() {
-        return null;
-    }
+  convertSimpleField(fieldValue, fieldDefault) {
+    return typeof fieldValue !== "undefined" ? fieldValue : fieldDefault;
+  }
 
-    isEmpty(value) {
-        return value === null || (typeof value === 'string' && value.trim() === '');
-    }
+  convertDateField(fieldValue, fieldDefault) {
+    return typeof fieldValue !== "undefined"
+      ? new Date(fieldValue)
+      : fieldDefault;
+  }
 
-    /**
-     * Return a fully deep cloned instance of this instance.
-     */
-    clone() {
-        return new this.constructor(this);
+  convertModelField(modelClass, fieldValue, fieldDefault) {
+    if (typeof fieldValue !== "undefined") {
+      if (modelClass.prototype instanceof BaseEnum) {
+        // When cloning the fieldValue is an enum instance
+        if (fieldValue instanceof BaseEnum) {
+          return fieldValue;
+        }
+        let enumValue = null;
+        if (typeof fieldValue === "string") {
+          // convert by name if type is string
+          enumValue = modelClass.byName(fieldValue);
+        } else {
+          // Otherwise it is an integer that we need to convert to enum
+          enumValue = modelClass.byValue(fieldValue);
+        }
+        if (!enumValue) {
+          // enum wasn't found, construct an enum instance from the value
+          return new BaseEnum(`Unknown value: ${fieldValue}`, fieldValue);
+        } else {
+          return enumValue;
+        }
+      } else if (fieldValue instanceof modelClass) {
+        // No conversion necessary, just return the fieldValue
+        return fieldValue;
+      } else {
+        return new modelClass(fieldValue);
+      }
     }
+    return fieldDefault;
+  }
+
+  getDefaultValue(fieldDefault) {
+    if (typeof fieldDefault === "function") {
+      return fieldDefault();
+    } else {
+      return fieldDefault;
+    }
+  }
+
+  static defaultNewInstance(classRef) {
+    return () => new classRef();
+  }
+
+  /**
+   * Override to provide validation. If there are validation errors this
+   * method should return a dictionary where keys are property names and
+   * values are an array of error messages.
+   */
+  validate() {
+    return null;
+  }
+
+  isEmpty(value) {
+    return (
+      value === null ||
+      (typeof value === "string" && value.trim() === "") ||
+      (value instanceof Array && value.length === 0)
+    );
+  }
+
+  /**
+   * Return a fully deep cloned instance of this instance.
+   */
+  clone() {
+    return new this.constructor(this);
+  }
 }
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/ComputationalResourceSchedulingModel.js b/django_airavata/apps/api/static/django_airavata_api/js/models/ComputationalResourceSchedulingModel.js
index 5871a99..ea4e858 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/ComputationalResourceSchedulingModel.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/ComputationalResourceSchedulingModel.js
@@ -20,32 +20,40 @@
         super(FIELDS, data);
     }
 
-    validate(queueInfo, batchQueueResourcePolicy = null) {
+    validate(queueInfo = null, batchQueueResourcePolicy = null) {
         const validationResults = {};
         if (this.isEmpty(this.resourceHostId)) {
             validationResults['resourceHostId'] = "Please select a compute resource.";
         }
+        if (this.isEmpty(this.queueName)) {
+          validationResults['queueName'] = "Please select a queue.";
+        }
         if (!(this.nodeCount > 0)) {
             validationResults['nodeCount'] = "Enter a node count greater than 0.";
         } else if (batchQueueResourcePolicy && this.nodeCount > batchQueueResourcePolicy.maxAllowedNodes) {
             validationResults['nodeCount'] = `Enter a node count no greater than ${batchQueueResourcePolicy.maxAllowedNodes}.`;
-        } else if (queueInfo.maxNodes && this.nodeCount > queueInfo.maxNodes) {
+        } else if (queueInfo && queueInfo.maxNodes && this.nodeCount > queueInfo.maxNodes) {
             validationResults['nodeCount'] = `Enter a node count no greater than ${queueInfo.maxNodes}.`;
         }
         if (!(this.totalCPUCount > 0)) {
             validationResults['totalCPUCount'] = "Enter a core count greater than 0.";
         } else if (batchQueueResourcePolicy && this.totalCPUCount > batchQueueResourcePolicy.maxAllowedCores) {
             validationResults['totalCPUCount'] = `Enter a core count no greater than ${batchQueueResourcePolicy.maxAllowedCores}.`;
-        } else if (queueInfo.maxProcessors && this.totalCPUCount > queueInfo.maxProcessors) {
+        } else if (queueInfo && queueInfo.maxProcessors && this.totalCPUCount > queueInfo.maxProcessors) {
             validationResults['totalCPUCount'] = `Enter a core count no greater than ${queueInfo.maxProcessors}.`;
         }
         if (!(this.wallTimeLimit > 0)) {
             validationResults['wallTimeLimit'] = "Enter a wall time limit greater than 0.";
         } else if (batchQueueResourcePolicy && this.wallTimeLimit > batchQueueResourcePolicy.maxAllowedWalltime) {
             validationResults['wallTimeLimit'] = `Enter a wall time limit no greater than ${batchQueueResourcePolicy.maxAllowedWalltime}.`;
-        } else if (queueInfo.maxRunTime && this.wallTimeLimit > queueInfo.maxRunTime) {
+        } else if (queueInfo && queueInfo.maxRunTime && this.wallTimeLimit > queueInfo.maxRunTime) {
             validationResults['wallTimeLimit'] = `Enter a wall time limit no greater than ${queueInfo.maxRunTime}.`;
         }
+        if (!(this.totalPhysicalMemory >= 0)) {
+            validationResults['totalPhysicalMemory'] = "Enter a total physical memory greater than or equal to 0.";
+        } else if (queueInfo && queueInfo.maxMemory && this.totalPhysicalMemory > queueInfo.maxMemory) {
+            validationResults['totalPhysicalMemory'] = `Enter a total physical memory no greater than ${queueInfo.maxMemory}.`;
+        }
         return validationResults;
     }
 }
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/ComputeResourceReservation.js b/django_airavata/apps/api/static/django_airavata_api/js/models/ComputeResourceReservation.js
new file mode 100644
index 0000000..9d3110b
--- /dev/null
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/ComputeResourceReservation.js
@@ -0,0 +1,65 @@
+import BaseModel from "./BaseModel";
+import uuidv4 from "uuid/v4";
+
+function currentTimeTopOfHour() {
+  const d = new Date();
+  d.setMinutes(0);
+  d.setSeconds(0);
+  d.setMilliseconds(0);
+  return d;
+}
+const FIELDS = [
+  "reservationId",
+  "reservationName",
+  {
+    name: "queueNames",
+    type: "string",
+    list: true
+  },
+  {
+    name: "startTime",
+    type: Date,
+    default: () => currentTimeTopOfHour()
+  },
+  {
+    name: "endTime",
+    type: Date,
+    default: () => currentTimeTopOfHour()
+  }
+];
+
+export default class ComputeResourceReservation extends BaseModel {
+  constructor(data = {}) {
+    super(FIELDS, data);
+    this._key = data.key ? data.key : uuidv4();
+  }
+  get key() {
+    return this._key;
+  }
+  validate() {
+    let validationResults = {};
+    if (this.isEmpty(this.reservationName)) {
+      validationResults["reservationName"] =
+        "Please provide the name of this reservation.";
+    }
+    if (this.startTime > this.endTime) {
+      validationResults["endTime"] = "End time must be later than start time.";
+    }
+    if (this.isEmpty(this.queueNames)) {
+      validationResults["queueNames"] = "Please select at least one queue.";
+    }
+    return validationResults;
+  }
+  get isExpired() {
+    const now = new Date();
+    return now > this.endTime;
+  }
+  get isActive() {
+    const now = new Date();
+    return this.startTime < now && now < this.endTime;
+  }
+  get isUpcoming() {
+    const now = new Date();
+    return now < this.startTime;
+  }
+}
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/DataProduct.js b/django_airavata/apps/api/static/django_airavata_api/js/models/DataProduct.js
index 2634807..da0a389 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/DataProduct.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/DataProduct.js
@@ -32,6 +32,8 @@
 ];
 
 const FILENAME_REGEX = /[^/]+$/;
+const TEXT_MIME_TYPE_REGEX = /^text\/.+/;
+const IMAGE_MIME_TYPE_REGEX = /^image\/.+/;
 
 export default class DataProduct extends BaseModel {
     constructor(data = {}) {
@@ -49,4 +51,16 @@
         }
         return null;
     }
+
+    get isText() {
+      return this.mimeType && TEXT_MIME_TYPE_REGEX.test(this.mimeType);
+    }
+
+    get isImage() {
+      return this.mimeType && IMAGE_MIME_TYPE_REGEX.test(this.mimeType);
+    }
+
+    get mimeType() {
+      return this.productMetadata && this.productMetadata['mime-type'] ? this.productMetadata['mime-type'] : null;
+    }
 }
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/GroupComputeResourcePreference.js b/django_airavata/apps/api/static/django_airavata_api/js/models/GroupComputeResourcePreference.js
index facaa85..39d8df4 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/GroupComputeResourcePreference.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/GroupComputeResourcePreference.js
@@ -1,4 +1,5 @@
 import BaseModel from "./BaseModel";
+import ComputeResourceReservation from "./ComputeResourceReservation";
 
 const FIELDS = [
   "computeResourceId",
@@ -17,12 +18,15 @@
   "resourceSpecificCredentialStoreToken",
   "usageReportingGatewayId",
   "qualityOfService",
-  "reservation",
-  "reservationStartTime",
-  "reservationEndTime",
   "sshAccountProvisioner",
   "groupSSHAccountProvisionerConfigs",
-  "sshAccountProvisionerAdditionalInfo"
+  "sshAccountProvisionerAdditionalInfo",
+  {
+    name: "reservations",
+    type: ComputeResourceReservation,
+    list: true,
+    default: BaseModel.defaultNewInstance(Array)
+  }
 ];
 
 export default class GroupComputeResourcePreference extends BaseModel {
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js b/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js
index f3a25fb..dcc7537 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js
@@ -41,7 +41,8 @@
     name: "isReadOnly",
     type: "boolean",
     default: false
-  }
+  },
+  "overrideFilename"
 ];
 
 const IS_REQUIRED_DEFAULT = "This field is required.";
@@ -167,11 +168,8 @@
    *         ]
    *       },
    *       "showOptions": {        // Optional
-   *         "toggle": [
-   *           "requiredToAddedToCommandLine", // Names of properties on this application
-   *                                           // input to toggle when show changes
-   *           ...
-   *         ]
+   *         "isRequired": true    // Set isRequired to true when shown, false otherwise (Note:
+   *                               // REST API automatically adds and updates this metadata as needed)
    *       }
    *     }
    *   }
@@ -241,10 +239,11 @@
           this.editorDependencies.show
         );
         if ("showOptions" in this.editorDependencies) {
-          if ("toggle" in this.editorDependencies.showOptions) {
-            this.editorDependencies.showOptions.toggle.forEach(prop => {
-              this[prop] = this.show;
-            });
+          if (
+            "isRequired" in this.editorDependencies.showOptions &&
+            this.editorDependencies.showOptions.isRequired
+          ) {
+            this.isRequired = this.show;
           }
         }
       }
diff --git a/django_airavata/apps/api/tests.py b/django_airavata/apps/api/tests.py
deleted file mode 100644
index 4929020..0000000
--- a/django_airavata/apps/api/tests.py
+++ /dev/null
@@ -1,2 +0,0 @@
-
-# Create your tests here.
diff --git a/django_airavata/apps/api/tests/__init__.py b/django_airavata/apps/api/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/django_airavata/apps/api/tests/__init__.py
diff --git a/django_airavata/apps/api/tests/test_data_products_helper.py b/django_airavata/apps/api/tests/test_data_products_helper.py
new file mode 100644
index 0000000..839cb28
--- /dev/null
+++ b/django_airavata/apps/api/tests/test_data_products_helper.py
@@ -0,0 +1,180 @@
+import io
+import os
+import tempfile
+import uuid
+from unittest.mock import MagicMock
+from urllib.parse import urlparse
+
+from django.contrib.auth.models import User
+from django.test import RequestFactory, TestCase, override_settings
+
+from airavata.model.data.replica.ttypes import (
+    DataProductModel,
+    DataProductType,
+    DataReplicaLocationModel,
+    ReplicaLocationCategory
+)
+from django_airavata.apps.api import data_products_helper
+
+GATEWAY_ID = 'test-gateway'
+
+
+@override_settings(GATEWAY_ID=GATEWAY_ID)
+class BaseTestCase(TestCase):
+
+    def setUp(self):
+        self.user = User.objects.create_user('testuser')
+        self.factory = RequestFactory()
+        # Dummy POST request
+        self.request = self.factory.post('/upload', {})
+        self.request.user = self.user
+        self.request.airavata_client = MagicMock(name="airavata_client")
+        self.product_uri = f"airavata-dp://{uuid.uuid4()}"
+        self.request.airavata_client.registerDataProduct.return_value = \
+            self.product_uri
+        self.request.authz_token = "dummy"
+
+
+class SaveTests(BaseTestCase):
+
+    def test_save_with_defaults(self):
+        "Test save with default name and content type"
+        with tempfile.TemporaryDirectory() as tmpdirname, \
+                self.settings(GATEWAY_DATA_STORE_DIR=tmpdirname,
+                              GATEWAY_DATA_STORE_HOSTNAME="gateway.com"):
+            # path is just the user directory in gateway storage
+            path = os.path.join(tmpdirname, self.user.username)
+            file = io.StringIO("Foo file")
+            file.name = "foo.txt"
+            data_product = data_products_helper.save(self.request, path, file)
+
+            self.assertEqual(data_product.productUri, self.product_uri)
+            self.request.airavata_client.registerDataProduct.\
+                assert_called_once()
+            args, kws = self.request.airavata_client.registerDataProduct.\
+                call_args
+            dp = args[1]
+            self.assertEqual(self.user.username, dp.ownerName)
+            self.assertEqual("foo.txt", dp.productName)
+            self.assertEqual(DataProductType.FILE, dp.dataProductType)
+            self.assertDictEqual({'mime-type': 'text/plain'},
+                                 dp.productMetadata)
+            self.assertEqual(1, len(dp.replicaLocations))
+            self.assertEqual(f"file://gateway.com:{path}/{file.name}",
+                             dp.replicaLocations[0].filePath)
+
+    def test_save_with_name_and_content_type(self):
+        "Test save with specified name and content type"
+        with tempfile.TemporaryDirectory() as tmpdirname, \
+                self.settings(GATEWAY_DATA_STORE_DIR=tmpdirname,
+                              GATEWAY_DATA_STORE_HOSTNAME="gateway.com"):
+            # path is just the user directory in gateway storage
+            path = os.path.join(tmpdirname, self.user.username)
+            file = io.StringIO("Foo file")
+            file.name = "foo.txt"
+            data_product = data_products_helper.save(
+                self.request, path, file, name="bar.txt",
+                content_type="application/some-app")
+
+            self.assertEqual(data_product.productUri, self.product_uri)
+            self.request.airavata_client.registerDataProduct.\
+                assert_called_once()
+            args, kws = self.request.airavata_client.registerDataProduct.\
+                call_args
+            dp = args[1]
+            self.assertEqual(self.user.username, dp.ownerName)
+            self.assertEqual("bar.txt", dp.productName)
+            self.assertEqual(DataProductType.FILE, dp.dataProductType)
+            self.assertDictEqual({'mime-type': 'application/some-app'},
+                                 dp.productMetadata)
+            self.assertEqual(1, len(dp.replicaLocations))
+            self.assertEqual(f"file://gateway.com:{path}/bar.txt",
+                             dp.replicaLocations[0].filePath)
+
+    def test_save_with_unknown_text_file_type(self):
+        "Test save with unknown file ext for text file"
+        with tempfile.TemporaryDirectory() as tmpdirname, \
+                self.settings(GATEWAY_DATA_STORE_DIR=tmpdirname,
+                              GATEWAY_DATA_STORE_HOSTNAME="gateway.com"):
+            path = os.path.join(
+                tmpdirname, "foo.someext")
+            os.makedirs(os.path.dirname(path), exist_ok=True)
+            with open(path, 'w') as f:
+                f.write("Some Unicode text")
+            with open(path, 'r') as f:
+                dp = data_products_helper.save(
+                    self.request, "some/path", f,
+                    content_type="application/octet-stream")
+                # Make sure that the file contents are tested to see if text
+                self.assertDictEqual({'mime-type': 'text/plain'},
+                                     dp.productMetadata)
+
+    def test_save_with_unknown_binary_file_type(self):
+        "Test save with unknown file ext for binary file"
+        with tempfile.TemporaryDirectory() as tmpdirname, \
+                self.settings(GATEWAY_DATA_STORE_DIR=tmpdirname,
+                              GATEWAY_DATA_STORE_HOSTNAME="gateway.com"):
+            path = os.path.join(
+                tmpdirname, "foo.someext")
+            os.makedirs(os.path.dirname(path), exist_ok=True)
+            with open(path, 'wb') as f:
+                f.write(bytes(range(256)))
+            with open(path, 'rb') as f:
+                dp = data_products_helper.save(
+                    self.request, "some/path", f,
+                    content_type="application/octet-stream")
+                # Make sure that DID NOT determine file contents are text
+                self.assertDictEqual({'mime-type': 'application/octet-stream'},
+                                     dp.productMetadata)
+
+
+class CopyInputFileUploadTests(BaseTestCase):
+    def test_copy_input_file_upload(self):
+        "Test copy input file upload copies data product"
+        with tempfile.TemporaryDirectory() as tmpdirname, \
+                self.settings(GATEWAY_DATA_STORE_DIR=tmpdirname,
+                              GATEWAY_DATA_STORE_HOSTNAME="gateway.com"):
+            # path is just the user directory in gateway storage
+            source_path = os.path.join(
+                tmpdirname, self.user.username, "foo.ext")
+            os.makedirs(os.path.dirname(source_path))
+            with open(source_path, 'wb') as f:
+                f.write(b"123")
+
+            data_product = DataProductModel()
+            data_product.productUri = f"airavata-dp://{uuid.uuid4()}"
+            data_product.gatewayId = GATEWAY_ID
+            data_product.ownerName = self.user.username
+            data_product.productName = "foo.ext"
+            data_product.dataProductType = DataProductType.FILE
+            data_product.productMetadata = {
+                'mime-type': 'application/some-app'
+            }
+            replica_category = ReplicaLocationCategory.GATEWAY_DATA_STORE
+            replica_path = f"file://gateway.com:{source_path}"
+            data_product.replicaLocations = [
+                DataReplicaLocationModel(
+                    filePath=replica_path,
+                    replicaLocationCategory=replica_category)]
+
+            data_product_copy = data_products_helper.copy_input_file_upload(
+                self.request, data_product)
+
+            self.request.airavata_client.registerDataProduct.\
+                assert_called_once()
+            self.assertIsNot(data_product_copy, data_product)
+            self.assertNotEqual(data_product_copy.productUri,
+                                data_product.productUri)
+            self.assertDictEqual(data_product_copy.productMetadata,
+                                 data_product.productMetadata)
+            self.assertEqual(data_product_copy.productName,
+                             data_product.productName)
+            self.assertEqual(data_product_copy.dataProductType,
+                             data_product.dataProductType)
+            replica_copy_path = data_product_copy.replicaLocations[0].filePath
+            self.assertNotEqual(replica_copy_path, replica_path)
+            replica_copy_filepath = urlparse(replica_copy_path).path
+            self.assertEqual(
+                os.path.dirname(replica_copy_filepath),
+                os.path.join(tmpdirname, self.user.username, "tmp"),
+                msg="Verify input file copied to user's tmp dir")
diff --git a/django_airavata/apps/api/tests/test_views.py b/django_airavata/apps/api/tests/test_views.py
new file mode 100644
index 0000000..a70703f
--- /dev/null
+++ b/django_airavata/apps/api/tests/test_views.py
@@ -0,0 +1,470 @@
+from unittest.mock import MagicMock, call, patch
+
+from django.contrib.auth.models import User
+from django.test import TestCase, override_settings
+from django.urls import reverse
+# from rest_framework import status
+from rest_framework.test import APIRequestFactory, force_authenticate
+
+from airavata.model.appcatalog.gatewaygroups.ttypes import GatewayGroups
+from airavata.model.group.ttypes import GroupModel
+from airavata.model.user.ttypes import UserProfile
+from django_airavata.apps.api import signals, views
+
+GATEWAY_ID = "test-gateway"
+PORTAL_ADMINS = [('Admin Name', 'admin@example.com')]
+
+
+@override_settings(
+    GATEWAY_ID=GATEWAY_ID,
+    PORTAL_ADMINS=PORTAL_ADMINS
+)
+class GroupViewSetTests(TestCase):
+
+    def setUp(self):
+        self.user = User.objects.create_user('testuser')
+        self.factory = APIRequestFactory()
+
+    def test_create_group_sends_user_added_to_group_signal(self):
+
+        url = reverse('django_airavata_api:group-list')
+        data = {
+            "id": None,
+            "name": "test",
+            "description": None,
+            "members": [
+                    f"{self.user.username}@{GATEWAY_ID}",  # owner
+                    f"testuser1@{GATEWAY_ID}"],
+            "admins": []
+        }
+        request = self.factory.post(url, data)
+        force_authenticate(request, self.user)
+
+        # Mock api clients
+        group_manager_mock = MagicMock(name='group_manager')
+        user_profile_mock = MagicMock(name='user_profile')
+        request.profile_service = {
+            'group_manager': group_manager_mock,
+            'user_profile': user_profile_mock,
+        }
+        request.airavata_client = MagicMock(name="airavata_client")
+        request.airavata_client.getGatewayGroups.return_value = GatewayGroups(
+            gatewayId=GATEWAY_ID,
+            adminsGroupId="adminsGroupId",
+            readOnlyAdminsGroupId="readOnlyAdminsGroupId",
+            defaultGatewayUsersGroupId="defaultGatewayUsersGroupId"
+        )
+        request.authz_token = "dummy"
+        request.session = {}
+        group_manager_mock.createGroup.return_value = "abc123"
+        user_profile = UserProfile(
+            airavataInternalUserId=f"testuser1@{GATEWAY_ID}",
+            userId="testuser1",
+            firstName="Test",
+            lastName="User1",
+            emails=["testuser1@example.com"]
+        )
+        user_profile_mock.getUserProfileById.return_value = user_profile
+
+        # Mock signal handler to verify 'user_added_to_group' signal is sent
+        user_added_to_group_handler = MagicMock()
+        signals.user_added_to_group.connect(
+            user_added_to_group_handler,
+            sender=views.GroupViewSet)
+        group_create = views.GroupViewSet.as_view({'post': 'create'})
+        response = group_create(request)
+        self.assertEquals(201, response.status_code)
+        self.assertEquals("abc123", response.data['id'])
+        user_added_to_group_handler.assert_called_once()
+        args, kwargs = user_added_to_group_handler.call_args
+        self.assertEquals("abc123", kwargs["groups"][0].id)
+        self.assertIs(user_profile, kwargs["user"])
+
+    def test_update_group_sends_user_added_to_group_signal(self):
+        url = reverse('django_airavata_api:group-detail',
+                      kwargs={'group_id': 'abc123'})
+        data = {
+            "id": "abc123",
+            "name": "test",
+            "description": None,
+            "members": [
+                    f"{self.user.username}@{GATEWAY_ID}",  # owner
+                    f"testuser1@{GATEWAY_ID}",  # existing member
+                    f"testuser3@{GATEWAY_ID}"],  # new member
+            "admins": []
+        }
+        request = self.factory.put(url, data)
+        force_authenticate(request, self.user)
+
+        # Mock api clients
+        group_manager_mock = MagicMock(name='group_manager')
+        user_profile_mock = MagicMock(name='user_profile')
+        request.profile_service = {
+            'group_manager': group_manager_mock,
+            'user_profile': user_profile_mock,
+        }
+        request.airavata_client = MagicMock(name="airavata_client")
+        request.airavata_client.getGatewayGroups.return_value = GatewayGroups(
+            gatewayId=GATEWAY_ID,
+            adminsGroupId="adminsGroupId",
+            readOnlyAdminsGroupId="readOnlyAdminsGroupId",
+            defaultGatewayUsersGroupId="defaultGatewayUsersGroupId"
+        )
+        request.authz_token = "dummy"
+        request.session = {}
+
+        # mock getGroup
+        group = GroupModel(id="abc123", name="My Group",
+                           ownerId=f"{self.user.username}@{GATEWAY_ID}",
+                           members=[
+                               f"{self.user.username}@{GATEWAY_ID}",  # owner
+                               f"testuser1@{GATEWAY_ID}",  # existing member
+                               f"testuser2@{GATEWAY_ID}",  # new member
+                           ],
+                           admins=[])
+        group_manager_mock.getGroup.return_value = group
+
+        # Only user added is testuser3, so getUserProfileById will be called
+        # for that user
+        user_profile = UserProfile(
+            airavataInternalUserId=f"testuser3@{GATEWAY_ID}",
+            userId="testuser3",
+            firstName="Test",
+            lastName="User3",
+            emails=["testuser3@example.com"]
+        )
+        user_profile_mock.getUserProfileById.return_value = user_profile
+
+        # Mock signal handler to verify 'user_added_to_group' signal is sent
+        user_added_to_group_handler = MagicMock()
+        signals.user_added_to_group.connect(
+            user_added_to_group_handler,
+            sender=views.GroupViewSet)
+        group_update = views.GroupViewSet.as_view({'put': 'update'})
+        response = group_update(request, group_id="abc123")
+        self.assertEquals(200, response.status_code)
+        self.assertEquals("abc123", response.data['id'])
+
+        # verify addUsersToGroup
+        group_manager_mock.addUsersToGroup.assert_called_once()
+        args, kwargs = group_manager_mock.addUsersToGroup.call_args
+        self.assertEqual(args[1], [f"testuser3@{GATEWAY_ID}"])
+
+        # verify removeUsersFromGroup
+        group_manager_mock.removeUsersFromGroup.assert_called_once()
+        args, kwargs = group_manager_mock.removeUsersFromGroup.call_args
+        self.assertEqual(args[1], [f"testuser2@{GATEWAY_ID}"])
+
+        # verify updateGroup
+        group_manager_mock.updateGroup.assert_called_once()
+
+        user_added_to_group_handler.assert_called_once()
+        args, kwargs = user_added_to_group_handler.call_args
+        self.assertEquals("abc123", kwargs["groups"][0].id)
+        self.assertIs(user_profile, kwargs["user"])
+
+
+@override_settings(
+    GATEWAY_ID=GATEWAY_ID,
+    PORTAL_ADMINS=PORTAL_ADMINS
+)
+class IAMUserViewSetTests(TestCase):
+
+    def setUp(self):
+        self.user = User.objects.create_user('testuser')
+        self.factory = APIRequestFactory()
+
+    @patch("django_airavata.apps.api.views.iam_admin_client")
+    def test_update_that_adds_user_to_group_sends_user_added_to_group_signal(
+            self, iam_admin_client):
+
+        username = "testuser1"
+        url = reverse(
+            'django_airavata_api:iam-user-profile-detail',
+            kwargs={'user_id': username})
+        data = {
+            "airavataInternalUserId": f"{username}@{GATEWAY_ID}",
+            "userId": username,
+            "gatewayId": GATEWAY_ID,
+            "email": "testuser1@example.com",
+            "firstName": "Test",
+            "lastName": "User1",
+            "airavataUserProfileExists": True,
+            "enabled": True,
+            "emailVerified": True,
+            "groups": [
+                {"id": "group1", "name": "Group 1"},
+                {"id": "group2", "name": "Group 2"}
+            ]
+        }
+        request = self.factory.put(url, data)
+        force_authenticate(request, self.user)
+        request.is_gateway_admin = True
+
+        # Mock api clients
+        iam_user_profile = UserProfile(
+            airavataInternalUserId=f"testuser1@{GATEWAY_ID}",
+            userId="testuser1",
+            firstName="Test",
+            lastName="User1",
+            emails=["testuser1@example.com"]
+        )
+        iam_admin_client.get_user.return_value = iam_user_profile
+        group_manager_mock = MagicMock(name='group_manager')
+        user_profile_mock = MagicMock(name='user_profile')
+        request.profile_service = {
+            'group_manager': group_manager_mock,
+            'user_profile': user_profile_mock,
+        }
+        request.authz_token = "dummy"
+        user_profile_mock.doesUserExist.return_value = True
+        user_profile = UserProfile(
+            airavataInternalUserId=f"testuser1@{GATEWAY_ID}",
+            userId="testuser1",
+            firstName="Test",
+            lastName="User1",
+            emails=["testuser1@example.com"]
+        )
+        user_profile_mock.getUserProfileById.return_value = user_profile
+        group_manager_mock.getAllGroupsUserBelongs.return_value = [
+            GroupModel(id="group1")]
+        group = GroupModel(
+            id="group2", name="Group 2"
+        )
+        group_manager_mock.getGroup.return_value = group
+        request.airavata_client = MagicMock(name="airavata_client")
+        request.airavata_client.getGatewayGroups.return_value = GatewayGroups(
+            gatewayId=GATEWAY_ID,
+            adminsGroupId="adminsGroupId",
+            readOnlyAdminsGroupId="readOnlyAdminsGroupId",
+            defaultGatewayUsersGroupId="defaultGatewayUsersGroupId"
+        )
+        request.session = {}
+
+        # Mock signal handler to verify 'user_added_to_group' signal is sent
+        user_added_to_group_handler = MagicMock(
+            name="user_added_to_group_handler")
+        signals.user_added_to_group.connect(
+            user_added_to_group_handler,
+            sender=views.IAMUserViewSet)
+        iam_user_update = views.IAMUserViewSet.as_view({'put': 'update'})
+        response = iam_user_update(request, user_id=username)
+        self.assertEquals(200, response.status_code)
+
+        user_profile_mock.doesUserExist.assert_called_once()
+        group_manager_mock.getAllGroupsUserBelongs.assert_called_once()
+
+        user_profile_mock.getUserProfileById.assert_called_once()
+        args, kwargs = user_profile_mock.getUserProfileById.call_args
+        self.assertSequenceEqual(
+            args, [request.authz_token, "testuser1", GATEWAY_ID])
+
+        group_manager_mock.getGroup.assert_called_once()
+        args, kwargs = group_manager_mock.getGroup.call_args
+        self.assertSequenceEqual(args, [request.authz_token, "group2"])
+
+        group_manager_mock.addUsersToGroup.assert_called_once()
+        args, kwargs = group_manager_mock.addUsersToGroup.call_args
+        self.assertSequenceEqual(
+            args, [request.authz_token, [f"testuser1@{GATEWAY_ID}"], "group2"]
+        )
+
+        user_added_to_group_handler.assert_called_once()
+        args, kwargs = user_added_to_group_handler.call_args
+        self.assertEqual(kwargs["sender"], views.IAMUserViewSet)
+        self.assertEqual(kwargs["user"], user_profile)
+        self.assertEqual(kwargs["groups"][0], group)
+
+    @patch("django_airavata.apps.api.views.iam_admin_client")
+    def test_update_that_adds_user_to_multiple_groups(
+            self, iam_admin_client):
+
+        username = "testuser1"
+        url = reverse(
+            'django_airavata_api:iam-user-profile-detail',
+            kwargs={'user_id': username})
+        data = {
+            "airavataInternalUserId": f"{username}@{GATEWAY_ID}",
+            "userId": username,
+            "gatewayId": GATEWAY_ID,
+            "email": "testuser1@example.com",
+            "firstName": "Test",
+            "lastName": "User1",
+            "airavataUserProfileExists": True,
+            "enabled": True,
+            "emailVerified": True,
+            "groups": [
+                {"id": "group1", "name": "Group 1"},
+                {"id": "group2", "name": "Group 2"},
+                {"id": "group3", "name": "Group 3"},
+            ]
+        }
+        request = self.factory.put(url, data)
+        force_authenticate(request, self.user)
+        request.is_gateway_admin = True
+
+        # Mock api clients
+        iam_user_profile = UserProfile(
+            airavataInternalUserId=f"testuser1@{GATEWAY_ID}",
+            userId="testuser1",
+            firstName="Test",
+            lastName="User1",
+            emails=["testuser1@example.com"]
+        )
+        iam_admin_client.get_user.return_value = iam_user_profile
+        group_manager_mock = MagicMock(name='group_manager')
+        user_profile_mock = MagicMock(name='user_profile')
+        request.profile_service = {
+            'group_manager': group_manager_mock,
+            'user_profile': user_profile_mock,
+        }
+        request.authz_token = "dummy"
+        user_profile_mock.doesUserExist.return_value = True
+        user_profile = UserProfile(
+            airavataInternalUserId=f"testuser1@{GATEWAY_ID}",
+            userId="testuser1",
+            firstName="Test",
+            lastName="User1",
+            emails=["testuser1@example.com"]
+        )
+        user_profile_mock.getUserProfileById.return_value = user_profile
+        group_manager_mock.getAllGroupsUserBelongs.return_value = [
+            GroupModel(id="group1")]
+
+        def side_effect(authz_token, group_id):
+            if group_id == "group2":
+                return GroupModel(id="group2", name="Group 2")
+            elif group_id == "group3":
+                return GroupModel(id="group3", name="Group 3")
+            else:
+                raise Exception("Unexpected group id: " + group_id)
+
+        group_manager_mock.getGroup.side_effect = side_effect
+        request.airavata_client = MagicMock(name="airavata_client")
+        request.airavata_client.getGatewayGroups.return_value = GatewayGroups(
+            gatewayId=GATEWAY_ID,
+            adminsGroupId="adminsGroupId",
+            readOnlyAdminsGroupId="readOnlyAdminsGroupId",
+            defaultGatewayUsersGroupId="defaultGatewayUsersGroupId"
+        )
+        request.session = {}
+
+        # Mock signal handler to verify 'user_added_to_group' signal is sent
+        user_added_to_group_handler = MagicMock(
+            name="user_added_to_group_handler")
+        signals.user_added_to_group.connect(
+            user_added_to_group_handler,
+            sender=views.IAMUserViewSet)
+        iam_user_update = views.IAMUserViewSet.as_view({'put': 'update'})
+        response = iam_user_update(request, user_id=username)
+        self.assertEquals(200, response.status_code)
+
+        user_profile_mock.doesUserExist.assert_called_once()
+        group_manager_mock.getAllGroupsUserBelongs.assert_called_once()
+
+        user_profile_mock.getUserProfileById.assert_called_once()
+        args, kwargs = user_profile_mock.getUserProfileById.call_args
+        self.assertSequenceEqual(
+            args, [request.authz_token, "testuser1", GATEWAY_ID])
+
+        group_manager_mock.getGroup.assert_has_calls([
+            call(request.authz_token, "group2"),
+            call(request.authz_token, "group3")
+        ], any_order=True)
+
+        group_manager_mock.addUsersToGroup.assert_has_calls([
+            call(request.authz_token, [f"testuser1@{GATEWAY_ID}"], "group2"),
+            call(request.authz_token, [f"testuser1@{GATEWAY_ID}"], "group3"),
+        ], any_order=True)
+
+        # user_added_to_group signal should only be called once, with both
+        # groups passed to it
+        user_added_to_group_handler.assert_called_once()
+        args, kwargs = user_added_to_group_handler.call_args
+        self.assertEqual(kwargs["sender"], views.IAMUserViewSet)
+        self.assertEqual(kwargs["user"], user_profile)
+        self.assertSetEqual({"group2", "group3"},
+                            {g.id for g in kwargs["groups"]})
+
+    @patch("django_airavata.apps.api.views.iam_admin_client")
+    def test_update_that_does_not_add_user_to_groups(
+            self, iam_admin_client):
+
+        username = "testuser1"
+        url = reverse(
+            'django_airavata_api:iam-user-profile-detail',
+            kwargs={'user_id': username})
+        data = {
+            "airavataInternalUserId": f"{username}@{GATEWAY_ID}",
+            "userId": username,
+            "gatewayId": GATEWAY_ID,
+            "email": "testuser1@example.com",
+            "firstName": "Test",
+            "lastName": "User1",
+            "airavataUserProfileExists": True,
+            "enabled": True,
+            "emailVerified": True,
+            "groups": [
+                {"id": "group1", "name": "Group 1"},
+            ]
+        }
+        request = self.factory.put(url, data)
+        force_authenticate(request, self.user)
+        request.is_gateway_admin = True
+
+        # Mock api clients
+        iam_user_profile = UserProfile(
+            airavataInternalUserId=f"testuser1@{GATEWAY_ID}",
+            userId="testuser1",
+            firstName="Test",
+            lastName="User1",
+            emails=["testuser1@example.com"]
+        )
+        iam_admin_client.get_user.return_value = iam_user_profile
+        group_manager_mock = MagicMock(name='group_manager')
+        user_profile_mock = MagicMock(name='user_profile')
+        request.profile_service = {
+            'group_manager': group_manager_mock,
+            'user_profile': user_profile_mock,
+        }
+        request.authz_token = "dummy"
+        user_profile_mock.doesUserExist.return_value = True
+        user_profile = UserProfile(
+            airavataInternalUserId=f"testuser1@{GATEWAY_ID}",
+            userId="testuser1",
+            firstName="Test",
+            lastName="User1",
+            emails=["testuser1@example.com"]
+        )
+        user_profile_mock.getUserProfileById.return_value = user_profile
+        group_manager_mock.getAllGroupsUserBelongs.return_value = [
+            GroupModel(id="group1")]
+
+        request.airavata_client = MagicMock(name="airavata_client")
+        request.airavata_client.getGatewayGroups.return_value = GatewayGroups(
+            gatewayId=GATEWAY_ID,
+            adminsGroupId="adminsGroupId",
+            readOnlyAdminsGroupId="readOnlyAdminsGroupId",
+            defaultGatewayUsersGroupId="defaultGatewayUsersGroupId"
+        )
+        request.session = {}
+
+        # Mock signal handler to verify 'user_added_to_group' signal is sent
+        user_added_to_group_handler = MagicMock(
+            name="user_added_to_group_handler")
+        signals.user_added_to_group.connect(
+            user_added_to_group_handler,
+            sender=views.IAMUserViewSet)
+        iam_user_update = views.IAMUserViewSet.as_view({'put': 'update'})
+        response = iam_user_update(request, user_id=username)
+        self.assertEquals(200, response.status_code)
+
+        user_profile_mock.doesUserExist.assert_called_once()
+        group_manager_mock.getAllGroupsUserBelongs.assert_called_once()
+
+        # Since user wasn't added to a group, these all should not have been
+        # called
+        user_profile_mock.getUserProfileById.assert_not_called()
+        group_manager_mock.getGroup.assert_not_called()
+        group_manager_mock.addUsersToGroup.assert_not_called()
+        user_added_to_group_handler.assert_not_called()
diff --git a/django_airavata/apps/api/tus.py b/django_airavata/apps/api/tus.py
index 41d7640..8f6fea1 100644
--- a/django_airavata/apps/api/tus.py
+++ b/django_airavata/apps/api/tus.py
@@ -12,7 +12,7 @@
     """
     Move upload identified by upload_url using the provided move_function.
 
-    move_function signature should be (file_path, file_name). It's
+    move_function signature should be (file_path, file_name, file_type). It's
     return value will be returned.
     """
     # file UUID is last path component in URL. For example:
@@ -34,6 +34,7 @@
     with open(upload_info_path) as upload_info_file:
         upload_info = json.load(upload_info_file)
         filename = upload_info['MetaData']['filename']
-        result = move_function(upload_bin_path, filename)
+        filetype = upload_info['MetaData']['filetype']
+        result = move_function(upload_bin_path, filename, filetype)
     os.remove(upload_info_path)
     return result
diff --git a/django_airavata/apps/api/urls.py b/django_airavata/apps/api/urls.py
index 70db566..af8a0a7 100644
--- a/django_airavata/apps/api/urls.py
+++ b/django_airavata/apps/api/urls.py
@@ -101,6 +101,8 @@
         views.html_output_view, name="html-output"),
     url(r'^image-output',
         views.image_output_view, name="image-output"),
+    url(r'^link-output',
+        views.link_output_view, name="link-output"),
 ]
 
 if logger.isEnabledFor(logging.DEBUG):
diff --git a/django_airavata/apps/api/views.py b/django_airavata/apps/api/views.py
index c5d22cb..36e5e2a 100644
--- a/django_airavata/apps/api/views.py
+++ b/django_airavata/apps/api/views.py
@@ -1,3 +1,4 @@
+import base64
 import json
 import logging
 import os
@@ -50,6 +51,7 @@
     models,
     output_views,
     serializers,
+    signals,
     thrift_utils,
     tus,
     view_utils
@@ -87,6 +89,8 @@
         group_id = self.request.profile_service['group_manager'].createGroup(
             self.authz_token, group)
         group.id = group_id
+        users_added_to_group = set(group.members) - {group.ownerId}
+        self._send_users_added_to_group(users_added_to_group, group)
 
     def perform_update(self, serializer):
         group = serializer.save()
@@ -94,6 +98,7 @@
         if len(group._added_members) > 0:
             group_manager_client.addUsersToGroup(
                 self.authz_token, group._added_members, group.id)
+            self._send_users_added_to_group(group._added_members, group)
         if len(group._removed_members) > 0:
             group_manager_client.removeUsersFromGroup(
                 self.authz_token, group._removed_members, group.id)
@@ -110,6 +115,17 @@
         group_manager_client.deleteGroup(
             self.authz_token, group.id, group.ownerId)
 
+    def _send_users_added_to_group(self, internal_user_ids, group):
+        for internal_user_id in internal_user_ids:
+            user_id, gateway_id = internal_user_id.rsplit("@", maxsplit=1)
+            user_profile = self.request.profile_service['user_profile'].getUserProfileById(
+                self.authz_token, user_id, gateway_id)
+            signals.user_added_to_group.send(
+                sender=self.__class__,
+                user=user_profile,
+                groups=[group],
+                request=self.request)
+
 
 class ProjectViewSet(APIBackedViewSet):
     serializer_class = serializers.ProjectSerializer
@@ -649,6 +665,7 @@
 
     def perform_create(self, serializer):
         application_interface = serializer.save()
+        self._update_input_metadata(application_interface)
         log.debug("application_interface: {}".format(application_interface))
         app_interface_id = self.request.airavata_client.registerApplicationInterface(
             self.authz_token, self.gateway_id, application_interface)
@@ -656,6 +673,7 @@
 
     def perform_update(self, serializer):
         application_interface = serializer.save()
+        self._update_input_metadata(application_interface)
         self.request.airavata_client.updateApplicationInterface(
             self.authz_token,
             application_interface.applicationInterfaceId,
@@ -665,6 +683,21 @@
         self.request.airavata_client.deleteApplicationInterface(
             self.authz_token, instance.applicationInterfaceId)
 
+    def _update_input_metadata(self, app_interface):
+        for app_input in app_interface.applicationInputs:
+            if app_input.metaData:
+                metadata = json.loads(app_input.metaData)
+                # Automatically add {showOptions: {isRequired: true/false}} to
+                # toggle isRequired on hidden/shown inputs
+                if ("editor" in metadata and
+                    "dependencies" in metadata["editor"] and
+                        "show" in metadata["editor"]["dependencies"]):
+                    if "showOptions" not in metadata["editor"]["dependencies"]:
+                        metadata["editor"]["dependencies"]["showOptions"] = {}
+                    o = metadata["editor"]["dependencies"]["showOptions"]
+                    o["isRequired"] = app_input.isRequired
+                    app_input.metaData = json.dumps(metadata)
+
     @detail_route()
     def compute_resources(self, request, app_interface_id):
         compute_resources = request.airavata_client.getAvailableAppInterfaceComputeResources(
@@ -911,7 +944,7 @@
     try:
         input_file = request.FILES['file']
         data_product = data_products_helper.save_input_file_upload(
-            request, input_file)
+            request, input_file, content_type=input_file.content_type)
         serializer = serializers.DataProductSerializer(
             data_product, context={'request': request})
         return JsonResponse({'uploaded': True,
@@ -927,15 +960,15 @@
 def tus_upload_finish(request):
     uploadURL = request.POST['uploadURL']
 
-    def move_input_file(file_path, file_name):
+    def move_input_file(file_path, file_name, file_type):
         return data_products_helper.move_input_file_upload_from_filepath(
-            request, file_path, name=file_name)
+            request, file_path, name=file_name, content_type=file_type)
     try:
         data_product = tus.move_tus_upload(uploadURL, move_input_file)
         serializer = serializers.DataProductSerializer(
             data_product, context={'request': request})
         return JsonResponse({'uploaded': True,
-                            'data-product': serializer.data})
+                             'data-product': serializer.data})
     except Exception as e:
         return exceptions.generic_json_exception_response(e, status=400)
 
@@ -960,12 +993,14 @@
                     .format(data_product_uri), exc_info=True)
         raise Http404("data product does not exist") from e
     try:
-        data_file = data_products_helper.open(request, data_product)
+        data_file = data_products_helper.open_file(request, data_product)
         response = FileResponse(data_file, content_type=mime_type)
         file_name = os.path.basename(data_file.name)
         if mime_type == 'application/octet-stream' or force_download:
             response['Content-Disposition'] = ('attachment; filename="{}"'
                                                .format(file_name))
+        else:
+            response['Content-Disposition'] = f'filename="{file_name}"'
         return response
     except ObjectDoesNotExist as e:
         raise Http404(str(e)) from e
@@ -1474,14 +1509,15 @@
         if 'file' in request.FILES:
             user_file = request.FILES['file']
             data_product = data_products_helper.save(
-                request, path, user_file)
+                request, path, user_file, content_type=user_file.content_type)
         # Handle a tus upload
         elif 'uploadURL' in request.POST:
             uploadURL = request.POST['uploadURL']
 
-            def move_file(file_path, file_name):
+            def move_file(file_path, file_name, file_type):
                 return data_products_helper.move_from_filepath(
-                    request, file_path, path, name=file_name)
+                    request, file_path, path, name=file_name,
+                    content_type=file_type)
             data_product = tus.move_tus_upload(uploadURL, move_file)
         return self._create_response(request, path, uploaded=data_product)
 
@@ -1596,10 +1632,24 @@
     def perform_update(self, serializer):
         managed_user_profile = serializer.save()
         group_manager_client = self.request.profile_service['group_manager']
+        user_profile_client = self.request.profile_service['user_profile']
         user_id = managed_user_profile['airavataInternalUserId']
+        added_groups = []
         for group_id in managed_user_profile['_added_group_ids']:
+            group = group_manager_client.getGroup(self.authz_token, group_id)
             group_manager_client.addUsersToGroup(
                 self.authz_token, [user_id], group_id)
+            added_groups.append(group)
+        if len(added_groups) > 0:
+            user_profile = user_profile_client.getUserProfileById(
+                self.authz_token,
+                managed_user_profile['userId'],
+                settings.GATEWAY_ID)
+            signals.user_added_to_group.send(
+                sender=self.__class__,
+                user=user_profile,
+                groups=added_groups,
+                request=self.request)
         for group_id in managed_user_profile['_removed_group_ids']:
             group_manager_client.removeUsersFromGroup(
                 self.authz_token, [user_id], group_id)
@@ -1786,6 +1836,7 @@
         return Response(data)
 
 
+@login_required
 def notebook_output_view(request):
     provider_id = request.GET['provider-id']
     experiment_id = request.GET['experiment-id']
@@ -1797,25 +1848,33 @@
     return HttpResponse(data['output'])
 
 
+@login_required
 def html_output_view(request):
-    provider_id = request.GET['provider-id']
-    experiment_id = request.GET['experiment-id']
-    experiment_output_name = request.GET['experiment-output-name']
-    data = output_views.generate_data(request,
-                                      provider_id,
-                                      experiment_output_name,
-                                      experiment_id)
+    data = _generate_output_view_data(request)
     return JsonResponse(data)
 
 
+@login_required
 def image_output_view(request):
-    provider_id = request.GET['provider-id']
-    experiment_id = request.GET['experiment-id']
-    experiment_output_name = request.GET['experiment-output-name']
-    data = output_views.generate_data(request,
-                                      provider_id,
-                                      experiment_output_name,
-                                      experiment_id)
+    data = _generate_output_view_data(request)
     # data should contain 'image' as a file-like object or raw bytes with the
     # file data and 'mime-type' with the images mimetype
-    return HttpResponse(data['image'], content_type=data['mime-type'])
+    data['image'] = base64.b64encode(data['image']).decode('utf-8')
+    return JsonResponse(data)
+
+
+def link_output_view(request):
+    data = _generate_output_view_data(request)
+    return JsonResponse(data)
+
+
+def _generate_output_view_data(request):
+    params = request.GET.copy()
+    provider_id = params.pop('provider-id')[0]
+    experiment_id = params.pop('experiment-id')[0]
+    experiment_output_name = params.pop('experiment-output-name')[0]
+    return output_views.generate_data(request,
+                                      provider_id,
+                                      experiment_output_name,
+                                      experiment_id,
+                                      **params.dict())
diff --git a/django_airavata/apps/auth/apps.py b/django_airavata/apps/auth/apps.py
index 1e103a4..cca02f9 100644
--- a/django_airavata/apps/auth/apps.py
+++ b/django_airavata/apps/auth/apps.py
@@ -4,3 +4,6 @@
 class AuthConfig(AppConfig):
     name = 'django_airavata.apps.auth'
     label = 'django_airavata_auth'
+
+    def ready(self):
+        from . import signals  # noqa
diff --git a/django_airavata/apps/auth/backends.py b/django_airavata/apps/auth/backends.py
index fc495c4..89827a5 100644
--- a/django_airavata/apps/auth/backends.py
+++ b/django_airavata/apps/auth/backends.py
@@ -6,7 +6,7 @@
 from django.conf import settings
 from django.contrib.auth.models import User
 from django.views.decorators.debug import sensitive_variables
-from oauthlib.oauth2 import LegacyApplicationClient
+from oauthlib.oauth2 import InvalidGrantError, LegacyApplicationClient
 from requests_oauthlib import OAuth2Session
 
 from . import utils
@@ -17,7 +17,11 @@
 class KeycloakBackend(object):
     """Django authentication backend for Keycloak."""
 
-    @sensitive_variables('password')
+    # mask all local variables from error emails since they contain the user's
+    # password and/or client_secret. Note, we could selectively just hide
+    # variables that are sensitive, but this decorator doesn't apply explicitly
+    # listed variable masking to library function calls
+    @sensitive_variables()
     def authenticate(self,
                      request=None,
                      username=None,
@@ -27,6 +31,8 @@
             if username and password:
                 token, userinfo = self._get_token_and_userinfo_password_flow(
                     username, password)
+                if token is None:  # login failed
+                    return None
                 self._process_token(request, token)
                 return self._process_userinfo(request, userinfo)
             # user is already logged in and can use refresh token
@@ -60,23 +66,29 @@
             return None
 
     def _get_token_and_userinfo_password_flow(self, username, password):
-        client_id = settings.KEYCLOAK_CLIENT_ID
-        client_secret = settings.KEYCLOAK_CLIENT_SECRET
-        token_url = settings.KEYCLOAK_TOKEN_URL
-        userinfo_url = settings.KEYCLOAK_USERINFO_URL
-        verify_ssl = settings.KEYCLOAK_VERIFY_SSL
-        oauth2_session = OAuth2Session(client=LegacyApplicationClient(
-            client_id=client_id))
-        if hasattr(settings, 'KEYCLOAK_CA_CERTFILE'):
-            oauth2_session.verify = settings.KEYCLOAK_CA_CERTFILE
-        token = oauth2_session.fetch_token(token_url=token_url,
-                                           username=username,
-                                           password=password,
-                                           client_id=client_id,
-                                           client_secret=client_secret,
-                                           verify=verify_ssl)
-        userinfo = oauth2_session.get(userinfo_url).json()
-        return token, userinfo
+        try:
+            client_id = settings.KEYCLOAK_CLIENT_ID
+            client_secret = settings.KEYCLOAK_CLIENT_SECRET
+            token_url = settings.KEYCLOAK_TOKEN_URL
+            userinfo_url = settings.KEYCLOAK_USERINFO_URL
+            verify_ssl = settings.KEYCLOAK_VERIFY_SSL
+            oauth2_session = OAuth2Session(client=LegacyApplicationClient(
+                client_id=client_id))
+            if hasattr(settings, 'KEYCLOAK_CA_CERTFILE'):
+                oauth2_session.verify = settings.KEYCLOAK_CA_CERTFILE
+            token = oauth2_session.fetch_token(token_url=token_url,
+                                               username=username,
+                                               password=password,
+                                               client_id=client_id,
+                                               client_secret=client_secret,
+                                               verify=verify_ssl)
+            userinfo = oauth2_session.get(userinfo_url).json()
+            return token, userinfo
+        except InvalidGrantError as e:
+            # password wasn't valid, just log as a warning
+            logger.warning(f"Failed to log in user {username} with "
+                           f"password: {e}")
+            return None, None
 
     def _get_token_and_userinfo_redirect_flow(self, request):
         authorization_code_url = request.build_absolute_uri()
diff --git a/django_airavata/apps/auth/forms.py b/django_airavata/apps/auth/forms.py
index 374c098..edd551a 100644
--- a/django_airavata/apps/auth/forms.py
+++ b/django_airavata/apps/auth/forms.py
@@ -60,6 +60,8 @@
         widget=forms.TextInput(attrs={'class': 'form-control',
                                       'placeholder': 'Last Name'}))
 
+    next = forms.CharField(widget=forms.HiddenInput(), required=False)
+
     def clean(self):
         cleaned_data = super().clean()
         password = cleaned_data.get('password')
diff --git a/django_airavata/apps/auth/migrations/0005_auto_20191211_2011.py b/django_airavata/apps/auth/migrations/0005_auto_20191211_2011.py
new file mode 100644
index 0000000..eeb4b99
--- /dev/null
+++ b/django_airavata/apps/auth/migrations/0005_auto_20191211_2011.py
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.21 on 2019-12-11 20:11
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+from django_airavata.apps.auth.models import USER_ADDED_TO_GROUP_TEMPLATE
+
+
+def default_templates(apps, schema_editor):
+
+    EmailTemplate = apps.get_model("django_airavata_auth", "EmailTemplate")
+    user_added_to_group_template = EmailTemplate(
+        template_type=USER_ADDED_TO_GROUP_TEMPLATE,
+        subject="You've been added to group{{ group_names|length|pluralize }} [{{group_names|join:'] and ['}}] in {{portal_title}}",
+        body="""
+        <p>
+        Dear {{first_name}} {{last_name}},
+        </p>
+
+        <p>
+        Your user account (username {{username}}) has been added to the
+        group{{ group_names|length|pluralize }} {{group_names|join:' and '}}.
+        {{portal_title}} uses groups to share applications and experiments.
+        </p>
+
+        <p>
+        You may have access to additional applications now that you are a
+        member of {{group_names|join:' and '}}. To check what applications you
+        have access to, please check: <a href="{{dashboard_url}}">{{dashboard_url}}</a>.
+        </p>
+
+        <p>
+        You may also have access to additional experiments. To check what
+        experiments you have access to, please check: <a
+        href="{{experiments_url}}">{{experiments_url}}</a>.
+        </p>
+
+        <p>
+        Please let us know if you have any questions.  Thanks.
+        </p>
+        """.strip())
+    user_added_to_group_template.save()
+
+
+def delete_default_templates(apps, schema_editor):
+    EmailTemplate = apps.get_model("django_airavata_auth", "EmailTemplate")
+    EmailTemplate.objects.filter(
+        template_type=USER_ADDED_TO_GROUP_TEMPLATE).delete()
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('django_airavata_auth', '0004_password_reset_request'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='emailtemplate',
+            name='template_type',
+            field=models.IntegerField(choices=[(1, 'Verify Email Template'), (2, 'New User Email Template'), (3, 'Password Reset Email Template'), (4, 'User Added to Group Template')], primary_key=True, serialize=False),
+        ),
+        migrations.RunPython(default_templates,
+                             reverse_code=delete_default_templates)
+    ]
diff --git a/django_airavata/apps/auth/migrations/0006_emailverification_next.py b/django_airavata/apps/auth/migrations/0006_emailverification_next.py
new file mode 100644
index 0000000..b68cd5c
--- /dev/null
+++ b/django_airavata/apps/auth/migrations/0006_emailverification_next.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.28 on 2020-02-26 21:13
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('django_airavata_auth', '0005_auto_20191211_2011'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='emailverification',
+            name='next',
+            field=models.CharField(blank=True, max_length=255),
+        ),
+    ]
diff --git a/django_airavata/apps/auth/models.py b/django_airavata/apps/auth/models.py
index 5e4d109..2e2f212 100644
--- a/django_airavata/apps/auth/models.py
+++ b/django_airavata/apps/auth/models.py
@@ -5,6 +5,7 @@
 VERIFY_EMAIL_TEMPLATE = 1
 NEW_USER_EMAIL_TEMPLATE = 2
 PASSWORD_RESET_EMAIL_TEMPLATE = 3
+USER_ADDED_TO_GROUP_TEMPLATE = 4
 
 
 class EmailVerification(models.Model):
@@ -13,6 +14,7 @@
         max_length=36, unique=True, default=uuid.uuid4)
     created_date = models.DateTimeField(auto_now_add=True)
     verified = models.BooleanField(default=False)
+    next = models.CharField(max_length=255, blank=True)
 
 
 class EmailTemplate(models.Model):
@@ -20,6 +22,7 @@
         (VERIFY_EMAIL_TEMPLATE, 'Verify Email Template'),
         (NEW_USER_EMAIL_TEMPLATE, 'New User Email Template'),
         (PASSWORD_RESET_EMAIL_TEMPLATE, 'Password Reset Email Template'),
+        (USER_ADDED_TO_GROUP_TEMPLATE, 'User Added to Group Template'),
     )
     template_type = models.IntegerField(
         primary_key=True, choices=TEMPLATE_TYPE_CHOICES)
diff --git a/django_airavata/apps/auth/signals.py b/django_airavata/apps/auth/signals.py
new file mode 100644
index 0000000..32f3cb0
--- /dev/null
+++ b/django_airavata/apps/auth/signals.py
@@ -0,0 +1,25 @@
+from django.conf import settings
+from django.dispatch import receiver
+from django.shortcuts import reverse
+from django.template import Context
+
+from django_airavata.apps.api.signals import user_added_to_group
+
+from . import models, utils
+
+
+@receiver(user_added_to_group, dispatch_uid="auth_email_user_added_to_group")
+def email_user_added_to_group(sender, user, groups, request, **kwargs):
+    context = Context({
+        "email": user.emails[0],
+        "first_name": user.firstName,
+        "last_name": user.lastName,
+        "username": user.userId,
+        "portal_title": settings.PORTAL_TITLE,
+        "dashboard_url": request.build_absolute_uri(
+            reverse("django_airavata_workspace:dashboard")),
+        "experiments_url": request.build_absolute_uri(
+            reverse("django_airavata_workspace:experiments")),
+        "group_names": [g.name for g in groups]
+    })
+    utils.send_email_to_user(models.USER_ADDED_TO_GROUP_TEMPLATE, context)
diff --git a/django_airavata/apps/auth/templates/django_airavata_auth/create_account.html b/django_airavata/apps/auth/templates/django_airavata_auth/create_account.html
index 7160f17..137b8cb 100644
--- a/django_airavata/apps/auth/templates/django_airavata_auth/create_account.html
+++ b/django_airavata/apps/auth/templates/django_airavata_auth/create_account.html
@@ -9,7 +9,7 @@
   {% include "./partials/externals_login_form.html" %}
   {% endif %}
 
-  {% if options.password %}
+  {% if options.password and not options.password.hidden %}
   <div class="row">
     <div class="col">
       <div class="card">
diff --git a/django_airavata/apps/auth/templates/django_airavata_auth/login-desktop.html b/django_airavata/apps/auth/templates/django_airavata_auth/login-desktop.html
index 5c712da..825ee3f 100644
--- a/django_airavata/apps/auth/templates/django_airavata_auth/login-desktop.html
+++ b/django_airavata/apps/auth/templates/django_airavata_auth/login-desktop.html
@@ -9,7 +9,7 @@
       {% include "./partials/externals_login_form.html" %}
       {% endif %}
 
-      {% if options.password %}
+      {% if options.password and not options.password.hidden %}
       {% include "./partials/username_password_login_form.html" %}
       {% endif %}
   </div>
diff --git a/django_airavata/apps/auth/templates/django_airavata_auth/login.html b/django_airavata/apps/auth/templates/django_airavata_auth/login.html
index 9c4d978..c027400 100644
--- a/django_airavata/apps/auth/templates/django_airavata_auth/login.html
+++ b/django_airavata/apps/auth/templates/django_airavata_auth/login.html
@@ -8,7 +8,7 @@
     {% include "./partials/externals_login_form.html" %}
     {% endif %}
 
-    {% if options.password %}
+    {% if options.password and not options.password.hidden %}
     {% include "./partials/username_password_login_form.html" %}
     {% endif %}
 </div>
diff --git a/django_airavata/apps/auth/templates/django_airavata_auth/partials/form.html b/django_airavata/apps/auth/templates/django_airavata_auth/partials/form.html
index ce558f7..aeed7b8 100644
--- a/django_airavata/apps/auth/templates/django_airavata_auth/partials/form.html
+++ b/django_airavata/apps/auth/templates/django_airavata_auth/partials/form.html
@@ -4,7 +4,11 @@
   {% csrf_token %}
 
   {% for field in form %}
-  {% include './form_field.html' %}
+  {% if field.is_hidden %}
+    {{ field }}
+  {% else %}
+    {% include './form_field.html' %}
+  {% endif %}
   {% endfor %}
 
   <button type="submit" class="btn btn-primary btn-block">
diff --git a/django_airavata/apps/auth/templates/django_airavata_auth/partials/username_password_login_form.html b/django_airavata/apps/auth/templates/django_airavata_auth/partials/username_password_login_form.html
index 6cc3bcc..a0799b6 100644
--- a/django_airavata/apps/auth/templates/django_airavata_auth/partials/username_password_login_form.html
+++ b/django_airavata/apps/auth/templates/django_airavata_auth/partials/username_password_login_form.html
@@ -4,7 +4,12 @@
     <div class="col">
         <div class="card">
             <div class="card-body">
-                <h5 class="card-title">Log in with {{ options.password.name|default:"a username and password" }}</h5>
+                <h5 class="card-title">
+                  Log in with {{ options.password.name|default:"a username and password" }}
+                  <small class="ml-2 text-muted">
+                    (Not registered? <a href="{{ create_account_url }}">Create Account</a>)
+                  </small>
+                </h5>
                 {% include "./messages.html" %}
                 <form action="{% url 'django_airavata_auth:handle_login' %}" method="post">
                     {% csrf_token %}
diff --git a/django_airavata/apps/auth/tests.py b/django_airavata/apps/auth/tests.py
deleted file mode 100644
index 4929020..0000000
--- a/django_airavata/apps/auth/tests.py
+++ /dev/null
@@ -1,2 +0,0 @@
-
-# Create your tests here.
diff --git a/django_airavata/apps/auth/tests/__init__.py b/django_airavata/apps/auth/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/django_airavata/apps/auth/tests/__init__.py
diff --git a/django_airavata/apps/auth/tests/test_signals.py b/django_airavata/apps/auth/tests/test_signals.py
new file mode 100644
index 0000000..274f362
--- /dev/null
+++ b/django_airavata/apps/auth/tests/test_signals.py
@@ -0,0 +1,81 @@
+from django.core import mail
+from django.shortcuts import reverse
+from django.test import RequestFactory, TestCase, override_settings
+
+from airavata.model.group.ttypes import GroupModel
+from airavata.model.user.ttypes import UserProfile
+from django_airavata.apps.api.signals import user_added_to_group
+from django_airavata.apps.auth import signals  # noqa
+
+GATEWAY_ID = "test-gateway"
+SERVER_EMAIL = "admin@test-gateway.com"
+PORTAL_TITLE = "Test Gateway"
+PORTAL_ADMINS = [('Portal Admin', 'admin@test-gateway.com')]
+
+
+@override_settings(
+    GATEWAY_ID=GATEWAY_ID,
+    SERVER_EMAIL=SERVER_EMAIL,
+    PORTAL_TITLE=PORTAL_TITLE,
+    PORTAL_ADMINS=PORTAL_ADMINS
+)
+class EmailUserAddedToGroupSignalReceiverTests(TestCase):
+
+    def setUp(self):
+        factory = RequestFactory()
+        self.request = factory.get("/")
+        self.user = UserProfile(
+            airavataInternalUserId=f"testuser@{GATEWAY_ID}",
+            userId="testuser",
+            gatewayId=GATEWAY_ID,
+            emails=["testuser@example.com"],
+            firstName="Test",
+            lastName="User")
+
+    def test(self):
+        group = GroupModel(id="abc123", name="Test Group")
+        user_added_to_group.send(None,
+                                 user=self.user,
+                                 groups=[group],
+                                 request=self.request)
+        self.assertEqual(len(mail.outbox), 1)
+        msg = mail.outbox[0]
+        self._assert_common_email_attributes(msg)
+        self.assertEqual(msg.subject,
+                         f"You've been added to group "
+                         f"[{group.name}] in {PORTAL_TITLE}")
+
+    def test_multiple_groups(self):
+        group1 = GroupModel(id="abc123", name="Test Group")
+        group2 = GroupModel(id="group2", name="Group 2")
+        user_added_to_group.send(None,
+                                 user=self.user,
+                                 groups=[group1, group2],
+                                 request=self.request)
+        self.assertEqual(len(mail.outbox), 1)
+        msg = mail.outbox[0]
+        self._assert_common_email_attributes(msg)
+        self.assertEqual(msg.subject,
+                         f"You've been added to groups "
+                         f"[{group1.name}] and [{group2.name}] "
+                         f"in {PORTAL_TITLE}")
+        self.assertIn("groups Test Group and Group 2", msg.body)
+
+    def _assert_common_email_attributes(self, msg):
+        self.assertEqual(msg.from_email,
+                         f"\"{PORTAL_TITLE}\" <{SERVER_EMAIL}>")
+        self.assertEqual(
+            msg.reply_to,
+            [f"\"{PORTAL_ADMINS[0][0]}\" <{PORTAL_ADMINS[0][1]}>"])
+        self.assertSequenceEqual(
+            msg.to, [f"\"{self.user.firstName} {self.user.lastName}\" "
+                     f"<{self.user.emails[0]}>"])
+        self.assertIn(
+            self.request.build_absolute_uri(
+                reverse("django_airavata_workspace:dashboard")),
+            msg.body)
+        self.assertIn(
+            self.request.build_absolute_uri(
+                reverse("django_airavata_workspace:experiments")),
+            msg.body)
+        self.assertIn(self.user.userId, msg.body)
diff --git a/django_airavata/apps/auth/tests/test_views.py b/django_airavata/apps/auth/tests/test_views.py
new file mode 100644
index 0000000..dc7e671
--- /dev/null
+++ b/django_airavata/apps/auth/tests/test_views.py
@@ -0,0 +1,183 @@
+from unittest.mock import patch
+from urllib.parse import urlencode
+
+from django.contrib.auth.models import AnonymousUser
+from django.contrib.messages.middleware import MessageMiddleware
+from django.contrib.sessions.middleware import SessionMiddleware
+from django.core import mail
+from django.http import HttpResponseRedirect
+from django.shortcuts import reverse
+from django.test import RequestFactory, TestCase
+
+from django_airavata.apps.auth import models, views
+
+
+class LoginViewTestCase(TestCase):
+
+    def test_login_with_next_param(self):
+
+        response = self.client.get('/auth/login', data={'next': '/some/url'})
+        self.assertTrue('next' in response.context)
+        self.assertEqual(response.context['next'], '/some/url')
+        self.assertContains(
+            response,
+            '<input type="hidden" name="next" value="/some/url"/>')
+        # Create account url should pass along the next param
+        create_account_url = (reverse('django_airavata_auth:create_account') +
+                              "?" +
+                              urlencode({'next': '/some/url'}))
+        self.assertContains(response, f'<a href="{create_account_url}">')
+
+
+class CreateAccountViewTestCase(TestCase):
+
+    def setUp(self):
+        self.factory = RequestFactory()
+
+    def test_create_account_with_next_param(self):
+        create_account_url = (reverse('django_airavata_auth:create_account') +
+                              "?" +
+                              urlencode({'next': '/some/url'}))
+        response = self.client.get(create_account_url)
+        self.assertTrue('form' in response.context)
+        form = response.context['form']
+        self.assertEqual(form.initial['next'], "/some/url")
+
+    # Need to mock the iam_admin_client twice because it is imported in .forms
+    # and in .views
+    @patch('django_airavata.apps.auth.forms.iam_admin_client')
+    @patch('django_airavata.apps.auth.views.iam_admin_client')
+    def test_submit_create_account_with_next(self, forms_iam_admin_client,
+                                             views_iam_admin_client):
+
+        # make sure there are no EmailVerification records at the beginning
+        self.assertEqual(0, models.EmailVerification.objects.all().count())
+        create_account_url = reverse('django_airavata_auth:create_account')
+        data = {
+            'username': 'testuser',
+            'email': 'test@example.com',
+            'email_again': 'test@example.com',
+            'first_name': 'Test',
+            'last_name': 'User',
+            'password': 'passworD1#',
+            'password_again': 'passworD1#',
+            'next': '/next/path'
+        }
+        request = self.factory.post(create_account_url, data)
+        request.user = AnonymousUser()
+        forms_iam_admin_client.is_username_available.return_value = True
+        views_iam_admin_client.register_user.return_value = True
+        # RequestFactory doesn't load middleware so have to manually call
+        # SessionMiddleware and MessageMiddleware since create_account uses
+        # 'messages' framework
+        response = SessionMiddleware(
+            MessageMiddleware(
+                views.create_account))(request)
+        self.assertEqual(302, response.status_code)
+        self.assertIsInstance(response, HttpResponseRedirect)
+        self.assertEqual(reverse('django_airavata_auth:create_account'),
+                         response.url)
+        self.assertEqual(len(mail.outbox), 1)
+        email_verification = models.EmailVerification.objects.get(
+            username=data['username'])
+        self.assertIsNotNone(email_verification)
+        self.assertEqual(data['next'], email_verification.next)
+
+    @patch('django_airavata.apps.auth.forms.iam_admin_client')
+    def test_submit_invalid_create_account_with_next(
+            self, forms_iam_admin_client):
+
+        # make sure there are no EmailVerification records at the beginning
+        self.assertEqual(0, models.EmailVerification.objects.all().count())
+        create_account_url = reverse('django_airavata_auth:create_account')
+        data = {
+            'username': 'testuser',
+            'email': 'test@example.com',
+            'email_again': 'test@example.com',
+            'first_name': 'Test',
+            'last_name': 'User',
+            'password': 'passworD1#',
+            # make invalid by having the password_again not match
+            'password_again': 'DOESNT-MATCH',
+            'next': '/next/path'
+        }
+        request = self.factory.post(create_account_url, data)
+        request.user = AnonymousUser()
+        forms_iam_admin_client.is_username_available.return_value = True
+        # RequestFactory doesn't load middleware so have to manually call
+        # SessionMiddleware and MessageMiddleware since create_account uses
+        # 'messages' framework
+        response = SessionMiddleware(
+            MessageMiddleware(
+                views.create_account))(request)
+        self.assertEqual(200, response.status_code)
+        self.assertNotIsInstance(response, HttpResponseRedirect)
+        # No email is sent
+        self.assertEqual(len(mail.outbox), 0)
+        # Make sure that the 'next' field was put back into the form
+        self.assertRegex(
+            response.content.decode("utf-8"),
+            '(?s)type="hidden"[^>]+name="next"[^>]+value="/next/path"')
+
+
+class VerifyEmailViewTestCase(TestCase):
+
+    def setUp(self):
+        self.factory = RequestFactory()
+
+    @patch('django_airavata.apps.auth.views.iam_admin_client')
+    def test_verify_email(self, views_iam_admin_client):
+
+        # create an EmailVerification record with a next url
+        email_verification = models.EmailVerification(username='testuser')
+        email_verification.save()
+
+        verify_email_url = reverse(
+            'django_airavata_auth:verify_email', kwargs={
+                'code': email_verification.verification_code})
+        request = self.factory.get(verify_email_url)
+        request.user = AnonymousUser()
+        # Skip enabling the user
+        views_iam_admin_client.is_user_enabled.return_value = True
+        # RequestFactory doesn't load middleware so have to manually call
+        # SessionMiddleware and MessageMiddleware since create_account uses
+        # 'messages' framework
+        response = SessionMiddleware(MessageMiddleware(
+            lambda r: views.verify_email(r,
+                                         email_verification.verification_code)
+        ))(request)
+        self.assertIsInstance(response, HttpResponseRedirect)
+        self.assertEqual(reverse('django_airavata_auth:login'), response.url)
+        email_verification = models.EmailVerification.objects.get(
+            username="testuser")
+        self.assertTrue(email_verification.verified)
+
+    @patch('django_airavata.apps.auth.views.iam_admin_client')
+    def test_verify_email_with_next(self, views_iam_admin_client):
+
+        # create an EmailVerification record with a next url
+        email_verification = models.EmailVerification(
+            username='testuser', next='/next/path')
+        email_verification.save()
+
+        verify_email_url = reverse(
+            'django_airavata_auth:verify_email', kwargs={
+                'code': email_verification.verification_code})
+        request = self.factory.get(verify_email_url)
+        request.user = AnonymousUser()
+        # Skip enabling the user
+        views_iam_admin_client.is_user_enabled.return_value = True
+        # RequestFactory doesn't load middleware so have to manually call
+        # SessionMiddleware and MessageMiddleware since create_account uses
+        # 'messages' framework
+        response = SessionMiddleware(MessageMiddleware(
+            lambda r: views.verify_email(r,
+                                         email_verification.verification_code)
+        ))(request)
+        self.assertIsInstance(response, HttpResponseRedirect)
+        self.assertEqual(reverse('django_airavata_auth:login') + "?" +
+                         urlencode({'next': email_verification.next}),
+                         response.url)
+        email_verification = models.EmailVerification.objects.get(
+            username="testuser")
+        self.assertTrue(email_verification.verified)
diff --git a/django_airavata/apps/auth/utils.py b/django_airavata/apps/auth/utils.py
index e8ce6d0..abef379 100644
--- a/django_airavata/apps/auth/utils.py
+++ b/django_airavata/apps/auth/utils.py
@@ -97,6 +97,28 @@
                        from_email="{} <{}>".format(
                            settings.PORTAL_TITLE,
                            settings.SERVER_EMAIL),
-                       to=[a[1] for a in settings.PORTAL_ADMINS])
+                       to=[a[1] for a in getattr(settings,
+                                                 'PORTAL_ADMINS',
+                                                 settings.ADMINS)])
+    msg.content_subtype = 'html'
+    msg.send()
+
+
+def send_email_to_user(template_id, context):
+    email_template = models.EmailTemplate.objects.get(pk=template_id)
+    subject = Template(email_template.subject).render(context)
+    body = Template(email_template.body).render(context)
+    msg = EmailMessage(
+        subject=subject,
+        body=body,
+        from_email="\"{}\" <{}>".format(settings.PORTAL_TITLE,
+                                        settings.SERVER_EMAIL),
+        to=["\"{} {}\" <{}>".format(context['first_name'],
+                                    context['last_name'],
+                                    context['email'])],
+        reply_to=[f"\"{a[0]}\" <{a[1]}>" for a in getattr(settings,
+                                                          'PORTAL_ADMINS',
+                                                          settings.ADMINS)]
+    )
     msg.content_subtype = 'html'
     msg.send()
diff --git a/django_airavata/apps/auth/views.py b/django_airavata/apps/auth/views.py
index 785c7d6..aceaa45 100644
--- a/django_airavata/apps/auth/views.py
+++ b/django_airavata/apps/auth/views.py
@@ -7,11 +7,10 @@
 from django.contrib import messages
 from django.contrib.auth import authenticate, login, logout
 from django.core.exceptions import ObjectDoesNotExist
-from django.core.mail import EmailMessage
 from django.forms import ValidationError
 from django.http import HttpResponseBadRequest, JsonResponse
 from django.shortcuts import redirect, render, resolve_url
-from django.template import Context, Template
+from django.template import Context
 from django.urls import reverse
 from django.views.decorators.debug import sensitive_variables
 from requests_oauthlib import OAuth2Session
@@ -22,9 +21,16 @@
 
 
 def start_login(request):
+    next_url = request.GET.get('next', None)
+    if next_url is not None:
+        create_account_url = (reverse('django_airavata_auth:create_account') +
+                              "?" + urlencode({'next': next_url}))
+    else:
+        create_account_url = reverse('django_airavata_auth:create_account')
     return render(request, 'django_airavata_auth/login.html', {
         'next': request.GET.get('next', None),
         'options': settings.AUTHENTICATION_OPTIONS,
+        'create_account_url': create_account_url
     })
 
 
@@ -118,11 +124,14 @@
     try:
         login_desktop = request.GET.get('login_desktop', "false") == "true"
         user = authenticate(request=request)
-        login(request, user)
-        if login_desktop:
-            return _create_login_desktop_success_response(request)
-        next_url = request.GET.get('next', settings.LOGIN_REDIRECT_URL)
-        return redirect(next_url)
+        if user is not None:
+            login(request, user)
+            if login_desktop:
+                return _create_login_desktop_success_response(request)
+            next_url = request.GET.get('next', settings.LOGIN_REDIRECT_URL)
+            return redirect(next_url)
+        else:
+            raise Exception("Failed to authenticate user")
     except Exception as err:
         logger.exception("An error occurred while processing OAuth2 "
                          "callback: {}".format(request.build_absolute_uri()))
@@ -170,8 +179,9 @@
                     form.add_error(None, ValidationError(
                         "Failed to register user with IAM service"))
                 else:
+                    next = form.cleaned_data['next']
                     _create_and_send_email_verification_link(
-                        request, username, email, first_name, last_name)
+                        request, username, email, first_name, last_name, next)
                     messages.success(
                         request,
                         "Account request processed successfully. Before you "
@@ -185,7 +195,7 @@
                     "Failed to create account for user", exc_info=e)
                 form.add_error(None, ValidationError(e.message))
     else:
-        form = forms.CreateAccountForm()
+        form = forms.CreateAccountForm(initial=request.GET)
     return render(request, 'django_airavata_auth/create_account.html', {
         'options': settings.AUTHENTICATION_OPTIONS,
         'form': form
@@ -202,13 +212,16 @@
         # Check if user is enabled, if so redirect to login page
         username = email_verification.username
         logger.debug("Email address verified for {}".format(username))
+        login_url = reverse('django_airavata_auth:login')
+        if email_verification.next:
+            login_url += "?" + urlencode({'next': email_verification.next})
         if iam_admin_client.is_user_enabled(username):
             logger.debug("User {} is already enabled".format(username))
             messages.success(
                 request,
                 "Your account has already been successfully created. "
                 "Please log in now.")
-            return redirect(reverse('django_airavata_auth:login'))
+            return redirect(login_url)
         else:
             logger.debug("Enabling user {}".format(username))
             # enable user and inform admins
@@ -226,7 +239,7 @@
                 request,
                 "Your account has been successfully created. "
                 "Please log in now.")
-            return redirect(reverse('django_airavata_auth:login'))
+            return redirect(login_url)
     except ObjectDoesNotExist as e:
         # if doesn't exist, give user a form where they can enter their
         # username to resend verification code
@@ -287,10 +300,10 @@
 
 
 def _create_and_send_email_verification_link(
-        request, username, email, first_name, last_name):
+        request, username, email, first_name, last_name, next):
 
     email_verification = models.EmailVerification(
-        username=username)
+        username=username, next=next)
     email_verification.save()
 
     verification_uri = request.build_absolute_uri(
@@ -308,7 +321,7 @@
         "portal_title": settings.PORTAL_TITLE,
         "url": verification_uri,
     })
-    _send_email_to_user(models.VERIFY_EMAIL_TEMPLATE, context)
+    utils.send_email_to_user(models.VERIFY_EMAIL_TEMPLATE, context)
 
 
 def forgot_password(request):
@@ -374,7 +387,7 @@
         "portal_title": settings.PORTAL_TITLE,
         "url": verification_uri,
     })
-    _send_email_to_user(models.PASSWORD_RESET_EMAIL_TEMPLATE, context)
+    utils.send_email_to_user(models.PASSWORD_RESET_EMAIL_TEMPLATE, context)
 
 
 @sensitive_variables('password')
@@ -427,23 +440,6 @@
     })
 
 
-def _send_email_to_user(template_id, context):
-    email_template = models.EmailTemplate.objects.get(
-        pk=template_id)
-    subject = Template(email_template.subject).render(context)
-    body = Template(email_template.body).render(context)
-    msg = EmailMessage(
-        subject=subject,
-        body=body,
-        from_email="{} <{}>".format(settings.PORTAL_TITLE,
-                                    settings.SERVER_EMAIL),
-        to=["{} {} <{}>".format(context['first_name'],
-                                context['last_name'],
-                                context['email'])])
-    msg.content_subtype = 'html'
-    msg.send()
-
-
 def login_desktop(request):
     context = {
         'options': settings.AUTHENTICATION_OPTIONS,
diff --git a/django_airavata/apps/dataparsers/vue.config.js b/django_airavata/apps/dataparsers/vue.config.js
index 4d00b29..bc51dd7 100644
--- a/django_airavata/apps/dataparsers/vue.config.js
+++ b/django_airavata/apps/dataparsers/vue.config.js
@@ -7,7 +7,6 @@
       ? "http://localhost:9000/static/django_airavata_dataparsers/dist/"
       : "/static/django_airavata_dataparsers/dist/",
   outputDir: "./static/django_airavata_dataparsers/dist",
-  productionSourceMap: false,
   pages: {
       'parser-details': './static/django_airavata_dataparsers/js/entry-parser-details',
       'parser-list': './static/django_airavata_dataparsers/js/parser-listing-entry-point.js',
diff --git a/django_airavata/apps/groups/vue.config.js b/django_airavata/apps/groups/vue.config.js
index d2c41d9..5fdc24f 100644
--- a/django_airavata/apps/groups/vue.config.js
+++ b/django_airavata/apps/groups/vue.config.js
@@ -7,7 +7,6 @@
       ? "http://localhost:9000/static/django_airavata_groups/dist/"
       : "/static/django_airavata_groups/dist/",
   outputDir: "./static/django_airavata_groups/dist",
-  productionSourceMap: false,
   pages: {
     'group-list': './static/django_airavata_groups/js/group-listing-entry-point.js',
     'group-create': './static/django_airavata_groups/js/group-create-entry-point.js',
diff --git a/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/js/input-editors/InputEditorMixin.js b/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/js/input-editors/InputEditorMixin.js
index 585697d..535e382 100644
--- a/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/js/input-editors/InputEditorMixin.js
+++ b/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/js/input-editors/InputEditorMixin.js
@@ -19,6 +19,10 @@
             type: String,
             required: true,
         },
+        readOnly: {
+          type: Boolean,
+          default: false
+        }
     },
     data () {
         return {
diff --git a/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/vue.config.js b/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/vue.config.js
index 7ce6a61..e9eb2c0 100644
--- a/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/vue.config.js
+++ b/django_airavata/apps/workspace/django-airavata-workspace-plugin-api/vue.config.js
@@ -1,6 +1,5 @@
 module.exports = {
   configureWebpack: {
     externals: ["django-airavata-api"]
-  },
-  productionSourceMap: false,
+  }
 };
diff --git a/django_airavata/apps/workspace/package.json b/django_airavata/apps/workspace/package.json
index 7ffab05..424c5ed 100644
--- a/django_airavata/apps/workspace/package.json
+++ b/django_airavata/apps/workspace/package.json
@@ -19,6 +19,7 @@
     "django-airavata-api": "link:../api",
     "django-airavata-common-ui": "link:../../static/common",
     "django-airavata-workspace-plugin-api": "link:django-airavata-workspace-plugin-api",
+    "lodash": "^4.17.15",
     "moment": "^2.21.0",
     "terser": "^4.1.2",
     "vue": "^2.5.22",
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentSummary.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentSummary.vue
index 95265f3..f03b0cf 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentSummary.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentSummary.vue
@@ -200,6 +200,10 @@
               <th scope="row">Node Count</th>
               <td>{{ experiment.userConfigurationData.computationalResourceScheduling.nodeCount }}</td>
             </tr>
+            <tr v-if="experiment.userConfigurationData.computationalResourceScheduling.totalPhysicalMemory">
+              <th scope="row">Total Physical Memory</th>
+              <td>{{ experiment.userConfigurationData.computationalResourceScheduling.totalPhysicalMemory.toLocaleString() }} MB</td>
+            </tr>
             <tr>
               <th scope="row">Queue</th>
               <td>{{ experiment.userConfigurationData.computationalResourceScheduling.queueName }}</td>
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/QueueSettingsEditor.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/QueueSettingsEditor.vue
index b8af3e9..fa4fbf8 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/QueueSettingsEditor.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/QueueSettingsEditor.vue
@@ -1,31 +1,37 @@
 <template>
-
   <div>
     <div class="row">
       <div class="col">
-        <div
-          class="card border-default"
-          :class="{ 'border-danger': !valid }"
-        >
+        <div class="card border-default" :class="{ 'border-danger': !valid }">
           <b-link
             @click="showConfiguration = !showConfiguration"
             class="card-link text-dark"
           >
             <div class="card-body">
-              <h5 class="card-title mb-4">Settings for queue {{ localComputationalResourceScheduling.queueName }}</h5>
+              <h5 class="card-title mb-4">
+                Settings for queue {{ data.queueName }}
+              </h5>
               <div class="row">
                 <div class="col">
-                  <h3 class="h5 mb-0">{{ localComputationalResourceScheduling.nodeCount }}</h3>
+                  <h3 class="h5 mb-0">
+                    {{ data.nodeCount }}
+                  </h3>
                   <span class="text-muted text-uppercase">NODE COUNT</span>
                 </div>
                 <div class="col">
-                  <h3 class="h5 mb-0">{{ localComputationalResourceScheduling.totalCPUCount }}</h3>
+                  <h3 class="h5 mb-0">
+                    {{ data.totalCPUCount }}
+                  </h3>
                   <span class="text-muted text-uppercase">CORE COUNT</span>
                 </div>
                 <div class="col">
-                  <h3 class="h5 mb-0">{{ localComputationalResourceScheduling.wallTimeLimit }} minutes</h3>
+                  <h3 class="h5 mb-0">{{ data.wallTimeLimit }} minutes</h3>
                   <span class="text-muted text-uppercase">TIME LIMIT</span>
                 </div>
+                <div class="col" v-if="maxPhysicalMemory > 0">
+                  <h3 class="h5 mb-0">{{ data.totalPhysicalMemory }} MB</h3>
+                  <span class="text-muted text-uppercase">PHYSICAL MEMORY</span>
+                </div>
               </div>
             </div>
           </b-link>
@@ -38,7 +44,7 @@
           <b-form-group
             label="Select a Queue"
             label-for="queue"
-            :feedback="getValidationFeedback('queueName')"
+            :invalid-feedback="getValidationFeedback('queueName')"
             :state="getValidationState('queueName')"
           >
             <b-form-select
@@ -51,13 +57,13 @@
             >
             </b-form-select>
             <div slot="description">
-              {{ selectedQueueDefault.queueDescription }}
+              {{ queueDescription }}
             </div>
           </b-form-group>
           <b-form-group
             label="Node Count"
             label-for="node-count"
-            :feedback="getValidationFeedback('nodeCount')"
+            :invalid-feedback="getValidationFeedback('nodeCount')"
             :state="getValidationState('nodeCount', true)"
           >
             <b-form-input
@@ -71,17 +77,14 @@
             >
             </b-form-input>
             <div slot="description">
-              <i
-                class="fa fa-info-circle"
-                aria-hidden="true"
-              ></i>
+              <i class="fa fa-info-circle" aria-hidden="true"></i>
               Max Allowed Nodes = {{ maxNodes }}
             </div>
           </b-form-group>
           <b-form-group
             label="Total Core Count"
             label-for="core-count"
-            :feedback="getValidationFeedback('totalCPUCount')"
+            :invalid-feedback="getValidationFeedback('totalCPUCount')"
             :state="getValidationState('totalCPUCount', true)"
           >
             <b-form-input
@@ -95,20 +98,17 @@
             >
             </b-form-input>
             <div slot="description">
-              <i
-                class="fa fa-info-circle"
-                aria-hidden="true"
-              ></i>
+              <i class="fa fa-info-circle" aria-hidden="true"></i>
               Max Allowed Cores = {{ maxCPUCount }}
             </div>
           </b-form-group>
           <b-form-group
-            label="Wall Time Limit (in minutes)"
+            label="Wall Time Limit"
             label-for="walltime-limit"
-            :feedback="getValidationFeedback('wallTimeLimit')"
+            :invalid-feedback="getValidationFeedback('wallTimeLimit')"
             :state="getValidationState('wallTimeLimit', true)"
           >
-            <b-input-group right="minutes">
+            <b-input-group append="minutes">
               <b-form-input
                 id="walltime-limit"
                 type="number"
@@ -121,24 +121,42 @@
               </b-form-input>
             </b-input-group>
             <div slot="description">
-              <i
-                class="fa fa-info-circle"
-                aria-hidden="true"
-              ></i>
+              <i class="fa fa-info-circle" aria-hidden="true"></i>
               Max Allowed Wall Time = {{ maxWalltime }} minutes
             </div>
           </b-form-group>
+          <b-form-group
+            v-if="maxPhysicalMemory > 0"
+            label="Total Physical Memory"
+            label-for="total-physical-memory"
+            :invalid-feedback="getValidationFeedback('totalPhysicalMemory')"
+            :state="getValidationState('totalPhysicalMemory', true)"
+          >
+            <b-input-group append="MB">
+              <b-form-input
+                id="total-physical-memory"
+                type="number"
+                min="0"
+                :max="maxPhysicalMemory"
+                v-model="data.totalPhysicalMemory"
+                :state="getValidationState('totalPhysicalMemory', true)"
+              >
+              </b-form-input>
+            </b-input-group>
+            <div slot="description">
+              <i class="fa fa-info-circle" aria-hidden="true"></i>
+              Max Physical Memory = {{ maxPhysicalMemory }} MB
+            </div>
+          </b-form-group>
           <div>
             <a
               class="text-secondary action-link"
               href="#"
               @click.prevent="showConfiguration = false"
             >
-              <i
-                class="fa fa-times text-secondary"
-                aria-hidden="true"
-              ></i>
-              Hide Settings</a>
+              <i class="fa fa-times text-secondary" aria-hidden="true"></i>
+              Hide Settings</a
+            >
           </div>
         </div>
       </div>
@@ -172,8 +190,8 @@
   },
   data() {
     return {
-      queueDefaults: [],
-      showConfiguration: false
+      showConfiguration: false,
+      appDeploymentQueues: null
     };
   },
   computed: {
@@ -186,20 +204,16 @@
       });
       return queueOptions;
     },
-    localComputationalResourceScheduling() {
-      return this.data;
-    },
     selectedQueueDefault: function() {
       return this.queueDefaults.find(
-        queue =>
-          queue.queueName ===
-          this.localComputationalResourceScheduling.queueName
+        queue => queue.queueName === this.data.queueName
       );
     },
     maxCPUCount: function() {
-      const batchQueueResourcePolicy = this.getBatchQueueResourcePolicy(
-        this.selectedQueueDefault.queueName
-      );
+      if (!this.selectedQueueDefault) {
+        return 0;
+      }
+      const batchQueueResourcePolicy = this.batchQueueResourcePolicy;
       if (batchQueueResourcePolicy) {
         return Math.min(
           batchQueueResourcePolicy.maxAllowedCores,
@@ -209,9 +223,10 @@
       return this.selectedQueueDefault.maxProcessors;
     },
     maxNodes: function() {
-      const batchQueueResourcePolicy = this.getBatchQueueResourcePolicy(
-        this.selectedQueueDefault.queueName
-      );
+      if (!this.selectedQueueDefault) {
+        return 0;
+      }
+      const batchQueueResourcePolicy = this.batchQueueResourcePolicy;
       if (batchQueueResourcePolicy) {
         return Math.min(
           batchQueueResourcePolicy.maxAllowedNodes,
@@ -221,9 +236,10 @@
       return this.selectedQueueDefault.maxNodes;
     },
     maxWalltime: function() {
-      const batchQueueResourcePolicy = this.getBatchQueueResourcePolicy(
-        this.selectedQueueDefault.queueName
-      );
+      if (!this.selectedQueueDefault) {
+        return 0;
+      }
+      const batchQueueResourcePolicy = this.batchQueueResourcePolicy;
       if (batchQueueResourcePolicy) {
         return Math.min(
           batchQueueResourcePolicy.maxAllowedWalltime,
@@ -232,14 +248,55 @@
       }
       return this.selectedQueueDefault.maxRunTime;
     },
+    maxPhysicalMemory: function() {
+      if (!this.selectedQueueDefault) {
+        return 0;
+      }
+      return this.selectedQueueDefault.maxMemory;
+    },
+    queueDefaults() {
+      return this.appDeploymentQueues
+        ? this.appDeploymentQueues
+            .filter(q => this.isQueueInComputeResourcePolicy(q.queueName))
+            .sort((a, b) => {
+              // Sort default first, then by alphabetically by name
+              if (a.isDefaultQueue) {
+                return -1;
+              } else if (b.isDefaultQueue) {
+                return 1;
+              } else {
+                return a.queueName.localeCompare(b.queueName);
+              }
+            })
+        : [];
+    },
+    defaultQueue() {
+      if (this.queueDefaults.length === 0) {
+        return null;
+      }
+      return this.queueDefaults[0];
+    },
+    batchQueueResourcePolicy() {
+      if (!this.selectedQueueDefault) {
+        return null;
+      }
+      return this.getBatchQueueResourcePolicy(
+        this.selectedQueueDefault.queueName
+      );
+    },
+    queueDescription() {
+      return this.selectedQueueDefault
+        ? this.selectedQueueDefault.queueDescription
+        : null;
+    },
     validation() {
       // Don't run validation if we don't have selectedQueueDefault
       if (!this.selectedQueueDefault) {
-        return {};
+        return this.data.validate();
       }
-      return this.localComputationalResourceScheduling.validate(
+      return this.data.validate(
         this.selectedQueueDefault,
-        this.getBatchQueueResourcePolicy(this.selectedQueueDefault.queueName)
+        this.batchQueueResourcePolicy
       );
     },
     valid() {
@@ -254,6 +311,9 @@
       this.data.totalCPUCount = this.getDefaultCPUCount(queueDefault);
       this.data.nodeCount = this.getDefaultNodeCount(queueDefault);
       this.data.wallTimeLimit = this.getDefaultWalltime(queueDefault);
+      if (this.maxPhysicalMemory === 0) {
+        this.data.totalPhysicalMemory = 0;
+      }
     },
     validate() {
       if (!this.valid) {
@@ -262,41 +322,25 @@
         this.$emit("valid");
       }
     },
-    loadQueueDefaults: function(updateQueueSettings) {
+    loadAppDeploymentQueues() {
       return services.ApplicationDeploymentService.getQueues({
         lookup: this.appDeploymentId
-      }).then(queueDefaults => {
-        // Sort queue defaults
-        this.queueDefaults = queueDefaults
-          .filter(q => this.isQueueInComputeResourcePolicy(q.queueName))
-          .sort((a, b) => {
-            // Sort default first, then by alphabetically by name
-            if (a.isDefaultQueue) {
-              return -1;
-            } else if (b.isDefaultQueue) {
-              return 1;
-            } else {
-              return a.queueName.localeCompare(b.queueName);
-            }
-          });
+      }).then(queueDefaults => (this.appDeploymentQueues = queueDefaults));
+    },
+    setDefaultQueue() {
+      if (this.queueDefaults.length === 0) {
+        this.data.queueName = null;
+        return;
+      }
+      const defaultQueue = this.queueDefaults[0];
 
-        if (updateQueueSettings) {
-          // Find the default queue and apply it's settings
-          const defaultQueue = this.queueDefaults[0];
-
-          this.localComputationalResourceScheduling.queueName =
-            defaultQueue.queueName;
-          this.localComputationalResourceScheduling.totalCPUCount = this.getDefaultCPUCount(
-            defaultQueue
-          );
-          this.localComputationalResourceScheduling.nodeCount = this.getDefaultNodeCount(
-            defaultQueue
-          );
-          this.localComputationalResourceScheduling.wallTimeLimit = this.getDefaultWalltime(
-            defaultQueue
-          );
-        }
-      });
+      this.data.queueName = defaultQueue.queueName;
+      this.data.totalCPUCount = this.getDefaultCPUCount(defaultQueue);
+      this.data.nodeCount = this.getDefaultNodeCount(defaultQueue);
+      this.data.wallTimeLimit = this.getDefaultWalltime(defaultQueue);
+      if (this.maxPhysicalMemory === 0) {
+        this.data.totalPhysicalMemory = 0;
+      }
     },
     isQueueInComputeResourcePolicy: function(queueName) {
       if (!this.computeResourcePolicy) {
@@ -316,9 +360,7 @@
       );
     },
     getDefaultCPUCount: function(queueDefault) {
-      const batchQueueResourcePolicy = this.getBatchQueueResourcePolicy(
-        queueDefault.queueName
-      );
+      const batchQueueResourcePolicy = this.batchQueueResourcePolicy;
       if (batchQueueResourcePolicy) {
         return Math.min(
           batchQueueResourcePolicy.maxAllowedCores,
@@ -328,9 +370,7 @@
       return queueDefault.defaultCPUCount;
     },
     getDefaultNodeCount: function(queueDefault) {
-      const batchQueueResourcePolicy = this.getBatchQueueResourcePolicy(
-        queueDefault.queueName
-      );
+      const batchQueueResourcePolicy = this.batchQueueResourcePolicy;
       if (batchQueueResourcePolicy) {
         return Math.min(
           batchQueueResourcePolicy.maxAllowedNodes,
@@ -340,9 +380,7 @@
       return queueDefault.defaultNodeCount;
     },
     getDefaultWalltime: function(queueDefault) {
-      const batchQueueResourcePolicy = this.getBatchQueueResourcePolicy(
-        queueDefault.queueName
-      );
+      const batchQueueResourcePolicy = this.batchQueueResourcePolicy;
       if (batchQueueResourcePolicy) {
         return Math.min(
           batchQueueResourcePolicy.maxAllowedWalltime,
@@ -360,22 +398,43 @@
         : showValidState
         ? "valid"
         : null;
+    },
+    applyBatchQueueResourcePolicy() {
+      // Apply batchQueueResourcePolicy maximums
+      if (this.selectedQueueDefault) {
+        this.data.totalCPUCount = Math.min(this.data.totalCPUCount, this.maxCPUCount);
+        this.data.nodeCount = Math.min(this.data.nodeCount, this.maxNodes);
+        this.data.wallTimeLimit = Math.min(this.data.wallTimeLimit, this.maxWalltime);
+      }
     }
   },
   watch: {
-    appDeploymentId: function() {
-      this.loadQueueDefaults(true);
+    appDeploymentId() {
+      this.loadAppDeploymentQueues().then(() => this.setDefaultQueue());
+    },
+    // If batch queue policy changes, apply any maximum values to current values
+    batchQueueResourcePolicy(value, oldValue) {
+      if (value && (!oldValue || value.resourcePolicyId !== oldValue.resourcePolicyId)) {
+        this.applyBatchQueueResourcePolicy();
+      }
+    },
+    computeResourcePolicy() {
+      if (!this.isQueueInComputeResourcePolicy(this.data.queueName)) {
+        this.setDefaultQueue();
+      }
     }
   },
   mounted: function() {
-    // For brand new queue settings (no queueName specified) load the default
-    // queue and its default values and apply them
-    const updateQueueSettings = !this.value.queueName;
-    this.loadQueueDefaults(updateQueueSettings).then(() => this.validate());
+    this.loadAppDeploymentQueues().then(() => {
+      // For brand new queue settings (no queueName specified) load the default
+      // queue and its default values and apply them
+      if (!this.value.queueName) {
+        this.setDefaultQueue();
+      }
+    });
     this.$on("input", () => this.validate());
   }
 };
 </script>
 
-<style>
-</style>
+<style></style>
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/AutocompleteInputEditor.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/AutocompleteInputEditor.vue
new file mode 100644
index 0000000..6efd81e
--- /dev/null
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/AutocompleteInputEditor.vue
@@ -0,0 +1,151 @@
+<template>
+  <div v-if="value" class="d-flex pl-3">
+    {{ text }}
+    <b-link @click="cancel" class="ml-auto text-danger"
+      >Cancel
+      <i class="fa fa-times" aria-hidden="true"></i>
+    </b-link>
+  </div>
+  <div v-else>
+    <autocomplete-text-input
+      :suggestions="suggestions"
+      @selected="selected"
+      @search-changed="searchChanged"
+      :max-matches="10"
+    />
+  </div>
+</template>
+
+<script>
+import { utils } from "django-airavata-api";
+import { InputEditorMixin } from "django-airavata-workspace-plugin-api";
+import { components } from "django-airavata-common-ui";
+import _ from "lodash";
+
+export default {
+  name: "autocomplete-input-editor",
+  mixins: [InputEditorMixin],
+  components: {
+    "autocomplete-text-input": components.AutocompleteTextInput
+  },
+  props: {
+    value: {
+      type: String
+    }
+  },
+  data() {
+    return {
+      text: null,
+      searchString: "",
+      searchResults: null,
+      lastUpdate: Date.now()
+    };
+  },
+  computed: {
+    suggestions() {
+      return this.searchResults
+        ? this.searchResults.results.map(r => {
+            return {
+              id: r.value,
+              name: r.text
+            };
+          })
+        : [];
+    },
+    autocompleteUrl() {
+      if (
+        this.experimentInput.editorConfig &&
+        "url" in this.experimentInput.editorConfig
+      ) {
+        return this.experimentInput.editorConfig.url;
+      } else {
+        // eslint-disable-next-line no-console
+        console.warn(
+          "editor config is missing 'url'. Make sure input " +
+            this.experimentInput.name +
+            " has metadata configuration something like:\n" +
+            JSON.stringify(
+              {
+                editor: {
+                  "ui-component-id": "autocomplete-input-editor",
+                  config: {
+                    url: "/some/custom/search/"
+                  }
+                }
+              },
+              null,
+              4
+            )
+        );
+        return null;
+      }
+    }
+  },
+  methods: {
+    loadTextForValue(value) {
+      if (this.autocompleteUrl) {
+        return utils.FetchUtils.get(
+          this.autocompleteUrl,
+          {
+            exact: value
+          },
+          {
+            ignoreErrors: true // don't automatically report errors to user - code will handle 404s
+          }
+        )
+          .then(resp => {
+            if (resp.results && resp.results.length > 0) {
+              return resp.results[0].text;
+            } else {
+              return `value: ${value}`;
+            }
+          })
+          .catch(error => {
+            if (error.details.status === 404) {
+              // if we can't fine an exact match, just return the value as the text
+              return `value: ${value}`;
+            } else {
+              throw error;
+            }
+          });
+      } else {
+        return Promise.resolve(null);
+      }
+    },
+    cancel() {
+      this.data = null;
+      this.valueChanged();
+    },
+    selected(suggestion) {
+      this.data = suggestion.id;
+      this.text = suggestion.name;
+      this.valueChanged();
+    },
+    searchChanged: _.debounce(function(newValue) {
+      // TODO: don't query when search value is empty string
+      this.searchString = newValue;
+      const currentTime = Date.now();
+      if (this.autocompleteUrl) {
+        utils.FetchUtils.get(
+          this.autocompleteUrl,
+          {
+            search: this.searchString
+          },
+          { showSpinner: false }
+        ).then(resp => {
+          // Prevent older responses from overwriting newer ones
+          if (currentTime > this.lastUpdate) {
+            this.searchResults = resp;
+            this.lastUpdate = currentTime;
+          }
+        });
+      }
+    }, 200)
+  },
+  created() {
+    if (this.value) {
+      this.loadTextForValue(this.value).then(text => (this.text = text));
+    }
+  }
+};
+</script>
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/CheckboxInputEditor.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/CheckboxInputEditor.vue
index 2d103e2..9154a8e 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/CheckboxInputEditor.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/CheckboxInputEditor.vue
@@ -3,6 +3,7 @@
         :options="options"
         stacked
         :state="componentValidState"
+        :disabled="readOnly"
         @input="selectionsChanged"/>
 </template>
 
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/FileInputEditor.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/FileInputEditor.vue
index 52c0c39..eae1306 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/FileInputEditor.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/FileInputEditor.vue
@@ -8,8 +8,9 @@
         class="mr-auto"
         :data-product="dataProduct"
         :input-file="true"
+        :open-in-new-window="true"
       />
-      <b-link @click="viewFile">
+      <b-link @click="viewFile" v-if="isViewable">
         View File <i class="fa fa-eye"></i>
         <span class="sr-only">View file</span>
       </b-link>
@@ -22,14 +23,14 @@
         <pre>{{ fileContent }}</pre>
       </b-modal>
       <delete-link
-        v-if="dataProduct.isInputFileUpload"
+        v-if="!readOnly && dataProduct.isInputFileUpload"
         class="ml-2"
         @delete="deleteDataProduct"
       >
-        Are you sure you want to delete input file {{ dataProduct.productName }}?
+        Are you sure you want to delete input file <strong>{{ dataProduct.productName }}</strong>?
       </delete-link>
       <b-link
-        v-else
+        v-else-if="!readOnly"
         @click="unselect"
         class="ml-2 text-secondary"
       >
@@ -41,7 +42,7 @@
       </b-link>
     </div>
     <input-file-selector
-      v-if="!isDataProductURI || uploading"
+      v-if="!readOnly && (!isDataProductURI || uploading)"
       :selectedDataProductURIs="selectedDataProductURIs"
       @uploadstart="uploadStart"
       @uploadend="uploadEnd"
@@ -85,6 +86,9 @@
       } else {
         return [];
       }
+    },
+    isViewable() {
+      return this.dataProduct.isText;
     }
   },
   data() {
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/InputEditorContainer.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/InputEditorContainer.vue
index 44b4489..ecb03b8 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/InputEditorContainer.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/InputEditorContainer.vue
@@ -5,6 +5,7 @@
             :id="inputEditorComponentId"
             :experiment-input="experimentInput"
             :experiment="experiment"
+            :read-only="experimentInput.isReadOnly"
             v-model="data"
             @invalid="recordInvalidInputEditorValue"
             @valid="recordValidInputEditorValue"
@@ -17,6 +18,7 @@
 <script>
 
 import UserFileInputEditor from "./UserFileInputEditor.vue";
+import AutocompleteInputEditor from "./AutocompleteInputEditor";
 import CheckboxInputEditor from "./CheckboxInputEditor.vue";
 import FileInputEditor from './FileInputEditor.vue'
 import InputEditorFormGroup from './InputEditorFormGroup.vue'
@@ -43,8 +45,8 @@
         }
     },
     components: {
+        AutocompleteInputEditor,
         CheckboxInputEditor,
-        UserFileInputEditor,
         FileInputEditor,
         InputEditorFormGroup,
         MultiFileInputEditor,
@@ -52,6 +54,7 @@
         SelectInputEditor,
         StringInputEditor,
         TextareaInputEditor,
+        UserFileInputEditor,
     },
     created() {
       if (!this.show) {
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/MultiFileInputEditor.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/MultiFileInputEditor.vue
index 38dfc47..bcec4b5 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/MultiFileInputEditor.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/MultiFileInputEditor.vue
@@ -10,10 +10,12 @@
         :id="dataProductURI"
         :experiment="experiment"
         :experiment-input="experimentInput"
+        :read-only="readOnly"
         @input="updatedFile($event, dataProductURI)"
       />
     </div>
     <input-file-selector
+      v-if="!readOnly"
       :selectedDataProductURIs="selectedDataProductURIs"
       @selected="fileSelected"
       @uploadstart="$emit('uploadstart')"
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/RadioButtonInputEditor.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/RadioButtonInputEditor.vue
index c610e60..08e5354 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/RadioButtonInputEditor.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/RadioButtonInputEditor.vue
@@ -3,6 +3,7 @@
         :options="options"
         stacked
         :state="componentValidState"
+        :disabled="readOnly"
         @input="valueChanged"/>
 </template>
 
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/SelectInputEditor.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/SelectInputEditor.vue
index c132b46..eab5435 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/SelectInputEditor.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/SelectInputEditor.vue
@@ -4,6 +4,7 @@
     v-model="data"
     :options="options"
     stacked
+    :disabled="readOnly"
     :state="componentValidState"
     @input="valueChanged"
   />
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/StringInputEditor.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/StringInputEditor.vue
index 538f070..2202fec 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/StringInputEditor.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/StringInputEditor.vue
@@ -1,6 +1,7 @@
 <template>
     <b-form-input :id="id" type="text" v-model="data"
         :state="componentValidState"
+        :disabled="readOnly"
         @input="valueChanged"/>
 </template>
 
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/TextareaInputEditor.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/TextareaInputEditor.vue
index 35fd33e..06e39c5 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/TextareaInputEditor.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/input-editors/TextareaInputEditor.vue
@@ -1,6 +1,7 @@
 <template>
     <b-form-textarea :id="id" v-model="data"
         :rows="rows"
+        :disabled="readOnly"
         :state="componentValidState"
         @input="valueChanged"/>
 </template>
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/DefaultOutputDisplay.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/DefaultOutputDisplay.vue
index b41cbfd..f048582 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/DefaultOutputDisplay.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/DefaultOutputDisplay.vue
@@ -1,11 +1,13 @@
 <template>
   <div>
-    <data-product-viewer
-      v-for="dp in dataProducts"
-      :data-product="dp"
-      :key="dp.productUri"
-      :mime-type="fileMimeType"
-    />
+    <div v-for="dp in dataProducts" :key="dp.productUri">
+      <img
+        v-if="dp.isImage && dp.downloadURL"
+        class="image-preview rounded"
+        :src="dp.downloadURL"
+      />
+      <data-product-viewer :data-product="dp" :mime-type="fileMimeType" />
+    </div>
   </div>
 </template>
 
@@ -23,9 +25,6 @@
     dataProducts: {
       type: Array,
       required: true
-    },
-    data: {
-      type: Object
     }
   },
   components: {
@@ -47,3 +46,10 @@
   }
 };
 </script>
+<style scoped>
+.image-preview {
+  display: block;
+  max-width: 100%;
+  max-height: 120px;
+}
+</style>
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/HtmlOutputDisplay.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/HtmlOutputDisplay.vue
index 54c6b2e..28cbd1b 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/HtmlOutputDisplay.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/HtmlOutputDisplay.vue
@@ -1,42 +1,31 @@
 <template>
-  <div v-html="rawOutput"/>
+  <div v-html="rawOutput" />
 </template>
 
 <script>
-import { models, utils } from "django-airavata-api";
 export default {
   name: "html-output-display",
   props: {
-    experimentOutput: {
-      type: models.OutputDataObjectType,
-      required: true
-    },
-    dataProducts: {
-      type: Array,
-      required: true
-    },
-    experimentId: {
-      type: String,
-      required: true
-    },
-    providerId: {
-      type: String,
+    viewData: {
+      type: Object,
       required: true
     }
   },
-  data() {
-    return {
-      rawOutput: null,
-      isLoading: true,
-      rawJSFile : null,
-    };
+  computed: {
+    rawOutput() {
+      return this.viewData && this.viewData.output
+        ? this.viewData.output
+        : null;
+    },
+    rawJSFile() {
+      return this.viewData && this.viewData.js ? this.viewData.js : null;
+    }
   },
-  methods : {
+  methods: {
     //Attaches the script to the head, the name of the script can be passed from
     //output view provider
     loadScripts() {
       return new Promise(resolve => {
-
         let scriptEl = document.createElement("script");
         scriptEl.src = this.rawJSFile;
         scriptEl.type = "text/javascript";
@@ -44,32 +33,19 @@
         // Attach script to head
         document.getElementsByTagName("head")[0].appendChild(scriptEl);
         // Wait for tag to load before promise is resolved
-        scriptEl.addEventListener('load',() => {
+        scriptEl.addEventListener("load", () => {
           resolve();
         });
       });
-    },
-  },
-  created() {
-    utils.FetchUtils.get("/api/html-output", {
-      "experiment-id": this.experimentId,
-      "experiment-output-name": this.experimentOutput.name,
-      "provider-id": this.providerId
-    }).then(data => {
-      this.rawOutput = data.output
-      this.rawJSFile = data.js
-      this.isLoading = false
-    });
+    }
   },
   watch: {
-    isLoading() {
-      if(!this.isLoading) {
+    rawJSFile() {
+      // TODO: check if script is already loaded
+      if (this.rawJSFile) {
         this.loadScripts();
       }
     }
   }
 };
 </script>
-
-<style scoped>
-</style>
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/ImageOutputDisplay.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/ImageOutputDisplay.vue
index bb7fc8c..52bf8cf 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/ImageOutputDisplay.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/ImageOutputDisplay.vue
@@ -1,45 +1,23 @@
 <template>
-  <img :src="url" />
+  <img :src="dataUrl" />
 </template>
 
 <script>
-import { models } from "django-airavata-api";
 export default {
   name: "image-output-display",
   props: {
-    experimentOutput: {
-      type: models.OutputDataObjectType,
-      required: true
-    },
-    dataProducts: {
-      type: Array,
-      required: true
-    },
-    experimentId: {
-      type: String,
-      required: true
-    },
-    providerId: {
-      type: String,
+    viewData: {
+      type: Object,
       required: true
     }
   },
-  data() {
-    return {
-      rawOutput: null
-    };
-  },
   computed: {
-    url() {
-      return (
-        "/api/image-output?" +
-        "experiment-id=" +
-        encodeURIComponent(this.experimentId) +
-        "&experiment-output-name=" +
-        encodeURIComponent(this.experimentOutput.name) +
-        "&provider-id=" +
-        encodeURIComponent(this.providerId)
-      );
+    dataUrl() {
+      if (this.viewData) {
+        return `data:${this.viewData["mime-type"]};base64,${this.viewData["image"]}`;
+      } else {
+        return null;
+      }
     }
   }
 };
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/LinkDisplay.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/LinkDisplay.vue
deleted file mode 100644
index 7afd4ca..0000000
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/LinkDisplay.vue
+++ /dev/null
@@ -1,26 +0,0 @@
-<template>
-  <a :href="data.url">{{ data.label }}</a>
-</template>
-
-<script>
-import { models } from "django-airavata-api"
-
-export default {
-  name: "link-viewer",
-  props: {
-    experimentOutput: {
-      type: models.OutputDataObjectType,
-      required: true
-    },
-    dataProducts: {
-      type: Array,
-      required: true
-    },
-    data: {
-      type: Object
-    }
-  },
-}
-</script>
-
-
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/LinkOutputDisplay.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/LinkOutputDisplay.vue
new file mode 100644
index 0000000..a2cf4c5
--- /dev/null
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/LinkOutputDisplay.vue
@@ -0,0 +1,15 @@
+<template>
+  <a :href="viewData.url">{{ viewData.label }}</a>
+</template>
+
+<script>
+export default {
+  name: "link-output-display",
+  props: {
+    viewData: {
+      type: Object,
+      required: true
+    }
+  }
+};
+</script>
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/OutputDisplayContainer.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/OutputDisplayContainer.vue
index 2ae3498..b7d42f3 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/OutputDisplayContainer.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/OutputDisplayContainer.vue
@@ -1,30 +1,28 @@
 <template>
   <b-card>
-    <div
-      slot="header"
-      class="d-flex align-items-baseline"
-    >
+    <div slot="header" class="d-flex align-items-baseline">
       <h6>{{ experimentOutput.name }}</h6>
-      <b-dropdown
-        v-if="showMenu"
-        :text="currentView['name']"
-        class="ml-auto"
-      >
+      <b-dropdown v-if="showMenu" :text="currentView['name']" class="ml-auto">
         <b-dropdown-item
           v-for="view in outputViews"
           :key="view['provider-id']"
           :active="view['provider-id'] === currentView['provider-id']"
           @click="selectView(view)"
-        >{{ view['name']}}</b-dropdown-item>
+          >{{ view["name"] }}</b-dropdown-item
+        >
       </b-dropdown>
     </div>
     <component
       :is="outputDisplayComponentName"
-      :experiment-output="experimentOutput"
+      :view-data="viewData"
       :data-products="dataProducts"
-      :experiment-id="experimentId"
-      :provider-id="currentView['provider-id']"
-      :data="outputViewData"
+      :experiment-output="experimentOutput"
+    />
+    <interactive-parameters-panel
+      ref="interactiveParametersPanel"
+      v-if="viewData && viewData.interactive"
+      :parameters="viewData.interactive"
+      @input="parametersUpdated"
     />
   </b-card>
 </template>
@@ -35,8 +33,10 @@
 import DefaultOutputDisplay from "./DefaultOutputDisplay";
 import HtmlOutputDisplay from "./HtmlOutputDisplay";
 import ImageOutputDisplay from "./ImageOutputDisplay";
-import LinkDisplay from "./LinkDisplay";
+import LinkOutputDisplay from "./LinkOutputDisplay";
 import NotebookOutputDisplay from "./NotebookOutputDisplay";
+import InteractiveParametersPanel from "./interactive-parameters/InteractiveParametersPanel";
+import OutputViewDataLoader from "./OutputViewDataLoader";
 
 export default {
   name: "output-viewer-container",
@@ -64,42 +64,110 @@
     DefaultOutputDisplay,
     HtmlOutputDisplay,
     ImageOutputDisplay,
-    LinkDisplay,
-    NotebookOutputDisplay
+    LinkOutputDisplay,
+    NotebookOutputDisplay,
+    InteractiveParametersPanel
+  },
+  created() {
+    if (this.providerId !== "default") {
+      this.loader = this.createLoader();
+      this.loader.load();
+    }
   },
   data() {
     return {
-      currentView: this.outputViews[0]
+      currentView: this.outputViews[0],
+      loader: null
     };
   },
   computed: {
+    viewData() {
+      return this.loader && this.loader.data
+        ? this.loader.data
+        : this.outputViewData;
+    },
     outputViewData() {
       return this.currentView.data ? this.currentView.data : {};
     },
+    displayTypeData() {
+      return {
+        default: {
+          component: "default-output-display",
+          url: null
+        },
+        link: {
+          component: "link-output-display",
+          url: "/api/link-output/"
+        },
+        notebook: {
+          component: "notebook-output-display",
+          url: "/api/notebook-output/"
+        },
+        html: {
+          component: "html-output-display",
+          url: "/api/html-output/"
+        },
+        image: {
+          component: "image-output-display",
+          url: "/api/image-output/"
+        }
+      };
+    },
+    displayType() {
+      return this.currentView["display-type"];
+    },
     outputDisplayComponentName() {
-      if (this.currentView["display-type"] === "default") {
-        return "default-output-display";
-      } else if (this.currentView["display-type"] === "link") {
-        return "link-display";
-      } else if (this.currentView["display-type"] === "notebook") {
-        return "notebook-output-display";
-      } else if (this.currentView["display-type"] === "html") {
-        return "html-output-display";
-      } else if (this.currentView["display-type"] === "image") {
-        return "image-output-display";
+      if (this.displayType in this.displayTypeData) {
+        return this.displayTypeData[this.displayType].component;
+      } else {
+        return null;
+      }
+    },
+    outputDataURL() {
+      if (this.displayType in this.displayTypeData) {
+        return this.displayTypeData[this.displayType].url;
       } else {
         return null;
       }
     },
     showMenu() {
       return this.outputViews.length > 1;
+    },
+    providerId() {
+      return this.currentView["provider-id"];
+    },
+    hasInteractiveParameters() {
+      return this.viewData && this.viewData.interactive;
     }
   },
   methods: {
     selectView(outputView) {
       this.currentView = outputView;
+      if (this.outputDataURL === null) {
+        this.loader = null;
+      } else {
+        this.loader = this.createLoader();
+        this.loader.load();
+      }
+    },
+    parametersUpdated(newParams) {
+      if (
+        this.hasInteractiveParameters &&
+        !this.$refs.interactiveParametersPanel.valid
+      ) {
+        // Don't update if we have invalid interactive parameters
+        return;
+      }
+      this.loader.load(newParams);
+    },
+    createLoader() {
+      return new OutputViewDataLoader({
+        url: this.outputDataURL,
+        experimentId: this.experimentId,
+        experimentOutputName: this.experimentOutput.name,
+        providerId: this.providerId
+      });
     }
   }
 };
 </script>
-
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/OutputViewDataLoader.js b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/OutputViewDataLoader.js
new file mode 100644
index 0000000..9391a5b
--- /dev/null
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/OutputViewDataLoader.js
@@ -0,0 +1,46 @@
+import { utils } from "django-airavata-api";
+
+export default class OutputViewDataLoader {
+  constructor({ url, experimentId, experimentOutputName, providerId }) {
+    this.url = url;
+    this.experimentId = experimentId;
+    this.experimentOutputName = experimentOutputName;
+    this.providerId = providerId;
+    this.data = null;
+  }
+
+  load(newParams = null) {
+    if (newParams && this.data) {
+      this.data.interactive = newParams;
+    }
+    return utils.FetchUtils.get(this.url, {
+      "experiment-id": this.experimentId,
+      "experiment-output-name": this.experimentOutputName,
+      "provider-id": this.providerId,
+      ...this.createInteractiveParams()
+    }).then(resp => {
+      this.data = resp;
+      return resp;
+    });
+  }
+
+  createInteractiveParams() {
+    const params = {};
+    const meta = {};
+    if (this.data && this.data.interactive) {
+      this.data.interactive.forEach(p => {
+        params[p.name] = p.value;
+        meta[p.name] = {
+          type: p.type
+        };
+      });
+    }
+    if (Object.keys(meta).length > 0) {
+      // Special _meta query parameter holds type information, which is needed
+      // when the type of a parameter can't be inferred when it is missing a
+      // default value
+      params._meta = JSON.stringify(meta);
+    }
+    return params;
+  }
+}
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterCheckboxWidget.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterCheckboxWidget.vue
new file mode 100644
index 0000000..ab9edf2
--- /dev/null
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterCheckboxWidget.vue
@@ -0,0 +1,15 @@
+<template>
+  <b-form-checkbox :checked="value" @input="$emit('input', $event)"/>
+</template>
+
+<script>
+export default {
+  name: "interactive-parameter-checkbox-widget",
+  props: {
+    value: {
+      type: Boolean,
+      required: true
+    }
+  }
+};
+</script>
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterRangeWidget.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterRangeWidget.vue
new file mode 100644
index 0000000..5f134e9
--- /dev/null
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterRangeWidget.vue
@@ -0,0 +1,62 @@
+<template>
+  <div>
+    <b-form-input
+      ref="rangeInput"
+      type="range"
+      :value="value"
+      :min="parameter.min"
+      :max="parameter.max"
+      :step="parameter.step || 'any'"
+      @input="updateValue"
+      @mouseup="mouseUp"
+      @keyup="keyUp"
+    />
+    <small>Value: {{ roundedValue }}</small>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "interactive-parameter-range-widget",
+  props: {
+    value: {
+      type: Number,
+      required: true
+    },
+    parameter: {
+      type: Object
+    }
+  },
+  data() {
+    return {
+      currentValue: parseFloat(this.value)
+    };
+  },
+  computed: {
+    disabled() {
+      return this.currentValue === this.initialValue;
+    },
+    initialValue() {
+      return parseFloat(this.value);
+    },
+    roundedValue() {
+      return this.currentValue ? this.currentValue.toFixed(2) : null;
+    }
+  },
+  methods: {
+    updateValue(newValue) {
+      this.currentValue = parseFloat(newValue);
+    },
+    submit() {
+      this.$emit("input", this.currentValue);
+    },
+    mouseUp() {
+      this.$refs.rangeInput.blur();
+      if (!this.disabled) {
+        this.submit();
+      }
+    },
+    keyUp() {}
+  }
+};
+</script>
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterSelectWidget.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterSelectWidget.vue
new file mode 100644
index 0000000..922c9f5
--- /dev/null
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterSelectWidget.vue
@@ -0,0 +1,28 @@
+<template>
+  <b-form-select
+    :value="value"
+    :options="options"
+    @input="$emit('input', $event)"
+  />
+</template>
+
+<script>
+export default {
+  name: "interactive-parameter-select-widget",
+  props: {
+    value: {
+      type: String,
+      required: true
+    },
+    parameter: {
+      type: Object,
+      required: true
+    }
+  },
+  computed: {
+    options() {
+      return this.parameter.options;
+    }
+  }
+};
+</script>
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterStepperWidget.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterStepperWidget.vue
new file mode 100644
index 0000000..d136124
--- /dev/null
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterStepperWidget.vue
@@ -0,0 +1,74 @@
+<template>
+  <b-input-group>
+    <b-form-input
+      ref="textInput"
+      type="number"
+      :value="value"
+      :min="parameter.min"
+      :max="parameter.max"
+      :step="parameter.step || 'any'"
+      @input="updateValue"
+      @keydown.native.enter="enterKeyPressed"
+    />
+    <b-input-group-append>
+      <b-button variant="primary" :disabled="disabled" @click="submit"
+        >Submit</b-button
+      >
+    </b-input-group-append>
+  </b-input-group>
+</template>
+
+<script>
+export default {
+  name: "interactive-parameter-stepper-widget",
+  props: {
+    value: {
+      type: Number,
+      required: true
+    },
+    parameter: {
+      type: Object
+    }
+  },
+  data() {
+    return {
+      currentValue: parseFloat(this.value),
+      valid: false
+    };
+  },
+  computed: {
+    disabled() {
+      return !this.valid || this.currentValue === parseFloat(this.value);
+    }
+  },
+  methods: {
+    updateValue(newValue) {
+      if ("max" in this.parameter) {
+        newValue = Math.min(this.parameter.max, newValue);
+      }
+      if ("min" in this.parameter) {
+        newValue = Math.max(this.parameter.min, newValue);
+      }
+      this.currentValue = parseFloat(newValue);
+      if (this.$refs.textInput.validity.valid) {
+        this.valid = true;
+        this.$emit("valid");
+      } else {
+        this.valid = false;
+        this.$emit("invalid", this.$refs.textInput.validationMessage);
+      }
+    },
+    submit() {
+      if (!this.disabled) {
+        this.$emit("input", this.currentValue);
+      }
+    },
+    enterKeyPressed() {
+      if (!this.disabled) {
+        this.$refs.textInput.blur();
+        this.submit();
+      }
+    }
+  }
+};
+</script>
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterTextInputWidget.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterTextInputWidget.vue
new file mode 100644
index 0000000..3af5ceb
--- /dev/null
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterTextInputWidget.vue
@@ -0,0 +1,48 @@
+<template>
+  <b-input-group>
+    <b-form-input
+      ref="textInput"
+      :value="value"
+      @input="currentValue = $event"
+      @keydown.native.enter="enterKeyPressed"
+    />
+    <b-input-group-append>
+      <b-button variant="primary" :disabled="disabled" @click="submit"
+        >Submit</b-button
+      >
+    </b-input-group-append>
+  </b-input-group>
+</template>
+
+<script>
+export default {
+  name: "interactive-parameter-text-input-widget",
+  props: {
+    value: {
+      type: String,
+      required: true
+    }
+  },
+  data() {
+    return {
+      currentValue: this.value
+    };
+  },
+  computed: {
+    disabled() {
+      return this.currentValue === this.value;
+    }
+  },
+  methods: {
+    submit() {
+      this.$emit("input", this.currentValue);
+    },
+    enterKeyPressed() {
+      if (!this.disabled) {
+        this.$refs.textInput.blur();
+        this.submit();
+      }
+    }
+  }
+};
+</script>
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterWidgetContainer.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterWidgetContainer.vue
new file mode 100644
index 0000000..c8faa94
--- /dev/null
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParameterWidgetContainer.vue
@@ -0,0 +1,67 @@
+<template>
+  <compoment
+    :is="widgetComponent"
+    :value="parameter.value"
+    :parameter="parameter"
+    @input="$emit('input', $event)"
+    @valid="$emit('valid')"
+    @invalid="$emit('invalid', $event)"
+  />
+</template>
+
+<script>
+import InteractiveParameterCheckboxWidget from "./InteractiveParameterCheckboxWidget.vue";
+import InteractiveParameterRangeWidget from "./InteractiveParameterRangeWidget.vue";
+import InteractiveParameterSelectWidget from "./InteractiveParameterSelectWidget.vue";
+import InteractiveParameterStepperWidget from "./InteractiveParameterStepperWidget.vue";
+import InteractiveParameterTextInputWidget from "./InteractiveParameterTextInputWidget.vue";
+
+export default {
+  name: "interactive-parameter-widget-container",
+  props: {
+    parameter: {
+      type: Object,
+      required: true
+    }
+  },
+  components: {
+    InteractiveParameterCheckboxWidget,
+    InteractiveParameterRangeWidget,
+    InteractiveParameterSelectWidget,
+    InteractiveParameterStepperWidget,
+    InteractiveParameterTextInputWidget
+  },
+  computed: {
+    widgetComponent() {
+      if (this.parameter.options) {
+        return InteractiveParameterSelectWidget;
+      } else if (
+        this.parameter.type === "boolean" ||
+        (this.parameter.widget && this.parameter.widget === "checkbox")
+      ) {
+        return InteractiveParameterCheckboxWidget;
+      } else if (
+        this.parameter.type === "string" ||
+        (this.parameter.widget && this.parameter.widget === "textinput")
+      ) {
+        return InteractiveParameterTextInputWidget;
+      } else if (
+        (this.parameter.type === "float" ||
+          this.parameter.type === "integer") &&
+        "min" in this.parameter &&
+        "max" in this.parameter
+      ) {
+        return InteractiveParameterRangeWidget;
+      } else if (
+        this.parameter.type === "float" ||
+        this.parameter.type === "integer" ||
+        (this.parameter.widget && this.parameter.widget === "stepper")
+      ) {
+        return InteractiveParameterStepperWidget;
+      } else {
+        return null;
+      }
+    }
+  }
+};
+</script>
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParametersPanel.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParametersPanel.vue
new file mode 100644
index 0000000..3b0ca25
--- /dev/null
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/interactive-parameters/InteractiveParametersPanel.vue
@@ -0,0 +1,67 @@
+<template>
+  <b-card title="Parameters">
+    <validated-form ref="validatedForm" :items="formItems">
+      <interactive-parameter-widget-container
+        slot-scope="form"
+        :parameter="form.item"
+        @valid="form.valid"
+        @invalid="form.invalid"
+        @input="updated(form.item, $event)"
+      />
+    </validated-form>
+  </b-card>
+</template>
+
+<script>
+import InteractiveParameterWidgetContainer from "./InteractiveParameterWidgetContainer";
+import { components } from "django-airavata-common-ui";
+
+export default {
+  name: "interactive-parameters-panel",
+  components: {
+    InteractiveParameterWidgetContainer,
+    "validated-form": components.ValidatedForm
+  },
+  props: {
+    parameters: {
+      type: Array,
+      required: true
+    }
+  },
+  computed: {
+    formItems() {
+      return this.localParameters.map(p => {
+        return {
+          key: p.name,
+          label: p.label || p.name,
+          item: p,
+          description: p.help
+        };
+      });
+    },
+    valid() {
+      return this.$refs.validatedForm.valid;
+    }
+  },
+  data() {
+    return {
+      localParameters: this.parametersCopy()
+    };
+  },
+  methods: {
+    updated(param, value) {
+      const i = this.localParameters.findIndex(x => x.name === param.name);
+      this.localParameters[i].value = value;
+      this.$emit("input", this.localParameters);
+    },
+    parametersCopy() {
+      return JSON.parse(JSON.stringify(this.parameters));
+    }
+  },
+  watch: {
+    parameters() {
+      this.localParameters = this.parametersCopy();
+    }
+  }
+};
+</script>
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/storage/UserStoragePathViewer.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/storage/UserStoragePathViewer.vue
index 3351fd1..a1402c7 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/storage/UserStoragePathViewer.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/storage/UserStoragePathViewer.vue
@@ -22,7 +22,7 @@
           v-else
           :href="data.item.downloadURL"
           :target="downloadTarget"
-        > <i class="fa fa-download"></i> {{ data.item.name }}</b-link>
+        > {{ data.item.name }}</b-link>
       </template>
       <template
         slot="createdTimestamp"
@@ -46,7 +46,7 @@
           v-if="includeDeleteAction"
           @delete="deleteItem(data.item)"
         >
-          Are you sure you want to delete {{ data.item.name }}?
+          Are you sure you want to delete <strong>{{ data.item.name }}</strong>?
         </delete-button>
       </template>
     </b-table>
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/CreateExperimentContainer.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/CreateExperimentContainer.vue
index ff17345..a1c1600 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/CreateExperimentContainer.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/CreateExperimentContainer.vue
@@ -20,7 +20,7 @@
 
 export default {
   name: "create-experiment-container",
-  props: ["app-module-id", "user-input-files", "experiment-data-dir"],
+  props: ["app-module-id", "user-input-values", "experiment-data-dir"],
   data() {
     return {
       experiment: null,
@@ -56,13 +56,13 @@
         experiment.experimentName =
           appModule.appModuleName + " on " + moment().format("lll");
         this.appModule = appModule;
-        if (this.userInputFiles) {
-          Object.keys(this.userInputFiles).forEach(k => {
+        if (this.userInputValues) {
+          Object.keys(this.userInputValues).forEach(k => {
             const experimentInput = experiment.experimentInputs.find(
               inp => inp.name === k
             );
             if (experimentInput) {
-              experimentInput.value = this.userInputFiles[k];
+              experimentInput.value = this.userInputValues[k];
             }
           });
         }
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-create-experiment.js b/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-create-experiment.js
index 4f2e983..6cdd934 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-create-experiment.js
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-create-experiment.js
@@ -8,7 +8,7 @@
         h(CreateExperimentContainer, {
           props: {
             appModuleId: this.appModuleId,
-            userInputFiles: this.userInputFiles,
+            userInputValues: this.userInputValues,
             experimentDataDir: this.experimentDataDir
           }
         })
@@ -17,15 +17,15 @@
     data() {
       return {
         appModuleId: null,
-        userInputFiles: null
+        userInputValues: null
       };
     },
     beforeMount() {
       if (this.$el.dataset.appModuleId) {
         this.appModuleId = this.$el.dataset.appModuleId;
       }
-      if (this.$el.dataset.userInputFiles) {
-        this.userInputFiles = JSON.parse(this.$el.dataset.userInputFiles);
+      if (this.$el.dataset.userInputValues) {
+        this.userInputValues = JSON.parse(this.$el.dataset.userInputValues);
       }
       if (this.$el.dataset.experimentDataDir) {
         this.experimentDataDir = this.$el.dataset.experimentDataDir;
diff --git a/django_airavata/apps/workspace/templates/django_airavata_workspace/create_experiment.html b/django_airavata/apps/workspace/templates/django_airavata_workspace/create_experiment.html
index 08939a2..f618f18 100644
--- a/django_airavata/apps/workspace/templates/django_airavata_workspace/create_experiment.html
+++ b/django_airavata/apps/workspace/templates/django_airavata_workspace/create_experiment.html
@@ -2,7 +2,7 @@
 
 {% block content %}
 
-<div id="{{ bundle_name }}" data-app-module-id="{{ app_module_id }}" data-user-input-files="{{ user_input_files }}"
+<div id="{{ bundle_name }}" data-app-module-id="{{ app_module_id }}" data-user-input-values="{{ user_input_values }}"
   {% if experiment_data_dir %}data-experiment-data-dir="{{ experiment_data_dir }}"{% endif %}
 >
 </div>
diff --git a/django_airavata/apps/workspace/views.py b/django_airavata/apps/workspace/views.py
index 80c488d..4d3289f 100644
--- a/django_airavata/apps/workspace/views.py
+++ b/django_airavata/apps/workspace/views.py
@@ -1,6 +1,7 @@
 
 import json
 import logging
+from urllib.parse import urlparse
 
 from django.contrib.auth.decorators import login_required
 from django.shortcuts import render
@@ -74,24 +75,45 @@
 
     # User input files can be passed as query parameters
     # <input name>=<path/to/user_file>
+    # and also as data product URIs
+    # <input name>=<data product URI>
     app_interface = ApplicationModuleViewSet.as_view(
         {'get': 'application_interface'})(request, app_module_id=app_module_id)
     if app_interface.status_code != 200:
         raise Exception("Failed to load application module data: {}".format(
             app_interface.data['detail']))
-    user_input_files = {}
+    user_input_values = {}
     for app_input in app_interface.data['applicationInputs']:
         if (app_input['type'] ==
                 DataType.URI and app_input['name'] in request.GET):
-            user_file_path = request.GET[app_input['name']]
-            data_product_uri = data_products_helper.user_file_exists(
-                request, user_file_path)
-            if data_product_uri is not None:
-                user_input_files[app_input['name']] = data_product_uri
+            user_file_value = request.GET[app_input['name']]
+            try:
+                user_file_url = urlparse(user_file_value)
+                if user_file_url.scheme == 'airavata-dp':
+                    dp_uri = user_file_value
+                    try:
+                        data_product = request.airavata_client.getDataProduct(
+                            request.authz_token, dp_uri)
+                        if data_products_helper.exists(request, data_product):
+                            user_input_values[app_input['name']] = dp_uri
+                    except Exception as e:
+                        logger.exception(
+                            "Failed checking data product uri: {dp_uri}")
+                else:
+                    data_product_uri = data_products_helper.user_file_exists(
+                        request, user_file_url.path)
+                    if data_product_uri is not None:
+                        user_input_values[app_input['name']] = data_product_uri
+            except ValueError as e:
+                logger.exception(f"Invalid user file value: {user_file_value}")
+        elif (app_input['type'] == DataType.STRING and
+              app_input['name'] in request.GET):
+            name = app_input['name']
+            user_input_values[name] = request.GET[name]
     context = {
         'bundle_name': 'create-experiment',
         'app_module_id': app_module_id,
-        'user_input_files': json.dumps(user_input_files)
+        'user_input_values': json.dumps(user_input_values)
     }
     if 'experiment-data-dir' in request.GET:
         context['experiment_data_dir'] = request.GET['experiment-data-dir']
diff --git a/django_airavata/apps/workspace/vue.config.js b/django_airavata/apps/workspace/vue.config.js
index 3f4c086..deef681 100644
--- a/django_airavata/apps/workspace/vue.config.js
+++ b/django_airavata/apps/workspace/vue.config.js
@@ -7,7 +7,6 @@
       ? "http://localhost:9000/static/django_airavata_workspace/dist/"
       : "/static/django_airavata_workspace/dist/",
   outputDir: "./static/django_airavata_workspace/dist",
-  productionSourceMap: false,
   pages: {
       'project-list': './static/django_airavata_workspace/js/entry-project-list',
       'dashboard': './static/django_airavata_workspace/js/entry-dashboard',
diff --git a/django_airavata/media/images/SARS-CoV-2.max-165x165.png b/django_airavata/media/images/SARS-CoV-2.max-165x165.png
new file mode 100644
index 0000000..2191a3c
--- /dev/null
+++ b/django_airavata/media/images/SARS-CoV-2.max-165x165.png
Binary files differ
diff --git a/django_airavata/media/images/SARS-CoV-2.max-800x600.png b/django_airavata/media/images/SARS-CoV-2.max-800x600.png
new file mode 100644
index 0000000..1b34195
--- /dev/null
+++ b/django_airavata/media/images/SARS-CoV-2.max-800x600.png
Binary files differ
diff --git a/django_airavata/media/images/SARS-CoV-2.original.png b/django_airavata/media/images/SARS-CoV-2.original.png
new file mode 100644
index 0000000..1b34195
--- /dev/null
+++ b/django_airavata/media/images/SARS-CoV-2.original.png
Binary files differ
diff --git a/django_airavata/media/images/SARS-CoV-2.width-800.png b/django_airavata/media/images/SARS-CoV-2.width-800.png
new file mode 100644
index 0000000..1b34195
--- /dev/null
+++ b/django_airavata/media/images/SARS-CoV-2.width-800.png
Binary files differ
diff --git a/django_airavata/media/images/bg-header.max-165x165.jpg b/django_airavata/media/images/bg-header.max-165x165.jpg
new file mode 100644
index 0000000..bdea9c8
--- /dev/null
+++ b/django_airavata/media/images/bg-header.max-165x165.jpg
Binary files differ
diff --git a/django_airavata/media/images/bg-header.max-800x600.jpg b/django_airavata/media/images/bg-header.max-800x600.jpg
new file mode 100644
index 0000000..4044575
--- /dev/null
+++ b/django_airavata/media/images/bg-header.max-800x600.jpg
Binary files differ
diff --git a/django_airavata/media/images/bg-header.original.jpg b/django_airavata/media/images/bg-header.original.jpg
new file mode 100644
index 0000000..ce7801f
--- /dev/null
+++ b/django_airavata/media/images/bg-header.original.jpg
Binary files differ
diff --git a/django_airavata/media/images/people-brasil-guys-avpaulista-109919.max-165x165.jpg b/django_airavata/media/images/people-brasil-guys-avpaulista-109919.max-165x165.jpg
new file mode 100644
index 0000000..61ed969
--- /dev/null
+++ b/django_airavata/media/images/people-brasil-guys-avpaulista-109919.max-165x165.jpg
Binary files differ
diff --git a/django_airavata/media/images/people-brasil-guys-avpaulista-109919.original.jpg b/django_airavata/media/images/people-brasil-guys-avpaulista-109919.original.jpg
new file mode 100644
index 0000000..9616d8d
--- /dev/null
+++ b/django_airavata/media/images/people-brasil-guys-avpaulista-109919.original.jpg
Binary files differ
diff --git a/django_airavata/media/images/person-holding-laboratory-flask-2280571_1.max-165x165.jpg b/django_airavata/media/images/person-holding-laboratory-flask-2280571_1.max-165x165.jpg
new file mode 100644
index 0000000..f15e3ec
--- /dev/null
+++ b/django_airavata/media/images/person-holding-laboratory-flask-2280571_1.max-165x165.jpg
Binary files differ
diff --git a/django_airavata/media/images/person-holding-laboratory-flask-2280571_1.original.jpg b/django_airavata/media/images/person-holding-laboratory-flask-2280571_1.original.jpg
new file mode 100644
index 0000000..b117548
--- /dev/null
+++ b/django_airavata/media/images/person-holding-laboratory-flask-2280571_1.original.jpg
Binary files differ
diff --git a/django_airavata/media/images/person-holding-laboratory-flask-2280571_1_Zd.max-165x165.jpg b/django_airavata/media/images/person-holding-laboratory-flask-2280571_1_Zd.max-165x165.jpg
new file mode 100644
index 0000000..f15e3ec
--- /dev/null
+++ b/django_airavata/media/images/person-holding-laboratory-flask-2280571_1_Zd.max-165x165.jpg
Binary files differ
diff --git a/django_airavata/media/images/physicell-logo-01.max-165x165.png b/django_airavata/media/images/physicell-logo-01.max-165x165.png
new file mode 100644
index 0000000..41000e2
--- /dev/null
+++ b/django_airavata/media/images/physicell-logo-01.max-165x165.png
Binary files differ
diff --git a/django_airavata/media/images/physicell-logo-01.max-800x600.png b/django_airavata/media/images/physicell-logo-01.max-800x600.png
new file mode 100644
index 0000000..103c74d
--- /dev/null
+++ b/django_airavata/media/images/physicell-logo-01.max-800x600.png
Binary files differ
diff --git a/django_airavata/media/images/physicell-logo-01.original.png b/django_airavata/media/images/physicell-logo-01.original.png
new file mode 100644
index 0000000..103c74d
--- /dev/null
+++ b/django_airavata/media/images/physicell-logo-01.original.png
Binary files differ
diff --git a/django_airavata/media/images/physicell-logo-01.width-800.png b/django_airavata/media/images/physicell-logo-01.width-800.png
new file mode 100644
index 0000000..103c74d
--- /dev/null
+++ b/django_airavata/media/images/physicell-logo-01.width-800.png
Binary files differ
diff --git a/django_airavata/media/images/snapshot00000240.max-165x165.jpg b/django_airavata/media/images/snapshot00000240.max-165x165.jpg
new file mode 100644
index 0000000..cf85f87
--- /dev/null
+++ b/django_airavata/media/images/snapshot00000240.max-165x165.jpg
Binary files differ
diff --git a/django_airavata/media/images/snapshot00000240.max-800x600.jpg b/django_airavata/media/images/snapshot00000240.max-800x600.jpg
new file mode 100644
index 0000000..889a501
--- /dev/null
+++ b/django_airavata/media/images/snapshot00000240.max-800x600.jpg
Binary files differ
diff --git a/django_airavata/media/images/snapshot00000240.width-800.jpg b/django_airavata/media/images/snapshot00000240.width-800.jpg
new file mode 100644
index 0000000..889a501
--- /dev/null
+++ b/django_airavata/media/images/snapshot00000240.width-800.jpg
Binary files differ
diff --git a/django_airavata/media/images/virus-1812092_1920.max-165x165.jpg b/django_airavata/media/images/virus-1812092_1920.max-165x165.jpg
new file mode 100644
index 0000000..bdea9c8
--- /dev/null
+++ b/django_airavata/media/images/virus-1812092_1920.max-165x165.jpg
Binary files differ
diff --git a/django_airavata/media/images/virus-1812092_1920.max-800x600.jpg b/django_airavata/media/images/virus-1812092_1920.max-800x600.jpg
new file mode 100644
index 0000000..4044575
--- /dev/null
+++ b/django_airavata/media/images/virus-1812092_1920.max-800x600.jpg
Binary files differ
diff --git a/django_airavata/media/images/virus-1812092_1920.original.jpg b/django_airavata/media/images/virus-1812092_1920.original.jpg
new file mode 100644
index 0000000..ce7801f
--- /dev/null
+++ b/django_airavata/media/images/virus-1812092_1920.original.jpg
Binary files differ
diff --git a/django_airavata/media/images/virus.max-165x165.png b/django_airavata/media/images/virus.max-165x165.png
new file mode 100644
index 0000000..ffb022d
--- /dev/null
+++ b/django_airavata/media/images/virus.max-165x165.png
Binary files differ
diff --git a/django_airavata/media/images/virus.original.png b/django_airavata/media/images/virus.original.png
new file mode 100644
index 0000000..5cb9a6f
--- /dev/null
+++ b/django_airavata/media/images/virus.original.png
Binary files differ
diff --git a/django_airavata/media/images/virus_1.max-165x165.png b/django_airavata/media/images/virus_1.max-165x165.png
new file mode 100644
index 0000000..35d6e43
--- /dev/null
+++ b/django_airavata/media/images/virus_1.max-165x165.png
Binary files differ
diff --git a/django_airavata/media/images/virus_1.original.png b/django_airavata/media/images/virus_1.original.png
new file mode 100644
index 0000000..abaaa6e
--- /dev/null
+++ b/django_airavata/media/images/virus_1.original.png
Binary files differ
diff --git a/django_airavata/media/images/virus_2.max-165x165.png b/django_airavata/media/images/virus_2.max-165x165.png
new file mode 100644
index 0000000..37c153b
--- /dev/null
+++ b/django_airavata/media/images/virus_2.max-165x165.png
Binary files differ
diff --git a/django_airavata/media/images/virus_2.original.png b/django_airavata/media/images/virus_2.original.png
new file mode 100644
index 0000000..80995bd
--- /dev/null
+++ b/django_airavata/media/images/virus_2.original.png
Binary files differ
diff --git a/django_airavata/media/images/virus_3.max-165x165.png b/django_airavata/media/images/virus_3.max-165x165.png
new file mode 100644
index 0000000..37c153b
--- /dev/null
+++ b/django_airavata/media/images/virus_3.max-165x165.png
Binary files differ
diff --git a/django_airavata/media/images/virus_3.original.png b/django_airavata/media/images/virus_3.original.png
new file mode 100644
index 0000000..80995bd
--- /dev/null
+++ b/django_airavata/media/images/virus_3.original.png
Binary files differ
diff --git a/django_airavata/media/images/virus_3_8bogaM1.max-165x165.png b/django_airavata/media/images/virus_3_8bogaM1.max-165x165.png
new file mode 100644
index 0000000..37c153b
--- /dev/null
+++ b/django_airavata/media/images/virus_3_8bogaM1.max-165x165.png
Binary files differ
diff --git a/django_airavata/settings.py b/django_airavata/settings.py
index 38ad25d..43b77b3 100644
--- a/django_airavata/settings.py
+++ b/django_airavata/settings.py
@@ -62,6 +62,7 @@
     'wagtail.search',
     'wagtail.admin',
     'wagtail.core',
+    'wagtail.contrib.styleguide',
 
     # wagtail third party dependencies
     'modelcluster',
@@ -236,6 +237,7 @@
     ),
     'EXCEPTION_HANDLER':
         'django_airavata.apps.api.exceptions.custom_exception_handler',
+    'TEST_REQUEST_DEFAULT_FORMAT': 'json',
 }
 
 AUTHENTICATION_BACKENDS = [
@@ -357,10 +359,19 @@
         },
     },
     'handlers': {
-        'console': {
+        # Log everything to the console when DEBUG=True
+        'console_debug': {
+            'filters': ['require_debug_true'],
             'class': 'logging.StreamHandler',
             'formatter': 'verbose'
         },
+        # Only log INFO and higher levels to console when DEBUG=False
+        'console': {
+            'filters': ['require_debug_false'],
+            'class': 'logging.StreamHandler',
+            'formatter': 'verbose',
+            'level': 'INFO'
+        },
         'mail_admins': {
             'filters': ['require_debug_false'],
             'level': 'ERROR',
@@ -371,7 +382,7 @@
     'loggers': {
         'django_airavata': {
             'handlers': ['console', 'mail_admins'],
-            'level': 'DEBUG' if DEBUG else 'INFO'
+            'level': 'DEBUG'
         },
         'root': {
             'handlers': ['console'],
diff --git a/django_airavata/settings_local.py.ide b/django_airavata/settings_local.py.ide
index 5918819..548e82d 100644
--- a/django_airavata/settings_local.py.ide
+++ b/django_airavata/settings_local.py.ide
@@ -26,7 +26,11 @@
 # EMAIL_HOST_USER = '...'
 # EMAIL_HOST_PASSWORD = '...'
 # EMAIL_USE_TLS = True
-# ADMINS = [('Admin Name', 'admin@example.com')]
+ADMINS = [('Admin Name', 'admin@example.com')]
+# PORTAL_ADMINS receive administrative emails, like when a new user is created
+# This can be set to a different value than ADMINS so that the PORTAL_ADMINS
+# don't receive error emails
+PORTAL_ADMINS = ADMINS
 # SERVER_EMAIL = 'portal@example.com'
 
 # Keycloak Configuration
diff --git a/django_airavata/settings_local.py.sample b/django_airavata/settings_local.py.sample
index da98351..bb01319 100644
--- a/django_airavata/settings_local.py.sample
+++ b/django_airavata/settings_local.py.sample
@@ -43,9 +43,9 @@
 # EMAIL_USE_TLS = True
 # ADMINS receive error emails
 # ADMINS = [('Admin Name', 'admin@example.com')]
-# PORTAL_ADMINS receive administrative emails, like when a new user is created
+# Optional: PORTAL_ADMINS receive administrative emails, like when a new user is created
 # This can be set to a different value than ADMINS so that the PORTAL_ADMINS
-# don't receive error emails
+# don't receive error emails. Defaults to the same value as ADMINS.
 # PORTAL_ADMINS = ADMINS
 # SERVER_EMAIL = 'portal@example.com'
 
@@ -64,6 +64,8 @@
     # Control whether username/password authentication is allowed
     'password': {
         'name': 'your account',
+        # Uncomment following to hide username/password login except from directly going to /auth/login-password URL
+        # 'hidden': True,
     },
     # Can have multiple external logins
     # 'external': [
diff --git a/django_airavata/static/common/js/cms.js b/django_airavata/static/common/js/cms.js
index 45583b2..7e6153e 100644
--- a/django_airavata/static/common/js/cms.js
+++ b/django_airavata/static/common/js/cms.js
@@ -7,7 +7,3 @@
 $(function() {
   $('[data-toggle="tooltip"]').tooltip();
 });
-
-$('.carousel').carousel({
-  interval: 2000
-})
diff --git a/django_airavata/static/common/js/components/AutocompleteTextInput.vue b/django_airavata/static/common/js/components/AutocompleteTextInput.vue
index 59071e6..5579af0 100644
--- a/django_airavata/static/common/js/components/AutocompleteTextInput.vue
+++ b/django_airavata/static/common/js/components/AutocompleteTextInput.vue
@@ -8,7 +8,7 @@
         @keydown.native.down='down' @keydown.native.up='up'></b-form-input>
     </b-input-group>
     <b-list-group class="autocomplete-suggestion-list" v-if="open">
-      <b-list-group-item v-for="(suggestion, index) in filtered.slice(0,5)" v-bind:class="{'active': isActive(index)}" href="#"
+      <b-list-group-item v-for="(suggestion, index) in filtered" v-bind:class="{'active': isActive(index)}" href="#"
         @click="suggestionClick(index)" v-bind:key="suggestion.id">
         <slot name="suggestion" :suggestion="suggestion">
           {{ suggestion.name }}
@@ -29,6 +29,10 @@
     placeholder: {
       type: String,
       default: "Type to get suggestions..."
+    },
+    maxMatches: {
+      type: Number,
+      default: 5
     }
   },
   data() {
@@ -46,7 +50,7 @@
         return (
           data.name.toLowerCase().indexOf(this.searchValue.toLowerCase()) >= 0
         );
-      }).slice(0,5);
+      }).slice(0,this.maxMatches);
     }
   },
   methods: {
@@ -59,6 +63,7 @@
         this.open = false;
       }
       this.searchValue = value;
+      this.$emit('search-changed', value);
     },
     enter() {
       if (this.filtered.length === 0) {
diff --git a/django_airavata/static/common/js/components/DataProductViewer.vue b/django_airavata/static/common/js/components/DataProductViewer.vue
index 52f35f7..788ca79 100644
--- a/django_airavata/static/common/js/components/DataProductViewer.vue
+++ b/django_airavata/static/common/js/components/DataProductViewer.vue
@@ -1,8 +1,7 @@
 <template>
 
   <span v-if="downloadURL">
-    <a :href="downloadURL" class="action-link">
-      <i class="fa fa-download"></i>
+    <a :href="downloadURL" class="action-link" :target="linkTarget">
       {{ filename }}
     </a>
   </span>
@@ -24,6 +23,10 @@
     },
     mimeType: {
       type: String
+    },
+    openInNewWindow: {
+      type: Boolean,
+      default: false
     }
   },
   computed: {
@@ -45,6 +48,9 @@
       } else {
         return this.dataProduct.downloadURL;
       }
+    },
+    linkTarget() {
+      return this.openInNewWindow ? "_blank": "_self";
     }
   }
 };
diff --git a/django_airavata/static/common/js/components/DeleteButton.vue b/django_airavata/static/common/js/components/DeleteButton.vue
index f1a22aa..0e07c43 100644
--- a/django_airavata/static/common/js/components/DeleteButton.vue
+++ b/django_airavata/static/common/js/components/DeleteButton.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="delete-button">
     <b-button variant="danger" @click="$refs.modal.show()" :disabled="disabled">
-      Delete
+      {{ label }}
     </b-button>
     <confirmation-dialog ref="modal" :title="dialogTitle" @ok="$emit('delete')">
       <slot></slot>
@@ -21,6 +21,10 @@
     disabled: {
       type: Boolean,
       default: false
+    },
+    label: {
+      type: String,
+      default: "Delete"
     }
   },
   components: {
diff --git a/django_airavata/static/common/js/components/HumanDate.vue b/django_airavata/static/common/js/components/HumanDate.vue
index 26bd3fa..03f870c 100644
--- a/django_airavata/static/common/js/components/HumanDate.vue
+++ b/django_airavata/static/common/js/components/HumanDate.vue
@@ -1,5 +1,5 @@
 <template>
-  <span :title="date.toString()">{{ fromNow }}</span>
+  <abbr :title="date.toString()">{{ fromNow }}</abbr>
 </template>
 <script>
 import moment from "moment";
diff --git a/django_airavata/static/common/js/components/Uppy.vue b/django_airavata/static/common/js/components/Uppy.vue
index 495a342..44cf714 100644
--- a/django_airavata/static/common/js/components/Uppy.vue
+++ b/django_airavata/static/common/js/components/Uppy.vue
@@ -151,4 +151,7 @@
 .custom-Uppy >>> .uppy-DragDrop-label {
   margin-bottom: 0px;
 }
+.custom-Uppy >>> .uppy-StatusBar {
+  background-color: inherit;
+}
 </style>
diff --git a/django_airavata/static/common/js/components/ValidatedForm.vue b/django_airavata/static/common/js/components/ValidatedForm.vue
new file mode 100644
index 0000000..f126ec9
--- /dev/null
+++ b/django_airavata/static/common/js/components/ValidatedForm.vue
@@ -0,0 +1,83 @@
+<template>
+  <b-form>
+    <template v-for="item in items">
+      <validated-form-group
+        :label="item.label"
+        :key="item.key"
+        :valid="isValid(item.key)"
+        :feedback-messages="getFeedbackMessages(item.key)"
+        :description="item.description"
+      >
+        <slot
+          :item="item.item"
+          :valid="() => setValid(item.key)"
+          :invalid="messages => setInvalid(item.key, messages)"
+        />
+      </validated-form-group>
+    </template>
+  </b-form>
+</template>
+
+<script>
+import ValidatedFormGroup from "./ValidatedFormGroup";
+
+export default {
+  name: "validated-form",
+  props: {
+    items: {
+      type: Array,
+      required: true
+    }
+  },
+  components: {
+    ValidatedFormGroup
+  },
+  data() {
+    return {
+      invalidFormItems: [],
+      feedbackMessages: {}
+    };
+  },
+  computed: {
+    valid() {
+      return this.invalidFormItems.length === 0;
+    }
+  },
+  methods: {
+    setValid(key) {
+      const wasValid = this.valid;
+      if (this.invalidFormItems.includes(key)) {
+        const index = this.invalidFormItems.indexOf(key);
+        this.invalidFormItems.splice(index, 1);
+      }
+      if (!wasValid && this.valid) {
+        this.$emit('valid');
+      }
+    },
+    setInvalid(key, messages) {
+      const wasValid = this.valid;
+      if (!this.invalidFormItems.includes(key)) {
+        this.invalidFormItems.push(key);
+      }
+      if (typeof messages === "string") {
+        this.feedbackMessages[key] = [messages];
+      } else {
+        this.feedbackMessages[key] = messages;
+      }
+      if (wasValid) {
+        this.$emit('invalid');
+      }
+    },
+    isValid(key) {
+      return !this.invalidFormItems.includes(key);
+    },
+    getFeedbackMessages(key) {
+      if (key in this.feedbackMessages) {
+        return this.feedbackMessages[key];
+      } else {
+        return [];
+      }
+    }
+  }
+};
+</script>
diff --git a/django_airavata/static/common/js/components/ValidatedFormGroup.vue b/django_airavata/static/common/js/components/ValidatedFormGroup.vue
new file mode 100644
index 0000000..6cb2861
--- /dev/null
+++ b/django_airavata/static/common/js/components/ValidatedFormGroup.vue
@@ -0,0 +1,43 @@
+<template>
+  <b-form-group :label="label" :state="state" :description="description">
+    <slot></slot>
+    <template slot="invalid-feedback">
+      <ul v-if="feedbackMessages && feedbackMessages.length > 1">
+        <li v-for="feedback in feedbackMessages" :key="feedback">
+          {{ feedback }}
+        </li>
+      </ul>
+      <div v-else-if="feedbackMessages && feedbackMessages.length === 1">
+        {{ feedbackMessages[0] }}
+      </div>
+    </template>
+  </b-form-group>
+</template>
+
+<script>
+export default {
+  name: "validated-form-group",
+  props: {
+    label: {
+      type: String,
+      required: true
+    },
+    description: {
+      type: String
+    },
+    valid: {
+      type: Boolean,
+      required: true
+    },
+    feedbackMessages: {
+      type: Array,
+      required: true
+    }
+  },
+  computed: {
+    state() {
+      return this.valid ? null : "invalid";
+    }
+  }
+};
+</script>
diff --git a/django_airavata/static/common/js/index.js b/django_airavata/static/common/js/index.js
index 25b3519..87ae172 100644
--- a/django_airavata/static/common/js/index.js
+++ b/django_airavata/static/common/js/index.js
@@ -20,6 +20,8 @@
 import SidebarHeader from "./components/SidebarHeader.vue";
 import UnsavedChangesGuard from "./components/UnsavedChangesGuard.vue";
 import Uppy from "./components/Uppy";
+import ValidatedForm from "./components/ValidatedForm";
+import ValidatedFormGroup from "./components/ValidatedFormGroup";
 
 import GlobalErrorHandler from "./errors/GlobalErrorHandler";
 import ValidationErrors from "./errors/ValidationErrors";
@@ -57,7 +59,9 @@
   SidebarFeed,
   SidebarHeader,
   UnsavedChangesGuard,
-  Uppy
+  Uppy,
+  ValidatedForm,
+  ValidatedFormGroup,
 };
 
 const errors = {
diff --git a/django_airavata/static/common/js/layouts/ListLayout.vue b/django_airavata/static/common/js/layouts/ListLayout.vue
index d94628f..dfd77fa 100644
--- a/django_airavata/static/common/js/layouts/ListLayout.vue
+++ b/django_airavata/static/common/js/layouts/ListLayout.vue
@@ -7,6 +7,8 @@
         </slot>
       </div>
       <div class="col-auto">
+        <slot name="additional-buttons">
+        </slot>
         <slot name="new-item-button">
           <b-btn variant="primary" @click="addNewItem" :disabled="newButtonDisabled">
             {{ newItemButtonText }}
diff --git a/django_airavata/static/common/js/utils.js b/django_airavata/static/common/js/utils.js
index 21ff86c..54d43f1 100644
--- a/django_airavata/static/common/js/utils.js
+++ b/django_airavata/static/common/js/utils.js
@@ -1,13 +1,26 @@
-
 export function getProperty(obj, props) {
-    if (typeof props === 'string') {
-        return obj[props];
-    } else if (typeof props === 'object' && props instanceof Array) { // Array
-        return props.reduce((o, prop) => o && prop in o ? o[prop] : undefined, obj);
-    }
+  if (typeof props === "string") {
+    return obj[props];
+  } else if (typeof props === "object" && props instanceof Array) {
+    // Array
+    return props.reduce(
+      (o, prop) => (o && prop in o ? o[prop] : undefined),
+      obj
+    );
+  }
 }
 export function sanitizeHTMLId(id) {
   // Replace anything that isn't an HTML safe id character with underscore
   // Here safe means allowable by HTML5 and also safe to use in a jQuery selector
   return id.replace(/[^a-zA-Z0-9_-]/g, "_");
 }
+export const dateFormatters = {
+  dateTimeInMinutesWithTimeZone: new Intl.DateTimeFormat(undefined, {
+    year: "numeric",
+    month: "2-digit",
+    day: "2-digit",
+    hour: "numeric",
+    minute: "numeric",
+    timeZoneName: "short"
+  })
+};
diff --git a/django_airavata/static/common/vue.config.js b/django_airavata/static/common/vue.config.js
index 1294fa6..82ac222 100644
--- a/django_airavata/static/common/vue.config.js
+++ b/django_airavata/static/common/vue.config.js
@@ -2,7 +2,6 @@
 
 module.exports = {
   publicPath: "/static/common/dist/",
-  productionSourceMap: false,
   pages: {
     app: "./js/main.js",
     cms: "./js/cms.js",
diff --git a/django_airavata/templates/blocks/bootstrap/carousel.html b/django_airavata/templates/blocks/bootstrap/carousel.html
index ef76efe..284973d 100755
--- a/django_airavata/templates/blocks/bootstrap/carousel.html
+++ b/django_airavata/templates/blocks/bootstrap/carousel.html
@@ -1,7 +1,7 @@
 
 {% load wagtailimages_tags %}
 
-<div id="carouselExampleIndicators" class="carousel slide {%if self.custom_class %}{{self.custom_class}}{% endif %}" data-ride="carousel">
+<div id="carouselExampleIndicators" class="carousel slide {%if self.custom_class %}{{self.custom_class}}{% endif %}" data-ride="carousel" data-interval="{{self.interval}}">
   <ol class="carousel-indicators">
     <li data-target="#carouselExampleIndicators" data-slide-to="0" class="active"></li>
     {% if self.c_image2 %}<li data-target="#carouselExampleIndicators" data-slide-to="1"></li>{% endif %}
diff --git a/django_airavata/templates/blocks/bootstrap/container.html b/django_airavata/templates/blocks/bootstrap/container.html
new file mode 100644
index 0000000..419f717
--- /dev/null
+++ b/django_airavata/templates/blocks/bootstrap/container.html
@@ -0,0 +1,13 @@
+{% load wagtailimages_tags %}
+
+<!-- close previous container -->
+</div>
+<!-- close previous container wrapper -->
+</div>
+<div class="container-wrapper {{ value.custom_classes }}" style="{{ value.inline_styles }}
+{% if value.background_image %}
+{% image self.background_image original as background_image_orig %}
+background-image: url({{ background_image_orig.url }});
+{% endif %}
+">
+<div class="{{ container_class }}">
diff --git a/django_airavata/templates/django_airavata_wagtail_base/blank_page.html b/django_airavata/templates/django_airavata_wagtail_base/blank_page.html
index 1f7347c..8e672db 100644
--- a/django_airavata/templates/django_airavata_wagtail_base/blank_page.html
+++ b/django_airavata/templates/django_airavata_wagtail_base/blank_page.html
@@ -24,14 +24,21 @@
   {% get_announcements %}
 {% endif %}
 
-<div class="container-fluid">
-  {% for item in page.row.all %}
-  <div class="row">
-    {% for block in item.body %}
-      {% include_block block.value %}
+<div class="container-fluid-wrapper">
+  <div class="container-fluid">
+    {% for item in page.row.all %}
+      {% if item.container %}
+        {% comment %} There can only be one container. This will close the previous
+        container and start a new one. {% endcomment %}
+        {% include_block item.container|first %}
+      {% endif %}
+    <div class="row">
+      {% for block in item.body %}
+        {% include_block block.value %}
+      {% endfor %}
+    </div>
     {% endfor %}
   </div>
-  {% endfor %}
 </div>
 
 {% if page.show_footer == "yes" %}
diff --git a/django_airavata/wagtailapps/base/blocks.py b/django_airavata/wagtailapps/base/blocks.py
index 56cd97d..729d7e2 100644
--- a/django_airavata/wagtailapps/base/blocks.py
+++ b/django_airavata/wagtailapps/base/blocks.py
@@ -338,6 +338,10 @@
     """
     Custom 'StructBlock' that allows the user to make a bootstrap carousel
     """
+    interval = IntegerBlock(default=2000, help_text="""
+    The amount of time to delay between automatically cycling an item. If
+    false, carousel will not automatically cycle.
+    """)
     c_image1 = ImageChooserBlock(required=True)
     c_image1_title = TextBlock(
         required=False, blank=True, help_text="Give a title for image 1")
@@ -486,6 +490,52 @@
     css_comment = CssCommentBlock()
 
 
+class ContainerBlock(StructBlock):
+    inline_styles = TextBlock(
+        required=False,
+        blank=True,
+        help_text="Apply inline CSS styles to container wrapper.")
+    custom_classes = CharBlock(
+        required=False,
+        help_text="Apply custom CSS classes to container wrapper. You can "
+                  "define CSS classes in a Custom CSS snippet.")
+    background_image = ImageChooserBlock(
+        required=False,
+        help_text="Apply background image to container wrapper.")
+
+    def get_context(self, value, parent_context=None):
+        context = super().get_context(value, parent_context=parent_context)
+        context['container_class'] = self.container_class
+        return context
+
+    class Meta:
+        abstract = True
+        template = "blocks/bootstrap/container.html"
+
+
+class FullWidthContainer(ContainerBlock):
+    container_class = "container-fluid"
+
+    class Meta:
+        icon = "fa-arrows-h"
+
+
+class MaxWidthContainer(ContainerBlock):
+    container_class = "container"
+
+    class Meta:
+        icon = "fa-square-o"
+
+
+class ContainerChoiceBlock(StreamBlock):
+    full_width_container = FullWidthContainer()
+    max_width_container = MaxWidthContainer()
+
+    class Meta:
+        max_num = 1
+        required = False
+
+
 class NavItem(StructBlock):
     link = CharBlock(help_text="Full URL or relative path (e.g., /auth/login)")
     link_text = CharBlock(required=False)
diff --git a/django_airavata/wagtailapps/base/fixtures/physicell.json b/django_airavata/wagtailapps/base/fixtures/physicell.json
new file mode 100644
index 0000000..d42a208
--- /dev/null
+++ b/django_airavata/wagtailapps/base/fixtures/physicell.json
@@ -0,0 +1,3527 @@
+[
+{
+    "model": "auth.group",
+    "pk": 1,
+    "fields": {
+        "name": "Moderators",
+        "permissions": [
+            [
+                "access_admin",
+                "wagtailadmin",
+                "admin"
+            ],
+            [
+                "add_document",
+                "wagtaildocs",
+                "document"
+            ],
+            [
+                "change_document",
+                "wagtaildocs",
+                "document"
+            ],
+            [
+                "delete_document",
+                "wagtaildocs",
+                "document"
+            ],
+            [
+                "add_image",
+                "wagtailimages",
+                "image"
+            ],
+            [
+                "change_image",
+                "wagtailimages",
+                "image"
+            ],
+            [
+                "delete_image",
+                "wagtailimages",
+                "image"
+            ]
+        ]
+    }
+},
+{
+    "model": "auth.group",
+    "pk": 2,
+    "fields": {
+        "name": "Editors",
+        "permissions": [
+            [
+                "access_admin",
+                "wagtailadmin",
+                "admin"
+            ],
+            [
+                "add_document",
+                "wagtaildocs",
+                "document"
+            ],
+            [
+                "change_document",
+                "wagtaildocs",
+                "document"
+            ],
+            [
+                "delete_document",
+                "wagtaildocs",
+                "document"
+            ],
+            [
+                "add_image",
+                "wagtailimages",
+                "image"
+            ],
+            [
+                "change_image",
+                "wagtailimages",
+                "image"
+            ],
+            [
+                "delete_image",
+                "wagtailimages",
+                "image"
+            ]
+        ]
+    }
+},
+{
+    "model": "auth.user",
+    "pk": 1,
+    "fields": {
+        "password": "pbkdf2_sha256$36000$9WEqnZsoPTSP$LPD3/zSUWHMoLa5ILSBUdOfWEaF+XO0C1fC0aukbLCw=",
+        "last_login": "2018-04-27T17:53:51.009Z",
+        "is_superuser": true,
+        "username": "stephenpaul2727",
+        "first_name": "",
+        "last_name": "",
+        "email": "stephenpaul2727@gmail.com",
+        "is_staff": true,
+        "is_active": true,
+        "date_joined": "2018-04-17T21:22:18.507Z",
+        "groups": [],
+        "user_permissions": []
+    }
+},
+{
+    "model": "auth.user",
+    "pk": 2,
+    "fields": {
+        "password": "",
+        "last_login": "2018-11-02T18:57:32.188Z",
+        "is_superuser": true,
+        "username": "marcus",
+        "first_name": "Marcus",
+        "last_name": "Christie",
+        "email": "machrist@iu.edu",
+        "is_staff": true,
+        "is_active": true,
+        "date_joined": "2018-11-02T18:38:43.781Z",
+        "groups": [],
+        "user_permissions": []
+    }
+},
+{
+    "model": "auth.user",
+    "pk": 3,
+    "fields": {
+        "password": "pbkdf2_sha256$36000$EfmNWmX6w3ZD$EQU8ERdQoB/9SyuO2tKCX35+eoiqRIbC2ZuIUSugluI=",
+        "last_login": "2020-04-25T20:32:44.492Z",
+        "is_superuser": true,
+        "username": "akila",
+        "first_name": "",
+        "last_name": "",
+        "email": "kdakilaishani@gmail.com",
+        "is_staff": true,
+        "is_active": true,
+        "date_joined": "2020-04-25T20:32:23.533Z",
+        "groups": [],
+        "user_permissions": []
+    }
+},
+{
+    "model": "sessions.session",
+    "pk": "63w9xcyo0q9i42lg04f4gudjdfvj3lgc",
+    "fields": {
+        "session_data": "MmMxOWVjNjc0YWJlOGI3ZmFkYjJmNWVkNjEzYTJjNGY5ODMwMmVlYjp7Il9hdXRoX3VzZXJfaWQiOiIzIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiI5MTc0NmY2MzQxZTBhY2JkZDMyODFlMTFjMzQyNGQwZWE0NmU4NGQ2Iiwid2FndGFpbC1wcmV2aWV3LTMiOlsiY3NyZm1pZGRsZXdhcmV0b2tlbj0zMnB0U0t4bG1Wb2JPY1JEZmtmNWFzNnpFZzNFcWhya3FGcGNKYTBkM3VmcXBiY0FFWG5WU25qWjZSZ3N1bHV4Jm5leHQ9JnRpdGxlPUhvbWUmcm93LVRPVEFMX0ZPUk1TPTYmcm93LUlOSVRJQUxfRk9STVM9NiZyb3ctTUlOX05VTV9GT1JNUz0wJnJvdy1NQVhfTlVNX0ZPUk1TPTEwMDAmcm93LTAtYm9keS1jb3VudD0yJnJvdy0wLWJvZHktMC1kZWxldGVkPSZyb3ctMC1ib2R5LTAtb3JkZXI9MCZyb3ctMC1ib2R5LTAtdHlwZT1oZWFkaW5nX2Jsb2NrJnJvdy0wLWJvZHktMC1pZD03NTVjMjYyMS1mNGQxLTQzOTgtOWJmNy0zYTEwZGQ4YzMzZWMmcm93LTAtYm9keS0wLXZhbHVlLWhlYWRpbmdfdGV4dD1TQVJTLUNvVi0yK1Rpc3N1ZStTaW11bGF0aW9uK0NvYWxpdGlvbiZyb3ctMC1ib2R5LTAtdmFsdWUtc2l6ZT1oMSZyb3ctMC1ib2R5LTAtdmFsdWUtY3VzdG9tX2NsYXNzPWNvbnRhaW5lcitjb2wtNit0ZXh0LWNlbnRlcitwdC01K3RleHQtbGlnaHQmcm93LTAtYm9keS0xLWRlbGV0ZWQ9JnJvdy0wLWJvZHktMS1vcmRlcj0xJnJvdy0wLWJvZHktMS10eXBlPWJvb3RzdHJhcF9jYXJkJnJvdy0wLWJvZHktMS1pZD0zZjZiNmJjOC1mMjdhLTRkYmItYmYzYy0yYmM4ZDYxMGQzMWImcm93LTAtYm9keS0xLXZhbHVlLWNhcmRfd2lkdGg9JnJvdy0wLWJvZHktMS12YWx1ZS1jYXJkX2ltZz0mcm93LTAtYm9keS0xLXZhbHVlLWNhcmRfaW1nX3dpZHRoPSZyb3ctMC1ib2R5LTEtdmFsdWUtY2FyZF9pbWdfaGVpZ2h0PSZyb3ctMC1ib2R5LTEtdmFsdWUtY2FyZF90aXRsZT0mcm93LTAtYm9keS0xLXZhbHVlLWNhcmRfdGV4dD0lN0IlMEQlMEErKysrJTIyYmxvY2tzJTIyJTNBKyU1QiUwRCUwQSsrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrJTIya2V5JTIyJTNBKyUyMmNoNzhnJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIydHlwZSUyMiUzQSslMjJoZWFkZXItZm91ciUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMldlK2Fzc2VtYmxlZCthbitpbnRlcm5hdGlvbmFsK2NvYWxpdGlvbit0bytkZXZlbG9wK2ErY29tcHJlaGVuc2l2ZSttdWx0aXNjYWxlK3NpbXVsYXRpb24rZnJhbWV3b3JrK2ZvcitTQVJTLUNvVi0yKyUyOGNvcm9uYXZpcnVzJTI5K2luZmVjdGlvbnMraW4rbHVuZythbmQrZ3V0K3Rpc3N1ZXMlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlMEQlMEErKysrKysrKysrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJvZmZzZXQlMjIlM0ErNTMlMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMmxlbmd0aCUyMiUzQSs0NSUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyc3R5bGUlMjIlM0ErJTIyQk9MRCUyMiUwRCUwQSsrKysrKysrKysrKysrKyslN0QlMEQlMEErKysrKysrKysrKyslNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjIxZ2Y1MCUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIydW5zdHlsZWQlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjJQaHlzaUNlbGwrYWltcyt0bytwcm92aWRlK2Ercm9idXN0JTJDK3NjYWxhYmxlK2NvZGUrZm9yK3NpbXVsYXRpbmcrbGFyZ2Urc3lzdGVtcytvZitjZWxscytpbiszLUQrdGlzc3VlcytvbitzdGFuZGFyZCtkZXNrdG9wK2NvbXB1dGVycy4rQW1vbmcrb3VyK2Rlc2lnbitnb2FscyUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmlubGluZVN0eWxlUmFuZ2VzJTIyJTNBKyU1QiU1RCUyQyUwRCUwQSsrKysrKysrKysrKyUyMmVudGl0eVJhbmdlcyUyMiUzQSslNUIlNUQlMEQlMEErKysrKysrKyU3RCUwRCUwQSsrKyslNUQlMkMlMEQlMEErKysrJTIyZW50aXR5TWFwJTIyJTNBKyU3QiU3RCUwRCUwQSU3RCZyb3ctMC1ib2R5LTEtdmFsdWUtY2FyZF9iZ19jb2xvcj0mcm93LTAtYm9keS0xLXZhbHVlLWNhcmRfdGV4dF9jb2xvcj0mcm93LTAtYm9keS0xLXZhbHVlLWJ1dHRvbnMtY291bnQ9MiZyb3ctMC1ib2R5LTEtdmFsdWUtYnV0dG9ucy0wLWRlbGV0ZWQ9JnJvdy0wLWJvZHktMS12YWx1ZS1idXR0b25zLTAtb3JkZXI9MCZyb3ctMC1ib2R5LTEtdmFsdWUtYnV0dG9ucy0wLXZhbHVlLWJ1dHRvbl90ZXh0PVRyeSt0aGUrbW9kZWwraW4rYSt3ZWIrYnJvd3NlciUyMSZyb3ctMC1ib2R5LTEtdmFsdWUtYnV0dG9ucy0wLXZhbHVlLWJ1dHRvbl9saW5rPWh0dHBzJTNBJTJGJTJGbmFub2h1Yi5vcmclMkZ0b29scyUyRnBjNGNvdmlkMTkmcm93LTAtYm9keS0xLXZhbHVlLWJ1dHRvbnMtMC12YWx1ZS1idXR0b25fY29sb3I9JnJvdy0wLWJvZHktMS12YWx1ZS1idXR0b25zLTAtdmFsdWUtYnV0dG9uX3NpemU9JnJvdy0wLWJvZHktMS12YWx1ZS1idXR0b25zLTAtdmFsdWUtY3VzdG9tX2NsYXNzPWJ0bi13YXJuaW5nK2J0bi10aGVtZS15ZWxsb3cmcm93LTAtYm9keS0xLXZhbHVlLWJ1dHRvbnMtMS1kZWxldGVkPSZyb3ctMC1ib2R5LTEtdmFsdWUtYnV0dG9ucy0xLW9yZGVyPTEmcm93LTAtYm9keS0xLXZhbHVlLWJ1dHRvbnMtMS12YWx1ZS1idXR0b25fdGV4dD1WaWV3K1NvdXJjZStDb2RlK29uK0dpdEh1YiZyb3ctMC1ib2R5LTEtdmFsdWUtYnV0dG9ucy0xLXZhbHVlLWJ1dHRvbl9saW5rPWh0dHBzJTNBJTJGJTJGd3d3LmdpdGh1Yi5jb20lMkZwYzRjb3ZpZDE5JnJvdy0wLWJvZHktMS12YWx1ZS1idXR0b25zLTEtdmFsdWUtYnV0dG9uX2NvbG9yPSZyb3ctMC1ib2R5LTEtdmFsdWUtYnV0dG9ucy0xLXZhbHVlLWJ1dHRvbl9zaXplPSZyb3ctMC1ib2R5LTEtdmFsdWUtYnV0dG9ucy0xLXZhbHVlLWN1c3RvbV9jbGFzcz1idG4tc3VjY2VzcytidG4tdGhlbWUtZ3JlZW4rcGItMiZyb3ctMC1ib2R5LTEtdmFsdWUtY3VzdG9tX2NsYXNzPWNvbnRhaW5lcitjb2wtNytwdC0wK3BiLTUrdGV4dC1jZW50ZXIrYm9yZGVybGVzcy1jYXJkJnJvdy0wLWlkPSZyb3ctMC1PUkRFUj0xJnJvdy0wLURFTEVURT0mcm93LTEtYm9keS1jb3VudD0yJnJvdy0xLWJvZHktMC1kZWxldGVkPSZyb3ctMS1ib2R5LTAtb3JkZXI9MCZyb3ctMS1ib2R5LTAtdHlwZT1ib290c3RyYXBfY2FyZCZyb3ctMS1ib2R5LTAtaWQ9ZWQyYTZkNDEtOWEzNS00NjZiLTlmYjgtYTdjZDNhNDI5OWZiJnJvdy0xLWJvZHktMC12YWx1ZS1jYXJkX3dpZHRoPSZyb3ctMS1ib2R5LTAtdmFsdWUtY2FyZF9pbWc9JnJvdy0xLWJvZHktMC12YWx1ZS1jYXJkX2ltZ193aWR0aD0mcm93LTEtYm9keS0wLXZhbHVlLWNhcmRfaW1nX2hlaWdodD0mcm93LTEtYm9keS0wLXZhbHVlLWNhcmRfdGl0bGU9JnJvdy0xLWJvZHktMC12YWx1ZS1jYXJkX3RleHQ9JTdCJTBEJTBBKysrKyUyMmJsb2NrcyUyMiUzQSslNUIlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjI0dGt5YyUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIyaGVhZGVyLXR3byUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMkhvdytpdCt3b3JrcyUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmlubGluZVN0eWxlUmFuZ2VzJTIyJTNBKyU1QiU1RCUyQyUwRCUwQSsrKysrKysrKysrKyUyMmVudGl0eVJhbmdlcyUyMiUzQSslNUIlNUQlMEQlMEErKysrKysrKyU3RCUyQyUwRCUwQSsrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrJTIya2V5JTIyJTNBKyUyMnk1eWgwJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIydHlwZSUyMiUzQSslMjJ1bnN0eWxlZCUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMkluK01hcmNoKzIwMjAlMkMrd2UrYXNzZW1ibGVkK2FuK2ludGVybmF0aW9uYWwrY29hbGl0aW9uK3RvK2RldmVsb3ArYStjb21wcmVoZW5zaXZlK211bHRpc2NhbGUrc2ltdWxhdGlvbitmcmFtZXdvcmsrZm9yK1NBUlMtQ29WLTIrJTI4Y29yb25hdmlydXMlMjkraW5mZWN0aW9ucytpbitsdW5nK2FuZCtndXQrdGlzc3Vlcy4rV2UrYWltK3RvK3VuZGVyc3RhbmQrYW5kK3Rlc3QraW50ZXJ2ZW50aW9ucytpbit0aGUrY291cGxlZCtkeW5hbWljcytvZitDT1ZJRC0xOSUyQytpbmNsdWRpbmclM0ElMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlMEQlMEErKysrKysrKysrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJvZmZzZXQlMjIlM0ErNjglMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMmxlbmd0aCUyMiUzQSs0NSUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyc3R5bGUlMjIlM0ErJTIyQk9MRCUyMiUwRCUwQSsrKysrKysrKysrKysrKyslN0QlMEQlMEErKysrKysrKysrKyslNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjJ1aHZuOSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIydW5vcmRlcmVkLWxpc3QtaXRlbSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMlZpcnVzK3NwcmVhZCtpbit0aXNzdWUlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjJqNzhieSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIydW5vcmRlcmVkLWxpc3QtaXRlbSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMlZpcmlvbithZGhlc2lvbit0bytBQ0UyK3JlY2VwdG9ycytvbitjZWxscyUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmlubGluZVN0eWxlUmFuZ2VzJTIyJTNBKyU1QiU1RCUyQyUwRCUwQSsrKysrKysrKysrKyUyMmVudGl0eVJhbmdlcyUyMiUzQSslNUIlNUQlMEQlMEErKysrKysrKyU3RCUyQyUwRCUwQSsrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrJTIya2V5JTIyJTNBKyUyMmU1cGg3JTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIydHlwZSUyMiUzQSslMjJ1bm9yZGVyZWQtbGlzdC1pdGVtJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyZGVwdGglMjIlM0ErMCUyQyUwRCUwQSsrKysrKysrKysrKyUyMnRleHQlMjIlM0ErJTIyRW5kb2N5dG9zaXMrJTI4YWN0aXZlK3RyYW5zcG9ydCtpbnRvK3RoZStjZWxsJTI5JTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyaW5saW5lU3R5bGVSYW5nZXMlMjIlM0ErJTVCJTVEJTJDJTBEJTBBKysrKysrKysrKysrJTIyZW50aXR5UmFuZ2VzJTIyJTNBKyU1QiU1RCUwRCUwQSsrKysrKysrJTdEJTJDJTBEJTBBKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKyslMjJrZXklMjIlM0ErJTIybXc0NjQlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJ0eXBlJTIyJTNBKyUyMnVub3JkZXJlZC1saXN0LWl0ZW0lMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjJWaXJhbCt1bmNvYXRpbmclMkMrcmVwbGljYXRpb24lMkMrYW5kK2Fzc2VtYmx5K2ludG8rbmV3K3ZpcmlvbnMlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjI3amF2YSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIydW5vcmRlcmVkLWxpc3QtaXRlbSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMlZpcmFsK2V4b2N5dG9zaXMrJTI4cmVsZWFzZStvZitjb21wbGV0ZWQrdmlyaW9ucyUyOSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmlubGluZVN0eWxlUmFuZ2VzJTIyJTNBKyU1QiU1RCUyQyUwRCUwQSsrKysrKysrKysrKyUyMmVudGl0eVJhbmdlcyUyMiUzQSslNUIlNUQlMEQlMEErKysrKysrKyU3RCUyQyUwRCUwQSsrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrJTIya2V5JTIyJTNBKyUyMm5qd2w3JTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIydHlwZSUyMiUzQSslMjJ1bm9yZGVyZWQtbGlzdC1pdGVtJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyZGVwdGglMjIlM0ErMCUyQyUwRCUwQSsrKysrKysrKysrKyUyMnRleHQlMjIlM0ErJTIyU2luZ2xlLWNlbGwrcmVzcG9uc2VzK3RvK2luZmVjdGlvbiUyQytpbmNsdWRpbmcrZGlzcnVwdGVkK21ldGFib2xpc20lMkMrc2VjcmV0aW9uK29mK2ludGVyZmVyb25zJTJDK2FuZCtjZWxsK2RlYXRoJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyaW5saW5lU3R5bGVSYW5nZXMlMjIlM0ErJTVCJTVEJTJDJTBEJTBBKysrKysrKysrKysrJTIyZW50aXR5UmFuZ2VzJTIyJTNBKyU1QiU1RCUwRCUwQSsrKysrKysrJTdEJTJDJTBEJTBBKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKyslMjJrZXklMjIlM0ErJTIydmc1aTIlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJ0eXBlJTIyJTNBKyUyMnVub3JkZXJlZC1saXN0LWl0ZW0lMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjJJbmZsYW1tYXRvcnkrcmVzcG9uc2VzJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyaW5saW5lU3R5bGVSYW5nZXMlMjIlM0ErJTVCJTVEJTJDJTBEJTBBKysrKysrKysrKysrJTIyZW50aXR5UmFuZ2VzJTIyJTNBKyU1QiU1RCUwRCUwQSsrKysrKysrJTdEJTJDJTBEJTBBKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKyslMjJrZXklMjIlM0ErJTIyem5pdDklMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJ0eXBlJTIyJTNBKyUyMnVub3JkZXJlZC1saXN0LWl0ZW0lMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjJJbW11bmUrYWN0aXZhdGlvbithbmQrZXhwYW5zaW9uK2luK2x5bXBoK25vZGVzJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyaW5saW5lU3R5bGVSYW5nZXMlMjIlM0ErJTVCJTVEJTJDJTBEJTBBKysrKysrKysrKysrJTIyZW50aXR5UmFuZ2VzJTIyJTNBKyU1QiU1RCUwRCUwQSsrKysrKysrJTdEJTJDJTBEJTBBKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKyslMjJrZXklMjIlM0ErJTIyYWZ5Z2IlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJ0eXBlJTIyJTNBKyUyMnVub3JkZXJlZC1saXN0LWl0ZW0lMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjJJbW11bmUrY2VsbCtpbmZpbHRyYXRpb24rYW5kK3ByZWRhdGlvbitpbitpbmZlY3RlZCt0aXNzdWUlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjI5cnUzdiUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIydW5vcmRlcmVkLWxpc3QtaXRlbSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMlRpc3N1ZStkYW1hZ2UlMkMraW5jbHVkaW5nK2VkZW1hK3RoYXQrY2FuK2xlYWQrdG8rYWN1dGUrcmVzcGlyYXRvcnkrZGlzdHJlc3Mrc3luZHJvbWUrJTI4QVJEUyUyOSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmlubGluZVN0eWxlUmFuZ2VzJTIyJTNBKyU1QiU1RCUyQyUwRCUwQSsrKysrKysrKysrKyUyMmVudGl0eVJhbmdlcyUyMiUzQSslNUIlNUQlMEQlMEErKysrKysrKyU3RCUwRCUwQSsrKyslNUQlMkMlMEQlMEErKysrJTIyZW50aXR5TWFwJTIyJTNBKyU3QiU3RCUwRCUwQSU3RCZyb3ctMS1ib2R5LTAtdmFsdWUtY2FyZF9iZ19jb2xvcj0mcm93LTEtYm9keS0wLXZhbHVlLWNhcmRfdGV4dF9jb2xvcj0mcm93LTEtYm9keS0wLXZhbHVlLWJ1dHRvbnMtY291bnQ9MCZyb3ctMS1ib2R5LTAtdmFsdWUtY3VzdG9tX2NsYXNzPWNvbnRhaW5lcitjb2wtNitwbC01K3B4LTArYm9yZGVybGVzcy1jYXJkK3RoZW1lLWhlYWRlciZyb3ctMS1ib2R5LTEtZGVsZXRlZD0mcm93LTEtYm9keS0xLW9yZGVyPTEmcm93LTEtYm9keS0xLXR5cGU9Ym9vdHN0cmFwX2NhcmQmcm93LTEtYm9keS0xLWlkPTI1ZWU0YWFmLTljOGQtNDEzYi1iMTQyLWZlZTVjNTJhN2ZhNyZyb3ctMS1ib2R5LTEtdmFsdWUtY2FyZF93aWR0aD0mcm93LTEtYm9keS0xLXZhbHVlLWlzX2NhcmRfaW1nPW9uJnJvdy0xLWJvZHktMS12YWx1ZS1jYXJkX2ltZz0yOCZyb3ctMS1ib2R5LTEtdmFsdWUtY2FyZF9pbWdfd2lkdGg9MzAwJnJvdy0xLWJvZHktMS12YWx1ZS1jYXJkX2ltZ19oZWlnaHQ9MzAwJnJvdy0xLWJvZHktMS12YWx1ZS1jYXJkX3RpdGxlPSZyb3ctMS1ib2R5LTEtdmFsdWUtY2FyZF90ZXh0PSU3QiUwRCUwQSsrKyslMjJibG9ja3MlMjIlM0ErJTVCJTBEJTBBKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKyslMjJrZXklMjIlM0ErJTIybXdwcXElMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJ0eXBlJTIyJTNBKyUyMnVuc3R5bGVkJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyZGVwdGglMjIlM0ErMCUyQyUwRCUwQSsrKysrKysrKysrKyUyMnRleHQlMjIlM0ErJTIyJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyaW5saW5lU3R5bGVSYW5nZXMlMjIlM0ErJTVCJTVEJTJDJTBEJTBBKysrKysrKysrKysrJTIyZW50aXR5UmFuZ2VzJTIyJTNBKyU1QiU1RCUwRCUwQSsrKysrKysrJTdEJTBEJTBBKysrKyU1RCUyQyUwRCUwQSsrKyslMjJlbnRpdHlNYXAlMjIlM0ErJTdCJTdEJTBEJTBBJTdEJnJvdy0xLWJvZHktMS12YWx1ZS1jYXJkX2JnX2NvbG9yPSZyb3ctMS1ib2R5LTEtdmFsdWUtY2FyZF90ZXh0X2NvbG9yPSZyb3ctMS1ib2R5LTEtdmFsdWUtYnV0dG9ucy1jb3VudD0wJnJvdy0xLWJvZHktMS12YWx1ZS1jdXN0b21fY2xhc3M9Y29udGFpbmVyK2NvbC02K3ByLTUrcHgtMCtib3JkZXJsZXNzLWNhcmQmcm93LTEtaWQ9JnJvdy0xLU9SREVSPTImcm93LTEtREVMRVRFPSZyb3ctMi1ib2R5LWNvdW50PTImcm93LTItYm9keS0wLWRlbGV0ZWQ9JnJvdy0yLWJvZHktMC1vcmRlcj0wJnJvdy0yLWJvZHktMC10eXBlPWJvb3RzdHJhcF9jYXJkJnJvdy0yLWJvZHktMC1pZD1iZjY1YTY0ZC1kN2UzLTRhNjgtYmU1Zi02MjRhOTZlZGY2MWYmcm93LTItYm9keS0wLXZhbHVlLWNhcmRfd2lkdGg9JnJvdy0yLWJvZHktMC12YWx1ZS1jYXJkX2ltZz0mcm93LTItYm9keS0wLXZhbHVlLWNhcmRfaW1nX3dpZHRoPSZyb3ctMi1ib2R5LTAtdmFsdWUtY2FyZF9pbWdfaGVpZ2h0PSZyb3ctMi1ib2R5LTAtdmFsdWUtY2FyZF90aXRsZT0mcm93LTItYm9keS0wLXZhbHVlLWNhcmRfdGV4dD0lN0IlMEQlMEErKysrJTIyYmxvY2tzJTIyJTNBKyU1QiUwRCUwQSsrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrJTIya2V5JTIyJTNBKyUyMjNrOTJ0JTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIydHlwZSUyMiUzQSslMjJ1bnN0eWxlZCUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMkJ5K3JhcGlkbHkrY3JlYXRpbmcrYSttdWx0aXNjYWxlK2ZyYW1ld29yayUyQyt3ZStjYW4rYXNrK3doYXQraWYrcXVlc3Rpb25zK3RoYXQraWRlbnRpZnkrdnVsbmVyYWJpbGl0aWVzK2luK3ZpcmFsK3JlcGxpY2F0aW9uK2FuZCt0aGUrc3ByZWFkK29mK3RoZStpbmZlY3Rpb24lMkMrYW5kK3NlZWsrYXBwcm9hY2hlcyt0bytjb250cm9sK3RoZStpbW11bmUrcmVzcG9uc2UrdG8rYXZvaWQrYWR2ZXJzZStyZWFjdGlvbnMuJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyaW5saW5lU3R5bGVSYW5nZXMlMjIlM0ErJTVCJTBEJTBBKysrKysrKysrKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyb2Zmc2V0JTIyJTNBKzU1JTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJsZW5ndGglMjIlM0ErNyUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyc3R5bGUlMjIlM0ErJTIySVRBTElDJTIyJTBEJTBBKysrKysrKysrKysrKysrKyU3RCUwRCUwQSsrKysrKysrKysrKyU1RCUyQyUwRCUwQSsrKysrKysrKysrKyUyMmVudGl0eVJhbmdlcyUyMiUzQSslNUIlNUQlMEQlMEErKysrKysrKyU3RCUyQyUwRCUwQSsrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrJTIya2V5JTIyJTNBKyUyMnJvemg5JTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIydHlwZSUyMiUzQSslMjJ1bnN0eWxlZCUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMlRvK2RyaXZlK3RoaXMlMkMrd2UraGF2ZSthc3NlbWJsZWQrYSttdWx0aWRpc2NpcGxpbmFyeSt0ZWFtK29mK3Zpcm9sb2dpc3RzJTJDK21hdGhlbWF0aWNhbCtiaW9sb2dpc3RzJTJDK2NvbXB1dGVyK3NjaWVudGlzdHMlMkMrYW5kK2luZHVzdHJpYWwrcGhhcm1hY29sb2dpc3RzJTJDK3dobytoYXZlK2FsbCtwbGVkZ2VkK3RvK3NoYXJlK2RhdGErYW5kK2V4cGVydGlzZSt0bytwcm9jZWVkK211Y2grZmFzdGVyK2FzK2ErZ3JvdXArdGhhbit3ZStjb3VsZCthbG9uZS4lMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlMEQlMEErKysrKysrKysrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJvZmZzZXQlMjIlM0ErMzUlMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMmxlbmd0aCUyMiUzQSsyMiUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyc3R5bGUlMjIlM0ErJTIyQk9MRCUyMiUwRCUwQSsrKysrKysrKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKysrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJvZmZzZXQlMjIlM0ErMjEyJTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJsZW5ndGglMjIlM0ErMTElMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMnN0eWxlJTIyJTNBKyUyMkJPTEQlMjIlMEQlMEErKysrKysrKysrKysrKysrJTdEJTBEJTBBKysrKysrKysrKysrJTVEJTJDJTBEJTBBKysrKysrKysrKysrJTIyZW50aXR5UmFuZ2VzJTIyJTNBKyU1QiU1RCUwRCUwQSsrKysrKysrJTdEJTJDJTBEJTBBKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKyslMjJrZXklMjIlM0ErJTIyNGN1ZGslMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJ0eXBlJTIyJTNBKyUyMnVuc3R5bGVkJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyZGVwdGglMjIlM0ErMCUyQyUwRCUwQSsrKysrKysrKysrKyUyMnRleHQlMjIlM0ErJTIyV2Urd2lsbCtzaGFyZSt0aGUrZW50aXJlK21vZGVsJTJDK3NjaWVudGlmaWMrZG9jdW1lbnRhdGlvbiUyQythbmQrY29kZSthcytvcGVuK3NvdXJjZSUyQytzbyt0aGF0K3RoZStlbnRpcmUrY29tbXVuaXR5K2NhbitiZW5lZml0K2Zyb20rdGhpcytkaXZlcnNlK2RvbWFpbitleHBlcnRpc2UrYW5kK2ZvY3VzK29uK2NhbGlicmF0aW5nK2FuZCt2YWxpZGF0aW5nK3RoZSttb2RlbCUyQytyYXRoZXIrdGhhbitidWlsZGluZythbmQrYWNjZWxlcmF0aW5nK2l0LitXZSthcmUrc2hhcmluZytvdXIrcHJvZ3Jlc3Mrd2l0aCtvcGVuK3NjaWVuY2UrcHJpbmNpcGxlcyUyQytpbmNsdWRpbmcrZnJlcXVlbnQrc2NpZW50aWZpYytkaXNzZW1pbmF0aW9uK3Rocm91Z2graW50ZXJhY3RpdmUrd2ViK21vZGVscyUyQytvcGVuK2NhbGxzK2Zvcitjb21tdW5pdHkrZmVlZGJhY2slMkMrYW5kK2ZyZXF1ZW50K3JlbGVhc2UrYW5kK3VwZGF0ZStvZitzY2llbnRpZmljK3ByZXByaW50cy4lMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlMEQlMEErKysrKysrKysrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJvZmZzZXQlMjIlM0ErNzAlMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMmxlbmd0aCUyMiUzQSsxMSUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyc3R5bGUlMjIlM0ErJTIyQk9MRCUyMiUwRCUwQSsrKysrKysrKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKysrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJvZmZzZXQlMjIlM0ErMjg1JTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJsZW5ndGglMjIlM0ErMTIlMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMnN0eWxlJTIyJTNBKyUyMkJPTEQlMjIlMEQlMEErKysrKysrKysrKysrKysrJTdEJTJDJTBEJTBBKysrKysrKysrKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyb2Zmc2V0JTIyJTNBKzM2MiUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIybGVuZ3RoJTIyJTNBKzIyJTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJzdHlsZSUyMiUzQSslMjJCT0xEJTIyJTBEJTBBKysrKysrKysrKysrKysrKyU3RCUyQyUwRCUwQSsrKysrKysrKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMm9mZnNldCUyMiUzQSs0NTYlMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMmxlbmd0aCUyMiUzQSsyMSUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyc3R5bGUlMjIlM0ErJTIyQk9MRCUyMiUwRCUwQSsrKysrKysrKysrKysrKyslN0QlMEQlMEErKysrKysrKysrKyslNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjJ4a2NlaSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIydW5zdHlsZWQlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjJBbmQrd2UrYXJlK3VzaW5nK3JhcGlkK3Byb3RvdHlwaW5nJTNBK3dlK2FpbStmb3IrYSs3LTE0K2RheStyZWxlYXNlK2N5Y2xlJTJDK3doZXJlK2VhY2grcmVsZWFzZStpbXByb3ZlZCt1cG9uK3RoZStsYXN0LitFYWNoK3JlbGVhc2UraW5jbHVkZXMrYSt3ZWxsLXRlc3RlZCthbmQrZG9jdW1lbnRlZCtvcGVuK3NvdXJjZStjb2RlK3JlbGVhc2UlMkMrYW4raW50ZXJhY3RpdmUrd2ViLWhvc3RlZCt2ZXJzaW9uK2ZvcithY2NlbGVyYXRlZCtzY2llbnRpZmljK2NvbW11bmljYXRpb24lMkMrcHVibGljK2ZlZWRiYWNrJTJDK2FuZCthbit1cGRhdGVkK3ByZXByaW50LiUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmlubGluZVN0eWxlUmFuZ2VzJTIyJTNBKyU1QiUwRCUwQSsrKysrKysrKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMm9mZnNldCUyMiUzQSsxNyUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIybGVuZ3RoJTIyJTNBKzE3JTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJzdHlsZSUyMiUzQSslMjJCT0xEJTIyJTBEJTBBKysrKysrKysrKysrKysrKyU3RCUyQyUwRCUwQSsrKysrKysrKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMm9mZnNldCUyMiUzQSsxNyUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIybGVuZ3RoJTIyJTNBKzE3JTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJzdHlsZSUyMiUzQSslMjJJVEFMSUMlMjIlMEQlMEErKysrKysrKysrKysrKysrJTdEJTBEJTBBKysrKysrKysrKysrJTVEJTJDJTBEJTBBKysrKysrKysrKysrJTIyZW50aXR5UmFuZ2VzJTIyJTNBKyU1QiU1RCUwRCUwQSsrKysrKysrJTdEJTBEJTBBKysrKyU1RCUyQyUwRCUwQSsrKyslMjJlbnRpdHlNYXAlMjIlM0ErJTdCJTdEJTBEJTBBJTdEJnJvdy0yLWJvZHktMC12YWx1ZS1jYXJkX2JnX2NvbG9yPSZyb3ctMi1ib2R5LTAtdmFsdWUtY2FyZF90ZXh0X2NvbG9yPSZyb3ctMi1ib2R5LTAtdmFsdWUtYnV0dG9ucy1jb3VudD0xJnJvdy0yLWJvZHktMC12YWx1ZS1idXR0b25zLTAtZGVsZXRlZD0mcm93LTItYm9keS0wLXZhbHVlLWJ1dHRvbnMtMC1vcmRlcj0wJnJvdy0yLWJvZHktMC12YWx1ZS1idXR0b25zLTAtdmFsdWUtYnV0dG9uX3RleHQ9VmlldytQcmVwcmludCZyb3ctMi1ib2R5LTAtdmFsdWUtYnV0dG9ucy0wLXZhbHVlLWJ1dHRvbl9saW5rPWh0dHBzJTNBJTJGJTJGZG9pLm9yZyUyRjEwLjExMDElMkYyMDIwLjA0LjAyLjAxOTA3NSZyb3ctMi1ib2R5LTAtdmFsdWUtYnV0dG9ucy0wLXZhbHVlLWJ1dHRvbl9jb2xvcj0mcm93LTItYm9keS0wLXZhbHVlLWJ1dHRvbnMtMC12YWx1ZS1idXR0b25fc2l6ZT0mcm93LTItYm9keS0wLXZhbHVlLWJ1dHRvbnMtMC12YWx1ZS1jdXN0b21fY2xhc3M9YnRuLXN1Y2Nlc3Mmcm93LTItYm9keS0wLXZhbHVlLWN1c3RvbV9jbGFzcz1jb250YWluZXIrY29sLTgrcGwtNStwdC0wK3BiLTUrYm9yZGVybGVzcy1jYXJkJnJvdy0yLWJvZHktMS1kZWxldGVkPSZyb3ctMi1ib2R5LTEtb3JkZXI9MSZyb3ctMi1ib2R5LTEtdHlwZT1ib290c3RyYXBfY2FyZCZyb3ctMi1ib2R5LTEtaWQ9YjBjOTgzNDItZWZjNS00YTIzLWExMzMtNzZiMGQ2NWQ3YWQ1JnJvdy0yLWJvZHktMS12YWx1ZS1jYXJkX3dpZHRoPSZyb3ctMi1ib2R5LTEtdmFsdWUtaXNfY2FyZF9pbWc9b24mcm93LTItYm9keS0xLXZhbHVlLWNhcmRfaW1nPTI5JnJvdy0yLWJvZHktMS12YWx1ZS1jYXJkX2ltZ193aWR0aD00MDAmcm93LTItYm9keS0xLXZhbHVlLWNhcmRfaW1nX2hlaWdodD00MDAmcm93LTItYm9keS0xLXZhbHVlLWNhcmRfdGl0bGU9JnJvdy0yLWJvZHktMS12YWx1ZS1jYXJkX3RleHQ9JTdCJTBEJTBBKysrKyUyMmJsb2NrcyUyMiUzQSslNUIlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjJyeGgwbSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIydW5zdHlsZWQlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjIlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMEQlMEErKysrJTVEJTJDJTBEJTBBKysrKyUyMmVudGl0eU1hcCUyMiUzQSslN0IlN0QlMEQlMEElN0Qmcm93LTItYm9keS0xLXZhbHVlLWNhcmRfYmdfY29sb3I9JnJvdy0yLWJvZHktMS12YWx1ZS1jYXJkX3RleHRfY29sb3I9JnJvdy0yLWJvZHktMS12YWx1ZS1idXR0b25zLWNvdW50PTAmcm93LTItYm9keS0xLXZhbHVlLWN1c3RvbV9jbGFzcz1jb250YWluZXIrY29sLTQrcHItNStwdC0wK3BiLTUrYm9yZGVybGVzcy1jYXJkJnJvdy0yLWlkPSZyb3ctMi1PUkRFUj0zJnJvdy0yLURFTEVURT0mcm93LTMtYm9keS1jb3VudD0yJnJvdy0zLWJvZHktMC1kZWxldGVkPSZyb3ctMy1ib2R5LTAtb3JkZXI9MCZyb3ctMy1ib2R5LTAtdHlwZT1ib290c3RyYXBfY2FyZCZyb3ctMy1ib2R5LTAtaWQ9ZmNmNjFiM2YtZjM5YS00NTkxLWJhNGMtYzEyYmE3NzdkNjI4JnJvdy0zLWJvZHktMC12YWx1ZS1jYXJkX3dpZHRoPSZyb3ctMy1ib2R5LTAtdmFsdWUtaXNfY2FyZF9pbWc9b24mcm93LTMtYm9keS0wLXZhbHVlLWNhcmRfaW1nPTMxJnJvdy0zLWJvZHktMC12YWx1ZS1jYXJkX2ltZ193aWR0aD01MDAmcm93LTMtYm9keS0wLXZhbHVlLWNhcmRfaW1nX2hlaWdodD0zMzAmcm93LTMtYm9keS0wLXZhbHVlLWNhcmRfdGl0bGU9JnJvdy0zLWJvZHktMC12YWx1ZS1jYXJkX3RleHQ9JTdCJTBEJTBBKysrKyUyMmJsb2NrcyUyMiUzQSslNUIlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjIycnZvdSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIydW5zdHlsZWQlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjIlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMEQlMEErKysrJTVEJTJDJTBEJTBBKysrKyUyMmVudGl0eU1hcCUyMiUzQSslN0IlN0QlMEQlMEElN0Qmcm93LTMtYm9keS0wLXZhbHVlLWNhcmRfYmdfY29sb3I9JnJvdy0zLWJvZHktMC12YWx1ZS1jYXJkX3RleHRfY29sb3I9JnJvdy0zLWJvZHktMC12YWx1ZS1idXR0b25zLWNvdW50PTAmcm93LTMtYm9keS0wLXZhbHVlLWN1c3RvbV9jbGFzcz1jb250YWluZXIrY29sLTYrcGwtNStweS01K2JvcmRlcmxlc3MtY2FyZCsrYmctZ3JleSZyb3ctMy1ib2R5LTEtZGVsZXRlZD0mcm93LTMtYm9keS0xLW9yZGVyPTEmcm93LTMtYm9keS0xLXR5cGU9Ym9vdHN0cmFwX2NhcmQmcm93LTMtYm9keS0xLWlkPTY0YzgzYWVhLWM2MDgtNDc5NC1iNWU3LTY2Y2ZkYTNmMGUyOCZyb3ctMy1ib2R5LTEtdmFsdWUtY2FyZF93aWR0aD0mcm93LTMtYm9keS0xLXZhbHVlLWNhcmRfaW1nPSZyb3ctMy1ib2R5LTEtdmFsdWUtY2FyZF9pbWdfd2lkdGg9JnJvdy0zLWJvZHktMS12YWx1ZS1jYXJkX2ltZ19oZWlnaHQ9JnJvdy0zLWJvZHktMS12YWx1ZS1jYXJkX3RpdGxlPSZyb3ctMy1ib2R5LTEtdmFsdWUtY2FyZF90ZXh0PSU3QiUwRCUwQSsrKyslMjJibG9ja3MlMjIlM0ErJTVCJTBEJTBBKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKyslMjJrZXklMjIlM0ErJTIybW5panIlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJ0eXBlJTIyJTNBKyUyMmhlYWRlci10d28lMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjJIb3crY2FuK3lvdStoZWxwJTNGJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyaW5saW5lU3R5bGVSYW5nZXMlMjIlM0ErJTVCJTVEJTJDJTBEJTBBKysrKysrKysrKysrJTIyZW50aXR5UmFuZ2VzJTIyJTNBKyU1QiU1RCUwRCUwQSsrKysrKysrJTdEJTJDJTBEJTBBKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKyslMjJrZXklMjIlM0ErJTIyMmwxZ3MlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJ0eXBlJTIyJTNBKyUyMm9yZGVyZWQtbGlzdC1pdGVtJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyZGVwdGglMjIlM0ErMCUyQyUwRCUwQSsrKysrKysrKysrKyUyMnRleHQlMjIlM0ErJTIyVHJ5K3RoZSttb2RlbCUzQStodHRwcyUzQSUyRiUyRm5hbm9odWIub3JnJTJGdG9vbHMlMkZwYzRjb3ZpZDE5JTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyaW5saW5lU3R5bGVSYW5nZXMlMjIlM0ErJTVCJTBEJTBBKysrKysrKysrKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyb2Zmc2V0JTIyJTNBKzE1JTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJsZW5ndGglMjIlM0ErMzYlMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMnN0eWxlJTIyJTNBKyUyMkJPTEQlMjIlMEQlMEErKysrKysrKysrKysrKysrJTdEJTBEJTBBKysrKysrKysrKysrJTVEJTJDJTBEJTBBKysrKysrKysrKysrJTIyZW50aXR5UmFuZ2VzJTIyJTNBKyU1QiUwRCUwQSsrKysrKysrKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMmtleSUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJvZmZzZXQlMjIlM0ErMTUlMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMmxlbmd0aCUyMiUzQSszNiUwRCUwQSsrKysrKysrKysrKysrKyslN0QlMEQlMEErKysrKysrKysrKyslNUQlMEQlMEErKysrKysrKyU3RCUyQyUwRCUwQSsrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrJTIya2V5JTIyJTNBKyUyMmV3NHliJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIydHlwZSUyMiUzQSslMjJvcmRlcmVkLWxpc3QtaXRlbSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMkdpdmUrZmVlZGJhY2slM0ElMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjJza2RyaSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIydW5vcmRlcmVkLWxpc3QtaXRlbSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzElMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMkdvb2dsZStGb3JtJTNBK2h0dHBzJTNBJTJGJTJGZm9ybXMuZ2xlJTJGU1ZVTVlXaGlwU0hmWDhuUzglMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlMEQlMEErKysrKysrKysrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJvZmZzZXQlMjIlM0ErMTMlMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMmxlbmd0aCUyMiUzQSszNSUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyc3R5bGUlMjIlM0ErJTIyQk9MRCUyMiUwRCUwQSsrKysrKysrKysrKysrKyslN0QlMEQlMEErKysrKysrKysrKyslNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTBEJTBBKysrKysrKysrKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIya2V5JTIyJTNBKzElMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMm9mZnNldCUyMiUzQSsxMyUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIybGVuZ3RoJTIyJTNBKzM1JTBEJTBBKysrKysrKysrKysrKysrKyU3RCUwRCUwQSsrKysrKysrKysrKyU1RCUwRCUwQSsrKysrKysrJTdEJTJDJTBEJTBBKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKyslMjJrZXklMjIlM0ErJTIyanF1cHklMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJ0eXBlJTIyJTNBKyUyMnVub3JkZXJlZC1saXN0LWl0ZW0lMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSsxJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjJwYzRjb3ZpZDE5K3NsYWNrK3dvcmtzcGFjZSUzQSslNUJpbnZpdGUrbGluayU1RCUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmlubGluZVN0eWxlUmFuZ2VzJTIyJTNBKyU1QiUwRCUwQSsrKysrKysrKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMm9mZnNldCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJsZW5ndGglMjIlM0ErMTAlMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMnN0eWxlJTIyJTNBKyUyMkJPTEQlMjIlMEQlMEErKysrKysrKysrKysrKysrJTdEJTJDJTBEJTBBKysrKysrKysrKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyb2Zmc2V0JTIyJTNBKzI5JTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJsZW5ndGglMjIlM0ErMTElMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMnN0eWxlJTIyJTNBKyUyMkJPTEQlMjIlMEQlMEErKysrKysrKysrKysrKysrJTdEJTBEJTBBKysrKysrKysrKysrJTVEJTJDJTBEJTBBKysrKysrKysrKysrJTIyZW50aXR5UmFuZ2VzJTIyJTNBKyU1QiUwRCUwQSsrKysrKysrKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMmtleSUyMiUzQSsyJTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJvZmZzZXQlMjIlM0ErMjklMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMmxlbmd0aCUyMiUzQSsxMSUwRCUwQSsrKysrKysrKysrKysrKyslN0QlMEQlMEErKysrKysrKysrKyslNUQlMEQlMEErKysrKysrKyU3RCUyQyUwRCUwQSsrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrJTIya2V5JTIyJTNBKyUyMmdubTJrJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIydHlwZSUyMiUzQSslMjJvcmRlcmVkLWxpc3QtaXRlbSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMkxldCt1cytrbm93K2lmK3lvdStjYW4rb2ZmZXIrZGF0YStvcitleHBlcnRpc2UuJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyaW5saW5lU3R5bGVSYW5nZXMlMjIlM0ErJTVCJTVEJTJDJTBEJTBBKysrKysrKysrKysrJTIyZW50aXR5UmFuZ2VzJTIyJTNBKyU1QiU1RCUwRCUwQSsrKysrKysrJTdEJTJDJTBEJTBBKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKyslMjJrZXklMjIlM0ErJTIydTA3d20lMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJ0eXBlJTIyJTNBKyUyMm9yZGVyZWQtbGlzdC1pdGVtJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyZGVwdGglMjIlM0ErMCUyQyUwRCUwQSsrKysrKysrKysrKyUyMnRleHQlMjIlM0ErJTIyUmVhZCt0aGUrcHJlcHJpbnQlM0EraHR0cHMlM0ElMkYlMkZkb2kub3JnJTJGMTAuMTEwMSUyRjIwMjAuMDQuMDIuMDE5MDc1JTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyaW5saW5lU3R5bGVSYW5nZXMlMjIlM0ErJTVCJTBEJTBBKysrKysrKysrKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyb2Zmc2V0JTIyJTNBKzklMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMmxlbmd0aCUyMiUzQSs5JTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJzdHlsZSUyMiUzQSslMjJCT0xEJTIyJTBEJTBBKysrKysrKysrKysrKysrKyU3RCUyQyUwRCUwQSsrKysrKysrKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMm9mZnNldCUyMiUzQSsxOSUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIybGVuZ3RoJTIyJTNBKzQxJTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJzdHlsZSUyMiUzQSslMjJCT0xEJTIyJTBEJTBBKysrKysrKysrKysrKysrKyU3RCUwRCUwQSsrKysrKysrKysrKyU1RCUyQyUwRCUwQSsrKysrKysrKysrKyUyMmVudGl0eVJhbmdlcyUyMiUzQSslNUIlMEQlMEErKysrKysrKysrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJrZXklMjIlM0ErMyUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyb2Zmc2V0JTIyJTNBKzE5JTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJsZW5ndGglMjIlM0ErNDElMEQlMEErKysrKysrKysrKysrKysrJTdEJTBEJTBBKysrKysrKysrKysrJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjJtczFrayUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIyb3JkZXJlZC1saXN0LWl0ZW0lMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjJTcHJlYWQrdGhlK3dvcmQlM0Erc2hhcmUrdGhpcytwYWdlK29uK3R3aXR0ZXIlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjJ6MHg3YyUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIyb3JkZXJlZC1saXN0LWl0ZW0lMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjJLZWVwK2FuK2V5ZStvbit0aGlzK3BhZ2UrZm9yK2ltcHJvdmVtZW50cyUyMSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmlubGluZVN0eWxlUmFuZ2VzJTIyJTNBKyU1QiU1RCUyQyUwRCUwQSsrKysrKysrKysrKyUyMmVudGl0eVJhbmdlcyUyMiUzQSslNUIlNUQlMEQlMEErKysrKysrKyU3RCUwRCUwQSsrKyslNUQlMkMlMEQlMEErKysrJTIyZW50aXR5TWFwJTIyJTNBKyU3QiUwRCUwQSsrKysrKysrJTIyMCUyMiUzQSslN0IlMEQlMEErKysrKysrKysrKyslMjJtdXRhYmlsaXR5JTIyJTNBKyUyMk1VVEFCTEUlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJ0eXBlJTIyJTNBKyUyMkxJTkslMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkYXRhJTIyJTNBKyU3QiUwRCUwQSsrKysrKysrKysrKysrKyslMjJ1cmwlMjIlM0ErJTIyaHR0cHMlM0ElMkYlMkZuYW5vaHViLm9yZyUyRnRvb2xzJTJGcGM0Y292aWQxOSUyMiUwRCUwQSsrKysrKysrKysrKyU3RCUwRCUwQSsrKysrKysrJTdEJTJDJTBEJTBBKysrKysrKyslMjIxJTIyJTNBKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMm11dGFiaWxpdHklMjIlM0ErJTIyTVVUQUJMRSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIyTElOSyUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRhdGElMjIlM0ErJTdCJTBEJTBBKysrKysrKysrKysrKysrKyUyMnVybCUyMiUzQSslMjJodHRwcyUzQSUyRiUyRmZvcm1zLmdsZSUyRlNWVU1ZV2hpcFNIZlg4blM4JTIyJTBEJTBBKysrKysrKysrKysrJTdEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyUyMjIlMjIlM0ErJTdCJTBEJTBBKysrKysrKysrKysrJTIybXV0YWJpbGl0eSUyMiUzQSslMjJNVVRBQkxFJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIydHlwZSUyMiUzQSslMjJMSU5LJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyZGF0YSUyMiUzQSslN0IlMEQlMEErKysrKysrKysrKysrKysrJTIydXJsJTIyJTNBKyUyMmh0dHBzJTNBJTJGJTJGam9pbi5zbGFjay5jb20lMkZ0JTJGcGM0Y292aWQxOSUyRnNoYXJlZF9pbnZpdGUlMkZ6dC1kN3hsOTFhZi02NXZLWFVvVUliWlVYcXR+Z3I2V0pBJTIyJTBEJTBBKysrKysrKysrKysrJTdEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyUyMjMlMjIlM0ErJTdCJTBEJTBBKysrKysrKysrKysrJTIybXV0YWJpbGl0eSUyMiUzQSslMjJNVVRBQkxFJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIydHlwZSUyMiUzQSslMjJMSU5LJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyZGF0YSUyMiUzQSslN0IlMEQlMEErKysrKysrKysrKysrKysrJTIydXJsJTIyJTNBKyUyMmh0dHBzJTNBJTJGJTJGZG9pLm9yZyUyRjEwLjExMDElMkYyMDIwLjA0LjAyLjAxOTA3NSUyMiUwRCUwQSsrKysrKysrKysrKyU3RCUwRCUwQSsrKysrKysrJTdEJTBEJTBBKysrKyU3RCUwRCUwQSU3RCZyb3ctMy1ib2R5LTEtdmFsdWUtY2FyZF9iZ19jb2xvcj0mcm93LTMtYm9keS0xLXZhbHVlLWNhcmRfdGV4dF9jb2xvcj0mcm93LTMtYm9keS0xLXZhbHVlLWJ1dHRvbnMtY291bnQ9MCZyb3ctMy1ib2R5LTEtdmFsdWUtY3VzdG9tX2NsYXNzPWNvbnRhaW5lcitjb2wtNitwci01K3B5LTUrYm9yZGVybGVzcy1jYXJkK2JnLWdyZXkrdGhlbWUtaGVhZGVyJnJvdy0zLWlkPSZyb3ctMy1PUkRFUj00JnJvdy0zLURFTEVURT0mcm93LTQtYm9keS1jb3VudD0yJnJvdy00LWJvZHktMC1kZWxldGVkPSZyb3ctNC1ib2R5LTAtb3JkZXI9MCZyb3ctNC1ib2R5LTAtdHlwZT1ib290c3RyYXBfY2FyZCZyb3ctNC1ib2R5LTAtaWQ9NmZmYzhlMzUtOWY3Yy00M2Q2LWE5OGEtMjc4MTdmMWI5MmQwJnJvdy00LWJvZHktMC12YWx1ZS1jYXJkX3dpZHRoPSZyb3ctNC1ib2R5LTAtdmFsdWUtY2FyZF9pbWc9JnJvdy00LWJvZHktMC12YWx1ZS1jYXJkX2ltZ193aWR0aD0mcm93LTQtYm9keS0wLXZhbHVlLWNhcmRfaW1nX2hlaWdodD0mcm93LTQtYm9keS0wLXZhbHVlLWNhcmRfdGl0bGU9TmV3cytTdG9yaWVzJnJvdy00LWJvZHktMC12YWx1ZS1jYXJkX3RleHQ9JTdCJTBEJTBBKysrKyUyMmJsb2NrcyUyMiUzQSslNUIlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjJwdmJzYiUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIyaGVhZGVyLXRocmVlJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyZGVwdGglMjIlM0ErMCUyQyUwRCUwQSsrKysrKysrKysrKyUyMnRleHQlMjIlM0ErJTIyTWFja2xpbitsZWFkaW5nK2ludGVybmF0aW9uYWwrZWZmb3J0K3RvK2J1aWxkK1NBUlMtQ29WLTIrdGlzc3VlK3NpbXVsYXRvciUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmlubGluZVN0eWxlUmFuZ2VzJTIyJTNBKyU1QiUwRCUwQSsrKysrKysrKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMm9mZnNldCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJsZW5ndGglMjIlM0ErNzMlMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMnN0eWxlJTIyJTNBKyUyMkJPTEQlMjIlMEQlMEErKysrKysrKysrKysrKysrJTdEJTBEJTBBKysrKysrKysrKysrJTVEJTJDJTBEJTBBKysrKysrKysrKysrJTIyZW50aXR5UmFuZ2VzJTIyJTNBKyU1QiU1RCUwRCUwQSsrKysrKysrJTdEJTJDJTBEJTBBKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKyslMjJrZXklMjIlM0ErJTIyb2t0a3YlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJ0eXBlJTIyJTNBKyUyMnVuc3R5bGVkJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyZGVwdGglMjIlM0ErMCUyQyUwRCUwQSsrKysrKysrKysrKyUyMnRleHQlMjIlM0ErJTIyUGF1bCtNYWNrbGluJTJDK2FuK2Fzc29jaWF0ZStwcm9mZXNzb3IrYXQrdGhlK0x1ZGR5K1NjaG9vbCtvZitJbmZvcm1hdGljcyUyQytDb21wdXRpbmclMkMrYW5kK0VuZ2luZWVyaW5nJTJDK2lzK2xlYWRpbmcrYW4raW50ZXJuYXRpb25hbCtDT1ZJRC0xOStzaW11bGF0aW9uK2dyb3VwK3RvK3JhcGlkbHkrYnVpbGQrYStTQVJTLUNvVi0yK3Rpc3N1ZStzaW11bGF0b3Ird2l0aCthK2dyb3VwK29mK3Zpcm9sb2dpc3RzJTJDK3BoYXJtYWNvbG9naXN0cyUyQythbmQrbWF0aGVtYXRpY2lhbnMuJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyaW5saW5lU3R5bGVSYW5nZXMlMjIlM0ErJTVCJTVEJTJDJTBEJTBBKysrKysrKysrKysrJTIyZW50aXR5UmFuZ2VzJTIyJTNBKyU1QiU1RCUwRCUwQSsrKysrKysrJTdEJTBEJTBBKysrKyU1RCUyQyUwRCUwQSsrKyslMjJlbnRpdHlNYXAlMjIlM0ErJTdCJTdEJTBEJTBBJTdEJnJvdy00LWJvZHktMC12YWx1ZS1jYXJkX2JnX2NvbG9yPSZyb3ctNC1ib2R5LTAtdmFsdWUtY2FyZF90ZXh0X2NvbG9yPSZyb3ctNC1ib2R5LTAtdmFsdWUtYnV0dG9ucy1jb3VudD0xJnJvdy00LWJvZHktMC12YWx1ZS1idXR0b25zLTAtZGVsZXRlZD0mcm93LTQtYm9keS0wLXZhbHVlLWJ1dHRvbnMtMC1vcmRlcj0wJnJvdy00LWJvZHktMC12YWx1ZS1idXR0b25zLTAtdmFsdWUtYnV0dG9uX3RleHQ9TGVhcm4rTW9yZSZyb3ctNC1ib2R5LTAtdmFsdWUtYnV0dG9ucy0wLXZhbHVlLWJ1dHRvbl9saW5rPWh0dHBzJTNBJTJGJTJGbHVkZHkuaW5kaWFuYS5lZHUlMkZuZXdzJTJGc3RvcnkuaHRtbCUzRnN0b3J5JTNETWFja2xpbi1sZWFkaW5nLWludGVybmF0aW9uYWwtZWZmb3J0LXRvLWJ1aWxkLVNBUlNDb1YyLXRpc3N1ZS1zaW11bGF0b3Imcm93LTQtYm9keS0wLXZhbHVlLWJ1dHRvbnMtMC12YWx1ZS1idXR0b25fY29sb3I9JnJvdy00LWJvZHktMC12YWx1ZS1idXR0b25zLTAtdmFsdWUtYnV0dG9uX3NpemU9JnJvdy00LWJvZHktMC12YWx1ZS1idXR0b25zLTAtdmFsdWUtY3VzdG9tX2NsYXNzPWJ0bi1wcmltYXJ5K2J0bi10aGVtZS1ncmVlbiZyb3ctNC1ib2R5LTAtdmFsdWUtY3VzdG9tX2NsYXNzPWNvbnRhaW5lcitjb2wtNCtwLTUrdGhlbWUtZ3JhZGllbnQmcm93LTQtYm9keS0xLWRlbGV0ZWQ9JnJvdy00LWJvZHktMS1vcmRlcj0xJnJvdy00LWJvZHktMS10eXBlPWJvb3RzdHJhcF9jYXJkJnJvdy00LWJvZHktMS1pZD1lMmU1ZDIzZS05N2U3LTQ5MjktYWMzMy0xMmU5YzgwYmYyMjYmcm93LTQtYm9keS0xLXZhbHVlLWNhcmRfd2lkdGg9JnJvdy00LWJvZHktMS12YWx1ZS1pc19jYXJkX2ltZz1vbiZyb3ctNC1ib2R5LTEtdmFsdWUtaXNfY2FyZF9pbWdfb3ZlcmxheT1vbiZyb3ctNC1ib2R5LTEtdmFsdWUtY2FyZF9pbWc9MjQmcm93LTQtYm9keS0xLXZhbHVlLWNhcmRfaW1nX3dpZHRoPSZyb3ctNC1ib2R5LTEtdmFsdWUtY2FyZF9pbWdfaGVpZ2h0PTQ2MCZyb3ctNC1ib2R5LTEtdmFsdWUtY2FyZF90aXRsZT0mcm93LTQtYm9keS0xLXZhbHVlLWNhcmRfdGV4dD0lN0IlMEQlMEErKysrJTIyYmxvY2tzJTIyJTNBKyU1QiUwRCUwQSsrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrJTIya2V5JTIyJTNBKyUyMnVreHFzJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIydHlwZSUyMiUzQSslMjJ1bnN0eWxlZCUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMiUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmlubGluZVN0eWxlUmFuZ2VzJTIyJTNBKyU1QiU1RCUyQyUwRCUwQSsrKysrKysrKysrKyUyMmVudGl0eVJhbmdlcyUyMiUzQSslNUIlNUQlMEQlMEErKysrKysrKyU3RCUwRCUwQSsrKyslNUQlMkMlMEQlMEErKysrJTIyZW50aXR5TWFwJTIyJTNBKyU3QiU3RCUwRCUwQSU3RCZyb3ctNC1ib2R5LTEtdmFsdWUtY2FyZF9iZ19jb2xvcj0mcm93LTQtYm9keS0xLXZhbHVlLWNhcmRfdGV4dF9jb2xvcj0mcm93LTQtYm9keS0xLXZhbHVlLWJ1dHRvbnMtY291bnQ9MCZyb3ctNC1ib2R5LTEtdmFsdWUtY3VzdG9tX2NsYXNzPWNvbnRhaW5lcitjb2wtOCtib3JkZXJsZXNzLWNhcmQrdGhlbWUtZ3JhZGllbnQrcC0wJnJvdy00LWlkPSZyb3ctNC1PUkRFUj01JnJvdy00LURFTEVURT0mcm93LTUtYm9keS1jb3VudD01JnJvdy01LWJvZHktMC1kZWxldGVkPSZyb3ctNS1ib2R5LTAtb3JkZXI9MCZyb3ctNS1ib2R5LTAtdHlwZT1ib290c3RyYXBfY2FyZCZyb3ctNS1ib2R5LTAtaWQ9ZmUwOGM5OWEtY2JlNi00ZTE5LWIzMzQtMTljZTgxNzQ1NzdkJnJvdy01LWJvZHktMC12YWx1ZS1jYXJkX3dpZHRoPSZyb3ctNS1ib2R5LTAtdmFsdWUtY2FyZF9pbWc9JnJvdy01LWJvZHktMC12YWx1ZS1jYXJkX2ltZ193aWR0aD0mcm93LTUtYm9keS0wLXZhbHVlLWNhcmRfaW1nX2hlaWdodD0mcm93LTUtYm9keS0wLXZhbHVlLWNhcmRfdGl0bGU9JnJvdy01LWJvZHktMC12YWx1ZS1jYXJkX3RleHQ9JTdCJTBEJTBBKysrKyUyMmJsb2NrcyUyMiUzQSslNUIlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjJ0OWcwNiUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIydW5zdHlsZWQlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjIlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjI3bDB4NCUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIyYXRvbWljJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyZGVwdGglMjIlM0ErMCUyQyUwRCUwQSsrKysrKysrKysrKyUyMnRleHQlMjIlM0ErJTIyKyUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmlubGluZVN0eWxlUmFuZ2VzJTIyJTNBKyU1QiU1RCUyQyUwRCUwQSsrKysrKysrKysrKyUyMmVudGl0eVJhbmdlcyUyMiUzQSslNUIlMEQlMEErKysrKysrKysrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJrZXklMjIlM0ErMCUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyb2Zmc2V0JTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMmxlbmd0aCUyMiUzQSsxJTBEJTBBKysrKysrKysrKysrKysrKyU3RCUwRCUwQSsrKysrKysrKysrKyU1RCUwRCUwQSsrKysrKysrJTdEJTJDJTBEJTBBKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKyslMjJrZXklMjIlM0ErJTIyazc0OG4lMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJ0eXBlJTIyJTNBKyUyMmhlYWRlci1mb3VyJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyZGVwdGglMjIlM0ErMCUyQyUwRCUwQSsrKysrKysrKysrKyUyMnRleHQlMjIlM0ErJTIydjErcHJvdG90eXBlJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyaW5saW5lU3R5bGVSYW5nZXMlMjIlM0ErJTVCJTBEJTBBKysrKysrKysrKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyb2Zmc2V0JTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMmxlbmd0aCUyMiUzQSsxMiUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyc3R5bGUlMjIlM0ErJTIyQk9MRCUyMiUwRCUwQSsrKysrKysrKysrKysrKyslN0QlMEQlMEErKysrKysrKysrKyslNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjJ4OTdkOCUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIydW5zdHlsZWQlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjIlMjhNYXJjaCsyNSUyQysyMDIwLUFwcmlsKzElMkMrMjAyMCUyOSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmlubGluZVN0eWxlUmFuZ2VzJTIyJTNBKyU1QiU1RCUyQyUwRCUwQSsrKysrKysrKysrKyUyMmVudGl0eVJhbmdlcyUyMiUzQSslNUIlNUQlMEQlMEErKysrKysrKyU3RCUwRCUwQSsrKyslNUQlMkMlMEQlMEErKysrJTIyZW50aXR5TWFwJTIyJTNBKyU3QiUwRCUwQSsrKysrKysrJTIyMCUyMiUzQSslN0IlMEQlMEErKysrKysrKysrKyslMjJtdXRhYmlsaXR5JTIyJTNBKyUyMklNTVVUQUJMRSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIySU1BR0UlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkYXRhJTIyJTNBKyU3QiUwRCUwQSsrKysrKysrKysrKysrKyslMjJpZCUyMiUzQSslMjIyMyUyMiUyQyUwRCUwQSsrKysrKysrKysrKysrKyslMjJzcmMlMjIlM0ErJTIyJTJGbWVkaWElMkZpbWFnZXMlMkZTQVJTLUNvVi0yLndpZHRoLTgwMC5wbmclMjIlMkMlMEQlMEErKysrKysrKysrKysrKysrJTIyYWx0JTIyJTNBKyUyMnNhcnMlMjIlMkMlMEQlMEErKysrKysrKysrKysrKysrJTIyZm9ybWF0JTIyJTNBKyUyMmZ1bGx3aWR0aCUyMiUwRCUwQSsrKysrKysrKysrKyU3RCUwRCUwQSsrKysrKysrJTdEJTBEJTBBKysrKyU3RCUwRCUwQSU3RCZyb3ctNS1ib2R5LTAtdmFsdWUtY2FyZF9iZ19jb2xvcj0mcm93LTUtYm9keS0wLXZhbHVlLWNhcmRfdGV4dF9jb2xvcj0mcm93LTUtYm9keS0wLXZhbHVlLWJ1dHRvbnMtY291bnQ9MCZyb3ctNS1ib2R5LTAtdmFsdWUtY3VzdG9tX2NsYXNzPWNvbnRhaW5lcitjb2wtMyttbC01K3B4LTArbXItMCt0ZXh0LWNlbnRlcitwYi01K3B0LTUmcm93LTUtYm9keS0xLWRlbGV0ZWQ9JnJvdy01LWJvZHktMS1vcmRlcj0xJnJvdy01LWJvZHktMS10eXBlPWJvb3RzdHJhcF9jYXJkJnJvdy01LWJvZHktMS1pZD1kNWIyNjk3MS01NWUwLTRiYWYtOTEyOC00MDkxOWUxNDlkZmYmcm93LTUtYm9keS0xLXZhbHVlLWNhcmRfd2lkdGg9JnJvdy01LWJvZHktMS12YWx1ZS1jYXJkX2ltZz0mcm93LTUtYm9keS0xLXZhbHVlLWNhcmRfaW1nX3dpZHRoPSZyb3ctNS1ib2R5LTEtdmFsdWUtY2FyZF9pbWdfaGVpZ2h0PSZyb3ctNS1ib2R5LTEtdmFsdWUtY2FyZF90aXRsZT0mcm93LTUtYm9keS0xLXZhbHVlLWNhcmRfdGV4dD0lN0IlMEQlMEErKysrJTIyYmxvY2tzJTIyJTNBKyU1QiUwRCUwQSsrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrJTIya2V5JTIyJTNBKyUyMmRvbTBrJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIydHlwZSUyMiUzQSslMjJoZWFkZXItdGhyZWUlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjJDb3JlK01vZGVsJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyaW5saW5lU3R5bGVSYW5nZXMlMjIlM0ErJTVCJTBEJTBBKysrKysrKysrKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyb2Zmc2V0JTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMmxlbmd0aCUyMiUzQSsxMCUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyc3R5bGUlMjIlM0ErJTIyQk9MRCUyMiUwRCUwQSsrKysrKysrKysrKysrKyslN0QlMEQlMEErKysrKysrKysrKyslNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjJ0OTIyYSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIydW5zdHlsZWQlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjJGaXJzdCtyZWxlYXNlJTNBK01hcmNoKzI2JTJDKzIwMjAlM0IrTGFzdCt1cGRhdGUlM0ErQXByaWwrMSUyQysyMDIwJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyaW5saW5lU3R5bGVSYW5nZXMlMjIlM0ErJTVCJTVEJTJDJTBEJTBBKysrKysrKysrKysrJTIyZW50aXR5UmFuZ2VzJTIyJTNBKyU1QiU1RCUwRCUwQSsrKysrKysrJTdEJTJDJTBEJTBBKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKyslMjJrZXklMjIlM0ErJTIyZ2xwZDElMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJ0eXBlJTIyJTNBKyUyMmhlYWRlci10aHJlZSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMm5hbm9IVUIrYXBwJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyaW5saW5lU3R5bGVSYW5nZXMlMjIlM0ErJTVCJTBEJTBBKysrKysrKysrKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyb2Zmc2V0JTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMmxlbmd0aCUyMiUzQSsxMSUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIyc3R5bGUlMjIlM0ErJTIyQk9MRCUyMiUwRCUwQSsrKysrKysrKysrKysrKyslN0QlMEQlMEErKysrKysrKysrKyslNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjJzMzB4YSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIydW5zdHlsZWQlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjIlMjhGaXJzdCtyZWxlYXNlJTNBK01hcmNoKzI2JTJDKzIwMjAlMjklMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMEQlMEErKysrJTVEJTJDJTBEJTBBKysrKyUyMmVudGl0eU1hcCUyMiUzQSslN0IlN0QlMEQlMEElN0Qmcm93LTUtYm9keS0xLXZhbHVlLWNhcmRfYmdfY29sb3I9JnJvdy01LWJvZHktMS12YWx1ZS1jYXJkX3RleHRfY29sb3I9JnJvdy01LWJvZHktMS12YWx1ZS1idXR0b25zLWNvdW50PTMmcm93LTUtYm9keS0xLXZhbHVlLWJ1dHRvbnMtMC1kZWxldGVkPSZyb3ctNS1ib2R5LTEtdmFsdWUtYnV0dG9ucy0wLW9yZGVyPTAmcm93LTUtYm9keS0xLXZhbHVlLWJ1dHRvbnMtMC12YWx1ZS1idXR0b25fdGV4dD1Db3JlK01vZGVsJnJvdy01LWJvZHktMS12YWx1ZS1idXR0b25zLTAtdmFsdWUtYnV0dG9uX2xpbms9aHR0cHMlM0ElMkYlMkZnaXRodWIuY29tJTJGcGM0Y292aWQxOSUyRkNPVklEMTklMkZ0cmVlJTJGMC4xLjMmcm93LTUtYm9keS0xLXZhbHVlLWJ1dHRvbnMtMC12YWx1ZS1idXR0b25fY29sb3I9JnJvdy01LWJvZHktMS12YWx1ZS1idXR0b25zLTAtdmFsdWUtYnV0dG9uX3NpemU9JnJvdy01LWJvZHktMS12YWx1ZS1idXR0b25zLTAtdmFsdWUtY3VzdG9tX2NsYXNzPWJ0bi1zdWNjZXNzK2J0bi10aGVtZS1ncmVlbiZyb3ctNS1ib2R5LTEtdmFsdWUtYnV0dG9ucy0xLWRlbGV0ZWQ9JnJvdy01LWJvZHktMS12YWx1ZS1idXR0b25zLTEtb3JkZXI9MSZyb3ctNS1ib2R5LTEtdmFsdWUtYnV0dG9ucy0xLXZhbHVlLWJ1dHRvbl90ZXh0PW5hbm8rSHViJnJvdy01LWJvZHktMS12YWx1ZS1idXR0b25zLTEtdmFsdWUtYnV0dG9uX2xpbms9aHR0cCUzQSUyRiUyRmR4LmRvaS5vcmclMkZkb2klM0ExMC4yMTk4MSUyRjE5QkItSE02OSZyb3ctNS1ib2R5LTEtdmFsdWUtYnV0dG9ucy0xLXZhbHVlLWJ1dHRvbl9jb2xvcj0mcm93LTUtYm9keS0xLXZhbHVlLWJ1dHRvbnMtMS12YWx1ZS1idXR0b25fc2l6ZT0mcm93LTUtYm9keS0xLXZhbHVlLWJ1dHRvbnMtMS12YWx1ZS1jdXN0b21fY2xhc3M9YnRuLXN1Y2Nlc3MrYnRuLXRoZW1lLWdyZWVuJnJvdy01LWJvZHktMS12YWx1ZS1idXR0b25zLTItZGVsZXRlZD0mcm93LTUtYm9keS0xLXZhbHVlLWJ1dHRvbnMtMi1vcmRlcj0yJnJvdy01LWJvZHktMS12YWx1ZS1idXR0b25zLTItdmFsdWUtYnV0dG9uX3RleHQ9UHJlcHJpbnQmcm93LTUtYm9keS0xLXZhbHVlLWJ1dHRvbnMtMi12YWx1ZS1idXR0b25fbGluaz1odHRwcyUzQSUyRiUyRnd3dy5iaW9yeGl2Lm9yZyUyRmNvbnRlbnQlMkYxMC4xMTAxJTJGMjAyMC4wNC4wMi4wMTkwNzV2MSZyb3ctNS1ib2R5LTEtdmFsdWUtYnV0dG9ucy0yLXZhbHVlLWJ1dHRvbl9jb2xvcj0mcm93LTUtYm9keS0xLXZhbHVlLWJ1dHRvbnMtMi12YWx1ZS1idXR0b25fc2l6ZT0mcm93LTUtYm9keS0xLXZhbHVlLWJ1dHRvbnMtMi12YWx1ZS1jdXN0b21fY2xhc3M9YnRuLXN1Y2Nlc3MrbXQtMSZyb3ctNS1ib2R5LTEtdmFsdWUtY3VzdG9tX2NsYXNzPWNvbnRhaW5lcitjb2wtMitib3JkZXJsZXNzLWNhcmQrcHQtNStweC0wK214LTMmcm93LTUtYm9keS0yLWRlbGV0ZWQ9JnJvdy01LWJvZHktMi1vcmRlcj0yJnJvdy01LWJvZHktMi10eXBlPWJvb3RzdHJhcF9jYXJkJnJvdy01LWJvZHktMi1pZD0zODhmMjU5My1mM2UwLTRkNDEtODM4MC0yODlhYTRmZjRmYmEmcm93LTUtYm9keS0yLXZhbHVlLWNhcmRfd2lkdGg9JnJvdy01LWJvZHktMi12YWx1ZS1jYXJkX2ltZz0mcm93LTUtYm9keS0yLXZhbHVlLWNhcmRfaW1nX3dpZHRoPSZyb3ctNS1ib2R5LTItdmFsdWUtY2FyZF9pbWdfaGVpZ2h0PSZyb3ctNS1ib2R5LTItdmFsdWUtY2FyZF90aXRsZT0mcm93LTUtYm9keS0yLXZhbHVlLWNhcmRfdGV4dD0lN0IlMEQlMEErKysrJTIyYmxvY2tzJTIyJTNBKyU1QiUwRCUwQSsrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrJTIya2V5JTIyJTNBKyUyMmN3M2g3JTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIydHlwZSUyMiUzQSslMjJoZWFkZXItZm91ciUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMiUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmlubGluZVN0eWxlUmFuZ2VzJTIyJTNBKyU1QiU1RCUyQyUwRCUwQSsrKysrKysrKysrKyUyMmVudGl0eVJhbmdlcyUyMiUzQSslNUIlNUQlMEQlMEErKysrKysrKyU3RCUyQyUwRCUwQSsrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrJTIya2V5JTIyJTNBKyUyMjdrOGpuJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIydHlwZSUyMiUzQSslMjJ1bnN0eWxlZCUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMiUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmlubGluZVN0eWxlUmFuZ2VzJTIyJTNBKyU1QiU1RCUyQyUwRCUwQSsrKysrKysrKysrKyUyMmVudGl0eVJhbmdlcyUyMiUzQSslNUIlNUQlMEQlMEErKysrKysrKyU3RCUyQyUwRCUwQSsrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrJTIya2V5JTIyJTNBKyUyMngxdDA5JTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIydHlwZSUyMiUzQSslMjJhdG9taWMlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjIrJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyaW5saW5lU3R5bGVSYW5nZXMlMjIlM0ErJTVCJTVEJTJDJTBEJTBBKysrKysrKysrKysrJTIyZW50aXR5UmFuZ2VzJTIyJTNBKyU1QiUwRCUwQSsrKysrKysrKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKysrKysrKysrKyUyMmtleSUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJvZmZzZXQlMjIlM0ErMCUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIybGVuZ3RoJTIyJTNBKzElMEQlMEErKysrKysrKysrKysrKysrJTdEJTBEJTBBKysrKysrKysrKysrJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjJtZmF1eCUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIydW5zdHlsZWQlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjIlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjI4dHczaSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIydW5zdHlsZWQlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjIlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjIxNXUwaSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIyaGVhZGVyLWZvdXIlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjJ2Mitwcm90b3R5cGUlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjIwb2w0cSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIydW5zdHlsZWQlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkZXB0aCUyMiUzQSswJTJDJTBEJTBBKysrKysrKysrKysrJTIydGV4dCUyMiUzQSslMjIlMjhBcHJpbCsyJTJDKzIwMjAtcHJlc2VudCUyOSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmlubGluZVN0eWxlUmFuZ2VzJTIyJTNBKyU1QiU1RCUyQyUwRCUwQSsrKysrKysrKysrKyUyMmVudGl0eVJhbmdlcyUyMiUzQSslNUIlNUQlMEQlMEErKysrKysrKyU3RCUwRCUwQSsrKyslNUQlMkMlMEQlMEErKysrJTIyZW50aXR5TWFwJTIyJTNBKyU3QiUwRCUwQSsrKysrKysrJTIyMCUyMiUzQSslN0IlMEQlMEErKysrKysrKysrKyslMjJtdXRhYmlsaXR5JTIyJTNBKyUyMklNTVVUQUJMRSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIySU1BR0UlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJkYXRhJTIyJTNBKyU3QiUwRCUwQSsrKysrKysrKysrKysrKyslMjJpZCUyMiUzQSslMjIzNCUyMiUyQyUwRCUwQSsrKysrKysrKysrKysrKyslMjJzcmMlMjIlM0ErJTIyJTJGbWVkaWElMkZpbWFnZXMlMkZzbmFwc2hvdDAwMDAwMjQwLndpZHRoLTgwMC5qcGclMjIlMkMlMEQlMEErKysrKysrKysrKysrKysrJTIyYWx0JTIyJTNBKyUyMnYyK3BybyUyMiUyQyUwRCUwQSsrKysrKysrKysrKysrKyslMjJmb3JtYXQlMjIlM0ErJTIyZnVsbHdpZHRoJTIyJTBEJTBBKysrKysrKysrKysrJTdEJTBEJTBBKysrKysrKyslN0QlMEQlMEErKysrJTdEJTBEJTBBJTdEJnJvdy01LWJvZHktMi12YWx1ZS1jYXJkX2JnX2NvbG9yPSZyb3ctNS1ib2R5LTItdmFsdWUtY2FyZF90ZXh0X2NvbG9yPSZyb3ctNS1ib2R5LTItdmFsdWUtYnV0dG9ucy1jb3VudD0wJnJvdy01LWJvZHktMi12YWx1ZS1jdXN0b21fY2xhc3M9Y29udGFpbmVyK2NvbC0zK21sLTUrcGwtMCttci0wK3RleHQtY2VudGVyK3BiLTUrcHQtNSZyb3ctNS1ib2R5LTMtZGVsZXRlZD0mcm93LTUtYm9keS0zLW9yZGVyPTMmcm93LTUtYm9keS0zLXR5cGU9Ym9vdHN0cmFwX2NhcmQmcm93LTUtYm9keS0zLWlkPTlmOTg2N2UyLTAzY2YtNGZhZi1iMzdhLTlkMDJlYzg3ZDAxMiZyb3ctNS1ib2R5LTMtdmFsdWUtY2FyZF93aWR0aD0mcm93LTUtYm9keS0zLXZhbHVlLWNhcmRfaW1nPSZyb3ctNS1ib2R5LTMtdmFsdWUtY2FyZF9pbWdfd2lkdGg9JnJvdy01LWJvZHktMy12YWx1ZS1jYXJkX2ltZ19oZWlnaHQ9JnJvdy01LWJvZHktMy12YWx1ZS1jYXJkX3RpdGxlPSZyb3ctNS1ib2R5LTMtdmFsdWUtY2FyZF90ZXh0PSU3QiUwRCUwQSsrKyslMjJibG9ja3MlMjIlM0ErJTVCJTBEJTBBKysrKysrKyslN0IlMEQlMEErKysrKysrKysrKyslMjJrZXklMjIlM0ErJTIyMmV5em4lMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJ0eXBlJTIyJTNBKyUyMmhlYWRlci10aHJlZSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMkNvcmUrTW9kZWwlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlMEQlMEErKysrKysrKysrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJvZmZzZXQlMjIlM0ErMCUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIybGVuZ3RoJTIyJTNBKzEwJTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJzdHlsZSUyMiUzQSslMjJCT0xEJTIyJTBEJTBBKysrKysrKysrKysrKysrKyU3RCUwRCUwQSsrKysrKysrKysrKyU1RCUyQyUwRCUwQSsrKysrKysrKysrKyUyMmVudGl0eVJhbmdlcyUyMiUzQSslNUIlNUQlMEQlMEErKysrKysrKyU3RCUyQyUwRCUwQSsrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrJTIya2V5JTIyJTNBKyUyMjd3NGJvJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIydHlwZSUyMiUzQSslMjJ1bnN0eWxlZCUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMiUyOEZpcnN0K3JlbGVhc2UlM0ErQXByaWwrOSUyQysyMDIwJTNCK0xhc3QrdXBkYXRlJTNBK0FwcmlsKzEwJTJDKzIwMjAlMjklMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlNUQlMkMlMEQlMEErKysrKysrKysrKyslMjJlbnRpdHlSYW5nZXMlMjIlM0ErJTVCJTVEJTBEJTBBKysrKysrKyslN0QlMkMlMEQlMEErKysrKysrKyU3QiUwRCUwQSsrKysrKysrKysrKyUyMmtleSUyMiUzQSslMjJ2eGx4NiUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMnR5cGUlMjIlM0ErJTIyaGVhZGVyLXRocmVlJTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIyZGVwdGglMjIlM0ErMCUyQyUwRCUwQSsrKysrKysrKysrKyUyMnRleHQlMjIlM0ErJTIybmFub0hVQithcHAlMjIlMkMlMEQlMEErKysrKysrKysrKyslMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSslNUIlMEQlMEErKysrKysrKysrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJvZmZzZXQlMjIlM0ErMCUyQyUwRCUwQSsrKysrKysrKysrKysrKysrKysrJTIybGVuZ3RoJTIyJTNBKzExJTJDJTBEJTBBKysrKysrKysrKysrKysrKysrKyslMjJzdHlsZSUyMiUzQSslMjJCT0xEJTIyJTBEJTBBKysrKysrKysrKysrKysrKyU3RCUwRCUwQSsrKysrKysrKysrKyU1RCUyQyUwRCUwQSsrKysrKysrKysrKyUyMmVudGl0eVJhbmdlcyUyMiUzQSslNUIlNUQlMEQlMEErKysrKysrKyU3RCUyQyUwRCUwQSsrKysrKysrJTdCJTBEJTBBKysrKysrKysrKysrJTIya2V5JTIyJTNBKyUyMmVwYzk3JTIyJTJDJTBEJTBBKysrKysrKysrKysrJTIydHlwZSUyMiUzQSslMjJ1bnN0eWxlZCUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmRlcHRoJTIyJTNBKzAlMkMlMEQlMEErKysrKysrKysrKyslMjJ0ZXh0JTIyJTNBKyUyMiUyOEZpcnN0K3JlbGVhc2UlM0ErQXByaWwrMTElMkMrMjAyMCUyOSUyMiUyQyUwRCUwQSsrKysrKysrKysrKyUyMmlubGluZVN0eWxlUmFuZ2VzJTIyJTNBKyU1QiU1RCUyQyUwRCUwQSsrKysrKysrKysrKyUyMmVudGl0eVJhbmdlcyUyMiUzQSslNUIlNUQlMEQlMEErKysrKysrKyU3RCUwRCUwQSsrKyslNUQlMkMlMEQlMEErKysrJTIyZW50aXR5TWFwJTIyJTNBKyU3QiU3RCUwRCUwQSU3RCZyb3ctNS1ib2R5LTMtdmFsdWUtY2FyZF9iZ19jb2xvcj0mcm93LTUtYm9keS0zLXZhbHVlLWNhcmRfdGV4dF9jb2xvcj0mcm93LTUtYm9keS0zLXZhbHVlLWJ1dHRvbnMtY291bnQ9MiZyb3ctNS1ib2R5LTMtdmFsdWUtYnV0dG9ucy0wLWRlbGV0ZWQ9JnJvdy01LWJvZHktMy12YWx1ZS1idXR0b25zLTAtb3JkZXI9MCZyb3ctNS1ib2R5LTMtdmFsdWUtYnV0dG9ucy0wLXZhbHVlLWJ1dHRvbl90ZXh0PUNvcmUrTW9kZWwmcm93LTUtYm9keS0zLXZhbHVlLWJ1dHRvbnMtMC12YWx1ZS1idXR0b25fbGluaz1odHRwcyUzQSUyRiUyRmdpdGh1Yi5jb20lMkZwYzRjb3ZpZDE5JTJGQ09WSUQxOSUyRnJlbGVhc2VzJTJGdGFnJTJGMC4yLjEmcm93LTUtYm9keS0zLXZhbHVlLWJ1dHRvbnMtMC12YWx1ZS1idXR0b25fY29sb3I9JnJvdy01LWJvZHktMy12YWx1ZS1idXR0b25zLTAtdmFsdWUtYnV0dG9uX3NpemU9JnJvdy01LWJvZHktMy12YWx1ZS1idXR0b25zLTAtdmFsdWUtY3VzdG9tX2NsYXNzPWJ0bi1zdWNjZXNzK2J0bi10aGVtZS1ncmVlbiZyb3ctNS1ib2R5LTMtdmFsdWUtYnV0dG9ucy0xLWRlbGV0ZWQ9JnJvdy01LWJvZHktMy12YWx1ZS1idXR0b25zLTEtb3JkZXI9MSZyb3ctNS1ib2R5LTMtdmFsdWUtYnV0dG9ucy0xLXZhbHVlLWJ1dHRvbl90ZXh0PW5hbm8rSHViJnJvdy01LWJvZHktMy12YWx1ZS1idXR0b25zLTEtdmFsdWUtYnV0dG9uX2xpbms9aHR0cCUzQSUyRiUyRmR4LmRvaS5vcmclMkZkb2klM0ExMC4yMTk4MSUyRko2U1AtSjkwOSZyb3ctNS1ib2R5LTMtdmFsdWUtYnV0dG9ucy0xLXZhbHVlLWJ1dHRvbl9jb2xvcj0mcm93LTUtYm9keS0zLXZhbHVlLWJ1dHRvbnMtMS12YWx1ZS1idXR0b25fc2l6ZT0mcm93LTUtYm9keS0zLXZhbHVlLWJ1dHRvbnMtMS12YWx1ZS1jdXN0b21fY2xhc3M9YnRuLXN1Y2Nlc3MrYnRuLXRoZW1lLWdyZWVuJnJvdy01LWJvZHktMy12YWx1ZS1jdXN0b21fY2xhc3M9Y29udGFpbmVyK2NvbC0yK2JvcmRlcmxlc3MtY2FyZCtwdC01K3B4LTArbXgtMyZyb3ctNS1ib2R5LTQtZGVsZXRlZD0xJnJvdy01LWJvZHktNC1vcmRlcj00JnJvdy01LWJvZHktNC10eXBlPXBhcmFncmFwaF9ibG9jayZyb3ctNS1ib2R5LTQtaWQ9JnJvdy01LWJvZHktNC12YWx1ZS1jdXN0b21fY2xhc3M9Y29udGFpbmVyK2NvbC0yK2JvcmRlcmxlc3MtY2FyZCtwdC01K3B4LTArbXgtMyZyb3ctNS1ib2R5LTQtdmFsdWUtYm9keT0lN0IlMjJibG9ja3MlMjIlM0ElNUIlN0IlMjJrZXklMjIlM0ElMjJqeTVxbCUyMiUyQyUyMnRleHQlMjIlM0ElMjJDaXRhdGlvbiUyMiUyQyUyMnR5cGUlMjIlM0ElMjJoZWFkZXItdGhyZWUlMjIlMkMlMjJkZXB0aCUyMiUzQTAlMkMlMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSU1QiU3QiUyMm9mZnNldCUyMiUzQTAlMkMlMjJsZW5ndGglMjIlM0E4JTJDJTIyc3R5bGUlMjIlM0ElMjJCT0xEJTIyJTdEJTVEJTJDJTIyZW50aXR5UmFuZ2VzJTIyJTNBJTVCJTVEJTJDJTIyZGF0YSUyMiUzQSU3QiU3RCU3RCUyQyU3QiUyMmtleSUyMiUzQSUyMjgyZW9mJTIyJTJDJTIydGV4dCUyMiUzQSUyMlBoeXNpQ2VsbCt3YXMrcHVibGlzaGVkK2FmdGVyK2V4dGVuc2l2ZStwZWVyK3JldmlldytpbitQTG9TK0NvbXB1dGF0aW9uYWwrQmlvbG9neS4rUGxlYXNlK2NpdGUlM0ElMjIlMkMlMjJ0eXBlJTIyJTNBJTIydW5zdHlsZWQlMjIlMkMlMjJkZXB0aCUyMiUzQTAlMkMlMjJpbmxpbmVTdHlsZVJhbmdlcyUyMiUzQSU1QiU1RCUyQyUyMmVudGl0eVJhbmdlcyUyMiUzQSU1QiU1RCUyQyUyMmRhdGElMjIlM0ElN0IlN0QlN0QlMkMlN0IlMjJrZXklMjIlM0ElMjI0dmN2aiUyMiUyQyUyMnRleHQlMjIlM0ElMjIlNUIxJTVEK0EuK0doYWZmYXJpemFkZWglMkMrUi4rSGVpbGFuZCUyQytTLkguK0ZyaWVkbWFuJTJDK1MuTS4rTXVtZW50aGFsZXIlMkMrYW5kK1AuK01hY2tsaW4lMkMrUGh5c2lDZWxsJTNBK2FuK29wZW4rc291cmNlK3BoeXNpY3MtYmFzZWQrY2VsbCtzaW11bGF0b3IrZm9yKzMtRCttdWx0aWNlbGx1bGFyK3N5c3RlbXMlMkMrUExvUytDb21wdXQuK0Jpb2wuKzE0JTI4MiUyOSUzQStlMTAwNTk5MSUyQysyMDE4LitET0klM0ElQzIlQTAxMC4xMzcxJTJGam91cm5hbC5wY2JpLjEwMDU5OTEuJTIyJTJDJTIydHlwZSUyMiUzQSUyMnVuc3R5bGVkJTIyJTJDJTIyZGVwdGglMjIlM0EwJTJDJTIyaW5saW5lU3R5bGVSYW5nZXMlMjIlM0ElNUIlNUQlMkMlMjJlbnRpdHlSYW5nZXMlMjIlM0ElNUIlN0IlMjJvZmZzZXQlMjIlM0EyMTYlMkMlMjJsZW5ndGglMjIlM0EyOCUyQyUyMmtleSUyMiUzQTAlN0QlNUQlMkMlMjJkYXRhJTIyJTNBJTdCJTdEJTdEJTVEJTJDJTIyZW50aXR5TWFwJTIyJTNBJTdCJTIyMCUyMiUzQSU3QiUyMnR5cGUlMjIlM0ElMjJMSU5LJTIyJTJDJTIybXV0YWJpbGl0eSUyMiUzQSUyMk1VVEFCTEUlMjIlMkMlMjJkYXRhJTIyJTNBJTdCJTIydXJsJTIyJTNBJTIyaHR0cCUzQSUyRiUyRmR4LmRvaS5vcmclMkYxMC4xMzcxJTJGam91cm5hbC5wY2JpLjEwMDU5OTElMjIlN0QlN0QlN0QlN0Qmcm93LTUtaWQ9JnJvdy01LU9SREVSPTYmcm93LTUtREVMRVRFPSZzaG93X25hdmJhcj15ZXMmc2hvd19uYXZfZXh0cmE9eWVzJnNob3dfZm9vdGVyPXllcyZzaG93X2Fubm91bmNlbWVudHM9bm8mc2x1Zz1ob21lJnNlb190aXRsZT0mc2VhcmNoX2Rlc2NyaXB0aW9uPSZnb19saXZlX2F0PSZleHBpcmVfYXQ9IiwxNTg3OTM0NDEyLjkwNjI5ODldfQ==",
+        "expire_date": "2020-05-10T20:53:32.943Z"
+    }
+},
+{
+    "model": "django_airavata_auth.emailtemplate",
+    "pk": 1,
+    "fields": {
+        "subject": "{{first_name}} {{last_name}} ({{username}}), Please Verify Your Email Account in {{portal_title}}",
+        "body": "<p>\n        Dear {{first_name}} {{last_name}},\n        </p>\n\n        <p>\n        Someone has created an account with this email address. If this was\n        you, click the link below to verify your email address:\n        </p>\n\n        <p><a href=\"{{url}}\">{{url}}</a></p>\n\n        <p>If you didn't create this account, just ignore this message.</p>",
+        "created_date": "2020-04-25T20:21:24.906Z",
+        "updated_date": "2020-04-25T20:21:24.906Z"
+    }
+},
+{
+    "model": "django_airavata_auth.emailtemplate",
+    "pk": 2,
+    "fields": {
+        "subject": "New User Account Was Created Successfully",
+        "body": "<p>Gateway Portal: {{http_host}}</p>\n        <p>Tenant: {{gateway_id}}</p>\n        <p>Username: {{username}}</p>\n        <p>Name: {{first_name}} {{last_name}}</p>\n        <p>Email: {{email}}</p>",
+        "created_date": "2020-04-25T20:21:24.907Z",
+        "updated_date": "2020-04-25T20:21:24.907Z"
+    }
+},
+{
+    "model": "django_airavata_auth.emailtemplate",
+    "pk": 3,
+    "fields": {
+        "subject": "{{first_name}} {{last_name}} ({{username}}), Reset your password in {{portal_title}}",
+        "body": "<p>\n        Dear {{first_name}} {{last_name}},\n        </p>\n\n        <p>\n        Please click the link below to reset your password. This link is\n        valid for 24 hours.\n        </p>\n\n        <p><a href=\"{{url}}\">{{url}}</a></p>\n\n        <p>If you didn't request to reset your password, just ignore this message.</p>",
+        "created_date": "2020-04-25T20:21:24.927Z",
+        "updated_date": "2020-04-25T20:21:24.927Z"
+    }
+},
+{
+    "model": "django_airavata_auth.emailtemplate",
+    "pk": 4,
+    "fields": {
+        "subject": "You've been added to group{{ group_names|length|pluralize }} [{{group_names|join:'] and ['}}] in {{portal_title}}",
+        "body": "<p>\n        Dear {{first_name}} {{last_name}},\n        </p>\n\n        <p>\n        Your user account (username {{username}}) has been added to the\n        group{{ group_names|length|pluralize }} {{group_names|join:' and '}}.\n        {{portal_title}} uses groups to share applications and experiments.\n        </p>\n\n        <p>\n        You may have access to additional applications now that you are a\n        member of {{group_names|join:' and '}}. To check what applications you\n        have access to, please check: <a href=\"{{dashboard_url}}\">{{dashboard_url}}</a>.\n        </p>\n\n        <p>\n        You may also have access to additional experiments. To check what\n        experiments you have access to, please check: <a\n        href=\"{{experiments_url}}\">{{experiments_url}}</a>.\n        </p>\n\n        <p>\n        Please let us know if you have any questions.  Thanks.\n        </p>",
+        "created_date": "2020-04-25T20:21:24.948Z",
+        "updated_date": "2020-04-25T20:21:24.948Z"
+    }
+},
+{
+    "model": "wagtailembeds.embed",
+    "pk": 1,
+    "fields": {
+        "url": "https://www.youtube.com/watch?v=wNr7YqjjzOY&t=1134s",
+        "max_width": null,
+        "type": "video",
+        "html": "<iframe width=\"480\" height=\"270\" src=\"https://www.youtube.com/embed/wNr7YqjjzOY?start=1134&feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen></iframe>",
+        "title": "How to Setup Amazon Web Services EC2 Instance with Apache, PHP, MySQL",
+        "author_name": "MicrowaveSam",
+        "provider_name": "YouTube",
+        "thumbnail_url": "https://i.ytimg.com/vi/wNr7YqjjzOY/hqdefault.jpg",
+        "width": 480,
+        "height": 270,
+        "last_updated": "2018-04-17T23:55:42.199Z"
+    }
+},
+{
+    "model": "wagtailembeds.embed",
+    "pk": 2,
+    "fields": {
+        "url": "https://www.youtube.com/watch?v=rsEne1ZiQrk",
+        "max_width": null,
+        "type": "video",
+        "html": "<iframe width=\"480\" height=\"270\" src=\"https://www.youtube.com/embed/rsEne1ZiQrk?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen></iframe>",
+        "title": "The Weeknd - Call Out My Name (Official Audio)",
+        "author_name": "The Weeknd",
+        "provider_name": "YouTube",
+        "thumbnail_url": "https://i.ytimg.com/vi/rsEne1ZiQrk/hqdefault.jpg",
+        "width": 480,
+        "height": 270,
+        "last_updated": "2018-04-17T23:59:51.125Z"
+    }
+},
+{
+    "model": "wagtailembeds.embed",
+    "pk": 3,
+    "fields": {
+        "url": "https://www.youtube.com/watch?v=BUsL-IxPquA",
+        "max_width": null,
+        "type": "video",
+        "html": "<iframe width=\"480\" height=\"270\" src=\"https://www.youtube.com/embed/BUsL-IxPquA?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen></iframe>",
+        "title": "Dope Tech: Boosted Board 2!",
+        "author_name": "Marques Brownlee",
+        "provider_name": "YouTube",
+        "thumbnail_url": "https://i.ytimg.com/vi/BUsL-IxPquA/hqdefault.jpg",
+        "width": 480,
+        "height": 270,
+        "last_updated": "2018-04-18T18:54:28.709Z"
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 1,
+    "fields": {
+        "collection": 1,
+        "title": "airavata-logo",
+        "file": "original_images/LogoMakr_9NxG5B.png",
+        "width": 600,
+        "height": 193,
+        "created_at": "2018-04-17T22:32:55.900Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 2,
+    "fields": {
+        "collection": 1,
+        "title": "portal-logo",
+        "file": "original_images/portal-logo.png",
+        "width": 445,
+        "height": 600,
+        "created_at": "2018-04-17T22:40:24.541Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 7,
+    "fields": {
+        "collection": 1,
+        "title": "experiment-carousel",
+        "file": "original_images/experiment-carousel.jpg",
+        "width": 3423,
+        "height": 2283,
+        "created_at": "2018-04-17T22:53:22.143Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": 1781,
+        "focal_point_y": 1263,
+        "focal_point_width": 3000,
+        "focal_point_height": 1386,
+        "file_size": 972529
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 8,
+    "fields": {
+        "collection": 1,
+        "title": "group-carousel",
+        "file": "original_images/group-carousel.jpg",
+        "width": 3980,
+        "height": 2622,
+        "created_at": "2018-04-17T22:53:22.287Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": 1951,
+        "focal_point_y": 1686,
+        "focal_point_width": 3333,
+        "focal_point_height": 1457,
+        "file_size": 946507
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 9,
+    "fields": {
+        "collection": 1,
+        "title": "main-carousel",
+        "file": "original_images/main-carousel.jpg",
+        "width": 6111,
+        "height": 4285,
+        "created_at": "2018-04-17T22:53:22.514Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": 2632,
+        "focal_point_y": 3615,
+        "focal_point_width": 873,
+        "focal_point_height": 411,
+        "file_size": 826413
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 10,
+    "fields": {
+        "collection": 1,
+        "title": "project-carousel",
+        "file": "original_images/project-carousel.jpg",
+        "width": 3008,
+        "height": 2000,
+        "created_at": "2018-04-17T22:53:22.630Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": 1477,
+        "focal_point_y": 1179,
+        "focal_point_width": 2552,
+        "focal_point_height": 1315,
+        "file_size": 873842
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 11,
+    "fields": {
+        "collection": 1,
+        "title": "scigap-header",
+        "file": "original_images/scigap-header-logo_CBIsgeZ.png",
+        "width": 300,
+        "height": 100,
+        "created_at": "2018-04-17T23:46:38.125Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 12,
+    "fields": {
+        "collection": 1,
+        "title": "bigred",
+        "file": "original_images/bigred.jpg",
+        "width": 1500,
+        "height": 844,
+        "created_at": "2018-04-18T00:03:41.845Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 13,
+    "fields": {
+        "collection": 1,
+        "title": "fast-logo",
+        "file": "original_images/fast.png",
+        "width": 1000,
+        "height": 726,
+        "created_at": "2018-04-18T18:38:16.346Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 14,
+    "fields": {
+        "collection": 1,
+        "title": "shield-logo",
+        "file": "original_images/shield.png",
+        "width": 1000,
+        "height": 726,
+        "created_at": "2018-04-18T18:38:31.515Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 15,
+    "fields": {
+        "collection": 1,
+        "title": "Distributed-logo",
+        "file": "original_images/distributed.png",
+        "width": 1000,
+        "height": 726,
+        "created_at": "2018-04-18T18:39:39.994Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 16,
+    "fields": {
+        "collection": 1,
+        "title": "Marlon",
+        "file": "original_images/marlon.jpg",
+        "width": 175,
+        "height": 225,
+        "created_at": "2018-04-18T19:41:33.900Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 17,
+    "fields": {
+        "collection": 1,
+        "title": "Suresh",
+        "file": "original_images/suresh.jpg",
+        "width": 520,
+        "height": 523,
+        "created_at": "2018-04-18T19:43:40.935Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 18,
+    "fields": {
+        "collection": 1,
+        "title": "Marcus",
+        "file": "original_images/marcus.jpg",
+        "width": 600,
+        "height": 600,
+        "created_at": "2018-04-18T19:44:27.165Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 19,
+    "fields": {
+        "collection": 1,
+        "title": "iu-logo",
+        "file": "original_images/iu-logo_VwgPZRd.png",
+        "width": 511,
+        "height": 167,
+        "created_at": "2018-04-18T20:35:06.081Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 20,
+    "fields": {
+        "collection": 1,
+        "title": "nsf-logo",
+        "file": "original_images/nsf-logo_H6EHHXw.gif",
+        "width": 166,
+        "height": 167,
+        "created_at": "2018-04-18T20:38:49.087Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 21,
+    "fields": {
+        "collection": 1,
+        "title": "apache-airavata",
+        "file": "original_images/powered-by-airavata-transparent_DPMVKfH.png",
+        "width": 1734,
+        "height": 648,
+        "created_at": "2018-04-18T20:45:50.590Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 22,
+    "fields": {
+        "collection": 1,
+        "title": "xsede-logo",
+        "file": "original_images/xsede-full-color.png",
+        "width": 2575,
+        "height": 975,
+        "created_at": "2018-04-18T20:46:44.994Z",
+        "uploaded_by_user": [
+            "stephenpaul2727"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 23,
+    "fields": {
+        "collection": 1,
+        "title": "sars",
+        "file": "original_images/SARS-CoV-2.png",
+        "width": 300,
+        "height": 300,
+        "created_at": "2020-04-26T18:49:08.426Z",
+        "uploaded_by_user": [
+            "akila"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 24,
+    "fields": {
+        "collection": 1,
+        "title": "bg",
+        "file": "original_images/person-holding-laboratory-flask-2280571_1.jpg",
+        "width": 1280,
+        "height": 854,
+        "created_at": "2020-04-26T19:37:15.402Z",
+        "uploaded_by_user": [
+            "akila"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 25,
+    "fields": {
+        "collection": 1,
+        "title": "v1",
+        "file": "original_images/virus_3.png",
+        "width": 512,
+        "height": 512,
+        "created_at": "2020-04-26T19:57:45.576Z",
+        "uploaded_by_user": [
+            "akila"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 26,
+    "fields": {
+        "collection": 1,
+        "title": "v2",
+        "file": "original_images/virus_2.png",
+        "width": 512,
+        "height": 512,
+        "created_at": "2020-04-26T19:58:16.041Z",
+        "uploaded_by_user": [
+            "akila"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 27,
+    "fields": {
+        "collection": 1,
+        "title": "v3",
+        "file": "original_images/virus_3_8bogaM1.png",
+        "width": 512,
+        "height": 512,
+        "created_at": "2020-04-26T19:58:45.312Z",
+        "uploaded_by_user": [
+            "akila"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 28,
+    "fields": {
+        "collection": 1,
+        "title": "v4",
+        "file": "original_images/virus_1.png",
+        "width": 512,
+        "height": 512,
+        "created_at": "2020-04-26T19:59:01.116Z",
+        "uploaded_by_user": [
+            "akila"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 29,
+    "fields": {
+        "collection": 1,
+        "title": "v4",
+        "file": "original_images/virus.png",
+        "width": 512,
+        "height": 512,
+        "created_at": "2020-04-26T20:01:09.980Z",
+        "uploaded_by_user": [
+            "akila"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 30,
+    "fields": {
+        "collection": 1,
+        "title": "bg2",
+        "file": "original_images/person-holding-laboratory-flask-2280571_1_Zd55mNj.jpg",
+        "width": 1280,
+        "height": 854,
+        "created_at": "2020-04-26T20:04:23.310Z",
+        "uploaded_by_user": [
+            "akila"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 31,
+    "fields": {
+        "collection": 1,
+        "title": "help",
+        "file": "original_images/people-brasil-guys-avpaulista-109919.jpg",
+        "width": 640,
+        "height": 360,
+        "created_at": "2020-04-26T20:06:48.329Z",
+        "uploaded_by_user": [
+            "akila"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 32,
+    "fields": {
+        "collection": 1,
+        "title": "bg-header",
+        "file": "original_images/virus-1812092_1920.jpg",
+        "width": 1920,
+        "height": 960,
+        "created_at": "2020-04-26T20:24:01.806Z",
+        "uploaded_by_user": [
+            "akila"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": 179911
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 33,
+    "fields": {
+        "collection": 1,
+        "title": "bg-header.jpg",
+        "file": "original_images/bg-header.jpg",
+        "width": 1920,
+        "height": 960,
+        "created_at": "2020-04-26T20:25:10.533Z",
+        "uploaded_by_user": [
+            "akila"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": 179911
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 34,
+    "fields": {
+        "collection": 1,
+        "title": "v2 pro",
+        "file": "original_images/snapshot00000240.jpg",
+        "width": 300,
+        "height": 300,
+        "created_at": "2020-04-26T20:31:54.031Z",
+        "uploaded_by_user": [
+            "akila"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.image",
+    "pk": 35,
+    "fields": {
+        "collection": 1,
+        "title": "logo",
+        "file": "original_images/physicell-logo-01.png",
+        "width": 186,
+        "height": 186,
+        "created_at": "2020-04-26T20:35:58.539Z",
+        "uploaded_by_user": [
+            "akila"
+        ],
+        "focal_point_x": null,
+        "focal_point_y": null,
+        "focal_point_width": null,
+        "focal_point_height": null,
+        "file_size": null
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 1,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/LogoMakr_9NxG5B.max-165x165.png",
+        "width": 165,
+        "height": 53,
+        "focal_point_key": "",
+        "image": 1
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 2,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/LogoMakr_9NxG5B.original.png",
+        "width": 600,
+        "height": 193,
+        "focal_point_key": "",
+        "image": 1
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 3,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/portal-logo.max-165x165.png",
+        "width": 122,
+        "height": 165,
+        "focal_point_key": "",
+        "image": 2
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 4,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/portal-logo.original.png",
+        "width": 445,
+        "height": 600,
+        "focal_point_key": "",
+        "image": 2
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 17,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/project-carousel.max-165x165.jpg",
+        "width": 165,
+        "height": 109,
+        "focal_point_key": "",
+        "image": 10
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 18,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/main-carousel.max-165x165.jpg",
+        "width": 165,
+        "height": 115,
+        "focal_point_key": "",
+        "image": 9
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 19,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/group-carousel.max-165x165.jpg",
+        "width": 165,
+        "height": 108,
+        "focal_point_key": "",
+        "image": 8
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 20,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/experiment-carousel.max-165x165.jpg",
+        "width": 165,
+        "height": 110,
+        "focal_point_key": "",
+        "image": 7
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 21,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/main-carousel.original.jpg",
+        "width": 6111,
+        "height": 4285,
+        "focal_point_key": "",
+        "image": 9
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 22,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/project-carousel.original.jpg",
+        "width": 3008,
+        "height": 2000,
+        "focal_point_key": "",
+        "image": 10
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 23,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/experiment-carousel.original.jpg",
+        "width": 3423,
+        "height": 2283,
+        "focal_point_key": "",
+        "image": 7
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 24,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/group-carousel.original.jpg",
+        "width": 3980,
+        "height": 2622,
+        "focal_point_key": "",
+        "image": 8
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 25,
+    "fields": {
+        "filter_spec": "max-800x600",
+        "file": "images/project-carousel.max-800x600.jpg",
+        "width": 800,
+        "height": 531,
+        "focal_point_key": "",
+        "image": 10
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 26,
+    "fields": {
+        "filter_spec": "max-800x600",
+        "file": "images/main-carousel.max-800x600.jpg",
+        "width": 800,
+        "height": 560,
+        "focal_point_key": "",
+        "image": 9
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 27,
+    "fields": {
+        "filter_spec": "max-800x600",
+        "file": "images/group-carousel.max-800x600.jpg",
+        "width": 800,
+        "height": 527,
+        "focal_point_key": "",
+        "image": 8
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 28,
+    "fields": {
+        "filter_spec": "max-800x600",
+        "file": "images/experiment-carousel.max-800x600.jpg",
+        "width": 800,
+        "height": 533,
+        "focal_point_key": "",
+        "image": 7
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 29,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/scigap-header-logo_CBIsgeZ.max-165x165.png",
+        "width": 165,
+        "height": 55,
+        "focal_point_key": "",
+        "image": 11
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 30,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/scigap-header-logo_CBIsgeZ.original.png",
+        "width": 300,
+        "height": 100,
+        "focal_point_key": "",
+        "image": 11
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 31,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/bigred.max-165x165.jpg",
+        "width": 165,
+        "height": 92,
+        "focal_point_key": "",
+        "image": 12
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 32,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/bigred.original.jpg",
+        "width": 1500,
+        "height": 844,
+        "focal_point_key": "",
+        "image": 12
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 33,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/fast.max-165x165.png",
+        "width": 165,
+        "height": 119,
+        "focal_point_key": "",
+        "image": 13
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 34,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/shield.max-165x165.png",
+        "width": 165,
+        "height": 119,
+        "focal_point_key": "",
+        "image": 14
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 35,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/distributed.max-165x165.png",
+        "width": 165,
+        "height": 119,
+        "focal_point_key": "",
+        "image": 15
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 36,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/shield.original.png",
+        "width": 1000,
+        "height": 726,
+        "focal_point_key": "",
+        "image": 14
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 37,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/fast.original.png",
+        "width": 1000,
+        "height": 726,
+        "focal_point_key": "",
+        "image": 13
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 38,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/distributed.original.png",
+        "width": 1000,
+        "height": 726,
+        "focal_point_key": "",
+        "image": 15
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 39,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/marlon.max-165x165.jpg",
+        "width": 128,
+        "height": 165,
+        "focal_point_key": "",
+        "image": 16
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 40,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/suresh.max-165x165.jpg",
+        "width": 164,
+        "height": 165,
+        "focal_point_key": "",
+        "image": 17
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 41,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/marcus.max-165x165.jpg",
+        "width": 165,
+        "height": 165,
+        "focal_point_key": "",
+        "image": 18
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 42,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/marlon.original.jpg",
+        "width": 175,
+        "height": 225,
+        "focal_point_key": "",
+        "image": 16
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 43,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/suresh.original.jpg",
+        "width": 520,
+        "height": 523,
+        "focal_point_key": "",
+        "image": 17
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 44,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/marcus.original.jpg",
+        "width": 600,
+        "height": 600,
+        "focal_point_key": "",
+        "image": 18
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 45,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/iu-logo_VwgPZRd.max-165x165.png",
+        "width": 165,
+        "height": 53,
+        "focal_point_key": "",
+        "image": 19
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 46,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/iu-logo_VwgPZRd.original.png",
+        "width": 511,
+        "height": 167,
+        "focal_point_key": "",
+        "image": 19
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 47,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/nsf-logo_H6EHHXw.max-165x165.png",
+        "width": 164,
+        "height": 165,
+        "focal_point_key": "",
+        "image": 20
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 48,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/nsf-logo_H6EHHXw.original.png",
+        "width": 166,
+        "height": 167,
+        "focal_point_key": "",
+        "image": 20
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 49,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/powered-by-airavata-transparent_DPMVKfH.max-165x165.png",
+        "width": 165,
+        "height": 61,
+        "focal_point_key": "",
+        "image": 21
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 50,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/xsede-full-color.max-165x165.png",
+        "width": 165,
+        "height": 62,
+        "focal_point_key": "",
+        "image": 22
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 51,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/powered-by-airavata-transparent_DPMVKfH.original.png",
+        "width": 1734,
+        "height": 648,
+        "focal_point_key": "",
+        "image": 21
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 52,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/xsede-full-color.original.png",
+        "width": 2575,
+        "height": 975,
+        "focal_point_key": "",
+        "image": 22
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 53,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/SARS-CoV-2.max-165x165.png",
+        "width": 165,
+        "height": 165,
+        "focal_point_key": "",
+        "image": 23
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 54,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/SARS-CoV-2.original.png",
+        "width": 300,
+        "height": 300,
+        "focal_point_key": "",
+        "image": 23
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 55,
+    "fields": {
+        "filter_spec": "max-800x600",
+        "file": "images/SARS-CoV-2.max-800x600.png",
+        "width": 300,
+        "height": 300,
+        "focal_point_key": "",
+        "image": 23
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 56,
+    "fields": {
+        "filter_spec": "width-800",
+        "file": "images/SARS-CoV-2.width-800.png",
+        "width": 300,
+        "height": 300,
+        "focal_point_key": "",
+        "image": 23
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 57,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/person-holding-laboratory-flask-2280571_1.max-165x165.jpg",
+        "width": 165,
+        "height": 110,
+        "focal_point_key": "",
+        "image": 24
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 58,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/person-holding-laboratory-flask-2280571_1.original.jpg",
+        "width": 1280,
+        "height": 854,
+        "focal_point_key": "",
+        "image": 24
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 59,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/virus_3.max-165x165.png",
+        "width": 165,
+        "height": 165,
+        "focal_point_key": "",
+        "image": 25
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 60,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/virus_3.original.png",
+        "width": 512,
+        "height": 512,
+        "focal_point_key": "",
+        "image": 25
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 61,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/virus_2.max-165x165.png",
+        "width": 165,
+        "height": 165,
+        "focal_point_key": "",
+        "image": 26
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 62,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/virus_2.original.png",
+        "width": 512,
+        "height": 512,
+        "focal_point_key": "",
+        "image": 26
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 63,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/virus_3_8bogaM1.max-165x165.png",
+        "width": 165,
+        "height": 165,
+        "focal_point_key": "",
+        "image": 27
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 64,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/virus_1.max-165x165.png",
+        "width": 165,
+        "height": 165,
+        "focal_point_key": "",
+        "image": 28
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 65,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/virus_1.original.png",
+        "width": 512,
+        "height": 512,
+        "focal_point_key": "",
+        "image": 28
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 66,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/virus.max-165x165.png",
+        "width": 165,
+        "height": 165,
+        "focal_point_key": "",
+        "image": 29
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 67,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/virus.original.png",
+        "width": 512,
+        "height": 512,
+        "focal_point_key": "",
+        "image": 29
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 68,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/person-holding-laboratory-flask-2280571_1_Zd.max-165x165.jpg",
+        "width": 165,
+        "height": 110,
+        "focal_point_key": "",
+        "image": 30
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 69,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/people-brasil-guys-avpaulista-109919.max-165x165.jpg",
+        "width": 165,
+        "height": 92,
+        "focal_point_key": "",
+        "image": 31
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 70,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/people-brasil-guys-avpaulista-109919.original.jpg",
+        "width": 640,
+        "height": 360,
+        "focal_point_key": "",
+        "image": 31
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 71,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/virus-1812092_1920.max-165x165.jpg",
+        "width": 165,
+        "height": 82,
+        "focal_point_key": "",
+        "image": 32
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 72,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/virus-1812092_1920.original.jpg",
+        "width": 1920,
+        "height": 960,
+        "focal_point_key": "",
+        "image": 32
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 73,
+    "fields": {
+        "filter_spec": "max-800x600",
+        "file": "images/virus-1812092_1920.max-800x600.jpg",
+        "width": 800,
+        "height": 400,
+        "focal_point_key": "",
+        "image": 32
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 74,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/bg-header.max-165x165.jpg",
+        "width": 165,
+        "height": 82,
+        "focal_point_key": "",
+        "image": 33
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 75,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/bg-header.original.jpg",
+        "width": 1920,
+        "height": 960,
+        "focal_point_key": "",
+        "image": 33
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 76,
+    "fields": {
+        "filter_spec": "max-800x600",
+        "file": "images/bg-header.max-800x600.jpg",
+        "width": 800,
+        "height": 400,
+        "focal_point_key": "",
+        "image": 33
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 77,
+    "fields": {
+        "filter_spec": "max-800x600",
+        "file": "images/snapshot00000240.max-800x600.jpg",
+        "width": 300,
+        "height": 300,
+        "focal_point_key": "",
+        "image": 34
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 78,
+    "fields": {
+        "filter_spec": "width-800",
+        "file": "images/snapshot00000240.width-800.jpg",
+        "width": 300,
+        "height": 300,
+        "focal_point_key": "",
+        "image": 34
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 79,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/snapshot00000240.max-165x165.jpg",
+        "width": 165,
+        "height": 165,
+        "focal_point_key": "",
+        "image": 34
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 80,
+    "fields": {
+        "filter_spec": "max-165x165",
+        "file": "images/physicell-logo-01.max-165x165.png",
+        "width": 165,
+        "height": 165,
+        "focal_point_key": "",
+        "image": 35
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 81,
+    "fields": {
+        "filter_spec": "original",
+        "file": "images/physicell-logo-01.original.png",
+        "width": 186,
+        "height": 186,
+        "focal_point_key": "",
+        "image": 35
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 82,
+    "fields": {
+        "filter_spec": "max-800x600",
+        "file": "images/physicell-logo-01.max-800x600.png",
+        "width": 186,
+        "height": 186,
+        "focal_point_key": "",
+        "image": 35
+    }
+},
+{
+    "model": "wagtailimages.rendition",
+    "pk": 83,
+    "fields": {
+        "filter_spec": "width-800",
+        "file": "images/physicell-logo-01.width-800.png",
+        "width": 186,
+        "height": 186,
+        "focal_point_key": "",
+        "image": 35
+    }
+},
+{
+    "model": "wagtailcore.site",
+    "pk": 2,
+    "fields": {
+        "hostname": "localhost",
+        "port": 8000,
+        "site_name": "Airavata Django Portal",
+        "root_page": 3,
+        "is_default_site": true
+    }
+},
+{
+    "model": "wagtailcore.page",
+    "pk": 1,
+    "fields": {
+        "path": "0001",
+        "depth": 1,
+        "numchild": 1,
+        "title": "Root",
+        "draft_title": "Root",
+        "slug": "root",
+        "content_type": [
+            "wagtailcore",
+            "page"
+        ],
+        "live": true,
+        "has_unpublished_changes": false,
+        "url_path": "/",
+        "owner": null,
+        "seo_title": "",
+        "show_in_menus": false,
+        "search_description": "",
+        "go_live_at": null,
+        "expire_at": null,
+        "expired": false,
+        "locked": false,
+        "first_published_at": null,
+        "last_published_at": null,
+        "latest_revision_created_at": null,
+        "live_revision": null
+    }
+},
+{
+    "model": "wagtailcore.page",
+    "pk": 2,
+    "fields": {
+        "path": "00010001",
+        "depth": 2,
+        "numchild": 1,
+        "title": "Welcome to your new Wagtail site!",
+        "draft_title": "Welcome to your new Wagtail site!",
+        "slug": "home",
+        "content_type": [
+            "wagtailcore",
+            "page"
+        ],
+        "live": true,
+        "has_unpublished_changes": false,
+        "url_path": "/home/",
+        "owner": null,
+        "seo_title": "",
+        "show_in_menus": false,
+        "search_description": "",
+        "go_live_at": null,
+        "expire_at": null,
+        "expired": false,
+        "locked": false,
+        "first_published_at": null,
+        "last_published_at": null,
+        "latest_revision_created_at": null,
+        "live_revision": null
+    }
+},
+{
+    "model": "wagtailcore.page",
+    "pk": 3,
+    "fields": {
+        "path": "000100010001",
+        "depth": 3,
+        "numchild": 1,
+        "title": "Home",
+        "draft_title": "Home",
+        "slug": "home",
+        "content_type": [
+            "django_airavata_wagtail_base",
+            "blankpage"
+        ],
+        "live": true,
+        "has_unpublished_changes": true,
+        "url_path": "/home/home/",
+        "owner": [
+            "stephenpaul2727"
+        ],
+        "seo_title": "",
+        "show_in_menus": false,
+        "search_description": "",
+        "go_live_at": null,
+        "expire_at": null,
+        "expired": false,
+        "locked": false,
+        "first_published_at": "2018-04-17T22:33:31.457Z",
+        "last_published_at": "2018-04-27T17:56:25.465Z",
+        "latest_revision_created_at": "2020-04-26T20:32:11.281Z",
+        "live_revision": 249
+    }
+},
+{
+    "model": "wagtailcore.page",
+    "pk": 6,
+    "fields": {
+        "path": "0001000100010003",
+        "depth": 4,
+        "numchild": 0,
+        "title": "Documentation",
+        "draft_title": "Documentation",
+        "slug": "documentation",
+        "content_type": [
+            "django_airavata_wagtail_base",
+            "blankpage"
+        ],
+        "live": true,
+        "has_unpublished_changes": false,
+        "url_path": "/home/home/documentation/",
+        "owner": [
+            "stephenpaul2727"
+        ],
+        "seo_title": "Documentation",
+        "show_in_menus": true,
+        "search_description": "",
+        "go_live_at": null,
+        "expire_at": null,
+        "expired": false,
+        "locked": false,
+        "first_published_at": "2018-04-18T21:07:30.881Z",
+        "last_published_at": "2018-04-18T21:08:15.126Z",
+        "latest_revision_created_at": "2018-04-18T21:08:15.107Z",
+        "live_revision": 52
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 1,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-17T22:33:31.440Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": null, \"last_published_at\": null, \"latest_revision_created_at\": null, \"live_revision\": null, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12\\\", \\\"body\\\": \\\"<p>ladjfladjslfk</p>\\\"}, \\\"id\\\": \\\"3f203e2a-4f8a-48e1-ac36-79f18954f076\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 2,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-17T22:56:39.085Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-17T22:33:31.457Z\", \"latest_revision_created_at\": \"2018-04-17T22:33:31.440Z\", \"live_revision\": 1, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 3,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-17T23:48:07.466Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-17T22:56:39.109Z\", \"latest_revision_created_at\": \"2018-04-17T22:56:39.085Z\", \"live_revision\": 2, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 30, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 4,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-17T23:48:52.346Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-17T23:48:07.492Z\", \"latest_revision_created_at\": \"2018-04-17T23:48:07.466Z\", \"live_revision\": 3, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 30, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 5,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-17T23:50:34.276Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-17T23:48:52.370Z\", \"latest_revision_created_at\": \"2018-04-17T23:48:52.346Z\", \"live_revision\": 4, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 28, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 6,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-17T23:51:00.290Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-17T23:50:34.312Z\", \"latest_revision_created_at\": \"2018-04-17T23:50:34.276Z\", \"live_revision\": 5, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 30, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 p-3\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 7,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-17T23:51:23.337Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-17T23:51:00.316Z\", \"latest_revision_created_at\": \"2018-04-17T23:51:00.290Z\", \"live_revision\": 6, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 30, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 8,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-17T23:53:58.629Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-17T23:51:23.365Z\", \"latest_revision_created_at\": \"2018-04-17T23:51:23.337Z\", \"live_revision\": 7, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 30, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/embed/SGJFWirQ3ks\\\", \\\"custom_class\\\": \\\"col-md-8\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 9,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-17T23:55:40.364Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-17T23:53:58.661Z\", \"latest_revision_created_at\": \"2018-04-17T23:53:58.629Z\", \"live_revision\": 8, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 30, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=wNr7YqjjzOY&t=1134s\\\", \\\"custom_class\\\": \\\"col-md-8\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 10,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-17T23:59:05.068Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-17T23:55:40.393Z\", \"latest_revision_created_at\": \"2018-04-17T23:55:40.364Z\", \"live_revision\": 9, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 30, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=rsEne1ZiQrk\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 11,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T00:03:57.718Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-17T23:59:05.167Z\", \"latest_revision_created_at\": \"2018-04-17T23:59:05.068Z\", \"live_revision\": 10, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 30, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=rsEne1ZiQrk\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 12,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T00:06:01.406Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T00:03:57.798Z\", \"latest_revision_created_at\": \"2018-04-18T00:03:57.718Z\", \"live_revision\": 11, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 30, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=rsEne1ZiQrk\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"Big Red 2\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 13,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T00:06:29.061Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T00:06:01.483Z\", \"latest_revision_created_at\": \"2018-04-18T00:06:01.406Z\", \"live_revision\": 12, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 30, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=rsEne1ZiQrk\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"Big Red 2\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 14,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T00:09:16.171Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T00:06:29.152Z\", \"latest_revision_created_at\": \"2018-04-18T00:06:29.061Z\", \"live_revision\": 13, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 30, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=rsEne1ZiQrk\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 15,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T16:18:40.783Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T00:09:16.254Z\", \"latest_revision_created_at\": \"2018-04-18T00:09:16.171Z\", \"live_revision\": 14, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=rsEne1ZiQrk\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 16,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T18:40:08.891Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T16:18:40.805Z\", \"latest_revision_created_at\": \"2018-04-18T16:18:40.783Z\", \"live_revision\": 15, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=rsEne1ZiQrk\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 21, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity <br/>of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 21, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 21, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 17,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T18:41:01.644Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T18:40:08.920Z\", \"latest_revision_created_at\": \"2018-04-18T18:40:08.891Z\", \"live_revision\": 16, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=rsEne1ZiQrk\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 21, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 200, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 21, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 21, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 18,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T18:41:56.407Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T18:41:01.678Z\", \"latest_revision_created_at\": \"2018-04-18T18:41:01.644Z\", \"live_revision\": 17, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=rsEne1ZiQrk\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 21, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 21, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 21, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 19,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T18:43:30.495Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T18:41:56.440Z\", \"latest_revision_created_at\": \"2018-04-18T18:41:56.407Z\", \"live_revision\": 18, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=rsEne1ZiQrk\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 21, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 300, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 21, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 300, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 21, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 300, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 20,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T18:44:19.795Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T18:43:30.524Z\", \"latest_revision_created_at\": \"2018-04-18T18:43:30.495Z\", \"live_revision\": 19, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=rsEne1ZiQrk\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 21, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 21, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 21, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 21,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T18:53:14.287Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T18:44:19.824Z\", \"latest_revision_created_at\": \"2018-04-18T18:44:19.795Z\", \"live_revision\": 20, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=rsEne1ZiQrk\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 22,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T18:54:26.869Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T18:53:14.317Z\", \"latest_revision_created_at\": \"2018-04-18T18:53:14.287Z\", \"live_revision\": 21, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 23,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T18:58:06.722Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T18:54:26.900Z\", \"latest_revision_created_at\": \"2018-04-18T18:54:26.869Z\", \"live_revision\": 22, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 24,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:07:23.240Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T18:58:06.748Z\", \"latest_revision_created_at\": \"2018-04-18T18:58:06.722Z\", \"live_revision\": 23, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-10 mx-auto text-center hero-text\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-10 mx-auto hero-text\\\", \\\"body\\\": \\\"<p><b>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</b></p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 25,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:09:56.754Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:07:23.274Z\", \"latest_revision_created_at\": \"2018-04-18T19:07:23.240Z\", \"live_revision\": 24, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-10 mx-auto text-center hero-text pt-5 pb-2\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-10 mx-auto hero-text pt-2 pb-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 26,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:10:35.596Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:09:56.797Z\", \"latest_revision_created_at\": \"2018-04-18T19:09:56.754Z\", \"live_revision\": 25, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-10 mx-auto text-center hero-text pt-5 pb-2\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pt-2 pb-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 27,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:11:13.893Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:10:35.637Z\", \"latest_revision_created_at\": \"2018-04-18T19:10:35.596Z\", \"live_revision\": 26, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text p-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 28,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:12:28.046Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:11:13.929Z\", \"latest_revision_created_at\": \"2018-04-18T19:11:13.893Z\", \"live_revision\": 27, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 29,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:19:49.036Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:12:28.085Z\", \"latest_revision_created_at\": \"2018-04-18T19:12:28.046Z\", \"live_revision\": 28, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Mission\\\", \\\"body\\\": \\\"<p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\", \\\"button_text\\\": \\\"\\\", \\\"button_link\\\": \\\"\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-6\\\"}, \\\"id\\\": \\\"361fcec9-ef49-4dac-ac60-21c17829c1a5\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 30,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:20:42.773Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:19:49.070Z\", \"latest_revision_created_at\": \"2018-04-18T19:19:49.036Z\", \"live_revision\": 29, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Mission\\\", \\\"body\\\": \\\"<p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\", \\\"button_text\\\": \\\"\\\", \\\"button_link\\\": \\\"\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-6 hero-text\\\"}, \\\"id\\\": \\\"361fcec9-ef49-4dac-ac60-21c17829c1a5\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 31,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:21:24.546Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:20:42.807Z\", \"latest_revision_created_at\": \"2018-04-18T19:20:42.773Z\", \"live_revision\": 30, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text pt-5\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Mission\\\", \\\"body\\\": \\\"<p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\", \\\"button_text\\\": \\\"\\\", \\\"button_link\\\": \\\"\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-6 hero-text\\\"}, \\\"id\\\": \\\"361fcec9-ef49-4dac-ac60-21c17829c1a5\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 32,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:25:12.314Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:21:24.582Z\", \"latest_revision_created_at\": \"2018-04-18T19:21:24.546Z\", \"live_revision\": 31, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text pt-5\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Mission\\\", \\\"body\\\": \\\"<p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\", \\\"button_text\\\": \\\"\\\", \\\"button_link\\\": \\\"\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-6 hero-text\\\"}, \\\"id\\\": \\\"361fcec9-ef49-4dac-ac60-21c17829c1a5\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-5\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Values\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.</p>\\\", \\\"button_text\\\": \\\"\\\", \\\"button_link\\\": \\\"\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-6\\\"}, \\\"id\\\": \\\"90fd8c64-d061-4ee1-a12c-0b8825ebb344\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 33,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:25:43.450Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:25:12.353Z\", \"latest_revision_created_at\": \"2018-04-18T19:25:12.314Z\", \"live_revision\": 32, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text pt-5\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Mission\\\", \\\"body\\\": \\\"<p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\", \\\"button_text\\\": \\\"\\\", \\\"button_link\\\": \\\"\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-6 hero-text\\\"}, \\\"id\\\": \\\"361fcec9-ef49-4dac-ac60-21c17829c1a5\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-5 hero-text\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Values\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.</p>\\\", \\\"button_text\\\": \\\"\\\", \\\"button_link\\\": \\\"\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-6 hero-text\\\"}, \\\"id\\\": \\\"90fd8c64-d061-4ee1-a12c-0b8825ebb344\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 34,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:30:07.311Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:25:43.488Z\", \"latest_revision_created_at\": \"2018-04-18T19:25:43.450Z\", \"live_revision\": 33, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text pt-5 text-center\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Mission\\\", \\\"body\\\": \\\"<p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\", \\\"button_text\\\": \\\"\\\", \\\"button_link\\\": \\\"\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-6 hero-text hero-jumbo\\\"}, \\\"id\\\": \\\"361fcec9-ef49-4dac-ac60-21c17829c1a5\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-5 hero-text text-center\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Values\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.</p>\\\", \\\"button_text\\\": \\\"\\\", \\\"button_link\\\": \\\"\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-6 hero-text hero-jumbo\\\"}, \\\"id\\\": \\\"90fd8c64-d061-4ee1-a12c-0b8825ebb344\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 35,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:32:22.422Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:30:07.350Z\", \"latest_revision_created_at\": \"2018-04-18T19:30:07.311Z\", \"live_revision\": 34, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text pt-5 text-center\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Mission\\\", \\\"body\\\": \\\"<p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.<br/><br/><br/><br/></p>\\\", \\\"button_text\\\": \\\"\\\", \\\"button_link\\\": \\\"\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-6 hero-text hero-jumbo\\\"}, \\\"id\\\": \\\"361fcec9-ef49-4dac-ac60-21c17829c1a5\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-5 hero-text text-center\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Values\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.<br/><br/><br/><br/></p>\\\", \\\"button_text\\\": \\\"\\\", \\\"button_link\\\": \\\"\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-6 hero-text hero-jumbo\\\"}, \\\"id\\\": \\\"90fd8c64-d061-4ee1-a12c-0b8825ebb344\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 36,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:35:09.155Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:32:22.458Z\", \"latest_revision_created_at\": \"2018-04-18T19:32:22.422Z\", \"live_revision\": 35, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text pt-5 text-center\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text\\\", \\\"body\\\": \\\"<h2><b>Mission</b></h2><p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\"}, \\\"id\\\": \\\"ae624a31-bcf4-4531-ad7a-41f18d11b326\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-5 hero-text text-center\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text\\\", \\\"body\\\": \\\"<h2><b>Values</b></h2><p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.<br/></p>\\\"}, \\\"id\\\": \\\"c6a179b4-0ab8-4745-b86f-0d84a87da424\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 37,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:36:02.338Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:35:09.196Z\", \"latest_revision_created_at\": \"2018-04-18T19:35:09.155Z\", \"live_revision\": 36, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text p-3 text-center\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text\\\", \\\"body\\\": \\\"<h2><b>Mission</b></h2><p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\"}, \\\"id\\\": \\\"ae624a31-bcf4-4531-ad7a-41f18d11b326\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-3 hero-text text-center\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text\\\", \\\"body\\\": \\\"<h2><b>Values</b></h2><p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.<br/></p>\\\"}, \\\"id\\\": \\\"c6a179b4-0ab8-4745-b86f-0d84a87da424\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 38,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:44:50.955Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:36:02.378Z\", \"latest_revision_created_at\": \"2018-04-18T19:36:02.338Z\", \"live_revision\": 37, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text p-3 text-center\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text\\\", \\\"body\\\": \\\"<h2><b>Mission</b></h2><p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\"}, \\\"id\\\": \\\"ae624a31-bcf4-4531-ad7a-41f18d11b326\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-3 hero-text text-center pb-5\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text pb-5\\\", \\\"body\\\": \\\"<h2><b>Values</b></h2><p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.<br/></p>\\\"}, \\\"id\\\": \\\"c6a179b4-0ab8-4745-b86f-0d84a87da424\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 7, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Contact Us\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 text-center bg-dark\\\"}, \\\"id\\\": \\\"eaed8b62-9bcb-49ae-8a52-ddb9e8742a65\\\"}, {\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 16, \\\"media_img_alt\\\": \\\"marlon\\\", \\\"media_img_width\\\": null, \\\"media_img_height\\\": null, \\\"heading_text\\\": \\\"Marlon Pierce\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-8 mx-auto bg-dark\\\"}, \\\"id\\\": \\\"ed11937b-7340-44bd-a8a7-c53964f1b68a\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 8, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 17, \\\"media_img_alt\\\": \\\"Suresh\\\", \\\"media_img_width\\\": null, \\\"media_img_height\\\": null, \\\"heading_text\\\": \\\"Suresh Marru\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-8 mx-auto bg-dark\\\"}, \\\"id\\\": \\\"779e1820-8721-4ef6-b728-7963fa634a60\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 9, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 18, \\\"media_img_alt\\\": \\\"Marcus\\\", \\\"media_img_width\\\": null, \\\"media_img_height\\\": null, \\\"heading_text\\\": \\\"Marcus Christie\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-8 mx-auto bg-dark\\\"}, \\\"id\\\": \\\"232360b7-e4bd-4f30-86f7-2044e28eb5c9\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 39,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:46:11.545Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:44:51.002Z\", \"latest_revision_created_at\": \"2018-04-18T19:44:50.955Z\", \"live_revision\": 38, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text p-3 text-center\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text\\\", \\\"body\\\": \\\"<h2><b>Mission</b></h2><p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\"}, \\\"id\\\": \\\"ae624a31-bcf4-4531-ad7a-41f18d11b326\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-3 hero-text text-center pb-5\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text pb-5\\\", \\\"body\\\": \\\"<h2><b>Values</b></h2><p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.<br/></p>\\\"}, \\\"id\\\": \\\"c6a179b4-0ab8-4745-b86f-0d84a87da424\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}, {\"pk\": 8, \"sort_order\": 7, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Contact Us\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 text-center bg-dark\\\"}, \\\"id\\\": \\\"eaed8b62-9bcb-49ae-8a52-ddb9e8742a65\\\"}, {\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 16, \\\"media_img_alt\\\": \\\"marlon\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marlon Pierce\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-8 mx-auto bg-dark p-5\\\"}, \\\"id\\\": \\\"ed11937b-7340-44bd-a8a7-c53964f1b68a\\\"}]\", \"page\": 3}, {\"pk\": 9, \"sort_order\": 8, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 17, \\\"media_img_alt\\\": \\\"Suresh\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Suresh Marru\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-8 mx-auto bg-dark p-5\\\"}, \\\"id\\\": \\\"779e1820-8721-4ef6-b728-7963fa634a60\\\"}]\", \"page\": 3}, {\"pk\": 10, \"sort_order\": 9, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 18, \\\"media_img_alt\\\": \\\"Marcus\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marcus Christie\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-8 mx-auto bg-dark p-5\\\"}, \\\"id\\\": \\\"232360b7-e4bd-4f30-86f7-2044e28eb5c9\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 40,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:47:28.772Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:46:11.594Z\", \"latest_revision_created_at\": \"2018-04-18T19:46:11.545Z\", \"live_revision\": 39, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text p-3 text-center\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text\\\", \\\"body\\\": \\\"<h2><b>Mission</b></h2><p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\"}, \\\"id\\\": \\\"ae624a31-bcf4-4531-ad7a-41f18d11b326\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-3 hero-text text-center pb-5\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text pb-5\\\", \\\"body\\\": \\\"<h2><b>Values</b></h2><p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.<br/></p>\\\"}, \\\"id\\\": \\\"c6a179b4-0ab8-4745-b86f-0d84a87da424\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}, {\"pk\": 8, \"sort_order\": 7, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Contact Us\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 text-center bg-dark\\\"}, \\\"id\\\": \\\"eaed8b62-9bcb-49ae-8a52-ddb9e8742a65\\\"}, {\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 16, \\\"media_img_alt\\\": \\\"marlon\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marlon Pierce\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-8 mx-auto card-group p-5\\\"}, \\\"id\\\": \\\"ed11937b-7340-44bd-a8a7-c53964f1b68a\\\"}]\", \"page\": 3}, {\"pk\": 9, \"sort_order\": 8, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 17, \\\"media_img_alt\\\": \\\"Suresh\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Suresh Marru\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-8 mx-auto card-group p-5\\\"}, \\\"id\\\": \\\"779e1820-8721-4ef6-b728-7963fa634a60\\\"}]\", \"page\": 3}, {\"pk\": 10, \"sort_order\": 9, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 18, \\\"media_img_alt\\\": \\\"Marcus\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marcus Christie\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-8 mx-auto card-group p-5\\\"}, \\\"id\\\": \\\"232360b7-e4bd-4f30-86f7-2044e28eb5c9\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 41,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:48:10.541Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:47:28.817Z\", \"latest_revision_created_at\": \"2018-04-18T19:47:28.772Z\", \"live_revision\": 40, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text p-3 text-center\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text\\\", \\\"body\\\": \\\"<h2><b>Mission</b></h2><p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\"}, \\\"id\\\": \\\"ae624a31-bcf4-4531-ad7a-41f18d11b326\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-3 hero-text text-center pb-5\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text pb-5\\\", \\\"body\\\": \\\"<h2><b>Values</b></h2><p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.<br/></p>\\\"}, \\\"id\\\": \\\"c6a179b4-0ab8-4745-b86f-0d84a87da424\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}, {\"pk\": 8, \"sort_order\": 7, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Contact Us\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 text-center bg-dark\\\"}, \\\"id\\\": \\\"eaed8b62-9bcb-49ae-8a52-ddb9e8742a65\\\"}, {\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 16, \\\"media_img_alt\\\": \\\"marlon\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marlon Pierce\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark p-5\\\"}, \\\"id\\\": \\\"ed11937b-7340-44bd-a8a7-c53964f1b68a\\\"}]\", \"page\": 3}, {\"pk\": 9, \"sort_order\": 8, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 17, \\\"media_img_alt\\\": \\\"Suresh\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Suresh Marru\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark p-5\\\"}, \\\"id\\\": \\\"779e1820-8721-4ef6-b728-7963fa634a60\\\"}]\", \"page\": 3}, {\"pk\": 10, \"sort_order\": 9, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 18, \\\"media_img_alt\\\": \\\"Marcus\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marcus Christie\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark p-5\\\"}, \\\"id\\\": \\\"232360b7-e4bd-4f30-86f7-2044e28eb5c9\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 42,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:48:39.585Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:48:10.593Z\", \"latest_revision_created_at\": \"2018-04-18T19:48:10.541Z\", \"live_revision\": 41, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text p-3 text-center\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text\\\", \\\"body\\\": \\\"<h2><b>Mission</b></h2><p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\"}, \\\"id\\\": \\\"ae624a31-bcf4-4531-ad7a-41f18d11b326\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-3 hero-text text-center pb-5\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text pb-5\\\", \\\"body\\\": \\\"<h2><b>Values</b></h2><p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.<br/></p>\\\"}, \\\"id\\\": \\\"c6a179b4-0ab8-4745-b86f-0d84a87da424\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}, {\"pk\": 8, \"sort_order\": 7, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Contact Us\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 text-center bg-dark pt-5\\\"}, \\\"id\\\": \\\"eaed8b62-9bcb-49ae-8a52-ddb9e8742a65\\\"}, {\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 16, \\\"media_img_alt\\\": \\\"marlon\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marlon Pierce\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark p-5\\\"}, \\\"id\\\": \\\"ed11937b-7340-44bd-a8a7-c53964f1b68a\\\"}]\", \"page\": 3}, {\"pk\": 9, \"sort_order\": 8, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 17, \\\"media_img_alt\\\": \\\"Suresh\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Suresh Marru\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark p-5\\\"}, \\\"id\\\": \\\"779e1820-8721-4ef6-b728-7963fa634a60\\\"}]\", \"page\": 3}, {\"pk\": 10, \"sort_order\": 9, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 18, \\\"media_img_alt\\\": \\\"Marcus\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marcus Christie\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark p-5\\\"}, \\\"id\\\": \\\"232360b7-e4bd-4f30-86f7-2044e28eb5c9\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 43,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:49:48.587Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:48:39.634Z\", \"latest_revision_created_at\": \"2018-04-18T19:48:39.585Z\", \"live_revision\": 42, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text p-3 text-center\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text\\\", \\\"body\\\": \\\"<h2><b>Mission</b></h2><p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\"}, \\\"id\\\": \\\"ae624a31-bcf4-4531-ad7a-41f18d11b326\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-3 hero-text text-center pb-5\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text pb-5\\\", \\\"body\\\": \\\"<h2><b>Values</b></h2><p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.<br/></p>\\\"}, \\\"id\\\": \\\"c6a179b4-0ab8-4745-b86f-0d84a87da424\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}, {\"pk\": 8, \"sort_order\": 7, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Contact Us\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 text-center bg-dark pt-5\\\"}, \\\"id\\\": \\\"eaed8b62-9bcb-49ae-8a52-ddb9e8742a65\\\"}, {\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 16, \\\"media_img_alt\\\": \\\"marlon\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marlon Pierce\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark p-5 contact-media\\\"}, \\\"id\\\": \\\"ed11937b-7340-44bd-a8a7-c53964f1b68a\\\"}]\", \"page\": 3}, {\"pk\": 9, \"sort_order\": 8, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 17, \\\"media_img_alt\\\": \\\"Suresh\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Suresh Marru\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark p-5 contact-media\\\"}, \\\"id\\\": \\\"779e1820-8721-4ef6-b728-7963fa634a60\\\"}]\", \"page\": 3}, {\"pk\": 10, \"sort_order\": 9, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 18, \\\"media_img_alt\\\": \\\"Marcus\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marcus Christie\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark p-5 contact-media\\\"}, \\\"id\\\": \\\"232360b7-e4bd-4f30-86f7-2044e28eb5c9\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 44,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T19:52:59.438Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:49:48.629Z\", \"latest_revision_created_at\": \"2018-04-18T19:49:48.587Z\", \"live_revision\": 43, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text p-3 text-center\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text\\\", \\\"body\\\": \\\"<h2><b>Mission</b></h2><p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\"}, \\\"id\\\": \\\"ae624a31-bcf4-4531-ad7a-41f18d11b326\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-3 hero-text text-center pb-5\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text pb-5\\\", \\\"body\\\": \\\"<h2><b>Values</b></h2><p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.<br/></p>\\\"}, \\\"id\\\": \\\"c6a179b4-0ab8-4745-b86f-0d84a87da424\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}, {\"pk\": 8, \"sort_order\": 7, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Contact Us\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 text-center bg-dark pt-5\\\"}, \\\"id\\\": \\\"eaed8b62-9bcb-49ae-8a52-ddb9e8742a65\\\"}, {\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 16, \\\"media_img_alt\\\": \\\"marlon\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marlon Pierce\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation </p>\\\", \\\"custom_class\\\": \\\"col-md-6 mx-auto bg-dark p-5 contact-media\\\"}, \\\"id\\\": \\\"ed11937b-7340-44bd-a8a7-c53964f1b68a\\\"}]\", \"page\": 3}, {\"pk\": 9, \"sort_order\": 8, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 17, \\\"media_img_alt\\\": \\\"Suresh\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Suresh Marru\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation </p>\\\", \\\"custom_class\\\": \\\"col-md-6 mx-auto bg-dark p-5 contact-media\\\"}, \\\"id\\\": \\\"779e1820-8721-4ef6-b728-7963fa634a60\\\"}]\", \"page\": 3}, {\"pk\": 10, \"sort_order\": 9, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 18, \\\"media_img_alt\\\": \\\"Marcus\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marcus Christie\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad</p>\\\", \\\"custom_class\\\": \\\"col-md-6 mx-auto bg-dark p-5 contact-media\\\"}, \\\"id\\\": \\\"232360b7-e4bd-4f30-86f7-2044e28eb5c9\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 45,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T20:10:15.067Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T19:52:59.486Z\", \"latest_revision_created_at\": \"2018-04-18T19:52:59.438Z\", \"live_revision\": 44, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text p-3 text-center\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text\\\", \\\"body\\\": \\\"<h2><b>Mission</b></h2><p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\"}, \\\"id\\\": \\\"ae624a31-bcf4-4531-ad7a-41f18d11b326\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-3 hero-text text-center pb-5\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text pb-5\\\", \\\"body\\\": \\\"<h2><b>Values</b></h2><p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.<br/></p>\\\"}, \\\"id\\\": \\\"c6a179b4-0ab8-4745-b86f-0d84a87da424\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}, {\"pk\": 8, \"sort_order\": 7, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Contact Us\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 text-center bg-dark pt-5\\\"}, \\\"id\\\": \\\"eaed8b62-9bcb-49ae-8a52-ddb9e8742a65\\\"}, {\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 16, \\\"media_img_alt\\\": \\\"marlon\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marlon Pierce\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation</p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark p-5 contact-media\\\"}, \\\"id\\\": \\\"ed11937b-7340-44bd-a8a7-c53964f1b68a\\\"}]\", \"page\": 3}, {\"pk\": 9, \"sort_order\": 8, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 17, \\\"media_img_alt\\\": \\\"Suresh\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Suresh Marru\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation</p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark p-5 contact-media\\\"}, \\\"id\\\": \\\"779e1820-8721-4ef6-b728-7963fa634a60\\\"}]\", \"page\": 3}, {\"pk\": 10, \"sort_order\": 9, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 18, \\\"media_img_alt\\\": \\\"Marcus\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marcus Christie\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad</p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark p-5 contact-media\\\"}, \\\"id\\\": \\\"232360b7-e4bd-4f30-86f7-2044e28eb5c9\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 46,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T20:14:33.872Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T20:10:15.112Z\", \"latest_revision_created_at\": \"2018-04-18T20:10:15.067Z\", \"live_revision\": 45, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text p-3 text-center\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text\\\", \\\"body\\\": \\\"<h2><b>Mission</b></h2><p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\"}, \\\"id\\\": \\\"ae624a31-bcf4-4531-ad7a-41f18d11b326\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-3 hero-text text-center pb-5\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text pb-5\\\", \\\"body\\\": \\\"<h2><b>Values</b></h2><p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.<br/></p>\\\"}, \\\"id\\\": \\\"c6a179b4-0ab8-4745-b86f-0d84a87da424\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}, {\"pk\": 8, \"sort_order\": 7, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Contact Us\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 text-center bg-dark pt-5\\\"}, \\\"id\\\": \\\"eaed8b62-9bcb-49ae-8a52-ddb9e8742a65\\\"}, {\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 16, \\\"media_img_alt\\\": \\\"marlon\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marlon Pierce\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation</p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\\\"}, \\\"id\\\": \\\"ed11937b-7340-44bd-a8a7-c53964f1b68a\\\"}]\", \"page\": 3}, {\"pk\": 9, \"sort_order\": 8, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 17, \\\"media_img_alt\\\": \\\"Suresh\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Suresh Marru\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation</p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\\\"}, \\\"id\\\": \\\"779e1820-8721-4ef6-b728-7963fa634a60\\\"}]\", \"page\": 3}, {\"pk\": 10, \"sort_order\": 9, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 18, \\\"media_img_alt\\\": \\\"Marcus\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marcus Christie\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad</p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\\\"}, \\\"id\\\": \\\"232360b7-e4bd-4f30-86f7-2044e28eb5c9\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 47,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T20:19:47.337Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T20:14:33.921Z\", \"latest_revision_created_at\": \"2018-04-18T20:14:33.872Z\", \"live_revision\": 46, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text p-3 text-center\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text\\\", \\\"body\\\": \\\"<h2><b>Mission</b></h2><p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\"}, \\\"id\\\": \\\"ae624a31-bcf4-4531-ad7a-41f18d11b326\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-3 hero-text text-center pb-5\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text pb-5\\\", \\\"body\\\": \\\"<h2><b>Values</b></h2><p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.<br/></p>\\\"}, \\\"id\\\": \\\"c6a179b4-0ab8-4745-b86f-0d84a87da424\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}, {\"pk\": 8, \"sort_order\": 7, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Contact Us\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 text-center bg-dark pt-5\\\"}, \\\"id\\\": \\\"eaed8b62-9bcb-49ae-8a52-ddb9e8742a65\\\"}, {\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 16, \\\"media_img_alt\\\": \\\"marlon\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marlon Pierce\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation<br/><a href=\\\\\\\"mailto:marpierc@iu.edu\\\\\\\">E-Mail</a>  <a href=\\\\\\\"https://www.google.com\\\\\\\">Website</a></p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\\\"}, \\\"id\\\": \\\"ed11937b-7340-44bd-a8a7-c53964f1b68a\\\"}]\", \"page\": 3}, {\"pk\": 9, \"sort_order\": 8, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 17, \\\"media_img_alt\\\": \\\"Suresh\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Suresh Marru\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation<br/><a href=\\\\\\\"mailto:smarru@iu.edu\\\\\\\">E-Mail</a>  <a href=\\\\\\\"https://www.google.com\\\\\\\">Website</a></p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\\\"}, \\\"id\\\": \\\"779e1820-8721-4ef6-b728-7963fa634a60\\\"}]\", \"page\": 3}, {\"pk\": 10, \"sort_order\": 9, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 18, \\\"media_img_alt\\\": \\\"Marcus\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marcus Christie\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad<br/><a href=\\\\\\\"mailto:machrist@iu.edu\\\\\\\">E-Mail</a>  <a href=\\\\\\\"https://seagrid.org/\\\\\\\">Website</a></p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\\\"}, \\\"id\\\": \\\"232360b7-e4bd-4f30-86f7-2044e28eb5c9\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 48,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T20:20:42.850Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 0, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T20:19:47.417Z\", \"latest_revision_created_at\": \"2018-04-18T20:19:47.337Z\", \"live_revision\": 47, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text p-3 text-center\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text\\\", \\\"body\\\": \\\"<h2><b>Mission</b></h2><p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\"}, \\\"id\\\": \\\"ae624a31-bcf4-4531-ad7a-41f18d11b326\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-3 hero-text text-center pb-5\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text pb-5\\\", \\\"body\\\": \\\"<h2><b>Values</b></h2><p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.<br/></p>\\\"}, \\\"id\\\": \\\"c6a179b4-0ab8-4745-b86f-0d84a87da424\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}, {\"pk\": 8, \"sort_order\": 7, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Contact Us\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 text-center bg-dark pt-5\\\"}, \\\"id\\\": \\\"eaed8b62-9bcb-49ae-8a52-ddb9e8742a65\\\"}, {\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 16, \\\"media_img_alt\\\": \\\"marlon\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marlon Pierce\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation<br/><a href=\\\\\\\"mailto:marpierc@iu.edu\\\\\\\">E-Mail</a>  |  <a href=\\\\\\\"https://www.google.com\\\\\\\">Website</a></p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\\\"}, \\\"id\\\": \\\"ed11937b-7340-44bd-a8a7-c53964f1b68a\\\"}]\", \"page\": 3}, {\"pk\": 9, \"sort_order\": 8, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 17, \\\"media_img_alt\\\": \\\"Suresh\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Suresh Marru\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation<br/><a href=\\\\\\\"mailto:smarru@iu.edu\\\\\\\">E-Mail</a>  |  <a href=\\\\\\\"https://www.google.com\\\\\\\">Website</a></p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\\\"}, \\\"id\\\": \\\"779e1820-8721-4ef6-b728-7963fa634a60\\\"}]\", \"page\": 3}, {\"pk\": 10, \"sort_order\": 9, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 18, \\\"media_img_alt\\\": \\\"Marcus\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marcus Christie\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad<br/><a href=\\\\\\\"mailto:machrist@iu.edu\\\\\\\">E-Mail</a>  |  <a href=\\\\\\\"https://seagrid.org/\\\\\\\">Website</a></p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\\\"}, \\\"id\\\": \\\"232360b7-e4bd-4f30-86f7-2044e28eb5c9\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 51,
+    "fields": {
+        "page": 6,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T21:07:30.860Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 6, \"path\": \"0001000100010003\", \"depth\": 4, \"numchild\": 0, \"title\": \"Documentation\", \"draft_title\": \"Documentation\", \"slug\": \"documentation\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/documentation/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": null, \"last_published_at\": null, \"latest_revision_created_at\": null, \"live_revision\": null, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": []}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 52,
+    "fields": {
+        "page": 6,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-18T21:08:15.107Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 6, \"path\": \"0001000100010003\", \"depth\": 4, \"numchild\": 0, \"title\": \"Documentation\", \"draft_title\": \"Documentation\", \"slug\": \"documentation\", \"content_type\": 27, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/documentation/\", \"owner\": 1, \"seo_title\": \"Documentation\", \"show_in_menus\": true, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-18T21:07:30.881Z\", \"last_published_at\": \"2018-04-18T21:07:30.881Z\", \"latest_revision_created_at\": \"2018-04-18T21:07:30.860Z\", \"live_revision\": 51, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"row\": []}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 248,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-27T17:56:16.364Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 1, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 174, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 5, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T20:20:42.900Z\", \"latest_revision_created_at\": \"2018-04-18T20:20:42.850Z\", \"live_revision\": 48, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"show_announcements\": \"no\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text p-3 text-center\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text\\\", \\\"body\\\": \\\"<h2><b>Mission</b></h2><p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\"}, \\\"id\\\": \\\"ae624a31-bcf4-4531-ad7a-41f18d11b326\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-3 hero-text text-center pb-5\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text pb-5\\\", \\\"body\\\": \\\"<h2><b>Values</b></h2><p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.<br/></p>\\\"}, \\\"id\\\": \\\"c6a179b4-0ab8-4745-b86f-0d84a87da424\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}, {\"pk\": 8, \"sort_order\": 7, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Contact Us\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 text-center bg-dark pt-5\\\"}, \\\"id\\\": \\\"eaed8b62-9bcb-49ae-8a52-ddb9e8742a65\\\"}, {\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 16, \\\"media_img_alt\\\": \\\"marlon\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marlon Pierce\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation<br/><a href=\\\\\\\"mailto:marpierc@iu.edu\\\\\\\">E-Mail</a> | <a href=\\\\\\\"https://www.google.com\\\\\\\">Website</a></p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\\\"}, \\\"id\\\": \\\"ed11937b-7340-44bd-a8a7-c53964f1b68a\\\"}]\", \"page\": 3}, {\"pk\": 9, \"sort_order\": 8, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 17, \\\"media_img_alt\\\": \\\"Suresh\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Suresh Marru\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation<br/><a href=\\\\\\\"mailto:smarru@iu.edu\\\\\\\">E-Mail</a> | <a href=\\\\\\\"https://www.google.com\\\\\\\">Website</a></p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\\\"}, \\\"id\\\": \\\"779e1820-8721-4ef6-b728-7963fa634a60\\\"}]\", \"page\": 3}, {\"pk\": 10, \"sort_order\": 9, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 18, \\\"media_img_alt\\\": \\\"Marcus\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marcus Christie\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad<br/><a href=\\\\\\\"mailto:machrist@iu.edu\\\\\\\">E-Mail</a> | <a href=\\\\\\\"https://seagrid.org/\\\\\\\">Website</a></p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\\\"}, \\\"id\\\": \\\"232360b7-e4bd-4f30-86f7-2044e28eb5c9\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 249,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2018-04-27T17:56:25.414Z",
+        "user": [
+            "stephenpaul2727"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 1, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 174, \"live\": true, \"has_unpublished_changes\": true, \"url_path\": \"/home/home/\", \"owner\": 5, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-18T20:20:42.900Z\", \"latest_revision_created_at\": \"2018-04-27T17:56:16.364Z\", \"live_revision\": 48, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"show_announcements\": \"no\", \"row\": [{\"pk\": 1, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"bootstrap_carousel\\\", \\\"value\\\": {\\\"c_image1\\\": 9, \\\"c_image1_title\\\": \\\"Welcome to Apache Airavata Gateway Portal\\\", \\\"c_image1_body\\\": \\\"Apache Airavata will help you compose, manage and execute complex workflows\\\", \\\"c_image2\\\": 10, \\\"c_image2_title\\\": \\\"Projects\\\", \\\"c_image2_body\\\": \\\"You can create custom projects with custom inputs\\\", \\\"c_image3\\\": 7, \\\"c_image3_title\\\": \\\"Experiments\\\", \\\"c_image3_body\\\": \\\"You can create experiment with certain configuration and manage them at one place.\\\", \\\"c_image4\\\": 8, \\\"c_image4_title\\\": \\\"Groups\\\", \\\"c_image4_body\\\": \\\"You can form groups of people for a project or experiment\\\", \\\"c_image5\\\": null, \\\"c_image5_title\\\": \\\"\\\", \\\"c_image5_body\\\": \\\"\\\", \\\"custom_class\\\": \\\"main-carousel\\\"}, \\\"id\\\": \\\"9668e20c-4fc6-48d7-930f-5db18764aef9\\\"}]\", \"page\": 3}, {\"pk\": 2, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_jumbotron\\\", \\\"value\\\": {\\\"title\\\": \\\"Django Gateway with Airavata\\\", \\\"body\\\": \\\"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\\\", \\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\\\", \\\"button_color\\\": \\\"btn-primary\\\", \\\"button_size\\\": \\\"btn-lg\\\", \\\"custom_class\\\": \\\"col-md-8 p-5\\\"}, \\\"id\\\": \\\"de95c672-6bcc-45fe-87fa-393d1b3b33fa\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"card_img\\\": 11, \\\"card_img_width\\\": 350, \\\"card_img_height\\\": 125, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\\\", \\\"card_bg_color\\\": \\\"bg-light\\\", \\\"card_text_color\\\": \\\"text-dark\\\", \\\"btn_text\\\": \\\"Learn more\\\", \\\"btn_color\\\": \\\"btn-primary\\\", \\\"btn_link\\\": \\\"http://scigap.org/\\\", \\\"custom_class\\\": \\\"col-md-4 scigap-card\\\"}, \\\"id\\\": \\\"b111eef3-22da-41d8-b93a-4d95443ea93f\\\"}]\", \"page\": 3}, {\"pk\": 3, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"embed_block\\\", \\\"value\\\": {\\\"embed\\\": \\\"https://www.youtube.com/watch?v=BUsL-IxPquA\\\", \\\"custom_class\\\": \\\"col-md-8 embedvideo1\\\"}, \\\"id\\\": \\\"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\\\"}, {\\\"type\\\": \\\"image_block\\\", \\\"value\\\": {\\\"image\\\": 12, \\\"caption\\\": \\\"\\\", \\\"width\\\": \\\"100%\\\", \\\"height\\\": null, \\\"redirect_url\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 bigred\\\"}, \\\"id\\\": \\\"79f5b79c-c259-4ac2-b41f-a821796d7cf0\\\"}]\", \"page\": 3}, {\"pk\": 4, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 14, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Shield\\\", \\\"card_text\\\": \\\"<p>Shield from complexity<br/> of resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"22a7cc14-7a02-4320-8d1e-b0cab2861726\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 13, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Fast\\\", \\\"card_text\\\": \\\"<p>Accelerate scientific<br/>discovery</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": 0, \\\"is_card_img\\\": true, \\\"card_img\\\": 15, \\\"card_img_width\\\": 270, \\\"card_img_height\\\": 200, \\\"card_title\\\": \\\"Distributed\\\", \\\"card_text\\\": \\\"<p>Access distributed<br/>data resources</p>\\\", \\\"card_bg_color\\\": \\\"bg-dark\\\", \\\"card_text_color\\\": \\\"text-light\\\", \\\"btn_text\\\": \\\"\\\", \\\"btn_color\\\": \\\"\\\", \\\"btn_link\\\": \\\"\\\", \\\"custom_class\\\": \\\"col-md-4 card-group p-5\\\"}, \\\"id\\\": \\\"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\\\"}]\", \"page\": 3}, {\"pk\": 5, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Science Gateway Research Team\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto text-center hero-text p-5\\\"}, \\\"id\\\": \\\"5cb39cdd-b963-432b-a450-bb7f01392466\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\\\", \\\"body\\\": \\\"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\\\"}, \\\"id\\\": \\\"1327729a-22a5-4af3-906d-774d372a1d4d\\\"}]\", \"page\": 3}, {\"pk\": 6, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"542bdb17-6591-4ad0-90d7-518a460f7c98\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-fighter-jet\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 mx-auto hero-text p-3 text-center\\\"}, \\\"id\\\": \\\"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text\\\", \\\"body\\\": \\\"<h2><b>Mission</b></h2><p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\\\"}, \\\"id\\\": \\\"ae624a31-bcf4-4531-ad7a-41f18d11b326\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text\\\"}, \\\"id\\\": \\\"e166d0cb-d025-4477-957c-dfeaa4747bb3\\\"}]\", \"page\": 3}, {\"pk\": 7, \"sort_order\": 6, \"body\": \"[{\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"55c15d24-e5f2-4c50-a843-2699e3917c4c\\\"}, {\\\"type\\\": \\\"font_awesome_icon_block\\\", \\\"value\\\": {\\\"icon_tag\\\": \\\"fas fa-dollar-sign\\\", \\\"icon_size\\\": 10, \\\"custom_class\\\": \\\"col-md-2 p-3 hero-text text-center pb-5\\\"}, \\\"id\\\": \\\"8ac1c135-ac39-4844-bc6b-76053fdf24f2\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-6 hero-text pb-5\\\", \\\"body\\\": \\\"<h2><b>Values</b></h2><p>The Science Gateways Research Center\\\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.<br/></p>\\\"}, \\\"id\\\": \\\"c6a179b4-0ab8-4745-b86f-0d84a87da424\\\"}, {\\\"type\\\": \\\"placeholder_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"col-md-2 hero-text pb-5\\\"}, \\\"id\\\": \\\"c01362d8-7434-4d88-857c-46c6b937d603\\\"}]\", \"page\": 3}, {\"pk\": 8, \"sort_order\": 7, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"Contact Us\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"col-md-12 text-center bg-dark pt-5\\\"}, \\\"id\\\": \\\"eaed8b62-9bcb-49ae-8a52-ddb9e8742a65\\\"}, {\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 16, \\\"media_img_alt\\\": \\\"marlon\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marlon Pierce\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation<br/><a href=\\\\\\\"mailto:marpierc@iu.edu\\\\\\\">E-Mail</a> | <a href=\\\\\\\"https://www.google.com\\\\\\\">Website</a></p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\\\"}, \\\"id\\\": \\\"ed11937b-7340-44bd-a8a7-c53964f1b68a\\\"}]\", \"page\": 3}, {\"pk\": 9, \"sort_order\": 8, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 17, \\\"media_img_alt\\\": \\\"Suresh\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Suresh Marru\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation<br/><a href=\\\\\\\"mailto:smarru@iu.edu\\\\\\\">E-Mail</a> | <a href=\\\\\\\"https://www.google.com\\\\\\\">Website</a></p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\\\"}, \\\"id\\\": \\\"779e1820-8721-4ef6-b728-7963fa634a60\\\"}]\", \"page\": 3}, {\"pk\": 10, \"sort_order\": 9, \"body\": \"[{\\\"type\\\": \\\"bootstrap_media_object\\\", \\\"value\\\": {\\\"media_img\\\": 18, \\\"media_img_alt\\\": \\\"Marcus\\\", \\\"media_img_width\\\": 100, \\\"media_img_height\\\": 100, \\\"heading_text\\\": \\\"Marcus Christie\\\", \\\"body_text\\\": \\\"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad<br/><a href=\\\\\\\"mailto:machrist@iu.edu\\\\\\\">E-Mail</a> | <a href=\\\\\\\"https://seagrid.org/\\\\\\\">Website</a></p>\\\", \\\"custom_class\\\": \\\"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\\\"}, \\\"id\\\": \\\"232360b7-e4bd-4f30-86f7-2044e28eb5c9\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 250,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2020-04-26T17:55:25.950Z",
+        "user": [
+            "akila"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 1, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 35, \"live\": true, \"has_unpublished_changes\": false, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-27T17:56:25.465Z\", \"latest_revision_created_at\": \"2018-04-27T17:56:25.414Z\", \"live_revision\": 249, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"show_announcements\": \"no\", \"row\": [{\"pk\": null, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"SARS-CoV-2 Tissue Simulation Coalition\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"container col-6 text-center pt-5\\\"}, \\\"id\\\": \\\"755c2621-f4d1-4398-9bf7-3a10dd8c33ec\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h4>We assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues</h4><p>PhysiCell aims to provide a robust, scalable code for simulating large systems of cells in 3-D tissues on standard desktop computers. Among our design goals</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Try the model in a web browser!\\\", \\\"button_link\\\": \\\"https://nanohub.org/tools/pc4covid19\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary\\\"}], \\\"custom_class\\\": \\\"container col-8 pt-0 pb-5 text-center borderless-card\\\"}, \\\"id\\\": \\\"3f6b6bc8-f27a-4dbb-bf3c-2bc8d610d31b\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 251,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2020-04-26T18:24:11.142Z",
+        "user": [
+            "akila"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 1, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 35, \"live\": true, \"has_unpublished_changes\": true, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-27T17:56:25.465Z\", \"latest_revision_created_at\": \"2020-04-26T17:55:25.950Z\", \"live_revision\": 249, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"show_announcements\": \"no\", \"row\": [{\"pk\": null, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"SARS-CoV-2 Tissue Simulation Coalition\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"container col-6 text-center pt-5\\\"}, \\\"id\\\": \\\"755c2621-f4d1-4398-9bf7-3a10dd8c33ec\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h4>We assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues</h4><p>PhysiCell aims to provide a robust, scalable code for simulating large systems of cells in 3-D tissues on standard desktop computers. Among our design goals</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Try the model in a web browser!\\\", \\\"button_link\\\": \\\"https://nanohub.org/tools/pc4covid19\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary\\\"}], \\\"custom_class\\\": \\\"container col-8 pt-0 pb-5 text-center borderless-card\\\"}, \\\"id\\\": \\\"3f6b6bc8-f27a-4dbb-bf3c-2bc8d610d31b\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How does it work</h2><p>In March 2020, we assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues. We aim to understand and test interventions in the coupled dynamics of COVID-19, including:</p><ul><li>Virus spread in tissue</li><li>Virion adhesion to ACE2 receptors on cells</li><li>Endocytosis (active transport into the cell)</li><li>Viral uncoating, replication, and assembly into new virions</li><li>Viral exocytosis (release of completed virions)</li><li>Single-cell responses to infection, including disrupted metabolism, secretion of interferons, and cell death</li><li>Inflammatory responses</li><li>Immune activation and expansion in lymph nodes</li><li>Immune cell infiltration and predation in infected tissue</li><li>Tissue damage, including edema that can lead to acute respiratory distress syndrome (ARDS)</li></ul>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 px-0 borderless-card\\\"}, \\\"id\\\": \\\"ed2a6d41-9a35-466b-9fb8-a7cd3a4299fb\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 300, \\\"card_img_height\\\": 300, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 px-0 borderless-card\\\"}, \\\"id\\\": \\\"25ee4aaf-9c8d-413b-b142-fee5c52a7fa7\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>By rapidly creating a multiscale framework, we can ask\\\\u00a0<i>what if\\\\u00a0</i>questions that identify vulnerabilities in viral replication and the spread of the infection, and seek approaches to control the immune response to avoid adverse reactions.</p><p>To drive this, we have assembled a <b>multidisciplinary team</b> of virologists, mathematical biologists, computer scientists, and industrial pharmacologists, who have all pledged to share data and expertise to proceed\\\\u00a0<b>much faster\\\\u00a0</b>as a group than we could alone.</p><p>We will share the entire model, scientific documentation, and code as\\\\u00a0<b>open source</b>, so that the entire community can benefit from this diverse domain expertise and focus on calibrating and validating the model, rather than building and accelerating it. We are sharing our progress with\\\\u00a0<b>open science\\\\u00a0</b>principles, including frequent scientific dissemination through <b>interactive web models</b>, open calls for community feedback, and frequent release and update of\\\\u00a0<b>scientific preprints.\\\\u00a0</b></p><p>And we are using <b><i>rapid prototyping</i></b>: we aim for a 7-14 day release cycle, where each release improved upon the last. Each release includes a well-tested and documented open source code release, an interactive web-hosted version for accelerated scientific communication, public feedback, and an updated preprint.</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"View Preprint\\\", \\\"button_link\\\": \\\"https://doi.org/10.1101/2020.04.02.019075\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary\\\"}], \\\"custom_class\\\": \\\"container col-8 pl-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"bf65a64d-d7e3-4a68-be5f-624a96edf61f\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 400, \\\"card_img_height\\\": 400, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-4 pr-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"b0c98342-efc5-4a23-a133-76b0d65d7ad5\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 250, \\\"card_img_height\\\": 250, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 pt-0 pb-5 borderless-card  bg-grey\\\"}, \\\"id\\\": \\\"fcf61b3f-f39a-4591-ba4c-c12ba777d628\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How can you help?</h2><ol><li>Try the model: <a href=\\\\\\\"https://nanohub.org/tools/pc4covid19\\\\\\\"><b>https://nanohub.org/tools/pc4covid19</b></a> </li><li>Give feedback:<ul><li>Google Form:\\\\u00a0<a href=\\\\\\\"https://forms.gle/SVUMYWhipSHfX8nS8\\\\\\\"><b>https://forms.gle/SVUMYWhipSHfX8nS8</b></a></li><li><b>pc4covid19\\\\u00a0</b>slack workspace: [<a href=\\\\\\\"https://join.slack.com/t/pc4covid19/shared_invite/zt-d7xl91af-65vKXUoUIbZUXqt~gr6WJA\\\\\\\"><b>invite link</b></a>]</li></ul></li></ol><ol><li>Let us know if you can offer data or expertise.</li><li>Read the\\\\u00a0<b>preprint:\\\\u00a0</b><a href=\\\\\\\"https://doi.org/10.1101/2020.04.02.019075\\\\\\\"><b>https://doi.org/10.1101/2020.04.02.019075</b></a></li><li>Spread the word: share this page on twitter</li><li>Keep an eye on this page for improvements!</li></ol>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 pt-0 pb-5 borderless-card bg-grey\\\"}, \\\"id\\\": \\\"64c83aea-c608-4794-b5e7-66cfda3f0e28\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 252,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2020-04-26T18:25:11.393Z",
+        "user": [
+            "akila"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 1, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 35, \"live\": true, \"has_unpublished_changes\": true, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-27T17:56:25.465Z\", \"latest_revision_created_at\": \"2020-04-26T18:24:11.142Z\", \"live_revision\": 249, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"show_announcements\": \"no\", \"row\": [{\"pk\": null, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"SARS-CoV-2 Tissue Simulation Coalition\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"container col-6 text-center pt-5\\\"}, \\\"id\\\": \\\"755c2621-f4d1-4398-9bf7-3a10dd8c33ec\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h4>We assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues</h4><p>PhysiCell aims to provide a robust, scalable code for simulating large systems of cells in 3-D tissues on standard desktop computers. Among our design goals</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Try the model in a web browser!\\\", \\\"button_link\\\": \\\"https://nanohub.org/tools/pc4covid19\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary\\\"}], \\\"custom_class\\\": \\\"container col-8 pt-0 pb-5 text-center borderless-card\\\"}, \\\"id\\\": \\\"3f6b6bc8-f27a-4dbb-bf3c-2bc8d610d31b\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How does it work</h2><p>In March 2020, we assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues. We aim to understand and test interventions in the coupled dynamics of COVID-19, including:</p><ul><li>Virus spread in tissue</li><li>Virion adhesion to ACE2 receptors on cells</li><li>Endocytosis (active transport into the cell)</li><li>Viral uncoating, replication, and assembly into new virions</li><li>Viral exocytosis (release of completed virions)</li><li>Single-cell responses to infection, including disrupted metabolism, secretion of interferons, and cell death</li><li>Inflammatory responses</li><li>Immune activation and expansion in lymph nodes</li><li>Immune cell infiltration and predation in infected tissue</li><li>Tissue damage, including edema that can lead to acute respiratory distress syndrome (ARDS)</li></ul>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 px-0 borderless-card\\\"}, \\\"id\\\": \\\"ed2a6d41-9a35-466b-9fb8-a7cd3a4299fb\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 300, \\\"card_img_height\\\": 300, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 px-0 borderless-card\\\"}, \\\"id\\\": \\\"25ee4aaf-9c8d-413b-b142-fee5c52a7fa7\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>By rapidly creating a multiscale framework, we can ask <i>what if</i> questions that identify vulnerabilities in viral replication and the spread of the infection, and seek approaches to control the immune response to avoid adverse reactions.</p><p>To drive this, we have assembled a <b>multidisciplinary team</b> of virologists, mathematical biologists, computer scientists, and industrial pharmacologists, who have all pledged to share data and expertise to proceed <b>much faster</b> as a group than we could alone.</p><p>We will share the entire model, scientific documentation, and code as <b>open source</b>, so that the entire community can benefit from this diverse domain expertise and focus on calibrating and validating the model, rather than building and accelerating it. We are sharing our progress with <b>open science</b> principles, including frequent scientific dissemination through <b>interactive web models</b>, open calls for community feedback, and frequent release and update of <b>scientific preprints.</b></p><p>And we are using <b><i>rapid prototyping</i></b>: we aim for a 7-14 day release cycle, where each release improved upon the last. Each release includes a well-tested and documented open source code release, an interactive web-hosted version for accelerated scientific communication, public feedback, and an updated preprint.</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"View Preprint\\\", \\\"button_link\\\": \\\"https://doi.org/10.1101/2020.04.02.019075\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary\\\"}], \\\"custom_class\\\": \\\"container col-8 pl-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"bf65a64d-d7e3-4a68-be5f-624a96edf61f\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 400, \\\"card_img_height\\\": 400, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-4 pr-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"b0c98342-efc5-4a23-a133-76b0d65d7ad5\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 250, \\\"card_img_height\\\": 250, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 py-5 borderless-card  bg-grey\\\"}, \\\"id\\\": \\\"fcf61b3f-f39a-4591-ba4c-c12ba777d628\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How can you help?</h2><ol><li>Try the model: <a href=\\\\\\\"https://nanohub.org/tools/pc4covid19\\\\\\\"><b>https://nanohub.org/tools/pc4covid19</b></a></li><li>Give feedback:<ul><li>Google Form: <a href=\\\\\\\"https://forms.gle/SVUMYWhipSHfX8nS8\\\\\\\"><b>https://forms.gle/SVUMYWhipSHfX8nS8</b></a></li><li><b>pc4covid19</b> slack workspace: [<a href=\\\\\\\"https://join.slack.com/t/pc4covid19/shared_invite/zt-d7xl91af-65vKXUoUIbZUXqt~gr6WJA\\\\\\\"><b>invite link</b></a>]</li></ul></li></ol><ol><li>Let us know if you can offer data or expertise.</li><li>Read the <b>preprint:</b> <a href=\\\\\\\"https://doi.org/10.1101/2020.04.02.019075\\\\\\\"><b>https://doi.org/10.1101/2020.04.02.019075</b></a></li><li>Spread the word: share this page on twitter</li><li>Keep an eye on this page for improvements!</li></ol>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 py-5 borderless-card bg-grey\\\"}, \\\"id\\\": \\\"64c83aea-c608-4794-b5e7-66cfda3f0e28\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 253,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2020-04-26T18:33:25.390Z",
+        "user": [
+            "akila"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 1, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 35, \"live\": true, \"has_unpublished_changes\": true, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-27T17:56:25.465Z\", \"latest_revision_created_at\": \"2020-04-26T18:25:11.393Z\", \"live_revision\": 249, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"show_announcements\": \"no\", \"row\": [{\"pk\": null, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"SARS-CoV-2 Tissue Simulation Coalition\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"container col-6 text-center pt-5\\\"}, \\\"id\\\": \\\"755c2621-f4d1-4398-9bf7-3a10dd8c33ec\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h4>We assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues</h4><p>PhysiCell aims to provide a robust, scalable code for simulating large systems of cells in 3-D tissues on standard desktop computers. Among our design goals</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Try the model in a web browser!\\\", \\\"button_link\\\": \\\"https://nanohub.org/tools/pc4covid19\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary btn-theme-yellow\\\"}, {\\\"button_text\\\": \\\"View Source Code on GitHub\\\", \\\"button_link\\\": \\\"https://www.github.com/pc4covid19\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-8 pt-0 pb-5 text-center borderless-card\\\"}, \\\"id\\\": \\\"3f6b6bc8-f27a-4dbb-bf3c-2bc8d610d31b\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How does it work</h2><p>In March 2020, we assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues. We aim to understand and test interventions in the coupled dynamics of COVID-19, including:</p><ul><li>Virus spread in tissue</li><li>Virion adhesion to ACE2 receptors on cells</li><li>Endocytosis (active transport into the cell)</li><li>Viral uncoating, replication, and assembly into new virions</li><li>Viral exocytosis (release of completed virions)</li><li>Single-cell responses to infection, including disrupted metabolism, secretion of interferons, and cell death</li><li>Inflammatory responses</li><li>Immune activation and expansion in lymph nodes</li><li>Immune cell infiltration and predation in infected tissue</li><li>Tissue damage, including edema that can lead to acute respiratory distress syndrome (ARDS)</li></ul>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 px-0 borderless-card\\\"}, \\\"id\\\": \\\"ed2a6d41-9a35-466b-9fb8-a7cd3a4299fb\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 300, \\\"card_img_height\\\": 300, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 px-0 borderless-card\\\"}, \\\"id\\\": \\\"25ee4aaf-9c8d-413b-b142-fee5c52a7fa7\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>By rapidly creating a multiscale framework, we can ask <i>what if</i> questions that identify vulnerabilities in viral replication and the spread of the infection, and seek approaches to control the immune response to avoid adverse reactions.</p><p>To drive this, we have assembled a <b>multidisciplinary team</b> of virologists, mathematical biologists, computer scientists, and industrial pharmacologists, who have all pledged to share data and expertise to proceed <b>much faster</b> as a group than we could alone.</p><p>We will share the entire model, scientific documentation, and code as <b>open source</b>, so that the entire community can benefit from this diverse domain expertise and focus on calibrating and validating the model, rather than building and accelerating it. We are sharing our progress with <b>open science</b> principles, including frequent scientific dissemination through <b>interactive web models</b>, open calls for community feedback, and frequent release and update of <b>scientific preprints.</b></p><p>And we are using <b><i>rapid prototyping</i></b>: we aim for a 7-14 day release cycle, where each release improved upon the last. Each release includes a well-tested and documented open source code release, an interactive web-hosted version for accelerated scientific communication, public feedback, and an updated preprint.</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"View Preprint\\\", \\\"button_link\\\": \\\"https://doi.org/10.1101/2020.04.02.019075\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary\\\"}], \\\"custom_class\\\": \\\"container col-8 pl-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"bf65a64d-d7e3-4a68-be5f-624a96edf61f\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 400, \\\"card_img_height\\\": 400, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-4 pr-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"b0c98342-efc5-4a23-a133-76b0d65d7ad5\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 250, \\\"card_img_height\\\": 250, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 py-5 borderless-card  bg-grey\\\"}, \\\"id\\\": \\\"fcf61b3f-f39a-4591-ba4c-c12ba777d628\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How can you help?</h2><ol><li>Try the model: <a href=\\\\\\\"https://nanohub.org/tools/pc4covid19\\\\\\\"><b>https://nanohub.org/tools/pc4covid19</b></a></li><li>Give feedback:<ul><li>Google Form: <a href=\\\\\\\"https://forms.gle/SVUMYWhipSHfX8nS8\\\\\\\"><b>https://forms.gle/SVUMYWhipSHfX8nS8</b></a></li><li><b>pc4covid19</b> slack workspace: [<a href=\\\\\\\"https://join.slack.com/t/pc4covid19/shared_invite/zt-d7xl91af-65vKXUoUIbZUXqt~gr6WJA\\\\\\\"><b>invite link</b></a>]</li></ul></li></ol><ol><li>Let us know if you can offer data or expertise.</li><li>Read the <b>preprint:</b> <a href=\\\\\\\"https://doi.org/10.1101/2020.04.02.019075\\\\\\\"><b>https://doi.org/10.1101/2020.04.02.019075</b></a></li><li>Spread the word: share this page on twitter</li><li>Keep an eye on this page for improvements!</li></ol>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 py-5 borderless-card bg-grey\\\"}, \\\"id\\\": \\\"64c83aea-c608-4794-b5e7-66cfda3f0e28\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 254,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2020-04-26T18:59:12.265Z",
+        "user": [
+            "akila"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 1, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 35, \"live\": true, \"has_unpublished_changes\": true, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-27T17:56:25.465Z\", \"latest_revision_created_at\": \"2020-04-26T18:33:25.390Z\", \"live_revision\": 249, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"show_announcements\": \"no\", \"row\": [{\"pk\": null, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"SARS-CoV-2 Tissue Simulation Coalition\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"container col-6 text-center pt-5\\\"}, \\\"id\\\": \\\"755c2621-f4d1-4398-9bf7-3a10dd8c33ec\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h4>We assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues</h4><p>PhysiCell aims to provide a robust, scalable code for simulating large systems of cells in 3-D tissues on standard desktop computers. Among our design goals</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Try the model in a web browser!\\\", \\\"button_link\\\": \\\"https://nanohub.org/tools/pc4covid19\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary btn-theme-yellow\\\"}, {\\\"button_text\\\": \\\"View Source Code on GitHub\\\", \\\"button_link\\\": \\\"https://www.github.com/pc4covid19\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-8 pt-0 pb-5 text-center borderless-card\\\"}, \\\"id\\\": \\\"3f6b6bc8-f27a-4dbb-bf3c-2bc8d610d31b\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How does it work</h2><p>In March 2020, we assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues. We aim to understand and test interventions in the coupled dynamics of COVID-19, including:</p><ul><li>Virus spread in tissue</li><li>Virion adhesion to ACE2 receptors on cells</li><li>Endocytosis (active transport into the cell)</li><li>Viral uncoating, replication, and assembly into new virions</li><li>Viral exocytosis (release of completed virions)</li><li>Single-cell responses to infection, including disrupted metabolism, secretion of interferons, and cell death</li><li>Inflammatory responses</li><li>Immune activation and expansion in lymph nodes</li><li>Immune cell infiltration and predation in infected tissue</li><li>Tissue damage, including edema that can lead to acute respiratory distress syndrome (ARDS)</li></ul>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 px-0 borderless-card\\\"}, \\\"id\\\": \\\"ed2a6d41-9a35-466b-9fb8-a7cd3a4299fb\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 300, \\\"card_img_height\\\": 300, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 px-0 borderless-card\\\"}, \\\"id\\\": \\\"25ee4aaf-9c8d-413b-b142-fee5c52a7fa7\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>By rapidly creating a multiscale framework, we can ask <i>what if</i> questions that identify vulnerabilities in viral replication and the spread of the infection, and seek approaches to control the immune response to avoid adverse reactions.</p><p>To drive this, we have assembled a <b>multidisciplinary team</b> of virologists, mathematical biologists, computer scientists, and industrial pharmacologists, who have all pledged to share data and expertise to proceed <b>much faster</b> as a group than we could alone.</p><p>We will share the entire model, scientific documentation, and code as <b>open source</b>, so that the entire community can benefit from this diverse domain expertise and focus on calibrating and validating the model, rather than building and accelerating it. We are sharing our progress with <b>open science</b> principles, including frequent scientific dissemination through <b>interactive web models</b>, open calls for community feedback, and frequent release and update of <b>scientific preprints.</b></p><p>And we are using <b><i>rapid prototyping</i></b>: we aim for a 7-14 day release cycle, where each release improved upon the last. Each release includes a well-tested and documented open source code release, an interactive web-hosted version for accelerated scientific communication, public feedback, and an updated preprint.</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"View Preprint\\\", \\\"button_link\\\": \\\"https://doi.org/10.1101/2020.04.02.019075\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary\\\"}], \\\"custom_class\\\": \\\"container col-8 pl-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"bf65a64d-d7e3-4a68-be5f-624a96edf61f\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 400, \\\"card_img_height\\\": 400, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-4 pr-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"b0c98342-efc5-4a23-a133-76b0d65d7ad5\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 250, \\\"card_img_height\\\": 250, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 py-5 borderless-card  bg-grey\\\"}, \\\"id\\\": \\\"fcf61b3f-f39a-4591-ba4c-c12ba777d628\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How can you help?</h2><ol><li>Try the model: <a href=\\\\\\\"https://nanohub.org/tools/pc4covid19\\\\\\\"><b>https://nanohub.org/tools/pc4covid19</b></a></li><li>Give feedback:<ul><li>Google Form: <a href=\\\\\\\"https://forms.gle/SVUMYWhipSHfX8nS8\\\\\\\"><b>https://forms.gle/SVUMYWhipSHfX8nS8</b></a></li><li><b>pc4covid19</b> slack workspace: [<a href=\\\\\\\"https://join.slack.com/t/pc4covid19/shared_invite/zt-d7xl91af-65vKXUoUIbZUXqt~gr6WJA\\\\\\\"><b>invite link</b></a>]</li></ul></li></ol><ol><li>Let us know if you can offer data or expertise.</li><li>Read the <b>preprint:</b> <a href=\\\\\\\"https://doi.org/10.1101/2020.04.02.019075\\\\\\\"><b>https://doi.org/10.1101/2020.04.02.019075</b></a></li><li>Spread the word: share this page on twitter</li><li>Keep an eye on this page for improvements!</li></ol>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 py-5 borderless-card bg-grey\\\"}, \\\"id\\\": \\\"64c83aea-c608-4794-b5e7-66cfda3f0e28\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"News Stories\\\", \\\"card_text\\\": \\\"<h3><b>Macklin leading international effort to build SARS-CoV-2 tissue simulator</b> </h3><p>Paul Macklin, an associate professor at the Luddy School of Informatics, Computing, and Engineering, is leading an international COVID-19 simulation group to rapidly build a SARS-CoV-2 tissue simulator with a group of virologists, pharmacologists, and mathematicians.</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://luddy.indiana.edu/news/story.html?story=Macklin-leading-international-effort-to-build-SARSCoV2-tissue-simulator\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-4 m-5\\\"}, \\\"id\\\": \\\"6ffc8e35-9f7c-43d6-a98a-27817f1b92d0\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-4 borderless-card\\\"}, \\\"id\\\": \\\"e2e5d23e-97e7-4929-ac33-12e9c80bf226\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>Past Versions</h2>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-10 text-center borderless-card\\\"}, \\\"id\\\": \\\"f4b6e73d-cd2e-402c-994e-a82915ebec9a\\\"}, {\\\"type\\\": \\\"paragraph_block\\\", \\\"value\\\": {\\\"custom_class\\\": \\\"container col-3 mx-5 px-5\\\", \\\"body\\\": \\\"<p></p><embed alt=\\\\\\\"sars\\\\\\\" embedtype=\\\\\\\"image\\\\\\\" format=\\\\\\\"fullwidth\\\\\\\" id=\\\\\\\"23\\\\\\\"/><p>v1 prototype (March 25, 2020-April 1, 2020)</p>\\\"}, \\\"id\\\": \\\"b35406f2-3c57-4cfd-8440-a080e9931e07\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h4><b>v1 prototype</b></h4><h2>Core Model</h2><p>First release: March 26, 2020; Last update: April 1, 2020</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"View\\\", \\\"button_link\\\": \\\"https://github.com/pc4covid19/COVID19/tree/0.1.3\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-3\\\"}, \\\"id\\\": \\\"d5b26971-55e0-4baf-9128-40919e149dff\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h4><b>v1 prototype</b></h4><h2><b>nanoHUB app</b></h2><p>(First release: March 26, 2020)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"View\\\", \\\"button_link\\\": \\\"http://dx.doi.org/doi:10.21981/19BB-HM69\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-3\\\"}, \\\"id\\\": \\\"dd671d64-bd9d-4bed-a9dd-90e44ae87299\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-3 borderless-card\\\"}, \\\"id\\\": \\\"e1b0b5b9-db0c-4307-bfa6-b8e20b388524\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 255,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2020-04-26T19:18:41.889Z",
+        "user": [
+            "akila"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 1, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 35, \"live\": true, \"has_unpublished_changes\": true, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-27T17:56:25.465Z\", \"latest_revision_created_at\": \"2020-04-26T18:59:12.265Z\", \"live_revision\": 249, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"show_announcements\": \"no\", \"row\": [{\"pk\": null, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"SARS-CoV-2 Tissue Simulation Coalition\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"container col-6 text-center pt-5\\\"}, \\\"id\\\": \\\"755c2621-f4d1-4398-9bf7-3a10dd8c33ec\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h4>We assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues</h4><p>PhysiCell aims to provide a robust, scalable code for simulating large systems of cells in 3-D tissues on standard desktop computers. Among our design goals</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Try the model in a web browser!\\\", \\\"button_link\\\": \\\"https://nanohub.org/tools/pc4covid19\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary btn-theme-yellow\\\"}, {\\\"button_text\\\": \\\"View Source Code on GitHub\\\", \\\"button_link\\\": \\\"https://www.github.com/pc4covid19\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-8 pt-0 pb-5 text-center borderless-card\\\"}, \\\"id\\\": \\\"3f6b6bc8-f27a-4dbb-bf3c-2bc8d610d31b\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How does it work</h2><p>In March 2020, we assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues. We aim to understand and test interventions in the coupled dynamics of COVID-19, including:</p><ul><li>Virus spread in tissue</li><li>Virion adhesion to ACE2 receptors on cells</li><li>Endocytosis (active transport into the cell)</li><li>Viral uncoating, replication, and assembly into new virions</li><li>Viral exocytosis (release of completed virions)</li><li>Single-cell responses to infection, including disrupted metabolism, secretion of interferons, and cell death</li><li>Inflammatory responses</li><li>Immune activation and expansion in lymph nodes</li><li>Immune cell infiltration and predation in infected tissue</li><li>Tissue damage, including edema that can lead to acute respiratory distress syndrome (ARDS)</li></ul>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 px-0 borderless-card\\\"}, \\\"id\\\": \\\"ed2a6d41-9a35-466b-9fb8-a7cd3a4299fb\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 300, \\\"card_img_height\\\": 300, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 px-0 borderless-card\\\"}, \\\"id\\\": \\\"25ee4aaf-9c8d-413b-b142-fee5c52a7fa7\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>By rapidly creating a multiscale framework, we can ask <i>what if</i> questions that identify vulnerabilities in viral replication and the spread of the infection, and seek approaches to control the immune response to avoid adverse reactions.</p><p>To drive this, we have assembled a <b>multidisciplinary team</b> of virologists, mathematical biologists, computer scientists, and industrial pharmacologists, who have all pledged to share data and expertise to proceed <b>much faster</b> as a group than we could alone.</p><p>We will share the entire model, scientific documentation, and code as <b>open source</b>, so that the entire community can benefit from this diverse domain expertise and focus on calibrating and validating the model, rather than building and accelerating it. We are sharing our progress with <b>open science</b> principles, including frequent scientific dissemination through <b>interactive web models</b>, open calls for community feedback, and frequent release and update of <b>scientific preprints.</b></p><p>And we are using <b><i>rapid prototyping</i></b>: we aim for a 7-14 day release cycle, where each release improved upon the last. Each release includes a well-tested and documented open source code release, an interactive web-hosted version for accelerated scientific communication, public feedback, and an updated preprint.</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"View Preprint\\\", \\\"button_link\\\": \\\"https://doi.org/10.1101/2020.04.02.019075\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary\\\"}], \\\"custom_class\\\": \\\"container col-8 pl-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"bf65a64d-d7e3-4a68-be5f-624a96edf61f\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 400, \\\"card_img_height\\\": 400, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-4 pr-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"b0c98342-efc5-4a23-a133-76b0d65d7ad5\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 250, \\\"card_img_height\\\": 250, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 py-5 borderless-card  bg-grey\\\"}, \\\"id\\\": \\\"fcf61b3f-f39a-4591-ba4c-c12ba777d628\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How can you help?</h2><ol><li>Try the model: <a href=\\\\\\\"https://nanohub.org/tools/pc4covid19\\\\\\\"><b>https://nanohub.org/tools/pc4covid19</b></a></li><li>Give feedback:<ul><li>Google Form: <a href=\\\\\\\"https://forms.gle/SVUMYWhipSHfX8nS8\\\\\\\"><b>https://forms.gle/SVUMYWhipSHfX8nS8</b></a></li><li><b>pc4covid19</b> slack workspace: [<a href=\\\\\\\"https://join.slack.com/t/pc4covid19/shared_invite/zt-d7xl91af-65vKXUoUIbZUXqt~gr6WJA\\\\\\\"><b>invite link</b></a>]</li></ul></li></ol><ol><li>Let us know if you can offer data or expertise.</li><li>Read the <b>preprint:</b> <a href=\\\\\\\"https://doi.org/10.1101/2020.04.02.019075\\\\\\\"><b>https://doi.org/10.1101/2020.04.02.019075</b></a></li><li>Spread the word: share this page on twitter</li><li>Keep an eye on this page for improvements!</li></ol>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 py-5 borderless-card bg-grey\\\"}, \\\"id\\\": \\\"64c83aea-c608-4794-b5e7-66cfda3f0e28\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"News Stories\\\", \\\"card_text\\\": \\\"<h3><b>Macklin leading international effort to build SARS-CoV-2 tissue simulator</b></h3><p>Paul Macklin, an associate professor at the Luddy School of Informatics, Computing, and Engineering, is leading an international COVID-19 simulation group to rapidly build a SARS-CoV-2 tissue simulator with a group of virologists, pharmacologists, and mathematicians.</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://luddy.indiana.edu/news/story.html?story=Macklin-leading-international-effort-to-build-SARSCoV2-tissue-simulator\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-4 m-5\\\"}, \\\"id\\\": \\\"6ffc8e35-9f7c-43d6-a98a-27817f1b92d0\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-4 borderless-card\\\"}, \\\"id\\\": \\\"e2e5d23e-97e7-4929-ac33-12e9c80bf226\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>Past Versions</h2>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-10 text-center borderless-card\\\"}, \\\"id\\\": \\\"f4b6e73d-cd2e-402c-994e-a82915ebec9a\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p><embed alt=\\\\\\\"sars\\\\\\\" embedtype=\\\\\\\"image\\\\\\\" format=\\\\\\\"fullwidth\\\\\\\" id=\\\\\\\"23\\\\\\\"/><h4><b>v1 prototype</b></h4><p>(March 25, 2020-April 1, 2020)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-3 ml-5 pl-0 ml-0 text-center pb-5\\\"}, \\\"id\\\": \\\"fe08c99a-cbe6-4e19-b334-19ce8174577d\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h3><b>Core Model</b></h3><p>First release: March 26, 2020; Last update: April 1, 2020</p><h3><b>nanoHUB app</b></h3><p>(First release: March 26, 2020)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Core Model\\\", \\\"button_link\\\": \\\"https://github.com/pc4covid19/COVID19/tree/0.1.3\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}, {\\\"button_text\\\": \\\"nano Hub\\\", \\\"button_link\\\": \\\"http://dx.doi.org/doi:10.21981/19BB-HM69\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-2 borderless-card px-0 mx-3\\\"}, \\\"id\\\": \\\"d5b26971-55e0-4baf-9128-40919e149dff\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h4></h4><embed alt=\\\\\\\"sars\\\\\\\" embedtype=\\\\\\\"image\\\\\\\" format=\\\\\\\"fullwidth\\\\\\\" id=\\\\\\\"23\\\\\\\"/><p></p><h4>v2 prototype </h4><p>(April 2, 2020-present)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-3 ml-5 pl-0 ml-0 text-center pb-5\\\"}, \\\"id\\\": \\\"388f2593-f3e0-4d41-8380-289aa4ff4fba\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 256,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2020-04-26T19:39:36.195Z",
+        "user": [
+            "akila"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 1, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 35, \"live\": true, \"has_unpublished_changes\": true, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-27T17:56:25.465Z\", \"latest_revision_created_at\": \"2020-04-26T19:18:41.889Z\", \"live_revision\": 249, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"show_announcements\": \"no\", \"row\": [{\"pk\": null, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"SARS-CoV-2 Tissue Simulation Coalition\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"container col-6 text-center pt-5\\\"}, \\\"id\\\": \\\"755c2621-f4d1-4398-9bf7-3a10dd8c33ec\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h4>We assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues</h4><p>PhysiCell aims to provide a robust, scalable code for simulating large systems of cells in 3-D tissues on standard desktop computers. Among our design goals</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Try the model in a web browser!\\\", \\\"button_link\\\": \\\"https://nanohub.org/tools/pc4covid19\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary btn-theme-yellow\\\"}, {\\\"button_text\\\": \\\"View Source Code on GitHub\\\", \\\"button_link\\\": \\\"https://www.github.com/pc4covid19\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-8 pt-0 pb-5 text-center borderless-card\\\"}, \\\"id\\\": \\\"3f6b6bc8-f27a-4dbb-bf3c-2bc8d610d31b\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How does it work</h2><p>In March 2020, we assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues. We aim to understand and test interventions in the coupled dynamics of COVID-19, including:</p><ul><li>Virus spread in tissue</li><li>Virion adhesion to ACE2 receptors on cells</li><li>Endocytosis (active transport into the cell)</li><li>Viral uncoating, replication, and assembly into new virions</li><li>Viral exocytosis (release of completed virions)</li><li>Single-cell responses to infection, including disrupted metabolism, secretion of interferons, and cell death</li><li>Inflammatory responses</li><li>Immune activation and expansion in lymph nodes</li><li>Immune cell infiltration and predation in infected tissue</li><li>Tissue damage, including edema that can lead to acute respiratory distress syndrome (ARDS)</li></ul>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 px-0 borderless-card\\\"}, \\\"id\\\": \\\"ed2a6d41-9a35-466b-9fb8-a7cd3a4299fb\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 300, \\\"card_img_height\\\": 300, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 px-0 borderless-card\\\"}, \\\"id\\\": \\\"25ee4aaf-9c8d-413b-b142-fee5c52a7fa7\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>By rapidly creating a multiscale framework, we can ask <i>what if</i> questions that identify vulnerabilities in viral replication and the spread of the infection, and seek approaches to control the immune response to avoid adverse reactions.</p><p>To drive this, we have assembled a <b>multidisciplinary team</b> of virologists, mathematical biologists, computer scientists, and industrial pharmacologists, who have all pledged to share data and expertise to proceed <b>much faster</b> as a group than we could alone.</p><p>We will share the entire model, scientific documentation, and code as <b>open source</b>, so that the entire community can benefit from this diverse domain expertise and focus on calibrating and validating the model, rather than building and accelerating it. We are sharing our progress with <b>open science</b> principles, including frequent scientific dissemination through <b>interactive web models</b>, open calls for community feedback, and frequent release and update of <b>scientific preprints.</b></p><p>And we are using <b><i>rapid prototyping</i></b>: we aim for a 7-14 day release cycle, where each release improved upon the last. Each release includes a well-tested and documented open source code release, an interactive web-hosted version for accelerated scientific communication, public feedback, and an updated preprint.</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"View Preprint\\\", \\\"button_link\\\": \\\"https://doi.org/10.1101/2020.04.02.019075\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary\\\"}], \\\"custom_class\\\": \\\"container col-8 pl-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"bf65a64d-d7e3-4a68-be5f-624a96edf61f\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 400, \\\"card_img_height\\\": 400, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-4 pr-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"b0c98342-efc5-4a23-a133-76b0d65d7ad5\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 20, \\\"card_img_width\\\": 250, \\\"card_img_height\\\": 250, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 py-5 borderless-card  bg-grey\\\"}, \\\"id\\\": \\\"fcf61b3f-f39a-4591-ba4c-c12ba777d628\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How can you help?</h2><ol><li>Try the model: <a href=\\\\\\\"https://nanohub.org/tools/pc4covid19\\\\\\\"><b>https://nanohub.org/tools/pc4covid19</b></a></li><li>Give feedback:<ul><li>Google Form: <a href=\\\\\\\"https://forms.gle/SVUMYWhipSHfX8nS8\\\\\\\"><b>https://forms.gle/SVUMYWhipSHfX8nS8</b></a></li><li><b>pc4covid19</b> slack workspace: [<a href=\\\\\\\"https://join.slack.com/t/pc4covid19/shared_invite/zt-d7xl91af-65vKXUoUIbZUXqt~gr6WJA\\\\\\\"><b>invite link</b></a>]</li></ul></li></ol><ol><li>Let us know if you can offer data or expertise.</li><li>Read the <b>preprint:</b> <a href=\\\\\\\"https://doi.org/10.1101/2020.04.02.019075\\\\\\\"><b>https://doi.org/10.1101/2020.04.02.019075</b></a></li><li>Spread the word: share this page on twitter</li><li>Keep an eye on this page for improvements!</li></ol>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 py-5 borderless-card bg-grey\\\"}, \\\"id\\\": \\\"64c83aea-c608-4794-b5e7-66cfda3f0e28\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"News Stories\\\", \\\"card_text\\\": \\\"<h3><b>Macklin leading international effort to build SARS-CoV-2 tissue simulator</b></h3><p>Paul Macklin, an associate professor at the Luddy School of Informatics, Computing, and Engineering, is leading an international COVID-19 simulation group to rapidly build a SARS-CoV-2 tissue simulator with a group of virologists, pharmacologists, and mathematicians.</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://luddy.indiana.edu/news/story.html?story=Macklin-leading-international-effort-to-build-SARSCoV2-tissue-simulator\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-4 p-5 theme-gradient\\\"}, \\\"id\\\": \\\"6ffc8e35-9f7c-43d6-a98a-27817f1b92d0\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": true, \\\"card_img\\\": 24, \\\"card_img_width\\\": null, \\\"card_img_height\\\": 460, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-8 borderless-card theme-gradient p-0\\\"}, \\\"id\\\": \\\"e2e5d23e-97e7-4929-ac33-12e9c80bf226\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>Past Versions</h2>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-10 text-center borderless-card py-4\\\"}, \\\"id\\\": \\\"f4b6e73d-cd2e-402c-994e-a82915ebec9a\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p><embed alt=\\\\\\\"sars\\\\\\\" embedtype=\\\\\\\"image\\\\\\\" format=\\\\\\\"fullwidth\\\\\\\" id=\\\\\\\"23\\\\\\\"/><h4><b>v1 prototype</b></h4><p>(March 25, 2020-April 1, 2020)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-3 ml-5 px-0 mr-0 text-center pb-5\\\"}, \\\"id\\\": \\\"fe08c99a-cbe6-4e19-b334-19ce8174577d\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h3><b>Core Model</b></h3><p>First release: March 26, 2020; Last update: April 1, 2020</p><h3><b>nanoHUB app</b></h3><p>(First release: March 26, 2020)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Core Model\\\", \\\"button_link\\\": \\\"https://github.com/pc4covid19/COVID19/tree/0.1.3\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}, {\\\"button_text\\\": \\\"nano Hub\\\", \\\"button_link\\\": \\\"http://dx.doi.org/doi:10.21981/19BB-HM69\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}, {\\\"button_text\\\": \\\"Preprint\\\", \\\"button_link\\\": \\\"https://www.biorxiv.org/content/10.1101/2020.04.02.019075v1\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success mt-1\\\"}], \\\"custom_class\\\": \\\"container col-2 borderless-card px-0 mx-3\\\"}, \\\"id\\\": \\\"d5b26971-55e0-4baf-9128-40919e149dff\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h4></h4><embed alt=\\\\\\\"sars\\\\\\\" embedtype=\\\\\\\"image\\\\\\\" format=\\\\\\\"fullwidth\\\\\\\" id=\\\\\\\"23\\\\\\\"/><p></p><h4>v2 prototype</h4><p>(April 2, 2020-present)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-3 ml-5 pl-0 mr-0 text-center pb-5\\\"}, \\\"id\\\": \\\"388f2593-f3e0-4d41-8380-289aa4ff4fba\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h3><b>Core Model</b></h3><p>(First release: April 9, 2020; Last update: April 10, 2020)</p><h3><b>nanoHUB app</b></h3><p>(First release: April 11, 2020)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Core Model\\\", \\\"button_link\\\": \\\"https://github.com/pc4covid19/COVID19/releases/tag/0.2.1\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}, {\\\"button_text\\\": \\\"nano Hub\\\", \\\"button_link\\\": \\\"http://dx.doi.org/doi:10.21981/J6SP-J909\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-2 borderless-card px-0 mx-3\\\"}, \\\"id\\\": \\\"9f9867e2-03cf-4faf-b37a-9d02ec87d012\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 257,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2020-04-26T20:08:13.697Z",
+        "user": [
+            "akila"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 1, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 35, \"live\": true, \"has_unpublished_changes\": true, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-27T17:56:25.465Z\", \"latest_revision_created_at\": \"2020-04-26T19:39:36.195Z\", \"live_revision\": 249, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"show_announcements\": \"no\", \"row\": [{\"pk\": null, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"SARS-CoV-2 Tissue Simulation Coalition\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"container col-6 text-center pt-5\\\"}, \\\"id\\\": \\\"755c2621-f4d1-4398-9bf7-3a10dd8c33ec\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h4>We assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues</h4><p>PhysiCell aims to provide a robust, scalable code for simulating large systems of cells in 3-D tissues on standard desktop computers. Among our design goals</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Try the model in a web browser!\\\", \\\"button_link\\\": \\\"https://nanohub.org/tools/pc4covid19\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-warning btn-theme-yellow\\\"}, {\\\"button_text\\\": \\\"View Source Code on GitHub\\\", \\\"button_link\\\": \\\"https://www.github.com/pc4covid19\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-8 pt-0 pb-5 text-center borderless-card\\\"}, \\\"id\\\": \\\"3f6b6bc8-f27a-4dbb-bf3c-2bc8d610d31b\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How does it work</h2><p>In March 2020, we assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues. We aim to understand and test interventions in the coupled dynamics of COVID-19, including:</p><ul><li>Virus spread in tissue</li><li>Virion adhesion to ACE2 receptors on cells</li><li>Endocytosis (active transport into the cell)</li><li>Viral uncoating, replication, and assembly into new virions</li><li>Viral exocytosis (release of completed virions)</li><li>Single-cell responses to infection, including disrupted metabolism, secretion of interferons, and cell death</li><li>Inflammatory responses</li><li>Immune activation and expansion in lymph nodes</li><li>Immune cell infiltration and predation in infected tissue</li><li>Tissue damage, including edema that can lead to acute respiratory distress syndrome (ARDS)</li></ul>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 px-0 borderless-card theme-header\\\"}, \\\"id\\\": \\\"ed2a6d41-9a35-466b-9fb8-a7cd3a4299fb\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 28, \\\"card_img_width\\\": 300, \\\"card_img_height\\\": 300, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 px-0 borderless-card\\\"}, \\\"id\\\": \\\"25ee4aaf-9c8d-413b-b142-fee5c52a7fa7\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>By rapidly creating a multiscale framework, we can ask <i>what if</i> questions that identify vulnerabilities in viral replication and the spread of the infection, and seek approaches to control the immune response to avoid adverse reactions.</p><p>To drive this, we have assembled a <b>multidisciplinary team</b> of virologists, mathematical biologists, computer scientists, and industrial pharmacologists, who have all pledged to share data and expertise to proceed <b>much faster</b> as a group than we could alone.</p><p>We will share the entire model, scientific documentation, and code as <b>open source</b>, so that the entire community can benefit from this diverse domain expertise and focus on calibrating and validating the model, rather than building and accelerating it. We are sharing our progress with <b>open science</b> principles, including frequent scientific dissemination through <b>interactive web models</b>, open calls for community feedback, and frequent release and update of <b>scientific preprints.</b></p><p>And we are using <b><i>rapid prototyping</i></b>: we aim for a 7-14 day release cycle, where each release improved upon the last. Each release includes a well-tested and documented open source code release, an interactive web-hosted version for accelerated scientific communication, public feedback, and an updated preprint.</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"View Preprint\\\", \\\"button_link\\\": \\\"https://doi.org/10.1101/2020.04.02.019075\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success\\\"}], \\\"custom_class\\\": \\\"container col-8 pl-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"bf65a64d-d7e3-4a68-be5f-624a96edf61f\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 29, \\\"card_img_width\\\": 400, \\\"card_img_height\\\": 400, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-4 pr-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"b0c98342-efc5-4a23-a133-76b0d65d7ad5\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 31, \\\"card_img_width\\\": 500, \\\"card_img_height\\\": 330, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 py-5 borderless-card  bg-grey\\\"}, \\\"id\\\": \\\"fcf61b3f-f39a-4591-ba4c-c12ba777d628\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How can you help?</h2><ol><li>Try the model: <a href=\\\\\\\"https://nanohub.org/tools/pc4covid19\\\\\\\"><b>https://nanohub.org/tools/pc4covid19</b></a></li><li>Give feedback:<ul><li>Google Form: <a href=\\\\\\\"https://forms.gle/SVUMYWhipSHfX8nS8\\\\\\\"><b>https://forms.gle/SVUMYWhipSHfX8nS8</b></a></li><li><b>pc4covid19</b> slack workspace: [<a href=\\\\\\\"https://join.slack.com/t/pc4covid19/shared_invite/zt-d7xl91af-65vKXUoUIbZUXqt~gr6WJA\\\\\\\"><b>invite link</b></a>]</li></ul></li></ol><ol><li>Let us know if you can offer data or expertise.</li><li>Read the <b>preprint:</b> <a href=\\\\\\\"https://doi.org/10.1101/2020.04.02.019075\\\\\\\"><b>https://doi.org/10.1101/2020.04.02.019075</b></a></li><li>Spread the word: share this page on twitter</li><li>Keep an eye on this page for improvements!</li></ol>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 py-5 borderless-card bg-grey theme-header\\\"}, \\\"id\\\": \\\"64c83aea-c608-4794-b5e7-66cfda3f0e28\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"News Stories\\\", \\\"card_text\\\": \\\"<h3><b>Macklin leading international effort to build SARS-CoV-2 tissue simulator</b></h3><p>Paul Macklin, an associate professor at the Luddy School of Informatics, Computing, and Engineering, is leading an international COVID-19 simulation group to rapidly build a SARS-CoV-2 tissue simulator with a group of virologists, pharmacologists, and mathematicians.</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://luddy.indiana.edu/news/story.html?story=Macklin-leading-international-effort-to-build-SARSCoV2-tissue-simulator\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-4 p-5 theme-gradient\\\"}, \\\"id\\\": \\\"6ffc8e35-9f7c-43d6-a98a-27817f1b92d0\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": true, \\\"card_img\\\": 24, \\\"card_img_width\\\": null, \\\"card_img_height\\\": 460, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-8 borderless-card theme-gradient p-0\\\"}, \\\"id\\\": \\\"e2e5d23e-97e7-4929-ac33-12e9c80bf226\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p><embed alt=\\\\\\\"sars\\\\\\\" embedtype=\\\\\\\"image\\\\\\\" format=\\\\\\\"fullwidth\\\\\\\" id=\\\\\\\"23\\\\\\\"/><h4><b>v1 prototype</b></h4><p>(March 25, 2020-April 1, 2020)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-3 ml-5 px-0 mr-0 text-center pb-5 pt-5\\\"}, \\\"id\\\": \\\"fe08c99a-cbe6-4e19-b334-19ce8174577d\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h3><b>Core Model</b></h3><p>First release: March 26, 2020; Last update: April 1, 2020</p><h3><b>nanoHUB app</b></h3><p>(First release: March 26, 2020)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Core Model\\\", \\\"button_link\\\": \\\"https://github.com/pc4covid19/COVID19/tree/0.1.3\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}, {\\\"button_text\\\": \\\"nano Hub\\\", \\\"button_link\\\": \\\"http://dx.doi.org/doi:10.21981/19BB-HM69\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}, {\\\"button_text\\\": \\\"Preprint\\\", \\\"button_link\\\": \\\"https://www.biorxiv.org/content/10.1101/2020.04.02.019075v1\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success mt-1\\\"}], \\\"custom_class\\\": \\\"container col-2 borderless-card pt-5 px-0 mx-3\\\"}, \\\"id\\\": \\\"d5b26971-55e0-4baf-9128-40919e149dff\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h4></h4><embed alt=\\\\\\\"sars\\\\\\\" embedtype=\\\\\\\"image\\\\\\\" format=\\\\\\\"fullwidth\\\\\\\" id=\\\\\\\"23\\\\\\\"/><p></p><h4>v2 prototype</h4><p>(April 2, 2020-present)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-3 ml-5 pl-0 mr-0 text-center pb-5 pt-5\\\"}, \\\"id\\\": \\\"388f2593-f3e0-4d41-8380-289aa4ff4fba\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h3><b>Core Model</b></h3><p>(First release: April 9, 2020; Last update: April 10, 2020)</p><h3><b>nanoHUB app</b></h3><p>(First release: April 11, 2020)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Core Model\\\", \\\"button_link\\\": \\\"https://github.com/pc4covid19/COVID19/releases/tag/0.2.1\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}, {\\\"button_text\\\": \\\"nano Hub\\\", \\\"button_link\\\": \\\"http://dx.doi.org/doi:10.21981/J6SP-J909\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-2 borderless-card pt-5 px-0 mx-3\\\"}, \\\"id\\\": \\\"9f9867e2-03cf-4faf-b37a-9d02ec87d012\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 258,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2020-04-26T20:25:53.545Z",
+        "user": [
+            "akila"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 1, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 35, \"live\": true, \"has_unpublished_changes\": true, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-27T17:56:25.465Z\", \"latest_revision_created_at\": \"2020-04-26T20:08:13.697Z\", \"live_revision\": 249, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"show_announcements\": \"no\", \"row\": [{\"pk\": null, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"SARS-CoV-2 Tissue Simulation Coalition\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"container col-6 text-center pt-5\\\"}, \\\"id\\\": \\\"755c2621-f4d1-4398-9bf7-3a10dd8c33ec\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h4>We assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues</h4><p>PhysiCell aims to provide a robust, scalable code for simulating large systems of cells in 3-D tissues on standard desktop computers. Among our design goals</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Try the model in a web browser!\\\", \\\"button_link\\\": \\\"https://nanohub.org/tools/pc4covid19\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-warning btn-theme-yellow\\\"}, {\\\"button_text\\\": \\\"View Source Code on GitHub\\\", \\\"button_link\\\": \\\"https://www.github.com/pc4covid19\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-8 pt-0 pb-5 text-center borderless-card\\\"}, \\\"id\\\": \\\"3f6b6bc8-f27a-4dbb-bf3c-2bc8d610d31b\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How does it work</h2><p>In March 2020, we assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues. We aim to understand and test interventions in the coupled dynamics of COVID-19, including:</p><ul><li>Virus spread in tissue</li><li>Virion adhesion to ACE2 receptors on cells</li><li>Endocytosis (active transport into the cell)</li><li>Viral uncoating, replication, and assembly into new virions</li><li>Viral exocytosis (release of completed virions)</li><li>Single-cell responses to infection, including disrupted metabolism, secretion of interferons, and cell death</li><li>Inflammatory responses</li><li>Immune activation and expansion in lymph nodes</li><li>Immune cell infiltration and predation in infected tissue</li><li>Tissue damage, including edema that can lead to acute respiratory distress syndrome (ARDS)</li></ul>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 px-0 borderless-card theme-header\\\"}, \\\"id\\\": \\\"ed2a6d41-9a35-466b-9fb8-a7cd3a4299fb\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 28, \\\"card_img_width\\\": 300, \\\"card_img_height\\\": 300, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 px-0 borderless-card\\\"}, \\\"id\\\": \\\"25ee4aaf-9c8d-413b-b142-fee5c52a7fa7\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>By rapidly creating a multiscale framework, we can ask <i>what if</i> questions that identify vulnerabilities in viral replication and the spread of the infection, and seek approaches to control the immune response to avoid adverse reactions.</p><p>To drive this, we have assembled a <b>multidisciplinary team</b> of virologists, mathematical biologists, computer scientists, and industrial pharmacologists, who have all pledged to share data and expertise to proceed <b>much faster</b> as a group than we could alone.</p><p>We will share the entire model, scientific documentation, and code as <b>open source</b>, so that the entire community can benefit from this diverse domain expertise and focus on calibrating and validating the model, rather than building and accelerating it. We are sharing our progress with <b>open science</b> principles, including frequent scientific dissemination through <b>interactive web models</b>, open calls for community feedback, and frequent release and update of <b>scientific preprints.</b></p><p>And we are using <b><i>rapid prototyping</i></b>: we aim for a 7-14 day release cycle, where each release improved upon the last. Each release includes a well-tested and documented open source code release, an interactive web-hosted version for accelerated scientific communication, public feedback, and an updated preprint.</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"View Preprint\\\", \\\"button_link\\\": \\\"https://doi.org/10.1101/2020.04.02.019075\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success\\\"}], \\\"custom_class\\\": \\\"container col-8 pl-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"bf65a64d-d7e3-4a68-be5f-624a96edf61f\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 29, \\\"card_img_width\\\": 400, \\\"card_img_height\\\": 400, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-4 pr-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"b0c98342-efc5-4a23-a133-76b0d65d7ad5\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 31, \\\"card_img_width\\\": 500, \\\"card_img_height\\\": 330, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 py-5 borderless-card  bg-grey\\\"}, \\\"id\\\": \\\"fcf61b3f-f39a-4591-ba4c-c12ba777d628\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How can you help?</h2><ol><li>Try the model: <a href=\\\\\\\"https://nanohub.org/tools/pc4covid19\\\\\\\"><b>https://nanohub.org/tools/pc4covid19</b></a></li><li>Give feedback:<ul><li>Google Form: <a href=\\\\\\\"https://forms.gle/SVUMYWhipSHfX8nS8\\\\\\\"><b>https://forms.gle/SVUMYWhipSHfX8nS8</b></a></li><li><b>pc4covid19</b> slack workspace: [<a href=\\\\\\\"https://join.slack.com/t/pc4covid19/shared_invite/zt-d7xl91af-65vKXUoUIbZUXqt~gr6WJA\\\\\\\"><b>invite link</b></a>]</li></ul></li></ol><ol><li>Let us know if you can offer data or expertise.</li><li>Read the <b>preprint:</b> <a href=\\\\\\\"https://doi.org/10.1101/2020.04.02.019075\\\\\\\"><b>https://doi.org/10.1101/2020.04.02.019075</b></a></li><li>Spread the word: share this page on twitter</li><li>Keep an eye on this page for improvements!</li></ol>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 py-5 borderless-card bg-grey theme-header\\\"}, \\\"id\\\": \\\"64c83aea-c608-4794-b5e7-66cfda3f0e28\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"News Stories\\\", \\\"card_text\\\": \\\"<h3><b>Macklin leading international effort to build SARS-CoV-2 tissue simulator</b></h3><p>Paul Macklin, an associate professor at the Luddy School of Informatics, Computing, and Engineering, is leading an international COVID-19 simulation group to rapidly build a SARS-CoV-2 tissue simulator with a group of virologists, pharmacologists, and mathematicians.</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://luddy.indiana.edu/news/story.html?story=Macklin-leading-international-effort-to-build-SARSCoV2-tissue-simulator\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-4 p-5 theme-gradient\\\"}, \\\"id\\\": \\\"6ffc8e35-9f7c-43d6-a98a-27817f1b92d0\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": true, \\\"card_img\\\": 24, \\\"card_img_width\\\": null, \\\"card_img_height\\\": 460, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-8 borderless-card theme-gradient p-0\\\"}, \\\"id\\\": \\\"e2e5d23e-97e7-4929-ac33-12e9c80bf226\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p><embed alt=\\\\\\\"sars\\\\\\\" embedtype=\\\\\\\"image\\\\\\\" format=\\\\\\\"fullwidth\\\\\\\" id=\\\\\\\"23\\\\\\\"/><h4><b>v1 prototype</b></h4><p>(March 25, 2020-April 1, 2020)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-3 ml-5 px-0 mr-0 text-center pb-5 pt-5\\\"}, \\\"id\\\": \\\"fe08c99a-cbe6-4e19-b334-19ce8174577d\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h3><b>Core Model</b></h3><p>First release: March 26, 2020; Last update: April 1, 2020</p><h3><b>nanoHUB app</b></h3><p>(First release: March 26, 2020)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Core Model\\\", \\\"button_link\\\": \\\"https://github.com/pc4covid19/COVID19/tree/0.1.3\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}, {\\\"button_text\\\": \\\"nano Hub\\\", \\\"button_link\\\": \\\"http://dx.doi.org/doi:10.21981/19BB-HM69\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}, {\\\"button_text\\\": \\\"Preprint\\\", \\\"button_link\\\": \\\"https://www.biorxiv.org/content/10.1101/2020.04.02.019075v1\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success mt-1\\\"}], \\\"custom_class\\\": \\\"container col-2 borderless-card pt-5 px-0 mx-3\\\"}, \\\"id\\\": \\\"d5b26971-55e0-4baf-9128-40919e149dff\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h4></h4><embed alt=\\\\\\\"sars\\\\\\\" embedtype=\\\\\\\"image\\\\\\\" format=\\\\\\\"fullwidth\\\\\\\" id=\\\\\\\"23\\\\\\\"/><p></p><h4>v2 prototype</h4><p>(April 2, 2020-present)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-3 ml-5 pl-0 mr-0 text-center pb-5 pt-5\\\"}, \\\"id\\\": \\\"388f2593-f3e0-4d41-8380-289aa4ff4fba\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h3><b>Core Model</b></h3><p>(First release: April 9, 2020; Last update: April 10, 2020)</p><h3><b>nanoHUB app</b></h3><p>(First release: April 11, 2020)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Core Model\\\", \\\"button_link\\\": \\\"https://github.com/pc4covid19/COVID19/releases/tag/0.2.1\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}, {\\\"button_text\\\": \\\"nano Hub\\\", \\\"button_link\\\": \\\"http://dx.doi.org/doi:10.21981/J6SP-J909\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-2 borderless-card pt-5 px-0 mx-3\\\"}, \\\"id\\\": \\\"9f9867e2-03cf-4faf-b37a-9d02ec87d012\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.pagerevision",
+    "pk": 259,
+    "fields": {
+        "page": 3,
+        "submitted_for_moderation": false,
+        "created_at": "2020-04-26T20:32:11.281Z",
+        "user": [
+            "akila"
+        ],
+        "content_json": "{\"pk\": 3, \"path\": \"000100010001\", \"depth\": 3, \"numchild\": 1, \"title\": \"Home\", \"draft_title\": \"Home\", \"slug\": \"home\", \"content_type\": 35, \"live\": true, \"has_unpublished_changes\": true, \"url_path\": \"/home/home/\", \"owner\": 1, \"seo_title\": \"\", \"show_in_menus\": false, \"search_description\": \"\", \"go_live_at\": null, \"expire_at\": null, \"expired\": false, \"locked\": false, \"first_published_at\": \"2018-04-17T22:33:31.457Z\", \"last_published_at\": \"2018-04-27T17:56:25.465Z\", \"latest_revision_created_at\": \"2020-04-26T20:25:53.545Z\", \"live_revision\": 249, \"show_navbar\": \"yes\", \"show_nav_extra\": \"yes\", \"show_footer\": \"yes\", \"show_announcements\": \"no\", \"row\": [{\"pk\": null, \"sort_order\": 0, \"body\": \"[{\\\"type\\\": \\\"heading_block\\\", \\\"value\\\": {\\\"heading_text\\\": \\\"SARS-CoV-2 Tissue Simulation Coalition\\\", \\\"size\\\": \\\"h1\\\", \\\"custom_class\\\": \\\"container col-6 text-center pt-5 text-light\\\"}, \\\"id\\\": \\\"755c2621-f4d1-4398-9bf7-3a10dd8c33ec\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h4>We assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues</h4><p>PhysiCell aims to provide a robust, scalable code for simulating large systems of cells in 3-D tissues on standard desktop computers. Among our design goals</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Try the model in a web browser!\\\", \\\"button_link\\\": \\\"https://nanohub.org/tools/pc4covid19\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-warning btn-theme-yellow\\\"}, {\\\"button_text\\\": \\\"View Source Code on GitHub\\\", \\\"button_link\\\": \\\"https://www.github.com/pc4covid19\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green pb-2\\\"}], \\\"custom_class\\\": \\\"container col-7 pt-0 pb-5 text-center borderless-card\\\"}, \\\"id\\\": \\\"3f6b6bc8-f27a-4dbb-bf3c-2bc8d610d31b\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 1, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How it works</h2><p>In March 2020, we assembled an international coalition to develop a <b>comprehensive multiscale simulation framework</b> for SARS-CoV-2 (coronavirus) infections in lung and gut tissues. We aim to understand and test interventions in the coupled dynamics of COVID-19, including:</p><ul><li>Virus spread in tissue</li><li>Virion adhesion to ACE2 receptors on cells</li><li>Endocytosis (active transport into the cell)</li><li>Viral uncoating, replication, and assembly into new virions</li><li>Viral exocytosis (release of completed virions)</li><li>Single-cell responses to infection, including disrupted metabolism, secretion of interferons, and cell death</li><li>Inflammatory responses</li><li>Immune activation and expansion in lymph nodes</li><li>Immune cell infiltration and predation in infected tissue</li><li>Tissue damage, including edema that can lead to acute respiratory distress syndrome (ARDS)</li></ul>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 px-0 borderless-card theme-header\\\"}, \\\"id\\\": \\\"ed2a6d41-9a35-466b-9fb8-a7cd3a4299fb\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 28, \\\"card_img_width\\\": 300, \\\"card_img_height\\\": 300, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 px-0 borderless-card\\\"}, \\\"id\\\": \\\"25ee4aaf-9c8d-413b-b142-fee5c52a7fa7\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 2, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p>By rapidly creating a multiscale framework, we can ask <i>what if</i> questions that identify vulnerabilities in viral replication and the spread of the infection, and seek approaches to control the immune response to avoid adverse reactions.</p><p>To drive this, we have assembled a <b>multidisciplinary team</b> of virologists, mathematical biologists, computer scientists, and industrial pharmacologists, who have all pledged to share data and expertise to proceed <b>much faster</b> as a group than we could alone.</p><p>We will share the entire model, scientific documentation, and code as <b>open source</b>, so that the entire community can benefit from this diverse domain expertise and focus on calibrating and validating the model, rather than building and accelerating it. We are sharing our progress with <b>open science</b> principles, including frequent scientific dissemination through <b>interactive web models</b>, open calls for community feedback, and frequent release and update of <b>scientific preprints.</b></p><p>And we are using <b><i>rapid prototyping</i></b>: we aim for a 7-14 day release cycle, where each release improved upon the last. Each release includes a well-tested and documented open source code release, an interactive web-hosted version for accelerated scientific communication, public feedback, and an updated preprint.</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"View Preprint\\\", \\\"button_link\\\": \\\"https://doi.org/10.1101/2020.04.02.019075\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success\\\"}], \\\"custom_class\\\": \\\"container col-8 pl-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"bf65a64d-d7e3-4a68-be5f-624a96edf61f\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 29, \\\"card_img_width\\\": 400, \\\"card_img_height\\\": 400, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-4 pr-5 pt-0 pb-5 borderless-card\\\"}, \\\"id\\\": \\\"b0c98342-efc5-4a23-a133-76b0d65d7ad5\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 3, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": 31, \\\"card_img_width\\\": 500, \\\"card_img_height\\\": 330, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pl-5 py-5 borderless-card  bg-grey\\\"}, \\\"id\\\": \\\"fcf61b3f-f39a-4591-ba4c-c12ba777d628\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h2>How can you help?</h2><ol><li>Try the model: <a href=\\\\\\\"https://nanohub.org/tools/pc4covid19\\\\\\\"><b>https://nanohub.org/tools/pc4covid19</b></a></li><li>Give feedback:<ul><li>Google Form: <a href=\\\\\\\"https://forms.gle/SVUMYWhipSHfX8nS8\\\\\\\"><b>https://forms.gle/SVUMYWhipSHfX8nS8</b></a></li><li><b>pc4covid19</b> slack workspace: [<a href=\\\\\\\"https://join.slack.com/t/pc4covid19/shared_invite/zt-d7xl91af-65vKXUoUIbZUXqt~gr6WJA\\\\\\\"><b>invite link</b></a>]</li></ul></li></ol><ol><li>Let us know if you can offer data or expertise.</li><li>Read the <b>preprint:</b> <a href=\\\\\\\"https://doi.org/10.1101/2020.04.02.019075\\\\\\\"><b>https://doi.org/10.1101/2020.04.02.019075</b></a></li><li>Spread the word: share this page on twitter</li><li>Keep an eye on this page for improvements!</li></ol>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-6 pr-5 py-5 borderless-card bg-grey theme-header\\\"}, \\\"id\\\": \\\"64c83aea-c608-4794-b5e7-66cfda3f0e28\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 4, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"News Stories\\\", \\\"card_text\\\": \\\"<h3><b>Macklin leading international effort to build SARS-CoV-2 tissue simulator</b></h3><p>Paul Macklin, an associate professor at the Luddy School of Informatics, Computing, and Engineering, is leading an international COVID-19 simulation group to rapidly build a SARS-CoV-2 tissue simulator with a group of virologists, pharmacologists, and mathematicians.</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Learn More\\\", \\\"button_link\\\": \\\"https://luddy.indiana.edu/news/story.html?story=Macklin-leading-international-effort-to-build-SARSCoV2-tissue-simulator\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-primary btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-4 p-5 theme-gradient\\\"}, \\\"id\\\": \\\"6ffc8e35-9f7c-43d6-a98a-27817f1b92d0\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": true, \\\"is_card_img_overlay\\\": true, \\\"card_img\\\": 24, \\\"card_img_width\\\": null, \\\"card_img_height\\\": 460, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-8 borderless-card theme-gradient p-0\\\"}, \\\"id\\\": \\\"e2e5d23e-97e7-4929-ac33-12e9c80bf226\\\"}]\", \"page\": 3}, {\"pk\": null, \"sort_order\": 5, \"body\": \"[{\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<p></p><embed alt=\\\\\\\"sars\\\\\\\" embedtype=\\\\\\\"image\\\\\\\" format=\\\\\\\"fullwidth\\\\\\\" id=\\\\\\\"23\\\\\\\"/><h4><b>v1 prototype</b></h4><p>(March 25, 2020-April 1, 2020)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-3 ml-5 px-0 mr-0 text-center pb-5 pt-5\\\"}, \\\"id\\\": \\\"fe08c99a-cbe6-4e19-b334-19ce8174577d\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h3><b>Core Model</b></h3><p>First release: March 26, 2020; Last update: April 1, 2020</p><h3><b>nanoHUB app</b></h3><p>(First release: March 26, 2020)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Core Model\\\", \\\"button_link\\\": \\\"https://github.com/pc4covid19/COVID19/tree/0.1.3\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}, {\\\"button_text\\\": \\\"nano Hub\\\", \\\"button_link\\\": \\\"http://dx.doi.org/doi:10.21981/19BB-HM69\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}, {\\\"button_text\\\": \\\"Preprint\\\", \\\"button_link\\\": \\\"https://www.biorxiv.org/content/10.1101/2020.04.02.019075v1\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success mt-1\\\"}], \\\"custom_class\\\": \\\"container col-2 borderless-card pt-5 px-0 mx-3\\\"}, \\\"id\\\": \\\"d5b26971-55e0-4baf-9128-40919e149dff\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h4></h4><p></p><embed alt=\\\\\\\"v2 pro\\\\\\\" embedtype=\\\\\\\"image\\\\\\\" format=\\\\\\\"fullwidth\\\\\\\" id=\\\\\\\"34\\\\\\\"/><p></p><p></p><h4>v2 prototype</h4><p>(April 2, 2020-present)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [], \\\"custom_class\\\": \\\"container col-3 ml-5 pl-0 mr-0 text-center pb-5 pt-5\\\"}, \\\"id\\\": \\\"388f2593-f3e0-4d41-8380-289aa4ff4fba\\\"}, {\\\"type\\\": \\\"bootstrap_card\\\", \\\"value\\\": {\\\"card_width\\\": null, \\\"is_card_img\\\": false, \\\"is_card_img_overlay\\\": false, \\\"card_img\\\": null, \\\"card_img_width\\\": null, \\\"card_img_height\\\": null, \\\"card_title\\\": \\\"\\\", \\\"card_text\\\": \\\"<h3><b>Core Model</b></h3><p>(First release: April 9, 2020; Last update: April 10, 2020)</p><h3><b>nanoHUB app</b></h3><p>(First release: April 11, 2020)</p>\\\", \\\"card_bg_color\\\": \\\"\\\", \\\"card_text_color\\\": \\\"\\\", \\\"buttons\\\": [{\\\"button_text\\\": \\\"Core Model\\\", \\\"button_link\\\": \\\"https://github.com/pc4covid19/COVID19/releases/tag/0.2.1\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}, {\\\"button_text\\\": \\\"nano Hub\\\", \\\"button_link\\\": \\\"http://dx.doi.org/doi:10.21981/J6SP-J909\\\", \\\"button_color\\\": \\\"\\\", \\\"button_size\\\": \\\"\\\", \\\"custom_class\\\": \\\"btn-success btn-theme-green\\\"}], \\\"custom_class\\\": \\\"container col-2 borderless-card pt-5 px-0 mx-3\\\"}, \\\"id\\\": \\\"9f9867e2-03cf-4faf-b37a-9d02ec87d012\\\"}]\", \"page\": 3}]}",
+        "approved_go_live_at": null
+    }
+},
+{
+    "model": "wagtailcore.grouppagepermission",
+    "pk": 1,
+    "fields": {
+        "group": [
+            "Moderators"
+        ],
+        "page": 1,
+        "permission_type": "add"
+    }
+},
+{
+    "model": "wagtailcore.grouppagepermission",
+    "pk": 2,
+    "fields": {
+        "group": [
+            "Moderators"
+        ],
+        "page": 1,
+        "permission_type": "edit"
+    }
+},
+{
+    "model": "wagtailcore.grouppagepermission",
+    "pk": 3,
+    "fields": {
+        "group": [
+            "Moderators"
+        ],
+        "page": 1,
+        "permission_type": "publish"
+    }
+},
+{
+    "model": "wagtailcore.grouppagepermission",
+    "pk": 4,
+    "fields": {
+        "group": [
+            "Editors"
+        ],
+        "page": 1,
+        "permission_type": "add"
+    }
+},
+{
+    "model": "wagtailcore.grouppagepermission",
+    "pk": 5,
+    "fields": {
+        "group": [
+            "Editors"
+        ],
+        "page": 1,
+        "permission_type": "edit"
+    }
+},
+{
+    "model": "wagtailcore.grouppagepermission",
+    "pk": 6,
+    "fields": {
+        "group": [
+            "Moderators"
+        ],
+        "page": 1,
+        "permission_type": "lock"
+    }
+},
+{
+    "model": "wagtailcore.collection",
+    "pk": 1,
+    "fields": {
+        "path": "0001",
+        "depth": 1,
+        "numchild": 0,
+        "name": "Root"
+    }
+},
+{
+    "model": "wagtailcore.groupcollectionpermission",
+    "pk": 1,
+    "fields": {
+        "group": [
+            "Editors"
+        ],
+        "collection": 1,
+        "permission": [
+            "add_image",
+            "wagtailimages",
+            "image"
+        ]
+    }
+},
+{
+    "model": "wagtailcore.groupcollectionpermission",
+    "pk": 2,
+    "fields": {
+        "group": [
+            "Moderators"
+        ],
+        "collection": 1,
+        "permission": [
+            "add_image",
+            "wagtailimages",
+            "image"
+        ]
+    }
+},
+{
+    "model": "wagtailcore.groupcollectionpermission",
+    "pk": 3,
+    "fields": {
+        "group": [
+            "Editors"
+        ],
+        "collection": 1,
+        "permission": [
+            "change_image",
+            "wagtailimages",
+            "image"
+        ]
+    }
+},
+{
+    "model": "wagtailcore.groupcollectionpermission",
+    "pk": 4,
+    "fields": {
+        "group": [
+            "Moderators"
+        ],
+        "collection": 1,
+        "permission": [
+            "change_image",
+            "wagtailimages",
+            "image"
+        ]
+    }
+},
+{
+    "model": "wagtailcore.groupcollectionpermission",
+    "pk": 5,
+    "fields": {
+        "group": [
+            "Editors"
+        ],
+        "collection": 1,
+        "permission": [
+            "add_document",
+            "wagtaildocs",
+            "document"
+        ]
+    }
+},
+{
+    "model": "wagtailcore.groupcollectionpermission",
+    "pk": 6,
+    "fields": {
+        "group": [
+            "Moderators"
+        ],
+        "collection": 1,
+        "permission": [
+            "add_document",
+            "wagtaildocs",
+            "document"
+        ]
+    }
+},
+{
+    "model": "wagtailcore.groupcollectionpermission",
+    "pk": 7,
+    "fields": {
+        "group": [
+            "Editors"
+        ],
+        "collection": 1,
+        "permission": [
+            "change_document",
+            "wagtaildocs",
+            "document"
+        ]
+    }
+},
+{
+    "model": "wagtailcore.groupcollectionpermission",
+    "pk": 8,
+    "fields": {
+        "group": [
+            "Moderators"
+        ],
+        "collection": 1,
+        "permission": [
+            "change_document",
+            "wagtaildocs",
+            "document"
+        ]
+    }
+},
+{
+    "model": "taggit.tag",
+    "pk": 1,
+    "fields": {
+        "name": "Portal",
+        "slug": "portal"
+    }
+},
+{
+    "model": "taggit.tag",
+    "pk": 2,
+    "fields": {
+        "name": "Image",
+        "slug": "image"
+    }
+},
+{
+    "model": "taggit.tag",
+    "pk": 3,
+    "fields": {
+        "name": "Website",
+        "slug": "website"
+    }
+},
+{
+    "model": "taggit.tag",
+    "pk": 4,
+    "fields": {
+        "name": "Logo",
+        "slug": "logo"
+    }
+},
+{
+    "model": "taggit.tag",
+    "pk": 5,
+    "fields": {
+        "name": "Carousel",
+        "slug": "carousel"
+    }
+},
+{
+    "model": "taggit.tag",
+    "pk": 6,
+    "fields": {
+        "name": "Bigred",
+        "slug": "bigred"
+    }
+},
+{
+    "model": "taggit.tag",
+    "pk": 7,
+    "fields": {
+        "name": "Picture",
+        "slug": "picture"
+    }
+},
+{
+    "model": "taggit.tag",
+    "pk": 8,
+    "fields": {
+        "name": "Marlon",
+        "slug": "marlon"
+    }
+},
+{
+    "model": "taggit.tag",
+    "pk": 9,
+    "fields": {
+        "name": "Suresh",
+        "slug": "suresh"
+    }
+},
+{
+    "model": "taggit.tag",
+    "pk": 10,
+    "fields": {
+        "name": "Marcus",
+        "slug": "marcus"
+    }
+},
+{
+    "model": "taggit.tag",
+    "pk": 11,
+    "fields": {
+        "name": "IU",
+        "slug": "iu"
+    }
+},
+{
+    "model": "taggit.tag",
+    "pk": 12,
+    "fields": {
+        "name": "NSF",
+        "slug": "nsf"
+    }
+},
+{
+    "model": "taggit.tag",
+    "pk": 13,
+    "fields": {
+        "name": "airavata",
+        "slug": "airavata"
+    }
+},
+{
+    "model": "taggit.tag",
+    "pk": 14,
+    "fields": {
+        "name": "logo",
+        "slug": "logo_1"
+    }
+},
+{
+    "model": "taggit.tag",
+    "pk": 15,
+    "fields": {
+        "name": "XSEDE",
+        "slug": "xsede"
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 1,
+    "fields": {
+        "tag": 1,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 2
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 2,
+    "fields": {
+        "tag": 2,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 2
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 3,
+    "fields": {
+        "tag": 3,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 2
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 4,
+    "fields": {
+        "tag": 4,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 2
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 9,
+    "fields": {
+        "tag": 5,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 7
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 10,
+    "fields": {
+        "tag": 5,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 8
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 11,
+    "fields": {
+        "tag": 5,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 9
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 12,
+    "fields": {
+        "tag": 5,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 10
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 13,
+    "fields": {
+        "tag": 4,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 11
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 14,
+    "fields": {
+        "tag": 4,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 12
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 15,
+    "fields": {
+        "tag": 6,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 12
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 16,
+    "fields": {
+        "tag": 4,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 13
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 17,
+    "fields": {
+        "tag": 4,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 14
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 18,
+    "fields": {
+        "tag": 4,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 15
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 19,
+    "fields": {
+        "tag": 8,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 16
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 20,
+    "fields": {
+        "tag": 7,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 16
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 21,
+    "fields": {
+        "tag": 9,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 17
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 22,
+    "fields": {
+        "tag": 7,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 17
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 23,
+    "fields": {
+        "tag": 10,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 18
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 24,
+    "fields": {
+        "tag": 7,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 18
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 25,
+    "fields": {
+        "tag": 11,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 19
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 26,
+    "fields": {
+        "tag": 4,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 19
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 27,
+    "fields": {
+        "tag": 4,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 20
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 28,
+    "fields": {
+        "tag": 12,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 20
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 29,
+    "fields": {
+        "tag": 13,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 21
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 30,
+    "fields": {
+        "tag": 14,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 21
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 31,
+    "fields": {
+        "tag": 4,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 22
+    }
+},
+{
+    "model": "taggit.taggeditem",
+    "pk": 32,
+    "fields": {
+        "tag": 15,
+        "content_type": [
+            "wagtailimages",
+            "image"
+        ],
+        "object_id": 22
+    }
+},
+{
+    "model": "django_airavata_wagtail_base.announcements",
+    "pk": 7,
+    "fields": {
+        "announcement_text": "Some Text",
+        "announcement_link": "https://www.google.com/"
+    }
+},
+{
+    "model": "django_airavata_wagtail_base.navextra",
+    "pk": 1,
+    "fields": {
+        "nav": "[{\"type\": \"nav\", \"value\": {\"custom_class\": \"second-nav\", \"nav_items\": [{\"type\": \"create_account_link\", \"value\": {\"link\": \"/auth/create-account\", \"link_text\": \"Create Account\", \"image\": null, \"icon_class\": \"fas fa-user\", \"show\": \"not-logged-in\", \"horizontal_alignment\": \"push-right\"}, \"id\": \"53ad1e3b-5e3f-4e2c-a485-e7cfed0fb247\"}, {\"type\": \"login_link\", \"value\": {\"link\": \"/auth/login\", \"link_text\": \"Log in\", \"image\": null, \"icon_class\": \"fas fa-sign-in-alt\", \"show\": \"not-logged-in\", \"horizontal_alignment\": \"\"}, \"id\": \"b82e88b6-5a50-4fc9-8833-04bb51cd1d6d\"}, {\"type\": \"dashboard_link\", \"value\": {\"link\": \"/workspace/dashboard\", \"link_text\": \"Go to Dashboard\", \"image\": null, \"icon_class\": \"fas fa-arrow-circle-right\", \"show\": \"logged-in\", \"horizontal_alignment\": \"push-right\"}, \"id\": \"2d863b5d-eefd-4de3-a664-875f9952ce86\"}, {\"type\": \"logout_link\", \"value\": {\"link\": \"/auth/logout\", \"link_text\": \"Logout\", \"image\": null, \"icon_class\": \"fas fa-sign-out-alt\", \"show\": \"logged-in\", \"horizontal_alignment\": \"\"}, \"id\": \"dabc1083-bf2e-4b4d-97f6-30806551eda6\"}]}, \"id\": \"cd88aa57-92fb-4279-8649-1f164a39a44e\"}]"
+    }
+},
+{
+    "model": "django_airavata_wagtail_base.customcss",
+    "pk": 1,
+    "fields": {
+        "css": "[{\"type\": \"css_comment\", \"value\": {\"message\": \"---- Body Styles to remove container padding -----\"}, \"id\": \"6d6eec7d-4d66-42d9-94e4-7855903f0ec4\"}, {\"type\": \"css_block\", \"value\": \".text-light{\\r\\ncolor: #fff;\\r\\n}\\r\\n.borderless-card .card{\\r\\nborder:none !important;\\r\\n}\\r\\n\\r\\n.bg-grey,  .bg-grey .card{\\r\\nbackground-color: #efefef !important;\\r\\n}\\r\\n\\r\\n.btn-theme-green{\\r\\nbackground-color: #0f6f4d;\\r\\ncolor: #FFF;\\r\\nborder-color: #0f6f4d;\\r\\n}\\r\\n\\r\\n.btn-theme-yellow{\\r\\nbackground-color: #fbc41c;\\r\\ncolor: #000;\\r\\nborder-color: #fbc41c;\\r\\n}\\r\\n\\r\\n.theme-gradient {\\r\\n    background: #0083fc !important;\\r\\n    background: -moz-linear-gradient(339deg, #009688 8%, #00796B 71%) !important;\\r\\n    background: -webkit-linear-gradient(339deg, #009688 8%, #00796B 71%) !important;\\r\\n    background: linear-gradient(339deg, #009688 8%, #00796B 71%) !important;\\r\\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='009688', endColorstr='#00796B', GradientType=1) !important;\\r\\n}\\r\\n\\r\\n.theme-header h2{\\r\\n    font-size: 2.5rem;\\r\\n    line-height: 1.6;\\r\\n    width: fit-content;\\r\\n    border-bottom-width: 10%;\\r\\n    border-bottom: 5px solid #007d70;\\r\\n    margin-bottom: 40px;\\r\\n}\\r\\n\\r\\nbody > content > div > div:nth-child(1){\\r\\nbackground-image: url('../../../../../media/images/bg-header.original.jpg');\\r\\n}\\r\\n\\r\\n.theme-footer{\\r\\nbackground-color: rgba(96, 125, 139, 0.2);\\r\\n}\", \"id\": \"ed7ef4fd-22bb-4194-89f9-1737add48fe0\"}, {\"type\": \"css_comment\", \"value\": {\"message\": \"----- Main Navbar Styles ----\"}, \"id\": \"bcc898d0-e0ff-4b79-b11b-515b6bdaefc1\"}, {\"type\": \"css_block\", \"value\": \".main-nav {\\r\\nbackground: #EFEFEF;\\r\\ncolor: #777;\\r\\n}\\r\\n.main-nav a{\\r\\ncolor: #777 !important;\\r\\n}\\r\\n.main-nav a:hover {\\r\\ncolor: #9cb7e2 !important;\\r\\n}\", \"id\": \"655e7de4-7c1c-40de-bfda-702912c8ab3b\"}, {\"type\": \"css_comment\", \"value\": {\"message\": \"---- Main carousel ----\"}, \"id\": \"ea8f256e-b1e9-4da3-bf99-03115c00e193\"}, {\"type\": \"css_block\", \"value\": \".carousel .carousel-inner .carousel-item{\\r\\nwidth: 100%;\\r\\nheight: 750px;\\r\\n}\\r\\n.carousel-caption {\\r\\nbackground: #e8f0ff;\\r\\ncolor: #777;\\r\\n}\", \"id\": \"cd590fbb-f0ab-424f-a460-7fd4af110fa3\"}, {\"type\": \"css_comment\", \"value\": {\"message\": \"---- Scigap Card -----\"}, \"id\": \"00167256-ce31-4abc-ad6a-e898ce862227\"}, {\"type\": \"css_block\", \"value\": \".scigap-card {\\r\\nheight: 500px;\\r\\nz-index: 15;\\r\\n}\", \"id\": \"dd099655-d6f2-4d4b-91f3-f6fe1592627f\"}, {\"type\": \"css_comment\", \"value\": {\"message\": \"----Embed Video 1----\"}, \"id\": \"2855fa59-f83f-4131-8322-fdc49986496a\"}, {\"type\": \"css_block\", \"value\": \".embedvideo1 > div {\\r\\npadding-bottom: 0px!important;\\r\\n}\\r\\n.embedvideo1 iframe {\\r\\nwidth: 100%;\\r\\nheight: 500px;\\r\\nmargin-top: -35px;\\r\\n}\", \"id\": \"7aca7ff2-83c6-4749-8182-c2e12e8e74c4\"}, {\"type\": \"css_comment\", \"value\": {\"message\": \"---- Big red image alignment ----\"}, \"id\": \"e580704d-7aaf-48c1-9032-705dba2ddc66\"}, {\"type\": \"css_block\", \"value\": \"@media screen and (min-width: 600px) {\\r\\n   .bigred {\\r\\n    margin-top: 195px;\\r\\n  }\\r\\n}\", \"id\": \"f910f9aa-87f9-4dc9-99f6-9e22244d40f9\"}, {\"type\": \"css_comment\", \"value\": {\"message\": \"-----Card Group-----\"}, \"id\": \"0df3c4e1-3ec7-4f30-8770-08ab409d5b69\"}, {\"type\": \"css_block\", \"value\": \".card-group {\\r\\nbackground: #343a40;\\r\\npadding-top: 100px !important;\\r\\npadding-bottom: 100px !important;\\r\\n}\\r\\n.card-group > .card {\\r\\nborder: none;\\r\\n}\", \"id\": \"aebb11ed-f922-438d-b5e6-dc8541459335\"}, {\"type\": \"css_comment\", \"value\": {\"message\": \"---- Hero Text----\"}, \"id\": \"0c2fec88-064a-46aa-a380-0b5ab1556281\"}, {\"type\": \"css_block\", \"value\": \".hero-text {\\r\\nbackground: #EFEFEF;\\r\\ncolor: #777;\\r\\npadding-left: 50px;\\r\\npadding-right: 50px;\\r\\n}\", \"id\": \"88409537-8a25-42b5-a636-e293b82edd70\"}, {\"type\": \"css_comment\", \"value\": {\"message\": \"---- Contact Media Objects -----\"}, \"id\": \"6adb6600-711d-4591-9cb8-98af4794054d\"}, {\"type\": \"css_block\", \"value\": \".contact-media {\\r\\nbackground: #343a40 !important;\\r\\nmargin-left: auto;\\r\\nmargin-right: auto;\\r\\npadding-left: auto;\\r\\npadding-right: auto;\\r\\n}\\r\\n@media screen and (min-width: 600px) {\\r\\n  .contact-media {\\r\\n    padding-left: 200px !important;\\r\\n    padding-right: 200px !important;\\r\\n  }\\r\\n}\\r\\n.contact-media img {\\r\\nborder-radius: 50%;\\r\\n}\\r\\n.contact-media img:hover {\\r\\nborder: 2px solid #EFEFEF;\\r\\n}\\r\\n.contact-media a {\\r\\ntext-decoration: none;\\r\\ncolor: #d6edc2;\\r\\n}\", \"id\": \"f1ae714b-eec6-4bcc-be66-f4c1feb82952\"}, {\"type\": \"css_comment\", \"value\": {\"message\": \"---- Nav extra styling ----\"}, \"id\": \"669f7121-bbc7-45da-b09b-c783a2ff12eb\"}, {\"type\": \"css_block\", \"value\": \".second-nav {\\r\\n  background-color: #343a40;\\r\\n}\\r\\n.second-nav a {\\r\\n  color: white;\\r\\n}\", \"id\": \"fca46420-21ec-436c-b5fc-9d0d1dd40995\"}]"
+    }
+},
+{
+    "model": "django_airavata_wagtail_base.footertext",
+    "pk": 1,
+    "fields": {
+        "footer": "[{\"type\": \"horizontal_rule\", \"value\": {\"thickness\": 5, \"bg_color\": \"#28a745\", \"custom_class\": \"col-md-12 p-0 m-0\"}, \"id\": \"8d65d422-850a-431a-b3d5-caea3626f1ee\"}, {\"type\": \"paragraph_block\", \"value\": {\"custom_class\": \"container col-3 py-5\", \"body\": \"<h3><b>PhysiCell</b></h3><p>PhysiCell aims to provide a robust, scalable code for simulating large systems of cells in 3-D tissues on standard desktop computers.</p>\"}, \"id\": \"cf8ff27a-f8b2-460a-b0b8-03e5cbf464fd\"}, {\"type\": \"paragraph_block\", \"value\": {\"custom_class\": \"container col-3 py-5\", \"body\": \"<h3><b>Citation</b></h3><p>PhysiCell was published after extensive peer review in PLoS Computational Biology. Please cite:</p><p>[1] A. Ghaffarizadeh, R. Heiland, S.H. Friedman, S.M. Mumenthaler, and P. Macklin, PhysiCell: an open source physics-based cell simulator for 3-D multicellular systems, PLoS Comput. Biol. 14(2): e1005991, 2018. DOI: <a href=\\\"http://dx.doi.org/10.1371/journal.pcbi.1005991\\\">10.1371/journal.pcbi.1005991</a>.</p><p></p><p><a href=\\\"https://drive.google.com/uc?export=download&amp;id=1mXXmNj3BGMgJC4ysJV8Mab263RU0UBtq\\\">BIBITEX</a>   |     <a href=\\\"https://drive.google.com/uc?export=download&amp;id=1rSrWBM29h92LX1LSGlHizmH3lQ9ZFT3N\\\">END NOTE</a></p>\"}, \"id\": \"70ff1cb5-c8dc-4468-bb99-a07649fb9bab\"}, {\"type\": \"paragraph_block\", \"value\": {\"custom_class\": \"container col-3 py-5\", \"body\": \"<h3><b>Licensing</b></h3><p>PhysiCell is licensed under the <a href=\\\"https://opensource.org/licenses/BSD-3-Clause\\\"><b>(3-Clause) BSD License</b></a>. It is GPL v2 and v3 compatible, and suitable for commercial use in many circumstances.</p><p>PhysiCell is an academic and scientific code, and it should not be used as the basis for individual medical decisions. Always consult your physician when making medical decisions.</p>\"}, \"id\": \"cb612591-ed07-4c18-8d0c-38a45f82ff78\"}]"
+    }
+},
+{
+    "model": "django_airavata_wagtail_base.navbar",
+    "pk": 1,
+    "fields": {
+        "logo": 35,
+        "logo_redirect_link": "/",
+        "logo_with_text": "yes",
+        "logo_width": 50,
+        "logo_height": 50,
+        "logo_text": "PhysiCell",
+        "logo_text_color": "#000",
+        "logo_text_size": 27
+    }
+},
+{
+    "model": "django_airavata_wagtail_base.rowblankpagerelation",
+    "pk": 1,
+    "fields": {
+        "sort_order": 0,
+        "body": "[{\"type\": \"bootstrap_carousel\", \"value\": {\"c_image1\": 9, \"c_image1_title\": \"Welcome to Apache Airavata Gateway Portal\", \"c_image1_body\": \"Apache Airavata will help you compose, manage and execute complex workflows\", \"c_image2\": 10, \"c_image2_title\": \"Projects\", \"c_image2_body\": \"You can create custom projects with custom inputs\", \"c_image3\": 7, \"c_image3_title\": \"Experiments\", \"c_image3_body\": \"You can create experiment with certain configuration and manage them at one place.\", \"c_image4\": 8, \"c_image4_title\": \"Groups\", \"c_image4_body\": \"You can form groups of people for a project or experiment\", \"c_image5\": null, \"c_image5_title\": \"\", \"c_image5_body\": \"\", \"custom_class\": \"main-carousel\"}, \"id\": \"9668e20c-4fc6-48d7-930f-5db18764aef9\"}]",
+        "page": 3
+    }
+},
+{
+    "model": "django_airavata_wagtail_base.rowblankpagerelation",
+    "pk": 2,
+    "fields": {
+        "sort_order": 1,
+        "body": "[{\"type\": \"bootstrap_jumbotron\", \"value\": {\"title\": \"Django Gateway with Airavata\", \"body\": \"<p>PGA is a science gateway built with the Airavata API. You can reference PGA as you integrate Airavata into your own gateway, or you can create your gateway on top of PGA by cloning it at the link below. PGA is known to work well in the Chrome, Firefox, and Internet Explorer browsers.</p>\", \"button_text\": \"Learn More\", \"button_link\": \"https://cwiki.apache.org/confluence/display/AIRAVATA/PEARC+2017+Tutorials\", \"button_color\": \"btn-primary\", \"button_size\": \"btn-lg\", \"custom_class\": \"col-md-8 p-5\"}, \"id\": \"de95c672-6bcc-45fe-87fa-393d1b3b33fa\"}, {\"type\": \"bootstrap_card\", \"value\": {\"card_width\": null, \"is_card_img\": true, \"is_card_img_overlay\": false, \"card_img\": 11, \"card_img_width\": 350, \"card_img_height\": 125, \"card_title\": \"\", \"card_text\": \"<p>SciGaP is a hosted service with a public API that science gateways can use to manage applications and workflows running on remote supercomputers, as well as other services. Gateway developers can thus concentrate their efforts on building their scientific communities and not worry about operations.</p><p>Science Gateway Platform as a Service (SciGaP) provides application programmer interfaces (APIs) to hosted generic infrastructure services that can be used by domain science communities to create Science Gateways.</p>\", \"card_bg_color\": \"bg-light\", \"card_text_color\": \"text-dark\", \"buttons\": [], \"custom_class\": \"col-md-4 scigap-card\"}, \"id\": \"b111eef3-22da-41d8-b93a-4d95443ea93f\"}]",
+        "page": 3
+    }
+},
+{
+    "model": "django_airavata_wagtail_base.rowblankpagerelation",
+    "pk": 3,
+    "fields": {
+        "sort_order": 2,
+        "body": "[{\"type\": \"embed_block\", \"value\": {\"embed\": \"https://www.youtube.com/watch?v=BUsL-IxPquA\", \"custom_class\": \"col-md-8 embedvideo1\"}, \"id\": \"5f8f0ac5-287f-4df7-b4a8-d8b6b646ac39\"}, {\"type\": \"image_block\", \"value\": {\"image\": 12, \"caption\": \"\", \"width\": \"100%\", \"height\": null, \"redirect_url\": \"\", \"custom_class\": \"col-md-4 bigred\"}, \"id\": \"79f5b79c-c259-4ac2-b41f-a821796d7cf0\"}]",
+        "page": 3
+    }
+},
+{
+    "model": "django_airavata_wagtail_base.rowblankpagerelation",
+    "pk": 4,
+    "fields": {
+        "sort_order": 3,
+        "body": "[{\"type\": \"bootstrap_card\", \"value\": {\"card_width\": 0, \"is_card_img\": true, \"is_card_img_overlay\": false, \"card_img\": 14, \"card_img_width\": 270, \"card_img_height\": 200, \"card_title\": \"Shield\", \"card_text\": \"<p>Shield from complexity<br/> of resources</p>\", \"card_bg_color\": \"bg-dark\", \"card_text_color\": \"text-light\", \"buttons\": [], \"custom_class\": \"col-md-4 card-group p-5\"}, \"id\": \"22a7cc14-7a02-4320-8d1e-b0cab2861726\"}, {\"type\": \"bootstrap_card\", \"value\": {\"card_width\": 0, \"is_card_img\": true, \"is_card_img_overlay\": false, \"card_img\": 13, \"card_img_width\": 270, \"card_img_height\": 200, \"card_title\": \"Fast\", \"card_text\": \"<p>Accelerate scientific<br/>discovery</p>\", \"card_bg_color\": \"bg-dark\", \"card_text_color\": \"text-light\", \"buttons\": [], \"custom_class\": \"col-md-4 card-group p-5\"}, \"id\": \"14bb7667-eeb1-40f8-bf77-8d479d5cc6db\"}, {\"type\": \"bootstrap_card\", \"value\": {\"card_width\": 0, \"is_card_img\": true, \"is_card_img_overlay\": false, \"card_img\": 15, \"card_img_width\": 270, \"card_img_height\": 200, \"card_title\": \"Distributed\", \"card_text\": \"<p>Access distributed<br/>data resources</p>\", \"card_bg_color\": \"bg-dark\", \"card_text_color\": \"text-light\", \"buttons\": [], \"custom_class\": \"col-md-4 card-group p-5\"}, \"id\": \"31d2a4d2-1e78-454e-a5bd-41e9bd43f428\"}]",
+        "page": 3
+    }
+},
+{
+    "model": "django_airavata_wagtail_base.rowblankpagerelation",
+    "pk": 5,
+    "fields": {
+        "sort_order": 4,
+        "body": "[{\"type\": \"heading_block\", \"value\": {\"heading_text\": \"Science Gateway Research Team\", \"size\": \"h1\", \"custom_class\": \"col-md-12 mx-auto text-center hero-text p-5\"}, \"id\": \"5cb39cdd-b963-432b-a450-bb7f01392466\"}, {\"type\": \"paragraph_block\", \"value\": {\"custom_class\": \"col-md-12 mx-auto hero-text pb-5 pl-5 pr-5\", \"body\": \"<p>The Science Gateways Research Center researches, develops, and operates science gateways in collaboration with many clients and partners. Contact us for help building science gateways and deploying advanced software cyberinfrastructure for your community.</p>\"}, \"id\": \"1327729a-22a5-4af3-906d-774d372a1d4d\"}]",
+        "page": 3
+    }
+},
+{
+    "model": "django_airavata_wagtail_base.rowblankpagerelation",
+    "pk": 6,
+    "fields": {
+        "sort_order": 5,
+        "body": "[{\"type\": \"placeholder_block\", \"value\": {\"custom_class\": \"col-md-2 hero-text\"}, \"id\": \"542bdb17-6591-4ad0-90d7-518a460f7c98\"}, {\"type\": \"font_awesome_icon_block\", \"value\": {\"icon_tag\": \"fas fa-fighter-jet\", \"icon_size\": 10, \"custom_class\": \"col-md-2 mx-auto hero-text p-3 text-center\"}, \"id\": \"19d64e20-d1fd-4dfa-a6f5-6d86790c1b7e\"}, {\"type\": \"paragraph_block\", \"value\": {\"custom_class\": \"col-md-6 hero-text\", \"body\": \"<h2><b>Mission</b></h2><p>We develop and use open source software to create user tools and environments that help scientific communities do what they could not otherwise do. Cyberinfrastructure software systems must be designed and developed strategically, not just from the requirements of scientists but from deeper understanding of core principles of cloud-scale distributed systems.</p>\"}, \"id\": \"ae624a31-bcf4-4531-ad7a-41f18d11b326\"}, {\"type\": \"placeholder_block\", \"value\": {\"custom_class\": \"col-md-2 hero-text\"}, \"id\": \"e166d0cb-d025-4477-957c-dfeaa4747bb3\"}]",
+        "page": 3
+    }
+},
+{
+    "model": "django_airavata_wagtail_base.rowblankpagerelation",
+    "pk": 7,
+    "fields": {
+        "sort_order": 6,
+        "body": "[{\"type\": \"placeholder_block\", \"value\": {\"custom_class\": \"col-md-2 hero-text pb-5\"}, \"id\": \"55c15d24-e5f2-4c50-a843-2699e3917c4c\"}, {\"type\": \"font_awesome_icon_block\", \"value\": {\"icon_tag\": \"fas fa-dollar-sign\", \"icon_size\": 10, \"custom_class\": \"col-md-2 p-3 hero-text text-center pb-5\"}, \"id\": \"8ac1c135-ac39-4844-bc6b-76053fdf24f2\"}, {\"type\": \"paragraph_block\", \"value\": {\"custom_class\": \"col-md-6 hero-text pb-5\", \"body\": \"<h2><b>Values</b></h2><p>The Science Gateways Research Center\\u2019s core principle is that producing world-class eScience systems requires a cooperative balance between understanding the needs and goals of scientific collaborators, undertaking core eScience research ourselves, and understanding how to operate science gateway software at scale. Open community software that follows the Apache Software Foundation principles is central to this mission.<br/></p>\"}, \"id\": \"c6a179b4-0ab8-4745-b86f-0d84a87da424\"}, {\"type\": \"placeholder_block\", \"value\": {\"custom_class\": \"col-md-2 hero-text pb-5\"}, \"id\": \"c01362d8-7434-4d88-857c-46c6b937d603\"}]",
+        "page": 3
+    }
+},
+{
+    "model": "django_airavata_wagtail_base.rowblankpagerelation",
+    "pk": 8,
+    "fields": {
+        "sort_order": 7,
+        "body": "[{\"type\": \"heading_block\", \"value\": {\"heading_text\": \"Contact Us\", \"size\": \"h1\", \"custom_class\": \"col-md-12 text-center bg-dark pt-5\"}, \"id\": \"eaed8b62-9bcb-49ae-8a52-ddb9e8742a65\"}, {\"type\": \"bootstrap_media_object\", \"value\": {\"media_img\": 16, \"media_img_alt\": \"marlon\", \"media_img_width\": 100, \"media_img_height\": 100, \"heading_text\": \"Marlon Pierce\", \"body_text\": \"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation<br/><a href=\\\"mailto:marpierc@iu.edu\\\">E-Mail</a> | <a href=\\\"https://www.google.com\\\">Website</a></p>\", \"custom_class\": \"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\"}, \"id\": \"ed11937b-7340-44bd-a8a7-c53964f1b68a\"}]",
+        "page": 3
+    }
+},
+{
+    "model": "django_airavata_wagtail_base.rowblankpagerelation",
+    "pk": 9,
+    "fields": {
+        "sort_order": 8,
+        "body": "[{\"type\": \"bootstrap_media_object\", \"value\": {\"media_img\": 17, \"media_img_alt\": \"Suresh\", \"media_img_width\": 100, \"media_img_height\": 100, \"heading_text\": \"Suresh Marru\", \"body_text\": \"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation<br/><a href=\\\"mailto:smarru@iu.edu\\\">E-Mail</a> | <a href=\\\"https://www.google.com\\\">Website</a></p>\", \"custom_class\": \"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\"}, \"id\": \"779e1820-8721-4ef6-b728-7963fa634a60\"}]",
+        "page": 3
+    }
+},
+{
+    "model": "django_airavata_wagtail_base.rowblankpagerelation",
+    "pk": 10,
+    "fields": {
+        "sort_order": 9,
+        "body": "[{\"type\": \"bootstrap_media_object\", \"value\": {\"media_img\": 18, \"media_img_alt\": \"Marcus\", \"media_img_width\": 100, \"media_img_height\": 100, \"heading_text\": \"Marcus Christie\", \"body_text\": \"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad<br/><a href=\\\"mailto:machrist@iu.edu\\\">E-Mail</a> | <a href=\\\"https://seagrid.org/\\\">Website</a></p>\", \"custom_class\": \"col-md-12 mx-auto bg-dark  text-light p-5 contact-media\"}, \"id\": \"232360b7-e4bd-4f30-86f7-2044e28eb5c9\"}]",
+        "page": 3
+    }
+},
+{
+    "model": "django_airavata_wagtail_base.blankpage",
+    "pk": 3,
+    "fields": {
+        "show_navbar": "yes",
+        "show_nav_extra": "yes",
+        "show_footer": "yes",
+        "show_announcements": "no"
+    }
+},
+{
+    "model": "django_airavata_wagtail_base.blankpage",
+    "pk": 6,
+    "fields": {
+        "show_navbar": "yes",
+        "show_nav_extra": "yes",
+        "show_footer": "yes",
+        "show_announcements": "yes"
+    }
+}
+]
diff --git a/django_airavata/wagtailapps/base/management/commands/set_wagtail_site.py b/django_airavata/wagtailapps/base/management/commands/set_wagtail_site.py
index 84db3a0..914858b 100644
--- a/django_airavata/wagtailapps/base/management/commands/set_wagtail_site.py
+++ b/django_airavata/wagtailapps/base/management/commands/set_wagtail_site.py
@@ -13,7 +13,8 @@
 class Command(BaseCommand):
 
     def handle(self, **options):
-        hostname = settings.ALLOWED_HOSTS[0]
+        hostname = settings.ALLOWED_HOSTS[0] if len(
+            settings.ALLOWED_HOSTS) > 0 else "localhost"
         if not Site.objects.filter(hostname=hostname,
                                    is_default_site=True).exists():
             with transaction.atomic():
diff --git a/django_airavata/wagtailapps/base/migrations/0023_rowblankpagerelation_container.py b/django_airavata/wagtailapps/base/migrations/0023_rowblankpagerelation_container.py
new file mode 100644
index 0000000..6245de8
--- /dev/null
+++ b/django_airavata/wagtailapps/base/migrations/0023_rowblankpagerelation_container.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.28 on 2020-05-04 14:30
+from __future__ import unicode_literals
+
+from django.db import migrations
+import wagtail.core.blocks
+import wagtail.core.fields
+import wagtail.images.blocks
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('django_airavata_wagtail_base', '0022_auto_20191106_1542'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='rowblankpagerelation',
+            name='container',
+            field=wagtail.core.fields.StreamField((('full_width_container', wagtail.core.blocks.StructBlock((('inline_styles', wagtail.core.blocks.TextBlock(blank=True, help_text='Apply inline CSS styles to container wrapper.', required=False)), ('custom_classes', wagtail.core.blocks.CharBlock(help_text='Apply custom CSS classes to container wrapper. You can define CSS classes in a Custom CSS snippet.', required=False)), ('background_image', wagtail.images.blocks.ImageChooserBlock(help_text='Apply background image to container wrapper.', required=False))))), ('max_width_container', wagtail.core.blocks.StructBlock((('inline_styles', wagtail.core.blocks.TextBlock(blank=True, help_text='Apply inline CSS styles to container wrapper.', required=False)), ('custom_classes', wagtail.core.blocks.CharBlock(help_text='Apply custom CSS classes to container wrapper. You can define CSS classes in a Custom CSS snippet.', required=False)), ('background_image', wagtail.images.blocks.ImageChooserBlock(help_text='Apply background image to container wrapper.', required=False)))))), blank=True, help_text='(Optional) Create a new Bootstrap container for this and following rows.', null=True),
+        ),
+    ]
diff --git a/django_airavata/wagtailapps/base/migrations/0024_auto_20200624_1925.py b/django_airavata/wagtailapps/base/migrations/0024_auto_20200624_1925.py
new file mode 100644
index 0000000..bc4064b
--- /dev/null
+++ b/django_airavata/wagtailapps/base/migrations/0024_auto_20200624_1925.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.21 on 2020-06-24 19:25
+from __future__ import unicode_literals
+
+from django.db import migrations
+import wagtail.core.blocks
+import wagtail.core.fields
+import wagtail.documents.blocks
+import wagtail.embeds.blocks
+import wagtail.images.blocks
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('django_airavata_wagtail_base', '0023_rowblankpagerelation_container'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='cybergatewayhomepage',
+            name='contact',
+            field=wagtail.core.fields.StreamField((('paragraph_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)), ('body', wagtail.core.blocks.RichTextBlock())))), ('image_block', wagtail.core.blocks.StructBlock((('image', wagtail.images.blocks.ImageChooserBlock(required=True)), ('caption', wagtail.core.blocks.CharBlock(required=False)), ('width', wagtail.core.blocks.CharBlock(required=False)), ('height', wagtail.core.blocks.IntegerBlock(required=False)), ('redirect_url', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a redirect link on clicking the image', null=True, required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('embed_block', wagtail.core.blocks.StructBlock((('embed', wagtail.embeds.blocks.EmbedBlock()), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('heading_block', wagtail.core.blocks.StructBlock((('heading_text', wagtail.core.blocks.CharBlock(classname='title', required=True)), ('size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'Select a header size'), ('h1', 'H1'), ('h2', 'H2'), ('h3', 'H3'), ('h4', 'H4')], required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_jumbotron', wagtail.core.blocks.StructBlock((('title', wagtail.core.blocks.TextBlock()), ('body', wagtail.core.blocks.RichTextBlock()), ('button_text', wagtail.core.blocks.TextBlock(required=False)), ('button_link', wagtail.core.blocks.TextBlock(required=False)), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_alert', wagtail.core.blocks.StructBlock((('alert_text', wagtail.core.blocks.TextBlock()), ('alert_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('alert-primary', 'DEFAULT'), ('alert-secondary', 'GREY'), ('alert-success', 'GREEN'), ('alert-danger', 'RED'), ('alert-warning', 'ORANGE'), ('alert-dark', 'DARK'), ('alert-light', 'LIGHT')], help_text='select a background color', required=False)), ('is_link', wagtail.core.blocks.BooleanBlock(required=False)), ('alert_link', wagtail.core.blocks.TextBlock(required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_button', wagtail.core.blocks.StructBlock((('button_text', wagtail.core.blocks.TextBlock()), ('button_link', wagtail.core.blocks.TextBlock()), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_card', wagtail.core.blocks.StructBlock((('card_width', wagtail.core.blocks.IntegerBlock(blank=True, help_text='18 works best for card', required=False)), ('is_card_img', wagtail.core.blocks.BooleanBlock(required=False)), ('is_card_img_overlay', wagtail.core.blocks.BooleanBlock(default=False, help_text='Use image as background for card', label='Image Overlay?', required=False)), ('card_img', wagtail.images.blocks.ImageChooserBlock(required=False)), ('card_img_width', wagtail.core.blocks.IntegerBlock(help_text='provide an image width', required=False)), ('card_img_height', wagtail.core.blocks.IntegerBlock(help_text='provide an image height', required=False)), ('card_title', wagtail.core.blocks.TextBlock(blank=True, null=True, required=False)), ('card_text', wagtail.core.blocks.RichTextBlock(blank=True, null=True, required=False)), ('card_bg_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('bg-primary', 'DEFAULT'), ('bg-secondary', 'GREY'), ('bg-success', 'GREEN'), ('bg-danger', 'RED'), ('bg-warning', 'ORANGE'), ('bg-dark', 'DARK'), ('bg-light', 'LIGHT')], help_text='select a background color', required=False)), ('card_text_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('text-primary', 'DEFAULT'), ('text-secondary', 'GREY'), ('text-success', 'GREEN'), ('text-danger', 'RED'), ('text-warning', 'ORANGE'), ('text-dark', 'DARK'), ('text-light', 'LIGHT')], help_text='select a text color', required=False)), ('buttons', wagtail.core.blocks.ListBlock(wagtail.core.blocks.StructBlock((('button_text', wagtail.core.blocks.TextBlock()), ('button_link', wagtail.core.blocks.TextBlock()), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))), required=False), default=[])), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_carousel', wagtail.core.blocks.StructBlock((('interval', wagtail.core.blocks.IntegerBlock(default=2000, help_text='\n    The amount of time to delay between automatically cycling an item. If\n    false, carousel will not automatically cycle.\n    ')), ('c_image1', wagtail.images.blocks.ImageChooserBlock(required=True)), ('c_image1_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 1', required=False)), ('c_image1_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 1', required=False)), ('c_image2', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image2_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 2', required=False)), ('c_image2_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 2', required=False)), ('c_image3', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image3_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 3', required=False)), ('c_image3_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 3', required=False)), ('c_image4', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image4_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 4', required=False)), ('c_image4_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 4', required=False)), ('c_image5', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image5_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 5', required=False)), ('c_image5_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 5', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_well', wagtail.core.blocks.StructBlock((('message', wagtail.core.blocks.RichTextBlock(help_text='Enter some message inside well')), ('well_bg_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('bg-primary', 'DEFAULT'), ('bg-secondary', 'GREY'), ('bg-success', 'GREEN'), ('bg-danger', 'RED'), ('bg-warning', 'ORANGE'), ('bg-dark', 'DARK'), ('bg-light', 'LIGHT')], help_text='select a background color', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('horizontal_rule', wagtail.core.blocks.StructBlock((('thickness', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter a thickness integer value. Eg(10)', required=False)), ('bg_color', wagtail.core.blocks.TextBlock(help_text='Enter a hexcode color for the rule Eg(#000000)', required=True)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_media_object', wagtail.core.blocks.StructBlock((('media_img', wagtail.images.blocks.ImageChooserBlock(required=True)), ('media_img_alt', wagtail.core.blocks.TextBlock(required=True)), ('media_img_width', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter an image width as an integer value. Eg(50)', required=False)), ('media_img_height', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter an image height as an integer value Eg(50)', required=False)), ('heading_text', wagtail.core.blocks.TextBlock(blank=True, help_text='enter some heading text for media object', required=False)), ('body_text', wagtail.core.blocks.RichTextBlock(help_text='Enter some message for the media object', required=True)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('placeholder_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)),))), ('font_awesome_icon_block', wagtail.core.blocks.StructBlock((('icon_tag', wagtail.core.blocks.TextBlock(blank=False, help_text='Provide a font awesome icon class text', required=True)), ('icon_size', wagtail.core.blocks.IntegerBlock(blank=True, default=2, help_text='Provide a icon size in number type', null=True, required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('iu_footer_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)), ('footer_links', wagtail.core.blocks.RichTextBlock())))), ('bootstrap_embed_video', wagtail.core.blocks.StructBlock((('video', wagtail.documents.blocks.DocumentChooserBlock(required=True)), ('aspect_ratio', wagtail.core.blocks.ChoiceBlock(choices=[('21by9', '21 x 9'), ('16by9', '16 x 9'), ('4by3', '4 x 3'), ('1by1', '1 x 1')], help_text='Aspect ratio')), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)))))), blank=True, null=True, verbose_name='Contact Info Block'),
+        ),
+        migrations.AlterField(
+            model_name='cybergatewayhomepage',
+            name='footer',
+            field=wagtail.core.fields.StreamField((('paragraph_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)), ('body', wagtail.core.blocks.RichTextBlock())))), ('image_block', wagtail.core.blocks.StructBlock((('image', wagtail.images.blocks.ImageChooserBlock(required=True)), ('caption', wagtail.core.blocks.CharBlock(required=False)), ('width', wagtail.core.blocks.CharBlock(required=False)), ('height', wagtail.core.blocks.IntegerBlock(required=False)), ('redirect_url', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a redirect link on clicking the image', null=True, required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('embed_block', wagtail.core.blocks.StructBlock((('embed', wagtail.embeds.blocks.EmbedBlock()), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('heading_block', wagtail.core.blocks.StructBlock((('heading_text', wagtail.core.blocks.CharBlock(classname='title', required=True)), ('size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'Select a header size'), ('h1', 'H1'), ('h2', 'H2'), ('h3', 'H3'), ('h4', 'H4')], required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_jumbotron', wagtail.core.blocks.StructBlock((('title', wagtail.core.blocks.TextBlock()), ('body', wagtail.core.blocks.RichTextBlock()), ('button_text', wagtail.core.blocks.TextBlock(required=False)), ('button_link', wagtail.core.blocks.TextBlock(required=False)), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_alert', wagtail.core.blocks.StructBlock((('alert_text', wagtail.core.blocks.TextBlock()), ('alert_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('alert-primary', 'DEFAULT'), ('alert-secondary', 'GREY'), ('alert-success', 'GREEN'), ('alert-danger', 'RED'), ('alert-warning', 'ORANGE'), ('alert-dark', 'DARK'), ('alert-light', 'LIGHT')], help_text='select a background color', required=False)), ('is_link', wagtail.core.blocks.BooleanBlock(required=False)), ('alert_link', wagtail.core.blocks.TextBlock(required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_button', wagtail.core.blocks.StructBlock((('button_text', wagtail.core.blocks.TextBlock()), ('button_link', wagtail.core.blocks.TextBlock()), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_card', wagtail.core.blocks.StructBlock((('card_width', wagtail.core.blocks.IntegerBlock(blank=True, help_text='18 works best for card', required=False)), ('is_card_img', wagtail.core.blocks.BooleanBlock(required=False)), ('is_card_img_overlay', wagtail.core.blocks.BooleanBlock(default=False, help_text='Use image as background for card', label='Image Overlay?', required=False)), ('card_img', wagtail.images.blocks.ImageChooserBlock(required=False)), ('card_img_width', wagtail.core.blocks.IntegerBlock(help_text='provide an image width', required=False)), ('card_img_height', wagtail.core.blocks.IntegerBlock(help_text='provide an image height', required=False)), ('card_title', wagtail.core.blocks.TextBlock(blank=True, null=True, required=False)), ('card_text', wagtail.core.blocks.RichTextBlock(blank=True, null=True, required=False)), ('card_bg_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('bg-primary', 'DEFAULT'), ('bg-secondary', 'GREY'), ('bg-success', 'GREEN'), ('bg-danger', 'RED'), ('bg-warning', 'ORANGE'), ('bg-dark', 'DARK'), ('bg-light', 'LIGHT')], help_text='select a background color', required=False)), ('card_text_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('text-primary', 'DEFAULT'), ('text-secondary', 'GREY'), ('text-success', 'GREEN'), ('text-danger', 'RED'), ('text-warning', 'ORANGE'), ('text-dark', 'DARK'), ('text-light', 'LIGHT')], help_text='select a text color', required=False)), ('buttons', wagtail.core.blocks.ListBlock(wagtail.core.blocks.StructBlock((('button_text', wagtail.core.blocks.TextBlock()), ('button_link', wagtail.core.blocks.TextBlock()), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))), required=False), default=[])), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_carousel', wagtail.core.blocks.StructBlock((('interval', wagtail.core.blocks.IntegerBlock(default=2000, help_text='\n    The amount of time to delay between automatically cycling an item. If\n    false, carousel will not automatically cycle.\n    ')), ('c_image1', wagtail.images.blocks.ImageChooserBlock(required=True)), ('c_image1_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 1', required=False)), ('c_image1_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 1', required=False)), ('c_image2', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image2_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 2', required=False)), ('c_image2_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 2', required=False)), ('c_image3', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image3_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 3', required=False)), ('c_image3_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 3', required=False)), ('c_image4', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image4_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 4', required=False)), ('c_image4_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 4', required=False)), ('c_image5', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image5_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 5', required=False)), ('c_image5_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 5', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_well', wagtail.core.blocks.StructBlock((('message', wagtail.core.blocks.RichTextBlock(help_text='Enter some message inside well')), ('well_bg_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('bg-primary', 'DEFAULT'), ('bg-secondary', 'GREY'), ('bg-success', 'GREEN'), ('bg-danger', 'RED'), ('bg-warning', 'ORANGE'), ('bg-dark', 'DARK'), ('bg-light', 'LIGHT')], help_text='select a background color', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('horizontal_rule', wagtail.core.blocks.StructBlock((('thickness', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter a thickness integer value. Eg(10)', required=False)), ('bg_color', wagtail.core.blocks.TextBlock(help_text='Enter a hexcode color for the rule Eg(#000000)', required=True)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_media_object', wagtail.core.blocks.StructBlock((('media_img', wagtail.images.blocks.ImageChooserBlock(required=True)), ('media_img_alt', wagtail.core.blocks.TextBlock(required=True)), ('media_img_width', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter an image width as an integer value. Eg(50)', required=False)), ('media_img_height', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter an image height as an integer value Eg(50)', required=False)), ('heading_text', wagtail.core.blocks.TextBlock(blank=True, help_text='enter some heading text for media object', required=False)), ('body_text', wagtail.core.blocks.RichTextBlock(help_text='Enter some message for the media object', required=True)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('placeholder_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)),))), ('font_awesome_icon_block', wagtail.core.blocks.StructBlock((('icon_tag', wagtail.core.blocks.TextBlock(blank=False, help_text='Provide a font awesome icon class text', required=True)), ('icon_size', wagtail.core.blocks.IntegerBlock(blank=True, default=2, help_text='Provide a icon size in number type', null=True, required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('iu_footer_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)), ('footer_links', wagtail.core.blocks.RichTextBlock())))), ('bootstrap_embed_video', wagtail.core.blocks.StructBlock((('video', wagtail.documents.blocks.DocumentChooserBlock(required=True)), ('aspect_ratio', wagtail.core.blocks.ChoiceBlock(choices=[('21by9', '21 x 9'), ('16by9', '16 x 9'), ('4by3', '4 x 3'), ('1by1', '1 x 1')], help_text='Aspect ratio')), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)))))), blank=True, null=True, verbose_name='Footer Content Block'),
+        ),
+        migrations.AlterField(
+            model_name='footertext',
+            name='footer',
+            field=wagtail.core.fields.StreamField((('paragraph_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)), ('body', wagtail.core.blocks.RichTextBlock())))), ('image_block', wagtail.core.blocks.StructBlock((('image', wagtail.images.blocks.ImageChooserBlock(required=True)), ('caption', wagtail.core.blocks.CharBlock(required=False)), ('width', wagtail.core.blocks.CharBlock(required=False)), ('height', wagtail.core.blocks.IntegerBlock(required=False)), ('redirect_url', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a redirect link on clicking the image', null=True, required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('embed_block', wagtail.core.blocks.StructBlock((('embed', wagtail.embeds.blocks.EmbedBlock()), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('heading_block', wagtail.core.blocks.StructBlock((('heading_text', wagtail.core.blocks.CharBlock(classname='title', required=True)), ('size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'Select a header size'), ('h1', 'H1'), ('h2', 'H2'), ('h3', 'H3'), ('h4', 'H4')], required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_jumbotron', wagtail.core.blocks.StructBlock((('title', wagtail.core.blocks.TextBlock()), ('body', wagtail.core.blocks.RichTextBlock()), ('button_text', wagtail.core.blocks.TextBlock(required=False)), ('button_link', wagtail.core.blocks.TextBlock(required=False)), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_alert', wagtail.core.blocks.StructBlock((('alert_text', wagtail.core.blocks.TextBlock()), ('alert_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('alert-primary', 'DEFAULT'), ('alert-secondary', 'GREY'), ('alert-success', 'GREEN'), ('alert-danger', 'RED'), ('alert-warning', 'ORANGE'), ('alert-dark', 'DARK'), ('alert-light', 'LIGHT')], help_text='select a background color', required=False)), ('is_link', wagtail.core.blocks.BooleanBlock(required=False)), ('alert_link', wagtail.core.blocks.TextBlock(required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_button', wagtail.core.blocks.StructBlock((('button_text', wagtail.core.blocks.TextBlock()), ('button_link', wagtail.core.blocks.TextBlock()), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_card', wagtail.core.blocks.StructBlock((('card_width', wagtail.core.blocks.IntegerBlock(blank=True, help_text='18 works best for card', required=False)), ('is_card_img', wagtail.core.blocks.BooleanBlock(required=False)), ('is_card_img_overlay', wagtail.core.blocks.BooleanBlock(default=False, help_text='Use image as background for card', label='Image Overlay?', required=False)), ('card_img', wagtail.images.blocks.ImageChooserBlock(required=False)), ('card_img_width', wagtail.core.blocks.IntegerBlock(help_text='provide an image width', required=False)), ('card_img_height', wagtail.core.blocks.IntegerBlock(help_text='provide an image height', required=False)), ('card_title', wagtail.core.blocks.TextBlock(blank=True, null=True, required=False)), ('card_text', wagtail.core.blocks.RichTextBlock(blank=True, null=True, required=False)), ('card_bg_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('bg-primary', 'DEFAULT'), ('bg-secondary', 'GREY'), ('bg-success', 'GREEN'), ('bg-danger', 'RED'), ('bg-warning', 'ORANGE'), ('bg-dark', 'DARK'), ('bg-light', 'LIGHT')], help_text='select a background color', required=False)), ('card_text_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('text-primary', 'DEFAULT'), ('text-secondary', 'GREY'), ('text-success', 'GREEN'), ('text-danger', 'RED'), ('text-warning', 'ORANGE'), ('text-dark', 'DARK'), ('text-light', 'LIGHT')], help_text='select a text color', required=False)), ('buttons', wagtail.core.blocks.ListBlock(wagtail.core.blocks.StructBlock((('button_text', wagtail.core.blocks.TextBlock()), ('button_link', wagtail.core.blocks.TextBlock()), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))), required=False), default=[])), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_carousel', wagtail.core.blocks.StructBlock((('interval', wagtail.core.blocks.IntegerBlock(default=2000, help_text='\n    The amount of time to delay between automatically cycling an item. If\n    false, carousel will not automatically cycle.\n    ')), ('c_image1', wagtail.images.blocks.ImageChooserBlock(required=True)), ('c_image1_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 1', required=False)), ('c_image1_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 1', required=False)), ('c_image2', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image2_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 2', required=False)), ('c_image2_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 2', required=False)), ('c_image3', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image3_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 3', required=False)), ('c_image3_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 3', required=False)), ('c_image4', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image4_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 4', required=False)), ('c_image4_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 4', required=False)), ('c_image5', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image5_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 5', required=False)), ('c_image5_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 5', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_well', wagtail.core.blocks.StructBlock((('message', wagtail.core.blocks.RichTextBlock(help_text='Enter some message inside well')), ('well_bg_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('bg-primary', 'DEFAULT'), ('bg-secondary', 'GREY'), ('bg-success', 'GREEN'), ('bg-danger', 'RED'), ('bg-warning', 'ORANGE'), ('bg-dark', 'DARK'), ('bg-light', 'LIGHT')], help_text='select a background color', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('horizontal_rule', wagtail.core.blocks.StructBlock((('thickness', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter a thickness integer value. Eg(10)', required=False)), ('bg_color', wagtail.core.blocks.TextBlock(help_text='Enter a hexcode color for the rule Eg(#000000)', required=True)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_media_object', wagtail.core.blocks.StructBlock((('media_img', wagtail.images.blocks.ImageChooserBlock(required=True)), ('media_img_alt', wagtail.core.blocks.TextBlock(required=True)), ('media_img_width', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter an image width as an integer value. Eg(50)', required=False)), ('media_img_height', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter an image height as an integer value Eg(50)', required=False)), ('heading_text', wagtail.core.blocks.TextBlock(blank=True, help_text='enter some heading text for media object', required=False)), ('body_text', wagtail.core.blocks.RichTextBlock(help_text='Enter some message for the media object', required=True)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('placeholder_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)),))), ('font_awesome_icon_block', wagtail.core.blocks.StructBlock((('icon_tag', wagtail.core.blocks.TextBlock(blank=False, help_text='Provide a font awesome icon class text', required=True)), ('icon_size', wagtail.core.blocks.IntegerBlock(blank=True, default=2, help_text='Provide a icon size in number type', null=True, required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('iu_footer_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)), ('footer_links', wagtail.core.blocks.RichTextBlock())))), ('bootstrap_embed_video', wagtail.core.blocks.StructBlock((('video', wagtail.documents.blocks.DocumentChooserBlock(required=True)), ('aspect_ratio', wagtail.core.blocks.ChoiceBlock(choices=[('21by9', '21 x 9'), ('16by9', '16 x 9'), ('4by3', '4 x 3'), ('1by1', '1 x 1')], help_text='Aspect ratio')), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)))))), blank=True, null=True, verbose_name='Footer content block'),
+        ),
+        migrations.AlterField(
+            model_name='homepage',
+            name='body',
+            field=wagtail.core.fields.StreamField((('paragraph_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)), ('body', wagtail.core.blocks.RichTextBlock())))), ('image_block', wagtail.core.blocks.StructBlock((('image', wagtail.images.blocks.ImageChooserBlock(required=True)), ('caption', wagtail.core.blocks.CharBlock(required=False)), ('width', wagtail.core.blocks.CharBlock(required=False)), ('height', wagtail.core.blocks.IntegerBlock(required=False)), ('redirect_url', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a redirect link on clicking the image', null=True, required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('embed_block', wagtail.core.blocks.StructBlock((('embed', wagtail.embeds.blocks.EmbedBlock()), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('heading_block', wagtail.core.blocks.StructBlock((('heading_text', wagtail.core.blocks.CharBlock(classname='title', required=True)), ('size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'Select a header size'), ('h1', 'H1'), ('h2', 'H2'), ('h3', 'H3'), ('h4', 'H4')], required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_jumbotron', wagtail.core.blocks.StructBlock((('title', wagtail.core.blocks.TextBlock()), ('body', wagtail.core.blocks.RichTextBlock()), ('button_text', wagtail.core.blocks.TextBlock(required=False)), ('button_link', wagtail.core.blocks.TextBlock(required=False)), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_alert', wagtail.core.blocks.StructBlock((('alert_text', wagtail.core.blocks.TextBlock()), ('alert_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('alert-primary', 'DEFAULT'), ('alert-secondary', 'GREY'), ('alert-success', 'GREEN'), ('alert-danger', 'RED'), ('alert-warning', 'ORANGE'), ('alert-dark', 'DARK'), ('alert-light', 'LIGHT')], help_text='select a background color', required=False)), ('is_link', wagtail.core.blocks.BooleanBlock(required=False)), ('alert_link', wagtail.core.blocks.TextBlock(required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_button', wagtail.core.blocks.StructBlock((('button_text', wagtail.core.blocks.TextBlock()), ('button_link', wagtail.core.blocks.TextBlock()), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_card', wagtail.core.blocks.StructBlock((('card_width', wagtail.core.blocks.IntegerBlock(blank=True, help_text='18 works best for card', required=False)), ('is_card_img', wagtail.core.blocks.BooleanBlock(required=False)), ('is_card_img_overlay', wagtail.core.blocks.BooleanBlock(default=False, help_text='Use image as background for card', label='Image Overlay?', required=False)), ('card_img', wagtail.images.blocks.ImageChooserBlock(required=False)), ('card_img_width', wagtail.core.blocks.IntegerBlock(help_text='provide an image width', required=False)), ('card_img_height', wagtail.core.blocks.IntegerBlock(help_text='provide an image height', required=False)), ('card_title', wagtail.core.blocks.TextBlock(blank=True, null=True, required=False)), ('card_text', wagtail.core.blocks.RichTextBlock(blank=True, null=True, required=False)), ('card_bg_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('bg-primary', 'DEFAULT'), ('bg-secondary', 'GREY'), ('bg-success', 'GREEN'), ('bg-danger', 'RED'), ('bg-warning', 'ORANGE'), ('bg-dark', 'DARK'), ('bg-light', 'LIGHT')], help_text='select a background color', required=False)), ('card_text_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('text-primary', 'DEFAULT'), ('text-secondary', 'GREY'), ('text-success', 'GREEN'), ('text-danger', 'RED'), ('text-warning', 'ORANGE'), ('text-dark', 'DARK'), ('text-light', 'LIGHT')], help_text='select a text color', required=False)), ('buttons', wagtail.core.blocks.ListBlock(wagtail.core.blocks.StructBlock((('button_text', wagtail.core.blocks.TextBlock()), ('button_link', wagtail.core.blocks.TextBlock()), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))), required=False), default=[])), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_carousel', wagtail.core.blocks.StructBlock((('interval', wagtail.core.blocks.IntegerBlock(default=2000, help_text='\n    The amount of time to delay between automatically cycling an item. If\n    false, carousel will not automatically cycle.\n    ')), ('c_image1', wagtail.images.blocks.ImageChooserBlock(required=True)), ('c_image1_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 1', required=False)), ('c_image1_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 1', required=False)), ('c_image2', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image2_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 2', required=False)), ('c_image2_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 2', required=False)), ('c_image3', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image3_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 3', required=False)), ('c_image3_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 3', required=False)), ('c_image4', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image4_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 4', required=False)), ('c_image4_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 4', required=False)), ('c_image5', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image5_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 5', required=False)), ('c_image5_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 5', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_well', wagtail.core.blocks.StructBlock((('message', wagtail.core.blocks.RichTextBlock(help_text='Enter some message inside well')), ('well_bg_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('bg-primary', 'DEFAULT'), ('bg-secondary', 'GREY'), ('bg-success', 'GREEN'), ('bg-danger', 'RED'), ('bg-warning', 'ORANGE'), ('bg-dark', 'DARK'), ('bg-light', 'LIGHT')], help_text='select a background color', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('horizontal_rule', wagtail.core.blocks.StructBlock((('thickness', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter a thickness integer value. Eg(10)', required=False)), ('bg_color', wagtail.core.blocks.TextBlock(help_text='Enter a hexcode color for the rule Eg(#000000)', required=True)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_media_object', wagtail.core.blocks.StructBlock((('media_img', wagtail.images.blocks.ImageChooserBlock(required=True)), ('media_img_alt', wagtail.core.blocks.TextBlock(required=True)), ('media_img_width', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter an image width as an integer value. Eg(50)', required=False)), ('media_img_height', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter an image height as an integer value Eg(50)', required=False)), ('heading_text', wagtail.core.blocks.TextBlock(blank=True, help_text='enter some heading text for media object', required=False)), ('body_text', wagtail.core.blocks.RichTextBlock(help_text='Enter some message for the media object', required=True)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('placeholder_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)),))), ('font_awesome_icon_block', wagtail.core.blocks.StructBlock((('icon_tag', wagtail.core.blocks.TextBlock(blank=False, help_text='Provide a font awesome icon class text', required=True)), ('icon_size', wagtail.core.blocks.IntegerBlock(blank=True, default=2, help_text='Provide a icon size in number type', null=True, required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('iu_footer_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)), ('footer_links', wagtail.core.blocks.RichTextBlock())))), ('bootstrap_embed_video', wagtail.core.blocks.StructBlock((('video', wagtail.documents.blocks.DocumentChooserBlock(required=True)), ('aspect_ratio', wagtail.core.blocks.ChoiceBlock(choices=[('21by9', '21 x 9'), ('16by9', '16 x 9'), ('4by3', '4 x 3'), ('1by1', '1 x 1')], help_text='Aspect ratio')), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)))))), blank=True, null=True, verbose_name='Home content block'),
+        ),
+        migrations.AlterField(
+            model_name='rowblankpagerelation',
+            name='body',
+            field=wagtail.core.fields.StreamField((('paragraph_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)), ('body', wagtail.core.blocks.RichTextBlock())))), ('image_block', wagtail.core.blocks.StructBlock((('image', wagtail.images.blocks.ImageChooserBlock(required=True)), ('caption', wagtail.core.blocks.CharBlock(required=False)), ('width', wagtail.core.blocks.CharBlock(required=False)), ('height', wagtail.core.blocks.IntegerBlock(required=False)), ('redirect_url', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a redirect link on clicking the image', null=True, required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('embed_block', wagtail.core.blocks.StructBlock((('embed', wagtail.embeds.blocks.EmbedBlock()), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('heading_block', wagtail.core.blocks.StructBlock((('heading_text', wagtail.core.blocks.CharBlock(classname='title', required=True)), ('size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'Select a header size'), ('h1', 'H1'), ('h2', 'H2'), ('h3', 'H3'), ('h4', 'H4')], required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_jumbotron', wagtail.core.blocks.StructBlock((('title', wagtail.core.blocks.TextBlock()), ('body', wagtail.core.blocks.RichTextBlock()), ('button_text', wagtail.core.blocks.TextBlock(required=False)), ('button_link', wagtail.core.blocks.TextBlock(required=False)), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_alert', wagtail.core.blocks.StructBlock((('alert_text', wagtail.core.blocks.TextBlock()), ('alert_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('alert-primary', 'DEFAULT'), ('alert-secondary', 'GREY'), ('alert-success', 'GREEN'), ('alert-danger', 'RED'), ('alert-warning', 'ORANGE'), ('alert-dark', 'DARK'), ('alert-light', 'LIGHT')], help_text='select a background color', required=False)), ('is_link', wagtail.core.blocks.BooleanBlock(required=False)), ('alert_link', wagtail.core.blocks.TextBlock(required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_button', wagtail.core.blocks.StructBlock((('button_text', wagtail.core.blocks.TextBlock()), ('button_link', wagtail.core.blocks.TextBlock()), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_card', wagtail.core.blocks.StructBlock((('card_width', wagtail.core.blocks.IntegerBlock(blank=True, help_text='18 works best for card', required=False)), ('is_card_img', wagtail.core.blocks.BooleanBlock(required=False)), ('is_card_img_overlay', wagtail.core.blocks.BooleanBlock(default=False, help_text='Use image as background for card', label='Image Overlay?', required=False)), ('card_img', wagtail.images.blocks.ImageChooserBlock(required=False)), ('card_img_width', wagtail.core.blocks.IntegerBlock(help_text='provide an image width', required=False)), ('card_img_height', wagtail.core.blocks.IntegerBlock(help_text='provide an image height', required=False)), ('card_title', wagtail.core.blocks.TextBlock(blank=True, null=True, required=False)), ('card_text', wagtail.core.blocks.RichTextBlock(blank=True, null=True, required=False)), ('card_bg_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('bg-primary', 'DEFAULT'), ('bg-secondary', 'GREY'), ('bg-success', 'GREEN'), ('bg-danger', 'RED'), ('bg-warning', 'ORANGE'), ('bg-dark', 'DARK'), ('bg-light', 'LIGHT')], help_text='select a background color', required=False)), ('card_text_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('text-primary', 'DEFAULT'), ('text-secondary', 'GREY'), ('text-success', 'GREEN'), ('text-danger', 'RED'), ('text-warning', 'ORANGE'), ('text-dark', 'DARK'), ('text-light', 'LIGHT')], help_text='select a text color', required=False)), ('buttons', wagtail.core.blocks.ListBlock(wagtail.core.blocks.StructBlock((('button_text', wagtail.core.blocks.TextBlock()), ('button_link', wagtail.core.blocks.TextBlock()), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))), required=False), default=[])), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_carousel', wagtail.core.blocks.StructBlock((('interval', wagtail.core.blocks.IntegerBlock(default=2000, help_text='\n    The amount of time to delay between automatically cycling an item. If\n    false, carousel will not automatically cycle.\n    ')), ('c_image1', wagtail.images.blocks.ImageChooserBlock(required=True)), ('c_image1_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 1', required=False)), ('c_image1_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 1', required=False)), ('c_image2', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image2_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 2', required=False)), ('c_image2_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 2', required=False)), ('c_image3', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image3_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 3', required=False)), ('c_image3_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 3', required=False)), ('c_image4', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image4_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 4', required=False)), ('c_image4_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 4', required=False)), ('c_image5', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image5_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 5', required=False)), ('c_image5_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 5', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_well', wagtail.core.blocks.StructBlock((('message', wagtail.core.blocks.RichTextBlock(help_text='Enter some message inside well')), ('well_bg_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('bg-primary', 'DEFAULT'), ('bg-secondary', 'GREY'), ('bg-success', 'GREEN'), ('bg-danger', 'RED'), ('bg-warning', 'ORANGE'), ('bg-dark', 'DARK'), ('bg-light', 'LIGHT')], help_text='select a background color', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('horizontal_rule', wagtail.core.blocks.StructBlock((('thickness', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter a thickness integer value. Eg(10)', required=False)), ('bg_color', wagtail.core.blocks.TextBlock(help_text='Enter a hexcode color for the rule Eg(#000000)', required=True)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_media_object', wagtail.core.blocks.StructBlock((('media_img', wagtail.images.blocks.ImageChooserBlock(required=True)), ('media_img_alt', wagtail.core.blocks.TextBlock(required=True)), ('media_img_width', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter an image width as an integer value. Eg(50)', required=False)), ('media_img_height', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter an image height as an integer value Eg(50)', required=False)), ('heading_text', wagtail.core.blocks.TextBlock(blank=True, help_text='enter some heading text for media object', required=False)), ('body_text', wagtail.core.blocks.RichTextBlock(help_text='Enter some message for the media object', required=True)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('placeholder_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)),))), ('font_awesome_icon_block', wagtail.core.blocks.StructBlock((('icon_tag', wagtail.core.blocks.TextBlock(blank=False, help_text='Provide a font awesome icon class text', required=True)), ('icon_size', wagtail.core.blocks.IntegerBlock(blank=True, default=2, help_text='Provide a icon size in number type', null=True, required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('iu_footer_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)), ('footer_links', wagtail.core.blocks.RichTextBlock())))), ('bootstrap_embed_video', wagtail.core.blocks.StructBlock((('video', wagtail.documents.blocks.DocumentChooserBlock(required=True)), ('aspect_ratio', wagtail.core.blocks.ChoiceBlock(choices=[('21by9', '21 x 9'), ('16by9', '16 x 9'), ('4by3', '4 x 3'), ('1by1', '1 x 1')], help_text='Aspect ratio')), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)))))), blank=True, null=True, verbose_name='Row Content'),
+        ),
+        migrations.AlterField(
+            model_name='rowcybergatewayhomepagerelation',
+            name='body',
+            field=wagtail.core.fields.StreamField((('paragraph_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)), ('body', wagtail.core.blocks.RichTextBlock())))), ('image_block', wagtail.core.blocks.StructBlock((('image', wagtail.images.blocks.ImageChooserBlock(required=True)), ('caption', wagtail.core.blocks.CharBlock(required=False)), ('width', wagtail.core.blocks.CharBlock(required=False)), ('height', wagtail.core.blocks.IntegerBlock(required=False)), ('redirect_url', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a redirect link on clicking the image', null=True, required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('embed_block', wagtail.core.blocks.StructBlock((('embed', wagtail.embeds.blocks.EmbedBlock()), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('heading_block', wagtail.core.blocks.StructBlock((('heading_text', wagtail.core.blocks.CharBlock(classname='title', required=True)), ('size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'Select a header size'), ('h1', 'H1'), ('h2', 'H2'), ('h3', 'H3'), ('h4', 'H4')], required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_jumbotron', wagtail.core.blocks.StructBlock((('title', wagtail.core.blocks.TextBlock()), ('body', wagtail.core.blocks.RichTextBlock()), ('button_text', wagtail.core.blocks.TextBlock(required=False)), ('button_link', wagtail.core.blocks.TextBlock(required=False)), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_alert', wagtail.core.blocks.StructBlock((('alert_text', wagtail.core.blocks.TextBlock()), ('alert_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('alert-primary', 'DEFAULT'), ('alert-secondary', 'GREY'), ('alert-success', 'GREEN'), ('alert-danger', 'RED'), ('alert-warning', 'ORANGE'), ('alert-dark', 'DARK'), ('alert-light', 'LIGHT')], help_text='select a background color', required=False)), ('is_link', wagtail.core.blocks.BooleanBlock(required=False)), ('alert_link', wagtail.core.blocks.TextBlock(required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_button', wagtail.core.blocks.StructBlock((('button_text', wagtail.core.blocks.TextBlock()), ('button_link', wagtail.core.blocks.TextBlock()), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_card', wagtail.core.blocks.StructBlock((('card_width', wagtail.core.blocks.IntegerBlock(blank=True, help_text='18 works best for card', required=False)), ('is_card_img', wagtail.core.blocks.BooleanBlock(required=False)), ('is_card_img_overlay', wagtail.core.blocks.BooleanBlock(default=False, help_text='Use image as background for card', label='Image Overlay?', required=False)), ('card_img', wagtail.images.blocks.ImageChooserBlock(required=False)), ('card_img_width', wagtail.core.blocks.IntegerBlock(help_text='provide an image width', required=False)), ('card_img_height', wagtail.core.blocks.IntegerBlock(help_text='provide an image height', required=False)), ('card_title', wagtail.core.blocks.TextBlock(blank=True, null=True, required=False)), ('card_text', wagtail.core.blocks.RichTextBlock(blank=True, null=True, required=False)), ('card_bg_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('bg-primary', 'DEFAULT'), ('bg-secondary', 'GREY'), ('bg-success', 'GREEN'), ('bg-danger', 'RED'), ('bg-warning', 'ORANGE'), ('bg-dark', 'DARK'), ('bg-light', 'LIGHT')], help_text='select a background color', required=False)), ('card_text_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('text-primary', 'DEFAULT'), ('text-secondary', 'GREY'), ('text-success', 'GREEN'), ('text-danger', 'RED'), ('text-warning', 'ORANGE'), ('text-dark', 'DARK'), ('text-light', 'LIGHT')], help_text='select a text color', required=False)), ('buttons', wagtail.core.blocks.ListBlock(wagtail.core.blocks.StructBlock((('button_text', wagtail.core.blocks.TextBlock()), ('button_link', wagtail.core.blocks.TextBlock()), ('button_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('btn-primary', 'DEFAULT'), ('btn-danger', 'RED'), ('btn-secondary', 'GREY'), ('btn-success', 'GREEN'), ('btn-warning', 'ORANGE')], help_text='select a button color', required=False)), ('button_size', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('', 'DEFAULT'), ('btn-lg', 'LARGE'), ('btn-sm', 'SMALL')], help_text='select a button size', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))), required=False), default=[])), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_carousel', wagtail.core.blocks.StructBlock((('interval', wagtail.core.blocks.IntegerBlock(default=2000, help_text='\n    The amount of time to delay between automatically cycling an item. If\n    false, carousel will not automatically cycle.\n    ')), ('c_image1', wagtail.images.blocks.ImageChooserBlock(required=True)), ('c_image1_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 1', required=False)), ('c_image1_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 1', required=False)), ('c_image2', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image2_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 2', required=False)), ('c_image2_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 2', required=False)), ('c_image3', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image3_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 3', required=False)), ('c_image3_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 3', required=False)), ('c_image4', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image4_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 4', required=False)), ('c_image4_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 4', required=False)), ('c_image5', wagtail.images.blocks.ImageChooserBlock(required=False)), ('c_image5_title', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a title for image 5', required=False)), ('c_image5_body', wagtail.core.blocks.TextBlock(blank=True, help_text='Give a body for image 5', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_well', wagtail.core.blocks.StructBlock((('message', wagtail.core.blocks.RichTextBlock(help_text='Enter some message inside well')), ('well_bg_color', wagtail.core.blocks.ChoiceBlock(blank=True, choices=[('bg-primary', 'DEFAULT'), ('bg-secondary', 'GREY'), ('bg-success', 'GREEN'), ('bg-danger', 'RED'), ('bg-warning', 'ORANGE'), ('bg-dark', 'DARK'), ('bg-light', 'LIGHT')], help_text='select a background color', required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('horizontal_rule', wagtail.core.blocks.StructBlock((('thickness', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter a thickness integer value. Eg(10)', required=False)), ('bg_color', wagtail.core.blocks.TextBlock(help_text='Enter a hexcode color for the rule Eg(#000000)', required=True)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('bootstrap_media_object', wagtail.core.blocks.StructBlock((('media_img', wagtail.images.blocks.ImageChooserBlock(required=True)), ('media_img_alt', wagtail.core.blocks.TextBlock(required=True)), ('media_img_width', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter an image width as an integer value. Eg(50)', required=False)), ('media_img_height', wagtail.core.blocks.IntegerBlock(blank=True, help_text='Enter an image height as an integer value Eg(50)', required=False)), ('heading_text', wagtail.core.blocks.TextBlock(blank=True, help_text='enter some heading text for media object', required=False)), ('body_text', wagtail.core.blocks.RichTextBlock(help_text='Enter some message for the media object', required=True)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('placeholder_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)),))), ('font_awesome_icon_block', wagtail.core.blocks.StructBlock((('icon_tag', wagtail.core.blocks.TextBlock(blank=False, help_text='Provide a font awesome icon class text', required=True)), ('icon_size', wagtail.core.blocks.IntegerBlock(blank=True, default=2, help_text='Provide a icon size in number type', null=True, required=False)), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False))))), ('iu_footer_block', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)), ('footer_links', wagtail.core.blocks.RichTextBlock())))), ('bootstrap_embed_video', wagtail.core.blocks.StructBlock((('video', wagtail.documents.blocks.DocumentChooserBlock(required=True)), ('aspect_ratio', wagtail.core.blocks.ChoiceBlock(choices=[('21by9', '21 x 9'), ('16by9', '16 x 9'), ('4by3', '4 x 3'), ('1by1', '1 x 1')], help_text='Aspect ratio')), ('custom_class', wagtail.core.blocks.TextBlock(blank=True, help_text='control this element by giving unique class names separated by space and styling the class in css', required=False)))))), blank=True, null=True, verbose_name='Row Content'),
+        ),
+    ]
diff --git a/django_airavata/wagtailapps/base/models.py b/django_airavata/wagtailapps/base/models.py
index 4a85e1b..01b3980 100644
--- a/django_airavata/wagtailapps/base/models.py
+++ b/django_airavata/wagtailapps/base/models.py
@@ -19,7 +19,7 @@
 from wagtail.images.edit_handlers import ImageChooserPanel
 from wagtail.snippets.models import register_snippet
 
-from .blocks import BaseStreamBlock, CssStreamBlock, Nav
+from .blocks import BaseStreamBlock, ContainerChoiceBlock, CssStreamBlock, Nav
 
 
 @register_snippet
@@ -685,7 +685,27 @@
         abstract = True
 
 
-class RowBlankPageRelation(Orderable, Row):
+class BootstrapRow(Row):
+    container = StreamField(
+        ContainerChoiceBlock(),
+        null=True,
+        blank=True,
+        help_text="(Optional) Create a new Bootstrap container for this "
+                  "and following rows.")
+    body = StreamField(
+        BaseStreamBlock(), verbose_name="Row Content", blank=True, null=True
+    )
+
+    panels = [
+        StreamFieldPanel('container'),
+        StreamFieldPanel('body'),
+    ]
+
+    class Meta:
+        abstract = True
+
+
+class RowBlankPageRelation(Orderable, BootstrapRow):
     page = ParentalKey('django_airavata_wagtail_base.BlankPage',
                        on_delete=models.CASCADE, related_name='row')
 
diff --git a/docs/admin/app_inputs.md b/docs/admin/app_inputs.md
new file mode 100644
index 0000000..4d1b4b1
--- /dev/null
+++ b/docs/admin/app_inputs.md
@@ -0,0 +1,268 @@
+# Advanced Applicaton Input Configuration
+
+The Airavata Django Portal supports customization of the user interface used to
+configure an application input. For example, instead of the default text input
+box for a string input, with customization the UI can be configured to be a drop
+down list of options.
+
+To configure application inputs one needs to provide JSON configuration in the
+**Advanced Input Field Modification Metadata** field of the application input.
+To get there:
+
+1. Select **Settings** from the drop down menu in the header.
+2. You should see the **Application Catalog**. If not, click the gears icon on
+   the left hand side.
+3. Select the application you want to configure by clicking on it.
+4. Select the _Interface_ tab.
+5. Scroll down to the _Input Field_ that you want to customize then scroll down
+   to the **Advanced Input Field Modification Metadata** text box. This is the
+   field where you will input your JSON configuration. This field will outline
+   in green when the JSON is valid and in red when invalid. See the following
+   screenshot.
+
+![Screenshot of Application Interface editor, highlighting the input JSON metadata field](../images/app-input-metadata.png)
+
+## Validation
+
+### Example
+
+```json
+{
+    "editor": {
+        "ui-component-id": "textarea-input-editor",
+        "config": {
+            "rows": 6
+        },
+        "validations": [
+            {
+                "type": "min-length",
+                "value": 10
+            },
+            {
+                "type": "max-length",
+                "value": 200
+            },
+            {
+                "type": "regex",
+                "value": "^[XYL\\s]+$",
+                "message": "Target sequence may only contain letters X, Y and L."
+            }
+        ]
+    }
+}
+```
+
+## Dependencies
+
+You can hide/show inputs based on the values of other inputs. For example, if
+the option selected in input A is 'list-of-urls' then you can have input B show
+a field to upload a file.
+
+### Example
+
+```json
+{
+    "editor": {
+        "dependencies": {
+            "show": {
+                "Select reading options": {
+                    "comparison": "equals",
+                    "value": "list-urls"
+                }
+            }
+        }
+    }
+}
+```
+
+## Alternate UI Components
+
+### Checkboxes
+
+#### Example
+
+```json
+{
+    "editor": {
+        "ui-component-id": "checkbox-input-editor",
+        "config": {
+            "options": [
+                {
+                    "value": "a",
+                    "text": "A label"
+                },
+                {
+                    "value": "b",
+                    "text": "B label"
+                },
+                {
+                    "value": "c",
+                    "text": "C label"
+                }
+            ]
+        }
+    }
+}
+```
+
+### Radio Buttons
+
+#### Example
+
+```json
+{
+    "editor": {
+        "ui-component-id": "radio-button-input-editor",
+        "config": {
+            "options": [
+                {
+                    "value": "breakfast",
+                    "text": "Breakfast"
+                },
+                {
+                    "value": "lunch",
+                    "text": "Lunch"
+                },
+                {
+                    "value": "dinner",
+                    "text": "Dinner"
+                }
+            ]
+        }
+    }
+}
+```
+
+### Selects
+
+#### Example
+
+```json
+{
+    "editor": {
+        "ui-component-id": "select-input-editor",
+        "config": {
+            "options": [
+                {
+                    "value": "breakfast",
+                    "text": "Breakfast"
+                },
+                {
+                    "value": "lunch",
+                    "text": "Lunch"
+                },
+                {
+                    "value": "dinner",
+                    "text": "Dinner"
+                }
+            ]
+        }
+    }
+}
+```
+
+### Autocomplete
+
+The Autocomplete UI component looks up matching entries for the given substring
+typed by the user. This one requires that a custom Django app be developed to
+implement the REST API for returning autocomplete suggestions.
+
+#### REST API contract
+
+-   URL is called with query parameter search with value of whatever the user
+    has currently typed
+-   URL should return a JSON response with a search key and the value of that
+    key used for the search and an results key with a list matching results,
+    limited to the top 10. Each result should have a text key with the text
+    displayed to the user and a value key which is the value applied to the
+    experiment input if selected. For example:
+
+```json
+{
+    "search": "mammal",
+    "results": [
+        {
+            "text": "Horse",
+            "value": "horse"
+        },
+        {
+            "text": "Mouse",
+            "value": "mouse"
+        }
+    ]
+}
+```
+
+-   URL can also be called with query parameter exact with a value that was
+    previously returned. This call is made by the UI to retrieve the "text"
+    value to display to the user for this value. The JSON response should be
+    similar to the above except that it should only have one result:
+
+```json
+{
+    "search": "horse",
+    "results": [
+        {
+            "text": "Horse",
+            "value": "horse"
+        }
+    ]
+}
+```
+
+-   If the exact query parameter is specified and there is no match for that
+    value, the JSON response should have HTTP status 404. The error reason can
+    be added to the "detail" key of the response body, for example:
+
+```json
+{
+    "detail": "No matching value was found."
+}
+```
+
+#### Example REST API implementation
+
+To create the REST API backend needed by the Autocomplete component, first you need a create a custom Django app. See [Custom Django Apps](../dev/custom_django_app) for more information.
+
+Here's a simple implementation of a view function that looks up words in the system dictionary file:
+
+```python
+def test_autocomplete_search(request):
+    """Find matching words for given search string."""
+    import re
+    if 'search' in request.GET:
+        query = request.GET['search']
+        pattern = re.compile(re.escape(query), re.IGNORECASE)
+    elif 'exact' in request.GET:
+        query = request.GET['exact']
+        pattern = re.compile(r"^" + re.escape(query) + r"$")
+    else:
+        return generic_json_exception_response(
+            "Missing required query parameter: one of 'search' or 'exact'", status=400)
+
+    matches = []
+    with open("/usr/share/dict/words", 'r') as f:
+        matches = [line.strip() for line in f if pattern.search(line)]
+    # TODO: if 'exact', make sure len(matches) == 1. if 0, then return 404
+    if 'exact' in request.GET and len(matches) == 0:
+        return generic_json_exception_response(f"No match for exact = {request.GET['exact']}", status=404)
+    return JsonResponse({
+        "search": query,
+        "results": [{"text": m, "value": m} for m in matches[:20]]
+    })
+```
+
+See also a real world example [miga-autocomplete](https://github.com/bio-miga/miga-autocomplete).
+
+#### Example Input Metadata Configuration
+
+```json
+{
+    "editor": {
+        "ui-component-id": "autocomplete-input-editor",
+        "config": {
+            "url": "/custom/search/"
+        }
+    }
+}
+```
diff --git a/docs/cms.md b/docs/cms.md
index 224ffad..945794e 100644
--- a/docs/cms.md
+++ b/docs/cms.md
@@ -1,6 +1,4 @@
 
-# CMS
-
 ## USING CMS
 
 #### Logging in to CMS Dashboard
@@ -23,9 +21,9 @@
 
 #### Page Structure in CMS
 
-1. Pages in the CMS are created as a Tree Structure. 
-2. You can have child pages to a particular page and child pages again to any of those child pages and so on. 
-3. If you are using a pre-configured site, you don't need to set up any root page. Otherwise, if you are creating a website from scratch, you need to create a default root page like Home page which will be accessible at '/' url. you have to create it as a child of root page and configure site settings to set it as default page. 
+1. Pages in the CMS are created as a Tree Structure.
+2. You can have child pages to a particular page and child pages again to any of those child pages and so on.
+3. If you are using a pre-configured site, you don't need to set up any root page. Otherwise, if you are creating a website from scratch, you need to create a default root page like Home page which will be accessible at '/' url. you have to create it as a child of root page and configure site settings to set it as default page.
 4. If you have a pre-configured site and you just need to maintain it, you don't need to touch site settings unless your host name or site name changes.
 5. The following diagram clearly depicts all the useful points to note about CMS page structure.
 
@@ -34,44 +32,45 @@
 
 #### Creating a New Page
 
-1. If you are building a site from scratch, the first page you create will be a child page of Root page and you should name it home page. Root page shouldn't have any other children. 
-2. All the other pages you create from now on will be children of the home page or children of children of home page etc. 
+1. If you are building a site from scratch, the first page you create will be a child page of Root page and you should name it home page. Root page shouldn't have any other children.
+2. All the other pages you create from now on will be children of the home page or children of children of home page etc.
 3. If you want to create a page as a child page of Home page, Click on the Pages link on the left side-bar.
-4. You will get a side pop-up which will contain "**Welcome to your new Wagtail Site**" and a "**pencil**" icon and a "**right-arrow**" icon. 
+4. You will get a side pop-up which will contain "**Welcome to your new Wagtail Site**" and a "**pencil**" icon and a "**right-arrow**" icon.
 5. Unless the home page is created, you won't be able to find the "right-arrow" icon. Click on "right-arrow"
 6. You will get "**Home**" Link. This is the default page. If you want to modify it you can click on "**pencil**" icon. if you have any child pages to "Home". you will also be able to find a "**right-arrow**" icon.
 7. To create a new page as a child of "Home". you need to click on "Home" Link.
-8. Then Click on "**ADD CHILD PAGE**" link. 
-9. Choose a page template type. Currently, three of them are available. 
-  * Blank Page -> (Build a page from scratch (Best Way))
-  * Cybergateway Home Page -> (Build an IU Themed Home Page)
-  * Home Page -> (Build a seagrid website based Home page)
+8. Then Click on "**ADD CHILD PAGE**" link.
+9. Choose a page template type. Currently, three of them are available.
+    * Blank Page -> (Build a page from scratch (Best Way))
+    * Cybergateway Home Page -> (Build an IU Themed Home Page)
+    * Home Page -> (Build a seagrid website based Home page)
 10. You can explore other page templates. But Blank Page is the best way to go as it enables you to build your website from scratch without mocking any other website theme.
 11. Click on "Blank Page".
 12. Each page has four tabs namely:
-  * CONTENT (On page load)
-  * CUSTOMIZATION
-  * PROMOTE
-  * SETTINGS
+    * CONTENT (On page load)
+    * CUSTOMIZATION
+    * PROMOTE
+    * SETTINGS
 13. Provide a title(**required**) for the page so that you can see it in the CMS.
-14. Head over to the **PROMOTE** Section. 
+14. Head over to the **PROMOTE** Section.
 15. Provide a slug url ( which is the url extension at which the page will be available). for example if you are creating a documentation page. Provide a slug like `documentation` so that when you visit `<--yourwebsite.com-->/documentation` you will visit this page.
 16. Provide a Page Title. This will show up in the page title of each page.
 17. Please tick the **Show in Menu** to make the page appear in the Navbar Menu. This only works for children of **Home** This doesn't work for children of other pages.
-18. Now head back to the **CONTENT** Section where you have already provided a Title. 
-19. Click on "**+**" beside Row. 
-20. It will open up a **PANEL** which contains all the items you can use to build an awesome website. Please click this [link](https://github.com/stephenpaul2727/airavata-django-portal/blob/cms/README.md#understanding-panel) to see which one to choose for which purpose.
+18. Now head back to the **CONTENT** Section where you have already provided a Title.
+19. Click on "**+**" beside Row.
+20. It will open up a **PANEL** which contains all the items you can use to build an awesome website. Please click this [link](#understanding-panel) to see which one to choose for which purpose.
 21. Every page follows a "**Bootstrap Grid Layout**" to make the website design process easy [Learn More](https://getbootstrap.com/docs/4.0/layout/grid/).
-22. To understand this layout in laymens terms, This layout will divide each page into rows and columns like a Table. Columns are limited to 12. You can add as many rows as you can. 
+22. To understand this layout in laymens terms, This layout will divide each page into rows and columns like a Table. Columns are limited to 12. You can add as many rows as you can.
 23. This layout enables you to place items on panel correctly on the website. Please go through the link mentioned above. It is a good read.
 24. Initially after clicking "**+**". it will open up one row. you can add as many items in that row as you can by clicking small grey "+" circle shaped icons on the top and bottom of each item.
-25. To differentiate each item on each row. You will provide a unique attribute to **Custom class** textbox. for eg. (col-md-3). This will make the item take 3 columns space out of 12 available for a row. Similary add another item and give its **Custom class** (for eg. col-md-9). This will make item take 9 columns. Now you have used 12 columns in a row. 
+25. By default, each row is added to the initial Bootstrap container of the page. This initial container uses class `container-fluid`, meaning that each row will expand to full width of the browser. You may optionally change the container for a row (which will also affect every subsequent row) by specifying a **Container** for the row. The options are **Full width** (same as the initial container, or `container-fluid`) or **Max width** (`container`) which applies a max-width to each row. Each container is wrapped by a `<div>` that can optionally be styled with **Inline styles**, **Custom classes**, and **Background image**. These options allow styling the background of rows, for example, setting a background color of red for a set of rows.
+25. To differentiate each item on each row. You will provide a unique attribute to **Custom class** textbox. for eg. (col-md-3). This will make the item take 3 columns space out of 12 available for a row. Similary add another item and give its **Custom class** (for eg. col-md-9). This will make item take 9 columns. Now you have used 12 columns in a row.
 26. Then you will click on "Add Row" which will make an another row. A similar song and dance takes place for this row as well.
-27. After you have completed making all the rows for the page, you click "**Save Draft**" to save the page. 
+27. After you have completed making all the rows for the page, you click "**Save Draft**" to save the page.
 28. Now your page has been created in CMS. but it is still in CMS and is not published yet.
 29. To publish the page live. click on "**up-arrow**" next to "**Save Draft**". This will pop up a list.
-30. Click on the "**Publish**" to make the page available to the entire world. 
-31. Before you publish please make sure all the content is appropriately displayed or not. 
+30. Click on the "**Publish**" to make the page available to the entire world.
+31. Before you publish please make sure all the content is appropriately displayed or not.
 32. You can preview the page before you publish it by clicking "**Preview**" next to "**Save Draft**". This lets you get confident about how the page will be displayed. This is also a best practice for a content editor.
 33. After you click "**Publish**". you will be redirected to the Parent Page dashboard if there are no validation errors.
 34. You can now see the newly created page in the list. Click on "**Live**" or "**View Live**" button to visit the newly published page.
@@ -88,142 +87,142 @@
 1. This is the most important item of all the items in the panel.
 2. This will let you create a paragraph/text on the website.
 3. When you click on it, it will open two fields.
-  * **Custom Class** -> ( you can provide a list of class selectors separated by white-space. you already know about "col-md-x". You can also add other classes like text-center to center the text etc. you can also give a custom unique class name for this paragraph. This will let you add css to that particular paragraph by editing in Custom CSS Snippet )
-  * **Body** -> (This is called a Draftail Editor. This is the place where you can write some text that you want to get displayed on the web page. The icons here are self-explanatory. You can find more info [here](https://github.com/springload/draftail))
-  
+    * **Custom Class** -> ( you can provide a list of class selectors separated by white-space. you already know about "col-md-x". You can also add other classes like text-center to center the text etc. you can also give a custom unique class name for this paragraph. This will let you add css to that particular paragraph by editing in Custom CSS Snippet )
+    * **Body** -> (This is called a Draftail Editor. This is the place where you can write some text that you want to get displayed on the web page. The icons here are self-explanatory. You can find more info [here](https://github.com/springload/draftail))
+
 ###### Image Block
 1. This will let you put an image on the webpage.
 2. When you click on it, it will open the following fields:
-  * **Image** -> (Click Choose Image which will let you choose an image from images available or let you upload a new one)
-  * **Caption** -> (If you want a text to be displayed below the image saying what is it, you can give it a caption. or you can leave blank)
-  * **Width** -> (Specify some width for the image. Should be an integer value between 10-1000 ideally. If you want to make it occupy the whole width. specify 100%. You can leave blank to get original image size.)
-  * **Height** -> (You can leave blank in most of the cases. If you specify, it should be an integer value between 10-1000. You can also specify 100% if you want it to take the entire height. )
-  * **Redirect URL** -> (You can specify a redirect link for the image so that when you click on the image, it will redirect to some other page. You can leave blank.)
-  * **Custom Class** -> (Refer to Paragraph Block custom class description)
-  
+    * **Image** -> (Click Choose Image which will let you choose an image from images available or let you upload a new one)
+    * **Caption** -> (If you want a text to be displayed below the image saying what is it, you can give it a caption. or you can leave blank)
+     * **Width** -> (Specify some width for the image. Should be an integer value between 10-1000 ideally. If you want to make it occupy the whole width. specify 100%. You can leave blank to get original image size.)
+    * **Height** -> (You can leave blank in most of the cases. If you specify, it should be an integer value between 10-1000. You can also specify 100% if you want it to take the entire height. )
+    * **Redirect URL** -> (You can specify a redirect link for the image so that when you click on the image, it will redirect to some other page. You can leave blank.)
+    * **Custom Class** -> (Refer to Paragraph Block custom class description)
+
 ###### Embed Block
 1. This will let you embed youtube videos.
 2. When you click on it, it will open the following fields:
-  * **Embed** -> (Go to youtube and click a video. Copy the url. Paste it here for the video to appear here)
-  * **Custom Class** -> (Refer to Paragraph Block custom class description)
-  
+    * **Embed** -> (Go to youtube and click a video. Copy the url. Paste it here for the video to appear here)
+    * **Custom Class** -> (Refer to Paragraph Block custom class description)
+
 ###### Heading Block
 1. This will let you write heading text of 6 varying sizes (H1, H2, H3, H4, H5, H6).
 2. H1 is the biggest text. H6 is the smallest.
 3. Don't choose this block just to make text bigger. If you want to make text bigger. you can give a custom class name and head over to custom css and specify font-size.
 4. This block is used for the purpose of headings and sub-headings.
 5. When you click on it, it will open the following fields:
-  * **Heading Text** -> (Specify some heading text)
-  * **Select a Header Size** -> (Select one of H1-H6)
-  * **Custom Class** -> (Refer to Paragraph Block custom class description)
-  
+    * **Heading Text** -> (Specify some heading text)
+    * **Select a Header Size** -> (Select one of H1-H6)
+    * **Custom Class** -> (Refer to Paragraph Block custom class description)
+
 ###### Bootstrap Jumbotron
 1. This will let you create a highlight part for the webpage similar to [this](https://getbootstrap.com/docs/4.1/components/jumbotron/). Usually kept on the top of a page.
 2. When you click on it, it will open the following fields:
-  * **Title** -> (Specify Title)
-  * **Body** -> (Specify description)
-  * **Button Text** -> (Specify button text if you want a button. otherwise leave blank and leave all the below button fields blank)
-  * **Button Link** -> (Specify button redirect link)
-  * **Button Color** -> (Select a button color.)
-  * **Button Size** -> (Select a button size)
-  * **Custom Class** -> (Refer to Paragraph Block custom class description)
-  
+    * **Title** -> (Specify Title)
+    * **Body** -> (Specify description)
+    * **Button Text** -> (Specify button text if you want a button. otherwise leave blank and leave all the below button fields blank)
+    * **Button Link** -> (Specify button redirect link)
+    * **Button Color** -> (Select a button color.)
+    * **Button Size** -> (Select a button size)
+    * **Custom Class** -> (Refer to Paragraph Block custom class description)
+
 ###### Bootstrap Alert
 1. This will let you create an alert on the webpage similar to [this](https://getbootstrap.com/docs/4.1/components/alerts/)
 2. When you click on it, it will open the following fields.
-  * **Alert Text** -> (Specify some text to be displayed in alert)
-  * **Alert Color** -> (Select some color for the alert)
-  * **Is Link** -> (If the alert is a link. Tick this.)
-  * **Alert Link** -> (Specify alert redirect link)
-  * **Custom Class** -> (Refer to Paragraph Block custom class description)
-  
+    * **Alert Text** -> (Specify some text to be displayed in alert)
+    * **Alert Color** -> (Select some color for the alert)
+    * **Is Link** -> (If the alert is a link. Tick this.)
+    * **Alert Link** -> (Specify alert redirect link)
+    * **Custom Class** -> (Refer to Paragraph Block custom class description)
+
 ###### Bootstrap Button
 1. This will let you create a bootstrap button on the webpage similar to [this](https://getbootstrap.com/docs/4.1/components/buttons/)
 2. When you click on it, it will open the following fields:
-  * **Button Text** -> (Specify button text if you want a button. otherwise leave blank and leave all the below button fields blank)
-  * **Button Link** -> (Specify button redirect link)
-  * **Button Color** -> (Select a button color.)
-  * **Button Size** -> (Select a button size)
-  * **Custom Class** -> (Refer to Paragraph Block custom class description)
-  
+    * **Button Text** -> (Specify button text if you want a button. otherwise leave blank and leave all the below button fields blank)
+    * **Button Link** -> (Specify button redirect link)
+    * **Button Color** -> (Select a button color.)
+    * **Button Size** -> (Select a button size)
+    * **Custom Class** -> (Refer to Paragraph Block custom class description)
+
 ###### Bootstrap Card
 1. This will let you create a bootstrap card on the webpage similar to [this](https://getbootstrap.com/docs/4.1/components/card/)
 2. When you click on it, it will open the following fields:
-  * **Card Width** -> (Leave blank if you want the card to take the width of the specified columns)
-  * **Is Card Img** -> (Tick it if card is displaying an image inside it.)
-  * **Card Img** -> (Click Choose Image which will let you choose an image from images available or let you upload a new one)
-  * **Card Img Width** -> (Specify some width for the image. Should be an integer value between 10-1000 ideally. If you want to make it occupy the whole width. specify 100%. You can leave blank to get original image size)
-  * **Card Img Height** -> (You can leave blank in most of the cases. If you specify, it should be an integer value between 10-1000. You can also specify 100% if you want it to take the entire height. )
-  * **Card Title** -> (Specify a Card Title)
-  * **Card text** -> (Specify a Card Body)
-  * **Card Bg Color** -> (Select a Card Color)
-  * **Card Text Color** -> (Select a color for the text on the card)
-  * **Button Text** -> (Specify button text if you want a button. otherwise leave blank and leave all the below button fields blank)
-  * **Button Link** -> (Specify button redirect link)
-  * **Button Color** -> (Select a button color.)
-  * **Custom Class** -> (Refer to Paragraph Block custom class description)
-  
+    * **Card Width** -> (Leave blank if you want the card to take the width of the specified columns)
+    * **Is Card Img** -> (Tick it if card is displaying an image inside it.)
+    * **Card Img** -> (Click Choose Image which will let you choose an image from images available or let you upload a new one)
+     * **Card Img Width** -> (Specify some width for the image. Should be an integer value between 10-1000 ideally. If you want to make it occupy the whole width. specify 100%. You can leave blank to get original image size)
+    * **Card Img Height** -> (You can leave blank in most of the cases. If you specify, it should be an integer value between 10-1000. You can also specify 100% if you want it to take the entire height. )
+    * **Card Title** -> (Specify a Card Title)
+    * **Card text** -> (Specify a Card Body)
+    * **Card Bg Color** -> (Select a Card Color)
+    * **Card Text Color** -> (Select a color for the text on the card)
+    * **Button Text** -> (Specify button text if you want a button. otherwise leave blank and leave all the below button fields blank)
+    * **Button Link** -> (Specify button redirect link)
+    * **Button Color** -> (Select a button color.)
+    * **Custom Class** -> (Refer to Paragraph Block custom class description)
+
 ###### Bootstrap Carousel
 1. This will let you create a rotating image carousel on the webpage similar to [this](https://getbootstrap.com/docs/4.1/components/carousel/)
 2. When you click on it, it will open the following fields:
-  * **Cimage 1** -> (Click Choose Image which will let you choose an image from images available or let you upload a new one)
-  * **Cimage 1 title** -> (Choose a title caption to be displayed on the image)
-  * **Cimage 1 body** -> (Choose a body caption to be displayed on the image)
-  * **Custom Class** -> (Refer to Paragraph Block custom class description)
+    * **Cimage 1** -> (Click Choose Image which will let you choose an image from images available or let you upload a new one)
+    * **Cimage 1 title** -> (Choose a title caption to be displayed on the image)
+    * **Cimage 1 body** -> (Choose a body caption to be displayed on the image)
+    * **Custom Class** -> (Refer to Paragraph Block custom class description)
 3. Similary there are Cimage 2 through 5. So you can have a 5 image carousel at max. Always start with Cimage1 followed by Cimage2 and so on.
 
 ###### Bootstrap Well
-1. This will let you create highlighted text. Use it to highlight something on a webpage. Refer to Bootstrap Alert for more functionality. 
+1. This will let you create highlighted text. Use it to highlight something on a webpage. Refer to Bootstrap Alert for more functionality.
 2. When you click on it, it will open the following fields:
-  * **Message** -> (Write some text you want to be highlighted)
-  * **Well Bg Color** -> (Select a color to make it background for the text)
-  * **Custom Class** -> (Refer to Paragraph Block custom class description)
-  
+    * **Message** -> (Write some text you want to be highlighted)
+    * **Well Bg Color** -> (Select a color to make it background for the text)
+    * **Custom Class** -> (Refer to Paragraph Block custom class description)
+
 ###### Horizontal Rule
 1. This will let you create a horizontal line on the webpage. This is not a normal horizontal line. you can customize the thickness and color of it. Use it to separate rows if you like.
 2. When you click on it, it will open the following fields:
-  * **Thickness** -> (select a number between 1 and 10)
-  * **Bg color** -> (Give a hex code color for the line. You can select a hex color [here](https://www.w3schools.com/colors/colors_picker.asp))
-  * **Custom Class** -> (Refer to Paragraph Block custom class description)
-  
+    * **Thickness** -> (select a number between 1 and 10)
+    * **Bg color** -> (Give a hex code color for the line. You can select a hex color [here](https://www.w3schools.com/colors/colors_picker.asp))
+    * **Custom Class** -> (Refer to Paragraph Block custom class description)
+
 ###### Bootstrap Media Object
 1. This will let you create a media object on the webpage similar to [this](https://getbootstrap.com/docs/4.0/layout/media-object/)
 2. Use this item for describing a person, university etc. with an image and a description.
 3. When you click on it, it will open the following fields:
-  * **Media img** -> (Click Choose Image which will let you choose an image from images available or let you upload a new one)
-  * **Media img alt** -> (Create a text to be displayed if the image is not working for some reason)
-  * **Media img width** -> (Choose the width for the image. Leave blank if you choose.)
-  * **Media img height** -> (Choose the height for the image. Leave blank if you choose.)
-  * **Heading text** -> (Provide the text description for the media object. For example, person name)
-  * **Body Text** -> (Provide some body text for the media object. For example, person details)
-  * **Custom Class** -> (Refer to Paragraph Block custom class description)
+    * **Media img** -> (Click Choose Image which will let you choose an image from images available or let you upload a new one)
+    * **Media img alt** -> (Create a text to be displayed if the image is not working for some reason)
+    * **Media img width** -> (Choose the width for the image. Leave blank if you choose.)
+    * **Media img height** -> (Choose the height for the image. Leave blank if you choose.)
+    * **Heading text** -> (Provide the text description for the media object. For example, person name)
+    * **Body Text** -> (Provide some body text for the media object. For example, person details)
+    * **Custom Class** -> (Refer to Paragraph Block custom class description)
 
 ###### Placeholder Block
 1. This is a block which doesn't contain any content. It just creates a space of given columns. Use it to align content properly.
 2. When you click on it, it will open the following fields:
-  * **Custom Class** -> (Give a bootstrap column for eg. col-md-3. This will leave a space of three columns in a row)
-  
+    * **Custom Class** -> (Give a bootstrap column for eg. col-md-3. This will leave a space of three columns in a row)
+
 ###### Font Awesome Icon Block
 1. This is a block which can make a font awesome icon of varying size.
 2. When you click on it, it will open the following fields:
-  * **Icon tag** -> (Head over to [font awesome website](https://fontawesome.com/icons?d=gallery) and select a free icon you like to be displayed on the web page. For eg. (fas fa-bell)
-  * **Icon Size** -> (Select an icon size as an integer value between 1 and 50)
-  * **Custom Class** -> (Refer to Paragraph Block custom class description)
-  
+    * **Icon tag** -> (Head over to [font awesome website](https://fontawesome.com/icons?d=gallery) and select a free icon you like to be displayed on the web page. For eg. (fas fa-bell)
+    * **Icon Size** -> (Select an icon size as an integer value between 1 and 50)
+    * **Custom Class** -> (Refer to Paragraph Block custom class description)
+
 ###### IU Footer Block
 1. This is a block which can be used to make an iu footer.
 2. This is a unique block which mocks the Indiana University footer as shown [here](https://www.iu.edu)
 3. If you use this don't use the footer in the snippets. Alternatively, you can also go to the **Customization** tab of the page and set **Show Footer** to **No**
 4. When you click on it, it will open the following fields:
-  * **Footer Links** -> (Give the links you want to appear on the footer)
-  * **Custom class** -> (Refer to Paragraph Block custom class description)
-  
+    * **Footer Links** -> (Give the links you want to appear on the footer)
+    * **Custom class** -> (Refer to Paragraph Block custom class description)
+
 
 #### Modifying a Page content / Unpublishing a page
 1. Go to the page you want to modify by selecting the pages link on the dark side bar on the left.
 2. When you get to the page, Click "**pencil**" icon beside the page to visit the content of the page.
-3. Modify the content on the page by creating a row or adding items to a row. 
-4. Also, you can customize the page to make navbar, nav-extra and footer snippets not show up. 
+3. Modify the content on the page by creating a row or adding items to a row.
+4. Also, you can customize the page to make navbar, nav-extra and footer snippets not show up.
 5. After you are done with changes, preview the page and publish it if it looks as you want it.
 6. If you published the page and you noticed some abnormalities and you want it to take it to the previous version, you hover over the page and find **MORE** link.
 7. Then click on the **revisions** link to visit all the previous revisions. Click on Preview to check if that was the previous state you want to return to.
@@ -233,22 +232,46 @@
 1. Go to the page you want to delete by selecting the pages link on the dark side bar on the left.
 2. When you get to the page, Click "**pencil**" icon beside the page to visit the content of the page.
 3. On the "**Pencil**" icon next to "**Save Draft**", click it and select "**DELETE** to delete the page.
-4. It will verify again whether you are 100% sure to delete that page. 
+4. It will verify again whether you are 100% sure to delete that page.
 5. Click "**Yes, Delete It**" to delete the page.
 6. If you just want the page not to be displayed on the live website. But you want to keep the page in the CMS. Click "**Unpublish**" instead of "**DELETE**". This will ensure that the page doesn't get completely deleted. If you want to publish in the future, you can do it.
 
 
 ### Snippets
-1. Snippets are reusable pieces of code across the whole website. 
+1. Snippets are reusable pieces of code across the whole website.
 2. Every website has snippets. For eg. Navbar
 3. Navbar is consistent across every page. Navbar won't be changed for each page.
 4. Similar consistency applies for Footer, Sidebar, Announcments, CSS, Secondary navbar, Header Links.
 5. You can configure these items when you visit the "**Snippets**" tab on the left side dark colored bar on dashboard.
 6. It consists of the following fields:
-  * **Announcements** -> ( If you want announcements to be displayed on the home page, then you can click it and add as many announcements as you want. They will be displayed on the top portion of your website's home page. These announcemnts won't appear on other pages. A good example would be a convocation which is taking place and you want all the people visiting your website to see it.)
-  * **Custom CSS** -> ( This is the place where you can add styles to the custom class unique selectors you defined while creating a page. This is basically writing css and controlling the element you selected. You can provide css comment or css block. A css comment is used to separate each style. for eg.(Navbar Styles). A css block is where you write css for the selector and its children. `Do not add additional Custom Css by clicking Add Custom CSS. Only the first one will take effet` )
-  * **Header Custom Links** -> ( The Links on the main navbar are automatically generated depending on the child pages you created from the home page. If you want some other link to be displayed manually on the navbar. you can use this. Click on it and specify the link text and link to make it appear on the Main Navbar. `Do not add additional custom header links by clicking Add Header Custom Links. Only the first one will take effet`)
-  * **Footer** -> ( You can design a Footer using this item. It will remain consistent and will appear on every page on website. If you don't want it to appear on a particular page, you can visit that particular page and go to "**Customization**" Tab and set "**Show Footer**" to No. `Do not add additional footers by clicking Add Footer. Only the first one will take effet` )
-  * **Nav Extra** -> ( You can make a secondary navbar just below the main navbar if you want to. You can also add a brand logo and links to this navbar. You can customize its color and other properties by giving a custom class selector and specifying styles in "**Custom CSS**". If you don't want it to appear on a particular page, you can visit that particular page and go to "**Customization**" Tab and set "**Show Nav Extra**" to No. `Do not add additional nav extra by clicking Add Nav Extra. Only the first one will take effet` )
-  * **Navbar** -> ( This is the main navbar which exists across every page. When you click on Navbar you can add Logo image and text. If you don't want it to appear on a particular page, you can visit that particular page and go to "**Customization**" Tab and set "**Show Navbar**" to No. It has a pre-defined class selector named '**main-nav**'. you can visit "**Custom Css** and write a css block with the '.main-nav' and give it some styles. When you click on Navbar you can add Logo image and text. If you don't want it to appear on a particular page, you can visit that particular page and go to "**Customization**" Tab and set "**Show Navbar**" to No.`Do not add additional navbars by clicking Add Navbar. Only the first one will take effet`)
-  
+    * **Announcements** -> ( If you want announcements to be displayed on the home page, then you can click it and add as many announcements as you want. They will be displayed on the top portion of your website's home page. These announcemnts won't appear on other pages. A good example would be a convocation which is taking place and you want all the people visiting your website to see it.)
+    * **Custom CSS** -> ( This is the place where you can add styles to the custom class unique selectors you defined while creating a page. This is basically writing css and controlling the element you selected. You can provide css comment or css block. A css comment is used to separate each style. for eg.(Navbar Styles). A css block is where you write css for the selector and its children. `Do not add additional Custom Css by clicking Add Custom CSS. Only the first one will take effet` )
+    * **Header Custom Links** -> ( The Links on the main navbar are automatically generated depending on the child pages you created from the home page. If you want some other link to be displayed manually on the navbar. you can use this. Click on it and specify the link text and link to make it appear on the Main Navbar. `Do not add additional custom header links by clicking Add Header Custom Links. Only the first one will take effet`)
+    * **Footer** -> ( You can design a Footer using this item. It will remain consistent and will appear on every page on website. If you don't want it to appear on a particular page, you can visit that particular page and go to "**Customization**" Tab and set "**Show Footer**" to No. `Do not add additional footers by clicking Add Footer. Only the first one will take effet` )
+    * **Nav Extra** -> ( You can make a secondary navbar just below the main navbar if you want to. You can also add a brand logo and links to this navbar. You can customize its color and other properties by giving a custom class selector and specifying styles in "**Custom CSS**". If you don't want it to appear on a particular page, you can visit that particular page and go to "**Customization**" Tab and set "**Show Nav Extra**" to No. `Do not add additional nav extra by clicking Add Nav Extra. Only the first one will take effet` )
+    * **Navbar** -> ( This is the main navbar which exists across every page. When you click on Navbar you can add Logo image and text. If you don't want it to appear on a particular page, you can visit that particular page and go to "**Customization**" Tab and set "**Show Navbar**" to No. It has a pre-defined class selector named '**main-nav**'. you can visit "**Custom Css** and write a css block with the '.main-nav' and give it some styles. When you click on Navbar you can add Logo image and text. If you don't want it to appear on a particular page, you can visit that particular page and go to "**Customization**" Tab and set "**Show Navbar**" to No.`Do not add additional navbars by clicking Add Navbar. Only the first one will take effet`)
+
+## RECIPES
+
+### Banner background image
+
+Add a background banner image that spans the entire width of the browser.
+
+![Background banner image](./images/banner_image.png)
+
+1. Add a new row.
+2. Add a **Full width container**.
+3. Set the **inline styles** to:
+
+```
+background-size: cover;
+background-repeat: no-repeat;
+background-position: center;
+```
+
+4. Select or upload the **Background image**.
+5. Add *Row Content* as usual. However, if you just want the background
+   banner image without foreground content, then add a **Placeholder** block to
+   the row content and then add to the container **inline styles**
+   `height: 200px;` or whatever height you want for the banner image.
+
diff --git a/docs/dev/custom_output_view_provider.md b/docs/dev/custom_output_view_provider.md
new file mode 100644
index 0000000..a34f60a
--- /dev/null
+++ b/docs/dev/custom_output_view_provider.md
@@ -0,0 +1,317 @@
+# Custom Output View Provider
+
+A custom _output view provider_ generates visualizations of experiment outputs.
+Output view providers are implemented as a Python function and packaged as a
+Python package, with the requisite metadata (more on this below). An output view
+provider is associated with the output of an application in the Application
+Catalog.
+
+There are several different output view display types, such as: image, link, or
+html. If configured an output view will be displayed for an output file and the
+Airavata Django Portal will invoke the custom output view provider to get the
+data to display. For example, if the output view display type is image, then the
+output view provider will be invoked and it should return image data.
+
+## Getting started
+
+See the
+[Gateways 2019 tutorial](../tutorial/gateways2019_tutorial.md#tutorial-exercise-create-a-custom-output-viewer-for-an-output-file)
+for help on setting up a development environment and implementing a simple
+output view provider.
+
+You can use this as a starting point to create your own custom output view
+provider. Here is what you would need to change:
+
+1. First add your custom output view provider implementation to
+   `output_views.py`.
+2. Rename the Python package name in `setup.py`.
+3. Update the `install_requires` list of dependencies based on what your custom
+   output view provider requires.
+4. Rename the Python module folder from `./gateways2019_tutorial` to whatever
+   you want to call it.
+5. Rename the output view provider in the `entry_points` metadata in `setup.py`.
+   For example, if you wanted to name your output view provider
+   `earthquake-sites-visualization` and you renamed your Python module folder
+   from `./gateways2019_tutorial` to `./earthquake_gateway`, then you could have
+   the following in the `entry_points`:
+
+```
+...
+    entry_points="""
+[airavata.output_view_providers]
+earthquake-sites-visualization = earthquake_gateway.output_views:EarthquakeSitesViewProvider
+""",
+```
+
+6. If you don't need a Django app, you can remove the `[airavata.djangoapp]`
+   section from `entry_points`.
+
+Please note, if you update `setup.py` and you're doing local development, you'll
+need to reinstall the package into your local Django instance's virtual
+environment using:
+
+```bash
+python setup.py develop
+```
+
+## Reference
+
+### Output View Provider interface
+
+Output view providers should be defined as a Python class. They should define
+the following attributes:
+
+-   `display_type`: this should be one of _link_, _image_ or _html_.
+-   `name`: this is the name of the output view provider displayed to the user.
+-   `test_output_file`: (optional) the path to a file to use for testing
+    purposes. This file will be passed to the `generate_data` function as the
+    `output_file` parameter when the output file isn't available and the Django
+    server is running in DEBUG mode. This is helpful when developing a custom
+    output view provider in a local Django instance that doesn't have access to
+    the output files.
+
+The output view provider class should define the following method:
+
+```python
+def generate_data(self, request, experiment_output, experiment, output_file=None, **kwargs):
+
+    # Return a dictionary
+    return {
+        #...
+    }
+```
+
+The required contents of the dictionary varies based on the _display type_.
+
+#### Display type link
+
+The returned dictionary should include the following entries:
+
+-   url
+-   label
+
+The _label_ is the text of the link. Generally speaking this will be rendered
+as:
+
+```html
+<a href="{{ url }}">{{ label }}</a>
+```
+
+**Examples**
+
+-   [SimCCS Maptool - SolutionLinkProvider](https://github.com/SciGaP/simccs-maptool/blob/master/simccs_maptool/output_views.py#L5)
+
+#### Display type image
+
+The returned dictionary should include the following entries:
+
+-   image: a stream of bytes, i.e., either the result of `open(file, 'rb')` or
+    something equivalent like `io.BytesIO`.
+-   mime-type: the mime-type of the image, for example, `image/png`.
+
+**Examples**
+
+-   [AMP Gateway - TRexXPlotViewProvider](https://github.com/SciGaP/amp-gateway-django-app/blob/master/amp_gateway/plot.py#L115)
+
+#### Display type html
+
+The returned dictionary should include the following entries:
+
+-   output: a raw HTML string
+-   js: a static URL to a JavaScript file, for example,
+    `/static/earthquake_gateway/custom-leaflet-script.js`.
+
+**Examples**
+
+-   [dREG - DregGenomeBrowserViewProvider](https://github.com/SciGaP/dreg-djangoapp/blob/master/dreg_djangoapp/output_views.py#L4)
+
+### Entry Point registration
+
+Custom output view providers are packaged as Python packages in order to be
+deployed into an instance of the Airavata Django Portal. The Python package must
+have metadata that indicates that it contains a custom output view provider.
+This metadata is specified as an _entry point_ in the package's `setup.py` file
+under the named parameter `entry_points`.
+
+The entry point must be added to an entry point group called
+`[airavata.output_view_providers]`. The entry point format is:
+
+```
+label = module:class
+```
+
+The _label_ is the identifier you will use when associating an output view
+provider with an output file in the Application Catalog. As such, you can name
+it whatever you want. The _module_ must be the Python module in which exists
+your output view provider. The _class_ must be the name of your output view
+provider class.
+
+See the **Getting Started** section for an example of how to format the entry
+point in `setup.py`.
+
+### Associating an output view provider with an output file
+
+In the Application Catalog, you can add JSON metadata to associate an output
+view provider with an output file.
+
+1. In the top navigation menu in the Airavata Django Portal, go to **Settings**.
+2. If not already selected, select the **Application Catalog** from the left
+   hand side navigation.
+3. Click on the application.
+4. Click on the **Interface** tab.
+5. Scroll down to the _Output Fields_ and find the output file with which you
+   want to associate the output view provider.
+6. In the _Metadata_ field, add or update the `output-view-providers` key. The
+   value should be an array (beginning and ending with square brackets). The
+   name of your output view provider is the label you gave it when you created
+   the entry point.
+
+The _Metadata_ field will have a value like this:
+
+```json
+{
+    "output-view-providers": ["gaussian-eigenvalues-plot"]
+}
+```
+
+Where instead of `gaussian-eigenvalues-plot` you would put or add the label of
+your custom output view provider.
+
+There's a special `default` output view provider that provides the default
+interface for output files, namely by providing a download link for the output
+file. This `default` output view provider will be shown initially to the user
+and the user can then select a custom output view provider from a drop down
+menu. If, instead, you would like your custom output view provider to be
+displayed initially, you can add the `default` view provider in the list of
+output-view-providers and place it second. For example:
+
+```json
+{
+    "output-view-providers": ["gaussian-eigenvalues-plot", "default"]
+}
+```
+
+would make the `gaussian-eigenvalues-plot` the initial output view provider. The
+user can access the default output view provider from the drop down menu.
+
+### Interactive parameters
+
+You can add some interactivity to your custom output view provider by adding one
+or more interactive parameters. An interactive parameter is a parameter that
+your custom output view provider declares, with a name and current value. The
+Airavata Django Portal will display all interactive parameters in a form and
+allow the user to manipulate them. When an interactive parameter is updated by
+the user, your custom output view provider will be again invoked with the new
+value of the parameter.
+
+To add an interactive parameter, you first need to add a keyword parameter to
+your `generate_data` function. For example, let's say you want to add a boolean
+`show_grid` parameter that the user can toggle on and off. You would change the
+signature of the `generate_data` function to:
+
+```python
+def generate_data(self, request, experiment_output, experiment, output_file=None, show_grid=False, **kwargs):
+
+    # Return a dictionary
+    return {
+        #...
+    }
+```
+
+In this example, the default value of `show_grid` is `False`, but you can make
+it `True` instead. The default value of the interactive parameter will be its
+value when it is initially invoked. It's recommended that you supply a default
+value but the default value can be `None` if there is no appropriate default
+value.
+
+Next, you need to declare the interactive parameter in the returned dictionary
+along with its current value in a special key called `interactive`. For example:
+
+```python
+def generate_data(self, request, experiment_output, experiment, output_file=None, show_grid=False, **kwargs):
+
+    # Return a dictionary
+    return {
+        #...
+        'interactive': [
+            {'name': 'show_grid', 'value': show_grid}
+        ]
+    }
+```
+
+declares the interactive parameter named `show_grid` and its current value.
+
+The output view display will render a form showing the value of `show_grid` (in
+this case, since it is boolean, as a checkbox).
+
+#### Supported parameter types
+
+Besides boolean, the following additional parameter types are supported:
+
+| Type    | UI Control              | Additional options                                                                                          |
+| ------- | ----------------------- | ----------------------------------------------------------------------------------------------------------- |
+| Boolean | Checkbox                |                                                                                                             |
+| String  | Text input              |                                                                                                             |
+| Integer | Stepper or Range slider | `min`, `max` and `step` - if `min` and `max` are supplied, renders as a range slider. `step` defaults to 1. |
+| Float   | Stepper or Range slider | `min`, `max` and `step` - if `min` and `max` are supplied, renders as a range slider.                       |
+
+Further, if the interactive parameter defines an `options` list, this will
+render as a drop-down select. The `options` list can either be a list of
+strings, for example:
+
+```python
+def generate_data(self, request, experiment_output, experiment, output_file=None, color='red', **kwargs):
+
+    # Return a dictionary
+    return {
+        #...
+        'interactive': [
+            {'name': 'color', 'value': color, 'options': ['red', 'green', 'blue']}
+        ]
+    }
+```
+
+Or, the `options` list can be a list of `(text, value)` tuples:
+
+```python
+def generate_data(self, request, experiment_output, experiment, output_file=None, color='red', **kwargs):
+
+    # Return a dictionary
+    return {
+        #...
+        'interactive': [
+            {'name': 'color', 'value': color, 'options': [('Red', 'red'), ('Blue', 'blue'), ('Green', 'green')]}
+        ]
+    }
+```
+
+The `text` is what is displayed to the user as the value's label in the
+drop-down. The `value` is what will be passed to the output view provider when
+selected by the user.
+
+#### Additional configuration
+
+The following additional properties are supported:
+
+-   **label** - by default the name of the interactive parameter is its label in
+    the interactive form. You can customize the label with the `label` property.
+-   **help** - you can also display help text below the parameter in the
+    interactive form with the `help` property.
+
+For example:
+
+```python
+def generate_data(self, request, experiment_output, experiment, output_file=None, color='red', **kwargs):
+
+    # Return a dictionary
+    return {
+        #...
+        'interactive': [
+            {'name': 'color',
+            'value': color,
+            'options': [('Red', 'red'), ('Blue', 'blue'), ('Green', 'green')],
+            'label': 'Bar chart color',
+            'help': 'Change the primary color of the bar chart.'}
+        ]
+    }
+```
diff --git a/docs/dev/new_django_app.md b/docs/dev/new_django_app.md
index 1cb6b78..1a04e45 100644
--- a/docs/dev/new_django_app.md
+++ b/docs/dev/new_django_app.md
@@ -294,7 +294,6 @@
       ? "http://localhost:9000/static/django_airavata_myapp/dist/"
       : "/static/django_airavata_myapp/dist/",
   outputDir: "./static/django_airavata_myapp/dist",
-  productionSourceMap: false,
   pages: {
     home: "./static/django_airavata_myapp/js/entry-home"
     // additional entry points go here ...
diff --git a/docs/dev/wagtail_export.md b/docs/dev/wagtail_export.md
index 6238ef8..1ccacf2 100644
--- a/docs/dev/wagtail_export.md
+++ b/docs/dev/wagtail_export.md
@@ -154,3 +154,42 @@
 
 where `myexport.json` should match the name that you gave the file when
 exporting it.
+
+## Replacing a Wagtail import with a different export
+
+Use this when you have already loaded a Wagtail export into a Django instance
+and you need to load a different one to overwrite the first one. The following
+steps will first remove the Wagtail tables and then load the export like normal.
+
+1. Make sure your virtual environment is activated if not already.
+
+```bash
+source venv/bin/activate
+```
+
+2. Run the following to delete all wagtail tables
+
+```bash
+python manage.py migrate wagtailimages 0001
+python manage.py migrate wagtailimages zero
+python manage.py migrate taggit zero
+python manage.py migrate wagtailadmin zero
+python manage.py migrate wagtailcore zero
+python manage.py migrate wagtailusers zero
+python manage.py migrate wagtailembeds zero
+```
+
+3. Migrate the database:
+
+```bash
+python manage.py migrate
+```
+
+4. Run
+
+```bash
+python manage.py load_cms_data myexport.json
+```
+
+where `myexport.json` should match the name that you gave the file when
+exporting it.
diff --git a/docs/images/app-input-metadata.png b/docs/images/app-input-metadata.png
new file mode 100644
index 0000000..b9a8f87
--- /dev/null
+++ b/docs/images/app-input-metadata.png
Binary files differ
diff --git a/docs/images/banner_image.png b/docs/images/banner_image.png
new file mode 100644
index 0000000..1646f17
--- /dev/null
+++ b/docs/images/banner_image.png
Binary files differ
diff --git a/docs/images/panel.png b/docs/images/panel.png
index 18fc590..b9e8f45 100644
--- a/docs/images/panel.png
+++ b/docs/images/panel.png
Binary files differ
diff --git a/docs/tutorial/gateways2019_tutorial.md b/docs/tutorial/gateways2019_tutorial.md
index d065031..1d7c0ca 100644
--- a/docs/tutorial/gateways2019_tutorial.md
+++ b/docs/tutorial/gateways2019_tutorial.md
@@ -607,6 +607,62 @@
 
 ![Screenshot of generated Gaussian eigenvalues plot](./screenshots/gateways19/gaussian-eigenvalues.png)
 
+### (Optional) Interactive parameter
+
+In additional to producing static visualizations, output view providers can
+declare interactive parameters that can be manipulated by the user. We can add a
+simple boolean interactive parameter to toggle the display of the matplotlib
+grid as an example.
+
+1. Change the `generate_data` function so that it has an additional `show_grid`
+   parameter with a default value of `False`:
+
+```python
+    def generate_data(self, request, experiment_output, experiment, output_file=None, show_grid=False):
+```
+
+2. Add the following `.show_grid()` lines to the matplotlib code:
+
+```python
+...
+            fig.suptitle("Eigenvalues")
+            ax = fig.subplots(2, 1)
+            ax[0].plot(range(1, 10), homo_eigenvalues, label='Homo')
+            ax[0].set_ylabel('eV')
+            ax[0].legend()
+            ax[0].show_grid(show_grid)
+            ax[1].plot(range(1, 10), lumo_eigenvalues, label='Lumo')
+            ax[1].set_ylabel('eV')
+            ax[1].legend()
+            ax[1].show_grid(show_grid)
+...
+```
+
+3. Change the resulting dictionary to have the special `interactive` property
+   and declare the `show_grid` parameter:
+
+```python
+...
+        # return dictionary with image data
+        return {
+            'image': image_bytes,
+            'mime-type': 'image/png'
+            'interactive': [
+                {'name': 'show_grid', 'value': show_grid}
+            ]
+        }
+```
+
+This will provider the user with a checkbox for manipulating the show_grid
+parameter. Every time the user changes it, the GaussianEigenvaluesViewProvider
+will be again invoked. It should look something like the following:
+
+![Gaussian Eigenvalues View Provider with interactive parameter](./screenshots/gateways19/gaussian-eigenvalues-show_grid.png)
+
+There are several more interactive parameter types and additional options. You
+can learn more about them in the
+[custom output view provider documentation](../dev/custom_output_view_provider.md#interactive-parameters).
+
 ## Tutorial exercise: Create a custom Django app
 
 In this tutorial exercise we'll create a fully custom user interface that lives
@@ -940,7 +996,7 @@
    value:
 
 ```javascript
-$("#run-button").click(e => {
+$("#run-button").click((e) => {
     const greeting = $("#greeting-select").val();
 });
 ```
@@ -952,7 +1008,7 @@
 
 ```javascript
 const loadAppInterface = services.ApplicationInterfaceService.retrieve({
-    lookup: appInterfaceId
+    lookup: appInterfaceId,
 });
 ```
 
@@ -967,7 +1023,7 @@
 const appDeploymentId =
     "js-156-93.jetstream-cloud.org_Echo_37eb38ac-74c8-4aa4-a037-c656ab5bc6b8";
 const loadQueues = services.ApplicationDeploymentService.getQueues({
-    lookup: appDeploymentId
+    lookup: appDeploymentId,
 });
 ```
 
@@ -988,15 +1044,15 @@
    object then _save_ and _launch_ it. Here's the complete click handler:
 
 ```javascript
-$("#run-button").click(e => {
+$("#run-button").click((e) => {
     const greeting = $("#greeting-select").val();
     const loadAppInterface = services.ApplicationInterfaceService.retrieve({
-        lookup: appInterfaceId
+        lookup: appInterfaceId,
     });
     const appDeploymentId =
         "js-156-93.jetstream-cloud.org_Echo_37eb38ac-74c8-4aa4-a037-c656ab5bc6b8";
     const loadQueues = services.ApplicationDeploymentService.getQueues({
-        lookup: appDeploymentId
+        lookup: appDeploymentId,
     });
     const resourceHostId =
         "js-156-93.jetstream-cloud.org_33019860-54c2-449b-96d3-988d4f5a501e";
@@ -1008,7 +1064,7 @@
             const experiment = appInterface.createExperiment();
             experiment.experimentName = "Echo " + greeting;
             experiment.projectId = workspacePrefs.most_recent_project_id;
-            const cloudQueue = queues.find(q => q.queueName === queueName);
+            const cloudQueue = queues.find((q) => q.queueName === queueName);
             experiment.userConfigurationData.groupResourceProfileId = groupResourceProfileId;
             experiment.userConfigurationData.computationalResourceScheduling.resourceHostId = resourceHostId;
             experiment.userConfigurationData.computationalResourceScheduling.totalCPUCount =
@@ -1023,9 +1079,9 @@
 
             return services.ExperimentService.create({ data: experiment });
         })
-        .then(exp => {
+        .then((exp) => {
             return services.ExperimentService.launch({
-                lookup: exp.experimentId
+                lookup: exp.experimentId,
             });
         });
 });
@@ -1063,17 +1119,17 @@
 ```javascript
 if (exp.experimentStatus === models.ExperimentState.COMPLETED) {
     services.FullExperimentService.retrieve({ lookup: exp.experimentId }).then(
-        fullDetails => {
+        (fullDetails) => {
             const stdoutDataProductId = fullDetails.experiment.experimentOutputs.find(
-                o => o.name === "Echo-STDOUT"
+                (o) => o.name === "Echo-STDOUT"
             ).value;
             const stdoutDataProduct = fullDetails.outputDataProducts.find(
-                dp => dp.productUri === stdoutDataProductId
+                (dp) => dp.productUri === stdoutDataProductId
             );
             if (stdoutDataProduct && stdoutDataProduct.downloadURL) {
                 return fetch(stdoutDataProduct.downloadURL, {
-                    credentials: "same-origin"
-                }).then(result => result.text());
+                    credentials: "same-origin",
+                }).then((result) => result.text());
             }
         }
     );
@@ -1085,20 +1141,20 @@
 ```javascript
 if (exp.experimentStatus === models.ExperimentState.COMPLETED) {
     services.FullExperimentService.retrieve({ lookup: exp.experimentId })
-        .then(fullDetails => {
+        .then((fullDetails) => {
             const stdoutDataProductId = fullDetails.experiment.experimentOutputs.find(
-                o => o.name === "Echo-STDOUT"
+                (o) => o.name === "Echo-STDOUT"
             ).value;
             const stdoutDataProduct = fullDetails.outputDataProducts.find(
-                dp => dp.productUri === stdoutDataProductId
+                (dp) => dp.productUri === stdoutDataProductId
             );
             if (stdoutDataProduct && stdoutDataProduct.downloadURL) {
                 return fetch(stdoutDataProduct.downloadURL, {
-                    credentials: "same-origin"
-                }).then(result => result.text());
+                    credentials: "same-origin",
+                }).then((result) => result.text());
             }
         })
-        .then(text => {
+        .then((text) => {
             $(`#output_${index}`).text(text);
         });
 }
@@ -1121,8 +1177,8 @@
         limit: 5,
         [models.ExperimentSearchFields.USER_NAME.name]:
             session.Session.username,
-        [models.ExperimentSearchFields.APPLICATION_ID.name]: appInterfaceId
-    }).then(data => {
+        [models.ExperimentSearchFields.APPLICATION_ID.name]: appInterfaceId,
+    }).then((data) => {
         $("#experiment-list").empty();
         data.results.forEach((exp, index) => {
             $("#experiment-list").append(
@@ -1137,28 +1193,28 @@
             // If experiment has finished, load full details, then parse the stdout file
             if (exp.experimentStatus === models.ExperimentState.COMPLETED) {
                 services.FullExperimentService.retrieve({
-                    lookup: exp.experimentId
+                    lookup: exp.experimentId,
                 })
-                    .then(fullDetails => {
+                    .then((fullDetails) => {
                         const stdoutDataProductId = fullDetails.experiment.experimentOutputs.find(
-                            o => o.name === "Echo-STDOUT"
+                            (o) => o.name === "Echo-STDOUT"
                         ).value;
                         const stdoutDataProduct = fullDetails.outputDataProducts.find(
-                            dp => dp.productUri === stdoutDataProductId
+                            (dp) => dp.productUri === stdoutDataProductId
                         );
                         if (
                             stdoutDataProduct &&
                             stdoutDataProduct.downloadURL
                         ) {
                             return fetch(stdoutDataProduct.downloadURL, {
-                                credentials: "same-origin"
-                            }).then(result => result.text());
+                                credentials: "same-origin",
+                            }).then((result) => result.text());
                         } else {
                             // If we can't download it, fake it
                             return FAKE_STDOUT;
                         }
                     })
-                    .then(text => {
+                    .then((text) => {
                         $(`#output_${index}`).text(text);
                     });
             }
diff --git a/docs/tutorial/screenshots/gateways19/gaussian-eigenvalues-show_grid.png b/docs/tutorial/screenshots/gateways19/gaussian-eigenvalues-show_grid.png
new file mode 100644
index 0000000..07bb66d
--- /dev/null
+++ b/docs/tutorial/screenshots/gateways19/gaussian-eigenvalues-show_grid.png
Binary files differ
diff --git a/mkdocs.yml b/mkdocs.yml
index 7740248..fdde766 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -8,14 +8,16 @@
     - Using the integrated CMS: cms.md
   - Developer Guide:
     - Adding a Django App: dev/new_django_app.md
-    - Adding a Custom Django App: dev/custom_django_app.md
     - Developing the Frontend: dev/developing_frontend.md
     - Developing the Backend: dev/developing_backend.md
     - Developing a Wagtail Export (theme): dev/wagtail_export.md
+  - Customization Guide:
+    - Gateways 2019 Tutorial: tutorial/gateways2019_tutorial.md
+    - Adding a Custom Django App: dev/custom_django_app.md
+    - Adding a Custom Output View Provider: dev/custom_output_view_provider.md
   - Administrator Guide:
+    - Application Input Customization: admin/app_inputs.md
     - Tusd Installation: admin/tusd.md
-  - Tutorials:
-    - Gateways 2019: tutorial/gateways2019_tutorial.md
 
 theme: readthedocs
 
diff --git a/requirements-dev.txt b/requirements-dev.txt
index b90575d..d399484 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -2,5 +2,6 @@
 flake8==3.5.0
 flake8-isort==2.5
 mkdocs==1.0.4
+Markdown==3.2.1
 
 -e ".[dev]"
diff --git a/requirements.txt b/requirements.txt
index 89cdf89..d9ebaa1 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1,5 @@
 # Pin these dependencies
-Django==1.11.21
+Django==1.11.28
 requests==2.13.0
 requests-oauthlib==0.7.0
 thrift==0.10.0