@autologix-engineering/shared 1.2.386 → 1.2.387

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autologix-engineering/shared",
3
- "version": "1.2.386",
3
+ "version": "1.2.387",
4
4
  "dependencies": {
5
5
  "tslib": "^2.3.0"
6
6
  },
@@ -77,9 +77,21 @@ export declare enum NumberedInvoiceField {
77
77
  ConsolidatedTaxInvoiceId = "consolidatedTaxInvId",
78
78
  LTRKey = "ltrKey",
79
79
  LTRDataKey = "ltrDataKey",
80
+ LTRCoverageSnapshot = "ltrCovSnap",
80
81
  VendorTaxAddress = "vendorTaxAddress",
81
82
  VendorTaxAddressId = "vendorTaxAddressId"
82
83
  }
84
+ /**
85
+ * The LTR vehicle master's LastInvoiceDateByGroup entries an LTR invoice moved
86
+ * when it was generated: `before` is each group's value going in (null when
87
+ * the group had never billed), `after` the value the invoice wrote. Cancelling
88
+ * the invoice restores `before`, so the months it billed become billable again.
89
+ */
90
+ export interface ILTRCoverageSnapshot {
91
+ vehicleMasterId: string;
92
+ before: Record<string, string | null>;
93
+ after: Record<string, string>;
94
+ }
83
95
  export interface INumberedInvoice extends TypedModel {
84
96
  [NumberedInvoiceField.NumberedInvoiceId]: string;
85
97
  [NumberedInvoiceField.InvoiceNumber]: string;
@@ -139,6 +151,7 @@ export interface INumberedInvoice extends TypedModel {
139
151
  [NumberedInvoiceField.ConsolidatedTaxInvoiceId]?: string;
140
152
  [NumberedInvoiceField.LTRKey]: string;
141
153
  [NumberedInvoiceField.LTRDataKey]: string;
154
+ [NumberedInvoiceField.LTRCoverageSnapshot]?: ILTRCoverageSnapshot | null;
142
155
  [NumberedInvoiceField.VendorTaxAddress]?: ITaxAddress;
143
156
  [NumberedInvoiceField.VendorTaxAddressId]?: string;
144
157
  }
@@ -61,6 +61,7 @@ export var NumberedInvoiceField;
61
61
  NumberedInvoiceField["ConsolidatedTaxInvoiceId"] = "consolidatedTaxInvId";
62
62
  NumberedInvoiceField["LTRKey"] = "ltrKey";
63
63
  NumberedInvoiceField["LTRDataKey"] = "ltrDataKey";
64
+ NumberedInvoiceField["LTRCoverageSnapshot"] = "ltrCovSnap";
64
65
  NumberedInvoiceField["VendorTaxAddress"] = "vendorTaxAddress";
65
66
  NumberedInvoiceField["VendorTaxAddressId"] = "vendorTaxAddressId";
66
67
  })(NumberedInvoiceField || (NumberedInvoiceField = {}));
