MemoryFileTest.java revision c1823701cc76790494fb622fe58f0942236cd7d0
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.unit_tests.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.MemoryFile;
20963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringertimport android.test.AndroidTestCase;
21761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringertimport android.test.suitebuilder.annotation.LargeTest;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.MediumTest;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.SmallTest;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringertimport java.io.File;
26963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringertimport java.io.FileDescriptor;
27963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringertimport java.io.FileOutputStream;
28761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringertimport java.io.IOException;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
32761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringertimport java.util.List;
33761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert
34963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringertpublic class MemoryFileTest extends AndroidTestCase {
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void compareBuffers(byte[] buffer1, byte[] buffer2, int length) throws Exception {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < length; i++) {
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (buffer1[i] != buffer2[i]) {
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new Exception("readBytes did not read back what writeBytes wrote");
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Keep allocating new files till the system purges them.
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPurge() throws Exception {
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        List<MemoryFile> files = new ArrayList<MemoryFile>();
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (true) {
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            MemoryFile newFile = new MemoryFile("MemoryFileTest", 1000000);
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            newFile.allowPurging(true);
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            newFile.writeBytes(testString, 0, 0, testString.length);
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            files.add(newFile);
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (MemoryFile file : files) {
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    file.readBytes(testString, 0, 0, testString.length);
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Expected
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (MemoryFile fileToClose : files) {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        fileToClose.close();
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testRun() throws Exception {
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MemoryFile file = new MemoryFile("MemoryFileTest", 1000000);
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] buffer = new byte[testString.length];
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // check low level accessors
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        file.writeBytes(testString, 0, 2000, testString.length);
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        file.readBytes(buffer, 2000, 0, testString.length);
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        compareBuffers(testString, buffer, testString.length);
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // check streams
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        buffer = new byte[testString.length];
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        OutputStream os = file.getOutputStream();
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        os.write(testString);
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        InputStream is = file.getInputStream();
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        is.mark(testString.length);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        is.read(buffer);
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        compareBuffers(testString, buffer, testString.length);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // test mark/reset
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        buffer = new byte[testString.length];
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        is.reset();
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        is.read(buffer);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        compareBuffers(testString, buffer, testString.length);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        file.close();
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
100c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    // Tests for the IndexOutOfBoundsException cases in read().
101c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert
102c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    private void readIndexOutOfBoundsException(int offset, int count, String msg)
103c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert            throws Exception {
104c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert        MemoryFile file = new MemoryFile("MemoryFileTest", testString.length);
105c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert        try {
106c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert            file.writeBytes(testString, 0, 0, testString.length);
107c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert            InputStream is = file.getInputStream();
108c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert            byte[] buffer = new byte[testString.length + 10];
109c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert            try {
110c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert                is.read(buffer, offset, count);
111c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert                fail(msg);
112c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert            } catch (IndexOutOfBoundsException ex) {
113c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert                // this is what should happen
114c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert            } finally {
115c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert                is.close();
116c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert            }
117c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert        } finally {
118c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert            file.close();
119c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert        }
120c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    }
121c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert
122c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    @SmallTest
123c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    public void testReadNegativeOffset() throws Exception {
124c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert        readIndexOutOfBoundsException(-1, 5,
125c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert                "read() with negative offset should throw IndexOutOfBoundsException");
126c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    }
127c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert
128c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    @SmallTest
129c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    public void testReadNegativeCount() throws Exception {
130c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert        readIndexOutOfBoundsException(5, -1,
131c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert                "read() with negative length should throw IndexOutOfBoundsException");
132c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    }
133c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert
134c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    @SmallTest
135c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    public void testReadOffsetOverflow() throws Exception {
136c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert        readIndexOutOfBoundsException(testString.length + 10, 5,
137c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert                "read() with offset outside buffer should throw IndexOutOfBoundsException");
138c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    }
139c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert
140c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    @SmallTest
141c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    public void testReadOffsetCountOverflow() throws Exception {
142c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert        readIndexOutOfBoundsException(testString.length, 11,
143c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert                "read() with offset + count outside buffer should throw IndexOutOfBoundsException");
144c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    }
145c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert
146c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    // Test behavior of read() at end of file
147c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    @SmallTest
148c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    public void testReadEOF() throws Exception {
149c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert        MemoryFile file = new MemoryFile("MemoryFileTest", testString.length);
150c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert        try {
151c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert            file.writeBytes(testString, 0, 0, testString.length);
152c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert            InputStream is = file.getInputStream();
153c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert            try {
154c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert                byte[] buffer = new byte[testString.length + 10];
155c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert                // read() with count larger than data should succeed, and return # of bytes read
156c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert                assertEquals(testString.length, is.read(buffer));
157c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert                compareBuffers(testString, buffer, testString.length);
158c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert                // Read at EOF should return -1
159c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert                assertEquals(-1, is.read());
160c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert            } finally {
161c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert                is.close();
162c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert            }
163c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert        } finally {
164c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert            file.close();
165c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert        }
166c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    }
167c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert
168761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    // Tests that close() is idempotent
169761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    @SmallTest
170761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    public void testCloseClose() throws Exception {
171761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        MemoryFile file = new MemoryFile("MemoryFileTest", 1000000);
172761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        byte[] data = new byte[512];
173761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        file.writeBytes(data, 0, 0, 128);
174761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        file.close();
175761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        file.close();
176761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    }
177761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert
178761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    // Tests that we can't read from a closed memory file
179761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    @SmallTest
180761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    public void testCloseRead() throws Exception {
181761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        MemoryFile file = new MemoryFile("MemoryFileTest", 1000000);
182761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        file.close();
183761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert
184761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        try {
185761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            byte[] data = new byte[512];
186761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            assertEquals(128, file.readBytes(data, 0, 0, 128));
187761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            fail("readBytes() after close() did not throw IOException.");
188761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        } catch (IOException e) {
189761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            // this is what should happen
190761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        }
191761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    }
192761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert
193761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    // Tests that we can't write to a closed memory file
194761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    @SmallTest
195761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    public void testCloseWrite() throws Exception {
196761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        MemoryFile file = new MemoryFile("MemoryFileTest", 1000000);
197761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        file.close();
198761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert
199761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        try {
200761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            byte[] data = new byte[512];
201761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            file.writeBytes(data, 0, 0, 128);
202761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            fail("writeBytes() after close() did not throw IOException.");
203761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        } catch (IOException e) {
204761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            // this is what should happen
205761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        }
206761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    }
207761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert
208761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    // Tests that we can't call allowPurging() after close()
209761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    @SmallTest
210761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    public void testCloseAllowPurging() throws Exception {
211761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        MemoryFile file = new MemoryFile("MemoryFileTest", 1000000);
212761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        byte[] data = new byte[512];
213761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        file.writeBytes(data, 0, 0, 128);
214761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        file.close();
215761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert
216761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        try {
217761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            file.allowPurging(true);
218761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            fail("allowPurging() after close() did not throw IOException.");
219761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        } catch (IOException e) {
220761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            // this is what should happen
221761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        }
222761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    }
223761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert
224761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    // Tests that we don't leak file descriptors or mmap areas
225761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    @LargeTest
226761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    public void testCloseLeak() throws Exception {
227761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        // open enough memory files that we should run out of
228761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        // file descriptors or address space if we leak either.
229761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        for (int i = 0; i < 1025; i++) {
230761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            MemoryFile file = new MemoryFile("MemoryFileTest", 5000000);
231761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            file.writeBytes(testString, 0, 0, testString.length);
232761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert            file.close();
233761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert        }
234761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert    }
235761e0918d30b6a3f292625b44b86dffd1538bc78Bjorn Bringert
236963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert    @SmallTest
237963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert    public void testIsMemoryFile() throws Exception {
238963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        MemoryFile file = new MemoryFile("MemoryFileTest", 1000000);
239963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        FileDescriptor fd = file.getFileDescriptor();
240963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        assertNotNull(fd);
241963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        assertTrue(fd.valid());
242963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        assertTrue(MemoryFile.isMemoryFile(fd));
243963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        file.close();
244963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert
245963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        assertFalse(MemoryFile.isMemoryFile(FileDescriptor.in));
246963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        assertFalse(MemoryFile.isMemoryFile(FileDescriptor.out));
247963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        assertFalse(MemoryFile.isMemoryFile(FileDescriptor.err));
248963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert
249963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        File tempFile = File.createTempFile("MemoryFileTest",".tmp", getContext().getFilesDir());
250963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        assertNotNull(file);
251963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        FileOutputStream out = null;
252963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        try {
253963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert            out = new FileOutputStream(tempFile);
254963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert            FileDescriptor fileFd = out.getFD();
255963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert            assertNotNull(fileFd);
256963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert            assertFalse(MemoryFile.isMemoryFile(fileFd));
257963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        } finally {
258963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert            if (out != null) {
259963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert                out.close();
260963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert            }
261963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert            tempFile.delete();
262963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        }
263963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert    }
264963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert
265c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert    @SmallTest
266963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert    public void testFileDescriptor() throws Exception {
267963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        MemoryFile file = new MemoryFile("MemoryFileTest", 1000000);
268963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        MemoryFile ref = new MemoryFile(file.getFileDescriptor(), file.length(), "r");
269963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        byte[] buffer;
270963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert
271963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        // write to original, read from reference
272963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        file.writeBytes(testString, 0, 2000, testString.length);
273963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        buffer = new byte[testString.length];
274963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        ref.readBytes(buffer, 2000, 0, testString.length);
275963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        compareBuffers(testString, buffer, testString.length);
276963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert
277963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        file.close();
278963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert        ref.close();  // Doesn't actually do anything, since the file descriptor is not dup(2):ed
279963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert    }
280963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final byte[] testString = new byte[] {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3, 2, 3, 8, 4, 6, 2, 6, 4, 3, 3, 8, 3, 2, 7, 9, 5, 0, 2, 8, 8, 4, 1, 9, 7, 1, 6, 9, 3, 9, 9, 3, 7, 5, 1, 0, 5, 8, 2, 0, 9, 7, 4, 9, 4, 4, 5, 9, 2, 3, 0, 7, 8, 1, 6, 4,
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        0, 6, 2, 8, 6, 2, 0, 8, 9, 9, 8, 6, 2, 8, 0, 3, 4, 8, 2, 5, 3, 4, 2, 1, 1, 7, 0, 6, 7, 9, 8, 2, 1, 4, 8, 0, 8, 6, 5, 1, 3, 2, 8, 2, 3, 0, 6, 6, 4, 7, 0, 9, 3, 8, 4, 4, 6, 0, 9, 5, 5, 0, 5, 8, 2, 2, 3, 1, 7, 2,
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        5, 3, 5, 9, 4, 0, 8, 1, 2, 8, 4, 8, 1, 1, 1, 7, 4, 5, 0, 2, 8, 4, 1, 0, 2, 7, 0, 1, 9, 3, 8, 5, 2, 1, 1, 0, 5, 5, 5, 9, 6, 4, 4, 6, 2, 2, 9, 4, 8, 9, 5, 4, 9, 3, 0, 3, 8, 1, 9, 6, 4, 4, 2, 8, 8, 1, 0, 9, 7, 5,
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 6, 5, 9, 3, 3, 4, 4, 6, 1, 2, 8, 4, 7, 5, 6, 4, 8, 2, 3, 3, 7, 8, 6, 7, 8, 3, 1, 6, 5, 2, 7, 1, 2, 0, 1, 9, 0, 9, 1, 4, 5, 6, 4, 8, 5, 6, 6, 9, 2, 3, 4, 6, 0, 3, 4, 8, 6, 1, 0, 4, 5, 4, 3, 2, 6, 6, 4, 8, 2,
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        1, 3, 3, 9, 3, 6, 0, 7, 2, 6, 0, 2, 4, 9, 1, 4, 1, 2, 7, 3, 7, 2, 4, 5, 8, 7, 0, 0, 6, 6, 0, 6, 3, 1, 5, 5, 8, 8, 1, 7, 4, 8, 8, 1, 5, 2, 0, 9, 2, 0, 9, 6, 2, 8, 2, 9, 2, 5, 4, 0, 9, 1, 7, 1, 5, 3, 6, 4, 3, 6,
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        7, 8, 9, 2, 5, 9, 0, 3, 6, 0, 0, 1, 1, 3, 3, 0, 5, 3, 0, 5, 4, 8, 8, 2, 0, 4, 6, 6, 5, 2, 1, 3, 8, 4, 1, 4, 6, 9, 5, 1, 9, 4, 1, 5, 1, 1, 6, 0, 9, 4, 3, 3, 0, 5, 7, 2, 7, 0, 3, 6, 5, 7, 5, 9, 5, 9, 1, 9, 5, 3,
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        0, 9, 2, 1, 8, 6, 1, 1, 7, 3, 8, 1, 9, 3, 2, 6, 1, 1, 7, 9, 3, 1, 0, 5, 1, 1, 8, 5, 4, 8, 0, 7, 4, 4, 6, 2, 3, 7, 9, 9, 6, 2, 7, 4, 9, 5, 6, 7, 3, 5, 1, 8, 8, 5, 7, 5, 2, 7, 2, 4, 8, 9, 1, 2, 2, 7, 9, 3, 8, 1,
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        8, 3, 0, 1, 1, 9, 4, 9, 1, 2, 9, 8, 3, 3, 6, 7, 3, 3, 6, 2, 4, 4, 0, 6, 5, 6, 6, 4, 3, 0, 8, 6, 0, 2, 1, 3, 9, 4, 9, 4, 6, 3, 9, 5, 2, 2, 4, 7, 3, 7, 1, 9, 0, 7, 0, 2, 1, 7, 9, 8, 6, 0, 9, 4, 3, 7, 0, 2, 7, 7,
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        0, 5, 3, 9, 2, 1, 7, 1, 7, 6, 2, 9, 3, 1, 7, 6, 7, 5, 2, 3, 8, 4, 6, 7, 4, 8, 1, 8, 4, 6, 7, 6, 6, 9, 4, 0, 5, 1, 3, 2, 0, 0, 0, 5, 6, 8, 1, 2, 7, 1, 4, 5, 2, 6, 3, 5, 6, 0, 8, 2, 7, 7, 8, 5, 7, 7, 1, 3, 4, 2,
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        7, 5, 7, 7, 8, 9, 6, 0, 9, 1, 7, 3, 6, 3, 7, 1, 7, 8, 7, 2, 1, 4, 6, 8, 4, 4, 0, 9, 0, 1, 2, 2, 4, 9, 5, 3, 4, 3, 0, 1, 4, 6, 5, 4, 9, 5, 8, 5, 3, 7, 1, 0, 5, 0, 7, 9, 2, 2, 7, 9, 6, 8, 9, 2, 5, 8, 9, 2, 3, 5,
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        4, 2, 0, 1, 9, 9, 5, 6, 1, 1, 2, 1, 2, 9, 0, 2, 1, 9, 6, 0, 8, 6, 4, 0, 3, 4, 4, 1, 8, 1, 5, 9, 8, 1, 3, 6, 2, 9, 7, 7, 4, 7, 7, 1, 3, 0, 9, 9, 6, 0, 5, 1, 8, 7, 0, 7, 2, 1, 1, 3, 4, 9, 9, 9, 9, 9, 9, 8, 3, 7,
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        2, 9, 7, 8, 0, 4, 9, 9, 5, 1, 0, 5, 9, 7, 3, 1, 7, 3, 2, 8, 1, 6, 0, 9, 6, 3, 1, 8, 5, 9, 5, 0, 2, 4, 4, 5, 9, 4, 5, 5, 3, 4, 6, 9, 0, 8, 3, 0, 2, 6, 4, 2, 5, 2, 2, 3, 0, 8, 2, 5, 3, 3, 4, 4, 6, 8, 5, 0, 3, 5,
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        2, 6, 1, 9, 3, 1, 1, 8, 8, 1, 7, 1, 0, 1, 0, 0, 0, 3, 1, 3, 7, 8, 3, 8, 7, 5, 2, 8, 8, 6, 5, 8, 7, 5, 3, 3, 2, 0, 8, 3, 8, 1, 4, 2, 0, 6, 1, 7, 1, 7, 7, 6, 6, 9, 1, 4, 7, 3, 0, 3, 5, 9, 8, 2, 5, 3, 4, 9, 0, 4,
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        2, 8, 7, 5, 5, 4, 6, 8, 7, 3, 1, 1, 5, 9, 5, 6, 2, 8, 6, 3, 8, 8, 2, 3, 5, 3, 7, 8, 7, 5, 9, 3, 7, 5, 1, 9, 5, 7, 7, 8, 1, 8, 5, 7, 7, 8, 0, 5, 3, 2, 1, 7, 1, 2, 2, 6, 8, 0, 6, 6, 1, 3, 0, 0, 1, 9, 2, 7, 8, 7,
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 6, 1, 1, 1, 9, 5, 9, 0, 9, 2, 1, 6, 4, 2, 0, 1, 9, 8, 9, 3, 8, 0, 9, 5, 2, 5, 7, 2, 0, 1, 0, 6, 5, 4, 8, 5, 8, 6, 3, 2, 7, 8, 8, 6, 5, 9, 3, 6, 1, 5, 3, 3, 8, 1, 8, 2, 7, 9, 6, 8, 2, 3, 0, 3, 0, 1, 9, 5, 2,
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        0, 3, 5, 3, 0, 1, 8, 5, 2, 9, 6, 8, 9, 9, 5, 7, 7, 3, 6, 2, 2, 5, 9, 9, 4, 1, 3, 8, 9, 1, 2, 4, 9, 7, 2, 1, 7, 7, 5, 2, 8, 3, 4, 7, 9, 1, 3, 1, 5, 1, 5, 5, 7, 4, 8, 5, 7, 2, 4, 2, 4, 5, 4, 1, 5, 0, 6, 9, 5, 9,
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        5, 0, 8, 2, 9, 5, 3, 3, 1, 1, 6, 8, 6, 1, 7, 2, 7, 8, 5, 5, 8, 8, 9, 0, 7, 5, 0, 9, 8, 3, 8, 1, 7, 5, 4, 6, 3, 7, 4, 6, 4, 9, 3, 9, 3, 1, 9, 2, 5, 5, 0, 6, 0, 4, 0, 0, 9, 2, 7, 7, 0, 1, 6, 7, 1, 1, 3, 9, 0, 0,
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        9, 8, 4, 8, 8, 2, 4, 0, 1, 2, 8, 5, 8, 3, 6, 1, 6, 0, 3, 5, 6, 3, 7, 0, 7, 6, 6, 0, 1, 0, 4, 7, 1, 0, 1, 8, 1, 9, 4, 2, 9, 5, 5, 5, 9, 6, 1, 9, 8, 9, 4, 6, 7, 6, 7, 8, 3, 7, 4, 4, 9, 4, 4, 8, 2, 5, 5, 3, 7, 9,
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        7, 7, 4, 7, 2, 6, 8, 4, 7, 1, 0, 4, 0, 4, 7, 5, 3, 4, 6, 4, 6, 2, 0, 8, 0, 4, 6, 6, 8, 4, 2, 5, 9, 0, 6, 9, 4, 9, 1, 2, 9, 3, 3, 1, 3, 6, 7, 7, 0, 2, 8, 9, 8, 9, 1, 5, 2, 1, 0, 4, 7, 5, 2, 1, 6, 2, 0, 5, 6, 9,
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 6, 0, 2, 4, 0, 5, 8, 0, 3, 8, 1, 5, 0, 1, 9, 3, 5, 1, 1, 2, 5, 3, 3, 8, 2, 4, 3, 0, 0, 3, 5, 5, 8, 7, 6, 4, 0, 2, 4, 7, 4, 9, 6, 4, 7, 3, 2, 6, 3, 9, 1, 4, 1, 9, 9, 2, 7, 2, 6, 0, 4, 2, 6, 9, 9, 2, 2, 7, 9,
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 7, 8, 2, 3, 5, 4, 7, 8, 1, 6, 3, 6, 0, 0, 9, 3, 4, 1, 7, 2, 1, 6, 4, 1, 2, 1, 9, 9, 2, 4, 5, 8, 6, 3, 1, 5, 0, 3, 0, 2, 8, 6, 1, 8, 2, 9, 7, 4, 5, 5, 5, 7, 0, 6, 7, 4, 9, 8, 3, 8, 5, 0, 5, 4, 9, 4, 5, 8, 8,
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        5, 8, 6, 9, 2, 6, 9, 9, 5, 6, 9, 0, 9, 2, 7, 2, 1, 0, 7, 9, 7, 5, 0, 9, 3, 0, 2, 9, 5, 5, 3, 2, 1, 1, 6, 5, 3, 4, 4, 9, 8, 7, 2, 0, 2, 7, 5, 5, 9, 6, 0, 2, 3, 6, 4, 8, 0, 6, 6, 5, 4, 9, 9, 1, 1, 9, 8, 8, 1, 8,
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        3, 4, 7, 9, 7, 7, 5, 3, 5, 6, 6, 3, 6, 9, 8, 0, 7, 4, 2, 6, 5, 4, 2, 5, 2, 7, 8, 6, 2, 5, 5, 1, 8, 1, 8, 4, 1, 7, 5, 7, 4, 6, 7, 2, 8, 9, 0, 9, 7, 7, 7, 7, 2, 7, 9, 3, 8, 0, 0, 0, 8, 1, 6, 4, 7, 0, 6, 0, 0, 1,
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 1, 4, 5, 2, 4, 9, 1, 9, 2, 1, 7, 3, 2, 1, 7, 2, 1, 4, 7, 7, 2, 3, 5, 0, 1, 4, 1, 4, 4, 1, 9, 7, 3, 5, 6, 8, 5, 4, 8, 1, 6, 1, 3, 6, 1, 1, 5, 7, 3, 5, 2, 5, 5, 2, 1, 3, 3, 4, 7, 5, 7, 4, 1, 8, 4, 9, 4, 6, 8,
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        4, 3, 8, 5, 2, 3, 3, 2, 3, 9, 0, 7, 3, 9, 4, 1, 4, 3, 3, 3, 4, 5, 4, 7, 7, 6, 2, 4, 1, 6, 8, 6, 2, 5, 1, 8, 9, 8, 3, 5, 6, 9, 4, 8, 5, 5, 6, 2, 0, 9, 9, 2, 1, 9, 2, 2, 2, 1, 8, 4, 2, 7, 2, 5, 5, 0, 2, 5, 4, 2,
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        5, 6, 8, 8, 7, 6, 7, 1, 7, 9, 0, 4, 9, 4, 6, 0, 1, 6, 5, 3, 4, 6, 6, 8, 0, 4, 9, 8, 8, 6, 2, 7, 2, 3, 2, 7, 9, 1, 7, 8, 6, 0, 8, 5, 7, 8, 4, 3, 8, 3, 8, 2, 7, 9, 6, 7, 9, 7, 6, 6, 8, 1, 4, 5, 4, 1, 0, 0, 9, 5,
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        3, 8, 8, 3, 7, 8, 6, 3, 6, 0, 9, 5, 0, 6, 8, 0, 0, 6, 4, 2, 2, 5, 1, 2, 5, 2, 0, 5, 1, 1, 7, 3, 9, 2, 9, 8, 4, 8, 9, 6, 0, 8, 4, 1, 2, 8, 4, 8, 8, 6, 2, 6, 9, 4, 5, 6, 0, 4, 2, 4, 1, 9, 6, 5, 2, 8, 5, 0, 2, 2,
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        2, 1, 0, 6, 6, 1, 1, 8, 6, 3, 0, 6, 7, 4, 4, 2, 7, 8, 6, 2, 2, 0, 3, 9, 1, 9, 4, 9, 4, 5, 0, 4, 7, 1, 2, 3, 7, 1, 3, 7, 8, 6, 9, 6, 0, 9, 5, 6, 3, 6, 4, 3, 7, 1, 9, 1, 7, 2, 8, 7, 4, 6, 7, 7, 6, 4, 6, 5, 7, 5,
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        7, 3, 9, 6, 2, 4, 1, 3, 8, 9, 0, 8, 6, 5, 8, 3, 2, 6, 4, 5, 9, 9, 5, 8, 1, 3, 3, 9, 0, 4, 7, 8, 0, 2, 7, 5, 9, 0, 0, 9, 9, 4, 6, 5, 7, 6, 4, 0, 7, 8, 9, 5, 1, 2, 6, 9, 4, 6, 8, 3, 9, 8, 3, 5, 2, 5, 9, 5, 7, 0,
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        9, 8, 2, 5, 8, 2, 2, 6, 2, 0, 5, 2, 2, 4, 8, 9, 4, 0, 7, 7, 2, 6, 7, 1, 9, 4, 7, 8, 2, 6, 8, 4, 8, 2, 6, 0, 1, 4, 7, 6, 9, 9, 0, 9, 0, 2, 6, 4, 0, 1, 3, 6, 3, 9, 4, 4, 3, 7, 4, 5, 5, 3, 0, 5, 0, 6, 8, 2, 0, 3,
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        4, 9, 6, 2, 5, 2, 4, 5, 1, 7, 4, 9, 3, 9, 9, 6, 5, 1, 4, 3, 1, 4, 2, 9, 8, 0, 9, 1, 9, 0, 6, 5, 9, 2, 5, 0, 9, 3, 7, 2, 2, 1, 6, 9, 6, 4, 6, 1, 5, 1, 5, 7, 0, 9, 8, 5, 8, 3, 8, 7, 4, 1, 0, 5, 9, 7, 8, 8, 5, 9,
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        5, 9, 7, 7, 2, 9, 7, 5, 4, 9, 8, 9, 3, 0, 1, 6, 1, 7, 5, 3, 9, 2, 8, 4, 6, 8, 1, 3, 8, 2, 6, 8, 6, 8, 3, 8, 6, 8, 9, 4, 2, 7, 7, 4, 1, 5, 5, 9, 9, 1, 8, 5, 5, 9, 2, 5, 2, 4, 5, 9, 5, 3, 9, 5, 9, 4, 3, 1, 0, 4,
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        9, 9, 7, 2, 5, 2, 4, 6, 8, 0, 8, 4, 5, 9, 8, 7, 2, 7, 3, 6, 4, 4, 6, 9, 5, 8, 4, 8, 6, 5, 3, 8, 3, 6, 7, 3, 6, 2, 2, 2, 6, 2, 6, 0, 9, 9, 1, 2, 4, 6, 0, 8, 0, 5, 1, 2, 4, 3, 8, 8, 4, 3, 9, 0, 4, 5, 1, 2, 4, 4,
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        1, 3, 6, 5, 4, 9, 7, 6, 2, 7, 8, 0, 7, 9, 7, 7, 1, 5, 6, 9, 1, 4, 3, 5, 9, 9, 7, 7, 0, 0, 1, 2, 9, 6, 1, 6, 0, 8, 9, 4, 4, 1, 6, 9, 4, 8, 6, 8, 5, 5, 5, 8, 4, 8, 4, 0, 6, 3, 5, 3, 4, 2, 2, 0, 7, 2, 2, 2, 5, 8,
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        2, 8, 4, 8, 8, 6, 4, 8, 1, 5, 8, 4, 5, 6, 0, 2, 8, 5, 0, 6, 0, 1, 6, 8, 4, 2, 7, 3, 9, 4, 5, 2, 2, 6, 7, 4, 6, 7, 6, 7, 8, 8, 9, 5, 2, 5, 2, 1, 3, 8, 5, 2, 2, 5, 4, 9, 9, 5, 4, 6, 6, 6, 7, 2, 7, 8, 2, 3, 9, 8,
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 4, 5, 6, 5, 9, 6, 1, 1, 6, 3, 5, 4, 8, 8, 6, 2, 3, 0, 5, 7, 7, 4, 5, 6, 4, 9, 8, 0, 3, 5, 5, 9, 3, 6, 3, 4, 5, 6, 8, 1, 7, 4, 3, 2, 4, 1, 1, 2, 5, 1, 5, 0, 7, 6, 0, 6, 9, 4, 7, 9, 4, 5, 1, 0, 9, 6, 5, 9, 6,
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        0, 9, 4, 0, 2, 5, 2, 2, 8, 8, 7, 9, 7, 1, 0, 8, 9, 3, 1, 4, 5, 6, 6, 9, 1, 3, 6, 8, 6, 7, 2, 2, 8, 7, 4, 8, 9, 4, 0, 5, 6, 0, 1, 0, 1, 5, 0, 3, 3, 0, 8, 6, 1, 7, 9, 2, 8, 6, 8, 0, 9, 2, 0, 8, 7, 4, 7, 6, 0, 9,
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        1, 7, 8, 2, 4, 9, 3, 8, 5, 8, 9, 0, 0, 9, 7, 1, 4, 9, 0, 9, 6, 7, 5, 9, 8, 5, 2, 6, 1, 3, 6, 5, 5, 4, 9, 7, 8, 1, 8, 9, 3, 1, 2, 9, 7, 8, 4, 8, 2, 1, 6, 8, 2, 9, 9, 8, 9, 4, 8, 7, 2, 2, 6, 5, 8, 8, 0, 4, 8, 5,
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        7, 5, 6, 4, 0, 1, 4, 2, 7, 0, 4, 7, 7, 5, 5, 5, 1, 3, 2, 3, 7, 9, 6, 4, 1, 4, 5, 1, 5, 2, 3, 7, 4, 6, 2, 3, 4, 3, 6, 4, 5, 4, 2, 8, 5, 8, 4, 4, 4, 7, 9, 5, 2, 6, 5, 8, 6, 7, 8, 2, 1, 0, 5, 1, 1, 4, 1, 3, 5, 4,
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        7, 3, 5, 7, 3, 9, 5, 2, 3, 1, 1, 3, 4, 2, 7, 1, 6, 6, 1, 0, 2, 1, 3, 5, 9, 6, 9, 5, 3, 6, 2, 3, 1, 4, 4, 2, 9, 5, 2, 4, 8, 4, 9, 3, 7, 1, 8, 7, 1, 1, 0, 1, 4, 5, 7, 6, 5, 4, 0, 3, 5, 9, 0, 2, 7, 9, 9, 3, 4, 4,
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        0, 3, 7, 4, 2, 0, 0, 7, 3, 1, 0, 5, 7, 8, 5, 3, 9, 0, 6, 2, 1, 9, 8, 3, 8, 7, 4, 4, 7, 8, 0, 8, 4, 7, 8, 4, 8, 9, 6, 8, 3, 3, 2, 1, 4, 4, 5, 7, 1, 3, 8, 6, 8, 7, 5, 1, 9, 4, 3, 5, 0, 6, 4, 3, 0, 2, 1, 8, 4, 5,
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        3, 1, 9, 1, 0, 4, 8, 4, 8, 1, 0, 0, 5, 3, 7, 0, 6, 1, 4, 6, 8, 0, 6, 7, 4, 9, 1, 9, 2, 7, 8, 1, 9, 1, 1, 9, 7, 9, 3, 9, 9, 5, 2, 0, 6, 1, 4, 1, 9, 6, 6, 3, 4, 2, 8, 7, 5, 4, 4, 4, 0, 6, 4, 3, 7, 4, 5, 1, 2, 3,
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        7, 1, 8, 1, 9, 2, 1, 7, 9, 9, 9, 8, 3, 9, 1, 0, 1, 5, 9, 1, 9, 5, 6, 1, 8, 1, 4, 6, 7, 5, 1, 4, 2, 6, 9, 1, 2, 3, 9, 7, 4, 8, 9, 4, 0, 9, 0, 7, 1, 8, 6, 4, 9, 4, 2, 3, 1, 9, 6, 1, 5, 6, 7, 9, 4, 5, 2, 0, 8, 0,
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        9, 5, 1, 4, 6, 5, 5, 0, 2, 2, 5, 2, 3, 1, 6, 0, 3, 8, 8, 1, 9, 3, 0, 1, 4, 2, 0, 9, 3, 7, 6, 2, 1, 3, 7, 8, 5, 5, 9, 5, 6, 6, 3, 8, 9, 3, 7, 7, 8, 7, 0, 8, 3, 0, 3, 9, 0, 6, 9, 7, 9, 2, 0, 7, 7, 3, 4, 6, 7, 2,
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        2, 1, 8, 2, 5, 6, 2, 5, 9, 9, 6, 6, 1, 5, 0, 1, 4, 2, 1, 5, 0, 3, 0, 6, 8, 0, 3, 8, 4, 4, 7, 7, 3, 4, 5, 4, 9, 2, 0, 2, 6, 0, 5, 4, 1, 4, 6, 6, 5, 9, 2, 5, 2, 0, 1, 4, 9, 7, 4, 4, 2, 8, 5, 0, 7, 3, 2, 5, 1, 8,
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 6, 6, 0, 0, 2, 1, 3, 2, 4, 3, 4, 0, 8, 8, 1, 9, 0, 7, 1, 0, 4, 8, 6, 3, 3, 1, 7, 3, 4, 6, 4, 9, 6, 5, 1, 4, 5, 3, 9, 0, 5, 7, 9, 6, 2, 6, 8, 5, 6, 1, 0, 0, 5, 5, 0, 8, 1, 0, 6, 6, 5, 8, 7, 9, 6, 9, 9, 8, 1,
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 3, 5, 7, 4, 7, 3, 6, 3, 8, 4, 0, 5, 2, 5, 7, 1, 4, 5, 9, 1, 0, 2, 8, 9, 7, 0, 6, 4, 1, 4, 0, 1, 1, 0, 9, 7, 1, 2, 0, 6, 2, 8, 0, 4, 3, 9, 0, 3, 9, 7, 5, 9, 5, 1, 5, 6, 7, 7, 1, 5, 7, 7, 0, 0, 4, 2, 0, 3, 3,
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        7, 8, 6, 9, 9, 3, 6, 0, 0, 7, 2, 3, 0, 5, 5, 8, 7, 6, 3, 1, 7, 6, 3, 5, 9, 4, 2, 1, 8, 7, 3, 1, 2, 5, 1, 4, 7, 1, 2, 0, 5, 3, 2, 9, 2, 8, 1, 9, 1, 8, 2, 6, 1, 8, 6, 1, 2, 5, 8, 6, 7, 3, 2, 1, 5, 7, 9, 1, 9, 8,
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        4, 1, 4, 8, 4, 8, 8, 2, 9, 1, 6, 4, 4, 7, 0, 6, 0, 9, 5, 7, 5, 2, 7, 0, 6, 9, 5, 7, 2, 2, 0, 9, 1, 7, 5, 6, 7, 1, 1, 6, 7, 2, 2, 9, 1, 0, 9, 8, 1, 6, 9, 0, 9, 1, 5, 2, 8, 0, 1, 7, 3, 5, 0, 6, 7, 1, 2, 7, 4, 8,
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        5, 8, 3, 2, 2, 2, 8, 7, 1, 8, 3, 5, 2, 0, 9, 3, 5, 3, 9, 6, 5, 7, 2, 5, 1, 2, 1, 0, 8, 3, 5, 7, 9, 1, 5, 1, 3, 6, 9, 8, 8, 2, 0, 9, 1, 4, 4, 4, 2, 1, 0, 0, 6, 7, 5, 1, 0, 3, 3, 4, 6, 7, 1, 1, 0, 3, 1, 4, 1, 2,
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 7, 1, 1, 1, 3, 6, 9, 9, 0, 8, 6, 5, 8, 5, 1, 6, 3, 9, 8, 3, 1, 5, 0, 1, 9, 7, 0, 1, 6, 5, 1, 5, 1, 1, 6, 8, 5, 1, 7, 1, 4, 3, 7, 6, 5, 7, 6, 1, 8, 3, 5, 1, 5, 5, 6, 5, 0, 8, 8, 4, 9, 0, 9, 9, 8, 9, 8, 5, 9,
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        9, 8, 2, 3, 8, 7, 3, 4, 5, 5, 2, 8, 3, 3, 1, 6, 3, 5, 5, 0, 7, 6, 4, 7, 9, 1, 8, 5, 3, 5, 8, 9, 3, 2, 2, 6, 1, 8, 5, 4, 8, 9, 6, 3, 2, 1, 3, 2, 9, 3, 3, 0, 8, 9, 8, 5, 7, 0, 6, 4, 2, 0, 4, 6, 7, 5, 2, 5, 9, 0,
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        7, 0, 9, 1, 5, 4, 8, 1, 4, 1, 6, 5, 4, 9, 8, 5, 9, 4, 6, 1, 6, 3, 7, 1, 8, 0, 2, 7, 0, 9, 8, 1, 9, 9, 4, 3, 0, 9, 9, 2, 4, 4, 8, 8, 9, 5, 7, 5, 7, 1, 2, 8, 2, 8, 9, 0, 5, 9, 2, 3, 2, 3, 3, 2, 6, 0, 9, 7, 2, 9,
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        9, 7, 1, 2, 0, 8, 4, 4, 3, 3, 5, 7, 3, 2, 6, 5, 4, 8, 9, 3, 8, 2, 3, 9, 1, 1, 9, 3, 2, 5, 9, 7, 4, 6, 3, 6, 6, 7, 3, 0, 5, 8, 3, 6, 0, 4, 1, 4, 2, 8, 1, 3, 8, 8, 3, 0, 3, 2, 0, 3, 8, 2, 4, 9, 0, 3, 7, 5, 8, 9,
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        8, 5, 2, 4, 3, 7, 4, 4, 1, 7, 0, 2, 9, 1, 3, 2, 7, 6, 5, 6, 1, 8, 0, 9, 3, 7, 7, 3, 4, 4, 4, 0, 3, 0, 7, 0, 7, 4, 6, 9, 2, 1, 1, 2, 0, 1, 9, 1, 3, 0, 2, 0, 3, 3, 0, 3, 8, 0, 1, 9, 7, 6, 2, 1, 1, 0, 1, 1, 0, 0,
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        4, 4, 9, 2, 9, 3, 2, 1, 5, 1, 6, 0, 8, 4, 2, 4, 4, 4, 8, 5, 9, 6, 3, 7, 6, 6, 9, 8, 3, 8, 9, 5, 2, 2, 8, 6, 8, 4, 7, 8, 3, 1, 2, 3, 5, 5, 2, 6, 5, 8, 2, 1, 3, 1, 4, 4, 9, 5, 7, 6, 8, 5, 7, 2, 6, 2, 4, 3, 3, 4,
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        4, 1, 8, 9, 3, 0, 3, 9, 6, 8, 6, 4, 2, 6, 2, 4, 3, 4, 1, 0, 7, 7, 3, 2, 2, 6, 9, 7, 8, 0, 2, 8, 0, 7, 3, 1, 8, 9, 1, 5, 4, 4, 1, 1, 0, 1, 0, 4, 4, 6, 8, 2, 3, 2, 5, 2, 7, 1, 6, 2, 0, 1, 0, 5, 2, 6, 5, 2, 2, 7,
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        2, 1, 1, 1, 6, 6, 0, 3, 9, 6, 6, 6, 5, 5, 7, 3, 0, 9, 2, 5, 4, 7, 1, 1, 0, 5, 5, 7, 8, 5, 3, 7, 6, 3, 4, 6, 6, 8, 2, 0, 6, 5, 3, 1, 0, 9, 8, 9, 6, 5, 2, 6, 9, 1, 8, 6, 2, 0, 5, 6, 4, 7, 6, 9, 3, 1, 2, 5, 7, 0,
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        5, 8, 6, 3, 5, 6, 6, 2, 0, 1, 8, 5, 5, 8, 1, 0, 0, 7, 2, 9, 3, 6, 0, 6, 5, 9, 8, 7, 6, 4, 8, 6, 1, 1, 7, 9, 1, 0, 4, 5, 3, 3, 4, 8, 8, 5, 0, 3, 4, 6, 1, 1, 3, 6, 5, 7, 6, 8, 6, 7, 5, 3, 2, 4, 9, 4, 4, 1, 6, 6,
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        8, 0, 3, 9, 6, 2, 6, 5, 7, 9, 7, 8, 7, 7, 1, 8, 5, 5, 6, 0, 8, 4, 5, 5, 2, 9, 6, 5, 4, 1, 2, 6, 6, 5, 4, 0, 8, 5, 3, 0, 6, 1, 4, 3, 4, 4, 4, 3, 1, 8, 5, 8, 6, 7, 6, 9, 7, 5, 1, 4, 5, 6, 6, 1, 4, 0, 6, 8, 0, 0,
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        7, 0, 0, 2, 3, 7, 8, 7, 7, 6, 5, 9, 1, 3, 4, 4, 0, 1, 7, 1, 2, 7, 4, 9, 4, 7, 0, 4, 2, 0, 5, 6, 2, 2, 3, 0, 5, 3, 8, 9, 9, 4, 5, 6, 1, 3, 1, 4, 0, 7, 1, 1, 2, 7, 0, 0, 0, 4, 0, 7, 8, 5, 4, 7, 3, 3, 2, 6, 9, 9,
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        3, 9, 0, 8, 1, 4, 5, 4, 6, 6, 4, 6, 4, 5, 8, 8, 0, 7, 9, 7, 2, 7, 0, 8, 2, 6, 6, 8, 3, 0, 6, 3, 4, 3, 2, 8, 5, 8, 7, 8, 5, 6, 9, 8, 3, 0, 5, 2, 3, 5, 8, 0, 8, 9, 3, 3, 0, 6, 5, 7, 5, 7, 4, 0, 6, 7, 9, 5, 4, 5,
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        7, 1, 6, 3, 7, 7, 5, 2, 5, 4, 2, 0, 2, 1, 1, 4, 9, 5, 5, 7, 6, 1, 5, 8, 1, 4, 0, 0, 2, 5, 0, 1, 2, 6, 2, 2, 8, 5, 9, 4, 1, 3, 0, 2, 1, 6, 4, 7, 1, 5, 5, 0, 9, 7, 9, 2, 5, 9, 2, 3, 0, 9, 9, 0, 7, 9, 6, 5, 4, 7,
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        3, 7, 6, 1, 2, 5, 5, 1, 7, 6, 5, 6, 7, 5, 1, 3, 5, 7, 5, 1, 7, 8, 2, 9, 6, 6, 6, 4, 5, 4, 7, 7, 9, 1, 7, 4, 5, 0, 1, 1, 2, 9, 9, 6, 1, 4, 8, 9, 0, 3, 0, 4, 6, 3, 9, 9, 4, 7, 1, 3, 2, 9, 6, 2, 1, 0, 7, 3, 4, 0,
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        4, 3, 7, 5, 1, 8, 9, 5, 7, 3, 5, 9, 6, 1, 4, 5, 8, 9, 0, 1, 9, 3, 8, 9, 7, 1, 3, 1, 1, 1, 7, 9, 0, 4, 2, 9, 7, 8, 2, 8, 5, 6, 4, 7, 5, 0, 3, 2, 0, 3, 1, 9, 8, 6, 9, 1, 5, 1, 4, 0, 2, 8, 7, 0, 8, 0, 8, 5, 9, 9,
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        0, 4, 8, 0, 1, 0, 9, 4, 1, 2, 1, 4, 7, 2, 2, 1, 3, 1, 7, 9, 4, 7, 6, 4, 7, 7, 7, 2, 6, 2, 2, 4, 1, 4, 2, 5, 4, 8, 5, 4, 5, 4, 0, 3, 3, 2, 1, 5, 7, 1, 8, 5, 3, 0, 6, 1, 4, 2, 2, 8, 8, 1, 3, 7, 5, 8, 5, 0, 4, 3,
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        0, 6, 3, 3, 2, 1, 7, 5, 1, 8, 2, 9, 7, 9, 8, 6, 6, 2, 2, 3, 7, 1, 7, 2, 1, 5, 9, 1, 6, 0, 7, 7, 1, 6, 6, 9, 2, 5, 4, 7, 4, 8, 7, 3, 8, 9, 8, 6, 6, 5, 4, 9, 4, 9, 4, 5, 0, 1, 1, 4, 6, 5, 4, 0, 6, 2, 8, 4, 3, 3,
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 6, 3, 9, 3, 7, 9, 0, 0, 3, 9, 7, 6, 9, 2, 6, 5, 6, 7, 2, 1, 4, 6, 3, 8, 5, 3, 0, 6, 7, 3, 6, 0, 9, 6, 5, 7, 1, 2, 0, 9, 1, 8, 0, 7, 6, 3, 8, 3, 2, 7, 1, 6, 6, 4, 1, 6, 2, 7, 4, 8, 8, 8, 8, 0, 0, 7, 8, 6, 9,
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        2, 5, 6, 0, 2, 9, 0, 2, 2, 8, 4, 7, 2, 1, 0, 4, 0, 3, 1, 7, 2, 1, 1, 8, 6, 0, 8, 2, 0, 4, 1, 9, 0, 0, 0, 4, 2, 2, 9, 6, 6, 1, 7, 1, 1, 9, 6, 3, 7, 7, 9, 2, 1, 3, 3, 7, 5, 7, 5, 1, 1, 4, 9, 5, 9, 5, 0, 1, 5, 6,
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 0, 4, 9, 6, 3, 1, 8, 6, 2, 9, 4, 7, 2, 6, 5, 4, 7, 3, 6, 4, 2, 5, 2, 3, 0, 8, 1, 7, 7, 0, 3, 6, 7, 5, 1, 5, 9, 0, 6, 7, 3, 5, 0, 2, 3, 5, 0, 7, 2, 8, 3, 5, 4, 0, 5, 6, 7, 0, 4, 0, 3, 8, 6, 7, 4, 3, 5, 1, 3,
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 2, 2, 2, 2, 4, 7, 7, 1, 5, 8, 9, 1, 5, 0, 4, 9, 5, 3, 0, 9, 8, 4, 4, 4, 8, 9, 3, 3, 3, 0, 9, 6, 3, 4, 0, 8, 7, 8, 0, 7, 6, 9, 3, 2, 5, 9, 9, 3, 9, 7, 8, 0, 5, 4, 1, 9, 3, 4, 1, 4, 4, 7, 3, 7, 7, 4, 4, 1, 8,
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        4, 2, 6, 3, 1, 2, 9, 8, 6, 0, 8, 0, 9, 9, 8, 8, 8, 6, 8, 7, 4, 1, 3, 2, 6, 0, 4, 7, 2, 1, 5, 6, 9, 5, 1, 6, 2, 3, 9, 6, 5, 8, 6, 4, 5, 7, 3, 0, 2, 1, 6, 3, 1, 5, 9, 8, 1, 9, 3, 1, 9, 5, 1, 6, 7, 3, 5, 3, 8, 1,
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        2, 9, 7, 4, 1, 6, 7, 7, 2, 9, 4, 7, 8, 6, 7, 2, 4, 2, 2, 9, 2, 4, 6, 5, 4, 3, 6, 6, 8, 0, 0, 9, 8, 0, 6, 7, 6, 9, 2, 8, 2, 3, 8, 2, 8, 0, 6, 8, 9, 9, 6, 4, 0, 0, 4, 8, 2, 4, 3, 5, 4, 0, 3, 7, 0, 1, 4, 1, 6, 3,
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        1, 4, 9, 6, 5, 8, 9, 7, 9, 4, 0, 9, 2, 4, 3, 2, 3, 7, 8, 9, 6, 9, 0, 7, 0, 6, 9, 7, 7, 9, 4, 2, 2, 3, 6, 2, 5, 0, 8, 2, 2, 1, 6, 8, 8, 9, 5, 7, 3, 8, 3, 7, 9, 8, 6, 2, 3, 0, 0, 1, 5, 9, 3, 7, 7, 6, 4, 7, 1, 6,
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        5, 1, 2, 2, 8, 9, 3, 5, 7, 8, 6, 0, 1, 5, 8, 8, 1, 6, 1, 7, 5, 5, 7, 8, 2, 9, 7, 3, 5, 2, 3, 3, 4, 4, 6, 0, 4, 2, 8, 1, 5, 1, 2, 6, 2, 7, 2, 0, 3, 7, 3, 4, 3, 1, 4, 6, 5, 3, 1, 9, 7, 7, 7, 7, 4, 1, 6, 0, 3, 1,
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        9, 9, 0, 6, 6, 5, 5, 4, 1, 8, 7, 6, 3, 9, 7, 9, 2, 9, 3, 3, 4, 4, 1, 9, 5, 2, 1, 5, 4, 1, 3, 4, 1, 8, 9, 9, 4, 8, 5, 4, 4, 4, 7, 3, 4, 5, 6, 7, 3, 8, 3, 1, 6, 2, 4, 9, 9, 3, 4, 1, 9, 1, 3, 1, 8, 1, 4, 8, 0, 9,
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        2, 7, 7, 7, 7, 1, 0, 3, 8, 6, 3, 8, 7, 7, 3, 4, 3, 1, 7, 7, 2, 0, 7, 5, 4, 5, 6, 5, 4, 5, 3, 2, 2, 0, 7, 7, 7, 0, 9, 2, 1, 2, 0, 1, 9, 0, 5, 1, 6, 6, 0, 9, 6, 2, 8, 0, 4, 9, 0, 9, 2, 6, 3, 6, 0, 1, 9, 7, 5, 9,
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        8, 8, 2, 8, 1, 6, 1, 3, 3, 2, 3, 1, 6, 6, 6, 3, 6, 5, 2, 8, 6, 1, 9, 3, 2, 6, 6, 8, 6, 3, 3, 6, 0, 6, 2, 7, 3, 5, 6, 7, 6, 3, 0, 3, 5, 4, 4, 7, 7, 6, 2, 8, 0, 3, 5, 0, 4, 5, 0, 7, 7, 7, 2, 3, 5, 5, 4, 7, 1, 0,
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        5, 8, 5, 9, 5, 4, 8, 7, 0, 2, 7, 9, 0, 8, 1, 4, 3, 5, 6, 2, 4, 0, 1, 4, 5, 1, 7, 1, 8, 0, 6, 2, 4, 6, 4, 3, 6, 2, 6, 7, 9, 4, 5, 6, 1, 2, 7, 5, 3, 1, 8, 1, 3, 4, 0, 7, 8, 3, 3, 0, 3, 3, 6, 2, 5, 4, 2, 3, 2, 7,
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        8, 3, 9, 4, 4, 9, 7, 5, 3, 8, 2, 4, 3, 7, 2, 0, 5, 8, 3, 5, 3, 1, 1, 4, 7, 7, 1, 1, 9, 9, 2, 6, 0, 6, 3, 8, 1, 3, 3, 4, 6, 7, 7, 6, 8, 7, 9, 6, 9, 5, 9, 7, 0, 3, 0, 9, 8, 3, 3, 9, 1, 3, 0, 7, 7, 1, 0, 9, 8, 7,
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        0, 4, 0, 8, 5, 9, 1, 3, 3, 7, 4, 6, 4, 1, 4, 4, 2, 8, 2, 2, 7, 7, 2, 6, 3, 4, 6, 5, 9, 4, 7, 0, 4, 7, 4, 5, 8, 7, 8, 4, 7, 7, 8, 7, 2, 0, 1, 9, 2, 7, 7, 1, 5, 2, 8, 0, 7, 3, 1, 7, 6, 7, 9, 0, 7, 7, 0, 7, 1, 5,
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        7, 2, 1, 3, 4, 4, 4, 7, 3, 0, 6, 0, 5, 7, 0, 0, 7, 3, 3, 4, 9, 2, 4, 3, 6, 9, 3, 1, 1, 3, 8, 3, 5, 0, 4, 9, 3, 1, 6, 3, 1, 2, 8, 4, 0, 4, 2, 5, 1, 2, 1, 9, 2, 5, 6, 5, 1, 7, 9, 8, 0, 6, 9, 4, 1, 1, 3, 5, 2, 8,
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        0, 1, 3, 1, 4, 7, 0, 1, 3, 0, 4, 7, 8, 1, 6, 4, 3, 7, 8, 8, 5, 1, 8, 5, 2, 9, 0, 9, 2, 8, 5, 4, 5, 2, 0, 1, 1, 6, 5, 8, 3, 9, 3, 4, 1, 9, 6, 5, 6, 2, 1, 3, 4, 9, 1, 4, 3, 4, 1, 5, 9, 5, 6, 2, 5, 8, 6, 5, 8, 6,
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        5, 5, 7, 0, 5, 5, 2, 6, 9, 0, 4, 9, 6, 5, 2, 0, 9, 8, 5, 8, 0, 3, 3, 8, 5, 0, 7, 2, 2, 4, 2, 6, 4, 8, 2, 9, 3, 9, 7, 2, 8, 5, 8, 4, 7, 8, 3, 1, 6, 3, 0, 5, 7, 7, 7, 7, 5, 6, 0, 6, 8, 8, 8, 7, 6, 4, 4, 6, 2, 4,
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        8, 2, 4, 6, 8, 5, 7, 9, 2, 6, 0, 3, 9, 5, 3, 5, 2, 7, 7, 3, 4, 8, 0, 3, 0, 4, 8, 0, 2, 9, 0, 0, 5, 8, 7, 6, 0, 7, 5, 8, 2, 5, 1, 0, 4, 7, 4, 7, 0, 9, 1, 6, 4, 3, 9, 6, 1, 3, 6, 2, 6, 7, 6, 0, 4, 4, 9, 2, 5, 6,
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        2, 7, 4, 2, 0, 4, 2, 0, 8, 3, 2, 0, 8, 5, 6, 6, 1, 1, 9, 0, 6, 2, 5, 4, 5, 4, 3, 3, 7, 2, 1, 3, 1, 5, 3, 5, 9, 5, 8, 4, 5, 0, 6, 8, 7, 7, 2, 4, 6, 0, 2, 9, 0, 1, 6, 1, 8, 7, 6, 6, 7, 9, 5, 2, 4, 0, 6, 1, 6, 3,
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        4, 2, 5, 2, 2, 5, 7, 7, 1, 9, 5, 4, 2, 9, 1, 6, 2, 9, 9, 1, 9, 3, 0, 6, 4, 5, 5, 3, 7, 7, 9, 9, 1, 4, 0, 3, 7, 3, 4, 0, 4, 3, 2, 8, 7, 5, 2, 6, 2, 8, 8, 8, 9, 6, 3, 9, 9, 5, 8, 7, 9, 4, 7, 5, 7, 2, 9, 1, 7, 4,
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 4, 2, 6, 3, 5, 7, 4, 5, 5, 2, 5, 4, 0, 7, 9, 0, 9, 1, 4, 5, 1, 3, 5, 7, 1, 1, 1, 3, 6, 9, 4, 1, 0, 9, 1, 1, 9, 3, 9, 3, 2, 5, 1, 9, 1, 0, 7, 6, 0, 2, 0, 8, 2, 5, 2, 0, 2, 6, 1, 8, 7, 9, 8, 5, 3, 1, 8, 8, 7,
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        7, 0, 5, 8, 4, 2, 9, 7, 2, 5, 9, 1, 6, 7, 7, 8, 1, 3, 1, 4, 9, 6, 9, 9, 0, 0, 9, 0, 1, 9, 2, 1, 1, 6, 9, 7, 1, 7, 3, 7, 2, 7, 8, 4, 7, 6, 8, 4, 7, 2, 6, 8, 6, 0, 8, 4, 9, 0, 0, 3, 3, 7, 7, 0, 2, 4, 2, 4, 2, 9,
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        1, 6, 5, 1, 3, 0, 0, 5, 0, 0, 5, 1, 6, 8, 3, 2, 3, 3, 6, 4, 3, 5, 0, 3, 8, 9, 5, 1, 7, 0, 2, 9, 8, 9, 3, 9, 2, 2, 3, 3, 4, 5, 1, 7, 2, 2, 0, 1, 3, 8, 1, 2, 8, 0, 6, 9, 6, 5, 0, 1, 1, 7, 8, 4, 4, 0, 8, 7, 4, 5,
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        1, 9, 6, 0, 1, 2, 1, 2, 2, 8, 5, 9, 9, 3, 7, 1, 6, 2, 3, 1, 3, 0, 1, 7, 1, 1, 4, 4, 4, 8, 4, 6, 4, 0, 9, 0, 3, 8, 9, 0, 6, 4, 4, 9, 5, 4, 4, 4, 0, 0, 6, 1, 9, 8, 6, 9, 0, 7, 5, 4, 8, 5, 1, 6, 0, 2, 6, 3, 2, 7,
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        5, 0, 5, 2, 9, 8, 3, 4, 9, 1, 8, 7, 4, 0, 7, 8, 6, 6, 8, 0, 8, 8, 1, 8, 3, 3, 8, 5, 1, 0, 2, 2, 8, 3, 3, 4, 5, 0, 8, 5, 0, 4, 8, 6, 0, 8, 2, 5, 0, 3, 9, 3, 0, 2, 1, 3, 3, 2, 1, 9, 7, 1, 5, 5, 1, 8, 4, 3, 0, 6,
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        3, 5, 4, 5, 5, 0, 0, 7, 6, 6, 8, 2, 8, 2, 9, 4, 9, 3, 0, 4, 1, 3, 7, 7, 6, 5, 5, 2, 7, 9, 3, 9, 7, 5, 1, 7, 5, 4, 6, 1, 3, 9, 5, 3, 9, 8, 4, 6, 8, 3, 3, 9, 3, 6, 3, 8, 3, 0, 4, 7, 4, 6, 1, 1, 9, 9, 6, 6, 5, 3,
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        8, 5, 8, 1, 5, 3, 8, 4, 2, 0, 5, 6, 8, 5, 3, 3, 8, 6, 2, 1, 8, 6, 7, 2, 5, 2, 3, 3, 4, 0, 2, 8, 3, 0, 8, 7, 1, 1, 2, 3, 2, 8, 2, 7, 8, 9, 2, 1, 2, 5, 0, 7, 7, 1, 2, 6, 2, 9, 4, 6, 3, 2, 2, 9, 5, 6, 3, 9, 8, 9,
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        8, 9, 8, 9, 3, 5, 8, 2, 1, 1, 6, 7, 4, 5, 6, 2, 7, 0, 1, 0, 2, 1, 8, 3, 5, 6, 4, 6, 2, 2, 0, 1, 3, 4, 9, 6, 7, 1, 5, 1, 8, 8, 1, 9, 0, 9, 7, 3, 0, 3, 8, 1, 1, 9, 8, 0, 0, 4, 9, 7, 3, 4, 0, 7, 2, 3, 9, 6, 1, 0,
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        3, 6, 8, 5, 4, 0, 6, 6, 4, 3, 1, 9, 3, 9, 5, 0, 9, 7, 9, 0, 1, 9, 0, 6, 9, 9, 6, 3, 9, 5, 5, 2, 4, 5, 3, 0, 0, 5, 4, 5, 0, 5, 8, 0, 6, 8, 5, 5, 0, 1, 9, 5, 6, 7, 3, 0, 2, 2, 9, 2, 1, 9, 1, 3, 9, 3, 3, 9, 1, 8,
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        5, 6, 8, 0, 3, 4, 4, 9, 0, 3, 9, 8, 2, 0, 5, 9, 5, 5, 1, 0, 0, 2, 2, 6, 3, 5, 3, 5, 3, 6, 1, 9, 2, 0, 4, 1, 9, 9, 4, 7, 4, 5, 5, 3, 8, 5, 9, 3, 8, 1, 0, 2, 3, 4, 3, 9, 5, 5, 4, 4, 9, 5, 9, 7, 7, 8, 3, 7, 7, 9,
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        0, 2, 3, 7, 4, 2, 1, 6, 1, 7, 2, 7, 1, 1, 1, 7, 2, 3, 6, 4, 3, 4, 3, 5, 4, 3, 9, 4, 7, 8, 2, 2, 1, 8, 1, 8, 5, 2, 8, 6, 2, 4, 0, 8, 5, 1, 4, 0, 0, 6, 6, 6, 0, 4, 4, 3, 3, 2, 5, 8, 8, 8, 5, 6, 9, 8, 6, 7, 0, 5,
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        4, 3, 1, 5, 4, 7, 0, 6, 9, 6, 5, 7, 4, 7, 4, 5, 8, 5, 5, 0, 3, 3, 2, 3, 2, 3, 3, 4, 2, 1, 0, 7, 3, 0, 1, 5, 4, 5, 9, 4, 0, 5, 1, 6, 5, 5, 3, 7, 9, 0, 6, 8, 6, 6, 2, 7, 3, 3, 3, 7, 9, 9, 5, 8, 5, 1, 1, 5, 6, 2,
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        5, 7, 8, 4, 3, 2, 2, 9, 8, 8, 2, 7, 3, 7, 2, 3, 1, 9, 8, 9, 8, 7, 5, 7, 1, 4, 1, 5, 9, 5, 7, 8, 1, 1, 1, 9, 6, 3, 5, 8, 3, 3, 0, 0, 5, 9, 4, 0, 8, 7, 3, 0, 6, 8, 1, 2, 1, 6, 0, 2, 8, 7, 6, 4, 9, 6, 2, 8, 6, 7,
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        4, 4, 6, 0, 4, 7, 7, 4, 6, 4, 9, 1, 5, 9, 9, 5, 0, 5, 4, 9, 7, 3, 7, 4, 2, 5, 6, 2, 6, 9, 0, 1, 0, 4, 9, 0, 3, 7, 7, 8, 1, 9, 8, 6, 8, 3, 5, 9, 3, 8, 1, 4, 6, 5, 7, 4, 1, 2, 6, 8, 0, 4, 9, 2, 5, 6, 4, 8, 7, 9,
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        8, 5, 5, 6, 1, 4, 5, 3, 7, 2, 3, 4, 7, 8, 6, 7, 3, 3, 0, 3, 9, 0, 4, 6, 8, 8, 3, 8, 3, 4, 3, 6, 3, 4, 6, 5, 5, 3, 7, 9, 4, 9, 8, 6, 4, 1, 9, 2, 7, 0, 5, 6, 3, 8, 7, 2, 9, 3, 1, 7, 4, 8, 7, 2, 3, 3, 2, 0, 8, 3,
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        7, 6, 0, 1, 1, 2, 3, 0, 2, 9, 9, 1, 1, 3, 6, 7, 9, 3, 8, 6, 2, 7, 0, 8, 9, 4, 3, 8, 7, 9, 9, 3, 6, 2, 0, 1, 6, 2, 9, 5, 1, 5, 4, 1, 3, 3, 7, 1, 4, 2, 4, 8, 9, 2, 8, 3, 0, 7, 2, 2, 0, 1, 2, 6, 9, 0, 1, 4, 7, 5,
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        4, 6, 6, 8, 4, 7, 6, 5, 3, 5, 7, 6, 1, 6, 4, 7, 7, 3, 7, 9, 4, 6, 7, 5, 2, 0, 0, 4, 9, 0, 7, 5, 7, 1, 5, 5, 5, 2, 7, 8, 1, 9, 6, 5, 3, 6, 2, 1, 3, 2, 3, 9, 2, 6, 4, 0, 6, 1, 6, 0, 1, 3, 6, 3, 5, 8, 1, 5, 5, 9,
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        0, 7, 4, 2, 2, 0, 2, 0, 2, 0, 3, 1, 8, 7, 2, 7, 7, 6, 0, 5, 2, 7, 7, 2, 1, 9, 0, 0, 5, 5, 6, 1, 4, 8, 4, 2, 5, 5, 5, 1, 8, 7, 9, 2, 5, 3, 0, 3, 4, 3, 5, 1, 3, 9, 8, 4, 4, 2, 5, 3, 2, 2, 3, 4, 1, 5, 7, 6, 2, 3,
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        3, 6, 1, 0, 6, 4, 2, 5, 0, 6, 3, 9, 0, 4, 9, 7, 5, 0, 0, 8, 6, 5, 6, 2, 7, 1, 0, 9, 5, 3, 5, 9, 1, 9, 4, 6, 5, 8, 9, 7, 5, 1, 4, 1, 3, 1, 0, 3, 4, 8, 2, 2, 7, 6, 9, 3, 0, 6, 2, 4, 7, 4, 3, 5, 3, 6, 3, 2, 5, 6,
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        9, 1, 6, 0, 7, 8, 1, 5, 4, 7, 8, 1, 8, 1, 1, 5, 2, 8, 4, 3, 6, 6, 7, 9, 5, 7, 0, 6, 1, 1, 0, 8, 6, 1, 5, 3, 3, 1, 5, 0, 4, 4, 5, 2, 1, 2, 7, 4, 7, 3, 9, 2, 4, 5, 4, 4, 9, 4, 5, 4, 2, 3, 6, 8, 2, 8, 8, 6, 0, 6,
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        1, 3, 4, 0, 8, 4, 1, 4, 8, 6, 3, 7, 7, 6, 7, 0, 0, 9, 6, 1, 2, 0, 7, 1, 5, 1, 2, 4, 9, 1, 4, 0, 4, 3, 0, 2, 7, 2, 5, 3, 8, 6, 0, 7, 6, 4, 8, 2, 3, 6, 3, 4, 1, 4, 3, 3, 4, 6, 2, 3, 5, 1, 8, 9, 7, 5, 7, 6, 6, 4,
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        5, 2, 1, 6, 4, 1, 3, 7, 6, 7, 9, 6, 9, 0, 3, 1, 4, 9, 5, 0, 1, 9, 1, 0, 8, 5, 7, 5, 9, 8, 4, 4, 2, 3, 9, 1, 9, 8, 6, 2, 9, 1, 6, 4, 2, 1, 9, 3, 9, 9, 4, 9, 0, 7, 2, 3, 6, 2, 3, 4, 6, 4, 6, 8, 4, 4, 1, 1, 7, 3,
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        9, 4, 0, 3, 2, 6, 5, 9, 1, 8, 4, 0, 4, 4, 3, 7, 8, 0, 5, 1, 3, 3, 3, 8, 9, 4, 5, 2, 5, 7, 4, 2, 3, 9, 9, 5, 0, 8, 2, 9, 6, 5, 9, 1, 2, 2, 8, 5, 0, 8, 5, 5, 5, 8, 2, 1, 5, 7, 2, 5, 0, 3, 1, 0, 7, 1, 2, 5, 7, 0,
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        1, 2, 6, 6, 8, 3, 0, 2, 4, 0, 2, 9, 2, 9, 5, 2, 5, 2, 2, 0, 1, 1, 8, 7, 2, 6, 7, 6, 7, 5, 6, 2, 2, 0, 4, 1, 5, 4, 2, 0, 5, 1, 6, 1, 8, 4, 1, 6, 3, 4, 8, 4, 7, 5, 6, 5, 1, 6, 9, 9, 9, 8, 1, 1, 6, 1, 4, 1, 0, 1,
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        0, 0, 2, 9, 9, 6, 0, 7, 8, 3, 8, 6, 9, 0, 9, 2, 9, 1, 6, 0, 3, 0, 2, 8, 8, 4, 0, 0, 2, 6, 9, 1, 0, 4, 1, 4, 0, 7, 9, 2, 8, 8, 6, 2, 1, 5, 0, 7, 8, 4, 2, 4, 5, 1, 6, 7, 0, 9, 0, 8, 7, 0, 0, 0, 6, 9, 9, 2, 8, 2,
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        1, 2, 0, 6, 6, 0, 4, 1, 8, 3, 7, 1, 8, 0, 6, 5, 3, 5, 5, 6, 7, 2, 5, 2, 5, 3, 2, 5, 6, 7, 5, 3, 2, 8, 6, 1, 2, 9, 1, 0, 4, 2, 4, 8, 7, 7, 6, 1, 8, 2, 5, 8, 2, 9, 7, 6, 5, 1, 5, 7, 9, 5, 9, 8, 4, 7, 0, 3, 5, 6,
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        2, 2, 2, 6, 2, 9, 3, 4, 8, 6, 0, 0, 3, 4, 1, 5, 8, 7, 2, 2, 9, 8, 0, 5, 3, 4, 9, 8, 9, 6, 5, 0, 2, 2, 6, 2, 9, 1, 7, 4, 8, 7, 8, 8, 2, 0, 2, 7, 3, 4, 2, 0, 9, 2, 2, 2, 2, 4, 5, 3, 3, 9, 8, 5, 6, 2, 6, 4, 7, 6,
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 9, 1, 4, 9, 0, 5, 5, 6, 2, 8, 4, 2, 5, 0, 3, 9, 1, 2, 7, 5, 7, 7, 1, 0, 2, 8, 4, 0, 2, 7, 9, 9, 8, 0, 6, 6, 3, 6, 5, 8, 2, 5, 4, 8, 8, 9, 2, 6, 4, 8, 8, 0, 2, 5, 4, 5, 6, 6, 1, 0, 1, 7, 2, 9, 6, 7, 0, 2, 6,
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 4, 0, 7, 6, 5, 5, 9, 0, 4, 2, 9, 0, 9, 9, 4, 5, 6, 8, 1, 5, 0, 6, 5, 2, 6, 5, 3, 0, 5, 3, 7, 1, 8, 2, 9, 4, 1, 2, 7, 0, 3, 3, 6, 9, 3, 1, 3, 7, 8, 5, 1, 7, 8, 6, 0, 9, 0, 4, 0, 7, 0, 8, 6, 6, 7, 1, 1, 4, 9,
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 5, 5, 8, 3, 4, 3, 4, 3, 4, 7, 6, 9, 3, 3, 8, 5, 7, 8, 1, 7, 1, 1, 3, 8, 6, 4, 5, 5, 8, 7, 3, 6, 7, 8, 1, 2, 3, 0, 1, 4, 5, 8, 7, 6, 8, 7, 1, 2, 6, 6, 0, 3, 4, 8, 9, 1, 3, 9, 0, 9, 5, 6, 2, 0, 0, 9, 9, 3, 9,
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        3, 6, 1, 0, 3, 1, 0, 2, 9, 1, 6, 1, 6, 1, 5, 2, 8, 8, 1, 3, 8, 4, 3, 7, 9, 0, 9, 9, 0, 4, 2, 3, 1, 7, 4, 7, 3, 3, 6, 3, 9, 4, 8, 0, 4, 5, 7, 5, 9, 3, 1, 4, 9, 3, 1, 4, 0, 5, 2, 9, 7, 6, 3, 4, 7, 5, 7, 4, 8, 1,
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        1, 9, 3, 5, 6, 7, 0, 9, 1, 1, 0, 1, 3, 7, 7, 5, 1, 7, 2, 1, 0, 0, 8, 0, 3, 1, 5, 5, 9, 0, 2, 4, 8, 5, 3, 0, 9, 0, 6, 6, 9, 2, 0, 3, 7, 6, 7, 1, 9, 2, 2, 0, 3, 3, 2, 2, 9, 0, 9, 4, 3, 3, 4, 6, 7, 6, 8, 5, 1, 4,
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        2, 2, 1, 4, 4, 7, 7, 3, 7, 9, 3, 9, 3, 7, 5, 1, 7, 0, 3, 4, 4, 3, 6, 6, 1, 9, 9, 1, 0, 4, 0, 3, 3, 7, 5, 1, 1, 1, 7, 3, 5, 4, 7, 1, 9, 1, 8, 5, 5, 0, 4, 6, 4, 4, 9, 0, 2, 6, 3, 6, 5, 5, 1, 2, 8, 1, 6, 2, 2, 8,
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        8, 2, 4, 4, 6, 2, 5, 7, 5, 9, 1, 6, 3, 3, 3, 0, 3, 9, 1, 0, 7, 2, 2, 5, 3, 8, 3, 7, 4, 2, 1, 8, 2, 1, 4, 0, 8, 8, 3, 5, 0, 8, 6, 5, 7, 3, 9, 1, 7, 7, 1, 5, 0, 9, 6, 8, 2, 8, 8, 7, 4, 7, 8, 2, 6, 5, 6, 9, 9, 5,
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        9, 9, 5, 7, 4, 4, 9, 0, 6, 6, 1, 7, 5, 8, 3, 4, 4, 1, 3, 7, 5, 2, 2, 3, 9, 7, 0, 9, 6, 8, 3, 4, 0, 8, 0, 0, 5, 3, 5, 5, 9, 8, 4, 9, 1, 7, 5, 4, 1, 7, 3, 8, 1, 8, 8, 3, 9, 9, 9, 4, 4, 6, 9, 7, 4, 8, 6, 7, 6, 2,
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 5, 5, 1, 6, 5, 8, 2, 7, 6, 5, 8, 4, 8, 3, 5, 8, 8, 4, 5, 3, 1, 4, 2, 7, 7, 5, 6, 8, 7, 9, 0, 0, 2, 9, 0, 9, 5, 1, 7, 0, 2, 8, 3, 5, 2, 9, 7, 1, 6, 3, 4, 4, 5, 6, 2, 1, 2, 9, 6, 4, 0, 4, 3, 5, 2, 3, 1, 1, 7,
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 0, 0, 6, 6, 5, 1, 0, 1, 2, 4, 1, 2, 0, 0, 6, 5, 9, 7, 5, 5, 8, 5, 1, 2, 7, 6, 1, 7, 8, 5, 8, 3, 8, 2, 9, 2, 0, 4, 1, 9, 7, 4, 8, 4, 4, 2, 3, 6, 0, 8, 0, 0, 7, 1, 9, 3, 0, 4, 5, 7, 6, 1, 8, 9, 3, 2, 3, 4, 9,
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        2, 2, 9, 2, 7, 9, 6, 5, 0, 1, 9, 8, 7, 5, 1, 8, 7, 2, 1, 2, 7, 2, 6, 7, 5, 0, 7, 9, 8, 1, 2, 5, 5, 4, 7, 0, 9, 5, 8, 9, 0, 4, 5, 5, 6, 3, 5, 7, 9, 2, 1, 2, 2, 1, 0, 3, 3, 3, 4, 6, 6, 9, 7, 4, 9, 9, 2, 3, 5, 6,
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        3, 0, 2, 5, 4, 9, 4, 7, 8, 0, 2, 4, 9, 0, 1, 1, 4, 1, 9, 5, 2, 1, 2, 3, 8, 2, 8, 1, 5, 3, 0, 9, 1, 1, 4, 0, 7, 9, 0, 7, 3, 8, 6, 0, 2, 5, 1, 5, 2, 2, 7, 4, 2, 9, 9, 5, 8, 1, 8, 0, 7, 2, 4, 7, 1, 6, 2, 5, 9, 1,
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 6, 8, 5, 4, 5, 1, 3, 3, 3, 1, 2, 3, 9, 4, 8, 0, 4, 9, 4, 7, 0, 7, 9, 1, 1, 9, 1, 5, 3, 2, 6, 7, 3, 4, 3, 0, 2, 8, 2, 4, 4, 1, 8, 6, 0, 4, 1, 4, 2, 6, 3, 6, 3, 9, 5, 4, 8, 0, 0, 0, 4, 4, 8, 0, 0, 2, 6, 7, 0,
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        4, 9, 6, 2, 4, 8, 2, 0, 1, 7, 9, 2, 8, 9, 6, 4, 7, 6, 6, 9, 7, 5, 8, 3, 1, 8, 3, 2, 7, 1, 3, 1, 4, 2, 5, 1, 7, 0, 2, 9, 6, 9, 2, 3, 4, 8, 8, 9, 6, 2, 7, 6, 6, 8, 4, 4, 0, 3, 2, 3, 2, 6, 0, 9, 2, 7, 5, 2, 4, 9,
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 0, 3, 5, 7, 9, 9, 6, 4, 6, 9, 2, 5, 6, 5, 0, 4, 9, 3, 6, 8, 1, 8, 3, 6, 0, 9, 0, 0, 3, 2, 3, 8, 0, 9, 2, 9, 3, 4, 5,
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        9, 5, 8, 8, 9, 7, 0, 6, 9, 5, 3, 6, 5, 3, 4, 9, 4, 0, 6, 0, 3, 4, 0, 2, 1, 6, 6, 5, 4, 4, 3, 7, 5, 5, 8, 9, 0, 0, 4, 5, 6, 3, 2, 8, 8, 2, 2, 5, 0, 5, 4, 5, 2, 5, 5, 6, 4, 0, 5, 6, 4, 4, 8, 2, 4, 6, 5, 1, 5, 1,
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        8, 7, 5, 4, 7, 1, 1, 9, 6, 2, 1, 8, 4, 4, 3, 9, 6, 5, 8, 2, 5, 3, 3, 7, 5, 4, 3, 8, 8, 5, 6, 9, 0, 9, 4, 1, 1, 3, 0, 3, 1, 5, 0, 9, 5, 2, 6, 1, 7, 9, 3, 7, 8, 0, 0, 2, 9, 7, 4, 1, 2, 0, 7, 6, 6, 5, 1, 4, 7, 9,
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        3, 9, 4, 2, 5, 9, 0, 2, 9, 8, 9, 6, 9, 5, 9, 4, 6, 9, 9, 5, 5, 6, 5, 7, 6, 1, 2, 1, 8, 6, 5, 6, 1, 9, 6, 7, 3, 3, 7, 8, 6, 2, 3, 6, 2, 5, 6, 1, 2, 5, 2, 1, 6, 3, 2, 0, 8, 6, 2, 8, 6, 9, 2, 2, 2, 1, 0, 3, 2, 7,
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        4, 8, 8, 9, 2, 1, 8, 6, 5, 4, 3, 6, 4, 8, 0, 2, 2, 9, 6, 7, 8, 0, 7, 0, 5, 7, 6, 5, 6, 1, 5, 1, 4, 4, 6, 3, 2, 0, 4, 6, 9, 2, 7, 9, 0, 6, 8, 2, 1, 2, 0, 7, 3, 8, 8, 3, 7, 7, 8, 1, 4, 2, 3, 3, 5, 6, 2, 8, 2, 3,
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 0, 8, 9, 6, 3, 2, 0, 8, 0, 6, 8, 2, 2, 2, 4, 6, 8, 0, 1, 2, 2, 4, 8, 2, 6, 1, 1, 7, 7, 1, 8, 5, 8, 9, 6, 3, 8, 1, 4, 0, 9, 1, 8, 3, 9, 0, 3, 6, 7, 3, 6, 7, 2, 2, 2, 0, 8, 8, 8, 3, 2, 1, 5, 1, 3, 7, 5, 5, 6,
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        0, 0, 3, 7, 2, 7, 9, 8, 3, 9, 4, 0, 0, 4, 1, 5, 2, 9, 7, 0, 0, 2, 8, 7, 8, 3, 0, 7, 6, 6, 7, 0, 9, 4, 4, 4, 7, 4, 5, 6, 0, 1, 3, 4, 5, 5, 6, 4, 1, 7, 2, 5, 4, 3, 7, 0, 9, 0, 6, 9, 7, 9, 3, 9, 6, 1, 2, 2, 5, 7,
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        1, 4, 2, 9, 8, 9, 4, 6, 7, 1, 5, 4, 3, 5, 7, 8, 4, 6, 8, 7, 8, 8, 6, 1, 4, 4, 4, 5, 8, 1, 2, 3, 1, 4, 5, 9, 3, 5, 7, 1, 9, 8, 4, 9, 2, 2, 5, 2, 8, 4, 7, 1, 6, 0, 5, 0, 4, 9, 2, 2, 1, 2, 4, 2, 4, 7, 0, 1, 4, 1,
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        2, 1, 4, 7, 8, 0, 5, 7, 3, 4, 5, 5, 1, 0, 5, 0, 0, 8, 0, 1, 9, 0, 8, 6, 9, 9, 6, 0, 3, 3, 0, 2, 7, 6, 3, 4, 7, 8, 7, 0, 8, 1, 0, 8, 1, 7, 5, 4, 5, 0, 1, 1, 9, 3, 0, 7, 1, 4, 1, 2, 2, 3, 3, 9, 0, 8, 6, 6, 3, 9,
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        3, 8, 3, 3, 9, 5, 2, 9, 4, 2, 5, 7, 8, 6, 9, 0, 5, 0, 7, 6, 4, 3, 1, 0, 0, 6, 3, 8, 3, 5, 1, 9, 8, 3, 4, 3, 8, 9, 3, 4, 1, 5, 9, 6, 1, 3, 1, 8, 5, 4, 3, 4, 7, 5, 4, 6, 4, 9, 5, 5, 6, 9, 7, 8, 1, 0, 3, 8, 2, 9,
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        3, 0, 9, 7, 1, 6, 4, 6, 5, 1, 4, 3, 8, 4, 0, 7, 0, 0, 7, 0, 7, 3, 6, 0, 4, 1, 1, 2, 3, 7, 3, 5, 9, 9, 8, 4, 3, 4, 5, 2, 2, 5, 1, 6, 1, 0, 5, 0, 7, 0, 2, 7, 0, 5, 6, 2, 3, 5, 2, 6, 6, 0, 1, 2, 7, 6, 4, 8, 4, 8,
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        3, 0, 8, 4, 0, 7, 6, 1, 1, 8, 3, 0, 1, 3, 0, 5, 2, 7, 9, 3, 2, 0, 5, 4, 2, 7, 4, 6, 2, 8, 6, 5, 4, 0, 3, 6, 0, 3, 6, 7, 4, 5, 3, 2, 8, 6, 5, 1, 0, 5, 7, 0, 6, 5, 8, 7, 4, 8, 8, 2, 2, 5, 6, 9, 8, 1, 5, 7, 9, 3,
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        6, 7, 8, 9, 7, 6, 6, 9, 7, 4, 2, 2, 0, 5, 7, 5, 0, 5, 9, 6, 8, 3, 4, 4, 0, 8, 6, 9, 7, 3, 5, 0, 2, 0, 1, 4, 1, 0, 2, 0, 6, 7, 2, 3, 5, 8, 5, 0, 2, 0, 0, 7, 2, 4, 5, 2, 2, 5, 6, 3, 2, 6, 5, 1, 3, 4, 1, 0, 5, 5,
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        9, 2, 4, 0, 1, 9, 0, 2, 7, 4, 2, 1, 6, 2, 4, 8, 4, 3, 9, 1, 4, 0, 3, 5, 9, 9, 8, 9, 5, 3, 5, 3, 9, 4, 5, 9, 0, 9, 4, 4, 0, 7, 0, 4, 6, 9, 1, 2, 0, 9, 1, 4, 0, 9, 3, 8, 7, 0, 0, 1, 2, 6, 4, 5, 6, 0, 0, 1, 6, 2,
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        3, 7, 4, 2, 8, 8, 0, 2, 1, 0, 9, 2, 7, 6, 4, 5, 7, 9, 3, 1, 0, 6, 5, 7, 9, 2, 2, 9, 5, 5, 2, 4, 9, 8, 8, 7, 2, 7, 5, 8, 4, 6, 1, 0, 1, 2, 6, 4, 8, 3, 6, 9, 9, 9, 8, 9, 2, 2, 5, 6, 9, 5, 9, 6, 8, 8, 1, 5, 9, 2,
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        0, 5, 6, 0, 0, 1, 0, 1, 6, 5, 5, 2, 5, 6, 3, 7, 5, 6, 7, 8
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
428