@novha/calc-engines 1.6.4 → 1.7.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 (39) hide show
  1. package/dist/corporate/canada/CanadaCorporateTaxService.js +3 -0
  2. package/dist/corporate/canada/CanadaCorporateTaxServiceImpl.js +54 -0
  3. package/dist/corporate/canada/domain/types.js +3 -0
  4. package/dist/corporate/domain/types.js +2 -0
  5. package/dist/corporate/france/FranceCorporateTaxService.js +3 -0
  6. package/dist/corporate/france/FranceCorporateTaxServiceImpl.js +59 -0
  7. package/dist/corporate/france/domain/types.js +3 -0
  8. package/dist/corporate/south-africa/SouthAfricaCorporateTaxService.js +3 -0
  9. package/dist/corporate/south-africa/SouthAfricaCorporateTaxServiceImpl.js +56 -0
  10. package/dist/corporate/south-africa/domain/types.js +3 -0
  11. package/dist/index.js +8 -2
  12. package/dist/mortgage/canada/CanadaMortgageServiceImpl.js +2 -2
  13. package/dist/mortgage/canada/domain/types.js +1 -1
  14. package/dist/types/corporate/canada/CanadaCorporateTaxService.d.ts +4 -0
  15. package/dist/types/corporate/canada/CanadaCorporateTaxServiceImpl.d.ts +9 -0
  16. package/dist/types/corporate/canada/domain/types.d.ts +42 -0
  17. package/dist/types/corporate/domain/types.d.ts +0 -0
  18. package/dist/types/corporate/france/FranceCorporateTaxService.d.ts +4 -0
  19. package/dist/types/corporate/france/FranceCorporateTaxServiceImpl.d.ts +9 -0
  20. package/dist/types/corporate/france/domain/types.d.ts +48 -0
  21. package/dist/types/corporate/south-africa/SouthAfricaCorporateTaxService.d.ts +4 -0
  22. package/dist/types/corporate/south-africa/SouthAfricaCorporateTaxServiceImpl.d.ts +9 -0
  23. package/dist/types/corporate/south-africa/domain/types.d.ts +32 -0
  24. package/dist/types/index.d.ts +6 -0
  25. package/dist/types/mortgage/canada/domain/types.d.ts +1 -1
  26. package/package.json +1 -1
  27. package/src/corporate/canada/CanadaCorporateTaxService.ts +5 -0
  28. package/src/corporate/canada/CanadaCorporateTaxServiceImpl.ts +67 -0
  29. package/src/corporate/canada/domain/types.ts +54 -0
  30. package/src/corporate/domain/types.ts +0 -0
  31. package/src/corporate/france/FranceCorporateTaxService.ts +5 -0
  32. package/src/corporate/france/FranceCorporateTaxServiceImpl.ts +73 -0
  33. package/src/corporate/france/domain/types.ts +60 -0
  34. package/src/corporate/south-africa/SouthAfricaCorporateTaxService.ts +5 -0
  35. package/src/corporate/south-africa/SouthAfricaCorporateTaxServiceImpl.ts +74 -0
  36. package/src/corporate/south-africa/domain/types.ts +40 -0
  37. package/src/index.ts +20 -0
  38. package/src/mortgage/canada/CanadaMortgageServiceImpl.ts +1 -1
  39. package/src/mortgage/canada/domain/types.ts +1 -1
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FuYWRhQ29ycG9yYXRlVGF4U2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3Jwb3JhdGUvY2FuYWRhL0NhbmFkYUNvcnBvcmF0ZVRheFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElucHV0LCBSdWxlcywgUmVzdWx0IH0gZnJvbSAnLi4vY2FuYWRhL2RvbWFpbi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuYWRhQ29ycG9yYXRlVGF4U2VydmljZSB7XG4gICAgY2FsY3VsYXRlKCk6IFJlc3VsdDtcbn0iXX0=
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CanadaCorporateTaxServiceImpl = void 0;
4
+ class CanadaCorporateTaxServiceImpl {
5
+ constructor(input, rules) {
6
+ this._input = input;
7
+ this._rules = rules;
8
+ }
9
+ calculate() {
10
+ const result = this.applyRules(this._rules, this._input);
11
+ const totalTax = result.tax;
12
+ return {
13
+ corporateTax: totalTax,
14
+ effectiveTaxRate: this._input.taxableIncome > 0
15
+ ? (totalTax / this._input.taxableIncome) * 100
16
+ : 0,
17
+ breakdown: result.breakdown,
18
+ };
19
+ }
20
+ applyRules(rules, input) {
21
+ const regime = input.isSmallBusiness
22
+ ? rules.regimes.smallBusiness
23
+ : rules.regimes.general;
24
+ if (regime.type === 'flat') {
25
+ const tax = input.taxableIncome * regime.rate;
26
+ return {
27
+ tax,
28
+ breakdown: { flatTax: tax },
29
+ };
30
+ }
31
+ if (regime.type === 'progressive') {
32
+ let remaining = input.taxableIncome;
33
+ let tax = 0;
34
+ const breakdown = {};
35
+ for (const bracket of regime.brackets) {
36
+ if (remaining <= 0)
37
+ break;
38
+ const upper = bracket.to ?? Infinity;
39
+ const taxable = Math.min(upper - bracket.from, remaining);
40
+ const bracketTax = taxable * bracket.rate;
41
+ tax += bracketTax;
42
+ remaining -= taxable;
43
+ const bracketKey = bracket.to === null
44
+ ? `bracket_${bracket.from}_and_above`
45
+ : `bracket_${bracket.from}_to_${bracket.to}`;
46
+ breakdown[bracketKey] = bracketTax;
47
+ }
48
+ return { tax, breakdown };
49
+ }
50
+ throw new Error('Unsupported regime type');
51
+ }
52
+ }
53
+ exports.CanadaCorporateTaxServiceImpl = CanadaCorporateTaxServiceImpl;
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FuYWRhQ29ycG9yYXRlVGF4U2VydmljZUltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29ycG9yYXRlL2NhbmFkYS9DYW5hZGFDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxNQUFhLDZCQUE2QjtJQUl0QyxZQUFZLEtBQVksRUFBRSxLQUFZO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxTQUFTO1FBQ0wsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV6RCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBRTVCLE9BQU87WUFDSCxZQUFZLEVBQUUsUUFBUTtZQUN0QixnQkFBZ0IsRUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsR0FBRyxDQUFDO2dCQUN6QixDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHO2dCQUM5QyxDQUFDLENBQUMsQ0FBQztZQUNYLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztTQUM5QixDQUFDO0lBQ04sQ0FBQztJQUVPLFVBQVUsQ0FBQyxLQUFZLEVBQUUsS0FBWTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsZUFBZTtZQUNoQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhO1lBQzdCLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUU1QixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDekIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzlDLE9BQU87Z0JBQ0gsR0FBRztnQkFDSCxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFO2FBQzlCLENBQUM7UUFDTixDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFBRSxDQUFDO1lBQ2hDLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7WUFDcEMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ1osTUFBTSxTQUFTLEdBQTJCLEVBQUUsQ0FBQztZQUU3QyxLQUFLLE1BQU0sT0FBTyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDcEMsSUFBSSxTQUFTLElBQUksQ0FBQztvQkFBRSxNQUFNO2dCQUUxQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQztnQkFDckMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFFMUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQzFDLEdBQUcsSUFBSSxVQUFVLENBQUM7Z0JBQ2xCLFNBQVMsSUFBSSxPQUFPLENBQUM7Z0JBRXJCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEtBQUssSUFBSTtvQkFDbEMsQ0FBQyxDQUFDLFdBQVcsT0FBTyxDQUFDLElBQUksWUFBWTtvQkFDckMsQ0FBQyxDQUFDLFdBQVcsT0FBTyxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2pELFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxVQUFVLENBQUM7WUFDdkMsQ0FBQztZQUVELE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0NBQ0o7QUEvREQsc0VBK0RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUnVsZXMsIElucHV0LCBSZXN1bHQsIFByb2dyZXNzaXZlVGF4QnJhY2tldCB9IGZyb20gJy4vZG9tYWluL3R5cGVzJztcbmltcG9ydCB7IENhbmFkYUNvcnBvcmF0ZVRheFNlcnZpY2UgfSBmcm9tICcuL0NhbmFkYUNvcnBvcmF0ZVRheFNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgQ2FuYWRhQ29ycG9yYXRlVGF4U2VydmljZUltcGwgaW1wbGVtZW50cyBDYW5hZGFDb3Jwb3JhdGVUYXhTZXJ2aWNlIHtcbiAgICBwcml2YXRlIF9pbnB1dDogSW5wdXQ7XG4gICAgcHJpdmF0ZSBfcnVsZXM6IFJ1bGVzO1xuXG4gICAgY29uc3RydWN0b3IoaW5wdXQ6IElucHV0LCBydWxlczogUnVsZXMpIHtcbiAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5fcnVsZXMgPSBydWxlcztcbiAgICB9XG5cbiAgICBjYWxjdWxhdGUoKTogUmVzdWx0IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5hcHBseVJ1bGVzKHRoaXMuX3J1bGVzLCB0aGlzLl9pbnB1dCk7XG5cbiAgICAgICAgY29uc3QgdG90YWxUYXggPSByZXN1bHQudGF4O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb3Jwb3JhdGVUYXg6IHRvdGFsVGF4LFxuICAgICAgICAgICAgZWZmZWN0aXZlVGF4UmF0ZTpcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dC50YXhhYmxlSW5jb21lID4gMFxuICAgICAgICAgICAgICAgICAgICA/ICh0b3RhbFRheCAvIHRoaXMuX2lucHV0LnRheGFibGVJbmNvbWUpICogMTAwXG4gICAgICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgIGJyZWFrZG93bjogcmVzdWx0LmJyZWFrZG93bixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5UnVsZXMocnVsZXM6IFJ1bGVzLCBpbnB1dDogSW5wdXQpOiB7IHRheDogbnVtYmVyOyBicmVha2Rvd246IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfSB7XG4gICAgICAgIGNvbnN0IHJlZ2ltZSA9IGlucHV0LmlzU21hbGxCdXNpbmVzc1xuICAgICAgICAgICAgPyBydWxlcy5yZWdpbWVzLnNtYWxsQnVzaW5lc3NcbiAgICAgICAgICAgIDogcnVsZXMucmVnaW1lcy5nZW5lcmFsO1xuXG4gICAgICAgIGlmIChyZWdpbWUudHlwZSA9PT0gJ2ZsYXQnKSB7XG4gICAgICAgICAgICBjb25zdCB0YXggPSBpbnB1dC50YXhhYmxlSW5jb21lICogcmVnaW1lLnJhdGU7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRheCxcbiAgICAgICAgICAgICAgICBicmVha2Rvd246IHsgZmxhdFRheDogdGF4IH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlZ2ltZS50eXBlID09PSAncHJvZ3Jlc3NpdmUnKSB7XG4gICAgICAgICAgICBsZXQgcmVtYWluaW5nID0gaW5wdXQudGF4YWJsZUluY29tZTtcbiAgICAgICAgICAgIGxldCB0YXggPSAwO1xuICAgICAgICAgICAgY29uc3QgYnJlYWtkb3duOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgYnJhY2tldCBvZiByZWdpbWUuYnJhY2tldHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDw9IDApIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdXBwZXIgPSBicmFja2V0LnRvID8/IEluZmluaXR5O1xuICAgICAgICAgICAgICAgIGNvbnN0IHRheGFibGUgPSBNYXRoLm1pbih1cHBlciAtIGJyYWNrZXQuZnJvbSwgcmVtYWluaW5nKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJyYWNrZXRUYXggPSB0YXhhYmxlICogYnJhY2tldC5yYXRlO1xuICAgICAgICAgICAgICAgIHRheCArPSBicmFja2V0VGF4O1xuICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSB0YXhhYmxlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYnJhY2tldEtleSA9IGJyYWNrZXQudG8gPT09IG51bGwgXG4gICAgICAgICAgICAgICAgICAgID8gYGJyYWNrZXRfJHticmFja2V0LmZyb219X2FuZF9hYm92ZWBcbiAgICAgICAgICAgICAgICAgICAgOiBgYnJhY2tldF8ke2JyYWNrZXQuZnJvbX1fdG9fJHticmFja2V0LnRvfWA7XG4gICAgICAgICAgICAgICAgYnJlYWtkb3duW2JyYWNrZXRLZXldID0gYnJhY2tldFRheDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHsgdGF4LCBicmVha2Rvd24gfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgcmVnaW1lIHR5cGUnKTtcbiAgICB9XG59Il19
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29ycG9yYXRlL2NhbmFkYS9kb21haW4vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIlxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2ltZUl0ZW0ge1xuICAgIHR5cGU6ICdmbGF0JyB8ICdwcm9ncmVzc2l2ZSc7XG4gICAgcmF0ZTogbnVtYmVyO1xuICAgIG1heEluY29tZT86IG51bWJlcjtcbiAgICBicmFja2V0cz86IFByb2dyZXNzaXZlVGF4QnJhY2tldFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2ltZSB7XG4gICAgZ2VuZXJhbDogUmVnaW1lSXRlbVtdO1xuICAgIHNtYWxsQnVzaW5lc3M6IFJlZ2ltZUl0ZW1bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnB1dCB7XG5cdHRheGFibGVJbmNvbWU6IG51bWJlcjtcbiAgICBpc1NtYWxsQnVzaW5lc3M6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3V0cHV0IHtcblx0bmFtZTogc3RyaW5nO1xuXHR0eXBlOiAnbnVtYmVyJyB8ICdzdHJpbmcnO1xuXHR1bml0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsYXRUYXhSdWxlIHtcblx0dHlwZTogJ2ZsYXQnO1xuXHRyYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZ3Jlc3NpdmVUYXhCcmFja2V0IHtcblx0ZnJvbTogbnVtYmVyO1xuXHR0bzogbnVtYmVyIHwgbnVsbDtcblx0cmF0ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2dyZXNzaXZlVGF4UnVsZSB7XG5cdHR5cGU6ICdwcm9ncmVzc2l2ZSc7XG5cdGJyYWNrZXRzOiBQcm9ncmVzc2l2ZVRheEJyYWNrZXRbXTtcblx0ZWxpZ2liaWxpdHk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgdHlwZSBUYXhSdWxlID0gRmxhdFRheFJ1bGUgfCBQcm9ncmVzc2l2ZVRheFJ1bGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZXMge1xuICBcdHJlZ2ltZXM6IFJlY29yZDxzdHJpbmcsIFRheFJ1bGU+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3VsdCB7XG5cdGNvcnBvcmF0ZVRheDogbnVtYmVyO1xuXHRlZmZlY3RpdmVUYXhSYXRlOiBudW1iZXI7XG5cdGJyZWFrZG93bjogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbn1cblxuIl19
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29ycG9yYXRlL2RvbWFpbi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiIl19
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnJhbmNlQ29ycG9yYXRlVGF4U2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3Jwb3JhdGUvZnJhbmNlL0ZyYW5jZUNvcnBvcmF0ZVRheFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc3VsdCB9IGZyb20gJy4vZG9tYWluL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBGcmFuY2VDb3Jwb3JhdGVUYXhTZXJ2aWNlIHtcbiAgICBjYWxjdWxhdGUoKTogUmVzdWx0O1xufSJdfQ==
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FranceCorporateTaxServiceImpl = void 0;
4
+ class FranceCorporateTaxServiceImpl {
5
+ constructor(input, rules) {
6
+ this._input = input;
7
+ this._rules = rules;
8
+ }
9
+ calculate() {
10
+ const result = this.applyRules(this._rules, this._input);
11
+ const totalTax = result.tax;
12
+ return {
13
+ corporateTax: totalTax,
14
+ effectiveTaxRate: this._input.taxableIncome > 0
15
+ ? (totalTax / this._input.taxableIncome) * 100
16
+ : 0,
17
+ breakdown: result.breakdown,
18
+ };
19
+ }
20
+ applyRules(rules, input) {
21
+ const regime = input.isSmallBusiness
22
+ ? rules.regimes.smallBusiness
23
+ : rules.regimes.general;
24
+ if (regime.conditions?.maxTurnover) {
25
+ if (input.annualTurnover > regime.conditions.maxTurnover) {
26
+ throw new Error('SME regime not applicable: turnover exceeded');
27
+ }
28
+ }
29
+ if (regime.type === 'flat') {
30
+ const tax = input.taxableIncome * regime.rate;
31
+ return {
32
+ tax,
33
+ breakdown: { flatTax: tax },
34
+ };
35
+ }
36
+ if (regime.type === 'progressive') {
37
+ let remaining = input.taxableIncome;
38
+ let tax = 0;
39
+ const breakdown = {};
40
+ for (const bracket of regime.brackets) {
41
+ if (remaining <= 0)
42
+ break;
43
+ const upper = bracket.to ?? Infinity;
44
+ const taxable = Math.min(upper - bracket.from, remaining);
45
+ const bracketTax = taxable * bracket.rate;
46
+ tax += bracketTax;
47
+ remaining -= taxable;
48
+ const bracketKey = bracket.to === null
49
+ ? `bracket_${bracket.from}_and_above`
50
+ : `bracket_${bracket.from}_to_${bracket.to}`;
51
+ breakdown[bracketKey] = bracketTax;
52
+ }
53
+ return { tax, breakdown };
54
+ }
55
+ throw new Error('Unsupported regime type');
56
+ }
57
+ }
58
+ exports.FranceCorporateTaxServiceImpl = FranceCorporateTaxServiceImpl;
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnJhbmNlQ29ycG9yYXRlVGF4U2VydmljZUltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29ycG9yYXRlL2ZyYW5jZS9GcmFuY2VDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxNQUFhLDZCQUE2QjtJQUl0QyxZQUFZLEtBQVksRUFBRSxLQUFZO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxTQUFTO1FBQ0wsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV6RCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBRTVCLE9BQU87WUFDSCxZQUFZLEVBQUUsUUFBUTtZQUN0QixnQkFBZ0IsRUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsR0FBRyxDQUFDO2dCQUN6QixDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHO2dCQUM5QyxDQUFDLENBQUMsQ0FBQztZQUNYLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztTQUM5QixDQUFDO0lBQ04sQ0FBQztJQUVPLFVBQVUsQ0FBQyxLQUFZLEVBQUUsS0FBWTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsZUFBZTtZQUNoQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhO1lBQzdCLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUU1QixJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7WUFDakMsSUFBSSxLQUFLLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztZQUNwRSxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN6QixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDOUMsT0FBTztnQkFDSCxHQUFHO2dCQUNILFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7YUFDOUIsQ0FBQztRQUNOLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssYUFBYSxFQUFFLENBQUM7WUFDaEMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztZQUNwQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDWixNQUFNLFNBQVMsR0FBMkIsRUFBRSxDQUFDO1lBRTdDLEtBQUssTUFBTSxPQUFPLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNwQyxJQUFJLFNBQVMsSUFBSSxDQUFDO29CQUFFLE1BQU07Z0JBRTFCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksUUFBUSxDQUFDO2dCQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUUxRCxNQUFNLFVBQVUsR0FBRyxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDMUMsR0FBRyxJQUFJLFVBQVUsQ0FBQztnQkFDbEIsU0FBUyxJQUFJLE9BQU8sQ0FBQztnQkFFckIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEVBQUUsS0FBSyxJQUFJO29CQUNsQyxDQUFDLENBQUMsV0FBVyxPQUFPLENBQUMsSUFBSSxZQUFZO29CQUNyQyxDQUFDLENBQUMsV0FBVyxPQUFPLENBQUMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDakQsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFVBQVUsQ0FBQztZQUN2QyxDQUFDO1lBRUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7Q0FDSjtBQXJFRCxzRUFxRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSdWxlcywgSW5wdXQsIFJlc3VsdCwgUHJvZ3Jlc3NpdmVUYXhCcmFja2V0IH0gZnJvbSAnLi9kb21haW4vdHlwZXMnO1xuaW1wb3J0IHsgRnJhbmNlQ29ycG9yYXRlVGF4U2VydmljZSB9IGZyb20gJy4vRnJhbmNlQ29ycG9yYXRlVGF4U2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBGcmFuY2VDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEZyYW5jZUNvcnBvcmF0ZVRheFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX2lucHV0OiBJbnB1dDtcbiAgICBwcml2YXRlIF9ydWxlczogUnVsZXM7XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogSW5wdXQsIHJ1bGVzOiBSdWxlcykge1xuICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLl9ydWxlcyA9IHJ1bGVzO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZSgpOiBSZXN1bHQge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFwcGx5UnVsZXModGhpcy5fcnVsZXMsIHRoaXMuX2lucHV0KTtcblxuICAgICAgICBjb25zdCB0b3RhbFRheCA9IHJlc3VsdC50YXg7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvcnBvcmF0ZVRheDogdG90YWxUYXgsXG4gICAgICAgICAgICBlZmZlY3RpdmVUYXhSYXRlOlxuICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0LnRheGFibGVJbmNvbWUgPiAwXG4gICAgICAgICAgICAgICAgICAgID8gKHRvdGFsVGF4IC8gdGhpcy5faW5wdXQudGF4YWJsZUluY29tZSkgKiAxMDBcbiAgICAgICAgICAgICAgICAgICAgOiAwLFxuICAgICAgICAgICAgYnJlYWtkb3duOiByZXN1bHQuYnJlYWtkb3duLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwbHlSdWxlcyhydWxlczogUnVsZXMsIGlucHV0OiBJbnB1dCk6IHsgdGF4OiBudW1iZXI7IGJyZWFrZG93bjogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB9IHtcbiAgICAgICAgY29uc3QgcmVnaW1lID0gaW5wdXQuaXNTbWFsbEJ1c2luZXNzXG4gICAgICAgICAgICA/IHJ1bGVzLnJlZ2ltZXMuc21hbGxCdXNpbmVzc1xuICAgICAgICAgICAgOiBydWxlcy5yZWdpbWVzLmdlbmVyYWw7XG5cbiAgICAgICAgaWYgKHJlZ2ltZS5jb25kaXRpb25zPy5tYXhUdXJub3Zlcikge1xuICAgICAgICAgICAgaWYgKGlucHV0LmFubnVhbFR1cm5vdmVyID4gcmVnaW1lLmNvbmRpdGlvbnMubWF4VHVybm92ZXIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NNRSByZWdpbWUgbm90IGFwcGxpY2FibGU6IHR1cm5vdmVyIGV4Y2VlZGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVnaW1lLnR5cGUgPT09ICdmbGF0Jykge1xuICAgICAgICAgICAgY29uc3QgdGF4ID0gaW5wdXQudGF4YWJsZUluY29tZSAqIHJlZ2ltZS5yYXRlO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0YXgsXG4gICAgICAgICAgICAgICAgYnJlYWtkb3duOiB7IGZsYXRUYXg6IHRheCB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWdpbWUudHlwZSA9PT0gJ3Byb2dyZXNzaXZlJykge1xuICAgICAgICAgICAgbGV0IHJlbWFpbmluZyA9IGlucHV0LnRheGFibGVJbmNvbWU7XG4gICAgICAgICAgICBsZXQgdGF4ID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGJyZWFrZG93bjogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJyYWNrZXQgb2YgcmVnaW1lLmJyYWNrZXRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8PSAwKSBicmVhaztcblxuICAgICAgICAgICAgICAgIGNvbnN0IHVwcGVyID0gYnJhY2tldC50byA/PyBJbmZpbml0eTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXhhYmxlID0gTWF0aC5taW4odXBwZXIgLSBicmFja2V0LmZyb20sIHJlbWFpbmluZyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBicmFja2V0VGF4ID0gdGF4YWJsZSAqIGJyYWNrZXQucmF0ZTtcbiAgICAgICAgICAgICAgICB0YXggKz0gYnJhY2tldFRheDtcbiAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gdGF4YWJsZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJyYWNrZXRLZXkgPSBicmFja2V0LnRvID09PSBudWxsIFxuICAgICAgICAgICAgICAgICAgICA/IGBicmFja2V0XyR7YnJhY2tldC5mcm9tfV9hbmRfYWJvdmVgXG4gICAgICAgICAgICAgICAgICAgIDogYGJyYWNrZXRfJHticmFja2V0LmZyb219X3RvXyR7YnJhY2tldC50b31gO1xuICAgICAgICAgICAgICAgIGJyZWFrZG93blticmFja2V0S2V5XSA9IGJyYWNrZXRUYXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7IHRheCwgYnJlYWtkb3duIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHJlZ2ltZSB0eXBlJyk7XG4gICAgfVxufSJdfQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29ycG9yYXRlL2ZyYW5jZS9kb21haW4vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIlxuZXhwb3J0IGludGVyZmFjZSBSZWdpbWVDb25kaXRpb24ge1xuXHRtYXhUdXJub3ZlcjogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2ltZUl0ZW0ge1xuICAgIHR5cGU6ICdmbGF0JyB8ICdwcm9ncmVzc2l2ZSc7XG4gICAgcmF0ZT86IG51bWJlcjtcbiAgICBtYXhJbmNvbWU/OiBudW1iZXI7XG4gICAgYnJhY2tldHM/OiBQcm9ncmVzc2l2ZVRheEJyYWNrZXRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpbWUge1xuICAgIGdlbmVyYWw6IFJlZ2ltZUl0ZW1bXTtcbiAgICBzbWFsbEJ1c2luZXNzOiBSZWdpbWVJdGVtW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5wdXQge1xuXHR0YXhhYmxlSW5jb21lOiBudW1iZXI7XG5cdGFubnVhbFR1cm5vdmVyOiBudW1iZXI7XG4gICAgaXNTbWFsbEJ1c2luZXNzOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE91dHB1dCB7XG5cdG5hbWU6IHN0cmluZztcblx0dHlwZTogJ251bWJlcicgfCAnc3RyaW5nJztcblx0dW5pdD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGbGF0VGF4UnVsZSB7XG5cdHR5cGU6ICdmbGF0Jztcblx0cmF0ZTogbnVtYmVyO1xuXHRjb25kaXRpb25zPzogUmVnaW1lQ29uZGl0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2dyZXNzaXZlVGF4QnJhY2tldCB7XG5cdGZyb206IG51bWJlcjtcblx0dG86IG51bWJlciB8IG51bGw7XG5cdHJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9ncmVzc2l2ZVRheFJ1bGUge1xuXHR0eXBlOiAncHJvZ3Jlc3NpdmUnO1xuXHRicmFja2V0czogUHJvZ3Jlc3NpdmVUYXhCcmFja2V0W107XG5cdGVsaWdpYmlsaXR5PzogUmVjb3JkPHN0cmluZywgYW55Pjtcblx0Y29uZGl0aW9ucz86IFJlZ2ltZUNvbmRpdGlvbjtcbn1cblxuZXhwb3J0IHR5cGUgVGF4UnVsZSA9IEZsYXRUYXhSdWxlIHwgUHJvZ3Jlc3NpdmVUYXhSdWxlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVzIHtcbiAgXHRyZWdpbWVzOiBSZWNvcmQ8c3RyaW5nLCBUYXhSdWxlPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXN1bHQge1xuXHRjb3Jwb3JhdGVUYXg6IG51bWJlcjtcblx0ZWZmZWN0aXZlVGF4UmF0ZTogbnVtYmVyO1xuXHRicmVha2Rvd246IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG59XG5cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291dGhBZnJpY2FDb3Jwb3JhdGVUYXhTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcnBvcmF0ZS9zb3V0aC1hZnJpY2EvU291dGhBZnJpY2FDb3Jwb3JhdGVUYXhTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXN1bHQgfSBmcm9tICcuL2RvbWFpbi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU291dGhBZnJpY2FDb3Jwb3JhdGVUYXhTZXJ2aWNlIHtcbiAgICBjYWxjdWxhdGUoKTogUmVzdWx0O1xufSAiXX0=
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SouthAfricaCorporateTaxServiceImpl = void 0;
4
+ class SouthAfricaCorporateTaxServiceImpl {
5
+ constructor(input, rules) {
6
+ this._input = input;
7
+ this._rules = rules;
8
+ }
9
+ calculate() {
10
+ const rule = this._rules.regimes[this._input.regime];
11
+ if (!rule) {
12
+ throw new Error(`Unknown tax regime: ${this._input.regime}`);
13
+ }
14
+ let tax = 0;
15
+ let breakdown = {};
16
+ if (rule.type === 'flat') {
17
+ tax = this._input.taxableIncome * rule.rate;
18
+ breakdown = {
19
+ flatTax: tax
20
+ };
21
+ }
22
+ if (rule.type === 'progressive') {
23
+ const result = this.calculateProgressiveTax(this._input.taxableIncome, rule.brackets);
24
+ tax = result.total;
25
+ breakdown = result.breakdown;
26
+ }
27
+ return {
28
+ corporateTax: tax,
29
+ effectiveTaxRate: this._input.taxableIncome > 0
30
+ ? (tax / this._input.taxableIncome) * 100
31
+ : 0,
32
+ breakdown,
33
+ };
34
+ }
35
+ calculateProgressiveTax(income, brackets) {
36
+ let tax = 0;
37
+ const breakdown = {};
38
+ for (const bracket of brackets) {
39
+ if (income <= bracket.from)
40
+ continue;
41
+ const upperLimit = bracket.to === null ? income : Math.min(income, bracket.to);
42
+ const taxableAmount = upperLimit - bracket.from;
43
+ if (taxableAmount > 0) {
44
+ const bracketTax = taxableAmount * bracket.rate;
45
+ tax += bracketTax;
46
+ const bracketKey = bracket.to === null
47
+ ? `bracket_${bracket.from}_and_above`
48
+ : `bracket_${bracket.from}_to_${bracket.to}`;
49
+ breakdown[bracketKey] = bracketTax;
50
+ }
51
+ }
52
+ return { total: tax, breakdown };
53
+ }
54
+ }
55
+ exports.SouthAfricaCorporateTaxServiceImpl = SouthAfricaCorporateTaxServiceImpl;
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291dGhBZnJpY2FDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3Jwb3JhdGUvc291dGgtYWZyaWNhL1NvdXRoQWZyaWNhQ29ycG9yYXRlVGF4U2VydmljZUltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsTUFBYSxrQ0FBa0M7SUFJM0MsWUFBWSxLQUFZLEVBQUUsS0FBWTtRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRUQsU0FBUztRQUNMLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1IsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFFRCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixJQUFJLFNBQVMsR0FBMkIsRUFBRSxDQUFDO1FBRTNDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN2QixHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUM1QyxTQUFTLEdBQUc7Z0JBQ1IsT0FBTyxFQUFFLEdBQUc7YUFDZixDQUFDO1FBQ04sQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLEVBQUUsQ0FBQztZQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUN6QixJQUFJLENBQUMsUUFBUSxDQUNoQixDQUFDO1lBQ0YsR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDbkIsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDakMsQ0FBQztRQUVELE9BQU87WUFDSCxZQUFZLEVBQUUsR0FBRztZQUNqQixnQkFBZ0IsRUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsQ0FBQztnQkFDekIsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsR0FBRztnQkFDekMsQ0FBQyxDQUFDLENBQUM7WUFDUCxTQUFTO1NBQ1osQ0FBQztJQUNOLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxNQUFjLEVBQUUsUUFBaUM7UUFDN0UsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1osTUFBTSxTQUFTLEdBQTJCLEVBQUUsQ0FBQztRQUU3QyxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzdCLElBQUksTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJO2dCQUFFLFNBQVM7WUFFckMsTUFBTSxVQUFVLEdBQ2hCLE9BQU8sQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUU1RCxNQUFNLGFBQWEsR0FBRyxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztZQUVoRCxJQUFJLGFBQWEsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxVQUFVLEdBQUcsYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2hELEdBQUcsSUFBSSxVQUFVLENBQUM7Z0JBRWxCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEtBQUssSUFBSTtvQkFDbEMsQ0FBQyxDQUFDLFdBQVcsT0FBTyxDQUFDLElBQUksWUFBWTtvQkFDckMsQ0FBQyxDQUFDLFdBQVcsT0FBTyxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2pELFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxVQUFVLENBQUM7WUFDdkMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0NBQ0o7QUF0RUQsZ0ZBc0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUnVsZXMsIElucHV0LCBSZXN1bHQsIFByb2dyZXNzaXZlVGF4QnJhY2tldCB9IGZyb20gJy4vZG9tYWluL3R5cGVzJztcbmltcG9ydCB7IFNvdXRoQWZyaWNhQ29ycG9yYXRlVGF4U2VydmljZSB9IGZyb20gJy4vU291dGhBZnJpY2FDb3Jwb3JhdGVUYXhTZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFNvdXRoQWZyaWNhQ29ycG9yYXRlVGF4U2VydmljZUltcGwgaW1wbGVtZW50cyBTb3V0aEFmcmljYUNvcnBvcmF0ZVRheFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX2lucHV0OiBJbnB1dDtcbiAgICBwcml2YXRlIF9ydWxlczogUnVsZXM7XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogSW5wdXQsIHJ1bGVzOiBSdWxlcykge1xuICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLl9ydWxlcyA9IHJ1bGVzO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZSgpOiBSZXN1bHQge1xuICAgICAgICBjb25zdCBydWxlID0gdGhpcy5fcnVsZXMucmVnaW1lc1t0aGlzLl9pbnB1dC5yZWdpbWVdO1xuXG4gICAgICAgIGlmICghcnVsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHRheCByZWdpbWU6ICR7dGhpcy5faW5wdXQucmVnaW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRheCA9IDA7XG4gICAgICAgIGxldCBicmVha2Rvd246IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICAgICAgICBpZiAocnVsZS50eXBlID09PSAnZmxhdCcpIHtcbiAgICAgICAgICAgIHRheCA9IHRoaXMuX2lucHV0LnRheGFibGVJbmNvbWUgKiBydWxlLnJhdGU7XG4gICAgICAgICAgICBicmVha2Rvd24gPSB7XG4gICAgICAgICAgICAgICAgZmxhdFRheDogdGF4XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bGUudHlwZSA9PT0gJ3Byb2dyZXNzaXZlJykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jYWxjdWxhdGVQcm9ncmVzc2l2ZVRheChcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dC50YXhhYmxlSW5jb21lLFxuICAgICAgICAgICAgICAgIHJ1bGUuYnJhY2tldHNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0YXggPSByZXN1bHQudG90YWw7XG4gICAgICAgICAgICBicmVha2Rvd24gPSByZXN1bHQuYnJlYWtkb3duO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvcnBvcmF0ZVRheDogdGF4LFxuICAgICAgICAgICAgZWZmZWN0aXZlVGF4UmF0ZTpcbiAgICAgICAgICAgIHRoaXMuX2lucHV0LnRheGFibGVJbmNvbWUgPiAwXG4gICAgICAgICAgICAgICAgPyAodGF4IC8gdGhpcy5faW5wdXQudGF4YWJsZUluY29tZSkgKiAxMDBcbiAgICAgICAgICAgICAgICA6IDAsXG4gICAgICAgICAgICBicmVha2Rvd24sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVQcm9ncmVzc2l2ZVRheChpbmNvbWU6IG51bWJlciwgYnJhY2tldHM6IFByb2dyZXNzaXZlVGF4QnJhY2tldFtdKTogeyB0b3RhbDogbnVtYmVyOyBicmVha2Rvd246IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfSB7XG4gICAgICAgIGxldCB0YXggPSAwO1xuICAgICAgICBjb25zdCBicmVha2Rvd246IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IGJyYWNrZXQgb2YgYnJhY2tldHMpIHtcbiAgICAgICAgICAgIGlmIChpbmNvbWUgPD0gYnJhY2tldC5mcm9tKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgdXBwZXJMaW1pdCA9XG4gICAgICAgICAgICBicmFja2V0LnRvID09PSBudWxsID8gaW5jb21lIDogTWF0aC5taW4oaW5jb21lLCBicmFja2V0LnRvKTtcblxuICAgICAgICAgICAgY29uc3QgdGF4YWJsZUFtb3VudCA9IHVwcGVyTGltaXQgLSBicmFja2V0LmZyb207XG5cbiAgICAgICAgICAgIGlmICh0YXhhYmxlQW1vdW50ID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJyYWNrZXRUYXggPSB0YXhhYmxlQW1vdW50ICogYnJhY2tldC5yYXRlO1xuICAgICAgICAgICAgICAgIHRheCArPSBicmFja2V0VGF4O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGJyYWNrZXRLZXkgPSBicmFja2V0LnRvID09PSBudWxsIFxuICAgICAgICAgICAgICAgICAgICA/IGBicmFja2V0XyR7YnJhY2tldC5mcm9tfV9hbmRfYWJvdmVgXG4gICAgICAgICAgICAgICAgICAgIDogYGJyYWNrZXRfJHticmFja2V0LmZyb219X3RvXyR7YnJhY2tldC50b31gO1xuICAgICAgICAgICAgICAgIGJyZWFrZG93blticmFja2V0S2V5XSA9IGJyYWNrZXRUYXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyB0b3RhbDogdGF4LCBicmVha2Rvd24gfTtcbiAgICB9XG59ICJdfQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29ycG9yYXRlL3NvdXRoLWFmcmljYS9kb21haW4vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgSW5wdXQge1xuXHR0YXhhYmxlSW5jb21lOiBudW1iZXI7XG4gICAgcmVnaW1lOiAnTEFSR0UnIHwgJ1NCQyc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3V0cHV0IHtcblx0bmFtZTogc3RyaW5nO1xuXHR0eXBlOiAnbnVtYmVyJyB8ICdzdHJpbmcnO1xuXHR1bml0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsYXRUYXhSdWxlIHtcblx0dHlwZTogJ2ZsYXQnO1xuXHRyYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZ3Jlc3NpdmVUYXhCcmFja2V0IHtcblx0ZnJvbTogbnVtYmVyO1xuXHR0bzogbnVtYmVyIHwgbnVsbDtcblx0cmF0ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2dyZXNzaXZlVGF4UnVsZSB7XG5cdHR5cGU6ICdwcm9ncmVzc2l2ZSc7XG5cdGJyYWNrZXRzOiBQcm9ncmVzc2l2ZVRheEJyYWNrZXRbXTtcblx0ZWxpZ2liaWxpdHk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgdHlwZSBUYXhSdWxlID0gRmxhdFRheFJ1bGUgfCBQcm9ncmVzc2l2ZVRheFJ1bGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZXMge1xuICBcdHJlZ2ltZXM6IFJlY29yZDxzdHJpbmcsIFRheFJ1bGU+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3VsdCB7XG5cdGNvcnBvcmF0ZVRheDogbnVtYmVyO1xuXHRlZmZlY3RpdmVUYXhSYXRlOiBudW1iZXI7XG5cdGJyZWFrZG93bjogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbn1cblxuIl19
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.SouthAfricaMortgageService = exports.SouthAfricaIncomeTaxService = exports.FranceMortgageService = exports.FranceIncomeTaxService = exports.CanadaMortgageService = exports.CanadaIncomeTaxService = exports.CalculatorType = void 0;
17
+ exports.SouthAfricaCorporateTaxService = exports.SouthAfricaMortgageService = exports.SouthAfricaIncomeTaxService = exports.FranceCorporateTaxService = exports.FranceMortgageService = exports.FranceIncomeTaxService = exports.CanadaCorporateTaxService = exports.CanadaMortgageService = exports.CanadaIncomeTaxService = exports.CalculatorType = void 0;
18
18
  var types_1 = require("./shared/domain/types");
