From 2b829d1028a61869858ecd48e2f1801819e17488 Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Tue, 13 Aug 2019 22:15:47 -0400
Subject: robust google doc export api and cleanup

---
 src/client/views/nodes/FormattedTextBox.tsx | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 44b5d2c21..8c2af7c9e 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -1,5 +1,5 @@
 import { library } from '@fortawesome/fontawesome-svg-core';
-import { faEdit, faSmile, faTextHeight } from '@fortawesome/free-solid-svg-icons';
+import { faEdit, faSmile, faTextHeight, faUpload } from '@fortawesome/free-solid-svg-icons';
 import { action, IReactionDisposer, observable, reaction, runInAction, computed, Lambda, trace } from "mobx";
 import { observer } from "mobx-react";
 import { baseKeymap } from "prosemirror-commands";
@@ -38,9 +38,10 @@ import { For } from 'babel-types';
 import { DateField } from '../../../new_fields/DateField';
 import { Utils } from '../../../Utils';
 import { MainOverlayTextBox } from '../MainOverlayTextBox';
+import { GoogleApiClientUtils } from '../../apis/google_docs/GoogleApiClientUtils';
 
 library.add(faEdit);
-library.add(faSmile, faTextHeight);
+library.add(faSmile, faTextHeight, faUpload);
 
 // FormattedTextBox: Displays an editable plain text node that maps to a specified Key of a Document
 //
@@ -58,6 +59,8 @@ const richTextSchema = createSchema({
     documentText: "string"
 });
 
+const googleDocKey = "googleDocId";
+
 type RichTextDocument = makeInterface<[typeof richTextSchema]>;
 const RichTextDocument = makeInterface(richTextSchema);
 
@@ -661,7 +664,24 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             event: action(() => Doc.GetProto(this.props.Document).autoHeight = !BoolCast(this.props.Document.autoHeight)), icon: "expand-arrows-alt"
         });
         ContextMenu.Instance.addItem({ description: "Text Funcs...", subitems: subitems, icon: "text-height" });
+        if (!(googleDocKey in Doc.GetProto(this.props.Document))) {
+            ContextMenu.Instance.addItem({ description: "Export to Google Doc...", event: this.exportToGoogleDoc, icon: "upload" });
+        }
     }
+
+    exportToGoogleDoc = () => {
+        let dataDoc = Doc.GetProto(this.props.Document);
+        let data = Cast(dataDoc.data, RichTextField);
+        let content: string | undefined;
+        if (data && (content = data.plainText())) {
+            GoogleApiClientUtils.Docs.Write({
+                title: StrCast(dataDoc.title),
+                store: { receiver: dataDoc, key: googleDocKey },
+                content
+            });
+        }
+    }
+
     render() {
         let self = this;
         let style = this.props.isOverlay ? "scroll" : "hidden";
-- 
cgit v1.2.3-70-g09d2


From dc766185075b5861686c68a704a8e49213eacbc6 Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Wed, 14 Aug 2019 01:00:29 -0400
Subject: cleanup and streamlined / robust type requirements

---
 .../apis/google_docs/GoogleApiClientUtils.ts       | 88 +++++++++++-----------
 src/client/views/MainView.tsx                      | 12 ---
 src/client/views/nodes/FormattedTextBox.tsx        | 20 ++---
 src/new_fields/RichTextField.ts                    |  2 +-
 4 files changed, 58 insertions(+), 64 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/apis/google_docs/GoogleApiClientUtils.ts b/src/client/apis/google_docs/GoogleApiClientUtils.ts
index dda36f05a..f4fb87e0b 100644
--- a/src/client/apis/google_docs/GoogleApiClientUtils.ts
+++ b/src/client/apis/google_docs/GoogleApiClientUtils.ts
@@ -17,32 +17,32 @@ export namespace GoogleApiClientUtils {
         export namespace Utils {
 
             export const extractText = (document: docs_v1.Schema$Document, removeNewlines = false) => {
-                let fragments: string[] = [];
+                const fragments: string[] = [];
                 if (document.body && document.body.content) {
-                    for (let element of document.body.content) {
+                    for (const element of document.body.content) {
                         if (element.paragraph && element.paragraph.elements) {
-                            for (let inner of element.paragraph.elements) {
+                            for (const inner of element.paragraph.elements) {
                                 if (inner && inner.textRun) {
-                                    let fragment = inner.textRun.content;
+                                    const fragment = inner.textRun.content;
                                     fragment && fragments.push(fragment);
                                 }
                             }
                         }
                     }
                 }
-                let text = fragments.join("");
+                const text = fragments.join("");
                 return removeNewlines ? text.ReplaceAll("\n", "") : text;
             };
 
             export const EndOf = (schema: docs_v1.Schema$Document): Opt<number> => {
                 if (schema.body && schema.body.content) {
-                    let paragraphs = schema.body.content.filter(el => el.paragraph);
+                    const paragraphs = schema.body.content.filter(el => el.paragraph);
                     if (paragraphs.length) {
-                        let target = paragraphs[paragraphs.length - 1];
+                        const target = paragraphs[paragraphs.length - 1];
                         if (target.paragraph && target.paragraph.elements) {
                             length = target.paragraph.elements.length;
                             if (length) {
-                                let final = target.paragraph.elements[length - 1];
+                                const final = target.paragraph.elements[length - 1];
                                 return final.endIndex ? final.endIndex - 1 : undefined;
                             }
                         }
@@ -52,17 +52,25 @@ export namespace GoogleApiClientUtils {
 
         }
 
+        export type IdHandler = (id: DocumentId) => any;
+        export interface CreateOptions {
+            handler: IdHandler;
+            // if excluded, will use a default title annotated with the current date
+            title?: string;
+        }
+
         export interface ReadOptions {
             documentId: string;
+            // if exluded, will preserve newlines
             removeNewlines?: boolean;
         }
 
+        export type DocumentId = string;
         export interface WriteOptions {
-            documentId?: string;
-            title?: string;
             content: string | string[];
+            reference: DocumentId | CreateOptions;
+            // if excluded, will compute the last index of the document and append the content there
             index?: number;
-            store?: { receiver: Doc, key: string };
         }
 
         /**
@@ -70,33 +78,36 @@ export namespace GoogleApiClientUtils {
          * and grants the appropriate permissions, this function programmatically creates an arbitrary Google Doc which
          * should appear in the user's Google Doc library instantaneously.
          * 
-         * @param schema whatever subset of a docs_v1.Schema$Document is required to properly initialize your
-         * Google Doc. This schema defines all aspects of a Google Doc, from the title to headers / footers to the
-         * actual document body and its styling!
+         * @param options the title to assign to the new document, and the information necessary
+         * to store the new documentId returned from the creation process
          * @returns the documentId of the newly generated document, or undefined if the creation process fails.
          */
-        const Create = async (title?: string): Promise<string | undefined> => {
-            let path = RouteStore.googleDocs + Actions.Create;
-            let parameters = {
+        const Create = async (options: CreateOptions): Promise<string | undefined> => {
+            const path = RouteStore.googleDocs + Actions.Create;
+            const parameters = {
                 requestBody: {
-                    title: title || `Dash Export (${new Date().toDateString()})`
+                    title: options.title || `Dash Export (${new Date().toDateString()})`
                 }
             };
             try {
-                let schema: docs_v1.Schema$Document = await PostToServer(path, parameters);
-                return schema.documentId;
+                const schema: docs_v1.Schema$Document = await PostToServer(path, parameters);
+                const generatedId = schema.documentId;
+                if (generatedId) {
+                    options.handler(generatedId);
+                    return generatedId;
+                }
             } catch {
                 return undefined;
             }
         };
 
         const Retrieve = async (documentId: string): Promise<docs_v1.Schema$Document | undefined> => {
-            let path = RouteStore.googleDocs + Actions.Retrieve;
-            let parameters = {
+            const path = RouteStore.googleDocs + Actions.Retrieve;
+            const parameters = {
                 documentId
             };
             try {
-                let schema: docs_v1.Schema$Document = await PostToServer(path, parameters);
+                const schema: docs_v1.Schema$Document = await PostToServer(path, parameters);
                 return schema;
             } catch {
                 return undefined;
@@ -104,16 +115,15 @@ export namespace GoogleApiClientUtils {
         };
 
         const Update = async (documentId: string, requests: docs_v1.Schema$Request[]): Promise<docs_v1.Schema$BatchUpdateDocumentResponse | undefined> => {
-            let path = RouteStore.googleDocs + Actions.Update;
-            let parameters = {
+            const path = RouteStore.googleDocs + Actions.Update;
+            const parameters = {
                 documentId,
                 requestBody: {
                     requests
                 }
             };
             try {
-                let replies: docs_v1.Schema$BatchUpdateDocumentResponse = await PostToServer(path, parameters);
-                console.log(replies);
+                const replies: docs_v1.Schema$BatchUpdateDocumentResponse = await PostToServer(path, parameters);
                 return replies;
             } catch {
                 return undefined;
@@ -131,38 +141,32 @@ export namespace GoogleApiClientUtils {
                 if (!schema) {
                     return undefined;
                 }
-                let lines = Utils.extractText(schema).split("\n");
+                const lines = Utils.extractText(schema).split("\n");
                 return options.removeNewlines ? lines.filter(line => line.length) : lines;
             });
         };
 
         export const Write = async (options: WriteOptions): Promise<docs_v1.Schema$BatchUpdateDocumentResponse | undefined> => {
-            let target = options.documentId;
-            if (!target) {
-                if (!(target = await Create(options.title))) {
-                    return undefined;
-                }
+            let documentId: string | undefined;
+            const ref = options.reference;
+            if (!(documentId = typeof ref === "string" ? ref : await Create(ref))) {
+                return undefined;
             }
             let index = options.index;
             if (!index) {
-                let schema = await Retrieve(target);
+                let schema = await Retrieve(documentId);
                 if (!schema || !(index = Utils.EndOf(schema))) {
                     return undefined;
                 }
             }
-            let text = options.content;
-            let request = {
+            const text = options.content;
+            const request = {
                 insertText: {
                     text: isArray(text) ? text.join("\n") : text,
                     location: { index }
                 }
             };
-            return Update(target, [request]).then(res => {
-                if (res && options.store) {
-                    options.store.receiver[options.store.key] = res.documentId;
-                }
-                return res;
-            });
+            return Update(documentId, [request]);
         };
 
     }
diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index 7b15e9624..77f0e3d60 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -149,18 +149,6 @@ export class MainView extends React.Component {
         }, { fireImmediately: true });
     }
 
-    componentDidMount() {
-        reaction(() => this.mainContainer, () => {
-            let main = this.mainContainer, documentId;
-            if (main && (documentId = StrCast(main.googleDocId))) {
-                let options = { documentId, removeNewlines: true };
-                GoogleApiClientUtils.Docs.ReadLines(options).then(lines => {
-                    console.log(lines);
-                });
-            }
-        });
-    }
-
     componentWillUnMount() {
         window.removeEventListener("keydown", KeyManager.Instance.handle);
         window.removeEventListener("pointerdown", this.globalPointerDown);
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 8c2af7c9e..50ec27259 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -670,16 +670,18 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
     }
 
     exportToGoogleDoc = () => {
-        let dataDoc = Doc.GetProto(this.props.Document);
-        let data = Cast(dataDoc.data, RichTextField);
-        let content: string | undefined;
-        if (data && (content = data.plainText())) {
-            GoogleApiClientUtils.Docs.Write({
-                title: StrCast(dataDoc.title),
-                store: { receiver: dataDoc, key: googleDocKey },
-                content
-            });
+        const dataDoc = Doc.GetProto(this.props.Document);
+        const data = Cast(dataDoc.data, RichTextField);
+        if (!data) {
+            return;
         }
+        GoogleApiClientUtils.Docs.Write({
+            reference: {
+                title: StrCast(dataDoc.title),
+                handler: id => dataDoc[googleDocKey] = id
+            },
+            content: data.plainText()
+        });
     }
 
     render() {
diff --git a/src/new_fields/RichTextField.ts b/src/new_fields/RichTextField.ts
index dc66813e0..3e8803a34 100644
--- a/src/new_fields/RichTextField.ts
+++ b/src/new_fields/RichTextField.ts
@@ -33,6 +33,6 @@ export class RichTextField extends ObjectField {
             considering = considering.substring(matches.index + matches[0].length);
             this.Extractor.lastIndex = 0;
         }
-        return contents.length ? contents : undefined;
+        return contents;
     }
 }
\ No newline at end of file
-- 
cgit v1.2.3-70-g09d2


From 48fcec82fa384ec260a02965f9f78c2e41256dd9 Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Wed, 14 Aug 2019 03:41:11 -0400
Subject: clean up and regex improvement

---
 .../apis/google_docs/GoogleApiClientUtils.ts       | 111 ++++++++++++---------
 src/client/views/nodes/FormattedTextBox.tsx        |  15 ++-
 src/new_fields/RichTextField.ts                    |   4 +-
 src/server/index.ts                                |  35 ++++---
 4 files changed, 99 insertions(+), 66 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/apis/google_docs/GoogleApiClientUtils.ts b/src/client/apis/google_docs/GoogleApiClientUtils.ts
index f4fb87e0b..c6c7d7bd4 100644
--- a/src/client/apis/google_docs/GoogleApiClientUtils.ts
+++ b/src/client/apis/google_docs/GoogleApiClientUtils.ts
@@ -1,7 +1,7 @@
 import { docs_v1 } from "googleapis";
 import { PostToServer } from "../../../Utils";
 import { RouteStore } from "../../../server/RouteStore";
-import { Opt, Doc } from "../../../new_fields/Doc";
+import { Opt } from "../../../new_fields/Doc";
 import { isArray } from "util";
 
 export namespace GoogleApiClientUtils {
@@ -14,9 +14,42 @@ export namespace GoogleApiClientUtils {
             Update = "update"
         }
 
+        export type DocumentId = string;
+        export type Reference = DocumentId | CreateOptions;
+        export type TextContent = string | string[];
+        export type IdHandler = (id: DocumentId) => any;
+
+        export type CreationResult = Opt<DocumentId>;
+        export type RetrievalResult = Opt<docs_v1.Schema$Document>;
+        export type UpdateResult = Opt<docs_v1.Schema$BatchUpdateDocumentResponse>;
+        export type ReadLinesResult = Opt<string[]>;
+        export type ReadResult = Opt<string>;
+
+        export interface CreateOptions {
+            handler: IdHandler; // callback to process the documentId of the newly created Google Doc
+            title?: string; // if excluded, will use a default title annotated with the current date
+        }
+
+        export interface RetrieveOptions {
+            documentId: DocumentId;
+        }
+
+        export type ReadOptions = RetrieveOptions & { removeNewlines?: boolean };
+
+        export interface WriteOptions {
+            content: TextContent;
+            reference: Reference;
+            index?: number; // if excluded, will compute the last index of the document and append the content there
+        }
+
+        export interface UpdateOptions {
+            documentId: DocumentId;
+            requests: docs_v1.Schema$Request[];
+        }
+
         export namespace Utils {
 
-            export const extractText = (document: docs_v1.Schema$Document, removeNewlines = false) => {
+            export const extractText = (document: docs_v1.Schema$Document, removeNewlines = false): string => {
                 const fragments: string[] = [];
                 if (document.body && document.body.content) {
                     for (const element of document.body.content) {
@@ -34,7 +67,7 @@ export namespace GoogleApiClientUtils {
                 return removeNewlines ? text.ReplaceAll("\n", "") : text;
             };
 
-            export const EndOf = (schema: docs_v1.Schema$Document): Opt<number> => {
+            export const endOf = (schema: docs_v1.Schema$Document): number | undefined => {
                 if (schema.body && schema.body.content) {
                     const paragraphs = schema.body.content.filter(el => el.paragraph);
                     if (paragraphs.length) {
@@ -50,27 +83,8 @@ export namespace GoogleApiClientUtils {
                 }
             };
 
-        }
+            export const initialize = async (reference: Reference) => typeof reference === "string" ? reference : create(reference);
 
-        export type IdHandler = (id: DocumentId) => any;
-        export interface CreateOptions {
-            handler: IdHandler;
-            // if excluded, will use a default title annotated with the current date
-            title?: string;
-        }
-
-        export interface ReadOptions {
-            documentId: string;
-            // if exluded, will preserve newlines
-            removeNewlines?: boolean;
-        }
-
-        export type DocumentId = string;
-        export interface WriteOptions {
-            content: string | string[];
-            reference: DocumentId | CreateOptions;
-            // if excluded, will compute the last index of the document and append the content there
-            index?: number;
         }
 
         /**
@@ -82,7 +96,7 @@ export namespace GoogleApiClientUtils {
          * to store the new documentId returned from the creation process
          * @returns the documentId of the newly generated document, or undefined if the creation process fails.
          */
-        const Create = async (options: CreateOptions): Promise<string | undefined> => {
+        export const create = async (options: CreateOptions): Promise<CreationResult> => {
             const path = RouteStore.googleDocs + Actions.Create;
             const parameters = {
                 requestBody: {
@@ -101,43 +115,40 @@ export namespace GoogleApiClientUtils {
             }
         };
 
-        const Retrieve = async (documentId: string): Promise<docs_v1.Schema$Document | undefined> => {
+        export const retrieve = async (options: RetrieveOptions): Promise<RetrievalResult> => {
             const path = RouteStore.googleDocs + Actions.Retrieve;
-            const parameters = {
-                documentId
-            };
             try {
-                const schema: docs_v1.Schema$Document = await PostToServer(path, parameters);
+                const schema: RetrievalResult = await PostToServer(path, options);
                 return schema;
             } catch {
                 return undefined;
             }
         };
 
-        const Update = async (documentId: string, requests: docs_v1.Schema$Request[]): Promise<docs_v1.Schema$BatchUpdateDocumentResponse | undefined> => {
+        export const update = async (options: UpdateOptions): Promise<UpdateResult> => {
             const path = RouteStore.googleDocs + Actions.Update;
             const parameters = {
-                documentId,
+                documentId: options.documentId,
                 requestBody: {
-                    requests
+                    requests: options.requests
                 }
             };
             try {
-                const replies: docs_v1.Schema$BatchUpdateDocumentResponse = await PostToServer(path, parameters);
+                const replies: UpdateResult = await PostToServer(path, parameters);
                 return replies;
             } catch {
                 return undefined;
             }
         };
 
-        export const Read = async (options: ReadOptions): Promise<string | undefined> => {
-            return Retrieve(options.documentId).then(schema => {
+        export const read = async (options: ReadOptions): Promise<ReadResult> => {
+            return retrieve(options).then(schema => {
                 return schema ? Utils.extractText(schema, options.removeNewlines) : undefined;
             });
         };
 
-        export const ReadLines = async (options: ReadOptions) => {
-            return Retrieve(options.documentId).then(schema => {
+        export const readLines = async (options: ReadOptions): Promise<ReadLinesResult> => {
+            return retrieve(options).then(schema => {
                 if (!schema) {
                     return undefined;
                 }
@@ -146,27 +157,29 @@ export namespace GoogleApiClientUtils {
             });
         };
 
-        export const Write = async (options: WriteOptions): Promise<docs_v1.Schema$BatchUpdateDocumentResponse | undefined> => {
-            let documentId: string | undefined;
-            const ref = options.reference;
-            if (!(documentId = typeof ref === "string" ? ref : await Create(ref))) {
+        export const write = async (options: WriteOptions): Promise<UpdateResult> => {
+            const documentId = await Utils.initialize(options.reference);
+            if (!documentId) {
                 return undefined;
             }
             let index = options.index;
             if (!index) {
-                let schema = await Retrieve(documentId);
-                if (!schema || !(index = Utils.EndOf(schema))) {
+                let schema = await retrieve({ documentId });
+                if (!schema || !(index = Utils.endOf(schema))) {
                     return undefined;
                 }
             }
             const text = options.content;
-            const request = {
-                insertText: {
-                    text: isArray(text) ? text.join("\n") : text,
-                    location: { index }
-                }
+            const updateOptions = {
+                documentId,
+                requests: [{
+                    insertText: {
+                        text: isArray(text) ? text.join("\n") : text,
+                        location: { index }
+                    }
+                }]
             };
-            return Update(documentId, [request]);
+            return update(updateOptions);
         };
 
     }
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 50ec27259..46aed9b2d 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -288,6 +288,19 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         }
     }
 
+    componentWillMount() {
+        this.pollExportedCounterpart();
+    }
+
+    pollExportedCounterpart = async () => {
+        let dataDoc = Doc.GetProto(this.props.Document);
+        let documentId = StrCast(dataDoc[googleDocKey]);
+        if (documentId) {
+            let contents = await GoogleApiClientUtils.Docs.read({ documentId });
+            contents ? console.log(contents) : delete dataDoc[googleDocKey];
+        }
+    }
+
     componentDidMount() {
         const config = {
             schema,
@@ -675,7 +688,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         if (!data) {
             return;
         }
-        GoogleApiClientUtils.Docs.Write({
+        GoogleApiClientUtils.Docs.write({
             reference: {
                 title: StrCast(dataDoc.title),
                 handler: id => dataDoc[googleDocKey] = id
diff --git a/src/new_fields/RichTextField.ts b/src/new_fields/RichTextField.ts
index 3e8803a34..4f782816c 100644
--- a/src/new_fields/RichTextField.ts
+++ b/src/new_fields/RichTextField.ts
@@ -9,7 +9,7 @@ import { scriptingGlobal } from "../client/util/Scripting";
 export class RichTextField extends ObjectField {
     @serializable(true)
     readonly Data: string;
-    private Extractor = /,\"text\":\"([^\"\}]*)\"\}/g;
+    private Extractor = /,\"text\":\"([^\}]*)\"\}/g;
 
     constructor(data: string) {
         super();
@@ -33,6 +33,6 @@ export class RichTextField extends ObjectField {
             considering = considering.substring(matches.index + matches[0].length);
             this.Extractor.lastIndex = 0;
         }
-        return contents;
+        return contents.ReplaceAll("\\", "");
     }
 }
\ No newline at end of file
diff --git a/src/server/index.ts b/src/server/index.ts
index abaa29658..ef1829f30 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -43,6 +43,8 @@ import * as YoutubeApi from "./apis/youtube/youtubeApiSample";
 import { Response } from 'express-serve-static-core';
 import { GoogleApiServerUtils } from "./apis/google/GoogleApiServerUtils";
 import { GaxiosResponse } from 'gaxios';
+import { Opt } from '../new_fields/Doc';
+import { docs_v1 } from 'googleapis';
 const MongoStore = require('connect-mongo')(session);
 const mongoose = require('mongoose');
 const probe = require("probe-image-size");
@@ -797,23 +799,28 @@ function HandleYoutubeQuery([query, callback]: [YoutubeQueryInput, (result?: any
 const credentials = path.join(__dirname, "./credentials/google_docs_credentials.json");
 const token = path.join(__dirname, "./credentials/google_docs_token.json");
 
+type ApiResponse = Promise<GaxiosResponse>;
+type ApiHandler = (endpoint: docs_v1.Resource$Documents, parameters: any) => ApiResponse;
+type Action = "create" | "retrieve" | "update";
+
+const EndpointHandlerMap = new Map<Action, ApiHandler>([
+    ["create", (api, params) => api.create(params)],
+    ["retrieve", (api, params) => api.get(params)],
+    ["update", (api, params) => api.batchUpdate(params)],
+]);
+
 app.post(RouteStore.googleDocs + ":action", (req, res) => {
     GoogleApiServerUtils.Docs.GetEndpoint({ credentials, token }).then(endpoint => {
-        let results: Promise<GaxiosResponse> | undefined;
-        let documents = endpoint.documents;
-        let parameters = req.body;
-        switch (req.params.action) {
-            case "create":
-                results = documents.create(parameters);
-                break;
-            case "retrieve":
-                results = documents.get(parameters);
-                break;
-            case "update":
-                results = documents.batchUpdate(parameters);
-                break;
+        let handler = EndpointHandlerMap.get(req.params.action);
+        if (handler) {
+            let execute = handler(endpoint.documents, req.body).then(
+                response => res.send(response.data),
+                rejection => res.send(rejection)
+            );
+            execute.catch(exception => res.send(exception));
+            return;
         }
-        !results ? res.send(undefined) : results.then(response => res.send(response.data));
+        res.send(undefined);
     });
 });
 
-- 
cgit v1.2.3-70-g09d2


From 9ea032b9ab14ba17511b1014044dba0236e93837 Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Wed, 14 Aug 2019 10:48:23 -0400
Subject: refactored plain text parsing and setting

---
 src/client/views/nodes/FormattedTextBox.tsx | 13 +++++---
 src/new_fields/RichTextField.ts             | 50 ++++++++++++++++++++++-------
 2 files changed, 48 insertions(+), 15 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 46aed9b2d..5ba2aa0cf 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -12,7 +12,7 @@ import { EditorView } from "prosemirror-view";
 import { Doc, Opt, DocListCast } from "../../../new_fields/Doc";
 import { Id, Copy } from '../../../new_fields/FieldSymbols';
 import { List } from '../../../new_fields/List';
-import { RichTextField } from "../../../new_fields/RichTextField";
+import { RichTextField, ToPlainText, FromPlainText } from "../../../new_fields/RichTextField";
 import { createSchema, listSpec, makeInterface } from "../../../new_fields/Schema";
 import { BoolCast, Cast, NumCast, StrCast, DateCast } from "../../../new_fields/Types";
 import { DocServer } from "../../DocServer";
@@ -296,8 +296,13 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         let dataDoc = Doc.GetProto(this.props.Document);
         let documentId = StrCast(dataDoc[googleDocKey]);
         if (documentId) {
-            let contents = await GoogleApiClientUtils.Docs.read({ documentId });
-            contents ? console.log(contents) : delete dataDoc[googleDocKey];
+            let exportState = await GoogleApiClientUtils.Docs.read({ documentId });
+            if (exportState) {
+                let data = Cast(dataDoc.data, RichTextField);
+                data && data[FromPlainText](exportState);
+            } else {
+                delete dataDoc[googleDocKey];
+            }
         }
     }
 
@@ -693,7 +698,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
                 title: StrCast(dataDoc.title),
                 handler: id => dataDoc[googleDocKey] = id
             },
-            content: data.plainText()
+            content: data[ToPlainText]()
         });
     }
 
diff --git a/src/new_fields/RichTextField.ts b/src/new_fields/RichTextField.ts
index 4f782816c..9d8a1cecb 100644
--- a/src/new_fields/RichTextField.ts
+++ b/src/new_fields/RichTextField.ts
@@ -4,12 +4,14 @@ import { Deserializable } from "../client/util/SerializationHelper";
 import { Copy, ToScriptString } from "./FieldSymbols";
 import { scriptingGlobal } from "../client/util/Scripting";
 
+export const ToPlainText = Symbol("PlainText");
+export const FromPlainText = Symbol("PlainText");
+
 @scriptingGlobal
 @Deserializable("RichTextField")
 export class RichTextField extends ObjectField {
     @serializable(true)
-    readonly Data: string;
-    private Extractor = /,\"text\":\"([^\}]*)\"\}/g;
+    Data: string;
 
     constructor(data: string) {
         super();
@@ -24,15 +26,41 @@ export class RichTextField extends ObjectField {
         return `new RichTextField("${this.Data}")`;
     }
 
-    plainText = () => {
-        let contents = "";
-        let matches: RegExpExecArray | null;
-        let considering = this.Data;
-        while ((matches = this.Extractor.exec(considering)) !== null) {
-            contents += matches[1];
-            considering = considering.substring(matches.index + matches[0].length);
-            this.Extractor.lastIndex = 0;
+    [ToPlainText]() {
+        let content = JSON.parse(this.Data).doc.content;
+        let paragraphs = content.filter((item: any) => item.type === "paragraph");
+        let output = "";
+        for (let i = 0; i < paragraphs.length; i++) {
+            let paragraph = paragraphs[i];
+            if (paragraph.content) {
+                output += paragraph.content.map((block: any) => block.text).join("");
+            } else {
+                output += i > 0 && paragraphs[i - 1].content ? "\n\n" : "\n";
+            }
         }
-        return contents.ReplaceAll("\\", "");
+        return output;
+    }
+
+    [FromPlainText](plainText: string) {
+        let elements = plainText.split("\n");
+        let parsed = JSON.parse(this.Data);
+        parsed.doc.content = elements.map(text => {
+            let paragraph: any = { type: "paragraph" };
+            if (text.length) {
+                paragraph.content = [{
+                    type: "text",
+                    marks: [],
+                    text
+                }];
+            }
+            return paragraph;
+        });
+        parsed.selection = {
+            type: "text",
+            anchor: 0,
+            head: 0
+        };
+        this.Data = JSON.stringify(parsed);
     }
+
 }
\ No newline at end of file
-- 
cgit v1.2.3-70-g09d2


From 13d2be7f66c01ee9f09cb65f567eb3da760df670 Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Wed, 14 Aug 2019 15:18:13 -0400
Subject: semi-synchronous editing between dash notes and google docs

---
 package.json                                       |  2 +
 .../apis/google_docs/GoogleApiClientUtils.ts       | 40 ++++++++++++++------
 src/client/views/nodes/FormattedTextBox.tsx        | 44 ++++++++++++++--------
 src/new_fields/RichTextField.ts                    | 25 +++++++-----
 4 files changed, 76 insertions(+), 35 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/package.json b/package.json
index 326468ab9..7a629d813 100644
--- a/package.json
+++ b/package.json
@@ -63,6 +63,7 @@
         "@types/cookie-parser": "^1.4.1",
         "@types/cookie-session": "^2.0.36",
         "@types/d3-format": "^1.3.1",
+        "@types/diff": "^4.0.2",
         "@types/dotenv": "^6.1.1",
         "@types/express": "^4.16.1",
         "@types/express-flash": "0.0.0",
@@ -127,6 +128,7 @@
         "cookie-session": "^2.0.0-beta.3",
         "crypto-browserify": "^3.11.0",
         "d3-format": "^1.3.2",
+        "diff": "^4.0.1",
         "dotenv": "^8.0.0",
         "express": "^4.16.4",
         "express-flash": "0.0.2",
diff --git a/src/client/apis/google_docs/GoogleApiClientUtils.ts b/src/client/apis/google_docs/GoogleApiClientUtils.ts
index c6c7d7bd4..c1cbba31f 100644
--- a/src/client/apis/google_docs/GoogleApiClientUtils.ts
+++ b/src/client/apis/google_docs/GoogleApiClientUtils.ts
@@ -14,6 +14,11 @@ export namespace GoogleApiClientUtils {
             Update = "update"
         }
 
+        export enum WriteMode {
+            Insert,
+            Replace
+        }
+
         export type DocumentId = string;
         export type Reference = DocumentId | CreateOptions;
         export type TextContent = string | string[];
@@ -37,6 +42,7 @@ export namespace GoogleApiClientUtils {
         export type ReadOptions = RetrieveOptions & { removeNewlines?: boolean };
 
         export interface WriteOptions {
+            mode: WriteMode;
             content: TextContent;
             reference: Reference;
             index?: number; // if excluded, will compute the last index of the document and append the content there
@@ -158,28 +164,40 @@ export namespace GoogleApiClientUtils {
         };
 
         export const write = async (options: WriteOptions): Promise<UpdateResult> => {
+            const requests: docs_v1.Schema$Request[] = [];
             const documentId = await Utils.initialize(options.reference);
             if (!documentId) {
                 return undefined;
             }
             let index = options.index;
-            if (!index) {
+            const mode = options.mode;
+            if (!(index && mode === WriteMode.Insert)) {
                 let schema = await retrieve({ documentId });
                 if (!schema || !(index = Utils.endOf(schema))) {
                     return undefined;
                 }
             }
-            const text = options.content;
-            const updateOptions = {
-                documentId,
-                requests: [{
-                    insertText: {
-                        text: isArray(text) ? text.join("\n") : text,
-                        location: { index }
+            if (mode === WriteMode.Replace) {
+                requests.push({
+                    deleteContentRange: {
+                        range: {
+                            startIndex: 1,
+                            endIndex: index
+                        }
                     }
-                }]
-            };
-            return update(updateOptions);
+                });
+                index = 1;
+            }
+            const text = options.content;
+            requests.push({
+                insertText: {
+                    text: isArray(text) ? text.join("\n") : text,
+                    location: { index }
+                }
+            });
+            let replies = await update({ documentId, requests });
+            console.log(replies);
+            return replies;
         };
 
     }
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 5ba2aa0cf..ad29ce775 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -12,7 +12,7 @@ import { EditorView } from "prosemirror-view";
 import { Doc, Opt, DocListCast } from "../../../new_fields/Doc";
 import { Id, Copy } from '../../../new_fields/FieldSymbols';
 import { List } from '../../../new_fields/List';
-import { RichTextField, ToPlainText, FromPlainText } from "../../../new_fields/RichTextField";
+import { RichTextField, ToGoogleDocText, FromGoogleDocText } from "../../../new_fields/RichTextField";
 import { createSchema, listSpec, makeInterface } from "../../../new_fields/Schema";
 import { BoolCast, Cast, NumCast, StrCast, DateCast } from "../../../new_fields/Types";
 import { DocServer } from "../../DocServer";
@@ -39,6 +39,7 @@ import { DateField } from '../../../new_fields/DateField';
 import { Utils } from '../../../Utils';
 import { MainOverlayTextBox } from '../MainOverlayTextBox';
 import { GoogleApiClientUtils } from '../../apis/google_docs/GoogleApiClientUtils';
+import * as diff from "diff";
 
 library.add(faEdit);
 library.add(faSmile, faTextHeight, faUpload);
@@ -299,7 +300,9 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             let exportState = await GoogleApiClientUtils.Docs.read({ documentId });
             if (exportState) {
                 let data = Cast(dataDoc.data, RichTextField);
-                data && data[FromPlainText](exportState);
+                if (data) {
+                    dataDoc.data = new RichTextField(data[FromGoogleDocText](exportState));
+                }
             } else {
                 delete dataDoc[googleDocKey];
             }
@@ -629,6 +632,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             this._undoTyping.end();
             this._undoTyping = undefined;
         }
+        this.updateGoogleDoc();
     }
     public _undoTyping?: UndoManager.Batch;
     onKeyPress = (e: React.KeyboardEvent) => {
@@ -683,23 +687,33 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         });
         ContextMenu.Instance.addItem({ description: "Text Funcs...", subitems: subitems, icon: "text-height" });
         if (!(googleDocKey in Doc.GetProto(this.props.Document))) {
-            ContextMenu.Instance.addItem({ description: "Export to Google Doc...", event: this.exportToGoogleDoc, icon: "upload" });
+            ContextMenu.Instance.addItem({
+                description: "Export to Google Doc...",
+                event: this.updateGoogleDoc,
+                icon: "upload"
+            });
         }
     }
 
-    exportToGoogleDoc = () => {
-        const dataDoc = Doc.GetProto(this.props.Document);
-        const data = Cast(dataDoc.data, RichTextField);
-        if (!data) {
-            return;
+    updateGoogleDoc = () => {
+        let modes = GoogleApiClientUtils.Docs.WriteMode;
+        let mode = modes.Replace;
+        let reference: Opt<GoogleApiClientUtils.Docs.Reference> = Cast(this.dataDoc[googleDocKey], "string");
+        if (!reference) {
+            mode = modes.Insert;
+            reference = {
+                title: StrCast(this.dataDoc.title),
+                handler: id => this.dataDoc[googleDocKey] = id
+            };
+        }
+        const data = Cast(this.dataDoc.data, RichTextField);
+        if (data) {
+            GoogleApiClientUtils.Docs.write({
+                mode,
+                content: data[ToGoogleDocText](),
+                reference
+            });
         }
-        GoogleApiClientUtils.Docs.write({
-            reference: {
-                title: StrCast(dataDoc.title),
-                handler: id => dataDoc[googleDocKey] = id
-            },
-            content: data[ToPlainText]()
-        });
     }
 
     render() {
diff --git a/src/new_fields/RichTextField.ts b/src/new_fields/RichTextField.ts
index f0284b1b8..92b19b921 100644
--- a/src/new_fields/RichTextField.ts
+++ b/src/new_fields/RichTextField.ts
@@ -4,14 +4,14 @@ import { Deserializable } from "../client/util/SerializationHelper";
 import { Copy, ToScriptString } from "./FieldSymbols";
 import { scriptingGlobal } from "../client/util/Scripting";
 
-export const ToPlainText = Symbol("PlainText");
-export const FromPlainText = Symbol("PlainText");
+export const ToGoogleDocText = Symbol("PlainText");
+export const FromGoogleDocText = Symbol("PlainText");
 
 @scriptingGlobal
 @Deserializable("RichTextField")
 export class RichTextField extends ObjectField {
     @serializable(true)
-    Data: string;
+    readonly Data: string;
 
     constructor(data: string) {
         super();
@@ -26,24 +26,28 @@ export class RichTextField extends ObjectField {
         return `new RichTextField("${this.Data}")`;
     }
 
-    [ToPlainText]() {
+    [ToGoogleDocText]() {
         let content = JSON.parse(this.Data).doc.content;
         let paragraphs = content.filter((item: any) => item.type === "paragraph");
         let output = "";
         for (let i = 0; i < paragraphs.length; i++) {
             let paragraph = paragraphs[i];
+            let addNewLine = i > 0 ? paragraphs[i - 1].content : false;
             if (paragraph.content) {
                 output += paragraph.content.map((block: any) => block.text).join("");
             } else {
-                output += i > 0 && paragraphs[i - 1].content ? "\n\n" : "\n";
+                output += "\n";
             }
+            addNewLine && (output += "\n");
         }
         return output;
     }
 
-    [FromPlainText](plainText: string) {
+    [FromGoogleDocText](plainText: string) {
         let elements = plainText.split("\n");
+        !elements[elements.length - 1].length && elements.pop();
         let parsed = JSON.parse(this.Data);
+        let blankCount = 0;
         parsed.doc.content = elements.map(text => {
             let paragraph: any = { type: "paragraph" };
             if (text.length) {
@@ -52,15 +56,18 @@ export class RichTextField extends ObjectField {
                     marks: [],
                     text
                 }];
+            } else {
+                blankCount++;
             }
             return paragraph;
         });
+        let selection = plainText.length + 2 * blankCount;
         parsed.selection = {
             type: "text",
-            anchor: plainText.length,
-            head: plainText.length
+            anchor: selection,
+            head: selection
         };
-        this.Data = JSON.stringify(parsed);
+        return JSON.stringify(parsed);
     }
 
 }
\ No newline at end of file
-- 
cgit v1.2.3-70-g09d2


From 6bbf8df1b246647ae478103504e73c98df7b8183 Mon Sep 17 00:00:00 2001
From: monikahedman <monika_hedman@brown.edu>
Date: Thu, 15 Aug 2019 18:07:04 -0400
Subject: text paste working!

---
 src/client/views/PreviewCursor.tsx                 | 31 +++++++++------
 .../collections/collectionFreeForm/MarqueeView.tsx |  3 +-
 src/client/views/nodes/FormattedTextBox.tsx        | 46 +++++++++++-----------
 3 files changed, 46 insertions(+), 34 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/PreviewCursor.tsx b/src/client/views/PreviewCursor.tsx
index 04ec51218..dbda46dbc 100644
--- a/src/client/views/PreviewCursor.tsx
+++ b/src/client/views/PreviewCursor.tsx
@@ -4,13 +4,15 @@ import "normalize.css";
 import * as React from 'react';
 import "./PreviewCursor.scss";
 import { Docs } from '../documents/Documents';
-import { Transform } from 'prosemirror-transform';
+// import { Transform } from 'prosemirror-transform';
 import { Doc } from '../../new_fields/Doc';
+import { Transform } from "../util/Transform";
 
 @observer
 export class PreviewCursor extends React.Component<{}> {
     private _prompt = React.createRef<HTMLDivElement>();
     static _onKeyPress?: (e: KeyboardEvent) => void;
+    static _getTransform: () => Transform;
     static _addLiveTextDoc: (doc: Doc) => void;
     @observable static _clickPoint = [0, 0];
     @observable public static Visible = false;
@@ -26,22 +28,28 @@ export class PreviewCursor extends React.Component<{}> {
     }
 
     paste = (e: ClipboardEvent) => {
-        console.log("pasting")
         if (PreviewCursor.Visible) {
-            console.log("preview is visible")
             if (e.clipboardData) {
-                //what needs to be done with this?
-                console.log(e.clipboardData.getData("text/html"));
+                //keeping these just to hold onto types of pastes
+                //what needs to be done with html?
+                // console.log(e.clipboardData.getData("text/html"));
                 // console.log(e.clipboardData.getData("text/csv"));
-                console.log(e.clipboardData.getData("text/plain"));
-                console.log(e.clipboardData.getData("image/png"));
-                console.log(e.clipboardData.getData("image/jpg"));
-                console.log(e.clipboardData.getData("image/jpeg"));
+                // console.log(e.clipboardData.getData("text/plain"));
+                // console.log(e.clipboardData.getData("image/png"));
+                // console.log(e.clipboardData.getData("image/jpg"));
+                // console.log(e.clipboardData.getData("image/jpeg"));
 
                 // pasting in text
                 if (e.clipboardData.getData("text/plain") !== "") {
                     let text = e.clipboardData.getData("text/plain");
-                    let newBox = Docs.Create.TextDocument({ width: 200, height: 100, x: PreviewCursor._clickPoint[0], y: PreviewCursor._clickPoint[1], title: "-typed text-" });
+                    let newPoint = PreviewCursor._getTransform().transformPoint(PreviewCursor._clickPoint[0], PreviewCursor._clickPoint[1]);
+                    let newBox = Docs.Create.TextDocument({
+                        width: 200, height: 100,
+                        x: newPoint[0],
+                        y: newPoint[1],
+                        title: "-typed text-"
+                    });
+
                     newBox.proto!.autoHeight = true;
                     PreviewCursor._addLiveTextDoc(newBox);
                 }
@@ -69,10 +77,11 @@ export class PreviewCursor extends React.Component<{}> {
         }
     }
     @action
-    public static Show(x: number, y: number, onKeyPress: (e: KeyboardEvent) => void, addLiveText: (doc: Doc) => void) {
+    public static Show(x: number, y: number, onKeyPress: (e: KeyboardEvent) => void, addLiveText: (doc: Doc) => void, getTransform: () => Transform) {
         this._clickPoint = [x, y];
         this._onKeyPress = onKeyPress;
         this._addLiveTextDoc = addLiveText;
+        this._getTransform = getTransform;
         setTimeout(action(() => this.Visible = true), (1));
     }
     render() {
diff --git a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
index 08d2a8adf..72444983c 100644
--- a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
+++ b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
@@ -203,7 +203,8 @@ export class MarqueeView extends React.Component<MarqueeViewProps>
     onClick = (e: React.MouseEvent): void => {
         if (Math.abs(e.clientX - this._downX) < Utils.DRAG_THRESHOLD &&
             Math.abs(e.clientY - this._downY) < Utils.DRAG_THRESHOLD) {
-            PreviewCursor.Show(e.clientX, e.clientY, this.onKeyPress, this.props.addLiveTextDocument);
+            //this is probably the wrong transform
+            PreviewCursor.Show(e.clientX, e.clientY, this.onKeyPress, this.props.addLiveTextDocument, this.props.getTransform);
             // let the DocumentView stopPropagation of this event when it selects this document
         } else {  // why do we get a click event when the cursor have moved a big distance?
             // let's cut it off here so no one else has to deal with it.
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index a304cb297..25f611f19 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -134,28 +134,31 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
 
 
     paste = (e: ClipboardEvent) => {
+        //this is throwing a ton of erros so i had to comment it out
         if (e.clipboardData && this._editorView) {
-            let pdfPasteText = `${Utils.GenerateDeterministicGuid("pdf paste")}`;
-            for (let i = 0; i < e.clipboardData.items.length; i++) {
-                let item = e.clipboardData.items.item(i);
-                if (item.type === "text/plain") {
-                    item.getAsString((text) => {
-                        let pdfPasteIndex = text.indexOf(pdfPasteText);
-                        if (pdfPasteIndex > -1) {
-                            let insertText = text.substr(0, pdfPasteIndex);
-                            const tx = this._editorView!.state.tr.insertText(insertText);
-                            // tx.setSelection(new Selection(tx.))
-                            const state = this._editorView!.state;
-                            this._editorView!.dispatch(tx);
-                            if (FormattedTextBox._toolTipTextMenu) {
-                                // this._toolTipTextMenu.makeLinkWithState(state)
-                            }
-                            e.stopPropagation();
-                            e.preventDefault();
-                        }
-                    });
-                }
-            }
+            // let pdfPasteText = `${Utils.GenerateDeterministicGuid("pdf paste")}`;
+            // for (let i = 0; i < e.clipboardData.items.length; i++) {
+            //     let item = e.clipboardData.items.item(i);
+            //     console.log(item)
+            //     if (item.type === "text/plain") {
+            //         console.log("plain")
+            //         item.getAsString((text) => {
+            //             let pdfPasteIndex = text.indexOf(pdfPasteText);
+            //             if (pdfPasteIndex > -1) {
+            //                 let insertText = text.substr(0, pdfPasteIndex);
+            //                 const tx = this._editorView!.state.tr.insertText(insertText);
+            //                 // tx.setSelection(new Selection(tx.))
+            //                 const state = this._editorView!.state;
+            //                 this._editorView!.dispatch(tx);
+            //                 if (FormattedTextBox._toolTipTextMenu) {
+            //                     // this._toolTipTextMenu.makeLinkWithState(state)
+            //                 }
+            //                 e.stopPropagation();
+            //                 e.preventDefault();
+            //             }
+            //         });
+            //     }
+            // }
         }
     }
 
@@ -167,7 +170,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             FormattedTextBox._toolTipTextMenu && (FormattedTextBox._toolTipTextMenu.HackToFixTextSelectionGlitch = false);
             if (state.selection.empty && FormattedTextBox._toolTipTextMenu) {
                 const marks = tx.storedMarks;
-                console.log(marks)
                 if (marks) { FormattedTextBox._toolTipTextMenu.mark_key_pressed(marks); }
             }
             this._applyingChange = true;
-- 
cgit v1.2.3-70-g09d2


From 7ea6b44b10e1bf23287ba33e0081cacbfc595780 Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Mon, 19 Aug 2019 14:58:02 -0400
Subject: seemed to fix syncing with remote google doc

---
 src/client/views/DocumentDecorations.tsx    | 14 ++++++++
 src/client/views/nodes/FormattedTextBox.tsx | 41 ++++++++++++++---------
 src/new_fields/RichTextField.ts             | 52 +++++++++++++----------------
 3 files changed, 63 insertions(+), 44 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/DocumentDecorations.tsx b/src/client/views/DocumentDecorations.tsx
index 6616d5d58..963722fe3 100644
--- a/src/client/views/DocumentDecorations.tsx
+++ b/src/client/views/DocumentDecorations.tsx
@@ -1,5 +1,6 @@
 import { library } from '@fortawesome/fontawesome-svg-core';
 import { faLink, faTag } from '@fortawesome/free-solid-svg-icons';
+import * as fa from '@fortawesome/free-brands-svg-icons';
 import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
 import { action, computed, observable, reaction, runInAction } from "mobx";
 import { observer } from "mobx-react";
@@ -36,6 +37,7 @@ export const Flyout = higflyout.default;
 
 library.add(faLink);
 library.add(faTag);
+library.add(fa.faGoogleDrive as any);
 
 @observer
 export class DocumentDecorations extends React.Component<{}, { value: string }> {
@@ -618,6 +620,17 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>
         );
     }
 
+    considerGoogleDoc = () => {
+        let thisDoc = SelectionManager.SelectedDocuments()[0].props.Document;
+        let canEmbed = thisDoc.data && thisDoc.data instanceof RichTextField;
+        if (!canEmbed) return (null);
+        return (
+            <div className={"linkButtonWrapper"}>
+                <FontAwesomeIcon className="documentdecorations-icon" icon="image" size="sm" />
+            </div>
+        );
+    }
+
     considerTooltip = () => {
         let thisDoc = SelectionManager.SelectedDocuments()[0].props.Document;
         let isTextDoc = thisDoc.data && thisDoc.data instanceof RichTextField;
@@ -768,6 +781,7 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>
                     </div>
                     {this.metadataMenu}
                     {this.considerEmbed()}
+                    {this.considerGoogleDoc()}
                     {/* {this.considerTooltip()} */}
                 </div>
             </div >
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index ad29ce775..bc057bb5f 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -60,7 +60,7 @@ const richTextSchema = createSchema({
     documentText: "string"
 });
 
-const googleDocKey = "googleDocId";
+const googleDocId = "googleDocId";
 
 type RichTextDocument = makeInterface<[typeof richTextSchema]>;
 const RichTextDocument = makeInterface(richTextSchema);
@@ -84,6 +84,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
     private _proxyReactionDisposer: Opt<IReactionDisposer>;
     private dropDisposer?: DragManager.DragDropDisposer;
     public get CurrentDiv(): HTMLDivElement { return this._ref.current!; }
+    private isOpening = false;
     @observable _entered = false;
 
     @observable public static InputBoxOverlay?: FormattedTextBox = undefined;
@@ -295,17 +296,19 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
 
     pollExportedCounterpart = async () => {
         let dataDoc = Doc.GetProto(this.props.Document);
-        let documentId = StrCast(dataDoc[googleDocKey]);
+        let documentId = StrCast(dataDoc[googleDocId]);
         if (documentId) {
             let exportState = await GoogleApiClientUtils.Docs.read({ documentId });
             if (exportState) {
                 let data = Cast(dataDoc.data, RichTextField);
                 if (data) {
+                    this.isOpening = true;
                     dataDoc.data = new RichTextField(data[FromGoogleDocText](exportState));
                 }
             } else {
-                delete dataDoc[googleDocKey];
+                delete dataDoc[googleDocId];
             }
+            this.tryUpdateHeight();
         }
     }
 
@@ -346,9 +349,18 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
                 const field = this.dataDoc ? Cast(this.dataDoc[this.props.fieldKey], RichTextField) : undefined;
                 return field ? field.Data : `{"doc":{"type":"doc","content":[]},"selection":{"type":"text","anchor":0,"head":0}}`;
             },
-            field2 => {
-                this._editorView && !this._applyingChange &&
-                    this._editorView.updateState(EditorState.fromJSON(config, JSON.parse(field2)));
+            incomingValue => {
+                if (this._editorView && !this._applyingChange) {
+                    let updatedState = JSON.parse(incomingValue);
+                    this._editorView.updateState(EditorState.fromJSON(config, updatedState));
+                    // manually sets cursor selection at the end of the text on focus
+                    if (this.isOpening) {
+                        this.isOpening = false;
+                        let end = this._editorView.state.doc.content.size - 1;
+                        updatedState.selection = { type: "text", anchor: end, head: end };
+                        this._editorView.updateState(EditorState.fromJSON(config, updatedState));
+                    }
+                }
             }
         );
 
@@ -686,7 +698,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             event: action(() => Doc.GetProto(this.props.Document).autoHeight = !BoolCast(this.props.Document.autoHeight)), icon: "expand-arrows-alt"
         });
         ContextMenu.Instance.addItem({ description: "Text Funcs...", subitems: subitems, icon: "text-height" });
-        if (!(googleDocKey in Doc.GetProto(this.props.Document))) {
+        if (!(googleDocId in Doc.GetProto(this.props.Document))) {
             ContextMenu.Instance.addItem({
                 description: "Export to Google Doc...",
                 event: this.updateGoogleDoc,
@@ -698,21 +710,18 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
     updateGoogleDoc = () => {
         let modes = GoogleApiClientUtils.Docs.WriteMode;
         let mode = modes.Replace;
-        let reference: Opt<GoogleApiClientUtils.Docs.Reference> = Cast(this.dataDoc[googleDocKey], "string");
+        let reference: Opt<GoogleApiClientUtils.Docs.Reference> = Cast(this.dataDoc[googleDocId], "string");
         if (!reference) {
             mode = modes.Insert;
             reference = {
                 title: StrCast(this.dataDoc.title),
-                handler: id => this.dataDoc[googleDocKey] = id
+                handler: id => this.dataDoc[googleDocId] = id
             };
         }
-        const data = Cast(this.dataDoc.data, RichTextField);
-        if (data) {
-            GoogleApiClientUtils.Docs.write({
-                mode,
-                content: data[ToGoogleDocText](),
-                reference
-            });
+        if (this._editorView) {
+            let data = Cast(this.dataDoc.data, RichTextField);
+            let content = data ? data[ToGoogleDocText]() : this._editorView.state.doc.textContent;
+            GoogleApiClientUtils.Docs.write({ reference, content, mode });
         }
     }
 
diff --git a/src/new_fields/RichTextField.ts b/src/new_fields/RichTextField.ts
index 8963682c3..ec08293e9 100644
--- a/src/new_fields/RichTextField.ts
+++ b/src/new_fields/RichTextField.ts
@@ -6,6 +6,8 @@ import { scriptingGlobal } from "../client/util/Scripting";
 
 export const ToGoogleDocText = Symbol("PlainText");
 export const FromGoogleDocText = Symbol("PlainText");
+const delimiter = "\n";
+const joiner = "";
 
 @scriptingGlobal
 @Deserializable("RichTextField")
@@ -27,45 +29,39 @@ export class RichTextField extends ObjectField {
     }
 
     [ToGoogleDocText]() {
-        let state = JSON.parse(this.Data);
-        let text = state.doc.textBetween(0, state.doc.content.size, "\n\n");
-        console.log(text);
+        // Because we're working with plain text, just concatenate all paragraphs
         let content = JSON.parse(this.Data).doc.content;
         let paragraphs = content.filter((item: any) => item.type === "paragraph");
-        let output = "";
-        for (let i = 0; i < paragraphs.length; i++) {
-            let paragraph = paragraphs[i];
-            let addNewLine = i > 0 ? paragraphs[i - 1].content : false;
-            if (paragraph.content) {
-                output += paragraph.content.map((block: any) => block.text).join("");
-            } else {
-                output += i === 0 ? "" : "\n";
-            }
-            addNewLine && (output += "\n");
-        }
-        return output;
+
+        // Functions to flatten ProseMirror paragraph objects (and their components) to plain text
+        // While this function already exists in state.doc.textBeteen(), it doesn't account for newlines 
+        let blockText = (block: any) => block.text;
+        let concatenateParagraph = (p: any) => (p.content ? p.content.map(blockText).join(joiner) : "") + delimiter;
+
+        // Concatentate paragraphs and string the result together. Trim the last newline, an artifact.
+        let textParagraphs = paragraphs.map(concatenateParagraph);
+        return textParagraphs.join(joiner).trimEnd(delimiter);
     }
 
     [FromGoogleDocText](plainText: string) {
-        let elements = plainText.split("\n");
+        // Remap the text, creating blocks split on newlines
+        let elements = plainText.split(delimiter);
+
+        // Google Docs adds in an extra carriage return automatically, so this counteracts it
         !elements[elements.length - 1].length && elements.pop();
+
+        // Preserve the current state, but re-write the content to be the blocks
         let parsed = JSON.parse(this.Data);
         parsed.doc.content = elements.map(text => {
             let paragraph: any = { type: "paragraph" };
-            if (text.length) {
-                paragraph.content = [{
-                    type: "text",
-                    marks: [],
-                    text
-                }];
-            }
+            text.length && (paragraph.content = [{ type: "text", marks: [], text }]); // An empty paragraph gets treated as a line break
             return paragraph;
         });
-        parsed.selection = {
-            type: "text",
-            anchor: 1,
-            head: 1
-        };
+
+        // If the new content is shorter than the previous content and selection is unchanged, may throw an out of bounds exception, so we reset it
+        parsed.selection = { type: "text", anchor: 1, head: 1 };
+
+        // Export the ProseMirror-compatible state object we've jsut built
         return JSON.stringify(parsed);
     }
 
-- 
cgit v1.2.3-70-g09d2


From df11d1afdb271b37618ab9e1d362b2f4a1145982 Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Mon, 19 Aug 2019 17:48:57 -0400
Subject: cleanup, pull push

---
 .../apis/google_docs/GoogleApiClientUtils.ts       | 27 +++++---
 src/client/views/DocumentDecorations.tsx           | 32 +++++++---
 src/client/views/collections/CollectionSubView.tsx | 14 +++-
 src/client/views/nodes/FormattedTextBox.tsx        | 74 +++++++++++++---------
 4 files changed, 98 insertions(+), 49 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/apis/google_docs/GoogleApiClientUtils.ts b/src/client/apis/google_docs/GoogleApiClientUtils.ts
index 9d78b632d..55b4a76f8 100644
--- a/src/client/apis/google_docs/GoogleApiClientUtils.ts
+++ b/src/client/apis/google_docs/GoogleApiClientUtils.ts
@@ -27,8 +27,8 @@ export namespace GoogleApiClientUtils {
         export type CreationResult = Opt<DocumentId>;
         export type RetrievalResult = Opt<docs_v1.Schema$Document>;
         export type UpdateResult = Opt<docs_v1.Schema$BatchUpdateDocumentResponse>;
-        export type ReadLinesResult = Opt<string[]>;
-        export type ReadResult = Opt<string>;
+        export type ReadLinesResult = Opt<{ title?: string, bodyLines?: string[] }>;
+        export type ReadResult = { title?: string, body?: string };
 
         export interface CreateOptions {
             handler: IdHandler; // callback to process the documentId of the newly created Google Doc
@@ -148,18 +148,27 @@ export namespace GoogleApiClientUtils {
         };
 
         export const read = async (options: ReadOptions): Promise<ReadResult> => {
-            return retrieve(options).then(schema => {
-                return schema ? Utils.extractText(schema, options.removeNewlines) : undefined;
+            return retrieve(options).then(document => {
+                let result: ReadResult = {};
+                if (document) {
+                    let title = document.title;
+                    let body = Utils.extractText(document, options.removeNewlines);
+                    result = { title, body };
+                }
+                return result;
             });
         };
 
         export const readLines = async (options: ReadOptions): Promise<ReadLinesResult> => {
-            return retrieve(options).then(schema => {
-                if (!schema) {
-                    return undefined;
+            return retrieve(options).then(document => {
+                let result: ReadLinesResult = {};
+                if (document) {
+                    let title = document.title;
+                    let bodyLines = Utils.extractText(document).split("\n");
+                    options.removeNewlines && (bodyLines = bodyLines.filter(line => line.length));
+                    result = { title, bodyLines };
                 }
-                const lines = Utils.extractText(schema).split("\n");
-                return options.removeNewlines ? lines.filter(line => line.length) : lines;
+                return result;
             });
         };
 
diff --git a/src/client/views/DocumentDecorations.tsx b/src/client/views/DocumentDecorations.tsx
index 963722fe3..80d4ecb9b 100644
--- a/src/client/views/DocumentDecorations.tsx
+++ b/src/client/views/DocumentDecorations.tsx
@@ -1,6 +1,5 @@
 import { library } from '@fortawesome/fontawesome-svg-core';
-import { faLink, faTag } from '@fortawesome/free-solid-svg-icons';
-import * as fa from '@fortawesome/free-brands-svg-icons';
+import { faLink, faTag, faArrowAltCircleDown, faArrowAltCircleUp } from '@fortawesome/free-solid-svg-icons';
 import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
 import { action, computed, observable, reaction, runInAction } from "mobx";
 import { observer } from "mobx-react";
@@ -37,7 +36,8 @@ export const Flyout = higflyout.default;
 
 library.add(faLink);
 library.add(faTag);
-library.add(fa.faGoogleDrive as any);
+library.add(faArrowAltCircleDown);
+library.add(faArrowAltCircleUp);
 
 @observer
 export class DocumentDecorations extends React.Component<{}, { value: string }> {
@@ -620,13 +620,28 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>
         );
     }
 
-    considerGoogleDoc = () => {
+    considerGoogleDocsPush = () => {
         let thisDoc = SelectionManager.SelectedDocuments()[0].props.Document;
-        let canEmbed = thisDoc.data && thisDoc.data instanceof RichTextField;
-        if (!canEmbed) return (null);
+        let canPush = thisDoc.data && thisDoc.data instanceof RichTextField;
+        if (!canPush) return (null);
+        return (
+            <div className={"linkButtonWrapper"}>
+                <div title="Push to Google Docs" className="linkButton-linker" onClick={() => thisDoc.pushToGoogleDocsTrigger = !thisDoc.pushToGoogleDocsTrigger}>
+                    <FontAwesomeIcon className="documentdecorations-icon" icon="arrow-alt-circle-up" size="sm" />
+                </div>
+            </div>
+        );
+    }
+
+    considerGoogleDocsPull = () => {
+        let thisDoc = SelectionManager.SelectedDocuments()[0].props.Document;
+        let canPull = thisDoc.data && thisDoc.data instanceof RichTextField;
+        if (!canPull) return (null);
         return (
             <div className={"linkButtonWrapper"}>
-                <FontAwesomeIcon className="documentdecorations-icon" icon="image" size="sm" />
+                <div title="Pull From Google Docs" className="linkButton-linker" onClick={() => thisDoc.pullFromGoogleDocsTrigger = !thisDoc.pullFromGoogleDocsTrigger}>
+                    <FontAwesomeIcon className="documentdecorations-icon" icon="arrow-alt-circle-down" size="sm" />
+                </div>
             </div>
         );
     }
@@ -781,7 +796,8 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>
                     </div>
                     {this.metadataMenu}
                     {this.considerEmbed()}
-                    {this.considerGoogleDoc()}
+                    {this.considerGoogleDocsPush()}
+                    {this.considerGoogleDocsPull()}
                     {/* {this.considerTooltip()} */}
                 </div>
             </div >
diff --git a/src/client/views/collections/CollectionSubView.tsx b/src/client/views/collections/CollectionSubView.tsx
index 077f3f941..70c0632d1 100644
--- a/src/client/views/collections/CollectionSubView.tsx
+++ b/src/client/views/collections/CollectionSubView.tsx
@@ -16,7 +16,7 @@ import { DragManager } from "../../util/DragManager";
 import { undoBatch, UndoManager } from "../../util/UndoManager";
 import { DocComponent } from "../DocComponent";
 import { FieldViewProps } from "../nodes/FieldView";
-import { FormattedTextBox } from "../nodes/FormattedTextBox";
+import { FormattedTextBox, Blank } from "../nodes/FormattedTextBox";
 import { CollectionPDFView } from "./CollectionPDFView";
 import { CollectionVideoView } from "./CollectionVideoView";
 import { CollectionView } from "./CollectionView";
@@ -206,7 +206,17 @@ export function CollectionSubView<T>(schemaCtor: (doc: Doc) => T) {
                 this.props.addDocument(Docs.Create.VideoDocument(url, { ...options, title: url, width: 400, height: 315, nativeWidth: 600, nativeHeight: 472.5 }));
                 return;
             }
-
+            let matches: RegExpExecArray | null;
+            if ((matches = /(https:\/\/)?docs\.google\.com\/document\/d\/([^\\]+)\/edit/g.exec(text)) !== null) {
+                let newBox = Docs.Create.TextDocument({ ...options, width: 600, height: 400, title: "Fetching title from Google Docs..." });
+                let proto = newBox.proto!;
+                proto.autoHeight = true;
+                proto.googleDocId = matches[2];
+                proto.data = "Fetching contents from Google Docs...";
+                proto.backgroundColor = "#eeeeff";
+                this.props.addDocument(newBox);
+                return;
+            }
             let batch = UndoManager.StartBatch("collection view drop");
             let promises: Promise<void>[] = [];
             // tslint:disable-next-line:prefer-for-of
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index bc057bb5f..406c2c4a6 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -1,6 +1,6 @@
 import { library } from '@fortawesome/fontawesome-svg-core';
 import { faEdit, faSmile, faTextHeight, faUpload } from '@fortawesome/free-solid-svg-icons';
-import { action, IReactionDisposer, observable, reaction, runInAction, computed, Lambda, trace } from "mobx";
+import { action, IReactionDisposer, observable, reaction, runInAction, computed, Lambda, trace, untracked } from "mobx";
 import { observer } from "mobx-react";
 import { baseKeymap } from "prosemirror-commands";
 import { history } from "prosemirror-history";
@@ -47,6 +47,8 @@ library.add(faSmile, faTextHeight, faUpload);
 // FormattedTextBox: Displays an editable plain text node that maps to a specified Key of a Document
 //
 
+export const Blank = `{"doc":{"type":"doc","content":[]},"selection":{"type":"text","anchor":0,"head":0}}`;
+
 export interface FormattedTextBoxProps {
     isOverlay?: boolean;
     hideOnLeave?: boolean;
@@ -84,7 +86,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
     private _proxyReactionDisposer: Opt<IReactionDisposer>;
     private dropDisposer?: DragManager.DragDropDisposer;
     public get CurrentDiv(): HTMLDivElement { return this._ref.current!; }
-    private isOpening = false;
+    private isGoogleDocsUpdate = false;
     @observable _entered = false;
 
     @observable public static InputBoxOverlay?: FormattedTextBox = undefined;
@@ -290,28 +292,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         }
     }
 
-    componentWillMount() {
-        this.pollExportedCounterpart();
-    }
-
-    pollExportedCounterpart = async () => {
-        let dataDoc = Doc.GetProto(this.props.Document);
-        let documentId = StrCast(dataDoc[googleDocId]);
-        if (documentId) {
-            let exportState = await GoogleApiClientUtils.Docs.read({ documentId });
-            if (exportState) {
-                let data = Cast(dataDoc.data, RichTextField);
-                if (data) {
-                    this.isOpening = true;
-                    dataDoc.data = new RichTextField(data[FromGoogleDocText](exportState));
-                }
-            } else {
-                delete dataDoc[googleDocId];
-            }
-            this.tryUpdateHeight();
-        }
-    }
-
     componentDidMount() {
         const config = {
             schema,
@@ -347,23 +327,32 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         this._reactionDisposer = reaction(
             () => {
                 const field = this.dataDoc ? Cast(this.dataDoc[this.props.fieldKey], RichTextField) : undefined;
-                return field ? field.Data : `{"doc":{"type":"doc","content":[]},"selection":{"type":"text","anchor":0,"head":0}}`;
+                return field ? field.Data : Blank;
             },
             incomingValue => {
                 if (this._editorView && !this._applyingChange) {
                     let updatedState = JSON.parse(incomingValue);
                     this._editorView.updateState(EditorState.fromJSON(config, updatedState));
                     // manually sets cursor selection at the end of the text on focus
-                    if (this.isOpening) {
-                        this.isOpening = false;
+                    if (this.isGoogleDocsUpdate) {
+                        this.isGoogleDocsUpdate = false;
                         let end = this._editorView.state.doc.content.size - 1;
                         updatedState.selection = { type: "text", anchor: end, head: end };
                         this._editorView.updateState(EditorState.fromJSON(config, updatedState));
                     }
+                    this.tryUpdateHeight();
                 }
             }
         );
 
+        reaction(() => this.props.Document.pullFromGoogleDocsTrigger, () => {
+            this.pullFromGoogleDoc();
+        });
+
+        reaction(() => this.props.Document.pushToGoogleDocsTrigger, () => {
+            this.pushToGoogleDoc();
+        });
+
         this._textReactionDisposer = reaction(
             () => this.extensionDoc,
             () => {
@@ -391,6 +380,13 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
                 this.unhighlightSearchTerms();
             }
         }, { fireImmediately: true });
+
+        ["pushToGoogleDocsTrigger", "pullFromGoogleDocsTrigger"].map(key => {
+            let doc = this.props.Document;
+            if (doc[key] === undefined) {
+                untracked(() => doc[key] = false);
+            }
+        });
     }
 
     clipboardTextSerializer = (slice: Slice): string => {
@@ -644,7 +640,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             this._undoTyping.end();
             this._undoTyping = undefined;
         }
-        this.updateGoogleDoc();
     }
     public _undoTyping?: UndoManager.Batch;
     onKeyPress = (e: React.KeyboardEvent) => {
@@ -701,13 +696,13 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         if (!(googleDocId in Doc.GetProto(this.props.Document))) {
             ContextMenu.Instance.addItem({
                 description: "Export to Google Doc...",
-                event: this.updateGoogleDoc,
+                event: this.pushToGoogleDoc,
                 icon: "upload"
             });
         }
     }
 
-    updateGoogleDoc = () => {
+    pushToGoogleDoc = () => {
         let modes = GoogleApiClientUtils.Docs.WriteMode;
         let mode = modes.Replace;
         let reference: Opt<GoogleApiClientUtils.Docs.Reference> = Cast(this.dataDoc[googleDocId], "string");
@@ -725,6 +720,25 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         }
     }
 
+    pullFromGoogleDoc = async () => {
+        let dataDoc = Doc.GetProto(this.props.Document);
+        let documentId = StrCast(dataDoc[googleDocId]);
+        if (documentId) {
+            let exportState = await GoogleApiClientUtils.Docs.read({ documentId });
+            if (exportState && exportState.body && exportState.title) {
+                let data = Cast(dataDoc.data, RichTextField);
+                if (data) {
+                    this.isGoogleDocsUpdate = true;
+                    dataDoc.data = new RichTextField(data[FromGoogleDocText](exportState.body));
+                    dataDoc.title = exportState.title;
+                }
+            } else {
+                delete dataDoc[googleDocId];
+            }
+        }
+    }
+
+
     render() {
         let self = this;
         let style = this.props.isOverlay ? "scroll" : "hidden";
-- 
cgit v1.2.3-70-g09d2


From 00cecb10d80bad8d717cd06ddc4bf156664b9f2d Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Mon, 19 Aug 2019 22:39:56 -0400
Subject: fixed push pull UI

---
 .../apis/google_docs/GoogleApiClientUtils.ts       |   3 +
 src/client/views/DocumentDecorations.tsx           |  14 ++-
 src/client/views/nodes/FormattedTextBox.tsx        | 122 +++++++++++----------
 src/new_fields/RichTextField.ts                    |   8 +-
 4 files changed, 81 insertions(+), 66 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/apis/google_docs/GoogleApiClientUtils.ts b/src/client/apis/google_docs/GoogleApiClientUtils.ts
index 55b4a76f8..821c52270 100644
--- a/src/client/apis/google_docs/GoogleApiClientUtils.ts
+++ b/src/client/apis/google_docs/GoogleApiClientUtils.ts
@@ -4,6 +4,9 @@ import { RouteStore } from "../../../server/RouteStore";
 import { Opt } from "../../../new_fields/Doc";
 import { isArray } from "util";
 
+export const Pulls = "googleDocsPullCount";
+export const Pushes = "googleDocsPushCount";
+
 export namespace GoogleApiClientUtils {
 
     export namespace Docs {
diff --git a/src/client/views/DocumentDecorations.tsx b/src/client/views/DocumentDecorations.tsx
index 80d4ecb9b..797b43add 100644
--- a/src/client/views/DocumentDecorations.tsx
+++ b/src/client/views/DocumentDecorations.tsx
@@ -30,6 +30,7 @@ import { ObjectField } from '../../new_fields/ObjectField';
 import { MetadataEntryMenu } from './MetadataEntryMenu';
 import { ImageBox } from './nodes/ImageBox';
 import { CurrentUserUtils } from '../../server/authentication/models/current_user_utils';
+import { Pulls, Pushes } from '../apis/google_docs/GoogleApiClientUtils';
 const higflyout = require("@hig/flyout");
 export const { anchorPoints } = higflyout;
 export const Flyout = higflyout.default;
@@ -626,7 +627,10 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>
         if (!canPush) return (null);
         return (
             <div className={"linkButtonWrapper"}>
-                <div title="Push to Google Docs" className="linkButton-linker" onClick={() => thisDoc.pushToGoogleDocsTrigger = !thisDoc.pushToGoogleDocsTrigger}>
+                <div title="Push to Google Docs" className="linkButton-linker" onClick={() => {
+                    DocumentDecorations.hasPushedHack = false;
+                    thisDoc[Pushes] = NumCast(thisDoc[Pushes]) + 1;
+                }}>
                     <FontAwesomeIcon className="documentdecorations-icon" icon="arrow-alt-circle-up" size="sm" />
                 </div>
             </div>
@@ -639,13 +643,19 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>
         if (!canPull) return (null);
         return (
             <div className={"linkButtonWrapper"}>
-                <div title="Pull From Google Docs" className="linkButton-linker" onClick={() => thisDoc.pullFromGoogleDocsTrigger = !thisDoc.pullFromGoogleDocsTrigger}>
+                <div title="Pull From Google Docs" className="linkButton-linker" onClick={() => {
+                    DocumentDecorations.hasPulledHack = false;
+                    thisDoc[Pulls] = NumCast(thisDoc[Pulls]) + 1;
+                }}>
                     <FontAwesomeIcon className="documentdecorations-icon" icon="arrow-alt-circle-down" size="sm" />
                 </div>
             </div>
         );
     }
 
+    public static hasPushedHack = false;
+    public static hasPulledHack = false;
+
     considerTooltip = () => {
         let thisDoc = SelectionManager.SelectedDocuments()[0].props.Document;
         let isTextDoc = thisDoc.data && thisDoc.data instanceof RichTextField;
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 406c2c4a6..d2eb71350 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -12,7 +12,7 @@ import { EditorView } from "prosemirror-view";
 import { Doc, Opt, DocListCast } from "../../../new_fields/Doc";
 import { Id, Copy } from '../../../new_fields/FieldSymbols';
 import { List } from '../../../new_fields/List';
-import { RichTextField, ToGoogleDocText, FromGoogleDocText } from "../../../new_fields/RichTextField";
+import { RichTextField, ToPlainText, FromPlainText } from "../../../new_fields/RichTextField";
 import { createSchema, listSpec, makeInterface } from "../../../new_fields/Schema";
 import { BoolCast, Cast, NumCast, StrCast, DateCast } from "../../../new_fields/Types";
 import { DocServer } from "../../DocServer";
@@ -30,16 +30,14 @@ import { ContextMenu } from "../../views/ContextMenu";
 import { ContextMenuProps } from '../ContextMenuItem';
 import { DocComponent } from "../DocComponent";
 import { InkingControl } from "../InkingControl";
-import { Templates } from '../Templates';
 import { FieldView, FieldViewProps } from "./FieldView";
 import "./FormattedTextBox.scss";
 import React = require("react");
-import { For } from 'babel-types';
 import { DateField } from '../../../new_fields/DateField';
 import { Utils } from '../../../Utils';
 import { MainOverlayTextBox } from '../MainOverlayTextBox';
-import { GoogleApiClientUtils } from '../../apis/google_docs/GoogleApiClientUtils';
-import * as diff from "diff";
+import { GoogleApiClientUtils, Pulls, Pushes } from '../../apis/google_docs/GoogleApiClientUtils';
+import { DocumentDecorations } from '../DocumentDecorations';
 
 library.add(faEdit);
 library.add(faSmile, faTextHeight, faUpload);
@@ -84,6 +82,8 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
     private _searchReactionDisposer?: Lambda;
     private _textReactionDisposer: Opt<IReactionDisposer>;
     private _proxyReactionDisposer: Opt<IReactionDisposer>;
+    private pullReactionDisposer: Opt<IReactionDisposer>;
+    private pushReactionDisposer: Opt<IReactionDisposer>;
     private dropDisposer?: DragManager.DragDropDisposer;
     public get CurrentDiv(): HTMLDivElement { return this._ref.current!; }
     private isGoogleDocsUpdate = false;
@@ -345,13 +345,25 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             }
         );
 
-        reaction(() => this.props.Document.pullFromGoogleDocsTrigger, () => {
-            this.pullFromGoogleDoc();
-        });
+        this.pullReactionDisposer = reaction(
+            () => this.props.Document[Pulls],
+            () => {
+                if (!DocumentDecorations.hasPulledHack) {
+                    DocumentDecorations.hasPulledHack = true;
+                    this.pullFromGoogleDoc();
+                }
+            }
+        );
 
-        reaction(() => this.props.Document.pushToGoogleDocsTrigger, () => {
-            this.pushToGoogleDoc();
-        });
+        this.pushReactionDisposer = reaction(
+            () => this.props.Document[Pushes],
+            () => {
+                if (!DocumentDecorations.hasPushedHack) {
+                    DocumentDecorations.hasPushedHack = true;
+                    this.pushToGoogleDoc();
+                }
+            }
+        );
 
         this._textReactionDisposer = reaction(
             () => this.extensionDoc,
@@ -380,13 +392,44 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
                 this.unhighlightSearchTerms();
             }
         }, { fireImmediately: true });
+    }
 
-        ["pushToGoogleDocsTrigger", "pullFromGoogleDocsTrigger"].map(key => {
-            let doc = this.props.Document;
-            if (doc[key] === undefined) {
-                untracked(() => doc[key] = false);
-            }
-        });
+    pushToGoogleDoc = () => {
+        let modes = GoogleApiClientUtils.Docs.WriteMode;
+        let mode = modes.Replace;
+        let reference: Opt<GoogleApiClientUtils.Docs.Reference> = Cast(this.dataDoc[googleDocId], "string");
+        if (!reference) {
+            mode = modes.Insert;
+            reference = {
+                title: StrCast(this.dataDoc.title),
+                handler: id => this.dataDoc[googleDocId] = id
+            };
+        }
+        if (this._editorView) {
+            let data = Cast(this.dataDoc.data, RichTextField);
+            let content = data ? data[ToPlainText]() : this._editorView.state.doc.textContent;
+            GoogleApiClientUtils.Docs.write({ reference, content, mode });
+        }
+    }
+
+    pullFromGoogleDoc = async () => {
+        let dataDoc = Doc.GetProto(this.props.Document);
+        let documentId = StrCast(dataDoc[googleDocId]);
+        if (documentId) {
+            let exportState = await GoogleApiClientUtils.Docs.read({ documentId });
+            UndoManager.RunInBatch(() => {
+                if (exportState && exportState.body && exportState.title) {
+                    let data = Cast(dataDoc.data, RichTextField);
+                    if (data) {
+                        this.isGoogleDocsUpdate = true;
+                        dataDoc.data = new RichTextField(data[FromPlainText](exportState.body));
+                        dataDoc.title = exportState.title;
+                    }
+                } else {
+                    delete dataDoc[googleDocId];
+                }
+            }, Pulls);
+        }
     }
 
     clipboardTextSerializer = (slice: Slice): string => {
@@ -516,6 +559,8 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         this._reactionDisposer && this._reactionDisposer();
         this._proxyReactionDisposer && this._proxyReactionDisposer();
         this._textReactionDisposer && this._textReactionDisposer();
+        this.pushReactionDisposer && this.pushReactionDisposer();
+        this.pullReactionDisposer && this.pullReactionDisposer();
     }
 
     onPointerDown = (e: React.PointerEvent): void => {
@@ -693,49 +738,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             event: action(() => Doc.GetProto(this.props.Document).autoHeight = !BoolCast(this.props.Document.autoHeight)), icon: "expand-arrows-alt"
         });
         ContextMenu.Instance.addItem({ description: "Text Funcs...", subitems: subitems, icon: "text-height" });
-        if (!(googleDocId in Doc.GetProto(this.props.Document))) {
-            ContextMenu.Instance.addItem({
-                description: "Export to Google Doc...",
-                event: this.pushToGoogleDoc,
-                icon: "upload"
-            });
-        }
-    }
-
-    pushToGoogleDoc = () => {
-        let modes = GoogleApiClientUtils.Docs.WriteMode;
-        let mode = modes.Replace;
-        let reference: Opt<GoogleApiClientUtils.Docs.Reference> = Cast(this.dataDoc[googleDocId], "string");
-        if (!reference) {
-            mode = modes.Insert;
-            reference = {
-                title: StrCast(this.dataDoc.title),
-                handler: id => this.dataDoc[googleDocId] = id
-            };
-        }
-        if (this._editorView) {
-            let data = Cast(this.dataDoc.data, RichTextField);
-            let content = data ? data[ToGoogleDocText]() : this._editorView.state.doc.textContent;
-            GoogleApiClientUtils.Docs.write({ reference, content, mode });
-        }
-    }
-
-    pullFromGoogleDoc = async () => {
-        let dataDoc = Doc.GetProto(this.props.Document);
-        let documentId = StrCast(dataDoc[googleDocId]);
-        if (documentId) {
-            let exportState = await GoogleApiClientUtils.Docs.read({ documentId });
-            if (exportState && exportState.body && exportState.title) {
-                let data = Cast(dataDoc.data, RichTextField);
-                if (data) {
-                    this.isGoogleDocsUpdate = true;
-                    dataDoc.data = new RichTextField(data[FromGoogleDocText](exportState.body));
-                    dataDoc.title = exportState.title;
-                }
-            } else {
-                delete dataDoc[googleDocId];
-            }
-        }
     }
 
 
diff --git a/src/new_fields/RichTextField.ts b/src/new_fields/RichTextField.ts
index ec08293e9..ab58329f9 100644
--- a/src/new_fields/RichTextField.ts
+++ b/src/new_fields/RichTextField.ts
@@ -4,8 +4,8 @@ import { Deserializable } from "../client/util/SerializationHelper";
 import { Copy, ToScriptString } from "./FieldSymbols";
 import { scriptingGlobal } from "../client/util/Scripting";
 
-export const ToGoogleDocText = Symbol("PlainText");
-export const FromGoogleDocText = Symbol("PlainText");
+export const ToPlainText = Symbol("PlainText");
+export const FromPlainText = Symbol("PlainText");
 const delimiter = "\n";
 const joiner = "";
 
@@ -28,7 +28,7 @@ export class RichTextField extends ObjectField {
         return `new RichTextField("${this.Data}")`;
     }
 
-    [ToGoogleDocText]() {
+    [ToPlainText]() {
         // Because we're working with plain text, just concatenate all paragraphs
         let content = JSON.parse(this.Data).doc.content;
         let paragraphs = content.filter((item: any) => item.type === "paragraph");
@@ -43,7 +43,7 @@ export class RichTextField extends ObjectField {
         return textParagraphs.join(joiner).trimEnd(delimiter);
     }
 
-    [FromGoogleDocText](plainText: string) {
+    [FromPlainText](plainText: string) {
         // Remap the text, creating blocks split on newlines
         let elements = plainText.split(delimiter);
 
-- 
cgit v1.2.3-70-g09d2


From c92761206957aebdba1cc2e77f6b662ae42db847 Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Tue, 20 Aug 2019 01:44:18 -0400
Subject: interactive ui

---
 src/client/views/DocumentDecorations.tsx    | 84 +++++++++++++++++++++++------
 src/client/views/nodes/FormattedTextBox.tsx | 63 +++++++++++++++-------
 2 files changed, 112 insertions(+), 35 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/DocumentDecorations.tsx b/src/client/views/DocumentDecorations.tsx
index 797b43add..1db452b45 100644
--- a/src/client/views/DocumentDecorations.tsx
+++ b/src/client/views/DocumentDecorations.tsx
@@ -1,5 +1,5 @@
-import { library } from '@fortawesome/fontawesome-svg-core';
-import { faLink, faTag, faArrowAltCircleDown, faArrowAltCircleUp } from '@fortawesome/free-solid-svg-icons';
+import { library, IconProp } from '@fortawesome/fontawesome-svg-core';
+import { faLink, faTag, faArrowAltCircleDown, faArrowAltCircleUp, faCheckCircle, faStopCircle, faCloudUploadAlt } from '@fortawesome/free-solid-svg-icons';
 import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
 import { action, computed, observable, reaction, runInAction } from "mobx";
 import { observer } from "mobx-react";
@@ -18,7 +18,7 @@ import { CollectionView } from "./collections/CollectionView";
 import './DocumentDecorations.scss';
 import { DocumentView, PositionDocument } from "./nodes/DocumentView";
 import { FieldView } from "./nodes/FieldView";
-import { FormattedTextBox } from "./nodes/FormattedTextBox";
+import { FormattedTextBox, GoogleRef } from "./nodes/FormattedTextBox";
 import { IconBox } from "./nodes/IconBox";
 import { LinkMenu } from "./nodes/LinkMenu";
 import { TemplateMenu } from "./TemplateMenu";
@@ -26,7 +26,6 @@ import { Template, Templates } from "./Templates";
 import React = require("react");
 import { RichTextField } from '../../new_fields/RichTextField';
 import { LinkManager } from '../util/LinkManager';
-import { ObjectField } from '../../new_fields/ObjectField';
 import { MetadataEntryMenu } from './MetadataEntryMenu';
 import { ImageBox } from './nodes/ImageBox';
 import { CurrentUserUtils } from '../../server/authentication/models/current_user_utils';
@@ -39,6 +38,11 @@ library.add(faLink);
 library.add(faTag);
 library.add(faArrowAltCircleDown);
 library.add(faArrowAltCircleUp);
+library.add(faStopCircle);
+library.add(faCheckCircle);
+library.add(faCloudUploadAlt);
+
+const cloud: IconProp = "cloud-upload-alt";
 
 @observer
 export class DocumentDecorations extends React.Component<{}, { value: string }> {
@@ -69,6 +73,52 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>
     @observable private _removeIcon = false;
     @observable public Interacting = false;
 
+    @observable public pushIcon: IconProp = "arrow-alt-circle-up";
+    @observable public pullIcon: IconProp = "arrow-alt-circle-down";
+    @observable public pullColor: string = "white";
+    public pullColorAnimating = false;
+
+    private pullAnimating = false;
+    private pushAnimating = false;
+
+    public startPullOutcome = action((success: boolean) => {
+        if (this.pullAnimating) {
+            return;
+        }
+        this.pullAnimating = true;
+        this.pullIcon = success ? "check-circle" : "stop-circle";
+        setTimeout(() => runInAction(() => {
+            this.pullIcon = "arrow-alt-circle-down";
+            this.pullAnimating = false;
+        }), 1000);
+    });
+
+    public startPushOutcome = action((success: boolean) => {
+        if (this.pushAnimating) {
+            return;
+        }
+        this.pushAnimating = true;
+        this.pushIcon = success ? "check-circle" : "stop-circle";
+        setTimeout(() => runInAction(() => {
+            this.pushIcon = "arrow-alt-circle-up";
+            this.pushAnimating = false;
+        }), 1000);
+    });
+
+    public setPullState = (unchanged: boolean) => {
+        if (this.pullColorAnimating) {
+            return;
+        }
+        this.pullColorAnimating = true;
+        this.pullColor = unchanged ? "lawngreen" : "red";
+        setTimeout(() => {
+            runInAction(() => {
+                this.pullColor = "white";
+                this.pullColorAnimating = false;
+            });
+        }, 2000);
+    }
+
     constructor(props: Readonly<{}>) {
         super(props);
         DocumentDecorations.Instance = this;
@@ -621,33 +671,37 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>
         );
     }
 
+    private get targetDoc() {
+        return SelectionManager.SelectedDocuments()[0].props.Document;
+    }
+
     considerGoogleDocsPush = () => {
-        let thisDoc = SelectionManager.SelectedDocuments()[0].props.Document;
-        let canPush = thisDoc.data && thisDoc.data instanceof RichTextField;
+        let canPush = this.targetDoc.data && this.targetDoc.data instanceof RichTextField;
         if (!canPush) return (null);
+        let published = Doc.GetProto(this.targetDoc)[GoogleRef] !== undefined;
+        let icon: IconProp = published ? (this.pushIcon as any) : (cloud as any);
         return (
             <div className={"linkButtonWrapper"}>
-                <div title="Push to Google Docs" className="linkButton-linker" onClick={() => {
+                <div title={`${published ? "Push" : "Publish"} to Google Docs`} className="linkButton-linker" onClick={() => {
                     DocumentDecorations.hasPushedHack = false;
-                    thisDoc[Pushes] = NumCast(thisDoc[Pushes]) + 1;
+                    this.targetDoc[Pushes] = NumCast(this.targetDoc[Pushes]) + 1;
                 }}>
-                    <FontAwesomeIcon className="documentdecorations-icon" icon="arrow-alt-circle-up" size="sm" />
+                    <FontAwesomeIcon className="documentdecorations-icon" icon={icon} size={published ? "sm" : "xs"} />
                 </div>
             </div>
         );
     }
 
     considerGoogleDocsPull = () => {
-        let thisDoc = SelectionManager.SelectedDocuments()[0].props.Document;
-        let canPull = thisDoc.data && thisDoc.data instanceof RichTextField;
-        if (!canPull) return (null);
+        let canPull = this.targetDoc.data && this.targetDoc.data instanceof RichTextField;
+        if (!canPull || !Doc.GetProto(this.targetDoc)[GoogleRef]) return (null);
         return (
             <div className={"linkButtonWrapper"}>
-                <div title="Pull From Google Docs" className="linkButton-linker" onClick={() => {
+                <div style={{ backgroundColor: this.pullColor, transition: "1s ease all" }} title="Pull From Google Docs" className="linkButton-linker" onClick={() => {
                     DocumentDecorations.hasPulledHack = false;
-                    thisDoc[Pulls] = NumCast(thisDoc[Pulls]) + 1;
+                    this.targetDoc[Pulls] = NumCast(this.targetDoc[Pulls]) + 1;
                 }}>
-                    <FontAwesomeIcon className="documentdecorations-icon" icon="arrow-alt-circle-down" size="sm" />
+                    <FontAwesomeIcon className="documentdecorations-icon" icon={this.pullIcon} size="sm" />
                 </div>
             </div>
         );
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index d2eb71350..33d222813 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -60,11 +60,13 @@ const richTextSchema = createSchema({
     documentText: "string"
 });
 
-const googleDocId = "googleDocId";
+export const GoogleRef = "googleDocId";
 
 type RichTextDocument = makeInterface<[typeof richTextSchema]>;
 const RichTextDocument = makeInterface(richTextSchema);
 
+type PullHandler = (exportState: GoogleApiClientUtils.Docs.ReadResult, dataDoc: Doc) => void;
+
 @observer
 export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTextBoxProps), RichTextDocument>(RichTextDocument) {
     public static LayoutString(fieldStr: string = "data") {
@@ -324,6 +326,8 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
                 }, { fireImmediately: true });
         }
 
+        this.pullFromGoogleDoc(this.checkState);
+
         this._reactionDisposer = reaction(
             () => {
                 const field = this.dataDoc ? Cast(this.dataDoc[this.props.fieldKey], RichTextField) : undefined;
@@ -350,7 +354,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             () => {
                 if (!DocumentDecorations.hasPulledHack) {
                     DocumentDecorations.hasPulledHack = true;
-                    this.pullFromGoogleDoc();
+                    this.pullFromGoogleDoc(this.updateState);
                 }
             }
         );
@@ -394,44 +398,63 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         }, { fireImmediately: true });
     }
 
-    pushToGoogleDoc = () => {
+    pushToGoogleDoc = async () => {
         let modes = GoogleApiClientUtils.Docs.WriteMode;
         let mode = modes.Replace;
-        let reference: Opt<GoogleApiClientUtils.Docs.Reference> = Cast(this.dataDoc[googleDocId], "string");
+        let reference: Opt<GoogleApiClientUtils.Docs.Reference> = Cast(this.dataDoc[GoogleRef], "string");
         if (!reference) {
             mode = modes.Insert;
             reference = {
                 title: StrCast(this.dataDoc.title),
-                handler: id => this.dataDoc[googleDocId] = id
+                handler: id => this.dataDoc[GoogleRef] = id
             };
         }
         if (this._editorView) {
             let data = Cast(this.dataDoc.data, RichTextField);
             let content = data ? data[ToPlainText]() : this._editorView.state.doc.textContent;
-            GoogleApiClientUtils.Docs.write({ reference, content, mode });
+            let response = await GoogleApiClientUtils.Docs.write({ reference, content, mode });
+            let pushSuccess = response !== undefined && !("errors" in response);
+            DocumentDecorations.Instance.startPushOutcome(pushSuccess);
         }
     }
 
-    pullFromGoogleDoc = async () => {
+    pullFromGoogleDoc = async (handler: PullHandler) => {
         let dataDoc = Doc.GetProto(this.props.Document);
-        let documentId = StrCast(dataDoc[googleDocId]);
+        let documentId = StrCast(dataDoc[GoogleRef]);
         if (documentId) {
             let exportState = await GoogleApiClientUtils.Docs.read({ documentId });
-            UndoManager.RunInBatch(() => {
-                if (exportState && exportState.body && exportState.title) {
-                    let data = Cast(dataDoc.data, RichTextField);
-                    if (data) {
-                        this.isGoogleDocsUpdate = true;
-                        dataDoc.data = new RichTextField(data[FromPlainText](exportState.body));
-                        dataDoc.title = exportState.title;
-                    }
-                } else {
-                    delete dataDoc[googleDocId];
-                }
-            }, Pulls);
+            UndoManager.RunInBatch(() => handler(exportState, dataDoc), Pulls);
         }
     }
 
+    updateState = (exportState: GoogleApiClientUtils.Docs.ReadResult, dataDoc: Doc) => {
+        let pullSuccess = false;
+        if (exportState !== undefined && exportState.body !== undefined && exportState.title !== undefined) {
+            let data = Cast(dataDoc.data, RichTextField);
+            if (data) {
+                pullSuccess = true;
+                this.isGoogleDocsUpdate = true;
+                dataDoc.data = new RichTextField(data[FromPlainText](exportState.body));
+                dataDoc.title = exportState.title;
+            }
+        } else {
+            delete dataDoc[GoogleRef];
+        }
+        DocumentDecorations.Instance.startPullOutcome(pullSuccess);
+    }
+
+    checkState = (exportState: GoogleApiClientUtils.Docs.ReadResult, dataDoc: Doc) => {
+        if (exportState !== undefined && exportState.body !== undefined && exportState.title !== undefined) {
+            let data = Cast(dataDoc.data, RichTextField);
+            if (data) {
+                let storedPlainText = data[ToPlainText]() + "\n";
+                let receivedPlainText = exportState.body;
+                DocumentDecorations.Instance.setPullState(storedPlainText === receivedPlainText);
+            }
+        }
+    }
+
+
     clipboardTextSerializer = (slice: Slice): string => {
         let text = "", separated = true;
         const from = 0, to = slice.content.size;
-- 
cgit v1.2.3-70-g09d2


From aa0e6f5ffc30fdffc3be13a1948981b754544a01 Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Tue, 20 Aug 2019 12:03:50 -0400
Subject: automation of pull push button visibility

---
 src/client/views/DocumentDecorations.tsx    |  3 +-
 src/client/views/nodes/FormattedTextBox.tsx | 61 +++++++++++++++++++----------
 2 files changed, 42 insertions(+), 22 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/DocumentDecorations.tsx b/src/client/views/DocumentDecorations.tsx
index 1db452b45..05239073b 100644
--- a/src/client/views/DocumentDecorations.tsx
+++ b/src/client/views/DocumentDecorations.tsx
@@ -694,7 +694,8 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>
 
     considerGoogleDocsPull = () => {
         let canPull = this.targetDoc.data && this.targetDoc.data instanceof RichTextField;
-        if (!canPull || !Doc.GetProto(this.targetDoc)[GoogleRef]) return (null);
+        let dataDoc = Doc.GetProto(this.targetDoc);
+        if (!canPull || !dataDoc[GoogleRef] || dataDoc.unchanged) return (null);
         return (
             <div className={"linkButtonWrapper"}>
                 <div style={{ backgroundColor: this.pullColor, transition: "1s ease all" }} title="Pull From Google Docs" className="linkButton-linker" onClick={() => {
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 33d222813..8a355a425 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -1,6 +1,6 @@
 import { library } from '@fortawesome/fontawesome-svg-core';
 import { faEdit, faSmile, faTextHeight, faUpload } from '@fortawesome/free-solid-svg-icons';
-import { action, IReactionDisposer, observable, reaction, runInAction, computed, Lambda, trace, untracked } from "mobx";
+import { action, IReactionDisposer, observable, reaction, runInAction, computed, Lambda, trace, untracked, autorun } from "mobx";
 import { observer } from "mobx-react";
 import { baseKeymap } from "prosemirror-commands";
 import { history } from "prosemirror-history";
@@ -399,32 +399,46 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
     }
 
     pushToGoogleDoc = async () => {
-        let modes = GoogleApiClientUtils.Docs.WriteMode;
-        let mode = modes.Replace;
-        let reference: Opt<GoogleApiClientUtils.Docs.Reference> = Cast(this.dataDoc[GoogleRef], "string");
-        if (!reference) {
-            mode = modes.Insert;
-            reference = {
-                title: StrCast(this.dataDoc.title),
-                handler: id => this.dataDoc[GoogleRef] = id
+        this.pullFromGoogleDoc(async (exportState: GoogleApiClientUtils.Docs.ReadResult, dataDoc: Doc) => {
+            let modes = GoogleApiClientUtils.Docs.WriteMode;
+            let mode = modes.Replace;
+            let reference: Opt<GoogleApiClientUtils.Docs.Reference> = Cast(this.dataDoc[GoogleRef], "string");
+            if (!reference) {
+                mode = modes.Insert;
+                reference = {
+                    title: StrCast(this.dataDoc.title),
+                    handler: id => this.dataDoc[GoogleRef] = id
+                };
+            }
+            let redo = async () => {
+                if (this._editorView && reference) {
+                    let data = Cast(this.dataDoc.data, RichTextField);
+                    let content = data ? data[ToPlainText]() : this._editorView.state.doc.textContent;
+                    let response = await GoogleApiClientUtils.Docs.write({ reference, content, mode });
+                    let pushSuccess = response !== undefined && !("errors" in response);
+                    dataDoc.unchanged = pushSuccess;
+                    DocumentDecorations.Instance.startPushOutcome(pushSuccess);
+                }
             };
-        }
-        if (this._editorView) {
-            let data = Cast(this.dataDoc.data, RichTextField);
-            let content = data ? data[ToPlainText]() : this._editorView.state.doc.textContent;
-            let response = await GoogleApiClientUtils.Docs.write({ reference, content, mode });
-            let pushSuccess = response !== undefined && !("errors" in response);
-            DocumentDecorations.Instance.startPushOutcome(pushSuccess);
-        }
+            let undo = () => {
+                let content = exportState.body;
+                if (reference && content) {
+                    GoogleApiClientUtils.Docs.write({ reference, content, mode });
+                }
+            };
+            UndoManager.AddEvent({ undo, redo });
+            redo();
+        });
     }
 
     pullFromGoogleDoc = async (handler: PullHandler) => {
-        let dataDoc = Doc.GetProto(this.props.Document);
+        let dataDoc = this.dataDoc;
         let documentId = StrCast(dataDoc[GoogleRef]);
+        let exportState: GoogleApiClientUtils.Docs.ReadResult = {};
         if (documentId) {
-            let exportState = await GoogleApiClientUtils.Docs.read({ documentId });
-            UndoManager.RunInBatch(() => handler(exportState, dataDoc), Pulls);
+            exportState = await GoogleApiClientUtils.Docs.read({ documentId });
         }
+        UndoManager.RunInBatch(() => handler(exportState, dataDoc), Pulls);
     }
 
     updateState = (exportState: GoogleApiClientUtils.Docs.ReadResult, dataDoc: Doc) => {
@@ -436,6 +450,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
                 this.isGoogleDocsUpdate = true;
                 dataDoc.data = new RichTextField(data[FromPlainText](exportState.body));
                 dataDoc.title = exportState.title;
+                dataDoc.unchanged = true;
             }
         } else {
             delete dataDoc[GoogleRef];
@@ -449,7 +464,11 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             if (data) {
                 let storedPlainText = data[ToPlainText]() + "\n";
                 let receivedPlainText = exportState.body;
-                DocumentDecorations.Instance.setPullState(storedPlainText === receivedPlainText);
+                let storedTitle = dataDoc.title;
+                let receivedTitle = exportState.title;
+                let unchanged = storedPlainText === receivedPlainText && storedTitle === receivedTitle;
+                dataDoc.unchanged = unchanged;
+                DocumentDecorations.Instance.setPullState(unchanged);
             }
         }
     }
-- 
cgit v1.2.3-70-g09d2


From 700dfc5add1ecd9c2b1ecafcdc593ff821b7a6a6 Mon Sep 17 00:00:00 2001
From: bob <bcz@cs.brown.edu>
Date: Tue, 20 Aug 2019 17:20:27 -0400
Subject: UI enhancements and other backend fixes for templates.

---
 src/client/util/DragManager.ts                     |  3 +-
 src/client/views/MetadataEntryMenu.scss            | 12 +++++
 src/client/views/MetadataEntryMenu.tsx             | 52 +++++++++++---------
 .../views/collections/CollectionStackingView.tsx   |  3 +-
 .../CollectionStackingViewFieldColumn.tsx          |  9 ++--
 src/client/views/collections/CollectionSubView.tsx |  2 +-
 .../views/collections/CollectionTreeView.tsx       |  3 ++
 .../views/collections/CollectionViewChromes.scss   |  1 -
 .../views/collections/CollectionViewChromes.tsx    | 57 +++++++++++-----------
 .../collectionFreeForm/CollectionFreeFormView.tsx  | 30 ++++++------
 src/client/views/nodes/DocumentContentsView.tsx    |  2 +-
 src/client/views/nodes/DocumentView.tsx            | 25 +++++++---
 src/client/views/nodes/FormattedTextBox.tsx        | 12 ++---
 src/client/views/nodes/ImageBox.tsx                |  7 +--
 src/new_fields/Doc.ts                              | 11 +++--
 15 files changed, 131 insertions(+), 98 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/util/DragManager.ts b/src/client/util/DragManager.ts
index 0b6d9b5e5..894b366ef 100644
--- a/src/client/util/DragManager.ts
+++ b/src/client/util/DragManager.ts
@@ -9,8 +9,6 @@ import { DocumentManager } from "./DocumentManager";
 import { LinkManager } from "./LinkManager";
 import { SelectionManager } from "./SelectionManager";
 import { SchemaHeaderField } from "../../new_fields/SchemaHeaderField";
-import { DocumentDecorations } from "../views/DocumentDecorations";
-import { NumberLiteralType } from "typescript";
 
 export type dropActionType = "alias" | "copy" | undefined;
 export function SetupDrag(
@@ -211,6 +209,7 @@ export namespace DragManager {
         dropAction: dropActionType;
         userDropAction: dropActionType;
         moveDocument?: MoveFunction;
+        applyAsTemplate?: boolean;
         [id: string]: any;
     }
 
diff --git a/src/client/views/MetadataEntryMenu.scss b/src/client/views/MetadataEntryMenu.scss
index bcfc9a82d..e28c4d0e0 100644
--- a/src/client/views/MetadataEntryMenu.scss
+++ b/src/client/views/MetadataEntryMenu.scss
@@ -1,8 +1,20 @@
 .metadataEntry-outerDiv {
     display: flex;
+    flex-direction: column;
     width: 300px;
 }
 
+.metadataEntry-keys {
+    max-height: 80;
+    overflow-y: auto; 
+    display: flex;
+    flex-direction: column;
+}
+.metadataEntry-inputArea {
+    display:flex;
+    flex-direction: row;
+}
+
 .react-autosuggest__container {
     position: relative;
 }
diff --git a/src/client/views/MetadataEntryMenu.tsx b/src/client/views/MetadataEntryMenu.tsx
index 36c240dd8..4a45eede9 100644
--- a/src/client/views/MetadataEntryMenu.tsx
+++ b/src/client/views/MetadataEntryMenu.tsx
@@ -1,11 +1,12 @@
 import * as React from 'react';
 import "./MetadataEntryMenu.scss";
 import { observer } from 'mobx-react';
-import { observable, action, runInAction, trace } from 'mobx';
+import { observable, action, runInAction, trace, computed, IReactionDisposer, reaction } from 'mobx';
 import { KeyValueBox } from './nodes/KeyValueBox';
 import { Doc, Field } from '../../new_fields/Doc';
 import * as Autosuggest from 'react-autosuggest';
 import { undoBatch } from '../util/UndoManager';
+import { emptyFunction } from '../../Utils';
 
 export type DocLike = Doc | Doc[] | Promise<Doc> | Promise<Doc[]>;
 export interface MetadataEntryProps {
@@ -18,7 +19,8 @@ export interface MetadataEntryProps {
 export class MetadataEntryMenu extends React.Component<MetadataEntryProps>{
     @observable private _currentKey: string = "";
     @observable private _currentValue: string = "";
-    @observable private suggestions: string[] = [];
+    @observable _allSuggestions: string[] = [];
+    _suggestionDispser: IReactionDisposer | undefined;
     private userModified = false;
 
     private autosuggestRef = React.createRef<Autosuggest>();
@@ -140,35 +142,39 @@ export class MetadataEntryMenu extends React.Component<MetadataEntryProps>{
     getSuggestionValue = (suggestion: string) => suggestion;
 
     renderSuggestion = (suggestion: string) => {
-        return <p>{suggestion}</p>;
+        return (null);
     }
+    componentDidMount() {
 
-    onSuggestionFetch = async ({ value }: { value: string }) => {
-        const sugg = await this.getKeySuggestions(value);
-        runInAction(() => {
-            this.suggestions = sugg;
-        });
+        this._suggestionDispser = reaction(() => this._currentKey,
+            () => this.getKeySuggestions(this._currentKey).then(action((s: string[]) => this._allSuggestions = s)),
+            { fireImmediately: true });
     }
-
-    @action
-    onSuggestionClear = () => {
-        this.suggestions = [];
+    componentWillUnmount() {
+        this._suggestionDispser && this._suggestionDispser();
     }
 
     render() {
         return (
             <div className="metadataEntry-outerDiv">
-                Key:
-                <Autosuggest inputProps={{ value: this._currentKey, onChange: this.onKeyChange }}
-                    getSuggestionValue={this.getSuggestionValue}
-                    suggestions={this.suggestions}
-                    alwaysRenderSuggestions
-                    renderSuggestion={this.renderSuggestion}
-                    onSuggestionsFetchRequested={this.onSuggestionFetch}
-                    onSuggestionsClearRequested={this.onSuggestionClear}
-                    ref={this.autosuggestRef} />
-                Value:
-                <input className="metadataEntry-input" value={this._currentValue} onChange={this.onValueChange} onKeyDown={this.onValueKeyDown} />
+                <div className="metadataEntry-inputArea">
+                    Key:
+                    <Autosuggest inputProps={{ value: this._currentKey, onChange: this.onKeyChange }}
+                        getSuggestionValue={this.getSuggestionValue}
+                        suggestions={[]}
+                        alwaysRenderSuggestions={false}
+                        renderSuggestion={this.renderSuggestion}
+                        onSuggestionsFetchRequested={emptyFunction}
+                        onSuggestionsClearRequested={emptyFunction}
+                        ref={this.autosuggestRef} />
+                    Value:
+                    <input className="metadataEntry-input" value={this._currentValue} onChange={this.onValueChange} onKeyDown={this.onValueKeyDown} />
+                </div>
+                <div className="metadataEntry-keys" >
+                    <ul>
+                        {this._allSuggestions.map(s => <li key={s} onClick={action(() => { this._currentKey = s; this.previewValue(); })} >{s}</li>)}
+                    </ul>
+                </div>
             </div>
         );
     }
diff --git a/src/client/views/collections/CollectionStackingView.tsx b/src/client/views/collections/CollectionStackingView.tsx
index 1f7ef0689..c74c60d8f 100644
--- a/src/client/views/collections/CollectionStackingView.tsx
+++ b/src/client/views/collections/CollectionStackingView.tsx
@@ -160,7 +160,8 @@ export class CollectionStackingView extends CollectionSubView(doc => doc) {
             previewScript={undefined}>
         </CollectionSchemaPreview>;
     }
-    getDocHeight(d: Doc) {
+    getDocHeight(d?: Doc) {
+        if (!d) return 0;
         let nw = NumCast(d.nativeWidth);
         let nh = NumCast(d.nativeHeight);
         if (!d.ignoreAspect && nw && nh) {
diff --git a/src/client/views/collections/CollectionStackingViewFieldColumn.tsx b/src/client/views/collections/CollectionStackingViewFieldColumn.tsx
index 74c7ef305..cc8476548 100644
--- a/src/client/views/collections/CollectionStackingViewFieldColumn.tsx
+++ b/src/client/views/collections/CollectionStackingViewFieldColumn.tsx
@@ -78,11 +78,14 @@ export class CollectionStackingViewFieldColumn extends React.Component<CSVFieldC
         let parent = this.props.parent;
         parent._docXfs.length = 0;
         return docs.map((d, i) => {
-            let pair = Doc.GetLayoutDataDocPair(parent.props.Document, parent.props.DataDoc, parent.props.fieldKey, d);
+            const pair = Doc.GetLayoutDataDocPair(parent.props.Document, parent.props.DataDoc, parent.props.fieldKey, d);
+            if (!pair.layout || pair.data instanceof Promise) {
+                return (null);
+            }
             let width = () => Math.min(d.nativeWidth && !d.ignoreAspect && !parent.props.Document.fillColumn ? d[WidthSym]() : Number.MAX_VALUE, parent.columnWidth / parent.numGroupColumns);
-            let height = () => parent.getDocHeight(pair.layout);
+            let height = () => parent.getDocHeight(pair!.layout);
             let dref = React.createRef<HTMLDivElement>();
-            let dxf = () => this.getDocTransform(pair.layout, dref.current!);
+            let dxf = () => this.getDocTransform(pair!.layout, dref.current!);
             this.props.parent._docXfs.push({ dxf: dxf, width: width, height: height });
             let rowSpan = Math.ceil((height() + parent.gridGap) / parent.gridGap);
             let style = parent.isStackingView ? { width: width(), margin: "auto", marginTop: i === 0 ? 0 : parent.gridGap, height: height() } : { gridRowEnd: `span ${rowSpan}` };
diff --git a/src/client/views/collections/CollectionSubView.tsx b/src/client/views/collections/CollectionSubView.tsx
index cfe3fefb3..818e76619 100644
--- a/src/client/views/collections/CollectionSubView.tsx
+++ b/src/client/views/collections/CollectionSubView.tsx
@@ -113,7 +113,7 @@ export function CollectionSubView<T>(schemaCtor: (doc: Doc) => T) {
         @undoBatch
         @action
         protected drop(e: Event, de: DragManager.DropEvent): boolean {
-            if (de.data instanceof DragManager.DocumentDragData) {
+            if (de.data instanceof DragManager.DocumentDragData && !de.data.applyAsTemplate) {
                 if (de.mods === "AltKey" && de.data.draggedDocuments.length) {
                     this.childDocs.map(doc =>
                         Doc.ApplyTemplateTo(de.data.draggedDocuments[0], doc, undefined)
diff --git a/src/client/views/collections/CollectionTreeView.tsx b/src/client/views/collections/CollectionTreeView.tsx
index b6a14238e..ebd385743 100644
--- a/src/client/views/collections/CollectionTreeView.tsx
+++ b/src/client/views/collections/CollectionTreeView.tsx
@@ -443,6 +443,9 @@ class TreeView extends React.Component<TreeViewProps> {
         let rowWidth = () => panelWidth() - 20;
         return docs.map((child, i) => {
             let pair = Doc.GetLayoutDataDocPair(containingCollection, dataDoc, key, child);
+            if (!pair.layout || pair.data instanceof Promise) {
+                return (null);
+            }
 
             let indent = i === 0 ? undefined : () => {
                 if (StrCast(docs[i - 1].layout).indexOf("CollectionView") !== -1) {
diff --git a/src/client/views/collections/CollectionViewChromes.scss b/src/client/views/collections/CollectionViewChromes.scss
index 595f079d1..f39bd877a 100644
--- a/src/client/views/collections/CollectionViewChromes.scss
+++ b/src/client/views/collections/CollectionViewChromes.scss
@@ -7,7 +7,6 @@
     z-index: 9001;
     transition: top .5s;
     background: lightgrey;
-    padding: 10px;
 
     .collectionViewChrome {
         display: grid;
diff --git a/src/client/views/collections/CollectionViewChromes.tsx b/src/client/views/collections/CollectionViewChromes.tsx
index b92bcc7cb..25b152d4e 100644
--- a/src/client/views/collections/CollectionViewChromes.tsx
+++ b/src/client/views/collections/CollectionViewChromes.tsx
@@ -1,30 +1,25 @@
-import * as React from "react";
-import { CollectionView } from "./CollectionView";
-import "./CollectionViewChromes.scss";
-import { CollectionViewType } from "./CollectionBaseView";
-import { undoBatch } from "../../util/UndoManager";
-import { action, observable, runInAction, computed, IObservable, IObservableValue, reaction, autorun } from "mobx";
-import { observer } from "mobx-react";
-import { Doc, DocListCast, FieldResult } from "../../../new_fields/Doc";
-import { DocLike } from "../MetadataEntryMenu";
-import * as Autosuggest from 'react-autosuggest';
-import { EditableView } from "../EditableView";
-import { StrCast, NumCast, BoolCast, Cast } from "../../../new_fields/Types";
 import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { action, computed, observable, runInAction } from "mobx";
+import { observer } from "mobx-react";
+import * as React from "react";
+import { Doc, DocListCast } from "../../../new_fields/Doc";
+import { Id } from "../../../new_fields/FieldSymbols";
+import { List } from "../../../new_fields/List";
+import { listSpec } from "../../../new_fields/Schema";
+import { ScriptField } from "../../../new_fields/ScriptField";
+import { BoolCast, Cast, NumCast, StrCast } from "../../../new_fields/Types";
 import { Utils } from "../../../Utils";
-import KeyRestrictionRow from "./KeyRestrictionRow";
+import { DragManager } from "../../util/DragManager";
 import { CompileScript } from "../../util/Scripting";
-import { ScriptField } from "../../../new_fields/ScriptField";
-import { CollectionSchemaView } from "./CollectionSchemaView";
+import { undoBatch } from "../../util/UndoManager";
+import { EditableView } from "../EditableView";
 import { COLLECTION_BORDER_WIDTH } from "../globalCssVariables.scss";
-import { listSpec } from "../../../new_fields/Schema";
-import { List } from "../../../new_fields/List";
-import { Id } from "../../../new_fields/FieldSymbols";
-import { threadId } from "worker_threads";
-import { DragManager } from "../../util/DragManager";
+import { DocLike } from "../MetadataEntryMenu";
+import { CollectionViewType } from "./CollectionBaseView";
+import { CollectionView } from "./CollectionView";
+import "./CollectionViewChromes.scss";
+import KeyRestrictionRow from "./KeyRestrictionRow";
 const datepicker = require('js-datepicker');
-import * as $ from 'jquery';
-import { firebasedynamiclinks } from "googleapis/build/src/apis/firebasedynamiclinks";
 
 interface CollectionViewChromeProps {
     CollectionView: CollectionView;
@@ -51,7 +46,6 @@ export class CollectionViewBaseChrome extends React.Component<CollectionViewChro
     @computed private get filterValue() { return Cast(this.props.CollectionView.props.Document.viewSpecScript, ScriptField); }
 
     private _picker: any;
-    private _datePickerElGuid = Utils.GenerateGuid();
 
     getFilters = (script: string) => {
         let re: any = /(!)?\(\(\(doc\.(\w+)\s+&&\s+\(doc\.\w+\s+as\s+\w+\)\.includes\(\"(\w+)\"\)/g;
@@ -91,11 +85,6 @@ export class CollectionViewBaseChrome extends React.Component<CollectionViewChro
     }
 
     componentDidMount = () => {
-        setTimeout(() => this._picker = datepicker("#" + this._datePickerElGuid, {
-            disabler: (date: Date) => date > new Date(),
-            onSelect: (instance: any, date: Date) => runInAction(() => this._dateValue = date),
-            dateSelected: new Date()
-        }), 1000);
 
         let fields: Filter[] = [];
         if (this.filterValue) {
@@ -306,6 +295,15 @@ export class CollectionViewBaseChrome extends React.Component<CollectionViewChro
         return true;
     }
 
+    datePickerRef = (node: HTMLInputElement) => {
+        if (node) {
+            this._picker = datepicker("#" + node.id, {
+                disabler: (date: Date) => date > new Date(),
+                onSelect: (instance: any, date: Date) => runInAction(() => this._dateValue = date),
+                dateSelected: new Date()
+            });
+        }
+    }
     render() {
         let collapsed = this.props.CollectionView.props.Document.chromeStatus !== "enabled";
         return (
@@ -366,7 +364,8 @@ export class CollectionViewBaseChrome extends React.Component<CollectionViewChro
                                         <option value="1y">1 year of</option>
                                     </select>
                                     <input className="collectionViewBaseChrome-viewSpecsMenu-rowRight"
-                                        id={this._datePickerElGuid}
+                                        id={Utils.GenerateGuid()}
+                                        ref={this.datePickerRef}
                                         value={this._dateValue instanceof Date ? this._dateValue.toLocaleDateString() : this._dateValue}
                                         onChange={(e) => runInAction(() => this._dateValue = e.target.value)}
                                         onPointerDown={this.openDatePicker}
diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
index d69ece421..3be6aa3d3 100644
--- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
+++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
@@ -622,20 +622,19 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {
 
     getScale = () => this.Document.scale ? this.Document.scale : 1;
 
-    getChildDocumentViewProps(childDocLayout: Doc): DocumentViewProps {
-        let pair = Doc.GetLayoutDataDocPair(this.props.Document, this.props.DataDoc, this.props.fieldKey, childDocLayout);
+    getChildDocumentViewProps(childLayout: Doc, childData?: Doc): DocumentViewProps {
         return {
-            DataDoc: pair.data,
-            Document: pair.layout,
+            DataDoc: childData,
+            Document: childLayout,
             addDocument: this.props.addDocument,
             removeDocument: this.props.removeDocument,
             moveDocument: this.props.moveDocument,
             onClick: this.props.onClick,
-            ScreenToLocalTransform: pair.layout.z ? this.getTransformOverlay : this.getTransform,
+            ScreenToLocalTransform: childLayout.z ? this.getTransformOverlay : this.getTransform,
             renderDepth: this.props.renderDepth + 1,
-            selectOnLoad: pair.layout[Id] === this._selectOnLoaded,
-            PanelWidth: pair.layout[WidthSym],
-            PanelHeight: pair.layout[HeightSym],
+            selectOnLoad: childLayout[Id] === this._selectOnLoaded,
+            PanelWidth: childLayout[WidthSym],
+            PanelHeight: childLayout[HeightSym],
             ContentScaling: returnOne,
             ContainingCollectionView: this.props.CollectionView,
             focus: this.focusDocument,
@@ -745,12 +744,15 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {
                     const pos = script ? this.getCalculatedPositions(script, { doc, index: prev.length, collection: this.Document, docs, state }) :
                         { x: Cast(doc.x, "number"), y: Cast(doc.y, "number"), z: Cast(doc.z, "number"), width: Cast(doc.width, "number"), height: Cast(doc.height, "number") };
                     state = pos.state === undefined ? state : pos.state;
-                    prev.push({
-                        ele: <CollectionFreeFormDocumentView key={doc[Id]}
-                            x={script ? pos.x : undefined} y={script ? pos.y : undefined}
-                            width={script ? pos.width : undefined} height={script ? pos.height : undefined} {...this.getChildDocumentViewProps(doc)} />,
-                        bounds: (pos.x !== undefined && pos.y !== undefined) ? { x: pos.x, y: pos.y, z: pos.z, width: NumCast(pos.width), height: NumCast(pos.height) } : undefined
-                    });
+                    let pair = Doc.GetLayoutDataDocPair(this.props.Document, this.props.DataDoc, this.props.fieldKey, doc);
+                    if (pair.layout && !(pair.data instanceof Promise)) {
+                        prev.push({
+                            ele: <CollectionFreeFormDocumentView key={doc[Id]}
+                                x={script ? pos.x : undefined} y={script ? pos.y : undefined}
+                                width={script ? pos.width : undefined} height={script ? pos.height : undefined} {...this.getChildDocumentViewProps(pair.layout, pair.data)} />,
+                            bounds: (pos.x !== undefined && pos.y !== undefined) ? { x: pos.x, y: pos.y, z: pos.z, width: NumCast(pos.width), height: NumCast(pos.height) } : undefined
+                        });
+                    }
                 }
             }
             return prev;
diff --git a/src/client/views/nodes/DocumentContentsView.tsx b/src/client/views/nodes/DocumentContentsView.tsx
index b901bdcfb..d77662355 100644
--- a/src/client/views/nodes/DocumentContentsView.tsx
+++ b/src/client/views/nodes/DocumentContentsView.tsx
@@ -68,7 +68,7 @@ export class DocumentContentsView extends React.Component<DocumentViewProps & {
     }
 
     get dataDoc() {
-        if (this.props.DataDoc === undefined && this.props.Document.layout instanceof Doc) {
+        if (this.props.DataDoc === undefined && (this.props.Document.layout instanceof Doc || this.props.Document instanceof Promise)) {
             // if there is no dataDoc (ie, we're not rendering a template layout), but this document
             // has a template layout document, then we will render the template layout but use 
             // this document as the data document for the layout.
diff --git a/src/client/views/nodes/DocumentView.tsx b/src/client/views/nodes/DocumentView.tsx
index 9e71094b0..fd53262d7 100644
--- a/src/client/views/nodes/DocumentView.tsx
+++ b/src/client/views/nodes/DocumentView.tsx
@@ -139,6 +139,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
     private _lastTap: number = 0;
     private _doubleTap = false;
     private _hitExpander = false;
+    private _hitTemplateDrag = false;
     private _mainCont = React.createRef<HTMLDivElement>();
     private _dropDisposer?: DragManager.DragDropDisposer;
     _animateToIconDisposer?: IReactionDisposer;
@@ -228,7 +229,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
     }
 
     get dataDoc() {
-        if (this.props.DataDoc === undefined && this.props.Document.layout instanceof Doc) {
+        if (this.props.DataDoc === undefined && (this.props.Document.layout instanceof Doc || this.props.Document instanceof Promise)) {
             // if there is no dataDoc (ie, we're not rendering a temlplate layout), but this document
             // has a template layout document, then we will render the template layout but use 
             // this document as the data document for the layout.
@@ -236,7 +237,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
         }
         return this.props.DataDoc !== this.props.Document ? this.props.DataDoc : undefined;
     }
-    startDragging(x: number, y: number, dropAction: dropActionType, dragSubBullets: boolean) {
+    startDragging(x: number, y: number, dropAction: dropActionType, dragSubBullets: boolean, applyAsTemplate?: boolean) {
         if (this._mainCont.current) {
             let allConnected = [this.props.Document, ...(dragSubBullets ? DocListCast(this.props.Document.subBulletDocs) : [])];
             let alldataConnected = [this.dataDoc, ...(dragSubBullets ? DocListCast(this.props.Document.subBulletDocs) : [])];
@@ -247,6 +248,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
             dragData.xOffset = xoff;
             dragData.yOffset = yoff;
             dragData.moveDocument = this.props.moveDocument;
+            dragData.applyAsTemplate = applyAsTemplate;
             DragManager.StartDocumentDrag([this._mainCont.current], dragData, x, y, {
                 handlers: {
                     dragComplete: action(emptyFunction)
@@ -377,15 +379,19 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
             }
         }
     }
+
+
     onPointerDown = (e: React.PointerEvent): void => {
         if (e.nativeEvent.cancelBubble) return;
         this._downX = e.clientX;
         this._downY = e.clientY;
         this._hitExpander = DocListCast(this.props.Document.subBulletDocs).length > 0;
-        // if (e.shiftKey && e.buttons === 1 && CollectionDockingView.Instance) {
-        // CollectionDockingView.Instance.StartOtherDrag(e, [Doc.MakeAlias(this.props.Document)], [this.dataDoc]);
-        // e.stopPropagation();
-        // } else {
+        this._hitTemplateDrag = false;
+        for (let element = (e.target as any); element && !this._hitTemplateDrag; element = element.parentElement) {
+            if (element.className && element.className.toString() === "collectionViewBaseChrome-collapse") {
+                this._hitTemplateDrag = true;
+            }
+        }
         if (this.active) e.stopPropagation(); // events stop at the lowest document that is active.  
         document.removeEventListener("pointermove", this.onPointerMove);
         document.addEventListener("pointermove", this.onPointerMove);
@@ -399,7 +405,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
                 if (!e.altKey && !this.topMost && e.buttons === 1 && !BoolCast(this.props.Document.lockedPosition)) {
                     document.removeEventListener("pointermove", this.onPointerMove);
                     document.removeEventListener("pointerup", this.onPointerUp);
-                    this.startDragging(this._downX, this._downY, e.ctrlKey || e.altKey ? "alias" : undefined, this._hitExpander);
+                    this.startDragging(this._downX, this._downY, e.ctrlKey || e.altKey ? "alias" : undefined, this._hitExpander, this._hitTemplateDrag);
                 }
             }
             e.stopPropagation(); // doesn't actually stop propagation since all our listeners are listening to events on 'document'  however it does mark the event as cancelBubble=true which we test for in the move event handlers
@@ -457,6 +463,10 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
 
             DocUtils.MakeLink(annotationDoc, targetDoc, this.props.ContainingCollectionView!.props.Document, `Link from ${StrCast(annotationDoc.title)}`);
         }
+        if (de.data instanceof DragManager.DocumentDragData && de.data.applyAsTemplate) {
+            Doc.ApplyTemplateTo(de.data.draggedDocuments[0], this.props.Document, this.props.DataDoc);
+            e.stopPropagation();
+        }
         if (de.data instanceof DragManager.LinkDragData) {
             let sourceDoc = de.data.linkSourceDocument;
             let destDoc = this.props.Document;
@@ -679,7 +689,6 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
             cm.addItem({ description: "Share...", subitems: usersMenu, icon: "share" });
             if (!ClientUtils.RELEASE) {
                 let setWriteMode = (mode: DocServer.WriteMode) => {
-                    console.log(DocServer.WriteMode[mode]);
                     DocServer.AclsMode = mode;
                     const mode1 = mode;
                     const mode2 = mode === DocServer.WriteMode.Default ? mode : DocServer.WriteMode.Playground;
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index f7890e5a6..0e347ca67 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -167,7 +167,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             FormattedTextBox._toolTipTextMenu && (FormattedTextBox._toolTipTextMenu.HackToFixTextSelectionGlitch = false);
             if (state.selection.empty && FormattedTextBox._toolTipTextMenu) {
                 const marks = tx.storedMarks;
-                console.log(marks);
                 if (marks) { FormattedTextBox._toolTipTextMenu.mark_key_pressed(marks); }
             }
             this._applyingChange = true;
@@ -296,10 +295,10 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
                 this._editorView.updateState(EditorState.fromJSON(config, JSON.parse(field2)))
         );
 
-        this.props.isOverlay && (this._heightReactionDisposer = reaction(
+        this._heightReactionDisposer = reaction(
             () => this.props.Document[WidthSym](),
             () => this.tryUpdateHeight()
-        ));
+        );
 
         this._textReactionDisposer = reaction(
             () => this.extensionDoc,
@@ -448,8 +447,8 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         if (this.props.selectOnLoad) {
             if (!this.props.isOverlay) this.props.select(false);
             else this._editorView!.focus();
-            this.tryUpdateHeight();
         }
+        this.tryUpdateHeight();
     }
 
     componentWillUnmount() {
@@ -610,9 +609,10 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
 
     @action
     tryUpdateHeight() {
-        if (this.props.Document.autoHeight && this.props.isOverlay) {
+        if (this.props.Document.autoHeight && this._ref.current!.scrollHeight !== 0) {
+            console.log("DT = " + this.props.Document.title + " " + this._ref.current!.clientHeight + " " + this._ref.current!.scrollHeight + " " + this._ref.current!.textContent)
             let xf = this._ref.current!.getBoundingClientRect();
-            let scrBounds = this.props.ScreenToLocalTransform().transformBounds(0, 0, xf.width, xf.height);
+            let scrBounds = this.props.ScreenToLocalTransform().transformBounds(0, 0, xf.width, this._ref.current!.textContent === "" ? 35 : this._ref.current!.scrollHeight);
             let nh = this.props.Document.isTemplate ? 0 : NumCast(this.dataDoc.nativeHeight, 0);
             let dh = NumCast(this.props.Document.height, 0);
             let sh = scrBounds.height;
diff --git a/src/client/views/nodes/ImageBox.tsx b/src/client/views/nodes/ImageBox.tsx
index 708e00576..6fc94a140 100644
--- a/src/client/views/nodes/ImageBox.tsx
+++ b/src/client/views/nodes/ImageBox.tsx
@@ -89,10 +89,7 @@ export class ImageBox extends DocComponent<FieldViewProps, ImageDocument>(ImageD
     drop = (e: Event, de: DragManager.DropEvent) => {
         if (de.data instanceof DragManager.DocumentDragData) {
             de.data.droppedDocuments.forEach(action((drop: Doc) => {
-                if (de.mods === "CtrlKey") {
-                    Doc.ApplyTemplateTo(drop, this.props.Document, this.props.DataDoc);
-                    e.stopPropagation();
-                } else if (de.mods === "AltKey" && /*this.dataDoc !== this.props.Document &&*/ drop.data instanceof ImageField) {
+                if (de.mods === "AltKey" && /*this.dataDoc !== this.props.Document &&*/ drop.data instanceof ImageField) {
                     Doc.GetProto(this.dataDoc)[this.props.fieldKey] = new ImageField(drop.data.url);
                     e.stopPropagation();
                 } else if (de.mods === "MetaKey") {
@@ -321,7 +318,7 @@ export class ImageBox extends DocComponent<FieldViewProps, ImageDocument>(ImageD
                 let rotation = NumCast(this.dataDoc.rotation) % 180;
                 let realsize = rotation === 90 || rotation === 270 ? { height: size.width, width: size.height } : size;
                 let aspect = realsize.height / realsize.width;
-                if (Math.abs(NumCast(layoutdoc.height) - realsize.height) > 1 || Math.abs(NumCast(layoutdoc.width) - realsize.width) > 1) {
+                if (layoutdoc.nativeHeight !== 0 && layoutdoc.nativeWidth !== 0 && (Math.abs(NumCast(layoutdoc.height) - realsize.height) > 1 || Math.abs(NumCast(layoutdoc.width) - realsize.width) > 1)) {
                     setTimeout(action(() => {
                         layoutdoc.height = layoutdoc[WidthSym]() * aspect;
                         layoutdoc.nativeHeight = realsize.height;
diff --git a/src/new_fields/Doc.ts b/src/new_fields/Doc.ts
index 31f1f7a12..ca05dfa45 100644
--- a/src/new_fields/Doc.ts
+++ b/src/new_fields/Doc.ts
@@ -446,20 +446,23 @@ export namespace Doc {
         if (expandedTemplateLayout instanceof Doc) {
             return expandedTemplateLayout;
         }
+        if (expandedTemplateLayout instanceof Promise) {
+            return undefined;
+        }
         let expandedLayoutFieldKey = "Layout[" + templateLayoutDoc[Id] + "]";
         expandedTemplateLayout = dataDoc[expandedLayoutFieldKey];
         if (expandedTemplateLayout instanceof Doc) {
             return expandedTemplateLayout;
         }
         if (expandedTemplateLayout === undefined) {
-            setTimeout(() =>
-                dataDoc[expandedLayoutFieldKey] = Doc.MakeDelegate(templateLayoutDoc, undefined, "[" + templateLayoutDoc.title + "]"), 0);
+            setTimeout(() => dataDoc[expandedLayoutFieldKey] === undefined &&
+                (dataDoc[expandedLayoutFieldKey] = Doc.MakeDelegate(templateLayoutDoc, undefined, "[" + templateLayoutDoc.title + "]")), 0);
         }
-        return templateLayoutDoc; // use the templateLayout when it's not a template or the expandedTemplate is pending.
+        return undefined; // use the templateLayout when it's not a template or the expandedTemplate is pending.
     }
 
     export function GetLayoutDataDocPair(doc: Doc, dataDoc: Doc | undefined, fieldKey: string, childDocLayout: Doc) {
-        let layoutDoc = childDocLayout;
+        let layoutDoc: Doc | undefined = childDocLayout;
         let resolvedDataDoc = !doc.isTemplate && dataDoc !== doc && dataDoc ? Doc.GetDataDoc(dataDoc) : undefined;
         if (resolvedDataDoc && Doc.WillExpandTemplateLayout(childDocLayout, resolvedDataDoc)) {
             Doc.UpdateDocumentExtensionForField(resolvedDataDoc, fieldKey);
-- 
cgit v1.2.3-70-g09d2


From dc587b0fb493d869e6cd38fa94b81105da4fbaab Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Tue, 20 Aug 2019 20:03:08 -0400
Subject: finished UI

---
 src/client/views/DocumentDecorations.scss   |  6 +-
 src/client/views/DocumentDecorations.tsx    | 92 ++++++++++++++++++-----------
 src/client/views/nodes/FormattedTextBox.tsx |  3 +-
 src/new_fields/RichTextField.ts             |  7 ++-
 4 files changed, 67 insertions(+), 41 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/DocumentDecorations.scss b/src/client/views/DocumentDecorations.scss
index 0b7411fca..ef7159370 100644
--- a/src/client/views/DocumentDecorations.scss
+++ b/src/client/views/DocumentDecorations.scss
@@ -255,4 +255,8 @@ $linkGap : 3px;
     input {
         margin-right: 10px;
     }
-}
\ No newline at end of file
+}
+
+@-moz-keyframes spin { 100% { -moz-transform: rotate(360deg); } }
+@-webkit-keyframes spin { 100% { -webkit-transform: rotate(360deg); } }
+@keyframes spin { 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } }
\ No newline at end of file
diff --git a/src/client/views/DocumentDecorations.tsx b/src/client/views/DocumentDecorations.tsx
index 05239073b..7645af054 100644
--- a/src/client/views/DocumentDecorations.tsx
+++ b/src/client/views/DocumentDecorations.tsx
@@ -1,5 +1,5 @@
 import { library, IconProp } from '@fortawesome/fontawesome-svg-core';
-import { faLink, faTag, faArrowAltCircleDown, faArrowAltCircleUp, faCheckCircle, faStopCircle, faCloudUploadAlt } from '@fortawesome/free-solid-svg-icons';
+import { faLink, faTag, faArrowAltCircleDown, faArrowAltCircleUp, faCheckCircle, faStopCircle, faCloudUploadAlt, faSyncAlt } from '@fortawesome/free-solid-svg-icons';
 import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
 import { action, computed, observable, reaction, runInAction } from "mobx";
 import { observer } from "mobx-react";
@@ -41,8 +41,10 @@ library.add(faArrowAltCircleUp);
 library.add(faStopCircle);
 library.add(faCheckCircle);
 library.add(faCloudUploadAlt);
+library.add(faSyncAlt);
 
 const cloud: IconProp = "cloud-upload-alt";
+const fetch: IconProp = "sync-alt";
 
 @observer
 export class DocumentDecorations extends React.Component<{}, { value: string }> {
@@ -76,48 +78,47 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>
     @observable public pushIcon: IconProp = "arrow-alt-circle-up";
     @observable public pullIcon: IconProp = "arrow-alt-circle-down";
     @observable public pullColor: string = "white";
+    @observable public isAnimatingFetch = false;
     public pullColorAnimating = false;
 
     private pullAnimating = false;
     private pushAnimating = false;
 
     public startPullOutcome = action((success: boolean) => {
-        if (this.pullAnimating) {
-            return;
+        if (!this.pullAnimating) {
+            this.pullAnimating = true;
+            this.pullIcon = success ? "check-circle" : "stop-circle";
+            setTimeout(() => runInAction(() => {
+                this.pullIcon = "arrow-alt-circle-down";
+                this.pullAnimating = false;
+            }), 1000);
         }
-        this.pullAnimating = true;
-        this.pullIcon = success ? "check-circle" : "stop-circle";
-        setTimeout(() => runInAction(() => {
-            this.pullIcon = "arrow-alt-circle-down";
-            this.pullAnimating = false;
-        }), 1000);
     });
 
     public startPushOutcome = action((success: boolean) => {
-        if (this.pushAnimating) {
-            return;
+        if (!this.pushAnimating) {
+            this.pushAnimating = true;
+            this.pushIcon = success ? "check-circle" : "stop-circle";
+            setTimeout(() => runInAction(() => {
+                this.pushIcon = "arrow-alt-circle-up";
+                this.pushAnimating = false;
+            }), 1000);
         }
-        this.pushAnimating = true;
-        this.pushIcon = success ? "check-circle" : "stop-circle";
-        setTimeout(() => runInAction(() => {
-            this.pushIcon = "arrow-alt-circle-up";
-            this.pushAnimating = false;
-        }), 1000);
     });
 
-    public setPullState = (unchanged: boolean) => {
-        if (this.pullColorAnimating) {
-            return;
+    public setPullState = action((unchanged: boolean) => {
+        this.isAnimatingFetch = false;
+        if (!this.pullColorAnimating) {
+            this.pullColorAnimating = true;
+            this.pullColor = unchanged ? "lawngreen" : "red";
+            setTimeout(this.clearPullColor, 1000);
         }
-        this.pullColorAnimating = true;
-        this.pullColor = unchanged ? "lawngreen" : "red";
-        setTimeout(() => {
-            runInAction(() => {
-                this.pullColor = "white";
-                this.pullColorAnimating = false;
-            });
-        }, 2000);
-    }
+    });
+
+    private clearPullColor = action(() => {
+        this.pullColor = "white";
+        this.pullColorAnimating = false;
+    });
 
     constructor(props: Readonly<{}>) {
         super(props);
@@ -679,7 +680,7 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>
         let canPush = this.targetDoc.data && this.targetDoc.data instanceof RichTextField;
         if (!canPush) return (null);
         let published = Doc.GetProto(this.targetDoc)[GoogleRef] !== undefined;
-        let icon: IconProp = published ? (this.pushIcon as any) : (cloud as any);
+        let icon: IconProp = published ? (this.pushIcon as any) : cloud;
         return (
             <div className={"linkButtonWrapper"}>
                 <div title={`${published ? "Push" : "Publish"} to Google Docs`} className="linkButton-linker" onClick={() => {
@@ -695,14 +696,33 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>
     considerGoogleDocsPull = () => {
         let canPull = this.targetDoc.data && this.targetDoc.data instanceof RichTextField;
         let dataDoc = Doc.GetProto(this.targetDoc);
-        if (!canPull || !dataDoc[GoogleRef] || dataDoc.unchanged) return (null);
+        if (!canPull || !dataDoc[GoogleRef]) return (null);
+        let icon = !dataDoc.unchanged ? (this.pullIcon as any) : fetch;
+        let animation = this.isAnimatingFetch ? "spin 0.5s linear infinite" : "none";
         return (
             <div className={"linkButtonWrapper"}>
-                <div style={{ backgroundColor: this.pullColor, transition: "1s ease all" }} title="Pull From Google Docs" className="linkButton-linker" onClick={() => {
-                    DocumentDecorations.hasPulledHack = false;
-                    this.targetDoc[Pulls] = NumCast(this.targetDoc[Pulls]) + 1;
-                }}>
-                    <FontAwesomeIcon className="documentdecorations-icon" icon={this.pullIcon} size="sm" />
+                <div
+                    title="Pull From Google Docs"
+                    className="linkButton-linker"
+                    style={{
+                        backgroundColor: this.pullColor,
+                        transition: "0.2s ease all"
+                    }}
+                    onClick={() => {
+                        this.clearPullColor();
+                        DocumentDecorations.hasPulledHack = false;
+                        this.targetDoc[Pulls] = NumCast(this.targetDoc[Pulls]) + 1;
+                        dataDoc.unchanged && runInAction(() => this.isAnimatingFetch = true);
+                    }}>
+                    <FontAwesomeIcon
+                        style={{
+                            WebkitAnimation: animation,
+                            MozAnimation: animation
+                        }}
+                        className="documentdecorations-icon"
+                        icon={icon}
+                        size="sm"
+                    />
                 </div>
             </div>
         );
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 8a355a425..e06be7079 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -354,7 +354,8 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             () => {
                 if (!DocumentDecorations.hasPulledHack) {
                     DocumentDecorations.hasPulledHack = true;
-                    this.pullFromGoogleDoc(this.updateState);
+                    let unchanged = this.dataDoc.unchanged;
+                    this.pullFromGoogleDoc(unchanged ? this.checkState : this.updateState);
                 }
             }
         );
diff --git a/src/new_fields/RichTextField.ts b/src/new_fields/RichTextField.ts
index ab58329f9..cae5623e6 100644
--- a/src/new_fields/RichTextField.ts
+++ b/src/new_fields/RichTextField.ts
@@ -38,9 +38,10 @@ export class RichTextField extends ObjectField {
         let blockText = (block: any) => block.text;
         let concatenateParagraph = (p: any) => (p.content ? p.content.map(blockText).join(joiner) : "") + delimiter;
 
-        // Concatentate paragraphs and string the result together. Trim the last newline, an artifact.
-        let textParagraphs = paragraphs.map(concatenateParagraph);
-        return textParagraphs.join(joiner).trimEnd(delimiter);
+        // Concatentate paragraphs and string the result together
+        let textParagraphs: string[] = paragraphs.map(concatenateParagraph);
+        let plainText = textParagraphs.join(joiner);
+        return plainText.substring(0, plainText.length - 1);
     }
 
     [FromPlainText](plainText: string) {
-- 
cgit v1.2.3-70-g09d2


From 820ad7343816ee9d5881eefdbcbe8783fe903257 Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Tue, 20 Aug 2019 21:07:43 -0400
Subject: animation fix

---
 src/client/views/nodes/FormattedTextBox.tsx | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 2705fac14..d4cbb5116 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -1,6 +1,6 @@
 import { library } from '@fortawesome/fontawesome-svg-core';
 import { faEdit, faSmile, faTextHeight, faUpload } from '@fortawesome/free-solid-svg-icons';
-import { action, computed, IReactionDisposer, Lambda, observable, reaction } from "mobx";
+import { action, computed, IReactionDisposer, Lambda, observable, reaction, runInAction } from "mobx";
 import { observer } from "mobx-react";
 import { baseKeymap } from "prosemirror-commands";
 import { history } from "prosemirror-history";
@@ -298,6 +298,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         }
 
         this.pullFromGoogleDoc(this.checkState);
+        runInAction(() => DocumentDecorations.Instance.isAnimatingFetch = true);
 
         this._reactionDisposer = reaction(
             () => {
-- 
cgit v1.2.3-70-g09d2


From c0439996ec8b4858c48a7871120e19bb7c06c67d Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Tue, 20 Aug 2019 21:37:32 -0400
Subject: drag and drop google docs tweaks

---
 package.json                                       | 4 +---
 src/client/DocServer.ts                            | 1 -
 src/client/views/collections/CollectionSubView.tsx | 8 ++++----
 src/client/views/nodes/FormattedTextBox.tsx        | 1 +
 4 files changed, 6 insertions(+), 8 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/package.json b/package.json
index e6a0a54b9..de1f3f6e6 100644
--- a/package.json
+++ b/package.json
@@ -63,7 +63,6 @@
         "@types/cookie-parser": "^1.4.1",
         "@types/cookie-session": "^2.0.36",
         "@types/d3-format": "^1.3.1",
-        "@types/diff": "^4.0.2",
         "@types/dotenv": "^6.1.1",
         "@types/express": "^4.16.1",
         "@types/express-flash": "0.0.0",
@@ -128,7 +127,6 @@
         "cookie-session": "^2.0.0-beta.3",
         "crypto-browserify": "^3.11.0",
         "d3-format": "^1.3.2",
-        "diff": "^4.0.1",
         "dotenv": "^8.0.0",
         "express": "^4.16.4",
         "express-flash": "0.0.2",
@@ -221,4 +219,4 @@
         "xoauth2": "^1.2.0",
         "youtube": "^0.1.0"
     }
-}
+}
\ No newline at end of file
diff --git a/src/client/DocServer.ts b/src/client/DocServer.ts
index 56d9147ae..2cec1046b 100644
--- a/src/client/DocServer.ts
+++ b/src/client/DocServer.ts
@@ -5,7 +5,6 @@ import { Utils, emptyFunction } from '../Utils';
 import { SerializationHelper } from './util/SerializationHelper';
 import { RefField } from '../new_fields/RefField';
 import { Id, HandleUpdate } from '../new_fields/FieldSymbols';
-import { docs_v1 } from 'googleapis';
 
 /**
  * This class encapsulates the transfer and cross-client synchronization of
diff --git a/src/client/views/collections/CollectionSubView.tsx b/src/client/views/collections/CollectionSubView.tsx
index 3deec22b5..5b50c545c 100644
--- a/src/client/views/collections/CollectionSubView.tsx
+++ b/src/client/views/collections/CollectionSubView.tsx
@@ -17,7 +17,7 @@ import { DragManager } from "../../util/DragManager";
 import { undoBatch, UndoManager } from "../../util/UndoManager";
 import { DocComponent } from "../DocComponent";
 import { FieldViewProps } from "../nodes/FieldView";
-import { FormattedTextBox, Blank } from "../nodes/FormattedTextBox";
+import { FormattedTextBox, GoogleRef } from "../nodes/FormattedTextBox";
 import { CollectionPDFView } from "./CollectionPDFView";
 import { CollectionVideoView } from "./CollectionVideoView";
 import { CollectionView } from "./CollectionView";
@@ -209,11 +209,11 @@ export function CollectionSubView<T>(schemaCtor: (doc: Doc) => T) {
             }
             let matches: RegExpExecArray | null;
             if ((matches = /(https:\/\/)?docs\.google\.com\/document\/d\/([^\\]+)\/edit/g.exec(text)) !== null) {
-                let newBox = Docs.Create.TextDocument({ ...options, width: 600, height: 400, title: "Fetching title from Google Docs..." });
+                let newBox = Docs.Create.TextDocument({ ...options, width: 400, height: 200, title: "Awaiting title from Google Docs..." });
                 let proto = newBox.proto!;
                 proto.autoHeight = true;
-                proto.googleDocId = matches[2];
-                proto.data = "Fetching contents from Google Docs...";
+                proto[GoogleRef] = matches[2];
+                proto.data = "Please select and then click on this document's pull button to load its contents from from Google Docs...";
                 proto.backgroundColor = "#eeeeff";
                 this.props.addDocument(newBox);
                 return;
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index d4cbb5116..2b01fb70a 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -434,6 +434,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             delete dataDoc[GoogleRef];
         }
         DocumentDecorations.Instance.startPullOutcome(pullSuccess);
+        this.tryUpdateHeight();
     }
 
     checkState = (exportState: GoogleApiClientUtils.Docs.ReadResult, dataDoc: Doc) => {
-- 
cgit v1.2.3-70-g09d2


From 73bb0f572e261850583b698dd819d35a6fe768ec Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Tue, 20 Aug 2019 21:42:37 -0400
Subject: cleanup

---
 src/client/views/MainView.tsx                      | 2 +-
 src/client/views/collections/CollectionSubView.tsx | 2 +-
 src/client/views/nodes/FormattedTextBox.tsx        | 6 +++---
 3 files changed, 5 insertions(+), 5 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index e85374f6a..f28844009 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -15,7 +15,7 @@ import { listSpec } from '../../new_fields/Schema';
 import { BoolCast, Cast, FieldValue, StrCast } from '../../new_fields/Types';
 import { CurrentUserUtils } from '../../server/authentication/models/current_user_utils';
 import { RouteStore } from '../../server/RouteStore';
-import { emptyFunction, returnOne, returnTrue, Utils, returnEmptyString, PostToServer } from '../../Utils';
+import { emptyFunction, returnOne, returnTrue, Utils, returnEmptyString } from '../../Utils';
 import { DocServer } from '../DocServer';
 import { Docs } from '../documents/Documents';
 import { ClientUtils } from '../util/ClientUtils';
diff --git a/src/client/views/collections/CollectionSubView.tsx b/src/client/views/collections/CollectionSubView.tsx
index 5b50c545c..99e5ab7b3 100644
--- a/src/client/views/collections/CollectionSubView.tsx
+++ b/src/client/views/collections/CollectionSubView.tsx
@@ -213,7 +213,7 @@ export function CollectionSubView<T>(schemaCtor: (doc: Doc) => T) {
                 let proto = newBox.proto!;
                 proto.autoHeight = true;
                 proto[GoogleRef] = matches[2];
-                proto.data = "Please select and then click on this document's pull button to load its contents from from Google Docs...";
+                proto.data = "Please select this document and then click on its pull button to load its contents from from Google Docs...";
                 proto.backgroundColor = "#eeeeff";
                 this.props.addDocument(newBox);
                 return;
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 2b01fb70a..606e8edb0 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -389,9 +389,9 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
                 };
             }
             let redo = async () => {
-                if (this._editorView && reference) {
-                    let data = Cast(this.dataDoc.data, RichTextField);
-                    let content = data ? data[ToPlainText]() : this._editorView.state.doc.textContent;
+                let data = Cast(this.dataDoc.data, RichTextField);
+                if (this._editorView && reference && data) {
+                    let content = data[ToPlainText]();
                     let response = await GoogleApiClientUtils.Docs.write({ reference, content, mode });
                     let pushSuccess = response !== undefined && !("errors" in response);
                     dataDoc.unchanged = pushSuccess;
-- 
cgit v1.2.3-70-g09d2


From 8fa3c03f1fae853e3c626e748aef76f9b7bbc875 Mon Sep 17 00:00:00 2001
From: kimdahey <claire_kim1@brown.edu>
Date: Tue, 20 Aug 2019 22:42:25 -0400
Subject: initial commit

---
 package.json                                |  2 +-
 src/client/util/DictationManager.ts         | 12 ++++++++++--
 src/client/views/nodes/FormattedTextBox.tsx | 20 ++++++++++++++++++++
 3 files changed, 31 insertions(+), 3 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/package.json b/package.json
index de1f3f6e6..cd60b7b55 100644
--- a/package.json
+++ b/package.json
@@ -219,4 +219,4 @@
         "xoauth2": "^1.2.0",
         "youtube": "^0.1.0"
     }
-}
\ No newline at end of file
+}
diff --git a/src/client/util/DictationManager.ts b/src/client/util/DictationManager.ts
index 488a146bf..758482eae 100644
--- a/src/client/util/DictationManager.ts
+++ b/src/client/util/DictationManager.ts
@@ -301,11 +301,16 @@ export namespace DictationManager {
                 }
             }],
 
-            ["create bulleted note", {
+            ["new outline", {
                 action: (target: DocumentView) => {
                     let newBox = Docs.Create.TextDocument({ width: 400, height: 200, title: "My Outline" });
+                    newBox.autoHeight = true;
                     let proto = newBox.proto!;
-                    let proseMirrorState = '"{"doc":{"type":"doc","content":[{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"type":"text","text":""}]}]}]}]},"selection":{"type":"text","anchor":1,"head":1}}"';
+                    proto.page = -1;
+                    let prompt = "Press alt + r to start dictating here...";
+                    let head = 3;
+                    let anchor = head + prompt.length;
+                    let proseMirrorState = `{"doc":{"type":"doc","content":[{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"type":"text","text":"${prompt}"}]}]}]}]},"selection":{"type":"text","anchor":${anchor},"head":${head}}}`;
                     proto.data = new RichTextField(proseMirrorState);
                     proto.backgroundColor = "#eeffff";
                     target.props.addDocTab(newBox, proto, "onRight");
@@ -323,6 +328,9 @@ export namespace DictationManager {
                     let what = matches[2];
                     let dataDoc = Doc.GetProto(target.props.Document);
                     let fieldKey = "data";
+                    if (isNaN(count)) {
+                        return;
+                    }
                     for (let i = 0; i < count; i++) {
                         let created: Doc | undefined;
                         switch (what) {
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 606e8edb0..e460e3e50 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -35,6 +35,7 @@ import React = require("react");
 import { GoogleApiClientUtils, Pulls, Pushes } from '../../apis/google_docs/GoogleApiClientUtils';
 import { DocumentDecorations } from '../DocumentDecorations';
 import { MainOverlayTextBox } from '../MainOverlayTextBox';
+import { DictationManager } from '../../util/DictationManager';
 
 library.add(faEdit);
 library.add(faSmile, faTextHeight, faUpload);
@@ -265,7 +266,25 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         }
     }
 
+    setCurrentBulletContent = (value: string) => {
+        if (this._editorView) {
+            this._editorView.state;
+        }
+    }
+
+    considerRecordingSession = (e: KeyboardEvent) => {
+        if (e.which === 82 && e.altKey) {
+            let continuous = { indefinite: true };
+            DictationManager.Controls.listen({
+                interimHandler: this.setCurrentBulletContent,
+                continuous
+            });
+        }
+    }
+
     componentDidMount() {
+        document.removeEventListener("keypress", this.considerRecordingSession);
+        document.addEventListener("keypress", this.considerRecordingSession);
         const config = {
             schema,
             inpRules, //these currently don't do anything, but could eventually be helpful
@@ -576,6 +595,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
     }
 
     componentWillUnmount() {
+        document.removeEventListener("keypress", this.considerRecordingSession);
         this._editorView && this._editorView.destroy();
         this._reactionDisposer && this._reactionDisposer();
         this._proxyReactionDisposer && this._proxyReactionDisposer();
-- 
cgit v1.2.3-70-g09d2


From d260d9abc13ae60c3206c3110f2d7f23ceeb2449 Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Wed, 21 Aug 2019 05:29:07 -0400
Subject: prosemirror bulleted list dictation integration

---
 src/client/util/DictationManager.ts         | 48 ++++++++++--------
 src/client/views/DocumentDecorations.tsx    |  3 +-
 src/client/views/nodes/FormattedTextBox.tsx | 76 ++++++++++++++++++++++++-----
 3 files changed, 93 insertions(+), 34 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/util/DictationManager.ts b/src/client/util/DictationManager.ts
index 758482eae..781e5e465 100644
--- a/src/client/util/DictationManager.ts
+++ b/src/client/util/DictationManager.ts
@@ -45,7 +45,7 @@ export namespace DictationManager {
 
     export namespace Controls {
 
-        const infringe = "unable to process: dictation manager still involved in previous session";
+        export const Infringed = "unable to process: dictation manager still involved in previous session";
         const intraSession = ". ";
         const interSession = " ... ";
 
@@ -69,30 +69,32 @@ export namespace DictationManager {
             delimiters: DelimiterArgs;
             interimHandler: InterimResultHandler;
             tryExecute: boolean;
+            terminators: string[];
         }
 
         export const listen = async (options?: Partial<ListeningOptions>) => {
             let results: string | undefined;
-            let main = MainView.Instance;
+            // let main = MainView.Instance;
 
-            main.dictationOverlayVisible = true;
-            main.isListening = { interim: false };
+            // main.dictationOverlayVisible = true;
+            // main.isListening = { interim: false };
 
             try {
                 results = await listenImpl(options);
                 if (results) {
                     Utils.CopyText(results);
-                    main.isListening = false;
-                    let execute = options && options.tryExecute;
-                    main.dictatedPhrase = execute ? results.toLowerCase() : results;
-                    main.dictationSuccess = execute ? await DictationManager.Commands.execute(results) : true;
+                    // main.isListening = false;
+                    // let execute = options && options.tryExecute;
+                    // main.dictatedPhrase = execute ? results.toLowerCase() : results;
+                    // main.dictationSuccess = execute ? await DictationManager.Commands.execute(results) : true;
+                    options && options.tryExecute && await DictationManager.Commands.execute(results);
                 }
             } catch (e) {
-                main.isListening = false;
-                main.dictatedPhrase = results = `dictation error: ${"error" in e ? e.error : "unknown error"}`;
-                main.dictationSuccess = false;
+                // main.isListening = false;
+                // main.dictatedPhrase = results = `dictation error: ${"error" in e ? e.error : "unknown error"}`;
+                // main.dictationSuccess = false;
             } finally {
-                main.initiateDictationFade();
+                // main.initiateDictationFade();
             }
 
             return results;
@@ -100,7 +102,7 @@ export namespace DictationManager {
 
         const listenImpl = (options?: Partial<ListeningOptions>) => {
             if (isListening) {
-                return infringe;
+                return Infringed;
             }
             isListening = true;
 
@@ -128,6 +130,12 @@ export namespace DictationManager {
 
                 recognizer.onresult = (e: SpeechRecognitionEvent) => {
                     current = synthesize(e, intra);
+                    let matchedTerminator: string | undefined;
+                    if (options && options.terminators && (matchedTerminator = options.terminators.find(end => current ? current.trim().toLowerCase().endsWith(end.toLowerCase()) : false))) {
+                        current = matchedTerminator;
+                        recognizer.abort();
+                        return complete();
+                    }
                     handler && handler(current);
                     isManuallyStopped && complete();
                 };
@@ -163,13 +171,13 @@ export namespace DictationManager {
             }
             isManuallyStopped = true;
             salvageSession ? recognizer.stop() : recognizer.abort();
-            let main = MainView.Instance;
-            if (main.dictationOverlayVisible) {
-                main.cancelDictationFade();
-                main.dictationOverlayVisible = false;
-                main.dictationSuccess = undefined;
-                setTimeout(() => main.dictatedPhrase = placeholder, 500);
-            }
+            // let main = MainView.Instance;
+            // if (main.dictationOverlayVisible) {
+            // main.cancelDictationFade();
+            // main.dictationOverlayVisible = false;
+            // main.dictationSuccess = undefined;
+            // setTimeout(() => main.dictatedPhrase = placeholder, 500);
+            // }
         };
 
         const synthesize = (e: SpeechRecognitionEvent, delimiter?: string) => {
diff --git a/src/client/views/DocumentDecorations.tsx b/src/client/views/DocumentDecorations.tsx
index 891fd7847..cc8e57af9 100644
--- a/src/client/views/DocumentDecorations.tsx
+++ b/src/client/views/DocumentDecorations.tsx
@@ -730,7 +730,8 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>
                     onPointerEnter={e => e.ctrlKey && runInAction(() => this.openHover = true)}
                     onPointerLeave={() => runInAction(() => this.openHover = false)}
                     onClick={e => {
-                        if (e.ctrlKey) {
+                        if (e.altKey) {
+                            e.preventDefault();
                             window.open(`https://docs.google.com/document/d/${dataDoc[GoogleRef]}/edit`);
                         } else {
                             this.clearPullColor();
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index e460e3e50..222ebed8f 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -6,7 +6,7 @@ import { baseKeymap } from "prosemirror-commands";
 import { history } from "prosemirror-history";
 import { keymap } from "prosemirror-keymap";
 import { Fragment, Node, Node as ProsNode, NodeType, Slice } from "prosemirror-model";
-import { EditorState, Plugin, Transaction } from "prosemirror-state";
+import { EditorState, Plugin, Transaction, TextSelection } from "prosemirror-state";
 import { EditorView } from "prosemirror-view";
 import { DateField } from '../../../new_fields/DateField';
 import { Doc, DocListCast, Opt, WidthSym } from "../../../new_fields/Doc";
@@ -36,6 +36,7 @@ import { GoogleApiClientUtils, Pulls, Pushes } from '../../apis/google_docs/Goog
 import { DocumentDecorations } from '../DocumentDecorations';
 import { MainOverlayTextBox } from '../MainOverlayTextBox';
 import { DictationManager } from '../../util/DictationManager';
+import { ReplaceStep } from 'prosemirror-transform';
 
 library.add(faEdit);
 library.add(faSmile, faTextHeight, faUpload);
@@ -181,6 +182,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
                 const marks = tx.storedMarks;
                 if (marks) { FormattedTextBox._toolTipTextMenu.mark_key_pressed(marks); }
             }
+
             this._applyingChange = true;
             const fieldkey = "preview";
             if (this.extensionDoc) this.extensionDoc.text = state.doc.textBetween(0, state.doc.content.size, "\n\n");
@@ -268,23 +270,70 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
 
     setCurrentBulletContent = (value: string) => {
         if (this._editorView) {
-            this._editorView.state;
+            // let next = value.endsWith("bullet");
+            // if (next) {
+            //     value = value.split("bullet")[0];
+            // }
+            let state = this._editorView.state;
+            let from = state.selection.from;
+            let to = state.selection.to;
+            this._editorView.dispatch(state.tr.insertText(value, from, to));
+            state = this._editorView.state;
+            let updated = TextSelection.create(state.doc, from, from + value.length);
+            this._editorView.dispatch(state.tr.setSelection(updated));
+            // if (next) {
+            //     this.nextBullet(this._editorView.state.selection.to);
+            // }
         }
     }
 
-    considerRecordingSession = (e: KeyboardEvent) => {
-        if (e.which === 82 && e.altKey) {
-            let continuous = { indefinite: true };
-            DictationManager.Controls.listen({
-                interimHandler: this.setCurrentBulletContent,
-                continuous
-            });
+    nextBullet = (pos: number) => {
+        if (this._editorView) {
+            // DictationManager.Controls.stop(false);
+            let frag = Fragment.fromArray(this.newListItems(2));
+            let slice = new Slice(frag, 2, 2);
+            let state = this._editorView.state;
+            this._editorView.dispatch(state.tr.step(new ReplaceStep(pos, pos, slice)));
+            pos += 4;
+            state = this._editorView.state;
+            this._editorView.dispatch(state.tr.setSelection(TextSelection.create(this._editorView.state.doc, pos, pos)));
+            // this.recordSession();
+        }
+    }
+
+    private newListItems = (count: number) => {
+        let listItems: any[] = [];
+        for (let i = 0; i < count; i++) {
+            listItems.push(schema.nodes.list_item.create(null, schema.nodes.paragraph.create(null)));
         }
+        return listItems;
+    }
+
+    recordSession = async () => {
+        let completedCue = "end session";
+        let results = await DictationManager.Controls.listen({
+            interimHandler: this.setCurrentBulletContent,
+            continuous: { indefinite: false },
+            terminators: [completedCue, "bullet", "next"]
+        });
+        if (results && [DictationManager.Controls.Infringed, completedCue].includes(results)) {
+            DictationManager.Controls.stop();
+            return;
+        }
+        this.nextBullet(this._editorView!.state.selection.to);
+        setTimeout(this.recordSession, 2000);
+    }
+
+    recordKeyHandler = (e: KeyboardEvent) => {
+        if (this.props.Document !== SelectionManager.SelectedDocuments()[0].props.Document) {
+            return;
+        }
+        e.stopPropagation();
+        e.preventDefault();
+        e.which === 174 && e.altKey && this.recordSession();
     }
 
     componentDidMount() {
-        document.removeEventListener("keypress", this.considerRecordingSession);
-        document.addEventListener("keypress", this.considerRecordingSession);
         const config = {
             schema,
             inpRules, //these currently don't do anything, but could eventually be helpful
@@ -335,7 +384,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
                         updatedState.selection = { type: "text", anchor: end, head: end };
                         this._editorView.updateState(EditorState.fromJSON(config, updatedState));
                     }
-                    this.tryUpdateHeight();
                 }
             }
         );
@@ -595,7 +643,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
     }
 
     componentWillUnmount() {
-        document.removeEventListener("keypress", this.considerRecordingSession);
         this._editorView && this._editorView.destroy();
         this._reactionDisposer && this._reactionDisposer();
         this._proxyReactionDisposer && this._proxyReactionDisposer();
@@ -678,6 +725,8 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
 
     @action
     onFocused = (e: React.FocusEvent): void => {
+        document.removeEventListener("keypress", this.recordKeyHandler);
+        document.addEventListener("keypress", this.recordKeyHandler);
         if (!this.props.isOverlay) {
             FormattedTextBox.InputBoxOverlay = this;
         } else {
@@ -727,6 +776,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         });
     }
     onBlur = (e: any) => {
+        document.removeEventListener("keypress", this.recordKeyHandler);
         if (this._undoTyping) {
             this._undoTyping.end();
             this._undoTyping = undefined;
-- 
cgit v1.2.3-70-g09d2


From 654db73e0615e77f7206128b6e5524553d653c66 Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Wed, 21 Aug 2019 05:30:39 -0400
Subject: cleanup

---
 src/client/views/nodes/FormattedTextBox.tsx | 57 ++++++++++++-----------------
 1 file changed, 24 insertions(+), 33 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 222ebed8f..a2ea12ac5 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -268,12 +268,32 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         }
     }
 
+    recordKeyHandler = (e: KeyboardEvent) => {
+        if (this.props.Document !== SelectionManager.SelectedDocuments()[0].props.Document) {
+            return;
+        }
+        e.stopPropagation();
+        e.preventDefault();
+        e.which === 174 && e.altKey && this.recordBullet();
+    }
+
+    recordBullet = async () => {
+        let completedCue = "end session";
+        let results = await DictationManager.Controls.listen({
+            interimHandler: this.setCurrentBulletContent,
+            continuous: { indefinite: false },
+            terminators: [completedCue, "bullet", "next"]
+        });
+        if (results && [DictationManager.Controls.Infringed, completedCue].includes(results)) {
+            DictationManager.Controls.stop();
+            return;
+        }
+        this.nextBullet(this._editorView!.state.selection.to);
+        setTimeout(this.recordBullet, 2000);
+    }
+
     setCurrentBulletContent = (value: string) => {
         if (this._editorView) {
-            // let next = value.endsWith("bullet");
-            // if (next) {
-            //     value = value.split("bullet")[0];
-            // }
             let state = this._editorView.state;
             let from = state.selection.from;
             let to = state.selection.to;
@@ -281,15 +301,11 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             state = this._editorView.state;
             let updated = TextSelection.create(state.doc, from, from + value.length);
             this._editorView.dispatch(state.tr.setSelection(updated));
-            // if (next) {
-            //     this.nextBullet(this._editorView.state.selection.to);
-            // }
         }
     }
 
     nextBullet = (pos: number) => {
         if (this._editorView) {
-            // DictationManager.Controls.stop(false);
             let frag = Fragment.fromArray(this.newListItems(2));
             let slice = new Slice(frag, 2, 2);
             let state = this._editorView.state;
@@ -297,7 +313,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             pos += 4;
             state = this._editorView.state;
             this._editorView.dispatch(state.tr.setSelection(TextSelection.create(this._editorView.state.doc, pos, pos)));
-            // this.recordSession();
         }
     }
 
@@ -309,30 +324,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         return listItems;
     }
 
-    recordSession = async () => {
-        let completedCue = "end session";
-        let results = await DictationManager.Controls.listen({
-            interimHandler: this.setCurrentBulletContent,
-            continuous: { indefinite: false },
-            terminators: [completedCue, "bullet", "next"]
-        });
-        if (results && [DictationManager.Controls.Infringed, completedCue].includes(results)) {
-            DictationManager.Controls.stop();
-            return;
-        }
-        this.nextBullet(this._editorView!.state.selection.to);
-        setTimeout(this.recordSession, 2000);
-    }
-
-    recordKeyHandler = (e: KeyboardEvent) => {
-        if (this.props.Document !== SelectionManager.SelectedDocuments()[0].props.Document) {
-            return;
-        }
-        e.stopPropagation();
-        e.preventDefault();
-        e.which === 174 && e.altKey && this.recordSession();
-    }
-
     componentDidMount() {
         const config = {
             schema,
-- 
cgit v1.2.3-70-g09d2


From 186cf33322b6c96386c6e9fdb823025d09c5caeb Mon Sep 17 00:00:00 2001
From: bob <bcz@cs.brown.edu>
Date: Wed, 21 Aug 2019 11:35:18 -0400
Subject: extended treeview functionality - better indenting, state management,
 drag dropping.

---
 src/client/views/EditableView.tsx                  | 28 +++++---
 .../views/collections/CollectionTreeView.tsx       | 83 +++++++++++++---------
 src/client/views/nodes/FormattedTextBox.tsx        |  1 -
 .../authentication/models/current_user_utils.ts    |  5 +-
 4 files changed, 75 insertions(+), 42 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/EditableView.tsx b/src/client/views/EditableView.tsx
index c3612fee9..dd5395802 100644
--- a/src/client/views/EditableView.tsx
+++ b/src/client/views/EditableView.tsx
@@ -3,6 +3,7 @@ import { observer } from 'mobx-react';
 import { observable, action, trace } from 'mobx';
 import "./EditableView.scss";
 import * as Autosuggest from 'react-autosuggest';
+import { undoBatch } from '../util/UndoManager';
 
 export interface EditableProps {
     /**
@@ -70,14 +71,12 @@ export class EditableView extends React.Component<EditableProps> {
     onKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
         if (e.key === "Tab") {
             e.stopPropagation();
+            this.finalizeEdit(e.currentTarget.value, e.shiftKey);
             this.props.OnTab && this.props.OnTab();
         } else if (e.key === "Enter") {
             e.stopPropagation();
             if (!e.ctrlKey) {
-                if (this.props.SetValue(e.currentTarget.value, e.shiftKey)) {
-                    this._editing = false;
-                    this.props.isEditingCallback && this.props.isEditingCallback(false);
-                }
+                this.finalizeEdit(e.currentTarget.value, e.shiftKey);
             } else if (this.props.OnFillDown) {
                 this.props.OnFillDown(e.currentTarget.value);
                 this._editing = false;
@@ -100,6 +99,14 @@ export class EditableView extends React.Component<EditableProps> {
         e.stopPropagation();
     }
 
+    @action
+    private finalizeEdit(value: string, shiftDown: boolean) {
+        if (this.props.SetValue(value, shiftDown)) {
+            this._editing = false;
+            this.props.isEditingCallback && this.props.isEditingCallback(false);
+        }
+    }
+
     stopPropagation(e: React.SyntheticEvent) {
         e.stopPropagation();
     }
@@ -118,7 +125,7 @@ export class EditableView extends React.Component<EditableProps> {
                         className: "editableView-input",
                         onKeyDown: this.onKeyDown,
                         autoFocus: true,
-                        onBlur: action(() => this._editing = false),
+                        onBlur: e => this.finalizeEdit(e.currentTarget.value, false),
                         onPointerDown: this.stopPropagation,
                         onClick: this.stopPropagation,
                         onPointerUp: this.stopPropagation,
@@ -126,9 +133,14 @@ export class EditableView extends React.Component<EditableProps> {
                         onChange: this.props.autosuggestProps.onChange
                     }}
                 />
-                : <input className="editableView-input" defaultValue={this.props.GetValue()} onKeyDown={this.onKeyDown} autoFocus
-                    onBlur={action(() => { this._editing = false; this.props.isEditingCallback && this.props.isEditingCallback(false); })} onPointerDown={this.stopPropagation} onClick={this.stopPropagation} onPointerUp={this.stopPropagation}
-                    style={{ display: this.props.display, fontSize: this.props.fontSize }} />;
+                : <input className="editableView-input"
+                    defaultValue={this.props.GetValue()}
+                    onKeyDown={this.onKeyDown}
+                    autoFocus={true}
+                    onBlur={e => this.finalizeEdit(e.currentTarget.value, false)}
+                    onPointerDown={this.stopPropagation} onClick={this.stopPropagation} onPointerUp={this.stopPropagation}
+                    style={{ display: this.props.display, fontSize: this.props.fontSize }}
+                />;
         } else {
             if (this.props.autosuggestProps) this.props.autosuggestProps.resetValue();
             return (
diff --git a/src/client/views/collections/CollectionTreeView.tsx b/src/client/views/collections/CollectionTreeView.tsx
index ebd385743..e1eb9e1a5 100644
--- a/src/client/views/collections/CollectionTreeView.tsx
+++ b/src/client/views/collections/CollectionTreeView.tsx
@@ -49,6 +49,8 @@ export interface TreeViewProps {
     treeViewId: string;
     parentKey: string;
     active: () => boolean;
+    showHeaderFields: () => boolean;
+    preventTreeViewOpen: boolean;
 }
 
 library.add(faTrashAlt);
@@ -65,7 +67,12 @@ library.add(faArrowsAltH);
 library.add(faPlus, faMinus);
 @observer
 /**
- * Component that takes in a document prop and a boolean whether it's collapsed or not.
+ * Renders a treeView of a collection of documents
+ * 
+ * special fields:
+ * treeViewOpen : flag denoting whether the documents sub-tree (contents) is visible or hidden
+ * preventTreeViewOpen : ignores the treeViewOpen flag (for allowing a view to not be slaved to other views of the document)
+ * treeViewExpandedView : name of field whose contents are being displayed as the document's subtree
  */
 class TreeView extends React.Component<TreeViewProps> {
     static loadId = "";
@@ -73,7 +80,9 @@ class TreeView extends React.Component<TreeViewProps> {
     private _treedropDisposer?: DragManager.DragDropDisposer;
     private _dref = React.createRef<HTMLDivElement>();
     get defaultExpandedView() { return this.childDocs ? this.fieldKey : "fields"; }
-    @observable _collapsed: boolean = true;
+    @observable _overrideTreeViewOpen = false; // override of the treeViewOpen field allowing the display state to be independent of the document's state
+    @computed get treeViewOpen() { return (BoolCast(this.props.document.treeViewOpen) && !this.props.preventTreeViewOpen) || this._overrideTreeViewOpen; }
+    set treeViewOpen(c: boolean) { if (this.props.preventTreeViewOpen) this._overrideTreeViewOpen = c; else this.props.document.treeViewOpen = c; }
     @computed get treeViewExpandedView() { return StrCast(this.props.document.treeViewExpandedView, this.defaultExpandedView); }
     @computed get MAX_EMBED_HEIGHT() { return NumCast(this.props.document.maxEmbedHeight, 300); }
     @computed get dataDoc() { return this.resolvedDataDoc ? this.resolvedDataDoc : this.props.document; }
@@ -146,7 +155,7 @@ class TreeView extends React.Component<TreeViewProps> {
         let rect = this._header!.current!.getBoundingClientRect();
         let bounds = this.props.ScreenToLocalTransform().transformPoint(rect.left, rect.top + rect.height / 2);
         let before = x[1] < bounds[1];
-        let inside = x[0] > bounds[0] + 75 || (!before && !this._collapsed);
+        let inside = x[0] > bounds[0] + 75 || (!before && this.treeViewOpen);
         this._header!.current!.className = "treeViewItem-header";
         if (inside) this._header!.current!.className += " treeViewItem-header-inside";
         else if (before) this._header!.current!.className += " treeViewItem-header-above";
@@ -163,15 +172,15 @@ class TreeView extends React.Component<TreeViewProps> {
         fontStyle={style}
         fontSize={12}
         GetValue={() => StrCast(this.props.document[key])}
-        SetValue={(value: string) => (Doc.GetProto(this.dataDoc)[key] = value) ? true : true}
-        OnFillDown={(value: string) => {
+        SetValue={undoBatch((value: string) => (Doc.GetProto(this.dataDoc)[key] = value) ? true : true)}
+        OnFillDown={undoBatch((value: string) => {
             Doc.GetProto(this.dataDoc)[key] = value;
             let doc = this.props.document.detailedLayout instanceof Doc ? Doc.ApplyTemplate(Doc.GetProto(this.props.document.detailedLayout)) : undefined;
             if (!doc) doc = Docs.Create.FreeformDocument([], { title: "", x: 0, y: 0, width: 100, height: 25, templates: new List<string>([Templates.Title.Layout]) });
             TreeView.loadId = doc[Id];
             return this.props.addDocument(doc);
-        }}
-        OnTab={() => this.props.indentDocument && this.props.indentDocument()}
+        })}
+        OnTab={() => { TreeView.loadId = ""; this.props.indentDocument && this.props.indentDocument(); }}
     />)
 
     onWorkspaceContextMenu = (e: React.MouseEvent): void => {
@@ -200,7 +209,7 @@ class TreeView extends React.Component<TreeViewProps> {
         let rect = this._header!.current!.getBoundingClientRect();
         let bounds = this.props.ScreenToLocalTransform().transformPoint(rect.left, rect.top + rect.height / 2);
         let before = x[1] < bounds[1];
-        let inside = x[0] > bounds[0] + 75 || (!before && !this._collapsed);
+        let inside = x[0] > bounds[0] + 75 || (!before && this.treeViewOpen);
         if (de.data instanceof DragManager.LinkDragData) {
             let sourceDoc = de.data.linkSourceDocument;
             let destDoc = this.props.document;
@@ -256,14 +265,14 @@ class TreeView extends React.Component<TreeViewProps> {
         let rows: JSX.Element[] = [];
         for (let key of Object.keys(ids).slice().sort()) {
             let contents = doc[key];
-            let contentElement: JSX.Element[] | JSX.Element = [];
+            let contentElement: (JSX.Element | null)[] | JSX.Element = [];
 
             if (contents instanceof Doc || Cast(contents, listSpec(Doc))) {
                 let remDoc = (doc: Doc) => this.remove(doc, key);
-                let addDoc = (doc: Doc, addBefore?: Doc, before?: boolean) => Doc.AddDocToList(this.dataDoc, key, doc, addBefore, before, !BoolCast(this.props.document.stackingHeadersSortDescending));
+                let addDoc = (doc: Doc, addBefore?: Doc, before?: boolean) => Doc.AddDocToList(this.dataDoc, key, doc, addBefore, before, !BoolCast(this.props.document.stackingHeadersSortDescending, true));
                 contentElement = TreeView.GetChildElements(contents instanceof Doc ? [contents] :
                     DocListCast(contents), this.props.treeViewId, doc, undefined, key, addDoc, remDoc, this.move,
-                    this.props.dropAction, this.props.addDocTab, this.props.pinToPres, this.props.ScreenToLocalTransform, this.props.outerXf, this.props.active, this.props.panelWidth, this.props.renderDepth);
+                    this.props.dropAction, this.props.addDocTab, this.props.pinToPres, this.props.ScreenToLocalTransform, this.props.outerXf, this.props.active, this.props.panelWidth, this.props.renderDepth, this.props.showHeaderFields, this.props.preventTreeViewOpen);
             } else {
                 contentElement = <EditableView
                     key="editableView"
@@ -288,14 +297,14 @@ class TreeView extends React.Component<TreeViewProps> {
         const expandKey = this.treeViewExpandedView === this.fieldKey ? this.fieldKey : this.treeViewExpandedView === "links" ? "links" : undefined;
         if (expandKey !== undefined) {
             let remDoc = (doc: Doc) => this.remove(doc, expandKey);
-            let addDoc = (doc: Doc, addBefore?: Doc, before?: boolean) => Doc.AddDocToList(this.dataDoc, expandKey, doc, addBefore, before, !BoolCast(this.props.document.stackingHeadersSortDescending));
+            let addDoc = (doc: Doc, addBefore?: Doc, before?: boolean) => Doc.AddDocToList(this.dataDoc, expandKey, doc, addBefore, before, !BoolCast(this.props.document.stackingHeadersSortDescending, true));
             let docs = expandKey === "links" ? this.childLinks : this.childDocs;
             return <ul key={expandKey + "more"}>
                 {!docs ? (null) :
                     TreeView.GetChildElements(docs as Doc[], this.props.treeViewId, this.props.document.layout as Doc,
                         this.resolvedDataDoc, expandKey, addDoc, remDoc, this.move,
                         this.props.dropAction, this.props.addDocTab, this.props.pinToPres, this.props.ScreenToLocalTransform,
-                        this.props.outerXf, this.props.active, this.props.panelWidth, this.props.renderDepth)}
+                        this.props.outerXf, this.props.active, this.props.panelWidth, this.props.renderDepth, this.props.showHeaderFields, this.props.preventTreeViewOpen)}
             </ul >;
         } else if (this.treeViewExpandedView === "fields") {
             return <ul><div ref={this._dref} style={{ display: "inline-block" }} key={this.props.document[Id] + this.props.document.title}>
@@ -329,8 +338,8 @@ class TreeView extends React.Component<TreeViewProps> {
 
     @computed
     get renderBullet() {
-        return <div className="bullet" onClick={action(() => this._collapsed = !this._collapsed)} style={{ color: StrCast(this.props.document.color, "black"), opacity: 0.4 }}>
-            {<FontAwesomeIcon icon={this._collapsed ? (this.childDocs ? "caret-square-right" : "caret-right") : (this.childDocs ? "caret-square-down" : "caret-down")} />}
+        return <div className="bullet" onClick={action(() => this.treeViewOpen = !this.treeViewOpen)} style={{ color: StrCast(this.props.document.color, "black"), opacity: 0.4 }}>
+            {<FontAwesomeIcon icon={!this.treeViewOpen ? (this.childDocs ? "caret-square-right" : "caret-right") : (this.childDocs ? "caret-square-down" : "caret-down")} />}
         </div>;
     }
     /**
@@ -344,13 +353,13 @@ class TreeView extends React.Component<TreeViewProps> {
         let headerElements = (
             <span className="collectionTreeView-keyHeader" key={this.treeViewExpandedView}
                 onPointerDown={action(() => {
-                    if (!this._collapsed) {
+                    if (this.treeViewOpen) {
                         this.props.document.treeViewExpandedView = this.treeViewExpandedView === this.fieldKey ? "fields" :
                             this.treeViewExpandedView === "fields" && this.props.document.layout ? "layout" :
                                 this.treeViewExpandedView === "layout" && this.props.document.links ? "links" :
                                     this.childDocs ? this.fieldKey : "fields";
                     }
-                    this._collapsed = false;
+                    this.treeViewOpen = true;
                 })}>
                 {this.treeViewExpandedView}
             </span>);
@@ -368,7 +377,7 @@ class TreeView extends React.Component<TreeViewProps> {
                 }} >
                 {this.editableView("title")}
             </div >
-            {headerElements}
+            {this.props.showHeaderFields() ? headerElements : (null)}
             {openRight}
         </>;
     }
@@ -381,13 +390,13 @@ class TreeView extends React.Component<TreeViewProps> {
                     {this.renderTitle}
                 </div>
                 <div className="treeViewItem-border">
-                    {this._collapsed ? (null) : this.renderContent}
+                    {!this.treeViewOpen ? (null) : this.renderContent}
                 </div>
             </li>
         </div>;
     }
     public static GetChildElements(
-        docs: Doc[],
+        docList: Doc[],
         treeViewId: string,
         containingCollection: Doc,
         dataDoc: Doc | undefined,
@@ -402,8 +411,11 @@ class TreeView extends React.Component<TreeViewProps> {
         outerXf: () => { translateX: number, translateY: number },
         active: () => boolean,
         panelWidth: () => number,
-        renderDepth: number
+        renderDepth: number,
+        showHeaderFields: () => boolean,
+        preventTreeViewOpen: boolean
     ) {
+        let docs = docList.filter(child => !child.excludeFromLibrary);
         let viewSpecScript = Cast(containingCollection.viewSpecScript, ScriptField);
         if (viewSpecScript) {
             let script = viewSpecScript.script;
@@ -418,7 +430,7 @@ class TreeView extends React.Component<TreeViewProps> {
             });
         }
 
-        let descending = BoolCast(containingCollection.stackingHeadersSortDescending);
+        let descending = BoolCast(containingCollection.stackingHeadersSortDescending, true);
         docs.slice().sort(function (a, b): 1 | -1 {
             let descA = descending ? b : a;
             let descB = descending ? a : b;
@@ -448,11 +460,14 @@ class TreeView extends React.Component<TreeViewProps> {
             }
 
             let indent = i === 0 ? undefined : () => {
-                if (StrCast(docs[i - 1].layout).indexOf("CollectionView") !== -1) {
+                if (StrCast(docs[i - 1].layout).indexOf("fieldKey") !== -1) {
                     let fieldKeysub = StrCast(docs[i - 1].layout).split("fieldKey")[1];
                     let fieldKey = fieldKeysub.split("\"")[1];
-                    Doc.AddDocToList(docs[i - 1], fieldKey, child);
-                    remove(child);
+                    if (fieldKey && Cast(docs[i - 1][fieldKey], listSpec(Doc)) !== undefined) {
+                        Doc.AddDocToList(docs[i - 1], fieldKey, child);
+                        docs[i - 1].treeViewOpen = true;
+                        remove(child);
+                    }
                 }
             };
             let addDocument = (doc: Doc, relativeTo?: Doc, before?: boolean) => {
@@ -481,7 +496,9 @@ class TreeView extends React.Component<TreeViewProps> {
                 ScreenToLocalTransform={screenToLocalXf}
                 outerXf={outerXf}
                 parentKey={key}
-                active={active} />;
+                active={active}
+                showHeaderFields={showHeaderFields}
+                preventTreeViewOpen={preventTreeViewOpen} />;
         });
     }
 }
@@ -561,7 +578,7 @@ export class CollectionTreeView extends CollectionSubView(Document) {
     render() {
         Doc.UpdateDocumentExtensionForField(this.props.DataDoc ? this.props.DataDoc : this.props.Document, this.props.fieldKey);
         let dropAction = StrCast(this.props.Document.dropAction) as dropActionType;
-        let addDoc = (doc: Doc, relativeTo?: Doc, before?: boolean) => Doc.AddDocToList(this.props.Document, this.props.fieldKey, doc, relativeTo, before, !BoolCast(this.props.Document.stackingHeadersSortDescending));
+        let addDoc = (doc: Doc, relativeTo?: Doc, before?: boolean) => Doc.AddDocToList(this.props.Document, this.props.fieldKey, doc, relativeTo, before, false, false, !BoolCast(this.props.Document.stackingHeadersSortDescending, true));
         let moveDoc = (d: Doc, target: Doc, addDoc: (doc: Doc) => boolean) => this.props.moveDocument(d, target, addDoc);
         return !this.childDocs ? (null) : (
             <div id="body" className="collectionTreeView-dropTarget"
@@ -575,20 +592,22 @@ export class CollectionTreeView extends CollectionSubView(Document) {
                     display={"block"}
                     height={72}
                     GetValue={() => StrCast(this.resolvedDataDoc.title)}
-                    SetValue={(value: string) => (Doc.GetProto(this.resolvedDataDoc).title = value) ? true : true}
-                    OnFillDown={(value: string) => {
+                    SetValue={undoBatch((value: string) => (Doc.GetProto(this.resolvedDataDoc).title = value) ? true : true)}
+                    OnFillDown={undoBatch((value: string) => {
                         Doc.GetProto(this.props.Document).title = value;
                         let doc = this.props.Document.detailedLayout instanceof Doc ? Doc.ApplyTemplate(Doc.GetProto(this.props.Document.detailedLayout)) : undefined;
                         if (!doc) doc = Docs.Create.FreeformDocument([], { title: "", x: 0, y: 0, width: 100, height: 25, templates: new List<string>([Templates.Title.Layout]) });
                         TreeView.loadId = doc[Id];
-                        Doc.AddDocToList(this.props.Document, this.props.fieldKey, doc, this.childDocs.length ? this.childDocs[0] : undefined, true, !BoolCast(this.props.Document.stackingHeadersSortDescending));
-                    }} />
+                        Doc.AddDocToList(this.props.Document, this.props.fieldKey, doc, this.childDocs.length ? this.childDocs[0] : undefined, true, false, false, !BoolCast(this.props.Document.stackingHeadersSortDescending, true));
+                    })} />
                 {this.props.Document.workspaceLibrary ? this.renderNotifsButton : (null)}
                 {this.props.Document.allowClear ? this.renderClearButton : (null)}
                 <ul className="no-indent" style={{ width: "max-content" }} >
                     {
                         TreeView.GetChildElements(this.childDocs, this.props.Document[Id], this.props.Document, this.props.DataDoc, this.props.fieldKey, addDoc, this.remove,
-                            moveDoc, dropAction, this.props.addDocTab, this.props.pinToPres, this.props.ScreenToLocalTransform, this.outerXf, this.props.active, this.props.PanelWidth, this.props.renderDepth)
+                            moveDoc, dropAction, this.props.addDocTab, this.props.pinToPres, this.props.ScreenToLocalTransform,
+                            this.outerXf, this.props.active, this.props.PanelWidth, this.props.renderDepth, () => this.props.Document.chromeStatus !== "disabled",
+                            BoolCast(this.props.Document.preventTreeViewOpen))
                     }
                 </ul>
             </div >
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 606e8edb0..3f3360eff 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -736,7 +736,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
     @action
     tryUpdateHeight() {
         if (this.props.Document.autoHeight && this._ref.current!.scrollHeight !== 0) {
-            console.log("DT = " + this.props.Document.title + " " + this._ref.current!.clientHeight + " " + this._ref.current!.scrollHeight + " " + this._ref.current!.textContent);
             let xf = this._ref.current!.getBoundingClientRect();
             let scrBounds = this.props.ScreenToLocalTransform().transformBounds(0, 0, xf.width, this._ref.current!.textContent === "" ? 35 : this._ref.current!.scrollHeight);
             let nh = this.props.Document.isTemplate ? 0 : NumCast(this.dataDoc.nativeHeight, 0);
diff --git a/src/server/authentication/models/current_user_utils.ts b/src/server/authentication/models/current_user_utils.ts
index 508655605..aa3da0034 100644
--- a/src/server/authentication/models/current_user_utils.ts
+++ b/src/server/authentication/models/current_user_utils.ts
@@ -10,7 +10,7 @@ import { CollectionView } from "../../../client/views/collections/CollectionView
 import { Doc } from "../../../new_fields/Doc";
 import { List } from "../../../new_fields/List";
 import { listSpec } from "../../../new_fields/Schema";
-import { Cast, StrCast } from "../../../new_fields/Types";
+import { Cast, StrCast, PromiseValue } from "../../../new_fields/Types";
 import { Utils } from "../../../Utils";
 import { RouteStore } from "../../RouteStore";
 
@@ -49,12 +49,14 @@ export class CurrentUserUtils {
             workspaces.boxShadow = "0 0";
             doc.workspaces = workspaces;
         }
+        PromiseValue(Cast(doc.workspaces, Doc)).then(workspaces => workspaces && (workspaces.preventTreeViewOpen = true));
         if (doc.recentlyClosed === undefined) {
             const recentlyClosed = Docs.Create.TreeDocument([], { title: "Recently Closed", height: 75 });
             recentlyClosed.excludeFromLibrary = true;
             recentlyClosed.boxShadow = "0 0";
             doc.recentlyClosed = recentlyClosed;
         }
+        PromiseValue(Cast(doc.recentlyClosed, Doc)).then(recent => recent && (recent.preventTreeViewOpen = true));
         if (doc.curPresentation === undefined) {
             const curPresentation = Docs.Create.PresDocument(new List<Doc>(), { title: "Presentation" });
             curPresentation.excludeFromLibrary = true;
@@ -73,6 +75,7 @@ export class CurrentUserUtils {
         }
         StrCast(doc.title).indexOf("@") !== -1 && (doc.title = StrCast(doc.title).split("@")[0] + "'s Library");
         doc.width = 100;
+        doc.preventTreeViewOpen = true;
     }
 
     public static loadCurrentUser() {
-- 
cgit v1.2.3-70-g09d2


From 7153da56f27226cc6f92848b4548032bd5e32170 Mon Sep 17 00:00:00 2001
From: bob <bcz@cs.brown.edu>
Date: Wed, 21 Aug 2019 12:58:34 -0400
Subject: tweaks

---
 src/client/views/nodes/FormattedTextBox.tsx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index a2ea12ac5..f2ca0715a 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -274,7 +274,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         }
         e.stopPropagation();
         e.preventDefault();
-        e.which === 174 && e.altKey && this.recordBullet();
+        e.key === "R" && this.recordBullet();
     }
 
     recordBullet = async () => {
@@ -282,7 +282,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         let results = await DictationManager.Controls.listen({
             interimHandler: this.setCurrentBulletContent,
             continuous: { indefinite: false },
-            terminators: [completedCue, "bullet", "next"]
+            // terminators: [completedCue, "bullet", "next"]
         });
         if (results && [DictationManager.Controls.Infringed, completedCue].includes(results)) {
             DictationManager.Controls.stop();
-- 
cgit v1.2.3-70-g09d2


From 3535bd703cfdb4872ff6ff0c41d17e39ad1c8e45 Mon Sep 17 00:00:00 2001
From: bob <bcz@cs.brown.edu>
Date: Wed, 21 Aug 2019 13:17:50 -0400
Subject: fixed updating size of textboxes

---
 src/client/views/nodes/FormattedTextBox.tsx | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 0c39a57ff..505257e9c 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -272,9 +272,11 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         if (this.props.Document !== SelectionManager.SelectedDocuments()[0].props.Document) {
             return;
         }
-        e.stopPropagation();
-        e.preventDefault();
-        e.key === "R" && this.recordBullet();
+        if (e.key === "R" && e.altKey) {
+            e.stopPropagation();
+            e.preventDefault();
+            this.recordBullet();
+        }
     }
 
     recordBullet = async () => {
@@ -480,8 +482,8 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
     updateState = (exportState: GoogleApiClientUtils.Docs.ReadResult, dataDoc: Doc) => {
         let pullSuccess = false;
         if (exportState !== undefined && exportState.body !== undefined && exportState.title !== undefined) {
-            let data = Cast(dataDoc.data, RichTextField);
-            if (data) {
+            const data = Cast(dataDoc.data, RichTextField);
+            if (data instanceof RichTextField) {
                 pullSuccess = true;
                 this.isGoogleDocsUpdate = true;
                 dataDoc.data = new RichTextField(data[FromPlainText](exportState.body));
@@ -492,7 +494,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             delete dataDoc[GoogleRef];
         }
         DocumentDecorations.Instance.startPullOutcome(pullSuccess);
-        this.tryUpdateHeight();
+        setTimeout(() => this.tryUpdateHeight(), 0);
     }
 
     checkState = (exportState: GoogleApiClientUtils.Docs.ReadResult, dataDoc: Doc) => {
@@ -630,7 +632,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             if (!this.props.isOverlay) this.props.select(false);
             else this._editorView!.focus();
         }
-        this.tryUpdateHeight();
     }
 
     componentWillUnmount() {
-- 
cgit v1.2.3-70-g09d2


From 76a693012866178a3fbe037ab06cfd4482f37917 Mon Sep 17 00:00:00 2001
From: monikahedman <monika_hedman@brown.edu>
Date: Wed, 21 Aug 2019 14:22:30 -0400
Subject: djlzdkfj

---
 src/client/views/nodes/FormattedTextBox.tsx |  7 +++++++
 src/client/views/nodes/WebBox.tsx           | 26 ++++++++++++++++----------
 2 files changed, 23 insertions(+), 10 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 25f611f19..d299bbf72 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -162,6 +162,13 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         }
     }
 
+    public setText = (text: string) => {
+        const tx = this._editorView!.state.tr.insertText(text);
+        const state = this._editorView!.state;
+        this._editorView!.dispatch(tx);
+        return new RichTextField(JSON.stringify(state.toJSON()));
+    }
+
     dispatchTransaction = (tx: Transaction) => {
         if (this._editorView) {
             const state = this._editorView.state.apply(tx);
diff --git a/src/client/views/nodes/WebBox.tsx b/src/client/views/nodes/WebBox.tsx
index c43b90f91..e7bed3bed 100644
--- a/src/client/views/nodes/WebBox.tsx
+++ b/src/client/views/nodes/WebBox.tsx
@@ -26,6 +26,8 @@ import { SelectionManager } from "../../util/SelectionManager";
 import { CollectionView } from "../collections/CollectionView";
 import { CollectionPDFView } from "../collections/CollectionPDFView";
 import { CollectionVideoView } from "../collections/CollectionVideoView";
+import { DocumentView } from "./DocumentView";
+import { FormattedTextBox } from "./FormattedTextBox";
 
 library.add(faStickyNote)
 
@@ -85,14 +87,15 @@ export class WebBox extends React.Component<FieldViewProps> {
         let field = Cast(this.props.Document[this.props.fieldKey], WebField);
         if (field) url = field.url.href;
 
-        let parent: Opt<CollectionView | CollectionPDFView | CollectionVideoView>;
+        let docView: DocumentView;
         // let parentDoc: any;
         SelectionManager.SelectedDocuments().map(dv => {
-            parent = dv.props.ContainingCollectionView;
-            // if(parent) parentDoc = parent.props.Document;
+            // docView = dv;
             dv.props.removeDocument && dv.props.removeDocument(dv.props.Document);
         });
 
+        console.log("happening")
+
         // // let newPoint = PreviewCursor._getTransform().transformPoint(PreviewCursor._clickPoint[0], PreviewCursor._clickPoint[1]);
         let newBox = Docs.Create.TextDocument({
             width: 200, height: 100,
@@ -103,13 +106,16 @@ export class WebBox extends React.Component<FieldViewProps> {
             title: url
         });
 
-        console.log(newBox)
-        if (parent) {
-            let parentDoc: Doc = parent.props.Document;
-            if (parentDoc && parentDoc.props) {
-                parentDoc.props.addDocument();
-            }
-        }
+        console.log(typeof newBox)
+
+        // const script = KeyValueBox.CompileKVPScript(`new RichTextField("{"doc":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"${url}"}]}]},"selection":{"type":"text","anchor":1,"head":1}}")`);
+        // const script = KeyValueBox.CompileKVPScript(newBox.setText(url))
+        // console.log(script)
+        // if (!script) return;
+        // KeyValueBox.ApplyKVPScript(this.props.Document, "data", script);
+
+        console.log(newBox);
+
 
         newBox.proto!.autoHeight = true;
         // PreviewCursor._addLiveTextDoc(newBox);
-- 
cgit v1.2.3-70-g09d2


From e50dc35f922efdeadfde70c9cf552b9ed5722810 Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Wed, 21 Aug 2019 14:35:35 -0400
Subject: uncommented terminators

---
 src/client/views/nodes/FormattedTextBox.tsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 505257e9c..1e0975b4b 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -284,7 +284,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         let results = await DictationManager.Controls.listen({
             interimHandler: this.setCurrentBulletContent,
             continuous: { indefinite: false },
-            // terminators: [completedCue, "bullet", "next"]
+            terminators: [completedCue, "bullet", "next"]
         });
         if (results && [DictationManager.Controls.Infringed, completedCue].includes(results)) {
             DictationManager.Controls.stop();
-- 
cgit v1.2.3-70-g09d2


From 88454c8163115b1396a34f4836b5f6f04817a3f0 Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Wed, 21 Aug 2019 16:11:20 -0400
Subject: tryupdateheight fixes

---
 src/client/views/DocumentDecorations.tsx    |  4 ++--
 src/client/views/nodes/FormattedTextBox.tsx | 26 +++++++++++++-------------
 2 files changed, 15 insertions(+), 15 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/DocumentDecorations.tsx b/src/client/views/DocumentDecorations.tsx
index cc8e57af9..a28088032 100644
--- a/src/client/views/DocumentDecorations.tsx
+++ b/src/client/views/DocumentDecorations.tsx
@@ -714,7 +714,7 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>
         let canPull = this.targetDoc.data && this.targetDoc.data instanceof RichTextField;
         let dataDoc = Doc.GetProto(this.targetDoc);
         if (!canPull || !dataDoc[GoogleRef]) return (null);
-        let icon = !dataDoc.unchanged ? (this.pullIcon as any) : fetch;
+        let icon = dataDoc.unchanged === false ? (this.pullIcon as any) : fetch;
         icon = this.openHover ? "share" : icon;
         let animation = this.isAnimatingFetch ? "spin 0.5s linear infinite" : "none";
         let title = `${!dataDoc.unchanged ? "Pull from" : "Fetch"} Google Docs`;
@@ -727,7 +727,7 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>
                         backgroundColor: this.pullColor,
                         transition: "0.2s ease all"
                     }}
-                    onPointerEnter={e => e.ctrlKey && runInAction(() => this.openHover = true)}
+                    onPointerEnter={e => e.altKey && runInAction(() => this.openHover = true)}
                     onPointerLeave={() => runInAction(() => this.openHover = false)}
                     onClick={e => {
                         if (e.altKey) {
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 1e0975b4b..c8722c6e3 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -1,6 +1,6 @@
 import { library } from '@fortawesome/fontawesome-svg-core';
 import { faEdit, faSmile, faTextHeight, faUpload } from '@fortawesome/free-solid-svg-icons';
-import { action, computed, IReactionDisposer, Lambda, observable, reaction, runInAction } from "mobx";
+import { action, computed, IReactionDisposer, Lambda, observable, reaction, runInAction, autorun } from "mobx";
 import { observer } from "mobx-react";
 import { baseKeymap } from "prosemirror-commands";
 import { history } from "prosemirror-history";
@@ -87,7 +87,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
     private pushReactionDisposer: Opt<IReactionDisposer>;
     private dropDisposer?: DragManager.DragDropDisposer;
     public get CurrentDiv(): HTMLDivElement { return this._ref.current!; }
-    private isGoogleDocsUpdate = false;
     @observable _entered = false;
 
     @observable public static InputBoxOverlay?: FormattedTextBox = undefined;
@@ -321,7 +320,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
     private newListItems = (count: number) => {
         let listItems: any[] = [];
         for (let i = 0; i < count; i++) {
-            listItems.push(schema.nodes.list_item.create(null, schema.nodes.paragraph.create(null)));
+            listItems.push(schema.nodes.list_item.create(undefined, schema.nodes.paragraph.create()));
         }
         return listItems;
     }
@@ -359,7 +358,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         }
 
         this.pullFromGoogleDoc(this.checkState);
-        runInAction(() => DocumentDecorations.Instance.isAnimatingFetch = true);
+        this.dataDoc[GoogleRef] && this.dataDoc.unchanged && runInAction(() => DocumentDecorations.Instance.isAnimatingFetch = true);
 
         this._reactionDisposer = reaction(
             () => {
@@ -370,13 +369,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
                 if (this._editorView && !this._applyingChange) {
                     let updatedState = JSON.parse(incomingValue);
                     this._editorView.updateState(EditorState.fromJSON(config, updatedState));
-                    // manually sets cursor selection at the end of the text on focus
-                    if (this.isGoogleDocsUpdate) {
-                        this.isGoogleDocsUpdate = false;
-                        let end = this._editorView.state.doc.content.size - 1;
-                        updatedState.selection = { type: "text", anchor: end, head: end };
-                        this._editorView.updateState(EditorState.fromJSON(config, updatedState));
-                    }
+                    this.tryUpdateHeight();
                 }
             }
         );
@@ -485,16 +478,22 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             const data = Cast(dataDoc.data, RichTextField);
             if (data instanceof RichTextField) {
                 pullSuccess = true;
-                this.isGoogleDocsUpdate = true;
                 dataDoc.data = new RichTextField(data[FromPlainText](exportState.body));
+                setTimeout(() => {
+                    if (this._editorView) {
+                        let state = this._editorView.state;
+                        let end = state.doc.content.size - 1;
+                        this._editorView.dispatch(state.tr.setSelection(TextSelection.create(state.doc, end, end)));
+                    }
+                }, 0);
                 dataDoc.title = exportState.title;
+                this.Document.customTitle = true;
                 dataDoc.unchanged = true;
             }
         } else {
             delete dataDoc[GoogleRef];
         }
         DocumentDecorations.Instance.startPullOutcome(pullSuccess);
-        setTimeout(() => this.tryUpdateHeight(), 0);
     }
 
     checkState = (exportState: GoogleApiClientUtils.Docs.ReadResult, dataDoc: Doc) => {
@@ -719,6 +718,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
     onFocused = (e: React.FocusEvent): void => {
         document.removeEventListener("keypress", this.recordKeyHandler);
         document.addEventListener("keypress", this.recordKeyHandler);
+        this.tryUpdateHeight();
         if (!this.props.isOverlay) {
             FormattedTextBox.InputBoxOverlay = this;
         } else {
-- 
cgit v1.2.3-70-g09d2


From f4888ec4b2862cdf890ac1b0f6670b41398266df Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Wed, 21 Aug 2019 20:01:35 -0400
Subject: can create google slides presentations

---
 .../apis/google_docs/GoogleApiClientUtils.ts       | 99 +++++++++++++---------
 src/client/views/MainView.tsx                      |  4 +
 src/client/views/nodes/FormattedTextBox.tsx        | 20 ++---
 src/server/apis/google/GoogleApiServerUtils.ts     | 65 +++++++++-----
 src/server/index.ts                                | 19 ++---
 5 files changed, 123 insertions(+), 84 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/apis/google_docs/GoogleApiClientUtils.ts b/src/client/apis/google_docs/GoogleApiClientUtils.ts
index 821c52270..52452cd95 100644
--- a/src/client/apis/google_docs/GoogleApiClientUtils.ts
+++ b/src/client/apis/google_docs/GoogleApiClientUtils.ts
@@ -1,4 +1,4 @@
-import { docs_v1 } from "googleapis";
+import { docs_v1, slides_v1 } from "googleapis";
 import { PostToServer } from "../../../Utils";
 import { RouteStore } from "../../../server/RouteStore";
 import { Opt } from "../../../new_fields/Doc";
@@ -9,47 +9,47 @@ export const Pushes = "googleDocsPushCount";
 
 export namespace GoogleApiClientUtils {
 
-    export namespace Docs {
+    export enum Actions {
+        Create = "create",
+        Retrieve = "retrieve",
+        Update = "update"
+    }
 
-        export enum Actions {
-            Create = "create",
-            Retrieve = "retrieve",
-            Update = "update"
-        }
+    export enum WriteMode {
+        Insert,
+        Replace
+    }
 
-        export enum WriteMode {
-            Insert,
-            Replace
-        }
+    export type DocumentId = string;
+    export type Reference = DocumentId | CreateOptions;
+    export type TextContent = string | string[];
+    export type IdHandler = (id: DocumentId) => any;
+    export type CreationResult = Opt<DocumentId>;
+    export type ReadLinesResult = Opt<{ title?: string, bodyLines?: string[] }>;
+    export type ReadResult = { title?: string, body?: string };
 
-        export type DocumentId = string;
-        export type Reference = DocumentId | CreateOptions;
-        export type TextContent = string | string[];
-        export type IdHandler = (id: DocumentId) => any;
+    export interface CreateOptions {
+        title?: string; // if excluded, will use a default title annotated with the current date
+    }
 
-        export type CreationResult = Opt<DocumentId>;
-        export type RetrievalResult = Opt<docs_v1.Schema$Document>;
-        export type UpdateResult = Opt<docs_v1.Schema$BatchUpdateDocumentResponse>;
-        export type ReadLinesResult = Opt<{ title?: string, bodyLines?: string[] }>;
-        export type ReadResult = { title?: string, body?: string };
+    export interface RetrieveOptions {
+        documentId: DocumentId;
+    }
 
-        export interface CreateOptions {
-            handler: IdHandler; // callback to process the documentId of the newly created Google Doc
-            title?: string; // if excluded, will use a default title annotated with the current date
-        }
+    export type ReadOptions = RetrieveOptions & { removeNewlines?: boolean };
 
-        export interface RetrieveOptions {
-            documentId: DocumentId;
-        }
+    export interface WriteOptions {
+        mode: WriteMode;
+        content: TextContent;
+        reference: Reference;
+        index?: number; // if excluded, will compute the last index of the document and append the content there
+    }
 
-        export type ReadOptions = RetrieveOptions & { removeNewlines?: boolean };
 
-        export interface WriteOptions {
-            mode: WriteMode;
-            content: TextContent;
-            reference: Reference;
-            index?: number; // if excluded, will compute the last index of the document and append the content there
-        }
+    export namespace Docs {
+
+        export type RetrievalResult = Opt<docs_v1.Schema$Document>;
+        export type UpdateResult = Opt<docs_v1.Schema$BatchUpdateDocumentResponse>;
 
         export interface UpdateOptions {
             documentId: DocumentId;
@@ -106,7 +106,7 @@ export namespace GoogleApiClientUtils {
          * @returns the documentId of the newly generated document, or undefined if the creation process fails.
          */
         export const create = async (options: CreateOptions): Promise<CreationResult> => {
-            const path = RouteStore.googleDocs + Actions.Create;
+            const path = RouteStore.googleDocs + "Documents/" + Actions.Create;
             const parameters = {
                 requestBody: {
                     title: options.title || `Dash Export (${new Date().toDateString()})`
@@ -115,17 +115,14 @@ export namespace GoogleApiClientUtils {
             try {
                 const schema: docs_v1.Schema$Document = await PostToServer(path, parameters);
                 const generatedId = schema.documentId;
-                if (generatedId) {
-                    options.handler(generatedId);
-                    return generatedId;
-                }
+                return generatedId;
             } catch {
                 return undefined;
             }
         };
 
         export const retrieve = async (options: RetrieveOptions): Promise<RetrievalResult> => {
-            const path = RouteStore.googleDocs + Actions.Retrieve;
+            const path = RouteStore.googleDocs + "Documents/" + Actions.Retrieve;
             try {
                 const schema: RetrievalResult = await PostToServer(path, options);
                 return schema;
@@ -135,7 +132,7 @@ export namespace GoogleApiClientUtils {
         };
 
         export const update = async (options: UpdateOptions): Promise<UpdateResult> => {
-            const path = RouteStore.googleDocs + Actions.Update;
+            const path = RouteStore.googleDocs + "Documents/" + Actions.Update;
             const parameters = {
                 documentId: options.documentId,
                 requestBody: {
@@ -221,4 +218,24 @@ export namespace GoogleApiClientUtils {
 
     }
 
+    export namespace Slides {
+
+        export const create = async (options: CreateOptions): Promise<CreationResult> => {
+            const path = RouteStore.googleDocs + "Slides/" + Actions.Create;
+            const parameters = {
+                requestBody: {
+                    title: options.title || `Dash Export (${new Date().toDateString()})`
+                }
+            };
+            try {
+                const schema: slides_v1.Schema$Presentation = await PostToServer(path, parameters);
+                const generatedId = schema.presentationId;
+                return generatedId;
+            } catch {
+                return undefined;
+            }
+        };
+
+    }
+
 }
\ No newline at end of file
diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index f28844009..3490a0f68 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -40,6 +40,7 @@ import { PreviewCursor } from './PreviewCursor';
 import { FilterBox } from './search/FilterBox';
 import PresModeMenu from './presentationview/PresentationModeMenu';
 import { PresBox } from './nodes/PresBox';
+import { GoogleApiClientUtils } from '../apis/google_docs/GoogleApiClientUtils';
 
 @observer
 export class MainView extends React.Component {
@@ -120,6 +121,9 @@ export class MainView extends React.Component {
     componentWillMount() {
         var tag = document.createElement('script');
 
+        let title = "THIS IS MY FIRST DASH PRESENTATION";
+        GoogleApiClientUtils.Slides.create({ title }).then(id => console.log("We received this! ", id));
+
         tag.src = "https://www.youtube.com/iframe_api";
         var firstScriptTag = document.getElementsByTagName('script')[0];
         firstScriptTag.parentNode!.insertBefore(tag, firstScriptTag);
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index c8722c6e3..408a6948e 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -64,7 +64,7 @@ export const GoogleRef = "googleDocId";
 type RichTextDocument = makeInterface<[typeof richTextSchema]>;
 const RichTextDocument = makeInterface(richTextSchema);
 
-type PullHandler = (exportState: GoogleApiClientUtils.Docs.ReadResult, dataDoc: Doc) => void;
+type PullHandler = (exportState: GoogleApiClientUtils.ReadResult, dataDoc: Doc) => void;
 
 @observer
 export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTextBoxProps), RichTextDocument>(RichTextDocument) {
@@ -430,22 +430,20 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
     }
 
     pushToGoogleDoc = async () => {
-        this.pullFromGoogleDoc(async (exportState: GoogleApiClientUtils.Docs.ReadResult, dataDoc: Doc) => {
-            let modes = GoogleApiClientUtils.Docs.WriteMode;
+        this.pullFromGoogleDoc(async (exportState: GoogleApiClientUtils.ReadResult, dataDoc: Doc) => {
+            let modes = GoogleApiClientUtils.WriteMode;
             let mode = modes.Replace;
-            let reference: Opt<GoogleApiClientUtils.Docs.Reference> = Cast(this.dataDoc[GoogleRef], "string");
+            let reference: Opt<GoogleApiClientUtils.Reference> = Cast(this.dataDoc[GoogleRef], "string");
             if (!reference) {
                 mode = modes.Insert;
-                reference = {
-                    title: StrCast(this.dataDoc.title),
-                    handler: id => this.dataDoc[GoogleRef] = id
-                };
+                reference = { title: StrCast(this.dataDoc.title) };
             }
             let redo = async () => {
                 let data = Cast(this.dataDoc.data, RichTextField);
                 if (this._editorView && reference && data) {
                     let content = data[ToPlainText]();
                     let response = await GoogleApiClientUtils.Docs.write({ reference, content, mode });
+                    response && (this.dataDoc[GoogleRef] = response.documentId);
                     let pushSuccess = response !== undefined && !("errors" in response);
                     dataDoc.unchanged = pushSuccess;
                     DocumentDecorations.Instance.startPushOutcome(pushSuccess);
@@ -465,14 +463,14 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
     pullFromGoogleDoc = async (handler: PullHandler) => {
         let dataDoc = this.dataDoc;
         let documentId = StrCast(dataDoc[GoogleRef]);
-        let exportState: GoogleApiClientUtils.Docs.ReadResult = {};
+        let exportState: GoogleApiClientUtils.ReadResult = {};
         if (documentId) {
             exportState = await GoogleApiClientUtils.Docs.read({ documentId });
         }
         UndoManager.RunInBatch(() => handler(exportState, dataDoc), Pulls);
     }
 
-    updateState = (exportState: GoogleApiClientUtils.Docs.ReadResult, dataDoc: Doc) => {
+    updateState = (exportState: GoogleApiClientUtils.ReadResult, dataDoc: Doc) => {
         let pullSuccess = false;
         if (exportState !== undefined && exportState.body !== undefined && exportState.title !== undefined) {
             const data = Cast(dataDoc.data, RichTextField);
@@ -496,7 +494,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         DocumentDecorations.Instance.startPullOutcome(pullSuccess);
     }
 
-    checkState = (exportState: GoogleApiClientUtils.Docs.ReadResult, dataDoc: Doc) => {
+    checkState = (exportState: GoogleApiClientUtils.ReadResult, dataDoc: Doc) => {
         if (exportState !== undefined && exportState.body !== undefined && exportState.title !== undefined) {
             let data = Cast(dataDoc.data, RichTextField);
             if (data) {
diff --git a/src/server/apis/google/GoogleApiServerUtils.ts b/src/server/apis/google/GoogleApiServerUtils.ts
index 817b2b696..ff027c501 100644
--- a/src/server/apis/google/GoogleApiServerUtils.ts
+++ b/src/server/apis/google/GoogleApiServerUtils.ts
@@ -1,7 +1,10 @@
-import { google, docs_v1 } from "googleapis";
+import { google, docs_v1, slides_v1 } from "googleapis";
 import { createInterface } from "readline";
 import { readFile, writeFile } from "fs";
 import { OAuth2Client } from "google-auth-library";
+import { Opt } from "../../../new_fields/Doc";
+import { GlobalOptions } from "googleapis-common";
+import { GaxiosResponse } from "gaxios";
 
 /**
  * Server side authentication for Google Api queries.
@@ -13,38 +16,57 @@ export namespace GoogleApiServerUtils {
     const SCOPES = [
         'documents.readonly',
         'documents',
+        'presentations',
+        'presentations.readonly',
         'drive',
         'drive.file',
     ];
-    // The file token.json stores the user's access and refresh tokens, and is
-    // created automatically when the authorization flow completes for the first
-    // time.
+
     export const parseBuffer = (data: Buffer) => JSON.parse(data.toString());
 
-    export namespace Docs {
+    export enum Sector {
+        Documents = "Documents",
+        Slides = "Slides"
+    }
+
 
-        export interface CredentialPaths {
-            credentials: string;
-            token: string;
-        }
+    export interface CredentialPaths {
+        credentials: string;
+        token: string;
+    }
 
-        export type Endpoint = docs_v1.Docs;
+    export type ApiResponse = Promise<GaxiosResponse>;
+    export type ApiRouter = (endpoint: Endpoint, paramters: any) => ApiResponse;
+    export type ApiHandler = (parameters: any) => ApiResponse;
+    export type Action = "create" | "retrieve" | "update";
 
-        export const GetEndpoint = async (paths: CredentialPaths) => {
-            return new Promise<Endpoint>((resolve, reject) => {
-                readFile(paths.credentials, (err, credentials) => {
-                    if (err) {
-                        reject(err);
-                        return console.log('Error loading client secret file:', err);
+    export type Endpoint = { get: ApiHandler, create: ApiHandler, batchUpdate: ApiHandler };
+    export type EndpointParameters = GlobalOptions & { version: "v1" };
+
+    export const GetEndpoint = async (sector: string, paths: CredentialPaths) => {
+        return new Promise<Opt<Endpoint>>((resolve, reject) => {
+            readFile(paths.credentials, (err, credentials) => {
+                if (err) {
+                    reject(err);
+                    return console.log('Error loading client secret file:', err);
+                }
+                return authorize(parseBuffer(credentials), paths.token).then(auth => {
+                    let routed: Opt<Endpoint>;
+                    let parameters: EndpointParameters = { auth, version: "v1" };
+                    switch (sector) {
+                        case Sector.Documents:
+                            routed = google.docs(parameters).documents;
+                            break;
+                        case Sector.Slides:
+                            routed = google.slides(parameters).presentations;
+                            break;
                     }
-                    return authorize(parseBuffer(credentials), paths.token).then(auth => {
-                        resolve(google.docs({ version: "v1", auth }));
-                    });
+                    resolve(routed);
                 });
             });
-        };
+        });
+    };
 
-    }
 
     /**
      * Create an OAuth2 client with the given credentials, and returns the promise resolving to the authenticated client
@@ -105,5 +127,4 @@ export namespace GoogleApiServerUtils {
             });
         });
     }
-
 }
\ No newline at end of file
diff --git a/src/server/index.ts b/src/server/index.ts
index ef1829f30..6aecb875a 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -45,6 +45,7 @@ import { GoogleApiServerUtils } from "./apis/google/GoogleApiServerUtils";
 import { GaxiosResponse } from 'gaxios';
 import { Opt } from '../new_fields/Doc';
 import { docs_v1 } from 'googleapis';
+import { Endpoint } from 'googleapis-common';
 const MongoStore = require('connect-mongo')(session);
 const mongoose = require('mongoose');
 const probe = require("probe-image-size");
@@ -799,21 +800,19 @@ function HandleYoutubeQuery([query, callback]: [YoutubeQueryInput, (result?: any
 const credentials = path.join(__dirname, "./credentials/google_docs_credentials.json");
 const token = path.join(__dirname, "./credentials/google_docs_token.json");
 
-type ApiResponse = Promise<GaxiosResponse>;
-type ApiHandler = (endpoint: docs_v1.Resource$Documents, parameters: any) => ApiResponse;
-type Action = "create" | "retrieve" | "update";
-
-const EndpointHandlerMap = new Map<Action, ApiHandler>([
+const EndpointHandlerMap = new Map<GoogleApiServerUtils.Action, GoogleApiServerUtils.ApiRouter>([
     ["create", (api, params) => api.create(params)],
     ["retrieve", (api, params) => api.get(params)],
     ["update", (api, params) => api.batchUpdate(params)],
 ]);
 
-app.post(RouteStore.googleDocs + ":action", (req, res) => {
-    GoogleApiServerUtils.Docs.GetEndpoint({ credentials, token }).then(endpoint => {
-        let handler = EndpointHandlerMap.get(req.params.action);
-        if (handler) {
-            let execute = handler(endpoint.documents, req.body).then(
+app.post(RouteStore.googleDocs + ":sector/:action", (req, res) => {
+    let sector = req.params.sector;
+    let action = req.params.action;
+    GoogleApiServerUtils.GetEndpoint(GoogleApiServerUtils.Sector[sector], { credentials, token }).then(endpoint => {
+        let handler = EndpointHandlerMap.get(action);
+        if (endpoint && handler) {
+            let execute = handler(endpoint, req.body).then(
                 response => res.send(response.data),
                 rejection => res.send(rejection)
             );
-- 
cgit v1.2.3-70-g09d2


From 30d55c5b91329d32a79b7135fff3566b2cd0e822 Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Wed, 21 Aug 2019 20:33:42 -0400
Subject: create is now shared between slides and docs

---
 .../apis/google_docs/GoogleApiClientUtils.ts       | 79 +++++++++-------------
 src/client/views/MainView.tsx                      |  2 +-
 src/client/views/nodes/FormattedTextBox.tsx        |  2 +-
 src/server/RouteStore.ts                           |  2 +-
 src/server/apis/google/GoogleApiServerUtils.ts     |  6 +-
 src/server/index.ts                                |  4 +-
 6 files changed, 40 insertions(+), 55 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/apis/google_docs/GoogleApiClientUtils.ts b/src/client/apis/google_docs/GoogleApiClientUtils.ts
index 52452cd95..ea020ed00 100644
--- a/src/client/apis/google_docs/GoogleApiClientUtils.ts
+++ b/src/client/apis/google_docs/GoogleApiClientUtils.ts
@@ -9,6 +9,11 @@ export const Pushes = "googleDocsPushCount";
 
 export namespace GoogleApiClientUtils {
 
+    export enum Service {
+        Documents = "Documents",
+        Slides = "Slides"
+    }
+
     export enum Actions {
         Create = "create",
         Retrieve = "retrieve",
@@ -29,6 +34,7 @@ export namespace GoogleApiClientUtils {
     export type ReadResult = { title?: string, body?: string };
 
     export interface CreateOptions {
+        service: Service;
         title?: string; // if excluded, will use a default title annotated with the current date
     }
 
@@ -45,6 +51,30 @@ export namespace GoogleApiClientUtils {
         index?: number; // if excluded, will compute the last index of the document and append the content there
     }
 
+    /**
+    * After following the authentication routine, which connects this API call to the current signed in account
+    * and grants the appropriate permissions, this function programmatically creates an arbitrary Google Doc which
+    * should appear in the user's Google Doc library instantaneously.
+    * 
+    * @param options the title to assign to the new document, and the information necessary
+    * to store the new documentId returned from the creation process
+    * @returns the documentId of the newly generated document, or undefined if the creation process fails.
+    */
+    export const create = async (options: CreateOptions): Promise<CreationResult> => {
+        const path = `${RouteStore.googleDocs}/${options.service}/${Actions.Create}`;
+        const parameters = {
+            requestBody: {
+                title: options.title || `Dash Export (${new Date().toDateString()})`
+            }
+        };
+        try {
+            const schema: any = await PostToServer(path, parameters);
+            let key = ["document", "presentation"].find(prefix => `${prefix}Id` in schema) + "Id";
+            return schema[key];
+        } catch {
+            return undefined;
+        }
+    };
 
     export namespace Docs {
 
@@ -96,33 +126,8 @@ export namespace GoogleApiClientUtils {
 
         }
 
-        /**
-         * After following the authentication routine, which connects this API call to the current signed in account
-         * and grants the appropriate permissions, this function programmatically creates an arbitrary Google Doc which
-         * should appear in the user's Google Doc library instantaneously.
-         * 
-         * @param options the title to assign to the new document, and the information necessary
-         * to store the new documentId returned from the creation process
-         * @returns the documentId of the newly generated document, or undefined if the creation process fails.
-         */
-        export const create = async (options: CreateOptions): Promise<CreationResult> => {
-            const path = RouteStore.googleDocs + "Documents/" + Actions.Create;
-            const parameters = {
-                requestBody: {
-                    title: options.title || `Dash Export (${new Date().toDateString()})`
-                }
-            };
-            try {
-                const schema: docs_v1.Schema$Document = await PostToServer(path, parameters);
-                const generatedId = schema.documentId;
-                return generatedId;
-            } catch {
-                return undefined;
-            }
-        };
-
         export const retrieve = async (options: RetrieveOptions): Promise<RetrievalResult> => {
-            const path = RouteStore.googleDocs + "Documents/" + Actions.Retrieve;
+            const path = `${RouteStore.googleDocs}/${Service.Documents}/${Actions.Retrieve}`;
             try {
                 const schema: RetrievalResult = await PostToServer(path, options);
                 return schema;
@@ -132,7 +137,7 @@ export namespace GoogleApiClientUtils {
         };
 
         export const update = async (options: UpdateOptions): Promise<UpdateResult> => {
-            const path = RouteStore.googleDocs + "Documents/" + Actions.Update;
+            const path = `${RouteStore.googleDocs}/${Service.Documents}/${Actions.Update}`;
             const parameters = {
                 documentId: options.documentId,
                 requestBody: {
@@ -218,24 +223,4 @@ export namespace GoogleApiClientUtils {
 
     }
 
-    export namespace Slides {
-
-        export const create = async (options: CreateOptions): Promise<CreationResult> => {
-            const path = RouteStore.googleDocs + "Slides/" + Actions.Create;
-            const parameters = {
-                requestBody: {
-                    title: options.title || `Dash Export (${new Date().toDateString()})`
-                }
-            };
-            try {
-                const schema: slides_v1.Schema$Presentation = await PostToServer(path, parameters);
-                const generatedId = schema.presentationId;
-                return generatedId;
-            } catch {
-                return undefined;
-            }
-        };
-
-    }
-
 }
\ No newline at end of file
diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index 3490a0f68..2a219fdd1 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -122,7 +122,7 @@ export class MainView extends React.Component {
         var tag = document.createElement('script');
 
         let title = "THIS IS MY FIRST DASH PRESENTATION";
-        GoogleApiClientUtils.Slides.create({ title }).then(id => console.log("We received this! ", id));
+        GoogleApiClientUtils.create({ service: GoogleApiClientUtils.Service.Slides, title }).then(id => console.log("We received this! ", id));
 
         tag.src = "https://www.youtube.com/iframe_api";
         var firstScriptTag = document.getElementsByTagName('script')[0];
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 408a6948e..bcec6f7c3 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -436,7 +436,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             let reference: Opt<GoogleApiClientUtils.Reference> = Cast(this.dataDoc[GoogleRef], "string");
             if (!reference) {
                 mode = modes.Insert;
-                reference = { title: StrCast(this.dataDoc.title) };
+                reference = { service: GoogleApiClientUtils.Service.Documents, title: StrCast(this.dataDoc.title) };
             }
             let redo = async () => {
                 let data = Cast(this.dataDoc.data, RichTextField);
diff --git a/src/server/RouteStore.ts b/src/server/RouteStore.ts
index 5d977006a..014906054 100644
--- a/src/server/RouteStore.ts
+++ b/src/server/RouteStore.ts
@@ -31,6 +31,6 @@ export enum RouteStore {
 
     // APIS
     cognitiveServices = "/cognitiveservices",
-    googleDocs = "/googleDocs/"
+    googleDocs = "/googleDocs"
 
 }
\ No newline at end of file
diff --git a/src/server/apis/google/GoogleApiServerUtils.ts b/src/server/apis/google/GoogleApiServerUtils.ts
index ff027c501..8785cd974 100644
--- a/src/server/apis/google/GoogleApiServerUtils.ts
+++ b/src/server/apis/google/GoogleApiServerUtils.ts
@@ -24,7 +24,7 @@ export namespace GoogleApiServerUtils {
 
     export const parseBuffer = (data: Buffer) => JSON.parse(data.toString());
 
-    export enum Sector {
+    export enum Service {
         Documents = "Documents",
         Slides = "Slides"
     }
@@ -54,10 +54,10 @@ export namespace GoogleApiServerUtils {
                     let routed: Opt<Endpoint>;
                     let parameters: EndpointParameters = { auth, version: "v1" };
                     switch (sector) {
-                        case Sector.Documents:
+                        case Service.Documents:
                             routed = google.docs(parameters).documents;
                             break;
-                        case Sector.Slides:
+                        case Service.Slides:
                             routed = google.slides(parameters).presentations;
                             break;
                     }
diff --git a/src/server/index.ts b/src/server/index.ts
index 6aecb875a..0476bf3df 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -806,10 +806,10 @@ const EndpointHandlerMap = new Map<GoogleApiServerUtils.Action, GoogleApiServerU
     ["update", (api, params) => api.batchUpdate(params)],
 ]);
 
-app.post(RouteStore.googleDocs + ":sector/:action", (req, res) => {
+app.post(RouteStore.googleDocs + "/:sector/:action", (req, res) => {
     let sector = req.params.sector;
     let action = req.params.action;
-    GoogleApiServerUtils.GetEndpoint(GoogleApiServerUtils.Sector[sector], { credentials, token }).then(endpoint => {
+    GoogleApiServerUtils.GetEndpoint(GoogleApiServerUtils.Service[sector], { credentials, token }).then(endpoint => {
         let handler = EndpointHandlerMap.get(action);
         if (endpoint && handler) {
             let execute = handler(endpoint, req.body).then(
-- 
cgit v1.2.3-70-g09d2


From e68b1cc60b2a8ffe55eea3e1d5266d6897dcdcb6 Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Wed, 21 Aug 2019 21:31:17 -0400
Subject: integrated slides

---
 .../apis/google_docs/GoogleApiClientUtils.ts       |    47 +-
 src/client/views/MainView.tsx                      |     3 -
 src/client/views/nodes/FormattedTextBox.tsx        |     2 +-
 src/server/slides.json                             | 10820 +++++++++++++++++++
 4 files changed, 10851 insertions(+), 21 deletions(-)
 create mode 100644 src/server/slides.json

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/apis/google_docs/GoogleApiClientUtils.ts b/src/client/apis/google_docs/GoogleApiClientUtils.ts
index ea020ed00..3e90adc4d 100644
--- a/src/client/apis/google_docs/GoogleApiClientUtils.ts
+++ b/src/client/apis/google_docs/GoogleApiClientUtils.ts
@@ -25,11 +25,11 @@ export namespace GoogleApiClientUtils {
         Replace
     }
 
-    export type DocumentId = string;
-    export type Reference = DocumentId | CreateOptions;
+    export type Identifier = string;
+    export type Reference = Identifier | CreateOptions;
     export type TextContent = string | string[];
-    export type IdHandler = (id: DocumentId) => any;
-    export type CreationResult = Opt<DocumentId>;
+    export type IdHandler = (id: Identifier) => any;
+    export type CreationResult = Opt<Identifier>;
     export type ReadLinesResult = Opt<{ title?: string, bodyLines?: string[] }>;
     export type ReadResult = { title?: string, body?: string };
 
@@ -39,10 +39,14 @@ export namespace GoogleApiClientUtils {
     }
 
     export interface RetrieveOptions {
-        documentId: DocumentId;
+        service: Service;
+        identifier: Identifier;
     }
 
-    export type ReadOptions = RetrieveOptions & { removeNewlines?: boolean };
+    export interface ReadOptions {
+        identifier: Identifier;
+        removeNewlines?: boolean;
+    }
 
     export interface WriteOptions {
         mode: WriteMode;
@@ -78,11 +82,11 @@ export namespace GoogleApiClientUtils {
 
     export namespace Docs {
 
-        export type RetrievalResult = Opt<docs_v1.Schema$Document>;
+        export type RetrievalResult = Opt<docs_v1.Schema$Document | slides_v1.Schema$Presentation>;
         export type UpdateResult = Opt<docs_v1.Schema$BatchUpdateDocumentResponse>;
 
         export interface UpdateOptions {
-            documentId: DocumentId;
+            documentId: Identifier;
             requests: docs_v1.Schema$Request[];
         }
 
@@ -126,11 +130,20 @@ export namespace GoogleApiClientUtils {
 
         }
 
+        const KeyMapping = new Map<Service, string>([
+            [Service.Documents, "documentId"],
+            [Service.Slides, "presentationId"]
+        ]);
+
         export const retrieve = async (options: RetrieveOptions): Promise<RetrievalResult> => {
-            const path = `${RouteStore.googleDocs}/${Service.Documents}/${Actions.Retrieve}`;
+            const path = `${RouteStore.googleDocs}/${options.service}/${Actions.Retrieve}`;
             try {
-                const schema: RetrievalResult = await PostToServer(path, options);
-                return schema;
+                let parameters: any = {}, key: string | undefined;
+                if ((key = KeyMapping.get(options.service))) {
+                    parameters[key] = options.identifier;
+                    const schema: RetrievalResult = await PostToServer(path, parameters);
+                    return schema;
+                }
             } catch {
                 return undefined;
             }
@@ -153,7 +166,7 @@ export namespace GoogleApiClientUtils {
         };
 
         export const read = async (options: ReadOptions): Promise<ReadResult> => {
-            return retrieve(options).then(document => {
+            return retrieve({ ...options, service: Service.Documents }).then(document => {
                 let result: ReadResult = {};
                 if (document) {
                     let title = document.title;
@@ -165,7 +178,7 @@ export namespace GoogleApiClientUtils {
         };
 
         export const readLines = async (options: ReadOptions): Promise<ReadLinesResult> => {
-            return retrieve(options).then(document => {
+            return retrieve({ ...options, service: Service.Documents }).then(document => {
                 let result: ReadLinesResult = {};
                 if (document) {
                     let title = document.title;
@@ -179,14 +192,14 @@ export namespace GoogleApiClientUtils {
 
         export const write = async (options: WriteOptions): Promise<UpdateResult> => {
             const requests: docs_v1.Schema$Request[] = [];
-            const documentId = await Utils.initialize(options.reference);
-            if (!documentId) {
+            const identifier = await Utils.initialize(options.reference);
+            if (!identifier) {
                 return undefined;
             }
             let index = options.index;
             const mode = options.mode;
             if (!(index && mode === WriteMode.Insert)) {
-                let schema = await retrieve({ documentId });
+                let schema = await retrieve({ identifier, service: Service.Documents });
                 if (!schema || !(index = Utils.endOf(schema))) {
                     return undefined;
                 }
@@ -212,7 +225,7 @@ export namespace GoogleApiClientUtils {
             if (!requests.length) {
                 return undefined;
             }
-            let replies: any = await update({ documentId, requests });
+            let replies: any = await update({ documentId: identifier, requests });
             let errors = "errors";
             if (errors in replies) {
                 console.log("Write operation failed:");
diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index 2a219fdd1..0286a201b 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -121,9 +121,6 @@ export class MainView extends React.Component {
     componentWillMount() {
         var tag = document.createElement('script');
 
-        let title = "THIS IS MY FIRST DASH PRESENTATION";
-        GoogleApiClientUtils.create({ service: GoogleApiClientUtils.Service.Slides, title }).then(id => console.log("We received this! ", id));
-
         tag.src = "https://www.youtube.com/iframe_api";
         var firstScriptTag = document.getElementsByTagName('script')[0];
         firstScriptTag.parentNode!.insertBefore(tag, firstScriptTag);
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index bcec6f7c3..a603676bb 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -465,7 +465,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         let documentId = StrCast(dataDoc[GoogleRef]);
         let exportState: GoogleApiClientUtils.ReadResult = {};
         if (documentId) {
-            exportState = await GoogleApiClientUtils.Docs.read({ documentId });
+            exportState = await GoogleApiClientUtils.Docs.read({ identifier: documentId });
         }
         UndoManager.RunInBatch(() => handler(exportState, dataDoc), Pulls);
     }
diff --git a/src/server/slides.json b/src/server/slides.json
new file mode 100644
index 000000000..323cac3a6
--- /dev/null
+++ b/src/server/slides.json
@@ -0,0 +1,10820 @@
+{
+    "presentationId": "1gHxyT6bBhsPVeuWNnWDzI33yEviMVo8n60JtZiVy3tY",
+    "pageSize": {
+        "width": {
+            "magnitude": 9144000,
+            "unit": "EMU"
+        },
+        "height": {
+            "magnitude": 5143500,
+            "unit": "EMU"
+        }
+    },
+    "slides": [
+        {
+            "objectId": "p",
+            "pageElements": [
+                {
+                    "objectId": "i0",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 2.8402,
+                        "scaleY": 0.6842,
+                        "translateX": 311708.35000000003,
+                        "translateY": 744575,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 20,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 20,
+                                    "textRun": {
+                                        "content": "Importing into Dash\n",
+                                        "style": {}
+                                    }
+                                }
+                            ]
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "CENTERED_TITLE",
+                            "parentObjectId": "p2_i0"
+                        }
+                    }
+                },
+                {
+                    "objectId": "i1",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 2.8402,
+                        "scaleY": 0.2642,
+                        "translateX": 311700,
+                        "translateY": 2834125,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 15,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 15,
+                                    "textRun": {
+                                        "content": "By Sam Wilkins\n",
+                                        "style": {}
+                                    }
+                                }
+                            ]
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "SUBTITLE",
+                            "parentObjectId": "p2_i1"
+                        }
+                    }
+                }
+            ],
+            "slideProperties": {
+                "layoutObjectId": "p2",
+                "masterObjectId": "simple-light-2",
+                "notesPage": {
+                    "objectId": "p:notes",
+                    "pageType": "NOTES",
+                    "pageElements": [
+                        {
+                            "objectId": "i2",
+                            "size": {
+                                "width": {
+                                    "magnitude": 3000000,
+                                    "unit": "EMU"
+                                },
+                                "height": {
+                                    "magnitude": 3000000,
+                                    "unit": "EMU"
+                                }
+                            },
+                            "transform": {
+                                "scaleX": 2.032025,
+                                "scaleY": 1.143,
+                                "translateX": 381300,
+                                "translateY": 685800,
+                                "unit": "EMU"
+                            },
+                            "shape": {
+                                "shapeProperties": {
+                                    "outline": {
+                                        "propertyState": "INHERIT"
+                                    }
+                                },
+                                "placeholder": {
+                                    "type": "SLIDE_IMAGE",
+                                    "parentObjectId": "n:slide"
+                                }
+                            }
+                        },
+                        {
+                            "objectId": "i3",
+                            "size": {
+                                "width": {
+                                    "magnitude": 3000000,
+                                    "unit": "EMU"
+                                },
+                                "height": {
+                                    "magnitude": 3000000,
+                                    "unit": "EMU"
+                                }
+                            },
+                            "transform": {
+                                "scaleX": 1.8288,
+                                "scaleY": 1.3716,
+                                "translateX": 685800,
+                                "translateY": 4343400,
+                                "unit": "EMU"
+                            },
+                            "shape": {
+                                "shapeType": "TEXT_BOX",
+                                "shapeProperties": {
+                                    "shapeBackgroundFill": {
+                                        "propertyState": "INHERIT"
+                                    },
+                                    "outline": {
+                                        "propertyState": "INHERIT"
+                                    },
+                                    "shadow": {
+                                        "propertyState": "INHERIT"
+                                    }
+                                },
+                                "placeholder": {
+                                    "type": "BODY",
+                                    "index": 1,
+                                    "parentObjectId": "n:text"
+                                }
+                            }
+                        }
+                    ],
+                    "pageProperties": {
+                        "pageBackgroundFill": {
+                            "propertyState": "INHERIT"
+                        }
+                    },
+                    "notesProperties": {
+                        "speakerNotesObjectId": "i3"
+                    }
+                }
+            },
+            "pageProperties": {
+                "pageBackgroundFill": {
+                    "propertyState": "INHERIT"
+                }
+            }
+        },
+        {
+            "objectId": "g5f40953d50_0_0",
+            "pageElements": [
+                {
+                    "objectId": "g5f40953d50_0_1",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 2.8402,
+                        "scaleY": 0.1909,
+                        "translateX": 311700,
+                        "translateY": 445025,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 10,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 10,
+                                    "textRun": {
+                                        "content": "Dr. Seuss\n",
+                                        "style": {}
+                                    }
+                                }
+                            ]
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "TITLE",
+                            "parentObjectId": "p4_i0"
+                        }
+                    }
+                },
+                {
+                    "objectId": "g5f40953d50_0_2",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 2.8402,
+                        "scaleY": 1.1388,
+                        "translateX": 311700,
+                        "translateY": 1152475,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 25,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 25,
+                                    "textRun": {
+                                        "content": "Here is a bulleted list!\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 25,
+                                    "endIndex": 34,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "indentStart": {
+                                                "magnitude": 36,
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "magnitude": 18,
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "COLLAPSE_LISTS"
+                                        },
+                                        "bullet": {
+                                            "listId": "kix.wifbmqnyqu4p",
+                                            "glyph": "●",
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 25,
+                                    "endIndex": 34,
+                                    "textRun": {
+                                        "content": "One fish\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 34,
+                                    "endIndex": 43,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "indentStart": {
+                                                "magnitude": 36,
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "magnitude": 18,
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "COLLAPSE_LISTS"
+                                        },
+                                        "bullet": {
+                                            "listId": "kix.wifbmqnyqu4p",
+                                            "glyph": "●",
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 34,
+                                    "endIndex": 43,
+                                    "textRun": {
+                                        "content": "Two fish\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 43,
+                                    "endIndex": 52,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "indentStart": {
+                                                "magnitude": 36,
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "magnitude": 18,
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "COLLAPSE_LISTS"
+                                        },
+                                        "bullet": {
+                                            "listId": "kix.wifbmqnyqu4p",
+                                            "glyph": "●",
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 43,
+                                    "endIndex": 52,
+                                    "textRun": {
+                                        "content": "Red fish\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 52,
+                                    "endIndex": 62,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "indentStart": {
+                                                "magnitude": 36,
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "magnitude": 18,
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "COLLAPSE_LISTS"
+                                        },
+                                        "bullet": {
+                                            "listId": "kix.wifbmqnyqu4p",
+                                            "glyph": "●",
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 52,
+                                    "endIndex": 62,
+                                    "textRun": {
+                                        "content": "Blue fish\n",
+                                        "style": {}
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "kix.wifbmqnyqu4p": {
+                                    "listId": "kix.wifbmqnyqu4p",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        },
+                                        "1": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        },
+                                        "2": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        },
+                                        "3": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        },
+                                        "4": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        },
+                                        "5": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        },
+                                        "6": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        },
+                                        "7": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        },
+                                        "8": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        }
+                                    }
+                                },
+                                "kix.yuy8atv38lqp": {
+                                    "listId": "kix.yuy8atv38lqp",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        },
+                                        "1": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        },
+                                        "2": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        },
+                                        "3": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        },
+                                        "4": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        },
+                                        "5": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        },
+                                        "6": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        },
+                                        "7": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        },
+                                        "8": {
+                                            "bulletStyle": {
+                                                "underline": false
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "BODY",
+                            "parentObjectId": "p4_i1"
+                        }
+                    }
+                }
+            ],
+            "slideProperties": {
+                "layoutObjectId": "p4",
+                "masterObjectId": "simple-light-2",
+                "notesPage": {
+                    "objectId": "g5f40953d50_0_0:notes",
+                    "pageType": "NOTES",
+                    "pageElements": [
+                        {
+                            "objectId": "g5f40953d50_0_3",
+                            "size": {
+                                "width": {
+                                    "magnitude": 3000000,
+                                    "unit": "EMU"
+                                },
+                                "height": {
+                                    "magnitude": 3000000,
+                                    "unit": "EMU"
+                                }
+                            },
+                            "transform": {
+                                "scaleX": 2.032,
+                                "scaleY": 1.143,
+                                "translateX": 381300,
+                                "translateY": 685800,
+                                "unit": "EMU"
+                            },
+                            "shape": {
+                                "shapeProperties": {
+                                    "outline": {
+                                        "propertyState": "INHERIT"
+                                    }
+                                },
+                                "placeholder": {
+                                    "type": "SLIDE_IMAGE",
+                                    "parentObjectId": "n:slide"
+                                }
+                            }
+                        },
+                        {
+                            "objectId": "g5f40953d50_0_4",
+                            "size": {
+                                "width": {
+                                    "magnitude": 3000000,
+                                    "unit": "EMU"
+                                },
+                                "height": {
+                                    "magnitude": 3000000,
+                                    "unit": "EMU"
+                                }
+                            },
+                            "transform": {
+                                "scaleX": 1.8288,
+                                "scaleY": 1.3716,
+                                "translateX": 685800,
+                                "translateY": 4343400,
+                                "unit": "EMU"
+                            },
+                            "shape": {
+                                "shapeType": "TEXT_BOX",
+                                "shapeProperties": {
+                                    "shapeBackgroundFill": {
+                                        "propertyState": "INHERIT"
+                                    },
+                                    "outline": {
+                                        "propertyState": "INHERIT"
+                                    },
+                                    "shadow": {
+                                        "propertyState": "INHERIT"
+                                    }
+                                },
+                                "placeholder": {
+                                    "type": "BODY",
+                                    "index": 1,
+                                    "parentObjectId": "n:text"
+                                }
+                            }
+                        }
+                    ],
+                    "pageProperties": {
+                        "pageBackgroundFill": {
+                            "propertyState": "INHERIT"
+                        }
+                    },
+                    "notesProperties": {
+                        "speakerNotesObjectId": "g5f40953d50_0_4"
+                    }
+                }
+            },
+            "pageProperties": {
+                "pageBackgroundFill": {
+                    "propertyState": "INHERIT"
+                }
+            }
+        }
+    ],
+    "title": "THIS IS MY FIRST DASH PRESENTATION",
+    "masters": [
+        {
+            "objectId": "simple-light-2",
+            "pageType": "MASTER",
+            "pageElements": [
+                {
+                    "objectId": "p1_i0",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 2.8402,
+                        "scaleY": 0.1909,
+                        "translateX": 311700,
+                        "translateY": 445025,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK1"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK1"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK1"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK1"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK1"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK1"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK1"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK1"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK1"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK1"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        },
+                                        "1": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK1"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        },
+                                        "2": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK1"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        },
+                                        "3": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK1"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        },
+                                        "4": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK1"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        },
+                                        "5": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK1"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        },
+                                        "6": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK1"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        },
+                                        "7": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK1"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        },
+                                        "8": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK1"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "NOT_RENDERED",
+                                "solidFill": {
+                                    "color": {
+                                        "rgbColor": {
+                                            "red": 1,
+                                            "green": 1,
+                                            "blue": 1
+                                        }
+                                    },
+                                    "alpha": 1
+                                }
+                            },
+                            "outline": {
+                                "outlineFill": {
+                                    "solidFill": {
+                                        "color": {
+                                            "rgbColor": {}
+                                        },
+                                        "alpha": 1
+                                    }
+                                },
+                                "weight": {
+                                    "magnitude": 9525,
+                                    "unit": "EMU"
+                                },
+                                "dashStyle": "SOLID",
+                                "propertyState": "NOT_RENDERED"
+                            },
+                            "shadow": {
+                                "type": "OUTER",
+                                "transform": {
+                                    "scaleX": 1,
+                                    "scaleY": 1,
+                                    "unit": "EMU"
+                                },
+                                "alignment": "BOTTOM_LEFT",
+                                "blurRadius": {
+                                    "unit": "EMU"
+                                },
+                                "color": {
+                                    "rgbColor": {}
+                                },
+                                "alpha": 1,
+                                "rotateWithShape": false,
+                                "propertyState": "NOT_RENDERED"
+                            },
+                            "contentAlignment": "TOP"
+                        },
+                        "placeholder": {
+                            "type": "TITLE"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p1_i1",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 2.8402,
+                        "scaleY": 1.1388,
+                        "translateX": 311700,
+                        "translateY": 1152475,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 115,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "magnitude": 16,
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK2"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 18,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 115,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "magnitude": 16,
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK2"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 14,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 115,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "magnitude": 16,
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK2"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 14,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 115,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "magnitude": 16,
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK2"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 14,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 115,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "magnitude": 16,
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK2"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 14,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 115,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "magnitude": 16,
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK2"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 14,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 115,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "magnitude": 16,
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK2"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 14,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 115,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "magnitude": 16,
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK2"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 14,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 115,
+                                            "alignment": "START",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "magnitude": 16,
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK2"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 14,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK2"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 18,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        },
+                                        "1": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK2"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 14,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        },
+                                        "2": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK2"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 14,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        },
+                                        "3": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK2"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 14,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        },
+                                        "4": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK2"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 14,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        },
+                                        "5": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK2"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 14,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        },
+                                        "6": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK2"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 14,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        },
+                                        "7": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK2"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 14,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        },
+                                        "8": {
+                                            "bulletStyle": {
+                                                "backgroundColor": {},
+                                                "foregroundColor": {
+                                                    "opaqueColor": {
+                                                        "themeColor": "DARK2"
+                                                    }
+                                                },
+                                                "bold": false,
+                                                "italic": false,
+                                                "fontFamily": "Arial",
+                                                "fontSize": {
+                                                    "magnitude": 14,
+                                                    "unit": "PT"
+                                                },
+                                                "baselineOffset": "NONE",
+                                                "smallCaps": false,
+                                                "strikethrough": false,
+                                                "underline": false,
+                                                "weightedFontFamily": {
+                                                    "fontFamily": "Arial",
+                                                    "weight": 400
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "NOT_RENDERED",
+                                "solidFill": {
+                                    "color": {
+                                        "rgbColor": {
+                                            "red": 1,
+                                            "green": 1,
+                                            "blue": 1
+                                        }
+                                    },
+                                    "alpha": 1
+                                }
+                            },
+                            "outline": {
+                                "outlineFill": {
+                                    "solidFill": {
+                                        "color": {
+                                            "rgbColor": {}
+                                        },
+                                        "alpha": 1
+                                    }
+                                },
+                                "weight": {
+                                    "magnitude": 9525,
+                                    "unit": "EMU"
+                                },
+                                "dashStyle": "SOLID",
+                                "propertyState": "NOT_RENDERED"
+                            },
+                            "shadow": {
+                                "type": "OUTER",
+                                "transform": {
+                                    "scaleX": 1,
+                                    "scaleY": 1,
+                                    "unit": "EMU"
+                                },
+                                "alignment": "BOTTOM_LEFT",
+                                "blurRadius": {
+                                    "unit": "EMU"
+                                },
+                                "color": {
+                                    "rgbColor": {}
+                                },
+                                "alpha": 1,
+                                "rotateWithShape": false,
+                                "propertyState": "NOT_RENDERED"
+                            },
+                            "contentAlignment": "TOP"
+                        },
+                        "placeholder": {
+                            "type": "BODY"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p1_i2",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 0.1829,
+                        "scaleY": 0.1312,
+                        "translateX": 8472457.8125,
+                        "translateY": 4663216.797499999,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "END",
+                                            "indentStart": {
+                                                "unit": "PT"
+                                            },
+                                            "indentEnd": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceAbove": {
+                                                "unit": "PT"
+                                            },
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "indentFirstLine": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT",
+                                            "spacingMode": "NEVER_COLLAPSE"
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "autoText": {
+                                        "type": "SLIDE_NUMBER",
+                                        "content": "#",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK2"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 10,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "themeColor": "DARK2"
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 10,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "NOT_RENDERED",
+                                "solidFill": {
+                                    "color": {
+                                        "rgbColor": {
+                                            "red": 1,
+                                            "green": 1,
+                                            "blue": 1
+                                        }
+                                    },
+                                    "alpha": 1
+                                }
+                            },
+                            "outline": {
+                                "outlineFill": {
+                                    "solidFill": {
+                                        "color": {
+                                            "rgbColor": {}
+                                        },
+                                        "alpha": 1
+                                    }
+                                },
+                                "weight": {
+                                    "magnitude": 9525,
+                                    "unit": "EMU"
+                                },
+                                "dashStyle": "SOLID",
+                                "propertyState": "NOT_RENDERED"
+                            },
+                            "shadow": {
+                                "type": "OUTER",
+                                "transform": {
+                                    "scaleX": 1,
+                                    "scaleY": 1,
+                                    "unit": "EMU"
+                                },
+                                "alignment": "BOTTOM_LEFT",
+                                "blurRadius": {
+                                    "unit": "EMU"
+                                },
+                                "color": {
+                                    "rgbColor": {}
+                                },
+                                "alpha": 1,
+                                "rotateWithShape": false,
+                                "propertyState": "NOT_RENDERED"
+                            },
+                            "contentAlignment": "MIDDLE"
+                        },
+                        "placeholder": {
+                            "type": "SLIDE_NUMBER"
+                        }
+                    }
+                }
+            ],
+            "pageProperties": {
+                "pageBackgroundFill": {
+                    "solidFill": {
+                        "color": {
+                            "themeColor": "LIGHT1"
+                        },
+                        "alpha": 1
+                    }
+                },
+                "colorScheme": {
+                    "colors": [
+                        {
+                            "type": "DARK1",
+                            "color": {}
+                        },
+                        {
+                            "type": "LIGHT1",
+                            "color": {
+                                "red": 1,
+                                "green": 1,
+                                "blue": 1
+                            }
+                        },
+                        {
+                            "type": "DARK2",
+                            "color": {
+                                "red": 0.34901962,
+                                "green": 0.34901962,
+                                "blue": 0.34901962
+                            }
+                        },
+                        {
+                            "type": "LIGHT2",
+                            "color": {
+                                "red": 0.93333334,
+                                "green": 0.93333334,
+                                "blue": 0.93333334
+                            }
+                        },
+                        {
+                            "type": "ACCENT1",
+                            "color": {
+                                "red": 1,
+                                "green": 0.67058825,
+                                "blue": 0.2509804
+                            }
+                        },
+                        {
+                            "type": "ACCENT2",
+                            "color": {
+                                "red": 0.12941177,
+                                "green": 0.12941177,
+                                "blue": 0.12941177
+                            }
+                        },
+                        {
+                            "type": "ACCENT3",
+                            "color": {
+                                "red": 0.47058824,
+                                "green": 0.5647059,
+                                "blue": 0.6117647
+                            }
+                        },
+                        {
+                            "type": "ACCENT4",
+                            "color": {
+                                "red": 1,
+                                "green": 0.67058825,
+                                "blue": 0.2509804
+                            }
+                        },
+                        {
+                            "type": "ACCENT5",
+                            "color": {
+                                "green": 0.5921569,
+                                "blue": 0.654902
+                            }
+                        },
+                        {
+                            "type": "ACCENT6",
+                            "color": {
+                                "red": 0.93333334,
+                                "green": 1,
+                                "blue": 0.25490198
+                            }
+                        },
+                        {
+                            "type": "HYPERLINK",
+                            "color": {
+                                "green": 0.5921569,
+                                "blue": 0.654902
+                            }
+                        },
+                        {
+                            "type": "FOLLOWED_HYPERLINK",
+                            "color": {
+                                "green": 0.5921569,
+                                "blue": 0.654902
+                            }
+                        },
+                        {
+                            "type": "TEXT1",
+                            "color": {}
+                        },
+                        {
+                            "type": "BACKGROUND1",
+                            "color": {
+                                "red": 1,
+                                "green": 1,
+                                "blue": 1
+                            }
+                        },
+                        {
+                            "type": "TEXT2",
+                            "color": {
+                                "red": 0.93333334,
+                                "green": 0.93333334,
+                                "blue": 0.93333334
+                            }
+                        },
+                        {
+                            "type": "BACKGROUND2",
+                            "color": {
+                                "red": 0.34901962,
+                                "green": 0.34901962,
+                                "blue": 0.34901962
+                            }
+                        }
+                    ]
+                }
+            },
+            "masterProperties": {
+                "displayName": "Simple Light"
+            }
+        }
+    ],
+    "layouts": [
+        {
+            "objectId": "p2",
+            "pageType": "LAYOUT",
+            "pageElements": [
+                {
+                    "objectId": "p2_i0",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 2.8402,
+                        "scaleY": 0.6842,
+                        "translateX": 311708.35000000003,
+                        "translateY": 744575,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 52,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 52,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 52,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 52,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 52,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 52,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 52,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 52,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 52,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 52,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "1": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 52,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "2": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 52,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "3": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 52,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "4": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 52,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "5": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 52,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "6": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 52,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "7": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 52,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "8": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 52,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            },
+                            "contentAlignment": "BOTTOM"
+                        },
+                        "placeholder": {
+                            "type": "CENTERED_TITLE",
+                            "parentObjectId": "p1_i0"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p2_i1",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 2.8402,
+                        "scaleY": 0.2642,
+                        "translateX": 311700,
+                        "translateY": 2834125,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 28,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "1": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "2": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "3": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "4": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "5": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "6": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "7": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "8": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 28,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "SUBTITLE",
+                            "parentObjectId": "p1_i1"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p2_i2",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 0.1829,
+                        "scaleY": 0.1312,
+                        "translateX": 8472457.8125,
+                        "translateY": 4663216.797499999,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "autoText": {
+                                        "type": "SLIDE_NUMBER",
+                                        "content": "#",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ]
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "SLIDE_NUMBER",
+                            "parentObjectId": "p1_i2"
+                        }
+                    }
+                }
+            ],
+            "layoutProperties": {
+                "masterObjectId": "simple-light-2",
+                "name": "TITLE",
+                "displayName": "Title slide"
+            },
+            "pageProperties": {
+                "pageBackgroundFill": {
+                    "propertyState": "INHERIT"
+                }
+            }
+        },
+        {
+            "objectId": "p3",
+            "pageType": "LAYOUT",
+            "pageElements": [
+                {
+                    "objectId": "p3_i0",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 2.8402,
+                        "scaleY": 0.2806,
+                        "translateX": 311700,
+                        "translateY": 2150850,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 36,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 36,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 36,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 36,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 36,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 36,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 36,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 36,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 36,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 36,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "1": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 36,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "2": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 36,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "3": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 36,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "4": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 36,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "5": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 36,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "6": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 36,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "7": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 36,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "8": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 36,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            },
+                            "contentAlignment": "MIDDLE"
+                        },
+                        "placeholder": {
+                            "type": "TITLE",
+                            "parentObjectId": "p1_i0"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p3_i1",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 0.1829,
+                        "scaleY": 0.1312,
+                        "translateX": 8472457.8125,
+                        "translateY": 4663216.797499999,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "autoText": {
+                                        "type": "SLIDE_NUMBER",
+                                        "content": "#",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ]
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "SLIDE_NUMBER",
+                            "parentObjectId": "p1_i2"
+                        }
+                    }
+                }
+            ],
+            "layoutProperties": {
+                "masterObjectId": "simple-light-2",
+                "name": "SECTION_HEADER",
+                "displayName": "Section header"
+            },
+            "pageProperties": {
+                "pageBackgroundFill": {
+                    "propertyState": "INHERIT"
+                }
+            }
+        },
+        {
+            "objectId": "p4",
+            "pageType": "LAYOUT",
+            "pageElements": [
+                {
+                    "objectId": "p4_i0",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 2.8402,
+                        "scaleY": 0.1909,
+                        "translateX": 311700,
+                        "translateY": 445025,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {}
+                                        },
+                                        "1": {
+                                            "bulletStyle": {}
+                                        },
+                                        "2": {
+                                            "bulletStyle": {}
+                                        },
+                                        "3": {
+                                            "bulletStyle": {}
+                                        },
+                                        "4": {
+                                            "bulletStyle": {}
+                                        },
+                                        "5": {
+                                            "bulletStyle": {}
+                                        },
+                                        "6": {
+                                            "bulletStyle": {}
+                                        },
+                                        "7": {
+                                            "bulletStyle": {}
+                                        },
+                                        "8": {
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "TITLE",
+                            "parentObjectId": "p1_i0"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p4_i1",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 2.8402,
+                        "scaleY": 1.1388,
+                        "translateX": 311700,
+                        "translateY": 1152475,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {}
+                                        },
+                                        "1": {
+                                            "bulletStyle": {}
+                                        },
+                                        "2": {
+                                            "bulletStyle": {}
+                                        },
+                                        "3": {
+                                            "bulletStyle": {}
+                                        },
+                                        "4": {
+                                            "bulletStyle": {}
+                                        },
+                                        "5": {
+                                            "bulletStyle": {}
+                                        },
+                                        "6": {
+                                            "bulletStyle": {}
+                                        },
+                                        "7": {
+                                            "bulletStyle": {}
+                                        },
+                                        "8": {
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "BODY",
+                            "parentObjectId": "p1_i1"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p4_i2",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 0.1829,
+                        "scaleY": 0.1312,
+                        "translateX": 8472457.8125,
+                        "translateY": 4663216.797499999,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "autoText": {
+                                        "type": "SLIDE_NUMBER",
+                                        "content": "#",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ]
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "SLIDE_NUMBER",
+                            "parentObjectId": "p1_i2"
+                        }
+                    }
+                }
+            ],
+            "layoutProperties": {
+                "masterObjectId": "simple-light-2",
+                "name": "TITLE_AND_BODY",
+                "displayName": "Title and body"
+            },
+            "pageProperties": {
+                "pageBackgroundFill": {
+                    "propertyState": "INHERIT"
+                }
+            }
+        },
+        {
+            "objectId": "p5",
+            "pageType": "LAYOUT",
+            "pageElements": [
+                {
+                    "objectId": "p5_i0",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 2.8402,
+                        "scaleY": 0.1909,
+                        "translateX": 311700,
+                        "translateY": 445025,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {}
+                                        },
+                                        "1": {
+                                            "bulletStyle": {}
+                                        },
+                                        "2": {
+                                            "bulletStyle": {}
+                                        },
+                                        "3": {
+                                            "bulletStyle": {}
+                                        },
+                                        "4": {
+                                            "bulletStyle": {}
+                                        },
+                                        "5": {
+                                            "bulletStyle": {}
+                                        },
+                                        "6": {
+                                            "bulletStyle": {}
+                                        },
+                                        "7": {
+                                            "bulletStyle": {}
+                                        },
+                                        "8": {
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "TITLE",
+                            "parentObjectId": "p1_i0"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p5_i1",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 1.3333,
+                        "scaleY": 1.1388,
+                        "translateX": 311700,
+                        "translateY": 1152475,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 14,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 14,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "1": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "2": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "3": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "4": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "5": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "6": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "7": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "8": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "BODY",
+                            "parentObjectId": "p1_i1"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p5_i2",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 1.3333,
+                        "scaleY": 1.1388,
+                        "translateX": 4832400,
+                        "translateY": 1152475,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 14,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 14,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "1": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "2": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "3": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "4": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "5": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "6": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "7": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "8": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "BODY",
+                            "index": 1,
+                            "parentObjectId": "p1_i1"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p5_i3",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 0.1829,
+                        "scaleY": 0.1312,
+                        "translateX": 8472457.8125,
+                        "translateY": 4663216.797499999,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "autoText": {
+                                        "type": "SLIDE_NUMBER",
+                                        "content": "#",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ]
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "SLIDE_NUMBER",
+                            "parentObjectId": "p1_i2"
+                        }
+                    }
+                }
+            ],
+            "layoutProperties": {
+                "masterObjectId": "simple-light-2",
+                "name": "TITLE_AND_TWO_COLUMNS",
+                "displayName": "Title and two columns"
+            },
+            "pageProperties": {
+                "pageBackgroundFill": {
+                    "propertyState": "INHERIT"
+                }
+            }
+        },
+        {
+            "objectId": "p6",
+            "pageType": "LAYOUT",
+            "pageElements": [
+                {
+                    "objectId": "p6_i0",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 2.8402,
+                        "scaleY": 0.1909,
+                        "translateX": 311700,
+                        "translateY": 445025,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {}
+                                        },
+                                        "1": {
+                                            "bulletStyle": {}
+                                        },
+                                        "2": {
+                                            "bulletStyle": {}
+                                        },
+                                        "3": {
+                                            "bulletStyle": {}
+                                        },
+                                        "4": {
+                                            "bulletStyle": {}
+                                        },
+                                        "5": {
+                                            "bulletStyle": {}
+                                        },
+                                        "6": {
+                                            "bulletStyle": {}
+                                        },
+                                        "7": {
+                                            "bulletStyle": {}
+                                        },
+                                        "8": {
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "TITLE",
+                            "parentObjectId": "p1_i0"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p6_i1",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 0.1829,
+                        "scaleY": 0.1312,
+                        "translateX": 8472457.8125,
+                        "translateY": 4663216.797499999,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "autoText": {
+                                        "type": "SLIDE_NUMBER",
+                                        "content": "#",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ]
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "SLIDE_NUMBER",
+                            "parentObjectId": "p1_i2"
+                        }
+                    }
+                }
+            ],
+            "layoutProperties": {
+                "masterObjectId": "simple-light-2",
+                "name": "TITLE_ONLY",
+                "displayName": "Title only"
+            },
+            "pageProperties": {
+                "pageBackgroundFill": {
+                    "propertyState": "INHERIT"
+                }
+            }
+        },
+        {
+            "objectId": "p7",
+            "pageType": "LAYOUT",
+            "pageElements": [
+                {
+                    "objectId": "p7_i0",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 0.936,
+                        "scaleY": 0.2519,
+                        "translateX": 311700,
+                        "translateY": 555600,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 24,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 24,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 24,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 24,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 24,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 24,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 24,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 24,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 24,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 24,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "1": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 24,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "2": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 24,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "3": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 24,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "4": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 24,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "5": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 24,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "6": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 24,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "7": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 24,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "8": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 24,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            },
+                            "contentAlignment": "BOTTOM"
+                        },
+                        "placeholder": {
+                            "type": "TITLE",
+                            "parentObjectId": "p1_i0"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p7_i1",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 0.936,
+                        "scaleY": 1.0598,
+                        "translateX": 311700,
+                        "translateY": 1389600,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 12,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "1": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "2": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "3": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "4": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "5": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "6": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "7": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "8": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 12,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "BODY",
+                            "parentObjectId": "p1_i1"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p7_i2",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 0.1829,
+                        "scaleY": 0.1312,
+                        "translateX": 8472457.8125,
+                        "translateY": 4663216.797499999,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "autoText": {
+                                        "type": "SLIDE_NUMBER",
+                                        "content": "#",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ]
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "SLIDE_NUMBER",
+                            "parentObjectId": "p1_i2"
+                        }
+                    }
+                }
+            ],
+            "layoutProperties": {
+                "masterObjectId": "simple-light-2",
+                "name": "ONE_COLUMN_TEXT",
+                "displayName": "One column text"
+            },
+            "pageProperties": {
+                "pageBackgroundFill": {
+                    "propertyState": "INHERIT"
+                }
+            }
+        },
+        {
+            "objectId": "p8",
+            "pageType": "LAYOUT",
+            "pageElements": [
+                {
+                    "objectId": "p8_i0",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 2.1226,
+                        "scaleY": 1.3636,
+                        "translateX": 490250,
+                        "translateY": 450150,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 48,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 48,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 48,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 48,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 48,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 48,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 48,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 48,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 48,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 48,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "1": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 48,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "2": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 48,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "3": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 48,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "4": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 48,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "5": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 48,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "6": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 48,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "7": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 48,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "8": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 48,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            },
+                            "contentAlignment": "MIDDLE"
+                        },
+                        "placeholder": {
+                            "type": "TITLE",
+                            "parentObjectId": "p1_i0"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p8_i1",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 0.1829,
+                        "scaleY": 0.1312,
+                        "translateX": 8472457.8125,
+                        "translateY": 4663216.797499999,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "autoText": {
+                                        "type": "SLIDE_NUMBER",
+                                        "content": "#",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ]
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "SLIDE_NUMBER",
+                            "parentObjectId": "p1_i2"
+                        }
+                    }
+                }
+            ],
+            "layoutProperties": {
+                "masterObjectId": "simple-light-2",
+                "name": "MAIN_POINT",
+                "displayName": "Main point"
+            },
+            "pageProperties": {
+                "pageBackgroundFill": {
+                    "propertyState": "INHERIT"
+                }
+            }
+        },
+        {
+            "objectId": "p9",
+            "pageType": "LAYOUT",
+            "pageElements": [
+                {
+                    "objectId": "p9_i0",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 1.524,
+                        "scaleY": 1.7145,
+                        "translateX": 4572000,
+                        "translateY": -125,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "RECTANGLE",
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "solidFill": {
+                                    "color": {
+                                        "themeColor": "LIGHT2"
+                                    },
+                                    "alpha": 1
+                                }
+                            },
+                            "outline": {
+                                "outlineFill": {
+                                    "solidFill": {
+                                        "color": {
+                                            "rgbColor": {}
+                                        },
+                                        "alpha": 1
+                                    }
+                                },
+                                "weight": {
+                                    "magnitude": 9525,
+                                    "unit": "EMU"
+                                },
+                                "dashStyle": "SOLID",
+                                "propertyState": "NOT_RENDERED"
+                            },
+                            "shadow": {
+                                "type": "OUTER",
+                                "transform": {
+                                    "scaleX": 1,
+                                    "scaleY": 1,
+                                    "unit": "EMU"
+                                },
+                                "alignment": "BOTTOM_LEFT",
+                                "blurRadius": {
+                                    "unit": "EMU"
+                                },
+                                "color": {
+                                    "rgbColor": {}
+                                },
+                                "alpha": 1,
+                                "rotateWithShape": false,
+                                "propertyState": "NOT_RENDERED"
+                            },
+                            "contentAlignment": "MIDDLE"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p9_i1",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 1.3484,
+                        "scaleY": 0.4941,
+                        "translateX": 265500,
+                        "translateY": 1233175,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 42,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 42,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 42,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 42,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 42,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 42,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 42,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 42,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 42,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 42,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "1": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 42,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "2": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 42,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "3": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 42,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "4": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 42,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "5": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 42,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "6": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 42,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "7": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 42,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "8": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 42,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            },
+                            "contentAlignment": "BOTTOM"
+                        },
+                        "placeholder": {
+                            "type": "TITLE",
+                            "parentObjectId": "p1_i0"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p9_i2",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 1.3484,
+                        "scaleY": 0.4117,
+                        "translateX": 265500,
+                        "translateY": 2803075,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 21,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 21,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 21,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 21,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 21,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 21,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 21,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 21,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "alignment": "CENTER",
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 21,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 21,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "1": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 21,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "2": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 21,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "3": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 21,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "4": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 21,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "5": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 21,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "6": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 21,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "7": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 21,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "8": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 21,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "SUBTITLE",
+                            "parentObjectId": "p1_i1"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p9_i3",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 1.279,
+                        "scaleY": 1.2317,
+                        "translateX": 4939500,
+                        "translateY": 724075,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {}
+                                        },
+                                        "1": {
+                                            "bulletStyle": {}
+                                        },
+                                        "2": {
+                                            "bulletStyle": {}
+                                        },
+                                        "3": {
+                                            "bulletStyle": {}
+                                        },
+                                        "4": {
+                                            "bulletStyle": {}
+                                        },
+                                        "5": {
+                                            "bulletStyle": {}
+                                        },
+                                        "6": {
+                                            "bulletStyle": {}
+                                        },
+                                        "7": {
+                                            "bulletStyle": {}
+                                        },
+                                        "8": {
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            },
+                            "contentAlignment": "MIDDLE"
+                        },
+                        "placeholder": {
+                            "type": "BODY",
+                            "parentObjectId": "p1_i1"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p9_i4",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 0.1829,
+                        "scaleY": 0.1312,
+                        "translateX": 8472457.8125,
+                        "translateY": 4663216.797499999,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "autoText": {
+                                        "type": "SLIDE_NUMBER",
+                                        "content": "#",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ]
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "SLIDE_NUMBER",
+                            "parentObjectId": "p1_i2"
+                        }
+                    }
+                }
+            ],
+            "layoutProperties": {
+                "masterObjectId": "simple-light-2",
+                "name": "SECTION_TITLE_AND_DESCRIPTION",
+                "displayName": "Section title and description"
+            },
+            "pageProperties": {
+                "pageBackgroundFill": {
+                    "propertyState": "INHERIT"
+                }
+            }
+        },
+        {
+            "objectId": "p10",
+            "pageType": "LAYOUT",
+            "pageElements": [
+                {
+                    "objectId": "p10_i0",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 1.9996,
+                        "scaleY": 0.2017,
+                        "translateX": 311700,
+                        "translateY": 4230575,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "lineSpacing": 100,
+                                            "spaceBelow": {
+                                                "unit": "PT"
+                                            },
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {}
+                                        },
+                                        "1": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 18,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "2": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 18,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "3": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 18,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "4": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 18,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "5": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 18,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "6": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 18,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "7": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 18,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "8": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 18,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            },
+                            "contentAlignment": "MIDDLE"
+                        },
+                        "placeholder": {
+                            "type": "BODY",
+                            "parentObjectId": "p1_i1"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p10_i1",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 0.1829,
+                        "scaleY": 0.1312,
+                        "translateX": 8472457.8125,
+                        "translateY": 4663216.797499999,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "autoText": {
+                                        "type": "SLIDE_NUMBER",
+                                        "content": "#",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ]
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "SLIDE_NUMBER",
+                            "parentObjectId": "p1_i2"
+                        }
+                    }
+                }
+            ],
+            "layoutProperties": {
+                "masterObjectId": "simple-light-2",
+                "name": "CAPTION_ONLY",
+                "displayName": "Caption"
+            },
+            "pageProperties": {
+                "pageBackgroundFill": {
+                    "propertyState": "INHERIT"
+                }
+            }
+        },
+        {
+            "objectId": "p11",
+            "pageType": "LAYOUT",
+            "pageElements": [
+                {
+                    "objectId": "p11_i0",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 2.8402,
+                        "scaleY": 0.6545,
+                        "translateX": 311700,
+                        "translateY": 1106125,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 120,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 120,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 120,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 120,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 120,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 120,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 120,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 120,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": " ",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {
+                                            "fontSize": {
+                                                "magnitude": 120,
+                                                "unit": "PT"
+                                            }
+                                        }
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 120,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "1": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 120,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "2": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 120,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "3": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 120,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "4": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 120,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "5": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 120,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "6": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 120,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "7": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 120,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        },
+                                        "8": {
+                                            "bulletStyle": {
+                                                "fontSize": {
+                                                    "magnitude": 120,
+                                                    "unit": "PT"
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            },
+                            "contentAlignment": "BOTTOM"
+                        },
+                        "placeholder": {
+                            "type": "TITLE",
+                            "parentObjectId": "p1_i0"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p11_i1",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 2.8402,
+                        "scaleY": 0.4336,
+                        "translateX": 311700,
+                        "translateY": 3152225,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 1,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 1,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 2,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 2,
+                                    "endIndex": 3,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 3,
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 3,
+                                    "endIndex": 4,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 4,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 4,
+                                    "endIndex": 5,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 5,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 5,
+                                    "endIndex": 6,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 6,
+                                            "glyph": "●",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 6,
+                                    "endIndex": 7,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 7,
+                                            "glyph": "○",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 7,
+                                    "endIndex": 8,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "alignment": "CENTER",
+                                            "direction": "LEFT_TO_RIGHT"
+                                        },
+                                        "bullet": {
+                                            "listId": "bodyPlaceholderListEntity",
+                                            "nestingLevel": 8,
+                                            "glyph": "■",
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                },
+                                {
+                                    "startIndex": 8,
+                                    "endIndex": 9,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ],
+                            "lists": {
+                                "bodyPlaceholderListEntity": {
+                                    "listId": "bodyPlaceholderListEntity",
+                                    "nestingLevel": {
+                                        "0": {
+                                            "bulletStyle": {}
+                                        },
+                                        "1": {
+                                            "bulletStyle": {}
+                                        },
+                                        "2": {
+                                            "bulletStyle": {}
+                                        },
+                                        "3": {
+                                            "bulletStyle": {}
+                                        },
+                                        "4": {
+                                            "bulletStyle": {}
+                                        },
+                                        "5": {
+                                            "bulletStyle": {}
+                                        },
+                                        "6": {
+                                            "bulletStyle": {}
+                                        },
+                                        "7": {
+                                            "bulletStyle": {}
+                                        },
+                                        "8": {
+                                            "bulletStyle": {}
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "BODY",
+                            "parentObjectId": "p1_i1"
+                        }
+                    }
+                },
+                {
+                    "objectId": "p11_i2",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 0.1829,
+                        "scaleY": 0.1312,
+                        "translateX": 8472457.8125,
+                        "translateY": 4663216.797499999,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "autoText": {
+                                        "type": "SLIDE_NUMBER",
+                                        "content": "#",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ]
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "SLIDE_NUMBER",
+                            "parentObjectId": "p1_i2"
+                        }
+                    }
+                }
+            ],
+            "layoutProperties": {
+                "masterObjectId": "simple-light-2",
+                "name": "BIG_NUMBER",
+                "displayName": "Big number"
+            },
+            "pageProperties": {
+                "pageBackgroundFill": {
+                    "propertyState": "INHERIT"
+                }
+            }
+        },
+        {
+            "objectId": "p12",
+            "pageType": "LAYOUT",
+            "pageElements": [
+                {
+                    "objectId": "p12_i0",
+                    "size": {
+                        "width": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        },
+                        "height": {
+                            "magnitude": 3000000,
+                            "unit": "EMU"
+                        }
+                    },
+                    "transform": {
+                        "scaleX": 0.1829,
+                        "scaleY": 0.1312,
+                        "translateX": 8472457.8125,
+                        "translateY": 4663216.797499999,
+                        "unit": "EMU"
+                    },
+                    "shape": {
+                        "shapeType": "TEXT_BOX",
+                        "text": {
+                            "textElements": [
+                                {
+                                    "endIndex": 2,
+                                    "paragraphMarker": {
+                                        "style": {
+                                            "direction": "LEFT_TO_RIGHT"
+                                        }
+                                    }
+                                },
+                                {
+                                    "endIndex": 1,
+                                    "autoText": {
+                                        "type": "SLIDE_NUMBER",
+                                        "content": "#",
+                                        "style": {}
+                                    }
+                                },
+                                {
+                                    "startIndex": 1,
+                                    "endIndex": 2,
+                                    "textRun": {
+                                        "content": "\n",
+                                        "style": {}
+                                    }
+                                }
+                            ]
+                        },
+                        "shapeProperties": {
+                            "shapeBackgroundFill": {
+                                "propertyState": "INHERIT"
+                            },
+                            "outline": {
+                                "propertyState": "INHERIT"
+                            },
+                            "shadow": {
+                                "propertyState": "INHERIT"
+                            }
+                        },
+                        "placeholder": {
+                            "type": "SLIDE_NUMBER",
+                            "parentObjectId": "p1_i2"
+                        }
+                    }
+                }
+            ],
+            "layoutProperties": {
+                "masterObjectId": "simple-light-2",
+                "name": "BLANK",
+                "displayName": "Blank"
+            },
+            "pageProperties": {
+                "pageBackgroundFill": {
+                    "propertyState": "INHERIT"
+                }
+            }
+        }
+    ],
+    "locale": "en",
+    "revisionId": "kaHql7SEgvqFcw",
+    "notesMaster": {
+        "objectId": "n",
+        "pageType": "NOTES_MASTER",
+        "pageElements": [
+            {
+                "objectId": "n:slide",
+                "size": {
+                    "width": {
+                        "magnitude": 3000000,
+                        "unit": "EMU"
+                    },
+                    "height": {
+                        "magnitude": 3000000,
+                        "unit": "EMU"
+                    }
+                },
+                "transform": {
+                    "scaleX": 2.032025,
+                    "scaleY": 1.143,
+                    "translateX": 381300,
+                    "translateY": 685800,
+                    "unit": "EMU"
+                },
+                "shape": {
+                    "shapeProperties": {
+                        "outline": {
+                            "outlineFill": {
+                                "solidFill": {
+                                    "color": {
+                                        "rgbColor": {}
+                                    },
+                                    "alpha": 1
+                                }
+                            },
+                            "weight": {
+                                "magnitude": 9525,
+                                "unit": "EMU"
+                            },
+                            "dashStyle": "SOLID"
+                        },
+                        "contentAlignment": "MIDDLE"
+                    },
+                    "placeholder": {
+                        "type": "SLIDE_IMAGE"
+                    }
+                }
+            },
+            {
+                "objectId": "n:text",
+                "size": {
+                    "width": {
+                        "magnitude": 3000000,
+                        "unit": "EMU"
+                    },
+                    "height": {
+                        "magnitude": 3000000,
+                        "unit": "EMU"
+                    }
+                },
+                "transform": {
+                    "scaleX": 1.8288,
+                    "scaleY": 1.3716,
+                    "translateX": 685800,
+                    "translateY": 4343400,
+                    "unit": "EMU"
+                },
+                "shape": {
+                    "shapeType": "TEXT_BOX",
+                    "text": {
+                        "textElements": [
+                            {
+                                "endIndex": 1,
+                                "paragraphMarker": {
+                                    "style": {
+                                        "lineSpacing": 100,
+                                        "alignment": "START",
+                                        "indentStart": {
+                                            "unit": "PT"
+                                        },
+                                        "indentEnd": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceAbove": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceBelow": {
+                                            "unit": "PT"
+                                        },
+                                        "indentFirstLine": {
+                                            "unit": "PT"
+                                        },
+                                        "direction": "LEFT_TO_RIGHT",
+                                        "spacingMode": "COLLAPSE_LISTS"
+                                    },
+                                    "bullet": {
+                                        "listId": "bodyPlaceholderListEntity",
+                                        "glyph": "●",
+                                        "bulletStyle": {}
+                                    }
+                                }
+                            },
+                            {
+                                "endIndex": 1,
+                                "textRun": {
+                                    "content": "\n",
+                                    "style": {
+                                        "backgroundColor": {},
+                                        "foregroundColor": {
+                                            "opaqueColor": {
+                                                "rgbColor": {}
+                                            }
+                                        },
+                                        "bold": false,
+                                        "italic": false,
+                                        "fontFamily": "Arial",
+                                        "fontSize": {
+                                            "magnitude": 11,
+                                            "unit": "PT"
+                                        },
+                                        "baselineOffset": "NONE",
+                                        "smallCaps": false,
+                                        "strikethrough": false,
+                                        "underline": false,
+                                        "weightedFontFamily": {
+                                            "fontFamily": "Arial",
+                                            "weight": 400
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "startIndex": 1,
+                                "endIndex": 2,
+                                "paragraphMarker": {
+                                    "style": {
+                                        "lineSpacing": 100,
+                                        "alignment": "START",
+                                        "indentStart": {
+                                            "unit": "PT"
+                                        },
+                                        "indentEnd": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceAbove": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceBelow": {
+                                            "unit": "PT"
+                                        },
+                                        "indentFirstLine": {
+                                            "unit": "PT"
+                                        },
+                                        "direction": "LEFT_TO_RIGHT",
+                                        "spacingMode": "COLLAPSE_LISTS"
+                                    },
+                                    "bullet": {
+                                        "listId": "bodyPlaceholderListEntity",
+                                        "nestingLevel": 1,
+                                        "glyph": "○",
+                                        "bulletStyle": {}
+                                    }
+                                }
+                            },
+                            {
+                                "startIndex": 1,
+                                "endIndex": 2,
+                                "textRun": {
+                                    "content": "\n",
+                                    "style": {
+                                        "backgroundColor": {},
+                                        "foregroundColor": {
+                                            "opaqueColor": {
+                                                "rgbColor": {}
+                                            }
+                                        },
+                                        "bold": false,
+                                        "italic": false,
+                                        "fontFamily": "Arial",
+                                        "fontSize": {
+                                            "magnitude": 11,
+                                            "unit": "PT"
+                                        },
+                                        "baselineOffset": "NONE",
+                                        "smallCaps": false,
+                                        "strikethrough": false,
+                                        "underline": false,
+                                        "weightedFontFamily": {
+                                            "fontFamily": "Arial",
+                                            "weight": 400
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "startIndex": 2,
+                                "endIndex": 3,
+                                "paragraphMarker": {
+                                    "style": {
+                                        "lineSpacing": 100,
+                                        "alignment": "START",
+                                        "indentStart": {
+                                            "unit": "PT"
+                                        },
+                                        "indentEnd": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceAbove": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceBelow": {
+                                            "unit": "PT"
+                                        },
+                                        "indentFirstLine": {
+                                            "unit": "PT"
+                                        },
+                                        "direction": "LEFT_TO_RIGHT",
+                                        "spacingMode": "COLLAPSE_LISTS"
+                                    },
+                                    "bullet": {
+                                        "listId": "bodyPlaceholderListEntity",
+                                        "nestingLevel": 2,
+                                        "glyph": "■",
+                                        "bulletStyle": {}
+                                    }
+                                }
+                            },
+                            {
+                                "startIndex": 2,
+                                "endIndex": 3,
+                                "textRun": {
+                                    "content": "\n",
+                                    "style": {
+                                        "backgroundColor": {},
+                                        "foregroundColor": {
+                                            "opaqueColor": {
+                                                "rgbColor": {}
+                                            }
+                                        },
+                                        "bold": false,
+                                        "italic": false,
+                                        "fontFamily": "Arial",
+                                        "fontSize": {
+                                            "magnitude": 11,
+                                            "unit": "PT"
+                                        },
+                                        "baselineOffset": "NONE",
+                                        "smallCaps": false,
+                                        "strikethrough": false,
+                                        "underline": false,
+                                        "weightedFontFamily": {
+                                            "fontFamily": "Arial",
+                                            "weight": 400
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "startIndex": 3,
+                                "endIndex": 4,
+                                "paragraphMarker": {
+                                    "style": {
+                                        "lineSpacing": 100,
+                                        "alignment": "START",
+                                        "indentStart": {
+                                            "unit": "PT"
+                                        },
+                                        "indentEnd": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceAbove": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceBelow": {
+                                            "unit": "PT"
+                                        },
+                                        "indentFirstLine": {
+                                            "unit": "PT"
+                                        },
+                                        "direction": "LEFT_TO_RIGHT",
+                                        "spacingMode": "COLLAPSE_LISTS"
+                                    },
+                                    "bullet": {
+                                        "listId": "bodyPlaceholderListEntity",
+                                        "nestingLevel": 3,
+                                        "glyph": "●",
+                                        "bulletStyle": {}
+                                    }
+                                }
+                            },
+                            {
+                                "startIndex": 3,
+                                "endIndex": 4,
+                                "textRun": {
+                                    "content": "\n",
+                                    "style": {
+                                        "backgroundColor": {},
+                                        "foregroundColor": {
+                                            "opaqueColor": {
+                                                "rgbColor": {}
+                                            }
+                                        },
+                                        "bold": false,
+                                        "italic": false,
+                                        "fontFamily": "Arial",
+                                        "fontSize": {
+                                            "magnitude": 11,
+                                            "unit": "PT"
+                                        },
+                                        "baselineOffset": "NONE",
+                                        "smallCaps": false,
+                                        "strikethrough": false,
+                                        "underline": false,
+                                        "weightedFontFamily": {
+                                            "fontFamily": "Arial",
+                                            "weight": 400
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "startIndex": 4,
+                                "endIndex": 5,
+                                "paragraphMarker": {
+                                    "style": {
+                                        "lineSpacing": 100,
+                                        "alignment": "START",
+                                        "indentStart": {
+                                            "unit": "PT"
+                                        },
+                                        "indentEnd": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceAbove": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceBelow": {
+                                            "unit": "PT"
+                                        },
+                                        "indentFirstLine": {
+                                            "unit": "PT"
+                                        },
+                                        "direction": "LEFT_TO_RIGHT",
+                                        "spacingMode": "COLLAPSE_LISTS"
+                                    },
+                                    "bullet": {
+                                        "listId": "bodyPlaceholderListEntity",
+                                        "nestingLevel": 4,
+                                        "glyph": "○",
+                                        "bulletStyle": {}
+                                    }
+                                }
+                            },
+                            {
+                                "startIndex": 4,
+                                "endIndex": 5,
+                                "textRun": {
+                                    "content": "\n",
+                                    "style": {
+                                        "backgroundColor": {},
+                                        "foregroundColor": {
+                                            "opaqueColor": {
+                                                "rgbColor": {}
+                                            }
+                                        },
+                                        "bold": false,
+                                        "italic": false,
+                                        "fontFamily": "Arial",
+                                        "fontSize": {
+                                            "magnitude": 11,
+                                            "unit": "PT"
+                                        },
+                                        "baselineOffset": "NONE",
+                                        "smallCaps": false,
+                                        "strikethrough": false,
+                                        "underline": false,
+                                        "weightedFontFamily": {
+                                            "fontFamily": "Arial",
+                                            "weight": 400
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "startIndex": 5,
+                                "endIndex": 6,
+                                "paragraphMarker": {
+                                    "style": {
+                                        "lineSpacing": 100,
+                                        "alignment": "START",
+                                        "indentStart": {
+                                            "unit": "PT"
+                                        },
+                                        "indentEnd": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceAbove": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceBelow": {
+                                            "unit": "PT"
+                                        },
+                                        "indentFirstLine": {
+                                            "unit": "PT"
+                                        },
+                                        "direction": "LEFT_TO_RIGHT",
+                                        "spacingMode": "COLLAPSE_LISTS"
+                                    },
+                                    "bullet": {
+                                        "listId": "bodyPlaceholderListEntity",
+                                        "nestingLevel": 5,
+                                        "glyph": "■",
+                                        "bulletStyle": {}
+                                    }
+                                }
+                            },
+                            {
+                                "startIndex": 5,
+                                "endIndex": 6,
+                                "textRun": {
+                                    "content": "\n",
+                                    "style": {
+                                        "backgroundColor": {},
+                                        "foregroundColor": {
+                                            "opaqueColor": {
+                                                "rgbColor": {}
+                                            }
+                                        },
+                                        "bold": false,
+                                        "italic": false,
+                                        "fontFamily": "Arial",
+                                        "fontSize": {
+                                            "magnitude": 11,
+                                            "unit": "PT"
+                                        },
+                                        "baselineOffset": "NONE",
+                                        "smallCaps": false,
+                                        "strikethrough": false,
+                                        "underline": false,
+                                        "weightedFontFamily": {
+                                            "fontFamily": "Arial",
+                                            "weight": 400
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "startIndex": 6,
+                                "endIndex": 7,
+                                "paragraphMarker": {
+                                    "style": {
+                                        "lineSpacing": 100,
+                                        "alignment": "START",
+                                        "indentStart": {
+                                            "unit": "PT"
+                                        },
+                                        "indentEnd": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceAbove": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceBelow": {
+                                            "unit": "PT"
+                                        },
+                                        "indentFirstLine": {
+                                            "unit": "PT"
+                                        },
+                                        "direction": "LEFT_TO_RIGHT",
+                                        "spacingMode": "COLLAPSE_LISTS"
+                                    },
+                                    "bullet": {
+                                        "listId": "bodyPlaceholderListEntity",
+                                        "nestingLevel": 6,
+                                        "glyph": "●",
+                                        "bulletStyle": {}
+                                    }
+                                }
+                            },
+                            {
+                                "startIndex": 6,
+                                "endIndex": 7,
+                                "textRun": {
+                                    "content": "\n",
+                                    "style": {
+                                        "backgroundColor": {},
+                                        "foregroundColor": {
+                                            "opaqueColor": {
+                                                "rgbColor": {}
+                                            }
+                                        },
+                                        "bold": false,
+                                        "italic": false,
+                                        "fontFamily": "Arial",
+                                        "fontSize": {
+                                            "magnitude": 11,
+                                            "unit": "PT"
+                                        },
+                                        "baselineOffset": "NONE",
+                                        "smallCaps": false,
+                                        "strikethrough": false,
+                                        "underline": false,
+                                        "weightedFontFamily": {
+                                            "fontFamily": "Arial",
+                                            "weight": 400
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "startIndex": 7,
+                                "endIndex": 8,
+                                "paragraphMarker": {
+                                    "style": {
+                                        "lineSpacing": 100,
+                                        "alignment": "START",
+                                        "indentStart": {
+                                            "unit": "PT"
+                                        },
+                                        "indentEnd": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceAbove": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceBelow": {
+                                            "unit": "PT"
+                                        },
+                                        "indentFirstLine": {
+                                            "unit": "PT"
+                                        },
+                                        "direction": "LEFT_TO_RIGHT",
+                                        "spacingMode": "COLLAPSE_LISTS"
+                                    },
+                                    "bullet": {
+                                        "listId": "bodyPlaceholderListEntity",
+                                        "nestingLevel": 7,
+                                        "glyph": "○",
+                                        "bulletStyle": {}
+                                    }
+                                }
+                            },
+                            {
+                                "startIndex": 7,
+                                "endIndex": 8,
+                                "textRun": {
+                                    "content": "\n",
+                                    "style": {
+                                        "backgroundColor": {},
+                                        "foregroundColor": {
+                                            "opaqueColor": {
+                                                "rgbColor": {}
+                                            }
+                                        },
+                                        "bold": false,
+                                        "italic": false,
+                                        "fontFamily": "Arial",
+                                        "fontSize": {
+                                            "magnitude": 11,
+                                            "unit": "PT"
+                                        },
+                                        "baselineOffset": "NONE",
+                                        "smallCaps": false,
+                                        "strikethrough": false,
+                                        "underline": false,
+                                        "weightedFontFamily": {
+                                            "fontFamily": "Arial",
+                                            "weight": 400
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "startIndex": 8,
+                                "endIndex": 9,
+                                "paragraphMarker": {
+                                    "style": {
+                                        "lineSpacing": 100,
+                                        "alignment": "START",
+                                        "indentStart": {
+                                            "unit": "PT"
+                                        },
+                                        "indentEnd": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceAbove": {
+                                            "unit": "PT"
+                                        },
+                                        "spaceBelow": {
+                                            "unit": "PT"
+                                        },
+                                        "indentFirstLine": {
+                                            "unit": "PT"
+                                        },
+                                        "direction": "LEFT_TO_RIGHT",
+                                        "spacingMode": "COLLAPSE_LISTS"
+                                    },
+                                    "bullet": {
+                                        "listId": "bodyPlaceholderListEntity",
+                                        "nestingLevel": 8,
+                                        "glyph": "■",
+                                        "bulletStyle": {}
+                                    }
+                                }
+                            },
+                            {
+                                "startIndex": 8,
+                                "endIndex": 9,
+                                "textRun": {
+                                    "content": "\n",
+                                    "style": {
+                                        "backgroundColor": {},
+                                        "foregroundColor": {
+                                            "opaqueColor": {
+                                                "rgbColor": {}
+                                            }
+                                        },
+                                        "bold": false,
+                                        "italic": false,
+                                        "fontFamily": "Arial",
+                                        "fontSize": {
+                                            "magnitude": 11,
+                                            "unit": "PT"
+                                        },
+                                        "baselineOffset": "NONE",
+                                        "smallCaps": false,
+                                        "strikethrough": false,
+                                        "underline": false,
+                                        "weightedFontFamily": {
+                                            "fontFamily": "Arial",
+                                            "weight": 400
+                                        }
+                                    }
+                                }
+                            }
+                        ],
+                        "lists": {
+                            "bodyPlaceholderListEntity": {
+                                "listId": "bodyPlaceholderListEntity",
+                                "nestingLevel": {
+                                    "0": {
+                                        "bulletStyle": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "rgbColor": {}
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 11,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    },
+                                    "1": {
+                                        "bulletStyle": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "rgbColor": {}
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 11,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    },
+                                    "2": {
+                                        "bulletStyle": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "rgbColor": {}
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 11,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    },
+                                    "3": {
+                                        "bulletStyle": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "rgbColor": {}
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 11,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    },
+                                    "4": {
+                                        "bulletStyle": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "rgbColor": {}
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 11,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    },
+                                    "5": {
+                                        "bulletStyle": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "rgbColor": {}
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 11,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    },
+                                    "6": {
+                                        "bulletStyle": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "rgbColor": {}
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 11,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    },
+                                    "7": {
+                                        "bulletStyle": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "rgbColor": {}
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 11,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    },
+                                    "8": {
+                                        "bulletStyle": {
+                                            "backgroundColor": {},
+                                            "foregroundColor": {
+                                                "opaqueColor": {
+                                                    "rgbColor": {}
+                                                }
+                                            },
+                                            "bold": false,
+                                            "italic": false,
+                                            "fontFamily": "Arial",
+                                            "fontSize": {
+                                                "magnitude": 11,
+                                                "unit": "PT"
+                                            },
+                                            "baselineOffset": "NONE",
+                                            "smallCaps": false,
+                                            "strikethrough": false,
+                                            "underline": false,
+                                            "weightedFontFamily": {
+                                                "fontFamily": "Arial",
+                                                "weight": 400
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    },
+                    "shapeProperties": {
+                        "shapeBackgroundFill": {
+                            "propertyState": "NOT_RENDERED",
+                            "solidFill": {
+                                "color": {
+                                    "rgbColor": {
+                                        "red": 1,
+                                        "green": 1,
+                                        "blue": 1
+                                    }
+                                },
+                                "alpha": 1
+                            }
+                        },
+                        "outline": {
+                            "outlineFill": {
+                                "solidFill": {
+                                    "color": {
+                                        "rgbColor": {}
+                                    },
+                                    "alpha": 1
+                                }
+                            },
+                            "weight": {
+                                "magnitude": 9525,
+                                "unit": "EMU"
+                            },
+                            "dashStyle": "SOLID",
+                            "propertyState": "NOT_RENDERED"
+                        },
+                        "shadow": {
+                            "type": "OUTER",
+                            "transform": {
+                                "scaleX": 1,
+                                "scaleY": 1,
+                                "unit": "EMU"
+                            },
+                            "alignment": "BOTTOM_LEFT",
+                            "blurRadius": {
+                                "unit": "EMU"
+                            },
+                            "color": {
+                                "rgbColor": {}
+                            },
+                            "alpha": 1,
+                            "rotateWithShape": false,
+                            "propertyState": "NOT_RENDERED"
+                        },
+                        "contentAlignment": "TOP"
+                    },
+                    "placeholder": {
+                        "type": "BODY",
+                        "index": 1
+                    }
+                }
+            }
+        ],
+        "pageProperties": {
+            "pageBackgroundFill": {
+                "propertyState": "NOT_RENDERED",
+                "solidFill": {
+                    "color": {
+                        "rgbColor": {
+                            "red": 1,
+                            "green": 1,
+                            "blue": 1
+                        }
+                    },
+                    "alpha": 1
+                }
+            },
+            "colorScheme": {
+                "colors": [
+                    {
+                        "type": "DARK1",
+                        "color": {}
+                    },
+                    {
+                        "type": "LIGHT1",
+                        "color": {
+                            "red": 1,
+                            "green": 1,
+                            "blue": 1
+                        }
+                    },
+                    {
+                        "type": "DARK2",
+                        "color": {
+                            "red": 0.08235294,
+                            "green": 0.5058824,
+                            "blue": 0.34509805
+                        }
+                    },
+                    {
+                        "type": "LIGHT2",
+                        "color": {
+                            "red": 0.9529412,
+                            "green": 0.9529412,
+                            "blue": 0.9529412
+                        }
+                    },
+                    {
+                        "type": "ACCENT1",
+                        "color": {
+                            "red": 0.019607844,
+                            "green": 0.5529412,
+                            "blue": 0.78039217
+                        }
+                    },
+                    {
+                        "type": "ACCENT2",
+                        "color": {
+                            "red": 0.3137255,
+                            "green": 0.7058824,
+                            "blue": 0.19607843
+                        }
+                    },
+                    {
+                        "type": "ACCENT3",
+                        "color": {
+                            "red": 0.92941177,
+                            "green": 0.3372549,
+                            "blue": 0.105882354
+                        }
+                    },
+                    {
+                        "type": "ACCENT4",
+                        "color": {
+                            "red": 0.92941177,
+                            "green": 0.9372549
+                        }
+                    },
+                    {
+                        "type": "ACCENT5",
+                        "color": {
+                            "red": 0.14117648,
+                            "green": 0.79607844,
+                            "blue": 0.8980392
+                        }
+                    },
+                    {
+                        "type": "ACCENT6",
+                        "color": {
+                            "red": 0.39215687,
+                            "green": 0.8980392,
+                            "blue": 0.44705883
+                        }
+                    },
+                    {
+                        "type": "HYPERLINK",
+                        "color": {
+                            "red": 0.13333334,
+                            "blue": 0.8
+                        }
+                    },
+                    {
+                        "type": "FOLLOWED_HYPERLINK",
+                        "color": {
+                            "red": 0.33333334,
+                            "green": 0.101960786,
+                            "blue": 0.54509807
+                        }
+                    },
+                    {
+                        "type": "TEXT1",
+                        "color": {}
+                    },
+                    {
+                        "type": "BACKGROUND1",
+                        "color": {
+                            "red": 1,
+                            "green": 1,
+                            "blue": 1
+                        }
+                    },
+                    {
+                        "type": "TEXT2",
+                        "color": {
+                            "red": 0.9529412,
+                            "green": 0.9529412,
+                            "blue": 0.9529412
+                        }
+                    },
+                    {
+                        "type": "BACKGROUND2",
+                        "color": {
+                            "red": 0.08235294,
+                            "green": 0.5058824,
+                            "blue": 0.34509805
+                        }
+                    }
+                ]
+            }
+        }
+    }
+}
\ No newline at end of file
-- 
cgit v1.2.3-70-g09d2


From 6927418364d58c2aaba1b25f1d11537dd510535c Mon Sep 17 00:00:00 2001
From: Bob Zeleznik <zzzman@gmail.com>
Date: Thu, 22 Aug 2019 08:29:43 -0400
Subject: fixed autoheight for text

---
 src/client/views/nodes/FormattedTextBox.tsx | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 3f3360eff..849f942b6 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -735,12 +735,10 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
 
     @action
     tryUpdateHeight() {
-        if (this.props.Document.autoHeight && this._ref.current!.scrollHeight !== 0) {
-            let xf = this._ref.current!.getBoundingClientRect();
-            let scrBounds = this.props.ScreenToLocalTransform().transformBounds(0, 0, xf.width, this._ref.current!.textContent === "" ? 35 : this._ref.current!.scrollHeight);
+        let sh = this._ref.current ? this._ref.current.scrollHeight : 0;
+        if (this.props.Document.autoHeight && sh !== 0) {
             let nh = this.props.Document.isTemplate ? 0 : NumCast(this.dataDoc.nativeHeight, 0);
             let dh = NumCast(this.props.Document.height, 0);
-            let sh = scrBounds.height;
             const ChromeHeight = MainOverlayTextBox.Instance.ChromeHeight;
             this.props.Document.height = Math.max(10, (nh ? dh / nh * sh : sh) + (ChromeHeight ? ChromeHeight() : 0));
             this.dataDoc.nativeHeight = nh ? sh : undefined;
-- 
cgit v1.2.3-70-g09d2


From 8cffe031fe364e19897cfb638cffa9e4056c4343 Mon Sep 17 00:00:00 2001
From: bob <bcz@cs.brown.edu>
Date: Thu, 22 Aug 2019 11:07:11 -0400
Subject: fixed textheight with titles. fixed marquee with floating docs. other
 tweaks.

---
 src/client/util/DocumentManager.ts                   |  4 +++-
 src/client/views/MainOverlayTextBox.tsx              |  1 +
 .../views/collections/CollectionStackingView.tsx     | 13 ++++++++-----
 .../views/collections/CollectionViewChromes.tsx      | 14 +++++++++-----
 .../collections/collectionFreeForm/MarqueeView.tsx   | 20 ++++++++++++++++++--
 src/client/views/nodes/DocumentView.tsx              | 10 ++++++++--
 src/client/views/nodes/FormattedTextBox.tsx          |  6 ++++--
 7 files changed, 51 insertions(+), 17 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/util/DocumentManager.ts b/src/client/util/DocumentManager.ts
index 7f526b247..124faf266 100644
--- a/src/client/util/DocumentManager.ts
+++ b/src/client/util/DocumentManager.ts
@@ -9,6 +9,7 @@ import { CollectionView } from '../views/collections/CollectionView';
 import { DocumentView } from '../views/nodes/DocumentView';
 import { LinkManager } from './LinkManager';
 import { undoBatch, UndoManager } from './UndoManager';
+import { Scripting } from './Scripting';
 
 
 export class DocumentManager {
@@ -202,4 +203,5 @@ export class DocumentManager {
             return 1;
         }
     }
-}
\ No newline at end of file
+}
+Scripting.addGlobal(function focus(doc: any) { DocumentManager.Instance.getDocumentViews(Doc.GetProto(doc)).map(view => view.props.focus(doc, true)) })
\ No newline at end of file
diff --git a/src/client/views/MainOverlayTextBox.tsx b/src/client/views/MainOverlayTextBox.tsx
index 9fe435bc5..0839e1114 100644
--- a/src/client/views/MainOverlayTextBox.tsx
+++ b/src/client/views/MainOverlayTextBox.tsx
@@ -144,6 +144,7 @@ export class MainOverlayTextBox extends React.Component<MainOverlayTextBoxProps>
                                 Document={FormattedTextBox.InputBoxOverlay.props.Document}
                                 DataDoc={FormattedTextBox.InputBoxOverlay.props.DataDoc}
                                 onClick={undefined}
+                                ChromeHeight={this.ChromeHeight}
                                 isSelected={returnTrue} select={emptyFunction} renderDepth={0} selectOnLoad={true}
                                 ContainingCollectionView={undefined} whenActiveChanged={emptyFunction} active={returnTrue} ContentScaling={returnOne}
                                 ScreenToLocalTransform={this._textXf} PanelWidth={returnZero} PanelHeight={returnZero} focus={emptyFunction}
diff --git a/src/client/views/collections/CollectionStackingView.tsx b/src/client/views/collections/CollectionStackingView.tsx
index be6ee1756..4ab656744 100644
--- a/src/client/views/collections/CollectionStackingView.tsx
+++ b/src/client/views/collections/CollectionStackingView.tsx
@@ -287,15 +287,18 @@ export class CollectionStackingView extends CollectionSubView(doc => doc) {
     masonryChildren(docs: Doc[]) {
         this._docXfs.length = 0;
         return docs.map((d, i) => {
+            const pair = Doc.GetLayoutDataDocPair(this.props.Document, this.props.DataDoc, this.props.fieldKey, d);
+            if (!pair.layout || pair.data instanceof Promise) {
+                return (null);
+            }
             let dref = React.createRef<HTMLDivElement>();
-            let layoutDoc = Doc.expandTemplateLayout(d, this.props.DataDoc);
             let width = () => (d.nativeWidth && !d.ignoreAspect && !this.props.Document.fillColumn ? Math.min(d[WidthSym](), this.columnWidth) : this.columnWidth);/// (uniqueHeadings.length + 1);
-            let height = () => this.getDocHeight(layoutDoc);
-            let dxf = () => this.getDocTransform(layoutDoc!, dref.current!);
+            let height = () => this.getDocHeight(pair.layout);
+            let dxf = () => this.getDocTransform(pair.layout!, dref.current!);
             let rowSpan = Math.ceil((height() + this.gridGap) / this.gridGap);
             this._docXfs.push({ dxf: dxf, width: width, height: height });
-            return !layoutDoc ? (null) : <div className="collectionStackingView-masonryDoc" key={d[Id]} ref={dref} style={{ gridRowEnd: `span ${rowSpan}` }} >
-                {this.getDisplayDoc(layoutDoc, d, dxf, width)}
+            return !pair.layout ? (null) : <div className="collectionStackingView-masonryDoc" key={d[Id]} ref={dref} style={{ gridRowEnd: `span ${rowSpan}` }} >
+                {this.getDisplayDoc(pair.layout, pair.data, dxf, width)}
             </div>;
         });
     }
diff --git a/src/client/views/collections/CollectionViewChromes.tsx b/src/client/views/collections/CollectionViewChromes.tsx
index 25b152d4e..74e57611d 100644
--- a/src/client/views/collections/CollectionViewChromes.tsx
+++ b/src/client/views/collections/CollectionViewChromes.tsx
@@ -297,11 +297,15 @@ export class CollectionViewBaseChrome extends React.Component<CollectionViewChro
 
     datePickerRef = (node: HTMLInputElement) => {
         if (node) {
-            this._picker = datepicker("#" + node.id, {
-                disabler: (date: Date) => date > new Date(),
-                onSelect: (instance: any, date: Date) => runInAction(() => this._dateValue = date),
-                dateSelected: new Date()
-            });
+            try {
+                this._picker = datepicker("#" + node.id, {
+                    disabler: (date: Date) => date > new Date(),
+                    onSelect: (instance: any, date: Date) => runInAction(() => this._dateValue = date),
+                    dateSelected: new Date()
+                });
+            } catch (e) {
+                console.log("date picker exception:" + e);
+            }
         }
     }
     render() {
diff --git a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
index aad26efa0..221237365 100644
--- a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
+++ b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
@@ -373,7 +373,7 @@ export class MarqueeView extends React.Component<MarqueeViewProps>
     marqueeSelect(selectBackgrounds: boolean = true) {
         let selRect = this.Bounds;
         let selection: Doc[] = [];
-        this.props.activeDocuments().filter(doc => !doc.isBackground).map(doc => {
+        this.props.activeDocuments().filter(doc => !doc.isBackground && doc.z === undefined).map(doc => {
             var x = NumCast(doc.x);
             var y = NumCast(doc.y);
             var w = NumCast(doc.width);
@@ -383,7 +383,7 @@ export class MarqueeView extends React.Component<MarqueeViewProps>
             }
         });
         if (!selection.length && selectBackgrounds) {
-            this.props.activeDocuments().map(doc => {
+            this.props.activeDocuments().filter(doc => doc.z === undefined).map(doc => {
                 var x = NumCast(doc.x);
                 var y = NumCast(doc.y);
                 var w = NumCast(doc.width);
@@ -393,6 +393,22 @@ export class MarqueeView extends React.Component<MarqueeViewProps>
                 }
             });
         }
+        if (!selection.length) {
+            let left = this._downX < this._lastX ? this._downX : this._lastX;
+            let top = this._downY < this._lastY ? this._downY : this._lastY;
+            let topLeft = this.props.getContainerTransform().transformPoint(left, top);
+            let size = this.props.getContainerTransform().transformDirection(this._lastX - this._downX, this._lastY - this._downY);
+            let otherBounds = { left: topLeft[0], top: topLeft[1], width: Math.abs(size[0]), height: Math.abs(size[1]) };
+            this.props.activeDocuments().filter(doc => doc.z !== undefined).map(doc => {
+                var x = NumCast(doc.x);
+                var y = NumCast(doc.y);
+                var w = NumCast(doc.width);
+                var h = NumCast(doc.height);
+                if (this.intersectRect({ left: x, top: y, width: w, height: h }, otherBounds)) {
+                    selection.push(doc);
+                }
+            });
+        }
         return selection;
     }
 
diff --git a/src/client/views/nodes/DocumentView.tsx b/src/client/views/nodes/DocumentView.tsx
index 8dadf2bef..0c577af86 100644
--- a/src/client/views/nodes/DocumentView.tsx
+++ b/src/client/views/nodes/DocumentView.tsx
@@ -715,7 +715,13 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
     chromeHeight = () => {
         let showOverlays = this.props.showOverlays ? this.props.showOverlays(this.layoutDoc) : undefined;
         let showTitle = showOverlays && "title" in showOverlays ? showOverlays.title : StrCast(this.layoutDoc.showTitle);
-        return showTitle ? 25 : 0;
+        let templates = Cast(this.layoutDoc.templates, listSpec("string"));
+        if (!showOverlays && templates instanceof List) {
+            templates.map(str => {
+                if (!showTitle && str.indexOf("{props.Document.title}") !== -1) showTitle = "title";
+            });
+        }
+        return (showTitle ? 25 : 0) + 1;// bcz: why 8??
     }
 
     get layoutDoc() {
@@ -769,7 +775,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
                 {!showTitle && !showCaption ? this.contents :
                     <div style={{ position: "absolute", display: "inline-block", width: "100%", height: "100%", pointerEvents: "none" }}>
 
-                        <div style={{ width: "100%", height: showTextTitle ? "calc(100% - 33px)" : "100%", display: "inline-block", position: "absolute", top: showTextTitle ? "29px" : undefined }}>
+                        <div style={{ width: "100%", height: showTextTitle ? "calc(100% - 29px)" : "100%", display: "inline-block", position: "absolute", top: showTextTitle ? "29px" : undefined }}>
                             {this.contents}
                         </div>
                         {!showTitle ? (null) :
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 849f942b6..94d9f2f66 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -374,6 +374,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
                 this.unhighlightSearchTerms();
             }
         }, { fireImmediately: true });
+        this.tryUpdateHeight();
     }
 
     pushToGoogleDoc = async () => {
@@ -735,11 +736,12 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
 
     @action
     tryUpdateHeight() {
+        const ChromeHeight = this.props.ChromeHeight;
         let sh = this._ref.current ? this._ref.current.scrollHeight : 0;
+        console.log(this.props.Document.title + " " + sh + " " + (ChromeHeight && ChromeHeight()));
         if (this.props.Document.autoHeight && sh !== 0) {
             let nh = this.props.Document.isTemplate ? 0 : NumCast(this.dataDoc.nativeHeight, 0);
             let dh = NumCast(this.props.Document.height, 0);
-            const ChromeHeight = MainOverlayTextBox.Instance.ChromeHeight;
             this.props.Document.height = Math.max(10, (nh ? dh / nh * sh : sh) + (ChromeHeight ? ChromeHeight() : 0));
             this.dataDoc.nativeHeight = nh ? sh : undefined;
         }
@@ -775,7 +777,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
             <div className={`formattedTextBox-cont-${style}`} ref={this._ref}
                 style={{
                     overflowY: this.props.Document.autoHeight ? "hidden" : "auto",
-                    height: this.props.height ? this.props.height : undefined,
+                    height: this.props.Document.autoHeight ? "max-content" : this.props.height ? this.props.height : undefined,
                     background: this.props.hideOnLeave ? "rgba(0,0,0 ,0.4)" : undefined,
                     opacity: this.props.hideOnLeave ? (this._entered || this.props.isSelected() || Doc.IsBrushed(this.props.Document) ? 1 : 0.1) : 1,
                     color: this.props.color ? this.props.color : this.props.hideOnLeave ? "white" : "inherit",
-- 
cgit v1.2.3-70-g09d2


From 7812945012c320743a4271787ad614b2011c74a3 Mon Sep 17 00:00:00 2001
From: bob <bcz@cs.brown.edu>
Date: Thu, 22 Aug 2019 11:18:19 -0400
Subject: from last

---
 src/client/views/nodes/FormattedTextBox.tsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 94d9f2f66..1cc3e821f 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -374,7 +374,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
                 this.unhighlightSearchTerms();
             }
         }, { fireImmediately: true });
-        this.tryUpdateHeight();
+        setTimeout(() => this.tryUpdateHeight(), 0);
     }
 
     pushToGoogleDoc = async () => {
-- 
cgit v1.2.3-70-g09d2


From 0ee435f6bd686c667a067fa750b4589cedfb0070 Mon Sep 17 00:00:00 2001
From: bob <bcz@cs.brown.edu>
Date: Thu, 22 Aug 2019 11:18:41 -0400
Subject: again

---
 src/client/views/nodes/FormattedTextBox.tsx | 1 -
 1 file changed, 1 deletion(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 1cc3e821f..44a481953 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -738,7 +738,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
     tryUpdateHeight() {
         const ChromeHeight = this.props.ChromeHeight;
         let sh = this._ref.current ? this._ref.current.scrollHeight : 0;
-        console.log(this.props.Document.title + " " + sh + " " + (ChromeHeight && ChromeHeight()));
         if (this.props.Document.autoHeight && sh !== 0) {
             let nh = this.props.Document.isTemplate ? 0 : NumCast(this.dataDoc.nativeHeight, 0);
             let dh = NumCast(this.props.Document.height, 0);
-- 
cgit v1.2.3-70-g09d2


From 65aec7b22e63de15e0d911971fa4e5a32d09d9b5 Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Thu, 22 Aug 2019 12:00:47 -0400
Subject: cleanup

---
 src/client/util/DictationManager.ts         | 30 ++++++++++++++++++-----------
 src/client/views/GlobalKeyHandler.ts        |  2 +-
 src/client/views/MainView.tsx               |  1 -
 src/client/views/nodes/FormattedTextBox.tsx |  2 +-
 src/new_fields/RichTextField.ts             |  6 ++++++
 5 files changed, 27 insertions(+), 14 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/util/DictationManager.ts b/src/client/util/DictationManager.ts
index 781e5e465..fb3c15cea 100644
--- a/src/client/util/DictationManager.ts
+++ b/src/client/util/DictationManager.ts
@@ -64,6 +64,7 @@ export namespace DictationManager {
         export type ListeningUIStatus = { interim: boolean } | false;
 
         export interface ListeningOptions {
+            useOverlay: boolean;
             language: string;
             continuous: ContinuityArgs;
             delimiters: DelimiterArgs;
@@ -74,27 +75,34 @@ export namespace DictationManager {
 
         export const listen = async (options?: Partial<ListeningOptions>) => {
             let results: string | undefined;
-            // let main = MainView.Instance;
+            let main = MainView.Instance;
 
-            // main.dictationOverlayVisible = true;
-            // main.isListening = { interim: false };
+            let overlay = options !== undefined && options.useOverlay;
+            if (overlay) {
+                main.dictationOverlayVisible = true;
+                main.isListening = { interim: false };
+            }
 
             try {
                 results = await listenImpl(options);
                 if (results) {
                     Utils.CopyText(results);
-                    // main.isListening = false;
-                    // let execute = options && options.tryExecute;
-                    // main.dictatedPhrase = execute ? results.toLowerCase() : results;
-                    // main.dictationSuccess = execute ? await DictationManager.Commands.execute(results) : true;
+                    if (overlay) {
+                        main.isListening = false;
+                        let execute = options && options.tryExecute;
+                        main.dictatedPhrase = execute ? results.toLowerCase() : results;
+                        main.dictationSuccess = execute ? await DictationManager.Commands.execute(results) : true;
+                    }
                     options && options.tryExecute && await DictationManager.Commands.execute(results);
                 }
             } catch (e) {
-                // main.isListening = false;
-                // main.dictatedPhrase = results = `dictation error: ${"error" in e ? e.error : "unknown error"}`;
-                // main.dictationSuccess = false;
+                if (overlay) {
+                    main.isListening = false;
+                    main.dictatedPhrase = results = `dictation error: ${"error" in e ? e.error : "unknown error"}`;
+                    main.dictationSuccess = false;
+                }
             } finally {
-                // main.initiateDictationFade();
+                overlay && main.initiateDictationFade();
             }
 
             return results;
diff --git a/src/client/views/GlobalKeyHandler.ts b/src/client/views/GlobalKeyHandler.ts
index 8a7295c65..d0464bd5f 100644
--- a/src/client/views/GlobalKeyHandler.ts
+++ b/src/client/views/GlobalKeyHandler.ts
@@ -105,7 +105,7 @@ export default class KeyManager {
 
         switch (keyname) {
             case " ":
-                DictationManager.Controls.listen({ tryExecute: true });
+                DictationManager.Controls.listen({ useOverlay: true, tryExecute: true });
                 stopPropagation = true;
                 preventDefault = true;
         }
diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index 0286a201b..f28844009 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -40,7 +40,6 @@ import { PreviewCursor } from './PreviewCursor';
 import { FilterBox } from './search/FilterBox';
 import PresModeMenu from './presentationview/PresentationModeMenu';
 import { PresBox } from './nodes/PresBox';
-import { GoogleApiClientUtils } from '../apis/google_docs/GoogleApiClientUtils';
 
 @observer
 export class MainView extends React.Component {
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index d9043c739..5492a457d 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -1,6 +1,6 @@
 import { library } from '@fortawesome/fontawesome-svg-core';
 import { faEdit, faSmile, faTextHeight, faUpload } from '@fortawesome/free-solid-svg-icons';
-import { action, computed, IReactionDisposer, Lambda, observable, reaction, runInAction, autorun } from "mobx";
+import { action, computed, IReactionDisposer, Lambda, observable, reaction, runInAction } from "mobx";
 import { observer } from "mobx-react";
 import { baseKeymap } from "prosemirror-commands";
 import { history } from "prosemirror-history";
diff --git a/src/new_fields/RichTextField.ts b/src/new_fields/RichTextField.ts
index cae5623e6..1b52e6f82 100644
--- a/src/new_fields/RichTextField.ts
+++ b/src/new_fields/RichTextField.ts
@@ -28,6 +28,12 @@ export class RichTextField extends ObjectField {
         return `new RichTextField("${this.Data}")`;
     }
 
+    public static Initialize = (initial: string) => {
+        !initial.length && (initial = " ");
+        let pos = initial.length + 1;
+        return `{"doc":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"${initial}"}]}]},"selection":{"type":"text","anchor":${pos},"head":${pos}}}`;
+    }
+
     [ToPlainText]() {
         // Because we're working with plain text, just concatenate all paragraphs
         let content = JSON.parse(this.Data).doc.content;
-- 
cgit v1.2.3-70-g09d2


From f0f0cc36654183921076db5a341fe7cac2bfdd3c Mon Sep 17 00:00:00 2001
From: monikahedman <monika_hedman@brown.edu>
Date: Thu, 22 Aug 2019 12:08:12 -0400
Subject: cleaned up

---
 src/client/views/collections/collectionFreeForm/MarqueeView.tsx | 1 -
 src/client/views/nodes/FormattedTextBox.tsx                     | 9 +--------
 2 files changed, 1 insertion(+), 9 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
index e70d526c5..27eafd769 100644
--- a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
+++ b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
@@ -203,7 +203,6 @@ export class MarqueeView extends React.Component<MarqueeViewProps>
     onClick = (e: React.MouseEvent): void => {
         if (Math.abs(e.clientX - this._downX) < Utils.DRAG_THRESHOLD &&
             Math.abs(e.clientY - this._downY) < Utils.DRAG_THRESHOLD) {
-            //this is probably the wrong transform
             PreviewCursor.Show(e.clientX, e.clientY, this.onKeyPress, this.props.addLiveTextDocument, this.props.getTransform, this.props.addDocument);
             // let the DocumentView stopPropagation of this event when it selects this document
         } else {  // why do we get a click event when the cursor have moved a big distance?
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 0c0ab4d87..1db66d4a0 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -145,7 +145,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
 
 
     paste = (e: ClipboardEvent) => {
-        //this is throwing a ton of erros so i had to comment it out
+        //this is throwing a ton of errors so commented it out
         if (e.clipboardData && this._editorView) {
             // let pdfPasteText = `${Utils.GenerateDeterministicGuid("pdf paste")}`;
             // for (let i = 0; i < e.clipboardData.items.length; i++) {
@@ -173,13 +173,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
         }
     }
 
-    public setText = (text: string) => {
-        const tx = this._editorView!.state.tr.insertText(text);
-        const state = this._editorView!.state;
-        this._editorView!.dispatch(tx);
-        return new RichTextField(JSON.stringify(state.toJSON()));
-    }
-
     dispatchTransaction = (tx: Transaction) => {
         if (this._editorView) {
             const state = this._editorView.state.apply(tx);
-- 
cgit v1.2.3-70-g09d2


From e680f97f9d50ce5759d4533bae38af341956ddce Mon Sep 17 00:00:00 2001
From: Sam Wilkins <samwilkins333@gmail.com>
Date: Fri, 23 Aug 2019 11:26:43 -0400
Subject: cleanup

---
 src/client/views/nodes/FormattedTextBox.tsx | 5 -----
 src/server/index.ts                         | 2 +-
 2 files changed, 1 insertion(+), 6 deletions(-)

(limited to 'src/client/views/nodes/FormattedTextBox.tsx')

diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 191a24664..0e04bacf7 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -34,16 +34,12 @@ import "./FormattedTextBox.scss";
 import React = require("react");
 import { GoogleApiClientUtils, Pulls, Pushes } from '../../apis/google_docs/GoogleApiClientUtils';
 import { DocumentDecorations } from '../DocumentDecorations';
-import { MainOverlayTextBox } from '../MainOverlayTextBox';
 import { DictationManager } from '../../util/DictationManager';
 import { ReplaceStep } from 'prosemirror-transform';
 
 library.add(faEdit);
 library.add(faSmile, faTextHeight, faUpload);
 
-// FormattedTextBox: Displays an editable plain text node that maps to a specified Key of a Document
-//
-
 export const Blank = `{"doc":{"type":"doc","content":[]},"selection":{"type":"text","anchor":0,"head":0}}`;
 
 export interface FormattedTextBoxProps {
@@ -146,7 +142,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
 
 
     paste = (e: ClipboardEvent) => {
-        //this is throwing a ton of errors so commented it out
         if (e.clipboardData && this._editorView) {
             // let pdfPasteText = `${Utils.GenerateDeterministicGuid("pdf paste")}`;
             // for (let i = 0; i < e.clipboardData.items.length; i++) {
diff --git a/src/server/index.ts b/src/server/index.ts
index eeadef239..34a0a19f1 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -447,7 +447,7 @@ function LoadPage(file: string, pageNumber: number, res: Response) {
             console.log(pageNumber);
             pdf.getPage(pageNumber).then((page: Pdfjs.PDFPageProxy) => {
                 console.log("reading " + page);
-                let viewport = page.getViewport(1 as any);
+                let viewport = page.getViewport(1);
                 let canvasAndContext = factory.create(viewport.width, viewport.height);
                 let renderContext = {
                     canvasContext: canvasAndContext.context,
-- 
cgit v1.2.3-70-g09d2

