function hirerCancel(
    bytes16 _jobId,
    address _hirer,
    address _contractor,
    uint256 _value,
    uint256 _fee
  ) external onlyHirer(_hirer)
  {
    
    bytes32 jobHash = getJobHash(
      _jobId,
      _hirer,
      _contractor,
      _value,
      _fee);

    
    require(jobEscrows[jobHash].exists);

    require(jobEscrows[jobHash].hirerCanCancelAfter > 0);
    require(jobEscrows[jobHash].status == STATUS_JOB_CREATED);
    require(jobEscrows[jobHash].hirerCanCancelAfter < block.timestamp);

    uint256 jobValue = hirerEscrowMap[_hirer][jobHash];

    
    require(jobValue > 0 && jobValue == _value);

    
    require(jobValue >= jobValue.sub(_fee));

    
    require(totalInEscrow >= jobValue && totalInEscrow > 0);

    delete jobEscrows[jobHash];
    delete  hirerEscrowMap[msg.sender][jobHash];
    emit CancelledByHirer(jobHash, msg.sender);

    totalInEscrow = totalInEscrow.sub(jobValue);

    _hirer.transfer(jobValue);
  }