@json-to-office/core-docx 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/plugin/createDocumentGenerator.d.ts +2 -2
- package/dist/plugin/createDocumentGenerator.d.ts.map +1 -1
- package/dist/plugin/example/index.js +3 -0
- package/dist/plugin/example/index.js.map +1 -1
- package/dist/templates/documents/index.d.ts +0 -1
- package/dist/templates/documents/index.d.ts.map +1 -1
- package/dist/templates/documents/proposal.docx.json +802 -67
- package/dist/templates/documents/technical-guide.docx.json +1689 -75
- package/dist/templates/themes/apex.docx.theme.json +126 -0
- package/dist/templates/themes/devportal.docx.theme.json +134 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/templates/documents/quarterly-report.docx.json +0 -117
|
@@ -1,78 +1,364 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "docx",
|
|
3
3
|
"props": {
|
|
4
|
-
"metadata": {
|
|
5
|
-
|
|
4
|
+
"metadata": {
|
|
5
|
+
"title": "Cloud Migration Proposal",
|
|
6
|
+
"author": "Apex Consulting",
|
|
7
|
+
"description": "Strategic proposal for Meridian Financial Group's cloud transformation initiative"
|
|
8
|
+
},
|
|
9
|
+
"theme": "apex"
|
|
6
10
|
},
|
|
7
11
|
"children": [
|
|
8
12
|
{
|
|
9
|
-
"name": "
|
|
10
|
-
"props": {
|
|
11
|
-
"text": "Proposal — Confidential",
|
|
12
|
-
"alignment": "right"
|
|
13
|
-
}
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"name": "footer",
|
|
13
|
+
"name": "section",
|
|
17
14
|
"props": {
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
"level": 1,
|
|
16
|
+
"header": [
|
|
17
|
+
{
|
|
18
|
+
"name": "header",
|
|
19
|
+
"props": {
|
|
20
|
+
"text": "Apex Consulting — Confidential",
|
|
21
|
+
"alignment": "right"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"footer": [
|
|
26
|
+
{
|
|
27
|
+
"name": "footer",
|
|
28
|
+
"props": {
|
|
29
|
+
"text": "Prepared for Meridian Financial Group",
|
|
30
|
+
"alignment": "left",
|
|
31
|
+
"showPageNumbers": true
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
"children": [
|
|
37
|
+
{
|
|
38
|
+
"name": "heading",
|
|
39
|
+
"props": { "text": "Cloud Migration Proposal", "level": 1 }
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"name": "heading",
|
|
43
|
+
"props": {
|
|
44
|
+
"text": "Strategic Infrastructure Transformation for Meridian Financial Group",
|
|
45
|
+
"level": 2
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "paragraph",
|
|
50
|
+
"props": {
|
|
51
|
+
"text": "Prepared by Apex Consulting — April 2026",
|
|
52
|
+
"font": { "italic": true, "color": "textSecondary" }
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
{ "name": "paragraph", "props": { "text": "" } },
|
|
56
|
+
{
|
|
57
|
+
"name": "image",
|
|
58
|
+
"props": {
|
|
59
|
+
"path": "https://placehold.co/800x200/0C2340/D4A843?text=APEX+CONSULTING&font=georgia",
|
|
60
|
+
"width": "100%",
|
|
61
|
+
"caption": "Figure: Apex Consulting — Enterprise Cloud Advisory"
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
{ "name": "paragraph", "props": { "text": "" } },
|
|
65
|
+
{
|
|
66
|
+
"name": "paragraph",
|
|
67
|
+
"props": {
|
|
68
|
+
"text": "This proposal outlines a phased approach to migrate Meridian Financial Group's on-premise infrastructure to a cloud-native architecture on AWS. The initiative will reduce operational costs by 42%, improve system reliability to 99.99% uptime, and position Meridian for the next decade of growth in digital financial services."
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"name": "paragraph",
|
|
73
|
+
"props": {
|
|
74
|
+
"text": "Apex Consulting brings 14 years of experience in financial services cloud transformations, having successfully migrated 23 regulated financial institutions to cloud-native architectures. Our team holds AWS Advanced Consulting Partner status and specializes in PCI-DSS and SOC 2 compliant migrations."
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
{ "name": "toc", "props": { "depth": { "from": 1, "to": 2 } } }
|
|
78
|
+
]
|
|
22
79
|
},
|
|
23
80
|
{
|
|
24
81
|
"name": "section",
|
|
25
|
-
"props": {
|
|
82
|
+
"props": {
|
|
83
|
+
"level": 1,
|
|
84
|
+
"pageBreak": true,
|
|
85
|
+
"header": "linkToPrevious",
|
|
86
|
+
"footer": "linkToPrevious"
|
|
87
|
+
},
|
|
26
88
|
"children": [
|
|
27
|
-
{
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
89
|
+
{
|
|
90
|
+
"name": "heading",
|
|
91
|
+
"props": { "text": "Executive Summary", "level": 1 }
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"name": "paragraph",
|
|
95
|
+
"props": {
|
|
96
|
+
"text": "Meridian Financial Group's current infrastructure is approaching end-of-life across multiple critical systems. Server utilization has reached critical thresholds, monthly downtime exceeds SLA targets, and the 6-8 week hardware procurement cycle severely limits business agility. The security posture carries significant risk with 47 unpatched critical vulnerabilities across end-of-life systems."
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"name": "columns",
|
|
101
|
+
"props": { "columns": 3, "gap": 0.4 },
|
|
102
|
+
"children": [
|
|
103
|
+
{
|
|
104
|
+
"name": "statistic",
|
|
105
|
+
"props": {
|
|
106
|
+
"number": "$1.14M/yr",
|
|
107
|
+
"description": "Projected Savings",
|
|
108
|
+
"trendValue": "42% cost reduction"
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"name": "statistic",
|
|
113
|
+
"props": {
|
|
114
|
+
"number": "99.99%",
|
|
115
|
+
"description": "Target Uptime",
|
|
116
|
+
"trendValue": "From 97.4% current"
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"name": "statistic",
|
|
121
|
+
"props": {
|
|
122
|
+
"number": "26 weeks",
|
|
123
|
+
"description": "Migration Timeline",
|
|
124
|
+
"trendValue": "3-phase approach"
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
]
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"name": "paragraph",
|
|
131
|
+
"props": {
|
|
132
|
+
"text": "We propose a three-phase migration to AWS, leveraging managed services to minimize operational burden while maximizing reliability and cost efficiency. The migration will be executed with zero planned downtime for customer-facing systems, using blue-green deployment strategies and automated rollback procedures."
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"name": "heading",
|
|
137
|
+
"props": { "text": "Strategic Objectives", "level": 2 }
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"name": "list",
|
|
141
|
+
"props": {
|
|
142
|
+
"format": "decimal",
|
|
143
|
+
"items": [
|
|
144
|
+
"Eliminate $2.1M hardware refresh cycle and transition to OpEx model",
|
|
145
|
+
"Reduce provisioning time from 6-8 weeks to under 15 minutes",
|
|
146
|
+
"Achieve SOC 2 Type II compliance through automated security controls",
|
|
147
|
+
"Enable engineering teams with isolated environments and CI/CD pipelines",
|
|
148
|
+
"Establish multi-region disaster recovery with < 1 minute RPO"
|
|
149
|
+
]
|
|
150
|
+
}
|
|
151
|
+
}
|
|
31
152
|
]
|
|
32
153
|
},
|
|
33
154
|
{
|
|
34
155
|
"name": "section",
|
|
35
|
-
"props": {
|
|
156
|
+
"props": {
|
|
157
|
+
"level": 1,
|
|
158
|
+
"pageBreak": true,
|
|
159
|
+
"header": "linkToPrevious",
|
|
160
|
+
"footer": "linkToPrevious"
|
|
161
|
+
},
|
|
36
162
|
"children": [
|
|
37
|
-
{
|
|
38
|
-
|
|
163
|
+
{
|
|
164
|
+
"name": "heading",
|
|
165
|
+
"props": { "text": "Current State Assessment", "level": 1 }
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"name": "paragraph",
|
|
169
|
+
"props": {
|
|
170
|
+
"text": "Our discovery audit of Meridian's infrastructure identified critical capacity constraints, security vulnerabilities, and operational inefficiencies that create material business risk. The following assessment is based on a two-week on-site evaluation conducted in February 2026."
|
|
171
|
+
}
|
|
172
|
+
},
|
|
39
173
|
{
|
|
40
174
|
"name": "columns",
|
|
41
175
|
"props": { "columns": 2, "gap": 0.5 },
|
|
42
176
|
"children": [
|
|
43
177
|
{
|
|
44
178
|
"name": "statistic",
|
|
45
|
-
"props": {
|
|
179
|
+
"props": {
|
|
180
|
+
"number": "87%",
|
|
181
|
+
"description": "Server Utilization",
|
|
182
|
+
"trendValue": "Critical capacity"
|
|
183
|
+
}
|
|
46
184
|
},
|
|
47
185
|
{
|
|
48
186
|
"name": "statistic",
|
|
49
|
-
"props": {
|
|
187
|
+
"props": {
|
|
188
|
+
"number": "23 hrs",
|
|
189
|
+
"description": "Monthly Downtime",
|
|
190
|
+
"trendValue": "Below SLA target"
|
|
191
|
+
}
|
|
50
192
|
}
|
|
51
193
|
]
|
|
52
194
|
},
|
|
53
|
-
{
|
|
195
|
+
{
|
|
196
|
+
"name": "heading",
|
|
197
|
+
"props": { "text": "Infrastructure Inventory", "level": 2 }
|
|
198
|
+
},
|
|
54
199
|
{
|
|
55
200
|
"name": "table",
|
|
56
201
|
"props": {
|
|
202
|
+
"headerCellDefaults": {
|
|
203
|
+
"font": { "bold": true, "size": 10 },
|
|
204
|
+
"padding": { "top": 8, "right": 10, "bottom": 8, "left": 10 }
|
|
205
|
+
},
|
|
206
|
+
"cellDefaults": {
|
|
207
|
+
"padding": { "top": 5, "right": 10, "bottom": 5, "left": 10 },
|
|
208
|
+
"verticalAlignment": "middle",
|
|
209
|
+
"font": { "size": 10 }
|
|
210
|
+
},
|
|
211
|
+
"borderColor": "D6DAE0",
|
|
212
|
+
"borderSize": 1,
|
|
213
|
+
"hideBorders": { "insideVertical": true },
|
|
57
214
|
"columns": [
|
|
58
|
-
{
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
215
|
+
{
|
|
216
|
+
"header": { "content": "Component" },
|
|
217
|
+
"cells": [
|
|
218
|
+
{ "content": "Application Servers" },
|
|
219
|
+
{ "content": "Database Cluster" },
|
|
220
|
+
{ "content": "Storage" },
|
|
221
|
+
{ "content": "Network" },
|
|
222
|
+
{ "content": "Disaster Recovery" },
|
|
223
|
+
{ "content": "Load Balancers" },
|
|
224
|
+
{ "content": "Message Queue" }
|
|
225
|
+
]
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
"header": { "content": "Current Configuration" },
|
|
229
|
+
"cells": [
|
|
230
|
+
{ "content": "12 physical Dell R740xd" },
|
|
231
|
+
{ "content": "3-node Oracle RAC 19c" },
|
|
232
|
+
{ "content": "NetApp FAS8200, 48TB" },
|
|
233
|
+
{ "content": "Cisco Catalyst 9300 stack" },
|
|
234
|
+
{ "content": "Tape backup, 24hr RPO" },
|
|
235
|
+
{ "content": "F5 BIG-IP pair (active/passive)" },
|
|
236
|
+
{ "content": "RabbitMQ 3.8 (single node)" }
|
|
237
|
+
]
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"header": { "content": "Age" },
|
|
241
|
+
"cells": [
|
|
242
|
+
{ "content": "5-7 years" },
|
|
243
|
+
{ "content": "6 years" },
|
|
244
|
+
{ "content": "4 years" },
|
|
245
|
+
{ "content": "8 years" },
|
|
246
|
+
{ "content": "N/A" },
|
|
247
|
+
{ "content": "5 years" },
|
|
248
|
+
{ "content": "3 years" }
|
|
249
|
+
]
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"header": { "content": "Risk Level" },
|
|
253
|
+
"cells": [
|
|
254
|
+
{ "content": "High" },
|
|
255
|
+
{ "content": "Critical" },
|
|
256
|
+
{ "content": "Medium" },
|
|
257
|
+
{ "content": "High" },
|
|
258
|
+
{ "content": "Critical" },
|
|
259
|
+
{ "content": "Medium" },
|
|
260
|
+
{ "content": "Low" }
|
|
261
|
+
]
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
"header": { "content": "EoL Date" },
|
|
265
|
+
"cells": [
|
|
266
|
+
{ "content": "Sep 2026" },
|
|
267
|
+
{ "content": "Dec 2026" },
|
|
268
|
+
{ "content": "Mar 2028" },
|
|
269
|
+
{ "content": "Jun 2025 (past)" },
|
|
270
|
+
{ "content": "N/A" },
|
|
271
|
+
{ "content": "Mar 2027" },
|
|
272
|
+
{ "content": "Jun 2029" }
|
|
273
|
+
]
|
|
274
|
+
}
|
|
62
275
|
]
|
|
63
276
|
}
|
|
64
277
|
},
|
|
65
|
-
{
|
|
278
|
+
{
|
|
279
|
+
"name": "heading",
|
|
280
|
+
"props": { "text": "Key Pain Points", "level": 2 }
|
|
281
|
+
},
|
|
66
282
|
{
|
|
67
283
|
"name": "list",
|
|
68
284
|
"props": {
|
|
69
285
|
"format": "decimal",
|
|
70
286
|
"items": [
|
|
71
|
-
"Hardware refresh cycle requires $2.1M capital investment every 4 years",
|
|
72
|
-
"Scaling requires 6-8 week lead time for hardware procurement",
|
|
73
|
-
"Disaster recovery tested annually — last test revealed 4-hour data gap",
|
|
74
|
-
"Security patching backlog of 47 critical vulnerabilities across end-of-life
|
|
75
|
-
"Development teams blocked by shared staging environment contention"
|
|
287
|
+
"Hardware refresh cycle requires $2.1M capital investment every 4 years, with a $1.8M refresh currently 6 months overdue",
|
|
288
|
+
"Scaling requires 6-8 week lead time for hardware procurement — three product launches were delayed in 2025 due to infrastructure constraints",
|
|
289
|
+
"Disaster recovery tested annually — last test in November 2025 revealed a 4-hour data gap and 12-hour RTO, far exceeding the 1-hour target",
|
|
290
|
+
"Security patching backlog of 47 critical vulnerabilities across end-of-life Cisco network equipment and Oracle database servers",
|
|
291
|
+
"Development teams blocked by shared staging environment contention — average wait time of 3.2 days for deployment slots",
|
|
292
|
+
"Monitoring is fragmented across 4 tools (Nagios, Splunk, custom scripts, manual checks) with no unified alerting or incident response automation"
|
|
293
|
+
]
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
"name": "heading",
|
|
298
|
+
"props": { "text": "Compliance Gap Analysis", "level": 2 }
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
"name": "paragraph",
|
|
302
|
+
"props": {
|
|
303
|
+
"text": "Meridian's current infrastructure does not meet several requirements mandated by the upcoming PCI-DSS v4.0 standard (effective March 2025) and SOC 2 Type II certification goals:"
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
"name": "table",
|
|
308
|
+
"props": {
|
|
309
|
+
"headerCellDefaults": {
|
|
310
|
+
"font": { "bold": true, "size": 10 },
|
|
311
|
+
"padding": { "top": 8, "right": 10, "bottom": 8, "left": 10 }
|
|
312
|
+
},
|
|
313
|
+
"cellDefaults": {
|
|
314
|
+
"padding": { "top": 5, "right": 10, "bottom": 5, "left": 10 },
|
|
315
|
+
"verticalAlignment": "middle",
|
|
316
|
+
"font": { "size": 10 }
|
|
317
|
+
},
|
|
318
|
+
"borderColor": "D6DAE0",
|
|
319
|
+
"borderSize": 1,
|
|
320
|
+
"hideBorders": { "insideVertical": true },
|
|
321
|
+
"columns": [
|
|
322
|
+
{
|
|
323
|
+
"header": { "content": "Requirement" },
|
|
324
|
+
"cells": [
|
|
325
|
+
{ "content": "Encryption at rest" },
|
|
326
|
+
{ "content": "Key rotation" },
|
|
327
|
+
{ "content": "Audit logging" },
|
|
328
|
+
{ "content": "Access controls" },
|
|
329
|
+
{ "content": "Vulnerability scanning" }
|
|
330
|
+
]
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
"header": { "content": "Current State" },
|
|
334
|
+
"cells": [
|
|
335
|
+
{ "content": "Partial (DB only)" },
|
|
336
|
+
{ "content": "Manual, annual" },
|
|
337
|
+
{ "content": "Application-level only" },
|
|
338
|
+
{ "content": "LDAP, no MFA" },
|
|
339
|
+
{ "content": "Quarterly manual scans" }
|
|
340
|
+
]
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
"header": { "content": "Required State" },
|
|
344
|
+
"cells": [
|
|
345
|
+
{ "content": "All data stores" },
|
|
346
|
+
{ "content": "Automated, 90-day" },
|
|
347
|
+
{ "content": "Infrastructure + app" },
|
|
348
|
+
{ "content": "SSO + MFA + RBAC" },
|
|
349
|
+
{ "content": "Continuous automated" }
|
|
350
|
+
]
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
"header": { "content": "Gap Severity" },
|
|
354
|
+
"cells": [
|
|
355
|
+
{ "content": "High" },
|
|
356
|
+
{ "content": "Medium" },
|
|
357
|
+
{ "content": "Critical" },
|
|
358
|
+
{ "content": "High" },
|
|
359
|
+
{ "content": "Critical" }
|
|
360
|
+
]
|
|
361
|
+
}
|
|
76
362
|
]
|
|
77
363
|
}
|
|
78
364
|
}
|
|
@@ -80,45 +366,271 @@
|
|
|
80
366
|
},
|
|
81
367
|
{
|
|
82
368
|
"name": "section",
|
|
83
|
-
"props": {
|
|
369
|
+
"props": {
|
|
370
|
+
"level": 1,
|
|
371
|
+
"pageBreak": true,
|
|
372
|
+
"header": "linkToPrevious",
|
|
373
|
+
"footer": "linkToPrevious"
|
|
374
|
+
},
|
|
84
375
|
"children": [
|
|
85
|
-
{
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
{
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
376
|
+
{
|
|
377
|
+
"name": "heading",
|
|
378
|
+
"props": { "text": "Proposed Solution", "level": 1 }
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
"name": "paragraph",
|
|
382
|
+
"props": {
|
|
383
|
+
"text": "We propose a three-phase migration to AWS, leveraging managed services to minimize operational burden while maximizing reliability and cost efficiency. Each phase includes defined success criteria, rollback procedures, and a go/no-go checkpoint before proceeding."
|
|
384
|
+
}
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
"name": "image",
|
|
388
|
+
"props": {
|
|
389
|
+
"path": "https://placehold.co/800x300/F4F5F8/0C2340?text=Migration+Architecture+Diagram&font=georgia",
|
|
390
|
+
"width": "100%",
|
|
391
|
+
"caption": "Figure 2: Target cloud architecture — multi-AZ deployment across us-east-1 and eu-west-1"
|
|
392
|
+
}
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
"name": "heading",
|
|
396
|
+
"props": { "text": "Phase 1: Foundation (Weeks 1-8)", "level": 2 }
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
"name": "paragraph",
|
|
400
|
+
"props": {
|
|
401
|
+
"text": "Establish the cloud landing zone with networking (VPC, Transit Gateway, Direct Connect), identity (AWS SSO with Okta integration), security baselines (GuardDuty, SecurityHub, Config Rules), and CI/CD pipelines (GitHub Actions with AWS CodeDeploy). Migrate non-critical workloads including dev/staging environments, internal tools, and documentation systems using lift-and-shift."
|
|
402
|
+
}
|
|
403
|
+
},
|
|
404
|
+
{
|
|
405
|
+
"name": "list",
|
|
406
|
+
"props": {
|
|
407
|
+
"format": "bullet",
|
|
408
|
+
"items": [
|
|
409
|
+
"Landing zone: AWS Control Tower with custom SCPs for financial services compliance",
|
|
410
|
+
"Network: Hub-and-spoke VPC architecture with 10Gbps Direct Connect to Meridian data center",
|
|
411
|
+
"Identity: AWS SSO federated with existing Okta tenant, enforcing MFA on all accounts",
|
|
412
|
+
"CI/CD: GitHub Actions pipelines with automated security scanning (Snyk, tfsec)",
|
|
413
|
+
"First migrations: Developer environments, staging, internal wiki, and monitoring dashboards"
|
|
414
|
+
]
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
"name": "heading",
|
|
419
|
+
"props": {
|
|
420
|
+
"text": "Phase 2: Core Migration (Weeks 9-20)",
|
|
421
|
+
"level": 2
|
|
422
|
+
}
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
"name": "paragraph",
|
|
426
|
+
"props": {
|
|
427
|
+
"text": "Migrate production databases to Aurora PostgreSQL with zero-downtime cutover using AWS DMS continuous replication. Re-platform application servers to ECS Fargate containers with auto-scaling policies. Implement multi-AZ redundancy across us-east-1 and eu-west-1 for the primary trading platform."
|
|
428
|
+
}
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
"name": "table",
|
|
432
|
+
"props": {
|
|
433
|
+
"headerCellDefaults": {
|
|
434
|
+
"font": { "bold": true, "size": 10 },
|
|
435
|
+
"padding": { "top": 8, "right": 10, "bottom": 8, "left": 10 }
|
|
436
|
+
},
|
|
437
|
+
"cellDefaults": {
|
|
438
|
+
"padding": { "top": 5, "right": 10, "bottom": 5, "left": 10 },
|
|
439
|
+
"verticalAlignment": "middle",
|
|
440
|
+
"font": { "size": 10 }
|
|
441
|
+
},
|
|
442
|
+
"borderColor": "D6DAE0",
|
|
443
|
+
"borderSize": 1,
|
|
444
|
+
"hideBorders": { "insideVertical": true },
|
|
445
|
+
"columns": [
|
|
446
|
+
{
|
|
447
|
+
"header": { "content": "Workload" },
|
|
448
|
+
"cells": [
|
|
449
|
+
{ "content": "Trading Platform API" },
|
|
450
|
+
{ "content": "Client Portal" },
|
|
451
|
+
{ "content": "Risk Engine" },
|
|
452
|
+
{ "content": "Reporting Service" },
|
|
453
|
+
{ "content": "Notification System" }
|
|
454
|
+
]
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
"header": { "content": "Strategy" },
|
|
458
|
+
"cells": [
|
|
459
|
+
{ "content": "Re-platform to ECS Fargate" },
|
|
460
|
+
{ "content": "Re-platform to ECS Fargate" },
|
|
461
|
+
{ "content": "Re-architect to Lambda + Step Functions" },
|
|
462
|
+
{ "content": "Re-platform to ECS + Aurora" },
|
|
463
|
+
{ "content": "Re-architect to SNS + SQS + Lambda" }
|
|
464
|
+
]
|
|
465
|
+
},
|
|
466
|
+
{
|
|
467
|
+
"header": { "content": "Downtime Window" },
|
|
468
|
+
"cells": [
|
|
469
|
+
{ "content": "Zero (blue-green)" },
|
|
470
|
+
{ "content": "Zero (blue-green)" },
|
|
471
|
+
{ "content": "4 hours (weekend)" },
|
|
472
|
+
{ "content": "2 hours (weekend)" },
|
|
473
|
+
{ "content": "Zero (parallel run)" }
|
|
474
|
+
]
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
"header": { "content": "Week" },
|
|
478
|
+
"cells": [
|
|
479
|
+
{ "content": "9-12" },
|
|
480
|
+
{ "content": "11-14" },
|
|
481
|
+
{ "content": "13-16" },
|
|
482
|
+
{ "content": "15-18" },
|
|
483
|
+
{ "content": "17-20" }
|
|
484
|
+
]
|
|
485
|
+
}
|
|
486
|
+
]
|
|
487
|
+
}
|
|
488
|
+
},
|
|
489
|
+
{
|
|
490
|
+
"name": "heading",
|
|
491
|
+
"props": { "text": "Phase 3: Optimization (Weeks 21-26)", "level": 2 }
|
|
492
|
+
},
|
|
493
|
+
{
|
|
494
|
+
"name": "paragraph",
|
|
495
|
+
"props": {
|
|
496
|
+
"text": "Right-size instances based on 4+ weeks of production metrics. Enable reserved capacity purchasing for predictable workloads (estimated 35% savings on compute). Implement cloud-native monitoring with CloudWatch, X-Ray distributed tracing, and automated remediation playbooks. Decommission on-premise equipment and terminate data center lease."
|
|
497
|
+
}
|
|
498
|
+
},
|
|
499
|
+
{
|
|
500
|
+
"name": "list",
|
|
501
|
+
"props": {
|
|
502
|
+
"format": "bullet",
|
|
503
|
+
"items": [
|
|
504
|
+
"Right-sizing: Analyze CPU/memory utilization, adjust instance families and sizes",
|
|
505
|
+
"Reserved capacity: Purchase 1-year reservations for baseline workloads, use Savings Plans for variable",
|
|
506
|
+
"Monitoring: Unified CloudWatch dashboards, X-Ray tracing, automated incident response via PagerDuty",
|
|
507
|
+
"Knowledge transfer: 40 hours of hands-on training for Meridian's 3-person ops team",
|
|
508
|
+
"Decommission: Secure data wipe, equipment disposal, data center lease termination"
|
|
509
|
+
]
|
|
510
|
+
}
|
|
511
|
+
}
|
|
93
512
|
]
|
|
94
513
|
},
|
|
95
514
|
{
|
|
96
515
|
"name": "section",
|
|
97
|
-
"props": {
|
|
516
|
+
"props": {
|
|
517
|
+
"level": 1,
|
|
518
|
+
"pageBreak": true,
|
|
519
|
+
"header": "linkToPrevious",
|
|
520
|
+
"footer": "linkToPrevious"
|
|
521
|
+
},
|
|
98
522
|
"children": [
|
|
99
|
-
{
|
|
523
|
+
{
|
|
524
|
+
"name": "heading",
|
|
525
|
+
"props": { "text": "Investment & ROI", "level": 1 }
|
|
526
|
+
},
|
|
100
527
|
{
|
|
101
528
|
"name": "columns",
|
|
102
529
|
"props": { "columns": 3 },
|
|
103
530
|
"children": [
|
|
104
|
-
{
|
|
105
|
-
|
|
106
|
-
|
|
531
|
+
{
|
|
532
|
+
"name": "statistic",
|
|
533
|
+
"props": {
|
|
534
|
+
"number": "$680K",
|
|
535
|
+
"description": "Migration Investment",
|
|
536
|
+
"trendValue": "One-time cost"
|
|
537
|
+
}
|
|
538
|
+
},
|
|
539
|
+
{
|
|
540
|
+
"name": "statistic",
|
|
541
|
+
"props": {
|
|
542
|
+
"number": "$1.14M/yr",
|
|
543
|
+
"description": "Annual Savings",
|
|
544
|
+
"trendValue": "vs. current spend"
|
|
545
|
+
}
|
|
546
|
+
},
|
|
547
|
+
{
|
|
548
|
+
"name": "statistic",
|
|
549
|
+
"props": {
|
|
550
|
+
"number": "7.2 months",
|
|
551
|
+
"description": "Payback Period",
|
|
552
|
+
"trendValue": "Full ROI"
|
|
553
|
+
}
|
|
554
|
+
}
|
|
107
555
|
]
|
|
108
556
|
},
|
|
109
|
-
{
|
|
557
|
+
{
|
|
558
|
+
"name": "heading",
|
|
559
|
+
"props": { "text": "Migration Cost Breakdown", "level": 2 }
|
|
560
|
+
},
|
|
110
561
|
{
|
|
111
562
|
"name": "table",
|
|
112
563
|
"props": {
|
|
564
|
+
"headerCellDefaults": {
|
|
565
|
+
"font": { "bold": true, "size": 10 },
|
|
566
|
+
"padding": { "top": 8, "right": 10, "bottom": 8, "left": 10 }
|
|
567
|
+
},
|
|
568
|
+
"cellDefaults": {
|
|
569
|
+
"padding": { "top": 5, "right": 10, "bottom": 5, "left": 10 },
|
|
570
|
+
"verticalAlignment": "middle",
|
|
571
|
+
"font": { "size": 10 }
|
|
572
|
+
},
|
|
573
|
+
"borderColor": "D6DAE0",
|
|
574
|
+
"borderSize": 1,
|
|
575
|
+
"hideBorders": { "insideVertical": true },
|
|
113
576
|
"columns": [
|
|
114
|
-
{
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
577
|
+
{
|
|
578
|
+
"header": { "content": "Phase" },
|
|
579
|
+
"cells": [
|
|
580
|
+
{ "content": "Phase 1: Foundation" },
|
|
581
|
+
{ "content": "Phase 2: Core Migration" },
|
|
582
|
+
{ "content": "Phase 3: Optimization" },
|
|
583
|
+
{ "content": "Contingency (15%)" },
|
|
584
|
+
{ "content": "Total" }
|
|
585
|
+
]
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
"header": { "content": "Duration" },
|
|
589
|
+
"cells": [
|
|
590
|
+
{ "content": "8 weeks" },
|
|
591
|
+
{ "content": "12 weeks" },
|
|
592
|
+
{ "content": "6 weeks" },
|
|
593
|
+
{ "content": "—" },
|
|
594
|
+
{ "content": "26 weeks" }
|
|
595
|
+
]
|
|
596
|
+
},
|
|
597
|
+
{
|
|
598
|
+
"header": { "content": "Apex Fees" },
|
|
599
|
+
"cells": [
|
|
600
|
+
{ "content": "$140K" },
|
|
601
|
+
{ "content": "$280K" },
|
|
602
|
+
{ "content": "$90K" },
|
|
603
|
+
{ "content": "$76.5K" },
|
|
604
|
+
{ "content": "$586.5K" }
|
|
605
|
+
]
|
|
606
|
+
},
|
|
607
|
+
{
|
|
608
|
+
"header": { "content": "AWS Costs" },
|
|
609
|
+
"cells": [
|
|
610
|
+
{ "content": "$12K" },
|
|
611
|
+
{ "content": "$38K" },
|
|
612
|
+
{ "content": "$18K" },
|
|
613
|
+
{ "content": "$10.2K" },
|
|
614
|
+
{ "content": "$78.2K" }
|
|
615
|
+
]
|
|
616
|
+
},
|
|
617
|
+
{
|
|
618
|
+
"header": { "content": "Tooling/Licensing" },
|
|
619
|
+
"cells": [
|
|
620
|
+
{ "content": "$8K" },
|
|
621
|
+
{ "content": "$4K" },
|
|
622
|
+
{ "content": "$3.5K" },
|
|
623
|
+
{ "content": "—" },
|
|
624
|
+
{ "content": "$15.5K" }
|
|
625
|
+
]
|
|
626
|
+
}
|
|
118
627
|
]
|
|
119
628
|
}
|
|
120
629
|
},
|
|
121
|
-
{
|
|
630
|
+
{
|
|
631
|
+
"name": "heading",
|
|
632
|
+
"props": { "text": "Annual Cost Comparison", "level": 2 }
|
|
633
|
+
},
|
|
122
634
|
{
|
|
123
635
|
"name": "columns",
|
|
124
636
|
"props": { "columns": 2, "gap": 0.5 },
|
|
@@ -126,45 +638,268 @@
|
|
|
126
638
|
{
|
|
127
639
|
"name": "table",
|
|
128
640
|
"props": {
|
|
641
|
+
"headerCellDefaults": {
|
|
642
|
+
"font": { "bold": true, "size": 9 },
|
|
643
|
+
"padding": { "top": 6, "right": 8, "bottom": 6, "left": 8 }
|
|
644
|
+
},
|
|
645
|
+
"cellDefaults": {
|
|
646
|
+
"padding": { "top": 4, "right": 8, "bottom": 4, "left": 8 },
|
|
647
|
+
"verticalAlignment": "middle",
|
|
648
|
+
"font": { "size": 9 }
|
|
649
|
+
},
|
|
650
|
+
"borderColor": "D6DAE0",
|
|
651
|
+
"borderSize": 1,
|
|
652
|
+
"hideBorders": { "insideVertical": true },
|
|
129
653
|
"columns": [
|
|
130
|
-
{
|
|
131
|
-
|
|
654
|
+
{
|
|
655
|
+
"header": { "content": "Current (On-Premise)" },
|
|
656
|
+
"cells": [
|
|
657
|
+
{ "content": "Hardware depreciation" },
|
|
658
|
+
{ "content": "Data center lease" },
|
|
659
|
+
{ "content": "Ops staff (3 FTE)" },
|
|
660
|
+
{ "content": "Oracle licensing" },
|
|
661
|
+
{ "content": "VMware licensing" },
|
|
662
|
+
{ "content": "Network maintenance" },
|
|
663
|
+
{ "content": "DR infrastructure" },
|
|
664
|
+
{ "content": "Total" }
|
|
665
|
+
]
|
|
666
|
+
},
|
|
667
|
+
{
|
|
668
|
+
"header": { "content": "Annual Cost" },
|
|
669
|
+
"cells": [
|
|
670
|
+
{ "content": "$525K" },
|
|
671
|
+
{ "content": "$240K" },
|
|
672
|
+
{ "content": "$420K" },
|
|
673
|
+
{ "content": "$210K" },
|
|
674
|
+
{ "content": "$100K" },
|
|
675
|
+
{ "content": "$65K" },
|
|
676
|
+
{ "content": "$85K" },
|
|
677
|
+
{ "content": "$1,645K" }
|
|
678
|
+
]
|
|
679
|
+
}
|
|
132
680
|
]
|
|
133
681
|
}
|
|
134
682
|
},
|
|
135
683
|
{
|
|
136
684
|
"name": "table",
|
|
137
685
|
"props": {
|
|
686
|
+
"headerCellDefaults": {
|
|
687
|
+
"font": { "bold": true, "size": 9 },
|
|
688
|
+
"padding": { "top": 6, "right": 8, "bottom": 6, "left": 8 }
|
|
689
|
+
},
|
|
690
|
+
"cellDefaults": {
|
|
691
|
+
"padding": { "top": 4, "right": 8, "bottom": 4, "left": 8 },
|
|
692
|
+
"verticalAlignment": "middle",
|
|
693
|
+
"font": { "size": 9 }
|
|
694
|
+
},
|
|
695
|
+
"borderColor": "D6DAE0",
|
|
696
|
+
"borderSize": 1,
|
|
697
|
+
"hideBorders": { "insideVertical": true },
|
|
138
698
|
"columns": [
|
|
139
|
-
{
|
|
140
|
-
|
|
699
|
+
{
|
|
700
|
+
"header": { "content": "Proposed (AWS)" },
|
|
701
|
+
"cells": [
|
|
702
|
+
{ "content": "Compute (ECS Fargate)" },
|
|
703
|
+
{ "content": "Database (Aurora)" },
|
|
704
|
+
{ "content": "Storage (S3 + EBS)" },
|
|
705
|
+
{ "content": "Network (Direct Connect)" },
|
|
706
|
+
{ "content": "Ops staff (1 FTE)" },
|
|
707
|
+
{ "content": "Monitoring (CloudWatch)" },
|
|
708
|
+
{ "content": "Security tooling" },
|
|
709
|
+
{ "content": "Total" }
|
|
710
|
+
]
|
|
711
|
+
},
|
|
712
|
+
{
|
|
713
|
+
"header": { "content": "Annual Cost" },
|
|
714
|
+
"cells": [
|
|
715
|
+
{ "content": "$142K" },
|
|
716
|
+
{ "content": "$96K" },
|
|
717
|
+
{ "content": "$28K" },
|
|
718
|
+
{ "content": "$48K" },
|
|
719
|
+
{ "content": "$140K" },
|
|
720
|
+
{ "content": "$18K" },
|
|
721
|
+
{ "content": "$32K" },
|
|
722
|
+
{ "content": "$504K" }
|
|
723
|
+
]
|
|
724
|
+
}
|
|
141
725
|
]
|
|
142
726
|
}
|
|
143
727
|
}
|
|
144
728
|
]
|
|
729
|
+
},
|
|
730
|
+
{
|
|
731
|
+
"name": "paragraph",
|
|
732
|
+
"props": {
|
|
733
|
+
"text": "The migration eliminates Oracle and VMware licensing entirely, reduces operations staffing from 3 FTE to 1 FTE through automation, and replaces capital-intensive hardware cycles with predictable cloud spend. The 2 freed operations engineers will be retrained as cloud/DevOps engineers, increasing Meridian's internal cloud capability."
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
]
|
|
737
|
+
},
|
|
738
|
+
{
|
|
739
|
+
"name": "section",
|
|
740
|
+
"props": {
|
|
741
|
+
"level": 1,
|
|
742
|
+
"pageBreak": true,
|
|
743
|
+
"header": "linkToPrevious",
|
|
744
|
+
"footer": "linkToPrevious"
|
|
745
|
+
},
|
|
746
|
+
"children": [
|
|
747
|
+
{
|
|
748
|
+
"name": "heading",
|
|
749
|
+
"props": { "text": "Risk Mitigation", "level": 1 }
|
|
750
|
+
},
|
|
751
|
+
{
|
|
752
|
+
"name": "paragraph",
|
|
753
|
+
"props": {
|
|
754
|
+
"text": "Every migration carries inherent risk. Our approach minimizes exposure through proven methodologies, comprehensive testing, and clearly defined rollback procedures at each phase gate."
|
|
755
|
+
}
|
|
756
|
+
},
|
|
757
|
+
{
|
|
758
|
+
"name": "table",
|
|
759
|
+
"props": {
|
|
760
|
+
"headerCellDefaults": {
|
|
761
|
+
"font": { "bold": true, "size": 10 },
|
|
762
|
+
"padding": { "top": 8, "right": 10, "bottom": 8, "left": 10 }
|
|
763
|
+
},
|
|
764
|
+
"cellDefaults": {
|
|
765
|
+
"padding": { "top": 5, "right": 10, "bottom": 5, "left": 10 },
|
|
766
|
+
"verticalAlignment": "middle",
|
|
767
|
+
"font": { "size": 10 }
|
|
768
|
+
},
|
|
769
|
+
"borderColor": "D6DAE0",
|
|
770
|
+
"borderSize": 1,
|
|
771
|
+
"hideBorders": { "insideVertical": true },
|
|
772
|
+
"columns": [
|
|
773
|
+
{
|
|
774
|
+
"header": { "content": "Risk" },
|
|
775
|
+
"cells": [
|
|
776
|
+
{ "content": "Data loss during migration" },
|
|
777
|
+
{ "content": "Extended downtime" },
|
|
778
|
+
{ "content": "Performance regression" },
|
|
779
|
+
{ "content": "Security breach during transition" },
|
|
780
|
+
{ "content": "Budget overrun" },
|
|
781
|
+
{ "content": "Team knowledge gap" }
|
|
782
|
+
]
|
|
783
|
+
},
|
|
784
|
+
{
|
|
785
|
+
"header": { "content": "Probability" },
|
|
786
|
+
"cells": [
|
|
787
|
+
{ "content": "Low" },
|
|
788
|
+
{ "content": "Low" },
|
|
789
|
+
{ "content": "Medium" },
|
|
790
|
+
{ "content": "Low" },
|
|
791
|
+
{ "content": "Medium" },
|
|
792
|
+
{ "content": "High" }
|
|
793
|
+
]
|
|
794
|
+
},
|
|
795
|
+
{
|
|
796
|
+
"header": { "content": "Impact" },
|
|
797
|
+
"cells": [
|
|
798
|
+
{ "content": "Critical" },
|
|
799
|
+
{ "content": "High" },
|
|
800
|
+
{ "content": "Medium" },
|
|
801
|
+
{ "content": "Critical" },
|
|
802
|
+
{ "content": "Medium" },
|
|
803
|
+
{ "content": "Medium" }
|
|
804
|
+
]
|
|
805
|
+
},
|
|
806
|
+
{
|
|
807
|
+
"header": { "content": "Mitigation" },
|
|
808
|
+
"cells": [
|
|
809
|
+
{
|
|
810
|
+
"content": "Continuous DMS replication with automated validation checksums; dual-write for 2 weeks pre-cutover"
|
|
811
|
+
},
|
|
812
|
+
{
|
|
813
|
+
"content": "Blue-green deployments; instant DNS failback to on-premise; weekend windows for non-zero-downtime workloads"
|
|
814
|
+
},
|
|
815
|
+
{
|
|
816
|
+
"content": "Load testing at 2x production volumes before cutover; 1-week parallel-run period"
|
|
817
|
+
},
|
|
818
|
+
{
|
|
819
|
+
"content": "Dedicated security engineer on migration team; WAF deployed Day 1; penetration testing at each phase gate"
|
|
820
|
+
},
|
|
821
|
+
{
|
|
822
|
+
"content": "15% contingency buffer; fixed-price phases with clear scope boundaries; weekly budget reviews"
|
|
823
|
+
},
|
|
824
|
+
{
|
|
825
|
+
"content": "40-hour training program; runbook documentation; 90-day post-migration support included"
|
|
826
|
+
}
|
|
827
|
+
]
|
|
828
|
+
}
|
|
829
|
+
]
|
|
830
|
+
}
|
|
145
831
|
}
|
|
146
832
|
]
|
|
147
833
|
},
|
|
148
834
|
{
|
|
149
835
|
"name": "section",
|
|
150
|
-
"props": {
|
|
836
|
+
"props": {
|
|
837
|
+
"level": 1,
|
|
838
|
+
"pageBreak": true,
|
|
839
|
+
"header": "linkToPrevious",
|
|
840
|
+
"footer": "linkToPrevious"
|
|
841
|
+
},
|
|
151
842
|
"children": [
|
|
152
843
|
{ "name": "heading", "props": { "text": "Next Steps", "level": 1 } },
|
|
153
|
-
{
|
|
844
|
+
{
|
|
845
|
+
"name": "paragraph",
|
|
846
|
+
"props": {
|
|
847
|
+
"text": "We recommend initiating a 2-week discovery sprint in May 2026 to validate assumptions, complete infrastructure dependency mapping, and finalize the migration runbook. This sprint is included in the Phase 1 budget and serves as the formal project kickoff."
|
|
848
|
+
}
|
|
849
|
+
},
|
|
154
850
|
{
|
|
155
851
|
"name": "list",
|
|
156
852
|
"props": {
|
|
157
853
|
"format": "decimal",
|
|
158
854
|
"items": [
|
|
159
|
-
"Sign statement of work and NDA",
|
|
160
|
-
"Complete infrastructure audit and dependency mapping (
|
|
161
|
-
"Finalize migration runbook with rollback procedures (Week 2)",
|
|
162
|
-
"Establish joint project team
|
|
163
|
-
"
|
|
855
|
+
"Sign statement of work and mutual NDA (target: April 14, 2026)",
|
|
856
|
+
"Complete infrastructure audit and full dependency mapping (Weeks 1-2 of Phase 1)",
|
|
857
|
+
"Finalize migration runbook with rollback procedures and success criteria (Week 2)",
|
|
858
|
+
"Establish joint project team — Apex lead architect + 2 engineers, Meridian ops lead + security officer",
|
|
859
|
+
"Set up communication cadence — weekly stakeholder updates, daily standups during active migration",
|
|
860
|
+
"Begin Phase 1 execution (target: May 5, 2026)"
|
|
164
861
|
]
|
|
165
862
|
}
|
|
166
863
|
},
|
|
167
|
-
{ "name": "paragraph", "props": { "text": "
|
|
864
|
+
{ "name": "paragraph", "props": { "text": "" } },
|
|
865
|
+
{
|
|
866
|
+
"name": "columns",
|
|
867
|
+
"props": { "columns": 2, "gap": 0.5 },
|
|
868
|
+
"children": [
|
|
869
|
+
{
|
|
870
|
+
"name": "statistic",
|
|
871
|
+
"props": {
|
|
872
|
+
"number": "May 5",
|
|
873
|
+
"description": "Proposed Start Date",
|
|
874
|
+
"trendValue": "Phase 1 kickoff"
|
|
875
|
+
}
|
|
876
|
+
},
|
|
877
|
+
{
|
|
878
|
+
"name": "statistic",
|
|
879
|
+
"props": {
|
|
880
|
+
"number": "Oct 31",
|
|
881
|
+
"description": "Projected Completion",
|
|
882
|
+
"trendValue": "All 3 phases"
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
]
|
|
886
|
+
},
|
|
887
|
+
{ "name": "paragraph", "props": { "text": "" } },
|
|
888
|
+
{
|
|
889
|
+
"name": "paragraph",
|
|
890
|
+
"props": {
|
|
891
|
+
"text": "For questions or to schedule the discovery sprint, contact:",
|
|
892
|
+
"font": { "bold": true }
|
|
893
|
+
}
|
|
894
|
+
},
|
|
895
|
+
{
|
|
896
|
+
"name": "paragraph",
|
|
897
|
+
"props": {
|
|
898
|
+
"text": "Elena Vasquez, Principal Cloud Architect\nsolutions@apexconsulting.io | +1 (415) 555-0142",
|
|
899
|
+
"alignment": "left",
|
|
900
|
+
"font": { "color": "textSecondary" }
|
|
901
|
+
}
|
|
902
|
+
}
|
|
168
903
|
]
|
|
169
904
|
}
|
|
170
905
|
]
|