{{# def.definitions }} {{# def.errors }} {{# def.missing }} {{# def.setupKeyword }} {{# def.setupNextLevel }}

{{## def.propertyInData:

{{=$data}}{{= it.util.getProperty($property) }} !== undefined
{{? $ownProperties }}
  && Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($property)}}')
{{?}}

#}}

{{

var $schemaDeps = {}
  , $propertyDeps = {}
  , $ownProperties = it.opts.ownProperties;

for ($property in $schema) {
  var $sch = $schema[$property];
  var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps;
  $deps[$property] = $sch;
}

}}

var {{=$errs}} = errors;

{{ var $currentErrorPath = it.errorPath; }}

var missing{{=$lvl}}; {{ for (var $property in $propertyDeps) { }}

{{ $deps = $propertyDeps[$property]; }}
{{? $deps.length }}
  if ({{# def.propertyInData }}
    {{? $breakOnError }}
        && ({{# def.checkMissingProperty:$deps }})) {
        {{# def.errorMissingProperty:'dependencies' }}
    {{??}}
      ) {
        {{~ $deps:$propertyKey }}
          {{# def.allErrorsMissingProperty:'dependencies' }}
        {{~}}
    {{?}}
  } {{# def.elseIfValid }}
{{?}}

{{ } }}

{{

it.errorPath = $currentErrorPath;
var $currentBaseId = $it.baseId;

}}

{{ for (var $property in $schemaDeps) { }}

{{ var $sch = $schemaDeps[$property]; }}
{{? {{# def.nonEmptySchema:$sch }} }}
  {{=$nextValid}} = true;

  if ({{# def.propertyInData }}) {
    {{ 
      $it.schema = $sch;
      $it.schemaPath = $schemaPath + it.util.getProperty($property);
      $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property);
    }}

    {{# def.insertSubschemaCode }}
  }

  {{# def.ifResultValid }}
{{?}}

{{ } }}

{{? $breakOnError }}

{{= $closingBraces }}
if ({{=$errs}} == errors) {

{{?}}

{{# def.cleanUp }}