1<?php
2/*************************************************************************************
3 * aimms.php
4 * --------
5 * Author: Guido Diepen (guido.diepen@aimms.com)
6 * Copyright: (c) 2011 Guido Diepen (http://www.aimms.com)
7 * Release Version: 1.0.9.1
8 * Date Started: 2011/05/05
9 *
10 * AIMMS language file for GeSHi.
11 *
12 * CHANGES
13 * -------
14 * 2004/07/14 (1.0.0)
15 *  -  First Release
16 *
17 * TODO (updated 2004/07/14)
18 * -------------------------
19 * * Make sure the last few function I may have missed
20 *   (like eval()) are included for highlighting
21 * * Split to several files - php4, php5 etc
22 *
23 *************************************************************************************
24 *
25 *     This file is part of GeSHi.
26 *
27 *   GeSHi is free software; you can redistribute it and/or modify
28 *   it under the terms of the GNU General Public License as published by
29 *   the Free Software Foundation; either version 2 of the License, or
30 *   (at your option) any later version.
31 *
32 *   GeSHi is distributed in the hope that it will be useful,
33 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
34 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
35 *   GNU General Public License for more details.
36 *
37 *   You should have received a copy of the GNU General Public License
38 *   along with GeSHi; if not, write to the Free Software
39 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
40 *
41 ************************************************************************************/
42
43$language_data = array(
44    'LANG_NAME' => 'AIMMS3',
45    'COMMENT_SINGLE' => array(1 => '!'),
46    'COMMENT_MULTI' => array('/*' => '*/'),
47    'HARDQUOTE' => array("'", "'"),
48    'HARDESCAPE' => array("'", "\\"),
49    'HARDCHAR' => "\\",
50    'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
51    'QUOTEMARKS' => array('"'),
52    'OBJECT_SPLITTERS' => array(),
53    'REGEXPS' => array(),
54    'STRICT_MODE_APPLIES' => GESHI_MAYBE,
55    'SCRIPT_DELIMITERS' => array(),
56    'HIGHLIGHT_STRICT_BLOCK' => array(),
57    'ESCAPE_CHAR' => '',
58    'KEYWORDS' => array(
59        1 => array(
60            'if', 'then', 'else', 'endif', 'elseif', 'for', 'do', 'while' , 'endfor' , 'endwhile', 'break', 'switch', 'endswitch',
61            'display', 'return', 'in', 'apply'
62
63            ),
64        2 => array(
65            'main model' , 'declaration section', 'procedure', 'endprocedure', 'endmodel', 'endsection' , 'set', 'parameter',
66            'string parameter', 'element parameter', 'quantity'
67            ),
68        3 => array(
69            'identifier', 'index', 'index domain', 'body'
70            ),
71        4 => array(
72            'ActiveCard','Card','ConvertUnit','DistributionCumulative','DistributionDensity','DistributionDeviation',
73            'DistributionInverseCumulative','DistributionInverseDensity','DistributionKurtosis','DistributionMean',
74            'DistributionSkewness','DistributionVariance','Element','EvaluateUnit','First','FormatString','Last',
75            'Ord','Unit','Val','Aggregate','AttributeToString','CaseCompareIdentifier','CaseCreateDifferenceFile',
76            'CloseDataSource','CreateTimeTable','ConstraintVariables','ConvertReferenceDate','CloneElement',
77            'FindNthString','FindReplaceNthString','FindReplaceStrings','FindString','StringOccurrences',
78            'CurrentToMoment','CurrentToString','CurrentToTimeSlot','DaylightsavingEndDate','DaylightsavingStartDate',
79            'DeclaredSubset','DomainIndex','IndexRange','IsRunningAsViewer','ListingFileCopy','ListingFileDelete',
80            'DirectoryGetFiles','DirectoryGetSubdirectories','DirectSQL','Disaggregate','ElementCast','ElementRange',
81            'EnvironmentGetString','EnvironmentSetString','errh::Adapt','errh::Attribute','errh::Category',
82            'errh::Code','errh::Column','errh::CreationTime','errh::Filename','errh::InsideCategory',
83            'errh::IsMarkedAsHandled','errh::Line','errh::MarkAsHandled','errh::Message','errh::Multiplicity',
84            'errh::Node','errh::NumberOfLocations','errh::Severity','ExcelAddNewSheet','ExcelAssignParameter',
85            'ExcelAssignSet','ExcelAssignTable','ExcelAssignValue','ExcelClearRange','ExcelCloseWorkbook',
86            'ExcelColumnName','ExcelColumnNumber','ExcelCopyRange','ExcelCreateWorkbook','ExcelDeleteSheet',
87            'ExcelPrint','ExcelRetrieveParameter','ExcelRetrieveSet','ExcelRetrieveTable','ExcelRetrieveValue',
88            'ExcelRunMacro','ExcelSaveWorkbook','ExcelSetActiveSheet','ExcelSetUpdateLinksBehavior',
89            'ExcelSetVisibility','FindUsedElements','GenerateCUT','GMP::Coefficient::Get',
90            'GMP::Coefficient::GetQuadratic','GMP::Coefficient::Set','GMP::Coefficient::SetQuadratic',
91            'GMP::Column::Add','GMP::Column::Delete','GMP::Column::Freeze','GMP::Column::GetLowerbound',
92            'GMP::Column::GetScale','GMP::Column::GetStatus','GMP::Column::GetType','GMP::Column::GetUpperbound',
93            'GMP::Column::SetAsObjective','GMP::Column::SetLowerbound','GMP::Column::SetType',
94            'GMP::Column::SetUpperbound','GMP::Column::Unfreeze','GMP::Instance::AddIntegerEliminationRows',
95            'GMP::Instance::CalculateSubGradient','GMP::Instance::Copy','GMP::Instance::CreateDual',
96            'GMP::Instance::CreateMasterMip','GMP::Instance::CreatePresolved',
97            'GMP::SolverSession::CreateProgressCategory','GMP::Instance::CreateProgressCategory',
98            'GMP::Instance::CreateSolverSession','GMP::Stochastic::CreateBendersRootproblem',
99            'GMP::Instance::Delete','GMP::Instance::DeleteIntegerEliminationRows',
100            'GMP::Instance::DeleteSolverSession','GMP::Instance::FindApproximatelyFeasibleSolution',
101            'GMP::Instance::FixColumns','GMP::Instance::Generate','GMP::Instance::GenerateRobustCounterpart',
102            'GMP::Instance::GenerateStochasticProgram','GMP::SolverSession::GetCallbackInterruptStatus',
103            'GMP::SolverSession::WaitForCompletion','GMP::SolverSession::WaitForSingleCompletion',
104            'GMP::SolverSession::ExecutionStatus','GMP::Instance::GetDirection','GMP::Instance::GetLinearObjective',
105            'GMP::Instance::GetMathematicalProgrammingType','GMP::Instance::GetMemoryUsed',
106            'GMP::Instance::GetNumberOfColumns','GMP::Instance::GetNumberOfIndicatorRows',
107            'GMP::Instance::GetNumberOfIntegerColumns','GMP::Instance::GetNumberOfNonlinearColumns',
108            'GMP::Instance::GetNumberOfNonlinearNonzeros','GMP::Instance::GetNumberOfNonlinearRows',
109            'GMP::Instance::GetNumberOfNonzeros','GMP::Instance::GetNumberOfRows',
110            'GMP::Instance::GetNumberOfSOS1Rows','GMP::Instance::GetNumberOfSOS2Rows',
111            'GMP::Instance::GetObjective','GMP::Instance::GetOptionValue','GMP::Instance::GetSolver',
112            'GMP::Instance::GetSymbolicMathematicalProgram','GMP::Instance::MemoryStatistics',
113            'GMP::Instance::Rename','GMP::Instance::SetCallbackAddCut','GMP::Instance::SetCallbackBranch',
114            'GMP::Instance::SetCallbackHeuristic','GMP::Instance::SetCallbackIncumbent',
115            'GMP::Instance::SetCallbackIterations','GMP::Instance::SetCallbackNewIncumbent',
116            'GMP::Instance::SetCallbackStatusChange','GMP::Instance::SetCutoff','GMP::Instance::SetDirection',
117            'GMP::Instance::SetMathematicalProgrammingType','GMP::Instance::SetSolver','GMP::Instance::Solve',
118            'GMP::Stochastic::GetObjectiveBound','GMP::Stochastic::GetRelativeWeight',
119            'GMP::Stochastic::GetRepresentativeScenario','GMP::Stochastic::UpdateBendersSubproblem',
120            'GMP::Linearization::Add','GMP::Linearization::AddSingle','GMP::Linearization::Delete',
121            'GMP::Linearization::GetDeviation','GMP::Linearization::GetDeviationBound',
122            'GMP::Linearization::GetLagrangeMultiplier','GMP::Linearization::GetType',
123            'GMP::Linearization::GetWeight','GMP::Linearization::RemoveDeviation',
124            'GMP::Linearization::SetDeviationBound','GMP::Linearization::SetType',
125            'GMP::Linearization::SetWeight','GMP::ProgressWindow::DeleteCategory',
126            'GMP::ProgressWindow::DisplayLine','GMP::ProgressWindow::DisplayProgramStatus',
127            'GMP::ProgressWindow::DisplaySolver','GMP::ProgressWindow::DisplaySolverStatus',
128            'GMP::ProgressWindow::FreezeLine','GMP::ProgressWindow::UnfreezeLine',
129            'GMP::QuadraticCoefficient::Get','GMP::QuadraticCoefficient::Set','GMP::Row::Activate',
130            'GMP::Stochastic::AddBendersFeasibilityCut','GMP::Stochastic::AddBendersOptimalityCut',
131            'GMP::Stochastic::BendersFindFeasibilityReference','GMP::Stochastic::MergeSolution',
132            'GMP::Row::Add','GMP::Row::Deactivate','GMP::Row::Delete','GMP::Row::DeleteIndicatorCondition',
133            'GMP::Row::Generate','GMP::Row::GetConvex','GMP::Row::GetIndicatorColumn',
134            'GMP::Row::GetIndicatorCondition','GMP::Row::GetLeftHandSide','GMP::Row::GetRelaxationOnly',
135            'GMP::Row::GetRightHandSide','GMP::Row::GetScale','GMP::Row::GetStatus','GMP::Row::GetType',
136            'GMP::Row::SetConvex','GMP::Row::SetIndicatorCondition','GMP::Row::SetLeftHandSide',
137            'GMP::Row::SetRelaxationOnly','GMP::Row::SetRightHandSide','GMP::Row::SetType',
138            'GMP::Solution::Check','GMP::Solution::Copy','GMP::Solution::Count','GMP::Solution::Delete',
139            'GMP::Solution::DeleteAll','GMP::Solution::GetColumnValue','GMP::Solution::GetCPUSecondsUsed',
140            'GMP::Solution::GetDistance','GMP::Solution::GetFirstOrderDerivative',
141            'GMP::Solution::GetIterationsUsed','GMP::Solution::GetNodesUsed','GMP::Solution::GetLinearObjective',
142            'GMP::Solution::GetMemoryUsed','GMP::Solution::GetObjective','GMP::Solution::GetPenalizedObjective',
143            'GMP::Solution::GetProgramStatus','GMP::Solution::GetRowValue','GMP::Solution::GetSolutionsSet',
144            'GMP::Solution::GetSolverStatus','GMP::Solution::IsDualDegenerated','GMP::Solution::IsInteger',
145            'GMP::Solution::IsPrimalDegenerated','GMP::Solution::SetMIPStartFlag','GMP::Solution::Move',
146            'GMP::Solution::RandomlyGenerate','GMP::Solution::RetrieveFromModel',
147            'GMP::Solution::RetrieveFromSolverSession','GMP::Solution::SendToModel',
148            'GMP::Solution::SendToModelSelection','GMP::Solution::SendToSolverSession',
149            'GMP::Solution::SetIterationCount','GMP::Solution::SetProgramStatus','GMP::Solution::SetSolverStatus',
150            'GMP::Solution::UpdatePenaltyWeights','GMP::Solution::ConstructMean',
151            'GMP::SolverSession::AsynchronousExecute','GMP::SolverSession::Execute',
152            'GMP::SolverSession::Interrupt','GMP::SolverSession::AddLinearization',
153            'GMP::SolverSession::GenerateBranchLowerBound','GMP::SolverSession::GenerateBranchUpperBound',
154            'GMP::SolverSession::GenerateBranchRow','GMP::SolverSession::GenerateCut',
155            'GMP::SolverSession::GenerateBinaryEliminationRow','GMP::SolverSession::GetCPUSecondsUsed',
156            'GMP::SolverSession::GetHost','GMP::SolverSession::GetInstance',
157            'GMP::SolverSession::GetIterationsUsed','GMP::SolverSession::GetNodesLeft',
158            'GMP::SolverSession::GetNodesUsed','GMP::SolverSession::GetNodeNumber',
159            'GMP::SolverSession::GetNodeObjective','GMP::SolverSession::GetNumberOfBranchNodes',
160            'GMP::SolverSession::GetLinearObjective','GMP::SolverSession::GetMemoryUsed',
161            'GMP::SolverSession::GetObjective','GMP::SolverSession::GetOptionValue',
162            'GMP::SolverSession::GetProgramStatus','GMP::SolverSession::GetSolver',
163            'GMP::SolverSession::GetSolverStatus','GMP::SolverSession::RejectIncumbent',
164            'GMP::Event::Create','GMP::Event::Delete','GMP::Event::Reset','GMP::Event::Set',
165            'GMP::SolverSession::SetObjective','GMP::SolverSession::SetOptionValue',
166            'GMP::Instance::SetCPUSecondsLimit','GMP::Instance::SetIterationLimit',
167            'GMP::Instance::SetMemoryLimit','GMP::Instance::SetOptionValue','GMP::Tuning::SolveSingleMPS',
168            'GMP::Tuning::TuneMultipleMPS','GMP::Tuning::TuneSingleGMP',
169            'GMP::Solver::GetAsynchronousSessionsLimit','GMP::Robust::EvaluateAdjustableVariables',
170            'GenerateXML','GetDatasourceProperty','ReadGeneratedXML','ReadXML','ReferencedIdentifiers',
171            'WriteXML','IdentifierAttributes','IdentifierDimension','IsRuntimeIdentifier','IdentifierMemory',
172            'IdentifierMemoryStatistics','IdentifierText','IdentifierType','IdentifierUnit','ScalarValue',
173            'SectionIdentifiers','SubRange','MemoryInUse','CommitTransaction','RollbackTransaction',
174            'MemoryStatistics','me::AllowedAttribute','me::ChangeType','me::ChangeTypeAllowed','me::Children',
175            'me::ChildTypeAllowed','me::Compile','me::Create','me::CreateLibrary','me::Delete','me::ExportNode',
176            'me::GetAttribute','me::ImportLibrary','me::ImportNode','me::IsRunnable','me::Move','me::Parent',
177            'me::Rename','me::SetAttribute','MomentToString','MomentToTimeSlot','OptionGetValue',
178            'OptionGetKeywords','OptionGetString','OptionSetString','OptionSetValue','PeriodToString',
179            'ProfilerContinue','ProfilerPause','ProfilerRestart','RestoreInactiveElements',
180            'RetrieveCurrentVariableValues','SetAddRecursive','SetElementAdd','SetElementRename',
181            'SQLColumnData','SQLCreateConnectionString','SQLDriverName','SQLNumberOfColumns',
182            'SQLNumberOfDrivers','SQLNumberOfTables','SQLNumberOfViews','SQLTableName','SQLViewName',
183            'StartTransaction','StringToElement','StringToMoment','StringToTimeSlot','TestDatabaseColumn',
184            'TestDatabaseTable','TestDataSource','TestDate','TimeslotCharacteristic','TimeslotToMoment',
185            'TimeslotToString','TimeZoneOffset','VariableConstraints','PageOpen','PageOpenSingle','PageClose',
186            'PageGetActive','PageSetFocus','PageGetFocus','PageSetCursor','PageRefreshAll','PageGetChild',
187            'PageGetParent','PageGetNext','PageGetPrevious','PageGetNextInTreeWalk','PageGetUsedIdentifiers',
188            'PageGetTitle','PageGetAll','PageCopyTableToClipboard','PageCopyTableToExcel','PrintPage',
189            'PrintPageCount','PrintStartReport','PrintEndReport','PivotTableReloadState','PivotTableSaveState',
190            'PivotTableDeleteState','FileSelect','FileSelectNew','FileDelete','FileExists','FileCopy',
191            'FileMove','FileView','FileEdit','FilePrint','FileTime','FileTouch','FileAppend','FileGetSize',
192            'DirectorySelect','DirectoryCreate','DirectoryDelete','DirectoryExists','DirectoryCopy',
193            'DirectoryMove','DirectoryGetCurrent','DialogProgress','DialogMessage','DialogError',
194            'StatusMessage','DialogAsk','DialogGetString','DialogGetDate','DialogGetNumber','DialogGetElement',
195            'DialogGetElementByText','DialogGetElementByData','DialogGetPassword','DialogGetColor','CaseNew',
196            'CaseFind','CaseCreate','CaseLoadCurrent','CaseMerge','CaseLoadIntoCurrent','CaseSelect',
197            'CaseSelectNew','CaseSetCurrent','CaseSave','CaseSaveAll','CaseSaveAs','CaseSelectMultiple',
198            'CaseGetChangedStatus','CaseSetChangedStatus','CaseDelete','CaseGetType','CaseGetDatasetReference',
199            'CaseWriteToSingleFile','CaseReadFromSingleFile','DatasetNew','DatasetFind','DatasetCreate',
200            'DatasetLoadCurrent','DatasetMerge','DatasetLoadIntoCurrent','DatasetSelect','DatasetSelectNew',
201            'DatasetSetCurrent','DatasetSave','DatasetSaveAll','DatasetSaveAs','DatasetGetChangedStatus',
202            'DatasetSetChangedStatus','DatasetDelete','DatasetGetCategory','DataFileGetName',
203            'DataFileGetAcronym','DataFileSetAcronym','DataFileGetComment','DataFileSetComment',
204            'DataFileGetPath','DataFileGetTime','DataFileGetOwner','DataFileGetGroup','DataFileReadPermitted',
205            'DataFileWritePermitted','DataFileExists','DataFileCopy','DataCategoryContents','CaseTypeContents',
206            'CaseTypeCategories','Execute','OpenDocument','TestInternetConnection','GeoFindCoordinates',
207            'ShowHelpTopic','Delay','ScheduleAt','ExitAimms','SessionArgument','SessionHasVisibleGUI',
208            'ProjectDeveloperMode','DebuggerBreakpoint','ShowProgressWindow','ShowMessageWindow',
209            'SolverGetControl','SolverReleaseControl','ProfilerStart','DataManagerImport','DataManagerExport',
210            'DataManagerFileNew','DataManagerFileOpen','DataManagerFileGetCurrent','DataImport220',
211            'SecurityGetUsers','SecurityGetGroups','UserColorAdd','UserColorDelete','UserColorGetRGB',
212            'UserColorModify','LicenseNumber','LicenseType','LicenseStartDate','LicenseExpirationDate',
213            'LicenseMaintenanceExpirationDate','VARLicenseExpirationDate','AimmsRevisionString',
214            'VARLicenseCreate','HistogramCreate','HistogramDelete','HistogramSetDomain',
215            'HistogramAddObservation','HistogramGetFrequencies','HistogramGetBounds',
216            'HistogramGetObservationCount','HistogramGetAverage','HistogramGetDeviation',
217            'HistogramGetSkewness','HistogramGetKurtosis','DateDifferenceDays','DateDifferenceYearFraction',
218            'PriceFractional','PriceDecimal','RateEffective','RateNominal','DepreciationLinearLife',
219            'DepreciationLinearRate','DepreciationNonLinearSumOfYear','DepreciationNonLinearLife',
220            'DepreciationNonLinearFactor','DepreciationNonLinearRate','DepreciationSum',
221            'InvestmentConstantPresentValue','InvestmentConstantFutureValue',
222            'InvestmentConstantPeriodicPayment','InvestmentConstantInterestPayment',
223            'InvestmentConstantPrincipalPayment','InvestmentConstantCumulativePrincipalPayment',
224            'InvestmentConstantCumulativeInterestPayment','InvestmentConstantNumberPeriods',
225            'InvestmentConstantRateAll','InvestmentConstantRate','InvestmentVariablePresentValue',
226            'InvestmentVariablePresentValueInperiodic','InvestmentSingleFutureValue',
227            'InvestmentVariableInternalRateReturnAll','InvestmentVariableInternalRateReturn',
228            'InvestmentVariableInternalRateReturnInperiodicAll','InvestmentVariableInternalRateReturnInperiodic',
229            'InvestmentVariableInternalRateReturnModified','SecurityDiscountedPrice',
230            'SecurityDiscountedRedemption','SecurityDiscountedYield','SecurityDiscountedRate',
231            'TreasuryBillPrice','TreasuryBillYield','TreasuryBillBondEquivalent','SecurityMaturityPrice',
232            'SecurityMaturityCouponRate','SecurityMaturityYield','SecurityMaturityAccruedInterest',
233            'SecurityCouponNumber','SecurityCouponPreviousDate','SecurityCouponNextDate','SecurityCouponDays',
234            'SecurityCouponDaysPreSettlement','SecurityCouponDaysPostSettlement','SecurityPeriodicPrice',
235            'SecurityPeriodicRedemption','SecurityPeriodicCouponRate','SecurityPeriodicYieldAll',
236            'SecurityPeriodicYield','SecurityPeriodicAccruedInterest','SecurityPeriodicDuration',
237            'SecurityPeriodicDurationModified','Abs','AtomicUnit','Ceil','Character','CharacterNumber','Cube',
238            'Degrees','Div','Exp','FileRead','Floor','Log','Log10','Mapval','Max','Min','Mod','Power',
239            'Radians','Round','Sign','Sqr','Sqrt','StringCapitalize','StringLength','StringToLower',
240            'StringToUnit','StringToUpper','SubString','Trunc','Binomial','NegativeBinomial','Poisson',
241            'Geometric','HyperGeometric','Uniform','Normal','LogNormal','Triangular','Exponential','Weibull',
242            'Beta','Gamma','Logistic','Pareto','ExtremeValue','Precision','Factorial','Combination',
243            'Permutation','Errorf','Cos','Sin','Tan','ArcCos','ArcSin','ArcTan','Cosh','Sinh','Tanh',
244            'ArcCosh','ArcSinh','ArcTanh'
245            )
246        ),
247    'SYMBOLS' => array(
248        0 => array(
249            '(', ')', '[', ']', '{', '}',
250            '%', '&', '|', '/',
251            '<', '>', '>=' , '<=', ':=',
252            '=', '-', '+', '*',
253            '.', ','
254            )
255        ),
256    'CASE_SENSITIVE' => array(
257        GESHI_COMMENTS => false,
258        1 => false,
259        2 => false,
260        3 => false,
261        4 => false
262        ),
263    'STYLES' => array(
264        'KEYWORDS' => array(
265            1 => 'color: #0000FF;',
266            2 => 'color: #000000; font-weight: bold;',
267            3 => 'color: #404040;',
268            4 => 'color: #990000; font-weight: bold;'
269            ),
270        'BRACKETS' => array(
271            0 => 'color: #009900;'
272            ),
273        'STRINGS' => array(
274            0 => 'color: #808080; font-style: italic ',
275            'HARD' => 'color: #808080; font-style: italic'
276            ),
277        'NUMBERS' => array(
278            0 => 'color: #cc66cc;',
279            GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
280            GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
281            GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
282            ),
283        'COMMENTS' => array(
284            1 => 'color: #008000; font-style: italic;',
285            'MULTI' => 'color: #008000; font-style: italic;'
286            ),
287
288        'METHODS' => array(
289            1 => 'color: #004000;',
290            2 => 'color: #004000;'
291            ),
292        'SYMBOLS' => array(
293            0 => 'color: #339933;',
294            1 => 'color: #000000; font-weight: bold;'
295            ),
296        'REGEXPS' => array(
297            ),
298        'SCRIPT' => array(
299            0 => '',
300            1 => '',
301            2 => '',
302            3 => '',
303            4 => '',
304            5 => ''
305            ),
306        'ESCAPE_CHAR' => array()
307        ),
308    'URLS' => array(
309        1 => '',
310        2 => '',
311        3 => '',
312        4 => ''
313        ),
314    'OOLANG' => false,
315    'TAB_WIDTH' => 4
316);
317