xref: /aosp_15_r20/external/armnn/src/armnnSerializer/test/LstmSerializationTests.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2021, 2023 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #include "../Serializer.hpp"
7*89c4ff92SAndroid Build Coastguard Worker #include "SerializerTestUtils.hpp"
8*89c4ff92SAndroid Build Coastguard Worker 
9*89c4ff92SAndroid Build Coastguard Worker #include <armnn/Descriptors.hpp>
10*89c4ff92SAndroid Build Coastguard Worker #include <armnn/INetwork.hpp>
11*89c4ff92SAndroid Build Coastguard Worker #include <armnn/IRuntime.hpp>
12*89c4ff92SAndroid Build Coastguard Worker #include <armnnDeserializer/IDeserializer.hpp>
13*89c4ff92SAndroid Build Coastguard Worker #include <armnn/utility/IgnoreUnused.hpp>
14*89c4ff92SAndroid Build Coastguard Worker #include <armnn/LstmParams.hpp>
15*89c4ff92SAndroid Build Coastguard Worker #include <armnn/QuantizedLstmParams.hpp>
16*89c4ff92SAndroid Build Coastguard Worker 
17*89c4ff92SAndroid Build Coastguard Worker #include <doctest/doctest.h>
18*89c4ff92SAndroid Build Coastguard Worker #include <fmt/format.h>
19*89c4ff92SAndroid Build Coastguard Worker 
20*89c4ff92SAndroid Build Coastguard Worker 
21*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("SerializerTests")
22*89c4ff92SAndroid Build Coastguard Worker {
23*89c4ff92SAndroid Build Coastguard Worker template<typename Descriptor>
ConstantVector2LstmInputParams(const std::vector<armnn::ConstTensor> & constants,Descriptor & descriptor)24*89c4ff92SAndroid Build Coastguard Worker armnn::LstmInputParams ConstantVector2LstmInputParams(const std::vector<armnn::ConstTensor>& constants,
25*89c4ff92SAndroid Build Coastguard Worker                                                       Descriptor& descriptor)
26*89c4ff92SAndroid Build Coastguard Worker {
27*89c4ff92SAndroid Build Coastguard Worker     armnn::LstmInputParams lstmInputParams;
28*89c4ff92SAndroid Build Coastguard Worker     size_t i = 0;
29*89c4ff92SAndroid Build Coastguard Worker 
30*89c4ff92SAndroid Build Coastguard Worker     // Inserting basic paramters
31*89c4ff92SAndroid Build Coastguard Worker     lstmInputParams.m_InputToForgetWeights     = &constants[i++];
32*89c4ff92SAndroid Build Coastguard Worker     lstmInputParams.m_InputToCellWeights       = &constants[i++];
33*89c4ff92SAndroid Build Coastguard Worker     lstmInputParams.m_InputToOutputWeights     = &constants[i++];
34*89c4ff92SAndroid Build Coastguard Worker     lstmInputParams.m_RecurrentToForgetWeights = &constants[i++];
35*89c4ff92SAndroid Build Coastguard Worker     lstmInputParams.m_RecurrentToCellWeights   = &constants[i++];
36*89c4ff92SAndroid Build Coastguard Worker     lstmInputParams.m_RecurrentToOutputWeights = &constants[i++];
37*89c4ff92SAndroid Build Coastguard Worker     lstmInputParams.m_ForgetGateBias           = &constants[i++];
38*89c4ff92SAndroid Build Coastguard Worker     lstmInputParams.m_CellBias                 = &constants[i++];
39*89c4ff92SAndroid Build Coastguard Worker     lstmInputParams.m_OutputGateBias           = &constants[i++];
40*89c4ff92SAndroid Build Coastguard Worker     if (!descriptor.m_CifgEnabled)
41*89c4ff92SAndroid Build Coastguard Worker     {
42*89c4ff92SAndroid Build Coastguard Worker         lstmInputParams.m_InputToInputWeights     = &constants[i++];
43*89c4ff92SAndroid Build Coastguard Worker         lstmInputParams.m_RecurrentToInputWeights = &constants[i++];
44*89c4ff92SAndroid Build Coastguard Worker         lstmInputParams.m_InputGateBias           = &constants[i++];
45*89c4ff92SAndroid Build Coastguard Worker     }
46*89c4ff92SAndroid Build Coastguard Worker 
47*89c4ff92SAndroid Build Coastguard Worker     if (descriptor.m_PeepholeEnabled)
48*89c4ff92SAndroid Build Coastguard Worker     {
49*89c4ff92SAndroid Build Coastguard Worker         if (!descriptor.m_CifgEnabled)
50*89c4ff92SAndroid Build Coastguard Worker         {
51*89c4ff92SAndroid Build Coastguard Worker             lstmInputParams.m_CellToInputWeights = &constants[i++];
52*89c4ff92SAndroid Build Coastguard Worker         }
53*89c4ff92SAndroid Build Coastguard Worker         lstmInputParams.m_CellToForgetWeights = &constants[i++];
54*89c4ff92SAndroid Build Coastguard Worker         lstmInputParams.m_CellToOutputWeights = &constants[i++];
55*89c4ff92SAndroid Build Coastguard Worker     }
56*89c4ff92SAndroid Build Coastguard Worker 
57*89c4ff92SAndroid Build Coastguard Worker     if (descriptor.m_ProjectionEnabled)
58*89c4ff92SAndroid Build Coastguard Worker     {
59*89c4ff92SAndroid Build Coastguard Worker         lstmInputParams.m_ProjectionWeights = &constants[i++];
60*89c4ff92SAndroid Build Coastguard Worker         lstmInputParams.m_ProjectionBias    = &constants[i++];
61*89c4ff92SAndroid Build Coastguard Worker     }
62*89c4ff92SAndroid Build Coastguard Worker 
63*89c4ff92SAndroid Build Coastguard Worker     if (descriptor.m_LayerNormEnabled)
64*89c4ff92SAndroid Build Coastguard Worker     {
65*89c4ff92SAndroid Build Coastguard Worker         if (!descriptor.m_CifgEnabled)
66*89c4ff92SAndroid Build Coastguard Worker         {
67*89c4ff92SAndroid Build Coastguard Worker             lstmInputParams.m_InputLayerNormWeights = &constants[i++];
68*89c4ff92SAndroid Build Coastguard Worker         }
69*89c4ff92SAndroid Build Coastguard Worker         lstmInputParams.m_ForgetLayerNormWeights = &constants[i++];
70*89c4ff92SAndroid Build Coastguard Worker         lstmInputParams.m_CellLayerNormWeights   = &constants[i++];
71*89c4ff92SAndroid Build Coastguard Worker         lstmInputParams.m_OutputLayerNormWeights = &constants[i++];
72*89c4ff92SAndroid Build Coastguard Worker     }
73*89c4ff92SAndroid Build Coastguard Worker 
74*89c4ff92SAndroid Build Coastguard Worker     return lstmInputParams;
75*89c4ff92SAndroid Build Coastguard Worker }
76*89c4ff92SAndroid Build Coastguard Worker 
77*89c4ff92SAndroid Build Coastguard Worker // Works for Lstm, UnidirectionalSequenceLstm and QLstm (QuantizedLstm uses different parameters)
78*89c4ff92SAndroid Build Coastguard Worker template<typename Descriptor>
79*89c4ff92SAndroid Build Coastguard Worker class VerifyLstmLayer : public LayerVerifierBaseWithDescriptor<Descriptor>
80*89c4ff92SAndroid Build Coastguard Worker {
81*89c4ff92SAndroid Build Coastguard Worker public:
VerifyLstmLayer(const std::string & layerName,const std::vector<armnn::TensorInfo> & inputInfos,const std::vector<armnn::TensorInfo> & outputInfos,const Descriptor & descriptor,const armnn::LstmInputParams & inputParams)82*89c4ff92SAndroid Build Coastguard Worker     VerifyLstmLayer(const std::string& layerName,
83*89c4ff92SAndroid Build Coastguard Worker                     const std::vector<armnn::TensorInfo>& inputInfos,
84*89c4ff92SAndroid Build Coastguard Worker                     const std::vector<armnn::TensorInfo>& outputInfos,
85*89c4ff92SAndroid Build Coastguard Worker                     const Descriptor& descriptor,
86*89c4ff92SAndroid Build Coastguard Worker                     const armnn::LstmInputParams& inputParams)
87*89c4ff92SAndroid Build Coastguard Worker         : LayerVerifierBaseWithDescriptor<Descriptor>(layerName, inputInfos, outputInfos, descriptor)
88*89c4ff92SAndroid Build Coastguard Worker         , m_InputParams(inputParams) {}
89*89c4ff92SAndroid Build Coastguard Worker 
ExecuteStrategy(const armnn::IConnectableLayer * layer,const armnn::BaseDescriptor & descriptor,const std::vector<armnn::ConstTensor> & constants,const char * name,const armnn::LayerBindingId id=0)90*89c4ff92SAndroid Build Coastguard Worker     void ExecuteStrategy(const armnn::IConnectableLayer* layer,
91*89c4ff92SAndroid Build Coastguard Worker                          const armnn::BaseDescriptor& descriptor,
92*89c4ff92SAndroid Build Coastguard Worker                          const std::vector<armnn::ConstTensor>& constants,
93*89c4ff92SAndroid Build Coastguard Worker                          const char* name,
94*89c4ff92SAndroid Build Coastguard Worker                          const armnn::LayerBindingId id = 0) override
95*89c4ff92SAndroid Build Coastguard Worker     {
96*89c4ff92SAndroid Build Coastguard Worker         armnn::IgnoreUnused(constants, id);
97*89c4ff92SAndroid Build Coastguard Worker         switch (layer->GetType())
98*89c4ff92SAndroid Build Coastguard Worker         {
99*89c4ff92SAndroid Build Coastguard Worker             case armnn::LayerType::Input: break;
100*89c4ff92SAndroid Build Coastguard Worker             case armnn::LayerType::Output: break;
101*89c4ff92SAndroid Build Coastguard Worker             case armnn::LayerType::Lstm:
102*89c4ff92SAndroid Build Coastguard Worker             case armnn::LayerType::UnidirectionalSequenceLstm:
103*89c4ff92SAndroid Build Coastguard Worker             {
104*89c4ff92SAndroid Build Coastguard Worker                 this->VerifyNameAndConnections(layer, name);
105*89c4ff92SAndroid Build Coastguard Worker                 const Descriptor& internalDescriptor = static_cast<const Descriptor&>(descriptor);
106*89c4ff92SAndroid Build Coastguard Worker                 this->VerifyDescriptor(internalDescriptor);
107*89c4ff92SAndroid Build Coastguard Worker                 armnn::LstmInputParams lstmParams = ConstantVector2LstmInputParams(constants, internalDescriptor);
108*89c4ff92SAndroid Build Coastguard Worker                 VerifyInputParameters(lstmParams);
109*89c4ff92SAndroid Build Coastguard Worker                 break;
110*89c4ff92SAndroid Build Coastguard Worker             }
111*89c4ff92SAndroid Build Coastguard Worker             case armnn::LayerType::QLstm:
112*89c4ff92SAndroid Build Coastguard Worker             {
113*89c4ff92SAndroid Build Coastguard Worker                 this->VerifyNameAndConnections(layer, name);
114*89c4ff92SAndroid Build Coastguard Worker                 const Descriptor& internalDescriptor = static_cast<const Descriptor&>(descriptor);
115*89c4ff92SAndroid Build Coastguard Worker                 this->VerifyDescriptor(internalDescriptor);
116*89c4ff92SAndroid Build Coastguard Worker                 armnn::LstmInputParams lstmParams = ConstantVector2LstmInputParams(constants, internalDescriptor);
117*89c4ff92SAndroid Build Coastguard Worker                 VerifyInputParameters(lstmParams);
118*89c4ff92SAndroid Build Coastguard Worker                 break;
119*89c4ff92SAndroid Build Coastguard Worker             }
120*89c4ff92SAndroid Build Coastguard Worker             default:
121*89c4ff92SAndroid Build Coastguard Worker             {
122*89c4ff92SAndroid Build Coastguard Worker                 throw armnn::Exception("Unexpected layer type in Lstm test model");
123*89c4ff92SAndroid Build Coastguard Worker             }
124*89c4ff92SAndroid Build Coastguard Worker         }
125*89c4ff92SAndroid Build Coastguard Worker     }
126*89c4ff92SAndroid Build Coastguard Worker 
127*89c4ff92SAndroid Build Coastguard Worker protected:
VerifyInputParameters(const armnn::LstmInputParams & params)128*89c4ff92SAndroid Build Coastguard Worker     void VerifyInputParameters(const armnn::LstmInputParams& params)
129*89c4ff92SAndroid Build Coastguard Worker     {
130*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
131*89c4ff92SAndroid Build Coastguard Worker             "m_InputToInputWeights", m_InputParams.m_InputToInputWeights, params.m_InputToInputWeights);
132*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
133*89c4ff92SAndroid Build Coastguard Worker             "m_InputToForgetWeights", m_InputParams.m_InputToForgetWeights, params.m_InputToForgetWeights);
134*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
135*89c4ff92SAndroid Build Coastguard Worker             "m_InputToCellWeights", m_InputParams.m_InputToCellWeights, params.m_InputToCellWeights);
136*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
137*89c4ff92SAndroid Build Coastguard Worker             "m_InputToOutputWeights", m_InputParams.m_InputToOutputWeights, params.m_InputToOutputWeights);
138*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
139*89c4ff92SAndroid Build Coastguard Worker             "m_RecurrentToInputWeights", m_InputParams.m_RecurrentToInputWeights, params.m_RecurrentToInputWeights);
140*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
141*89c4ff92SAndroid Build Coastguard Worker             "m_RecurrentToForgetWeights", m_InputParams.m_RecurrentToForgetWeights, params.m_RecurrentToForgetWeights);
142*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
143*89c4ff92SAndroid Build Coastguard Worker             "m_RecurrentToCellWeights", m_InputParams.m_RecurrentToCellWeights, params.m_RecurrentToCellWeights);
144*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
145*89c4ff92SAndroid Build Coastguard Worker             "m_RecurrentToOutputWeights", m_InputParams.m_RecurrentToOutputWeights, params.m_RecurrentToOutputWeights);
146*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
147*89c4ff92SAndroid Build Coastguard Worker             "m_CellToInputWeights", m_InputParams.m_CellToInputWeights, params.m_CellToInputWeights);
148*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
149*89c4ff92SAndroid Build Coastguard Worker             "m_CellToForgetWeights", m_InputParams.m_CellToForgetWeights, params.m_CellToForgetWeights);
150*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
151*89c4ff92SAndroid Build Coastguard Worker             "m_CellToOutputWeights", m_InputParams.m_CellToOutputWeights, params.m_CellToOutputWeights);
152*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
153*89c4ff92SAndroid Build Coastguard Worker             "m_InputGateBias", m_InputParams.m_InputGateBias, params.m_InputGateBias);
154*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
155*89c4ff92SAndroid Build Coastguard Worker             "m_ForgetGateBias", m_InputParams.m_ForgetGateBias, params.m_ForgetGateBias);
156*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
157*89c4ff92SAndroid Build Coastguard Worker             "m_CellBias", m_InputParams.m_CellBias, params.m_CellBias);
158*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
159*89c4ff92SAndroid Build Coastguard Worker             "m_OutputGateBias", m_InputParams.m_OutputGateBias, params.m_OutputGateBias);
160*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
161*89c4ff92SAndroid Build Coastguard Worker             "m_ProjectionWeights", m_InputParams.m_ProjectionWeights, params.m_ProjectionWeights);
162*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
163*89c4ff92SAndroid Build Coastguard Worker             "m_ProjectionBias", m_InputParams.m_ProjectionBias, params.m_ProjectionBias);
164*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
165*89c4ff92SAndroid Build Coastguard Worker             "m_InputLayerNormWeights", m_InputParams.m_InputLayerNormWeights, params.m_InputLayerNormWeights);
166*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
167*89c4ff92SAndroid Build Coastguard Worker             "m_ForgetLayerNormWeights", m_InputParams.m_ForgetLayerNormWeights, params.m_ForgetLayerNormWeights);
168*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
169*89c4ff92SAndroid Build Coastguard Worker             "m_CellLayerNormWeights", m_InputParams.m_CellLayerNormWeights, params.m_CellLayerNormWeights);
170*89c4ff92SAndroid Build Coastguard Worker         this->VerifyConstTensors(
171*89c4ff92SAndroid Build Coastguard Worker             "m_OutputLayerNormWeights", m_InputParams.m_OutputLayerNormWeights, params.m_OutputLayerNormWeights);
172*89c4ff92SAndroid Build Coastguard Worker     }
173*89c4ff92SAndroid Build Coastguard Worker 
174*89c4ff92SAndroid Build Coastguard Worker private:
175*89c4ff92SAndroid Build Coastguard Worker     armnn::LstmInputParams m_InputParams;
176*89c4ff92SAndroid Build Coastguard Worker };
177*89c4ff92SAndroid Build Coastguard Worker 
178*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SerializeDeserializeLstmCifgPeepholeNoProjection")
179*89c4ff92SAndroid Build Coastguard Worker {
180*89c4ff92SAndroid Build Coastguard Worker     armnn::LstmDescriptor descriptor;
181*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ActivationFunc = 4;
182*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ClippingThresProj = 0.0f;
183*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ClippingThresCell = 0.0f;
184*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_CifgEnabled = true; // if this is true then we DON'T need to set the OptCifgParams
185*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ProjectionEnabled = false;
186*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_PeepholeEnabled = true;
187*89c4ff92SAndroid Build Coastguard Worker 
188*89c4ff92SAndroid Build Coastguard Worker     const uint32_t batchSize = 1;
189*89c4ff92SAndroid Build Coastguard Worker     const uint32_t inputSize = 2;
190*89c4ff92SAndroid Build Coastguard Worker     const uint32_t numUnits = 4;
191*89c4ff92SAndroid Build Coastguard Worker     const uint32_t outputSize = numUnits;
192*89c4ff92SAndroid Build Coastguard Worker 
193*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputWeightsInfo1({numUnits, inputSize}, armnn::DataType::Float32, 0.0f, 0, true);
194*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToForgetWeightsData = GenerateRandomData<float>(inputWeightsInfo1.GetNumElements());
195*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToForgetWeights(inputWeightsInfo1, inputToForgetWeightsData);
196*89c4ff92SAndroid Build Coastguard Worker 
197*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToCellWeightsData = GenerateRandomData<float>(inputWeightsInfo1.GetNumElements());
198*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToCellWeights(inputWeightsInfo1, inputToCellWeightsData);
199*89c4ff92SAndroid Build Coastguard Worker 
200*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToOutputWeightsData = GenerateRandomData<float>(inputWeightsInfo1.GetNumElements());
201*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToOutputWeights(inputWeightsInfo1, inputToOutputWeightsData);
202*89c4ff92SAndroid Build Coastguard Worker 
203*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputWeightsInfo2({numUnits, outputSize}, armnn::DataType::Float32, 0.0f, 0, true);
204*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToForgetWeightsData = GenerateRandomData<float>(inputWeightsInfo2.GetNumElements());
205*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToForgetWeights(inputWeightsInfo2, recurrentToForgetWeightsData);
206*89c4ff92SAndroid Build Coastguard Worker 
207*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToCellWeightsData = GenerateRandomData<float>(inputWeightsInfo2.GetNumElements());
208*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToCellWeights(inputWeightsInfo2, recurrentToCellWeightsData);
209*89c4ff92SAndroid Build Coastguard Worker 
210*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToOutputWeightsData = GenerateRandomData<float>(inputWeightsInfo2.GetNumElements());
211*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToOutputWeights(inputWeightsInfo2, recurrentToOutputWeightsData);
212*89c4ff92SAndroid Build Coastguard Worker 
213*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputWeightsInfo3({numUnits}, armnn::DataType::Float32, 0.0f, 0, true);
214*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToForgetWeightsData = GenerateRandomData<float>(inputWeightsInfo3.GetNumElements());
215*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToForgetWeights(inputWeightsInfo3, cellToForgetWeightsData);
216*89c4ff92SAndroid Build Coastguard Worker 
217*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToOutputWeightsData = GenerateRandomData<float>(inputWeightsInfo3.GetNumElements());
218*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToOutputWeights(inputWeightsInfo3, cellToOutputWeightsData);
219*89c4ff92SAndroid Build Coastguard Worker 
220*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> forgetGateBiasData(numUnits, 1.0f);
221*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor forgetGateBias(inputWeightsInfo3, forgetGateBiasData);
222*89c4ff92SAndroid Build Coastguard Worker 
223*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellBiasData(numUnits, 0.0f);
224*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellBias(inputWeightsInfo3, cellBiasData);
225*89c4ff92SAndroid Build Coastguard Worker 
226*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> outputGateBiasData(numUnits, 0.0f);
227*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor outputGateBias(inputWeightsInfo3, outputGateBiasData);
228*89c4ff92SAndroid Build Coastguard Worker 
229*89c4ff92SAndroid Build Coastguard Worker     armnn::LstmInputParams params;
230*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToForgetWeights = &inputToForgetWeights;
231*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToCellWeights = &inputToCellWeights;
232*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToOutputWeights = &inputToOutputWeights;
233*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
234*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToCellWeights = &recurrentToCellWeights;
235*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
236*89c4ff92SAndroid Build Coastguard Worker     params.m_ForgetGateBias = &forgetGateBias;
237*89c4ff92SAndroid Build Coastguard Worker     params.m_CellBias = &cellBias;
238*89c4ff92SAndroid Build Coastguard Worker     params.m_OutputGateBias = &outputGateBias;
239*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToForgetWeights = &cellToForgetWeights;
240*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToOutputWeights = &cellToOutputWeights;
241*89c4ff92SAndroid Build Coastguard Worker 
242*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr network = armnn::INetwork::Create();
243*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const inputLayer   = network->AddInputLayer(0);
244*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateIn = network->AddInputLayer(1);
245*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(2);
246*89c4ff92SAndroid Build Coastguard Worker     const std::string layerName("lstm");
247*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const lstmLayer = network->AddLstmLayer(descriptor, params, layerName.c_str());
248*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const scratchBuffer  = network->AddOutputLayer(0);
249*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputStateOut  = network->AddOutputLayer(1);
250*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateOut  = network->AddOutputLayer(2);
251*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputLayer  = network->AddOutputLayer(3);
252*89c4ff92SAndroid Build Coastguard Worker 
253*89c4ff92SAndroid Build Coastguard Worker     // connect up
254*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputTensorInfo({ batchSize, inputSize }, armnn::DataType::Float32);
255*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo cellStateTensorInfo({ batchSize, numUnits}, armnn::DataType::Float32);
256*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputStateTensorInfo({ batchSize, outputSize }, armnn::DataType::Float32);
257*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo lstmTensorInfoScratchBuff({ batchSize, numUnits * 3 }, armnn::DataType::Float32);
258*89c4ff92SAndroid Build Coastguard Worker 
259*89c4ff92SAndroid Build Coastguard Worker     inputLayer->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(0));
260*89c4ff92SAndroid Build Coastguard Worker     inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
261*89c4ff92SAndroid Build Coastguard Worker 
262*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(1));
263*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).SetTensorInfo(outputStateTensorInfo);
264*89c4ff92SAndroid Build Coastguard Worker 
265*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(2));
266*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).SetTensorInfo(cellStateTensorInfo);
267*89c4ff92SAndroid Build Coastguard Worker 
268*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(0).Connect(scratchBuffer->GetInputSlot(0));
269*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(0).SetTensorInfo(lstmTensorInfoScratchBuff);
270*89c4ff92SAndroid Build Coastguard Worker 
271*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(1).Connect(outputStateOut->GetInputSlot(0));
272*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(1).SetTensorInfo(outputStateTensorInfo);
273*89c4ff92SAndroid Build Coastguard Worker 
274*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(2).Connect(cellStateOut->GetInputSlot(0));
275*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(2).SetTensorInfo(cellStateTensorInfo);
276*89c4ff92SAndroid Build Coastguard Worker 
277*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(3).Connect(outputLayer->GetInputSlot(0));
278*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(3).SetTensorInfo(outputStateTensorInfo);
279*89c4ff92SAndroid Build Coastguard Worker 
280*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
281*89c4ff92SAndroid Build Coastguard Worker     CHECK(deserializedNetwork);
282*89c4ff92SAndroid Build Coastguard Worker 
283*89c4ff92SAndroid Build Coastguard Worker     VerifyLstmLayer<armnn::LstmDescriptor> checker(
284*89c4ff92SAndroid Build Coastguard Worker         layerName,
285*89c4ff92SAndroid Build Coastguard Worker         {inputTensorInfo, outputStateTensorInfo, cellStateTensorInfo},
286*89c4ff92SAndroid Build Coastguard Worker         {lstmTensorInfoScratchBuff, outputStateTensorInfo, cellStateTensorInfo, outputStateTensorInfo},
287*89c4ff92SAndroid Build Coastguard Worker         descriptor,
288*89c4ff92SAndroid Build Coastguard Worker         params);
289*89c4ff92SAndroid Build Coastguard Worker     deserializedNetwork->ExecuteStrategy(checker);
290*89c4ff92SAndroid Build Coastguard Worker }
291*89c4ff92SAndroid Build Coastguard Worker 
292*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SerializeDeserializeLstmNoCifgWithPeepholeAndProjection")
293*89c4ff92SAndroid Build Coastguard Worker {
294*89c4ff92SAndroid Build Coastguard Worker     armnn::LstmDescriptor descriptor;
295*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ActivationFunc = 4;
296*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ClippingThresProj = 0.0f;
297*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ClippingThresCell = 0.0f;
298*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_CifgEnabled = false; // if this is true then we DON'T need to set the OptCifgParams
299*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ProjectionEnabled = true;
300*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_PeepholeEnabled = true;
301*89c4ff92SAndroid Build Coastguard Worker 
302*89c4ff92SAndroid Build Coastguard Worker     const uint32_t batchSize = 2;
303*89c4ff92SAndroid Build Coastguard Worker     const uint32_t inputSize = 5;
304*89c4ff92SAndroid Build Coastguard Worker     const uint32_t numUnits = 20;
305*89c4ff92SAndroid Build Coastguard Worker     const uint32_t outputSize = 16;
306*89c4ff92SAndroid Build Coastguard Worker 
307*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo20x5({numUnits, inputSize}, armnn::DataType::Float32, 0.0f, 0, true);
308*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToInputWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
309*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToInputWeights(tensorInfo20x5, inputToInputWeightsData);
310*89c4ff92SAndroid Build Coastguard Worker 
311*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToForgetWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
312*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToForgetWeights(tensorInfo20x5, inputToForgetWeightsData);
313*89c4ff92SAndroid Build Coastguard Worker 
314*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToCellWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
315*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToCellWeights(tensorInfo20x5, inputToCellWeightsData);
316*89c4ff92SAndroid Build Coastguard Worker 
317*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToOutputWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
318*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToOutputWeights(tensorInfo20x5, inputToOutputWeightsData);
319*89c4ff92SAndroid Build Coastguard Worker 
320*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo20({numUnits}, armnn::DataType::Float32, 0.0f, 0, true);
321*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
322*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputGateBias(tensorInfo20, inputGateBiasData);
323*89c4ff92SAndroid Build Coastguard Worker 
324*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> forgetGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
325*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor forgetGateBias(tensorInfo20, forgetGateBiasData);
326*89c4ff92SAndroid Build Coastguard Worker 
327*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
328*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellBias(tensorInfo20, cellBiasData);
329*89c4ff92SAndroid Build Coastguard Worker 
330*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> outputGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
331*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor outputGateBias(tensorInfo20, outputGateBiasData);
332*89c4ff92SAndroid Build Coastguard Worker 
333*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo20x16({numUnits, outputSize}, armnn::DataType::Float32, 0.0f, 0, true);
334*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToInputWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
335*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToInputWeights(tensorInfo20x16, recurrentToInputWeightsData);
336*89c4ff92SAndroid Build Coastguard Worker 
337*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToForgetWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
338*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToForgetWeights(tensorInfo20x16, recurrentToForgetWeightsData);
339*89c4ff92SAndroid Build Coastguard Worker 
340*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToCellWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
341*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToCellWeights(tensorInfo20x16, recurrentToCellWeightsData);
342*89c4ff92SAndroid Build Coastguard Worker 
343*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToOutputWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
344*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToOutputWeights(tensorInfo20x16, recurrentToOutputWeightsData);
345*89c4ff92SAndroid Build Coastguard Worker 
346*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToInputWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
347*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToInputWeights(tensorInfo20, cellToInputWeightsData);
348*89c4ff92SAndroid Build Coastguard Worker 
349*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToForgetWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
350*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToForgetWeights(tensorInfo20, cellToForgetWeightsData);
351*89c4ff92SAndroid Build Coastguard Worker 
352*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToOutputWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
353*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToOutputWeights(tensorInfo20,  cellToOutputWeightsData);
354*89c4ff92SAndroid Build Coastguard Worker 
355*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo16x20({outputSize, numUnits}, armnn::DataType::Float32, 0.0f, 0, true);
356*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> projectionWeightsData = GenerateRandomData<float>(tensorInfo16x20.GetNumElements());
357*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor projectionWeights(tensorInfo16x20, projectionWeightsData);
358*89c4ff92SAndroid Build Coastguard Worker 
359*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo16({outputSize}, armnn::DataType::Float32, 0.0f, 0, true);
360*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> projectionBiasData(outputSize, 0.f);
361*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor projectionBias(tensorInfo16, projectionBiasData);
362*89c4ff92SAndroid Build Coastguard Worker 
363*89c4ff92SAndroid Build Coastguard Worker     armnn::LstmInputParams params;
364*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToForgetWeights = &inputToForgetWeights;
365*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToCellWeights = &inputToCellWeights;
366*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToOutputWeights = &inputToOutputWeights;
367*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
368*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToCellWeights = &recurrentToCellWeights;
369*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
370*89c4ff92SAndroid Build Coastguard Worker     params.m_ForgetGateBias = &forgetGateBias;
371*89c4ff92SAndroid Build Coastguard Worker     params.m_CellBias = &cellBias;
372*89c4ff92SAndroid Build Coastguard Worker     params.m_OutputGateBias = &outputGateBias;
373*89c4ff92SAndroid Build Coastguard Worker 
374*89c4ff92SAndroid Build Coastguard Worker     // additional params because: descriptor.m_CifgEnabled = false
375*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToInputWeights = &inputToInputWeights;
376*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToInputWeights = &recurrentToInputWeights;
377*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToInputWeights = &cellToInputWeights;
378*89c4ff92SAndroid Build Coastguard Worker     params.m_InputGateBias = &inputGateBias;
379*89c4ff92SAndroid Build Coastguard Worker 
380*89c4ff92SAndroid Build Coastguard Worker     // additional params because: descriptor.m_ProjectionEnabled = true
381*89c4ff92SAndroid Build Coastguard Worker     params.m_ProjectionWeights = &projectionWeights;
382*89c4ff92SAndroid Build Coastguard Worker     params.m_ProjectionBias = &projectionBias;
383*89c4ff92SAndroid Build Coastguard Worker 
384*89c4ff92SAndroid Build Coastguard Worker     // additional params because: descriptor.m_PeepholeEnabled = true
385*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToForgetWeights = &cellToForgetWeights;
386*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToOutputWeights = &cellToOutputWeights;
387*89c4ff92SAndroid Build Coastguard Worker 
388*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr network = armnn::INetwork::Create();
389*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const inputLayer   = network->AddInputLayer(0);
390*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateIn = network->AddInputLayer(1);
391*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(2);
392*89c4ff92SAndroid Build Coastguard Worker     const std::string layerName("lstm");
393*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const lstmLayer = network->AddLstmLayer(descriptor, params, layerName.c_str());
394*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const scratchBuffer  = network->AddOutputLayer(0);
395*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputStateOut  = network->AddOutputLayer(1);
396*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateOut  = network->AddOutputLayer(2);
397*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputLayer  = network->AddOutputLayer(3);
398*89c4ff92SAndroid Build Coastguard Worker 
399*89c4ff92SAndroid Build Coastguard Worker     // connect up
400*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputTensorInfo({ batchSize, inputSize }, armnn::DataType::Float32);
401*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo cellStateTensorInfo({ batchSize, numUnits}, armnn::DataType::Float32);
402*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputStateTensorInfo({ batchSize, outputSize }, armnn::DataType::Float32);
403*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo lstmTensorInfoScratchBuff({ batchSize, numUnits * 4 }, armnn::DataType::Float32);
404*89c4ff92SAndroid Build Coastguard Worker 
405*89c4ff92SAndroid Build Coastguard Worker     inputLayer->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(0));
406*89c4ff92SAndroid Build Coastguard Worker     inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
407*89c4ff92SAndroid Build Coastguard Worker 
408*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(1));
409*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).SetTensorInfo(outputStateTensorInfo);
410*89c4ff92SAndroid Build Coastguard Worker 
411*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(2));
412*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).SetTensorInfo(cellStateTensorInfo);
413*89c4ff92SAndroid Build Coastguard Worker 
414*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(0).Connect(scratchBuffer->GetInputSlot(0));
415*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(0).SetTensorInfo(lstmTensorInfoScratchBuff);
416*89c4ff92SAndroid Build Coastguard Worker 
417*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(1).Connect(outputStateOut->GetInputSlot(0));
418*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(1).SetTensorInfo(outputStateTensorInfo);
419*89c4ff92SAndroid Build Coastguard Worker 
420*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(2).Connect(cellStateOut->GetInputSlot(0));
421*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(2).SetTensorInfo(cellStateTensorInfo);
422*89c4ff92SAndroid Build Coastguard Worker 
423*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(3).Connect(outputLayer->GetInputSlot(0));
424*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(3).SetTensorInfo(outputStateTensorInfo);
425*89c4ff92SAndroid Build Coastguard Worker 
426*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
427*89c4ff92SAndroid Build Coastguard Worker     CHECK(deserializedNetwork);
428*89c4ff92SAndroid Build Coastguard Worker 
429*89c4ff92SAndroid Build Coastguard Worker     VerifyLstmLayer<armnn::LstmDescriptor> checker(
430*89c4ff92SAndroid Build Coastguard Worker         layerName,
431*89c4ff92SAndroid Build Coastguard Worker         {inputTensorInfo, outputStateTensorInfo, cellStateTensorInfo},
432*89c4ff92SAndroid Build Coastguard Worker         {lstmTensorInfoScratchBuff, outputStateTensorInfo, cellStateTensorInfo, outputStateTensorInfo},
433*89c4ff92SAndroid Build Coastguard Worker         descriptor,
434*89c4ff92SAndroid Build Coastguard Worker         params);
435*89c4ff92SAndroid Build Coastguard Worker     deserializedNetwork->ExecuteStrategy(checker);
436*89c4ff92SAndroid Build Coastguard Worker }
437*89c4ff92SAndroid Build Coastguard Worker 
438*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SerializeDeserializeLstmNoCifgWithPeepholeWithProjectionWithLayerNorm")
439*89c4ff92SAndroid Build Coastguard Worker {
440*89c4ff92SAndroid Build Coastguard Worker     armnn::LstmDescriptor descriptor;
441*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ActivationFunc = 4;
442*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ClippingThresProj = 0.0f;
443*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ClippingThresCell = 0.0f;
444*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_CifgEnabled = false; // if this is true then we DON'T need to set the OptCifgParams
445*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ProjectionEnabled = true;
446*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_PeepholeEnabled = true;
447*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_LayerNormEnabled = true;
448*89c4ff92SAndroid Build Coastguard Worker 
449*89c4ff92SAndroid Build Coastguard Worker     const uint32_t batchSize = 2;
450*89c4ff92SAndroid Build Coastguard Worker     const uint32_t inputSize = 5;
451*89c4ff92SAndroid Build Coastguard Worker     const uint32_t numUnits = 20;
452*89c4ff92SAndroid Build Coastguard Worker     const uint32_t outputSize = 16;
453*89c4ff92SAndroid Build Coastguard Worker 
454*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo20x5({numUnits, inputSize}, armnn::DataType::Float32, 0.0f, 0, true);
455*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToInputWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
456*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToInputWeights(tensorInfo20x5, inputToInputWeightsData);
457*89c4ff92SAndroid Build Coastguard Worker 
458*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToForgetWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
459*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToForgetWeights(tensorInfo20x5, inputToForgetWeightsData);
460*89c4ff92SAndroid Build Coastguard Worker 
461*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToCellWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
462*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToCellWeights(tensorInfo20x5, inputToCellWeightsData);
463*89c4ff92SAndroid Build Coastguard Worker 
464*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToOutputWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
465*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToOutputWeights(tensorInfo20x5, inputToOutputWeightsData);
466*89c4ff92SAndroid Build Coastguard Worker 
467*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo20({numUnits}, armnn::DataType::Float32, 0.0f, 0, true);
468*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
469*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputGateBias(tensorInfo20, inputGateBiasData);
470*89c4ff92SAndroid Build Coastguard Worker 
471*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> forgetGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
472*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor forgetGateBias(tensorInfo20, forgetGateBiasData);
473*89c4ff92SAndroid Build Coastguard Worker 
474*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
475*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellBias(tensorInfo20, cellBiasData);
476*89c4ff92SAndroid Build Coastguard Worker 
477*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> outputGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
478*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor outputGateBias(tensorInfo20, outputGateBiasData);
479*89c4ff92SAndroid Build Coastguard Worker 
480*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo20x16({numUnits, outputSize}, armnn::DataType::Float32, 0.0f, 0, true);
481*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToInputWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
482*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToInputWeights(tensorInfo20x16, recurrentToInputWeightsData);
483*89c4ff92SAndroid Build Coastguard Worker 
484*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToForgetWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
485*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToForgetWeights(tensorInfo20x16, recurrentToForgetWeightsData);
486*89c4ff92SAndroid Build Coastguard Worker 
487*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToCellWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
488*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToCellWeights(tensorInfo20x16, recurrentToCellWeightsData);
489*89c4ff92SAndroid Build Coastguard Worker 
490*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToOutputWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
491*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToOutputWeights(tensorInfo20x16, recurrentToOutputWeightsData);
492*89c4ff92SAndroid Build Coastguard Worker 
493*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToInputWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
494*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToInputWeights(tensorInfo20, cellToInputWeightsData);
495*89c4ff92SAndroid Build Coastguard Worker 
496*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToForgetWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
497*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToForgetWeights(tensorInfo20, cellToForgetWeightsData);
498*89c4ff92SAndroid Build Coastguard Worker 
499*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToOutputWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
500*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToOutputWeights(tensorInfo20,  cellToOutputWeightsData);
501*89c4ff92SAndroid Build Coastguard Worker 
502*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo16x20({outputSize, numUnits}, armnn::DataType::Float32, 0.0f, 0, true);
503*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> projectionWeightsData = GenerateRandomData<float>(tensorInfo16x20.GetNumElements());
504*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor projectionWeights(tensorInfo16x20, projectionWeightsData);
505*89c4ff92SAndroid Build Coastguard Worker 
506*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo16({outputSize}, armnn::DataType::Float32, 0.0f, 0, true);
507*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> projectionBiasData(outputSize, 0.f);
508*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor projectionBias(tensorInfo16, projectionBiasData);
509*89c4ff92SAndroid Build Coastguard Worker 
510*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputLayerNormWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
511*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputLayerNormWeights(tensorInfo20, forgetGateBiasData);
512*89c4ff92SAndroid Build Coastguard Worker 
513*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> forgetLayerNormWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
514*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor forgetLayerNormWeights(tensorInfo20, forgetGateBiasData);
515*89c4ff92SAndroid Build Coastguard Worker 
516*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellLayerNormWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
517*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellLayerNormWeights(tensorInfo20, forgetGateBiasData);
518*89c4ff92SAndroid Build Coastguard Worker 
519*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> outLayerNormWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
520*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor outLayerNormWeights(tensorInfo20, forgetGateBiasData);
521*89c4ff92SAndroid Build Coastguard Worker 
522*89c4ff92SAndroid Build Coastguard Worker     armnn::LstmInputParams params;
523*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToForgetWeights = &inputToForgetWeights;
524*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToCellWeights = &inputToCellWeights;
525*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToOutputWeights = &inputToOutputWeights;
526*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
527*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToCellWeights = &recurrentToCellWeights;
528*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
529*89c4ff92SAndroid Build Coastguard Worker     params.m_ForgetGateBias = &forgetGateBias;
530*89c4ff92SAndroid Build Coastguard Worker     params.m_CellBias = &cellBias;
531*89c4ff92SAndroid Build Coastguard Worker     params.m_OutputGateBias = &outputGateBias;
532*89c4ff92SAndroid Build Coastguard Worker 
533*89c4ff92SAndroid Build Coastguard Worker     // additional params because: descriptor.m_CifgEnabled = false
534*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToInputWeights = &inputToInputWeights;
535*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToInputWeights = &recurrentToInputWeights;
536*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToInputWeights = &cellToInputWeights;
537*89c4ff92SAndroid Build Coastguard Worker     params.m_InputGateBias = &inputGateBias;
538*89c4ff92SAndroid Build Coastguard Worker 
539*89c4ff92SAndroid Build Coastguard Worker     // additional params because: descriptor.m_ProjectionEnabled = true
540*89c4ff92SAndroid Build Coastguard Worker     params.m_ProjectionWeights = &projectionWeights;
541*89c4ff92SAndroid Build Coastguard Worker     params.m_ProjectionBias = &projectionBias;
542*89c4ff92SAndroid Build Coastguard Worker 
543*89c4ff92SAndroid Build Coastguard Worker     // additional params because: descriptor.m_PeepholeEnabled = true
544*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToForgetWeights = &cellToForgetWeights;
545*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToOutputWeights = &cellToOutputWeights;
546*89c4ff92SAndroid Build Coastguard Worker 
547*89c4ff92SAndroid Build Coastguard Worker     // additional params because: despriptor.m_LayerNormEnabled = true
548*89c4ff92SAndroid Build Coastguard Worker     params.m_InputLayerNormWeights = &inputLayerNormWeights;
549*89c4ff92SAndroid Build Coastguard Worker     params.m_ForgetLayerNormWeights = &forgetLayerNormWeights;
550*89c4ff92SAndroid Build Coastguard Worker     params.m_CellLayerNormWeights = &cellLayerNormWeights;
551*89c4ff92SAndroid Build Coastguard Worker     params.m_OutputLayerNormWeights = &outLayerNormWeights;
552*89c4ff92SAndroid Build Coastguard Worker 
553*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr network = armnn::INetwork::Create();
554*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const inputLayer   = network->AddInputLayer(0);
555*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateIn = network->AddInputLayer(1);
556*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(2);
557*89c4ff92SAndroid Build Coastguard Worker     const std::string layerName("lstm");
558*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const lstmLayer = network->AddLstmLayer(descriptor, params, layerName.c_str());
559*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const scratchBuffer  = network->AddOutputLayer(0);
560*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputStateOut  = network->AddOutputLayer(1);
561*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateOut  = network->AddOutputLayer(2);
562*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputLayer  = network->AddOutputLayer(3);
563*89c4ff92SAndroid Build Coastguard Worker 
564*89c4ff92SAndroid Build Coastguard Worker     // connect up
565*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputTensorInfo({ batchSize, inputSize }, armnn::DataType::Float32);
566*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo cellStateTensorInfo({ batchSize, numUnits}, armnn::DataType::Float32);
567*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputStateTensorInfo({ batchSize, outputSize }, armnn::DataType::Float32);
568*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo lstmTensorInfoScratchBuff({ batchSize, numUnits * 4 }, armnn::DataType::Float32);
569*89c4ff92SAndroid Build Coastguard Worker 
570*89c4ff92SAndroid Build Coastguard Worker     inputLayer->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(0));
571*89c4ff92SAndroid Build Coastguard Worker     inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
572*89c4ff92SAndroid Build Coastguard Worker 
573*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(1));
574*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).SetTensorInfo(outputStateTensorInfo);
575*89c4ff92SAndroid Build Coastguard Worker 
576*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(2));
577*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).SetTensorInfo(cellStateTensorInfo);
578*89c4ff92SAndroid Build Coastguard Worker 
579*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(0).Connect(scratchBuffer->GetInputSlot(0));
580*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(0).SetTensorInfo(lstmTensorInfoScratchBuff);
581*89c4ff92SAndroid Build Coastguard Worker 
582*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(1).Connect(outputStateOut->GetInputSlot(0));
583*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(1).SetTensorInfo(outputStateTensorInfo);
584*89c4ff92SAndroid Build Coastguard Worker 
585*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(2).Connect(cellStateOut->GetInputSlot(0));
586*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(2).SetTensorInfo(cellStateTensorInfo);
587*89c4ff92SAndroid Build Coastguard Worker 
588*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(3).Connect(outputLayer->GetInputSlot(0));
589*89c4ff92SAndroid Build Coastguard Worker     lstmLayer->GetOutputSlot(3).SetTensorInfo(outputStateTensorInfo);
590*89c4ff92SAndroid Build Coastguard Worker 
591*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
592*89c4ff92SAndroid Build Coastguard Worker     CHECK(deserializedNetwork);
593*89c4ff92SAndroid Build Coastguard Worker 
594*89c4ff92SAndroid Build Coastguard Worker     VerifyLstmLayer<armnn::LstmDescriptor> checker(
595*89c4ff92SAndroid Build Coastguard Worker             layerName,
596*89c4ff92SAndroid Build Coastguard Worker             {inputTensorInfo, outputStateTensorInfo, cellStateTensorInfo},
597*89c4ff92SAndroid Build Coastguard Worker             {lstmTensorInfoScratchBuff, outputStateTensorInfo, cellStateTensorInfo, outputStateTensorInfo},
598*89c4ff92SAndroid Build Coastguard Worker             descriptor,
599*89c4ff92SAndroid Build Coastguard Worker             params);
600*89c4ff92SAndroid Build Coastguard Worker     deserializedNetwork->ExecuteStrategy(checker);
601*89c4ff92SAndroid Build Coastguard Worker }
602*89c4ff92SAndroid Build Coastguard Worker 
603*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("EnsureLstmLayersBackwardCompatibility")
604*89c4ff92SAndroid Build Coastguard Worker {
605*89c4ff92SAndroid Build Coastguard Worker     // The hex data below is a flat buffer containing a lstm layer with no Cifg, with peephole and projection
606*89c4ff92SAndroid Build Coastguard Worker     // enabled. That data was obtained before additional layer normalization parameters where added to the
607*89c4ff92SAndroid Build Coastguard Worker     // lstm serializer. That way it can be tested if a lstm model with the old parameter configuration can
608*89c4ff92SAndroid Build Coastguard Worker     // still be loaded
609*89c4ff92SAndroid Build Coastguard Worker     const std::vector<uint8_t> lstmNoCifgWithPeepholeAndProjectionModel =
610*89c4ff92SAndroid Build Coastguard Worker     {
611*89c4ff92SAndroid Build Coastguard Worker         0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
612*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
613*89c4ff92SAndroid Build Coastguard Worker         0xDC, 0x29, 0x00, 0x00, 0x38, 0x29, 0x00, 0x00, 0xB4, 0x28, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0x3C, 0x01,
614*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
615*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00,
616*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x70, 0xD6, 0xFF, 0xFF,
617*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x06, 0xD7, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x88, 0xD7,
618*89c4ff92SAndroid Build Coastguard Worker         0xFF, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xF6, 0xD6, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00,
619*89c4ff92SAndroid Build Coastguard Worker         0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
620*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
621*89c4ff92SAndroid Build Coastguard Worker         0xE8, 0xD7, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xC8, 0xD6, 0xFF, 0xFF, 0x00, 0x00,
622*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x5E, 0xD7, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xE0, 0xD7, 0xFF, 0xFF,
623*89c4ff92SAndroid Build Coastguard Worker         0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4E, 0xD7, 0xFF, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00,
624*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
625*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xD8,
626*89c4ff92SAndroid Build Coastguard Worker         0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0xD7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
627*89c4ff92SAndroid Build Coastguard Worker         0x04, 0x00, 0x00, 0x00, 0xB6, 0xD7, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x38, 0xD8, 0xFF, 0xFF, 0x08, 0x00,
628*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xA6, 0xD7, 0xFF, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
629*89c4ff92SAndroid Build Coastguard Worker         0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
630*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0xD8, 0xFF, 0xFF,
631*89c4ff92SAndroid Build Coastguard Worker         0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x78, 0xD7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B, 0x04, 0x00,
632*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x0E, 0xD8, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x16, 0xD8, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00,
633*89c4ff92SAndroid Build Coastguard Worker         0xFA, 0xD7, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00,
634*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
635*89c4ff92SAndroid Build Coastguard Worker         0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xD8, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
636*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x6C, 0xD8, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00,
637*89c4ff92SAndroid Build Coastguard Worker         0x12, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0xE0, 0x25, 0x00, 0x00, 0xD0, 0x25,
638*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x48, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00,
639*89c4ff92SAndroid Build Coastguard Worker         0x10, 0x00, 0x14, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2C, 0x00, 0x30, 0x00,
640*89c4ff92SAndroid Build Coastguard Worker         0x34, 0x00, 0x38, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x44, 0x00, 0x26, 0x00, 0x00, 0x00, 0xC4, 0x23, 0x00, 0x00,
641*89c4ff92SAndroid Build Coastguard Worker         0xF8, 0x21, 0x00, 0x00, 0x2C, 0x20, 0x00, 0x00, 0xF0, 0x1A, 0x00, 0x00, 0xB4, 0x15, 0x00, 0x00, 0x78, 0x10,
642*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x68, 0x0F, 0x00, 0x00, 0xE0, 0x0E, 0x00, 0x00, 0x14, 0x0D, 0x00, 0x00,
643*89c4ff92SAndroid Build Coastguard Worker         0xD8, 0x07, 0x00, 0x00, 0x50, 0x07, 0x00, 0x00, 0xC8, 0x06, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x14, 0x01,
644*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xEE, 0xD7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03,
645*89c4ff92SAndroid Build Coastguard Worker         0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFE, 0xD8, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x14, 0x00,
646*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
647*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
648*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
649*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
650*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xD8, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01,
651*89c4ff92SAndroid Build Coastguard Worker         0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x72, 0xD8,
652*89c4ff92SAndroid Build Coastguard Worker         0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x82, 0xD9, 0xFF, 0xFF,
653*89c4ff92SAndroid Build Coastguard Worker         0x04, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
654*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
655*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
656*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
657*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xD8,
658*89c4ff92SAndroid Build Coastguard Worker         0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
659*89c4ff92SAndroid Build Coastguard Worker         0x14, 0x00, 0x00, 0x00, 0xF6, 0xD8, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x54, 0x00, 0x00, 0x00, 0x04, 0x00,
660*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x06, 0xDA, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
661*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
662*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
663*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
664*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xD9, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
665*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x6A, 0xD9, 0xFF, 0xFF, 0x00, 0x00,
666*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x03, 0x14, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7A, 0xDA, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00,
667*89c4ff92SAndroid Build Coastguard Worker         0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
668*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
669*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
670*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
671*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
672*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
673*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
674*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
675*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
676*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
677*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
678*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
679*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
680*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
681*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
682*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
683*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
684*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
685*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
686*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
687*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
688*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
689*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
690*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
691*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
692*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
693*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
694*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
695*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
696*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
697*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
698*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
699*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
700*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
701*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
702*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
703*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
704*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
705*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
706*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
707*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
708*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
709*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
710*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
711*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
712*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
713*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
714*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
715*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
716*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
717*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
718*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
719*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
720*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
721*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
722*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
723*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
724*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
725*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
726*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
727*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
728*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
729*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
730*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
731*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
732*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
733*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
734*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
735*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
736*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
737*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
738*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xDE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
739*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xA2, 0xDE,
740*89c4ff92SAndroid Build Coastguard Worker         0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xB2, 0xDF, 0xFF, 0xFF,
741*89c4ff92SAndroid Build Coastguard Worker         0x04, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
742*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
743*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
744*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
745*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xDF,
746*89c4ff92SAndroid Build Coastguard Worker         0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
747*89c4ff92SAndroid Build Coastguard Worker         0x14, 0x00, 0x00, 0x00, 0x26, 0xDF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00,
748*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x36, 0xE0, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
749*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
750*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
751*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
752*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
753*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x92, 0xDF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
754*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xAA, 0xDF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03,
755*89c4ff92SAndroid Build Coastguard Worker         0x14, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xBA, 0xE0, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x40, 0x01,
756*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
757*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
758*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
759*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
760*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
761*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
762*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
763*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
764*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
765*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
766*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
767*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
768*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
769*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
770*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
771*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
772*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
773*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
774*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
775*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
776*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
777*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
778*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
779*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
780*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
781*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
782*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
783*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
784*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
785*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
786*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
787*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
788*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
789*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
790*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
791*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
792*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
793*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
794*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
795*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
796*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
797*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
798*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
799*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
800*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
801*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
802*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
803*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
804*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
805*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
806*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
807*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
808*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
809*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
810*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
811*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
812*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
813*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
814*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
815*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
816*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
817*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
818*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
819*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
820*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
821*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
822*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
823*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
824*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
825*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
826*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
827*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0xC6, 0xE4, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
828*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xE2, 0xE4, 0xFF, 0xFF,
829*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x03, 0xA4, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xF2, 0xE5, 0xFF, 0xFF, 0x04, 0x00,
830*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
831*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
832*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
833*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
834*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
835*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
836*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
837*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
838*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
839*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
840*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
841*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
842*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
843*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
844*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
845*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
846*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
847*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
848*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
849*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
850*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
851*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
852*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0xE6, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01,
853*89c4ff92SAndroid Build Coastguard Worker         0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x05, 0x00,
854*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0xAA, 0xE6, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
855*89c4ff92SAndroid Build Coastguard Worker         0xBA, 0xE7, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
856*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
857*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
858*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
859*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
860*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x16, 0xE7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
861*89c4ff92SAndroid Build Coastguard Worker         0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x2E, 0xE7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x64, 0x00,
862*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3E, 0xE8, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
863*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
864*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
865*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
866*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
867*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xE7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00,
868*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xB2, 0xE7, 0xFF, 0xFF,
869*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x03, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xC2, 0xE8, 0xFF, 0xFF, 0x04, 0x00,
870*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
871*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
872*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
873*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
874*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xE8, 0xFF, 0xFF,
875*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00,
876*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x36, 0xE8, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x14, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
877*89c4ff92SAndroid Build Coastguard Worker         0x46, 0xE9, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
878*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
879*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
880*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
881*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
882*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
883*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
884*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
885*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
886*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
887*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
888*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
889*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
890*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
891*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
892*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
893*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
894*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
895*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
896*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
897*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
898*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
899*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
900*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
901*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
902*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
903*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
904*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
905*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
906*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
907*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
908*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
909*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
910*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
911*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
912*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
913*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
914*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
915*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
916*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
917*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
918*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
919*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
920*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
921*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
922*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
923*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
924*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
925*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
926*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
927*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
928*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
929*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
930*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
931*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
932*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
933*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
934*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
935*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
936*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
937*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
938*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
939*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
940*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
941*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
942*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
943*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
944*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
945*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
946*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
947*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
948*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xED, 0xFF, 0xFF,
949*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00,
950*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x6E, 0xED, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x14, 0x05, 0x00, 0x00,
951*89c4ff92SAndroid Build Coastguard Worker         0x04, 0x00, 0x00, 0x00, 0x7E, 0xEE, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00,
952*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
953*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
954*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
955*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
956*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
957*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
958*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
959*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
960*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
961*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
962*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
963*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
964*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
965*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
966*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
967*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
968*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
969*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
970*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
971*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
972*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
973*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
974*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
975*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
976*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
977*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
978*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
979*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
980*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
981*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
982*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
983*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
984*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
985*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
986*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
987*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
988*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
989*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
990*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
991*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
992*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
993*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
994*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
995*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
996*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
997*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
998*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
999*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1000*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1001*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1002*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1003*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1004*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1005*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1006*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1007*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1008*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1009*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1010*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1011*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1012*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1013*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1014*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1015*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1016*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1017*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1018*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1019*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1020*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1021*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1022*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1023*89c4ff92SAndroid Build Coastguard Worker         0x8A, 0xF2, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
1024*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xA6, 0xF2, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03,
1025*89c4ff92SAndroid Build Coastguard Worker         0x14, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xB6, 0xF3, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x40, 0x01,
1026*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1027*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1028*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1029*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1030*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1031*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1032*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1033*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1034*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1035*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1036*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1037*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1038*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1039*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1040*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1041*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1042*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1043*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1044*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1045*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1046*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1047*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1048*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1049*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1050*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1051*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1052*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1053*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1054*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1055*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1056*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1057*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1058*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1059*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1060*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1061*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1062*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1063*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1064*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1065*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1066*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1067*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1068*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1069*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1070*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1071*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1072*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1073*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1074*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1075*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1076*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1077*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1078*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1079*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1080*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1081*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1082*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1083*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1084*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1085*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1086*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1087*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1088*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1089*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1090*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1091*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1092*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1093*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1094*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1095*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1096*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1097*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0xC2, 0xF7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1098*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xDE, 0xF7, 0xFF, 0xFF,
1099*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x03, 0xA4, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xEE, 0xF8, 0xFF, 0xFF, 0x04, 0x00,
1100*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1101*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1102*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1103*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1104*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1105*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1106*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1107*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1108*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1109*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1110*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1111*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1112*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1113*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1114*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1115*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1116*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1117*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1118*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1119*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1120*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1121*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1122*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0xF9, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01,
1123*89c4ff92SAndroid Build Coastguard Worker         0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x05, 0x00,
1124*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0xA6, 0xF9, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0xA4, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1125*89c4ff92SAndroid Build Coastguard Worker         0xB6, 0xFA, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1126*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1127*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1128*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1129*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1130*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1131*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1132*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1133*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1134*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1135*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1136*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1137*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1138*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1139*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1140*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1141*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1142*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1143*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1144*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1145*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1146*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1147*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xFB,
1148*89c4ff92SAndroid Build Coastguard Worker         0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
1149*89c4ff92SAndroid Build Coastguard Worker         0x14, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x6E, 0xFB, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0xA4, 0x01,
1150*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7E, 0xFC, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00,
1151*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1152*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1153*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1154*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1155*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1156*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1157*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1158*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1159*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1160*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1161*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1162*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1163*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1164*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1165*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1166*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1167*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1168*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1169*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1170*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1171*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1172*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1173*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x1A, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1174*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0C, 0x00,
1175*89c4ff92SAndroid Build Coastguard Worker         0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1176*89c4ff92SAndroid Build Coastguard Worker         0x01, 0x01, 0x04, 0x00, 0x00, 0x00, 0x2E, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
1177*89c4ff92SAndroid Build Coastguard Worker         0x22, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6C, 0x73,
1178*89c4ff92SAndroid Build Coastguard Worker         0x74, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xEC, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00,
1179*89c4ff92SAndroid Build Coastguard Worker         0xB4, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x30, 0x00,
1180*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1181*89c4ff92SAndroid Build Coastguard Worker         0xA6, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
1182*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00,
1183*89c4ff92SAndroid Build Coastguard Worker         0x04, 0x00, 0x00, 0x00, 0xCE, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1184*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x64, 0xFF, 0xFF, 0xFF,
1185*89c4ff92SAndroid Build Coastguard Worker         0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00,
1186*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
1187*89c4ff92SAndroid Build Coastguard Worker         0xB4, 0xFE, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x1A, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00,
1188*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
1189*89c4ff92SAndroid Build Coastguard Worker         0xF0, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
1190*89c4ff92SAndroid Build Coastguard Worker         0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
1191*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1192*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
1193*89c4ff92SAndroid Build Coastguard Worker         0x7E, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00,
1194*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x76, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00,
1195*89c4ff92SAndroid Build Coastguard Worker         0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1196*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1197*89c4ff92SAndroid Build Coastguard Worker         0x68, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xCE, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00,
1198*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
1199*89c4ff92SAndroid Build Coastguard Worker         0x08, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x0C, 0x00,
1200*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
1201*89c4ff92SAndroid Build Coastguard Worker         0x08, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00,
1202*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00,
1203*89c4ff92SAndroid Build Coastguard Worker         0x0E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
1204*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1205*89c4ff92SAndroid Build Coastguard Worker         0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
1206*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6E, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
1207*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00,
1208*89c4ff92SAndroid Build Coastguard Worker         0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
1209*89c4ff92SAndroid Build Coastguard Worker         0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x06, 0x00,
1210*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
1211*89c4ff92SAndroid Build Coastguard Worker         0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
1212*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1213*89c4ff92SAndroid Build Coastguard Worker         0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
1214*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0C, 0x00,
1215*89c4ff92SAndroid Build Coastguard Worker         0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
1216*89c4ff92SAndroid Build Coastguard Worker         0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00
1217*89c4ff92SAndroid Build Coastguard Worker     };
1218*89c4ff92SAndroid Build Coastguard Worker 
1219*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr deserializedNetwork =
1220*89c4ff92SAndroid Build Coastguard Worker         DeserializeNetwork(std::string(lstmNoCifgWithPeepholeAndProjectionModel.begin(),
1221*89c4ff92SAndroid Build Coastguard Worker                                        lstmNoCifgWithPeepholeAndProjectionModel.end()));
1222*89c4ff92SAndroid Build Coastguard Worker 
1223*89c4ff92SAndroid Build Coastguard Worker     CHECK(deserializedNetwork);
1224*89c4ff92SAndroid Build Coastguard Worker 
1225*89c4ff92SAndroid Build Coastguard Worker     // generating the same model parameters which where used to serialize the model (Layer norm is not specified)
1226*89c4ff92SAndroid Build Coastguard Worker     armnn::LstmDescriptor descriptor;
1227*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ActivationFunc    = 4;
1228*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ClippingThresProj = 0.0f;
1229*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ClippingThresCell = 0.0f;
1230*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_CifgEnabled       = false;
1231*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ProjectionEnabled = true;
1232*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_PeepholeEnabled   = true;
1233*89c4ff92SAndroid Build Coastguard Worker 
1234*89c4ff92SAndroid Build Coastguard Worker     const uint32_t batchSize  = 2u;
1235*89c4ff92SAndroid Build Coastguard Worker     const uint32_t inputSize  = 5u;
1236*89c4ff92SAndroid Build Coastguard Worker     const uint32_t numUnits   = 20u;
1237*89c4ff92SAndroid Build Coastguard Worker     const uint32_t outputSize = 16u;
1238*89c4ff92SAndroid Build Coastguard Worker 
1239*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo20x5({numUnits, inputSize}, armnn::DataType::Float32, 0.0f, 0, true);
1240*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToInputWeightsData(tensorInfo20x5.GetNumElements(), 0.0f);
1241*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToInputWeights(tensorInfo20x5, inputToInputWeightsData);
1242*89c4ff92SAndroid Build Coastguard Worker 
1243*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToForgetWeightsData(tensorInfo20x5.GetNumElements(), 0.0f);
1244*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToForgetWeights(tensorInfo20x5, inputToForgetWeightsData);
1245*89c4ff92SAndroid Build Coastguard Worker 
1246*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToCellWeightsData(tensorInfo20x5.GetNumElements(), 0.0f);
1247*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToCellWeights(tensorInfo20x5, inputToCellWeightsData);
1248*89c4ff92SAndroid Build Coastguard Worker 
1249*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToOutputWeightsData(tensorInfo20x5.GetNumElements(), 0.0f);
1250*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToOutputWeights(tensorInfo20x5, inputToOutputWeightsData);
1251*89c4ff92SAndroid Build Coastguard Worker 
1252*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo20({numUnits}, armnn::DataType::Float32, 0.0f, 0, true);
1253*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputGateBiasData(tensorInfo20.GetNumElements(), 0.0f);
1254*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputGateBias(tensorInfo20, inputGateBiasData);
1255*89c4ff92SAndroid Build Coastguard Worker 
1256*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> forgetGateBiasData(tensorInfo20.GetNumElements(), 0.0f);
1257*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor forgetGateBias(tensorInfo20, forgetGateBiasData);
1258*89c4ff92SAndroid Build Coastguard Worker 
1259*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellBiasData(tensorInfo20.GetNumElements(), 0.0f);
1260*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellBias(tensorInfo20, cellBiasData);
1261*89c4ff92SAndroid Build Coastguard Worker 
1262*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> outputGateBiasData(tensorInfo20.GetNumElements(), 0.0f);
1263*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor outputGateBias(tensorInfo20, outputGateBiasData);
1264*89c4ff92SAndroid Build Coastguard Worker 
1265*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo20x16({numUnits, outputSize}, armnn::DataType::Float32, 0.0f, 0, true);
1266*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToInputWeightsData(tensorInfo20x16.GetNumElements(), 0.0f);
1267*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToInputWeights(tensorInfo20x16, recurrentToInputWeightsData);
1268*89c4ff92SAndroid Build Coastguard Worker 
1269*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToForgetWeightsData(tensorInfo20x16.GetNumElements(), 0.0f);
1270*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToForgetWeights(tensorInfo20x16, recurrentToForgetWeightsData);
1271*89c4ff92SAndroid Build Coastguard Worker 
1272*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToCellWeightsData(tensorInfo20x16.GetNumElements(), 0.0f);
1273*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToCellWeights(tensorInfo20x16, recurrentToCellWeightsData);
1274*89c4ff92SAndroid Build Coastguard Worker 
1275*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToOutputWeightsData(tensorInfo20x16.GetNumElements(), 0.0f);
1276*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToOutputWeights(tensorInfo20x16, recurrentToOutputWeightsData);
1277*89c4ff92SAndroid Build Coastguard Worker 
1278*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToInputWeightsData(tensorInfo20.GetNumElements(), 0.0f);
1279*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToInputWeights(tensorInfo20, cellToInputWeightsData);
1280*89c4ff92SAndroid Build Coastguard Worker 
1281*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToForgetWeightsData(tensorInfo20.GetNumElements(), 0.0f);
1282*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToForgetWeights(tensorInfo20, cellToForgetWeightsData);
1283*89c4ff92SAndroid Build Coastguard Worker 
1284*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToOutputWeightsData(tensorInfo20.GetNumElements(), 0.0f);
1285*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToOutputWeights(tensorInfo20,  cellToOutputWeightsData);
1286*89c4ff92SAndroid Build Coastguard Worker 
1287*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo16x20({outputSize, numUnits}, armnn::DataType::Float32, 0.0f, 0, true);
1288*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> projectionWeightsData(tensorInfo16x20.GetNumElements(), 0.0f);
1289*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor projectionWeights(tensorInfo16x20, projectionWeightsData);
1290*89c4ff92SAndroid Build Coastguard Worker 
1291*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo16({outputSize}, armnn::DataType::Float32, 0.0f, 0, true);
1292*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> projectionBiasData(outputSize, 0.0f);
1293*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor projectionBias(tensorInfo16, projectionBiasData);
1294*89c4ff92SAndroid Build Coastguard Worker 
1295*89c4ff92SAndroid Build Coastguard Worker     armnn::LstmInputParams params;
1296*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToForgetWeights     = &inputToForgetWeights;
1297*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToCellWeights       = &inputToCellWeights;
1298*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToOutputWeights     = &inputToOutputWeights;
1299*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1300*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToCellWeights   = &recurrentToCellWeights;
1301*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1302*89c4ff92SAndroid Build Coastguard Worker     params.m_ForgetGateBias           = &forgetGateBias;
1303*89c4ff92SAndroid Build Coastguard Worker     params.m_CellBias                 = &cellBias;
1304*89c4ff92SAndroid Build Coastguard Worker     params.m_OutputGateBias           = &outputGateBias;
1305*89c4ff92SAndroid Build Coastguard Worker 
1306*89c4ff92SAndroid Build Coastguard Worker     // additional params because: descriptor.m_CifgEnabled = false
1307*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToInputWeights      = &inputToInputWeights;
1308*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToInputWeights  = &recurrentToInputWeights;
1309*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToInputWeights       = &cellToInputWeights;
1310*89c4ff92SAndroid Build Coastguard Worker     params.m_InputGateBias            = &inputGateBias;
1311*89c4ff92SAndroid Build Coastguard Worker 
1312*89c4ff92SAndroid Build Coastguard Worker     // additional params because: descriptor.m_ProjectionEnabled = true
1313*89c4ff92SAndroid Build Coastguard Worker     params.m_ProjectionWeights        = &projectionWeights;
1314*89c4ff92SAndroid Build Coastguard Worker     params.m_ProjectionBias           = &projectionBias;
1315*89c4ff92SAndroid Build Coastguard Worker 
1316*89c4ff92SAndroid Build Coastguard Worker     // additional params because: descriptor.m_PeepholeEnabled = true
1317*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToForgetWeights      = &cellToForgetWeights;
1318*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToOutputWeights      = &cellToOutputWeights;
1319*89c4ff92SAndroid Build Coastguard Worker 
1320*89c4ff92SAndroid Build Coastguard Worker     const std::string layerName("lstm");
1321*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputTensorInfo({ batchSize, inputSize }, armnn::DataType::Float32, 0.0f , 0);
1322*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo cellStateTensorInfo({ batchSize, numUnits}, armnn::DataType::Float32, 0.0f , 0);
1323*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputStateTensorInfo({ batchSize, outputSize }, armnn::DataType::Float32, 0.0f , 0);
1324*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo lstmTensorInfoScratchBuff({ batchSize, numUnits * 4 }, armnn::DataType::Float32, 0.0f , 0);
1325*89c4ff92SAndroid Build Coastguard Worker 
1326*89c4ff92SAndroid Build Coastguard Worker     VerifyLstmLayer<armnn::LstmDescriptor> checker(
1327*89c4ff92SAndroid Build Coastguard Worker             layerName,
1328*89c4ff92SAndroid Build Coastguard Worker             {inputTensorInfo, outputStateTensorInfo, cellStateTensorInfo},
1329*89c4ff92SAndroid Build Coastguard Worker             {lstmTensorInfoScratchBuff, outputStateTensorInfo, cellStateTensorInfo, outputStateTensorInfo},
1330*89c4ff92SAndroid Build Coastguard Worker             descriptor,
1331*89c4ff92SAndroid Build Coastguard Worker             params);
1332*89c4ff92SAndroid Build Coastguard Worker     deserializedNetwork->ExecuteStrategy(checker);
1333*89c4ff92SAndroid Build Coastguard Worker }
1334*89c4ff92SAndroid Build Coastguard Worker 
ConstantsVector2QuantizedLstmInputParams(const std::vector<armnn::ConstTensor> & constants)1335*89c4ff92SAndroid Build Coastguard Worker armnn::QuantizedLstmInputParams ConstantsVector2QuantizedLstmInputParams(
1336*89c4ff92SAndroid Build Coastguard Worker         const std::vector<armnn::ConstTensor>& constants)
1337*89c4ff92SAndroid Build Coastguard Worker {
1338*89c4ff92SAndroid Build Coastguard Worker     armnn::QuantizedLstmInputParams params;
1339*89c4ff92SAndroid Build Coastguard Worker 
1340*89c4ff92SAndroid Build Coastguard Worker     // index for constants vector
1341*89c4ff92SAndroid Build Coastguard Worker     size_t i = 0;
1342*89c4ff92SAndroid Build Coastguard Worker 
1343*89c4ff92SAndroid Build Coastguard Worker     // Get input parameters
1344*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToInputWeights  = &constants[i++];
1345*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToForgetWeights = &constants[i++];
1346*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToCellWeights   = &constants[i++];
1347*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToOutputWeights = &constants[i++];
1348*89c4ff92SAndroid Build Coastguard Worker 
1349*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToInputWeights  = &constants[i++];
1350*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToForgetWeights = &constants[i++];
1351*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToCellWeights   = &constants[i++];
1352*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToOutputWeights = &constants[i++];
1353*89c4ff92SAndroid Build Coastguard Worker 
1354*89c4ff92SAndroid Build Coastguard Worker     params.m_InputGateBias  = &constants[i++];
1355*89c4ff92SAndroid Build Coastguard Worker     params.m_ForgetGateBias = &constants[i++];
1356*89c4ff92SAndroid Build Coastguard Worker     params.m_CellBias       = &constants[i++];
1357*89c4ff92SAndroid Build Coastguard Worker     params.m_OutputGateBias = &constants[i++];
1358*89c4ff92SAndroid Build Coastguard Worker 
1359*89c4ff92SAndroid Build Coastguard Worker     return params;
1360*89c4ff92SAndroid Build Coastguard Worker }
1361*89c4ff92SAndroid Build Coastguard Worker 
1362*89c4ff92SAndroid Build Coastguard Worker class VerifyQuantizedLstmLayer : public LayerVerifierBase
1363*89c4ff92SAndroid Build Coastguard Worker {
1364*89c4ff92SAndroid Build Coastguard Worker 
1365*89c4ff92SAndroid Build Coastguard Worker public:
VerifyQuantizedLstmLayer(const std::string & layerName,const std::vector<armnn::TensorInfo> & inputInfos,const std::vector<armnn::TensorInfo> & outputInfos,const armnn::QuantizedLstmInputParams & inputParams)1366*89c4ff92SAndroid Build Coastguard Worker     VerifyQuantizedLstmLayer(const std::string& layerName,
1367*89c4ff92SAndroid Build Coastguard Worker                              const std::vector<armnn::TensorInfo>& inputInfos,
1368*89c4ff92SAndroid Build Coastguard Worker                              const std::vector<armnn::TensorInfo>& outputInfos,
1369*89c4ff92SAndroid Build Coastguard Worker                              const armnn::QuantizedLstmInputParams& inputParams)
1370*89c4ff92SAndroid Build Coastguard Worker         : LayerVerifierBase(layerName, inputInfos, outputInfos), m_InputParams(inputParams) {}
1371*89c4ff92SAndroid Build Coastguard Worker 
ExecuteStrategy(const armnn::IConnectableLayer * layer,const armnn::BaseDescriptor & descriptor,const std::vector<armnn::ConstTensor> & constants,const char * name,const armnn::LayerBindingId id=0)1372*89c4ff92SAndroid Build Coastguard Worker     void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1373*89c4ff92SAndroid Build Coastguard Worker                          const armnn::BaseDescriptor& descriptor,
1374*89c4ff92SAndroid Build Coastguard Worker                          const std::vector<armnn::ConstTensor>& constants,
1375*89c4ff92SAndroid Build Coastguard Worker                          const char* name,
1376*89c4ff92SAndroid Build Coastguard Worker                          const armnn::LayerBindingId id = 0) override
1377*89c4ff92SAndroid Build Coastguard Worker     {
1378*89c4ff92SAndroid Build Coastguard Worker         armnn::IgnoreUnused(descriptor, constants, id);
1379*89c4ff92SAndroid Build Coastguard Worker         switch (layer->GetType())
1380*89c4ff92SAndroid Build Coastguard Worker         {
1381*89c4ff92SAndroid Build Coastguard Worker             case armnn::LayerType::Input: break;
1382*89c4ff92SAndroid Build Coastguard Worker             case armnn::LayerType::Output: break;
1383*89c4ff92SAndroid Build Coastguard Worker             case armnn::LayerType::QuantizedLstm:
1384*89c4ff92SAndroid Build Coastguard Worker             {
1385*89c4ff92SAndroid Build Coastguard Worker                 VerifyNameAndConnections(layer, name);
1386*89c4ff92SAndroid Build Coastguard Worker                 armnn::QuantizedLstmInputParams params = ConstantsVector2QuantizedLstmInputParams(constants);
1387*89c4ff92SAndroid Build Coastguard Worker                 VerifyInputParameters(params);
1388*89c4ff92SAndroid Build Coastguard Worker                 break;
1389*89c4ff92SAndroid Build Coastguard Worker             }
1390*89c4ff92SAndroid Build Coastguard Worker             default:
1391*89c4ff92SAndroid Build Coastguard Worker             {
1392*89c4ff92SAndroid Build Coastguard Worker                 throw armnn::Exception(fmt::format("Unexpected layer type in QuantizedLstm test model:",
1393*89c4ff92SAndroid Build Coastguard Worker                                                            layer->GetName()));
1394*89c4ff92SAndroid Build Coastguard Worker             }
1395*89c4ff92SAndroid Build Coastguard Worker         }
1396*89c4ff92SAndroid Build Coastguard Worker     }
1397*89c4ff92SAndroid Build Coastguard Worker 
1398*89c4ff92SAndroid Build Coastguard Worker protected:
VerifyInputParameters(const armnn::QuantizedLstmInputParams & params)1399*89c4ff92SAndroid Build Coastguard Worker     void VerifyInputParameters(const armnn::QuantizedLstmInputParams& params)
1400*89c4ff92SAndroid Build Coastguard Worker     {
1401*89c4ff92SAndroid Build Coastguard Worker         VerifyConstTensors("m_InputToInputWeights",
1402*89c4ff92SAndroid Build Coastguard Worker                            m_InputParams.m_InputToInputWeights, params.m_InputToInputWeights);
1403*89c4ff92SAndroid Build Coastguard Worker         VerifyConstTensors("m_InputToForgetWeights",
1404*89c4ff92SAndroid Build Coastguard Worker                            m_InputParams.m_InputToForgetWeights, params.m_InputToForgetWeights);
1405*89c4ff92SAndroid Build Coastguard Worker         VerifyConstTensors("m_InputToCellWeights",
1406*89c4ff92SAndroid Build Coastguard Worker                            m_InputParams.m_InputToCellWeights, params.m_InputToCellWeights);
1407*89c4ff92SAndroid Build Coastguard Worker         VerifyConstTensors("m_InputToOutputWeights",
1408*89c4ff92SAndroid Build Coastguard Worker                            m_InputParams.m_InputToOutputWeights, params.m_InputToOutputWeights);
1409*89c4ff92SAndroid Build Coastguard Worker         VerifyConstTensors("m_RecurrentToInputWeights",
1410*89c4ff92SAndroid Build Coastguard Worker                            m_InputParams.m_RecurrentToInputWeights, params.m_RecurrentToInputWeights);
1411*89c4ff92SAndroid Build Coastguard Worker         VerifyConstTensors("m_RecurrentToForgetWeights",
1412*89c4ff92SAndroid Build Coastguard Worker                            m_InputParams.m_RecurrentToForgetWeights, params.m_RecurrentToForgetWeights);
1413*89c4ff92SAndroid Build Coastguard Worker         VerifyConstTensors("m_RecurrentToCellWeights",
1414*89c4ff92SAndroid Build Coastguard Worker                            m_InputParams.m_RecurrentToCellWeights, params.m_RecurrentToCellWeights);
1415*89c4ff92SAndroid Build Coastguard Worker         VerifyConstTensors("m_RecurrentToOutputWeights",
1416*89c4ff92SAndroid Build Coastguard Worker                            m_InputParams.m_RecurrentToOutputWeights, params.m_RecurrentToOutputWeights);
1417*89c4ff92SAndroid Build Coastguard Worker         VerifyConstTensors("m_InputGateBias",
1418*89c4ff92SAndroid Build Coastguard Worker                            m_InputParams.m_InputGateBias, params.m_InputGateBias);
1419*89c4ff92SAndroid Build Coastguard Worker         VerifyConstTensors("m_ForgetGateBias",
1420*89c4ff92SAndroid Build Coastguard Worker                            m_InputParams.m_ForgetGateBias, params.m_ForgetGateBias);
1421*89c4ff92SAndroid Build Coastguard Worker         VerifyConstTensors("m_CellBias",
1422*89c4ff92SAndroid Build Coastguard Worker                            m_InputParams.m_CellBias, params.m_CellBias);
1423*89c4ff92SAndroid Build Coastguard Worker         VerifyConstTensors("m_OutputGateBias",
1424*89c4ff92SAndroid Build Coastguard Worker                            m_InputParams.m_OutputGateBias, params.m_OutputGateBias);
1425*89c4ff92SAndroid Build Coastguard Worker     }
1426*89c4ff92SAndroid Build Coastguard Worker 
1427*89c4ff92SAndroid Build Coastguard Worker private:
1428*89c4ff92SAndroid Build Coastguard Worker     armnn::QuantizedLstmInputParams m_InputParams;
1429*89c4ff92SAndroid Build Coastguard Worker };
1430*89c4ff92SAndroid Build Coastguard Worker 
1431*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SerializeDeserializeQuantizedLstm")
1432*89c4ff92SAndroid Build Coastguard Worker {
1433*89c4ff92SAndroid Build Coastguard Worker     const uint32_t batchSize = 1;
1434*89c4ff92SAndroid Build Coastguard Worker     const uint32_t inputSize = 2;
1435*89c4ff92SAndroid Build Coastguard Worker     const uint32_t numUnits = 4;
1436*89c4ff92SAndroid Build Coastguard Worker     const uint32_t outputSize = numUnits;
1437*89c4ff92SAndroid Build Coastguard Worker 
1438*89c4ff92SAndroid Build Coastguard Worker     // Scale/Offset for input/output, cellState In/Out, weights, bias
1439*89c4ff92SAndroid Build Coastguard Worker     float inputOutputScale = 0.0078125f;
1440*89c4ff92SAndroid Build Coastguard Worker     int32_t inputOutputOffset = 128;
1441*89c4ff92SAndroid Build Coastguard Worker 
1442*89c4ff92SAndroid Build Coastguard Worker     float cellStateScale = 0.00048828125f;
1443*89c4ff92SAndroid Build Coastguard Worker     int32_t cellStateOffset = 0;
1444*89c4ff92SAndroid Build Coastguard Worker 
1445*89c4ff92SAndroid Build Coastguard Worker     float weightsScale = 0.00408021f;
1446*89c4ff92SAndroid Build Coastguard Worker     int32_t weightsOffset = 100;
1447*89c4ff92SAndroid Build Coastguard Worker 
1448*89c4ff92SAndroid Build Coastguard Worker     float biasScale = 3.1876640625e-05f;
1449*89c4ff92SAndroid Build Coastguard Worker     int32_t biasOffset = 0;
1450*89c4ff92SAndroid Build Coastguard Worker 
1451*89c4ff92SAndroid Build Coastguard Worker     // The shape of weight data is {outputSize, inputSize} = {4, 2}
1452*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorShape inputToInputWeightsShape = {4, 2};
1453*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint8_t> inputToInputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8};
1454*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputToInputWeightsInfo(inputToInputWeightsShape,
1455*89c4ff92SAndroid Build Coastguard Worker                                               armnn::DataType::QAsymmU8,
1456*89c4ff92SAndroid Build Coastguard Worker                                               weightsScale,
1457*89c4ff92SAndroid Build Coastguard Worker                                               weightsOffset,
1458*89c4ff92SAndroid Build Coastguard Worker                                               true);
1459*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToInputWeights(inputToInputWeightsInfo, inputToInputWeightsData);
1460*89c4ff92SAndroid Build Coastguard Worker 
1461*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorShape inputToForgetWeightsShape = {4, 2};
1462*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint8_t> inputToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8};
1463*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputToForgetWeightsInfo(inputToForgetWeightsShape,
1464*89c4ff92SAndroid Build Coastguard Worker                                                armnn::DataType::QAsymmU8,
1465*89c4ff92SAndroid Build Coastguard Worker                                                weightsScale,
1466*89c4ff92SAndroid Build Coastguard Worker                                                weightsOffset,
1467*89c4ff92SAndroid Build Coastguard Worker                                                true);
1468*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToForgetWeights(inputToForgetWeightsInfo, inputToForgetWeightsData);
1469*89c4ff92SAndroid Build Coastguard Worker 
1470*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorShape inputToCellWeightsShape = {4, 2};
1471*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint8_t> inputToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8};
1472*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputToCellWeightsInfo(inputToCellWeightsShape,
1473*89c4ff92SAndroid Build Coastguard Worker                                              armnn::DataType::QAsymmU8,
1474*89c4ff92SAndroid Build Coastguard Worker                                              weightsScale,
1475*89c4ff92SAndroid Build Coastguard Worker                                              weightsOffset,
1476*89c4ff92SAndroid Build Coastguard Worker                                              true);
1477*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToCellWeights(inputToCellWeightsInfo, inputToCellWeightsData);
1478*89c4ff92SAndroid Build Coastguard Worker 
1479*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorShape inputToOutputWeightsShape = {4, 2};
1480*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint8_t> inputToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8};
1481*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputToOutputWeightsInfo(inputToOutputWeightsShape,
1482*89c4ff92SAndroid Build Coastguard Worker                                                armnn::DataType::QAsymmU8,
1483*89c4ff92SAndroid Build Coastguard Worker                                                weightsScale,
1484*89c4ff92SAndroid Build Coastguard Worker                                                weightsOffset,
1485*89c4ff92SAndroid Build Coastguard Worker                                                true);
1486*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToOutputWeights(inputToOutputWeightsInfo, inputToOutputWeightsData);
1487*89c4ff92SAndroid Build Coastguard Worker 
1488*89c4ff92SAndroid Build Coastguard Worker     // The shape of recurrent weight data is {outputSize, outputSize} = {4, 4}
1489*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorShape recurrentToInputWeightsShape = {4, 4};
1490*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint8_t> recurrentToInputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
1491*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo recurrentToInputWeightsInfo(recurrentToInputWeightsShape,
1492*89c4ff92SAndroid Build Coastguard Worker                                                   armnn::DataType::QAsymmU8,
1493*89c4ff92SAndroid Build Coastguard Worker                                                   weightsScale,
1494*89c4ff92SAndroid Build Coastguard Worker                                                   weightsOffset,
1495*89c4ff92SAndroid Build Coastguard Worker                                                   true);
1496*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToInputWeights(recurrentToInputWeightsInfo, recurrentToInputWeightsData);
1497*89c4ff92SAndroid Build Coastguard Worker 
1498*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorShape recurrentToForgetWeightsShape = {4, 4};
1499*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint8_t> recurrentToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
1500*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo recurrentToForgetWeightsInfo(recurrentToForgetWeightsShape,
1501*89c4ff92SAndroid Build Coastguard Worker                                                    armnn::DataType::QAsymmU8,
1502*89c4ff92SAndroid Build Coastguard Worker                                                    weightsScale,
1503*89c4ff92SAndroid Build Coastguard Worker                                                    weightsOffset,
1504*89c4ff92SAndroid Build Coastguard Worker                                                    true);
1505*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToForgetWeights(recurrentToForgetWeightsInfo, recurrentToForgetWeightsData);
1506*89c4ff92SAndroid Build Coastguard Worker 
1507*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorShape recurrentToCellWeightsShape = {4, 4};
1508*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint8_t> recurrentToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
1509*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo recurrentToCellWeightsInfo(recurrentToCellWeightsShape,
1510*89c4ff92SAndroid Build Coastguard Worker                                                  armnn::DataType::QAsymmU8,
1511*89c4ff92SAndroid Build Coastguard Worker                                                  weightsScale,
1512*89c4ff92SAndroid Build Coastguard Worker                                                  weightsOffset,
1513*89c4ff92SAndroid Build Coastguard Worker                                                  true);
1514*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToCellWeights(recurrentToCellWeightsInfo, recurrentToCellWeightsData);
1515*89c4ff92SAndroid Build Coastguard Worker 
1516*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorShape recurrentToOutputWeightsShape = {4, 4};
1517*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint8_t> recurrentToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
1518*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo recurrentToOutputWeightsInfo(recurrentToOutputWeightsShape,
1519*89c4ff92SAndroid Build Coastguard Worker                                                    armnn::DataType::QAsymmU8,
1520*89c4ff92SAndroid Build Coastguard Worker                                                    weightsScale,
1521*89c4ff92SAndroid Build Coastguard Worker                                                    weightsOffset,
1522*89c4ff92SAndroid Build Coastguard Worker                                                    true);
1523*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToOutputWeights(recurrentToOutputWeightsInfo, recurrentToOutputWeightsData);
1524*89c4ff92SAndroid Build Coastguard Worker 
1525*89c4ff92SAndroid Build Coastguard Worker     // The shape of bias data is {outputSize} = {4}
1526*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorShape inputGateBiasShape = {4};
1527*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> inputGateBiasData = {1, 2, 3, 4};
1528*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputGateBiasInfo(inputGateBiasShape,
1529*89c4ff92SAndroid Build Coastguard Worker                                         armnn::DataType::Signed32,
1530*89c4ff92SAndroid Build Coastguard Worker                                         biasScale,
1531*89c4ff92SAndroid Build Coastguard Worker                                         biasOffset,
1532*89c4ff92SAndroid Build Coastguard Worker                                         true);
1533*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputGateBias(inputGateBiasInfo, inputGateBiasData);
1534*89c4ff92SAndroid Build Coastguard Worker 
1535*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorShape forgetGateBiasShape = {4};
1536*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> forgetGateBiasData = {1, 2, 3, 4};
1537*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo forgetGateBiasInfo(forgetGateBiasShape,
1538*89c4ff92SAndroid Build Coastguard Worker                                          armnn::DataType::Signed32,
1539*89c4ff92SAndroid Build Coastguard Worker                                          biasScale,
1540*89c4ff92SAndroid Build Coastguard Worker                                          biasOffset,
1541*89c4ff92SAndroid Build Coastguard Worker                                          true);
1542*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor forgetGateBias(forgetGateBiasInfo, forgetGateBiasData);
1543*89c4ff92SAndroid Build Coastguard Worker 
1544*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorShape cellBiasShape = {4};
1545*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> cellBiasData = {1, 2, 3, 4};
1546*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo cellBiasInfo(cellBiasShape,
1547*89c4ff92SAndroid Build Coastguard Worker                                    armnn::DataType::Signed32,
1548*89c4ff92SAndroid Build Coastguard Worker                                    biasScale,
1549*89c4ff92SAndroid Build Coastguard Worker                                    biasOffset,
1550*89c4ff92SAndroid Build Coastguard Worker                                    true);
1551*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellBias(cellBiasInfo, cellBiasData);
1552*89c4ff92SAndroid Build Coastguard Worker 
1553*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorShape outputGateBiasShape = {4};
1554*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> outputGateBiasData = {1, 2, 3, 4};
1555*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputGateBiasInfo(outputGateBiasShape,
1556*89c4ff92SAndroid Build Coastguard Worker                                          armnn::DataType::Signed32,
1557*89c4ff92SAndroid Build Coastguard Worker                                          biasScale,
1558*89c4ff92SAndroid Build Coastguard Worker                                          biasOffset,
1559*89c4ff92SAndroid Build Coastguard Worker                                          true);
1560*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor outputGateBias(outputGateBiasInfo, outputGateBiasData);
1561*89c4ff92SAndroid Build Coastguard Worker 
1562*89c4ff92SAndroid Build Coastguard Worker     armnn::QuantizedLstmInputParams params;
1563*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToInputWeights = &inputToInputWeights;
1564*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToForgetWeights = &inputToForgetWeights;
1565*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToCellWeights = &inputToCellWeights;
1566*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToOutputWeights = &inputToOutputWeights;
1567*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToInputWeights = &recurrentToInputWeights;
1568*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1569*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToCellWeights = &recurrentToCellWeights;
1570*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1571*89c4ff92SAndroid Build Coastguard Worker     params.m_InputGateBias = &inputGateBias;
1572*89c4ff92SAndroid Build Coastguard Worker     params.m_ForgetGateBias = &forgetGateBias;
1573*89c4ff92SAndroid Build Coastguard Worker     params.m_CellBias = &cellBias;
1574*89c4ff92SAndroid Build Coastguard Worker     params.m_OutputGateBias = &outputGateBias;
1575*89c4ff92SAndroid Build Coastguard Worker 
1576*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr network = armnn::INetwork::Create();
1577*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1578*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateIn = network->AddInputLayer(1);
1579*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(2);
1580*89c4ff92SAndroid Build Coastguard Worker     const std::string layerName("QuantizedLstm");
1581*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const quantizedLstmLayer = network->AddQuantizedLstmLayer(params, layerName.c_str());
1582*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateOut = network->AddOutputLayer(0);
1583*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(1);
1584*89c4ff92SAndroid Build Coastguard Worker 
1585*89c4ff92SAndroid Build Coastguard Worker     // Connect up
1586*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputTensorInfo({ batchSize, inputSize },
1587*89c4ff92SAndroid Build Coastguard Worker                                       armnn::DataType::QAsymmU8,
1588*89c4ff92SAndroid Build Coastguard Worker                                       inputOutputScale,
1589*89c4ff92SAndroid Build Coastguard Worker                                       inputOutputOffset);
1590*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo cellStateTensorInfo({ batchSize, numUnits },
1591*89c4ff92SAndroid Build Coastguard Worker                                           armnn::DataType::QSymmS16,
1592*89c4ff92SAndroid Build Coastguard Worker                                           cellStateScale,
1593*89c4ff92SAndroid Build Coastguard Worker                                           cellStateOffset);
1594*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputStateTensorInfo({ batchSize, outputSize },
1595*89c4ff92SAndroid Build Coastguard Worker                                             armnn::DataType::QAsymmU8,
1596*89c4ff92SAndroid Build Coastguard Worker                                             inputOutputScale,
1597*89c4ff92SAndroid Build Coastguard Worker                                             inputOutputOffset);
1598*89c4ff92SAndroid Build Coastguard Worker 
1599*89c4ff92SAndroid Build Coastguard Worker     inputLayer->GetOutputSlot(0).Connect(quantizedLstmLayer->GetInputSlot(0));
1600*89c4ff92SAndroid Build Coastguard Worker     inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1601*89c4ff92SAndroid Build Coastguard Worker 
1602*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).Connect(quantizedLstmLayer->GetInputSlot(1));
1603*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).SetTensorInfo(cellStateTensorInfo);
1604*89c4ff92SAndroid Build Coastguard Worker 
1605*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).Connect(quantizedLstmLayer->GetInputSlot(2));
1606*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).SetTensorInfo(outputStateTensorInfo);
1607*89c4ff92SAndroid Build Coastguard Worker 
1608*89c4ff92SAndroid Build Coastguard Worker     quantizedLstmLayer->GetOutputSlot(0).Connect(cellStateOut->GetInputSlot(0));
1609*89c4ff92SAndroid Build Coastguard Worker     quantizedLstmLayer->GetOutputSlot(0).SetTensorInfo(cellStateTensorInfo);
1610*89c4ff92SAndroid Build Coastguard Worker 
1611*89c4ff92SAndroid Build Coastguard Worker     quantizedLstmLayer->GetOutputSlot(1).Connect(outputLayer->GetInputSlot(0));
1612*89c4ff92SAndroid Build Coastguard Worker     quantizedLstmLayer->GetOutputSlot(1).SetTensorInfo(outputStateTensorInfo);
1613*89c4ff92SAndroid Build Coastguard Worker 
1614*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1615*89c4ff92SAndroid Build Coastguard Worker     CHECK(deserializedNetwork);
1616*89c4ff92SAndroid Build Coastguard Worker 
1617*89c4ff92SAndroid Build Coastguard Worker     VerifyQuantizedLstmLayer checker(layerName,
1618*89c4ff92SAndroid Build Coastguard Worker                                      {inputTensorInfo, cellStateTensorInfo, outputStateTensorInfo},
1619*89c4ff92SAndroid Build Coastguard Worker                                      {cellStateTensorInfo, outputStateTensorInfo},
1620*89c4ff92SAndroid Build Coastguard Worker                                      params);
1621*89c4ff92SAndroid Build Coastguard Worker 
1622*89c4ff92SAndroid Build Coastguard Worker     deserializedNetwork->ExecuteStrategy(checker);
1623*89c4ff92SAndroid Build Coastguard Worker }
1624*89c4ff92SAndroid Build Coastguard Worker 
1625*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SerializeDeserializeQLstmBasic")
1626*89c4ff92SAndroid Build Coastguard Worker {
1627*89c4ff92SAndroid Build Coastguard Worker     armnn::QLstmDescriptor descriptor;
1628*89c4ff92SAndroid Build Coastguard Worker 
1629*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_CifgEnabled       = true;
1630*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ProjectionEnabled = false;
1631*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_PeepholeEnabled   = false;
1632*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_LayerNormEnabled  = false;
1633*89c4ff92SAndroid Build Coastguard Worker 
1634*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_CellClip       = 0.0f;
1635*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ProjectionClip = 0.0f;
1636*89c4ff92SAndroid Build Coastguard Worker 
1637*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_InputIntermediateScale  = 0.00001f;
1638*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ForgetIntermediateScale = 0.00001f;
1639*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_CellIntermediateScale   = 0.00001f;
1640*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_OutputIntermediateScale = 0.00001f;
1641*89c4ff92SAndroid Build Coastguard Worker 
1642*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_HiddenStateScale     = 0.07f;
1643*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_HiddenStateZeroPoint = 0;
1644*89c4ff92SAndroid Build Coastguard Worker 
1645*89c4ff92SAndroid Build Coastguard Worker     const unsigned int numBatches = 2;
1646*89c4ff92SAndroid Build Coastguard Worker     const unsigned int inputSize  = 5;
1647*89c4ff92SAndroid Build Coastguard Worker     const unsigned int outputSize = 4;
1648*89c4ff92SAndroid Build Coastguard Worker     const unsigned int numUnits   = 4;
1649*89c4ff92SAndroid Build Coastguard Worker 
1650*89c4ff92SAndroid Build Coastguard Worker     // Scale/Offset quantization info
1651*89c4ff92SAndroid Build Coastguard Worker     float inputScale    = 0.0078f;
1652*89c4ff92SAndroid Build Coastguard Worker     int32_t inputOffset = 0;
1653*89c4ff92SAndroid Build Coastguard Worker 
1654*89c4ff92SAndroid Build Coastguard Worker     float outputScale    = 0.0078f;
1655*89c4ff92SAndroid Build Coastguard Worker     int32_t outputOffset = 0;
1656*89c4ff92SAndroid Build Coastguard Worker 
1657*89c4ff92SAndroid Build Coastguard Worker     float cellStateScale    = 3.5002e-05f;
1658*89c4ff92SAndroid Build Coastguard Worker     int32_t cellStateOffset = 0;
1659*89c4ff92SAndroid Build Coastguard Worker 
1660*89c4ff92SAndroid Build Coastguard Worker     float weightsScale    = 0.007f;
1661*89c4ff92SAndroid Build Coastguard Worker     int32_t weightsOffset = 0;
1662*89c4ff92SAndroid Build Coastguard Worker 
1663*89c4ff92SAndroid Build Coastguard Worker     float biasScale    = 3.5002e-05f / 1024;
1664*89c4ff92SAndroid Build Coastguard Worker     int32_t biasOffset = 0;
1665*89c4ff92SAndroid Build Coastguard Worker 
1666*89c4ff92SAndroid Build Coastguard Worker     // Weights and bias tensor and quantization info
1667*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputWeightsInfo({numUnits, inputSize},
1668*89c4ff92SAndroid Build Coastguard Worker                                        armnn::DataType::QSymmS8,
1669*89c4ff92SAndroid Build Coastguard Worker                                        weightsScale,
1670*89c4ff92SAndroid Build Coastguard Worker                                        weightsOffset,
1671*89c4ff92SAndroid Build Coastguard Worker                                        true);
1672*89c4ff92SAndroid Build Coastguard Worker 
1673*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo recurrentWeightsInfo({numUnits, outputSize},
1674*89c4ff92SAndroid Build Coastguard Worker                                            armnn::DataType::QSymmS8,
1675*89c4ff92SAndroid Build Coastguard Worker                                            weightsScale,
1676*89c4ff92SAndroid Build Coastguard Worker                                            weightsOffset,
1677*89c4ff92SAndroid Build Coastguard Worker                                            true);
1678*89c4ff92SAndroid Build Coastguard Worker 
1679*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo biasInfo({numUnits}, armnn::DataType::Signed32, biasScale, biasOffset, true);
1680*89c4ff92SAndroid Build Coastguard Worker 
1681*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> inputToForgetWeightsData = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
1682*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> inputToCellWeightsData   = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
1683*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> inputToOutputWeightsData = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
1684*89c4ff92SAndroid Build Coastguard Worker 
1685*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToForgetWeights(inputWeightsInfo, inputToForgetWeightsData);
1686*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToCellWeights(inputWeightsInfo, inputToCellWeightsData);
1687*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToOutputWeights(inputWeightsInfo, inputToOutputWeightsData);
1688*89c4ff92SAndroid Build Coastguard Worker 
1689*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> recurrentToForgetWeightsData =
1690*89c4ff92SAndroid Build Coastguard Worker             GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
1691*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> recurrentToCellWeightsData   =
1692*89c4ff92SAndroid Build Coastguard Worker             GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
1693*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> recurrentToOutputWeightsData =
1694*89c4ff92SAndroid Build Coastguard Worker             GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
1695*89c4ff92SAndroid Build Coastguard Worker 
1696*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToForgetWeights(recurrentWeightsInfo, recurrentToForgetWeightsData);
1697*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToCellWeights(recurrentWeightsInfo, recurrentToCellWeightsData);
1698*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToOutputWeights(recurrentWeightsInfo, recurrentToOutputWeightsData);
1699*89c4ff92SAndroid Build Coastguard Worker 
1700*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> forgetGateBiasData(numUnits, 1);
1701*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> cellBiasData(numUnits, 0);
1702*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> outputGateBiasData(numUnits, 0);
1703*89c4ff92SAndroid Build Coastguard Worker 
1704*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor forgetGateBias(biasInfo, forgetGateBiasData);
1705*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellBias(biasInfo, cellBiasData);
1706*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor outputGateBias(biasInfo, outputGateBiasData);
1707*89c4ff92SAndroid Build Coastguard Worker 
1708*89c4ff92SAndroid Build Coastguard Worker     // Set up params
1709*89c4ff92SAndroid Build Coastguard Worker     armnn::LstmInputParams params;
1710*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToForgetWeights = &inputToForgetWeights;
1711*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToCellWeights   = &inputToCellWeights;
1712*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToOutputWeights = &inputToOutputWeights;
1713*89c4ff92SAndroid Build Coastguard Worker 
1714*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1715*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToCellWeights   = &recurrentToCellWeights;
1716*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1717*89c4ff92SAndroid Build Coastguard Worker 
1718*89c4ff92SAndroid Build Coastguard Worker     params.m_ForgetGateBias = &forgetGateBias;
1719*89c4ff92SAndroid Build Coastguard Worker     params.m_CellBias       = &cellBias;
1720*89c4ff92SAndroid Build Coastguard Worker     params.m_OutputGateBias = &outputGateBias;
1721*89c4ff92SAndroid Build Coastguard Worker 
1722*89c4ff92SAndroid Build Coastguard Worker     // Create network
1723*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr network = armnn::INetwork::Create();
1724*89c4ff92SAndroid Build Coastguard Worker     const std::string layerName("qLstm");
1725*89c4ff92SAndroid Build Coastguard Worker 
1726*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const input         = network->AddInputLayer(0);
1727*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(1);
1728*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateIn   = network->AddInputLayer(2);
1729*89c4ff92SAndroid Build Coastguard Worker 
1730*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const qLstmLayer = network->AddQLstmLayer(descriptor, params, layerName.c_str());
1731*89c4ff92SAndroid Build Coastguard Worker 
1732*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputStateOut = network->AddOutputLayer(0);
1733*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateOut   = network->AddOutputLayer(1);
1734*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputLayer    = network->AddOutputLayer(2);
1735*89c4ff92SAndroid Build Coastguard Worker 
1736*89c4ff92SAndroid Build Coastguard Worker     // Input/Output tensor info
1737*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputInfo({numBatches , inputSize},
1738*89c4ff92SAndroid Build Coastguard Worker                                 armnn::DataType::QAsymmS8,
1739*89c4ff92SAndroid Build Coastguard Worker                                 inputScale,
1740*89c4ff92SAndroid Build Coastguard Worker                                 inputOffset);
1741*89c4ff92SAndroid Build Coastguard Worker 
1742*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo cellStateInfo({numBatches , numUnits},
1743*89c4ff92SAndroid Build Coastguard Worker                                     armnn::DataType::QSymmS16,
1744*89c4ff92SAndroid Build Coastguard Worker                                     cellStateScale,
1745*89c4ff92SAndroid Build Coastguard Worker                                     cellStateOffset);
1746*89c4ff92SAndroid Build Coastguard Worker 
1747*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputStateInfo({numBatches , outputSize},
1748*89c4ff92SAndroid Build Coastguard Worker                                       armnn::DataType::QAsymmS8,
1749*89c4ff92SAndroid Build Coastguard Worker                                       outputScale,
1750*89c4ff92SAndroid Build Coastguard Worker                                       outputOffset);
1751*89c4ff92SAndroid Build Coastguard Worker 
1752*89c4ff92SAndroid Build Coastguard Worker     // Connect input/output slots
1753*89c4ff92SAndroid Build Coastguard Worker     input->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(0));
1754*89c4ff92SAndroid Build Coastguard Worker     input->GetOutputSlot(0).SetTensorInfo(inputInfo);
1755*89c4ff92SAndroid Build Coastguard Worker 
1756*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(1));
1757*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).SetTensorInfo(cellStateInfo);
1758*89c4ff92SAndroid Build Coastguard Worker 
1759*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(2));
1760*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).SetTensorInfo(outputStateInfo);
1761*89c4ff92SAndroid Build Coastguard Worker 
1762*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(0).Connect(outputStateOut->GetInputSlot(0));
1763*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(0).SetTensorInfo(outputStateInfo);
1764*89c4ff92SAndroid Build Coastguard Worker 
1765*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(1).Connect(cellStateOut->GetInputSlot(0));
1766*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(1).SetTensorInfo(cellStateInfo);
1767*89c4ff92SAndroid Build Coastguard Worker 
1768*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(2).Connect(outputLayer->GetInputSlot(0));
1769*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(2).SetTensorInfo(outputStateInfo);
1770*89c4ff92SAndroid Build Coastguard Worker 
1771*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1772*89c4ff92SAndroid Build Coastguard Worker     CHECK(deserializedNetwork);
1773*89c4ff92SAndroid Build Coastguard Worker 
1774*89c4ff92SAndroid Build Coastguard Worker     VerifyLstmLayer<armnn::QLstmDescriptor> checker(
1775*89c4ff92SAndroid Build Coastguard Worker             layerName,
1776*89c4ff92SAndroid Build Coastguard Worker             {inputInfo, cellStateInfo, outputStateInfo},
1777*89c4ff92SAndroid Build Coastguard Worker             {outputStateInfo, cellStateInfo, outputStateInfo},
1778*89c4ff92SAndroid Build Coastguard Worker             descriptor,
1779*89c4ff92SAndroid Build Coastguard Worker             params);
1780*89c4ff92SAndroid Build Coastguard Worker 
1781*89c4ff92SAndroid Build Coastguard Worker     deserializedNetwork->ExecuteStrategy(checker);
1782*89c4ff92SAndroid Build Coastguard Worker }
1783*89c4ff92SAndroid Build Coastguard Worker 
1784*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SerializeDeserializeQLstmCifgLayerNorm")
1785*89c4ff92SAndroid Build Coastguard Worker {
1786*89c4ff92SAndroid Build Coastguard Worker     armnn::QLstmDescriptor descriptor;
1787*89c4ff92SAndroid Build Coastguard Worker 
1788*89c4ff92SAndroid Build Coastguard Worker     // CIFG params are used when CIFG is disabled
1789*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_CifgEnabled       = true;
1790*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ProjectionEnabled = false;
1791*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_PeepholeEnabled   = false;
1792*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_LayerNormEnabled  = true;
1793*89c4ff92SAndroid Build Coastguard Worker 
1794*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_CellClip       = 0.0f;
1795*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ProjectionClip = 0.0f;
1796*89c4ff92SAndroid Build Coastguard Worker 
1797*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_InputIntermediateScale  = 0.00001f;
1798*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ForgetIntermediateScale = 0.00001f;
1799*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_CellIntermediateScale   = 0.00001f;
1800*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_OutputIntermediateScale = 0.00001f;
1801*89c4ff92SAndroid Build Coastguard Worker 
1802*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_HiddenStateScale     = 0.07f;
1803*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_HiddenStateZeroPoint = 0;
1804*89c4ff92SAndroid Build Coastguard Worker 
1805*89c4ff92SAndroid Build Coastguard Worker     const unsigned int numBatches = 2;
1806*89c4ff92SAndroid Build Coastguard Worker     const unsigned int inputSize  = 5;
1807*89c4ff92SAndroid Build Coastguard Worker     const unsigned int outputSize = 4;
1808*89c4ff92SAndroid Build Coastguard Worker     const unsigned int numUnits   = 4;
1809*89c4ff92SAndroid Build Coastguard Worker 
1810*89c4ff92SAndroid Build Coastguard Worker     // Scale/Offset quantization info
1811*89c4ff92SAndroid Build Coastguard Worker     float inputScale    = 0.0078f;
1812*89c4ff92SAndroid Build Coastguard Worker     int32_t inputOffset = 0;
1813*89c4ff92SAndroid Build Coastguard Worker 
1814*89c4ff92SAndroid Build Coastguard Worker     float outputScale    = 0.0078f;
1815*89c4ff92SAndroid Build Coastguard Worker     int32_t outputOffset = 0;
1816*89c4ff92SAndroid Build Coastguard Worker 
1817*89c4ff92SAndroid Build Coastguard Worker     float cellStateScale    = 3.5002e-05f;
1818*89c4ff92SAndroid Build Coastguard Worker     int32_t cellStateOffset = 0;
1819*89c4ff92SAndroid Build Coastguard Worker 
1820*89c4ff92SAndroid Build Coastguard Worker     float weightsScale    = 0.007f;
1821*89c4ff92SAndroid Build Coastguard Worker     int32_t weightsOffset = 0;
1822*89c4ff92SAndroid Build Coastguard Worker 
1823*89c4ff92SAndroid Build Coastguard Worker     float layerNormScale    = 3.5002e-05f;
1824*89c4ff92SAndroid Build Coastguard Worker     int32_t layerNormOffset = 0;
1825*89c4ff92SAndroid Build Coastguard Worker 
1826*89c4ff92SAndroid Build Coastguard Worker     float biasScale    = layerNormScale / 1024;
1827*89c4ff92SAndroid Build Coastguard Worker     int32_t biasOffset = 0;
1828*89c4ff92SAndroid Build Coastguard Worker 
1829*89c4ff92SAndroid Build Coastguard Worker     // Weights and bias tensor and quantization info
1830*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputWeightsInfo({numUnits, inputSize},
1831*89c4ff92SAndroid Build Coastguard Worker                                        armnn::DataType::QSymmS8,
1832*89c4ff92SAndroid Build Coastguard Worker                                        weightsScale,
1833*89c4ff92SAndroid Build Coastguard Worker                                        weightsOffset,
1834*89c4ff92SAndroid Build Coastguard Worker                                        true);
1835*89c4ff92SAndroid Build Coastguard Worker 
1836*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo recurrentWeightsInfo({numUnits, outputSize},
1837*89c4ff92SAndroid Build Coastguard Worker                                            armnn::DataType::QSymmS8,
1838*89c4ff92SAndroid Build Coastguard Worker                                            weightsScale,
1839*89c4ff92SAndroid Build Coastguard Worker                                            weightsOffset,
1840*89c4ff92SAndroid Build Coastguard Worker                                            true);
1841*89c4ff92SAndroid Build Coastguard Worker 
1842*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo biasInfo({numUnits},
1843*89c4ff92SAndroid Build Coastguard Worker                                armnn::DataType::Signed32,
1844*89c4ff92SAndroid Build Coastguard Worker                                biasScale,
1845*89c4ff92SAndroid Build Coastguard Worker                                biasOffset,
1846*89c4ff92SAndroid Build Coastguard Worker                                true);
1847*89c4ff92SAndroid Build Coastguard Worker 
1848*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo layerNormWeightsInfo({numUnits},
1849*89c4ff92SAndroid Build Coastguard Worker                                            armnn::DataType::QSymmS16,
1850*89c4ff92SAndroid Build Coastguard Worker                                            layerNormScale,
1851*89c4ff92SAndroid Build Coastguard Worker                                            layerNormOffset,
1852*89c4ff92SAndroid Build Coastguard Worker                                            true);
1853*89c4ff92SAndroid Build Coastguard Worker 
1854*89c4ff92SAndroid Build Coastguard Worker     // Mandatory params
1855*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> inputToForgetWeightsData = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
1856*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> inputToCellWeightsData   = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
1857*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> inputToOutputWeightsData = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
1858*89c4ff92SAndroid Build Coastguard Worker 
1859*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToForgetWeights(inputWeightsInfo, inputToForgetWeightsData);
1860*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToCellWeights(inputWeightsInfo, inputToCellWeightsData);
1861*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToOutputWeights(inputWeightsInfo, inputToOutputWeightsData);
1862*89c4ff92SAndroid Build Coastguard Worker 
1863*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> recurrentToForgetWeightsData =
1864*89c4ff92SAndroid Build Coastguard Worker             GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
1865*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> recurrentToCellWeightsData   =
1866*89c4ff92SAndroid Build Coastguard Worker             GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
1867*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> recurrentToOutputWeightsData =
1868*89c4ff92SAndroid Build Coastguard Worker             GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
1869*89c4ff92SAndroid Build Coastguard Worker 
1870*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToForgetWeights(recurrentWeightsInfo, recurrentToForgetWeightsData);
1871*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToCellWeights(recurrentWeightsInfo, recurrentToCellWeightsData);
1872*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToOutputWeights(recurrentWeightsInfo, recurrentToOutputWeightsData);
1873*89c4ff92SAndroid Build Coastguard Worker 
1874*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> forgetGateBiasData(numUnits, 1);
1875*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> cellBiasData(numUnits, 0);
1876*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> outputGateBiasData(numUnits, 0);
1877*89c4ff92SAndroid Build Coastguard Worker 
1878*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor forgetGateBias(biasInfo, forgetGateBiasData);
1879*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellBias(biasInfo, cellBiasData);
1880*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor outputGateBias(biasInfo, outputGateBiasData);
1881*89c4ff92SAndroid Build Coastguard Worker 
1882*89c4ff92SAndroid Build Coastguard Worker     // Layer Norm
1883*89c4ff92SAndroid Build Coastguard Worker     std::vector<int16_t> forgetLayerNormWeightsData =
1884*89c4ff92SAndroid Build Coastguard Worker             GenerateRandomData<int16_t>(layerNormWeightsInfo.GetNumElements());
1885*89c4ff92SAndroid Build Coastguard Worker     std::vector<int16_t> cellLayerNormWeightsData =
1886*89c4ff92SAndroid Build Coastguard Worker             GenerateRandomData<int16_t>(layerNormWeightsInfo.GetNumElements());
1887*89c4ff92SAndroid Build Coastguard Worker     std::vector<int16_t> outputLayerNormWeightsData =
1888*89c4ff92SAndroid Build Coastguard Worker             GenerateRandomData<int16_t>(layerNormWeightsInfo.GetNumElements());
1889*89c4ff92SAndroid Build Coastguard Worker 
1890*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor forgetLayerNormWeights(layerNormWeightsInfo, forgetLayerNormWeightsData);
1891*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellLayerNormWeights(layerNormWeightsInfo, cellLayerNormWeightsData);
1892*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor outputLayerNormWeights(layerNormWeightsInfo, outputLayerNormWeightsData);
1893*89c4ff92SAndroid Build Coastguard Worker 
1894*89c4ff92SAndroid Build Coastguard Worker     // Set up params
1895*89c4ff92SAndroid Build Coastguard Worker     armnn::LstmInputParams params;
1896*89c4ff92SAndroid Build Coastguard Worker 
1897*89c4ff92SAndroid Build Coastguard Worker     // Mandatory params
1898*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToForgetWeights = &inputToForgetWeights;
1899*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToCellWeights   = &inputToCellWeights;
1900*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToOutputWeights = &inputToOutputWeights;
1901*89c4ff92SAndroid Build Coastguard Worker 
1902*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1903*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToCellWeights   = &recurrentToCellWeights;
1904*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1905*89c4ff92SAndroid Build Coastguard Worker 
1906*89c4ff92SAndroid Build Coastguard Worker     params.m_ForgetGateBias = &forgetGateBias;
1907*89c4ff92SAndroid Build Coastguard Worker     params.m_CellBias       = &cellBias;
1908*89c4ff92SAndroid Build Coastguard Worker     params.m_OutputGateBias = &outputGateBias;
1909*89c4ff92SAndroid Build Coastguard Worker 
1910*89c4ff92SAndroid Build Coastguard Worker     // Layer Norm
1911*89c4ff92SAndroid Build Coastguard Worker     params.m_ForgetLayerNormWeights = &forgetLayerNormWeights;
1912*89c4ff92SAndroid Build Coastguard Worker     params.m_CellLayerNormWeights   = &cellLayerNormWeights;
1913*89c4ff92SAndroid Build Coastguard Worker     params.m_OutputLayerNormWeights = &outputLayerNormWeights;
1914*89c4ff92SAndroid Build Coastguard Worker 
1915*89c4ff92SAndroid Build Coastguard Worker     // Create network
1916*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr network = armnn::INetwork::Create();
1917*89c4ff92SAndroid Build Coastguard Worker     const std::string layerName("qLstm");
1918*89c4ff92SAndroid Build Coastguard Worker 
1919*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const input         = network->AddInputLayer(0);
1920*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(1);
1921*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateIn   = network->AddInputLayer(2);
1922*89c4ff92SAndroid Build Coastguard Worker 
1923*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const qLstmLayer = network->AddQLstmLayer(descriptor, params, layerName.c_str());
1924*89c4ff92SAndroid Build Coastguard Worker 
1925*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputStateOut  = network->AddOutputLayer(0);
1926*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateOut  = network->AddOutputLayer(1);
1927*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputLayer  = network->AddOutputLayer(2);
1928*89c4ff92SAndroid Build Coastguard Worker 
1929*89c4ff92SAndroid Build Coastguard Worker     // Input/Output tensor info
1930*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputInfo({numBatches , inputSize},
1931*89c4ff92SAndroid Build Coastguard Worker                                 armnn::DataType::QAsymmS8,
1932*89c4ff92SAndroid Build Coastguard Worker                                 inputScale,
1933*89c4ff92SAndroid Build Coastguard Worker                                 inputOffset);
1934*89c4ff92SAndroid Build Coastguard Worker 
1935*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo cellStateInfo({numBatches , numUnits},
1936*89c4ff92SAndroid Build Coastguard Worker                                     armnn::DataType::QSymmS16,
1937*89c4ff92SAndroid Build Coastguard Worker                                     cellStateScale,
1938*89c4ff92SAndroid Build Coastguard Worker                                     cellStateOffset);
1939*89c4ff92SAndroid Build Coastguard Worker 
1940*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputStateInfo({numBatches , outputSize},
1941*89c4ff92SAndroid Build Coastguard Worker                                       armnn::DataType::QAsymmS8,
1942*89c4ff92SAndroid Build Coastguard Worker                                       outputScale,
1943*89c4ff92SAndroid Build Coastguard Worker                                       outputOffset);
1944*89c4ff92SAndroid Build Coastguard Worker 
1945*89c4ff92SAndroid Build Coastguard Worker     // Connect input/output slots
1946*89c4ff92SAndroid Build Coastguard Worker     input->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(0));
1947*89c4ff92SAndroid Build Coastguard Worker     input->GetOutputSlot(0).SetTensorInfo(inputInfo);
1948*89c4ff92SAndroid Build Coastguard Worker 
1949*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(1));
1950*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).SetTensorInfo(cellStateInfo);
1951*89c4ff92SAndroid Build Coastguard Worker 
1952*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(2));
1953*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).SetTensorInfo(outputStateInfo);
1954*89c4ff92SAndroid Build Coastguard Worker 
1955*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(0).Connect(outputStateOut->GetInputSlot(0));
1956*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(0).SetTensorInfo(outputStateInfo);
1957*89c4ff92SAndroid Build Coastguard Worker 
1958*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(1).Connect(cellStateOut->GetInputSlot(0));
1959*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(1).SetTensorInfo(cellStateInfo);
1960*89c4ff92SAndroid Build Coastguard Worker 
1961*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(2).Connect(outputLayer->GetInputSlot(0));
1962*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(2).SetTensorInfo(outputStateInfo);
1963*89c4ff92SAndroid Build Coastguard Worker 
1964*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
1965*89c4ff92SAndroid Build Coastguard Worker     CHECK(deserializedNetwork);
1966*89c4ff92SAndroid Build Coastguard Worker 
1967*89c4ff92SAndroid Build Coastguard Worker     VerifyLstmLayer<armnn::QLstmDescriptor> checker(layerName,
1968*89c4ff92SAndroid Build Coastguard Worker                                                     {inputInfo, cellStateInfo, outputStateInfo},
1969*89c4ff92SAndroid Build Coastguard Worker                                                     {outputStateInfo, cellStateInfo, outputStateInfo},
1970*89c4ff92SAndroid Build Coastguard Worker                                                     descriptor,
1971*89c4ff92SAndroid Build Coastguard Worker                                                     params);
1972*89c4ff92SAndroid Build Coastguard Worker 
1973*89c4ff92SAndroid Build Coastguard Worker     deserializedNetwork->ExecuteStrategy(checker);
1974*89c4ff92SAndroid Build Coastguard Worker }
1975*89c4ff92SAndroid Build Coastguard Worker 
1976*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SerializeDeserializeQLstmAdvanced")
1977*89c4ff92SAndroid Build Coastguard Worker {
1978*89c4ff92SAndroid Build Coastguard Worker     armnn::QLstmDescriptor descriptor;
1979*89c4ff92SAndroid Build Coastguard Worker 
1980*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_CifgEnabled       = false;
1981*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ProjectionEnabled = true;
1982*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_PeepholeEnabled   = true;
1983*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_LayerNormEnabled  = true;
1984*89c4ff92SAndroid Build Coastguard Worker 
1985*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_CellClip       = 0.1f;
1986*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ProjectionClip = 0.1f;
1987*89c4ff92SAndroid Build Coastguard Worker 
1988*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_InputIntermediateScale  = 0.00001f;
1989*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ForgetIntermediateScale = 0.00001f;
1990*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_CellIntermediateScale   = 0.00001f;
1991*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_OutputIntermediateScale = 0.00001f;
1992*89c4ff92SAndroid Build Coastguard Worker 
1993*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_HiddenStateScale     = 0.07f;
1994*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_HiddenStateZeroPoint = 0;
1995*89c4ff92SAndroid Build Coastguard Worker 
1996*89c4ff92SAndroid Build Coastguard Worker     const unsigned int numBatches = 2;
1997*89c4ff92SAndroid Build Coastguard Worker     const unsigned int inputSize  = 5;
1998*89c4ff92SAndroid Build Coastguard Worker     const unsigned int outputSize = 4;
1999*89c4ff92SAndroid Build Coastguard Worker     const unsigned int numUnits   = 4;
2000*89c4ff92SAndroid Build Coastguard Worker 
2001*89c4ff92SAndroid Build Coastguard Worker     // Scale/Offset quantization info
2002*89c4ff92SAndroid Build Coastguard Worker     float inputScale    = 0.0078f;
2003*89c4ff92SAndroid Build Coastguard Worker     int32_t inputOffset = 0;
2004*89c4ff92SAndroid Build Coastguard Worker 
2005*89c4ff92SAndroid Build Coastguard Worker     float outputScale    = 0.0078f;
2006*89c4ff92SAndroid Build Coastguard Worker     int32_t outputOffset = 0;
2007*89c4ff92SAndroid Build Coastguard Worker 
2008*89c4ff92SAndroid Build Coastguard Worker     float cellStateScale    = 3.5002e-05f;
2009*89c4ff92SAndroid Build Coastguard Worker     int32_t cellStateOffset = 0;
2010*89c4ff92SAndroid Build Coastguard Worker 
2011*89c4ff92SAndroid Build Coastguard Worker     float weightsScale    = 0.007f;
2012*89c4ff92SAndroid Build Coastguard Worker     int32_t weightsOffset = 0;
2013*89c4ff92SAndroid Build Coastguard Worker 
2014*89c4ff92SAndroid Build Coastguard Worker     float layerNormScale    = 3.5002e-05f;
2015*89c4ff92SAndroid Build Coastguard Worker     int32_t layerNormOffset = 0;
2016*89c4ff92SAndroid Build Coastguard Worker 
2017*89c4ff92SAndroid Build Coastguard Worker     float biasScale    = layerNormScale / 1024;
2018*89c4ff92SAndroid Build Coastguard Worker     int32_t biasOffset = 0;
2019*89c4ff92SAndroid Build Coastguard Worker 
2020*89c4ff92SAndroid Build Coastguard Worker     // Weights and bias tensor and quantization info
2021*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputWeightsInfo({numUnits, inputSize},
2022*89c4ff92SAndroid Build Coastguard Worker                                        armnn::DataType::QSymmS8,
2023*89c4ff92SAndroid Build Coastguard Worker                                        weightsScale,
2024*89c4ff92SAndroid Build Coastguard Worker                                        weightsOffset,
2025*89c4ff92SAndroid Build Coastguard Worker                                        true);
2026*89c4ff92SAndroid Build Coastguard Worker 
2027*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo recurrentWeightsInfo({numUnits, outputSize},
2028*89c4ff92SAndroid Build Coastguard Worker                                            armnn::DataType::QSymmS8,
2029*89c4ff92SAndroid Build Coastguard Worker                                            weightsScale,
2030*89c4ff92SAndroid Build Coastguard Worker                                            weightsOffset,
2031*89c4ff92SAndroid Build Coastguard Worker                                            true);
2032*89c4ff92SAndroid Build Coastguard Worker 
2033*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo biasInfo({numUnits},
2034*89c4ff92SAndroid Build Coastguard Worker                                armnn::DataType::Signed32,
2035*89c4ff92SAndroid Build Coastguard Worker                                biasScale,
2036*89c4ff92SAndroid Build Coastguard Worker                                biasOffset,
2037*89c4ff92SAndroid Build Coastguard Worker                                true);
2038*89c4ff92SAndroid Build Coastguard Worker 
2039*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo peepholeWeightsInfo({numUnits},
2040*89c4ff92SAndroid Build Coastguard Worker                                           armnn::DataType::QSymmS16,
2041*89c4ff92SAndroid Build Coastguard Worker                                           weightsScale,
2042*89c4ff92SAndroid Build Coastguard Worker                                           weightsOffset,
2043*89c4ff92SAndroid Build Coastguard Worker                                           true);
2044*89c4ff92SAndroid Build Coastguard Worker 
2045*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo layerNormWeightsInfo({numUnits},
2046*89c4ff92SAndroid Build Coastguard Worker                                            armnn::DataType::QSymmS16,
2047*89c4ff92SAndroid Build Coastguard Worker                                            layerNormScale,
2048*89c4ff92SAndroid Build Coastguard Worker                                            layerNormOffset,
2049*89c4ff92SAndroid Build Coastguard Worker                                            true);
2050*89c4ff92SAndroid Build Coastguard Worker 
2051*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo projectionWeightsInfo({outputSize, numUnits},
2052*89c4ff92SAndroid Build Coastguard Worker                                              armnn::DataType::QSymmS8,
2053*89c4ff92SAndroid Build Coastguard Worker                                              weightsScale,
2054*89c4ff92SAndroid Build Coastguard Worker                                              weightsOffset,
2055*89c4ff92SAndroid Build Coastguard Worker                                              true);
2056*89c4ff92SAndroid Build Coastguard Worker 
2057*89c4ff92SAndroid Build Coastguard Worker     // Mandatory params
2058*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> inputToForgetWeightsData = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
2059*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> inputToCellWeightsData   = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
2060*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> inputToOutputWeightsData = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
2061*89c4ff92SAndroid Build Coastguard Worker 
2062*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToForgetWeights(inputWeightsInfo, inputToForgetWeightsData);
2063*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToCellWeights(inputWeightsInfo, inputToCellWeightsData);
2064*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToOutputWeights(inputWeightsInfo, inputToOutputWeightsData);
2065*89c4ff92SAndroid Build Coastguard Worker 
2066*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> recurrentToForgetWeightsData =
2067*89c4ff92SAndroid Build Coastguard Worker             GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
2068*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> recurrentToCellWeightsData   =
2069*89c4ff92SAndroid Build Coastguard Worker             GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
2070*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> recurrentToOutputWeightsData =
2071*89c4ff92SAndroid Build Coastguard Worker             GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
2072*89c4ff92SAndroid Build Coastguard Worker 
2073*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToForgetWeights(recurrentWeightsInfo, recurrentToForgetWeightsData);
2074*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToCellWeights(recurrentWeightsInfo, recurrentToCellWeightsData);
2075*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToOutputWeights(recurrentWeightsInfo, recurrentToOutputWeightsData);
2076*89c4ff92SAndroid Build Coastguard Worker 
2077*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> forgetGateBiasData(numUnits, 1);
2078*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> cellBiasData(numUnits, 0);
2079*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> outputGateBiasData(numUnits, 0);
2080*89c4ff92SAndroid Build Coastguard Worker 
2081*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor forgetGateBias(biasInfo, forgetGateBiasData);
2082*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellBias(biasInfo, cellBiasData);
2083*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor outputGateBias(biasInfo, outputGateBiasData);
2084*89c4ff92SAndroid Build Coastguard Worker 
2085*89c4ff92SAndroid Build Coastguard Worker     // CIFG
2086*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> inputToInputWeightsData = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
2087*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> recurrentToInputWeightsData =
2088*89c4ff92SAndroid Build Coastguard Worker             GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
2089*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> inputGateBiasData(numUnits, 1);
2090*89c4ff92SAndroid Build Coastguard Worker 
2091*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToInputWeights(inputWeightsInfo, inputToInputWeightsData);
2092*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToInputWeights(recurrentWeightsInfo, recurrentToInputWeightsData);
2093*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputGateBias(biasInfo, inputGateBiasData);
2094*89c4ff92SAndroid Build Coastguard Worker 
2095*89c4ff92SAndroid Build Coastguard Worker     // Peephole
2096*89c4ff92SAndroid Build Coastguard Worker     std::vector<int16_t> cellToInputWeightsData  = GenerateRandomData<int16_t>(peepholeWeightsInfo.GetNumElements());
2097*89c4ff92SAndroid Build Coastguard Worker     std::vector<int16_t> cellToForgetWeightsData = GenerateRandomData<int16_t>(peepholeWeightsInfo.GetNumElements());
2098*89c4ff92SAndroid Build Coastguard Worker     std::vector<int16_t> cellToOutputWeightsData = GenerateRandomData<int16_t>(peepholeWeightsInfo.GetNumElements());
2099*89c4ff92SAndroid Build Coastguard Worker 
2100*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToInputWeights(peepholeWeightsInfo, cellToInputWeightsData);
2101*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToForgetWeights(peepholeWeightsInfo, cellToForgetWeightsData);
2102*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToOutputWeights(peepholeWeightsInfo, cellToOutputWeightsData);
2103*89c4ff92SAndroid Build Coastguard Worker 
2104*89c4ff92SAndroid Build Coastguard Worker     // Projection
2105*89c4ff92SAndroid Build Coastguard Worker     std::vector<int8_t> projectionWeightsData = GenerateRandomData<int8_t>(projectionWeightsInfo.GetNumElements());
2106*89c4ff92SAndroid Build Coastguard Worker     std::vector<int32_t> projectionBiasData(outputSize, 1);
2107*89c4ff92SAndroid Build Coastguard Worker 
2108*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor projectionWeights(projectionWeightsInfo, projectionWeightsData);
2109*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor projectionBias(biasInfo, projectionBiasData);
2110*89c4ff92SAndroid Build Coastguard Worker 
2111*89c4ff92SAndroid Build Coastguard Worker     // Layer Norm
2112*89c4ff92SAndroid Build Coastguard Worker     std::vector<int16_t> inputLayerNormWeightsData =
2113*89c4ff92SAndroid Build Coastguard Worker             GenerateRandomData<int16_t>(layerNormWeightsInfo.GetNumElements());
2114*89c4ff92SAndroid Build Coastguard Worker     std::vector<int16_t> forgetLayerNormWeightsData =
2115*89c4ff92SAndroid Build Coastguard Worker             GenerateRandomData<int16_t>(layerNormWeightsInfo.GetNumElements());
2116*89c4ff92SAndroid Build Coastguard Worker     std::vector<int16_t> cellLayerNormWeightsData =
2117*89c4ff92SAndroid Build Coastguard Worker             GenerateRandomData<int16_t>(layerNormWeightsInfo.GetNumElements());
2118*89c4ff92SAndroid Build Coastguard Worker     std::vector<int16_t> outputLayerNormWeightsData =
2119*89c4ff92SAndroid Build Coastguard Worker             GenerateRandomData<int16_t>(layerNormWeightsInfo.GetNumElements());
2120*89c4ff92SAndroid Build Coastguard Worker 
2121*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputLayerNormWeights(layerNormWeightsInfo, inputLayerNormWeightsData);
2122*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor forgetLayerNormWeights(layerNormWeightsInfo, forgetLayerNormWeightsData);
2123*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellLayerNormWeights(layerNormWeightsInfo, cellLayerNormWeightsData);
2124*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor outputLayerNormWeights(layerNormWeightsInfo, outputLayerNormWeightsData);
2125*89c4ff92SAndroid Build Coastguard Worker 
2126*89c4ff92SAndroid Build Coastguard Worker     // Set up params
2127*89c4ff92SAndroid Build Coastguard Worker     armnn::LstmInputParams params;
2128*89c4ff92SAndroid Build Coastguard Worker 
2129*89c4ff92SAndroid Build Coastguard Worker     // Mandatory params
2130*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToForgetWeights = &inputToForgetWeights;
2131*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToCellWeights   = &inputToCellWeights;
2132*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToOutputWeights = &inputToOutputWeights;
2133*89c4ff92SAndroid Build Coastguard Worker 
2134*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
2135*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToCellWeights   = &recurrentToCellWeights;
2136*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
2137*89c4ff92SAndroid Build Coastguard Worker 
2138*89c4ff92SAndroid Build Coastguard Worker     params.m_ForgetGateBias = &forgetGateBias;
2139*89c4ff92SAndroid Build Coastguard Worker     params.m_CellBias       = &cellBias;
2140*89c4ff92SAndroid Build Coastguard Worker     params.m_OutputGateBias = &outputGateBias;
2141*89c4ff92SAndroid Build Coastguard Worker 
2142*89c4ff92SAndroid Build Coastguard Worker     // CIFG
2143*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToInputWeights     = &inputToInputWeights;
2144*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToInputWeights = &recurrentToInputWeights;
2145*89c4ff92SAndroid Build Coastguard Worker     params.m_InputGateBias           = &inputGateBias;
2146*89c4ff92SAndroid Build Coastguard Worker 
2147*89c4ff92SAndroid Build Coastguard Worker     // Peephole
2148*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToInputWeights  = &cellToInputWeights;
2149*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToForgetWeights = &cellToForgetWeights;
2150*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToOutputWeights = &cellToOutputWeights;
2151*89c4ff92SAndroid Build Coastguard Worker 
2152*89c4ff92SAndroid Build Coastguard Worker     // Projection
2153*89c4ff92SAndroid Build Coastguard Worker     params.m_ProjectionWeights = &projectionWeights;
2154*89c4ff92SAndroid Build Coastguard Worker     params.m_ProjectionBias    = &projectionBias;
2155*89c4ff92SAndroid Build Coastguard Worker 
2156*89c4ff92SAndroid Build Coastguard Worker     // Layer Norm
2157*89c4ff92SAndroid Build Coastguard Worker     params.m_InputLayerNormWeights  = &inputLayerNormWeights;
2158*89c4ff92SAndroid Build Coastguard Worker     params.m_ForgetLayerNormWeights = &forgetLayerNormWeights;
2159*89c4ff92SAndroid Build Coastguard Worker     params.m_CellLayerNormWeights   = &cellLayerNormWeights;
2160*89c4ff92SAndroid Build Coastguard Worker     params.m_OutputLayerNormWeights = &outputLayerNormWeights;
2161*89c4ff92SAndroid Build Coastguard Worker 
2162*89c4ff92SAndroid Build Coastguard Worker     // Create network
2163*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr network = armnn::INetwork::Create();
2164*89c4ff92SAndroid Build Coastguard Worker     const std::string layerName("qLstm");
2165*89c4ff92SAndroid Build Coastguard Worker 
2166*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const input         = network->AddInputLayer(0);
2167*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(1);
2168*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateIn   = network->AddInputLayer(2);
2169*89c4ff92SAndroid Build Coastguard Worker 
2170*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const qLstmLayer = network->AddQLstmLayer(descriptor, params, layerName.c_str());
2171*89c4ff92SAndroid Build Coastguard Worker 
2172*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputStateOut = network->AddOutputLayer(0);
2173*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateOut   = network->AddOutputLayer(1);
2174*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputLayer    = network->AddOutputLayer(2);
2175*89c4ff92SAndroid Build Coastguard Worker 
2176*89c4ff92SAndroid Build Coastguard Worker     // Input/Output tensor info
2177*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputInfo({numBatches , inputSize},
2178*89c4ff92SAndroid Build Coastguard Worker                                 armnn::DataType::QAsymmS8,
2179*89c4ff92SAndroid Build Coastguard Worker                                 inputScale,
2180*89c4ff92SAndroid Build Coastguard Worker                                 inputOffset);
2181*89c4ff92SAndroid Build Coastguard Worker 
2182*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo cellStateInfo({numBatches , numUnits},
2183*89c4ff92SAndroid Build Coastguard Worker                                     armnn::DataType::QSymmS16,
2184*89c4ff92SAndroid Build Coastguard Worker                                     cellStateScale,
2185*89c4ff92SAndroid Build Coastguard Worker                                     cellStateOffset);
2186*89c4ff92SAndroid Build Coastguard Worker 
2187*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputStateInfo({numBatches , outputSize},
2188*89c4ff92SAndroid Build Coastguard Worker                                       armnn::DataType::QAsymmS8,
2189*89c4ff92SAndroid Build Coastguard Worker                                       outputScale,
2190*89c4ff92SAndroid Build Coastguard Worker                                       outputOffset);
2191*89c4ff92SAndroid Build Coastguard Worker 
2192*89c4ff92SAndroid Build Coastguard Worker     // Connect input/output slots
2193*89c4ff92SAndroid Build Coastguard Worker     input->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(0));
2194*89c4ff92SAndroid Build Coastguard Worker     input->GetOutputSlot(0).SetTensorInfo(inputInfo);
2195*89c4ff92SAndroid Build Coastguard Worker 
2196*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(1));
2197*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).SetTensorInfo(cellStateInfo);
2198*89c4ff92SAndroid Build Coastguard Worker 
2199*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(2));
2200*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).SetTensorInfo(outputStateInfo);
2201*89c4ff92SAndroid Build Coastguard Worker 
2202*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(0).Connect(outputStateOut->GetInputSlot(0));
2203*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(0).SetTensorInfo(outputStateInfo);
2204*89c4ff92SAndroid Build Coastguard Worker 
2205*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(1).Connect(cellStateOut->GetInputSlot(0));
2206*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(1).SetTensorInfo(cellStateInfo);
2207*89c4ff92SAndroid Build Coastguard Worker 
2208*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(2).Connect(outputLayer->GetInputSlot(0));
2209*89c4ff92SAndroid Build Coastguard Worker     qLstmLayer->GetOutputSlot(2).SetTensorInfo(outputStateInfo);
2210*89c4ff92SAndroid Build Coastguard Worker 
2211*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
2212*89c4ff92SAndroid Build Coastguard Worker     CHECK(deserializedNetwork);
2213*89c4ff92SAndroid Build Coastguard Worker 
2214*89c4ff92SAndroid Build Coastguard Worker     VerifyLstmLayer<armnn::QLstmDescriptor> checker(layerName,
2215*89c4ff92SAndroid Build Coastguard Worker                                                     {inputInfo, cellStateInfo, outputStateInfo},
2216*89c4ff92SAndroid Build Coastguard Worker                                                     {outputStateInfo, cellStateInfo, outputStateInfo},
2217*89c4ff92SAndroid Build Coastguard Worker                                                     descriptor,
2218*89c4ff92SAndroid Build Coastguard Worker                                                     params);
2219*89c4ff92SAndroid Build Coastguard Worker 
2220*89c4ff92SAndroid Build Coastguard Worker     deserializedNetwork->ExecuteStrategy(checker);
2221*89c4ff92SAndroid Build Coastguard Worker }
2222*89c4ff92SAndroid Build Coastguard Worker 
2223*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SerializeDeserializeUnidirectionalSequenceLstmCifgPeepholeNoProjection")
2224*89c4ff92SAndroid Build Coastguard Worker {
2225*89c4ff92SAndroid Build Coastguard Worker     armnn::UnidirectionalSequenceLstmDescriptor descriptor;
2226*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ActivationFunc = 4;
2227*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ClippingThresProj = 0.0f;
2228*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ClippingThresCell = 0.0f;
2229*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_CifgEnabled = true; // if this is true then we DON'T need to set the OptCifgParams
2230*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ProjectionEnabled = false;
2231*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_PeepholeEnabled = true;
2232*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_TimeMajor = false;
2233*89c4ff92SAndroid Build Coastguard Worker 
2234*89c4ff92SAndroid Build Coastguard Worker     const uint32_t batchSize = 1;
2235*89c4ff92SAndroid Build Coastguard Worker     const uint32_t timeSize = 2;
2236*89c4ff92SAndroid Build Coastguard Worker     const uint32_t inputSize = 2;
2237*89c4ff92SAndroid Build Coastguard Worker     const uint32_t numUnits = 4;
2238*89c4ff92SAndroid Build Coastguard Worker     const uint32_t outputSize = numUnits;
2239*89c4ff92SAndroid Build Coastguard Worker 
2240*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputWeightsInfo1({numUnits, inputSize}, armnn::DataType::Float32, 0.0f, 0, true);
2241*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToForgetWeightsData = GenerateRandomData<float>(inputWeightsInfo1.GetNumElements());
2242*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToForgetWeights(inputWeightsInfo1, inputToForgetWeightsData);
2243*89c4ff92SAndroid Build Coastguard Worker 
2244*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToCellWeightsData = GenerateRandomData<float>(inputWeightsInfo1.GetNumElements());
2245*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToCellWeights(inputWeightsInfo1, inputToCellWeightsData);
2246*89c4ff92SAndroid Build Coastguard Worker 
2247*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToOutputWeightsData = GenerateRandomData<float>(inputWeightsInfo1.GetNumElements());
2248*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToOutputWeights(inputWeightsInfo1, inputToOutputWeightsData);
2249*89c4ff92SAndroid Build Coastguard Worker 
2250*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputWeightsInfo2({numUnits, outputSize}, armnn::DataType::Float32, 0.0f, 0, true);
2251*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToForgetWeightsData = GenerateRandomData<float>(inputWeightsInfo2.GetNumElements());
2252*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToForgetWeights(inputWeightsInfo2, recurrentToForgetWeightsData);
2253*89c4ff92SAndroid Build Coastguard Worker 
2254*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToCellWeightsData = GenerateRandomData<float>(inputWeightsInfo2.GetNumElements());
2255*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToCellWeights(inputWeightsInfo2, recurrentToCellWeightsData);
2256*89c4ff92SAndroid Build Coastguard Worker 
2257*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToOutputWeightsData = GenerateRandomData<float>(inputWeightsInfo2.GetNumElements());
2258*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToOutputWeights(inputWeightsInfo2, recurrentToOutputWeightsData);
2259*89c4ff92SAndroid Build Coastguard Worker 
2260*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputWeightsInfo3({numUnits}, armnn::DataType::Float32, 0.0f, 0, true);
2261*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToForgetWeightsData = GenerateRandomData<float>(inputWeightsInfo3.GetNumElements());
2262*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToForgetWeights(inputWeightsInfo3, cellToForgetWeightsData);
2263*89c4ff92SAndroid Build Coastguard Worker 
2264*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToOutputWeightsData = GenerateRandomData<float>(inputWeightsInfo3.GetNumElements());
2265*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToOutputWeights(inputWeightsInfo3, cellToOutputWeightsData);
2266*89c4ff92SAndroid Build Coastguard Worker 
2267*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> forgetGateBiasData(numUnits, 1.0f);
2268*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor forgetGateBias(inputWeightsInfo3, forgetGateBiasData);
2269*89c4ff92SAndroid Build Coastguard Worker 
2270*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellBiasData(numUnits, 0.0f);
2271*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellBias(inputWeightsInfo3, cellBiasData);
2272*89c4ff92SAndroid Build Coastguard Worker 
2273*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> outputGateBiasData(numUnits, 0.0f);
2274*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor outputGateBias(inputWeightsInfo3, outputGateBiasData);
2275*89c4ff92SAndroid Build Coastguard Worker 
2276*89c4ff92SAndroid Build Coastguard Worker     armnn::LstmInputParams params;
2277*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToForgetWeights = &inputToForgetWeights;
2278*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToCellWeights = &inputToCellWeights;
2279*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToOutputWeights = &inputToOutputWeights;
2280*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
2281*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToCellWeights = &recurrentToCellWeights;
2282*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
2283*89c4ff92SAndroid Build Coastguard Worker     params.m_ForgetGateBias = &forgetGateBias;
2284*89c4ff92SAndroid Build Coastguard Worker     params.m_CellBias = &cellBias;
2285*89c4ff92SAndroid Build Coastguard Worker     params.m_OutputGateBias = &outputGateBias;
2286*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToForgetWeights = &cellToForgetWeights;
2287*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToOutputWeights = &cellToOutputWeights;
2288*89c4ff92SAndroid Build Coastguard Worker 
2289*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr network = armnn::INetwork::Create();
2290*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const inputLayer   = network->AddInputLayer(0);
2291*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateIn = network->AddInputLayer(1);
2292*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(2);
2293*89c4ff92SAndroid Build Coastguard Worker     const std::string layerName("UnidirectionalSequenceLstm");
2294*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const unidirectionalSequenceLstmLayer =
2295*89c4ff92SAndroid Build Coastguard Worker         network->AddUnidirectionalSequenceLstmLayer(descriptor, params, layerName.c_str());
2296*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputLayer  = network->AddOutputLayer(0);
2297*89c4ff92SAndroid Build Coastguard Worker 
2298*89c4ff92SAndroid Build Coastguard Worker     // connect up
2299*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputTensorInfo({ batchSize, timeSize, inputSize }, armnn::DataType::Float32);
2300*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo cellStateTensorInfo({ batchSize, numUnits}, armnn::DataType::Float32);
2301*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputStateTensorInfo({ batchSize, outputSize }, armnn::DataType::Float32);
2302*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputStateOutTensorInfo({ batchSize, timeSize, outputSize }, armnn::DataType::Float32);
2303*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo cellStateOutTensorInfo({ batchSize, outputSize }, armnn::DataType::Float32);
2304*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputTensorInfo({ batchSize, timeSize, outputSize }, armnn::DataType::Float32);
2305*89c4ff92SAndroid Build Coastguard Worker 
2306*89c4ff92SAndroid Build Coastguard Worker     inputLayer->GetOutputSlot(0).Connect(unidirectionalSequenceLstmLayer->GetInputSlot(0));
2307*89c4ff92SAndroid Build Coastguard Worker     inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2308*89c4ff92SAndroid Build Coastguard Worker 
2309*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).Connect(unidirectionalSequenceLstmLayer->GetInputSlot(1));
2310*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).SetTensorInfo(outputStateTensorInfo);
2311*89c4ff92SAndroid Build Coastguard Worker 
2312*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).Connect(unidirectionalSequenceLstmLayer->GetInputSlot(2));
2313*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).SetTensorInfo(cellStateTensorInfo);
2314*89c4ff92SAndroid Build Coastguard Worker 
2315*89c4ff92SAndroid Build Coastguard Worker     unidirectionalSequenceLstmLayer->GetOutputSlot(0).SetTensorInfo(outputStateOutTensorInfo);
2316*89c4ff92SAndroid Build Coastguard Worker     unidirectionalSequenceLstmLayer->GetOutputSlot(1).SetTensorInfo(cellStateOutTensorInfo);
2317*89c4ff92SAndroid Build Coastguard Worker     unidirectionalSequenceLstmLayer->GetOutputSlot(2).Connect(outputLayer->GetInputSlot(0));
2318*89c4ff92SAndroid Build Coastguard Worker     unidirectionalSequenceLstmLayer->GetOutputSlot(2).SetTensorInfo(outputTensorInfo);
2319*89c4ff92SAndroid Build Coastguard Worker 
2320*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
2321*89c4ff92SAndroid Build Coastguard Worker     CHECK(deserializedNetwork);
2322*89c4ff92SAndroid Build Coastguard Worker 
2323*89c4ff92SAndroid Build Coastguard Worker     VerifyLstmLayer<armnn::UnidirectionalSequenceLstmDescriptor> checker(
2324*89c4ff92SAndroid Build Coastguard Worker         layerName,
2325*89c4ff92SAndroid Build Coastguard Worker         {inputTensorInfo, outputStateTensorInfo, cellStateTensorInfo},
2326*89c4ff92SAndroid Build Coastguard Worker         {outputStateOutTensorInfo, cellStateOutTensorInfo, outputTensorInfo},
2327*89c4ff92SAndroid Build Coastguard Worker         descriptor,
2328*89c4ff92SAndroid Build Coastguard Worker         params);
2329*89c4ff92SAndroid Build Coastguard Worker     deserializedNetwork->ExecuteStrategy(checker);
2330*89c4ff92SAndroid Build Coastguard Worker }
2331*89c4ff92SAndroid Build Coastguard Worker 
2332*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SerializeDeserializeUnidirectionalSequenceLstmNoCifgWithPeepholeAndProjection")
2333*89c4ff92SAndroid Build Coastguard Worker {
2334*89c4ff92SAndroid Build Coastguard Worker     armnn::UnidirectionalSequenceLstmDescriptor descriptor;
2335*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ActivationFunc = 4;
2336*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ClippingThresProj = 0.0f;
2337*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ClippingThresCell = 0.0f;
2338*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_CifgEnabled = false; // if this is true then we DON'T need to set the OptCifgParams
2339*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ProjectionEnabled = true;
2340*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_PeepholeEnabled = true;
2341*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_TimeMajor = false;
2342*89c4ff92SAndroid Build Coastguard Worker 
2343*89c4ff92SAndroid Build Coastguard Worker     const uint32_t batchSize = 2;
2344*89c4ff92SAndroid Build Coastguard Worker     const uint32_t timeSize = 2;
2345*89c4ff92SAndroid Build Coastguard Worker     const uint32_t inputSize = 5;
2346*89c4ff92SAndroid Build Coastguard Worker     const uint32_t numUnits = 20;
2347*89c4ff92SAndroid Build Coastguard Worker     const uint32_t outputSize = 16;
2348*89c4ff92SAndroid Build Coastguard Worker 
2349*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo20x5({numUnits, inputSize}, armnn::DataType::Float32, 0.0f, 0, true);
2350*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToInputWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
2351*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToInputWeights(tensorInfo20x5, inputToInputWeightsData);
2352*89c4ff92SAndroid Build Coastguard Worker 
2353*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToForgetWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
2354*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToForgetWeights(tensorInfo20x5, inputToForgetWeightsData);
2355*89c4ff92SAndroid Build Coastguard Worker 
2356*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToCellWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
2357*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToCellWeights(tensorInfo20x5, inputToCellWeightsData);
2358*89c4ff92SAndroid Build Coastguard Worker 
2359*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToOutputWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
2360*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToOutputWeights(tensorInfo20x5, inputToOutputWeightsData);
2361*89c4ff92SAndroid Build Coastguard Worker 
2362*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo20({numUnits}, armnn::DataType::Float32, 0.0f, 0, true);
2363*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2364*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputGateBias(tensorInfo20, inputGateBiasData);
2365*89c4ff92SAndroid Build Coastguard Worker 
2366*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> forgetGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2367*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor forgetGateBias(tensorInfo20, forgetGateBiasData);
2368*89c4ff92SAndroid Build Coastguard Worker 
2369*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2370*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellBias(tensorInfo20, cellBiasData);
2371*89c4ff92SAndroid Build Coastguard Worker 
2372*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> outputGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2373*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor outputGateBias(tensorInfo20, outputGateBiasData);
2374*89c4ff92SAndroid Build Coastguard Worker 
2375*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo20x16({numUnits, outputSize}, armnn::DataType::Float32, 0.0f, 0, true);
2376*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToInputWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
2377*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToInputWeights(tensorInfo20x16, recurrentToInputWeightsData);
2378*89c4ff92SAndroid Build Coastguard Worker 
2379*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToForgetWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
2380*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToForgetWeights(tensorInfo20x16, recurrentToForgetWeightsData);
2381*89c4ff92SAndroid Build Coastguard Worker 
2382*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToCellWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
2383*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToCellWeights(tensorInfo20x16, recurrentToCellWeightsData);
2384*89c4ff92SAndroid Build Coastguard Worker 
2385*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToOutputWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
2386*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToOutputWeights(tensorInfo20x16, recurrentToOutputWeightsData);
2387*89c4ff92SAndroid Build Coastguard Worker 
2388*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToInputWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2389*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToInputWeights(tensorInfo20, cellToInputWeightsData);
2390*89c4ff92SAndroid Build Coastguard Worker 
2391*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToForgetWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2392*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToForgetWeights(tensorInfo20, cellToForgetWeightsData);
2393*89c4ff92SAndroid Build Coastguard Worker 
2394*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToOutputWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2395*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToOutputWeights(tensorInfo20,  cellToOutputWeightsData);
2396*89c4ff92SAndroid Build Coastguard Worker 
2397*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo16x20({outputSize, numUnits}, armnn::DataType::Float32, 0.0f, 0, true);
2398*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> projectionWeightsData = GenerateRandomData<float>(tensorInfo16x20.GetNumElements());
2399*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor projectionWeights(tensorInfo16x20, projectionWeightsData);
2400*89c4ff92SAndroid Build Coastguard Worker 
2401*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo16({outputSize}, armnn::DataType::Float32, 0.0f, 0, true);
2402*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> projectionBiasData(outputSize, 0.f);
2403*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor projectionBias(tensorInfo16, projectionBiasData);
2404*89c4ff92SAndroid Build Coastguard Worker 
2405*89c4ff92SAndroid Build Coastguard Worker     armnn::LstmInputParams params;
2406*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToForgetWeights = &inputToForgetWeights;
2407*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToCellWeights = &inputToCellWeights;
2408*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToOutputWeights = &inputToOutputWeights;
2409*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
2410*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToCellWeights = &recurrentToCellWeights;
2411*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
2412*89c4ff92SAndroid Build Coastguard Worker     params.m_ForgetGateBias = &forgetGateBias;
2413*89c4ff92SAndroid Build Coastguard Worker     params.m_CellBias = &cellBias;
2414*89c4ff92SAndroid Build Coastguard Worker     params.m_OutputGateBias = &outputGateBias;
2415*89c4ff92SAndroid Build Coastguard Worker 
2416*89c4ff92SAndroid Build Coastguard Worker     // additional params because: descriptor.m_CifgEnabled = false
2417*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToInputWeights = &inputToInputWeights;
2418*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToInputWeights = &recurrentToInputWeights;
2419*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToInputWeights = &cellToInputWeights;
2420*89c4ff92SAndroid Build Coastguard Worker     params.m_InputGateBias = &inputGateBias;
2421*89c4ff92SAndroid Build Coastguard Worker 
2422*89c4ff92SAndroid Build Coastguard Worker     // additional params because: descriptor.m_ProjectionEnabled = true
2423*89c4ff92SAndroid Build Coastguard Worker     params.m_ProjectionWeights = &projectionWeights;
2424*89c4ff92SAndroid Build Coastguard Worker     params.m_ProjectionBias = &projectionBias;
2425*89c4ff92SAndroid Build Coastguard Worker 
2426*89c4ff92SAndroid Build Coastguard Worker     // additional params because: descriptor.m_PeepholeEnabled = true
2427*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToForgetWeights = &cellToForgetWeights;
2428*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToOutputWeights = &cellToOutputWeights;
2429*89c4ff92SAndroid Build Coastguard Worker 
2430*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr network = armnn::INetwork::Create();
2431*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const inputLayer   = network->AddInputLayer(0);
2432*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateIn = network->AddInputLayer(1);
2433*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(2);
2434*89c4ff92SAndroid Build Coastguard Worker     const std::string layerName("unidirectionalSequenceLstm");
2435*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const unidirectionalSequenceLstmLayer =
2436*89c4ff92SAndroid Build Coastguard Worker         network->AddUnidirectionalSequenceLstmLayer(descriptor, params, layerName.c_str());
2437*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputLayer  = network->AddOutputLayer(0);
2438*89c4ff92SAndroid Build Coastguard Worker 
2439*89c4ff92SAndroid Build Coastguard Worker     // connect up
2440*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputTensorInfo({ batchSize, timeSize, inputSize }, armnn::DataType::Float32);
2441*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo cellStateTensorInfo({ batchSize, numUnits}, armnn::DataType::Float32);
2442*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputStateTensorInfo({ batchSize, outputSize }, armnn::DataType::Float32);
2443*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputStateOutTensorInfo({ batchSize, timeSize, outputSize }, armnn::DataType::Float32);
2444*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo cellStateOutTensorInfo({ batchSize, outputSize }, armnn::DataType::Float32);
2445*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputTensorInfo({ batchSize, timeSize, outputSize }, armnn::DataType::Float32);
2446*89c4ff92SAndroid Build Coastguard Worker 
2447*89c4ff92SAndroid Build Coastguard Worker     inputLayer->GetOutputSlot(0).Connect(unidirectionalSequenceLstmLayer->GetInputSlot(0));
2448*89c4ff92SAndroid Build Coastguard Worker     inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2449*89c4ff92SAndroid Build Coastguard Worker 
2450*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).Connect(unidirectionalSequenceLstmLayer->GetInputSlot(1));
2451*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).SetTensorInfo(outputStateTensorInfo);
2452*89c4ff92SAndroid Build Coastguard Worker 
2453*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).Connect(unidirectionalSequenceLstmLayer->GetInputSlot(2));
2454*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).SetTensorInfo(cellStateTensorInfo);
2455*89c4ff92SAndroid Build Coastguard Worker 
2456*89c4ff92SAndroid Build Coastguard Worker     unidirectionalSequenceLstmLayer->GetOutputSlot(0).SetTensorInfo(outputStateOutTensorInfo);
2457*89c4ff92SAndroid Build Coastguard Worker     unidirectionalSequenceLstmLayer->GetOutputSlot(1).SetTensorInfo(cellStateOutTensorInfo);
2458*89c4ff92SAndroid Build Coastguard Worker     unidirectionalSequenceLstmLayer->GetOutputSlot(2).Connect(outputLayer->GetInputSlot(0));
2459*89c4ff92SAndroid Build Coastguard Worker     unidirectionalSequenceLstmLayer->GetOutputSlot(2).SetTensorInfo(outputTensorInfo);
2460*89c4ff92SAndroid Build Coastguard Worker 
2461*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
2462*89c4ff92SAndroid Build Coastguard Worker     CHECK(deserializedNetwork);
2463*89c4ff92SAndroid Build Coastguard Worker 
2464*89c4ff92SAndroid Build Coastguard Worker     VerifyLstmLayer<armnn::UnidirectionalSequenceLstmDescriptor> checker(
2465*89c4ff92SAndroid Build Coastguard Worker         layerName,
2466*89c4ff92SAndroid Build Coastguard Worker         {inputTensorInfo, outputStateTensorInfo, cellStateTensorInfo},
2467*89c4ff92SAndroid Build Coastguard Worker         {outputStateOutTensorInfo, cellStateOutTensorInfo, outputTensorInfo},
2468*89c4ff92SAndroid Build Coastguard Worker         descriptor,
2469*89c4ff92SAndroid Build Coastguard Worker         params);
2470*89c4ff92SAndroid Build Coastguard Worker     deserializedNetwork->ExecuteStrategy(checker);
2471*89c4ff92SAndroid Build Coastguard Worker }
2472*89c4ff92SAndroid Build Coastguard Worker 
2473*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SerializeDeserializeUnidirectionalSequenceLstmNoCifgWithPeepholeWithProjectionWithLayerNorm")
2474*89c4ff92SAndroid Build Coastguard Worker {
2475*89c4ff92SAndroid Build Coastguard Worker     armnn::UnidirectionalSequenceLstmDescriptor descriptor;
2476*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ActivationFunc = 4;
2477*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ClippingThresProj = 0.0f;
2478*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ClippingThresCell = 0.0f;
2479*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_CifgEnabled = false; // if this is true then we DON'T need to set the OptCifgParams
2480*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ProjectionEnabled = true;
2481*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_PeepholeEnabled = true;
2482*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_LayerNormEnabled = true;
2483*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_TimeMajor = false;
2484*89c4ff92SAndroid Build Coastguard Worker 
2485*89c4ff92SAndroid Build Coastguard Worker     const uint32_t batchSize = 2;
2486*89c4ff92SAndroid Build Coastguard Worker     const uint32_t timeSize = 2;
2487*89c4ff92SAndroid Build Coastguard Worker     const uint32_t inputSize = 5;
2488*89c4ff92SAndroid Build Coastguard Worker     const uint32_t numUnits = 20;
2489*89c4ff92SAndroid Build Coastguard Worker     const uint32_t outputSize = 16;
2490*89c4ff92SAndroid Build Coastguard Worker 
2491*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo20x5({numUnits, inputSize}, armnn::DataType::Float32, 0.0f, 0, true);
2492*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToInputWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
2493*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToInputWeights(tensorInfo20x5, inputToInputWeightsData);
2494*89c4ff92SAndroid Build Coastguard Worker 
2495*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToForgetWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
2496*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToForgetWeights(tensorInfo20x5, inputToForgetWeightsData);
2497*89c4ff92SAndroid Build Coastguard Worker 
2498*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToCellWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
2499*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToCellWeights(tensorInfo20x5, inputToCellWeightsData);
2500*89c4ff92SAndroid Build Coastguard Worker 
2501*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToOutputWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
2502*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToOutputWeights(tensorInfo20x5, inputToOutputWeightsData);
2503*89c4ff92SAndroid Build Coastguard Worker 
2504*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo20({numUnits}, armnn::DataType::Float32, 0.0f, 0, true);
2505*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2506*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputGateBias(tensorInfo20, inputGateBiasData);
2507*89c4ff92SAndroid Build Coastguard Worker 
2508*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> forgetGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2509*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor forgetGateBias(tensorInfo20, forgetGateBiasData);
2510*89c4ff92SAndroid Build Coastguard Worker 
2511*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2512*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellBias(tensorInfo20, cellBiasData);
2513*89c4ff92SAndroid Build Coastguard Worker 
2514*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> outputGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2515*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor outputGateBias(tensorInfo20, outputGateBiasData);
2516*89c4ff92SAndroid Build Coastguard Worker 
2517*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo20x16({numUnits, outputSize}, armnn::DataType::Float32, 0.0f, 0, true);
2518*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToInputWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
2519*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToInputWeights(tensorInfo20x16, recurrentToInputWeightsData);
2520*89c4ff92SAndroid Build Coastguard Worker 
2521*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToForgetWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
2522*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToForgetWeights(tensorInfo20x16, recurrentToForgetWeightsData);
2523*89c4ff92SAndroid Build Coastguard Worker 
2524*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToCellWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
2525*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToCellWeights(tensorInfo20x16, recurrentToCellWeightsData);
2526*89c4ff92SAndroid Build Coastguard Worker 
2527*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToOutputWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
2528*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToOutputWeights(tensorInfo20x16, recurrentToOutputWeightsData);
2529*89c4ff92SAndroid Build Coastguard Worker 
2530*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToInputWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2531*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToInputWeights(tensorInfo20, cellToInputWeightsData);
2532*89c4ff92SAndroid Build Coastguard Worker 
2533*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToForgetWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2534*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToForgetWeights(tensorInfo20, cellToForgetWeightsData);
2535*89c4ff92SAndroid Build Coastguard Worker 
2536*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToOutputWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2537*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToOutputWeights(tensorInfo20,  cellToOutputWeightsData);
2538*89c4ff92SAndroid Build Coastguard Worker 
2539*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo16x20({outputSize, numUnits}, armnn::DataType::Float32, 0.0f, 0, true);
2540*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> projectionWeightsData = GenerateRandomData<float>(tensorInfo16x20.GetNumElements());
2541*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor projectionWeights(tensorInfo16x20, projectionWeightsData);
2542*89c4ff92SAndroid Build Coastguard Worker 
2543*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo16({outputSize}, armnn::DataType::Float32, 0.0f, 0, true);
2544*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> projectionBiasData(outputSize, 0.f);
2545*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor projectionBias(tensorInfo16, projectionBiasData);
2546*89c4ff92SAndroid Build Coastguard Worker 
2547*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputLayerNormWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2548*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputLayerNormWeights(tensorInfo20, forgetGateBiasData);
2549*89c4ff92SAndroid Build Coastguard Worker 
2550*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> forgetLayerNormWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2551*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor forgetLayerNormWeights(tensorInfo20, forgetGateBiasData);
2552*89c4ff92SAndroid Build Coastguard Worker 
2553*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellLayerNormWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2554*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellLayerNormWeights(tensorInfo20, forgetGateBiasData);
2555*89c4ff92SAndroid Build Coastguard Worker 
2556*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> outLayerNormWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
2557*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor outLayerNormWeights(tensorInfo20, forgetGateBiasData);
2558*89c4ff92SAndroid Build Coastguard Worker 
2559*89c4ff92SAndroid Build Coastguard Worker     armnn::LstmInputParams params;
2560*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToForgetWeights = &inputToForgetWeights;
2561*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToCellWeights = &inputToCellWeights;
2562*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToOutputWeights = &inputToOutputWeights;
2563*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
2564*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToCellWeights = &recurrentToCellWeights;
2565*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
2566*89c4ff92SAndroid Build Coastguard Worker     params.m_ForgetGateBias = &forgetGateBias;
2567*89c4ff92SAndroid Build Coastguard Worker     params.m_CellBias = &cellBias;
2568*89c4ff92SAndroid Build Coastguard Worker     params.m_OutputGateBias = &outputGateBias;
2569*89c4ff92SAndroid Build Coastguard Worker 
2570*89c4ff92SAndroid Build Coastguard Worker     // additional params because: descriptor.m_CifgEnabled = false
2571*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToInputWeights = &inputToInputWeights;
2572*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToInputWeights = &recurrentToInputWeights;
2573*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToInputWeights = &cellToInputWeights;
2574*89c4ff92SAndroid Build Coastguard Worker     params.m_InputGateBias = &inputGateBias;
2575*89c4ff92SAndroid Build Coastguard Worker 
2576*89c4ff92SAndroid Build Coastguard Worker     // additional params because: descriptor.m_ProjectionEnabled = true
2577*89c4ff92SAndroid Build Coastguard Worker     params.m_ProjectionWeights = &projectionWeights;
2578*89c4ff92SAndroid Build Coastguard Worker     params.m_ProjectionBias = &projectionBias;
2579*89c4ff92SAndroid Build Coastguard Worker 
2580*89c4ff92SAndroid Build Coastguard Worker     // additional params because: descriptor.m_PeepholeEnabled = true
2581*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToForgetWeights = &cellToForgetWeights;
2582*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToOutputWeights = &cellToOutputWeights;
2583*89c4ff92SAndroid Build Coastguard Worker 
2584*89c4ff92SAndroid Build Coastguard Worker     // additional params because: despriptor.m_LayerNormEnabled = true
2585*89c4ff92SAndroid Build Coastguard Worker     params.m_InputLayerNormWeights = &inputLayerNormWeights;
2586*89c4ff92SAndroid Build Coastguard Worker     params.m_ForgetLayerNormWeights = &forgetLayerNormWeights;
2587*89c4ff92SAndroid Build Coastguard Worker     params.m_CellLayerNormWeights = &cellLayerNormWeights;
2588*89c4ff92SAndroid Build Coastguard Worker     params.m_OutputLayerNormWeights = &outLayerNormWeights;
2589*89c4ff92SAndroid Build Coastguard Worker 
2590*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr network = armnn::INetwork::Create();
2591*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const inputLayer   = network->AddInputLayer(0);
2592*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateIn = network->AddInputLayer(1);
2593*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(2);
2594*89c4ff92SAndroid Build Coastguard Worker     const std::string layerName("unidirectionalSequenceLstm");
2595*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const unidirectionalSequenceLstmLayer =
2596*89c4ff92SAndroid Build Coastguard Worker         network->AddUnidirectionalSequenceLstmLayer(descriptor, params, layerName.c_str());
2597*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputLayer  = network->AddOutputLayer(0);
2598*89c4ff92SAndroid Build Coastguard Worker 
2599*89c4ff92SAndroid Build Coastguard Worker     // connect up
2600*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputTensorInfo({ batchSize, timeSize, inputSize }, armnn::DataType::Float32);
2601*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo cellStateTensorInfo({ batchSize, numUnits}, armnn::DataType::Float32);
2602*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputStateTensorInfo({ batchSize, outputSize }, armnn::DataType::Float32);
2603*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32);
2604*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo cellStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32);
2605*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputTensorInfo({ batchSize, timeSize, outputSize }, armnn::DataType::Float32);
2606*89c4ff92SAndroid Build Coastguard Worker 
2607*89c4ff92SAndroid Build Coastguard Worker     inputLayer->GetOutputSlot(0).Connect(unidirectionalSequenceLstmLayer->GetInputSlot(0));
2608*89c4ff92SAndroid Build Coastguard Worker     inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2609*89c4ff92SAndroid Build Coastguard Worker 
2610*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).Connect(unidirectionalSequenceLstmLayer->GetInputSlot(1));
2611*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).SetTensorInfo(outputStateTensorInfo);
2612*89c4ff92SAndroid Build Coastguard Worker 
2613*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).Connect(unidirectionalSequenceLstmLayer->GetInputSlot(2));
2614*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).SetTensorInfo(cellStateTensorInfo);
2615*89c4ff92SAndroid Build Coastguard Worker 
2616*89c4ff92SAndroid Build Coastguard Worker     unidirectionalSequenceLstmLayer->GetOutputSlot(0).SetTensorInfo(outputStateOutTensorInfo);
2617*89c4ff92SAndroid Build Coastguard Worker     unidirectionalSequenceLstmLayer->GetOutputSlot(1).SetTensorInfo(cellStateOutTensorInfo);
2618*89c4ff92SAndroid Build Coastguard Worker     unidirectionalSequenceLstmLayer->GetOutputSlot(2).Connect(outputLayer->GetInputSlot(0));
2619*89c4ff92SAndroid Build Coastguard Worker     unidirectionalSequenceLstmLayer->GetOutputSlot(2).SetTensorInfo(outputTensorInfo);
2620*89c4ff92SAndroid Build Coastguard Worker 
2621*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
2622*89c4ff92SAndroid Build Coastguard Worker     CHECK(deserializedNetwork);
2623*89c4ff92SAndroid Build Coastguard Worker 
2624*89c4ff92SAndroid Build Coastguard Worker     VerifyLstmLayer<armnn::UnidirectionalSequenceLstmDescriptor> checker(
2625*89c4ff92SAndroid Build Coastguard Worker             layerName,
2626*89c4ff92SAndroid Build Coastguard Worker             {inputTensorInfo, outputStateTensorInfo, cellStateTensorInfo},
2627*89c4ff92SAndroid Build Coastguard Worker             {outputStateOutTensorInfo, cellStateOutTensorInfo, outputTensorInfo},
2628*89c4ff92SAndroid Build Coastguard Worker             descriptor,
2629*89c4ff92SAndroid Build Coastguard Worker             params);
2630*89c4ff92SAndroid Build Coastguard Worker     deserializedNetwork->ExecuteStrategy(checker);
2631*89c4ff92SAndroid Build Coastguard Worker }
2632*89c4ff92SAndroid Build Coastguard Worker 
2633*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SerializeDeserializeUnidirectionalSequenceLstmCifgPeepholeNoProjectionTimeMajor")
2634*89c4ff92SAndroid Build Coastguard Worker {
2635*89c4ff92SAndroid Build Coastguard Worker     armnn::UnidirectionalSequenceLstmDescriptor descriptor;
2636*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ActivationFunc = 4;
2637*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ClippingThresProj = 0.0f;
2638*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ClippingThresCell = 0.0f;
2639*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_CifgEnabled = true; // if this is true then we DON'T need to set the OptCifgParams
2640*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_ProjectionEnabled = false;
2641*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_PeepholeEnabled = true;
2642*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_TimeMajor = true;
2643*89c4ff92SAndroid Build Coastguard Worker 
2644*89c4ff92SAndroid Build Coastguard Worker     const uint32_t batchSize = 1;
2645*89c4ff92SAndroid Build Coastguard Worker     const uint32_t timeSize = 2;
2646*89c4ff92SAndroid Build Coastguard Worker     const uint32_t inputSize = 2;
2647*89c4ff92SAndroid Build Coastguard Worker     const uint32_t numUnits = 4;
2648*89c4ff92SAndroid Build Coastguard Worker     const uint32_t outputSize = numUnits;
2649*89c4ff92SAndroid Build Coastguard Worker 
2650*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputWeightsInfo1({numUnits, inputSize}, armnn::DataType::Float32, 0.0f, 0, true);
2651*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToForgetWeightsData = GenerateRandomData<float>(inputWeightsInfo1.GetNumElements());
2652*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToForgetWeights(inputWeightsInfo1, inputToForgetWeightsData);
2653*89c4ff92SAndroid Build Coastguard Worker 
2654*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToCellWeightsData = GenerateRandomData<float>(inputWeightsInfo1.GetNumElements());
2655*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToCellWeights(inputWeightsInfo1, inputToCellWeightsData);
2656*89c4ff92SAndroid Build Coastguard Worker 
2657*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputToOutputWeightsData = GenerateRandomData<float>(inputWeightsInfo1.GetNumElements());
2658*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor inputToOutputWeights(inputWeightsInfo1, inputToOutputWeightsData);
2659*89c4ff92SAndroid Build Coastguard Worker 
2660*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputWeightsInfo2({numUnits, outputSize}, armnn::DataType::Float32, 0.0f, 0, true);
2661*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToForgetWeightsData = GenerateRandomData<float>(inputWeightsInfo2.GetNumElements());
2662*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToForgetWeights(inputWeightsInfo2, recurrentToForgetWeightsData);
2663*89c4ff92SAndroid Build Coastguard Worker 
2664*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToCellWeightsData = GenerateRandomData<float>(inputWeightsInfo2.GetNumElements());
2665*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToCellWeights(inputWeightsInfo2, recurrentToCellWeightsData);
2666*89c4ff92SAndroid Build Coastguard Worker 
2667*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> recurrentToOutputWeightsData = GenerateRandomData<float>(inputWeightsInfo2.GetNumElements());
2668*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor recurrentToOutputWeights(inputWeightsInfo2, recurrentToOutputWeightsData);
2669*89c4ff92SAndroid Build Coastguard Worker 
2670*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputWeightsInfo3({numUnits}, armnn::DataType::Float32, 0.0f, 0, true);
2671*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToForgetWeightsData = GenerateRandomData<float>(inputWeightsInfo3.GetNumElements());
2672*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToForgetWeights(inputWeightsInfo3, cellToForgetWeightsData);
2673*89c4ff92SAndroid Build Coastguard Worker 
2674*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellToOutputWeightsData = GenerateRandomData<float>(inputWeightsInfo3.GetNumElements());
2675*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellToOutputWeights(inputWeightsInfo3, cellToOutputWeightsData);
2676*89c4ff92SAndroid Build Coastguard Worker 
2677*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> forgetGateBiasData(numUnits, 1.0f);
2678*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor forgetGateBias(inputWeightsInfo3, forgetGateBiasData);
2679*89c4ff92SAndroid Build Coastguard Worker 
2680*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> cellBiasData(numUnits, 0.0f);
2681*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor cellBias(inputWeightsInfo3, cellBiasData);
2682*89c4ff92SAndroid Build Coastguard Worker 
2683*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> outputGateBiasData(numUnits, 0.0f);
2684*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor outputGateBias(inputWeightsInfo3, outputGateBiasData);
2685*89c4ff92SAndroid Build Coastguard Worker 
2686*89c4ff92SAndroid Build Coastguard Worker     armnn::LstmInputParams params;
2687*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToForgetWeights = &inputToForgetWeights;
2688*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToCellWeights = &inputToCellWeights;
2689*89c4ff92SAndroid Build Coastguard Worker     params.m_InputToOutputWeights = &inputToOutputWeights;
2690*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
2691*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToCellWeights = &recurrentToCellWeights;
2692*89c4ff92SAndroid Build Coastguard Worker     params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
2693*89c4ff92SAndroid Build Coastguard Worker     params.m_ForgetGateBias = &forgetGateBias;
2694*89c4ff92SAndroid Build Coastguard Worker     params.m_CellBias = &cellBias;
2695*89c4ff92SAndroid Build Coastguard Worker     params.m_OutputGateBias = &outputGateBias;
2696*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToForgetWeights = &cellToForgetWeights;
2697*89c4ff92SAndroid Build Coastguard Worker     params.m_CellToOutputWeights = &cellToOutputWeights;
2698*89c4ff92SAndroid Build Coastguard Worker 
2699*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr network = armnn::INetwork::Create();
2700*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const inputLayer   = network->AddInputLayer(0);
2701*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const cellStateIn = network->AddInputLayer(1);
2702*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(2);
2703*89c4ff92SAndroid Build Coastguard Worker     const std::string layerName("UnidirectionalSequenceLstm");
2704*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const unidirectionalSequenceLstmLayer =
2705*89c4ff92SAndroid Build Coastguard Worker         network->AddUnidirectionalSequenceLstmLayer(descriptor, params, layerName.c_str());
2706*89c4ff92SAndroid Build Coastguard Worker     armnn::IConnectableLayer* const outputLayer  = network->AddOutputLayer(0);
2707*89c4ff92SAndroid Build Coastguard Worker 
2708*89c4ff92SAndroid Build Coastguard Worker     // connect up
2709*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputTensorInfo({ timeSize, batchSize, inputSize }, armnn::DataType::Float32);
2710*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo cellStateTensorInfo({ batchSize, numUnits}, armnn::DataType::Float32);
2711*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputStateTensorInfo({ batchSize, outputSize }, armnn::DataType::Float32);
2712*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32);
2713*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo cellStateOutTensorInfo({batchSize, timeSize, outputSize}, armnn::DataType::Float32);
2714*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputTensorInfo({ timeSize, batchSize, outputSize }, armnn::DataType::Float32);
2715*89c4ff92SAndroid Build Coastguard Worker 
2716*89c4ff92SAndroid Build Coastguard Worker     inputLayer->GetOutputSlot(0).Connect(unidirectionalSequenceLstmLayer->GetInputSlot(0));
2717*89c4ff92SAndroid Build Coastguard Worker     inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
2718*89c4ff92SAndroid Build Coastguard Worker 
2719*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).Connect(unidirectionalSequenceLstmLayer->GetInputSlot(1));
2720*89c4ff92SAndroid Build Coastguard Worker     outputStateIn->GetOutputSlot(0).SetTensorInfo(outputStateTensorInfo);
2721*89c4ff92SAndroid Build Coastguard Worker 
2722*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).Connect(unidirectionalSequenceLstmLayer->GetInputSlot(2));
2723*89c4ff92SAndroid Build Coastguard Worker     cellStateIn->GetOutputSlot(0).SetTensorInfo(cellStateTensorInfo);
2724*89c4ff92SAndroid Build Coastguard Worker 
2725*89c4ff92SAndroid Build Coastguard Worker     unidirectionalSequenceLstmLayer->GetOutputSlot(0).SetTensorInfo(outputStateOutTensorInfo);
2726*89c4ff92SAndroid Build Coastguard Worker     unidirectionalSequenceLstmLayer->GetOutputSlot(1).SetTensorInfo(cellStateOutTensorInfo);
2727*89c4ff92SAndroid Build Coastguard Worker     unidirectionalSequenceLstmLayer->GetOutputSlot(2).Connect(outputLayer->GetInputSlot(0));
2728*89c4ff92SAndroid Build Coastguard Worker     unidirectionalSequenceLstmLayer->GetOutputSlot(2).SetTensorInfo(outputTensorInfo);
2729*89c4ff92SAndroid Build Coastguard Worker 
2730*89c4ff92SAndroid Build Coastguard Worker     armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
2731*89c4ff92SAndroid Build Coastguard Worker     CHECK(deserializedNetwork);
2732*89c4ff92SAndroid Build Coastguard Worker 
2733*89c4ff92SAndroid Build Coastguard Worker     VerifyLstmLayer<armnn::UnidirectionalSequenceLstmDescriptor> checker(
2734*89c4ff92SAndroid Build Coastguard Worker         layerName,
2735*89c4ff92SAndroid Build Coastguard Worker         {inputTensorInfo, outputStateTensorInfo, cellStateTensorInfo},
2736*89c4ff92SAndroid Build Coastguard Worker         {outputStateOutTensorInfo, cellStateOutTensorInfo, outputTensorInfo},
2737*89c4ff92SAndroid Build Coastguard Worker         descriptor,
2738*89c4ff92SAndroid Build Coastguard Worker         params);
2739*89c4ff92SAndroid Build Coastguard Worker     deserializedNetwork->ExecuteStrategy(checker);
2740*89c4ff92SAndroid Build Coastguard Worker }
2741*89c4ff92SAndroid Build Coastguard Worker 
2742*89c4ff92SAndroid Build Coastguard Worker }
2743