19
19
  Object.defineProperty(exports, "CalculatorType", { enumerable: true, get: function () { return types_1.CalculatorType; } });
20
20
  // Canada
@@ -22,15 +22,21 @@ var CanadaIncomeTaxServiceImpl_1 = require("./income-tax/canada/CanadaIncomeTaxS
22
22
  Object.defineProperty(exports, "CanadaIncomeTaxService", { enumerable: true, get: function () { return CanadaIncomeTaxServiceImpl_1.CanadaIncomeTaxServiceImpl; } });
23
23
  var CanadaMortgageServiceImpl_1 = require("./mortgage/canada/CanadaMortgageServiceImpl");
24
24
  Object.defineProperty(exports, "CanadaMortgageService", { enumerable: true, get: function () { return CanadaMortgageServiceImpl_1.CanadaMortgageServiceImpl; } });
25
+ var CanadaCorporateTaxServiceImpl_1 = require("./corporate/canada/CanadaCorporateTaxServiceImpl");
26
+ Object.defineProperty(exports, "CanadaCorporateTaxService", { enumerable: true, get: function () { return CanadaCorporateTaxServiceImpl_1.CanadaCorporateTaxServiceImpl; } });
25
27
  // France
26
28
  var FranceIncomeTaxServiceImpl_1 = require("./income-tax/france/FranceIncomeTaxServiceImpl");
27
29
  Object.defineProperty(exports, "FranceIncomeTaxService", { enumerable: true, get: function () { return FranceIncomeTaxServiceImpl_1.FranceIncomeTaxServiceImpl; } });
28
30
  var FranceMortgageServiceImpl_1 = require("./mortgage/france/FranceMortgageServiceImpl");
29
31
  Object.defineProperty(exports, "FranceMortgageService", { enumerable: true, get: function () { return FranceMortgageServiceImpl_1.FranceMortgageServiceImpl; } });
32
+ var FranceCorporateTaxServiceImpl_1 = require("./corporate/france/FranceCorporateTaxServiceImpl");
33
+ Object.defineProperty(exports, "FranceCorporateTaxService", { enumerable: true, get: function () { return FranceCorporateTaxServiceImpl_1.FranceCorporateTaxServiceImpl; } });
30
34
  // South Africa
31
35
  var SouthAfricaIncomeTaxServiceImpl_1 = require("./income-tax/south-africa/SouthAfricaIncomeTaxServiceImpl");
32
36
  Object.defineProperty(exports, "SouthAfricaIncomeTaxService", { enumerable: true, get: function () { return SouthAfricaIncomeTaxServiceImpl_1.SouthAfricaIncomeTaxServiceImpl; } });
33
37
  var SouthAfricaMortgageServiceImpl_1 = require("./mortgage/south-africa/SouthAfricaMortgageServiceImpl");
34
38
  Object.defineProperty(exports, "SouthAfricaMortgageService", { enumerable: true, get: function () { return SouthAfricaMortgageServiceImpl_1.SouthAfricaMortgageServiceImpl; } });
39
+ var SouthAfricaCorporateTaxServiceImpl_1 = require("./corporate/south-africa/SouthAfricaCorporateTaxServiceImpl");
40
+ Object.defineProperty(exports, "SouthAfricaCorporateTaxService", { enumerable: true, get: function () { return SouthAfricaCorporateTaxServiceImpl_1.SouthAfricaCorporateTaxServiceImpl; } });
35
41
  __exportStar(require("./income-tax/domain/types"), exports);
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBdUQ7QUFBOUMsdUdBQUEsY0FBYyxPQUFBO0FBRXZCLFNBQVM7QUFDVCw2RkFBc0g7QUFBN0csb0lBQUEsMEJBQTBCLE9BQTBCO0FBQzdELHlGQUFpSDtBQUF4RyxrSUFBQSx5QkFBeUIsT0FBeUI7QUFXM0QsU0FBUztBQUNULDZGQUFzSDtBQUE3RyxvSUFBQSwwQkFBMEIsT0FBMEI7QUFDN0QseUZBQWlIO0FBQXhHLGtJQUFBLHlCQUF5QixPQUF5QjtBQVczRCxlQUFlO0FBQ2YsNkdBQTJJO0FBQWxJLDhJQUFBLCtCQUErQixPQUErQjtBQUN2RSx5R0FBc0k7QUFBN0gsNElBQUEsOEJBQThCLE9BQThCO0FBYXJFLDREQUEwQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IENhbGN1bGF0b3JUeXBlIH0gZnJvbSAnLi9zaGFyZWQvZG9tYWluL3R5cGVzJztcblxuLy8gQ2FuYWRhXG5leHBvcnQgeyBDYW5hZGFJbmNvbWVUYXhTZXJ2aWNlSW1wbCBhcyBDYW5hZGFJbmNvbWVUYXhTZXJ2aWNlIH0gZnJvbSAnLi9pbmNvbWUtdGF4L2NhbmFkYS9DYW5hZGFJbmNvbWVUYXhTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBDYW5hZGFNb3J0Z2FnZVNlcnZpY2VJbXBsIGFzIENhbmFkYU1vcnRnYWdlU2VydmljZSB9IGZyb20gJy4vbW9ydGdhZ2UvY2FuYWRhL0NhbmFkYU1vcnRnYWdlU2VydmljZUltcGwnO1xuZXhwb3J0IHtcbiAgICBDb21wdXRlZEluY29tZVRheFZhbHVlcyBhcyBDYW5hZGFDb21wdXRlZEluY29tZVRheFZhbHVlcyxcbiAgICBJbmNvbWVUYXhSdWxlcyBhcyBDYW5hZGFJbmNvbWVUYXhSdWxlcyxcbn0gZnJvbSAnLi9pbmNvbWUtdGF4L2NhbmFkYS9kb21haW4vdHlwZXMnO1xuZXhwb3J0IHtcbiAgICBNb3J0Z2FnZVJ1bGVzIGFzIENhbmFkYU1vcnRnYWdlUnVsZXMsXG4gICAgTW9ydGdhZ2VDYWxjdWxhdGlvbklucHV0IGFzIENhbmFkYU1vcnRnYWdlQ2FsY3VsYXRpb25JbnB1dCxcbiAgICBNb3J0Z2FnZUNhbGN1bGF0aW9uUmVzdWx0IGFzIENhbmFkYU1vcnRnYWdlQ2FsY3VsYXRpb25SZXN1bHQsXG59IGZyb20gJy4vbW9ydGdhZ2UvY2FuYWRhL2RvbWFpbi90eXBlcyc7XG5cbi8vIEZyYW5jZVxuZXhwb3J0IHsgRnJhbmNlSW5jb21lVGF4U2VydmljZUltcGwgYXMgRnJhbmNlSW5jb21lVGF4U2VydmljZSB9IGZyb20gJy4vaW5jb21lLXRheC9mcmFuY2UvRnJhbmNlSW5jb21lVGF4U2VydmljZUltcGwnO1xuZXhwb3J0IHsgRnJhbmNlTW9ydGdhZ2VTZXJ2aWNlSW1wbCBhcyBGcmFuY2VNb3J0Z2FnZVNlcnZpY2UgfSBmcm9tICcuL21vcnRnYWdlL2ZyYW5jZS9GcmFuY2VNb3J0Z2FnZVNlcnZpY2VJbXBsJztcbmV4cG9ydCB7IFxuICAgIENvbXB1dGVkSW5jb21lVGF4VmFsdWVzIGFzIEZyYW5jZUNvbXB1dGVkSW5jb21lVGF4VmFsdWVzLFxuICAgIEluY29tZVRheFJ1bGVzIGFzIEZyYW5jZUluY29tZVRheFJ1bGVzLFxufSBmcm9tICcuL2luY29tZS10YXgvZnJhbmNlL2RvbWFpbi90eXBlcyc7XG5leHBvcnQge1xuICAgIE1vcnRnYWdlUnVsZXMgYXMgRnJhbmNlTW9ydGdhZ2VSdWxlcyxcbiAgICBNb3J0Z2FnZUlucHV0IGFzIEZyYW5jZU1vcnRnYWdlSW5wdXQsXG4gICAgTW9ydGdhZ2VPdXRwdXQgYXMgRnJhbmNlTW9ydGdhZ2VDYWxjdWxhdGlvblJlc3VsdCxcbn0gZnJvbSAnLi9tb3J0Z2FnZS9mcmFuY2UvZG9tYWluL3R5cGVzJztcblxuLy8gU291dGggQWZyaWNhXG5leHBvcnQgeyBTb3V0aEFmcmljYUluY29tZVRheFNlcnZpY2VJbXBsIGFzIFNvdXRoQWZyaWNhSW5jb21lVGF4U2VydmljZSB9IGZyb20gJy4vaW5jb21lLXRheC9zb3V0aC1hZnJpY2EvU291dGhBZnJpY2FJbmNvbWVUYXhTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBTb3V0aEFmcmljYU1vcnRnYWdlU2VydmljZUltcGwgYXMgU291dGhBZnJpY2FNb3J0Z2FnZVNlcnZpY2UgfSBmcm9tICcuL21vcnRnYWdlL3NvdXRoLWFmcmljYS9Tb3V0aEFmcmljYU1vcnRnYWdlU2VydmljZUltcGwnO1xuZXhwb3J0IHtcbiAgICBDb21wdXRlZEluY29tZVRheFZhbHVlcyBhcyBTb3V0aEFmcmljYUNvbXB1dGVkSW5jb21lVGF4VmFsdWVzLFxuICAgIEluY29tZVRheFJ1bGVzIGFzIFNvdXRoQWZyaWNhSW5jb21lVGF4UnVsZXMsXG59IGZyb20gJy4vaW5jb21lLXRheC9zb3V0aC1hZnJpY2EvZG9tYWluL3R5cGVzJztcbmV4cG9ydCB7XG4gICAgTW9ydGdhZ2VSdWxlcyBhcyBTb3V0aEFmcmljYU1vcnRnYWdlUnVsZXMsXG4gICAgTW9ydGdhZ2VJbnB1dCBhcyBTb3V0aEFmcmljYU1vcnRnYWdlSW5wdXQsXG4gICAgTW9ydGdhZ2VPdXRwdXQgYXMgU291dGhBZnJpY2FNb3J0Z2FnZU91dHB1dCxcbn0gZnJvbSAnLi9tb3J0Z2FnZS9zb3V0aC1hZnJpY2EvZG9tYWluL3R5cGVzJztcblxuXG5leHBvcnQgeyBJbmNvbWVUYXhDYWxjdWxhdG9yU2NoZW1hIH0gZnJvbSAnLi9pbmNvbWUtdGF4L2RvbWFpbi90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2luY29tZS10YXgvZG9tYWluL3R5cGVzJzsiXX0=
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBdUQ7QUFBOUMsdUdBQUEsY0FBYyxPQUFBO0FBRXZCLFNBQVM7QUFDVCw2RkFBc0g7QUFBN0csb0lBQUEsMEJBQTBCLE9BQTBCO0FBQzdELHlGQUFpSDtBQUF4RyxrSUFBQSx5QkFBeUIsT0FBeUI7QUFXM0Qsa0dBQThIO0FBQXJILDBJQUFBLDZCQUE2QixPQUE2QjtBQU9uRSxTQUFTO0FBQ1QsNkZBQXNIO0FBQTdHLG9JQUFBLDBCQUEwQixPQUEwQjtBQUM3RCx5RkFBaUg7QUFBeEcsa0lBQUEseUJBQXlCLE9BQXlCO0FBVzNELGtHQUE4SDtBQUFySCwwSUFBQSw2QkFBNkIsT0FBNkI7QUFPbkUsZUFBZTtBQUNmLDZHQUEySTtBQUFsSSw4SUFBQSwrQkFBK0IsT0FBK0I7QUFDdkUseUdBQXNJO0FBQTdILDRJQUFBLDhCQUE4QixPQUE4QjtBQVdyRSxrSEFBbUo7QUFBMUksb0pBQUEsa0NBQWtDLE9BQWtDO0FBUTdFLDREQUEwQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IENhbGN1bGF0b3JUeXBlIH0gZnJvbSAnLi9zaGFyZWQvZG9tYWluL3R5cGVzJztcblxuLy8gQ2FuYWRhXG5leHBvcnQgeyBDYW5hZGFJbmNvbWVUYXhTZXJ2aWNlSW1wbCBhcyBDYW5hZGFJbmNvbWVUYXhTZXJ2aWNlIH0gZnJvbSAnLi9pbmNvbWUtdGF4L2NhbmFkYS9DYW5hZGFJbmNvbWVUYXhTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBDYW5hZGFNb3J0Z2FnZVNlcnZpY2VJbXBsIGFzIENhbmFkYU1vcnRnYWdlU2VydmljZSB9IGZyb20gJy4vbW9ydGdhZ2UvY2FuYWRhL0NhbmFkYU1vcnRnYWdlU2VydmljZUltcGwnO1xuZXhwb3J0IHtcbiAgICBDb21wdXRlZEluY29tZVRheFZhbHVlcyBhcyBDYW5hZGFDb21wdXRlZEluY29tZVRheFZhbHVlcyxcbiAgICBJbmNvbWVUYXhSdWxlcyBhcyBDYW5hZGFJbmNvbWVUYXhSdWxlcyxcbn0gZnJvbSAnLi9pbmNvbWUtdGF4L2NhbmFkYS9kb21haW4vdHlwZXMnO1xuZXhwb3J0IHtcbiAgICBNb3J0Z2FnZVJ1bGVzIGFzIENhbmFkYU1vcnRnYWdlUnVsZXMsXG4gICAgTW9ydGdhZ2VDYWxjdWxhdGlvbklucHV0IGFzIENhbmFkYU1vcnRnYWdlQ2FsY3VsYXRpb25JbnB1dCxcbiAgICBNb3J0Z2FnZUNhbGN1bGF0aW9uUmVzdWx0IGFzIENhbmFkYU1vcnRnYWdlQ2FsY3VsYXRpb25SZXN1bHQsXG59IGZyb20gJy4vbW9ydGdhZ2UvY2FuYWRhL2RvbWFpbi90eXBlcyc7XG5cbmV4cG9ydCB7IENhbmFkYUNvcnBvcmF0ZVRheFNlcnZpY2VJbXBsIGFzIENhbmFkYUNvcnBvcmF0ZVRheFNlcnZpY2UgfSBmcm9tICcuL2NvcnBvcmF0ZS9jYW5hZGEvQ2FuYWRhQ29ycG9yYXRlVGF4U2VydmljZUltcGwnO1xuZXhwb3J0IHtcbiAgICBJbnB1dCBhcyBDYW5hZGFDb3Jwb3JhdGVUYXhJbnB1dCxcbiAgICBSdWxlcyBhcyBDYW5hZGFDb3Jwb3JhdGVUYXhSdWxlcyxcbiAgICBSZXN1bHQgYXMgQ2FuYWRhQ29ycG9yYXRlVGF4UmVzdWx0LFxufSBmcm9tICcuL2NvcnBvcmF0ZS9jYW5hZGEvZG9tYWluL3R5cGVzJztcblxuLy8gRnJhbmNlXG5leHBvcnQgeyBGcmFuY2VJbmNvbWVUYXhTZXJ2aWNlSW1wbCBhcyBGcmFuY2VJbmNvbWVUYXhTZXJ2aWNlIH0gZnJvbSAnLi9pbmNvbWUtdGF4L2ZyYW5jZS9GcmFuY2VJbmNvbWVUYXhTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBGcmFuY2VNb3J0Z2FnZVNlcnZpY2VJbXBsIGFzIEZyYW5jZU1vcnRnYWdlU2VydmljZSB9IGZyb20gJy4vbW9ydGdhZ2UvZnJhbmNlL0ZyYW5jZU1vcnRnYWdlU2VydmljZUltcGwnO1xuZXhwb3J0IHsgXG4gICAgQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMgYXMgRnJhbmNlQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMsXG4gICAgSW5jb21lVGF4UnVsZXMgYXMgRnJhbmNlSW5jb21lVGF4UnVsZXMsXG59IGZyb20gJy4vaW5jb21lLXRheC9mcmFuY2UvZG9tYWluL3R5cGVzJztcbmV4cG9ydCB7XG4gICAgTW9ydGdhZ2VSdWxlcyBhcyBGcmFuY2VNb3J0Z2FnZVJ1bGVzLFxuICAgIE1vcnRnYWdlSW5wdXQgYXMgRnJhbmNlTW9ydGdhZ2VJbnB1dCxcbiAgICBNb3J0Z2FnZU91dHB1dCBhcyBGcmFuY2VNb3J0Z2FnZUNhbGN1bGF0aW9uUmVzdWx0LFxufSBmcm9tICcuL21vcnRnYWdlL2ZyYW5jZS9kb21haW4vdHlwZXMnO1xuXG5leHBvcnQgeyBGcmFuY2VDb3Jwb3JhdGVUYXhTZXJ2aWNlSW1wbCBhcyBGcmFuY2VDb3Jwb3JhdGVUYXhTZXJ2aWNlIH0gZnJvbSAnLi9jb3Jwb3JhdGUvZnJhbmNlL0ZyYW5jZUNvcnBvcmF0ZVRheFNlcnZpY2VJbXBsJztcbmV4cG9ydCB7XG4gICAgSW5wdXQgYXMgRnJhbmNlQ29ycG9yYXRlVGF4SW5wdXQsXG4gICAgUnVsZXMgYXMgRnJhbmNlQ29ycG9yYXRlVGF4UnVsZXMsXG4gICAgUmVzdWx0IGFzIEZyYW5jZUNvcnBvcmF0ZVRheFJlc3VsdCxcbn0gZnJvbSAnLi9jb3Jwb3JhdGUvZnJhbmNlL2RvbWFpbi90eXBlcyc7XG5cbi8vIFNvdXRoIEFmcmljYVxuZXhwb3J0IHsgU291dGhBZnJpY2FJbmNvbWVUYXhTZXJ2aWNlSW1wbCBhcyBTb3V0aEFmcmljYUluY29tZVRheFNlcnZpY2UgfSBmcm9tICcuL2luY29tZS10YXgvc291dGgtYWZyaWNhL1NvdXRoQWZyaWNhSW5jb21lVGF4U2VydmljZUltcGwnO1xuZXhwb3J0IHsgU291dGhBZnJpY2FNb3J0Z2FnZVNlcnZpY2VJbXBsIGFzIFNvdXRoQWZyaWNhTW9ydGdhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9tb3J0Z2FnZS9zb3V0aC1hZnJpY2EvU291dGhBZnJpY2FNb3J0Z2FnZVNlcnZpY2VJbXBsJztcbmV4cG9ydCB7XG4gICAgQ29tcHV0ZWRJbmNvbWVUYXhWYWx1ZXMgYXMgU291dGhBZnJpY2FDb21wdXRlZEluY29tZVRheFZhbHVlcyxcbiAgICBJbmNvbWVUYXhSdWxlcyBhcyBTb3V0aEFmcmljYUluY29tZVRheFJ1bGVzLFxufSBmcm9tICcuL2luY29tZS10YXgvc291dGgtYWZyaWNhL2RvbWFpbi90eXBlcyc7XG5leHBvcnQge1xuICAgIE1vcnRnYWdlUnVsZXMgYXMgU291dGhBZnJpY2FNb3J0Z2FnZVJ1bGVzLFxuICAgIE1vcnRnYWdlSW5wdXQgYXMgU291dGhBZnJpY2FNb3J0Z2FnZUlucHV0LFxuICAgIE1vcnRnYWdlT3V0cHV0IGFzIFNvdXRoQWZyaWNhTW9ydGdhZ2VPdXRwdXQsXG59IGZyb20gJy4vbW9ydGdhZ2Uvc291dGgtYWZyaWNhL2RvbWFpbi90eXBlcyc7XG5cbmV4cG9ydCB7IFNvdXRoQWZyaWNhQ29ycG9yYXRlVGF4U2VydmljZUltcGwgYXMgU291dGhBZnJpY2FDb3Jwb3JhdGVUYXhTZXJ2aWNlIH0gZnJvbSAnLi9jb3Jwb3JhdGUvc291dGgtYWZyaWNhL1NvdXRoQWZyaWNhQ29ycG9yYXRlVGF4U2VydmljZUltcGwnO1xuZXhwb3J0IHtcbiAgICBSdWxlcyBhcyBTb3V0aEFmcmljYUNvcnBvcmF0ZVRheFJ1bGVzLFxuICAgIElucHV0IGFzIFNvdXRoQWZyaWNhQ29ycG9yYXRlVGF4SW5wdXQsXG4gICAgUmVzdWx0IGFzIFNvdXRoQWZyaWNhQ29ycG9yYXRlVGF4UmVzdWx0LFxufSBmcm9tICcuL2NvcnBvcmF0ZS9zb3V0aC1hZnJpY2EvZG9tYWluL3R5cGVzJztcblxuZXhwb3J0IHsgSW5jb21lVGF4Q2FsY3VsYXRvclNjaGVtYSB9IGZyb20gJy4vaW5jb21lLXRheC9kb21haW4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbmNvbWUtdGF4L2RvbWFpbi90eXBlcyc7Il19
@@ -54,7 +54,7 @@ class CanadaMortgageServiceImpl {
54
54
  loanAmount: loanAmount,
55
55
  insurancePremium: insurancePremium,
56
56
  totalMortgage: totalMortgage,
57
- monthlyPaymentAmount: paymentAmount,
57
+ monthlyPayment: paymentAmount,
58
58
  totalInterestPaid: totalInterestPaid,
59
59
  totalPaid: totalPaid,
60
60
  amortizationSchedule: amortizationSchedule,
@@ -121,4 +121,4 @@ class CanadaMortgageServiceImpl {
121
121
  }
122
122
  }
123
123
  exports.CanadaMortgageServiceImpl = CanadaMortgageServiceImpl;
124
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FuYWRhTW9ydGdhZ2VTZXJ2aWNlSW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb3J0Z2FnZS9jYW5hZGEvQ2FuYWRhTW9ydGdhZ2VTZXJ2aWNlSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFRQSxNQUFhLHlCQUF5QjtJQUU3QixTQUFTLENBQUMsS0FBK0IsRUFBRSxLQUFvQjtRQUVwRSxNQUFNLEVBQ0osYUFBYSxFQUNiLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2pCLEdBQUcsS0FBSyxDQUFDO1FBRVYsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7UUFFOUM7O3lDQUVpQztRQUVqQyxNQUFNLFVBQVUsR0FBRyxhQUFhLEdBQUcsV0FBVyxDQUFDO1FBQy9DLElBQUksVUFBVSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsVUFBVSxHQUFHLGFBQWEsQ0FBQztRQUV2Qzs7eUNBRWlDO1FBRWpDLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBRXpCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ25ELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZO2lCQUNyRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTlCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1lBQ3pELENBQUM7WUFFRCxnQkFBZ0IsR0FBRyxVQUFVLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUNuRCxDQUFDO1FB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QztJQUN0QyxDQUFDO0NBQ0Y7QUF6TEQsOERBeUxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FuYWRhTW9ydGdhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9DYW5hZGFNb3J0Z2FnZVNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTW9ydGdhZ2VSdWxlcyxcbiAgTW9ydGdhZ2VDYWxjdWxhdGlvbklucHV0LFxuICBNb3J0Z2FnZUNhbGN1bGF0aW9uUmVzdWx0LFxuICBBbW9ydGl6YXRpb25TY2hlZHVsZUl0ZW1cbn0gZnJvbSAnLi9kb21haW4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ2FuYWRhTW9ydGdhZ2VTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIENhbmFkYU1vcnRnYWdlU2VydmljZSB7XG5cbiAgcHVibGljIGNhbGN1bGF0ZShpbnB1dDogTW9ydGdhZ2VDYWxjdWxhdGlvbklucHV0LCBydWxlczogTW9ydGdhZ2VSdWxlcyk6IE1vcnRnYWdlQ2FsY3VsYXRpb25SZXN1bHQge1xuXG4gICAgY29uc3Qge1xuICAgICAgcHJvcGVydHlQcmljZSxcbiAgICAgIGRvd25QYXltZW50LFxuICAgICAgYW1vcnRpemF0aW9uWWVhcnMsXG4gICAgICBwYXltZW50RnJlcXVlbmN5XG4gICAgfSA9IGlucHV0O1xuXG4gICAgY29uc3QgaW50ZXJlc3RSYXRlID0gaW5wdXQuaW50ZXJlc3RSYXRlIC8gMTAwO1xuXG4gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAxLiBMb2FuIEFtb3VudCAmIExUVlxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gICAgY29uc3QgbG9hbkFtb3VudCA9IHByb3BlcnR5UHJpY2UgLSBkb3duUGF5bWVudDtcbiAgICBpZiAobG9hbkFtb3VudCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbG9hbiBhbW91bnQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBsdHYgPSBsb2FuQW1vdW50IC8gcHJvcGVydHlQcmljZTtcblxuICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgMi4gQ01IQyBJbnN1cmFuY2VcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAgIGxldCBpbnN1cmFuY2VQcmVtaXVtID0gMDtcblxuICAgIGlmIChsdHYgPiBydWxlcy5tb3J0Z2FnZUluc3VyYW5jZS5yZXF1aXJlZEJlbG93THR2KSB7XG4gICAgICBjb25zdCBwcmVtaXVtUnVsZSA9IHJ1bGVzLm1vcnRnYWdlSW5zdXJhbmNlLnByZW1pdW1SYXRlc1xuICAgICAgICAuZmluZChyID0+IGx0diA8PSByLm1heEx0dik7XG5cbiAgICAgIGlmICghcHJlbWl1bVJ1bGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdMVFYgZXhjZWVkcyBtYXhpbXVtIGluc3VyYWJsZSBsaW1pdCcpO1xuICAgICAgfVxuXG4gICAgICBpbnN1cmFuY2VQcmVtaXVtID0gbG9hbkFtb3VudCAqIHByZW1pdW1SdWxlLnJhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgdG90YWxNb3J0Z2FnZSA9IHJ1bGVzLm1vcnRnYWdlSW5zdXJhbmNlLnByZW1pdW1BZGRlZFRvTG9hblxuICAgICAgPyBsb2FuQW1vdW50ICsgaW5zdXJhbmNlUHJlbWl1bVxuICAgICAgOiBsb2FuQW1vdW50O1xuXG4gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAzLiBJbnRlcmVzdCBSYXRlIENvbnZlcnNpb25cbiAgICAgICAoQ2FuYWRhIHNlbWktYW5udWFsIGNvbXBvdW5kaW5nKVxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gICAgY29uc3QgcGVyaW9kaWNSYXRlID0gdGhpcy5jb252ZXJ0Q2FuYWRpYW5SYXRlKFxuICAgICAgaW50ZXJlc3RSYXRlLFxuICAgICAgcnVsZXMuaW50ZXJlc3QuY29tcG91bmRpbmcsXG4gICAgICBydWxlcy5wYXltZW50RnJlcXVlbmN5UnVsZXNbcGF5bWVudEZyZXF1ZW5jeV0ucGF5bWVudHNQZXJZZWFyXG4gICAgKTtcblxuICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgNC4gUGF5bWVudCBGcmVxdWVuY3lcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAgIGNvbnN0IGZyZXF1ZW5jeVJ1bGUgPSBydWxlcy5wYXltZW50RnJlcXVlbmN5UnVsZXNbcGF5bWVudEZyZXF1ZW5jeV07XG4gICAgY29uc3QgcGF5bWVudHNQZXJZZWFyID0gZnJlcXVlbmN5UnVsZS5wYXltZW50c1BlclllYXI7XG4gICAgY29uc3QgdG90YWxQYXltZW50cyA9IGFtb3J0aXphdGlvblllYXJzICogcGF5bWVudHNQZXJZZWFyO1xuXG4gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICA1LiBNb3J0Z2FnZSBQYXltZW50IEZvcm11bGFcbiAgICAgICBQID0gTCDDlyBbIHIoMStyKV5uIF0gLyBbICgxK3IpXm4g4oiSIDEgXVxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gICAgY29uc3QgcGF5bWVudEFtb3VudCA9IHRoaXMuY2FsY3VsYXRlUGF5bWVudChcbiAgICAgIHRvdGFsTW9ydGdhZ2UsXG4gICAgICBwZXJpb2RpY1JhdGUsXG4gICAgICB0b3RhbFBheW1lbnRzXG4gICAgKTtcblxuICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgNi4gVG90YWxzXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgICBjb25zdCB0b3RhbFBhaWQgPSBwYXltZW50QW1vdW50ICogdG90YWxQYXltZW50cztcbiAgICBjb25zdCB0b3RhbEludGVyZXN0UGFpZCA9IHRvdGFsUGFpZCAtIHRvdGFsTW9ydGdhZ2U7XG5cbiAgICBjb25zdCBhbW9ydGl6YXRpb25TY2hlZHVsZSA9IHRoaXMuY2FsY3VsYXRlQW1vcnRpemF0aW9uU2NoZWR1bGUoXG4gICAgICB0b3RhbE1vcnRnYWdlLFxuICAgICAgcGVyaW9kaWNSYXRlLFxuICAgICAgcGF5bWVudEFtb3VudCxcbiAgICAgIHRvdGFsUGF5bWVudHMsXG4gICAgICBhbW9ydGl6YXRpb25ZZWFycyxcbiAgICAgIHBheW1lbnRzUGVyWWVhclxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9hbkFtb3VudDogbG9hbkFtb3VudCxcbiAgICAgIGluc3VyYW5jZVByZW1pdW06IGluc3VyYW5jZVByZW1pdW0sXG4gICAgICB0b3RhbE1vcnRnYWdlOiB0b3RhbE1vcnRnYWdlLFxuICAgICAgbW9udGhseVBheW1lbnRBbW91bnQ6IHBheW1lbnRBbW91bnQsXG4gICAgICB0b3RhbEludGVyZXN0UGFpZDogdG90YWxJbnRlcmVzdFBhaWQsXG4gICAgICB0b3RhbFBhaWQ6IHRvdGFsUGFpZCxcbiAgICAgIGFtb3J0aXphdGlvblNjaGVkdWxlOiBhbW9ydGl6YXRpb25TY2hlZHVsZSxcbiAgICAgIG90aGVyRmVlczoge1xuICAgICAgICBub3RhcnlGZWVzOiB7XG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGxhYmVsOiAnTk9UQVJZX0ZFRVMnXG4gICAgICAgIH0sXG4gICAgICAgIGJhbmtGZWVzOiB7XG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGxhYmVsOiAnQkFOS19GRUVTJ1xuICAgICAgICB9LFxuICAgICAgICBtb250aGx5SW5zdXJhbmNlRmVlczoge1xuICAgICAgICAgICAgdmFsdWU6IGluc3VyYW5jZVByZW1pdW0sXG4gICAgICAgICAgICBsYWJlbDogJ0lOU1VSQU5DRV9QUkVNSVVNJ1xuICAgICAgICB9XG4gICAgfVxuICAgIH07XG4gIH1cblxuICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgSGVscGVyIE1ldGhvZHNcbiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVBbW9ydGl6YXRpb25TY2hlZHVsZShcbiAgICBwcmluY2lwYWw6IG51bWJlcixcbiAgICBwZXJpb2RpY1JhdGU6IG51bWJlcixcbiAgICBwYXltZW50QW1vdW50OiBudW1iZXIsXG4gICAgdG90YWxQYXltZW50czogbnVtYmVyLFxuICAgIGFtb3J0aXphdGlvblllYXJzOiBudW1iZXIsXG4gICAgcGF5bWVudHNQZXJZZWFyOiBudW1iZXJcbiAgKTogQW1vcnRpemF0aW9uU2NoZWR1bGVJdGVtW10ge1xuICAgIGNvbnN0IHNjaGVkdWxlOiBBbW9ydGl6YXRpb25TY2hlZHVsZUl0ZW1bXSA9IFtdO1xuICAgIGxldCBiYWxhbmNlID0gcHJpbmNpcGFsO1xuXG4gICAgZm9yIChsZXQgeWVhciA9IDE7IHllYXIgPD0gYW1vcnRpemF0aW9uWWVhcnM7IHllYXIrKykge1xuICAgICAgbGV0IHllYXJseVByaW5jaXBhbCA9IDA7XG4gICAgICBsZXQgeWVhcmx5SW50ZXJlc3QgPSAwO1xuXG4gICAgICBjb25zdCBwYXltZW50c0luWWVhciA9IE1hdGgubWluKHBheW1lbnRzUGVyWWVhciwgdG90YWxQYXltZW50cyAtICh5ZWFyIC0gMSkgKiBwYXltZW50c1BlclllYXIpO1xuXG4gICAgICBmb3IgKGxldCBwYXltZW50ID0gMTsgcGF5bWVudCA8PSBwYXltZW50c0luWWVhcjsgcGF5bWVudCsrKSB7XG4gICAgICAgIGNvbnN0IGludGVyZXN0UGF5bWVudCA9IGJhbGFuY2UgKiBwZXJpb2RpY1JhdGU7XG4gICAgICAgIGNvbnN0IHByaW5jaXBhbFBheW1lbnQgPSBwYXltZW50QW1vdW50IC0gaW50ZXJlc3RQYXltZW50O1xuXG4gICAgICAgIHllYXJseUludGVyZXN0ICs9IGludGVyZXN0UGF5bWVudDtcbiAgICAgICAgeWVhcmx5UHJpbmNpcGFsICs9IHByaW5jaXBhbFBheW1lbnQ7XG4gICAgICAgIGJhbGFuY2UgLT0gcHJpbmNpcGFsUGF5bWVudDtcbiAgICAgIH1cblxuICAgICAgc2NoZWR1bGUucHVzaCh7XG4gICAgICAgIHllYXIsXG4gICAgICAgIHByaW5jaXBhbDogeWVhcmx5UHJpbmNpcGFsLFxuICAgICAgICBpbnRlcmVzdDogeWVhcmx5SW50ZXJlc3QsXG4gICAgICAgIGJhbGFuY2U6IE1hdGgubWF4KDAsIGJhbGFuY2UpXG4gICAgICB9KTtcblxuICAgICAgaWYgKGJhbGFuY2UgPD0gMCkgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNjaGVkdWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Q2FuYWRpYW5SYXRlKFxuICAgIGFubnVhbFJhdGU6IG51bWJlcixcbiAgICBjb21wb3VuZGluZzogJ1NFTUlfQU5OVUFMJyB8ICdBTk5VQUwnIHwgJ01PTlRITFknLFxuICAgIHBheW1lbnRzUGVyWWVhcjogbnVtYmVyXG4gICk6IG51bWJlciB7XG5cbiAgICBpZiAoY29tcG91bmRpbmcgIT09ICdTRU1JX0FOTlVBTCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT25seSBDYW5hZGlhbiBzZW1pLWFubnVhbCBjb21wb3VuZGluZyBzdXBwb3J0ZWQnKTtcbiAgICB9XG5cbiAgICAvLyBDYW5hZGlhbiBzdGFuZGFyZCBjb252ZXJzaW9uXG4gICAgY29uc3Qgc2VtaUFubnVhbFJhdGUgPSBhbm51YWxSYXRlIC8gMjtcbiAgICBjb25zdCBlZmZlY3RpdmVBbm51YWxSYXRlID0gTWF0aC5wb3coMSArIHNlbWlBbm51YWxSYXRlLCAyKSAtIDE7XG5cbiAgICByZXR1cm4gTWF0aC5wb3coMSArIGVmZmVjdGl2ZUFubnVhbFJhdGUsIDEgLyBwYXltZW50c1BlclllYXIpIC0gMTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlUGF5bWVudChwcmluY2lwYWw6IG51bWJlciwgcmF0ZTogbnVtYmVyLCBwZXJpb2RzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmIChyYXRlID09PSAwKSB7XG4gICAgICByZXR1cm4gcHJpbmNpcGFsIC8gcGVyaW9kcztcbiAgICB9XG5cbiAgICByZXR1cm4gcHJpbmNpcGFsICpcbiAgICAgIChyYXRlICogTWF0aC5wb3coMSArIHJhdGUsIHBlcmlvZHMpKSAvXG4gICAgICAoTWF0aC5wb3coMSArIHJhdGUsIHBlcmlvZHMpIC0gMSk7XG4gIH1cbn1cbiJdfQ==
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FuYWRhTW9ydGdhZ2VTZXJ2aWNlSW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb3J0Z2FnZS9jYW5hZGEvQ2FuYWRhTW9ydGdhZ2VTZXJ2aWNlSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFRQSxNQUFhLHlCQUF5QjtJQUU3QixTQUFTLENBQUMsS0FBK0IsRUFBRSxLQUFvQjtRQUVwRSxNQUFNLEVBQ0osYUFBYSxFQUNiLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2pCLEdBQUcsS0FBSyxDQUFDO1FBRVYsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7UUFFOUM7O3lDQUVpQztRQUVqQyxNQUFNLFVBQVUsR0FBRyxhQUFhLEdBQUcsV0FBVyxDQUFDO1FBQy9DLElBQUksVUFBVSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsVUFBVSxHQUFHLGFBQWEsQ0FBQztRQUV2Qzs7eUNBRWlDO1FBRWpDLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBRXpCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ25ELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZO2lCQUNyRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTlCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1lBQ3pELENBQUM7WUFFRCxnQkFBZ0IsR0FBRyxVQUFVLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUNuRCxDQUFDO1FB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SUFDdEMsQ0FBQztDQUNGO0FBekxELDhEQXlMQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhbmFkYU1vcnRnYWdlU2VydmljZSB9IGZyb20gJy4vQ2FuYWRhTW9ydGdhZ2VTZXJ2aWNlJztcbmltcG9ydCB7XG4gIE1vcnRnYWdlUnVsZXMsXG4gIE1vcnRnYWdlQ2FsY3VsYXRpb25JbnB1dCxcbiAgTW9ydGdhZ2VDYWxjdWxhdGlvblJlc3VsdCxcbiAgQW1vcnRpemF0aW9uU2NoZWR1bGVJdGVtXG59IGZyb20gJy4vZG9tYWluL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENhbmFkYU1vcnRnYWdlU2VydmljZUltcGwgaW1wbGVtZW50cyBDYW5hZGFNb3J0Z2FnZVNlcnZpY2Uge1xuXG4gIHB1YmxpYyBjYWxjdWxhdGUoaW5wdXQ6IE1vcnRnYWdlQ2FsY3VsYXRpb25JbnB1dCwgcnVsZXM6IE1vcnRnYWdlUnVsZXMpOiBNb3J0Z2FnZUNhbGN1bGF0aW9uUmVzdWx0IHtcblxuICAgIGNvbnN0IHtcbiAgICAgIHByb3BlcnR5UHJpY2UsXG4gICAgICBkb3duUGF5bWVudCxcbiAgICAgIGFtb3J0aXphdGlvblllYXJzLFxuICAgICAgcGF5bWVudEZyZXF1ZW5jeVxuICAgIH0gPSBpbnB1dDtcblxuICAgIGNvbnN0IGludGVyZXN0UmF0ZSA9IGlucHV0LmludGVyZXN0UmF0ZSAvIDEwMDtcblxuICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgMS4gTG9hbiBBbW91bnQgJiBMVFZcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAgIGNvbnN0IGxvYW5BbW91bnQgPSBwcm9wZXJ0eVByaWNlIC0gZG93blBheW1lbnQ7XG4gICAgaWYgKGxvYW5BbW91bnQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxvYW4gYW1vdW50Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgbHR2ID0gbG9hbkFtb3VudCAvIHByb3BlcnR5UHJpY2U7XG5cbiAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgIDIuIENNSEMgSW5zdXJhbmNlXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgICBsZXQgaW5zdXJhbmNlUHJlbWl1bSA9IDA7XG5cbiAgICBpZiAobHR2ID4gcnVsZXMubW9ydGdhZ2VJbnN1cmFuY2UucmVxdWlyZWRCZWxvd0x0dikge1xuICAgICAgY29uc3QgcHJlbWl1bVJ1bGUgPSBydWxlcy5tb3J0Z2FnZUluc3VyYW5jZS5wcmVtaXVtUmF0ZXNcbiAgICAgICAgLmZpbmQociA9PiBsdHYgPD0gci5tYXhMdHYpO1xuXG4gICAgICBpZiAoIXByZW1pdW1SdWxlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTFRWIGV4Y2VlZHMgbWF4aW11bSBpbnN1cmFibGUgbGltaXQnKTtcbiAgICAgIH1cblxuICAgICAgaW5zdXJhbmNlUHJlbWl1bSA9IGxvYW5BbW91bnQgKiBwcmVtaXVtUnVsZS5yYXRlO1xuICAgIH1cblxuICAgIGNvbnN0IHRvdGFsTW9ydGdhZ2UgPSBydWxlcy5tb3J0Z2FnZUluc3VyYW5jZS5wcmVtaXVtQWRkZWRUb0xvYW5cbiAgICAgID8gbG9hbkFtb3VudCArIGluc3VyYW5jZVByZW1pdW1cbiAgICAgIDogbG9hbkFtb3VudDtcblxuICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgMy4gSW50ZXJlc3QgUmF0ZSBDb252ZXJzaW9uXG4gICAgICAgKENhbmFkYSBzZW1pLWFubnVhbCBjb21wb3VuZGluZylcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAgIGNvbnN0IHBlcmlvZGljUmF0ZSA9IHRoaXMuY29udmVydENhbmFkaWFuUmF0ZShcbiAgICAgIGludGVyZXN0UmF0ZSxcbiAgICAgIHJ1bGVzLmludGVyZXN0LmNvbXBvdW5kaW5nLFxuICAgICAgcnVsZXMucGF5bWVudEZyZXF1ZW5jeVJ1bGVzW3BheW1lbnRGcmVxdWVuY3ldLnBheW1lbnRzUGVyWWVhclxuICAgICk7XG5cbiAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgIDQuIFBheW1lbnQgRnJlcXVlbmN5XG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgICBjb25zdCBmcmVxdWVuY3lSdWxlID0gcnVsZXMucGF5bWVudEZyZXF1ZW5jeVJ1bGVzW3BheW1lbnRGcmVxdWVuY3ldO1xuICAgIGNvbnN0IHBheW1lbnRzUGVyWWVhciA9IGZyZXF1ZW5jeVJ1bGUucGF5bWVudHNQZXJZZWFyO1xuICAgIGNvbnN0IHRvdGFsUGF5bWVudHMgPSBhbW9ydGl6YXRpb25ZZWFycyAqIHBheW1lbnRzUGVyWWVhcjtcblxuICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgNS4gTW9ydGdhZ2UgUGF5bWVudCBGb3JtdWxhXG4gICAgICAgUCA9IEwgw5cgWyByKDErcilebiBdIC8gWyAoMStyKV5uIOKIkiAxIF1cbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAgIGNvbnN0IHBheW1lbnRBbW91bnQgPSB0aGlzLmNhbGN1bGF0ZVBheW1lbnQoXG4gICAgICB0b3RhbE1vcnRnYWdlLFxuICAgICAgcGVyaW9kaWNSYXRlLFxuICAgICAgdG90YWxQYXltZW50c1xuICAgICk7XG5cbiAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgIDYuIFRvdGFsc1xuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gICAgY29uc3QgdG90YWxQYWlkID0gcGF5bWVudEFtb3VudCAqIHRvdGFsUGF5bWVudHM7XG4gICAgY29uc3QgdG90YWxJbnRlcmVzdFBhaWQgPSB0b3RhbFBhaWQgLSB0b3RhbE1vcnRnYWdlO1xuXG4gICAgY29uc3QgYW1vcnRpemF0aW9uU2NoZWR1bGUgPSB0aGlzLmNhbGN1bGF0ZUFtb3J0aXphdGlvblNjaGVkdWxlKFxuICAgICAgdG90YWxNb3J0Z2FnZSxcbiAgICAgIHBlcmlvZGljUmF0ZSxcbiAgICAgIHBheW1lbnRBbW91bnQsXG4gICAgICB0b3RhbFBheW1lbnRzLFxuICAgICAgYW1vcnRpemF0aW9uWWVhcnMsXG4gICAgICBwYXltZW50c1BlclllYXJcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxvYW5BbW91bnQ6IGxvYW5BbW91bnQsXG4gICAgICBpbnN1cmFuY2VQcmVtaXVtOiBpbnN1cmFuY2VQcmVtaXVtLFxuICAgICAgdG90YWxNb3J0Z2FnZTogdG90YWxNb3J0Z2FnZSxcbiAgICAgIG1vbnRobHlQYXltZW50OiBwYXltZW50QW1vdW50LFxuICAgICAgdG90YWxJbnRlcmVzdFBhaWQ6IHRvdGFsSW50ZXJlc3RQYWlkLFxuICAgICAgdG90YWxQYWlkOiB0b3RhbFBhaWQsXG4gICAgICBhbW9ydGl6YXRpb25TY2hlZHVsZTogYW1vcnRpemF0aW9uU2NoZWR1bGUsXG4gICAgICBvdGhlckZlZXM6IHtcbiAgICAgICAgbm90YXJ5RmVlczoge1xuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBsYWJlbDogJ05PVEFSWV9GRUVTJ1xuICAgICAgICB9LFxuICAgICAgICBiYW5rRmVlczoge1xuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBsYWJlbDogJ0JBTktfRkVFUydcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhseUluc3VyYW5jZUZlZXM6IHtcbiAgICAgICAgICAgIHZhbHVlOiBpbnN1cmFuY2VQcmVtaXVtLFxuICAgICAgICAgICAgbGFiZWw6ICdJTlNVUkFOQ0VfUFJFTUlVTSdcbiAgICAgICAgfVxuICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgIEhlbHBlciBNZXRob2RzXG4gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4gIHByaXZhdGUgY2FsY3VsYXRlQW1vcnRpemF0aW9uU2NoZWR1bGUoXG4gICAgcHJpbmNpcGFsOiBudW1iZXIsXG4gICAgcGVyaW9kaWNSYXRlOiBudW1iZXIsXG4gICAgcGF5bWVudEFtb3VudDogbnVtYmVyLFxuICAgIHRvdGFsUGF5bWVudHM6IG51bWJlcixcbiAgICBhbW9ydGl6YXRpb25ZZWFyczogbnVtYmVyLFxuICAgIHBheW1lbnRzUGVyWWVhcjogbnVtYmVyXG4gICk6IEFtb3J0aXphdGlvblNjaGVkdWxlSXRlbVtdIHtcbiAgICBjb25zdCBzY2hlZHVsZTogQW1vcnRpemF0aW9uU2NoZWR1bGVJdGVtW10gPSBbXTtcbiAgICBsZXQgYmFsYW5jZSA9IHByaW5jaXBhbDtcblxuICAgIGZvciAobGV0IHllYXIgPSAxOyB5ZWFyIDw9IGFtb3J0aXphdGlvblllYXJzOyB5ZWFyKyspIHtcbiAgICAgIGxldCB5ZWFybHlQcmluY2lwYWwgPSAwO1xuICAgICAgbGV0IHllYXJseUludGVyZXN0ID0gMDtcblxuICAgICAgY29uc3QgcGF5bWVudHNJblllYXIgPSBNYXRoLm1pbihwYXltZW50c1BlclllYXIsIHRvdGFsUGF5bWVudHMgLSAoeWVhciAtIDEpICogcGF5bWVudHNQZXJZZWFyKTtcblxuICAgICAgZm9yIChsZXQgcGF5bWVudCA9IDE7IHBheW1lbnQgPD0gcGF5bWVudHNJblllYXI7IHBheW1lbnQrKykge1xuICAgICAgICBjb25zdCBpbnRlcmVzdFBheW1lbnQgPSBiYWxhbmNlICogcGVyaW9kaWNSYXRlO1xuICAgICAgICBjb25zdCBwcmluY2lwYWxQYXltZW50ID0gcGF5bWVudEFtb3VudCAtIGludGVyZXN0UGF5bWVudDtcblxuICAgICAgICB5ZWFybHlJbnRlcmVzdCArPSBpbnRlcmVzdFBheW1lbnQ7XG4gICAgICAgIHllYXJseVByaW5jaXBhbCArPSBwcmluY2lwYWxQYXltZW50O1xuICAgICAgICBiYWxhbmNlIC09IHByaW5jaXBhbFBheW1lbnQ7XG4gICAgICB9XG5cbiAgICAgIHNjaGVkdWxlLnB1c2goe1xuICAgICAgICB5ZWFyLFxuICAgICAgICBwcmluY2lwYWw6IHllYXJseVByaW5jaXBhbCxcbiAgICAgICAgaW50ZXJlc3Q6IHllYXJseUludGVyZXN0LFxuICAgICAgICBiYWxhbmNlOiBNYXRoLm1heCgwLCBiYWxhbmNlKVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChiYWxhbmNlIDw9IDApIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBzY2hlZHVsZTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydENhbmFkaWFuUmF0ZShcbiAgICBhbm51YWxSYXRlOiBudW1iZXIsXG4gICAgY29tcG91bmRpbmc6ICdTRU1JX0FOTlVBTCcgfCAnQU5OVUFMJyB8ICdNT05USExZJyxcbiAgICBwYXltZW50c1BlclllYXI6IG51bWJlclxuICApOiBudW1iZXIge1xuXG4gICAgaWYgKGNvbXBvdW5kaW5nICE9PSAnU0VNSV9BTk5VQUwnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgQ2FuYWRpYW4gc2VtaS1hbm51YWwgY29tcG91bmRpbmcgc3VwcG9ydGVkJyk7XG4gICAgfVxuXG4gICAgLy8gQ2FuYWRpYW4gc3RhbmRhcmQgY29udmVyc2lvblxuICAgIGNvbnN0IHNlbWlBbm51YWxSYXRlID0gYW5udWFsUmF0ZSAvIDI7XG4gICAgY29uc3QgZWZmZWN0aXZlQW5udWFsUmF0ZSA9IE1hdGgucG93KDEgKyBzZW1pQW5udWFsUmF0ZSwgMikgLSAxO1xuXG4gICAgcmV0dXJuIE1hdGgucG93KDEgKyBlZmZlY3RpdmVBbm51YWxSYXRlLCAxIC8gcGF5bWVudHNQZXJZZWFyKSAtIDE7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZVBheW1lbnQocHJpbmNpcGFsOiBudW1iZXIsIHJhdGU6IG51bWJlciwgcGVyaW9kczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAocmF0ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHByaW5jaXBhbCAvIHBlcmlvZHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByaW5jaXBhbCAqXG4gICAgICAocmF0ZSAqIE1hdGgucG93KDEgKyByYXRlLCBwZXJpb2RzKSkgL1xuICAgICAgKE1hdGgucG93KDEgKyByYXRlLCBwZXJpb2RzKSAtIDEpO1xuICB9XG59XG4iXX0=
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbW9ydGdhZ2UvY2FuYWRhL2RvbWFpbi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUnVsZU1ldGEgfSBmcm9tIFwiLi4vLi4vLi4vc2hhcmVkL2RvbWFpbi90eXBlc1wiO1xuaW1wb3J0IHsgT3RoZXJGZWVzIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVJbnB1dERlZmluaXRpb24ge1xuICAgIHR5cGU6ICdudW1iZXInIHwgJ3N0cmluZyc7XG4gICAgbWluPzogbnVtYmVyO1xuICAgIG1heD86IG51bWJlcjtcbiAgICBlbnVtPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZUlucHV0cyB7XG4gICAgcHJvcGVydHlQcmljZTogUnVsZUlucHV0RGVmaW5pdGlvbjtcbiAgICBkb3duUGF5bWVudDogUnVsZUlucHV0RGVmaW5pdGlvbjtcbiAgICBpbnRlcmVzdFJhdGU6IFJ1bGVJbnB1dERlZmluaXRpb247XG4gICAgYW1vcnRpemF0aW9uWWVhcnM6IFJ1bGVJbnB1dERlZmluaXRpb247XG4gICAgcGF5bWVudEZyZXF1ZW5jeTogUnVsZUlucHV0RGVmaW5pdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdWxlT3V0cHV0cyB7XG4gICAgbG9hbkFtb3VudDogJ251bWJlcic7XG4gICAgaW5zdXJhbmNlUHJlbWl1bTogJ251bWJlcic7XG4gICAgdG90YWxNb3J0Z2FnZTogJ251bWJlcic7XG4gICAgcGF5bWVudEFtb3VudDogJ251bWJlcic7XG4gICAgdG90YWxJbnRlcmVzdFBhaWQ6ICdudW1iZXInO1xuICAgIHRvdGFsUGFpZDogJ251bWJlcic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbkNvbnN0cmFpbnRzIHtcbiAgICBtYXhBbW9ydGl6YXRpb25ZZWFyczogbnVtYmVyO1xuICAgIGluc3VyZWRNYXhBbW9ydGl6YXRpb25ZZWFyczogbnVtYmVyO1xuICAgIG1pbkRvd25QYXltZW50OiB7XG4gICAgICAgIHVwVG81MDBrOiBudW1iZXI7XG4gICAgICAgIGFib3ZlNTAwazogbnVtYmVyO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VJbnN1cmFuY2VSYXRlIHtcbiAgICBtYXhMdHY6IG51bWJlcjtcbiAgICByYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VJbnN1cmFuY2VSdWxlcyB7XG4gICAgcmVxdWlyZWRCZWxvd0x0djogbnVtYmVyO1xuICAgIHByZW1pdW1SYXRlczogTW9ydGdhZ2VJbnN1cmFuY2VSYXRlW107XG4gICAgcHJlbWl1bUFkZGVkVG9Mb2FuOiBib29sZWFuO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VSdWxlcyB7XG4gICAgbG9hbkNvbnN0cmFpbnRzOiBMb2FuQ29uc3RyYWludHM7XG4gICAgbW9ydGdhZ2VJbnN1cmFuY2U6IE1vcnRnYWdlSW5zdXJhbmNlUnVsZXM7XG4gICAgaW50ZXJlc3Q6IEludGVyZXN0UnVsZXM7XG4gICAgcGF5bWVudEZyZXF1ZW5jeVJ1bGVzOiBQYXltZW50RnJlcXVlbmN5UnVsZXM7XG4gICAgc3RyZXNzVGVzdDogU3RyZXNzVGVzdFJ1bGVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyZXN0UnVsZXMge1xuICAgIGNvbXBvdW5kaW5nOiAnU0VNSV9BTk5VQUwnIHwgJ0FOTlVBTCcgfCAnTU9OVEhMWSc7XG4gICAgY29udmVyc2lvbkZvcm11bGE6ICdDQU5BREFfU1RBTkRBUkQnIHwgc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRGcmVxdWVuY3lSdWxlIHtcbiAgICBwYXltZW50c1BlclllYXI6IG51bWJlcjtcbiAgICBhY2NlbGVyYXRpb24/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRGcmVxdWVuY3lSdWxlcyB7XG4gICAgTU9OVEhMWTogUGF5bWVudEZyZXF1ZW5jeVJ1bGU7XG4gICAgQklfV0VFS0xZOiBQYXltZW50RnJlcXVlbmN5UnVsZTtcbiAgICBBQ0NFTEVSQVRFRF9CSV9XRUVLTFk6IFBheW1lbnRGcmVxdWVuY3lSdWxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVzc1Rlc3RSdWxlcyB7XG4gICAgYXBwbHk6IGJvb2xlYW47XG4gICAgbWluaW11bVJhdGVCdWZmZXI6IG51bWJlcjtcbiAgICBtaW5pbXVtUXVhbGlmeWluZ1JhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZVJ1bGVTZXQge1xuICAgIG1ldGE6IFJ1bGVNZXRhO1xuICAgIGlucHV0czogUnVsZUlucHV0cztcbiAgICBydWxlczogTW9ydGdhZ2VSdWxlcztcbiAgICBvdXRwdXRzOiBSdWxlT3V0cHV0cztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZUNhbGN1bGF0aW9uSW5wdXQge1xuICBwcm9wZXJ0eVByaWNlOiBudW1iZXI7XG4gIGRvd25QYXltZW50OiBudW1iZXI7XG4gIGludGVyZXN0UmF0ZTogbnVtYmVyOyAvLyBBbm51YWwgbm9taW5hbCByYXRlIChlLmcuIDAuMDUyKVxuICBhbW9ydGl6YXRpb25ZZWFyczogbnVtYmVyO1xuICBwYXltZW50RnJlcXVlbmN5OiAnTU9OVEhMWScgfCAnQklfV0VFS0xZJyB8ICdBQ0NFTEVSQVRFRF9CSV9XRUVLTFknO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFtb3J0aXphdGlvblNjaGVkdWxlSXRlbSB7XG4gIHllYXI6IG51bWJlcjtcbiAgcHJpbmNpcGFsOiBudW1iZXI7XG4gIGludGVyZXN0OiBudW1iZXI7XG4gIGJhbGFuY2U6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZUNhbGN1bGF0aW9uUmVzdWx0IHtcbiAgbG9hbkFtb3VudDogbnVtYmVyO1xuICBpbnN1cmFuY2VQcmVtaXVtOiBudW1iZXI7XG4gIHRvdGFsTW9ydGdhZ2U6IG51bWJlcjtcbiAgbW9udGhseVBheW1lbnRBbW91bnQ6IG51bWJlcjtcbiAgdG90YWxJbnRlcmVzdFBhaWQ6IG51bWJlcjtcbiAgdG90YWxQYWlkOiBudW1iZXI7XG4gIGFtb3J0aXphdGlvblNjaGVkdWxlOiBBbW9ydGl6YXRpb25TY2hlZHVsZUl0ZW1bXTtcbiAgb3RoZXJGZWVzOiBPdGhlckZlZXM7XG59XG4iXX0=
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbW9ydGdhZ2UvY2FuYWRhL2RvbWFpbi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUnVsZU1ldGEgfSBmcm9tIFwiLi4vLi4vLi4vc2hhcmVkL2RvbWFpbi90eXBlc1wiO1xuaW1wb3J0IHsgT3RoZXJGZWVzIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVJbnB1dERlZmluaXRpb24ge1xuICAgIHR5cGU6ICdudW1iZXInIHwgJ3N0cmluZyc7XG4gICAgbWluPzogbnVtYmVyO1xuICAgIG1heD86IG51bWJlcjtcbiAgICBlbnVtPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZUlucHV0cyB7XG4gICAgcHJvcGVydHlQcmljZTogUnVsZUlucHV0RGVmaW5pdGlvbjtcbiAgICBkb3duUGF5bWVudDogUnVsZUlucHV0RGVmaW5pdGlvbjtcbiAgICBpbnRlcmVzdFJhdGU6IFJ1bGVJbnB1dERlZmluaXRpb247XG4gICAgYW1vcnRpemF0aW9uWWVhcnM6IFJ1bGVJbnB1dERlZmluaXRpb247XG4gICAgcGF5bWVudEZyZXF1ZW5jeTogUnVsZUlucHV0RGVmaW5pdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdWxlT3V0cHV0cyB7XG4gICAgbG9hbkFtb3VudDogJ251bWJlcic7XG4gICAgaW5zdXJhbmNlUHJlbWl1bTogJ251bWJlcic7XG4gICAgdG90YWxNb3J0Z2FnZTogJ251bWJlcic7XG4gICAgcGF5bWVudEFtb3VudDogJ251bWJlcic7XG4gICAgdG90YWxJbnRlcmVzdFBhaWQ6ICdudW1iZXInO1xuICAgIHRvdGFsUGFpZDogJ251bWJlcic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbkNvbnN0cmFpbnRzIHtcbiAgICBtYXhBbW9ydGl6YXRpb25ZZWFyczogbnVtYmVyO1xuICAgIGluc3VyZWRNYXhBbW9ydGl6YXRpb25ZZWFyczogbnVtYmVyO1xuICAgIG1pbkRvd25QYXltZW50OiB7XG4gICAgICAgIHVwVG81MDBrOiBudW1iZXI7XG4gICAgICAgIGFib3ZlNTAwazogbnVtYmVyO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VJbnN1cmFuY2VSYXRlIHtcbiAgICBtYXhMdHY6IG51bWJlcjtcbiAgICByYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VJbnN1cmFuY2VSdWxlcyB7XG4gICAgcmVxdWlyZWRCZWxvd0x0djogbnVtYmVyO1xuICAgIHByZW1pdW1SYXRlczogTW9ydGdhZ2VJbnN1cmFuY2VSYXRlW107XG4gICAgcHJlbWl1bUFkZGVkVG9Mb2FuOiBib29sZWFuO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VSdWxlcyB7XG4gICAgbG9hbkNvbnN0cmFpbnRzOiBMb2FuQ29uc3RyYWludHM7XG4gICAgbW9ydGdhZ2VJbnN1cmFuY2U6IE1vcnRnYWdlSW5zdXJhbmNlUnVsZXM7XG4gICAgaW50ZXJlc3Q6IEludGVyZXN0UnVsZXM7XG4gICAgcGF5bWVudEZyZXF1ZW5jeVJ1bGVzOiBQYXltZW50RnJlcXVlbmN5UnVsZXM7XG4gICAgc3RyZXNzVGVzdDogU3RyZXNzVGVzdFJ1bGVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyZXN0UnVsZXMge1xuICAgIGNvbXBvdW5kaW5nOiAnU0VNSV9BTk5VQUwnIHwgJ0FOTlVBTCcgfCAnTU9OVEhMWSc7XG4gICAgY29udmVyc2lvbkZvcm11bGE6ICdDQU5BREFfU1RBTkRBUkQnIHwgc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRGcmVxdWVuY3lSdWxlIHtcbiAgICBwYXltZW50c1BlclllYXI6IG51bWJlcjtcbiAgICBhY2NlbGVyYXRpb24/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRGcmVxdWVuY3lSdWxlcyB7XG4gICAgTU9OVEhMWTogUGF5bWVudEZyZXF1ZW5jeVJ1bGU7XG4gICAgQklfV0VFS0xZOiBQYXltZW50RnJlcXVlbmN5UnVsZTtcbiAgICBBQ0NFTEVSQVRFRF9CSV9XRUVLTFk6IFBheW1lbnRGcmVxdWVuY3lSdWxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVzc1Rlc3RSdWxlcyB7XG4gICAgYXBwbHk6IGJvb2xlYW47XG4gICAgbWluaW11bVJhdGVCdWZmZXI6IG51bWJlcjtcbiAgICBtaW5pbXVtUXVhbGlmeWluZ1JhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZVJ1bGVTZXQge1xuICAgIG1ldGE6IFJ1bGVNZXRhO1xuICAgIGlucHV0czogUnVsZUlucHV0cztcbiAgICBydWxlczogTW9ydGdhZ2VSdWxlcztcbiAgICBvdXRwdXRzOiBSdWxlT3V0cHV0cztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZUNhbGN1bGF0aW9uSW5wdXQge1xuICBwcm9wZXJ0eVByaWNlOiBudW1iZXI7XG4gIGRvd25QYXltZW50OiBudW1iZXI7XG4gIGludGVyZXN0UmF0ZTogbnVtYmVyOyAvLyBBbm51YWwgbm9taW5hbCByYXRlIChlLmcuIDAuMDUyKVxuICBhbW9ydGl6YXRpb25ZZWFyczogbnVtYmVyO1xuICBwYXltZW50RnJlcXVlbmN5OiAnTU9OVEhMWScgfCAnQklfV0VFS0xZJyB8ICdBQ0NFTEVSQVRFRF9CSV9XRUVLTFknO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFtb3J0aXphdGlvblNjaGVkdWxlSXRlbSB7XG4gIHllYXI6IG51bWJlcjtcbiAgcHJpbmNpcGFsOiBudW1iZXI7XG4gIGludGVyZXN0OiBudW1iZXI7XG4gIGJhbGFuY2U6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZUNhbGN1bGF0aW9uUmVzdWx0IHtcbiAgbG9hbkFtb3VudDogbnVtYmVyO1xuICBpbnN1cmFuY2VQcmVtaXVtOiBudW1iZXI7XG4gIHRvdGFsTW9ydGdhZ2U6IG51bWJlcjtcbiAgbW9udGhseVBheW1lbnQ6IG51bWJlcjtcbiAgdG90YWxJbnRlcmVzdFBhaWQ6IG51bWJlcjtcbiAgdG90YWxQYWlkOiBudW1iZXI7XG4gIGFtb3J0aXphdGlvblNjaGVkdWxlOiBBbW9ydGl6YXRpb25TY2hlZHVsZUl0ZW1bXTtcbiAgb3RoZXJGZWVzOiBPdGhlckZlZXM7XG59XG4iXX0=
@@ -0,0 +1,4 @@
1
+ import { Result } from '../canada/domain/types';
2
+ export interface CanadaCorporateTaxService {
3
+ calculate(): Result;
4
+ }
@@ -0,0 +1,9 @@
1
+ import { Rules, Input, Result } from './domain/types';
2
+ import { CanadaCorporateTaxService } from './CanadaCorporateTaxService';
3
+ export declare class CanadaCorporateTaxServiceImpl implements CanadaCorporateTaxService {
4
+ private _input;
5
+ private _rules;
6
+ constructor(input: Input, rules: Rules);
7
+ calculate(): Result;
8
+ private applyRules;
9
+ }
@@ -0,0 +1,42 @@
1
+ export interface RegimeItem {
2
+ type: 'flat' | 'progressive';
3
+ rate: number;
4
+ maxIncome?: number;
5
+ brackets?: ProgressiveTaxBracket[];
6
+ }
7
+ export interface Regime {
8
+ general: RegimeItem[];
9
+ smallBusiness: RegimeItem[];
10
+ }
11
+ export interface Input {
12
+ taxableIncome: number;
13
+ isSmallBusiness: boolean;
14
+ }
15
+ export interface Output {
16
+ name: string;
17
+ type: 'number' | 'string';
18
+ unit?: string;
19
+ }
20
+ export interface FlatTaxRule {
21
+ type: 'flat';
22
+ rate: number;
23
+ }
24
+ export interface ProgressiveTaxBracket {
25
+ from: number;
26
+ to: number | null;
27
+ rate: number;
28
+ }
29
+ export interface ProgressiveTaxRule {
30
+ type: 'progressive';
31
+ brackets: ProgressiveTaxBracket[];
32
+ eligibility?: Record<string, any>;
33
+ }
34
+ export type TaxRule = FlatTaxRule | ProgressiveTaxRule;
35
+ export interface Rules {
36
+ regimes: Record<string, TaxRule>;
37
+ }
38
+ export interface Result {
39
+ corporateTax: number;
40
+ effectiveTaxRate: number;
41
+ breakdown: Record<string, number>;
42
+ }
File without changes
@@ -0,0 +1,4 @@
1
+ import { Result } from './domain/types';
2
+ export interface FranceCorporateTaxService {
3
+ calculate(): Result;
4
+ }
@@ -0,0 +1,9 @@
1
+ import { Rules, Input, Result } from './domain/types';
2
+ import { FranceCorporateTaxService } from './FranceCorporateTaxService';
3
+ export declare class FranceCorporateTaxServiceImpl implements FranceCorporateTaxService {
4
+ private _input;
5
+ private _rules;
6
+ constructor(input: Input, rules: Rules);
7
+ calculate(): Result;
8
+ private applyRules;
9
+ }
@@ -0,0 +1,48 @@
1
+ export interface RegimeCondition {
2
+ maxTurnover: number;
3
+ }
4
+ export interface RegimeItem {
5
+ type: 'flat' | 'progressive';
6
+ rate?: number;
7
+ maxIncome?: number;
8
+ brackets?: ProgressiveTaxBracket[];
9
+ }
10
+ export interface Regime {
11
+ general: RegimeItem[];
12
+ smallBusiness: RegimeItem[];
13
+ }
14
+ export interface Input {
15
+ taxableIncome: number;
16
+ annualTurnover: number;
17
+ isSmallBusiness: boolean;
18
+ }
19
+ export interface Output {
20
+ name: string;
21
+ type: 'number' | 'string';
22
+ unit?: string;
23
+ }
24
+ export interface FlatTaxRule {
25
+ type: 'flat';
26
+ rate: number;
27
+ conditions?: RegimeCondition;
28
+ }
29
+ export interface ProgressiveTaxBracket {
30
+ from: number;
31
+ to: number | null;
32
+ rate: number;
33
+ }
34
+ export interface ProgressiveTaxRule {
35
+ type: 'progressive';
36
+ brackets: ProgressiveTaxBracket[];
37
+ eligibility?: Record<string, any>;
38
+ conditions?: RegimeCondition;
39
+ }
40
+ export type TaxRule = FlatTaxRule | ProgressiveTaxRule;
41
+ export interface Rules {
42
+ regimes: Record<string, TaxRule>;
43
+ }
44
+ export interface Result {
45
+ corporateTax: number;
46
+ effectiveTaxRate: number;
47
+ breakdown: Record<string, number>;
48
+ }
@@ -0,0 +1,4 @@
1
+ import { Result } from './domain/types';
2
+ export interface SouthAfricaCorporateTaxService {
3
+ calculate(): Result;
4
+ }
@@ -0,0 +1,9 @@
1
+ import { Rules, Input, Result } from './domain/types';
2
+ import { SouthAfricaCorporateTaxService } from './SouthAfricaCorporateTaxService';
3
+ export declare class SouthAfricaCorporateTaxServiceImpl implements SouthAfricaCorporateTaxService {
4
+ private _input;
5
+ private _rules;
6
+ constructor(input: Input, rules: Rules);
7
+ calculate(): Result;
8
+ private calculateProgressiveTax;
9
+ }
@@ -0,0 +1,32 @@
1
+ export interface Input {
2
+ taxableIncome: number;
3
+ regime: 'LARGE' | 'SBC';
4
+ }
5
+ export interface Output {
6
+ name: string;
7
+ type: 'number' | 'string';
8
+ unit?: string;
9
+ }
10
+ export interface FlatTaxRule {
11
+ type: 'flat';
12
+ rate: number;
13
+ }
14
+ export interface ProgressiveTaxBracket {
15
+ from: number;
16
+ to: number | null;
17
+ rate: number;
18
+ }
19
+ export interface ProgressiveTaxRule {
20
+ type: 'progressive';
21
+ brackets: ProgressiveTaxBracket[];
22
+ eligibility?: Record<string, any>;
23
+ }
24
+ export type TaxRule = FlatTaxRule | ProgressiveTaxRule;
25
+ export interface Rules {
26
+ regimes: Record<string, TaxRule>;
27
+ }
28
+ export interface Result {
29
+ corporateTax: number;
30
+ effectiveTaxRate: number;
31
+ breakdown: Record<string, number>;
32
+ }
@@ -3,13 +3,19 @@ export { CanadaIncomeTaxServiceImpl as CanadaIncomeTaxService } from './income-t
3
3
  export { CanadaMortgageServiceImpl as CanadaMortgageService } from './mortgage/canada/CanadaMortgageServiceImpl';
4
4
  export { ComputedIncomeTaxValues as CanadaComputedIncomeTaxValues, IncomeTaxRules as CanadaIncomeTaxRules, } from './income-tax/canada/domain/types';
5
5
  export { MortgageRules as CanadaMortgageRules, MortgageCalculationInput as CanadaMortgageCalculationInput, MortgageCalculationResult as CanadaMortgageCalculationResult, } from './mortgage/canada/domain/types';
6
+ export { CanadaCorporateTaxServiceImpl as CanadaCorporateTaxService } from './corporate/canada/CanadaCorporateTaxServiceImpl';
7
+ export { Input as CanadaCorporateTaxInput, Rules as CanadaCorporateTaxRules, Result as CanadaCorporateTaxResult, } from './corporate/canada/domain/types';
6
8
  export { FranceIncomeTaxServiceImpl as FranceIncomeTaxService } from './income-tax/france/FranceIncomeTaxServiceImpl';
7
9
  export { FranceMortgageServiceImpl as FranceMortgageService } from './mortgage/france/FranceMortgageServiceImpl';
8
10
  export { ComputedIncomeTaxValues as FranceComputedIncomeTaxValues, IncomeTaxRules as FranceIncomeTaxRules, } from './income-tax/france/domain/types';
9
11
  export { MortgageRules as FranceMortgageRules, MortgageInput as FranceMortgageInput, MortgageOutput as FranceMortgageCalculationResult, } from './mortgage/france/domain/types';
12
+ export { FranceCorporateTaxServiceImpl as FranceCorporateTaxService } from './corporate/france/FranceCorporateTaxServiceImpl';
13
+ export { Input as FranceCorporateTaxInput, Rules as FranceCorporateTaxRules, Result as FranceCorporateTaxResult, } from './corporate/france/domain/types';
10
14
  export { SouthAfricaIncomeTaxServiceImpl as SouthAfricaIncomeTaxService } from './income-tax/south-africa/SouthAfricaIncomeTaxServiceImpl';
11
15
  export { SouthAfricaMortgageServiceImpl as SouthAfricaMortgageService } from './mortgage/south-africa/SouthAfricaMortgageServiceImpl';
12
16
  export { ComputedIncomeTaxValues as SouthAfricaComputedIncomeTaxValues, IncomeTaxRules as SouthAfricaIncomeTaxRules, } from './income-tax/south-africa/domain/types';
13
17
  export { MortgageRules as SouthAfricaMortgageRules, MortgageInput as SouthAfricaMortgageInput, MortgageOutput as SouthAfricaMortgageOutput, } from './mortgage/south-africa/domain/types';
18
+ export { SouthAfricaCorporateTaxServiceImpl as SouthAfricaCorporateTaxService } from './corporate/south-africa/SouthAfricaCorporateTaxServiceImpl';
19
+ export { Rules as SouthAfricaCorporateTaxRules, Input as SouthAfricaCorporateTaxInput, Result as SouthAfricaCorporateTaxResult, } from './corporate/south-africa/domain/types';
14
20
  export { IncomeTaxCalculatorSchema } from './income-tax/domain/types';
15
21
  export * from './income-tax/domain/types';
@@ -86,7 +86,7 @@ export interface MortgageCalculationResult {
86
86
  loanAmount: number;
87
87
  insurancePremium: number;
88
88
  totalMortgage: number;
89
- monthlyPaymentAmount: number;
89
+ monthlyPayment: number;
90
90
  totalInterestPaid: number;
91
91
  totalPaid: number;
92
92
  amortizationSchedule: AmortizationScheduleItem[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@novha/calc-engines",
3
- "version": "1.6.4",
3
+ "version": "1.7.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/types/index.d.ts",
6
6
  "scripts": {
@@ -0,0 +1,5 @@
1
+ import { Input, Rules, Result } from '../canada/domain/types';
2
+
3
+ export interface CanadaCorporateTaxService {
4
+ calculate(): Result;
5
+ }
@@ -0,0 +1,67 @@
1
+ import { Rules, Input, Result, ProgressiveTaxBracket } from './domain/types';
2
+ import { CanadaCorporateTaxService } from './CanadaCorporateTaxService';
3
+
4
+ export class CanadaCorporateTaxServiceImpl implements CanadaCorporateTaxService {
5
+ private _input: Input;
6
+ private _rules: Rules;
7
+
8
+ constructor(input: Input, rules: Rules) {
9
+ this._input = input;
10
+ this._rules = rules;
11
+ }
12
+
13
+ calculate(): Result {
14
+ const result = this.applyRules(this._rules, this._input);
15
+
16
+ const totalTax = result.tax;
17
+
18
+ return {
19
+ corporateTax: totalTax,
20
+ effectiveTaxRate:
21
+ this._input.taxableIncome > 0
22
+ ? (totalTax / this._input.taxableIncome) * 100
23
+ : 0,
24
+ breakdown: result.breakdown,
25
+ };
26
+ }
27
+
28
+ private applyRules(rules: Rules, input: Input): { tax: number; breakdown: Record<string, number> } {
29
+ const regime = input.isSmallBusiness
30
+ ? rules.regimes.smallBusiness
31
+ : rules.regimes.general;
32
+
33
+ if (regime.type === 'flat') {
34
+ const tax = input.taxableIncome * regime.rate;
35
+ return {
36
+ tax,
37
+ breakdown: { flatTax: tax },
38
+ };
39
+ }
40
+
41
+ if (regime.type === 'progressive') {
42
+ let remaining = input.taxableIncome;
43
+ let tax = 0;
44
+ const breakdown: Record<string, number> = {};
45
+
46
+ for (const bracket of regime.brackets) {
47
+ if (remaining <= 0) break;
48
+
49
+ const upper = bracket.to ?? Infinity;
50
+ const taxable = Math.min(upper - bracket.from, remaining);
51
+
52
+ const bracketTax = taxable * bracket.rate;
53
+ tax += bracketTax;
54
+ remaining -= taxable;
55
+
56
+ const bracketKey = bracket.to === null
57
+ ? `bracket_${bracket.from}_and_above`
58
+ : `bracket_${bracket.from}_to_${bracket.to}`;
59
+ breakdown[bracketKey] = bracketTax;
60
+ }
61
+
62
+ return { tax, breakdown };
63
+ }
64
+
65
+ throw new Error('Unsupported regime type');
66
+ }
67
+ }
@@ -0,0 +1,54 @@
1
+
2
+
3
+ export interface RegimeItem {
4
+ type: 'flat' | 'progressive';
5
+ rate: number;
6
+ maxIncome?: number;
7
+ brackets?: ProgressiveTaxBracket[];
8
+ }
9
+
10
+ export interface Regime {
11
+ general: RegimeItem[];
12
+ smallBusiness: RegimeItem[];
13
+ }
14
+
15
+ export interface Input {
16
+ taxableIncome: number;
17
+ isSmallBusiness: boolean;
18
+ }
19
+
20
+ export interface Output {
21
+ name: string;
22
+ type: 'number' | 'string';
23
+ unit?: string;
24
+ }
25
+
26
+ export interface FlatTaxRule {
27
+ type: 'flat';
28
+ rate: number;
29
+ }
30
+
31
+ export interface ProgressiveTaxBracket {
32
+ from: number;
33
+ to: number | null;
34
+ rate: number;
35
+ }
36
+
37
+ export interface ProgressiveTaxRule {
38
+ type: 'progressive';
39
+ brackets: ProgressiveTaxBracket[];
40
+ eligibility?: Record<string, any>;
41
+ }
42
+
43
+ export type TaxRule = FlatTaxRule | ProgressiveTaxRule;
44
+
45
+ export interface Rules {
46
+ regimes: Record<string, TaxRule>;
47
+ }
48
+
49
+ export interface Result {
50
+ corporateTax: number;
51
+ effectiveTaxRate: number;
52
+ breakdown: Record<string, number>;
53
+ }
54
+
File without changes
@@ -0,0 +1,5 @@
1
+ import { Result } from './domain/types';
2
+
3
+ export interface FranceCorporateTaxService {
4
+ calculate(): Result;
5
+ }
@@ -0,0 +1,73 @@
1
+ import { Rules, Input, Result, ProgressiveTaxBracket } from './domain/types';
2
+ import { FranceCorporateTaxService } from './FranceCorporateTaxService';
3
+
4
+ export class FranceCorporateTaxServiceImpl implements FranceCorporateTaxService {
5
+ private _input: Input;
6
+ private _rules: Rules;
7
+
8
+ constructor(input: Input, rules: Rules) {
9
+ this._input = input;
10
+ this._rules = rules;
11
+ }
12
+
13
+ calculate(): Result {
14
+ const result = this.applyRules(this._rules, this._input);
15
+
16
+ const totalTax = result.tax;
17
+
18
+ return {
19
+ corporateTax: totalTax,
20
+ effectiveTaxRate:
21
+ this._input.taxableIncome > 0
22
+ ? (totalTax / this._input.taxableIncome) * 100
23
+ : 0,
24
+ breakdown: result.breakdown,
25
+ };
26
+ }
27
+
28
+ private applyRules(rules: Rules, input: Input): { tax: number; breakdown: Record<string, number> } {
29
+ const regime = input.isSmallBusiness
30
+ ? rules.regimes.smallBusiness
31
+ : rules.regimes.general;
32
+
33
+ if (regime.conditions?.maxTurnover) {
34
+ if (input.annualTurnover > regime.conditions.maxTurnover) {
35
+ throw new Error('SME regime not applicable: turnover exceeded');
36
+ }
37
+ }
38
+
39
+ if (regime.type === 'flat') {
40
+ const tax = input.taxableIncome * regime.rate;
41
+ return {
42
+ tax,
43
+ breakdown: { flatTax: tax },
44
+ };
45
+ }
46
+
47
+ if (regime.type === 'progressive') {
48
+ let remaining = input.taxableIncome;
49
+ let tax = 0;
50
+ const breakdown: Record<string, number> = {};
51
+
52
+ for (const bracket of regime.brackets) {
53
+ if (remaining <= 0) break;
54
+
55
+ const upper = bracket.to ?? Infinity;
56
+ const taxable = Math.min(upper - bracket.from, remaining);
57
+
58
+ const bracketTax = taxable * bracket.rate;
59
+ tax += bracketTax;
60
+ remaining -= taxable;
61
+
62
+ const bracketKey = bracket.to === null
63
+ ? `bracket_${bracket.from}_and_above`
64
+ : `bracket_${bracket.from}_to_${bracket.to}`;
65
+ breakdown[bracketKey] = bracketTax;
66
+ }
67
+
68
+ return { tax, breakdown };
69
+ }
70
+
71
+ throw new Error('Unsupported regime type');
72
+ }
73
+ }
@@ -0,0 +1,60 @@
1
+
2
+ export interface RegimeCondition {
3
+ maxTurnover: number;
4
+ }
5
+
6
+ export interface RegimeItem {
7
+ type: 'flat' | 'progressive';
8
+ rate?: number;
9
+ maxIncome?: number;
10
+ brackets?: ProgressiveTaxBracket[];
11
+ }
12
+
13
+ export interface Regime {
14
+ general: RegimeItem[];
15
+ smallBusiness: RegimeItem[];
16
+ }
17
+
18
+ export interface Input {
19
+ taxableIncome: number;
20
+ annualTurnover: number;
21
+ isSmallBusiness: boolean;
22
+ }
23
+
24
+ export interface Output {
25
+ name: string;
26
+ type: 'number' | 'string';
27
+ unit?: string;
28
+ }
29
+
30
+ export interface FlatTaxRule {
31
+ type: 'flat';
32
+ rate: number;
33
+ conditions?: RegimeCondition;
34
+ }
35
+
36
+ export interface ProgressiveTaxBracket {
37
+ from: number;
38
+ to: number | null;
39
+ rate: number;
40
+ }
41
+
42
+ export interface ProgressiveTaxRule {
43
+ type: 'progressive';
44
+ brackets: ProgressiveTaxBracket[];
45
+ eligibility?: Record<string, any>;
46
+ conditions?: RegimeCondition;
47
+ }
48
+
49
+ export type TaxRule = FlatTaxRule | ProgressiveTaxRule;
50
+
51
+ export interface Rules {
52
+ regimes: Record<string, TaxRule>;
53
+ }
54
+
55
+ export interface Result {
56
+ corporateTax: number;
57
+ effectiveTaxRate: number;
58
+ breakdown: Record<string, number>;
59
+ }
60
+
@@ -0,0 +1,5 @@
1
+ import { Result } from './domain/types';
2
+
3
+ export interface SouthAfricaCorporateTaxService {
4
+ calculate(): Result;
5
+ }
@@ -0,0 +1,74 @@
1
+ import { Rules, Input, Result, ProgressiveTaxBracket } from './domain/types';
2
+ import { SouthAfricaCorporateTaxService } from './SouthAfricaCorporateTaxService';
3
+
4
+ export class SouthAfricaCorporateTaxServiceImpl implements SouthAfricaCorporateTaxService {
5
+ private _input: Input;
6
+ private _rules: Rules;
7
+
8
+ constructor(input: Input, rules: Rules) {
9
+ this._input = input;
10
+ this._rules = rules;
11
+ }
12
+
13
+ calculate(): Result {
14
+ const rule = this._rules.regimes[this._input.regime];
15
+
16
+ if (!rule) {
17
+ throw new Error(`Unknown tax regime: ${this._input.regime}`);
18
+ }
19
+
20
+ let tax = 0;
21
+ let breakdown: Record<string, number> = {};
22
+
23
+ if (rule.type === 'flat') {
24
+ tax = this._input.taxableIncome * rule.rate;
25
+ breakdown = {
26
+ flatTax: tax
27
+ };
28
+ }
29
+
30
+ if (rule.type === 'progressive') {
31
+ const result = this.calculateProgressiveTax(
32
+ this._input.taxableIncome,
33
+ rule.brackets
34
+ );
35
+ tax = result.total;
36
+ breakdown = result.breakdown;
37
+ }
38
+
39
+ return {
40
+ corporateTax: tax,
41
+ effectiveTaxRate:
42
+ this._input.taxableIncome > 0
43
+ ? (tax / this._input.taxableIncome) * 100
44
+ : 0,
45
+ breakdown,
46
+ };
47
+ }
48
+
49
+ private calculateProgressiveTax(income: number, brackets: ProgressiveTaxBracket[]): { total: number; breakdown: Record<string, number> } {
50
+ let tax = 0;
51
+ const breakdown: Record<string, number> = {};
52
+
53
+ for (const bracket of brackets) {
54
+ if (income <= bracket.from) continue;
55
+
56
+ const upperLimit =
57
+ bracket.to === null ? income : Math.min(income, bracket.to);
58
+
59
+ const taxableAmount = upperLimit - bracket.from;
60
+
61
+ if (taxableAmount > 0) {
62
+ const bracketTax = taxableAmount * bracket.rate;
63
+ tax += bracketTax;
64
+
65
+ const bracketKey = bracket.to === null
66
+ ? `bracket_${bracket.from}_and_above`
67
+ : `bracket_${bracket.from}_to_${bracket.to}`;
68
+ breakdown[bracketKey] = bracketTax;
69
+ }
70
+ }
71
+
72
+ return { total: tax, breakdown };
73
+ }
74
+ }
@@ -0,0 +1,40 @@
1
+ export interface Input {
2
+ taxableIncome: number;
3
+ regime: 'LARGE' | 'SBC';
4
+ }
5
+
6
+ export interface Output {
7
+ name: string;
8
+ type: 'number' | 'string';
9
+ unit?: string;
10
+ }
11
+
12
+ export interface FlatTaxRule {
13
+ type: 'flat';
14
+ rate: number;
15
+ }
16
+
17
+ export interface ProgressiveTaxBracket {
18
+ from: number;
19
+ to: number | null;
20
+ rate: number;
21
+ }
22
+
23
+ export interface ProgressiveTaxRule {
24
+ type: 'progressive';
25
+ brackets: ProgressiveTaxBracket[];
26
+ eligibility?: Record<string, any>;
27
+ }
28
+
29
+ export type TaxRule = FlatTaxRule | ProgressiveTaxRule;
30
+
31
+ export interface Rules {
32
+ regimes: Record<string, TaxRule>;
33
+ }
34
+
35
+ export interface Result {
36
+ corporateTax: number;
37
+ effectiveTaxRate: number;
38
+ breakdown: Record<string, number>;
39
+ }
40
+
package/src/index.ts CHANGED
@@ -13,6 +13,13 @@ export {
13
13
  MortgageCalculationResult as CanadaMortgageCalculationResult,
14
14
  } from './mortgage/canada/domain/types';
15
15
 
16
+ export { CanadaCorporateTaxServiceImpl as CanadaCorporateTaxService } from './corporate/canada/CanadaCorporateTaxServiceImpl';
17
+ export {
18
+ Input as CanadaCorporateTaxInput,
19
+ Rules as CanadaCorporateTaxRules,
20
+ Result as CanadaCorporateTaxResult,
21
+ } from './corporate/canada/domain/types';
22
+
16
23
  // France
17
24
  export { FranceIncomeTaxServiceImpl as FranceIncomeTaxService } from './income-tax/france/FranceIncomeTaxServiceImpl';
18
25
  export { FranceMortgageServiceImpl as FranceMortgageService } from './mortgage/france/FranceMortgageServiceImpl';
@@ -26,6 +33,13 @@ export {
26
33
  MortgageOutput as FranceMortgageCalculationResult,
27
34
  } from './mortgage/france/domain/types';
28
35
 
36
+ export { FranceCorporateTaxServiceImpl as FranceCorporateTaxService } from './corporate/france/FranceCorporateTaxServiceImpl';
37
+ export {
38
+ Input as FranceCorporateTaxInput,
39
+ Rules as FranceCorporateTaxRules,
40
+ Result as FranceCorporateTaxResult,
41
+ } from './corporate/france/domain/types';
42
+
29
43
  // South Africa
30
44
  export { SouthAfricaIncomeTaxServiceImpl as SouthAfricaIncomeTaxService } from './income-tax/south-africa/SouthAfricaIncomeTaxServiceImpl';
31
45
  export { SouthAfricaMortgageServiceImpl as SouthAfricaMortgageService } from './mortgage/south-africa/SouthAfricaMortgageServiceImpl';
@@ -39,6 +53,12 @@ export {
39
53
  MortgageOutput as SouthAfricaMortgageOutput,
40
54
  } from './mortgage/south-africa/domain/types';
41
55
 
56
+ export { SouthAfricaCorporateTaxServiceImpl as SouthAfricaCorporateTaxService } from './corporate/south-africa/SouthAfricaCorporateTaxServiceImpl';
57
+ export {
58
+ Rules as SouthAfricaCorporateTaxRules,
59
+ Input as SouthAfricaCorporateTaxInput,
60
+ Result as SouthAfricaCorporateTaxResult,
61
+ } from './corporate/south-africa/domain/types';
42
62
 
43
63
  export { IncomeTaxCalculatorSchema } from './income-tax/domain/types';
44
64
  export * from './income-tax/domain/types';
@@ -101,7 +101,7 @@ export class CanadaMortgageServiceImpl implements CanadaMortgageService {
101
101
  loanAmount: loanAmount,
102
102
  insurancePremium: insurancePremium,
103
103
  totalMortgage: totalMortgage,
104
- monthlyPaymentAmount: paymentAmount,
104
+ monthlyPayment: paymentAmount,
105
105
  totalInterestPaid: totalInterestPaid,
106
106
  totalPaid: totalPaid,
107
107
  amortizationSchedule: amortizationSchedule,
@@ -102,7 +102,7 @@ export interface MortgageCalculationResult {
102
102
  loanAmount: number;
103
103
  insurancePremium: number;
104
104
  totalMortgage: number;
105
- monthlyPaymentAmount: number;
105
+ monthlyPayment: number;
106
106
  totalInterestPaid: number;
107
107
  totalPaid: number;
108
108
  amortizationSchedule: AmortizationScheduleItem[];