@@ -1 +1 @@
1
- {"version":3,"file":"numbered.invoice.model.js","sourceRoot":"","sources":["../../../../../../../libs/shared/src/lib/models/src/numbered.invoice.model.ts"],"names":[],"mappings":"AA0BA,MAAM,CAAN,IAAY,oBAsEX;AAtED,WAAY,oBAAoB;IAC/B,+DAAuC,CAAA;IACvC,uDAA+B,CAAA;IAC/B,mDAA2B,CAAA;IAC3B,8DAAsC,CAAA;IACtC,kEAA0C,CAAA;IAC1C,iDAAyB,CAAA;IACzB,qDAA6B,CAAA;IAC7B,6CAAqB,CAAA;IACrB,iDAAyB,CAAA;IACzB,oEAAoE;IACpE,0EAA0E;IAC1E,yEAAyE;IACzE,+DAAuC,CAAA;IACvC,oDAA4B,CAAA;IAC5B,wDAAgC,CAAA;IAChC,2DAAmC,CAAA;IACnC,+DAAuC,CAAA;IACvC,yCAAiB,CAAA;IACjB,uDAA+B,CAAA;IAC/B,2DAAmC,CAAA;IACnC,uDAA+B,CAAA;IAC/B,2DAAmC,CAAA;IACnC,2DAAmC,CAAA;IACnC,iDAAyB,CAAA;IACzB,iDAAyB,CAAA;IACzB,qDAA6B,CAAA;IAE7B,uDAA+B,CAAA;IAC/B,6DAAqC,CAAA;IAErC,+CAAuB,CAAA;IACvB,uCAAe,CAAA;IAEf,mDAA2B,CAAA;IAC3B,uDAA+B,CAAA;IAE/B,2DAAmC,CAAA;IACnC,+DAAuC,CAAA;IAEvC,yDAAiC,CAAA;IAEjC,0DAAkC,CAAA;IAClC,uDAA+B,CAAA;IAC/B,uDAA+B,CAAA;IAC/B,mDAA2B,CAAA;IAC3B,uDAA+B,CAAA;IAC/B,mCAAW,CAAA;IACX,qDAA6B,CAAA;IAC7B,yDAAiC,CAAA;IACjC,uEAA+C,CAAA;IAC/C,6CAAqB,CAAA;IACrB,+CAAuB,CAAA;IACvB,mDAA2B,CAAA;IAC3B,mDAA2B,CAAA;IAC3B,6CAAqB,CAAA;IACrB,yCAAiB,CAAA;IACjB,6CAAqB,CAAA;IACrB,+CAAuB,CAAA;IACvB,mDAA2B,CAAA;IAC3B,iEAAyC,CAAA;IACzC,qEAA6C,CAAA;IAC7C,gDAAwB,CAAA;IACxB,6CAAqB,CAAA;IACrB,qEAA6C,CAAA;IAC7C,yEAAiD,CAAA;IACjD,yCAAiB,CAAA;IACjB,iDAAyB,CAAA;IACzB,6DAAqC,CAAA;IACrC,iEAAyC,CAAA;AAC1C,CAAC,EAtEW,oBAAoB,KAApB,oBAAoB,QAsE/B"}
1
+ {"version":3,"file":"numbered.invoice.model.js","sourceRoot":"","sources":["../../../../../../../libs/shared/src/lib/models/src/numbered.invoice.model.ts"],"names":[],"mappings":"AA0BA,MAAM,CAAN,IAAY,oBAuEX;AAvED,WAAY,oBAAoB;IAC/B,+DAAuC,CAAA;IACvC,uDAA+B,CAAA;IAC/B,mDAA2B,CAAA;IAC3B,8DAAsC,CAAA;IACtC,kEAA0C,CAAA;IAC1C,iDAAyB,CAAA;IACzB,qDAA6B,CAAA;IAC7B,6CAAqB,CAAA;IACrB,iDAAyB,CAAA;IACzB,oEAAoE;IACpE,0EAA0E;IAC1E,yEAAyE;IACzE,+DAAuC,CAAA;IACvC,oDAA4B,CAAA;IAC5B,wDAAgC,CAAA;IAChC,2DAAmC,CAAA;IACnC,+DAAuC,CAAA;IACvC,yCAAiB,CAAA;IACjB,uDAA+B,CAAA;IAC/B,2DAAmC,CAAA;IACnC,uDAA+B,CAAA;IAC/B,2DAAmC,CAAA;IACnC,2DAAmC,CAAA;IACnC,iDAAyB,CAAA;IACzB,iDAAyB,CAAA;IACzB,qDAA6B,CAAA;IAE7B,uDAA+B,CAAA;IAC/B,6DAAqC,CAAA;IAErC,+CAAuB,CAAA;IACvB,uCAAe,CAAA;IAEf,mDAA2B,CAAA;IAC3B,uDAA+B,CAAA;IAE/B,2DAAmC,CAAA;IACnC,+DAAuC,CAAA;IAEvC,yDAAiC,CAAA;IAEjC,0DAAkC,CAAA;IAClC,uDAA+B,CAAA;IAC/B,uDAA+B,CAAA;IAC/B,mDAA2B,CAAA;IAC3B,uDAA+B,CAAA;IAC/B,mCAAW,CAAA;IACX,qDAA6B,CAAA;IAC7B,yDAAiC,CAAA;IACjC,uEAA+C,CAAA;IAC/C,6CAAqB,CAAA;IACrB,+CAAuB,CAAA;IACvB,mDAA2B,CAAA;IAC3B,mDAA2B,CAAA;IAC3B,6CAAqB,CAAA;IACrB,yCAAiB,CAAA;IACjB,6CAAqB,CAAA;IACrB,+CAAuB,CAAA;IACvB,mDAA2B,CAAA;IAC3B,iEAAyC,CAAA;IACzC,qEAA6C,CAAA;IAC7C,gDAAwB,CAAA;IACxB,6CAAqB,CAAA;IACrB,qEAA6C,CAAA;IAC7C,yEAAiD,CAAA;IACjD,yCAAiB,CAAA;IACjB,iDAAyB,CAAA;IACzB,0DAAkC,CAAA;IAClC,6DAAqC,CAAA;IACrC,iEAAyC,CAAA;AAC1C,CAAC,EAvEW,oBAAoB,KAApB,oBAAoB,QAuE/B"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Allocating the contract code for an EXTENDED BA contract — AD-3416.
3
+ *
4
+ * A BA contract's base code comes from a per-context `SeqMetadata` counter,
5
+ * read and incremented under a `pessimistic_write` lock
6
+ * (create.ba.contract.controller.ts). Every base code in a context is
7
+ * therefore distinct, and distinct even under concurrent creates.
8
+ *
9
+ * Extending a contract did not go anywhere near that. It derived the new code
10
+ * from the old one by string arithmetic alone — `1065` -> `1065E1`,
11
+ * `1065E1` -> `1065E2` — with no idea what already existed. And the block
12
+ * that would have retired the extended contract's parent is commented out in
13
+ * extend.ba.contract.ts, so the parent stays extendable: extend `1065`, let
14
+ * `1065E1` be surrendered or cancelled, extend `1065` again, and the second
15
+ * extension is minted as `1065E1` as well. Two distinct contract rows, one
16
+ * code.
17
+ *
18
+ * That matters because the BA Payout template emits one row per contract row
19
+ * while the upload validator, the payout calculator and the save path all key
20
+ * contracts by CODE. Both rows then validate against whichever duplicate the
21
+ * in-memory map kept last, and the application's own unedited template is
22
+ * rejected on upload (AD-3416; first reported as ISSUE-4 on AD-3288). On
23
+ * staging this had happened ten times, most recently on 25/09/2026, where
24
+ * extending `1073` twice produced two `1073E1` rows ninety seconds apart.
25
+ *
26
+ * `selectBAPayoutContracts` softens the symptom by collapsing records that
27
+ * share (BA, code, vehicle) to the most recently edited one, but that is a
28
+ * read-side tie-break for records keyed in twice, not a fix: applied to two
29
+ * genuinely different contracts it silently drops one of them from the
30
+ * payout. The ambiguity has to be prevented where it is created.
31
+ *
32
+ * So this module answers the allocation question instead of guessing it:
33
+ * given the code being extended and the codes already in use, what is the
34
+ * first extension suffix nobody has taken? The caller supplies the in-use set
35
+ * — everything in the same business context, which is the scope base codes
36
+ * are numbered in (on staging, no code is shared by two BAs inside one
37
+ * context) — and holds a lock while it does, so two simultaneous extensions
38
+ * cannot both read the same set.
39
+ */
40
+ /** `1065E2` -> base `1065`, extension 2. A code with no suffix is extension 0. */
41
+ export interface BAContractCodeParts {
42
+ base: string;
43
+ extension: number;
44
+ }
45
+ /**
46
+ * Split a contract code into the part that identifies the contract family and
47
+ * the extension number.
48
+ *
49
+ * The pattern is the one the old generator used, kept deliberately: `(.+)E(\d+)`
50
+ * anchored at the end. Base codes are plain integers from the sequence
51
+ * counter, so the only `E` in a well-formed code is the extension marker.
52
+ */
53
+ export declare function splitBAContractCode(code: unknown): BAContractCodeParts;
54
+ /**
55
+ * The first extension code of `oldContractCode` that is not already in use.
56
+ *
57
+ * `usedCodes` is every contract code already allocated in the scope the
58
+ * caller is protecting — for extend.ba.contract.ts, every code in the
59
+ * business context, whatever its status. Cancelled and Surrendered rows are
60
+ * deliberately included: their codes are still printed on payout statements,
61
+ * still stored on `BAPayoutRow.contractNo`, and still what the upload
62
+ * validator looks up, so reusing one recreates exactly the ambiguity this
63
+ * exists to stop.
64
+ *
65
+ * Codes are compared after `normalizeBAContractCode` (trim + upper), the same
66
+ * normalization `resolveBAPayoutContract` uses to decide that an uploaded row
67
+ * names a given contract. The two answers cannot disagree.
68
+ *
69
+ * Note that this does NOT guarantee the returned suffix is the old one plus
70
+ * one. Extending `1065` when `1065E1` is taken yields `1065E2`, which is the
71
+ * point: the code names a row, not a position in a chain, and nothing in the
72
+ * codebase parses it to find a parent (the parent is a foreign key).
73
+ */
74
+ export declare function nextExtendedContractCode(oldContractCode: unknown, usedCodes: Iterable<unknown> | null | undefined): string;
@@ -0,0 +1,69 @@
1
+ import { normalizeBAContractCode } from './ba.payout.contract.selection';
2
+ /**
3
+ * Split a contract code into the part that identifies the contract family and
4
+ * the extension number.
5
+ *
6
+ * The pattern is the one the old generator used, kept deliberately: `(.+)E(\d+)`
7
+ * anchored at the end. Base codes are plain integers from the sequence
8
+ * counter, so the only `E` in a well-formed code is the extension marker.
9
+ */
10
+ export function splitBAContractCode(code) {
11
+ const normalized = normalizeBAContractCode(code);
12
+ const match = normalized.match(/^(.+)E(\d+)$/);
13
+ if (!match)
14
+ return { base: normalized, extension: 0 };
15
+ const extension = parseInt(match[2], 10);
16
+ // `E0`, or a suffix so long it does not survive parseInt, is not something
17
+ // this codebase mints; treat the whole string as the family rather than
18
+ // inventing an extension number from it.
19
+ if (!Number.isFinite(extension) || extension < 1) {
20
+ return { base: normalized, extension: 0 };
21
+ }
22
+ return { base: match[1], extension };
23
+ }
24
+ /**
25
+ * How far the walk will go before giving up. A context would need this many
26
+ * extensions of one contract to reach it; hitting it means the in-use set is
27
+ * wrong, and an error naming the code is far more useful than a silent
28
+ * duplicate or a hung request.
29
+ */
30
+ const MAX_EXTENSION_SEARCH = 1000;
31
+ /**
32
+ * The first extension code of `oldContractCode` that is not already in use.
33
+ *
34
+ * `usedCodes` is every contract code already allocated in the scope the
35
+ * caller is protecting — for extend.ba.contract.ts, every code in the
36
+ * business context, whatever its status. Cancelled and Surrendered rows are
37
+ * deliberately included: their codes are still printed on payout statements,
38
+ * still stored on `BAPayoutRow.contractNo`, and still what the upload
39
+ * validator looks up, so reusing one recreates exactly the ambiguity this
40
+ * exists to stop.
41
+ *
42
+ * Codes are compared after `normalizeBAContractCode` (trim + upper), the same
43
+ * normalization `resolveBAPayoutContract` uses to decide that an uploaded row
44
+ * names a given contract. The two answers cannot disagree.
45
+ *
46
+ * Note that this does NOT guarantee the returned suffix is the old one plus
47
+ * one. Extending `1065` when `1065E1` is taken yields `1065E2`, which is the
48
+ * point: the code names a row, not a position in a chain, and nothing in the
49
+ * codebase parses it to find a parent (the parent is a foreign key).
50
+ */
51
+ export function nextExtendedContractCode(oldContractCode, usedCodes) {
52
+ const { base, extension } = splitBAContractCode(oldContractCode);
53
+ if (!base) {
54
+ throw new Error('Cannot allocate an extended contract code: the contract being extended has no code');
55
+ }
56
+ const taken = new Set();
57
+ for (const code of usedCodes || []) {
58
+ const normalized = normalizeBAContractCode(code);
59
+ if (normalized)
60
+ taken.add(normalized);
61
+ }
62
+ for (let next = extension + 1; next <= extension + MAX_EXTENSION_SEARCH; next++) {
63
+ const candidate = `${base}E${next}`;
64
+ if (!taken.has(candidate))
65
+ return candidate;
66
+ }
67
+ throw new Error(`Cannot allocate an extended contract code for ${base}: ${MAX_EXTENSION_SEARCH} consecutive suffixes from E${extension + 1} are already in use`);
68
+ }
69
+ //# sourceMappingURL=ba.contract.extension.code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ba.contract.extension.code.js","sourceRoot":"","sources":["../../../../../../../libs/shared/src/lib/utilities/src/ba.contract.extension.code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAgDzE;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAChD,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAEtD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,2EAA2E;IAC3E,wEAAwE;IACxE,yCAAyC;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAElC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,wBAAwB,CACvC,eAAwB,EACxB,SAA+C;IAE/C,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjE,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACd,oFAAoF,CACpF,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,SAAS,IAAI,EAAE,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,UAAU;YAAE,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAED,KACC,IAAI,IAAI,GAAG,SAAS,GAAG,CAAC,EACxB,IAAI,IAAI,SAAS,GAAG,oBAAoB,EACxC,IAAI,EAAE,EACL,CAAC;QACF,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC7C,CAAC;IAED,MAAM,IAAI,KAAK,CACd,iDAAiD,IAAI,KAAK,oBAAoB,+BAA+B,SAAS,GAAG,CAAC,qBAAqB,CAC/I,CAAC;AACH,CAAC"}
@@ -50,4 +50,5 @@ export * from './financial.year';
50
50
  export * from './vendor.operations.log';
51
51
  export * from './booking.selected.package.gate';
52
52
  export * from './ba.payout.contract.selection';
53
+ export * from './ba.contract.extension.code';
53
54
  export * from './ba.contract.rm.refund';
@@ -50,5 +50,6 @@ export * from './financial.year';
50
50
  export * from './vendor.operations.log';
51
51
  export * from './booking.selected.package.gate';
52
52
  export * from './ba.payout.contract.selection';
53
+ export * from './ba.contract.extension.code';
53
54
  export * from './ba.contract.rm.refund';
54
55
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../libs/shared/src/lib/utilities/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,YAAY,CAAC;AAC3B,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,OAAO,CAAC;AACtB,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,sBAAsB,CAAC;AACrC,cAAc,qCAAqC,CAAC;AACpD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qCAAqC,CAAC;AACpD,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uCAAuC,CAAC;AACtD,cAAc,mBAAmB,CAAC;AAClC,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iCAAiC,CAAC;AAChD,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../libs/shared/src/lib/utilities/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,YAAY,CAAC;AAC3B,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,OAAO,CAAC;AACtB,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,sBAAsB,CAAC;AACrC,cAAc,qCAAqC,CAAC;AACpD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qCAAqC,CAAC;AACpD,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uCAAuC,CAAC;AACtD,cAAc,mBAAmB,CAAC;AAClC,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iCAAiC,CAAC;AAChD,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC"}