cmp-aws-database 2.1.2-dev.6 → 2.1.2-dev.60

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 (51) hide show
  1. package/dist/config/table-names.d.ts +10 -0
  2. package/dist/config/table-names.js +11 -1
  3. package/dist/customer-user/accompaniments/accompaniments-model.d.ts +1 -0
  4. package/dist/customer-user/accompaniments/accompaniments-model.js +5 -1
  5. package/dist/customer-user/add-ons/add-ons-model.d.ts +3 -0
  6. package/dist/customer-user/add-ons/add-ons-model.js +13 -1
  7. package/dist/customer-user/browse-history/browse-history-dao.d.ts +122 -0
  8. package/dist/customer-user/browse-history/browse-history-dao.js +173 -0
  9. package/dist/customer-user/browse-history/browse-history-model.d.ts +31 -0
  10. package/dist/customer-user/browse-history/browse-history-model.js +118 -0
  11. package/dist/customer-user/cart/cart-model.d.ts +7 -0
  12. package/dist/customer-user/cart/cart-model.js +25 -2
  13. package/dist/customer-user/catalogue/catalogue-items-model.js +5 -1
  14. package/dist/customer-user/category/category-dao.d.ts +29 -0
  15. package/dist/customer-user/category/category-dao.js +52 -1
  16. package/dist/customer-user/category/category-model.d.ts +1 -0
  17. package/dist/customer-user/category/category-model.js +5 -1
  18. package/dist/customer-user/cutlery/cutlery-model.d.ts +2 -0
  19. package/dist/customer-user/cutlery/cutlery-model.js +9 -1
  20. package/dist/customer-user/default-platter/default-platters-model.d.ts +2 -0
  21. package/dist/customer-user/default-platter/default-platters-model.js +9 -1
  22. package/dist/customer-user/fmpRequestCallback/fmp-request-callback-model.d.ts +1 -0
  23. package/dist/customer-user/fmpRequestCallback/fmp-request-callback-model.js +5 -1
  24. package/dist/customer-user/items-bundle/items-bundle-dao.d.ts +72 -0
  25. package/dist/customer-user/items-bundle/items-bundle-dao.js +117 -0
  26. package/dist/customer-user/items-bundle/items-bundle-model.d.ts +23 -0
  27. package/dist/customer-user/items-bundle/items-bundle-model.js +62 -0
  28. package/dist/customer-user/lsq-priority-updation/lsq-priority-updation-dao.d.ts +140 -0
  29. package/dist/customer-user/lsq-priority-updation/lsq-priority-updation-dao.js +253 -0
  30. package/dist/customer-user/lsq-priority-updation/lsq-priority-updation-model.d.ts +63 -0
  31. package/dist/customer-user/lsq-priority-updation/lsq-priority-updation-model.js +135 -0
  32. package/dist/customer-user/order-module/order/order-model.d.ts +1 -0
  33. package/dist/customer-user/order-module/order/order-model.js +5 -1
  34. package/dist/customer-user/order-module/plate-order/plate-order-model.d.ts +13 -0
  35. package/dist/customer-user/order-module/plate-order/plate-order-model.js +46 -2
  36. package/dist/customer-user/order-module/tracking/tracking-model.d.ts +9 -0
  37. package/dist/customer-user/order-module/tracking/tracking-model.js +33 -2
  38. package/dist/customer-user/replace-items/replace-items-model.d.ts +1 -0
  39. package/dist/customer-user/replace-items/replace-items-model.js +5 -1
  40. package/dist/customer-user/resume-journey/resume-journey-model.d.ts +11 -0
  41. package/dist/customer-user/resume-journey/resume-journey-model.js +41 -2
  42. package/dist/customer-user/testing-session/testing-session-dao.d.ts +86 -0
  43. package/dist/customer-user/testing-session/testing-session-dao.js +149 -0
  44. package/dist/customer-user/testing-session/testing-session-model.d.ts +30 -0
  45. package/dist/customer-user/testing-session/testing-session-model.js +104 -0
  46. package/dist/patner-third-party/third-party-api-key/third-party-api-key-dao.d.ts +114 -0
  47. package/dist/patner-third-party/third-party-api-key/third-party-api-key-dao.js +225 -0
  48. package/dist/patner-third-party/third-party-api-key/third-party-api-key-model.d.ts +21 -0
  49. package/dist/patner-third-party/third-party-api-key/third-party-api-key-model.js +70 -0
  50. package/index.js +3 -1
  51. package/package.json +1 -1
