anchor.diff: -// Copyright 2021 Google LLC
  -//
  -// Licensed under the Apache License, Version 2.0 (the "License");
  -// you may not use this file except in compliance with the License.
  -// You may obtain a copy of the License at
  -//
  -// https://www.apache.org/licenses/LICENSE-2.0
  -//
  -// Unless required by applicable law or agreed to in writing, software
  -// distributed under the License is distributed on an "AS IS" BASIS,
  -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  -// See the License for the specific language governing permissions and
  -// limitations under the License.
  +// Copyright 2020 The Chromium Authors. All rights reserved.
  +// Use of this source code is governed by a BSD-style license that can be
  +// found in the LICENSE file.
   
   // ignore_for_file: public_member_api_docs
   // ignore_for_file: deprecated_member_use_from_same_package
  +// TODO(gonzchristian): Document all public members
   
   import 'dart:async';
   import 'dart:io' show Platform;
  
positive.code: abstract class Ad {
    /// Default constructor, used by subclasses.
    const Ad({@required this.adUnitId, @required this.listener})
        : assert(adUnitId != null ),
          assert(listener != null);
  
    /// Receive callbacks from [Ad] lifecycle events.
  
negative.code: 
    @override
    bool operator ==(other) {
      return listEquals<String>(keywords, other.keywords) &&
          contentUrl == other.contentUrl &&
          mapEquals(customTargeting, other.customTargeting) &&
          customTargetingLists.toString() ==
              other.customTargetingLists.toString() &&
          nonPersonalizedAds == other.nonPersonalizedAds;
    }
  }
  