@openhi/constructs 0.0.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.
Files changed (90) hide show
  1. package/README.md +3 -0
  2. package/lib/app/index.d.ts +4 -0
  3. package/lib/app/index.js +21 -0
  4. package/lib/app/open-hi-app.d.ts +85 -0
  5. package/lib/app/open-hi-app.js +127 -0
  6. package/lib/app/open-hi-environment.d.ts +59 -0
  7. package/lib/app/open-hi-environment.js +72 -0
  8. package/lib/app/open-hi-service.d.ts +169 -0
  9. package/lib/app/open-hi-service.js +195 -0
  10. package/lib/app/open-hi-stage.d.ts +71 -0
  11. package/lib/app/open-hi-stage.js +70 -0
  12. package/lib/components/acm/root-wildcard-certificate.d.ts +15 -0
  13. package/lib/components/acm/root-wildcard-certificate.js +35 -0
  14. package/lib/components/api-gateway/core-http-api.d.ts +10 -0
  15. package/lib/components/api-gateway/core-http-api.js +44 -0
  16. package/lib/components/api-gateway/http-lambda-integration-no-permissions.d.ts +18 -0
  17. package/lib/components/api-gateway/http-lambda-integration-no-permissions.js +26 -0
  18. package/lib/components/app-sync/core-graphql-api.d.ts +12 -0
  19. package/lib/components/app-sync/core-graphql-api.js +54 -0
  20. package/lib/components/auth.d.ts +75 -0
  21. package/lib/components/auth.js +100 -0
  22. package/lib/components/cognito/core-user-pool-client.d.ts +10 -0
  23. package/lib/components/cognito/core-user-pool-client.js +47 -0
  24. package/lib/components/cognito/core-user-pool-domain.d.ts +10 -0
  25. package/lib/components/cognito/core-user-pool-domain.js +41 -0
  26. package/lib/components/cognito/core-user-pool-kms-key.d.ts +10 -0
  27. package/lib/components/cognito/core-user-pool-kms-key.js +37 -0
  28. package/lib/components/cognito/core-user-pool.d.ts +10 -0
  29. package/lib/components/cognito/core-user-pool.js +54 -0
  30. package/lib/components/core.d.ts +102 -0
  31. package/lib/components/core.js +79 -0
  32. package/lib/components/dynamodb/dynamo-db-data-store.d.ts +33 -0
  33. package/lib/components/dynamodb/dynamo-db-data-store.js +107 -0
  34. package/lib/components/event-bridge/data-event-bus.d.ts +19 -0
  35. package/lib/components/event-bridge/data-event-bus.js +34 -0
  36. package/lib/components/event-bridge/ops-event-bus.d.ts +19 -0
  37. package/lib/components/event-bridge/ops-event-bus.js +34 -0
  38. package/lib/components/global.d.ts +36 -0
  39. package/lib/components/global.js +63 -0
  40. package/lib/components/index.d.ts +1 -0
  41. package/lib/components/index.js +18 -0
  42. package/lib/components/route-53/child-hosted-zone.d.ts +20 -0
  43. package/lib/components/route-53/child-hosted-zone.js +48 -0
  44. package/lib/components/route-53/root-hosted-zone.d.ts +10 -0
  45. package/lib/components/route-53/root-hosted-zone.js +20 -0
  46. package/lib/components/ssm/discoverable-string-parameter.d.ts +59 -0
  47. package/lib/components/ssm/discoverable-string-parameter.js +50 -0
  48. package/lib/components/ssm/index.d.ts +1 -0
  49. package/lib/components/ssm/index.js +18 -0
  50. package/lib/data/dynamo/ehr/r4/Patient.d.ts +180 -0
  51. package/lib/data/dynamo/ehr/r4/Patient.js +192 -0
  52. package/lib/data/dynamo/ehr/r4/ehr-r4-data-service.d.ts +162 -0
  53. package/lib/data/dynamo/ehr/r4/ehr-r4-data-service.js +37 -0
  54. package/lib/data/hello-world.d.ts +39 -0
  55. package/lib/data/hello-world.js +59 -0
  56. package/lib/data/import-patient-with-dynalite.d.ts +1 -0
  57. package/lib/data/import-patient-with-dynalite.js +87 -0
  58. package/lib/data/import-patient.d.ts +47 -0
  59. package/lib/data/import-patient.js +158 -0
  60. package/lib/data/lambda/rest-api-lambda.d.ts +13 -0
  61. package/lib/data/lambda/rest-api-lambda.handler.d.ts +1 -0
  62. package/lib/data/lambda/rest-api-lambda.handler.js +10 -0
  63. package/lib/data/lambda/rest-api-lambda.js +22 -0
  64. package/lib/data/middleware/open-hi-context.d.ts +13 -0
  65. package/lib/data/middleware/open-hi-context.js +31 -0
  66. package/lib/data/rest-api/ehr/r4/Patient.d.ts +16 -0
  67. package/lib/data/rest-api/ehr/r4/Patient.js +234 -0
  68. package/lib/data/rest-api/rest-api-local.d.ts +1 -0
  69. package/lib/data/rest-api/rest-api-local.js +8 -0
  70. package/lib/data/rest-api/rest-api-mockdata.d.ts +7 -0
  71. package/lib/data/rest-api/rest-api-mockdata.js +585 -0
  72. package/lib/data/rest-api/rest-api.d.ts +3 -0
  73. package/lib/data/rest-api/rest-api.js +26 -0
  74. package/lib/index.d.ts +3 -0
  75. package/lib/index.js +20 -0
  76. package/lib/lib/compression.d.ts +27 -0
  77. package/lib/lib/compression.js +87 -0
  78. package/lib/services/index.d.ts +5 -0
  79. package/lib/services/index.js +22 -0
  80. package/lib/services/open-hi-auth-service.d.ts +31 -0
  81. package/lib/services/open-hi-auth-service.js +31 -0
  82. package/lib/services/open-hi-core-service.d.ts +15 -0
  83. package/lib/services/open-hi-core-service.js +38 -0
  84. package/lib/services/open-hi-data-service.d.ts +18 -0
  85. package/lib/services/open-hi-data-service.js +18 -0
  86. package/lib/services/open-hi-global-service.d.ts +15 -0
  87. package/lib/services/open-hi-global-service.js +44 -0
  88. package/lib/services/open-hi-rest-api-service.d.ts +17 -0
  89. package/lib/services/open-hi-rest-api-service.js +107 -0
  90. package/package.json +67 -0
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.patientRouter = void 0;
7
+ exports.listPatients = listPatients;
8
+ exports.getPatientById = getPatientById;
9
+ exports.createPatient = createPatient;
10
+ exports.updatePatient = updatePatient;
11
+ exports.deletePatient = deletePatient;
12
+ const express_1 = __importDefault(require("express"));
13
+ const compression_1 = require("../../../../lib/compression");
14
+ const ehr_r4_data_service_1 = require("../../../dynamo/ehr/r4/ehr-r4-data-service");
15
+ const import_patient_1 = require("../../../import-patient");
16
+ const BASE_PATH = "/ehr/r4/Patient";
17
+ const router = express_1.default.Router();
18
+ exports.patientRouter = router;
19
+ const SK = "CURRENT";
20
+ const TABLE_NAME = process.env.DYNAMO_TABLE_NAME ?? "jesttesttable";
21
+ /**
22
+ * GET /ehr/r4/Patient — search/list: returns a FHIR Bundle (searchset) from the data store.
23
+ * Uses GSI4 (Resource Type Index) to list all Patients in the workspace without a table scan.
24
+ * @see {@link https://github.com/codedrifters/openhi/blob/main/sites/www-docs/content/architecture/dynamodb-single-table-design.md | DynamoDB Single-Table Design} — GSI4, Query and Access Rules (no scans).
25
+ */
26
+ async function listPatients(req, res) {
27
+ const { tenantId, workspaceId } = req.openhiContext;
28
+ const service = (0, ehr_r4_data_service_1.getEhrR4DataService)(TABLE_NAME);
29
+ try {
30
+ const result = await service.entities.patient.query
31
+ .gsi4({ tenantId, workspaceId })
32
+ .go();
33
+ const entries = (result.data ?? []).map((item) => {
34
+ const resource = JSON.parse((0, compression_1.decompressResource)(item.resource));
35
+ return {
36
+ fullUrl: `${BASE_PATH}/${item.id}`,
37
+ resource: { ...resource, id: item.id },
38
+ };
39
+ });
40
+ const bundle = {
41
+ resourceType: "Bundle",
42
+ type: "searchset",
43
+ total: entries.length,
44
+ link: [{ relation: "self", url: BASE_PATH }],
45
+ entry: entries,
46
+ };
47
+ return res.json(bundle);
48
+ }
49
+ catch (err) {
50
+ console.error("GET /Patient list error:", err);
51
+ return res.status(500).json({
52
+ resourceType: "OperationOutcome",
53
+ issue: [
54
+ {
55
+ severity: "error",
56
+ code: "exception",
57
+ diagnostics: String(err),
58
+ },
59
+ ],
60
+ });
61
+ }
62
+ }
63
+ router.get("/", listPatients);
64
+ async function getPatientById(req, res) {
65
+ const id = String(req.params.id);
66
+ const { tenantId, workspaceId } = req.openhiContext;
67
+ const service = (0, ehr_r4_data_service_1.getEhrR4DataService)(TABLE_NAME);
68
+ try {
69
+ const result = await service.entities.patient
70
+ .get({ tenantId, workspaceId, id, sk: "CURRENT" })
71
+ .go();
72
+ if (!result.data) {
73
+ return res.status(404).json({
74
+ resourceType: "OperationOutcome",
75
+ issue: [
76
+ {
77
+ severity: "error",
78
+ code: "not-found",
79
+ diagnostics: `Patient ${id} not found`,
80
+ },
81
+ ],
82
+ });
83
+ }
84
+ const resource = JSON.parse((0, compression_1.decompressResource)(result.data.resource));
85
+ return res.json({ ...resource, id: result.data.id });
86
+ }
87
+ catch (err) {
88
+ console.error("GET Patient error:", err);
89
+ return res.status(500).json({
90
+ resourceType: "OperationOutcome",
91
+ issue: [
92
+ {
93
+ severity: "error",
94
+ code: "exception",
95
+ diagnostics: String(err),
96
+ },
97
+ ],
98
+ });
99
+ }
100
+ }
101
+ /** GET /ehr/r4/Patient/:id — read: returns a single Patient resource from the data store or 404. */
102
+ router.get("/:id", getPatientById);
103
+ /** POST /ehr/r4/Patient — create: accepts Patient in body, persists via data store, returns 201. */
104
+ async function createPatient(req, res) {
105
+ const ctx = req.openhiContext;
106
+ const { tenantId, workspaceId, date, userId, username } = ctx;
107
+ const body = req.body;
108
+ const id = body?.id ?? `patient-${Date.now()}`;
109
+ const patient = {
110
+ ...body,
111
+ resourceType: "Patient",
112
+ id,
113
+ meta: {
114
+ ...(body?.meta ?? {}),
115
+ lastUpdated: date,
116
+ versionId: "1",
117
+ },
118
+ };
119
+ const options = {
120
+ tenantId,
121
+ workspaceId,
122
+ createdDate: date,
123
+ createdById: userId,
124
+ createdByName: username,
125
+ modifiedDate: date,
126
+ modifiedById: userId,
127
+ modifiedByName: username,
128
+ };
129
+ const service = (0, ehr_r4_data_service_1.getEhrR4DataService)(TABLE_NAME);
130
+ try {
131
+ const attrs = (0, import_patient_1.patientToPutAttrs)(patient, options);
132
+ await service.entities.patient
133
+ .put(attrs)
134
+ .go();
135
+ return res.status(201).location(`${BASE_PATH}/${id}`).json(patient);
136
+ }
137
+ catch (err) {
138
+ console.error("POST Patient error:", err);
139
+ return res.status(500).json({
140
+ resourceType: "OperationOutcome",
141
+ issue: [
142
+ { severity: "error", code: "exception", diagnostics: String(err) },
143
+ ],
144
+ });
145
+ }
146
+ }
147
+ router.post("/", createPatient);
148
+ /** PUT /ehr/r4/Patient/:id — update: accepts Patient in body, persists via data store, returns 200. */
149
+ async function updatePatient(req, res) {
150
+ const id = String(req.params.id);
151
+ const ctx = req.openhiContext;
152
+ const { tenantId, workspaceId, date, userId, username } = ctx;
153
+ const body = req.body;
154
+ const patient = {
155
+ ...body,
156
+ resourceType: "Patient",
157
+ id,
158
+ meta: {
159
+ ...(body?.meta ?? {}),
160
+ lastUpdated: date,
161
+ versionId: "2",
162
+ },
163
+ };
164
+ const service = (0, ehr_r4_data_service_1.getEhrR4DataService)(TABLE_NAME);
165
+ try {
166
+ const existing = await service.entities.patient
167
+ .get({ tenantId, workspaceId, id, sk: SK })
168
+ .go();
169
+ if (!existing.data) {
170
+ return res.status(404).json({
171
+ resourceType: "OperationOutcome",
172
+ issue: [
173
+ {
174
+ severity: "error",
175
+ code: "not-found",
176
+ diagnostics: `Patient ${id} not found`,
177
+ },
178
+ ],
179
+ });
180
+ }
181
+ const existingMeta = existing.data.resource != null
182
+ ? JSON.parse((0, compression_1.decompressResource)(existing.data.resource)).meta
183
+ : undefined;
184
+ const patientWithMeta = {
185
+ ...patient,
186
+ meta: (0, import_patient_1.mergeAuditIntoMeta)(patient.meta ?? existingMeta, {
187
+ modifiedDate: date,
188
+ modifiedById: userId,
189
+ modifiedByName: username,
190
+ }),
191
+ };
192
+ await service.entities.patient
193
+ .patch({ tenantId, workspaceId, id, sk: SK })
194
+ .set({
195
+ resource: (0, compression_1.compressResource)(JSON.stringify(patientWithMeta)),
196
+ lastUpdated: date,
197
+ })
198
+ .go();
199
+ return res.json(patientWithMeta);
200
+ }
201
+ catch (err) {
202
+ console.error("PUT Patient error:", err);
203
+ return res.status(500).json({
204
+ resourceType: "OperationOutcome",
205
+ issue: [
206
+ { severity: "error", code: "exception", diagnostics: String(err) },
207
+ ],
208
+ });
209
+ }
210
+ }
211
+ router.put("/:id", updatePatient);
212
+ /** DELETE /ehr/r4/Patient/:id — delete: removes from data store, returns 204. */
213
+ async function deletePatient(req, res) {
214
+ const id = String(req.params.id);
215
+ const { tenantId, workspaceId } = req.openhiContext;
216
+ const service = (0, ehr_r4_data_service_1.getEhrR4DataService)(TABLE_NAME);
217
+ try {
218
+ await service.entities.patient
219
+ .delete({ tenantId, workspaceId, id, sk: SK })
220
+ .go();
221
+ return res.status(204).send();
222
+ }
223
+ catch (err) {
224
+ console.error("DELETE Patient error:", err);
225
+ return res.status(500).json({
226
+ resourceType: "OperationOutcome",
227
+ issue: [
228
+ { severity: "error", code: "exception", diagnostics: String(err) },
229
+ ],
230
+ });
231
+ }
232
+ }
233
+ router.delete("/:id", deletePatient);
234
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGF0aWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9kYXRhL3Jlc3QtYXBpL2Voci9yNC9QYXRpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQXVCQSxvQ0EyQ0M7QUFJRCx3Q0EyQ0M7QUFNRCxzQ0ErQ0M7QUFLRCxzQ0F3RUM7QUFLRCxzQ0FzQkM7QUE5UUQsc0RBQXFEO0FBQ3JELDZEQUdxQztBQUNyQyxvRkFBaUY7QUFDakYsNERBSWlDO0FBRWpDLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDO0FBQ3BDLE1BQU0sTUFBTSxHQUFtQixpQkFBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBcVE3QiwrQkFBYTtBQXBRaEMsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDO0FBRXJCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksZUFBZSxDQUFDO0FBRXBFOzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsWUFBWSxDQUNoQyxHQUFZLEVBQ1osR0FBYTtJQUViLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLGFBQWMsQ0FBQztJQUNyRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHlDQUFtQixFQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWhELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSzthQUNoRCxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLENBQUM7YUFDL0IsRUFBRSxFQUFFLENBQUM7UUFFUixNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFBLGdDQUFrQixFQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FHNUQsQ0FBQztZQUNGLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xDLFFBQVEsRUFBRSxFQUFFLEdBQUcsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO2FBQ3ZDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHO1lBQ2IsWUFBWSxFQUFFLFFBQVE7WUFDdEIsSUFBSSxFQUFFLFdBQVc7WUFDakIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3JCLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7WUFDNUMsS0FBSyxFQUFFLE9BQU87U0FDZixDQUFDO1FBQ0YsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFBQyxPQUFPLEdBQVksRUFBRSxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0MsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMxQixZQUFZLEVBQUUsa0JBQWtCO1lBQ2hDLEtBQUssRUFBRTtnQkFDTDtvQkFDRSxRQUFRLEVBQUUsT0FBTztvQkFDakIsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUN6QjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUV2QixLQUFLLFVBQVUsY0FBYyxDQUNsQyxHQUFZLEVBQ1osR0FBYTtJQUViLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLGFBQWMsQ0FBQztJQUNyRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHlDQUFtQixFQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWhELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPO2FBQzFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQzthQUNqRCxFQUFFLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakIsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDMUIsWUFBWSxFQUFFLGtCQUFrQjtnQkFDaEMsS0FBSyxFQUFFO29CQUNMO3dCQUNFLFFBQVEsRUFBRSxPQUFPO3dCQUNqQixJQUFJLEVBQUUsV0FBVzt3QkFDakIsV0FBVyxFQUFFLFdBQVcsRUFBRSxZQUFZO3FCQUN2QztpQkFDRjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUN6QixJQUFBLGdDQUFrQixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ2QsQ0FBQztRQUM3QixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLFFBQVEsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFBQyxPQUFPLEdBQVksRUFBRSxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDekMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMxQixZQUFZLEVBQUUsa0JBQWtCO1lBQ2hDLEtBQUssRUFBRTtnQkFDTDtvQkFDRSxRQUFRLEVBQUUsT0FBTztvQkFDakIsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUN6QjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUM7QUFFRCxvR0FBb0c7QUFDcEcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFFbkMsb0dBQW9HO0FBQzdGLEtBQUssVUFBVSxhQUFhLENBQ2pDLEdBQVksRUFDWixHQUFhO0lBRWIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLGFBQWMsQ0FBQztJQUMvQixNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUM5RCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsSUFBK0IsQ0FBQztJQUNqRCxNQUFNLEVBQUUsR0FBSSxJQUFJLEVBQUUsRUFBYSxJQUFJLFdBQVcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDM0QsTUFBTSxPQUFPLEdBQUc7UUFDZCxHQUFHLElBQUk7UUFDUCxZQUFZLEVBQUUsU0FBUztRQUN2QixFQUFFO1FBQ0YsSUFBSSxFQUFFO1lBQ0osR0FBRyxDQUFFLElBQUksRUFBRSxJQUFlLElBQUksRUFBRSxDQUFDO1lBQ2pDLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxHQUFHO1NBQ2Y7S0FDdUUsQ0FBQztJQUMzRSxNQUFNLE9BQU8sR0FBeUI7UUFDcEMsUUFBUTtRQUNSLFdBQVc7UUFDWCxXQUFXLEVBQUUsSUFBSTtRQUNqQixXQUFXLEVBQUUsTUFBTTtRQUNuQixhQUFhLEVBQUUsUUFBUTtRQUN2QixZQUFZLEVBQUUsSUFBSTtRQUNsQixZQUFZLEVBQUUsTUFBTTtRQUNwQixjQUFjLEVBQUUsUUFBUTtLQUN6QixDQUFDO0lBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBQSx5Q0FBbUIsRUFBQyxVQUFVLENBQUMsQ0FBQztJQUVoRCxJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxJQUFBLGtDQUFpQixFQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRCxNQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTzthQUMzQixHQUFHLENBQ0YsS0FBc0UsQ0FDdkU7YUFDQSxFQUFFLEVBQUUsQ0FBQztRQUNSLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUFDLE9BQU8sR0FBWSxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLFlBQVksRUFBRSxrQkFBa0I7WUFDaEMsS0FBSyxFQUFFO2dCQUNMLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7YUFDbkU7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBRWhDLHVHQUF1RztBQUNoRyxLQUFLLFVBQVUsYUFBYSxDQUNqQyxHQUFZLEVBQ1osR0FBYTtJQUViLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxhQUFjLENBQUM7SUFDL0IsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFDOUQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQStCLENBQUM7SUFDakQsTUFBTSxPQUFPLEdBQUc7UUFDZCxHQUFHLElBQUk7UUFDUCxZQUFZLEVBQUUsU0FBUztRQUN2QixFQUFFO1FBQ0YsSUFBSSxFQUFFO1lBQ0osR0FBRyxDQUFFLElBQUksRUFBRSxJQUFlLElBQUksRUFBRSxDQUFDO1lBQ2pDLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxHQUFHO1NBQ2Y7S0FDRixDQUFDO0lBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBQSx5Q0FBbUIsRUFBQyxVQUFVLENBQUMsQ0FBQztJQUVoRCxJQUFJLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTzthQUM1QyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7YUFDMUMsRUFBRSxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25CLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzFCLFlBQVksRUFBRSxrQkFBa0I7Z0JBQ2hDLEtBQUssRUFBRTtvQkFDTDt3QkFDRSxRQUFRLEVBQUUsT0FBTzt3QkFDakIsSUFBSSxFQUFFLFdBQVc7d0JBQ2pCLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWTtxQkFDdkM7aUJBQ0Y7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQ2hCLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUk7WUFDNUIsQ0FBQyxDQUNHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBQSxnQ0FBa0IsRUFBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUd0RCxDQUFDLElBQUk7WUFDUixDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2hCLE1BQU0sZUFBZSxHQUFHO1lBQ3RCLEdBQUcsT0FBTztZQUNWLElBQUksRUFBRSxJQUFBLG1DQUFrQixFQUNyQixPQUFPLENBQUMsSUFBNEMsSUFBSSxZQUFZLEVBQ3JFO2dCQUNFLFlBQVksRUFBRSxJQUFJO2dCQUNsQixZQUFZLEVBQUUsTUFBTTtnQkFDcEIsY0FBYyxFQUFFLFFBQVE7YUFDekIsQ0FDRjtTQUNGLENBQUM7UUFDRixNQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTzthQUMzQixLQUFLLENBQUMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7YUFDNUMsR0FBRyxDQUFDO1lBQ0gsUUFBUSxFQUFFLElBQUEsOEJBQWdCLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMzRCxXQUFXLEVBQUUsSUFBSTtTQUNsQixDQUFDO2FBQ0QsRUFBRSxFQUFFLENBQUM7UUFDUixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUFDLE9BQU8sR0FBWSxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN6QyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLFlBQVksRUFBRSxrQkFBa0I7WUFDaEMsS0FBSyxFQUFFO2dCQUNMLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7YUFDbkU7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBRWxDLGlGQUFpRjtBQUMxRSxLQUFLLFVBQVUsYUFBYSxDQUNqQyxHQUFZLEVBQ1osR0FBYTtJQUViLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLGFBQWMsQ0FBQztJQUNyRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHlDQUFtQixFQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWhELElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPO2FBQzNCLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzthQUM3QyxFQUFFLEVBQUUsQ0FBQztRQUNSLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBQUMsT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUN0QixPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsWUFBWSxFQUFFLGtCQUFrQjtZQUNoQyxLQUFLLEVBQUU7Z0JBQ0wsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTthQUNuRTtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZXhwcmVzcywgeyBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gXCJleHByZXNzXCI7XG5pbXBvcnQge1xuICBjb21wcmVzc1Jlc291cmNlLFxuICBkZWNvbXByZXNzUmVzb3VyY2UsXG59IGZyb20gXCIuLi8uLi8uLi8uLi9saWIvY29tcHJlc3Npb25cIjtcbmltcG9ydCB7IGdldEVoclI0RGF0YVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vZHluYW1vL2Voci9yNC9laHItcjQtZGF0YS1zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICBtZXJnZUF1ZGl0SW50b01ldGEsXG4gIHBhdGllbnRUb1B1dEF0dHJzLFxuICB0eXBlIEltcG9ydFBhdGllbnRPcHRpb25zLFxufSBmcm9tIFwiLi4vLi4vLi4vaW1wb3J0LXBhdGllbnRcIjtcblxuY29uc3QgQkFTRV9QQVRIID0gXCIvZWhyL3I0L1BhdGllbnRcIjtcbmNvbnN0IHJvdXRlcjogZXhwcmVzcy5Sb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuY29uc3QgU0sgPSBcIkNVUlJFTlRcIjtcblxuY29uc3QgVEFCTEVfTkFNRSA9IHByb2Nlc3MuZW52LkRZTkFNT19UQUJMRV9OQU1FID8/IFwiamVzdHRlc3R0YWJsZVwiO1xuXG4vKipcbiAqIEdFVCAvZWhyL3I0L1BhdGllbnQg4oCUIHNlYXJjaC9saXN0OiByZXR1cm5zIGEgRkhJUiBCdW5kbGUgKHNlYXJjaHNldCkgZnJvbSB0aGUgZGF0YSBzdG9yZS5cbiAqIFVzZXMgR1NJNCAoUmVzb3VyY2UgVHlwZSBJbmRleCkgdG8gbGlzdCBhbGwgUGF0aWVudHMgaW4gdGhlIHdvcmtzcGFjZSB3aXRob3V0IGEgdGFibGUgc2Nhbi5cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlZHJpZnRlcnMvb3BlbmhpL2Jsb2IvbWFpbi9zaXRlcy93d3ctZG9jcy9jb250ZW50L2FyY2hpdGVjdHVyZS9keW5hbW9kYi1zaW5nbGUtdGFibGUtZGVzaWduLm1kIHwgRHluYW1vREIgU2luZ2xlLVRhYmxlIERlc2lnbn0g4oCUIEdTSTQsIFF1ZXJ5IGFuZCBBY2Nlc3MgUnVsZXMgKG5vIHNjYW5zKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RQYXRpZW50cyhcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCB7IHRlbmFudElkLCB3b3Jrc3BhY2VJZCB9ID0gcmVxLm9wZW5oaUNvbnRleHQhO1xuICBjb25zdCBzZXJ2aWNlID0gZ2V0RWhyUjREYXRhU2VydmljZShUQUJMRV9OQU1FKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZpY2UuZW50aXRpZXMucGF0aWVudC5xdWVyeVxuICAgICAgLmdzaTQoeyB0ZW5hbnRJZCwgd29ya3NwYWNlSWQgfSlcbiAgICAgIC5nbygpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IChyZXN1bHQuZGF0YSA/PyBbXSkubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCByZXNvdXJjZSA9IEpTT04ucGFyc2UoZGVjb21wcmVzc1Jlc291cmNlKGl0ZW0ucmVzb3VyY2UpKSBhcyBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgdW5rbm93blxuICAgICAgPjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZ1bGxVcmw6IGAke0JBU0VfUEFUSH0vJHtpdGVtLmlkfWAsXG4gICAgICAgIHJlc291cmNlOiB7IC4uLnJlc291cmNlLCBpZDogaXRlbS5pZCB9LFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCBidW5kbGUgPSB7XG4gICAgICByZXNvdXJjZVR5cGU6IFwiQnVuZGxlXCIsXG4gICAgICB0eXBlOiBcInNlYXJjaHNldFwiLFxuICAgICAgdG90YWw6IGVudHJpZXMubGVuZ3RoLFxuICAgICAgbGluazogW3sgcmVsYXRpb246IFwic2VsZlwiLCB1cmw6IEJBU0VfUEFUSCB9XSxcbiAgICAgIGVudHJ5OiBlbnRyaWVzLFxuICAgIH07XG4gICAgcmV0dXJuIHJlcy5qc29uKGJ1bmRsZSk7XG4gIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJHRVQgL1BhdGllbnQgbGlzdCBlcnJvcjpcIiwgZXJyKTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgcmVzb3VyY2VUeXBlOiBcIk9wZXJhdGlvbk91dGNvbWVcIixcbiAgICAgIGlzc3VlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzZXZlcml0eTogXCJlcnJvclwiLFxuICAgICAgICAgIGNvZGU6IFwiZXhjZXB0aW9uXCIsXG4gICAgICAgICAgZGlhZ25vc3RpY3M6IFN0cmluZyhlcnIpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufVxuXG5yb3V0ZXIuZ2V0KFwiL1wiLCBsaXN0UGF0aWVudHMpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGF0aWVudEJ5SWQoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgaWQgPSBTdHJpbmcocmVxLnBhcmFtcy5pZCk7XG4gIGNvbnN0IHsgdGVuYW50SWQsIHdvcmtzcGFjZUlkIH0gPSByZXEub3BlbmhpQ29udGV4dCE7XG4gIGNvbnN0IHNlcnZpY2UgPSBnZXRFaHJSNERhdGFTZXJ2aWNlKFRBQkxFX05BTUUpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmljZS5lbnRpdGllcy5wYXRpZW50XG4gICAgICAuZ2V0KHsgdGVuYW50SWQsIHdvcmtzcGFjZUlkLCBpZCwgc2s6IFwiQ1VSUkVOVFwiIH0pXG4gICAgICAuZ28oKTtcblxuICAgIGlmICghcmVzdWx0LmRhdGEpIHtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuanNvbih7XG4gICAgICAgIHJlc291cmNlVHlwZTogXCJPcGVyYXRpb25PdXRjb21lXCIsXG4gICAgICAgIGlzc3VlOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2V2ZXJpdHk6IFwiZXJyb3JcIixcbiAgICAgICAgICAgIGNvZGU6IFwibm90LWZvdW5kXCIsXG4gICAgICAgICAgICBkaWFnbm9zdGljczogYFBhdGllbnQgJHtpZH0gbm90IGZvdW5kYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBKU09OLnBhcnNlKFxuICAgICAgZGVjb21wcmVzc1Jlc291cmNlKHJlc3VsdC5kYXRhLnJlc291cmNlKSxcbiAgICApIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHJldHVybiByZXMuanNvbih7IC4uLnJlc291cmNlLCBpZDogcmVzdWx0LmRhdGEuaWQgfSk7XG4gIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJHRVQgUGF0aWVudCBlcnJvcjpcIiwgZXJyKTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgcmVzb3VyY2VUeXBlOiBcIk9wZXJhdGlvbk91dGNvbWVcIixcbiAgICAgIGlzc3VlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzZXZlcml0eTogXCJlcnJvclwiLFxuICAgICAgICAgIGNvZGU6IFwiZXhjZXB0aW9uXCIsXG4gICAgICAgICAgZGlhZ25vc3RpY3M6IFN0cmluZyhlcnIpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKiogR0VUIC9laHIvcjQvUGF0aWVudC86aWQg4oCUIHJlYWQ6IHJldHVybnMgYSBzaW5nbGUgUGF0aWVudCByZXNvdXJjZSBmcm9tIHRoZSBkYXRhIHN0b3JlIG9yIDQwNC4gKi9cbnJvdXRlci5nZXQoXCIvOmlkXCIsIGdldFBhdGllbnRCeUlkKTtcblxuLyoqIFBPU1QgL2Voci9yNC9QYXRpZW50IOKAlCBjcmVhdGU6IGFjY2VwdHMgUGF0aWVudCBpbiBib2R5LCBwZXJzaXN0cyB2aWEgZGF0YSBzdG9yZSwgcmV0dXJucyAyMDEuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUGF0aWVudChcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBjdHggPSByZXEub3BlbmhpQ29udGV4dCE7XG4gIGNvbnN0IHsgdGVuYW50SWQsIHdvcmtzcGFjZUlkLCBkYXRlLCB1c2VySWQsIHVzZXJuYW1lIH0gPSBjdHg7XG4gIGNvbnN0IGJvZHkgPSByZXEuYm9keSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgaWQgPSAoYm9keT8uaWQgYXMgc3RyaW5nKSA/PyBgcGF0aWVudC0ke0RhdGUubm93KCl9YDtcbiAgY29uc3QgcGF0aWVudCA9IHtcbiAgICAuLi5ib2R5LFxuICAgIHJlc291cmNlVHlwZTogXCJQYXRpZW50XCIsXG4gICAgaWQsXG4gICAgbWV0YToge1xuICAgICAgLi4uKChib2R5Py5tZXRhIGFzIG9iamVjdCkgPz8ge30pLFxuICAgICAgbGFzdFVwZGF0ZWQ6IGRhdGUsXG4gICAgICB2ZXJzaW9uSWQ6IFwiMVwiLFxuICAgIH0sXG4gIH0gYXMgeyByZXNvdXJjZVR5cGU6IHN0cmluZzsgaWQ6IHN0cmluZzsgbWV0YT86IHsgbGFzdFVwZGF0ZWQ/OiBzdHJpbmcgfSB9O1xuICBjb25zdCBvcHRpb25zOiBJbXBvcnRQYXRpZW50T3B0aW9ucyA9IHtcbiAgICB0ZW5hbnRJZCxcbiAgICB3b3Jrc3BhY2VJZCxcbiAgICBjcmVhdGVkRGF0ZTogZGF0ZSxcbiAgICBjcmVhdGVkQnlJZDogdXNlcklkLFxuICAgIGNyZWF0ZWRCeU5hbWU6IHVzZXJuYW1lLFxuICAgIG1vZGlmaWVkRGF0ZTogZGF0ZSxcbiAgICBtb2RpZmllZEJ5SWQ6IHVzZXJJZCxcbiAgICBtb2RpZmllZEJ5TmFtZTogdXNlcm5hbWUsXG4gIH07XG4gIGNvbnN0IHNlcnZpY2UgPSBnZXRFaHJSNERhdGFTZXJ2aWNlKFRBQkxFX05BTUUpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgYXR0cnMgPSBwYXRpZW50VG9QdXRBdHRycyhwYXRpZW50LCBvcHRpb25zKTtcbiAgICBhd2FpdCBzZXJ2aWNlLmVudGl0aWVzLnBhdGllbnRcbiAgICAgIC5wdXQoXG4gICAgICAgIGF0dHJzIGFzIHVua25vd24gYXMgUGFyYW1ldGVyczx0eXBlb2Ygc2VydmljZS5lbnRpdGllcy5wYXRpZW50LnB1dD5bMF0sXG4gICAgICApXG4gICAgICAuZ28oKTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cygyMDEpLmxvY2F0aW9uKGAke0JBU0VfUEFUSH0vJHtpZH1gKS5qc29uKHBhdGllbnQpO1xuICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICBjb25zb2xlLmVycm9yKFwiUE9TVCBQYXRpZW50IGVycm9yOlwiLCBlcnIpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICByZXNvdXJjZVR5cGU6IFwiT3BlcmF0aW9uT3V0Y29tZVwiLFxuICAgICAgaXNzdWU6IFtcbiAgICAgICAgeyBzZXZlcml0eTogXCJlcnJvclwiLCBjb2RlOiBcImV4Y2VwdGlvblwiLCBkaWFnbm9zdGljczogU3RyaW5nKGVycikgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cblxucm91dGVyLnBvc3QoXCIvXCIsIGNyZWF0ZVBhdGllbnQpO1xuXG4vKiogUFVUIC9laHIvcjQvUGF0aWVudC86aWQg4oCUIHVwZGF0ZTogYWNjZXB0cyBQYXRpZW50IGluIGJvZHksIHBlcnNpc3RzIHZpYSBkYXRhIHN0b3JlLCByZXR1cm5zIDIwMC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVQYXRpZW50KFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGNvbnN0IGlkID0gU3RyaW5nKHJlcS5wYXJhbXMuaWQpO1xuICBjb25zdCBjdHggPSByZXEub3BlbmhpQ29udGV4dCE7XG4gIGNvbnN0IHsgdGVuYW50SWQsIHdvcmtzcGFjZUlkLCBkYXRlLCB1c2VySWQsIHVzZXJuYW1lIH0gPSBjdHg7XG4gIGNvbnN0IGJvZHkgPSByZXEuYm9keSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgcGF0aWVudCA9IHtcbiAgICAuLi5ib2R5LFxuICAgIHJlc291cmNlVHlwZTogXCJQYXRpZW50XCIsXG4gICAgaWQsXG4gICAgbWV0YToge1xuICAgICAgLi4uKChib2R5Py5tZXRhIGFzIG9iamVjdCkgPz8ge30pLFxuICAgICAgbGFzdFVwZGF0ZWQ6IGRhdGUsXG4gICAgICB2ZXJzaW9uSWQ6IFwiMlwiLFxuICAgIH0sXG4gIH07XG4gIGNvbnN0IHNlcnZpY2UgPSBnZXRFaHJSNERhdGFTZXJ2aWNlKFRBQkxFX05BTUUpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzZXJ2aWNlLmVudGl0aWVzLnBhdGllbnRcbiAgICAgIC5nZXQoeyB0ZW5hbnRJZCwgd29ya3NwYWNlSWQsIGlkLCBzazogU0sgfSlcbiAgICAgIC5nbygpO1xuICAgIGlmICghZXhpc3RpbmcuZGF0YSkge1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5qc29uKHtcbiAgICAgICAgcmVzb3VyY2VUeXBlOiBcIk9wZXJhdGlvbk91dGNvbWVcIixcbiAgICAgICAgaXNzdWU6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZXZlcml0eTogXCJlcnJvclwiLFxuICAgICAgICAgICAgY29kZTogXCJub3QtZm91bmRcIixcbiAgICAgICAgICAgIGRpYWdub3N0aWNzOiBgUGF0aWVudCAke2lkfSBub3QgZm91bmRgLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmdNZXRhID1cbiAgICAgIGV4aXN0aW5nLmRhdGEucmVzb3VyY2UgIT0gbnVsbFxuICAgICAgICA/IChcbiAgICAgICAgICAgIEpTT04ucGFyc2UoZGVjb21wcmVzc1Jlc291cmNlKGV4aXN0aW5nLmRhdGEucmVzb3VyY2UpKSBhcyB7XG4gICAgICAgICAgICAgIG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApLm1ldGFcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGF0aWVudFdpdGhNZXRhID0ge1xuICAgICAgLi4ucGF0aWVudCxcbiAgICAgIG1ldGE6IG1lcmdlQXVkaXRJbnRvTWV0YShcbiAgICAgICAgKHBhdGllbnQubWV0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCkgPz8gZXhpc3RpbmdNZXRhLFxuICAgICAgICB7XG4gICAgICAgICAgbW9kaWZpZWREYXRlOiBkYXRlLFxuICAgICAgICAgIG1vZGlmaWVkQnlJZDogdXNlcklkLFxuICAgICAgICAgIG1vZGlmaWVkQnlOYW1lOiB1c2VybmFtZSxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgfTtcbiAgICBhd2FpdCBzZXJ2aWNlLmVudGl0aWVzLnBhdGllbnRcbiAgICAgIC5wYXRjaCh7IHRlbmFudElkLCB3b3Jrc3BhY2VJZCwgaWQsIHNrOiBTSyB9KVxuICAgICAgLnNldCh7XG4gICAgICAgIHJlc291cmNlOiBjb21wcmVzc1Jlc291cmNlKEpTT04uc3RyaW5naWZ5KHBhdGllbnRXaXRoTWV0YSkpLFxuICAgICAgICBsYXN0VXBkYXRlZDogZGF0ZSxcbiAgICAgIH0pXG4gICAgICAuZ28oKTtcbiAgICByZXR1cm4gcmVzLmpzb24ocGF0aWVudFdpdGhNZXRhKTtcbiAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgY29uc29sZS5lcnJvcihcIlBVVCBQYXRpZW50IGVycm9yOlwiLCBlcnIpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICByZXNvdXJjZVR5cGU6IFwiT3BlcmF0aW9uT3V0Y29tZVwiLFxuICAgICAgaXNzdWU6IFtcbiAgICAgICAgeyBzZXZlcml0eTogXCJlcnJvclwiLCBjb2RlOiBcImV4Y2VwdGlvblwiLCBkaWFnbm9zdGljczogU3RyaW5nKGVycikgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cblxucm91dGVyLnB1dChcIi86aWRcIiwgdXBkYXRlUGF0aWVudCk7XG5cbi8qKiBERUxFVEUgL2Voci9yNC9QYXRpZW50LzppZCDigJQgZGVsZXRlOiByZW1vdmVzIGZyb20gZGF0YSBzdG9yZSwgcmV0dXJucyAyMDQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlUGF0aWVudChcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBpZCA9IFN0cmluZyhyZXEucGFyYW1zLmlkKTtcbiAgY29uc3QgeyB0ZW5hbnRJZCwgd29ya3NwYWNlSWQgfSA9IHJlcS5vcGVuaGlDb250ZXh0ITtcbiAgY29uc3Qgc2VydmljZSA9IGdldEVoclI0RGF0YVNlcnZpY2UoVEFCTEVfTkFNRSk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBzZXJ2aWNlLmVudGl0aWVzLnBhdGllbnRcbiAgICAgIC5kZWxldGUoeyB0ZW5hbnRJZCwgd29ya3NwYWNlSWQsIGlkLCBzazogU0sgfSlcbiAgICAgIC5nbygpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDIwNCkuc2VuZCgpO1xuICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICBjb25zb2xlLmVycm9yKFwiREVMRVRFIFBhdGllbnQgZXJyb3I6XCIsIGVycik7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHJlc291cmNlVHlwZTogXCJPcGVyYXRpb25PdXRjb21lXCIsXG4gICAgICBpc3N1ZTogW1xuICAgICAgICB7IHNldmVyaXR5OiBcImVycm9yXCIsIGNvZGU6IFwiZXhjZXB0aW9uXCIsIGRpYWdub3N0aWNzOiBTdHJpbmcoZXJyKSB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufVxuXG5yb3V0ZXIuZGVsZXRlKFwiLzppZFwiLCBkZWxldGVQYXRpZW50KTtcblxuZXhwb3J0IHsgcm91dGVyIGFzIHBhdGllbnRSb3V0ZXIgfTtcbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const rest_api_1 = require("./rest-api");
4
+ const port = 3000;
5
+ rest_api_1.app.listen(port, () => {
6
+ console.log(`POC app listening at http://localhost:${port}`);
7
+ });
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1hcGktbG9jYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YS9yZXN0LWFwaS9yZXN0LWFwaS1sb2NhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlDQUFpQztBQUVqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7QUFFbEIsY0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFO0lBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMseUNBQXlDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDL0QsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhcHAgfSBmcm9tIFwiLi9yZXN0LWFwaVwiO1xuXG5jb25zdCBwb3J0ID0gMzAwMDtcblxuYXBwLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG4gIGNvbnNvbGUubG9nKGBQT0MgYXBwIGxpc3RlbmluZyBhdCBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gKTtcbn0pO1xuIl19
@@ -0,0 +1,7 @@
1
+ interface Dictionary {
2
+ [key: string]: object;
3
+ }
4
+ declare const patientsMock: Dictionary;
5
+ declare const careTeamParticipantsMock: Dictionary;
6
+ declare const organizationsMock: Dictionary;
7
+ export { patientsMock, careTeamParticipantsMock, organizationsMock };