1"""
2 pygments.lexers.freefem
3 ~~~~~~~~~~~~~~~~~~~~~~~
4
5 Lexer for FreeFem++ language.
6
7 :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
8 :license: BSD, see LICENSE for details.
9"""
10
11from pygments.token import Comment, Operator, Keyword, Name
12
13from pygments.lexers.c_cpp import CppLexer
14
15__all__ = ['FreeFemLexer']
16
17
18class FreeFemLexer(CppLexer):
19 """
20 For FreeFem++ source.
21
22 This is an extension of the CppLexer, as the FreeFem Language is a superset
23 of C++.
24 """
25
26 name = 'Freefem'
27 url = 'https://freefem.org/'
28 aliases = ['freefem']
29 filenames = ['*.edp']
30 mimetypes = ['text/x-freefem']
31 version_added = '2.4'
32
33 # Language operators
34 operators = {'+', '-', '*', '.*', '/', './', '%', '^', '^-1', ':', '\''}
35
36 # types
37 types = {'bool', 'border', 'complex', 'dmatrix', 'fespace', 'func', 'gslspline',
38 'ifstream', 'int', 'macro', 'matrix', 'mesh', 'mesh3', 'mpiComm',
39 'mpiGroup', 'mpiRequest', 'NewMacro', 'EndMacro', 'ofstream', 'Pmmap',
40 'problem', 'Psemaphore', 'real', 'solve', 'string', 'varf'}
41
42 # finite element spaces
43 fespaces = {'BDM1', 'BDM1Ortho', 'Edge03d', 'Edge13d', 'Edge23d', 'FEQF', 'HCT',
44 'P0', 'P03d', 'P0Edge', 'P1', 'P13d', 'P1b', 'P1b3d', 'P1bl', 'P1bl3d',
45 'P1dc', 'P1Edge', 'P1nc', 'P2', 'P23d', 'P2b', 'P2BR', 'P2dc', 'P2Edge',
46 'P2h', 'P2Morley', 'P2pnc', 'P3', 'P3dc', 'P3Edge', 'P4', 'P4dc',
47 'P4Edge', 'P5Edge', 'RT0', 'RT03d', 'RT0Ortho', 'RT1', 'RT1Ortho',
48 'RT2', 'RT2Ortho'}
49
50 # preprocessor
51 preprocessor = {'ENDIFMACRO', 'include', 'IFMACRO', 'load'}
52
53 # Language keywords
54 keywords = {
55 'adj',
56 'append',
57 'area',
58 'ARGV',
59 'be',
60 'binary',
61 'BoundaryEdge',
62 'bordermeasure',
63 'CG',
64 'Cholesky',
65 'cin',
66 'cout',
67 'Crout',
68 'default',
69 'diag',
70 'edgeOrientation',
71 'endl',
72 'false',
73 'ffind',
74 'FILE',
75 'find',
76 'fixed',
77 'flush',
78 'GMRES',
79 'good',
80 'hTriangle',
81 'im',
82 'imax',
83 'imin',
84 'InternalEdge',
85 'l1',
86 'l2',
87 'label',
88 'lenEdge',
89 'length',
90 'LINE',
91 'linfty',
92 'LU',
93 'm',
94 'max',
95 'measure',
96 'min',
97 'mpiAnySource',
98 'mpiBAND',
99 'mpiBXOR',
100 'mpiCommWorld',
101 'mpiLAND',
102 'mpiLOR',
103 'mpiLXOR',
104 'mpiMAX',
105 'mpiMIN',
106 'mpiPROD',
107 'mpirank',
108 'mpisize',
109 'mpiSUM',
110 'mpiUndefined',
111 'n',
112 'N',
113 'nbe',
114 'ndof',
115 'ndofK',
116 'noshowbase',
117 'noshowpos',
118 'notaregion',
119 'nt',
120 'nTonEdge',
121 'nuEdge',
122 'nuTriangle',
123 'nv',
124 'P',
125 'pi',
126 'precision',
127 'qf1pE',
128 'qf1pElump',
129 'qf1pT',
130 'qf1pTlump',
131 'qfV1',
132 'qfV1lump',
133 'qf2pE',
134 'qf2pT',
135 'qf2pT4P1',
136 'qfV2',
137 'qf3pE',
138 'qf4pE',
139 'qf5pE',
140 'qf5pT',
141 'qfV5',
142 'qf7pT',
143 'qf9pT',
144 'qfnbpE',
145 'quantile',
146 're',
147 'region',
148 'rfind',
149 'scientific',
150 'searchMethod',
151 'setw',
152 'showbase',
153 'showpos',
154 'sparsesolver',
155 'sum',
156 'tellp',
157 'true',
158 'UMFPACK',
159 'unused',
160 'whoinElement',
161 'verbosity',
162 'version',
163 'volume',
164 'x',
165 'y',
166 'z'
167 }
168
169 # Language shipped functions and class ( )
170 functions = {
171 'abs',
172 'acos',
173 'acosh',
174 'adaptmesh',
175 'adj',
176 'AffineCG',
177 'AffineGMRES',
178 'arg',
179 'asin',
180 'asinh',
181 'assert',
182 'atan',
183 'atan2',
184 'atanh',
185 'atof',
186 'atoi',
187 'BFGS',
188 'broadcast',
189 'buildlayers',
190 'buildmesh',
191 'ceil',
192 'chi',
193 'complexEigenValue',
194 'copysign',
195 'change',
196 'checkmovemesh',
197 'clock',
198 'cmaes',
199 'conj',
200 'convect',
201 'cos',
202 'cosh',
203 'cube',
204 'd',
205 'dd',
206 'dfft',
207 'diffnp',
208 'diffpos',
209 'dimKrylov',
210 'dist',
211 'dumptable',
212 'dx',
213 'dxx',
214 'dxy',
215 'dxz',
216 'dy',
217 'dyx',
218 'dyy',
219 'dyz',
220 'dz',
221 'dzx',
222 'dzy',
223 'dzz',
224 'EigenValue',
225 'emptymesh',
226 'erf',
227 'erfc',
228 'exec',
229 'exit',
230 'exp',
231 'fdim',
232 'floor',
233 'fmax',
234 'fmin',
235 'fmod',
236 'freeyams',
237 'getARGV',
238 'getline',
239 'gmshload',
240 'gmshload3',
241 'gslcdfugaussianP',
242 'gslcdfugaussianQ',
243 'gslcdfugaussianPinv',
244 'gslcdfugaussianQinv',
245 'gslcdfgaussianP',
246 'gslcdfgaussianQ',
247 'gslcdfgaussianPinv',
248 'gslcdfgaussianQinv',
249 'gslcdfgammaP',
250 'gslcdfgammaQ',
251 'gslcdfgammaPinv',
252 'gslcdfgammaQinv',
253 'gslcdfcauchyP',
254 'gslcdfcauchyQ',
255 'gslcdfcauchyPinv',
256 'gslcdfcauchyQinv',
257 'gslcdflaplaceP',
258 'gslcdflaplaceQ',
259 'gslcdflaplacePinv',
260 'gslcdflaplaceQinv',
261 'gslcdfrayleighP',
262 'gslcdfrayleighQ',
263 'gslcdfrayleighPinv',
264 'gslcdfrayleighQinv',
265 'gslcdfchisqP',
266 'gslcdfchisqQ',
267 'gslcdfchisqPinv',
268 'gslcdfchisqQinv',
269 'gslcdfexponentialP',
270 'gslcdfexponentialQ',
271 'gslcdfexponentialPinv',
272 'gslcdfexponentialQinv',
273 'gslcdfexppowP',
274 'gslcdfexppowQ',
275 'gslcdftdistP',
276 'gslcdftdistQ',
277 'gslcdftdistPinv',
278 'gslcdftdistQinv',
279 'gslcdffdistP',
280 'gslcdffdistQ',
281 'gslcdffdistPinv',
282 'gslcdffdistQinv',
283 'gslcdfbetaP',
284 'gslcdfbetaQ',
285 'gslcdfbetaPinv',
286 'gslcdfbetaQinv',
287 'gslcdfflatP',
288 'gslcdfflatQ',
289 'gslcdfflatPinv',
290 'gslcdfflatQinv',
291 'gslcdflognormalP',
292 'gslcdflognormalQ',
293 'gslcdflognormalPinv',
294 'gslcdflognormalQinv',
295 'gslcdfgumbel1P',
296 'gslcdfgumbel1Q',
297 'gslcdfgumbel1Pinv',
298 'gslcdfgumbel1Qinv',
299 'gslcdfgumbel2P',
300 'gslcdfgumbel2Q',
301 'gslcdfgumbel2Pinv',
302 'gslcdfgumbel2Qinv',
303 'gslcdfweibullP',
304 'gslcdfweibullQ',
305 'gslcdfweibullPinv',
306 'gslcdfweibullQinv',
307 'gslcdfparetoP',
308 'gslcdfparetoQ',
309 'gslcdfparetoPinv',
310 'gslcdfparetoQinv',
311 'gslcdflogisticP',
312 'gslcdflogisticQ',
313 'gslcdflogisticPinv',
314 'gslcdflogisticQinv',
315 'gslcdfbinomialP',
316 'gslcdfbinomialQ',
317 'gslcdfpoissonP',
318 'gslcdfpoissonQ',
319 'gslcdfgeometricP',
320 'gslcdfgeometricQ',
321 'gslcdfnegativebinomialP',
322 'gslcdfnegativebinomialQ',
323 'gslcdfpascalP',
324 'gslcdfpascalQ',
325 'gslinterpakima',
326 'gslinterpakimaperiodic',
327 'gslinterpcsplineperiodic',
328 'gslinterpcspline',
329 'gslinterpsteffen',
330 'gslinterplinear',
331 'gslinterppolynomial',
332 'gslranbernoullipdf',
333 'gslranbeta',
334 'gslranbetapdf',
335 'gslranbinomialpdf',
336 'gslranexponential',
337 'gslranexponentialpdf',
338 'gslranexppow',
339 'gslranexppowpdf',
340 'gslrancauchy',
341 'gslrancauchypdf',
342 'gslranchisq',
343 'gslranchisqpdf',
344 'gslranerlang',
345 'gslranerlangpdf',
346 'gslranfdist',
347 'gslranfdistpdf',
348 'gslranflat',
349 'gslranflatpdf',
350 'gslrangamma',
351 'gslrangammaint',
352 'gslrangammapdf',
353 'gslrangammamt',
354 'gslrangammaknuth',
355 'gslrangaussian',
356 'gslrangaussianratiomethod',
357 'gslrangaussianziggurat',
358 'gslrangaussianpdf',
359 'gslranugaussian',
360 'gslranugaussianratiomethod',
361 'gslranugaussianpdf',
362 'gslrangaussiantail',
363 'gslrangaussiantailpdf',
364 'gslranugaussiantail',
365 'gslranugaussiantailpdf',
366 'gslranlandau',
367 'gslranlandaupdf',
368 'gslrangeometricpdf',
369 'gslrangumbel1',
370 'gslrangumbel1pdf',
371 'gslrangumbel2',
372 'gslrangumbel2pdf',
373 'gslranlogistic',
374 'gslranlogisticpdf',
375 'gslranlognormal',
376 'gslranlognormalpdf',
377 'gslranlogarithmicpdf',
378 'gslrannegativebinomialpdf',
379 'gslranpascalpdf',
380 'gslranpareto',
381 'gslranparetopdf',
382 'gslranpoissonpdf',
383 'gslranrayleigh',
384 'gslranrayleighpdf',
385 'gslranrayleightail',
386 'gslranrayleightailpdf',
387 'gslrantdist',
388 'gslrantdistpdf',
389 'gslranlaplace',
390 'gslranlaplacepdf',
391 'gslranlevy',
392 'gslranweibull',
393 'gslranweibullpdf',
394 'gslsfairyAi',
395 'gslsfairyBi',
396 'gslsfairyAiscaled',
397 'gslsfairyBiscaled',
398 'gslsfairyAideriv',
399 'gslsfairyBideriv',
400 'gslsfairyAiderivscaled',
401 'gslsfairyBiderivscaled',
402 'gslsfairyzeroAi',
403 'gslsfairyzeroBi',
404 'gslsfairyzeroAideriv',
405 'gslsfairyzeroBideriv',
406 'gslsfbesselJ0',
407 'gslsfbesselJ1',
408 'gslsfbesselJn',
409 'gslsfbesselY0',
410 'gslsfbesselY1',
411 'gslsfbesselYn',
412 'gslsfbesselI0',
413 'gslsfbesselI1',
414 'gslsfbesselIn',
415 'gslsfbesselI0scaled',
416 'gslsfbesselI1scaled',
417 'gslsfbesselInscaled',
418 'gslsfbesselK0',
419 'gslsfbesselK1',
420 'gslsfbesselKn',
421 'gslsfbesselK0scaled',
422 'gslsfbesselK1scaled',
423 'gslsfbesselKnscaled',
424 'gslsfbesselj0',
425 'gslsfbesselj1',
426 'gslsfbesselj2',
427 'gslsfbesseljl',
428 'gslsfbessely0',
429 'gslsfbessely1',
430 'gslsfbessely2',
431 'gslsfbesselyl',
432 'gslsfbesseli0scaled',
433 'gslsfbesseli1scaled',
434 'gslsfbesseli2scaled',
435 'gslsfbesselilscaled',
436 'gslsfbesselk0scaled',
437 'gslsfbesselk1scaled',
438 'gslsfbesselk2scaled',
439 'gslsfbesselklscaled',
440 'gslsfbesselJnu',
441 'gslsfbesselYnu',
442 'gslsfbesselInuscaled',
443 'gslsfbesselInu',
444 'gslsfbesselKnuscaled',
445 'gslsfbesselKnu',
446 'gslsfbessellnKnu',
447 'gslsfbesselzeroJ0',
448 'gslsfbesselzeroJ1',
449 'gslsfbesselzeroJnu',
450 'gslsfclausen',
451 'gslsfhydrogenicR1',
452 'gslsfdawson',
453 'gslsfdebye1',
454 'gslsfdebye2',
455 'gslsfdebye3',
456 'gslsfdebye4',
457 'gslsfdebye5',
458 'gslsfdebye6',
459 'gslsfdilog',
460 'gslsfmultiply',
461 'gslsfellintKcomp',
462 'gslsfellintEcomp',
463 'gslsfellintPcomp',
464 'gslsfellintDcomp',
465 'gslsfellintF',
466 'gslsfellintE',
467 'gslsfellintRC',
468 'gslsferfc',
469 'gslsflogerfc',
470 'gslsferf',
471 'gslsferfZ',
472 'gslsferfQ',
473 'gslsfhazard',
474 'gslsfexp',
475 'gslsfexpmult',
476 'gslsfexpm1',
477 'gslsfexprel',
478 'gslsfexprel2',
479 'gslsfexpreln',
480 'gslsfexpintE1',
481 'gslsfexpintE2',
482 'gslsfexpintEn',
483 'gslsfexpintE1scaled',
484 'gslsfexpintE2scaled',
485 'gslsfexpintEnscaled',
486 'gslsfexpintEi',
487 'gslsfexpintEiscaled',
488 'gslsfShi',
489 'gslsfChi',
490 'gslsfexpint3',
491 'gslsfSi',
492 'gslsfCi',
493 'gslsfatanint',
494 'gslsffermidiracm1',
495 'gslsffermidirac0',
496 'gslsffermidirac1',
497 'gslsffermidirac2',
498 'gslsffermidiracint',
499 'gslsffermidiracmhalf',
500 'gslsffermidirachalf',
501 'gslsffermidirac3half',
502 'gslsffermidiracinc0',
503 'gslsflngamma',
504 'gslsfgamma',
505 'gslsfgammastar',
506 'gslsfgammainv',
507 'gslsftaylorcoeff',
508 'gslsffact',
509 'gslsfdoublefact',
510 'gslsflnfact',
511 'gslsflndoublefact',
512 'gslsflnchoose',
513 'gslsfchoose',
514 'gslsflnpoch',
515 'gslsfpoch',
516 'gslsfpochrel',
517 'gslsfgammaincQ',
518 'gslsfgammaincP',
519 'gslsfgammainc',
520 'gslsflnbeta',
521 'gslsfbeta',
522 'gslsfbetainc',
523 'gslsfgegenpoly1',
524 'gslsfgegenpoly2',
525 'gslsfgegenpoly3',
526 'gslsfgegenpolyn',
527 'gslsfhyperg0F1',
528 'gslsfhyperg1F1int',
529 'gslsfhyperg1F1',
530 'gslsfhypergUint',
531 'gslsfhypergU',
532 'gslsfhyperg2F0',
533 'gslsflaguerre1',
534 'gslsflaguerre2',
535 'gslsflaguerre3',
536 'gslsflaguerren',
537 'gslsflambertW0',
538 'gslsflambertWm1',
539 'gslsflegendrePl',
540 'gslsflegendreP1',
541 'gslsflegendreP2',
542 'gslsflegendreP3',
543 'gslsflegendreQ0',
544 'gslsflegendreQ1',
545 'gslsflegendreQl',
546 'gslsflegendrePlm',
547 'gslsflegendresphPlm',
548 'gslsflegendrearraysize',
549 'gslsfconicalPhalf',
550 'gslsfconicalPmhalf',
551 'gslsfconicalP0',
552 'gslsfconicalP1',
553 'gslsfconicalPsphreg',
554 'gslsfconicalPcylreg',
555 'gslsflegendreH3d0',
556 'gslsflegendreH3d1',
557 'gslsflegendreH3d',
558 'gslsflog',
559 'gslsflogabs',
560 'gslsflog1plusx',
561 'gslsflog1plusxmx',
562 'gslsfpowint',
563 'gslsfpsiint',
564 'gslsfpsi',
565 'gslsfpsi1piy',
566 'gslsfpsi1int',
567 'gslsfpsi1',
568 'gslsfpsin',
569 'gslsfsynchrotron1',
570 'gslsfsynchrotron2',
571 'gslsftransport2',
572 'gslsftransport3',
573 'gslsftransport4',
574 'gslsftransport5',
575 'gslsfsin',
576 'gslsfcos',
577 'gslsfhypot',
578 'gslsfsinc',
579 'gslsflnsinh',
580 'gslsflncosh',
581 'gslsfanglerestrictsymm',
582 'gslsfanglerestrictpos',
583 'gslsfzetaint',
584 'gslsfzeta',
585 'gslsfzetam1',
586 'gslsfzetam1int',
587 'gslsfhzeta',
588 'gslsfetaint',
589 'gslsfeta',
590 'imag',
591 'int1d',
592 'int2d',
593 'int3d',
594 'intalledges',
595 'intallfaces',
596 'interpolate',
597 'invdiff',
598 'invdiffnp',
599 'invdiffpos',
600 'Isend',
601 'isInf',
602 'isNaN',
603 'isoline',
604 'Irecv',
605 'j0',
606 'j1',
607 'jn',
608 'jump',
609 'lgamma',
610 'LinearCG',
611 'LinearGMRES',
612 'log',
613 'log10',
614 'lrint',
615 'lround',
616 'max',
617 'mean',
618 'medit',
619 'min',
620 'mmg3d',
621 'movemesh',
622 'movemesh23',
623 'mpiAlltoall',
624 'mpiAlltoallv',
625 'mpiAllgather',
626 'mpiAllgatherv',
627 'mpiAllReduce',
628 'mpiBarrier',
629 'mpiGather',
630 'mpiGatherv',
631 'mpiRank',
632 'mpiReduce',
633 'mpiScatter',
634 'mpiScatterv',
635 'mpiSize',
636 'mpiWait',
637 'mpiWaitAny',
638 'mpiWtick',
639 'mpiWtime',
640 'mshmet',
641 'NaN',
642 'NLCG',
643 'on',
644 'plot',
645 'polar',
646 'Post',
647 'pow',
648 'processor',
649 'processorblock',
650 'projection',
651 'randinit',
652 'randint31',
653 'randint32',
654 'random',
655 'randreal1',
656 'randreal2',
657 'randreal3',
658 'randres53',
659 'Read',
660 'readmesh',
661 'readmesh3',
662 'Recv',
663 'rint',
664 'round',
665 'savemesh',
666 'savesol',
667 'savevtk',
668 'seekg',
669 'Sent',
670 'set',
671 'sign',
672 'signbit',
673 'sin',
674 'sinh',
675 'sort',
676 'splitComm',
677 'splitmesh',
678 'sqrt',
679 'square',
680 'srandom',
681 'srandomdev',
682 'Stringification',
683 'swap',
684 'system',
685 'tan',
686 'tanh',
687 'tellg',
688 'tetg',
689 'tetgconvexhull',
690 'tetgreconstruction',
691 'tetgtransfo',
692 'tgamma',
693 'triangulate',
694 'trunc',
695 'Wait',
696 'Write',
697 'y0',
698 'y1',
699 'yn'
700 }
701
702 # function parameters
703 parameters = {
704 'A',
705 'A1',
706 'abserror',
707 'absolute',
708 'aniso',
709 'aspectratio',
710 'B',
711 'B1',
712 'bb',
713 'beginend',
714 'bin',
715 'boundary',
716 'bw',
717 'close',
718 'cmm',
719 'coef',
720 'composante',
721 'cutoff',
722 'datafilename',
723 'dataname',
724 'dim',
725 'distmax',
726 'displacement',
727 'doptions',
728 'dparams',
729 'eps',
730 'err',
731 'errg',
732 'facemerge',
733 'facetcl',
734 'factorize',
735 'file',
736 'fill',
737 'fixedborder',
738 'flabel',
739 'flags',
740 'floatmesh',
741 'floatsol',
742 'fregion',
743 'gradation',
744 'grey',
745 'hmax',
746 'hmin',
747 'holelist',
748 'hsv',
749 'init',
750 'inquire',
751 'inside',
752 'IsMetric',
753 'iso',
754 'ivalue',
755 'keepbackvertices',
756 'label',
757 'labeldown',
758 'labelmid',
759 'labelup',
760 'levelset',
761 'loptions',
762 'lparams',
763 'maxit',
764 'maxsubdiv',
765 'meditff',
766 'mem',
767 'memory',
768 'metric',
769 'mode',
770 'nbarrow',
771 'nbiso',
772 'nbiter',
773 'nbjacoby',
774 'nboffacetcl',
775 'nbofholes',
776 'nbofregions',
777 'nbregul',
778 'nbsmooth',
779 'nbvx',
780 'ncv',
781 'nev',
782 'nomeshgeneration',
783 'normalization',
784 'omega',
785 'op',
786 'optimize',
787 'option',
788 'options',
789 'order',
790 'orientation',
791 'periodic',
792 'power',
793 'precon',
794 'prev',
795 'ps',
796 'ptmerge',
797 'qfe',
798 'qforder',
799 'qft',
800 'qfV',
801 'ratio',
802 'rawvector',
803 'reffacelow',
804 'reffacemid',
805 'reffaceup',
806 'refnum',
807 'reftet',
808 'reftri',
809 'region',
810 'regionlist',
811 'renumv',
812 'rescaling',
813 'ridgeangle',
814 'save',
815 'sigma',
816 'sizeofvolume',
817 'smoothing',
818 'solver',
819 'sparams',
820 'split',
821 'splitin2',
822 'splitpbedge',
823 'stop',
824 'strategy',
825 'swap',
826 'switch',
827 'sym',
828 't',
829 'tgv',
830 'thetamax',
831 'tol',
832 'tolpivot',
833 'tolpivotsym',
834 'transfo',
835 'U2Vc',
836 'value',
837 'varrow',
838 'vector',
839 'veps',
840 'viso',
841 'wait',
842 'width',
843 'withsurfacemesh',
844 'WindowIndex',
845 'which',
846 'zbound'
847 }
848
849 # deprecated
850 deprecated = {'fixeborder'}
851
852 # do not highlight
853 suppress_highlight = {
854 'alignof',
855 'asm',
856 'constexpr',
857 'decltype',
858 'div',
859 'double',
860 'grad',
861 'mutable',
862 'namespace',
863 'noexcept',
864 'restrict',
865 'static_assert',
866 'template',
867 'this',
868 'thread_local',
869 'typeid',
870 'typename',
871 'using'
872 }
873
874 def get_tokens_unprocessed(self, text, stack=('root',)):
875 for index, token, value in CppLexer.get_tokens_unprocessed(self, text, stack):
876 if value in self.operators:
877 yield index, Operator, value
878 elif value in self.types:
879 yield index, Keyword.Type, value
880 elif value in self.fespaces:
881 yield index, Name.Class, value
882 elif value in self.preprocessor:
883 yield index, Comment.Preproc, value
884 elif value in self.keywords:
885 yield index, Keyword.Reserved, value
886 elif value in self.functions:
887 yield index, Name.Function, value
888 elif value in self.parameters:
889 yield index, Keyword.Pseudo, value
890 elif value in self.suppress_highlight:
891 yield index, Name, value
892 else:
893 yield index, token, value