@@ -0,0 +1,117 @@
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.itemsBundleDao = void 0;
7
+ const dynamoose_1 = __importDefault(require("dynamoose"));
8
+ const base_dynamoose_dao_1 = require("../../base-dynamoose-dao");
9
+ const items_bundle_model_1 = require("./items-bundle-model");
10
+ /**
11
+ * DAO for item bundles (add-on / replacement groupings).
12
+ *
13
+ * Table keys: `bundleId` (PK).
14
+ * Lookups:
15
+ * - `usageTypeIndex` → bundles by ADDON / REPLACEMENT
16
+ * - `bundleTypeIndex` → bundles by `bundleType`
17
+ */
18
+ class ItemsBundleDao extends base_dynamoose_dao_1.GenericDynamooseDAO {
19
+ constructor() {
20
+ super(items_bundle_model_1.ItemsBundleModel, "bundleId");
21
+ /**
22
+ * Creates one item-bundle record.
23
+ *
24
+ * Use when: admin defines a new ADDON or REPLACEMENT bundle.
25
+ * - `bundleId` auto-generates if omitted.
26
+ * - `usageType` must be `"ADDON"` or `"REPLACEMENT"`.
27
+ *
28
+ * @example
29
+ * await itemsBundleDao.save({
30
+ * bundleType: "STARTERS",
31
+ * bundleName: "Premium Starters Pack",
32
+ * usageType: "ADDON"
33
+ * });
34
+ */
35
+ this.save = async (item, authContext) => {
36
+ return super.save(item, authContext);
37
+ };
38
+ /**
39
+ * Updates one item-bundle by `bundleId`.
40
+ *
41
+ * Use when: renaming a bundle or changing ADDON ↔ REPLACEMENT usage.
42
+ *
43
+ * @example
44
+ * await itemsBundleDao.update("bundle-uuid", { usageType: "REPLACEMENT" });
45
+ */
46
+ this.update = async (bundleId, updates, authContext) => {
47
+ const updated = await items_bundle_model_1.ItemsBundleModel.update({ bundleId }, {
48
+ ...updates,
49
+ updated_time: new Date(),
50
+ updated_user: authContext?.userSub
51
+ }, {
52
+ condition: new dynamoose_1.default.Condition().attribute("bundleId").exists()
53
+ });
54
+ return updated;
55
+ };
56
+ /**
57
+ * Fetches one item-bundle by primary key.
58
+ *
59
+ * @example
60
+ * const bundle = await itemsBundleDao.getById("bundle-uuid");
61
+ */
62
+ this.getById = async (bundleId) => this.get(bundleId);
63
+ /**
64
+ * Lists bundles by usage type — ADDON or REPLACEMENT (GSI `usageTypeIndex`).
65
+ *
66
+ * Use when: showing only add-on packs or only replacement packs in UI.
67
+ *
68
+ * @example
69
+ * const addons = await itemsBundleDao.listByUsageType("ADDON", 20);
70
+ * const replacements = await itemsBundleDao.listByUsageType("REPLACEMENT", 20);
71
+ */
72
+ this.listByUsageType = async (usageType, limit, token) => {
73
+ const decodedToken = this.decode(token);
74
+ let queryBuilder = items_bundle_model_1.ItemsBundleModel.query("usageType").eq(usageType).using("usageTypeIndex");
75
+ if (decodedToken) {
76
+ queryBuilder = queryBuilder.startAt(decodedToken);
77
+ }
78
+ if (typeof limit === "number") {
79
+ queryBuilder = queryBuilder.limit(limit);
80
+ }
81
+ const queryResult = await queryBuilder.exec();
82
+ return {
83
+ items: queryResult,
84
+ nextToken: await this.encode(queryResult.lastKey)
85
+ };
86
+ };
87
+ /**
88
+ * Lists bundles by `bundleType` (GSI `bundleTypeIndex`).
89
+ *
90
+ * @example
91
+ * const starters = await itemsBundleDao.listByBundleType("STARTERS", 20);
92
+ */
93
+ this.listByBundleType = async (bundleType, limit, token) => {
94
+ const decodedToken = this.decode(token);
95
+ let queryBuilder = items_bundle_model_1.ItemsBundleModel.query("bundleType").eq(bundleType).using("bundleTypeIndex");
96
+ if (decodedToken) {
97
+ queryBuilder = queryBuilder.startAt(decodedToken);
98
+ }
99
+ if (typeof limit === "number") {
100
+ queryBuilder = queryBuilder.limit(limit);
101
+ }
102
+ const queryResult = await queryBuilder.exec();
103
+ return {
104
+ items: queryResult,
105
+ nextToken: await this.encode(queryResult.lastKey)
106
+ };
107
+ };
108
+ /**
109
+ * Deletes one item-bundle by primary key.
110
+ */
111
+ this.deleteById = async (bundleId) => {
112
+ await this.delete(bundleId);
113
+ };
114
+ }
115
+ }
116
+ exports.itemsBundleDao = new ItemsBundleDao();
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbXMtYnVuZGxlLWRhby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jdXN0b21lci11c2VyL2l0ZW1zLWJ1bmRsZS9pdGVtcy1idW5kbGUtZGFvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBEQUFrQztBQUNsQyxpRUFBMEU7QUFFMUUsNkRBSzhCO0FBTzlCOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLGNBQWUsU0FBUSx3Q0FBZ0M7SUFDekQ7UUFDSSxLQUFLLENBQUMscUNBQWdCLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFHeEM7Ozs7Ozs7Ozs7Ozs7V0FhRztRQUNILFNBQUksR0FBRyxLQUFLLEVBQUUsSUFBNEIsRUFBRSxXQUF5QixFQUF3QixFQUFFO1lBQzNGLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFtQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3hELENBQUMsQ0FBQztRQUVGOzs7Ozs7O1dBT0c7UUFDSCxXQUFNLEdBQUcsS0FBSyxFQUNWLFFBQWdCLEVBQ2hCLE9BQTZCLEVBQzdCLFdBQXlCLEVBQ0wsRUFBRTtZQUN0QixNQUFNLE9BQU8sR0FBRyxNQUFNLHFDQUFnQixDQUFDLE1BQU0sQ0FDekMsRUFBRSxRQUFRLEVBQUUsRUFDWjtnQkFDSSxHQUFHLE9BQU87Z0JBQ1YsWUFBWSxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUN4QixZQUFZLEVBQUUsV0FBVyxFQUFFLE9BQU87YUFDckMsRUFDRDtnQkFDSSxTQUFTLEVBQUUsSUFBSSxtQkFBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEVBQUU7YUFDdEUsQ0FDSixDQUFDO1lBQ0YsT0FBTyxPQUFpQyxDQUFDO1FBQzdDLENBQUMsQ0FBQztRQUVGOzs7OztXQUtHO1FBQ0gsWUFBTyxHQUFHLEtBQUssRUFBRSxRQUFnQixFQUErQixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV0Rjs7Ozs7Ozs7V0FRRztRQUNILG9CQUFlLEdBQUcsS0FBSyxFQUNuQixTQUE4QixFQUM5QixLQUFjLEVBQ2QsS0FBYyxFQUNLLEVBQUU7WUFDckIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxJQUFJLFlBQVksR0FBRyxxQ0FBZ0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzdGLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2YsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdEQsQ0FBQztZQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzVCLFlBQVksR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCxNQUFNLFdBQVcsR0FBRyxNQUFNLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5QyxPQUFPO2dCQUNILEtBQUssRUFBRSxXQUF1QztnQkFDOUMsU0FBUyxFQUFFLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBZ0MsQ0FBQzthQUM3RSxDQUFDO1FBQ04sQ0FBQyxDQUFDO1FBRUY7Ozs7O1dBS0c7UUFDSCxxQkFBZ0IsR0FBRyxLQUFLLEVBQ3BCLFVBQWtCLEVBQ2xCLEtBQWMsRUFDZCxLQUFjLEVBQ0ssRUFBRTtZQUNyQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLElBQUksWUFBWSxHQUFHLHFDQUFnQixDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDaEcsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDZixZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN0RCxDQUFDO1lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDNUIsWUFBWSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0MsQ0FBQztZQUNELE1BQU0sV0FBVyxHQUFHLE1BQU0sWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzlDLE9BQU87Z0JBQ0gsS0FBSyxFQUFFLFdBQXVDO2dCQUM5QyxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFnQyxDQUFDO2FBQzdFLENBQUM7UUFDTixDQUFDLENBQUM7UUFFRjs7V0FFRztRQUNILGVBQVUsR0FBRyxLQUFLLEVBQUUsUUFBZ0IsRUFBaUIsRUFBRTtZQUNuRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDO0lBbkhGLENBQUM7Q0FvSEo7QUFFWSxRQUFBLGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGR5bmFtb29zZSBmcm9tIFwiZHluYW1vb3NlXCI7XG5pbXBvcnQgeyBEeW5hbW9LZXksIEdlbmVyaWNEeW5hbW9vc2VEQU8gfSBmcm9tIFwiLi4vLi4vYmFzZS1keW5hbW9vc2UtZGFvXCI7XG5pbXBvcnQgeyBBdXRoQ29udGV4dCB9IGZyb20gXCIuLi8uLi9iYXNlLWR5bmFtb29zZS1tb2RlbFwiO1xuaW1wb3J0IHtcbiAgICBDcmVhdGVJdGVtc0J1bmRsZUlucHV0LFxuICAgIEl0ZW1CdW5kbGVVc2FnZVR5cGUsXG4gICAgSXRlbXNCdW5kbGUsXG4gICAgSXRlbXNCdW5kbGVNb2RlbFxufSBmcm9tIFwiLi9pdGVtcy1idW5kbGUtbW9kZWxcIjtcblxudHlwZSBMaXN0UmVzdWx0ID0ge1xuICAgIGl0ZW1zOiBJdGVtc0J1bmRsZVtdO1xuICAgIG5leHRUb2tlbj86IHN0cmluZztcbn07XG5cbi8qKlxuICogREFPIGZvciBpdGVtIGJ1bmRsZXMgKGFkZC1vbiAvIHJlcGxhY2VtZW50IGdyb3VwaW5ncykuXG4gKlxuICogVGFibGUga2V5czogYGJ1bmRsZUlkYCAoUEspLlxuICogTG9va3VwczpcbiAqIC0gYHVzYWdlVHlwZUluZGV4YCDihpIgYnVuZGxlcyBieSBBRERPTiAvIFJFUExBQ0VNRU5UXG4gKiAtIGBidW5kbGVUeXBlSW5kZXhgIOKGkiBidW5kbGVzIGJ5IGBidW5kbGVUeXBlYFxuICovXG5jbGFzcyBJdGVtc0J1bmRsZURhbyBleHRlbmRzIEdlbmVyaWNEeW5hbW9vc2VEQU88SXRlbXNCdW5kbGU+IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoSXRlbXNCdW5kbGVNb2RlbCwgXCJidW5kbGVJZFwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG9uZSBpdGVtLWJ1bmRsZSByZWNvcmQuXG4gICAgICpcbiAgICAgKiBVc2Ugd2hlbjogYWRtaW4gZGVmaW5lcyBhIG5ldyBBRERPTiBvciBSRVBMQUNFTUVOVCBidW5kbGUuXG4gICAgICogLSBgYnVuZGxlSWRgIGF1dG8tZ2VuZXJhdGVzIGlmIG9taXR0ZWQuXG4gICAgICogLSBgdXNhZ2VUeXBlYCBtdXN0IGJlIGBcIkFERE9OXCJgIG9yIGBcIlJFUExBQ0VNRU5UXCJgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBhd2FpdCBpdGVtc0J1bmRsZURhby5zYXZlKHtcbiAgICAgKiAgICAgYnVuZGxlVHlwZTogXCJTVEFSVEVSU1wiLFxuICAgICAqICAgICBidW5kbGVOYW1lOiBcIlByZW1pdW0gU3RhcnRlcnMgUGFja1wiLFxuICAgICAqICAgICB1c2FnZVR5cGU6IFwiQURET05cIlxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHNhdmUgPSBhc3luYyAoaXRlbTogQ3JlYXRlSXRlbXNCdW5kbGVJbnB1dCwgYXV0aENvbnRleHQ/OiBBdXRoQ29udGV4dCk6IFByb21pc2U8SXRlbXNCdW5kbGU+ID0+IHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnNhdmUoaXRlbSBhcyBJdGVtc0J1bmRsZSwgYXV0aENvbnRleHQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIG9uZSBpdGVtLWJ1bmRsZSBieSBgYnVuZGxlSWRgLlxuICAgICAqXG4gICAgICogVXNlIHdoZW46IHJlbmFtaW5nIGEgYnVuZGxlIG9yIGNoYW5naW5nIEFERE9OIOKGlCBSRVBMQUNFTUVOVCB1c2FnZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYXdhaXQgaXRlbXNCdW5kbGVEYW8udXBkYXRlKFwiYnVuZGxlLXV1aWRcIiwgeyB1c2FnZVR5cGU6IFwiUkVQTEFDRU1FTlRcIiB9KTtcbiAgICAgKi9cbiAgICB1cGRhdGUgPSBhc3luYyAoXG4gICAgICAgIGJ1bmRsZUlkOiBzdHJpbmcsXG4gICAgICAgIHVwZGF0ZXM6IFBhcnRpYWw8SXRlbXNCdW5kbGU+LFxuICAgICAgICBhdXRoQ29udGV4dD86IEF1dGhDb250ZXh0XG4gICAgKTogUHJvbWlzZTxJdGVtc0J1bmRsZT4gPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgSXRlbXNCdW5kbGVNb2RlbC51cGRhdGUoXG4gICAgICAgICAgICB7IGJ1bmRsZUlkIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4udXBkYXRlcyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkX3RpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgdXBkYXRlZF91c2VyOiBhdXRoQ29udGV4dD8udXNlclN1YlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25kaXRpb246IG5ldyBkeW5hbW9vc2UuQ29uZGl0aW9uKCkuYXR0cmlidXRlKFwiYnVuZGxlSWRcIikuZXhpc3RzKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZWQgYXMgdW5rbm93biBhcyBJdGVtc0J1bmRsZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBvbmUgaXRlbS1idW5kbGUgYnkgcHJpbWFyeSBrZXkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGJ1bmRsZSA9IGF3YWl0IGl0ZW1zQnVuZGxlRGFvLmdldEJ5SWQoXCJidW5kbGUtdXVpZFwiKTtcbiAgICAgKi9cbiAgICBnZXRCeUlkID0gYXN5bmMgKGJ1bmRsZUlkOiBzdHJpbmcpOiBQcm9taXNlPEl0ZW1zQnVuZGxlIHwgbnVsbD4gPT4gdGhpcy5nZXQoYnVuZGxlSWQpO1xuXG4gICAgLyoqXG4gICAgICogTGlzdHMgYnVuZGxlcyBieSB1c2FnZSB0eXBlIOKAlCBBRERPTiBvciBSRVBMQUNFTUVOVCAoR1NJIGB1c2FnZVR5cGVJbmRleGApLlxuICAgICAqXG4gICAgICogVXNlIHdoZW46IHNob3dpbmcgb25seSBhZGQtb24gcGFja3Mgb3Igb25seSByZXBsYWNlbWVudCBwYWNrcyBpbiBVSS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgYWRkb25zID0gYXdhaXQgaXRlbXNCdW5kbGVEYW8ubGlzdEJ5VXNhZ2VUeXBlKFwiQURET05cIiwgMjApO1xuICAgICAqIGNvbnN0IHJlcGxhY2VtZW50cyA9IGF3YWl0IGl0ZW1zQnVuZGxlRGFvLmxpc3RCeVVzYWdlVHlwZShcIlJFUExBQ0VNRU5UXCIsIDIwKTtcbiAgICAgKi9cbiAgICBsaXN0QnlVc2FnZVR5cGUgPSBhc3luYyAoXG4gICAgICAgIHVzYWdlVHlwZTogSXRlbUJ1bmRsZVVzYWdlVHlwZSxcbiAgICAgICAgbGltaXQ/OiBudW1iZXIsXG4gICAgICAgIHRva2VuPzogc3RyaW5nXG4gICAgKTogUHJvbWlzZTxMaXN0UmVzdWx0PiA9PiB7XG4gICAgICAgIGNvbnN0IGRlY29kZWRUb2tlbiA9IHRoaXMuZGVjb2RlKHRva2VuKTtcbiAgICAgICAgbGV0IHF1ZXJ5QnVpbGRlciA9IEl0ZW1zQnVuZGxlTW9kZWwucXVlcnkoXCJ1c2FnZVR5cGVcIikuZXEodXNhZ2VUeXBlKS51c2luZyhcInVzYWdlVHlwZUluZGV4XCIpO1xuICAgICAgICBpZiAoZGVjb2RlZFRva2VuKSB7XG4gICAgICAgICAgICBxdWVyeUJ1aWxkZXIgPSBxdWVyeUJ1aWxkZXIuc3RhcnRBdChkZWNvZGVkVG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbGltaXQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHF1ZXJ5QnVpbGRlciA9IHF1ZXJ5QnVpbGRlci5saW1pdChsaW1pdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcXVlcnlSZXN1bHQgPSBhd2FpdCBxdWVyeUJ1aWxkZXIuZXhlYygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXRlbXM6IHF1ZXJ5UmVzdWx0IGFzIHVua25vd24gYXMgSXRlbXNCdW5kbGVbXSxcbiAgICAgICAgICAgIG5leHRUb2tlbjogYXdhaXQgdGhpcy5lbmNvZGUocXVlcnlSZXN1bHQubGFzdEtleSBhcyBEeW5hbW9LZXkgfCB1bmRlZmluZWQpXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExpc3RzIGJ1bmRsZXMgYnkgYGJ1bmRsZVR5cGVgIChHU0kgYGJ1bmRsZVR5cGVJbmRleGApLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzdGFydGVycyA9IGF3YWl0IGl0ZW1zQnVuZGxlRGFvLmxpc3RCeUJ1bmRsZVR5cGUoXCJTVEFSVEVSU1wiLCAyMCk7XG4gICAgICovXG4gICAgbGlzdEJ5QnVuZGxlVHlwZSA9IGFzeW5jIChcbiAgICAgICAgYnVuZGxlVHlwZTogc3RyaW5nLFxuICAgICAgICBsaW1pdD86IG51bWJlcixcbiAgICAgICAgdG9rZW4/OiBzdHJpbmdcbiAgICApOiBQcm9taXNlPExpc3RSZXN1bHQ+ID0+IHtcbiAgICAgICAgY29uc3QgZGVjb2RlZFRva2VuID0gdGhpcy5kZWNvZGUodG9rZW4pO1xuICAgICAgICBsZXQgcXVlcnlCdWlsZGVyID0gSXRlbXNCdW5kbGVNb2RlbC5xdWVyeShcImJ1bmRsZVR5cGVcIikuZXEoYnVuZGxlVHlwZSkudXNpbmcoXCJidW5kbGVUeXBlSW5kZXhcIik7XG4gICAgICAgIGlmIChkZWNvZGVkVG9rZW4pIHtcbiAgICAgICAgICAgIHF1ZXJ5QnVpbGRlciA9IHF1ZXJ5QnVpbGRlci5zdGFydEF0KGRlY29kZWRUb2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsaW1pdCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcXVlcnlCdWlsZGVyID0gcXVlcnlCdWlsZGVyLmxpbWl0KGxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBxdWVyeVJlc3VsdCA9IGF3YWl0IHF1ZXJ5QnVpbGRlci5leGVjKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpdGVtczogcXVlcnlSZXN1bHQgYXMgdW5rbm93biBhcyBJdGVtc0J1bmRsZVtdLFxuICAgICAgICAgICAgbmV4dFRva2VuOiBhd2FpdCB0aGlzLmVuY29kZShxdWVyeVJlc3VsdC5sYXN0S2V5IGFzIER5bmFtb0tleSB8IHVuZGVmaW5lZClcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGVsZXRlcyBvbmUgaXRlbS1idW5kbGUgYnkgcHJpbWFyeSBrZXkuXG4gICAgICovXG4gICAgZGVsZXRlQnlJZCA9IGFzeW5jIChidW5kbGVJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlKGJ1bmRsZUlkKTtcbiAgICB9O1xufVxuXG5leHBvcnQgY29uc3QgaXRlbXNCdW5kbGVEYW8gPSBuZXcgSXRlbXNCdW5kbGVEYW8oKTtcbiJdfQ==
@@ -0,0 +1,23 @@
1
+ import { BaseDynamooseModel } from "../../base-dynamoose-model";
2
+ /**
3
+ * Decides how the bundle is applied on a platter item.
4
+ * - ADDON → extra items added on top of the platter
5
+ * - REPLACEMENT → swaps an existing platter item
6
+ */
7
+ export declare const ITEM_BUNDLE_USAGE_TYPE: {
8
+ readonly ADDON: "ADDON";
9
+ readonly REPLACEMENT: "REPLACEMENT";
10
+ };
11
+ export type ItemBundleUsageType = (typeof ITEM_BUNDLE_USAGE_TYPE)[keyof typeof ITEM_BUNDLE_USAGE_TYPE];
12
+ export interface ItemsBundle extends BaseDynamooseModel {
13
+ bundleId: string;
14
+ bundleType: string;
15
+ bundleName: string;
16
+ usageType: ItemBundleUsageType;
17
+ bundleOrder?: number;
18
+ }
19
+ export type CreateItemsBundleInput = Omit<ItemsBundle, "bundleId"> & {
20
+ bundleId?: string;
21
+ };
22
+ export declare const ItemsBundleModel: import("dynamoose/dist/General").ModelType<ItemsBundle>;
23
+ export declare const convertToItemsBundleModel: (input: CreateItemsBundleInput | ItemsBundle) => ItemsBundle;
@@ -0,0 +1,62 @@
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.convertToItemsBundleModel = exports.ItemsBundleModel = exports.ITEM_BUNDLE_USAGE_TYPE = void 0;
7
+ const dynamoose_1 = __importDefault(require("dynamoose"));
8
+ const crypto_1 = require("crypto");
9
+ const base_dynamoose_model_1 = require("../../base-dynamoose-model");
10
+ const table_names_1 = require("../../config/table-names");
11
+ /**
12
+ * Decides how the bundle is applied on a platter item.
13
+ * - ADDON → extra items added on top of the platter
14
+ * - REPLACEMENT → swaps an existing platter item
15
+ */
16
+ exports.ITEM_BUNDLE_USAGE_TYPE = {
17
+ ADDON: "ADDON",
18
+ REPLACEMENT: "REPLACEMENT"
19
+ };
20
+ const itemsBundleSchema = new dynamoose_1.default.Schema({
21
+ bundleId: {
22
+ type: String,
23
+ hashKey: true,
24
+ required: true,
25
+ default: () => (0, crypto_1.randomUUID)()
26
+ },
27
+ bundleType: {
28
+ type: String,
29
+ required: true,
30
+ index: {
31
+ name: "bundleTypeIndex",
32
+ type: "global"
33
+ }
34
+ },
35
+ bundleName: {
36
+ type: String,
37
+ required: true
38
+ },
39
+ bundleOrder: {
40
+ type: Number,
41
+ required: false
42
+ },
43
+ usageType: {
44
+ type: String,
45
+ required: true,
46
+ enum: [exports.ITEM_BUNDLE_USAGE_TYPE.ADDON, exports.ITEM_BUNDLE_USAGE_TYPE.REPLACEMENT],
47
+ index: {
48
+ name: "usageTypeIndex",
49
+ type: "global"
50
+ }
51
+ },
52
+ ...base_dynamoose_model_1.BASE_DYNAMOOSE_AUDIT_SCHEMA
53
+ }, {
54
+ saveUnknown: false,
55
+ timestamps: true
56
+ });
57
+ exports.ItemsBundleModel = dynamoose_1.default.model(table_names_1.TABLE_NAMES.ITEMS_BUNDLE, itemsBundleSchema, { create: false, waitForActive: false });
58
+ const convertToItemsBundleModel = (input) => {
59
+ return new exports.ItemsBundleModel(input);
60
+ };
61
+ exports.convertToItemsBundleModel = convertToItemsBundleModel;
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbXMtYnVuZGxlLW1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2N1c3RvbWVyLXVzZXIvaXRlbXMtYnVuZGxlL2l0ZW1zLWJ1bmRsZS1tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwwREFBa0M7QUFDbEMsbUNBQW9DO0FBQ3BDLHFFQUE2RjtBQUM3RiwwREFBdUQ7QUFFdkQ7Ozs7R0FJRztBQUNVLFFBQUEsc0JBQXNCLEdBQUc7SUFDbEMsS0FBSyxFQUFFLE9BQU87SUFDZCxXQUFXLEVBQUUsYUFBYTtDQUNwQixDQUFDO0FBaUJYLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxtQkFBUyxDQUFDLE1BQU0sQ0FDMUM7SUFDSSxRQUFRLEVBQUU7UUFDTixJQUFJLEVBQUUsTUFBTTtRQUNaLE9BQU8sRUFBRSxJQUFJO1FBQ2IsUUFBUSxFQUFFLElBQUk7UUFDZCxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBQSxtQkFBVSxHQUFFO0tBQzlCO0lBQ0QsVUFBVSxFQUFFO1FBQ1IsSUFBSSxFQUFFLE1BQU07UUFDWixRQUFRLEVBQUUsSUFBSTtRQUNkLEtBQUssRUFBRTtZQUNILElBQUksRUFBRSxpQkFBaUI7WUFDdkIsSUFBSSxFQUFFLFFBQVE7U0FDakI7S0FDSjtJQUNELFVBQVUsRUFBRTtRQUNSLElBQUksRUFBRSxNQUFNO1FBQ1osUUFBUSxFQUFFLElBQUk7S0FDakI7SUFDRCxXQUFXLEVBQUU7UUFDVCxJQUFJLEVBQUUsTUFBTTtRQUNaLFFBQVEsRUFBRSxLQUFLO0tBQ2xCO0lBQ0QsU0FBUyxFQUFFO1FBQ1AsSUFBSSxFQUFFLE1BQU07UUFDWixRQUFRLEVBQUUsSUFBSTtRQUNkLElBQUksRUFBRSxDQUFDLDhCQUFzQixDQUFDLEtBQUssRUFBRSw4QkFBc0IsQ0FBQyxXQUFXLENBQUM7UUFDeEUsS0FBSyxFQUFFO1lBQ0gsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixJQUFJLEVBQUUsUUFBUTtTQUNqQjtLQUNKO0lBQ0QsR0FBRyxrREFBMkI7Q0FDakMsRUFDRDtJQUNJLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxJQUFJO0NBQ25CLENBQ0osQ0FBQztBQUVXLFFBQUEsZ0JBQWdCLEdBQUcsbUJBQVMsQ0FBQyxLQUFLLENBQzNDLHlCQUFXLENBQUMsWUFBWSxFQUN4QixpQkFBaUIsRUFDakIsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FDMUMsQ0FBQztBQUVLLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxLQUEyQyxFQUFFLEVBQUU7SUFDckYsT0FBTyxJQUFJLHdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3ZDLENBQUMsQ0FBQztBQUZXLFFBQUEseUJBQXlCLDZCQUVwQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkeW5hbW9vc2UgZnJvbSBcImR5bmFtb29zZVwiO1xuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IEJBU0VfRFlOQU1PT1NFX0FVRElUX1NDSEVNQSwgQmFzZUR5bmFtb29zZU1vZGVsIH0gZnJvbSBcIi4uLy4uL2Jhc2UtZHluYW1vb3NlLW1vZGVsXCI7XG5pbXBvcnQgeyBUQUJMRV9OQU1FUyB9IGZyb20gXCIuLi8uLi9jb25maWcvdGFibGUtbmFtZXNcIjtcblxuLyoqXG4gKiBEZWNpZGVzIGhvdyB0aGUgYnVuZGxlIGlzIGFwcGxpZWQgb24gYSBwbGF0dGVyIGl0ZW0uXG4gKiAtIEFERE9OIOKGkiBleHRyYSBpdGVtcyBhZGRlZCBvbiB0b3Agb2YgdGhlIHBsYXR0ZXJcbiAqIC0gUkVQTEFDRU1FTlQg4oaSIHN3YXBzIGFuIGV4aXN0aW5nIHBsYXR0ZXIgaXRlbVxuICovXG5leHBvcnQgY29uc3QgSVRFTV9CVU5ETEVfVVNBR0VfVFlQRSA9IHtcbiAgICBBRERPTjogXCJBRERPTlwiLFxuICAgIFJFUExBQ0VNRU5UOiBcIlJFUExBQ0VNRU5UXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEl0ZW1CdW5kbGVVc2FnZVR5cGUgPVxuICAgICh0eXBlb2YgSVRFTV9CVU5ETEVfVVNBR0VfVFlQRSlba2V5b2YgdHlwZW9mIElURU1fQlVORExFX1VTQUdFX1RZUEVdO1xuXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1zQnVuZGxlIGV4dGVuZHMgQmFzZUR5bmFtb29zZU1vZGVsIHtcbiAgICBidW5kbGVJZDogc3RyaW5nO1xuICAgIGJ1bmRsZVR5cGU6IHN0cmluZztcbiAgICBidW5kbGVOYW1lOiBzdHJpbmc7XG4gICAgdXNhZ2VUeXBlOiBJdGVtQnVuZGxlVXNhZ2VUeXBlO1xuICAgIGJ1bmRsZU9yZGVyPzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBDcmVhdGVJdGVtc0J1bmRsZUlucHV0ID0gT21pdDxJdGVtc0J1bmRsZSwgXCJidW5kbGVJZFwiPiAmIHtcbiAgICBidW5kbGVJZD86IHN0cmluZztcbn07XG5cbmNvbnN0IGl0ZW1zQnVuZGxlU2NoZW1hID0gbmV3IGR5bmFtb29zZS5TY2hlbWEoXG4gICAge1xuICAgICAgICBidW5kbGVJZDoge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgaGFzaEtleTogdHJ1ZSxcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgZGVmYXVsdDogKCkgPT4gcmFuZG9tVVVJRCgpXG4gICAgICAgIH0sXG4gICAgICAgIGJ1bmRsZVR5cGU6IHtcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgaW5kZXg6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImJ1bmRsZVR5cGVJbmRleFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiZ2xvYmFsXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYnVuZGxlTmFtZToge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgYnVuZGxlT3JkZXI6IHtcbiAgICAgICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICB1c2FnZVR5cGU6IHtcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgZW51bTogW0lURU1fQlVORExFX1VTQUdFX1RZUEUuQURET04sIElURU1fQlVORExFX1VTQUdFX1RZUEUuUkVQTEFDRU1FTlRdLFxuICAgICAgICAgICAgaW5kZXg6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcInVzYWdlVHlwZUluZGV4XCIsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJnbG9iYWxcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAuLi5CQVNFX0RZTkFNT09TRV9BVURJVF9TQ0hFTUFcbiAgICB9LFxuICAgIHtcbiAgICAgICAgc2F2ZVVua25vd246IGZhbHNlLFxuICAgICAgICB0aW1lc3RhbXBzOiB0cnVlXG4gICAgfVxuKTtcblxuZXhwb3J0IGNvbnN0IEl0ZW1zQnVuZGxlTW9kZWwgPSBkeW5hbW9vc2UubW9kZWw8SXRlbXNCdW5kbGU+KFxuICAgIFRBQkxFX05BTUVTLklURU1TX0JVTkRMRSxcbiAgICBpdGVtc0J1bmRsZVNjaGVtYSxcbiAgICB7IGNyZWF0ZTogZmFsc2UsIHdhaXRGb3JBY3RpdmU6IGZhbHNlIH1cbik7XG5cbmV4cG9ydCBjb25zdCBjb252ZXJ0VG9JdGVtc0J1bmRsZU1vZGVsID0gKGlucHV0OiBDcmVhdGVJdGVtc0J1bmRsZUlucHV0IHwgSXRlbXNCdW5kbGUpID0+IHtcbiAgICByZXR1cm4gbmV3IEl0ZW1zQnVuZGxlTW9kZWwoaW5wdXQpO1xufTtcbiJdfQ==
@@ -0,0 +1,140 @@
1
+ import { GenericDynamooseDAO } from "../../base-dynamoose-dao";
2
+ import { AuthContext } from "../../base-dynamoose-model";
3
+ import { CreateLsqPriorityUpdationInput, LsqPassedStr, LsqPriorityUpdation } from "./lsq-priority-updation-model";
4
+ type ListResult = {
5
+ items: LsqPriorityUpdation[];
6
+ nextToken?: string;
7
+ };
8
+ /**
9
+ * DAO for LeadSquared priority-updation queue.
10
+ *
11
+ * Table keys: `lsqPriorityUpdationId` (PK).
12
+ * Lookups:
13
+ * - `opportunityIdIndex` → by LeadSquared `opportunityId`
14
+ * - `leadNumberIndex` → by lead phone/number
15
+ * - `statusIndex` → by record `status`
16
+ * - `passedStrIndex` → unprocessed queue (`passedStr` + `priorityRank`)
17
+ * Processed rows are deleted from the table (not soft-flagged).
18
+ */
19
+ declare class LsqPriorityUpdationDao extends GenericDynamooseDAO<LsqPriorityUpdation> {
20
+ constructor();
21
+ private normalizeInput;
22
+ /**
23
+ * Creates / queues one opportunity for priority updation.
24
+ *
25
+ * Use when: LeadSquared webhook receives a new/updated opportunity.
26
+ * - `lsqPriorityUpdationId` auto-generates if omitted.
27
+ * - Auto-fills `passedStr` from `passed` (`false` → `"FALSE"`).
28
+ * - Auto-fills `priorityRank` from `priority` (P1→1 … P5→5).
29
+ *
30
+ * @example
31
+ * await lsqPriorityUpdationDao.save({
32
+ * opportunityId: "opp-123",
33
+ * leadNumber: "9876543210",
34
+ * passed: false,
35
+ * priority: "P1",
36
+ * urgency: "U2",
37
+ * value: "V3",
38
+ * eventDate: "2026-07-30",
39
+ * payload: { raw: "webhook-body" }
40
+ * });
41
+ */
42
+ save: (item: CreateLsqPriorityUpdationInput, authContext?: AuthContext) => Promise<LsqPriorityUpdation>;
43
+ /**
44
+ * Updates an existing queued record by `lsqPriorityUpdationId`.
45
+ *
46
+ * Use when: recalculating priority/urgency/value (e.g. midnight job) or
47
+ * refreshing webhook payload fields.
48
+ * - Re-syncs `passedStr` / `priorityRank` when `passed` / `priority` change.
49
+ * - Always refreshes `updatedAt`.
50
+ *
51
+ * @example
52
+ * await lsqPriorityUpdationDao.update("lsq-uuid", {
53
+ * priority: "P2",
54
+ * urgency: "U1",
55
+ * value: "V2"
56
+ * });
57
+ */
58
+ update: (lsqPriorityUpdationId: string, updates: Partial<LsqPriorityUpdation>, authContext?: AuthContext) => Promise<LsqPriorityUpdation>;
59
+ /**
60
+ * Fetches one queue record by table primary key.
61
+ *
62
+ * @example
63
+ * const row = await lsqPriorityUpdationDao.getById("lsq-uuid");
64
+ */
65
+ getById: (lsqPriorityUpdationId: string) => Promise<LsqPriorityUpdation | null>;
66
+ /**
67
+ * Fetches one queue record by LeadSquared `opportunityId` (GSI `opportunityIdIndex`).
68
+ *
69
+ * @example
70
+ * const row = await lsqPriorityUpdationDao.getByOpportunityId("opp-123");
71
+ */
72
+ getByOpportunityId: (opportunityId: string) => Promise<LsqPriorityUpdation | null>;
73
+ /**
74
+ * Lists queue records by LeadSquared `opportunityId` (GSI `opportunityIdIndex`).
75
+ *
76
+ * @example
77
+ * const { items } = await lsqPriorityUpdationDao.listByOpportunityId("opp-123");
78
+ */
79
+ listByOpportunityId: (opportunityId: string, limit?: number, token?: string) => Promise<ListResult>;
80
+ /**
81
+ * Fetches one queue record by `leadNumber` (GSI `leadNumberIndex`).
82
+ *
83
+ * @example
84
+ * const row = await lsqPriorityUpdationDao.getByLeadNumber("9876543210");
85
+ */
86
+ getByLeadNumber: (leadNumber: string) => Promise<LsqPriorityUpdation | null>;
87
+ /**
88
+ * Lists queue records by `leadNumber` (GSI `leadNumberIndex`).
89
+ *
90
+ * @example
91
+ * const { items } = await lsqPriorityUpdationDao.listByLeadNumber("9876543210");
92
+ */
93
+ listByLeadNumber: (leadNumber: string, limit?: number, token?: string) => Promise<ListResult>;
94
+ /**
95
+ * Lists queue records by `status` (GSI `statusIndex`).
96
+ *
97
+ * @example
98
+ * const { items } = await lsqPriorityUpdationDao.listByStatus("PENDING", 25);
99
+ */
100
+ listByStatus: (status: string, limit?: number, token?: string) => Promise<ListResult>;
101
+ /**
102
+ * Lists queued (unprocessed) opportunities sorted by `priorityRank` ascending.
103
+ *
104
+ * Use when: worker pulls next batch of unassigned LSQ priority updates.
105
+ * Queries GSI `passedStrIndex` with `passedStr = "FALSE"`.
106
+ *
107
+ * @example
108
+ * const { items, nextToken } = await lsqPriorityUpdationDao.listUnprocessed(25);
109
+ */
110
+ listUnprocessed: (limit?: number, token?: string) => Promise<ListResult>;
111
+ /**
112
+ * Lists opportunities by `passedStr` (GSI `passedStrIndex`), sorted by `priorityRank`.
113
+ *
114
+ * @example
115
+ * const queued = await lsqPriorityUpdationDao.listByPassedStr("FALSE", 25);
116
+ */
117
+ listByPassedStr: (passedStr: LsqPassedStr, limit?: number, token?: string) => Promise<ListResult>;
118
+ /**
119
+ * Marks a queue row as processed by deleting it via primary key.
120
+ *
121
+ * Use when: worker successfully applied priority update in LeadSquared.
122
+ *
123
+ * @example
124
+ * await lsqPriorityUpdationDao.markProcessed("lsq-uuid");
125
+ */
126
+ markProcessed: (lsqPriorityUpdationId: string) => Promise<void>;
127
+ /**
128
+ * Marks processed by LeadSquared `opportunityId` (lookup GSI, then delete by PK).
129
+ *
130
+ * @example
131
+ * await lsqPriorityUpdationDao.markProcessedByOpportunityId("opp-123");
132
+ */
133
+ markProcessedByOpportunityId: (opportunityId: string) => Promise<boolean>;
134
+ /**
135
+ * Deletes one queue record by primary key.
136
+ */
137
+ deleteById: (lsqPriorityUpdationId: string) => Promise<void>;
138
+ }
139
+ export declare const lsqPriorityUpdationDao: LsqPriorityUpdationDao;
140
+ export {};
@@ -0,0 +1,253 @@
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.lsqPriorityUpdationDao = void 0;
7
+ const dynamoose_1 = __importDefault(require("dynamoose"));
8
+ const base_dynamoose_dao_1 = require("../../base-dynamoose-dao");
9
+ const lsq_priority_updation_model_1 = require("./lsq-priority-updation-model");
10
+ /**
11
+ * DAO for LeadSquared priority-updation queue.
12
+ *
13
+ * Table keys: `lsqPriorityUpdationId` (PK).
14
+ * Lookups:
15
+ * - `opportunityIdIndex` → by LeadSquared `opportunityId`
16
+ * - `leadNumberIndex` → by lead phone/number
17
+ * - `statusIndex` → by record `status`
18
+ * - `passedStrIndex` → unprocessed queue (`passedStr` + `priorityRank`)
19
+ * Processed rows are deleted from the table (not soft-flagged).
20
+ */
21
+ class LsqPriorityUpdationDao extends base_dynamoose_dao_1.GenericDynamooseDAO {
22
+ constructor() {
23
+ super(lsq_priority_updation_model_1.LsqPriorityUpdationModel, "lsqPriorityUpdationId");
24
+ this.normalizeInput = (item) => {
25
+ const passed = item.passed ?? false;
26
+ const priority = item.priority;
27
+ return {
28
+ ...item,
29
+ passed,
30
+ passedStr: item.passedStr ?? (0, lsq_priority_updation_model_1.toPassedStr)(passed),
31
+ priorityRank: item.priorityRank ?? (priority ? (0, lsq_priority_updation_model_1.toPriorityRank)(priority) : undefined)
32
+ };
33
+ };
34
+ /**
35
+ * Creates / queues one opportunity for priority updation.
36
+ *
37
+ * Use when: LeadSquared webhook receives a new/updated opportunity.
38
+ * - `lsqPriorityUpdationId` auto-generates if omitted.
39
+ * - Auto-fills `passedStr` from `passed` (`false` → `"FALSE"`).
40
+ * - Auto-fills `priorityRank` from `priority` (P1→1 … P5→5).
41
+ *
42
+ * @example
43
+ * await lsqPriorityUpdationDao.save({
44
+ * opportunityId: "opp-123",
45
+ * leadNumber: "9876543210",
46
+ * passed: false,
47
+ * priority: "P1",
48
+ * urgency: "U2",
49
+ * value: "V3",
50
+ * eventDate: "2026-07-30",
51
+ * payload: { raw: "webhook-body" }
52
+ * });
53
+ */
54
+ this.save = async (item, authContext) => {
55
+ return super.save(this.normalizeInput(item), authContext);
56
+ };
57
+ /**
58
+ * Updates an existing queued record by `lsqPriorityUpdationId`.
59
+ *
60
+ * Use when: recalculating priority/urgency/value (e.g. midnight job) or
61
+ * refreshing webhook payload fields.
62
+ * - Re-syncs `passedStr` / `priorityRank` when `passed` / `priority` change.
63
+ * - Always refreshes `updatedAt`.
64
+ *
65
+ * @example
66
+ * await lsqPriorityUpdationDao.update("lsq-uuid", {
67
+ * priority: "P2",
68
+ * urgency: "U1",
69
+ * value: "V2"
70
+ * });
71
+ */
72
+ this.update = async (lsqPriorityUpdationId, updates, authContext) => {
73
+ const nextUpdates = {
74
+ ...updates,
75
+ updated_time: new Date(),
76
+ updated_user: authContext?.userSub
77
+ };
78
+ if (typeof updates.passed === "boolean") {
79
+ nextUpdates.passedStr = updates.passedStr ?? (0, lsq_priority_updation_model_1.toPassedStr)(updates.passed);
80
+ }
81
+ if (updates.priority) {
82
+ nextUpdates.priorityRank = updates.priorityRank ?? (0, lsq_priority_updation_model_1.toPriorityRank)(updates.priority);
83
+ }
84
+ const updated = await lsq_priority_updation_model_1.LsqPriorityUpdationModel.update({ lsqPriorityUpdationId }, nextUpdates, {
85
+ condition: new dynamoose_1.default.Condition().attribute("lsqPriorityUpdationId").exists()
86
+ });
87
+ return updated;
88
+ };
89
+ /**
90
+ * Fetches one queue record by table primary key.
91
+ *
92
+ * @example
93
+ * const row = await lsqPriorityUpdationDao.getById("lsq-uuid");
94
+ */
95
+ this.getById = async (lsqPriorityUpdationId) => this.get(lsqPriorityUpdationId);
96
+ /**
97
+ * Fetches one queue record by LeadSquared `opportunityId` (GSI `opportunityIdIndex`).
98
+ *
99
+ * @example
100
+ * const row = await lsqPriorityUpdationDao.getByOpportunityId("opp-123");
101
+ */
102
+ this.getByOpportunityId = async (opportunityId) => {
103
+ const result = await this.listByOpportunityId(opportunityId, 1);
104
+ return result.items[0] ?? null;
105
+ };
106
+ /**
107
+ * Lists queue records by LeadSquared `opportunityId` (GSI `opportunityIdIndex`).
108
+ *
109
+ * @example
110
+ * const { items } = await lsqPriorityUpdationDao.listByOpportunityId("opp-123");
111
+ */
112
+ this.listByOpportunityId = async (opportunityId, limit, token) => {
113
+ const decodedToken = this.decode(token);
114
+ let queryBuilder = lsq_priority_updation_model_1.LsqPriorityUpdationModel.query("opportunityId")
115
+ .eq(opportunityId)
116
+ .using("opportunityIdIndex");
117
+ if (decodedToken) {
118
+ queryBuilder = queryBuilder.startAt(decodedToken);
119
+ }
120
+ if (typeof limit === "number") {
121
+ queryBuilder = queryBuilder.limit(limit);
122
+ }
123
+ const queryResult = await queryBuilder.exec();
124
+ return {
125
+ items: queryResult,
126
+ nextToken: await this.encode(queryResult.lastKey)
127
+ };
128
+ };
129
+ /**
130
+ * Fetches one queue record by `leadNumber` (GSI `leadNumberIndex`).
131
+ *
132
+ * @example
133
+ * const row = await lsqPriorityUpdationDao.getByLeadNumber("9876543210");
134
+ */
135
+ this.getByLeadNumber = async (leadNumber) => {
136
+ const result = await this.listByLeadNumber(leadNumber, 1);
137
+ return result.items[0] ?? null;
138
+ };
139
+ /**
140
+ * Lists queue records by `leadNumber` (GSI `leadNumberIndex`).
141
+ *
142
+ * @example
143
+ * const { items } = await lsqPriorityUpdationDao.listByLeadNumber("9876543210");
144
+ */
145
+ this.listByLeadNumber = async (leadNumber, limit, token) => {
146
+ const decodedToken = this.decode(token);
147
+ let queryBuilder = lsq_priority_updation_model_1.LsqPriorityUpdationModel.query("leadNumber")
148
+ .eq(leadNumber)
149
+ .using("leadNumberIndex");
150
+ if (decodedToken) {
151
+ queryBuilder = queryBuilder.startAt(decodedToken);
152
+ }
153
+ if (typeof limit === "number") {
154
+ queryBuilder = queryBuilder.limit(limit);
155
+ }
156
+ const queryResult = await queryBuilder.exec();
157
+ return {
158
+ items: queryResult,
159
+ nextToken: await this.encode(queryResult.lastKey)
160
+ };
161
+ };
162
+ /**
163
+ * Lists queue records by `status` (GSI `statusIndex`).
164
+ *
165
+ * @example
166
+ * const { items } = await lsqPriorityUpdationDao.listByStatus("PENDING", 25);
167
+ */
168
+ this.listByStatus = async (status, limit, token) => {
169
+ const decodedToken = this.decode(token);
170
+ let queryBuilder = lsq_priority_updation_model_1.LsqPriorityUpdationModel.query("status")
171
+ .eq(status)
172
+ .using("statusIndex");
173
+ if (decodedToken) {
174
+ queryBuilder = queryBuilder.startAt(decodedToken);
175
+ }
176
+ if (typeof limit === "number") {
177
+ queryBuilder = queryBuilder.limit(limit);
178
+ }
179
+ const queryResult = await queryBuilder.exec();
180
+ return {
181
+ items: queryResult,
182
+ nextToken: await this.encode(queryResult.lastKey)
183
+ };
184
+ };
185
+ /**
186
+ * Lists queued (unprocessed) opportunities sorted by `priorityRank` ascending.
187
+ *
188
+ * Use when: worker pulls next batch of unassigned LSQ priority updates.
189
+ * Queries GSI `passedStrIndex` with `passedStr = "FALSE"`.
190
+ *
191
+ * @example
192
+ * const { items, nextToken } = await lsqPriorityUpdationDao.listUnprocessed(25);
193
+ */
194
+ this.listUnprocessed = async (limit, token) => this.listByPassedStr(lsq_priority_updation_model_1.LSQ_PASSED_STR.FALSE, limit, token);
195
+ /**
196
+ * Lists opportunities by `passedStr` (GSI `passedStrIndex`), sorted by `priorityRank`.
197
+ *
198
+ * @example
199
+ * const queued = await lsqPriorityUpdationDao.listByPassedStr("FALSE", 25);
200
+ */
201
+ this.listByPassedStr = async (passedStr, limit, token) => {
202
+ const decodedToken = this.decode(token);
203
+ let queryBuilder = lsq_priority_updation_model_1.LsqPriorityUpdationModel.query("passedStr")
204
+ .eq(passedStr)
205
+ .using("passedStrIndex")
206
+ .sort("ascending");
207
+ if (decodedToken) {
208
+ queryBuilder = queryBuilder.startAt(decodedToken);
209
+ }
210
+ if (typeof limit === "number") {
211
+ queryBuilder = queryBuilder.limit(limit);
212
+ }
213
+ const queryResult = await queryBuilder.exec();
214
+ return {
215
+ items: queryResult,
216
+ nextToken: await this.encode(queryResult.lastKey)
217
+ };
218
+ };
219
+ /**
220
+ * Marks a queue row as processed by deleting it via primary key.
221
+ *
222
+ * Use when: worker successfully applied priority update in LeadSquared.
223
+ *
224
+ * @example
225
+ * await lsqPriorityUpdationDao.markProcessed("lsq-uuid");
226
+ */
227
+ this.markProcessed = async (lsqPriorityUpdationId) => {
228
+ await this.delete(lsqPriorityUpdationId);
229
+ };
230
+ /**
231
+ * Marks processed by LeadSquared `opportunityId` (lookup GSI, then delete by PK).
232
+ *
233
+ * @example
234
+ * await lsqPriorityUpdationDao.markProcessedByOpportunityId("opp-123");
235
+ */
236
+ this.markProcessedByOpportunityId = async (opportunityId) => {
237
+ const row = await this.getByOpportunityId(opportunityId);
238
+ if (!row) {
239
+ return false;
240
+ }
241
+ await this.delete(row.lsqPriorityUpdationId);
242
+ return true;
243
+ };
244
+ /**
245
+ * Deletes one queue record by primary key.
246
+ */
247
+ this.deleteById = async (lsqPriorityUpdationId) => {
248
+ await this.delete(lsqPriorityUpdationId);
249
+ };
250
+ }
251
+ }
252
+ exports.lsqPriorityUpdationDao = new LsqPriorityUpdationDao();
253
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHNxLXByaW9yaXR5LXVwZGF0aW9uLWRhby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jdXN0b21lci11c2VyL2xzcS1wcmlvcml0eS11cGRhdGlvbi9sc3EtcHJpb3JpdHktdXBkYXRpb24tZGFvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBEQUFrQztBQUNsQyxpRUFBMEU7QUFFMUUsK0VBU3VDO0FBT3ZDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLHNCQUF1QixTQUFRLHdDQUF3QztJQUN6RTtRQUNJLEtBQUssQ0FBQyxzREFBd0IsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBR3JELG1CQUFjLEdBQUcsQ0FBQyxJQUFvQyxFQUF1QixFQUFFO1lBQ25GLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDO1lBQ3BDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUF1QixDQUFDO1lBRTlDLE9BQU87Z0JBQ0gsR0FBRyxJQUFJO2dCQUNQLE1BQU07Z0JBQ04sU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksSUFBQSx5Q0FBVyxFQUFDLE1BQU0sQ0FBQztnQkFDaEQsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUEsNENBQWMsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2FBQ2hFLENBQUM7UUFDN0IsQ0FBQyxDQUFDO1FBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7V0FtQkc7UUFDSCxTQUFJLEdBQUcsS0FBSyxFQUNSLElBQW9DLEVBQ3BDLFdBQXlCLEVBQ0csRUFBRTtZQUM5QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUM7UUFFRjs7Ozs7Ozs7Ozs7Ozs7V0FjRztRQUNILFdBQU0sR0FBRyxLQUFLLEVBQ1YscUJBQTZCLEVBQzdCLE9BQXFDLEVBQ3JDLFdBQXlCLEVBQ0csRUFBRTtZQUM5QixNQUFNLFdBQVcsR0FBaUM7Z0JBQzlDLEdBQUcsT0FBTztnQkFDVixZQUFZLEVBQUUsSUFBSSxJQUFJLEVBQUU7Z0JBQ3hCLFlBQVksRUFBRSxXQUFXLEVBQUUsT0FBTzthQUNyQyxDQUFDO1lBRUYsSUFBSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3RDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxJQUFBLHlDQUFXLEVBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbkIsV0FBVyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxJQUFJLElBQUEsNENBQWMsRUFBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEYsQ0FBQztZQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sc0RBQXdCLENBQUMsTUFBTSxDQUNqRCxFQUFFLHFCQUFxQixFQUFFLEVBQ3pCLFdBQVcsRUFDWDtnQkFDSSxTQUFTLEVBQUUsSUFBSSxtQkFBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE1BQU0sRUFBRTthQUNuRixDQUNKLENBQUM7WUFDRixPQUFPLE9BQXlDLENBQUM7UUFDckQsQ0FBQyxDQUFDO1FBRUY7Ozs7O1dBS0c7UUFDSCxZQUFPLEdBQUcsS0FBSyxFQUFFLHFCQUE2QixFQUF1QyxFQUFFLENBQ25GLElBQUksQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUVwQzs7Ozs7V0FLRztRQUNILHVCQUFrQixHQUFHLEtBQUssRUFBRSxhQUFxQixFQUF1QyxFQUFFO1lBQ3RGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNoRSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO1FBQ25DLENBQUMsQ0FBQztRQUVGOzs7OztXQUtHO1FBQ0gsd0JBQW1CLEdBQUcsS0FBSyxFQUN2QixhQUFxQixFQUNyQixLQUFjLEVBQ2QsS0FBYyxFQUNLLEVBQUU7WUFDckIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxJQUFJLFlBQVksR0FBRyxzREFBd0IsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO2lCQUM3RCxFQUFFLENBQUMsYUFBYSxDQUFDO2lCQUNqQixLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNqQyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNmLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixZQUFZLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUMsT0FBTztnQkFDSCxLQUFLLEVBQUUsV0FBK0M7Z0JBQ3RELFNBQVMsRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQWdDLENBQUM7YUFDN0UsQ0FBQztRQUNOLENBQUMsQ0FBQztRQUVGOzs7OztXQUtHO1FBQ0gsb0JBQWUsR0FBRyxLQUFLLEVBQUUsVUFBa0IsRUFBdUMsRUFBRTtZQUNoRixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDMUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztRQUNuQyxDQUFDLENBQUM7UUFFRjs7Ozs7V0FLRztRQUNILHFCQUFnQixHQUFHLEtBQUssRUFDcEIsVUFBa0IsRUFDbEIsS0FBYyxFQUNkLEtBQWMsRUFDSyxFQUFFO1lBQ3JCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEMsSUFBSSxZQUFZLEdBQUcsc0RBQXdCLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztpQkFDMUQsRUFBRSxDQUFDLFVBQVUsQ0FBQztpQkFDZCxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUM5QixJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNmLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixZQUFZLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUMsT0FBTztnQkFDSCxLQUFLLEVBQUUsV0FBK0M7Z0JBQ3RELFNBQVMsRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQWdDLENBQUM7YUFDN0UsQ0FBQztRQUNOLENBQUMsQ0FBQztRQUVGOzs7OztXQUtHO1FBQ0gsaUJBQVksR0FBRyxLQUFLLEVBQ2hCLE1BQWMsRUFDZCxLQUFjLEVBQ2QsS0FBYyxFQUNLLEVBQUU7WUFDckIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxJQUFJLFlBQVksR0FBRyxzREFBd0IsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO2lCQUN0RCxFQUFFLENBQUMsTUFBTSxDQUFDO2lCQUNWLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMxQixJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNmLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixZQUFZLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUMsT0FBTztnQkFDSCxLQUFLLEVBQUUsV0FBK0M7Z0JBQ3RELFNBQVMsRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQWdDLENBQUM7YUFDN0UsQ0FBQztRQUNOLENBQUMsQ0FBQztRQUVGOzs7Ozs7OztXQVFHO1FBQ0gsb0JBQWUsR0FBRyxLQUFLLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBdUIsRUFBRSxDQUM1RSxJQUFJLENBQUMsZUFBZSxDQUFDLDRDQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUU3RDs7Ozs7V0FLRztRQUNILG9CQUFlLEdBQUcsS0FBSyxFQUNuQixTQUF1QixFQUN2QixLQUFjLEVBQ2QsS0FBYyxFQUNLLEVBQUU7WUFDckIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxJQUFJLFlBQVksR0FBRyxzREFBd0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO2lCQUN6RCxFQUFFLENBQUMsU0FBUyxDQUFDO2lCQUNiLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2YsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdEQsQ0FBQztZQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzVCLFlBQVksR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCxNQUFNLFdBQVcsR0FBRyxNQUFNLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5QyxPQUFPO2dCQUNILEtBQUssRUFBRSxXQUErQztnQkFDdEQsU0FBUyxFQUFFLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBZ0MsQ0FBQzthQUM3RSxDQUFDO1FBQ04sQ0FBQyxDQUFDO1FBRUY7Ozs7Ozs7V0FPRztRQUNILGtCQUFhLEdBQUcsS0FBSyxFQUFFLHFCQUE2QixFQUFpQixFQUFFO1lBQ25FLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQztRQUVGOzs7OztXQUtHO1FBQ0gsaUNBQTRCLEdBQUcsS0FBSyxFQUFFLGFBQXFCLEVBQW9CLEVBQUU7WUFDN0UsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNQLE9BQU8sS0FBSyxDQUFDO1lBQ2pCLENBQUM7WUFDRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDN0MsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQyxDQUFDO1FBRUY7O1dBRUc7UUFDSCxlQUFVLEdBQUcsS0FBSyxFQUFFLHFCQUE2QixFQUFpQixFQUFFO1lBQ2hFLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQztJQWhSRixDQUFDO0NBaVJKO0FBRVksUUFBQSxzQkFBc0IsR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZHluYW1vb3NlIGZyb20gXCJkeW5hbW9vc2VcIjtcbmltcG9ydCB7IER5bmFtb0tleSwgR2VuZXJpY0R5bmFtb29zZURBTyB9IGZyb20gXCIuLi8uLi9iYXNlLWR5bmFtb29zZS1kYW9cIjtcbmltcG9ydCB7IEF1dGhDb250ZXh0IH0gZnJvbSBcIi4uLy4uL2Jhc2UtZHluYW1vb3NlLW1vZGVsXCI7XG5pbXBvcnQge1xuICAgIENyZWF0ZUxzcVByaW9yaXR5VXBkYXRpb25JbnB1dCxcbiAgICBMU1FfUEFTU0VEX1NUUixcbiAgICBMc3FQYXNzZWRTdHIsXG4gICAgTHNxUHJpb3JpdHksXG4gICAgTHNxUHJpb3JpdHlVcGRhdGlvbixcbiAgICBMc3FQcmlvcml0eVVwZGF0aW9uTW9kZWwsXG4gICAgdG9QYXNzZWRTdHIsXG4gICAgdG9Qcmlvcml0eVJhbmtcbn0gZnJvbSBcIi4vbHNxLXByaW9yaXR5LXVwZGF0aW9uLW1vZGVsXCI7XG5cbnR5cGUgTGlzdFJlc3VsdCA9IHtcbiAgICBpdGVtczogTHNxUHJpb3JpdHlVcGRhdGlvbltdO1xuICAgIG5leHRUb2tlbj86IHN0cmluZztcbn07XG5cbi8qKlxuICogREFPIGZvciBMZWFkU3F1YXJlZCBwcmlvcml0eS11cGRhdGlvbiBxdWV1ZS5cbiAqXG4gKiBUYWJsZSBrZXlzOiBgbHNxUHJpb3JpdHlVcGRhdGlvbklkYCAoUEspLlxuICogTG9va3VwczpcbiAqIC0gYG9wcG9ydHVuaXR5SWRJbmRleGAg4oaSIGJ5IExlYWRTcXVhcmVkIGBvcHBvcnR1bml0eUlkYFxuICogLSBgbGVhZE51bWJlckluZGV4YCDihpIgYnkgbGVhZCBwaG9uZS9udW1iZXJcbiAqIC0gYHN0YXR1c0luZGV4YCDihpIgYnkgcmVjb3JkIGBzdGF0dXNgXG4gKiAtIGBwYXNzZWRTdHJJbmRleGAg4oaSIHVucHJvY2Vzc2VkIHF1ZXVlIChgcGFzc2VkU3RyYCArIGBwcmlvcml0eVJhbmtgKVxuICogUHJvY2Vzc2VkIHJvd3MgYXJlIGRlbGV0ZWQgZnJvbSB0aGUgdGFibGUgKG5vdCBzb2Z0LWZsYWdnZWQpLlxuICovXG5jbGFzcyBMc3FQcmlvcml0eVVwZGF0aW9uRGFvIGV4dGVuZHMgR2VuZXJpY0R5bmFtb29zZURBTzxMc3FQcmlvcml0eVVwZGF0aW9uPiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKExzcVByaW9yaXR5VXBkYXRpb25Nb2RlbCwgXCJsc3FQcmlvcml0eVVwZGF0aW9uSWRcIik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3JtYWxpemVJbnB1dCA9IChpdGVtOiBDcmVhdGVMc3FQcmlvcml0eVVwZGF0aW9uSW5wdXQpOiBMc3FQcmlvcml0eVVwZGF0aW9uID0+IHtcbiAgICAgICAgY29uc3QgcGFzc2VkID0gaXRlbS5wYXNzZWQgPz8gZmFsc2U7XG4gICAgICAgIGNvbnN0IHByaW9yaXR5ID0gaXRlbS5wcmlvcml0eSBhcyBMc3FQcmlvcml0eTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgIHBhc3NlZCxcbiAgICAgICAgICAgIHBhc3NlZFN0cjogaXRlbS5wYXNzZWRTdHIgPz8gdG9QYXNzZWRTdHIocGFzc2VkKSxcbiAgICAgICAgICAgIHByaW9yaXR5UmFuazogaXRlbS5wcmlvcml0eVJhbmsgPz8gKHByaW9yaXR5ID8gdG9Qcmlvcml0eVJhbmsocHJpb3JpdHkpIDogdW5kZWZpbmVkKVxuICAgICAgICB9IGFzIExzcVByaW9yaXR5VXBkYXRpb247XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgLyBxdWV1ZXMgb25lIG9wcG9ydHVuaXR5IGZvciBwcmlvcml0eSB1cGRhdGlvbi5cbiAgICAgKlxuICAgICAqIFVzZSB3aGVuOiBMZWFkU3F1YXJlZCB3ZWJob29rIHJlY2VpdmVzIGEgbmV3L3VwZGF0ZWQgb3Bwb3J0dW5pdHkuXG4gICAgICogLSBgbHNxUHJpb3JpdHlVcGRhdGlvbklkYCBhdXRvLWdlbmVyYXRlcyBpZiBvbWl0dGVkLlxuICAgICAqIC0gQXV0by1maWxscyBgcGFzc2VkU3RyYCBmcm9tIGBwYXNzZWRgIChgZmFsc2VgIOKGkiBgXCJGQUxTRVwiYCkuXG4gICAgICogLSBBdXRvLWZpbGxzIGBwcmlvcml0eVJhbmtgIGZyb20gYHByaW9yaXR5YCAoUDHihpIxIOKApiBQNeKGkjUpLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBhd2FpdCBsc3FQcmlvcml0eVVwZGF0aW9uRGFvLnNhdmUoe1xuICAgICAqICAgICBvcHBvcnR1bml0eUlkOiBcIm9wcC0xMjNcIixcbiAgICAgKiAgICAgbGVhZE51bWJlcjogXCI5ODc2NTQzMjEwXCIsXG4gICAgICogICAgIHBhc3NlZDogZmFsc2UsXG4gICAgICogICAgIHByaW9yaXR5OiBcIlAxXCIsXG4gICAgICogICAgIHVyZ2VuY3k6IFwiVTJcIixcbiAgICAgKiAgICAgdmFsdWU6IFwiVjNcIixcbiAgICAgKiAgICAgZXZlbnREYXRlOiBcIjIwMjYtMDctMzBcIixcbiAgICAgKiAgICAgcGF5bG9hZDogeyByYXc6IFwid2ViaG9vay1ib2R5XCIgfVxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHNhdmUgPSBhc3luYyAoXG4gICAgICAgIGl0ZW06IENyZWF0ZUxzcVByaW9yaXR5VXBkYXRpb25JbnB1dCxcbiAgICAgICAgYXV0aENvbnRleHQ/OiBBdXRoQ29udGV4dFxuICAgICk6IFByb21pc2U8THNxUHJpb3JpdHlVcGRhdGlvbj4gPT4ge1xuICAgICAgICByZXR1cm4gc3VwZXIuc2F2ZSh0aGlzLm5vcm1hbGl6ZUlucHV0KGl0ZW0pLCBhdXRoQ29udGV4dCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgYW4gZXhpc3RpbmcgcXVldWVkIHJlY29yZCBieSBgbHNxUHJpb3JpdHlVcGRhdGlvbklkYC5cbiAgICAgKlxuICAgICAqIFVzZSB3aGVuOiByZWNhbGN1bGF0aW5nIHByaW9yaXR5L3VyZ2VuY3kvdmFsdWUgKGUuZy4gbWlkbmlnaHQgam9iKSBvclxuICAgICAqIHJlZnJlc2hpbmcgd2ViaG9vayBwYXlsb2FkIGZpZWxkcy5cbiAgICAgKiAtIFJlLXN5bmNzIGBwYXNzZWRTdHJgIC8gYHByaW9yaXR5UmFua2Agd2hlbiBgcGFzc2VkYCAvIGBwcmlvcml0eWAgY2hhbmdlLlxuICAgICAqIC0gQWx3YXlzIHJlZnJlc2hlcyBgdXBkYXRlZEF0YC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYXdhaXQgbHNxUHJpb3JpdHlVcGRhdGlvbkRhby51cGRhdGUoXCJsc3EtdXVpZFwiLCB7XG4gICAgICogICAgIHByaW9yaXR5OiBcIlAyXCIsXG4gICAgICogICAgIHVyZ2VuY3k6IFwiVTFcIixcbiAgICAgKiAgICAgdmFsdWU6IFwiVjJcIlxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHVwZGF0ZSA9IGFzeW5jIChcbiAgICAgICAgbHNxUHJpb3JpdHlVcGRhdGlvbklkOiBzdHJpbmcsXG4gICAgICAgIHVwZGF0ZXM6IFBhcnRpYWw8THNxUHJpb3JpdHlVcGRhdGlvbj4sXG4gICAgICAgIGF1dGhDb250ZXh0PzogQXV0aENvbnRleHRcbiAgICApOiBQcm9taXNlPExzcVByaW9yaXR5VXBkYXRpb24+ID0+IHtcbiAgICAgICAgY29uc3QgbmV4dFVwZGF0ZXM6IFBhcnRpYWw8THNxUHJpb3JpdHlVcGRhdGlvbj4gPSB7XG4gICAgICAgICAgICAuLi51cGRhdGVzLFxuICAgICAgICAgICAgdXBkYXRlZF90aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgdXBkYXRlZF91c2VyOiBhdXRoQ29udGV4dD8udXNlclN1YlxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0eXBlb2YgdXBkYXRlcy5wYXNzZWQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICBuZXh0VXBkYXRlcy5wYXNzZWRTdHIgPSB1cGRhdGVzLnBhc3NlZFN0ciA/PyB0b1Bhc3NlZFN0cih1cGRhdGVzLnBhc3NlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZXMucHJpb3JpdHkpIHtcbiAgICAgICAgICAgIG5leHRVcGRhdGVzLnByaW9yaXR5UmFuayA9IHVwZGF0ZXMucHJpb3JpdHlSYW5rID8/IHRvUHJpb3JpdHlSYW5rKHVwZGF0ZXMucHJpb3JpdHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IExzcVByaW9yaXR5VXBkYXRpb25Nb2RlbC51cGRhdGUoXG4gICAgICAgICAgICB7IGxzcVByaW9yaXR5VXBkYXRpb25JZCB9LFxuICAgICAgICAgICAgbmV4dFVwZGF0ZXMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uZGl0aW9uOiBuZXcgZHluYW1vb3NlLkNvbmRpdGlvbigpLmF0dHJpYnV0ZShcImxzcVByaW9yaXR5VXBkYXRpb25JZFwiKS5leGlzdHMoKVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdXBkYXRlZCBhcyB1bmtub3duIGFzIExzcVByaW9yaXR5VXBkYXRpb247XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgb25lIHF1ZXVlIHJlY29yZCBieSB0YWJsZSBwcmltYXJ5IGtleS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgcm93ID0gYXdhaXQgbHNxUHJpb3JpdHlVcGRhdGlvbkRhby5nZXRCeUlkKFwibHNxLXV1aWRcIik7XG4gICAgICovXG4gICAgZ2V0QnlJZCA9IGFzeW5jIChsc3FQcmlvcml0eVVwZGF0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8THNxUHJpb3JpdHlVcGRhdGlvbiB8IG51bGw+ID0+XG4gICAgICAgIHRoaXMuZ2V0KGxzcVByaW9yaXR5VXBkYXRpb25JZCk7XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIG9uZSBxdWV1ZSByZWNvcmQgYnkgTGVhZFNxdWFyZWQgYG9wcG9ydHVuaXR5SWRgIChHU0kgYG9wcG9ydHVuaXR5SWRJbmRleGApLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCByb3cgPSBhd2FpdCBsc3FQcmlvcml0eVVwZGF0aW9uRGFvLmdldEJ5T3Bwb3J0dW5pdHlJZChcIm9wcC0xMjNcIik7XG4gICAgICovXG4gICAgZ2V0QnlPcHBvcnR1bml0eUlkID0gYXN5bmMgKG9wcG9ydHVuaXR5SWQ6IHN0cmluZyk6IFByb21pc2U8THNxUHJpb3JpdHlVcGRhdGlvbiB8IG51bGw+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5saXN0QnlPcHBvcnR1bml0eUlkKG9wcG9ydHVuaXR5SWQsIDEpO1xuICAgICAgICByZXR1cm4gcmVzdWx0Lml0ZW1zWzBdID8/IG51bGw7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExpc3RzIHF1ZXVlIHJlY29yZHMgYnkgTGVhZFNxdWFyZWQgYG9wcG9ydHVuaXR5SWRgIChHU0kgYG9wcG9ydHVuaXR5SWRJbmRleGApLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCB7IGl0ZW1zIH0gPSBhd2FpdCBsc3FQcmlvcml0eVVwZGF0aW9uRGFvLmxpc3RCeU9wcG9ydHVuaXR5SWQoXCJvcHAtMTIzXCIpO1xuICAgICAqL1xuICAgIGxpc3RCeU9wcG9ydHVuaXR5SWQgPSBhc3luYyAoXG4gICAgICAgIG9wcG9ydHVuaXR5SWQ6IHN0cmluZyxcbiAgICAgICAgbGltaXQ/OiBudW1iZXIsXG4gICAgICAgIHRva2VuPzogc3RyaW5nXG4gICAgKTogUHJvbWlzZTxMaXN0UmVzdWx0PiA9PiB7XG4gICAgICAgIGNvbnN0IGRlY29kZWRUb2tlbiA9IHRoaXMuZGVjb2RlKHRva2VuKTtcbiAgICAgICAgbGV0IHF1ZXJ5QnVpbGRlciA9IExzcVByaW9yaXR5VXBkYXRpb25Nb2RlbC5xdWVyeShcIm9wcG9ydHVuaXR5SWRcIilcbiAgICAgICAgICAgIC5lcShvcHBvcnR1bml0eUlkKVxuICAgICAgICAgICAgLnVzaW5nKFwib3Bwb3J0dW5pdHlJZEluZGV4XCIpO1xuICAgICAgICBpZiAoZGVjb2RlZFRva2VuKSB7XG4gICAgICAgICAgICBxdWVyeUJ1aWxkZXIgPSBxdWVyeUJ1aWxkZXIuc3RhcnRBdChkZWNvZGVkVG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbGltaXQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHF1ZXJ5QnVpbGRlciA9IHF1ZXJ5QnVpbGRlci5saW1pdChsaW1pdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcXVlcnlSZXN1bHQgPSBhd2FpdCBxdWVyeUJ1aWxkZXIuZXhlYygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXRlbXM6IHF1ZXJ5UmVzdWx0IGFzIHVua25vd24gYXMgTHNxUHJpb3JpdHlVcGRhdGlvbltdLFxuICAgICAgICAgICAgbmV4dFRva2VuOiBhd2FpdCB0aGlzLmVuY29kZShxdWVyeVJlc3VsdC5sYXN0S2V5IGFzIER5bmFtb0tleSB8IHVuZGVmaW5lZClcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBvbmUgcXVldWUgcmVjb3JkIGJ5IGBsZWFkTnVtYmVyYCAoR1NJIGBsZWFkTnVtYmVySW5kZXhgKS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgcm93ID0gYXdhaXQgbHNxUHJpb3JpdHlVcGRhdGlvbkRhby5nZXRCeUxlYWROdW1iZXIoXCI5ODc2NTQzMjEwXCIpO1xuICAgICAqL1xuICAgIGdldEJ5TGVhZE51bWJlciA9IGFzeW5jIChsZWFkTnVtYmVyOiBzdHJpbmcpOiBQcm9taXNlPExzcVByaW9yaXR5VXBkYXRpb24gfCBudWxsPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubGlzdEJ5TGVhZE51bWJlcihsZWFkTnVtYmVyLCAxKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5pdGVtc1swXSA/PyBudWxsO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMaXN0cyBxdWV1ZSByZWNvcmRzIGJ5IGBsZWFkTnVtYmVyYCAoR1NJIGBsZWFkTnVtYmVySW5kZXhgKS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgeyBpdGVtcyB9ID0gYXdhaXQgbHNxUHJpb3JpdHlVcGRhdGlvbkRhby5saXN0QnlMZWFkTnVtYmVyKFwiOTg3NjU0MzIxMFwiKTtcbiAgICAgKi9cbiAgICBsaXN0QnlMZWFkTnVtYmVyID0gYXN5bmMgKFxuICAgICAgICBsZWFkTnVtYmVyOiBzdHJpbmcsXG4gICAgICAgIGxpbWl0PzogbnVtYmVyLFxuICAgICAgICB0b2tlbj86IHN0cmluZ1xuICAgICk6IFByb21pc2U8TGlzdFJlc3VsdD4gPT4ge1xuICAgICAgICBjb25zdCBkZWNvZGVkVG9rZW4gPSB0aGlzLmRlY29kZSh0b2tlbik7XG4gICAgICAgIGxldCBxdWVyeUJ1aWxkZXIgPSBMc3FQcmlvcml0eVVwZGF0aW9uTW9kZWwucXVlcnkoXCJsZWFkTnVtYmVyXCIpXG4gICAgICAgICAgICAuZXEobGVhZE51bWJlcilcbiAgICAgICAgICAgIC51c2luZyhcImxlYWROdW1iZXJJbmRleFwiKTtcbiAgICAgICAgaWYgKGRlY29kZWRUb2tlbikge1xuICAgICAgICAgICAgcXVlcnlCdWlsZGVyID0gcXVlcnlCdWlsZGVyLnN0YXJ0QXQoZGVjb2RlZFRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxpbWl0ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBxdWVyeUJ1aWxkZXIgPSBxdWVyeUJ1aWxkZXIubGltaXQobGltaXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHF1ZXJ5UmVzdWx0ID0gYXdhaXQgcXVlcnlCdWlsZGVyLmV4ZWMoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGl0ZW1zOiBxdWVyeVJlc3VsdCBhcyB1bmtub3duIGFzIExzcVByaW9yaXR5VXBkYXRpb25bXSxcbiAgICAgICAgICAgIG5leHRUb2tlbjogYXdhaXQgdGhpcy5lbmNvZGUocXVlcnlSZXN1bHQubGFzdEtleSBhcyBEeW5hbW9LZXkgfCB1bmRlZmluZWQpXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExpc3RzIHF1ZXVlIHJlY29yZHMgYnkgYHN0YXR1c2AgKEdTSSBgc3RhdHVzSW5kZXhgKS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgeyBpdGVtcyB9ID0gYXdhaXQgbHNxUHJpb3JpdHlVcGRhdGlvbkRhby5saXN0QnlTdGF0dXMoXCJQRU5ESU5HXCIsIDI1KTtcbiAgICAgKi9cbiAgICBsaXN0QnlTdGF0dXMgPSBhc3luYyAoXG4gICAgICAgIHN0YXR1czogc3RyaW5nLFxuICAgICAgICBsaW1pdD86IG51bWJlcixcbiAgICAgICAgdG9rZW4/OiBzdHJpbmdcbiAgICApOiBQcm9taXNlPExpc3RSZXN1bHQ+ID0+IHtcbiAgICAgICAgY29uc3QgZGVjb2RlZFRva2VuID0gdGhpcy5kZWNvZGUodG9rZW4pO1xuICAgICAgICBsZXQgcXVlcnlCdWlsZGVyID0gTHNxUHJpb3JpdHlVcGRhdGlvbk1vZGVsLnF1ZXJ5KFwic3RhdHVzXCIpXG4gICAgICAgICAgICAuZXEoc3RhdHVzKVxuICAgICAgICAgICAgLnVzaW5nKFwic3RhdHVzSW5kZXhcIik7XG4gICAgICAgIGlmIChkZWNvZGVkVG9rZW4pIHtcbiAgICAgICAgICAgIHF1ZXJ5QnVpbGRlciA9IHF1ZXJ5QnVpbGRlci5zdGFydEF0KGRlY29kZWRUb2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsaW1pdCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcXVlcnlCdWlsZGVyID0gcXVlcnlCdWlsZGVyLmxpbWl0KGxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBxdWVyeVJlc3VsdCA9IGF3YWl0IHF1ZXJ5QnVpbGRlci5leGVjKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpdGVtczogcXVlcnlSZXN1bHQgYXMgdW5rbm93biBhcyBMc3FQcmlvcml0eVVwZGF0aW9uW10sXG4gICAgICAgICAgICBuZXh0VG9rZW46IGF3YWl0IHRoaXMuZW5jb2RlKHF1ZXJ5UmVzdWx0Lmxhc3RLZXkgYXMgRHluYW1vS2V5IHwgdW5kZWZpbmVkKVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMaXN0cyBxdWV1ZWQgKHVucHJvY2Vzc2VkKSBvcHBvcnR1bml0aWVzIHNvcnRlZCBieSBgcHJpb3JpdHlSYW5rYCBhc2NlbmRpbmcuXG4gICAgICpcbiAgICAgKiBVc2Ugd2hlbjogd29ya2VyIHB1bGxzIG5leHQgYmF0Y2ggb2YgdW5hc3NpZ25lZCBMU1EgcHJpb3JpdHkgdXBkYXRlcy5cbiAgICAgKiBRdWVyaWVzIEdTSSBgcGFzc2VkU3RySW5kZXhgIHdpdGggYHBhc3NlZFN0ciA9IFwiRkFMU0VcImAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHsgaXRlbXMsIG5leHRUb2tlbiB9ID0gYXdhaXQgbHNxUHJpb3JpdHlVcGRhdGlvbkRhby5saXN0VW5wcm9jZXNzZWQoMjUpO1xuICAgICAqL1xuICAgIGxpc3RVbnByb2Nlc3NlZCA9IGFzeW5jIChsaW1pdD86IG51bWJlciwgdG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPExpc3RSZXN1bHQ+ID0+XG4gICAgICAgIHRoaXMubGlzdEJ5UGFzc2VkU3RyKExTUV9QQVNTRURfU1RSLkZBTFNFLCBsaW1pdCwgdG9rZW4pO1xuXG4gICAgLyoqXG4gICAgICogTGlzdHMgb3Bwb3J0dW5pdGllcyBieSBgcGFzc2VkU3RyYCAoR1NJIGBwYXNzZWRTdHJJbmRleGApLCBzb3J0ZWQgYnkgYHByaW9yaXR5UmFua2AuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHF1ZXVlZCA9IGF3YWl0IGxzcVByaW9yaXR5VXBkYXRpb25EYW8ubGlzdEJ5UGFzc2VkU3RyKFwiRkFMU0VcIiwgMjUpO1xuICAgICAqL1xuICAgIGxpc3RCeVBhc3NlZFN0ciA9IGFzeW5jIChcbiAgICAgICAgcGFzc2VkU3RyOiBMc3FQYXNzZWRTdHIsXG4gICAgICAgIGxpbWl0PzogbnVtYmVyLFxuICAgICAgICB0b2tlbj86IHN0cmluZ1xuICAgICk6IFByb21pc2U8TGlzdFJlc3VsdD4gPT4ge1xuICAgICAgICBjb25zdCBkZWNvZGVkVG9rZW4gPSB0aGlzLmRlY29kZSh0b2tlbik7XG4gICAgICAgIGxldCBxdWVyeUJ1aWxkZXIgPSBMc3FQcmlvcml0eVVwZGF0aW9uTW9kZWwucXVlcnkoXCJwYXNzZWRTdHJcIilcbiAgICAgICAgICAgIC5lcShwYXNzZWRTdHIpXG4gICAgICAgICAgICAudXNpbmcoXCJwYXNzZWRTdHJJbmRleFwiKVxuICAgICAgICAgICAgLnNvcnQoXCJhc2NlbmRpbmdcIik7XG4gICAgICAgIGlmIChkZWNvZGVkVG9rZW4pIHtcbiAgICAgICAgICAgIHF1ZXJ5QnVpbGRlciA9IHF1ZXJ5QnVpbGRlci5zdGFydEF0KGRlY29kZWRUb2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsaW1pdCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcXVlcnlCdWlsZGVyID0gcXVlcnlCdWlsZGVyLmxpbWl0KGxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBxdWVyeVJlc3VsdCA9IGF3YWl0IHF1ZXJ5QnVpbGRlci5leGVjKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpdGVtczogcXVlcnlSZXN1bHQgYXMgdW5rbm93biBhcyBMc3FQcmlvcml0eVVwZGF0aW9uW10sXG4gICAgICAgICAgICBuZXh0VG9rZW46IGF3YWl0IHRoaXMuZW5jb2RlKHF1ZXJ5UmVzdWx0Lmxhc3RLZXkgYXMgRHluYW1vS2V5IHwgdW5kZWZpbmVkKVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBNYXJrcyBhIHF1ZXVlIHJvdyBhcyBwcm9jZXNzZWQgYnkgZGVsZXRpbmcgaXQgdmlhIHByaW1hcnkga2V5LlxuICAgICAqXG4gICAgICogVXNlIHdoZW46IHdvcmtlciBzdWNjZXNzZnVsbHkgYXBwbGllZCBwcmlvcml0eSB1cGRhdGUgaW4gTGVhZFNxdWFyZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGF3YWl0IGxzcVByaW9yaXR5VXBkYXRpb25EYW8ubWFya1Byb2Nlc3NlZChcImxzcS11dWlkXCIpO1xuICAgICAqL1xuICAgIG1hcmtQcm9jZXNzZWQgPSBhc3luYyAobHNxUHJpb3JpdHlVcGRhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGUobHNxUHJpb3JpdHlVcGRhdGlvbklkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTWFya3MgcHJvY2Vzc2VkIGJ5IExlYWRTcXVhcmVkIGBvcHBvcnR1bml0eUlkYCAobG9va3VwIEdTSSwgdGhlbiBkZWxldGUgYnkgUEspLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBhd2FpdCBsc3FQcmlvcml0eVVwZGF0aW9uRGFvLm1hcmtQcm9jZXNzZWRCeU9wcG9ydHVuaXR5SWQoXCJvcHAtMTIzXCIpO1xuICAgICAqL1xuICAgIG1hcmtQcm9jZXNzZWRCeU9wcG9ydHVuaXR5SWQgPSBhc3luYyAob3Bwb3J0dW5pdHlJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHRoaXMuZ2V0QnlPcHBvcnR1bml0eUlkKG9wcG9ydHVuaXR5SWQpO1xuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlKHJvdy5sc3FQcmlvcml0eVVwZGF0aW9uSWQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGVsZXRlcyBvbmUgcXVldWUgcmVjb3JkIGJ5IHByaW1hcnkga2V5LlxuICAgICAqL1xuICAgIGRlbGV0ZUJ5SWQgPSBhc3luYyAobHNxUHJpb3JpdHlVcGRhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGUobHNxUHJpb3JpdHlVcGRhdGlvbklkKTtcbiAgICB9O1xufVxuXG5leHBvcnQgY29uc3QgbHNxUHJpb3JpdHlVcGRhdGlvbkRhbyA9IG5ldyBMc3FQcmlvcml0eVVwZGF0aW9uRGFvKCk7XG4iXX0=