// $ANTLR start "ruleModel"
  // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:76:1: ruleModel returns [EObject current=null] : ( (lv_products_0_0= ruleProduct ) )* ;
  public final EObject ruleModel() throws RecognitionException {
    EObject current = null;

    EObject lv_products_0_0 = null;

    enterRule();

    try {
      // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:79:28: ( ( (lv_products_0_0= ruleProduct ) )* )
      // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:80:1: ( (lv_products_0_0= ruleProduct ) )*
      {
        // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:80:1: ( (lv_products_0_0= ruleProduct ) )*
        loop1:
        do {
          int alt1 = 2;
          int LA1_0 = input.LA(1);

          if ((LA1_0 == 11)) {
            alt1 = 1;
          }

          switch (alt1) {
            case 1:
              // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:81:1: (lv_products_0_0= ruleProduct )
              {
                // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:81:1: (lv_products_0_0= ruleProduct )
                // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:82:3: lv_products_0_0= ruleProduct
                {
                  newCompositeNode(
                      grammarAccess.getModelAccess().getProductsProductParserRuleCall_0());

                  pushFollow(FOLLOW_ruleProduct_in_ruleModel130);
                  lv_products_0_0 = ruleProduct();

                  state._fsp--;

                  if (current == null) {
                    current = createModelElementForParent(grammarAccess.getModelRule());
                  }
                  add(current, "products", lv_products_0_0, "Product");
                  afterParserOrEnumRuleCall();
                }
              }
              break;

            default:
              break loop1;
          }
        } while (true);
      }

      leaveRule();
    } catch (RecognitionException re) {
      recover(input, re);
      appendSkippedTokens();
    } finally {
    }
    return current;
  }
  // $ANTLR start "ruleYesNo"
  // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:315:1: ruleYesNo returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= 'TAK' | kw= 'NIE' ) ;
  public final AntlrDatatypeRuleToken ruleYesNo() throws RecognitionException {
    AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

    Token kw = null;

    enterRule();

    try {
      // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:318:28: ( (kw= 'TAK' | kw= 'NIE' ) )
      // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:319:1: (kw= 'TAK' | kw= 'NIE' )
      {
        // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:319:1: (kw= 'TAK' | kw= 'NIE' )
        int alt4 = 2;
        int LA4_0 = input.LA(1);

        if ((LA4_0 == 21)) {
          alt4 = 1;
        } else if ((LA4_0 == 22)) {
          alt4 = 2;
        } else {
          NoViableAltException nvae = new NoViableAltException("", 4, 0, input);

          throw nvae;
        }
        switch (alt4) {
          case 1:
            // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:320:2: kw= 'TAK'
            {
              kw = (Token) match(input, 21, FOLLOW_21_in_ruleYesNo584);

              current.merge(kw);
              newLeafNode(kw, grammarAccess.getYesNoAccess().getTAKKeyword_0());
            }
            break;
          case 2:
            // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:327:2: kw= 'NIE'
            {
              kw = (Token) match(input, 22, FOLLOW_22_in_ruleYesNo603);

              current.merge(kw);
              newLeafNode(kw, grammarAccess.getYesNoAccess().getNIEKeyword_1());
            }
            break;
        }
      }

      leaveRule();
    } catch (RecognitionException re) {
      recover(input, re);
      appendSkippedTokens();
    } finally {
    }
    return current;
  }
  // $ANTLR start "entryRuleYesNo"
  // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:306:1: entryRuleYesNo returns [String current=null] : iv_ruleYesNo= ruleYesNo EOF ;
  public final String entryRuleYesNo() throws RecognitionException {
    String current = null;

    AntlrDatatypeRuleToken iv_ruleYesNo = null;

    try {
      // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:307:2: (iv_ruleYesNo= ruleYesNo EOF )
      // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:308:2: iv_ruleYesNo= ruleYesNo EOF
      {
        newCompositeNode(grammarAccess.getYesNoRule());
        pushFollow(FOLLOW_ruleYesNo_in_entryRuleYesNo535);
        iv_ruleYesNo = ruleYesNo();

        state._fsp--;

        current = iv_ruleYesNo.getText();
        match(input, EOF, FOLLOW_EOF_in_entryRuleYesNo546);
      }

    } catch (RecognitionException re) {
      recover(input, re);
      appendSkippedTokens();
    } finally {
    }
    return current;
  }
  // $ANTLR start "entryRuleProduct"
  // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:106:1: entryRuleProduct returns [EObject current=null] : iv_ruleProduct= ruleProduct EOF ;
  public final EObject entryRuleProduct() throws RecognitionException {
    EObject current = null;

    EObject iv_ruleProduct = null;

    try {
      // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:107:2: (iv_ruleProduct= ruleProduct EOF )
      // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:108:2: iv_ruleProduct= ruleProduct EOF
      {
        newCompositeNode(grammarAccess.getProductRule());
        pushFollow(FOLLOW_ruleProduct_in_entryRuleProduct166);
        iv_ruleProduct = ruleProduct();

        state._fsp--;

        current = iv_ruleProduct;
        match(input, EOF, FOLLOW_EOF_in_entryRuleProduct176);
      }

    } catch (RecognitionException re) {
      recover(input, re);
      appendSkippedTokens();
    } finally {
    }
    return current;
  }
 public InternalInsuranceParser(TokenStream input, InsuranceGrammarAccess grammarAccess) {
   this(input);
   this.grammarAccess = grammarAccess;
   registerRules(grammarAccess.getGrammar());
 }
  // $ANTLR start "ruleProduct"
  // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:115:1: ruleProduct returns [EObject current=null] : (otherlv_0= 'Produkt' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'OPIS=' ( (lv_description_4_0= RULE_STRING ) ) otherlv_5= 'SREDNIE ODSZKODOWANIE=' ( (lv_avgDamages_6_0= RULE_INT ) ) otherlv_7= 'CZESTOSC ZDARZEN NA 1000=' ( (lv_occurrences_8_0= RULE_INT ) ) otherlv_9= 'OCZEKIWANY ZYSK (%)=' ( (lv_earnings_10_0= RULE_INT ) ) otherlv_11= 'KOSZT OBSLUGI (szt)=' ( (lv_cost_12_0= RULE_INT ) ) otherlv_13= 'W SPRZEDAZY=' ( (lv_selling_14_0= ruleYesNo ) ) (otherlv_15= 'POWIAZANE PRODUKTY=' ( (otherlv_16= RULE_ID ) )* )? otherlv_17= '}' ) ;
  public final EObject ruleProduct() throws RecognitionException {
    EObject current = null;

    Token otherlv_0 = null;
    Token lv_name_1_0 = null;
    Token otherlv_2 = null;
    Token otherlv_3 = null;
    Token lv_description_4_0 = null;
    Token otherlv_5 = null;
    Token lv_avgDamages_6_0 = null;
    Token otherlv_7 = null;
    Token lv_occurrences_8_0 = null;
    Token otherlv_9 = null;
    Token lv_earnings_10_0 = null;
    Token otherlv_11 = null;
    Token lv_cost_12_0 = null;
    Token otherlv_13 = null;
    Token otherlv_15 = null;
    Token otherlv_16 = null;
    Token otherlv_17 = null;
    AntlrDatatypeRuleToken lv_selling_14_0 = null;

    enterRule();

    try {
      // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:118:28: ( (otherlv_0= 'Produkt' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'OPIS=' ( (lv_description_4_0= RULE_STRING ) ) otherlv_5= 'SREDNIE ODSZKODOWANIE=' ( (lv_avgDamages_6_0= RULE_INT ) ) otherlv_7= 'CZESTOSC ZDARZEN NA 1000=' ( (lv_occurrences_8_0= RULE_INT ) ) otherlv_9= 'OCZEKIWANY ZYSK (%)=' ( (lv_earnings_10_0= RULE_INT ) ) otherlv_11= 'KOSZT OBSLUGI (szt)=' ( (lv_cost_12_0= RULE_INT ) ) otherlv_13= 'W SPRZEDAZY=' ( (lv_selling_14_0= ruleYesNo ) ) (otherlv_15= 'POWIAZANE PRODUKTY=' ( (otherlv_16= RULE_ID ) )* )? otherlv_17= '}' ) )
      // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:119:1: (otherlv_0= 'Produkt' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'OPIS=' ( (lv_description_4_0= RULE_STRING ) ) otherlv_5= 'SREDNIE ODSZKODOWANIE=' ( (lv_avgDamages_6_0= RULE_INT ) ) otherlv_7= 'CZESTOSC ZDARZEN NA 1000=' ( (lv_occurrences_8_0= RULE_INT ) ) otherlv_9= 'OCZEKIWANY ZYSK (%)=' ( (lv_earnings_10_0= RULE_INT ) ) otherlv_11= 'KOSZT OBSLUGI (szt)=' ( (lv_cost_12_0= RULE_INT ) ) otherlv_13= 'W SPRZEDAZY=' ( (lv_selling_14_0= ruleYesNo ) ) (otherlv_15= 'POWIAZANE PRODUKTY=' ( (otherlv_16= RULE_ID ) )* )? otherlv_17= '}' )
      {
        // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:119:1: (otherlv_0= 'Produkt' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'OPIS=' ( (lv_description_4_0= RULE_STRING ) ) otherlv_5= 'SREDNIE ODSZKODOWANIE=' ( (lv_avgDamages_6_0= RULE_INT ) ) otherlv_7= 'CZESTOSC ZDARZEN NA 1000=' ( (lv_occurrences_8_0= RULE_INT ) ) otherlv_9= 'OCZEKIWANY ZYSK (%)=' ( (lv_earnings_10_0= RULE_INT ) ) otherlv_11= 'KOSZT OBSLUGI (szt)=' ( (lv_cost_12_0= RULE_INT ) ) otherlv_13= 'W SPRZEDAZY=' ( (lv_selling_14_0= ruleYesNo ) ) (otherlv_15= 'POWIAZANE PRODUKTY=' ( (otherlv_16= RULE_ID ) )* )? otherlv_17= '}' )
        // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:119:3: otherlv_0= 'Produkt' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'OPIS=' ( (lv_description_4_0= RULE_STRING ) ) otherlv_5= 'SREDNIE ODSZKODOWANIE=' ( (lv_avgDamages_6_0= RULE_INT ) ) otherlv_7= 'CZESTOSC ZDARZEN NA 1000=' ( (lv_occurrences_8_0= RULE_INT ) ) otherlv_9= 'OCZEKIWANY ZYSK (%)=' ( (lv_earnings_10_0= RULE_INT ) ) otherlv_11= 'KOSZT OBSLUGI (szt)=' ( (lv_cost_12_0= RULE_INT ) ) otherlv_13= 'W SPRZEDAZY=' ( (lv_selling_14_0= ruleYesNo ) ) (otherlv_15= 'POWIAZANE PRODUKTY=' ( (otherlv_16= RULE_ID ) )* )? otherlv_17= '}'
        {
          otherlv_0 = (Token) match(input, 11, FOLLOW_11_in_ruleProduct213);

          newLeafNode(otherlv_0, grammarAccess.getProductAccess().getProduktKeyword_0());

          // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:123:1: ( (lv_name_1_0= RULE_ID ) )
          // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:124:1: (lv_name_1_0= RULE_ID )
          {
            // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:124:1: (lv_name_1_0= RULE_ID )
            // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:125:3: lv_name_1_0= RULE_ID
            {
              lv_name_1_0 = (Token) match(input, RULE_ID, FOLLOW_RULE_ID_in_ruleProduct230);

              newLeafNode(
                  lv_name_1_0, grammarAccess.getProductAccess().getNameIDTerminalRuleCall_1_0());

              if (current == null) {
                current = createModelElement(grammarAccess.getProductRule());
              }
              setWithLastConsumed(current, "name", lv_name_1_0, "ID");
            }
          }

          otherlv_2 = (Token) match(input, 12, FOLLOW_12_in_ruleProduct247);

          newLeafNode(otherlv_2, grammarAccess.getProductAccess().getLeftCurlyBracketKeyword_2());

          otherlv_3 = (Token) match(input, 13, FOLLOW_13_in_ruleProduct259);

          newLeafNode(otherlv_3, grammarAccess.getProductAccess().getOPISKeyword_3());

          // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:149:1: ( (lv_description_4_0= RULE_STRING ) )
          // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:150:1: (lv_description_4_0= RULE_STRING )
          {
            // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:150:1: (lv_description_4_0= RULE_STRING )
            // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:151:3: lv_description_4_0= RULE_STRING
            {
              lv_description_4_0 =
                  (Token) match(input, RULE_STRING, FOLLOW_RULE_STRING_in_ruleProduct276);

              newLeafNode(
                  lv_description_4_0,
                  grammarAccess.getProductAccess().getDescriptionSTRINGTerminalRuleCall_4_0());

              if (current == null) {
                current = createModelElement(grammarAccess.getProductRule());
              }
              setWithLastConsumed(current, "description", lv_description_4_0, "STRING");
            }
          }

          otherlv_5 = (Token) match(input, 14, FOLLOW_14_in_ruleProduct293);

          newLeafNode(
              otherlv_5, grammarAccess.getProductAccess().getSREDNIEODSZKODOWANIEKeyword_5());

          // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:171:1: ( (lv_avgDamages_6_0= RULE_INT ) )
          // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:172:1: (lv_avgDamages_6_0= RULE_INT )
          {
            // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:172:1: (lv_avgDamages_6_0= RULE_INT )
            // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:173:3: lv_avgDamages_6_0= RULE_INT
            {
              lv_avgDamages_6_0 = (Token) match(input, RULE_INT, FOLLOW_RULE_INT_in_ruleProduct310);

              newLeafNode(
                  lv_avgDamages_6_0,
                  grammarAccess.getProductAccess().getAvgDamagesINTTerminalRuleCall_6_0());

              if (current == null) {
                current = createModelElement(grammarAccess.getProductRule());
              }
              setWithLastConsumed(current, "avgDamages", lv_avgDamages_6_0, "INT");
            }
          }

          otherlv_7 = (Token) match(input, 15, FOLLOW_15_in_ruleProduct327);

          newLeafNode(
              otherlv_7, grammarAccess.getProductAccess().getCZESTOSCZDARZENNA1000Keyword_7());

          // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:193:1: ( (lv_occurrences_8_0= RULE_INT ) )
          // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:194:1: (lv_occurrences_8_0= RULE_INT )
          {
            // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:194:1: (lv_occurrences_8_0= RULE_INT )
            // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:195:3: lv_occurrences_8_0= RULE_INT
            {
              lv_occurrences_8_0 =
                  (Token) match(input, RULE_INT, FOLLOW_RULE_INT_in_ruleProduct344);

              newLeafNode(
                  lv_occurrences_8_0,
                  grammarAccess.getProductAccess().getOccurrencesINTTerminalRuleCall_8_0());

              if (current == null) {
                current = createModelElement(grammarAccess.getProductRule());
              }
              setWithLastConsumed(current, "occurrences", lv_occurrences_8_0, "INT");
            }
          }

          otherlv_9 = (Token) match(input, 16, FOLLOW_16_in_ruleProduct361);

          newLeafNode(otherlv_9, grammarAccess.getProductAccess().getOCZEKIWANYZYSKKeyword_9());

          // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:215:1: ( (lv_earnings_10_0= RULE_INT ) )
          // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:216:1: (lv_earnings_10_0= RULE_INT )
          {
            // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:216:1: (lv_earnings_10_0= RULE_INT )
            // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:217:3: lv_earnings_10_0= RULE_INT
            {
              lv_earnings_10_0 = (Token) match(input, RULE_INT, FOLLOW_RULE_INT_in_ruleProduct378);

              newLeafNode(
                  lv_earnings_10_0,
                  grammarAccess.getProductAccess().getEarningsINTTerminalRuleCall_10_0());

              if (current == null) {
                current = createModelElement(grammarAccess.getProductRule());
              }
              setWithLastConsumed(current, "earnings", lv_earnings_10_0, "INT");
            }
          }

          otherlv_11 = (Token) match(input, 17, FOLLOW_17_in_ruleProduct395);

          newLeafNode(otherlv_11, grammarAccess.getProductAccess().getKOSZTOBSLUGISztKeyword_11());

          // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:237:1: ( (lv_cost_12_0= RULE_INT ) )
          // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:238:1: (lv_cost_12_0= RULE_INT )
          {
            // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:238:1: (lv_cost_12_0= RULE_INT )
            // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:239:3: lv_cost_12_0= RULE_INT
            {
              lv_cost_12_0 = (Token) match(input, RULE_INT, FOLLOW_RULE_INT_in_ruleProduct412);

              newLeafNode(
                  lv_cost_12_0, grammarAccess.getProductAccess().getCostINTTerminalRuleCall_12_0());

              if (current == null) {
                current = createModelElement(grammarAccess.getProductRule());
              }
              setWithLastConsumed(current, "cost", lv_cost_12_0, "INT");
            }
          }

          otherlv_13 = (Token) match(input, 18, FOLLOW_18_in_ruleProduct429);

          newLeafNode(otherlv_13, grammarAccess.getProductAccess().getWSPRZEDAZYKeyword_13());

          // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:259:1: ( (lv_selling_14_0= ruleYesNo ) )
          // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:260:1: (lv_selling_14_0= ruleYesNo )
          {
            // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:260:1: (lv_selling_14_0= ruleYesNo )
            // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:261:3: lv_selling_14_0= ruleYesNo
            {
              newCompositeNode(
                  grammarAccess.getProductAccess().getSellingYesNoParserRuleCall_14_0());

              pushFollow(FOLLOW_ruleYesNo_in_ruleProduct450);
              lv_selling_14_0 = ruleYesNo();

              state._fsp--;

              if (current == null) {
                current = createModelElementForParent(grammarAccess.getProductRule());
              }
              set(current, "selling", lv_selling_14_0, "YesNo");
              afterParserOrEnumRuleCall();
            }
          }

          // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:277:2: (otherlv_15= 'POWIAZANE PRODUKTY=' ( (otherlv_16= RULE_ID ) )* )?
          int alt3 = 2;
          int LA3_0 = input.LA(1);

          if ((LA3_0 == 19)) {
            alt3 = 1;
          }
          switch (alt3) {
            case 1:
              // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:277:4: otherlv_15= 'POWIAZANE PRODUKTY=' ( (otherlv_16= RULE_ID ) )*
              {
                otherlv_15 = (Token) match(input, 19, FOLLOW_19_in_ruleProduct463);

                newLeafNode(
                    otherlv_15,
                    grammarAccess.getProductAccess().getPOWIAZANEPRODUKTYKeyword_15_0());

                // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:281:1: ( (otherlv_16= RULE_ID ) )*
                loop2:
                do {
                  int alt2 = 2;
                  int LA2_0 = input.LA(1);

                  if ((LA2_0 == RULE_ID)) {
                    alt2 = 1;
                  }

                  switch (alt2) {
                    case 1:
                      // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:282:1: (otherlv_16= RULE_ID )
                      {
                        // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:282:1: (otherlv_16= RULE_ID )
                        // ../org.xtext.example.insurance/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalInsurance.g:283:3: otherlv_16= RULE_ID
                        {
                          if (current == null) {
                            current = createModelElement(grammarAccess.getProductRule());
                          }

                          otherlv_16 =
                              (Token) match(input, RULE_ID, FOLLOW_RULE_ID_in_ruleProduct483);

                          newLeafNode(
                              otherlv_16,
                              grammarAccess
                                  .getProductAccess()
                                  .getConnectedProductCrossReference_15_1_0());
                        }
                      }
                      break;

                    default:
                      break loop2;
                  }
                } while (true);
              }
              break;
          }

          otherlv_17 = (Token) match(input, 20, FOLLOW_20_in_ruleProduct498);

          newLeafNode(
              otherlv_17, grammarAccess.getProductAccess().getRightCurlyBracketKeyword_16());
        }
      }

      leaveRule();
    } catch (RecognitionException re) {
      recover(input, re);
      appendSkippedTokens();
    } finally {
    }
    return current;
  }