| {{## def.setupKeyword: | 
|   {{ | 
|     var $lvl = it.level; | 
|     var $dataLvl = it.dataLevel; | 
|     var $schema = it.schema[$keyword]; | 
|     var $schemaPath = it.schemaPath + it.util.getProperty($keyword); | 
|     var $errSchemaPath = it.errSchemaPath + '/' + $keyword; | 
|     var $breakOnError = !it.opts.allErrors; | 
|     var $errorKeyword; | 
|   | 
|     var $data = 'data' + ($dataLvl || ''); | 
|     var $valid = 'valid' + $lvl; | 
|     var $errs = 'errs__' + $lvl; | 
|   }} | 
| #}} | 
|   | 
|   | 
| {{## def.setCompositeRule: | 
|   {{ | 
|     var $wasComposite = it.compositeRule; | 
|     it.compositeRule = $it.compositeRule = true; | 
|   }} | 
| #}} | 
|   | 
|   | 
| {{## def.resetCompositeRule: | 
|   {{ it.compositeRule = $it.compositeRule = $wasComposite; }} | 
| #}} | 
|   | 
|   | 
| {{## def.setupNextLevel: | 
|   {{ | 
|     var $it = it.util.copy(it); | 
|     var $closingBraces = ''; | 
|     $it.level++; | 
|     var $nextValid = 'valid' + $it.level; | 
|   }} | 
| #}} | 
|   | 
|   | 
| {{## def.ifValid: | 
|   {{? $breakOnError }} | 
|     if ({{=$valid}}) { | 
|     {{ $closingBraces += '}'; }} | 
|   {{?}} | 
| #}} | 
|   | 
|   | 
| {{## def.ifResultValid: | 
|   {{? $breakOnError }} | 
|     if ({{=$nextValid}}) { | 
|     {{ $closingBraces += '}'; }} | 
|   {{?}} | 
| #}} | 
|   | 
|   | 
| {{## def.elseIfValid: | 
|   {{? $breakOnError }} | 
|     {{ $closingBraces += '}'; }} | 
|     else { | 
|   {{?}} | 
| #}} | 
|   | 
|   | 
| {{## def.nonEmptySchema:_schema: | 
|   (it.opts.strictKeywords | 
|     ? (typeof _schema == 'object' && Object.keys(_schema).length > 0) | 
|       || _schema === false | 
|     : it.util.schemaHasRules(_schema, it.RULES.all)) | 
| #}} | 
|   | 
|   | 
| {{## def.strLength: | 
|   {{? it.opts.unicode === false }} | 
|     {{=$data}}.length | 
|   {{??}} | 
|     ucs2length({{=$data}}) | 
|   {{?}} | 
| #}} | 
|   | 
|   | 
| {{## def.willOptimize: | 
|   it.util.varOccurences($code, $nextData) < 2 | 
| #}} | 
|   | 
|   | 
| {{## def.generateSubschemaCode: | 
|   {{ | 
|     var $code = it.validate($it); | 
|     $it.baseId = $currentBaseId; | 
|   }} | 
| #}} | 
|   | 
|   | 
| {{## def.insertSubschemaCode: | 
|   {{= it.validate($it) }} | 
|   {{ $it.baseId = $currentBaseId; }} | 
| #}} | 
|   | 
|   | 
| {{## def._optimizeValidate: | 
|   it.util.varReplace($code, $nextData, $passData) | 
| #}} | 
|   | 
|   | 
| {{## def.optimizeValidate: | 
|   {{? {{# def.willOptimize}} }} | 
|     {{= {{# def._optimizeValidate }} }} | 
|   {{??}} | 
|     var {{=$nextData}} = {{=$passData}}; | 
|     {{= $code }} | 
|   {{?}} | 
| #}} | 
|   | 
|   | 
| {{## def.$data: | 
|   {{ | 
|     var $isData = it.opts.$data && $schema && $schema.$data | 
|       , $schemaValue; | 
|   }} | 
|   {{? $isData }} | 
|     var schema{{=$lvl}} = {{= it.util.getData($schema.$data, $dataLvl, it.dataPathArr) }}; | 
|     {{ $schemaValue = 'schema' + $lvl; }} | 
|   {{??}} | 
|     {{ $schemaValue = $schema; }} | 
|   {{?}} | 
| #}} | 
|   | 
|   | 
| {{## def.$dataNotType:_type: | 
|   {{?$isData}} ({{=$schemaValue}} !== undefined && typeof {{=$schemaValue}} != _type) || {{?}} | 
| #}} | 
|   | 
|   | 
| {{## def.check$dataIsArray: | 
|   if (schema{{=$lvl}} === undefined) {{=$valid}} = true; | 
|   else if (!Array.isArray(schema{{=$lvl}})) {{=$valid}} = false; | 
|   else { | 
| #}} | 
|   | 
|   | 
| {{## def.numberKeyword: | 
|   {{? !($isData || typeof $schema == 'number') }} | 
|     {{ throw new Error($keyword + ' must be number'); }} | 
|   {{?}} | 
| #}} | 
|   | 
|   | 
| {{## def.beginDefOut: | 
|   {{ | 
|     var $$outStack = $$outStack || []; | 
|     $$outStack.push(out); | 
|     out = ''; | 
|   }} | 
| #}} | 
|   | 
|   | 
| {{## def.storeDefOut:_variable: | 
|   {{ | 
|     var _variable = out; | 
|     out = $$outStack.pop(); | 
|   }} | 
| #}} | 
|   | 
|   | 
| {{## def.dataPath:(dataPath || ''){{? it.errorPath != '""'}} + {{= it.errorPath }}{{?}}#}} | 
|   | 
| {{## def.setParentData: | 
|   {{ | 
|     var $parentData = $dataLvl ? 'data' + (($dataLvl-1)||'') : 'parentData' | 
|       , $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; | 
|   }} | 
| #}} | 
|   | 
| {{## def.passParentData: | 
|   {{# def.setParentData }} | 
|   , {{= $parentData }} | 
|   , {{= $parentDataProperty }} | 
| #}} | 
|   | 
|   | 
| {{## def.iterateProperties: | 
|   {{? $ownProperties }} | 
|     {{=$dataProperties}} = {{=$dataProperties}} || Object.keys({{=$data}}); | 
|     for (var {{=$idx}}=0; {{=$idx}}<{{=$dataProperties}}.length; {{=$idx}}++) { | 
|       var {{=$key}} = {{=$dataProperties}}[{{=$idx}}]; | 
|   {{??}} | 
|     for (var {{=$key}} in {{=$data}}) { | 
|   {{?}} | 
| #}} | 
|   | 
|   | 
| {{## def.noPropertyInData: | 
|   {{=$useData}} === undefined | 
|   {{? $ownProperties }} | 
|     || !{{# def.isOwnProperty }} | 
|   {{?}} | 
| #}} | 
|   | 
|   | 
| {{## def.isOwnProperty: | 
|   Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($propertyKey)}}') | 
| #}} |