math-exercises 3.0.202 → 3.0.203
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/derivation/derivative/trigo/productOfSinAXPlusBCosCXPlusDDerivative.js +1 -1
- package/lib/exercises/math/derivation/derivative/trigo/sinAndCosMixedWithSquareDerivative.js +1 -1
- package/lib/exercises/math/derivation/derivative/trigo/sinCosDerivativeRewriteUsingCos2PlusSin2Equals1.d.ts.map +1 -1
- package/lib/exercises/math/derivation/derivative/trigo/sinCosDerivativeRewriteUsingCos2PlusSin2Equals1.js +1 -1
- package/lib/exercises/math/geometry/angles/anglesUsingIsParallel.d.ts.map +1 -1
- package/lib/exercises/math/geometry/angles/anglesUsingIsParallel.js +172 -51
- package/lib/exercises/math/geometry/angles/index.d.ts +1 -0
- package/lib/exercises/math/geometry/angles/index.d.ts.map +1 -1
- package/lib/exercises/math/geometry/angles/index.js +1 -1
- package/lib/exercises/math/limits/index.d.ts +1 -5
- package/lib/exercises/math/limits/index.d.ts.map +1 -1
- package/lib/exercises/math/limits/index.js +1 -5
- package/lib/exercises/math/limits/limitReading.d.ts.map +1 -1
- package/lib/exercises/math/limits/limitReading.js +70 -0
- package/lib/exercises/math/limits/polynomLimit.d.ts.map +1 -1
- package/lib/exercises/math/limits/polynomLimit.js +55 -4
- package/lib/exercises/math/limits/polynomLimitNoFI.d.ts.map +1 -1
- package/lib/exercises/math/limits/polynomLimitNoFI.js +35 -2
- package/lib/exercises/math/limits/sequenceGeometricLimit.d.ts.map +1 -1
- package/lib/exercises/math/limits/sequenceGeometricLimit.js +45 -9
- package/lib/exercises/math/limits/sequencePolynomLimit.d.ts.map +1 -1
- package/lib/exercises/math/limits/sequencePolynomLimit.js +56 -3
- package/lib/exercises/math/limits/sequencePolynomNoFILimit.d.ts.map +1 -1
- package/lib/exercises/math/limits/sequencePolynomNoFILimit.js +32 -0
- package/lib/exercises/math/limits/sequencePolynomProductLimit.d.ts.map +1 -1
- package/lib/exercises/math/limits/sequencePolynomProductLimit.js +33 -3
- package/lib/exercises/math/limits/sequenceRationalFracLimit.d.ts.map +1 -1
- package/lib/exercises/math/limits/sequenceRationalFracLimit.js +2 -2
- package/lib/exercises/math/limits/sequences/index.d.ts +6 -0
- package/lib/exercises/math/limits/sequences/index.d.ts.map +1 -0
- package/lib/exercises/math/limits/sequences/index.js +5 -0
- package/lib/exercises/math/limits/sequences/sequenceGeometricLimit.d.ts +9 -0
- package/lib/exercises/math/limits/sequences/sequenceGeometricLimit.d.ts.map +1 -0
- package/lib/exercises/math/limits/sequences/sequenceGeometricLimit.js +110 -0
- package/lib/exercises/math/limits/sequences/sequencePolynomLimit.d.ts +7 -0
- package/lib/exercises/math/limits/sequences/sequencePolynomLimit.d.ts.map +1 -0
- package/lib/exercises/math/limits/sequences/sequencePolynomLimit.js +116 -0
- package/lib/exercises/math/limits/sequences/sequencePolynomNoFILimit.d.ts +7 -0
- package/lib/exercises/math/limits/sequences/sequencePolynomNoFILimit.d.ts.map +1 -0
- package/lib/exercises/math/limits/sequences/sequencePolynomNoFILimit.js +95 -0
- package/lib/exercises/math/limits/sequences/sequencePolynomProductLimit.d.ts +8 -0
- package/lib/exercises/math/limits/sequences/sequencePolynomProductLimit.d.ts.map +1 -0
- package/lib/exercises/math/limits/sequences/sequencePolynomProductLimit.js +111 -0
- package/lib/exercises/math/limits/sequences/sequenceRationalFracLimit.d.ts +8 -0
- package/lib/exercises/math/limits/sequences/sequenceRationalFracLimit.d.ts.map +1 -0
- package/lib/exercises/math/limits/sequences/sequenceRationalFracLimit.js +114 -0
- package/lib/exercises/math/sequences/index.d.ts +1 -0
- package/lib/exercises/math/sequences/index.d.ts.map +1 -1
- package/lib/exercises/math/sequences/index.js +1 -0
- package/lib/exercises/math/sequences/proofByInduction/index.d.ts +5 -0
- package/lib/exercises/math/sequences/proofByInduction/index.d.ts.map +1 -0
- package/lib/exercises/math/sequences/proofByInduction/index.js +4 -0
- package/lib/exercises/math/sequences/proofByInduction/proofByInductionCheckInitialization.d.ts +10 -0
- package/lib/exercises/math/sequences/proofByInduction/proofByInductionCheckInitialization.d.ts.map +1 -0
- package/lib/exercises/math/sequences/proofByInduction/proofByInductionCheckInitialization.js +236 -0
- package/lib/exercises/math/sequences/proofByInduction/proofByInductionReorderProof.d.ts +13 -0
- package/lib/exercises/math/sequences/proofByInduction/proofByInductionReorderProof.d.ts.map +1 -0
- package/lib/exercises/math/sequences/proofByInduction/proofByInductionReorderProof.js +244 -0
- package/lib/exercises/math/sequences/proofByInduction/proofByInductionSituations.d.ts +98 -0
- package/lib/exercises/math/sequences/proofByInduction/proofByInductionSituations.d.ts.map +1 -0
- package/lib/exercises/math/sequences/proofByInduction/proofByInductionSituations.js +175 -0
- package/lib/exercises/math/sequences/proofByInduction/proofByInductionWriteMissingStep.d.ts +13 -0
- package/lib/exercises/math/sequences/proofByInduction/proofByInductionWriteMissingStep.d.ts.map +1 -0
- package/lib/exercises/math/sequences/proofByInduction/proofByInductionWriteMissingStep.js +317 -0
- package/lib/exercises/math/sequences/proofByInduction/proofByInductionWritePropAtRankKPlus1.d.ts +13 -0
- package/lib/exercises/math/sequences/proofByInduction/proofByInductionWritePropAtRankKPlus1.d.ts.map +1 -0
- package/lib/exercises/math/sequences/proofByInduction/proofByInductionWritePropAtRankKPlus1.js +265 -0
- package/lib/exercises/vea/polynomialVEA.d.ts.map +1 -1
- package/lib/exercises/vea/polynomialVEA.js +4 -0
- package/lib/index.d.ts +49 -13
- package/lib/index.d.ts.map +1 -1
- package/lib/math/geometry/point.d.ts.map +1 -1
- package/lib/math/geometry/point.js +1 -1
- package/lib/math/utils/functions/functionDecomposition.d.ts +2 -2
- package/lib/math/utils/functions/functionDecomposition.d.ts.map +1 -1
- package/lib/tests/exoTest.d.ts.map +1 -1
- package/lib/tests/exoTest.js +7 -11
- package/lib/tests/questionTest.d.ts.map +1 -1
- package/lib/tests/questionTest.js +7 -3
- package/lib/tests/singleExo.test.d.ts.map +1 -1
- package/lib/tests/singleExo.test.js +2 -2
- package/lib/tree/nodes/node.d.ts +2 -1
- package/lib/tree/nodes/node.d.ts.map +1 -1
- package/lib/tree/nodes/node.js +1 -0
- package/lib/tree/nodes/student/iDontKnowNode.d.ts +26 -0
- package/lib/tree/nodes/student/iDontKnowNode.d.ts.map +1 -0
- package/lib/tree/nodes/student/iDontKnowNode.js +63 -0
- package/lib/tree/parsers/latexParser.d.ts +3 -2
- package/lib/tree/parsers/latexParser.d.ts.map +1 -1
- package/lib/tree/parsers/latexParser.js +7 -0
- package/lib/tree/parsers/monomParser.d.ts +1 -1
- package/lib/tree/parsers/monomParser.d.ts.map +1 -1
- package/lib/tree/parsers/polynomialParser.d.ts +1 -1
- package/lib/tree/parsers/polynomialParser.d.ts.map +1 -1
- package/lib/tree/parsers/trinomParser.d.ts +1 -1
- package/lib/tree/parsers/trinomParser.d.ts.map +1 -1
- package/lib/tree/utilities/nodeComparator.d.ts +3 -1
- package/lib/tree/utilities/nodeComparator.d.ts.map +1 -1
- package/lib/tree/utilities/nodeComparator.js +63 -5
- package/package.json +1 -1
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { tryToAddWrongProp, addValidProp, } from "../../../../exercises/exercise.js";
|
|
2
|
+
import { getDistinctQuestions } from "../../../../exercises/utils/getDistinctQuestions.js";
|
|
3
|
+
import { nodeBySubstitutingVar } from "../../../../math/utils/functions/functionComposition.js";
|
|
4
|
+
import { randint } from "../../../../math/utils/random/randint.js";
|
|
5
|
+
import { VariableNode } from "../../../../tree/nodes/variables/variableNode.js";
|
|
6
|
+
import { coinFlip } from "../../../../utils/alea/coinFlip.js";
|
|
7
|
+
import { alignTex } from "../../../../utils/latex/alignTex.js";
|
|
8
|
+
import { splitAndKeep } from "../../../../utils/strings/splitAndKeep.js";
|
|
9
|
+
import { getHydratedProofByInductionSituation, getRandomProofByInductionSituationParams, } from "./proofByInductionSituations.js";
|
|
10
|
+
const getHydrated = (identifiers) => {
|
|
11
|
+
const { situationParams, isValid, indexForNodeProperty } = identifiers;
|
|
12
|
+
const situation = getHydratedProofByInductionSituation(situationParams);
|
|
13
|
+
const { n0 } = situation;
|
|
14
|
+
switch (situation.id) {
|
|
15
|
+
case "generalFormulaOfArithmeticoGeometricSequence": {
|
|
16
|
+
const nodeProperty = (isValid ? situation.arrNodeValid : situation.arrNodeInvalid)[indexForNodeProperty];
|
|
17
|
+
const nodeVarN = new VariableNode("n");
|
|
18
|
+
const nodePropertySubstituted = nodeBySubstitutingVar(nodeBySubstitutingVar(nodeProperty, n0.toTree(), nodeVarN), new VariableNode(`u_{${n0}}`), new VariableNode("u_{n}"));
|
|
19
|
+
return {
|
|
20
|
+
situation,
|
|
21
|
+
isValid,
|
|
22
|
+
nodeProperty,
|
|
23
|
+
nodePropertySubstituted,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
case "multipleFromPolynomial": {
|
|
27
|
+
const { nbMod } = situation.params;
|
|
28
|
+
const nodeProperty = (isValid ? situation.arrNodeValid : situation.arrNodeInvalid)[indexForNodeProperty];
|
|
29
|
+
const nodeVarN = new VariableNode("n");
|
|
30
|
+
const nodePropertySubstituted = nodeBySubstitutingVar(nodeProperty, n0.toTree(), nodeVarN);
|
|
31
|
+
return {
|
|
32
|
+
situation,
|
|
33
|
+
isValid,
|
|
34
|
+
nodeProperty,
|
|
35
|
+
nodePropertySubstituted,
|
|
36
|
+
nbMod,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
default:
|
|
40
|
+
throw new Error("Unsupported situation.id: " + situation.id);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const getInstruction = (identifiers) => {
|
|
44
|
+
const { situation, nodeProperty, nbMod } = getHydrated(identifiers);
|
|
45
|
+
const { n0 } = situation;
|
|
46
|
+
switch (situation.id) {
|
|
47
|
+
case "generalFormulaOfArithmeticoGeometricSequence": {
|
|
48
|
+
return `${situation.strContext}
|
|
49
|
+
|
|
50
|
+
Pour $n \\geq ${n0}$, on note $\\mathcal{P}(n)$ la propriété :
|
|
51
|
+
|
|
52
|
+
$$
|
|
53
|
+
\\mathcal{P}(n) :\\ \\ ${nodeProperty.toTex()}
|
|
54
|
+
$$
|
|
55
|
+
|
|
56
|
+
La propriété $\\mathcal{P}(${n0})$ est-elle vraie ?`;
|
|
57
|
+
}
|
|
58
|
+
case "multipleFromPolynomial": {
|
|
59
|
+
return `${situation.strContext}
|
|
60
|
+
|
|
61
|
+
Pour $n \\geq ${n0}$, on note $\\mathcal{P}(n)$ la propriété :
|
|
62
|
+
|
|
63
|
+
$$
|
|
64
|
+
\\mathcal{P}(n) :\\ \\ f(n) \\text{ est un multiple de } ${nbMod}
|
|
65
|
+
$$
|
|
66
|
+
|
|
67
|
+
La propriété $\\mathcal{P}(${n0})$ est-elle vraie ?`;
|
|
68
|
+
}
|
|
69
|
+
default:
|
|
70
|
+
throw new Error("Unsupported situation.id: " + situation.id);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
const getAnswer = (identifiers) => {
|
|
74
|
+
const { isValid } = identifiers;
|
|
75
|
+
return isValid ? "Oui" : "Non";
|
|
76
|
+
};
|
|
77
|
+
const getHint = (identifiers) => {
|
|
78
|
+
const { situation } = getHydrated(identifiers);
|
|
79
|
+
const { n0 } = situation;
|
|
80
|
+
return `Remplace $n$ par $${n0}$ dans la formule proposée et compare la valeur obtenue avec la valeur de $u_{${n0}}$ fournie dans l'énoncé.`;
|
|
81
|
+
};
|
|
82
|
+
const getCorrection = (identifiers) => {
|
|
83
|
+
const { isValid } = identifiers;
|
|
84
|
+
const { situation, nodePropertySubstituted } = getHydrated(identifiers);
|
|
85
|
+
const { n0 } = situation;
|
|
86
|
+
switch (situation.id) {
|
|
87
|
+
case "generalFormulaOfArithmeticoGeometricSequence": {
|
|
88
|
+
return `On calcule la valeur de $u_{${n0}}$ d'après $\\mathcal{P}(${n0})$ :
|
|
89
|
+
|
|
90
|
+
${alignTex([
|
|
91
|
+
splitAndKeep(nodePropertySubstituted.toTex(), "="),
|
|
92
|
+
splitAndKeep(nodePropertySubstituted.simplify().toTex(), "="),
|
|
93
|
+
])}
|
|
94
|
+
|
|
95
|
+
${(() => {
|
|
96
|
+
if (isValid) {
|
|
97
|
+
return `La propriété $\\mathcal{P}(${n0})$ est donc vraie.`;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
return `La propriété $\\mathcal{P}(${n0})$ est donc fausse.`;
|
|
101
|
+
}
|
|
102
|
+
})()}
|
|
103
|
+
|
|
104
|
+
`;
|
|
105
|
+
}
|
|
106
|
+
case "multipleFromPolynomial": {
|
|
107
|
+
return `On calcule la valeur de $f(${n0})$ :
|
|
108
|
+
|
|
109
|
+
${alignTex([
|
|
110
|
+
[`f(${n0})`, "=", nodePropertySubstituted.toTex()],
|
|
111
|
+
["", "=", nodePropertySubstituted.simplify().toTex()],
|
|
112
|
+
])}
|
|
113
|
+
|
|
114
|
+
${(() => {
|
|
115
|
+
if (isValid) {
|
|
116
|
+
return `La propriété $\\mathcal{P}(${n0})$ est donc vraie.`;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
return `La propriété $\\mathcal{P}(${n0})$ est donc fausse.`;
|
|
120
|
+
}
|
|
121
|
+
})()}
|
|
122
|
+
|
|
123
|
+
`;
|
|
124
|
+
}
|
|
125
|
+
default:
|
|
126
|
+
throw new Error("Unsupported situation.id: " + situation.id);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
const getPropositions = (_n, { answer }) => {
|
|
130
|
+
const propositions = [];
|
|
131
|
+
["Oui", "Non", "On ne peut pas savoir"].forEach((str) => {
|
|
132
|
+
if (str === answer) {
|
|
133
|
+
addValidProp(propositions, answer, "raw");
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
tryToAddWrongProp(propositions, str, "raw");
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
return propositions;
|
|
140
|
+
};
|
|
141
|
+
const createRandomIdentifiers = () => {
|
|
142
|
+
const situationParams = getRandomProofByInductionSituationParams();
|
|
143
|
+
const situation = getHydratedProofByInductionSituation(situationParams);
|
|
144
|
+
const [isValid, indexForNodeProperty] = (() => {
|
|
145
|
+
switch (situation.id) {
|
|
146
|
+
case "generalFormulaOfArithmeticoGeometricSequence": {
|
|
147
|
+
const isValid = coinFlip();
|
|
148
|
+
const indexForNodeProperty = randint(0, isValid
|
|
149
|
+
? situation.arrNodeValid.length
|
|
150
|
+
: situation.arrNodeInvalid.length);
|
|
151
|
+
return [isValid, indexForNodeProperty];
|
|
152
|
+
}
|
|
153
|
+
case "multipleFromPolynomial": {
|
|
154
|
+
const isValid = situation.arrNodeValid.length > 0;
|
|
155
|
+
const indexForNodeProperty = 0;
|
|
156
|
+
return [isValid, indexForNodeProperty];
|
|
157
|
+
}
|
|
158
|
+
default:
|
|
159
|
+
throw new Error("Unsupported situation.id: " + situation.id);
|
|
160
|
+
}
|
|
161
|
+
})();
|
|
162
|
+
const identifiers = {
|
|
163
|
+
situationParams,
|
|
164
|
+
isValid,
|
|
165
|
+
indexForNodeProperty,
|
|
166
|
+
};
|
|
167
|
+
return identifiers;
|
|
168
|
+
};
|
|
169
|
+
// const isIdentifiersQCPassed = (identifiers: Identifiers) => {
|
|
170
|
+
// const isExploding = (identifiers: Identifiers) => {
|
|
171
|
+
// let isExploding = false;
|
|
172
|
+
// try {
|
|
173
|
+
// getHydrated(identifiers);
|
|
174
|
+
// } catch (_) {
|
|
175
|
+
// isExploding = true;
|
|
176
|
+
// }
|
|
177
|
+
// return isExploding;
|
|
178
|
+
// };
|
|
179
|
+
// return !isExploding(identifiers);
|
|
180
|
+
// };
|
|
181
|
+
// const createQCPassedIdentifiers = () => {
|
|
182
|
+
// let identifiers: Identifiers;
|
|
183
|
+
// let counter = -1;
|
|
184
|
+
// let isValid = false;
|
|
185
|
+
// while (!isValid && counter < 100) {
|
|
186
|
+
// counter++;
|
|
187
|
+
// const identifiersCandidate = createRandomIdentifiers();
|
|
188
|
+
// isValid = isIdentifiersQCPassed(identifiersCandidate);
|
|
189
|
+
// if (isValid) {
|
|
190
|
+
// identifiers = identifiersCandidate;
|
|
191
|
+
// }
|
|
192
|
+
// }
|
|
193
|
+
// if (!isValid) {
|
|
194
|
+
// const [situationParams] = getArrProofByInductionSituationParams([
|
|
195
|
+
// "generalFormulaOfArithmeticoGeometricSequence",
|
|
196
|
+
// ]);
|
|
197
|
+
// const identifiersDefault: Identifiers = (() => {
|
|
198
|
+
// return {
|
|
199
|
+
// situationParams,
|
|
200
|
+
// isValid: true,
|
|
201
|
+
// indexForNodeProperty: 0,
|
|
202
|
+
// };
|
|
203
|
+
// })();
|
|
204
|
+
// identifiers = identifiersDefault;
|
|
205
|
+
// }
|
|
206
|
+
// return identifiers!;
|
|
207
|
+
// };
|
|
208
|
+
const getProofByInductionCheckInitializationQuestion = () => {
|
|
209
|
+
const identifiers = createRandomIdentifiers();
|
|
210
|
+
return getQuestionFromIdentifiers(identifiers);
|
|
211
|
+
};
|
|
212
|
+
const getQuestionFromIdentifiers = (identifiers) => {
|
|
213
|
+
return {
|
|
214
|
+
answer: getAnswer(identifiers),
|
|
215
|
+
instruction: getInstruction(identifiers),
|
|
216
|
+
keys: [],
|
|
217
|
+
answerFormat: "raw",
|
|
218
|
+
identifiers,
|
|
219
|
+
hint: getHint(identifiers),
|
|
220
|
+
correction: getCorrection(identifiers),
|
|
221
|
+
};
|
|
222
|
+
};
|
|
223
|
+
export const proofByInductionCheckInitialization = {
|
|
224
|
+
id: "proofByInductionCheckInitialization",
|
|
225
|
+
connector: "=",
|
|
226
|
+
label: "Vérifier si une propriété $\\mathcal{P}(n)$ est vraie pour un rang $n_{0}$ donné",
|
|
227
|
+
isSingleStep: true,
|
|
228
|
+
generator: (nb, opts) => getDistinctQuestions(() => getProofByInductionCheckInitializationQuestion(opts), nb),
|
|
229
|
+
qcmTimer: 60,
|
|
230
|
+
freeTimer: 60,
|
|
231
|
+
getPropositions,
|
|
232
|
+
subject: "Mathématiques",
|
|
233
|
+
getQuestionFromIdentifiers,
|
|
234
|
+
hasHintAndCorrection: true,
|
|
235
|
+
answerType: "QCU",
|
|
236
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Exercise } from "../../../../exercises/exercise.js";
|
|
2
|
+
import { NodeIdentifiers } from "../../../../tree/nodes/nodeConstructor.js";
|
|
3
|
+
import { ProofByInductionSituationParams } from "./proofByInductionSituations.js";
|
|
4
|
+
type Identifiers = {
|
|
5
|
+
situationParams: ProofByInductionSituationParams;
|
|
6
|
+
isValid: boolean;
|
|
7
|
+
indexForNodeProperty: number;
|
|
8
|
+
nodeIdsVarStepDefinition: NodeIdentifiers;
|
|
9
|
+
nodeIdsVarStepInduction: NodeIdentifiers;
|
|
10
|
+
};
|
|
11
|
+
export declare const proofByInductionReorderProof: Exercise<Identifiers>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=proofByInductionReorderProof.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proofByInductionReorderProof.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sequences/proofByInduction/proofByInductionReorderProof.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAQT,MAAM,6BAA6B,CAAC;AAIrC,OAAO,EAEL,eAAe,EAChB,MAAM,qCAAqC,CAAC;AAK7C,OAAO,EAGL,+BAA+B,EAChC,MAAM,iCAAiC,CAAC;AAQzC,KAAK,WAAW,GAAG;IACjB,eAAe,EAAE,+BAA+B,CAAC;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,EAAE,eAAe,CAAC;IAC1C,uBAAuB,EAAE,eAAe,CAAC;CAC1C,CAAC;AA0WF,eAAO,MAAM,4BAA4B,EAAE,QAAQ,CAAC,WAAW,CAiB9D,CAAC"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { getDistinctQuestions } from "../../../../exercises/utils/getDistinctQuestions.js";
|
|
2
|
+
import { nodeBySubstitutingVar } from "../../../../math/utils/functions/functionComposition.js";
|
|
3
|
+
import { EqualNode } from "../../../../tree/nodes/equations/equalNode.js";
|
|
4
|
+
import { NodeConstructor, } from "../../../../tree/nodes/nodeConstructor.js";
|
|
5
|
+
import { add } from "../../../../tree/nodes/operators/addNode.js";
|
|
6
|
+
import { VariableNode } from "../../../../tree/nodes/variables/variableNode.js";
|
|
7
|
+
import { NodeComparator } from "../../../../tree/utilities/nodeComparator.js";
|
|
8
|
+
import { randomMany } from "../../../../utils/alea/random.js";
|
|
9
|
+
import { getArrProofByInductionSituationParams, getHydratedProofByInductionSituation, } from "./proofByInductionSituations.js";
|
|
10
|
+
import { multiply } from "../../../../tree/nodes/operators/multiplyNode.js";
|
|
11
|
+
import { isFractionNode } from "../../../../tree/nodes/operators/fractionNode.js";
|
|
12
|
+
import { opposite } from "../../../../tree/nodes/functions/oppositeNode.js";
|
|
13
|
+
import { uuid } from "uuidv4";
|
|
14
|
+
import { shuffle } from "../../../../utils/alea/shuffle.js";
|
|
15
|
+
const getHydrated = (identifiers) => {
|
|
16
|
+
const { situationParams, isValid, indexForNodeProperty, nodeIdsVarStepDefinition, nodeIdsVarStepInduction, } = identifiers;
|
|
17
|
+
const situation = getHydratedProofByInductionSituation(situationParams);
|
|
18
|
+
const [nodeVarStepDefinition, nodeVarStepInduction] = [
|
|
19
|
+
nodeIdsVarStepDefinition,
|
|
20
|
+
nodeIdsVarStepInduction,
|
|
21
|
+
].map((nodeIds) => NodeConstructor.fromIdentifiers(nodeIds));
|
|
22
|
+
switch (situation.id) {
|
|
23
|
+
case "generalFormulaOfArithmeticoGeometricSequence": {
|
|
24
|
+
const { nodeA, nodeB, n0, nodeInitial } = situation;
|
|
25
|
+
function createNodeBySubstitutingVar(nodeCarrier, nodeInjected, variableNodeOfCarrier) {
|
|
26
|
+
return nodeBySubstitutingVar(nodeBySubstitutingVar(nodeBySubstitutingVar(nodeCarrier, nodeInjected, variableNodeOfCarrier), new VariableNode(`u_{${add(nodeInjected, 1).toTex()}}`), new VariableNode(`u_{${add(variableNodeOfCarrier, 1).toTex()}}`)), new VariableNode(`u_{${nodeInjected.toTex()}}`), new VariableNode(`u_{${variableNodeOfCarrier.toTex()}}`));
|
|
27
|
+
}
|
|
28
|
+
const nodePropertyWithN = (isValid ? situation.arrNodeValid : situation.arrNodeInvalid)[indexForNodeProperty];
|
|
29
|
+
const [nodePropertyDefinition, nodePropertyInduction, nodePropertyInductionPlus1,] = [
|
|
30
|
+
nodeVarStepDefinition,
|
|
31
|
+
nodeVarStepInduction,
|
|
32
|
+
add(nodeVarStepInduction, 1),
|
|
33
|
+
].map((node) => createNodeBySubstitutingVar(nodePropertyWithN, node, new VariableNode("n")));
|
|
34
|
+
const nodeSequenceDefinition = new EqualNode(new VariableNode(`u_{${add(nodeVarStepDefinition, 1).toTex()}}`), add(multiply(nodeA, new VariableNode(`u_{${nodeVarStepDefinition.toTex()}}`)), nodeB));
|
|
35
|
+
const arrNodeBaseCaseSteps = [
|
|
36
|
+
new EqualNode(new EqualNode(nodeBySubstitutingVar(nodePropertyWithN.rightChild, n0.toTree(), new VariableNode("n")), nodeInitial), new VariableNode(`u_{${n0}}`)),
|
|
37
|
+
];
|
|
38
|
+
const arrNodeInductionSteps = [
|
|
39
|
+
//by def:
|
|
40
|
+
createNodeBySubstitutingVar(nodeSequenceDefinition, nodeVarStepInduction, nodeVarStepDefinition),
|
|
41
|
+
//subst by using induction property
|
|
42
|
+
nodeBySubstitutingVar(nodeBySubstitutingVar(nodeSequenceDefinition, nodePropertyInduction.rightChild, new VariableNode(`u_{${nodeVarStepDefinition.toTex()}}`)), new VariableNode(`u_{${add(nodeVarStepInduction, 1).toTex()}}`), new VariableNode(`u_{${add(nodeVarStepDefinition, 1).toTex()}}`)),
|
|
43
|
+
//rewrite to exhibit induction + 1
|
|
44
|
+
nodePropertyInductionPlus1,
|
|
45
|
+
];
|
|
46
|
+
return {
|
|
47
|
+
situation,
|
|
48
|
+
nodeVarStepDefinition,
|
|
49
|
+
nodeSequenceDefinition,
|
|
50
|
+
nodeVarStepInduction,
|
|
51
|
+
nodePropertyInduction,
|
|
52
|
+
nodePropertyDefinition,
|
|
53
|
+
nodePropertyInductionPlus1,
|
|
54
|
+
arrNodeBaseCaseSteps,
|
|
55
|
+
arrNodeInductionSteps,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
default:
|
|
59
|
+
throw new Error("Unsupported situation.id: " + situation.id);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const getInstruction = (identifiers) => {
|
|
63
|
+
const { situation, nodePropertyDefinition, nodeVarStepDefinition } = getHydrated(identifiers);
|
|
64
|
+
const { n0 } = situation;
|
|
65
|
+
switch (situation.id) {
|
|
66
|
+
case "generalFormulaOfArithmeticoGeometricSequence": {
|
|
67
|
+
return `${situation.strContext}
|
|
68
|
+
|
|
69
|
+
Pour $${nodeVarStepDefinition.toTex()} \\geq ${n0}$, on note $\\mathcal{P}(${nodeVarStepDefinition.toTex()})$ la propriété :
|
|
70
|
+
|
|
71
|
+
$$
|
|
72
|
+
\\mathcal{P}(${nodeVarStepDefinition.toTex()}) :\\ \\ ${nodePropertyDefinition.toTex()}
|
|
73
|
+
$$
|
|
74
|
+
|
|
75
|
+
On veut démontrer que, pour tout $${nodeVarStepDefinition.toTex()} \\geq ${n0}$, $\\mathcal{P}(${nodeVarStepDefinition.toTex()})$ est vraie.
|
|
76
|
+
|
|
77
|
+
Reconstruire la démonstration par récurrence en réordonnant les éléments.`;
|
|
78
|
+
}
|
|
79
|
+
default:
|
|
80
|
+
throw new Error("Unsupported situation.id: " + situation.id);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
const getHint = (identifiers) => {
|
|
84
|
+
const { nodeIdsVarStepInduction } = identifiers;
|
|
85
|
+
const [nodeVarStepInduction] = [nodeIdsVarStepInduction].map((nodeIds) => NodeConstructor.fromIdentifiers(nodeIds));
|
|
86
|
+
return `Une démonstration par récurrence d'une propriété $\\mathcal{P}$ s'écrit en $3$ étapes :
|
|
87
|
+
- l'initialisation, où l'on s'assure que $\\mathcal{P}$ est vraie au rang initial
|
|
88
|
+
- l'hérédité, où l'on s'assure que,
|
|
89
|
+
pour un rang $${nodeVarStepInduction.toTex()}$ supérieur ou égal au rang initial,
|
|
90
|
+
si $\\mathcal{P}(${nodeVarStepInduction.toTex()})$ est vraie
|
|
91
|
+
alors $\\mathcal(${add(nodeVarStepInduction, 1).toTex()})$ est vraie
|
|
92
|
+
- la conclusion, où l'on déduit de l'initialisation et de l'hérédité que $\\mathcal{P}$ est vraie à partir du rang initial (jusqu'à l'infini)`;
|
|
93
|
+
};
|
|
94
|
+
const getCorrection = (identifiers) => {
|
|
95
|
+
const orderedItemsSorted = getOrderedItems(-1, {
|
|
96
|
+
answer: "",
|
|
97
|
+
...identifiers,
|
|
98
|
+
}).sort((item1, item2) => item1.rightIndex - item2.rightIndex);
|
|
99
|
+
return `Voici le raisonnement par récurrence qu'il fallait reconstruire :
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
${orderedItemsSorted.map((item) => item.statement).join(`
|
|
103
|
+
|
|
104
|
+
`)}`;
|
|
105
|
+
};
|
|
106
|
+
const getOrderedItems = (_n, { answer, ...identifiers }) => {
|
|
107
|
+
const { situationParams } = identifiers;
|
|
108
|
+
const orderedItems = (() => {
|
|
109
|
+
switch (situationParams.id) {
|
|
110
|
+
case "generalFormulaOfArithmeticoGeometricSequence": {
|
|
111
|
+
const { situation, nodeVarStepDefinition, nodeVarStepInduction, arrNodeBaseCaseSteps, arrNodeInductionSteps, } = getHydrated(identifiers);
|
|
112
|
+
const { n0 } = situation;
|
|
113
|
+
return [
|
|
114
|
+
"Initialisation :",
|
|
115
|
+
...arrNodeBaseCaseSteps.map((node) => `$${node.toTex()}$`),
|
|
116
|
+
`donc $\\mathcal{P}(${n0})$ est vraie`,
|
|
117
|
+
"Hérédité :",
|
|
118
|
+
`Soit $${nodeVarStepInduction.toTex()}$ un entier tel que $${nodeVarStepInduction.toTex()} \\geq ${n0}$.`,
|
|
119
|
+
`On suppose la propriété $\\mathcal{P}(${nodeVarStepInduction.toTex()})$ vraie.`,
|
|
120
|
+
...arrNodeInductionSteps.map((node) => `$${node.toTex()}$`),
|
|
121
|
+
`donc $\\mathcal{P}(${add(nodeVarStepInduction, 1).toTex()})$ est vraie`,
|
|
122
|
+
`donc $\\mathcal{P}$ est héréditaire`,
|
|
123
|
+
"Conclusion :",
|
|
124
|
+
`Pour tout $${nodeVarStepDefinition.toTex()} \\geq ${n0}$, $\\mathcal{P}(${nodeVarStepDefinition.toTex()})$ est vraie.`,
|
|
125
|
+
].map((statement, i) => ({
|
|
126
|
+
id: uuid(),
|
|
127
|
+
statement: statement,
|
|
128
|
+
rightIndex: i,
|
|
129
|
+
format: "raw",
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
default:
|
|
133
|
+
throw new Error("Unsupported situationParams.id: " + situationParams.id);
|
|
134
|
+
}
|
|
135
|
+
})();
|
|
136
|
+
return shuffle(orderedItems);
|
|
137
|
+
};
|
|
138
|
+
const createRandomIdentifiers = () => {
|
|
139
|
+
const [situationParams] = getArrProofByInductionSituationParams([
|
|
140
|
+
"generalFormulaOfArithmeticoGeometricSequence",
|
|
141
|
+
]);
|
|
142
|
+
const [isValid, indexForNodeProperty] = [true, 0];
|
|
143
|
+
const [nodeVarStepDefinition, nodeVarStepInduction] = randomMany(["n", "k", "p", "m"], 2).map((letter) => new VariableNode(letter));
|
|
144
|
+
const identifiers = {
|
|
145
|
+
situationParams,
|
|
146
|
+
isValid,
|
|
147
|
+
indexForNodeProperty,
|
|
148
|
+
nodeIdsVarStepDefinition: nodeVarStepDefinition.toIdentifiers(),
|
|
149
|
+
nodeIdsVarStepInduction: nodeVarStepInduction.toIdentifiers(),
|
|
150
|
+
};
|
|
151
|
+
return identifiers;
|
|
152
|
+
};
|
|
153
|
+
const isIdentifiersQCPassed = (identifiers) => {
|
|
154
|
+
const isExploding = (identifiers) => {
|
|
155
|
+
let isExploding = false;
|
|
156
|
+
try {
|
|
157
|
+
//ensure r is an integer
|
|
158
|
+
{
|
|
159
|
+
const { situationParams } = identifiers;
|
|
160
|
+
const situation = getHydratedProofByInductionSituation(situationParams);
|
|
161
|
+
switch (situation.id) {
|
|
162
|
+
case "generalFormulaOfArithmeticoGeometricSequence":
|
|
163
|
+
{
|
|
164
|
+
const { nodeR, nodeInitial } = situation;
|
|
165
|
+
if (isFractionNode(nodeR) ||
|
|
166
|
+
isFractionNode(opposite(nodeR).simplify())) {
|
|
167
|
+
isExploding = true;
|
|
168
|
+
}
|
|
169
|
+
if (NodeComparator.isEqualViaSub(nodeInitial, nodeR)) {
|
|
170
|
+
isExploding = true;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
break;
|
|
174
|
+
default:
|
|
175
|
+
throw new Error("Unsupported situation.id: " + situation.id);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// getAnswer(identifiers);
|
|
179
|
+
}
|
|
180
|
+
catch (_) {
|
|
181
|
+
isExploding = true;
|
|
182
|
+
}
|
|
183
|
+
return isExploding;
|
|
184
|
+
};
|
|
185
|
+
return !isExploding(identifiers);
|
|
186
|
+
};
|
|
187
|
+
const createQCPassedIdentifiers = () => {
|
|
188
|
+
let identifiers;
|
|
189
|
+
let counter = -1;
|
|
190
|
+
let isValid = false;
|
|
191
|
+
while (!isValid && counter < 100) {
|
|
192
|
+
counter++;
|
|
193
|
+
const identifiersCandidate = createRandomIdentifiers();
|
|
194
|
+
isValid = isIdentifiersQCPassed(identifiersCandidate);
|
|
195
|
+
if (isValid) {
|
|
196
|
+
identifiers = identifiersCandidate;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (!isValid) {
|
|
200
|
+
const [situationParams] = getArrProofByInductionSituationParams([
|
|
201
|
+
"generalFormulaOfArithmeticoGeometricSequence",
|
|
202
|
+
]);
|
|
203
|
+
const [nodeVarStepDefinition, nodeVarStepInduction] = randomMany(["n", "k", "p", "m"], 2).map((letter) => new VariableNode(letter));
|
|
204
|
+
const identifiersDefault = (() => {
|
|
205
|
+
return {
|
|
206
|
+
situationParams,
|
|
207
|
+
isValid: true,
|
|
208
|
+
indexForNodeProperty: 0,
|
|
209
|
+
nodeIdsVarStepDefinition: nodeVarStepDefinition.toIdentifiers(),
|
|
210
|
+
nodeIdsVarStepInduction: nodeVarStepInduction.toIdentifiers(),
|
|
211
|
+
};
|
|
212
|
+
})();
|
|
213
|
+
identifiers = identifiersDefault;
|
|
214
|
+
}
|
|
215
|
+
return identifiers;
|
|
216
|
+
};
|
|
217
|
+
const getProofByInductionReorderProofQuestion = () => {
|
|
218
|
+
const identifiers = createQCPassedIdentifiers();
|
|
219
|
+
return getQuestionFromIdentifiers(identifiers);
|
|
220
|
+
};
|
|
221
|
+
const getQuestionFromIdentifiers = (identifiers) => {
|
|
222
|
+
return {
|
|
223
|
+
instruction: getInstruction(identifiers),
|
|
224
|
+
answerFormat: "tex",
|
|
225
|
+
keys: [],
|
|
226
|
+
identifiers,
|
|
227
|
+
hint: getHint(identifiers),
|
|
228
|
+
correction: getCorrection(identifiers),
|
|
229
|
+
};
|
|
230
|
+
};
|
|
231
|
+
export const proofByInductionReorderProof = {
|
|
232
|
+
id: "proofByInductionReorderProof",
|
|
233
|
+
connector: "=",
|
|
234
|
+
label: "Reconstruire une démonstration par récurrence",
|
|
235
|
+
isSingleStep: true,
|
|
236
|
+
generator: (nb, opts) => getDistinctQuestions(() => getProofByInductionReorderProofQuestion(opts), nb),
|
|
237
|
+
qcmTimer: 60,
|
|
238
|
+
freeTimer: 60,
|
|
239
|
+
answerType: "reorder",
|
|
240
|
+
getOrderedItems,
|
|
241
|
+
subject: "Mathématiques",
|
|
242
|
+
getQuestionFromIdentifiers,
|
|
243
|
+
hasHintAndCorrection: true,
|
|
244
|
+
};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { AlgebraicNode } from "../../../../tree/nodes/algebraicNode.js";
|
|
2
|
+
import { EqualNode } from "../../../../tree/nodes/equations/equalNode.js";
|
|
3
|
+
import { NodeIdentifiers } from "../../../../tree/nodes/nodeConstructor.js";
|
|
4
|
+
import { KeyId } from "../../../../types/keyIds.js";
|
|
5
|
+
import { KeyProps } from "../../../../types/keyProps.js";
|
|
6
|
+
export type ProofByInductionSituationParams = (GeneralFormulaOfArithmeticoGeometricSequenceParams & {
|
|
7
|
+
id: "generalFormulaOfArithmeticoGeometricSequence";
|
|
8
|
+
}) | (MultipleFromPolynomialParams & {
|
|
9
|
+
id: "multipleFromPolynomial";
|
|
10
|
+
});
|
|
11
|
+
export type ProofByInductionSituation = {
|
|
12
|
+
id: string;
|
|
13
|
+
strContext: string;
|
|
14
|
+
n0: number;
|
|
15
|
+
baseCase: string;
|
|
16
|
+
inductionHypothesis: string;
|
|
17
|
+
inductionStep: string;
|
|
18
|
+
conclusion: string;
|
|
19
|
+
keys: (KeyId | KeyProps)[];
|
|
20
|
+
params: ProofByInductionSituationParams;
|
|
21
|
+
arrNodeValid: AlgebraicNode[];
|
|
22
|
+
arrNodeInvalid: AlgebraicNode[];
|
|
23
|
+
};
|
|
24
|
+
type GeneralFormulaOfArithmeticoGeometricSequenceParams = {
|
|
25
|
+
n0: number;
|
|
26
|
+
nodeIdsInitial: NodeIdentifiers;
|
|
27
|
+
nodeIdsA: NodeIdentifiers;
|
|
28
|
+
nodeIdsB: NodeIdentifiers;
|
|
29
|
+
};
|
|
30
|
+
export declare const getGeneralFormulaOfArithmeticoGeometricSequenceSituation: (params: ProofByInductionSituationParams) => {
|
|
31
|
+
id: string;
|
|
32
|
+
strContext: string;
|
|
33
|
+
n0: number;
|
|
34
|
+
baseCase: string;
|
|
35
|
+
inductionHypothesis: string;
|
|
36
|
+
inductionStep: string;
|
|
37
|
+
conclusion: string;
|
|
38
|
+
keys: never[];
|
|
39
|
+
params: ProofByInductionSituationParams;
|
|
40
|
+
arrNodeValid: EqualNode[];
|
|
41
|
+
arrNodeInvalid: EqualNode[];
|
|
42
|
+
nodeA: AlgebraicNode;
|
|
43
|
+
nodeB: AlgebraicNode;
|
|
44
|
+
nodeR: AlgebraicNode;
|
|
45
|
+
nodeInitial: AlgebraicNode;
|
|
46
|
+
};
|
|
47
|
+
type MultipleFromPolynomialParams = {
|
|
48
|
+
n0: number;
|
|
49
|
+
isValid: boolean;
|
|
50
|
+
nbMod: number;
|
|
51
|
+
arrValueRoot: number[];
|
|
52
|
+
};
|
|
53
|
+
export declare const getMultipleFromPolynomialSituation: (params: ProofByInductionSituationParams) => {
|
|
54
|
+
id: string;
|
|
55
|
+
strContext: string;
|
|
56
|
+
n0: number;
|
|
57
|
+
baseCase: string;
|
|
58
|
+
inductionHypothesis: string;
|
|
59
|
+
inductionStep: string;
|
|
60
|
+
conclusion: string;
|
|
61
|
+
keys: never[];
|
|
62
|
+
params: ProofByInductionSituationParams;
|
|
63
|
+
arrNodeValid: AlgebraicNode[];
|
|
64
|
+
arrNodeInvalid: AlgebraicNode[];
|
|
65
|
+
};
|
|
66
|
+
export declare const getHydratedProofByInductionSituation: (params: ProofByInductionSituationParams) => {
|
|
67
|
+
id: string;
|
|
68
|
+
strContext: string;
|
|
69
|
+
n0: number;
|
|
70
|
+
baseCase: string;
|
|
71
|
+
inductionHypothesis: string;
|
|
72
|
+
inductionStep: string;
|
|
73
|
+
conclusion: string;
|
|
74
|
+
keys: never[];
|
|
75
|
+
params: ProofByInductionSituationParams;
|
|
76
|
+
arrNodeValid: EqualNode[];
|
|
77
|
+
arrNodeInvalid: EqualNode[];
|
|
78
|
+
nodeA: AlgebraicNode;
|
|
79
|
+
nodeB: AlgebraicNode;
|
|
80
|
+
nodeR: AlgebraicNode;
|
|
81
|
+
nodeInitial: AlgebraicNode;
|
|
82
|
+
} | {
|
|
83
|
+
id: string;
|
|
84
|
+
strContext: string;
|
|
85
|
+
n0: number;
|
|
86
|
+
baseCase: string;
|
|
87
|
+
inductionHypothesis: string;
|
|
88
|
+
inductionStep: string;
|
|
89
|
+
conclusion: string;
|
|
90
|
+
keys: never[];
|
|
91
|
+
params: ProofByInductionSituationParams;
|
|
92
|
+
arrNodeValid: AlgebraicNode[];
|
|
93
|
+
arrNodeInvalid: AlgebraicNode[];
|
|
94
|
+
};
|
|
95
|
+
export declare const getRandomProofByInductionSituationParams: () => ProofByInductionSituationParams;
|
|
96
|
+
export declare const getArrProofByInductionSituationParams: (arrId: string[]) => ProofByInductionSituationParams[];
|
|
97
|
+
export {};
|
|
98
|
+
//# sourceMappingURL=proofByInductionSituations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proofByInductionSituations.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/sequences/proofByInduction/proofByInductionSituations.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EACL,eAAe,EAEhB,MAAM,qCAAqC,CAAC;AAQ7C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAWnD,MAAM,MAAM,+BAA+B,GACvC,CAAC,kDAAkD,GAAG;IACpD,EAAE,EAAE,8CAA8C,CAAC;CACpD,CAAC,GAEF,CAAC,4BAA4B,GAAG;IAAE,EAAE,EAAE,wBAAwB,CAAA;CAAE,CAAC,CAAC;AAEtE,MAAM,MAAM,yBAAyB,GAAG;IACtC,EAAE,EAAE,MAAM,CAAC;IAEX,UAAU,EAAE,MAAM,CAAC;IAEnB,EAAE,EAAE,MAAM,CAAC;IAEX,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IAEnB,IAAI,EAAE,CAAC,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC;IAC3B,MAAM,EAAE,+BAA+B,CAAC;IAGxC,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9B,cAAc,EAAE,aAAa,EAAE,CAAC;CACjC,CAAC;AAWF,KAAK,kDAAkD,GAAG;IACxD,EAAE,EAAE,MAAM,CAAC;IAEX,cAAc,EAAE,eAAe,CAAC;IAChC,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,eAAe,CAAC;CAC3B,CAAC;AAoBF,eAAO,MAAM,wDAAwD,GACnE,QAAQ,+BAA+B;;;;;;;;;;;;;;;;CAmKxC,CAAC;AAuKF,KAAK,4BAA4B,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IAEX,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAmBF,eAAO,MAAM,kCAAkC,GAC7C,QAAQ,+BAA+B;;;;;;;;;;;;CA8CxC,CAAC;AAEF,eAAO,MAAM,oCAAoC,GAC/C,QAAQ,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQxC,CAAC;AAEF,eAAO,MAAM,wCAAwC,QAC/C,+BAYH,CAAC;AAEJ,eAAO,MAAM,qCAAqC,GAChD,OAAO,MAAM,EAAE,KACd,+BAA+B,EAYjC,CAAC"}
|