/// <summary>
        /// Run the code example.
        /// </summary>
        /// <param name="user">The DFP user object running the code example.</param>
        public override void Run(DfpUser user)
        {
            // Get the LineItemService.
              LineItemService lineItemService = (LineItemService) user.GetService(
              DfpService.v201411.LineItemService);

              long lineItemId = long.Parse(_T("INSERT_LINE_ITEM_ID_HERE"));
              long[] customCriteriaIds1 =
              new long[] {long.Parse(_T("INSERT_CUSTOM_TARGETING_KEY_ID_HERE")),
              long.Parse(_T("INSERT_CUSTOM_TARGETING_VALUE_ID_HERE"))};
              long[] customCriteriaIds2 =
            new long[] {long.Parse(_T("INSERT_CUSTOM_TARGETING_KEY_ID_HERE")),
            long.Parse(_T("INSERT_CUSTOM_TARGETING_VALUE_ID_HERE"))};
              long[] customCriteriaIds3 =
            new long[] {long.Parse(_T("INSERT_CUSTOM_TARGETING_KEY_ID_HERE")),
            long.Parse(_T("INSERT_CUSTOM_TARGETING_VALUE_ID_HERE"))};

              // Create custom criteria.
              CustomCriteria customCriteria1 = new CustomCriteria();
              customCriteria1.keyId = customCriteriaIds1[0];
              customCriteria1.valueIds = new long[] {customCriteriaIds1[1]};
              customCriteria1.@operator = CustomCriteriaComparisonOperator.IS;

              CustomCriteria customCriteria2 = new CustomCriteria();
              customCriteria2.keyId = customCriteriaIds2[0];
              customCriteria2.valueIds = new long[] {customCriteriaIds2[1]};
              customCriteria2.@operator = CustomCriteriaComparisonOperator.IS_NOT;

              CustomCriteria customCriteria3 = new CustomCriteria();
              customCriteria3.keyId = customCriteriaIds3[0];
              customCriteria3.valueIds = new long[] {customCriteriaIds3[1]};
              customCriteria3.@operator = CustomCriteriaComparisonOperator.IS;

              // Create the custom criteria set that will resemble:
              //
              // (customCriteria1.key == customCriteria1.value OR
              //     (customCriteria2.key != customCriteria2.value AND
              //         customCriteria3.key == customCriteria3.value))
              CustomCriteriaSet topCustomCriteriaSet = new CustomCriteriaSet();
              topCustomCriteriaSet.logicalOperator = CustomCriteriaSetLogicalOperator.OR;

              CustomCriteriaSet subCustomCriteriaSet = new CustomCriteriaSet();
              subCustomCriteriaSet.logicalOperator = CustomCriteriaSetLogicalOperator.AND;
              subCustomCriteriaSet.children =
             new CustomCriteriaNode[] {customCriteria2, customCriteria3};
              topCustomCriteriaSet.children =
             new CustomCriteriaNode[] {customCriteria1, subCustomCriteriaSet};

              try {
            StatementBuilder statementBuilder = new StatementBuilder()
            .Where("id = :id")
            .OrderBy("id ASC")
            .Limit(1)
            .AddValue("id", lineItemId);
            // Set the custom criteria targeting on the line item.
            LineItemPage page = lineItemService.getLineItemsByStatement(statementBuilder.ToStatement());
            LineItem lineItem = page.results[0];
            lineItem.targeting.customTargeting = topCustomCriteriaSet;

            // Update the line items on the server.
            LineItem[] updatedLineItems = lineItemService.updateLineItems(new LineItem[] {lineItem});

            foreach (LineItem updatedLineItem in updatedLineItems) {
              // Display the updated line item.
              Console.WriteLine("Line item with ID {0} updated with custom criteria targeting \n{1}\n",
              updatedLineItem.id,
              getCustomCriteriaSetString(updatedLineItem.targeting.customTargeting, 0));
            }
              } catch (Exception e) {
            Console.WriteLine("Failed to add custom target criteria. Exception says \"{0}\"",
            e.Message);
              }
        }
    /// <summary>
    /// Run the code example.
    /// </summary>
    /// <param name="user">The DFP user object running the code example.</param>
    public override void Run(DfpUser user) {
      // Get the AudienceSegmentService.
      AudienceSegmentService audienceSegmentService = (AudienceSegmentService) user.GetService(
          DfpService.v201411.AudienceSegmentService);

      // Get the NetworkService.
      NetworkService networkService = (NetworkService) user.GetService(
          DfpService.v201411.NetworkService);

      long customTargetingKeyId = long.Parse(_T("INSERT_CUSTOM_TARGETING_KEY_ID_HERE"));
      long customTargetingValueId = long.Parse(_T("INSERT_CUSTOM_TARGETING_VALUE_ID_HERE"));

      try {
        // Get the root ad unit ID used to target the whole site.
        String rootAdUnitId = networkService.getCurrentNetwork().effectiveRootAdUnitId;

        // Create inventory targeting.
        InventoryTargeting inventoryTargeting = new InventoryTargeting();

        // Create ad unit targeting for the root ad unit (i.e. the whole network).
        AdUnitTargeting adUnitTargeting = new AdUnitTargeting();
        adUnitTargeting.adUnitId = rootAdUnitId;
        adUnitTargeting.includeDescendants = true;

        inventoryTargeting.targetedAdUnits = new AdUnitTargeting[] {adUnitTargeting};

        // Create the custom criteria to be used in the segment rule.
        // CUSTOM_TARGETING_KEY_ID == CUSTOM_TARGETING_VALUE_ID
        CustomCriteria customCriteria = new CustomCriteria();
        customCriteria.keyId = customTargetingKeyId;
        customCriteria.@operator = CustomCriteriaComparisonOperator.IS;
        customCriteria.valueIds = new long[] {customTargetingValueId};

        // Create the custom criteria expression.
        CustomCriteriaSet topCustomCriteriaSet = new CustomCriteriaSet();
        topCustomCriteriaSet.logicalOperator = CustomCriteriaSetLogicalOperator.AND;
        topCustomCriteriaSet.children = new CustomCriteriaNode[] {customCriteria};

        // Create the audience segment rule.
        FirstPartyAudienceSegmentRule rule = new FirstPartyAudienceSegmentRule();
        rule.inventoryRule = inventoryTargeting;
        rule.customCriteriaRule = topCustomCriteriaSet;

        // Create an audience segment.
        RuleBasedFirstPartyAudienceSegment audienceSegment =
            new RuleBasedFirstPartyAudienceSegment();
        audienceSegment.name = "Sports enthusiasts audience segment #" + this.GetTimeStamp();
        audienceSegment.description = "Sports enthusiasts between the ages of 20 and 30.";
        audienceSegment.pageViews = 6;
        audienceSegment.recencyDays = 6;
        audienceSegment.membershipExpirationDays = 88;
        audienceSegment.rule = rule;

        // Create the audience segment on the server.
        AudienceSegment[] audienceSegments = audienceSegmentService.createAudienceSegments(
            new FirstPartyAudienceSegment[] {audienceSegment});

        foreach (AudienceSegment createdAudienceSegment in audienceSegments) {
          Console.WriteLine("An audience segment with ID \"{0}\", name \"{1}\", and type \"{2}\" " +
              "was created.", createdAudienceSegment.id, createdAudienceSegment.name,
              createdAudienceSegment.type);
        }
      } catch (Exception ex) {
        Console.WriteLine("Failed to get audience segment. Exception says \"{0}\"", ex.Message);
      }
    }