contract Implementation {
  /**
   * @notice Updates the Wallet implementation
   * @param _imp New implementation address
   * @dev The wallet implementation is stored on the storage slot
   *   defined by the address of the wallet itself
   *   WARNING updating this value may break the wallet and users
   *   must be confident that the new implementation is safe.
   */
  function _setImplementation(address _imp) internal {
    assembly {
      sstore(address(), _imp)
    }
  }

  /**
   * @notice Returns the Wallet implementation
   * @return _imp The address of the current Wallet implementation
   */
  function _getImplementation() internal view returns (address _imp) {
    assembly {
      _imp := sload(address())
    }
  }
}
/**
 * @dev Allows modules to access the implementation slot
 */
function _setImplementation(address _imp) internal {
  assembly {
    sstore(address(), _imp)
  }
}

/**
 * @notice Updates the Wallet implementation
 * @param _imp New implementation address
 * @dev The wallet implementation is stored on the storage slot
 *   defined by the address of the wallet itself
 *   WARNING updating this value may break the wallet and users
 *   must be confident that the new implementation is safe.
 */