java.lang.RuntimeException: java.lang.NullPointerException

Pentaho BI Platform Tracking | Carlos Lopez | 11 months ago
  1. 0

    The following MDX results from dragging the following fields on the report: Measure: Total VA Levels: MIN & Item Description {noformat} / Request ID: 52877057-af15-11e5-b99c-e82aea152430 - RUN_REPORT WITH SET [*NATIVE_CJ_SET_WITH_SLICER] AS 'FILTER([*BASE_MEMBERS__Item_], NOT ISEMPTY ([Measures].[Total VA]))' SET [*NATIVE_CJ_SET] AS '[*NATIVE_CJ_SET_WITH_SLICER]' SET [*BASE_MEMBERS__Measures_] AS '{[Measures].[*FORMATTED_MEASURE_0]}' SET [*BASE_MEMBERS__Item_] AS '[Item].[Item Description].MEMBERS' SET [*CJ_ROW_AXIS] AS 'GENERATE([*NATIVE_CJ_SET], {([Item].CURRENTMEMBER)})' SET [*SORTED_ROW_AXIS] AS 'ORDER([*CJ_ROW_AXIS],ANCESTOR([Item].CURRENTMEMBER, [Item].[MIN]).ORDERKEY,BASC,ANCESTOR([Item].CURRENTMEMBER,[Item].[Brand]).ORDERKEY,BASC,[Item].CURRENTMEMBER.ORDERKEY,BASC,ANCESTOR([Item].CURRENTMEMBER,[Item].[DIN]).ORDERKEY,BASC)' MEMBER [Measures].[*FORMATTED_MEASURE_0] AS '[Measures].[Total VA]', FORMAT_STRING = '$ #,###.00;($ #,###.00)', SOLVE_ORDER=500 SELECT [*BASE_MEMBERS__Measures_] ON COLUMNS ,[*SORTED_ROW_AXIS] ON ROWS FROM [DA Usage Volume and VA] {noformat} Mondrian returns the following NullPointerException {noformat} java.lang.RuntimeException: java.lang.NullPointerException at com.pentaho.analyzer.report.ReportManagerImpl.runReport(SourceFile:320) at com.pentaho.analyzer.report.ReportManagerImpl.runReport(SourceFile:139) at com.pentaho.analyzer.report.ReportRequestService$2.a(SourceFile:275) at com.pentaho.analyzer.report.ReportRequestService$2.call(SourceFile:270) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NullPointerException at mondrian.rolap.SqlMemberSource.isLevelCollapsed(SqlMemberSource.java:830) at mondrian.rolap.SqlTupleReader.addLevelMemberSql(SqlTupleReader.java:1072) at mondrian.rolap.SqlTupleReader.generateSelectForLevels(SqlTupleReader.java:928) at mondrian.rolap.SqlTupleReader.makeLevelMembersSql(SqlTupleReader.java:853) at mondrian.rolap.SqlTupleReader.prepareTuples(SqlTupleReader.java:395) at mondrian.rolap.SqlTupleReader.readMembers(SqlTupleReader.java:520) at mondrian.rolap.RolapNativeSet$SetEvaluator.executeList(RolapNativeSet.java:254) at mondrian.rolap.RolapNativeSet$SetEvaluator.execute(RolapNativeSet.java:188) at mondrian.olap.fun.FilterFunDef$BaseIterCalc.evaluateIterable(FilterFunDef.java:118) at mondrian.calc.impl.AbstractIterCalc.evaluate(AbstractIterCalc.java:50) at mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152) at mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:1089) at mondrian.rolap.RolapNamedSetEvaluator.ensureList(RolapNamedSetEvaluator.java:98) at mondrian.rolap.RolapNamedSetEvaluator.evaluateTupleIterable(RolapNamedSetEvaluator.java:66) at mondrian.mdx.NamedSetExpr$1.evaluateIterable(NamedSetExpr.java:98) at mondrian.calc.impl.AbstractIterCalc.evaluate(AbstractIterCalc.java:50) at mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152) at mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:1089) at mondrian.rolap.RolapNamedSetEvaluator.ensureList(RolapNamedSetEvaluator.java:98) at mondrian.rolap.RolapNamedSetEvaluator.evaluateTupleIterable(RolapNamedSetEvaluator.java:66) at mondrian.mdx.NamedSetExpr$1.evaluateIterable(NamedSetExpr.java:98) at mondrian.calc.impl.AbstractIterCalc.evaluate(AbstractIterCalc.java:50) at mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152) at mondrian.calc.impl.GenericIterCalc.evaluateIterable(GenericIterCalc.java:72) at mondrian.olap.fun.GenerateFunDef$GenerateListCalcImpl.evaluateList(GenerateFunDef.java:109) at mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:65) at mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152) at mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:1089) at mondrian.rolap.RolapNamedSetEvaluator.ensureList(RolapNamedSetEvaluator.java:98) at mondrian.rolap.RolapNamedSetEvaluator.evaluateTupleIterable(RolapNamedSetEvaluator.java:66) at mondrian.mdx.NamedSetExpr$1.evaluateIterable(NamedSetExpr.java:98) at mondrian.calc.impl.AbstractIterCalc.evaluate(AbstractIterCalc.java:50) at mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152) at mondrian.calc.impl.GenericIterCalc.evaluateIterable(GenericIterCalc.java:72) at mondrian.olap.fun.OrderFunDef$CalcImpl.evaluateList(OrderFunDef.java:202) at mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:65) at mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152) at mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:1089) at mondrian.rolap.RolapNamedSetEvaluator.ensureList(RolapNamedSetEvaluator.java:98) at mondrian.rolap.RolapNamedSetEvaluator.evaluateTupleIterable(RolapNamedSetEvaluator.java:66) at mondrian.mdx.NamedSetExpr$1.evaluateIterable(NamedSetExpr.java:98) at mondrian.rolap.RolapResult.executeAxis(RolapResult.java:976) at mondrian.rolap.RolapResult.evalLoad(RolapResult.java:801) at mondrian.rolap.RolapResult.loadMembers(RolapResult.java:757) at mondrian.rolap.RolapResult.(RolapResult.java:401) at mondrian.rolap.RolapConnection.executeInternal(RolapConnection.java:672) at mondrian.rolap.RolapConnection.access$000(RolapConnection.java:52) at mondrian.rolap.RolapConnection$1.call(RolapConnection.java:623) at mondrian.rolap.RolapConnection$1.call(RolapConnection.java:621) ... 4 more Query Failed! {noformat}

    Pentaho BI Platform Tracking | 11 months ago | Carlos Lopez
    java.lang.RuntimeException: java.lang.NullPointerException
  2. 0

    The following MDX results from dragging the following fields on the report: Measure: Total VA Levels: MIN & Item Description {noformat} / Request ID: 52877057-af15-11e5-b99c-e82aea152430 - RUN_REPORT WITH SET [*NATIVE_CJ_SET_WITH_SLICER] AS 'FILTER([*BASE_MEMBERS__Item_], NOT ISEMPTY ([Measures].[Total VA]))' SET [*NATIVE_CJ_SET] AS '[*NATIVE_CJ_SET_WITH_SLICER]' SET [*BASE_MEMBERS__Measures_] AS '{[Measures].[*FORMATTED_MEASURE_0]}' SET [*BASE_MEMBERS__Item_] AS '[Item].[Item Description].MEMBERS' SET [*CJ_ROW_AXIS] AS 'GENERATE([*NATIVE_CJ_SET], {([Item].CURRENTMEMBER)})' SET [*SORTED_ROW_AXIS] AS 'ORDER([*CJ_ROW_AXIS],ANCESTOR([Item].CURRENTMEMBER, [Item].[MIN]).ORDERKEY,BASC,ANCESTOR([Item].CURRENTMEMBER,[Item].[Brand]).ORDERKEY,BASC,[Item].CURRENTMEMBER.ORDERKEY,BASC,ANCESTOR([Item].CURRENTMEMBER,[Item].[DIN]).ORDERKEY,BASC)' MEMBER [Measures].[*FORMATTED_MEASURE_0] AS '[Measures].[Total VA]', FORMAT_STRING = '$ #,###.00;($ #,###.00)', SOLVE_ORDER=500 SELECT [*BASE_MEMBERS__Measures_] ON COLUMNS ,[*SORTED_ROW_AXIS] ON ROWS FROM [DA Usage Volume and VA] {noformat} Mondrian returns the following NullPointerException {noformat} java.lang.RuntimeException: java.lang.NullPointerException at com.pentaho.analyzer.report.ReportManagerImpl.runReport(SourceFile:320) at com.pentaho.analyzer.report.ReportManagerImpl.runReport(SourceFile:139) at com.pentaho.analyzer.report.ReportRequestService$2.a(SourceFile:275) at com.pentaho.analyzer.report.ReportRequestService$2.call(SourceFile:270) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NullPointerException at mondrian.rolap.SqlMemberSource.isLevelCollapsed(SqlMemberSource.java:830) at mondrian.rolap.SqlTupleReader.addLevelMemberSql(SqlTupleReader.java:1072) at mondrian.rolap.SqlTupleReader.generateSelectForLevels(SqlTupleReader.java:928) at mondrian.rolap.SqlTupleReader.makeLevelMembersSql(SqlTupleReader.java:853) at mondrian.rolap.SqlTupleReader.prepareTuples(SqlTupleReader.java:395) at mondrian.rolap.SqlTupleReader.readMembers(SqlTupleReader.java:520) at mondrian.rolap.RolapNativeSet$SetEvaluator.executeList(RolapNativeSet.java:254) at mondrian.rolap.RolapNativeSet$SetEvaluator.execute(RolapNativeSet.java:188) at mondrian.olap.fun.FilterFunDef$BaseIterCalc.evaluateIterable(FilterFunDef.java:118) at mondrian.calc.impl.AbstractIterCalc.evaluate(AbstractIterCalc.java:50) at mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152) at mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:1089) at mondrian.rolap.RolapNamedSetEvaluator.ensureList(RolapNamedSetEvaluator.java:98) at mondrian.rolap.RolapNamedSetEvaluator.evaluateTupleIterable(RolapNamedSetEvaluator.java:66) at mondrian.mdx.NamedSetExpr$1.evaluateIterable(NamedSetExpr.java:98) at mondrian.calc.impl.AbstractIterCalc.evaluate(AbstractIterCalc.java:50) at mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152) at mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:1089) at mondrian.rolap.RolapNamedSetEvaluator.ensureList(RolapNamedSetEvaluator.java:98) at mondrian.rolap.RolapNamedSetEvaluator.evaluateTupleIterable(RolapNamedSetEvaluator.java:66) at mondrian.mdx.NamedSetExpr$1.evaluateIterable(NamedSetExpr.java:98) at mondrian.calc.impl.AbstractIterCalc.evaluate(AbstractIterCalc.java:50) at mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152) at mondrian.calc.impl.GenericIterCalc.evaluateIterable(GenericIterCalc.java:72) at mondrian.olap.fun.GenerateFunDef$GenerateListCalcImpl.evaluateList(GenerateFunDef.java:109) at mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:65) at mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152) at mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:1089) at mondrian.rolap.RolapNamedSetEvaluator.ensureList(RolapNamedSetEvaluator.java:98) at mondrian.rolap.RolapNamedSetEvaluator.evaluateTupleIterable(RolapNamedSetEvaluator.java:66) at mondrian.mdx.NamedSetExpr$1.evaluateIterable(NamedSetExpr.java:98) at mondrian.calc.impl.AbstractIterCalc.evaluate(AbstractIterCalc.java:50) at mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152) at mondrian.calc.impl.GenericIterCalc.evaluateIterable(GenericIterCalc.java:72) at mondrian.olap.fun.OrderFunDef$CalcImpl.evaluateList(OrderFunDef.java:202) at mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:65) at mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152) at mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:1089) at mondrian.rolap.RolapNamedSetEvaluator.ensureList(RolapNamedSetEvaluator.java:98) at mondrian.rolap.RolapNamedSetEvaluator.evaluateTupleIterable(RolapNamedSetEvaluator.java:66) at mondrian.mdx.NamedSetExpr$1.evaluateIterable(NamedSetExpr.java:98) at mondrian.rolap.RolapResult.executeAxis(RolapResult.java:976) at mondrian.rolap.RolapResult.evalLoad(RolapResult.java:801) at mondrian.rolap.RolapResult.loadMembers(RolapResult.java:757) at mondrian.rolap.RolapResult.(RolapResult.java:401) at mondrian.rolap.RolapConnection.executeInternal(RolapConnection.java:672) at mondrian.rolap.RolapConnection.access$000(RolapConnection.java:52) at mondrian.rolap.RolapConnection$1.call(RolapConnection.java:623) at mondrian.rolap.RolapConnection$1.call(RolapConnection.java:621) ... 4 more Query Failed! {noformat} ------------------- Using the customer's data and schema, I was able to reproduce this issue. I could not find a reproduction path on FoodMart however. The bug happens in SqlMemberSource, but is probably caused somewhere upstream, when we read the schema and define the column bitkeys. bq. https://github.com/pentaho/mondrian/blob/master/src/main/mondrian/rolap/SqlMemberSource.java#L829 The code above will throw a NPE. In my tests, I've seen that the column in question is assigned bit position 15 in the AggStar, whereas it has the index 16 in the RolapStar.

    Pentaho BI Platform Tracking | 11 months ago | Carlos Lopez
    java.lang.RuntimeException: java.lang.NullPointerException
  3. 0

    Android: Saving Map State in Google map

    Stack Overflow | 11 months ago | Junie Negentien
    java.lang.RuntimeException: Unable to resume activity {com.ourThesis.junieNegentien2015/com.ourThesis.junieNegentien2015.MainActivity}: java.lang.NullPointerException
  4. Speed up your debug routine!

    Automated exception search integrated into your IDE

    Not finding the right solution?
    Take a tour to get the most out of Samebug.

    Tired of useless tips?

    Automated exception search integrated into your IDE

    Root Cause Analysis

    1. java.lang.NullPointerException

      No message provided

      at mondrian.rolap.SqlMemberSource.isLevelCollapsed()
    2. mondrian.rolap
      RolapNativeSet$SetEvaluator.execute
      1. mondrian.rolap.SqlMemberSource.isLevelCollapsed(SqlMemberSource.java:830)
      2. mondrian.rolap.SqlTupleReader.addLevelMemberSql(SqlTupleReader.java:1072)
      3. mondrian.rolap.SqlTupleReader.generateSelectForLevels(SqlTupleReader.java:928)
      4. mondrian.rolap.SqlTupleReader.makeLevelMembersSql(SqlTupleReader.java:853)
      5. mondrian.rolap.SqlTupleReader.prepareTuples(SqlTupleReader.java:395)
      6. mondrian.rolap.SqlTupleReader.readMembers(SqlTupleReader.java:520)
      7. mondrian.rolap.RolapNativeSet$SetEvaluator.executeList(RolapNativeSet.java:254)
      8. mondrian.rolap.RolapNativeSet$SetEvaluator.execute(RolapNativeSet.java:188)
      8 frames
    3. mondrian.olap.fun
      FilterFunDef$BaseIterCalc.evaluateIterable
      1. mondrian.olap.fun.FilterFunDef$BaseIterCalc.evaluateIterable(FilterFunDef.java:118)
      1 frame
    4. mondrian.calc.impl
      AbstractIterCalc.evaluate
      1. mondrian.calc.impl.AbstractIterCalc.evaluate(AbstractIterCalc.java:50)
      1 frame
    5. mondrian.rolap
      RolapNamedSetEvaluator.evaluateTupleIterable
      1. mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152)
      2. mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:1089)
      3. mondrian.rolap.RolapNamedSetEvaluator.ensureList(RolapNamedSetEvaluator.java:98)
      4. mondrian.rolap.RolapNamedSetEvaluator.evaluateTupleIterable(RolapNamedSetEvaluator.java:66)
      4 frames
    6. mondrian.mdx
      NamedSetExpr$1.evaluateIterable
      1. mondrian.mdx.NamedSetExpr$1.evaluateIterable(NamedSetExpr.java:98)
      1 frame
    7. mondrian.calc.impl
      AbstractIterCalc.evaluate
      1. mondrian.calc.impl.AbstractIterCalc.evaluate(AbstractIterCalc.java:50)
      1 frame
    8. mondrian.rolap
      RolapNamedSetEvaluator.evaluateTupleIterable
      1. mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152)
      2. mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:1089)
      3. mondrian.rolap.RolapNamedSetEvaluator.ensureList(RolapNamedSetEvaluator.java:98)
      4. mondrian.rolap.RolapNamedSetEvaluator.evaluateTupleIterable(RolapNamedSetEvaluator.java:66)
      4 frames
    9. mondrian.mdx
      NamedSetExpr$1.evaluateIterable
      1. mondrian.mdx.NamedSetExpr$1.evaluateIterable(NamedSetExpr.java:98)
      1 frame
    10. mondrian.calc.impl
      AbstractIterCalc.evaluate
      1. mondrian.calc.impl.AbstractIterCalc.evaluate(AbstractIterCalc.java:50)
      1 frame
    11. mondrian.rolap
      RolapProfilingEvaluator$ProfilingIterCalc.evaluate
      1. mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152)
      1 frame
    12. mondrian.calc.impl
      GenericIterCalc.evaluateIterable
      1. mondrian.calc.impl.GenericIterCalc.evaluateIterable(GenericIterCalc.java:72)
      1 frame
    13. mondrian.olap.fun
      GenerateFunDef$GenerateListCalcImpl.evaluateList
      1. mondrian.olap.fun.GenerateFunDef$GenerateListCalcImpl.evaluateList(GenerateFunDef.java:109)
      1 frame
    14. mondrian.calc.impl
      AbstractListCalc.evaluate
      1. mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:65)
      1 frame
    15. mondrian.rolap
      RolapNamedSetEvaluator.evaluateTupleIterable
      1. mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152)
      2. mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:1089)
      3. mondrian.rolap.RolapNamedSetEvaluator.ensureList(RolapNamedSetEvaluator.java:98)
      4. mondrian.rolap.RolapNamedSetEvaluator.evaluateTupleIterable(RolapNamedSetEvaluator.java:66)
      4 frames
    16. mondrian.mdx
      NamedSetExpr$1.evaluateIterable
      1. mondrian.mdx.NamedSetExpr$1.evaluateIterable(NamedSetExpr.java:98)
      1 frame
    17. mondrian.calc.impl
      AbstractIterCalc.evaluate
      1. mondrian.calc.impl.AbstractIterCalc.evaluate(AbstractIterCalc.java:50)
      1 frame
    18. mondrian.rolap
      RolapProfilingEvaluator$ProfilingIterCalc.evaluate
      1. mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152)
      1 frame
    19. mondrian.calc.impl
      GenericIterCalc.evaluateIterable
      1. mondrian.calc.impl.GenericIterCalc.evaluateIterable(GenericIterCalc.java:72)
      1 frame
    20. mondrian.olap.fun
      OrderFunDef$CalcImpl.evaluateList
      1. mondrian.olap.fun.OrderFunDef$CalcImpl.evaluateList(OrderFunDef.java:202)
      1 frame
    21. mondrian.calc.impl
      AbstractListCalc.evaluate
      1. mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:65)
      1 frame
    22. mondrian.rolap
      RolapNamedSetEvaluator.evaluateTupleIterable
      1. mondrian.rolap.RolapProfilingEvaluator$ProfilingIterCalc.evaluate(RolapProfilingEvaluator.java:152)
      2. mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:1089)
      3. mondrian.rolap.RolapNamedSetEvaluator.ensureList(RolapNamedSetEvaluator.java:98)
      4. mondrian.rolap.RolapNamedSetEvaluator.evaluateTupleIterable(RolapNamedSetEvaluator.java:66)
      4 frames
    23. mondrian.mdx
      NamedSetExpr$1.evaluateIterable
      1. mondrian.mdx.NamedSetExpr$1.evaluateIterable(NamedSetExpr.java:98)
      1 frame
    24. mondrian.rolap
      RolapConnection$1.call
      1. mondrian.rolap.RolapResult.executeAxis(RolapResult.java:976)
      2. mondrian.rolap.RolapResult.evalLoad(RolapResult.java:801)
      3. mondrian.rolap.RolapResult.loadMembers(RolapResult.java:757)
      4. mondrian.rolap.RolapResult.<init>(RolapResult.java:401)
      5. mondrian.rolap.RolapConnection.executeInternal(RolapConnection.java:672)
      6. mondrian.rolap.RolapConnection.access$000(RolapConnection.java:52)
      7. mondrian.rolap.RolapConnection$1.call(RolapConnection.java:623)
      8. mondrian.rolap.RolapConnection$1.call(RolapConnection.java:621)
      8 frames
    25. Java RT
      Thread.run
      1. java.util.concurrent.FutureTask.run(Unknown Source)
      2. java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
      3. java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
      4. java.lang.Thread.run(Unknown Source)
      4 frames