math-exercises 3.0.130 → 3.0.131
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/exercises/math/calculLitteral/equation/equationWithDistributivity.d.ts.map +1 -1
- package/lib/exercises/math/calculLitteral/equation/equationWithDistributivity.js +15 -11
- package/lib/exercises/math/calculLitteral/equation/multiplicationEquation.d.ts.map +1 -1
- package/lib/exercises/math/calculLitteral/equation/multiplicationEquation.js +6 -5
- package/lib/exercises/math/calculLitteral/factorisation/index.d.ts +0 -1
- package/lib/exercises/math/calculLitteral/factorisation/index.d.ts.map +1 -1
- package/lib/exercises/math/calculLitteral/factorisation/index.js +1 -1
- package/lib/exercises/math/geometry/euclidian/pythagoreOrThales.js +2 -2
- package/lib/exercises/math/percent/evolutions/evolutionRateFromValues.d.ts.map +1 -1
- package/lib/exercises/math/percent/evolutions/evolutionRateFromValues.js +29 -16
- package/lib/exercises/math/percent/findProportion.d.ts +1 -5
- package/lib/exercises/math/percent/findProportion.d.ts.map +1 -1
- package/lib/exercises/math/percent/findProportion.js +75 -81
- package/lib/exercises/math/probaStat/randomVariable/randomVariableAverage.js +1 -1
- package/lib/exercises/vea/isNodesEqual.d.ts +3 -0
- package/lib/exercises/vea/isNodesEqual.d.ts.map +1 -0
- package/lib/exercises/vea/isNodesEqual.js +6 -0
- package/lib/exercises/vea/setVEA.d.ts +5 -0
- package/lib/exercises/vea/setVEA.d.ts.map +1 -0
- package/lib/exercises/vea/setVEA.js +25 -0
- package/lib/index.d.ts +2 -17
- package/lib/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"equationWithDistributivity.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/calculLitteral/equation/equationWithDistributivity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAmBT,MAAM,6BAA6B,CAAC;AAmBrC,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;
|
|
1
|
+
{"version":3,"file":"equationWithDistributivity.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/calculLitteral/equation/equationWithDistributivity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAmBT,MAAM,6BAA6B,CAAC;AAmBrC,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAyIF,KAAK,OAAO,GAAG;IACb,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAgEF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAerE,CAAC"}
|
|
@@ -24,16 +24,15 @@ const getPropositions = (n, { answer }, opts) => {
|
|
|
24
24
|
});
|
|
25
25
|
return shuffleProps(propositions, n);
|
|
26
26
|
};
|
|
27
|
-
const
|
|
27
|
+
const getAnswerNode = (identifiers) => {
|
|
28
28
|
const { type, a, b, c, d, e, f } = identifiers;
|
|
29
|
-
|
|
30
|
-
? frac(substract(multiply(d, f), multiply(a, c)), substract(multiply(a, b), multiply(d, e)))
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
return `x=${sol}`;
|
|
29
|
+
return type
|
|
30
|
+
? frac(substract(multiply(d, f), multiply(a, c)), substract(multiply(a, b), multiply(d, e))).simplify()
|
|
31
|
+
: frac(substract(e, multiply(a, c)), substract(multiply(a, b), d)).simplify();
|
|
32
|
+
};
|
|
33
|
+
const getAnswer = (identifiers) => {
|
|
34
|
+
const answerNode = getAnswerNode(identifiers);
|
|
35
|
+
return `x=${answerNode.toTex()}`;
|
|
37
36
|
};
|
|
38
37
|
const getInstruction = (identifiers) => {
|
|
39
38
|
const { type, a, b, c, d, e, f } = identifiers;
|
|
@@ -100,11 +99,16 @@ $$
|
|
|
100
99
|
const getKeys = () => {
|
|
101
100
|
return ["x", "equal"];
|
|
102
101
|
};
|
|
103
|
-
const isAnswerValid = (ans, { answer }) => {
|
|
102
|
+
const isAnswerValid = (ans, { answer, ...identifiers }) => {
|
|
104
103
|
const parsed = equationSolutionParser(ans);
|
|
105
104
|
if (!parsed)
|
|
106
105
|
return false;
|
|
107
|
-
return `x=${parsed.toTex()}` === answer
|
|
106
|
+
return (`x=${parsed.toTex()}` === answer ||
|
|
107
|
+
(() => {
|
|
108
|
+
const ansNode = parsed;
|
|
109
|
+
const answerNode = getAnswerNode(identifiers);
|
|
110
|
+
return substract(ansNode, answerNode).simplify().evaluate() === 0;
|
|
111
|
+
})());
|
|
108
112
|
};
|
|
109
113
|
const getEquationWithDistributivityQuestion = (opts) => {
|
|
110
114
|
const type = random([0, 1]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multiplicationEquation.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/calculLitteral/equation/multiplicationEquation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAeT,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"multiplicationEquation.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/calculLitteral/equation/multiplicationEquation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAeT,MAAM,6BAA6B,CAAC;AAarC,KAAK,WAAW,GAAG;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAkIF,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,WAAW,CAcxD,CAAC"}
|
|
@@ -8,6 +8,8 @@ import { MultiplyNode } from "../../../../tree/nodes/operators/multiplyNode.js";
|
|
|
8
8
|
import { DiscreteSetNode } from "../../../../tree/nodes/sets/discreteSetNode.js";
|
|
9
9
|
import { alignTex } from "../../../../utils/latex/alignTex.js";
|
|
10
10
|
import { shuffle } from "../../../../utils/alea/shuffle.js";
|
|
11
|
+
import { SetVEA } from "../../../../exercises/vea/setVEA.js";
|
|
12
|
+
import { discreteSetParser } from "../../../../tree/parsers/discreteSetParser.js";
|
|
11
13
|
const getStatementNode = (identifiers) => {
|
|
12
14
|
const { a, b, c, d } = identifiers;
|
|
13
15
|
const polynome1 = new Polynomial([b, a]);
|
|
@@ -110,14 +112,13 @@ const getPropositions = (n, { answer }) => {
|
|
|
110
112
|
return shuffle(propositions);
|
|
111
113
|
};
|
|
112
114
|
const isAnswerValid = (ans, { a, b, c, d }) => {
|
|
115
|
+
const parsed = discreteSetParser(ans);
|
|
116
|
+
if (!parsed)
|
|
117
|
+
return false;
|
|
113
118
|
const sol1 = new Rational(-b, a).simplify().toTree();
|
|
114
119
|
const sol2 = new Rational(-d, c).simplify().toTree();
|
|
115
120
|
const sortedSols = -b / a < -d / c ? [sol1, sol2] : [sol2, sol1];
|
|
116
|
-
|
|
117
|
-
opts: { allowFractionToDecimal: true },
|
|
118
|
-
});
|
|
119
|
-
const texs = answer.toAllValidTexs();
|
|
120
|
-
return texs.includes(ans);
|
|
121
|
+
return SetVEA.isArrayOfNodesValid(parsed.elements, sortedSols);
|
|
121
122
|
};
|
|
122
123
|
export const multiplicationEquation = {
|
|
123
124
|
id: "multiplicationEquation",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/calculLitteral/factorisation/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/calculLitteral/factorisation/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC"}
|
|
@@ -81,7 +81,7 @@ const getHint = () => {
|
|
|
81
81
|
return `Voici les énoncés des théorèmes de Pythagore et de Thalès, et leurs réciproques :
|
|
82
82
|
|
|
83
83
|
- **Théorème de Pythagore** : Dans un triangle rectangle, le carré de l'hypoténuse est égal à la somme des carrés des deux autres côtés.
|
|
84
|
-
- **Réciproque du théorème de Pythagore** : Si dans un triangle, le carré
|
|
84
|
+
- **Réciproque du théorème de Pythagore** : Si dans un triangle, le carré du plus grand côté est égal à la somme des carrés des deux autres côtés, alors le triangle est rectangle.
|
|
85
85
|
- **Théorème de Thalès** : Soit un triangle $ABC$, et $D$ un point sur la droite $(AB)$ et $E$ un point sur la droite $(AC)$. Si les droites $(DE)$ et $(BC)$ sont parallèles, alors :
|
|
86
86
|
|
|
87
87
|
$$
|
|
@@ -98,7 +98,7 @@ const getCorrection = (identifiers) => {
|
|
|
98
98
|
On applique ce théorème dans le triangle $ABD$ rectangle en $D$. En effet, d'après le théorème de Pythagore, on a $AB^2 = AD^2 + DB^2$. Puisqu'on connaît les longueurs $AD$ et $DB$, on peut en déduire la longueur $AB$.`;
|
|
99
99
|
}
|
|
100
100
|
else {
|
|
101
|
-
return `Il faut utiliser la réciproque du théorème de Pythagore : si dans un triangle, le carré
|
|
101
|
+
return `Il faut utiliser la réciproque du théorème de Pythagore : si dans un triangle, le carré du plus grand côté est égal à la somme des carrés des deux autres côtés, alors le triangle est rectangle.
|
|
102
102
|
|
|
103
103
|
On applique cette réciproque dans le triangle $BCD$. En effet, on connaît les longueurs des trois côtés. Il suffit donc de montrer que $BC^2 = BD^2 + CD^2$.`;
|
|
104
104
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evolutionRateFromValues.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/percent/evolutions/evolutionRateFromValues.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAgBT,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"evolutionRateFromValues.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/percent/evolutions/evolutionRateFromValues.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAgBT,MAAM,6BAA6B,CAAC;AAYrC,KAAK,WAAW,GAAG;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAyHF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,WAAW,CAgBzD,CAAC"}
|
|
@@ -4,9 +4,11 @@ import { randfloat } from "../../../../math/utils/random/randfloat.js";
|
|
|
4
4
|
import { randint } from "../../../../math/utils/random/randint.js";
|
|
5
5
|
import { round } from "../../../../math/utils/round.js";
|
|
6
6
|
import { percentParser } from "../../../../tree/parsers/percentParser.js";
|
|
7
|
+
import { valueParser } from "../../../../tree/parsers/valueParser.js";
|
|
7
8
|
import { coinFlip } from "../../../../utils/alea/coinFlip.js";
|
|
8
9
|
import { doWhile } from "../../../../utils/doWhile.js";
|
|
9
10
|
import { alignTex } from "../../../../utils/latex/alignTex.js";
|
|
11
|
+
import { approxOrEqual } from "../../../../utils/latex/approxOrEqual.js";
|
|
10
12
|
const getPropositions = (n, { answer, vd, vf }) => {
|
|
11
13
|
const propositions = [];
|
|
12
14
|
addValidProp(propositions, answer);
|
|
@@ -25,42 +27,53 @@ const getAnswer = (identifiers) => {
|
|
|
25
27
|
return taux.frenchify() + "\\%";
|
|
26
28
|
};
|
|
27
29
|
const getInstruction = (identifiers) => {
|
|
28
|
-
return `Un prix passe de $${identifiers.vd.frenchify()}€$ à $${identifiers.vf.frenchify()}€$. Quel est le taux d'évolution du prix
|
|
30
|
+
return `Un prix passe de $${identifiers.vd.frenchify()}€$ à $${identifiers.vf.frenchify()}€$. Quel est le taux d'évolution du prix ? Arrondir au centième de pourcent.`;
|
|
29
31
|
};
|
|
30
32
|
const getHint = () => {
|
|
31
|
-
return `Si une valeur passe d'une valeur de départ $V_d$ à une valeur d'arrivée $V_a$, alors le taux d'évolution $t$
|
|
33
|
+
return `Si une valeur passe d'une valeur de départ $V_d$ à une valeur d'arrivée $V_a$, alors le taux d'évolution $t$ est donné par la formule :
|
|
32
34
|
|
|
33
35
|
$$
|
|
34
|
-
t = \\frac{V_a-V_d}{V_d}
|
|
36
|
+
t = \\frac{V_a-V_d}{V_d}
|
|
35
37
|
$$`;
|
|
36
38
|
};
|
|
37
39
|
const getCorrection = (identifiers) => {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
+
const { vd, vf } = identifiers;
|
|
41
|
+
const percentAnswer = round(((identifiers.vf - identifiers.vd) / identifiers.vd) * 100, 2).frenchify();
|
|
42
|
+
return `Si une valeur passe d'une valeur de départ $V_d$ à une valeur d'arrivée $V_a$, alors le taux d'évolution $t$ est donné par la formule :
|
|
40
43
|
|
|
41
44
|
$$
|
|
42
|
-
t = \\frac{V_a-V_d}{V_d}
|
|
45
|
+
t = \\frac{V_a-V_d}{V_d}
|
|
43
46
|
$$
|
|
44
47
|
|
|
45
|
-
Ici, on a $V_d = ${
|
|
48
|
+
Ici, on a $V_d = ${vd.frenchify()}$ et $V_a = ${vf.frenchify()}$.
|
|
46
49
|
|
|
47
|
-
Donc, le taux d'évolution
|
|
50
|
+
Donc, le taux d'évolution est :
|
|
48
51
|
|
|
49
52
|
${alignTex([
|
|
50
|
-
[
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
`\\frac{${identifiers.vf.frenchify()}-${identifiers.vd.frenchify()}}{${identifiers.vd.frenchify()}}\\times 100`,
|
|
54
|
-
],
|
|
55
|
-
["", "\\approx", answer],
|
|
53
|
+
["t", "=", `\\frac{${vf.frenchify()}-${vd.frenchify()}}{${vd.frenchify()}}`],
|
|
54
|
+
["", "=", `\\frac{${round(vf - vd, 4).frenchify()}}{${vd.frenchify()}}`],
|
|
55
|
+
["", ...approxOrEqual((vf - vd) / vd, 4)],
|
|
56
56
|
])}
|
|
57
|
+
|
|
58
|
+
Sous forme de pourcentage, le taux d'évolution est donc :
|
|
59
|
+
|
|
60
|
+
$$
|
|
61
|
+
${percentAnswer}\\%
|
|
62
|
+
$$
|
|
57
63
|
`;
|
|
58
64
|
};
|
|
59
65
|
const getKeys = () => {
|
|
60
66
|
return ["percent"];
|
|
61
67
|
};
|
|
62
|
-
const isAnswerValid = (ans, { answer }) => {
|
|
63
|
-
|
|
68
|
+
const isAnswerValid = (ans, { answer, ...identifiers }) => {
|
|
69
|
+
if (ans.includes("\\%")) {
|
|
70
|
+
const value = percentParser(ans);
|
|
71
|
+
return value === answer;
|
|
72
|
+
}
|
|
73
|
+
const refinedAns = ans.replaceAll("\\%", ``);
|
|
74
|
+
const nodeAns = valueParser(refinedAns);
|
|
75
|
+
const nodeAnswer = round((identifiers.vf - identifiers.vd) / identifiers.vd, 4);
|
|
76
|
+
return nodeAns === nodeAnswer;
|
|
64
77
|
};
|
|
65
78
|
const getEvolutionRateFromValuesQuestion = () => {
|
|
66
79
|
const vd = coinFlip() ? randint(1, 100) : randfloat(1, 100, 2);
|
|
@@ -3,11 +3,7 @@ type Identifiers = {
|
|
|
3
3
|
indexSituation: number;
|
|
4
4
|
total: number;
|
|
5
5
|
lefties: number;
|
|
6
|
-
opts: Options;
|
|
7
6
|
};
|
|
8
|
-
|
|
9
|
-
isPercentSymbolRequired: boolean;
|
|
10
|
-
};
|
|
11
|
-
export declare const findProportion: Exercise<Identifiers, Options>;
|
|
7
|
+
export declare const findProportion: Exercise<Identifiers>;
|
|
12
8
|
export {};
|
|
13
9
|
//# sourceMappingURL=findProportion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findProportion.d.ts","sourceRoot":"","sources":["../../../../src/exercises/math/percent/findProportion.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,
|
|
1
|
+
{"version":3,"file":"findProportion.d.ts","sourceRoot":"","sources":["../../../../src/exercises/math/percent/findProportion.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAeT,MAAM,6BAA6B,CAAC;AAarC,KAAK,WAAW,GAAG;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAgOF,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,WAAW,CAehD,CAAC"}
|
|
@@ -1,26 +1,29 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { addValidProp, propWhile, shuffleProps, tryToAddWrongProp, } from "../../../exercises/exercise.js";
|
|
2
2
|
import { getDistinctQuestions } from "../../../exercises/utils/getDistinctQuestions.js";
|
|
3
3
|
import { randfloat } from "../../../math/utils/random/randfloat.js";
|
|
4
4
|
import { randint } from "../../../math/utils/random/randint.js";
|
|
5
5
|
import { round } from "../../../math/utils/round.js";
|
|
6
|
-
import {
|
|
6
|
+
import { frac } from "../../../tree/nodes/operators/fractionNode.js";
|
|
7
|
+
import { multiply } from "../../../tree/nodes/operators/multiplyNode.js";
|
|
8
|
+
import { substract } from "../../../tree/nodes/operators/substractNode.js";
|
|
9
|
+
import { parseAlgebraic } from "../../../tree/parsers/latexParser.js";
|
|
7
10
|
import { random } from "../../../utils/alea/random.js";
|
|
8
11
|
import { handleVEAError } from "../../../utils/errors/handleVEAError.js";
|
|
9
|
-
import {
|
|
12
|
+
import { alignTex } from "../../../utils/latex/alignTex.js";
|
|
10
13
|
const situations = [
|
|
11
14
|
{
|
|
12
15
|
instruction: (total, lefties) => `${random([
|
|
13
16
|
`Dans un lycée de $${total}$ élèves, $${lefties}$ sont gauchers.`,
|
|
14
17
|
`Dans un lycée, $${lefties}$ élèves sont gauchers sur un total de $${total}$ élèves.`,
|
|
15
18
|
])}
|
|
16
|
-
Quelle est la proportion de gauchers dans ce lycée
|
|
17
|
-
hint: `La proportion de gauchers
|
|
19
|
+
Quelle est la proportion de gauchers dans ce lycée ?`,
|
|
20
|
+
hint: `La proportion de gauchers s'obtient par la formule :
|
|
18
21
|
|
|
19
22
|
$$
|
|
20
|
-
\\frac{\\text{nombre de gauchers}}{\\text{nombre total d'élèves}}
|
|
23
|
+
\\frac{\\text{nombre de gauchers}}{\\text{nombre total d'élèves}}
|
|
21
24
|
$$
|
|
22
25
|
`,
|
|
23
|
-
correction: `La proportion de gauchers
|
|
26
|
+
correction: `La proportion de gauchers dans ce lycée est de`,
|
|
24
27
|
randTotal: () => randint(500, 2000),
|
|
25
28
|
},
|
|
26
29
|
{
|
|
@@ -28,14 +31,14 @@ $$
|
|
|
28
31
|
`Dans une casse automobile, il y a $${total}$ voitures dont $${lefties}$ ont le volant à gauche.`,
|
|
29
32
|
`Dans une casse automobile, $${lefties}$ voitures ont le volant à gauche. Il y a au total $${total}$ voitures.`,
|
|
30
33
|
])}
|
|
31
|
-
Quelle est la proportion de voitures avec le volant à gauche dans cette casse
|
|
32
|
-
hint: `La proportion
|
|
34
|
+
Quelle est la proportion de voitures avec le volant à gauche dans cette casse ?`,
|
|
35
|
+
hint: `La proportion de voitures avec le volant à gauche s'obtient par la formule :
|
|
33
36
|
|
|
34
37
|
$$
|
|
35
|
-
\\frac{\\text{nombre de voitures avec volant à gauche}}{\\text{nombre total de voitures}}
|
|
38
|
+
\\frac{\\text{nombre de voitures avec volant à gauche}}{\\text{nombre total de voitures}}
|
|
36
39
|
$$
|
|
37
40
|
`,
|
|
38
|
-
correction: `La proportion
|
|
41
|
+
correction: `La proportion de voitures avec le volant à gauche est de`,
|
|
39
42
|
randTotal: () => randint(100, 500),
|
|
40
43
|
},
|
|
41
44
|
{
|
|
@@ -43,14 +46,14 @@ $$
|
|
|
43
46
|
`Dans un restaurant italien, sur un total de $${total}$ clients, $${lefties}$ ont commandé des pâtes.`,
|
|
44
47
|
`Dans un restaurant italien, $${lefties}$ clients ont commandé des pâtes. Il y a au total $${total}$ clients.`,
|
|
45
48
|
])}
|
|
46
|
-
Quelle est la proportion de clients qui ont commandé des pâtes
|
|
47
|
-
hint: `La proportion
|
|
49
|
+
Quelle est la proportion de clients qui ont commandé des pâtes ?`,
|
|
50
|
+
hint: `La proportion de clients qui ont commandé des pâtes s'obtient par la formule :
|
|
48
51
|
|
|
49
52
|
$$
|
|
50
|
-
\\frac{\\text{nombre de clients ayant commandé des pâtes}}{\\text{nombre total de clients}}
|
|
53
|
+
\\frac{\\text{nombre de clients ayant commandé des pâtes}}{\\text{nombre total de clients}}
|
|
51
54
|
$$
|
|
52
55
|
`,
|
|
53
|
-
correction: `La proportion
|
|
56
|
+
correction: `La proportion de clients ayant commandé des pâtes est de`,
|
|
54
57
|
randTotal: () => randint(30, 200),
|
|
55
58
|
},
|
|
56
59
|
{
|
|
@@ -58,14 +61,14 @@ $$
|
|
|
58
61
|
`Dans une cagette de $${total}$ pommes, $${lefties}$ sont véreuses.`,
|
|
59
62
|
`Dans une cagette de pommes, $${lefties}$ sont véreuses. Il y a au total $${total}$ pommes.`,
|
|
60
63
|
])}
|
|
61
|
-
Quelle est la proportion de pommes véreuses dans la cagette
|
|
62
|
-
hint: `La proportion
|
|
64
|
+
Quelle est la proportion de pommes véreuses dans la cagette ?`,
|
|
65
|
+
hint: `La proportion de pommes véreuses s'obtient par la formule :
|
|
63
66
|
|
|
64
67
|
$$
|
|
65
|
-
\\frac{\\text{nombre de pommes véreuses}}{\\text{nombre total de pommes}}
|
|
68
|
+
\\frac{\\text{nombre de pommes véreuses}}{\\text{nombre total de pommes}}
|
|
66
69
|
$$
|
|
67
70
|
`,
|
|
68
|
-
correction: `La proportion
|
|
71
|
+
correction: `La proportion de pommes véreuses est de`,
|
|
69
72
|
randTotal: () => randint(30, 100),
|
|
70
73
|
},
|
|
71
74
|
{
|
|
@@ -73,14 +76,14 @@ $$
|
|
|
73
76
|
`Dans un car scolaire transportant $${total}$ élèves, $${lefties}$ sont du côté gauche.`,
|
|
74
77
|
`Dans un car scolaire, $${lefties}$ élèves sont du côté gauche. Le car transporte $${total}$ élèves.`,
|
|
75
78
|
])}
|
|
76
|
-
Quelle est la proportion d'élèves du côté gauche du car
|
|
77
|
-
hint: `La proportion
|
|
79
|
+
Quelle est la proportion d'élèves du côté gauche du car ?`,
|
|
80
|
+
hint: `La proportion d'élèves du gauche du car s'obtient par la formule :
|
|
78
81
|
|
|
79
82
|
$$
|
|
80
|
-
\\frac{\\text{nombre d'élèves du côté gauche}}{\\text{nombre d'élèves dans le car}}
|
|
83
|
+
\\frac{\\text{nombre d'élèves du côté gauche}}{\\text{nombre d'élèves dans le car}}
|
|
81
84
|
$$
|
|
82
85
|
`,
|
|
83
|
-
correction: `La proportion
|
|
86
|
+
correction: `La proportion d'élèves du côté gauche est de`,
|
|
84
87
|
randTotal: () => randint(20, 40),
|
|
85
88
|
},
|
|
86
89
|
{
|
|
@@ -88,54 +91,67 @@ $$
|
|
|
88
91
|
`Dans un champ, au mois de septembre, sur $${total}$ champignons, $${lefties}$ sont vénéneux.`,
|
|
89
92
|
`Dans un champ, au mois de septembre, $${lefties}$ champignons sont vénéneux sur un total de $${total}$ champignons.`,
|
|
90
93
|
])}
|
|
91
|
-
Quelle est la proportion de champignons vénéneux dans ce champ
|
|
92
|
-
hint: `La proportion de champignons vénéneux dans ce champ
|
|
94
|
+
Quelle est la proportion de champignons vénéneux dans ce champ ?`,
|
|
95
|
+
hint: `La proportion de champignons vénéneux dans ce champ s'obtient par la formule :
|
|
93
96
|
|
|
94
97
|
$$
|
|
95
|
-
\\frac{\\text{nombre de champignons vénéneux}}{\\text{nombre total de champignons}}
|
|
98
|
+
\\frac{\\text{nombre de champignons vénéneux}}{\\text{nombre total de champignons}}
|
|
96
99
|
$$
|
|
97
100
|
`,
|
|
98
|
-
correction: `La proportion
|
|
101
|
+
correction: `La proportion de champignons vénéneux dans ce champ est de`,
|
|
99
102
|
randTotal: () => randint(20, 400),
|
|
100
103
|
},
|
|
101
104
|
];
|
|
102
105
|
const getInstruction = (identifiers) => {
|
|
103
|
-
const { indexSituation, total, lefties
|
|
106
|
+
const { indexSituation, total, lefties } = identifiers;
|
|
104
107
|
const situation = situations[indexSituation];
|
|
105
108
|
return `${situation.instruction(total, lefties)}
|
|
106
109
|
|
|
107
|
-
Arrondir au centième de pourcent
|
|
108
|
-
${opts.isPercentSymbolRequired
|
|
109
|
-
? `
|
|
110
|
-
|
|
111
|
-
Ne pas oublier le symbole $\\%$ à la fin.`
|
|
112
|
-
: ``}`;
|
|
110
|
+
Arrondir au centième de pourcent.`;
|
|
113
111
|
};
|
|
114
112
|
const getHint = (identifiers) => {
|
|
115
113
|
const { indexSituation } = identifiers;
|
|
116
114
|
const situation = situations[indexSituation];
|
|
117
|
-
return situation.hint
|
|
115
|
+
return `${situation.hint}
|
|
116
|
+
|
|
117
|
+
Rappel :
|
|
118
|
+
|
|
119
|
+
$$
|
|
120
|
+
2\\% = 0,02
|
|
121
|
+
$$
|
|
122
|
+
|
|
123
|
+
$$
|
|
124
|
+
2,01\\% = 0,0201
|
|
125
|
+
$$
|
|
126
|
+
|
|
127
|
+
`;
|
|
118
128
|
};
|
|
119
129
|
const getCorrection = (identifiers) => {
|
|
120
|
-
const { indexSituation, total, lefties
|
|
130
|
+
const { indexSituation, total, lefties } = identifiers;
|
|
121
131
|
const situation = situations[indexSituation];
|
|
122
|
-
const
|
|
132
|
+
const fractionNode = frac(lefties, total);
|
|
133
|
+
const roundedProportion = round(frac(lefties, total).evaluate(), 4);
|
|
134
|
+
const isEqual = substract(frac(lefties, total), round(frac(lefties, total).evaluate(), 4).toTree()).evaluate() === 0;
|
|
135
|
+
const middleSymbol = isEqual ? "=" : "\\approx";
|
|
123
136
|
return `On a :
|
|
124
137
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
138
|
+
${alignTex([
|
|
139
|
+
[`${fractionNode.toTex()}`, middleSymbol, `${roundedProportion.frenchify()}`],
|
|
140
|
+
[
|
|
141
|
+
"",
|
|
142
|
+
middleSymbol,
|
|
143
|
+
`${roundedProportion.frenchify()} \\times 100 \\times \\frac{1}{100}`,
|
|
144
|
+
],
|
|
145
|
+
["", middleSymbol, `${roundedProportion.frenchify()} \\times 100 \\ \\%`],
|
|
146
|
+
["", middleSymbol, `${getAnswer(identifiers)}`],
|
|
147
|
+
])}
|
|
128
148
|
|
|
129
|
-
${situation.correction} $${getAnswer(identifiers)}
|
|
130
|
-
${opts.isPercentSymbolRequired
|
|
131
|
-
? `
|
|
132
|
-
|
|
133
|
-
Attention, ici le symbole "$\\%$" est requis à la fin.`
|
|
134
|
-
: ``}`;
|
|
149
|
+
${situation.correction} $${getAnswer(identifiers)}$.`;
|
|
135
150
|
};
|
|
136
151
|
const getAnswer = (identifiers) => {
|
|
137
152
|
const { total, lefties } = identifiers;
|
|
138
|
-
const answer = round((lefties
|
|
153
|
+
const answer = round(multiply(frac(lefties, total), 100).evaluate(), 2).frenchify() +
|
|
154
|
+
"\\%";
|
|
139
155
|
return answer;
|
|
140
156
|
};
|
|
141
157
|
const getPropositions = (n, { answer, total, lefties }) => {
|
|
@@ -147,34 +163,27 @@ const getPropositions = (n, { answer, total, lefties }) => {
|
|
|
147
163
|
});
|
|
148
164
|
return shuffleProps(propositions, n);
|
|
149
165
|
};
|
|
150
|
-
const isAnswerValid = (ans, { answer,
|
|
166
|
+
const isAnswerValid = (ans, { answer, ...identifiers }) => {
|
|
167
|
+
const { lefties, total } = identifiers;
|
|
151
168
|
try {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
return percentParser(ans) === answer;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
const texs = [answer, answer.replace("\\%", "")];
|
|
162
|
-
return texs.includes(ans);
|
|
163
|
-
}
|
|
169
|
+
const percentNode = frac(1, 100);
|
|
170
|
+
const refinedAns = ans.replaceAll("\\%", `({${percentNode.toTex()}})`);
|
|
171
|
+
const nodeAns = parseAlgebraic(refinedAns);
|
|
172
|
+
const nodeAnswer = round(lefties / total, 4);
|
|
173
|
+
return substract(nodeAns, nodeAnswer).simplify().evaluate() === 0;
|
|
164
174
|
}
|
|
165
175
|
catch (err) {
|
|
166
176
|
return handleVEAError(err);
|
|
167
177
|
}
|
|
168
178
|
};
|
|
169
|
-
const getFindProportionQuestion = (
|
|
170
|
-
const opts = optsIn ?? optsDefault;
|
|
179
|
+
const getFindProportionQuestion = () => {
|
|
171
180
|
const indexSituation = randint(0, situations.length);
|
|
172
181
|
const situation = situations[indexSituation];
|
|
173
182
|
const total = situation.randTotal();
|
|
174
183
|
const lefties = round(randfloat(0.1, 0.9) * total, 0);
|
|
175
|
-
return getQuestionFromIdentifiers({ indexSituation, total, lefties
|
|
184
|
+
return getQuestionFromIdentifiers({ indexSituation, total, lefties });
|
|
176
185
|
};
|
|
177
|
-
const getQuestionFromIdentifiers = (identifiers
|
|
186
|
+
const getQuestionFromIdentifiers = (identifiers) => {
|
|
178
187
|
const question = {
|
|
179
188
|
answer: getAnswer(identifiers),
|
|
180
189
|
instruction: getInstruction(identifiers),
|
|
@@ -183,30 +192,15 @@ const getQuestionFromIdentifiers = (identifiers, opts) => {
|
|
|
183
192
|
identifiers,
|
|
184
193
|
hint: getHint(identifiers),
|
|
185
194
|
correction: getCorrection(identifiers),
|
|
186
|
-
options: opts,
|
|
187
195
|
};
|
|
188
196
|
return question;
|
|
189
197
|
};
|
|
190
|
-
const optsDefault = {
|
|
191
|
-
isPercentSymbolRequired: false,
|
|
192
|
-
};
|
|
193
|
-
const options = [
|
|
194
|
-
{
|
|
195
|
-
id: "isPercentSymbolRequired",
|
|
196
|
-
label: "Symbole pourcent requis",
|
|
197
|
-
target: GeneratorOptionTarget.generation,
|
|
198
|
-
type: GeneratorOptionType.checkbox,
|
|
199
|
-
values: [false, true],
|
|
200
|
-
defaultValue: optsDefault.isPercentSymbolRequired,
|
|
201
|
-
},
|
|
202
|
-
];
|
|
203
198
|
export const findProportion = {
|
|
204
199
|
id: "findProportion",
|
|
205
200
|
connector: "=",
|
|
206
|
-
label: "Calculer une proportion
|
|
201
|
+
label: "Calculer une proportion",
|
|
207
202
|
isSingleStep: true,
|
|
208
|
-
generator: (nb
|
|
209
|
-
options,
|
|
203
|
+
generator: (nb) => getDistinctQuestions(getFindProportionQuestion, nb),
|
|
210
204
|
qcmTimer: 60,
|
|
211
205
|
freeTimer: 60,
|
|
212
206
|
getPropositions,
|
|
@@ -30,7 +30,7 @@ Que vaut l'espérance $E(X)$ de $X$ ?
|
|
|
30
30
|
`;
|
|
31
31
|
};
|
|
32
32
|
const getHint = () => {
|
|
33
|
-
return `$
|
|
33
|
+
return `$E(X)$ est la somme des produits des valeurs de $X$ par leur probabilité. `;
|
|
34
34
|
};
|
|
35
35
|
const getCorrection = (identifiers) => {
|
|
36
36
|
const { xValuesIds, yValuesIds } = identifiers;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isNodesEqual.d.ts","sourceRoot":"","sources":["../../../src/exercises/vea/isNodesEqual.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAIlE,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,WAMtE"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { multiply } from "../../tree/nodes/operators/multiplyNode.js";
|
|
2
|
+
import { substract } from "../../tree/nodes/operators/substractNode.js";
|
|
3
|
+
export function isNodesEqual(node1, node2) {
|
|
4
|
+
return [1, 1_000, 1_000_000].every((factor) => substract(multiply(factor, node1), multiply(factor, node2)).evaluate() ===
|
|
5
|
+
0);
|
|
6
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setVEA.d.ts","sourceRoot":"","sources":["../../../src/exercises/vea/setVEA.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAGlE,8BAAsB,MAAM;IAC1B,MAAM,CAAC,mBAAmB,GACxB,QAAQ,aAAa,EAAE,EACvB,WAAW,aAAa,EAAE,aA2B1B;CACH"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { isNodesEqual } from "./isNodesEqual.js";
|
|
2
|
+
export class SetVEA {
|
|
3
|
+
static isArrayOfNodesValid = (arrAns, arrAnswer) => {
|
|
4
|
+
const dictAnswer = Object.fromEntries(arrAnswer.map((node, i) => [i, node]));
|
|
5
|
+
let isValid = true;
|
|
6
|
+
for (let i = 0; i < arrAns.length; i++) {
|
|
7
|
+
const nodeAns = arrAns[i];
|
|
8
|
+
let isFound = false;
|
|
9
|
+
const keys = Object.keys(dictAnswer);
|
|
10
|
+
for (let j = 0; j < keys.length; j++) {
|
|
11
|
+
const key = keys[j];
|
|
12
|
+
const answerNode = dictAnswer[key];
|
|
13
|
+
if (isNodesEqual(nodeAns, answerNode)) {
|
|
14
|
+
isFound = true;
|
|
15
|
+
delete dictAnswer[key]; //one-to-one correspondence
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
isValid = isValid && isFound;
|
|
20
|
+
if (!isValid)
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
return isValid;
|
|
24
|
+
};
|
|
25
|
+
}
|
package/lib/index.d.ts
CHANGED
|
@@ -503,11 +503,6 @@ declare const mathExercises: (Exercise<{
|
|
|
503
503
|
}, object, string | number | boolean | string[] | number[] | boolean[]> | Exercise<{
|
|
504
504
|
a: number;
|
|
505
505
|
b: number;
|
|
506
|
-
}, object, string | number | boolean | string[] | number[] | boolean[]> | Exercise<{
|
|
507
|
-
a: number;
|
|
508
|
-
b: number;
|
|
509
|
-
isAdd: boolean;
|
|
510
|
-
varName: string;
|
|
511
506
|
}, object, string | number | boolean | string[] | number[] | boolean[]> | Exercise<{
|
|
512
507
|
b: number;
|
|
513
508
|
c: number;
|
|
@@ -2049,12 +2044,7 @@ declare const mathExercises: (Exercise<{
|
|
|
2049
2044
|
indexSituation: number;
|
|
2050
2045
|
total: number;
|
|
2051
2046
|
lefties: number;
|
|
2052
|
-
|
|
2053
|
-
isPercentSymbolRequired: boolean;
|
|
2054
|
-
};
|
|
2055
|
-
}, {
|
|
2056
|
-
isPercentSymbolRequired: boolean;
|
|
2057
|
-
}, string | number | boolean | string[] | number[] | boolean[]> | Exercise<{
|
|
2047
|
+
}, object, string | number | boolean | string[] | number[] | boolean[]> | Exercise<{
|
|
2058
2048
|
TVA: number;
|
|
2059
2049
|
ht: number;
|
|
2060
2050
|
}, object, string | number | boolean | string[] | number[] | boolean[]> | Exercise<{
|
|
@@ -3423,12 +3413,7 @@ declare const pcExercises: (Exercise<{
|
|
|
3423
3413
|
indexSituation: number;
|
|
3424
3414
|
total: number;
|
|
3425
3415
|
lefties: number;
|
|
3426
|
-
|
|
3427
|
-
isPercentSymbolRequired: boolean;
|
|
3428
|
-
};
|
|
3429
|
-
}, {
|
|
3430
|
-
isPercentSymbolRequired: boolean;
|
|
3431
|
-
}, string | number | boolean | string[] | number[] | boolean[]> | Exercise<{
|
|
3416
|
+
}, object, string | number | boolean | string[] | number[] | boolean[]> | Exercise<{
|
|
3432
3417
|
decimal: number;
|
|
3433
3418
|
}, object, string | number | boolean | string[] | number[] | boolean[]> | Exercise<{
|
|
3434
3419
|
a: number;
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,aAAa,MAAM,2BAA2B,CAAC;AAE3D,OAAO,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,QAAA,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,aAAa,MAAM,2BAA2B,CAAC;AAE3D,OAAO,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0EAA+B,CAAC;AACnD,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kEAA6B,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC"}
|