Table of Contents
26.1.0 Major release (February 02, 2019)
Acknowledgments
We would like to thank all of our users who have reported problems and made suggestions for improving this release. In particular, we thank Stefano Alva, Adam Christensen, Hanna Donau, Stephen Frank, Anastasis Giannousakis, Jan-Erik Justkowiak, David Laudy, Andreas Lundell, Thomas Maindl, Nils Mattus, Scott McDonald, Noah Rhodes, Tom Rutherford, and Anna Straubinger.
Versioning
From this release on, we use a new interpretation on the GAMS version number scheme XX.Y.Z. XX alone now indicates the GAMS distribution number (was XX.Y before). Y is used to distinguish between beta, major, and minor releases of the XX distribution. Z is used to distinguish different maintenance releases. That is, we now use
- XX.0.Z for beta versions,
- XX.1.0 for the major release of distribution XX,
- XX.Y.0, Y > 1, for minor releases,
- XX.Y.Z, Y ≥ 1, Z > 0, for maintenance releases.
See Release Types regarding the meaning or what constitutes a major, minor, or maintenance release. As before, we increase the required license date for major releases only.
Further, we changed the default installation directory of the GAMS system from using only the distribution number to also include the minor version number. Thus, as before, GAMS is now installed into directory names which contain the XX.Y part of the GAMS version number.
Platforms
- We plan to drop support for Mac OS X 10.11 (El Capitan) with the next major release.
- We plan to drop support for Windows Vista with the next major release.
- Fixed problem using solvers with Fortran dependencies on a Mac OS X 10.11 system.
GAMS System
GAMS
- Changed behavior of $compress, $decompress, and $encrypt:
source
andtarget
cannot be identical anymore; this could have lead to unreliable behavior in the past. - Extended the influence of $onMulti: This affects the model statement as well now.
- Added new dollar control option $onMultiR, which is similar to $onMulti but replaces existing data instead of merging into it.
- Added put_utility keyword
solver
to select a solver for a given or all possible model types by name at execution time. - Extended the syntax to allow Implicit Set Definition (or: Domain Defining Symbol Declarations). Here is a small example showing how this can be used:
And this is the result of theSet i 'canning plants' j 'markets'; Table d(i<,j<) 'distance in thousands of miles' new-york chicago topeka seattle 2.5 1.7 1.8 san-diego 2.5 1.8 1.4; Display i,j;
Display
statement:---- 10 SET i canning plants seattle , san-diego ---- 10 SET j markets new-york, chicago , topeka
- Updated the base module and components as necessary to allow for spaces in names of any files and directory used by GAMS, including the system directory, the working directory, the scratch directory, the process directory, and remove any checks warning about and preventing this. While the Windows system had already allowed spaces in previous versions, this change updates the other platforms to behave similarly.
- Changed the reading of command-line arguments on non-Windows platforms! This should only affect how arguments with spaces in them are passed on to GAMS. Previously, such arguments needed extra quoting or protection on non-Windows platforms. With this update, the extra protection is no longer needed: the same quoting of space-containing arguments can be used on all platforms. For example, with GAMS 25.1 and previous, two pairs of quotes were required on non-Windows platforms to protect spaces in an argument:
gams xx.gms --MY_GDX '"outer space"'
while now only one pair of quotes is needed on all platforms:gams xx.gms --MY_GDX "outer space"
- Increased the number of labels, which can be handled by GAMS from 200 million to ~2.1 billion and let GAMS terminate with the meaningful error message, if that limit is reached.
- Windows only: Fixed a bug which treated a path (e.g. to an input file or used as inputDir) as relative path, if it starts with
/
. Example: When runningcd C:\tmp && gams.exe /data/myModel.gms
, GAMS tried to load the fileC:\tmp\data\myModel.gms
in the past. Now, it loadsC:\data\myModel.gms
. - Fixed some problems with option asyncSolLst.
- Fixed a bug which could have caused GAMS to accept duplicate entries in a data statement, when they came in unsorted order.
- Fixed the dollar control option $onUpper (it did not do anything before).
GMSPython
- Updated
pip
to work with recent macOS versions.
Solvers
ANTIGONE, Bonmin, Couenne, Ipopt, SCIP
- Fixed an MKL error when running any of these solvers after CPLEX with solvelink=5 in the same GAMS run on Linux.
- Updated Intel MKL libraries to version 2019.0 on Linux and to version 2018.3 on Windows 64-bit.
BARON
- New libraries 18.11.12 for 64-bit platforms.
- New cutting planes for convex-transformable functions.
- New cutting planes for polynomial optimization problems.
- More robust treatment of cutting planes.
- Improved optimality-based range reduction mechanisms.
- CBC can now use multiple threads on Windows, too.
- We plan to drop BARON for Windows 32-bit with some future release.
- The solver time reported back to GAMS (resource usage) is now the wall clock time instead of the CPU time.
Bonmin, CBC, Couenne, Ipopt
- New libraries.
CONOPT 4
- New library 4.09 with many reliability improvements and a fix for wrong non-opt markers.
CPLEX
- Ctrl-C (or Interrupt) was broken for GAMS/CplexD. This has been fixed.
- Improved performance of retrieving the solution for a QCP with many quadratic rows.
Gurobi
- The solver time reported back to GAMS (resource usage) is now the wall clock time instead of the CPU time on Unix.
- Allow quadratic rows with
=E=
and let Gurobi deal with potential errors. Gurobi can sometimes substitue quadratic terms defined by=E=
rows. The check of quadratic row to be either=L=
or=G=
in the GAMS/Gurobi link prevented this.
KESTREL
- Added support for MPSGE models.
Knitro
- New libraries 11.1.1 (11.0.1 for 32-bit Windows) containing several bug fixes and performance improvements, including:
- improved performance on convex quadratic models,
- improved generation of knapsack cuts, resulting in faster performance on some MINLP models,
- improved performance when using the SQP algorithm,
- new values for option linsolver to choose parallel factorization routines MA97 and MA86.
- Artelys has announced that Knitro 11.0 was the last Knitro release to support 32-bit Windows. We will be dropping GAMS/Knitro for 32-bit Windows in the near future.
Lindo/LindoGlobal
- New libraries 12.0.90.
- LP Solver Improvements:
- With new enhancements made to the simplex solvers, the average performance on large instances has increased by 18% for the primal simplex and 15% for the dual simplex compared to the previous version.
- Improved performance on LP’s when using multiple cores with concurrent execution of Primal, Dual, and Barrier.
- Quadratic and Nonlinear Solver Improvements:
- Much faster handling of large quadratic matrices, e.g. 1000 x 1000.
- Global Solver Improvements:
- Improved handling of discontinuous functions, e.g., MOD(x,k), ROUND(x).
- LP Solver Improvements:
LocalSolver
- New libraries 8.0 (20181106).
- Performance improvements on routing & scheduling problems, especially Pickup & Delivery problems.
- Learning algorithms inside LocalSolver, which allow to automatically and dynamically tune up the search process for each solved instance, were improved. This leads to improved performances, especially for short resolution times (minutes).
Mosek
- New libraries 8.1.0.72.
ODHCPLEX
- New libraries 4.09 for Linux with many reliability improvements.
- New libraries 4.13 for Windows 64-bit with many reliability improvements and addressing dynamic loading in concurrent threads and processes.
- Updated options: DynamicSearch, FirstFeas, and Strategy
- New options: DecompDensity, Divisor, ODHFeasOpt, MaxBacktrack,
NewCallback
, Recurse, RecurseDecomp, RecurseIterLim, RecurseLog, RecurseMinIterLim, RecurseSolIterLim, RelaxSOS2, and ThreadLog.
OQNLP
- We plan to drop OQNLP with the next major release.
PATH
- New libraries 5.0.00.
- Fixed crash in Lemke's method that could happen for models with extremely poor scaling.
- New capability to use alternate basis-handling packages via dynamic loading of shared libraries. Two alternate packages are currently supported:
- BLU-LUSOL: Block LU updating using the LUSOL routines. The shared library required for this is included in the distribution.
- UMFPACK: Tim Davis' multifrontal LU factorization package. The shared library required for this is not included in the GAMS distribution, but can be downloaded from the SuiteSparse site. N.B.: We have verified UMFPACK on Linux, macOS, and Windows using UMFPACK v5.7.7 from SuiteSparse 5.3.0.
SCIP
- New libraries 6.0.1.
- Primal Heuristics
- new diving heuristic farkasdiving that dives into the direction of the pseudosolution and tries to construct Farkas-proofs
- new diving heuristic conflictdiving that considers locks from conflict constraints
- performance improvements for Adaptive Large Neighborhood Search
- changed default of parameter heuristics/alns/adjustminimprove from 1 to 0
- changed default of parameter heuristics/alns/alpha from 0.2 to 0.0016
- new parameter heuristics/alns/adjusttargetnodes
- changed default of parameter heuristics/alns/eps from 0.5 to 0.468584
- changed default of parameter heuristics/alns/gamma from 0.2 to 0.0704146
- changed default of parameter heuristics/alns/minimprovehigh from 0.1 to 0.01
- changed default of parameter heuristics/alns/minimprovelow from 0.0001 to 0.01
- removed parameter heuristics/alns/stallnodefactor
- changed default of parameter heuristics/alns/startminimprove from 0.05 to 0.01
- changed default of parameter heuristics/alns/targetnodefactor from 1.5 to 1.05
- new parameter heuristics/alns/unfixtol
- changed default of parameter heuristics/alns/crossover/minfixingrate from 0.4 to 0.3
- changed default of parameter heuristics/alns/dins/maxfixingrate from 0.5 to 0.9
- changed default of parameter heuristics/alns/dins/minfixingrate from 0.1 to 0.3
- changed default of parameter heuristics/alns/localbranching/minfixingrate from 0 to 0.3
- changed default of parameter heuristics/alns/mutation/minfixingrate from 0.4 to 0.3
- changed default of parameter heuristics/alns/proximity/minfixingrate from 0 to 0.3
- changed default of parameter heuristics/alns/rens/maxfixingrate from 0.7 to 0.9
- changed default of parameter heuristics/alns/rins/maxfixingrate from 0.6 to 0.9
- changed default of parameter heuristics/alns/rins/minfixingrate from 0.2 to 0.3
- changed default of parameter heuristics/alns/zeroobjective/minfixingrate from 0 to 0.3
- New branching rule lookahead that evaluates potential child and grandchild nodes to determine a branching decision
- LP Solver Interface
- lp/checkstability is now properly implemented for use with SoPlex
- new parameter lp/alwaysgetduals
- new parameter lp/checkfarkas
- Separation (cutting planes)
- cuts generated from certain quadratic constraints with convex feasible region are now global
- new parameter
separating/dircutoffdistfac
- new parameter
separating/efficacyfac
- removed parameter separating/maxincrounds
- new parameter separating/zerohalf/dircutoffdistweight
- new parameter separating/zerohalf/efficacyweight
- changed default of parameter separating/zerohalf/goodscore from 0.9 to 1
- new parameter separating/zerohalf/goodmaxparall
- new parameter separating/zerohalf/initseed
- new parameter separating/zerohalf/maxparall
- new parameter separating/zerohalf/objparalweight
- Symmetry Handling
- restructured timing of symmetry computation to allow to add symmetry handling components within presolving
- changed default of parameter constraints/symresack/ppsymresack from 0 to 1
- new parameter
presolving/symbreak/addconsstiming
- changed default of parameter
presolving/symbreak/detectorbitopes
from 1 to 0 - removed parameter "presolving/symmetry/computepresolved"
- new parameter
propagating/orbitalfixing/enabledafterrestarts
- new parameter
propagating/orbitalfixing/performpresolving
- changed default of parameter
propagating/orbitalfixing/presolpriority
from 0 to -1000000 - changed default of parameter
propagating/orbitalfixing/presoltiming
from 28 to 16 - new parameter
propagating/orbitalfixing/symcomptiming
- improved bound tightening for some quadratic equations
- new parameter display/relevantstats
- new parameter misc/scaleobj
- removed
implfree
presolver - See also the full release notes and the release paper.
- Primal Heuristics
SELKIE
The SELKIE
solver - new to GAMS with this release - is an EMP solver that implements decomposition methods for multi-agent equilibrium and related models.
SoPlex
- New libraries 4.0.1.
- new simplifier step to perform variable aggregation for equations with two variables
- new parameter bool:ensureray to re-solve the original problem in case of infeasibility/unboundedness to get a valid proof/ray
- See also the full release notes and the release paper.
Xpress
- New libraries 33.01.10.
- local symmetry re-detection in MIP tree search
- improved branching for highly symmetric MIPs
- new or improved cuts, degeneracy handling, crossover, preprocessing
- FICO does not release patches for all platforms with each patch release, so some platforms lag behind the most-used ones.
Tools
CSDP
CSV2GDX
- Extended recognition of special values:
N/A
is recognized asNA
,TRUE
is recognized as1
,FALSE
,NONE
andNULL
are recognized as0
.
- Added new option text to specify the column to get explanatory text from when reading a set.
- Changed handling of bad UELs: Reading a bad UEL (e.g. a UEL exceeding the maximum length) causes an error now. The old behavior can be enabled again using the new option acceptBadUels.
GAMS Studio
- New version 0.10.3
- Stability and performance improvements.
- Added a new section Comparing GAMS Studio and GAMSIDE to the documentation.
- Added a Reference File Viewer to navigate the source code of GAMS models via a reference file, especially when multiple files are involved. A reference file contains all symbol references of GAMS models and is created using the reference parameter when running the model.
- Added a Tab Browser (Deprecated) to list and search through all open files. It is accessible with a button next to the main tab bar or via the shortcut
Ctrl+K
. - GDX Viewer :
- Added a first, basic version of a Table View : The new button "Table View" switches the view to a table based representation. The button is only enabled for multidimensional symbols and puts the last dimension into the header of the table. Drag and drop of items is not yet supported but will be in the future.
- Added option to hide specific value columns for variables and equations.
- Added support for the use of different encodings using the "Edit->Encoding" menu. The default encoding for a GDX file generated in Studio by running a GMS file with automatic GDX creation (
F10
) is the one used by the GMS file.
- Editor
- Added smart typing: Automatic insertion of closing character for brackets and quotes.
- Added ability to select text and press either a opening bracket or quote to surround text with these symbols.
- Improved backspace behavior, if auto indentation is active.
- Output Widget
- Added info, warning, and error messages to GAMS Studio system log.
- GAMS log files are now written to disk (can be disabled in settings).
- Added "clear log" context menu entry.
- Project Explorer
- Studio automatically adds all files specified through GAMS parameters (.gdx, .ref, .lst) to the Project Explorer.
- Allow to rename Project Explorer groups.
- Groups are closed if they are empty.
- If a group is closed the associated GAMS process will be stopped.
- Added drag and drop of files between groups.
- Added shortcut to focus Project Explorer (
Ctrl+J
) and allow to navigate using arrow keys to select a file. - Added "Select all", "Expand all" and "Collapse all" to the context menu.
- Added shortcut to select all files (
Ctrl+A
).
- Various
- Added context menu for tabs (offering different close actions).
- Added animation for groups with running GAMS processes.
- Studio comes to foreground when double clicking a Studio-associated file.
- The "About GAMS" dialog contains many important information like used GAMS version, system directory, or license information. It features a "Copy System Information" button which copies all of these information to easily attach them to a support request. The dialog has a second tab which gives an overview about solvers, their license status, and what kinds of capabilities they have.
- "File -> New..." dialog starts with a default for a new file name.
- "File -> Open..." (or drag'n'drop) of one file now focuses that file if it is already present in the Project Explorer.
- New entry "File -> Open... in new group" to force creation of new group (even if the is already present in the Project Explorer).
- "File -> Open..." (or drag'n'drop) of multiple files puts all files opened at once into a single group instead of individuals.
- Added shortcut to focus command line parameter edit field (
Ctrl+L
). - Added
Ctrl+F
as close shortcut for search dialog. - Changed shortcut to open Settings dialog to
F7
.
- Note
- This version of GAMS Studio does not support the Dark Mode of MacOS Mojave. Please disable this mode to use GAMS Studio.
GDXDUMP
- New options for writing out special values:
NAOut
,UndfOut
,PInfOut
,MInfOut
, andZeroOut
. - Fixed broken generated GAMS code, if
UelTable
option was used, but there were no UELs. - Lower and upper bounds of equations are dumped always now (even if their values are the default). This fixes a potential problem, that the equation type is unknown for the generated GAMS code.
- When writing CSV files the element text of set elements could not be written. Now with enabled option CSVSetText the element text of a set element is written as the last column in the CSV file.
GDXXRW
- Fixed a bug which could have caused a crash when reading merged cells from Excel using the GDXXXRW options
useRC
andcMErge=1
.
MODEL2TEX
- The new script
model2tex.sh
sets the required dependencies for the model2tex tool on Linux and macOS. Using this script is the recommended way for using model2tex. Calling the Python script directly is not recommended anymore since the used Python interpreter would need to be configured manually.model2tex.sh
uses the Python interpreter that comes with the GAMS distribution.
Object Oriented APIs
Python
- The
setup.py
script now installs the idx expert-level API.
Model Libraries
GAMS Data Library
New models added:
- csv2gdx2.gms : CSV2GDX Example 2 - Reading CSV Files with CSV2GDX (111)
- csv2gdx3.gms : CSV2GDX Example 3 - Reading Semicolon separated Data (112)
- csv2gdx4.gms : CSV2GDX Example 4 - Dealing with missing Labels and Duplicates (113)
- csv2gdx5.gms : CSV2GDX Example 5 - Reading more than one Parameter from a single Input File (114)
- csv2gdx6.gms : CSV2GDX Example 6 - Reading economic Data from the World Bank Data Catalog (115)
- csv2gdx7.gms : CSV2GDX Example 7 - Reading special Values with CSV2GDX (116)
- csv2gdx8.gms : CSV2GDX Example 8 - Reading an compressed encrypted Input File (117)
- csv2gdx9.gms : CSV2GDX Example 9 - Reading Options from an external File (118)
- GDXXRWExample17.gms : Reading several Scalars from Spreadsheet (119)
- GDXXRWExample18.gms : Reading Sets from Spreadsheet (120)
- GDXXRWExample19.gms : Writing Parameter to Spreadsheet including Zero Values (121)
- GDXXRWExample20.gms : Reading empty Cells with colMerge and reading merged Excel Ranges with cMerge (122)
- GDXXRWExample21.gms : Skipping empty Rows or Columns and Ignoring Rows or Columns (123)
- GDXDUMPExample1.gms : GDXDUMP - Adding double Quotes to an user defined Header when writing to CSV (124)
GAMS EMP Library
New model added:
GAMS Test Library
New models added:
- csv2gdx7.gms : CSV2GDX - Checking the Error Messages for incorrect Parameter Input (752)
- csv2gdx8.gms : CSV2GDX - Testing the valueDim Option (753)
- csv2gdx9.gms : CSV2GDX - Testing the Field Separator Tab (754)
- csv2gdx10.gms : CSV2GDX - Testing the Field Separator Semicolon (755)
- csv2gdx11.gms : CSV2GDX - Testing the Field Separator Comma (756)
- selkie01.gms : SELKIE test suite (757)
- selkie02.gms : SELKIE test suite (758)
- selkie03.gms : SELKIE test suite (759)
- selkie04.gms : SELKIE test suite (760)
- selkie05.gms : SELKIE test suite (761)
- selkie06.gms : SELKIE test suite (762)
- selkie07.gms : SELKIE test suite (763)
- selkie08.gms : SELKIE test suite (764)
- selkie09.gms : SELKIE test suite (765)
- selkie10.gms : SELKIE test suite (766)
- selkie11.gms : SELKIE test suite (767)
- selkie12.gms : SELKIE test suite: sub-diagonalization (768)
- selkie13.gms : SELKIE test suite: dualvar (769)
- selkie14.gms : SELKIE test suite: isolated implicit variable (770)
- selkie15.gms : SELKIE test suite: proximal perturbation (771)
- selkie16.gms : SELKIE test suite: obj variable setting (772)
- selkie17.gms : SELKIE test suite: obj variable setting (773)
- selkie18.gms : SELKIE test suite: obj variable not free (774)
- selkie19.gms : SELKIE test suite: equation marginal values (775)
- put12.gms : Testing put_utility solver (776)
- gdxxrw8.gms : GDXXRW - Testing the Option intAsText (777)
- gdxxrw9.gms : GDXXRW - Testing the Option checkDate (778)
- gdxxrw10.gms : GDXXRW - Testing cMerge when reading Sets with the values Option (779)
- gdxxrw11.gms : GDXXRW - Reading and writing special Values (780)
- gdxxrw12.gms : GDXXRW - Testing the skipEmpty and cMerge Option (781)
- gdxxrw13.gms : GDXXRW - Testing the values Option when reading or writing Set Elements (782)
- gdxxrw14.gms : GDXXRW - Testing different Excel Range Specifications (783)
- gdxdump2.gms : GDXDUMP - Testing the dumping Functionality on several GDX Files (784)
- gdxdump3.gms : GDXDUMP - Dumping special Values of a Parameter from GDX (785)
- gdxdump4.gms : GDXDUMP - Dumping special Values of Variable-Subfields from GDX (786)
- onmulti8.gms : Test for $onMultiR (787)
- implset1.gms : Test for Implicit Set Definition (788)
- emppy1.gms : Test an equilibrium model using emp python (789)
- emppy2.gms : Formulate the simplevi.gms example using emp python (790)
- emppy3.gms : Test a combination of optimization and vi agents using emp python (791)
- miqcp04.gms : Test behavior for integer infeasible model (792)
- duplic01.gms : Detecting duplicate entries in unsorted data (793)
Solver/Platform availability
x86 32bit MS Windows | x86 64bit MS Windows | x86 64bit Linux | x86 64bit macOS | Sparc 64bit SOLARIS | IBM Power 64bit AIX | |
---|---|---|---|---|---|---|
ALPHAECP | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
ANTIGONE 1.1 | ✔ | ✔ | ✔ | ✔ | ||
BARON | 18.5.8 | ✔ | ✔ | ✔ | ||
BDMLP | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
BONMIN 1.8 | ✔ | ✔ | ✔ | ✔ | ||
CBC 2.9 | ✔ | ✔ | ✔ | ✔ | ||
CONOPT 3 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
CONOPT 4 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
COUENNE 0.5 | ✔ | ✔ | ✔ | ✔ | ||
CPLEX 12.8 | 12.6 | ✔ | ✔ | ✔ | 12.6 | ✔ |
DECIS | ✔ | ✔ | ✔ | ✔ | ✔ | |
DICOPT | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
GLOMIQO 2.3 | ✔ | ✔ | ✔ | ✔ | ||
GUROBI 8.1 | 7.5 | ✔ | ✔ | ✔ | ✔ | |
GUSS | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
IPOPT 3.12 | ✔ | ✔ | ✔ | ✔ | ||
KESTREL | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
KNITRO 11.1 | 11.0 | ✔ | ✔ | ✔ | ||
LGO | ✔ | ✔ | ✔ | ✔ | ✔ | |
LINDO 12.0 | ✔ | ✔ | ✔ | ✔ | ||
LINDOGLOBAL 12.0 | ✔ | ✔ | ✔ | ✔ | ||
LOCALSOLVER 8.0 | ✔ | ✔ | ✔ | ✔ | ||
MILES | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
MINOS | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
MOSEK 8 | ✔ | ✔ | ✔ | ✔ | ||
MSNLP | ✔ | ✔ | ✔ | ✔ | ✔ | |
NLPEC | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
ODHCPLEX 4 | ✔ | ✔ | ||||
OQNLP | ✔ | 32bit | ||||
PATH | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
SBB | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
SCIP 6.0 | ✔ | ✔ | ✔ | ✔ | ||
SNOPT | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
SOLVEENGINE | ✔ | ✔ | ✔ | ✔ | ||
SOPLEX 4.0 | ✔ | ✔ | ✔ | ✔ | ||
XA | ✔ | ✔ | ✔ | |||
XPRESS 33.01 | ✔ | ✔ | ✔ | ✔ | 32.01 | 29.01 |