pax_global_header00006660000000000000000000000064143066445770014532gustar00rootroot0000000000000052 comment=352d7a22e8b09f6284af2ace2dc57eb424f1bc09 zipflinger-7.2.2/000077500000000000000000000000001430664457700137135ustar00rootroot00000000000000zipflinger-7.2.2/BUILD000066400000000000000000000133331430664457700145000ustar00rootroot00000000000000load("//tools/base/bazel:bazel.bzl", "iml_module") load("//tools/base/bazel:maven.bzl", "maven_library") load("//tools/base/common:version.bzl", "BUILD_VERSION") maven_library( name = "zipflinger", srcs = glob([ "src/com/android/zipflinger/**/*.java", ]), coordinates = "com.android:zipflinger:" + BUILD_VERSION, description = "Library used to build and incrementally modify zip files", visibility = [ "//tools/base:__pkg__", "//tools/base/bazel:__subpackages__", "//tools/base/build-system:__subpackages__", "//tools/base/deploy/deployer:__subpackages__", "//tools/base/lint:__subpackages__", "//tools/base/signflinger:__subpackages__", "//tools/base/zipflinger/tools:__subpackages__", ], deps = [ "//tools/base/annotations", ], ) java_library( name = "test_utils", srcs = [ "test/src/java/com/android/zipflinger/AbstractZipflingerTest.java", "test/src/java/com/android/zipflinger/MockInputStream.java", ], deps = [ ":zipflinger", "//tools/base/testutils:tools.testutils", "@maven//:junit.junit", ], ) java_test( name = "testParsing", size = "small", srcs = [ "test/src/java/com/android/zipflinger/ParsingTest.java", ], data = [ "test/resource/stripped.ap_", "test/resource/zip_no_fd.zip", "test/resource/zip_with_fd.zip", ], jvm_flags = ["-Dtest.suite.jar=testParsing.jar"], test_class = "com.android.testutils.JarTestSuite", deps = [ ":test_utils", ":zipflinger", "//tools/base/testutils:tools.testutils", "@maven//:junit.junit", ], ) java_test( name = "testsFreeStore", size = "small", srcs = [ "test/src/java/com/android/zipflinger/FreeStoreTest.java", ], data = [ "test/resource/zip_no_fd.zip", "test/resource/zip_with_fd.zip", ], jvm_flags = ["-Dtest.suite.jar=testsFreeStore.jar"], test_class = "com.android.testutils.JarTestSuite", deps = [ ":test_utils", ":zipflinger", "//tools/base/testutils:tools.testutils", "@maven//:junit.junit", ], ) java_test( name = "testsZipFlinger", size = "medium", srcs = [ "test/src/java/com/android/zipflinger/ZipFlingerTest.java", ], data = [ "test/resource/1-2-3files.zip", "test/resource/4-5files.zip", "test/resource/file1.txt", "test/resource/file2.txt", "test/resource/file3.txt", "test/resource/file4.txt", "test/resource/text.txt", "test/resource/two_files.zip", "test/resource/zip_with_directories.zip", ], jvm_flags = ["-Dtest.suite.jar=testsZipFlinger.jar"], tags = ["no_test_mac"], test_class = "com.android.testutils.JarTestSuite", deps = [ ":test_utils", ":zipflinger", "//tools/base/testutils:tools.testutils", "@maven//:junit.junit", ], ) java_test( name = "testZip64", size = "medium", srcs = [ "test/src/java/com/android/zipflinger/Zip64Test.java", ], data = [ "test/resource/5GiBFile.zip", ], jvm_flags = ["-Dtest.suite.jar=testZip64.jar"], test_class = "com.android.testutils.JarTestSuite", deps = [ ":test_utils", ":zipflinger", "//tools/base/testutils:tools.testutils", "@maven//:junit.junit", ], ) java_test( name = "testsCompressor", size = "small", srcs = [ "test/src/java/com/android/zipflinger/CompressorTest.java", ], data = [ "test/resource/file4.txt", ], jvm_flags = ["-Dtest.suite.jar=testsCompressor.jar"], test_class = "com.android.testutils.JarTestSuite", deps = [ ":test_utils", ":zipflinger", "//tools/base/testutils:tools.testutils", "@maven//:junit.junit", ], ) java_test( name = "testsMerge", size = "small", srcs = [ "test/src/java/com/android/zipflinger/ZipMergeTest.java", ], data = [ "test/resource/1-2-3files.zip", "test/resource/4-5files.zip", ], jvm_flags = ["-Dtest.suite.jar=testsMerge.jar"], test_class = "com.android.testutils.JarTestSuite", deps = [ ":test_utils", ":zipflinger", "//tools/base/testutils:tools.testutils", "@maven//:junit.junit", ], ) java_test( name = "testInts", size = "small", srcs = [ "test/src/java/com/android/zipflinger/IntsTest.java", ], jvm_flags = ["-Dtest.suite.jar=testInts.jar"], test_class = "com.android.testutils.JarTestSuite", deps = [ ":zipflinger", "//tools/base/testutils:tools.testutils", "@maven//:junit.junit", ], ) java_test( name = "testRepo", size = "small", srcs = [ "test/src/java/com/android/zipflinger/RepoTest.java", ], jvm_flags = ["-Dtest.suite.jar=testRepo.jar"], test_class = "com.android.testutils.JarTestSuite", deps = [ ":test_utils", ":zipflinger", "//tools/base/testutils:tools.testutils", "@maven//:junit.junit", ], ) # managed by go/iml_to_build iml_module( name = "studio.android.sdktools.zipflinger", srcs = ["src"], iml_files = ["android.sdktools.zipflinger.iml"], lint_baseline = "lint_baseline.xml", tags = ["no_test_mac"], test_data = glob(["test/resource/**"]), test_srcs = ["test/src/java"], visibility = ["//visibility:public"], # do not sort: must match IML order deps = [ "//prebuilts/studio/intellij-sdk:studio-sdk", "//tools/base/annotations:studio.android.sdktools.android-annotations[module]", "//tools/base/testutils:studio.android.sdktools.testutils[module, test]", ], ) zipflinger-7.2.2/README.md000066400000000000000000000226131430664457700151760ustar00rootroot00000000000000# Zipflinger Zipflinger is a library dedicated to ZIP files manipulation. It can create an archive from scratch but also add/remove entries without decompressing/compressing the whole archive. The goal of the library is to work as fast as possible (its original purpose is to enable fast Android APK deployment). The two main features allowing high-speed are Zipflinger's ability to edit the CD of an archive and its usage of zero-copy transfer when moving entries across archives. The library is made of four components named ZipArchive, Freestore, Mapper (Input), and Writer (Output). ``` +------------------------------------+ | ZipArchive | +------------+-----------+-----------+ | Freestore | Mapper | Writer | +------------+-----------+-----------+ ^ + | | + v +------------------------------------+ | MYFILE.ZIP | +------------------------------------+ ``` Design choice discussion: Order of operations: ==================== In order to avoid creating holes when editing an archive, zipflinger recommends (but does not enforce) submitting all delete operations first and then submit add operations. A "deferred add" mechanism was initially used where delete operations were carried immediately but additions were deferred until the archive was closed. This approach was ultimately abandoned since it increased the memory footprint significantly when BytesSource were involved. Prevent silent overwrite: ========================= It is by design that Zipflinger throws an exception when attempting to overwrite an entry in an archive. By asking developer to aknowledge an overwrite by first deleting an entry, this mecanism has allowed to surface many bugs. ## ZipArchive ZipArchive is the interface to create/read/write an archive. Typically an user will provide the path to an archive and request operations such as add/delete. In the code sample below, an Android APK is "incrementally" updated. The AAPT2 output (recognizable to its file extension .apk_) is opened. Since the archive exists, it will be modified. Had it not existed, the archive would have been create. Two operations are requested: 1. An old entry is deleted. 2. A new entry is added. ``` ZipArchive archive = new ZipArchive("app.ap_"); // Delete (to reduce holes to a minimum, it is mandatory to do all delete // operation first). archive.delete("classes18.dex"); // Add sources File myFile = new File("/path/to/file"); BytesSource source = new BytesSource(file, "entryName", Deflater.NO_COMPRESSION); archive.add(source); // Don't forget to close in order to release the archive fd/handle. archive.close(); ``` Such an operation can be performed by Zipflinger in under 100 ms with a mid-range 2019 SSD laptop. If an entry has been deleted in the middle of the archive, Zipflinger will not leave a "hole" there. This is done in order to be compatible with top-down parsers such as jarsigner or the JDK zip classes. To this effect, Zipflinger fills empty space with virtual entries (a.k.a a Local File Header with no name, up to 64KiB extra and no Central Directory entry). Alignment is also done via "extra field". Entry name heuristic: - Deleting a non-existing entry will fail silently. - Adding an existing entry will not silently overwrite but will throw an exception instead. ## ZipMap The mapper only plays a part when opening an existing archive. The goal of the mapper is to locate all entries via the Central Directories and build a map of the LFHs (Local File Header) , CDRs (Central Directory Record) and compile these information into a list of Entry. This data is fed to the FreeStore to build a map of what is currently used in the file and where their is available space. It is also an efficient way to list entries in a zip archive if it is the only operation you need to perform. Note that if a zip contains several entries with the same name, the last entry in CD order (not top-down) order is kept. ## ZipRepo If all operations needed are to list entries and read entries content, ZipRepo is the object to use. It is lightweight compared to a ZipArchive and allows to read entries via an InputStream to exceed the 2GiB limitation and reduce heap stress. ## Freestore The freestore behaves like a memory allocator except that is deals with file address space instead of memory address space. The list of file locations is kept in a double linked list. Two consecutive free areas are never contiguous. If space is freed, adjacent free blocks are merged together. As a result, used space is implicitly described by the "gap" between two free blocks. All write/delete operations in an archive must first go through the freestore. - When a zip entry is deleted, the entry Location is returned to the FreeStore. - When a zip entry is added, a Location must be requested to the Freestore. Allocations alignment is supported. This is to accommodate Android Package Manager optimizations where a zip entry is directly mmaped. Upon requesting an aligned allocation, an offset must also be provided because what needs to be aligned is not the ZIP entry but the zip entry payload. ## ZipWriter All zip write operations are tracked by the Writer. This is done so an accurate map of written Locations can be generated when the file is closed and enable incremental V2 signing. ## Sources To add an entry to a zip, Zipflinger is fed sources. Typically two sources ares supported: - Source (usually BytesSource) - ZipSource (made of several ZipSourceEntry) Source are well-suited for payload already located in memory or in a File. The typical usecase is when an APK needs to be updated with a new file and also V1 signed. The new file will have been loaded from storage to generate a hash values. Note that a BytesSource can be built from an InputStream, in which case the the stream is drained entirely in the BytesSource constructor. ZipSource allows to transfer entries from one zip to an other. Zero-copy is used to speed up transfer . Compression type/format is not changed during the transfer. Upon selecting an entry for transfer, ZipSourceEntry is returned. The handle is only used if alignment needs to be requested. All sources can be requested to be aligned via the Source.align() method. All sources except for the ZipSourceEntry can be requested to be uncompressed/re-compressed. ## File properties and symbolic links Zipflinger will preserve UNIX permissions as found in the Central Directory "external attribute" entries when transferring entries between zip archives. By default, zipflinger creates zip entries with "read" and "write" permissions for user, group, and others. Symbolic links are also followed. If you want to preserve the executable permission or if you want to not follow symbolic links, you must use the FullFileSource object. Keep in mind that FullFileSource is a little bit slower to process files since it needs to perform extra I/O in order to retrieve each properties. ## Memory (heap) stress If you find that ByteSource stresses the heap too much or if you run out of memory on large entries, use a LargeFileSource. These use storage to temporarily store the payload and never load it all in memory. Because this is also done in the Constructor, compression can still be parallelized and there is little speed impact. ## Performance considerations when using ZipSource Zipflinger excels at moving zip entries between zip archives thanks to zero-copy transfer. However using zero-copy is not always possible. Best case: If no compression change is requested or if both the source and the destination are inflated, then zero copy transfer will be used and max speed is achieved. Ok case: If the src is inflated and the dst is deflated, zipflinger cannot zero-copy since the payload must be deflated. Worse case: If both the src and the dst are deflated, there is no way for Zipflinger to know what level of compression was used to generate the src (this is not part of Deflate specs or Zip container format). In order to guarantee the deflate level, Zipflinger has not choice but to inflate the payload and then deflate it at the requested level, even if the compression level are identical. ## Zip64 Support Zipflinger has full support for zip64 archives. It is able to handle zip64EOCD (more than 65536 entries) with zip64Locator and zip64 extra fields containing 64-bit compressed, uncompressed, and offset values (archives larger than 4GiB). There is no facility to handle files larger than 2GiB. ## Profiling To peek inside Zipflinger and understand where walltime is spent, you can run the "profiler" target. ``` tools/base/bazel/bazel run //tools/base/zipflinger:profiler Profiling with an APK : - Total size (MiB) : 118 - Num res : 5000 - Size res (KiB) : 16 - Num dex : 10 - Size dex (MiB) : 4 ``` Once the target has run, retrieve the report from the workstation tmp folder. e.g On Linux: ``` cp /tmp/report.json ~/ ``` You can examine the report in Chrome via about://tracing. Edit time (ms) on a 3Ghz machine with a PM981 NVMe drive. ``` APK Size NumRes SizeRes NumDex SizeDex Time (ms) 120 MiB 5000 16 KiB 10 4 MiB 27 60 MiB 2500 16 KiB 10 4 MiB 18 49 MiB 2500 4 KiB 10 4 MiB 18 ``` The edit time is dominated by the parsing time (itself dominated by the number of entries). zipflinger-7.2.2/android.sdktools.zipflinger.iml000066400000000000000000000013521430664457700220500ustar00rootroot00000000000000 zipflinger-7.2.2/cookbook.md000066400000000000000000000067661430664457700160620ustar00rootroot00000000000000# Zipflinger cheatsheet Zipflinger is a library dedicated to ZIP files manipulation. It is capable of adding and removing entries without decompressing/compressing the whole archive. It supports: - Listing content of a zip archive. - Deleting entry in an archive. - Adding entries in an archive with source from filesystem, memory, and other zip archives. Deleting a non-existing entry will fail silently. Adding an existing entry will not silently overwrite but will throw an exception instead. ## How to list the content of an archive ``` Map map = ZipArchive.listEntries(new File("/path/to/zip")); for(Entry entry : map.getEntries().values()) { entry.getName(); entry.getCrc(); ... } ``` ## How to replace an entry in an archive ``` ZipArchive zip = new ZipArchive("app.apk"); zip.delete("classes18.dex"); // All deletes must be submitted first. zip.add(new BytesSource(new File("classes18.dex"), "classes18.dex", Deflater.BEST_SPEED)); zip.add(new BytesSource(new File("img.png"), "image.png", Deflater.NO_COMPRESSION)); zip.close(); ``` ## How to merge two zips into one ``` ZipArchive zip = new ZipArchive("app.apk"); ZipSource zipSource1 = ZipSource.selectAll(new File("/path/to/zip1.zip")); zip.add(zipSource1); ZipSource zipSource2 = ZipSource.selectAll(new File("/path/to/zip2.zip")); zip.add(zipSource2); zip.close(); ``` ## How to copy a zip entry from an other zip into an existing apk ``` ZipArchive zip = new ZipArchive("app.apk"); ZipSource zipSource = new ZipSource(new File("/path/to/zip1.zip")); zipSource.select("classes18.dex", "classes18NewName.dex"); // non-aligned (default) ZipSourceEntry alignedEntry = zipSource.select("lib.so", "lib.so"); // aligned alignedEntry.align(4); zip.addZipSource(zipSource); zip.close(); ``` ## How to iterate over a zip source entries and select only a few ``` ZipArchive zip = new ZipArchive("app.apk"); ZipSource zipSource = new ZipSource(new File("/path/to/zip1.zip")); for(String name : zipSource.entries().keys()) { if (youwantIt) { zipSource.select(name, "newName"); } } zip.add(zipSource); zip.close(); ``` ## Generate multiple zips from one zip source Creating a ZipSource is not an I/O free operation since the CD of the source archive has to be parsed. In the case where one source zip is to be used to generate multiple destination zips, parsing can be done only once by providing the same ZipMap to each ZipSource. ``` // The source zip is parsed only once. ZipMap map = ZipMap.from(new File("source.zip")); ZipSource zipSource1 = new ZipSource(map); zipSource1.select("a", "a"); try(ZipArchive archive = new ZipArchive("dest1.zip")) { archive.add(zipSource1); } ZipSource zipSource2 = new ZipSource(map); zipSource2.select("b", "b"); try(ZipArchive archive = new ZipArchive("dest2.zip")) { archive.add(zipSource2); } ``` # Add files to a zip and preserve executable permission ``` try(ZipArchive zip = new ZipArchive("archive.zip")) { String p = "/path/x"; int c = Deflater.NO_COMPRESSION; zip.add(new FullFileSource(p, "x", c)); } ``` # Add symbolic links to a zip ``` try(ZipArchive zip = new ZipArchive("archive.zip")) { String p = "/path/x"; int c = Deflater.NO_COMPRESSION; FullFileSource.Symlink perm = FullFileSource.Symlink.DO_NOT_FOLLOW; zip.add(new FullFileSource(p , "x", c, perm)); } ``` # How to extract content from an archive ``` try(ZipRepo repo = new ZipRepo("source.zip")) { try(InputStream inputStream = repo.getContent("entryName")) { ... } } ``` zipflinger-7.2.2/lint_baseline.xml000066400000000000000000000027231430664457700172510ustar00rootroot00000000000000 zipflinger-7.2.2/src/000077500000000000000000000000001430664457700145025ustar00rootroot00000000000000zipflinger-7.2.2/src/com/000077500000000000000000000000001430664457700152605ustar00rootroot00000000000000zipflinger-7.2.2/src/com/android/000077500000000000000000000000001430664457700167005ustar00rootroot00000000000000zipflinger-7.2.2/src/com/android/zipflinger/000077500000000000000000000000001430664457700210515ustar00rootroot00000000000000zipflinger-7.2.2/src/com/android/zipflinger/Archive.java000066400000000000000000000036731430664457700233060ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.Closeable; import java.io.IOException; public interface Archive extends Closeable { /** * Add a source to the archive. * * @param source The source to add to this zip archive. * @throws IllegalStateException if the entry name already exists in the archive. * @throws IOException if writing to the zip archive fails. */ void add(@NonNull Source source) throws IOException; /** * Add a set of selected entries from an other zip archive. * * @param sources A zip archive with selected entries to add to this zip archive. * @throws IllegalStateException if the entry name already exists in the archive. * @throws IOException if writing to the zip archive fails. */ void add(@NonNull ZipSource sources) throws IOException; /** * Delete an entry from this archive. If the entry did not exist, this method does nothing. To * avoid creating "holes" in the archive, it is mendatory to delete all entries first and add * sources second. * * @param name The name of the entry to delete. * @throws IllegalStateException if entries have been added. */ void delete(@NonNull String name) throws IOException; @Override void close() throws IOException; } zipflinger-7.2.2/src/com/android/zipflinger/BytesSource.java000066400000000000000000000067531430664457700241760ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.file.Files; import java.nio.file.Path; import java.util.zip.Deflater; public class BytesSource extends Source { // Bytes to be written in the zip, after the Local File Header. private ByteBuffer zipEntryPayload; protected BytesSource(String name) { super(name); } /** * @param bytes * @param name * @param compressionLevel One of java.util.zip.Deflater compression level. */ public BytesSource(@NonNull byte[] bytes, @NonNull String name, int compressionLevel) throws IOException { super(name); build(bytes, bytes.length, compressionLevel); } public BytesSource(@NonNull Path file, @NonNull String name, int compressionLevel) throws IOException { super(name); byte[] bytes = Files.readAllBytes(file); build(bytes, bytes.length, compressionLevel); } /** @deprecated Use {@link #BytesSource(Path, String, int)} instead. */ @Deprecated public BytesSource(@NonNull File file, @NonNull String name, int compressionLevel) throws IOException { this(file.toPath(), name, compressionLevel); } /** * @param stream BytesSource takes ownership of the InputStream and will close it after draining * it. * @param name * @param compressionLevel * @throws IOException */ public BytesSource(@NonNull InputStream stream, @NonNull String name, int compressionLevel) throws IOException { super(name); try (NoCopyByteArrayOutputStream ncbos = new NoCopyByteArrayOutputStream(16000)) { byte[] tmpBuffer = new byte[16000]; int bytesRead; while ((bytesRead = stream.read(tmpBuffer)) != -1) { ncbos.write(tmpBuffer, 0, bytesRead); } stream.close(); build(ncbos.buf(), ncbos.getCount(), compressionLevel); } } protected void build(byte[] bytes, int size, int compressionLevel) throws IOException { crc = Crc32.crc32(bytes, 0, size); uncompressedSize = size; if (compressionLevel == Deflater.NO_COMPRESSION) { zipEntryPayload = ByteBuffer.wrap(bytes, 0, size); compressedSize = uncompressedSize; compressionFlag = LocalFileHeader.COMPRESSION_NONE; } else { zipEntryPayload = Compressor.deflate(bytes, 0, size, compressionLevel); compressedSize = zipEntryPayload.limit(); compressionFlag = LocalFileHeader.COMPRESSION_DEFLATE; } } @Override public void prepare() {} @Override public long writeTo(@NonNull ZipWriter writer) throws IOException { return writer.write(zipEntryPayload); } } zipflinger-7.2.2/src/com/android/zipflinger/CentralDirectory.java000066400000000000000000000122241430664457700251720ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import com.android.annotations.Nullable; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; class CentralDirectory { // The Central Directory as it was read when an archive already existed. private final ByteBuffer buf; private final List deletedLocations = new ArrayList<>(); private final Map entries; private final Map addedEntries = new LinkedHashMap<>(); CentralDirectory(@NonNull ByteBuffer buf, @NonNull Map entries) { this.buf = buf; this.entries = entries; } @NonNull Location delete(@NonNull String name) { if (entries.containsKey(name)) { Entry entry = entries.get(name); deletedLocations.add(entry.getCdLocation()); entries.remove(name); return entry.getLocation(); } if (addedEntries.containsKey(name)) { CentralDirectoryRecord record = addedEntries.remove(name); return record.getLocation(); } return Location.INVALID; } long getNumEntries() { return (long) entries.size() + addedEntries.size(); } void write(@NonNull ZipWriter writer) throws IOException { // Four steps operations (first write old entries then new entries): // 1/ Sort deleted entries by location. // 2/ Create a list of "clean" (not deleted) locations. // 3/ Write all old (non-deleted) locations. // 4/ Write all new entries. // Step 1 Collections.sort(deletedLocations); // Step 2 (Build list of non-deleted locations). List cleanCDLocations = new ArrayList<>(); long remainingStart = 0; long remainingSize = buf.capacity(); for (Location deletedLocation : deletedLocations) { Location cleanLoc = new Location(remainingStart, deletedLocation.first - remainingStart); // If cleanLoc is the left end of the remaining CD, cleanLoc size is 0. if (cleanLoc.size() > 0) { cleanCDLocations.add(cleanLoc); } remainingStart = deletedLocation.last + 1; remainingSize -= (deletedLocation.size() + cleanLoc.size()); } // Add the remaining of the CD as a clear location if (remainingSize > 0) { cleanCDLocations.add(new Location(remainingStart, remainingSize)); } // Step 3: write clean CD chunks for (Location toWrite : cleanCDLocations) { buf.limit(Math.toIntExact(toWrite.first + toWrite.size())); buf.position(Math.toIntExact(toWrite.first)); ByteBuffer view = buf.slice(); writer.write(view); } // Step 4: write new entries // Assess how much data the CD requires long totalSize = 0; for (CentralDirectoryRecord record : addedEntries.values()) { totalSize += record.getSize(); } // Generate the CD portion of new entries ByteBuffer cdBuffer = ByteBuffer.allocate(Math.toIntExact(totalSize)).order(ByteOrder.LITTLE_ENDIAN); for (CentralDirectoryRecord record : addedEntries.values()) { record.write(cdBuffer); } // Write new entries cdBuffer.rewind(); writer.write(cdBuffer); } void add(@NonNull String name, @NonNull CentralDirectoryRecord record) { addedEntries.put(name, record); } boolean contains(@NonNull String name) { return entries.containsKey(name) || addedEntries.containsKey(name); } @NonNull List listEntries() { List list = new ArrayList<>(); list.addAll(entries.keySet()); list.addAll(addedEntries.keySet()); return list; } @Nullable public ExtractionInfo getExtractionInfo(@NonNull String name) { Entry entry = entries.get(name); if (entry != null) { return new ExtractionInfo(entry.getPayloadLocation(), entry.isCompressed()); } CentralDirectoryRecord cd = addedEntries.get(name); if (cd != null) { boolean isCompressed = cd.getCompressionFlag() != LocalFileHeader.COMPRESSION_NONE; return new ExtractionInfo(cd.getPayloadLocation(), isCompressed); } return null; } } zipflinger-7.2.2/src/com/android/zipflinger/CentralDirectoryRecord.java000066400000000000000000000116221430664457700263320ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.nio.ByteBuffer; import java.nio.ByteOrder; class CentralDirectoryRecord { public static final int SIGNATURE = 0x02014b50; public static final int SIZE = 46; public static final int DATA_DESCRIPTOR_FLAG = 0x0008; public static final int DATA_DESCRIPTOR_SIGNATURE = 0x08074b50; // JDK 9 consider time&data field with value 0 as invalid. Use 1 instead. // These are in MS-DOS 16-bit format. For actual specs, see: // https://msdn.microsoft.com/en-us/library/windows/desktop/ms724247(v=vs.85).aspx public static final short DEFAULT_TIME = 1 | 1 << 5 | 1 << 11; public static final short DEFAULT_DATE = 1 | 1 << 5 | 1 << 9; // Zip64 extra format: // uint16_t id (0x0001) // uint16_t size payload (0x18) // Payload: // - uint64_t Uncompressed size. // - uint64_t Compressed size. // - uint64_t offset to LFH in archive. private static final int ZIP64_PAYLOAD_SIZE = Long.BYTES * 3; private static final int ZIP64_EXTRA_SIZE = Short.BYTES * 2 + ZIP64_PAYLOAD_SIZE; private final byte[] nameBytes; private final int crc; private final long compressedSize; private final long uncompressedSize; // Location of the Local file header to end of payload in file space. private final Location location; private final short compressionFlag; private final short versionMadeBy; private final int externalAttribute; private final Location payloadLocation; private final boolean isZip64; CentralDirectoryRecord(@NonNull Source source, Location location, Location payloadLocation) { this.nameBytes = source.getNameBytes(); this.crc = source.getCrc(); this.compressedSize = source.getCompressedSize(); this.uncompressedSize = source.getUncompressedSize(); this.location = location; this.compressionFlag = source.getCompressionFlag(); this.payloadLocation = payloadLocation; this.isZip64 = compressedSize > Zip64.LONG_MAGIC || uncompressedSize > Zip64.LONG_MAGIC || location.first > Zip64.LONG_MAGIC; this.versionMadeBy = source.getVersionMadeBy(); this.externalAttribute = source.getExternalAttributes(); } void write(@NonNull ByteBuffer buf) { short versionNeeded = isZip64 ? Zip64.VERSION_NEEDED : 0; int size = isZip64 ? Zip64.INT_MAGIC : Ints.longToUint(uncompressedSize); int csize = isZip64 ? Zip64.INT_MAGIC : Ints.longToUint(compressedSize); int offset = isZip64 ? Zip64.INT_MAGIC : Ints.longToUint(location.first); ByteBuffer extra = buildExtraField(); buf.putInt(SIGNATURE); buf.putShort(versionMadeBy); buf.putShort(versionNeeded); buf.putShort((short) 0); // flag buf.putShort(compressionFlag); buf.putShort(DEFAULT_TIME); buf.putShort(DEFAULT_DATE); buf.putInt(crc); buf.putInt(csize); // compressed size buf.putInt(size); // size buf.putShort(Ints.intToUshort(nameBytes.length)); buf.putShort(Ints.intToUshort(extra.capacity())); buf.putShort((short) 0); // comment size buf.putShort((short) 0); // disk # start buf.putShort((short) 0); // internal att buf.putInt(externalAttribute); buf.putInt(offset); buf.put(nameBytes); buf.put(extra); } short getCompressionFlag() { return compressionFlag; } long getSize() { long extraSize = isZip64 ? ZIP64_EXTRA_SIZE : 0; return SIZE + nameBytes.length + extraSize; } @NonNull Location getPayloadLocation() { return payloadLocation; } @NonNull Location getLocation() { return location; } @NonNull private ByteBuffer buildExtraField() { if (!isZip64) { return ByteBuffer.allocate(0); } ByteBuffer buf = ByteBuffer.allocate(ZIP64_EXTRA_SIZE).order(ByteOrder.LITTLE_ENDIAN); buf.putShort(Zip64.EXTRA_ID); buf.putShort(Ints.intToUshort(ZIP64_PAYLOAD_SIZE)); buf.putLong(uncompressedSize); buf.putLong(compressedSize); buf.putLong(location.first); buf.rewind(); return buf; } } zipflinger-7.2.2/src/com/android/zipflinger/Compressor.java000066400000000000000000000066641430664457700240640ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; import java.util.zip.InflaterOutputStream; public class Compressor { @NonNull public static ByteBuffer deflate( @NonNull byte[] bytes, int offset, int size, int compressionLevel) throws IOException { NoCopyByteArrayOutputStream out = new NoCopyByteArrayOutputStream(size); Deflater deflater = new Deflater(compressionLevel, true); try (DeflaterOutputStream dout = new DeflaterOutputStream(out, deflater)) { dout.write(bytes, offset, size); dout.flush(); } return out.getByteBuffer(); } @NonNull public static ByteBuffer deflate(@NonNull byte[] bytes, int compressionLevel) throws IOException { return deflate(bytes, 0, bytes.length, compressionLevel); } @NonNull public static ByteBuffer inflate(@NonNull byte[] bytes) throws IOException { NoCopyByteArrayOutputStream out = new NoCopyByteArrayOutputStream(bytes.length); Inflater inflater = new Inflater(true); try (InflaterOutputStream dout = new InflaterOutputStream(out, inflater)) { dout.write(bytes); dout.flush(); } return out.getByteBuffer(); } // Exhaust input content into output, inflate / deflate data as needed. // Closes both streams once piping is done. public static void pipe( @NonNull InputStream in, @NonNull OutputStream out, boolean inDeflated, int outputCompression) throws IOException { Inflater inflater = new Inflater(true); Deflater deflater = new Deflater(outputCompression, true); boolean outDeflated = outputCompression != Deflater.NO_COMPRESSION; try (InputStream ins = inDeflated ? new InflaterInputStream(in, inflater) : in; OutputStream outs = outDeflated ? new DeflaterOutputStream(out, deflater) : out) { byte[] buffer = new byte[8192]; int read; while ((read = ins.read(buffer)) != -1) { outs.write(buffer, 0, read); } } } // Is it the caller's responsibility to close() the returned InputStream. @NonNull static InputStream wrapToInflate(@NonNull InputStream inputStream) { Inflater inflater = new Inflater(true); return new InflaterInputStream(inputStream, inflater); } @NonNull static Deflater getDeflater(int compressionLevel) { return new Deflater(compressionLevel, true); } private Compressor() {} } zipflinger-7.2.2/src/com/android/zipflinger/Crc32.java000066400000000000000000000020611430664457700225670ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.util.zip.CRC32; class Crc32 { public static int crc32(@NonNull byte[] bytes) { return crc32(bytes, 0, bytes.length); } public static int crc32(@NonNull byte[] bytes, int offset, int size) { CRC32 crc = new CRC32(); crc.update(bytes, offset, size); return Ints.longToUint(crc.getValue()); } private Crc32() {} } zipflinger-7.2.2/src/com/android/zipflinger/EndOfCentralDirectory.java000066400000000000000000000103561430664457700261120ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.FileChannel; class EndOfCentralDirectory { private static final int SIGNATURE = 0x06054b50; static final int SIZE = 22; private static final long MAX_SIZE = Ints.USHRT_MAX + SIZE; static final short DISK_NUMBER = 0; private int numEntries; private Location location; private Location cdLocation; private EndOfCentralDirectory() { this.numEntries = 0; this.location = Location.INVALID; this.cdLocation = Location.INVALID; } private void parse(@NonNull ByteBuffer buffer) { // skip diskNumber (2) + cdDiskNumber (2) + #entries (2) buffer.position(buffer.position() + 6); numEntries = Ints.ushortToInt(buffer.getShort()); long cdSize = Ints.uintToLong(buffer.getInt()); long cdOffset = Ints.uintToLong(buffer.getInt()); cdLocation = new Location(cdOffset, cdSize); buffer.position(buffer.position() + 2); // Skip comment length } @NonNull public Location getLocation() { return location; } @NonNull public Location getCdLocation() { return cdLocation; } public int numEntries() { return numEntries; } public void setLocation(@NonNull Location location) { this.location = location; } // Search the EOCD. If not found the returned object location will be set to Location.INVALID. @NonNull public static EndOfCentralDirectory find(@NonNull FileChannel channel) throws IOException { long fileSize = channel.size(); EndOfCentralDirectory eocd = new EndOfCentralDirectory(); if (fileSize < SIZE) { return eocd; } int sizeToRead = Math.toIntExact(Math.min(fileSize, MAX_SIZE)); long offset = fileSize - sizeToRead; ByteBuffer buffer = ByteBuffer.allocate(sizeToRead).order(ByteOrder.LITTLE_ENDIAN); channel.read(buffer, offset); buffer.position(buffer.capacity() - SIZE); while (true) { int signature = buffer.getInt(); // Read 4 bytes. if (signature == EndOfCentralDirectory.SIGNATURE) { eocd.parse(buffer); eocd.setLocation(new Location(offset + buffer.position() - SIZE, SIZE)); break; } if (buffer.position() <= 4) { break; } buffer.position(buffer.position() - Integer.BYTES - 1); // Backtrack 5 bytes. } return eocd; } @NonNull public static Location write( @NonNull ZipWriter writer, @NonNull Location cdLocation, long entriesCount) throws IOException { boolean isZip64 = Zip64.needZip64Footer(entriesCount, cdLocation); short numEntries = isZip64 ? Zip64.SHORT_MAGIC : Ints.longToUshort(entriesCount); int eocdSize = isZip64 ? Zip64.INT_MAGIC : Ints.longToUint(cdLocation.size()); int eocdOffset = isZip64 ? Zip64.INT_MAGIC : Ints.longToUint(cdLocation.first); ByteBuffer eocd = ByteBuffer.allocate(SIZE).order(ByteOrder.LITTLE_ENDIAN); eocd.putInt(SIGNATURE); eocd.putShort(DISK_NUMBER); eocd.putShort((short) 0); // cd disk number eocd.putShort(numEntries); eocd.putShort(numEntries); eocd.putInt(eocdSize); eocd.putInt(eocdOffset); eocd.putShort((short) 0); // comment size eocd.rewind(); long position = writer.position(); writer.write(eocd); return new Location(position, SIZE); } } zipflinger-7.2.2/src/com/android/zipflinger/Entry.java000066400000000000000000000065131430664457700230220ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.nio.charset.StandardCharsets; public class Entry { // The location (in file space) of the zip entry which includes the LFH, payload and // Data descriptor. private Location location = Location.INVALID; // The location (in CD space) of this entry in the CD. private Location cdLocation = Location.INVALID; // The location (in file space) of the zip entry payload (the actual file data). private Location payloadLocation = Location.INVALID; private String name = ""; private int crc; private long compressedSize; private long uncompressedSize; private short compressionFlag; private short versionMadeBy; private int externalAttributes; Entry() {} public short getCompressionFlag() { return compressionFlag; } public long getCompressedSize() { return compressedSize; } public long getUncompressedSize() { return uncompressedSize; } public String getName() { return name; } public int getCrc() { return crc; } public boolean isDirectory() { return name.charAt(name.length() - 1) == '/'; } public boolean isCompressed() { return compressionFlag != LocalFileHeader.COMPRESSION_NONE; } @NonNull Location getCdLocation() { return cdLocation; } @NonNull Location getLocation() { return location; } @NonNull public Location getPayloadLocation() { return payloadLocation; } void setCdLocation(@NonNull Location cdLocation) { this.cdLocation = cdLocation; } void setNameBytes(@NonNull byte[] nameBytes) { this.name = new String(nameBytes, StandardCharsets.UTF_8); } void setCrc(int crc) { this.crc = crc; } void setPayloadLocation(@NonNull Location payloadLocation) { this.payloadLocation = payloadLocation; } void setCompressionFlag(short compressionFlag) { this.compressionFlag = compressionFlag; } void setCompressedSize(long compressedSize) { this.compressedSize = compressedSize; } void setUncompressedSize(long ucompressedSize) { this.uncompressedSize = ucompressedSize; } void setLocation(@NonNull Location location) { this.location = location; } void setVersionMadeBy(short versionMadeByFlag) { this.versionMadeBy = versionMadeByFlag; } void setExternalAttributes(int externalAttributes) { this.externalAttributes = externalAttributes; } short getVersionMadeBy() { return versionMadeBy; } int getExternalAttributes() { return externalAttributes; } } zipflinger-7.2.2/src/com/android/zipflinger/ExtractionInfo.java000066400000000000000000000021361430664457700246520ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; public class ExtractionInfo { private final Location location; private final boolean isCompressed; public ExtractionInfo(@NonNull Location location, boolean isCompressed) { this.location = location; this.isCompressed = isCompressed; } @NonNull public Location getLocation() { return location; } public boolean isCompressed() { return isCompressed; } } zipflinger-7.2.2/src/com/android/zipflinger/FreeStore.java000066400000000000000000000173771430664457700236310ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; // This works like a memory allocator except it deals with file address space instead of // memory address space. class FreeStore { static final long DEFAULT_ALIGNMENT = 4; static final long PAGE_ALIGNMENT = 4096; private Zone head; // A zone tracks the free file address space. Two consecutive zones are never contiguous which // mean that upon modification, if two zone "touch" each others, they are merged together into // a bigger free zone. // // Used space is not tracked but inferred from each gap between free zones. protected static class Zone { public Zone next; public Zone prev; public Location loc; public Zone() { this.next = null; this.prev = null; } public void shrinkBy(long amount) { assert loc.size() > amount; loc = new Location(loc.first + amount, loc.size() - amount); // If the zone is empty, remove it from the list. if (loc.size() == 0) { prev.next = next; if (next != null) { next.prev = prev; } } } } FreeStore(@NonNull Map zipEntries) { // Create an immutable marker of unusable space which make "insert on head" ugly code go away. head = new Zone(); head.loc = new Location(-1, 1); // Use zip entries location (used space) to build the free zones list. List usedLocations = new ArrayList<>(); for (Entry entry : zipEntries.values()) { usedLocations.add(entry.getLocation()); } Collections.sort(usedLocations); Zone prevFreeZone = head; Location prevUsedLoc = prevFreeZone.loc; for (Location usedLoc : usedLocations) { // If there is a gap, mark is as FREE space. long gap = usedLoc.first - prevUsedLoc.last - 1; if (gap > 0) { Zone free = new Zone(); prevFreeZone.next = free; free.prev = prevFreeZone; free.loc = new Location(prevUsedLoc.last + 1, gap); prevFreeZone = free; } prevUsedLoc = usedLoc; } // Mark everything remaining as a free zone. Zone remainingZone = new Zone(); remainingZone.prev = prevFreeZone; remainingZone.next = null; prevFreeZone.next = remainingZone; remainingZone.loc = new Location(prevUsedLoc.last + 1, Long.MAX_VALUE - 1 - prevUsedLoc.last); } // Performs unaligned allocation. @NonNull Location ualloc(long requestedSize) { Zone cursor; for (cursor = head.next; cursor != null; cursor = cursor.next) { // We are searching for a block big enough to contain: // - The requested size // - Post-padding space for potentially needed virtual entry to fill holes. if (cursor.loc.size() >= requestedSize + LocalFileHeader.VIRTUAL_HEADER_SIZE) { break; } } if (cursor == null) { throw new IllegalStateException("Out of file address space."); } Location allocated = new Location(cursor.loc.first, requestedSize); cursor.shrinkBy(requestedSize); return allocated; } // Performs aligned allocation. The offset is necessary because what needs to be aligned is not // the first byte in the allocation but the first byte in the zip entry payload. // This method may return more than requested. If it does the extra space is padding that must // be consumed by an "extra" field. @NonNull Location alloc(long requestedSize, long payloadOffset, long alignment) { Zone cursor; for (cursor = head.next; cursor != null; cursor = cursor.next) { long padding = padFor(cursor.loc.first, payloadOffset, alignment); // We are searching for a block big enough to contain: // - The requested size // - Pre-padding space for extra field ALIGNMENT // - Post-padding space for potentially needed virtual entry to fill holes. if (cursor.loc.size() >= requestedSize + padding + LocalFileHeader.VIRTUAL_HEADER_SIZE) { requestedSize += padding; break; } } if (cursor == null) { throw new IllegalStateException("Out of file address space."); } Location allocated = new Location(cursor.loc.first, requestedSize); cursor.shrinkBy(requestedSize); return allocated; } // Mark an area of the file available for allocation. This will merge up to two zones into one // if they touch each others. void free(@NonNull Location loc) { Zone cursor = head.next; while (cursor != null) { if (loc.first > cursor.prev.loc.last && loc.last < cursor.loc.first) { break; } cursor = cursor.next; } if (cursor == null) { throw new IllegalStateException("Double free"); } // Insert a free zone Zone newFreeZone = new Zone(); newFreeZone.loc = loc; newFreeZone.prev = cursor.prev; newFreeZone.next = cursor; cursor.prev.next = newFreeZone; cursor.prev = newFreeZone; cursor = newFreeZone; // If previous zone is contiguous, merge this zone into previous. if (cursor.prev.loc.last + 1 == cursor.loc.first && cursor.prev != head) { Zone prev = cursor.prev; prev.next = cursor.next; cursor.next.prev = prev; prev.loc = new Location(prev.loc.first, prev.loc.size() + cursor.loc.size()); cursor = prev; } // If next zone is contiguous, merge this zone into next. if (cursor.next != null && cursor.next.loc.first - 1 == cursor.loc.last) { Zone next = cursor.next; next.prev = cursor.prev; cursor.prev.next = next; next.loc = new Location(cursor.loc.first, cursor.loc.size() + next.loc.size()); } } @NonNull Location getLastFreeLocation() { Zone zone = head.next; while (zone.next != null) { zone = zone.next; } return zone.loc; } @NonNull List getFreeLocations() { List locs = new ArrayList<>(); Zone cursor = head.next; while (cursor != null) { locs.add(cursor.loc); cursor = cursor.next; } return locs; } // How much padding is needed if this address+offset is not aligned (a.k.a: An extra field will // have to be created in order to fill this space). static long padFor(long address, long offset, long alignment) { long pointer = address + offset; if ((pointer % alignment) == 0) { return 0; } else { return alignment - (pointer % alignment); } } } zipflinger-7.2.2/src/com/android/zipflinger/FullFileSource.java000066400000000000000000000036701430664457700246050ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.zip.Deflater; public class FullFileSource extends BytesSource { public enum Symlink { FOLLOW, DO_NOT_FOLLOW }; public FullFileSource(@NonNull Path file, @NonNull String entryName, int compressionLevel) throws IOException { this(file, entryName, compressionLevel, Symlink.FOLLOW); } public FullFileSource( @NonNull Path file, @NonNull String entryName, int compressionLevel, Symlink symlinkPolicy) throws IOException { super(entryName); if (Files.isExecutable(file)) { externalAttributes |= PERMISSION_EXEC; } byte[] bytes; if (!Files.isSymbolicLink(file) || symlinkPolicy == Symlink.FOLLOW) { bytes = Files.readAllBytes(file); } else { externalAttributes |= PERMISSION_LINK; compressionLevel = Deflater.NO_COMPRESSION; Path target = Files.readSymbolicLink(file); bytes = target.toString().getBytes(StandardCharsets.US_ASCII); } build(bytes, bytes.length, compressionLevel); } } zipflinger-7.2.2/src/com/android/zipflinger/Ints.java000066400000000000000000000033401430664457700226310ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; class Ints { public static final long USHRT_MAX = 65_535L; public static final long UINT_MAX = 0xFF_FF_FF_FFL; static long uintToLong(int i) { return i & 0xFF_FF_FF_FFL; } static int ushortToInt(short i) { return i & 0xFF_FF; } static int longToUint(long i) { if ((i & 0xFF_FF_FF_FF_00_00_00_00L) != 0) { throw new IllegalStateException("Long cannot fit in uint"); } return (int) i; } static short intToUshort(int i) { if ((i & 0xFF_FF_00_00) != 0) { throw new IllegalStateException("Int cannot fit in ushort"); } return (short) i; } static short longToUshort(long i) { if ((i & 0xFF_FF_FF_FF_FF_FF_00_00L) != 0) { throw new IllegalStateException("long cannot fit in ushort"); } return (short) i; } public static long ulongToLong(long i) { if ((i & 0x80_00_00_00_00_00_00_00L) != 0) { throw new IllegalStateException("ulong cannot fit in long"); } return i; } private Ints() {} } zipflinger-7.2.2/src/com/android/zipflinger/LargeFileSource.java000066400000000000000000000130121430664457700247240ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import com.android.annotations.Nullable; import java.io.IOException; import java.io.InputStream; import java.nio.channels.FileChannel; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.Locale; import java.util.zip.CRC32; import java.util.zip.CheckedInputStream; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; public class LargeFileSource extends Source { private final Path transferSrc; private final int compressionLevel; private static final String TMP_DIR = System.getProperty("java.io.tmpdir"); // Does not load the whole file in memory. If the entry is not compressed, only read it to // compute the CRC32 and zero-copy src when needed. If compression is requested, uses a tmp // storage to store the deflated payload then zero-copy it when needed. public LargeFileSource( @NonNull Path src, @Nullable Path tmpStorage, @NonNull String name, int compressionLevel) throws IOException { super(name); this.compressionLevel = compressionLevel; if (tmpStorage == null && compressionLevel != Deflater.NO_COMPRESSION) { String msg = "Compression without a provided tmp Path is not supported"; throw new IllegalStateException(msg); } try (CheckedInputStream in = new CheckedInputStream(Files.newInputStream(src), new CRC32())) { if (compressionLevel == Deflater.NO_COMPRESSION) { buildStored(in); transferSrc = src; } else { buildCompressed(in, compressionLevel, tmpStorage); transferSrc = tmpStorage; } // At this point the input file has been completely read. We can request the crc32. crc = Ints.longToUint(in.getChecksum().getValue()); } } public LargeFileSource(@NonNull Path src, @NonNull String name, int compressionLevel) throws IOException { this(src, getTmpStoragePath(src.getFileName().toString()), name, compressionLevel); } @NonNull public static Path getTmpStoragePath(@NonNull String entryName) { StringBuilder filename = new StringBuilder(); filename.append(Integer.toHexString(entryName.hashCode())); filename.append("-"); filename.append(Thread.currentThread().getId()); filename.append("-"); filename.append(System.nanoTime()); filename.append(".tmp"); Path tmp = Paths.get(TMP_DIR, filename.toString()); if (Files.exists(tmp)) { String msg = String.format(Locale.US, "Cannot use path '%s' (exists)", tmp); throw new IllegalStateException(msg); } return tmp; } private void buildStored(@NonNull InputStream in) throws IOException { byte[] buffer = new byte[4096]; long inputSize = 0; int read; while ((read = in.read(buffer)) != -1) { inputSize += read; } compressedSize = inputSize; uncompressedSize = compressedSize; compressionFlag = LocalFileHeader.COMPRESSION_NONE; } private void buildCompressed(@NonNull InputStream in, int compressionLevel, @NonNull Path tmp) throws IOException { // Make sure we are not going to overwrite another tmp file. if (Files.exists(tmp)) { String msg = String.format("Tmp storage '%s' already exists", tmp.toAbsolutePath()); throw new IllegalStateException(msg); } // Pipe the src into the tmp compressed file. Deflater deflater = Compressor.getDeflater(compressionLevel); try (DeflaterOutputStream out = new DeflaterOutputStream( Files.newOutputStream(tmp, StandardOpenOption.CREATE_NEW), deflater)) { // Just in case we crash before writeTo is called, attempt to clean up on VM exit. tmp.toFile().deleteOnExit(); int read; byte[] buffer = new byte[4096]; while ((read = in.read(buffer)) != -1) { out.write(buffer, 0, read); } } compressedSize = deflater.getBytesWritten(); uncompressedSize = deflater.getBytesRead(); compressionFlag = LocalFileHeader.COMPRESSION_DEFLATE; } @Override public void prepare() throws IOException {} @Override public long writeTo(@NonNull ZipWriter writer) throws IOException { try (FileChannel src = FileChannel.open(transferSrc, StandardOpenOption.READ)) { writer.transferFrom(src, 0, this.compressedSize); return this.compressedSize; } finally { if (compressionLevel != Deflater.NO_COMPRESSION) { Files.delete(transferSrc); } } } } zipflinger-7.2.2/src/com/android/zipflinger/LocalFileHeader.java000066400000000000000000000132131430664457700246570ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; class LocalFileHeader { private static final int SIGNATURE = 0x04034b50; public static final int LOCAL_FILE_HEADER_SIZE = 30; // Minimum number of bytes needed to create a virtual zip entry (an entry not present in // the Central Directory with name length = 0 and an extra field containing padding data). public static final long VIRTUAL_HEADER_SIZE = LOCAL_FILE_HEADER_SIZE; public static final short COMPRESSION_NONE = 0; public static final short COMPRESSION_DEFLATE = 8; static final long VIRTUAL_ENTRY_MAX_SIZE = LOCAL_FILE_HEADER_SIZE + Ints.USHRT_MAX; static final long OFFSET_TO_NAME = 26; // Zip64 extra payload must only include uncompressed size and compressed size. It differs // from the Central Directory Record which also features an uint64_t offset to the LFH. private static final int ZIP64_PAYLOAD_SIZE = Long.BYTES * 2; private static final int ZIP64_EXTRA_SIZE = Short.BYTES * 2 + ZIP64_PAYLOAD_SIZE; private final byte[] nameBytes; private final short compressionFlag; private final int crc; private final long compressedSize; private final long uncompressedSize; private final boolean isZip64; private int padding; LocalFileHeader(Source source) { this.nameBytes = source.getNameBytes(); this.compressionFlag = source.getCompressionFlag(); this.crc = source.getCrc(); this.compressedSize = source.getCompressedSize(); this.uncompressedSize = source.getUncompressedSize(); this.isZip64 = compressedSize > Zip64.LONG_MAGIC || uncompressedSize > Zip64.LONG_MAGIC; this.padding = 0; } public static void fillVirtualEntry(@NonNull ByteBuffer virtualEntry) { int sizeToFill = virtualEntry.capacity(); if (sizeToFill < VIRTUAL_HEADER_SIZE) { String message = String.format("Not enough space for virtual entry (%d)", sizeToFill); throw new IllegalStateException(message); } virtualEntry.order(ByteOrder.LITTLE_ENDIAN); virtualEntry.putInt(SIGNATURE); virtualEntry.putShort((short) 0); // Version needed virtualEntry.putShort((short) 0); // general purpose flag virtualEntry.putShort(COMPRESSION_NONE); virtualEntry.putShort(CentralDirectoryRecord.DEFAULT_TIME); virtualEntry.putShort(CentralDirectoryRecord.DEFAULT_DATE); virtualEntry.putInt(0); // CRC-32 virtualEntry.putInt(0); // compressed size virtualEntry.putInt(0); // uncompressed size virtualEntry.putShort((short) 0); // file name length // -2 for the extra length ushort we have to write virtualEntry.putShort(Ints.intToUshort(virtualEntry.remaining() - 2)); // extra length virtualEntry.rewind(); } public void setPadding(int padding) { if (padding > Ints.USHRT_MAX) { String err = String.format("Padding cannot be more than %s bytes", Ints.USHRT_MAX); throw new IllegalStateException(err); } this.padding = padding; } public void write(@NonNull ZipWriter writer) throws IOException { ByteBuffer extraField = buildExtraField(); int bytesNeeded = LOCAL_FILE_HEADER_SIZE + nameBytes.length + extraField.capacity(); short versionNeeded = isZip64 ? Zip64.VERSION_NEEDED : 0; int size = isZip64 ? Zip64.INT_MAGIC : Ints.longToUint(uncompressedSize); int csize = isZip64 ? Zip64.INT_MAGIC : Ints.longToUint(compressedSize); ByteBuffer buffer = ByteBuffer.allocate(bytesNeeded).order(ByteOrder.LITTLE_ENDIAN); buffer.putInt(SIGNATURE); buffer.putShort(versionNeeded); buffer.putShort((short) 0); // general purpose flag buffer.putShort(compressionFlag); buffer.putShort(CentralDirectoryRecord.DEFAULT_TIME); buffer.putShort(CentralDirectoryRecord.DEFAULT_DATE); buffer.putInt(crc); buffer.putInt(csize); // compressed size buffer.putInt(size); // size buffer.putShort(Ints.intToUshort(nameBytes.length)); buffer.putShort(Ints.intToUshort(extraField.capacity())); // Extra size buffer.put(nameBytes); buffer.put(extraField); buffer.rewind(); writer.write(buffer); } public long getSize() { long extraSize = isZip64 ? ZIP64_EXTRA_SIZE : 0; return LOCAL_FILE_HEADER_SIZE + nameBytes.length + extraSize; } @NonNull private ByteBuffer buildExtraField() { if (!isZip64) { return ByteBuffer.allocate(padding); } ByteBuffer zip64extra = ByteBuffer.allocate(ZIP64_EXTRA_SIZE + padding); zip64extra.order(ByteOrder.LITTLE_ENDIAN); zip64extra.putShort(Zip64.EXTRA_ID); zip64extra.putShort(Ints.intToUshort(ZIP64_PAYLOAD_SIZE)); zip64extra.putLong(uncompressedSize); zip64extra.putLong(compressedSize); zip64extra.rewind(); return zip64extra; } } zipflinger-7.2.2/src/com/android/zipflinger/Location.java000066400000000000000000000036521430664457700234720ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.text.NumberFormat; public class Location implements Comparable { public static final Location INVALID = new Location(Long.MAX_VALUE, Long.MAX_VALUE); public final long first; public final long last; public Location(long first, long size) { this.first = first; this.last = first + size - 1; } public long size() { return last - first + 1; } public boolean isValid() { return !this.equals(INVALID); } @NonNull @Override public String toString() { return "(offset=" + NumberFormat.getInstance().format(first) + ", size=" + NumberFormat.getInstance().format(size()) + ")"; } @Override public boolean equals(@NonNull Object obj) { if (this == obj) { return true; } if (!(obj instanceof Location)) { return false; } Location other = (Location) obj; return first == other.first && last == other.last; } @Override public int hashCode() { return Long.hashCode(first); } @Override public int compareTo(Location o) { return Math.toIntExact(this.first - o.first); } } zipflinger-7.2.2/src/com/android/zipflinger/NoCopyByteArrayOutputStream.java000066400000000000000000000024271430664457700273500ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.ByteArrayOutputStream; import java.nio.ByteBuffer; // A class which contrary to ByteArrayOutputStream allows to peek into the buffer // without performing a full copy of the content. This stream does not need to be closed. public class NoCopyByteArrayOutputStream extends ByteArrayOutputStream { public NoCopyByteArrayOutputStream(int size) { super(size); } @NonNull public byte[] buf() { return buf; } public int getCount() { return count; } public ByteBuffer getByteBuffer() { return ByteBuffer.wrap(buf, 0, count); } } zipflinger-7.2.2/src/com/android/zipflinger/PayloadInputStream.java000066400000000000000000000045241430664457700255060ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; /* * A wrapper around a FileChannel providing a bounded view of * it according to the provided Location. * * Does not need to be closed. And does not close the wrapped * channel either. */ public class PayloadInputStream extends InputStream { private FileChannel channel; private Location boundaries; private long position; public PayloadInputStream(@NonNull FileChannel channel, @NonNull Location location) throws IOException { this.channel = channel; this.boundaries = location; this.position = location.first; if (location.first < 0 || location.last >= channel.size()) { throw new IllegalStateException("Location not within channel boundaries"); } } @Override public int read() throws IOException { if (position > boundaries.last) { return -1; } byte[] buffer = new byte[1]; read(buffer); // Convert from [-128, 127] to [0-255] according to InputStream requirements. return buffer[0] & 0xFF; } @Override public int read(byte[] b, int off, int len) throws IOException { if (position > boundaries.last) { return -1; } long available = boundaries.last - position + 1; available = Math.min(available, Integer.MAX_VALUE); int toRead = Math.min(Math.toIntExact(available), len); ByteBuffer buffer = ByteBuffer.wrap(b, off, toRead); int read = channel.read(buffer, position); position += read; return read; } } zipflinger-7.2.2/src/com/android/zipflinger/Source.java000066400000000000000000000102621430664457700231550ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.IOException; import java.nio.charset.StandardCharsets; public abstract class Source { private final String name; private final byte[] nameBytes; public static final long NO_ALIGNMENT = 0; private long alignment = NO_ALIGNMENT; protected long compressedSize; protected long uncompressedSize; protected int crc; protected short compressionFlag; protected short versionMadeBy; public static final short MADE_BY_UNIX = 3 << 8; // For more of these magical values, see zipinfo.c in unzip source code. // All these values are shifted left 16 bits because this is where they // are expected in the zip external attribute field. private static final int TYPE_FREG = 0100000; // Regular File private static final int TYPE_FLNK = 0120000; // Symbolic link private static final int UNX_IRUSR = 00400; /* Unix read : owner */ private static final int UNX_IWUSR = 00200; /* Unix write : owner */ private static final int UNX_IXUSR = 00100; /* Unix execute : owner */ private static final int UNX_IRGRP = 00040; /* Unix read : group */ private static final int UNX_IWGRP = 00020; /* Unix write : group */ private static final int UNX_IXGRP = 00010; /* Unix execute : group */ private static final int UNX_IROTH = 00004; /* Unix read : other */ private static final int UNX_IWOTH = 00002; /* Unix write : other */ private static final int UNX_IXOTH = 00001; /* Unix execute : other */ private static final int UNX_IRALL = UNX_IRUSR | UNX_IRGRP | UNX_IROTH; private static final int UNX_IWALL = UNX_IWUSR | UNX_IWGRP | UNX_IWOTH; public static final int PERMISSION_USR_RW = (UNX_IRUSR | UNX_IWUSR) << 16; public static final int PERMISSION_RW = (UNX_IRALL | UNX_IWALL) << 16; public static final int PERMISSION_EXEC = (UNX_IXUSR | UNX_IXGRP | UNX_IXOTH) << 16; public static final int PERMISSION_LINK = TYPE_FLNK << 16; public static final int PERMISSION_DEFAULT = (TYPE_FREG << 16) | PERMISSION_RW; protected int externalAttributes; protected Source(@NonNull String name) { this.name = name; nameBytes = name.getBytes(StandardCharsets.UTF_8); versionMadeBy = MADE_BY_UNIX; externalAttributes = PERMISSION_DEFAULT; } @NonNull public String getName() { return name; } @NonNull byte[] getNameBytes() { return nameBytes; } boolean isAligned() { return alignment != NO_ALIGNMENT; } public void align(long alignment) { this.alignment = alignment; } long getAlignment() { return alignment; } int getCrc() { return crc; } public long getCompressedSize() { return compressedSize; } public long getUncompressedSize() { return uncompressedSize; } short getCompressionFlag() { return compressionFlag; } public short getVersionMadeBy() { return versionMadeBy; } public int getExternalAttributes() { return externalAttributes; } public void setExternalAttributes(int externalAttributes) { this.externalAttributes = externalAttributes; } // Guaranteed to be called before writeTo. After this method has been called, every fields // in an entry must be known (csize, size, crc32, and compressionFlag). public abstract void prepare() throws IOException; // Return the number of bytes written. public abstract long writeTo(@NonNull ZipWriter writer) throws IOException; } zipflinger-7.2.2/src/com/android/zipflinger/Sources.java000066400000000000000000000035551430664457700233470ustar00rootroot00000000000000/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; public class Sources { // The general maximum amount of memory (in bytes) a Source should hold onto. public static final int LARGE_LIMIT = 100_000_000; public static Source from(File file, @NonNull String name, int compressionLevel) throws IOException { return from(file.toPath(), name, compressionLevel); } public static Source from(Path path, @NonNull String name, int compressionLevel) throws IOException { if (Files.size(path) > LARGE_LIMIT) { return new LargeFileSource(path, name, compressionLevel); } else { return new BytesSource(path, name, compressionLevel); } } public static Source from(InputStream in, String name, int compressionLevel) throws IOException { return from(in, name, compressionLevel, LARGE_LIMIT); } public static Source from(InputStream in, String name, int compressionLevel, int largeLimit) throws IOException { return new StreamSource(in, name, compressionLevel, largeLimit); } } zipflinger-7.2.2/src/com/android/zipflinger/StableArchive.java000066400000000000000000000043371430664457700244370ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.IOException; import java.util.ArrayList; import java.util.Comparator; public class StableArchive implements Archive { private final Archive archive; private final ArrayList sources; private final ArrayList zipSources; private final ArrayList deletedEntries; public StableArchive(Archive archive) { this.archive = archive; sources = new ArrayList<>(); zipSources = new ArrayList<>(); deletedEntries = new ArrayList<>(); } @Override public void add(@NonNull Source source) { sources.add(source); } @Override public void add(@NonNull ZipSource sources) { zipSources.add(sources); } @Override public void delete(@NonNull String name) { deletedEntries.add(name); } @Override public void close() throws IOException { sources.sort(Comparator.comparing(Source::getName)); zipSources.sort(Comparator.comparing(ZipSource::getName)); for (ZipSource zipSource : zipSources) { zipSource.getSelectedEntries().sort(Comparator.comparing(Source::getName)); } deletedEntries.sort(Comparator.naturalOrder()); try (Archive arch = archive) { for (String toDelete : deletedEntries) { arch.delete(toDelete); } for (Source source : sources) { arch.add(source); } for (ZipSource zipSource : zipSources) { arch.add(zipSource); } } } } zipflinger-7.2.2/src/com/android/zipflinger/StreamSource.java000066400000000000000000000102451430664457700243320ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import com.android.annotations.Nullable; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.zip.CRC32; import java.util.zip.CheckedInputStream; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; class StreamSource extends Source { private static final int TMP_BUFFER_SIZE = 4096; @NonNull private final NoCopyByteArrayOutputStream buffer; @Nullable private Path tmpStore = null; private long tmpStoreSize = 0; // Drain the InputStream until it is empty. Keep up to largeLimit bytes // in memory and use a backing storage if the InputStream is bigger. public StreamSource(@NonNull InputStream src, @NonNull String name, int compressionLevel, int largeLimit) throws IOException { super(name); buffer = new NoCopyByteArrayOutputStream(TMP_BUFFER_SIZE); long bytesRead = 0; try (CheckedInputStream in = new CheckedInputStream(src, new CRC32()); OutputStream out = getOutput(compressionLevel)) { int read; byte[] bytes = new byte[TMP_BUFFER_SIZE]; while ((read = in.read(bytes)) != -1) { out.write(bytes, 0, read); bytesRead += read; if (buffer.getCount() > largeLimit) { flushBuffer(); } } crc = Ints.longToUint(in.getChecksum().getValue()); } finally { src.close(); } compressedSize = buffer.getCount() + tmpStoreSize; uncompressedSize = bytesRead; if (compressionLevel == Deflater.NO_COMPRESSION) { compressionFlag = LocalFileHeader.COMPRESSION_NONE; } else { compressionFlag = LocalFileHeader.COMPRESSION_DEFLATE; } } private void flushBuffer() throws IOException { FileChannel fc; if (tmpStore == null) { tmpStore = LargeFileSource.getTmpStoragePath(getName()); fc = FileChannel.open(tmpStore, StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW); // Just in case we crash before writeTo is called, attempt to clean up on VM exit. tmpStore.toFile().deleteOnExit(); } else { fc = FileChannel.open(tmpStore, StandardOpenOption.APPEND); } try(FileChannel channel = fc) { ByteBuffer b = buffer.getByteBuffer(); tmpStoreSize += b.remaining(); channel.write(b); buffer.reset(); } } private OutputStream getOutput(int compressionLevel) { if (compressionLevel == Deflater.NO_COMPRESSION) { return buffer; } else { Deflater deflater = Compressor.getDeflater(compressionLevel); return new DeflaterOutputStream(buffer, deflater); } } @Override public void prepare() throws IOException {} @Override public long writeTo(@NonNull ZipWriter writer) throws IOException { if (tmpStore != null) { try (FileChannel src = FileChannel.open(tmpStore, StandardOpenOption.READ)) { writer.transferFrom(src, 0, tmpStoreSize); } finally { Files.delete(tmpStore); } } writer.write(buffer.getByteBuffer()); return buffer.getCount() + tmpStoreSize; } } zipflinger-7.2.2/src/com/android/zipflinger/SynchronizedArchive.java000066400000000000000000000027771430664457700257120ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.IOException; public class SynchronizedArchive implements Archive { private final Archive archive; public SynchronizedArchive(Archive archive) { this.archive = archive; } @Override public void add(@NonNull Source source) throws IOException { synchronized (archive) { archive.add(source); } } @Override public void add(@NonNull ZipSource sources) throws IOException { synchronized (archive) { archive.add(sources); } } @Override public void delete(@NonNull String name) throws IOException { synchronized (archive) { archive.delete(name); } } @Override public void close() throws IOException { synchronized (archive) { archive.close(); } } } zipflinger-7.2.2/src/com/android/zipflinger/Zip64.java000066400000000000000000000023411430664457700226300ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; public class Zip64 { static final short EXTRA_ID = 0x0001; static final long LONG_MAGIC = 0xFF_FF_FF_FFL; static final int INT_MAGIC = (int) LONG_MAGIC; static final int SHORT_MAGIC = (short) LONG_MAGIC; static final short VERSION_NEEDED = 0x2D; public static boolean needZip64Footer(long numEntries, Location cdLocation) { return numEntries > Ints.USHRT_MAX || cdLocation.first > Ints.UINT_MAX || cdLocation.size() > Ints.UINT_MAX; } public enum Policy { ALLOW, FORBID }; private Zip64() {} } zipflinger-7.2.2/src/com/android/zipflinger/Zip64Eocd.java000066400000000000000000000066671430664457700234420ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.FileChannel; public class Zip64Eocd { private static final int SIGNATURE = 0x06064b50; static final int SIZE = 56; private long numEntries; private Location cdLocation; public Zip64Eocd(long numEntries, @NonNull Location cdLocation) { this.numEntries = numEntries; this.cdLocation = cdLocation; } private Zip64Eocd() { this(0, Location.INVALID); } @NonNull public Location write(@NonNull ZipWriter writer) throws IOException { ByteBuffer eocd = ByteBuffer.allocate(SIZE).order(ByteOrder.LITTLE_ENDIAN); eocd.putInt(SIGNATURE); eocd.putLong(SIZE - 12); // Peculiar specs mandate not to include 12 bytes already written. eocd.putShort((short) 0); // Version made by eocd.putShort(Zip64.VERSION_NEEDED); // Version needed to extract eocd.putInt(0); // disk # eocd.putInt(0); // total # of disks eocd.putLong(numEntries); // # entries in cd on this disk eocd.putLong(numEntries); // total # entries in cd eocd.putLong(cdLocation.size()); // CD offset. eocd.putLong(cdLocation.first); // size of CD. eocd.rewind(); long position = writer.position(); writer.write(eocd); return new Location(position, SIZE); } @NonNull Location getCdLocation() { return cdLocation; } @NonNull static Zip64Eocd parse(@NonNull FileChannel channel, long eocdOffset) throws IOException { Zip64Eocd zip64Eocd = new Zip64Eocd(); long fileSize = channel.size(); if (eocdOffset < 0 || eocdOffset + SIZE > fileSize) { return zip64Eocd; } ByteBuffer buffer = ByteBuffer.allocate(SIZE).order(ByteOrder.LITTLE_ENDIAN); channel.read(buffer, eocdOffset); buffer.rewind(); int signature = buffer.getInt(); // signature if (signature != SIGNATURE) { return zip64Eocd; } // Skip uninteresting fields buffer.position(buffer.position() + 28); // eocd.getLong(); 8 // size of zip64EOCD // eocd.getShort(); 2 // Version made by // eocd.getShort(); 2 // Version needed to extract // eocd.getInt(); 4 // disk # // eocd.getInt(); 4 // total # of disks // eocd.getLong(); 8 // # entries in cd on this disk long numEntries = buffer.getLong(); // total # entries in cd long size = Ints.ulongToLong(buffer.getLong()); // size of CD. long offset = Ints.ulongToLong(buffer.getLong()); // CD offset. zip64Eocd.numEntries = numEntries; zip64Eocd.cdLocation = new Location(offset, size); return zip64Eocd; } } zipflinger-7.2.2/src/com/android/zipflinger/Zip64Locator.java000066400000000000000000000057751430664457700241720ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.FileChannel; public class Zip64Locator { private static final int SIGNATURE = 0x07064b50; public static final int SIZE = 20; static final int TOTAL_NUMBER_DISK = EndOfCentralDirectory.DISK_NUMBER + 1; private Location location; private long offsetToEOCD64; private Zip64Locator() { location = Location.INVALID; offsetToEOCD64 = 0; } @NonNull public Location getLocation() { return location; } public long getOffsetToEOCD64() { return offsetToEOCD64; } public static Location write(@NonNull ZipWriter writer, @NonNull Location eocdLocation) throws IOException { ByteBuffer buffer = ByteBuffer.allocate(SIZE).order(ByteOrder.LITTLE_ENDIAN); buffer.putInt(SIGNATURE); buffer.putInt(0); // CD disk number buffer.putLong(eocdLocation.first); // offset buffer.putInt(TOTAL_NUMBER_DISK); buffer.rewind(); long position = writer.position(); writer.write(buffer); return new Location(position, SIZE); } @NonNull static Zip64Locator find(@NonNull FileChannel channel, @NonNull EndOfCentralDirectory eocd) throws IOException { Zip64Locator locator = new Zip64Locator(); Location locatorLocation = new Location(eocd.getLocation().first - SIZE, SIZE); long fileSize = channel.size(); if (locatorLocation.last >= fileSize) { return locator; } if (locatorLocation.first < 0) { return locator; } ByteBuffer locatorBuffer = ByteBuffer.allocate(SIZE).order(ByteOrder.LITTLE_ENDIAN); channel.read(locatorBuffer, locatorLocation.first); locatorBuffer.rewind(); if (locator.parse(locatorBuffer)) { locator.location = locatorLocation; } return locator; } private boolean parse(@NonNull ByteBuffer buffer) { int signature = buffer.getInt(); if (signature != SIGNATURE) { return false; } buffer.position(buffer.position() + 4); // skip CD disk number offsetToEOCD64 = Ints.ulongToLong(buffer.getLong()); // Don't read the rest, this is not needed return true; } } zipflinger-7.2.2/src/com/android/zipflinger/ZipArchive.java000066400000000000000000000311631430664457700237640ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import com.android.annotations.Nullable; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.file.Files; import java.nio.file.Path; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class ZipArchive implements Archive { private final FreeStore freestore; private boolean closed; private final Path file; private final CentralDirectory cd; private final ZipWriter writer; private final ZipReader reader; private final Zip64.Policy policy; private ZipInfo zipInfo; private boolean modified; public ZipArchive(@NonNull Path file) throws IOException { this(file, Zip64.Policy.ALLOW); } /** * The object used to manipulate a zip archive. * * @param file the file object */ public ZipArchive(@NonNull Path file, Zip64.Policy policy) throws IOException { this.file = file; this.policy = policy; if (Files.exists(file)) { ZipMap map = ZipMap.from(file, true, policy); zipInfo = new ZipInfo(map.getPayloadLocation(), map.getCdLoc(), map.getEocdLoc()); cd = map.getCentralDirectory(); freestore = new FreeStore(map.getEntries()); } else { zipInfo = new ZipInfo(); Map entries = new LinkedHashMap<>(); cd = new CentralDirectory(ByteBuffer.allocate(0), entries); freestore = new FreeStore(entries); } writer = new ZipWriter(file); reader = new ZipReader(file); closed = false; modified = false; } /** @deprecated Use ZipArchive(Path) instead. */ @Deprecated public ZipArchive(@NonNull File file) throws IOException { this(file.toPath()); } /** @deprecated Use {@link #ZipArchive(Path, Zip64.Policy)} instead. */ @Deprecated public ZipArchive(@NonNull File file, Zip64.Policy policy) throws IOException { this(file.toPath(), policy); } /** * Returns the list of zip entries found in the archive. Note that these are the entries found * in the central directory via bottom-up parsing, not all entries present in the payload as a * top-down parser may return. * * @param file the zip archive to list. * @return the list of entries in the archive, parsed bottom-up (via the Central Directory). */ @NonNull public static Map listEntries(@NonNull Path file) throws IOException { return ZipMap.from(file, false).getEntries(); } /** @deprecated Use {@link #listEntries(Path)} instead. */ @Deprecated public static Map listEntries(@NonNull File file) throws IOException { return listEntries(file.toPath()); } @NonNull public List listEntries() { return cd.listEntries(); } @Nullable public ByteBuffer getContent(@NonNull String name) throws IOException { ExtractionInfo extractInfo = cd.getExtractionInfo(name); if (extractInfo == null) { return null; } Location loc = extractInfo.getLocation(); ByteBuffer payloadByteBuffer = ByteBuffer.allocate(Math.toIntExact(loc.size())); reader.read(payloadByteBuffer, loc.first); if (extractInfo.isCompressed()) { return Compressor.inflate(payloadByteBuffer.array()); } else { return payloadByteBuffer; } } @Nullable public InputStream getInputStream(@NonNull String name) throws IOException { ExtractionInfo extractInfo = cd.getExtractionInfo(name); if (extractInfo == null) { return null; } InputStream in = new PayloadInputStream(reader.getChannel(), extractInfo.getLocation()); if (extractInfo.isCompressed()) { return Compressor.wrapToInflate(in); } return in; } /** See Archive.add documentation */ @Override public void add(@NonNull Source source) throws IOException { if (closed) { throw new IllegalStateException( String.format("Cannot add source to closed archive %s", file)); } writeSource(source); } /** See Archive.add documentation */ @Override public void add(@NonNull ZipSource sources) throws IOException { if (closed) { throw new IllegalStateException( String.format("Cannot add zip source to closed archive %s", file)); } try { sources.open(); for (Source source : sources.getSelectedEntries()) { writeSource(source); } } finally { sources.close(); } } /** See Archive.delete documentation */ @Override public void delete(@NonNull String name) { if (closed) { throw new IllegalStateException( String.format("Cannot delete '%s' from closed archive %s", name, file)); } Location loc = cd.delete(name); if (loc.isValid()) { freestore.free(loc); modified = true; } } /** * Carry all write operations to the storage system to reflect the delete/add operations * requested via add/delete methods. */ // TODO: Zip64 -> Add boolean allowZip64 @Override public void close() throws IOException { closeWithInfo(); } @NonNull public ZipInfo closeWithInfo() throws IOException { if (closed) { throw new IllegalStateException("Attempt to close a closed archive"); } closed = true; try (ZipWriter w = writer; ZipReader r = reader) { writeArchive(w); } return zipInfo; } @NonNull public Path getPath() { return file; } public boolean isClosed() { return closed; } private void writeArchive(@NonNull ZipWriter writer) throws IOException { // There is no need to fill space and write footers if an already existing archive // has not been modified. if (zipInfo.eocd.isValid() && !modified) { return; } // Fill all empty space with virtual entry (not the last one since it represent all of // the unused file space. List freeLocations = freestore.getFreeLocations(); for (int i = 0; i < freeLocations.size() - 1; i++) { fillFreeLocation(freeLocations.get(i), writer); } // Write the Central Directory Location lastFreeLocation = freestore.getLastFreeLocation(); long cdStart = lastFreeLocation.first; writer.position(cdStart); cd.write(writer); Location cdLocation = new Location(cdStart, writer.position() - cdStart); long numEntries = cd.getNumEntries(); // Write zip64 EOCD and Locator (only if needed) writeZip64Footers(writer, cdLocation, numEntries); // Write EOCD Location eocdLocation = EndOfCentralDirectory.write(writer, cdLocation, numEntries); writer.truncate(writer.position()); // Build and return location map Location payLoadLocation = new Location(0, cdStart); zipInfo = new ZipInfo(payLoadLocation, cdLocation, eocdLocation); } private void writeZip64Footers( @NonNull ZipWriter writer, @NonNull Location cdLocation, long numEntries) throws IOException { if (!Zip64.needZip64Footer(numEntries, cdLocation)) { return; } if (policy == Zip64.Policy.FORBID) { String message = String.format( "Zip64 required but forbidden (#entries=%d, cd=%s)", numEntries, cdLocation); throw new IllegalStateException(message); } Zip64Eocd eocd = new Zip64Eocd(numEntries, cdLocation); Location eocdLocation = eocd.write(writer); Zip64Locator.write(writer, eocdLocation); } // Fill archive holes with virtual entries. Use extra field to fill as much as possible. private static void fillFreeLocation(@NonNull Location location, @NonNull ZipWriter writer) throws IOException { long spaceToFill = location.size(); if (spaceToFill < LocalFileHeader.VIRTUAL_HEADER_SIZE) { // There is not enough space to create a virtual entry here. The FreeStore // never creates such gaps so it was already in the zip. Leave it as it is. return; } while (spaceToFill > 0) { long entrySize; if (spaceToFill <= LocalFileHeader.VIRTUAL_ENTRY_MAX_SIZE) { // Consume all the remaining space. entrySize = spaceToFill; } else { // Consume as much as possible while leaving enough for the next LFH entry. entrySize = Ints.USHRT_MAX; } int size = Math.toIntExact(entrySize); ByteBuffer virtualEntry = ByteBuffer.allocate(size).order(ByteOrder.LITTLE_ENDIAN); LocalFileHeader.fillVirtualEntry(virtualEntry); writer.write(virtualEntry, location.first + location.size() - spaceToFill); spaceToFill -= virtualEntry.capacity(); } } private void writeSource(@NonNull Source source) throws IOException { modified = true; validateName(source); source.prepare(); // Calculate the size we need (header + payload) LocalFileHeader lfh = new LocalFileHeader(source); long headerSize = lfh.getSize(); long bytesNeeded = headerSize + source.getCompressedSize(); // Allocate file space Location loc; if (source.isAligned()) { loc = freestore.alloc(bytesNeeded, headerSize, source.getAlignment()); lfh.setPadding(Math.toIntExact(loc.size() - bytesNeeded)); } else { loc = freestore.ualloc(bytesNeeded); } writer.position(loc.first); lfh.write(writer); // Write payload long payloadStart = writer.position(); long payloadSize = source.writeTo(writer); Location payloadLocation = new Location(payloadStart, payloadSize); // Update Central Directory record CentralDirectoryRecord cdRecord = new CentralDirectoryRecord(source, loc, payloadLocation); cd.add(source.getName(), cdRecord); checkPolicy(source, loc, payloadLocation); } private void checkPolicy( @NonNull Source source, @NonNull Location cdloc, @NonNull Location payloadLoc) { if (policy == Zip64.Policy.ALLOW) { return; } if (source.getUncompressedSize() >= Zip64.LONG_MAGIC || source.getCompressedSize() >= Zip64.LONG_MAGIC || cdloc.first >= Zip64.LONG_MAGIC || payloadLoc.first >= Zip64.LONG_MAGIC) { String message = String.format( "Zip64 forbidden but required in entry %s size=%d, csize=%d, cdloc=%s, loc=%s", source.getName(), source.getUncompressedSize(), source.getCompressedSize(), cdloc, payloadLoc); throw new IllegalStateException(message); } } private void validateName(@NonNull Source source) { byte[] nameBytes = source.getNameBytes(); String name = source.getName(); if (nameBytes.length > Ints.USHRT_MAX) { throw new IllegalStateException( String.format("Name '%s' is more than %d bytes", name, Ints.USHRT_MAX)); } if (cd.contains(name)) { String template = "Zip file '%s' already contains entry '%s', cannot overwrite"; String msg = String.format(template, file.toAbsolutePath().toString(), name); throw new IllegalStateException(msg); } } } zipflinger-7.2.2/src/com/android/zipflinger/ZipInfo.java000066400000000000000000000020041430664457700232660ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; public class ZipInfo { public final Location payload; public final Location cd; public final Location eocd; public ZipInfo() { this(Location.INVALID, Location.INVALID, Location.INVALID); } public ZipInfo(Location payload, Location cd, Location eocd) { this.payload = payload; this.cd = cd; this.eocd = eocd; } } zipflinger-7.2.2/src/com/android/zipflinger/ZipMap.java000066400000000000000000000366531430664457700231310ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.FileChannel; import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.LinkedHashMap; import java.util.Map; public class ZipMap { private final Map entries = new LinkedHashMap<>(); private CentralDirectory cd = null; // To build an accurate location of entries in the zip payload, data descriptors must be read. // This is not useful if an user only wants a list of entries in the zip but it is mandatory // if zip entries are deleted/added. private final boolean accountDataDescriptors; private final Path zipFile; private long fileSize; private Location payloadLocation; private Location cdLocation; private Location eocdLocation; static final String LFH_LENGTH_ERROR = "The provided zip (%s) is invalid. Entry '%s' name field is %d bytes" + " in the Central Directory but %d in the Local File Header"; private ZipMap(@NonNull Path zipFile, boolean accountDataDescriptors) { this.zipFile = zipFile; this.accountDataDescriptors = accountDataDescriptors; } @NonNull public static ZipMap from(@NonNull Path zipFile) throws IOException { return from(zipFile, false); } /** @deprecated Use {@link #from(Path)} instead. */ @Deprecated @NonNull public static ZipMap from(@NonNull File zipFile) throws IOException { return from(zipFile.toPath(), false); } @NonNull public static ZipMap from(@NonNull Path zipFile, boolean accountDataDescriptors) throws IOException { return from(zipFile, accountDataDescriptors, Zip64.Policy.ALLOW); } @NonNull public static ZipMap from( @NonNull Path zipFile, boolean accountDataDescriptors, Zip64.Policy policy) throws IOException { ZipMap map = new ZipMap(zipFile, accountDataDescriptors); map.parse(policy); return map; } @NonNull public Location getPayloadLocation() { return payloadLocation; } @NonNull public Location getCdLoc() { return cdLocation; } @NonNull public Location getEocdLoc() { return eocdLocation; } private void parse(Zip64.Policy policy) throws IOException { try (FileChannel channel = FileChannel.open(zipFile, StandardOpenOption.READ)) { fileSize = channel.size(); EndOfCentralDirectory eocd = EndOfCentralDirectory.find(channel); if (!eocd.getLocation().isValid()) { throw new IllegalStateException( String.format("Could not find EOCD in '%s'", zipFile)); } eocdLocation = eocd.getLocation(); cdLocation = eocd.getCdLocation(); // Check if this is a zip64 archive Zip64Locator locator = Zip64Locator.find(channel, eocd); if (locator.getLocation().isValid()) { if (policy == Zip64.Policy.FORBID) { String message = String.format("Cannot parse forbidden zip64 archive %s", zipFile); throw new IllegalStateException(message); } Zip64Eocd zip64EOCD = Zip64Eocd.parse(channel, locator.getOffsetToEOCD64()); cdLocation = zip64EOCD.getCdLocation(); if (!cdLocation.isValid()) { String message = String.format("Zip64Locator led to bad EOCD64 in %s", zipFile); throw new IllegalStateException(message); } } if (!cdLocation.isValid()) { throw new IllegalStateException( String.format("Could not find CD in '%s'", zipFile)); } parseCentralDirectory(channel, cdLocation, policy); payloadLocation = new Location(0, cdLocation.first); } } private void parseCentralDirectory( @NonNull FileChannel channel, @NonNull Location location, Zip64.Policy policy) throws IOException { if (location.size() > Integer.MAX_VALUE) { throw new IllegalStateException("CD larger than 2GiB not supported"); } int size = Math.toIntExact(location.size()); ByteBuffer buf = ByteBuffer.allocate(size).order(ByteOrder.LITTLE_ENDIAN); channel.read(buf, location.first); buf.rewind(); while (buf.remaining() >= 4 && buf.getInt() == CentralDirectoryRecord.SIGNATURE) { Entry entry = new Entry(); parseCentralDirectoryRecord(buf, channel, entry); if (!entry.getName().isEmpty()) { entries.put(entry.getName(), entry); } checkPolicy(entry, policy); } cd = new CentralDirectory(buf, entries); sanityCheck(location); } private static void checkPolicy(@NonNull Entry entry, Zip64.Policy policy) { if (policy == Zip64.Policy.ALLOW) { return; } if (entry.getUncompressedSize() > Zip64.LONG_MAGIC || entry.getCompressedSize() > Zip64.LONG_MAGIC || entry.getLocation().first > Zip64.LONG_MAGIC) { String message = String.format( "Entry %s infringes forbidden zip64 policy (size=%d, csize=%d, loc=%s)", entry.getName(), entry.getUncompressedSize(), entry.getCompressedSize(), entry.getLocation()); throw new IllegalStateException(message); } } private void sanityCheck(Location cdLocation) { //Sanity check that: // - All payload locations are within the file (and not in the CD). for (Entry e : entries.values()) { Location loc = e.getLocation(); if (loc.first < 0) { throw new IllegalStateException("Invalid first loc '" + e.getName() + "' " + loc); } if (loc.last >= fileSize) { throw new IllegalStateException( fileSize + "Invalid last loc '" + e.getName() + "' " + loc); } Location cdLoc = e.getCdLocation(); if (cdLoc.first < 0) { throw new IllegalStateException( "Invalid first cdloc '" + e.getName() + "' " + cdLoc); } long cdSize = cdLocation.size(); if (cdLoc.last >= cdSize) { throw new IllegalStateException( cdSize + "Invalid last loc '" + e.getName() + "' " + cdLoc); } } } @NonNull public Map getEntries() { return entries; } @NonNull CentralDirectory getCentralDirectory() { return cd; } public void parseCentralDirectoryRecord( @NonNull ByteBuffer buf, @NonNull FileChannel channel, @NonNull Entry entry) throws IOException { long cdEntryStart = (long) buf.position() - 4; entry.setVersionMadeBy(buf.getShort()); buf.getShort(); // versionNeededToExtract short flags = buf.getShort(); short compressionFlag = buf.getShort(); entry.setCompressionFlag(compressionFlag); buf.position(buf.position() + 4); //short modTime = buf.getShort(); //short modDate = buf.getShort(); int crc = buf.getInt(); entry.setCrc(crc); entry.setCompressedSize(Ints.uintToLong(buf.getInt())); entry.setUncompressedSize(Ints.uintToLong(buf.getInt())); int pathLength = Ints.ushortToInt(buf.getShort()); int extraLength = Ints.ushortToInt(buf.getShort()); int commentLength = Ints.ushortToInt(buf.getShort()); buf.position(buf.position() + 4); // short diskNumber = buf.getShort(); // short intAttributes = buf.getShort(); entry.setExternalAttributes(buf.getInt()); entry.setLocation(new Location(Ints.uintToLong(buf.getInt()), 0)); parseName(buf, pathLength, entry); // Process extra field. If the entry is zip64, this may change size, csize, and offset. if (extraLength > 0) { int position = buf.position(); int limit = buf.limit(); buf.limit(position + extraLength); parseExtra(buf.slice(), entry); buf.limit(limit); buf.position(position + extraLength); } // Skip comment field buf.position(buf.position() + commentLength); // Retrieve the local header extra size since there are no guarantee it is the same as the // central directory size. // Semi-paranoid mode: Also check that the local name size is the same as the cd name size. ByteBuffer localFieldBuffer = readLocalFields( entry.getLocation().first + LocalFileHeader.OFFSET_TO_NAME, entry, channel); int localPathLength = Ints.ushortToInt(localFieldBuffer.getShort()); int localExtraLength = Ints.ushortToInt(localFieldBuffer.getShort()); if (pathLength != localPathLength) { String path = this.zipFile.toAbsolutePath().toString(); String entryName = entry.getName(); String msg = LFH_LENGTH_ERROR; String message = String.format(msg, path, entryName, localPathLength, pathLength); throw new IllegalStateException(message); } // At this point we have everything we need to calculate payload location. boolean isCompressed = compressionFlag != 0; long payloadSize = isCompressed ? entry.getCompressedSize() : entry.getUncompressedSize(); long start = entry.getLocation().first; long end = start + LocalFileHeader.LOCAL_FILE_HEADER_SIZE + pathLength + localExtraLength + payloadSize; entry.setLocation(new Location(start, end - start)); Location payloadLocation = new Location( start + LocalFileHeader.LOCAL_FILE_HEADER_SIZE + pathLength + localExtraLength, payloadSize); entry.setPayloadLocation(payloadLocation); // At this point we have everything we need to calculate CD location. long cdEntrySize = (long) CentralDirectoryRecord.SIZE + pathLength + extraLength + commentLength; entry.setCdLocation(new Location(cdEntryStart, cdEntrySize)); // Parse data descriptor to adjust crc, compressed size, and uncompressed size. boolean hasDataDescriptor = ((flags & CentralDirectoryRecord.DATA_DESCRIPTOR_FLAG) == CentralDirectoryRecord.DATA_DESCRIPTOR_FLAG); if (hasDataDescriptor) { if (accountDataDescriptors) { // This is expensive. Fortunately ZIP archive rarely use DD nowadays. channel.position(end); parseDataDescriptor(channel, entry); } else { entry.setLocation(Location.INVALID); } } } private static void parseExtra(@NonNull ByteBuffer buf, @NonNull Entry entry) { buf.order(ByteOrder.LITTLE_ENDIAN); while (buf.remaining() >= 4) { short id = buf.getShort(); int size = Ints.ushortToInt(buf.getShort()); if (id == Zip64.EXTRA_ID) { parseZip64Extra(buf, entry); } if (buf.remaining() >= size) { buf.position(buf.position() + size); } } } private static void parseZip64Extra(@NonNull ByteBuffer buf, @NonNull Entry entry) { if (entry.getUncompressedSize() == Zip64.LONG_MAGIC) { if (buf.remaining() < 8) { throw new IllegalStateException("Bad zip64 extra for entry " + entry.getName()); } entry.setUncompressedSize(Ints.ulongToLong(buf.getLong())); } if (entry.getCompressedSize() == Zip64.LONG_MAGIC) { if (buf.remaining() < 8) { throw new IllegalStateException("Bad zip64 extra for entry " + entry.getName()); } entry.setCompressedSize(Ints.ulongToLong(buf.getLong())); } if (entry.getLocation().first == Zip64.LONG_MAGIC) { if (buf.remaining() < 8) { throw new IllegalStateException("Bad zip64 extra for entry " + entry.getName()); } long offset = Ints.ulongToLong(buf.getLong()); entry.setLocation(new Location(offset, 0)); } } private ByteBuffer readLocalFields(long offset, Entry entry, FileChannel channel) throws IOException { // The extra field is not guaranteed to be the same in the LFH and in the CDH. In practice there is // often padding space that is not in the CD. We need to read the LFH. ByteBuffer localFieldsBuffer = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN); if (offset < 0 || (offset + 4) > fileSize) { throw new IllegalStateException( "Entry :" + entry.getName() + " invalid offset (" + offset + ")"); } channel.read(localFieldsBuffer, offset); localFieldsBuffer.rewind(); return localFieldsBuffer; } private static void parseName(@NonNull ByteBuffer buf, int length, @NonNull Entry entry) { byte[] pathBytes = new byte[length]; buf.get(pathBytes); entry.setNameBytes(pathBytes); } private static void parseDataDescriptor(@NonNull FileChannel channel, @NonNull Entry entry) throws IOException { // If zip entries have data descriptor, we need to go an fetch every single entry to look if // the "optional" marker is there. Adjust zip entry area accordingly. ByteBuffer dataDescriptorBuffer = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN); channel.read(dataDescriptorBuffer); dataDescriptorBuffer.rewind(); int dataDescriptorLength = 12; if (dataDescriptorBuffer.getInt() == CentralDirectoryRecord.DATA_DESCRIPTOR_SIGNATURE) { dataDescriptorLength += 4; } Location adjustedLocation = new Location( entry.getLocation().first, entry.getLocation().size() + dataDescriptorLength); entry.setLocation(adjustedLocation); } @NonNull public Path getPath() { return zipFile; } /** @deprecated Use {@link #getPath()} instead. */ @Deprecated @NonNull public File getFile() { return zipFile.toFile(); } } zipflinger-7.2.2/src/com/android/zipflinger/ZipReader.java000066400000000000000000000034351430664457700236060ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import java.io.Closeable; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.file.Path; import java.nio.file.StandardOpenOption; public class ZipReader implements Closeable { private final Path file; private FileChannel channel; private boolean isOpen; ZipReader(Path file) { this.file = file; isOpen = false; } @Override public void close() throws IOException { if (!isOpen) { return; } channel.close(); } void read(ByteBuffer byteBuffer, long offset) throws IOException { ensureOpen(); channel.read(byteBuffer, offset); byteBuffer.rewind(); } void ensureOpen() throws IOException { if (isOpen) { return; } this.channel = FileChannel.open(file, StandardOpenOption.READ); if (!channel.isOpen()) { throw new IllegalStateException("Unable to open Channel to " + file.toAbsolutePath()); } isOpen = true; } FileChannel getChannel() throws IOException { ensureOpen(); return channel; } } zipflinger-7.2.2/src/com/android/zipflinger/ZipRepo.java000066400000000000000000000063251430664457700233120ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.Map; public class ZipRepo implements Closeable { private final ZipMap zipMap; private final FileChannel channel; private final Path file; public ZipRepo(@NonNull String filePath) throws IOException { this(ZipMap.from(Paths.get(filePath), false, Zip64.Policy.ALLOW)); } public ZipRepo(@NonNull Path path) throws IOException { this(ZipMap.from(path, false, Zip64.Policy.ALLOW)); } public ZipRepo(@NonNull ZipMap zipMap) throws IOException { this.zipMap = zipMap; this.channel = FileChannel.open(zipMap.getPath(), StandardOpenOption.READ); this.file = zipMap.getPath(); } @NonNull public Map getEntries() { return zipMap.getEntries(); } @NonNull ZipMap getZipMap() { return zipMap; } @Override public void close() throws IOException { channel.close(); } @NonNull private Entry getEntry(@NonNull String entryName) { Entry entry = zipMap.getEntries().get(entryName); if (entry == null) { String msg = String.format("No entry '%s' in file '%s'", entryName, file); throw new IllegalArgumentException(msg); } return entry; } // Is it the caller's responsibility to close() the returned InputStream. @NonNull public InputStream getInputStream(@NonNull String entryName) throws IOException { Entry entry = getEntry(entryName); Location payloadLocation = entry.getPayloadLocation(); InputStream inputStream = new PayloadInputStream(channel, payloadLocation); if (!entry.isCompressed()) { return inputStream; } return Compressor.wrapToInflate(inputStream); } @NonNull public ByteBuffer getContent(@NonNull String entryName) throws IOException { Entry entry = getEntry(entryName); Location payloadLocation = entry.getPayloadLocation(); ByteBuffer payloadByteBuffer = ByteBuffer.allocate(Math.toIntExact(payloadLocation.size())); channel.read(payloadByteBuffer, payloadLocation.first); payloadByteBuffer.rewind(); if (entry.isCompressed()) { return Compressor.inflate(payloadByteBuffer.array()); } else { return payloadByteBuffer; } } } zipflinger-7.2.2/src/com/android/zipflinger/ZipSource.java000066400000000000000000000107431430664457700236440ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.IOException; import java.nio.channels.FileChannel; import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.zip.Deflater; public class ZipSource { public static final int COMPRESSION_NO_CHANGE = -2; private FileChannel channel; private ZipMap map; private final List selectedEntries = new ArrayList<>(); public ZipSource(ZipMap map) { this.map = map; } public ZipSource(@NonNull Path file) throws IOException { this(ZipMap.from(file, false)); } @NonNull public void select(@NonNull String entryName, @NonNull String newName) { select(entryName, newName, COMPRESSION_NO_CHANGE, Source.NO_ALIGNMENT); } /** * Select an entry to be copied to the archive managed by zipflinger. * *

An entry will remain unchanged and zero-copy will happen when: - compression level is * COMPRESSION_NO_CHANGE. - compression level is 1-9 and the entry is already compressed. - * compression level is Deflater.NO_COMPRESSION and the entry is already uncompressed. * *

Otherwise, the entry is deflated/inflated accordingly via transfer to memory, crc * calculation , and written to the target archive. * * @param entryName Name of the entry in the source zip. * @param newName Name of the entry in the destination zip. * @param compressionLevel The desired compression level. * @return */ @NonNull public void select( @NonNull String entryName, @NonNull String newName, int compressionLevel, long alignment) { Entry entry = map.getEntries().get(entryName); if (entry == null) { throw new IllegalStateException( String.format("Cannot find '%s' in archive '%s'", entryName, map.getPath())); } Source entrySource = newZipSourceEntryFor(newName, entry, compressionLevel); entrySource.align(alignment); entrySource.versionMadeBy = entry.getVersionMadeBy(); entrySource.externalAttributes = entry.getExternalAttributes(); selectedEntries.add(entrySource); } public Map entries() { return map.getEntries(); } public static ZipSource selectAll(@NonNull Path file) throws IOException { ZipSource source = new ZipSource(file); for (Entry e : source.entries().values()) { source.select(e.getName(), e.getName(), COMPRESSION_NO_CHANGE, Source.NO_ALIGNMENT); } return source; } void open() throws IOException { channel = FileChannel.open(map.getPath(), StandardOpenOption.READ); } void close() throws IOException { if (channel != null) { channel.close(); } } FileChannel getChannel() { return channel; } public List getSelectedEntries() { return selectedEntries; } @NonNull private Source newZipSourceEntryFor(String newName, Entry entry, int compressionLevel) { // Source Destination // ======================== // X NO_CHANGE -> No changes // INFLATED INFLATED -> No changes // INFLATED DEFLATED -> Deflate // DEFLATED INFLATED -> Inflate // DEFLATED DEFLATED -> Inflate then Deflate if (compressionLevel == COMPRESSION_NO_CHANGE || (!entry.isCompressed() && compressionLevel == Deflater.NO_COMPRESSION)) { return new ZipSourceEntry(newName, entry, this); } return new ZipSourceEntryPipe(newName, entry, this, compressionLevel); } String getName() { return map.getPath().toString(); } } zipflinger-7.2.2/src/com/android/zipflinger/ZipSourceEntry.java000066400000000000000000000030121430664457700246550ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.IOException; class ZipSourceEntry extends Source { // Location of the payload in the zipsource. private Location payloadLoc; private final ZipSource zipSource; protected ZipSourceEntry(@NonNull String name, @NonNull Entry entry, ZipSource zipSource) { super(name); this.zipSource = zipSource; compressedSize = entry.getCompressedSize(); uncompressedSize = entry.getUncompressedSize(); crc = entry.getCrc(); compressionFlag = entry.getCompressionFlag(); payloadLoc = entry.getPayloadLocation(); } @Override public void prepare() {} @Override public long writeTo(@NonNull ZipWriter writer) throws IOException { writer.transferFrom(zipSource.getChannel(), payloadLoc.first, payloadLoc.size()); return payloadLoc.size(); } } zipflinger-7.2.2/src/com/android/zipflinger/ZipSourceEntryPipe.java000066400000000000000000000045701430664457700255050ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.util.zip.Deflater; /* * A source acting as a pipe from an Entry in a zip archive into a * local ByteBuffer. * * Able to inflate the input stream if needed. Able to deflate the * output stream if needed. */ class ZipSourceEntryPipe extends Source { private final ZipSource zipSource; private final int compressionLevel; private Entry entry; private ByteBuffer byteBuffer; ZipSourceEntryPipe(String newName, Entry entry, ZipSource zipSource, int compressionLevel) { super(newName); this.entry = entry; this.zipSource = zipSource; this.compressionLevel = compressionLevel; } @Override public void prepare() throws IOException { crc = entry.getCrc(); if (compressionLevel != Deflater.NO_COMPRESSION) { compressionFlag = LocalFileHeader.COMPRESSION_DEFLATE; } else { compressionFlag = LocalFileHeader.COMPRESSION_NONE; } uncompressedSize = entry.getUncompressedSize(); FileChannel channel = zipSource.getChannel(); Location loc = entry.getPayloadLocation(); try (NoCopyByteArrayOutputStream out = new NoCopyByteArrayOutputStream(8192); InputStream in = new PayloadInputStream(channel, loc)) { Compressor.pipe(in, out, entry.isCompressed(), compressionLevel); byteBuffer = out.getByteBuffer(); compressedSize = byteBuffer.limit(); } } @Override public long writeTo(@NonNull ZipWriter writer) throws IOException { return writer.write(byteBuffer); } } zipflinger-7.2.2/src/com/android/zipflinger/ZipWriter.java000066400000000000000000000060701430664457700236560ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import com.android.annotations.NonNull; import java.io.Closeable; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.ReadableByteChannel; import java.nio.file.Path; import java.nio.file.StandardOpenOption; public class ZipWriter implements Closeable { private final Path file; private FileChannel channel; private boolean isOpen; public ZipWriter(Path file) { this.file = file; isOpen = false; } /** @deprecated Use {@link #ZipWriter(Path)} instead. */ @Deprecated public ZipWriter(File file) { this(file.toPath()); } @Override public void close() throws IOException { if (!isOpen) { return; } channel.close(); } void truncate(long size) throws IOException { ensureOpen(); channel.truncate(size); } void position(long position) throws IOException { ensureOpen(); channel.position(position); } long position() throws IOException { ensureOpen(); return channel.position(); } int write(@NonNull ByteBuffer buffer, long position) throws IOException { ensureOpen(); return channel.write(buffer, position); } public int write(@NonNull ByteBuffer buffer) throws IOException { ensureOpen(); return channel.write(buffer); } public void transferFrom(@NonNull FileChannel src, long position, long count) throws IOException { ensureOpen(); long copied = 0; while (copied != count) { copied += src.transferTo(position + copied, count - copied, channel); } } public void transferFrom(@NonNull ReadableByteChannel src, long count) throws IOException { ensureOpen(); long position = channel.position(); long copied = 0; while (copied != count) { copied += channel.transferFrom(src, position + copied, count - copied); } channel.position(position + copied); } private void ensureOpen() throws IOException { if (isOpen) { return; } channel = FileChannel.open(file, StandardOpenOption.CREATE, StandardOpenOption.WRITE); if (!channel.isOpen()) { throw new IllegalStateException("Unable to open Channel to " + file.toAbsolutePath()); } isOpen = true; } } zipflinger-7.2.2/test/000077500000000000000000000000001430664457700146725ustar00rootroot00000000000000zipflinger-7.2.2/test/resource/000077500000000000000000000000001430664457700165215ustar00rootroot00000000000000zipflinger-7.2.2/test/resource/1-2-3files.zip000066400000000000000000000047731430664457700207420ustar00rootroot00000000000000PKWïNBuÞѦ file1.txtUT L¾,]e©,]ux S_MSÙã0 m…ibóµS-1]#Š®ŸâcócC¦H¾Ëk—LÚÌ3µ:¤ ¥Ö5«QQSŠÜtu#Ê™¢+% Ãm¡_Wûu¡gײiJL¨öÂ]î®]^¥RË‚‡Î”ÙŒië¼kdJ>ÇÍ^ÓA‰ƒå})>g’$ú”­¦ÝSóÁCh×ÁB<ȱkƒ’ÕÈI€Œ .4ïv¯¤€Þ^6×·j.Àx6‰Àæ“AV 5çëdŸHËñNS¥ý©%j†F@¶&Æa@¬Š[VSÒ Ã#×éÀ>zb-è)¾)…”¡ „Z‚F/ƒžna"ÃÜKŸ»‚Hæ1ÜÄ0ÒWMÊ“Á9¸yÚÊSž8¦uë  Wˆ†Ó9ânƒqÀGE¦}ÿ‡\õ7£}K? g?·Cð¯0À Dmjpm;¬—I{Ãô!¹¡õ­R!åòøméÐQû¥åÃ_ôðAÀw Ÿ7˜µÞâïˆ÷˽ƒë­>¶y¾l?Ãw®zÐÏ¡ÔiÆùÌ*õW-aê•Àçcóuõ ÷½ªûè¨'K9¸~„Ór 0I MÇy†-‡Ú›tZuE gÖ7§)™%Ha;b™ÿPKWïN:MÙÞâ¯NjÀâAC! ¬8KÀ áèÆFݸ„ uêÎd«j§’«è„’ý¦ód `kZ¡h7º:à‚…;#\h¶ÄȱŠ+g³‘‡R'ìPqð™[®0H$O’݃àEõ (œå¤‡Wvgƒ¥>6œ¦g:6FC*ÔѾDÝb#þƒ§™7û&’Lù¤©ÐÕ|"Ü8é"©AÇö5Ž´²~­äßq· ššÏYëá×Ó£¬> 8T@Ití:;ÎÔ:BçoªÎê)Ø+ûVxl >oy¦Ðð$È©æJ² CRk›YÁ¦[‹͉oçKœ,™Éáx_ûöf±#%÷^>‰½²ÒYò)|,S7]Ï Á´îgŒòHÔ3?eÇÏ!×ÓvöþóPKWïN0Jâm b file3.txtUT L¾,]e©,]ux S_]V]Žô( ¼ ˆúûø½¬´{Bèn¯døéóoH4ÒtÀv¹ªÌŸ”ýiè*í46»fZöt)_>›âOþ÷ñor-Xúâ=ØxP5v×`è0.ØRÖ2ߨœé0¡¹Úб>z¯dÏÍ”ä(•ŸfRŽ6{s¤èiÕŸÌiƒ/ÍÖœ)ïdjÊø3Oß^d1V‡@Åð¦˜"Ö~ô9•m<ß„ßg©Æ%d{úˆ's½mñ!Œ5¿j)n¦ZG•Ž,ùiÞ\™N,vÙ–ùŽCK„uHZ|2Ê45S©ÔW¶èx‰³ÈÍœd.äƒä|?¶w 8|–8¨ÿb ÇÞ) óÖ;‘Ûlõød­¶/Рý䉣s€ÆÆ‡ùË^´ãó•Jóèêõ¢·ˆwzFDø"1/òoQªó~µð!´Öý4,fOx˜päè˜R7#Á¯J›ÿZ©éFnMêR› )Ö4°Þ¸õVï ÖàdÆÀ€Æ×­ÀVÀψ©S1¿è ïÁþmXÊ’Pg¤Ø«"7»VÀz[tštP–V¸²‡]£)¨soO½;2tðãÍi}*¢B@åiŽ?Üq’M¿›†n8ÿòÝhÙ+|‚Õ©X¾£@L‘!×Ó!\Ihvª”9Xf^âiÅR1"Í,„<Ô©kqöCŸÑ/5ÊERa®hàaþˆÑ<7ªòlo’u¦!8‡¹z ¡1Öð¨áºËŸö…ûÐi¿\NÕ=Ä> QåÝl»ážUÏÎ,ßÕʤSÃCÚQÌ/¢íO W«¨~b1Û5›ËJ«Än0±…ûwî/(¥že«¢mšPv>C¦‚Ò`Úä¶€.,W¾rŸZ½,Ô ¦#KÆþÉÿÓ¶L˨FØ~G(öEŒÎÃüÍtŒýG·8¤õ¥+~v{&¨£BÉ·­ûÀèÛæy&XÕl:·Ñ£À›ìò yÏù_ckšñz$±½ã5Œ»Õq£ñ žšhÇ[6%è}*,FI±Ý¦÷ôBUhÏaû¦ngÇиPD]jqÞn>Ä8ucÄö*“UêܰÌ@¯<âÉK‹â‹‚BÉ~Ü•xÓÃü˶SÁŒI°ö¨Œ ļ t·Rúo:¦0;©±‚ÖZ{;yÁ&ÆÜei÷A#Ìl[Š7þÝû¤]×-NE,Ù®é´Ä9À÷mªFÄvŸÛHºëA½|ÈBçÌ‚ž"ɉÀʇ/í­Î‹ ·–WÏ.Ž­Þd3;9ïåÚâ‘í”¶d³ú…pÛ,ZmlëNÄýáÔ;!s«™ÐèqŸ¿ë­”Á»y ×!ò×+ª^ðnCž{¦÷uKÁ1rÃçæŠ-<þPKWïNBuÞѦ ¤file1.txtUTL¾,]ux S_PKWïN:MÙ˜rÅSÝePê-k•fÀÙ‡V4{Ò>œf’"Cñ($gâfB«®Òrìî+Np«y)Lì›ËB“w•FLs£ÓpN>xUóAµ—‚K¹7Iôä„AÀóB2F€ßLÀ}OÚ»ªk_•1¹È$Ó–4{³ï¯¯_œØ@甼Nn´{9´ñ "É`Uƒ~ÞŠ~üÔW library.soUT í_Û\í_Û\ux S_fake library .so PK ®NÚó|& ¤classes.dexUTü_Û\ux S_PK ®NÈç— ¤WMyClass.classUTô_Û\ux S_PK ®N¼¦ ˜ ¤©image.pngUTß_Û\ux S_PK ®Nspë> ¤õlibrary.soUTí_Û\ux S_PKCJzipflinger-7.2.2/test/resource/file1.txt000066400000000000000000000016461430664457700202710ustar00rootroot00000000000000Lorem ipsum potenti primis nisi dapibus etiam dui lectus, quisque fringilla ac ornare dapibus vehicula non, nostra massa gravida luctus ac sit lacinia. Dictum eleifend porta vulputate vitae at urna orci sodales, ante purus eros quam pharetra posuere eleifend sed, nulla mi commodo nisl in nisl lorem. Condimentum blandit proin sollicitudin commodo erat condimentum donec feugiat, iaculis tincidunt fusce elit gravida varius mattis, est cubilia elementum pulvinar mollis nibh lobortis varius cubilia euismod neque elementum cubilia proin. Fermentum varius aptent urna habitasse adipiscing massa erat, congue tempus lorem sapien lacinia porttitor quisque, vulputate consequat nisi fermentum odio blandit curabitur, mauris pulvinar turpis pharetra nostra quisque. Mollis feugiat ipsum quis rhoncus class fermentum feugiat dapibus pulvinar rutrum laoreet, consectetur donec phasellus donec ullamcorper bibendum eget neque maecenas nullam.zipflinger-7.2.2/test/resource/file2.txt000066400000000000000000000012201430664457700202560ustar00rootroot00000000000000Lorem ipsum malesuada arcu vulputate sit sed vehicula potenti, elit donec dolor nulla morbi euismod consequat a, lacinia fermentum feugiat metus aenean dapibus id pellentesque ipsum euismod aliquet sagittis volutpat molestie, id maecenas vulputate quisque pellentesque erat netus, libero nostra himenaeos nam sagittis vel odio euismod venenatis class scelerisque velit nulla elementum, quis lorem non ornare pulvinar in blandit, suscipit nibh molestie inceptos integer est platea eros ornare et viverrafeugiat cubilia inceptos, platea pellentesquevitae nunc feugiat aenean orci, sagittis proin taciti sodales faucibus tellus luctus lacus cursus at.zipflinger-7.2.2/test/resource/file3.txt000066400000000000000000000065421430664457700202730ustar00rootroot00000000000000Lorem ipsum arcu ullamcorper semper vehicula lorem blandit a, vel id class vehicula euismod luctus aenean etiam, sociosqu ornare donec ut leo malesuada morbi tortor feugiat ante felis nec non mollis eros, luctus duis dictumst condimentum phasellus duis inceptos aenean, taciti ipsum quisque primis cras quisque non dictum inceptos tempus diam tristique nunc aenean risus malesuada, mi pellentesque arcu scelerisque torquent blandit nullam non massa, maecenas platea fermentum massa risus arcu feugiat accumsan. Dapibus posuere nec primis velit metus sem ullamcorper imperdiet ultrices, feugiat pulvinar faucibus feugiat accumsan dapibus nostra metus, sit sollicitudin netus quisque luctus habitant tristique dapibus gravida scelerisque fames venenatis nulla varius phasellus vel, felis fermentum libero neque ultrices dictum, sodales hac aptent bibendum turpis lectus ac ullamcorper tempor mi lacinia morbi fringilla pretium ligula egestas, porta id pulvinar eleifend fusce aenean phasellus posuere curabitur, ultrices suscipit ut tortor phasellus commodo mattis congue curabitur bibendum fermentum velit at a elementum habitasse, diam taciti aliquet etiam habitasse diam ultrices, tincidunt porta netus feugiat quam ante. Turpis pharetra malesuada molestie aenean justo tristique hac ut amet torquent fusce donec pulvinar, eget fermentum pharetra urna adipiscing habitasse consectetur mollis quis ullamcorper mollis sit, dictum pulvinar felis class taciti suscipit sapien enim odio et aliquet dui dolor vestibulum pellentesque turpis posuere himenaeos sit senectus felis aenean, eleifend class tempus sociosqu ad eu dictumst nam interdum, nisl orci sit nunc amet semper urna himenaeos turpis tempor vehicula senectus risus sed aliquam sociosqu ultricies, fames curabitur viverra platea elementum velit tortor. Luctus facilisis convallis morbi senectus class etiam ad eros ornare ad viverra, mi magna duis ut sollicitudin egestas ligula sociosqu mattis tristique duis, per elit mattis varius felis gravida lobortis ullamcorper et vulputate viverra dictumst eleifend porttitor aliquam sem eget curabitur magna venenatis convallis, pretium placerat class posuere pulvinar velit dolor nulla proin volutpat, congue dolor posuere suscipit mauris commodo pretium ante sagittis. Quam enim pretium enim conubia praesent facilisis pulvinar nulla vehicula, quisque porttitor turpis lectus non viverra aenean fames, varius litora pharetra eleifend ante hendrerit tortor hendrerit lacus elit viverra luctus ad elementum ornare aliquet mi elit, etiam scelerisque pretium quisque tortor ut pulvinar torquent semper lacus, sollicitudin quam interdum eget taciti gravida faucibus vestibulum non consequat arcu hendrerit faucibus himenaeos nullam fusce convallis risus venenatis magna arcu potenti. Urna eu elit molestie venenatis platea dapibus accumsan nisl aliquam, donec sociosqu erat nisi bibendum mattis tortor ante nisi, odio duis nibh ut aenean magna semper in facilisis scelerisque ornare imperdiet nec est dictumst pulvinar, curabitur gravida eu posuere velit pellentesque, mattis enim tempus conubia dictum sit semper hac sociosqu imperdiet leo ut lacinia non per faucibus lacinia ut porttitor fusce condimentum nullam posuere mauris conubia venenatis leo, hendrerit mattis augue pulvinar erat sit eget rutrum, dapibus quis hendrerit dictum curae suscipit non nulla nostra aptent adipiscing in feugiat tincidunt cursus magna lectus.zipflinger-7.2.2/test/resource/file4.txt000066400000000000000000000024461430664457700202730ustar00rootroot00000000000000Lorem ipsum elit feugiat elit nullam eros cras fames sit varius, amet cubilia eget aenean libero pellentesque fames sagittis fames, placerat sapien etiam ac odio eu leo semper imperdiet taciti magna ante rutrum aliquam massa erat tincidunt euismod habitasse vivamus, aliquet tempus vehicula ipsum class massa vel facilisis curabitur, dui diam risus sapien eget dictumst massa ac scelerisque. Aliquam molestie conubia arcu amet maecenas netus rhoncus congue dolor erat vulputate fames litora, consectetur pharetra donec sodales pharetra venenatis vestibulum orci vulputate himenaeos fames mi massa pulvinar et diam dui purus vehicula quam, massa mauris senectus quisque bibendum velit vel duis, donec eget cubilia lectus suscipit ad lectus convallis lectus amet ultricies torquent ultrices imperdiet himenaeos potenti, varius adipiscing scelerisque torquent mi felis interdum. Porttitor consectetur fermentum massa curabitur dapibus pellentesque eget netus pellentesque sodales augue fusce, taciti a netus malesuada ultrices elit est sociosqu dolor tempus sit netus libero nisi magna rutrum vitae vel sed urna a, nisi quisque commodo nam sodales maecenas sem sed ut etiam, quam ac vitae ut dictum phasellus hendrerit blandit ligula tempus dui cursus ut elementum dictum magna fringilla auctor urna pellentesque.zipflinger-7.2.2/test/resource/file5.txt000066400000000000000000000016101430664457700202640ustar00rootroot00000000000000Lorem ipsum lacus adipiscing tortor vel vitae sed eget sed etiam semper condimentum primis sociosqu scelerisque tortor ad ante bibendum lobortis nulla augue, sapien a libero rutrum curabitur mollis donec hac litora, est interdum sociosqu egestas potenti conubia sodales tincidunt. Facilisis accumsan pulvinar lectus nam aptent quisque luctus, leo purus maecenas sem proin sagittis turpis pellentesque, mollis vel fermentum convallis maecenas vulputate vehicula amet ultricies augue ligula per. Iaculis curabitur mi at dui lobortis cursus pulvinar sollicitudin curabitur, lacinia interdum sapien congue posuere platea pulvinar ante, egestas diam faucibus orci aptent malesuada varius etiam odio eu himenaeos in. Pharetra eros netus mollis mattis netus duis iaculis vitae nec ultrices nulla lacinia egestas taciti, erat maecenas enim ante fringilla sociosqu torquent dolor consectetur est lacinia fames.zipflinger-7.2.2/test/resource/stripped.ap_000066400000000000000000016211001430664457700210350ustar00rootroot00000000000000PK€ŸAndroidManifest.xmlþÊ¥UMOQ=¯SÚR¨-Pª@M\L4 jŒQ&H4jÐ…, TZh:• ý.\¸våÒ…+ˆ+„?Àž{{‡¾N!h|“Ó7sî½çÞwß›i€~e‡*¾¤ÓèÞý bš˜%n+Äžù|#~œ!f‰«Ä}b…øHü .§€%â9ñ™HÀ3bŸxO|"¾Ö1„jXÅ Î@u¬a;z¿CK“ uΫx…M^âßP¾@{~i߯2¹6"2]…Vî3‹ü]׸¤åáA¦1ÍßD‹Éq¸òÔ_xÅÙz«˜à]‹×¢ÅŠ—Ø;¸CËç]Æ¿¦g€Kq²_×ù›1{œ?wð¼Gt4&Kn‡Ûô©s–}ìgBíUÇr†}š!`÷Ø îí1qk´ËÓ¦Õb‰±O»ˆ»¸GÔ¸0 q÷Zºê¶ªìáŠÖ \¨=iSóøÞŒXLCÏJ­¯+ÉÊd-Ý ÉîëN´tÇÂú𬝡j-e_ÒKòsÿ­!Ý­iöí<¶x×aÄ ÌóŠè±Å¸&#¢Crtk™×.ls–®EúÜ¿û…¾]›Ã†žÕŽžQéUS#êä%¾£'¨¥½Þæï¦žØSºRéé†v´‰[\¡è¬qÚÿ%¦÷Öåèis„¼K2Þ¹œ½Î¥ˆ€(£)çfˆ*Ñr."Þp%fç÷†øÍ!ß²Š<“ÿêñ2įÌ+kß=ñ2{(9ã2úõ‘ äËz~Uãrz2»~#fŸÒ]®lÜt"Vîg¹†˜Oö)æ“{$Îx|–ÝgÿPK«)?ÓøPK€Ÿres/anim/abc_fade_in.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿres/anim/abc_fade_out.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ)res/anim/abc_grow_fade_in_from_bottom.xml•‘±OÂ@ÆßYZ ‚‚QcÔÍÊà`\”ÑÁIH\.ЦÀ5íéd¢“£3ÿˆ.n ‹Æ¿I¿£‡­ ^ó˽|÷¾Þ½÷ ²é b´K-FT#½_RºVÁ6ØûàœpAnÁxc0Ÿ R FÒB1àRDdÛýëˆË@ŒÈ²ÂàFÈÎ<èR½û p1üP»F?'äœ$dAnÈY‘g2•Ëlm¶Ú ¥6V»ÂT˜N›\ÛìvhÇñ½5år[çQäÌ~†Ú+ºÚXSl0ŸçÎÕ‹4mÖyVê&ñF²6eªë‡ÔfMÚ–²É\û¯;¡ØX !^È+y#ïb‚3zòÅqÈõËÞŽâþ”ŸðoðsÎûôfð¹öÒÙ ú\0ȡωŽE´â_M@=µšìµ Ë´Ý•ôï”ݺâŸÎßPKûµ AüPK€Ÿres/anim/abc_popup_exit.xmluÁJÃ@Eï3M3‘‚mq!ât‘l¥-¸\w?´‘›L˜Œk þ„ÿ⨟$èšXð ‡î{—™;>\à@ _Ô®ÑÕ 9' ™“rG–䙌FEå2[›vÆB©õ£Õ®0&“&×6»í·ãøÞšr±©s(rfw Cí]­­)Ö˜Írçêyš6«<+u“øF²2eªë‡ÔfMº‚&sí[·¢˜XˆÈ y%oä@Æ8coL¾XCî9¢~ÙÓÛR<Ÿr‰ÿƒŸ9ßgo ïk/ö|¡÷ z>t>âX¢ÝÿjõÔjA§Ñ¾½jµÁ3>ÃáÁA¶}ù'ó7PKJ#/ªüPK€Ÿ,res/anim/abc_shrink_fade_out_from_bottom.xml•‘1OÂ@ÇßYZu0ÆÍêà`\”ÑÁIH\.PÒFàšöt2‘ÉÑ™/¢‹›Â¢ñ3éÿÚÃV‚ƒ×üÒ—ß½×Þ»g§K‹ˆÑ.0¢™…øŠ²µvÀاà´BpÀ#˜€ø•J0R^ÊP2"Î{7‘P‘ã„Á­TíyСz=öEäå Êå~$‡í‹®x¨VÒ„©ïdÞ„¥’ö­Aè *•L#ÛƈQ/’A _©ðØuã®ï EÜ4Í®º"¼v#/vçɶ'·¬ØSDcÆé½µcðžÁ xo` fà|b5ÚFÍøÂªà]+ðG9¯—¾ï-<ÌÜ¿Î+˜}ž¦&uS¼7suk¦Žçê(«c•Y5ï#â÷É92ç`ÄÚY9§3µ³3‡#O´sr®ßï'®¸$/äYæN{нᚓ½¹_5½þÑ3½•–œ¥üË¡Ws–ÅZ s›Ï‡ý1ÏoPKÑgqhxTPK€Ÿ res/anim/abc_slide_in_bottom.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿres/anim/abc_slide_in_top.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ!res/anim/abc_slide_out_bottom.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿres/anim/abc_slide_out_top.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿres/anim/abc_tooltip_enter.xmluMNÃ0…ß?WŠT„XTë.º¨Y"6¨ÜÄj‚ÑÄ‘ã®é‚CpÎB¯C‰g}šÑÛ3v…W7x!ˆÞΚ’9Y[ µG’çuëK×Ù­ñÖA©b猯m‹ÉäÉÙf½í*ƒ,óvÈ’ÄÇ´…³uå²ò¾»×ºßTecúU(¬6¶Ñ¦{Ö®ìõ¸{Q˜±ïZDÞÈ9ÈåÉ¿"ŸT˜’ úþ‡TÌüš+oKC<Ö_.È%¾àÛ‹ ^N÷½x<ýòöÑŸYÆžòÏŒ_PK‚Pþ¥Ù„PK€Ÿres/anim/abc_tooltip_exit.xmluMNÃ0F¿!MâJ‘Š‹ªbÝE5KÄ•›XMP"š8rÜ5]pŽÀYè¡àKâR@b¬§±ßø?‚«‚¼H‚î瘑Y’[ŒµG’eUã ×ÚñÖA©|lƒéôÉÙz³kKƒ4õvìű Æ4¹³UŽÕªô¾½×ºÛ–Emºu(¬·¶Ö¦}Ö®èôi2¢0ç¹y#äH —ƒ¿"ŸŒ˜9!ôþ‡ïcÂþ5Û$¼- ¹¯©áå™$ã|»êeØïì¸üðлè—ãøÏ]NgÊ?wüPKÅ ý‚Ù„PK€Ÿ>res/color/abc_background_cache_hint_selector_material_dark.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ?res/color/abc_background_cache_hint_selector_material_light.xmluP1N1œ=ß%nr‰ÐE)â†ñ::dù,%"—‹Îîá!´üˆÿÀØ":‘±FcïŽw½VÐø@°À;€ »Å4¹ oÈGò‰¬*×íºu¢þÙ:çw¾ç¶Átj÷Mßm¬V›÷Æ·ñ­ ë”X»®5öðbzL6—å6úZVr‘ʼn7јQ?DäJ‰@f¸ä¹&¿ˆ‚ªÈ‚ñåQ|@ÅýWÆày ÎuDzôOþ¿mçlkî[¯¯™¸åjÆNÝûyçIïy+ÎÙf¼ zÊͶÛ›»¢þ‘+ƒÜaÆ5oÐõÛ}§vnÐí*{n#{nù PK”ºd\PK€Ÿ+res/color/abc_btn_colored_text_material.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ/res/color/abc_hint_foreground_material_dark.xml…PMKÃ@I²&—B-" zð Eº<‚wéI¶ÉbŠù"»÷úK¼‰Á§ouc—¨øÂãeÞ>f†‰)£ëˆˆiNoD¨<˜è†ö˜‚gàx®À°'c•Õ÷ºQ›Jßu×kcP ‘·UÛCUÕ•ŠÒT5Eßn Z,Jk»•”&/u­ÌÒ?,ó¶–ª{”è ‡p’l­®)ËŒ®tnÑxâŒN ÏÄü ¾0óiÌL<ýôÁw 0‚ø)þð p ™ŸI|Fxuo¸ÙÌ©ø:Û/Ú{|IÉÎyqà­Iìb¿ïx¦ÛåzüË.Q°Ë3î‚ã^ñèVÃMø~PKOš4PK€Ÿ0res/color/abc_hint_foreground_material_light.xml…PËJÄ@ìN2&—…uñ° ²àŽO‹ŸàÈ^d6Ìb^dæ¾~‰7ñü;­Ñ‰;DÅ E¥kŠî¦cÊè:"bšÓ*&º¡=¦àx^+ðlÀÉÄXeõ½nÔ¦ÒÅwÝõÚÔBämÕöPUu¥¢4UMÑ·Û‚‹ÒÚn%¥ÉK]+³ô˼­¥ê%:È!œ$[«kÊ2£+[4ž8£è31¿‚/Ì|3O?ýCðH ŒàŸ¾CŠÿ#|\ÆBgAæÀgŸ^Ýn6s*¾ÎöËö_R²s^xk»Øï;žév¹…ÿ²Kìòߌ»`ƸW<ºÕpþã†PKÃx4PK€Ÿ9res/color/abc_primary_text_disable_only_material_dark.xmluP»NÃ0=7N¨—Jå10 †Š©C½0 ¾‰¹‰¥V$M{‡Ï`bãø#8 ŽjEp¬£k{|VÐø@p…w'ˆ v‹#ä%¹$É'r>÷Á÷ìövS» EQ¶uÛa6³ûªkwV«m‡{c|¹uõë˜X—mcìáÅtΛќç»àhí]íÊÀBÄ›è¡÷D>E²æ8%¿‰ŒQ‘õ›DïQð~Á3¢÷<0ž%ž¬ ñ-€àŽAí{,ÈsòŠ|$ŸÈùÜܳÛÚ—ÚU(в­Û³™ÝV]»©°\®CØÝã˵k¬_ÅĪlcw¯¦sÞŒæ<ß×@kïjW"ÞE½?!ò%"Å0Ç1ùCdŒŠÌ¨ß$z‚÷3ž½çñ$ñäÑ“EбÏé?ë É^“Käo*Î1­Õ÷¸c<=ÐC’i½ë¤Þôšì;î%ÿüÃ/PKH¼ÃäÐPK€Ÿ,res/color/abc_primary_text_material_dark.xmluP=OÃ0¼'ÔK¥ò100!¦õ€#+2‰¥V$M{‡ŸÁÄÆÿáÁ%8ª•³NϺw~VÐø@pGˆ v=ä9yI>’Oä|îƒ îÙmíKí*EÙÖm‡ÙÌn«®ÝTX.×!ìnñåÚ5Ö¯bbU¶±»WÓ9oFsžo‚k µwµ+ ޟùÈb˜ã˜ü!2FEfÔ¯½GÁûψÞóÀx’xòèÉ¢GÅØçôŸuÐd¯É=ò7ç˜Öê{Ü0žè!I´Þ]RoúNMö÷’þáPKóÌV4äÐPK€Ÿ-res/color/abc_primary_text_material_light.xmluP=OÃ0¼'ÔK¥ò100!¦õ€X+2‰¥V$M{‡ŸÁÄÆÿáÁ%8ª•³NϺw~VÐø@pGˆ v=ä9yI>’Oä|îƒ îÙmíKí*EÙÖm‡ÙÌn«®ÝTX.×!ìnñåÚ5Ö¯bbU¶±»WÓ9oFsžo‚k µwµ+ ޟùÈb˜ã˜ü!2FEfÔ¯½GÁûψÞóÀx’xòèÉ¢GÅØçôŸuÐd¯É=ò7ç˜Öê{Ü0žè!I´Þ]RoúNMö÷’þáPK‰³I§äÐPK€Ÿ!res/color/abc_search_url_text.xml…PËNÃ0œMâK£=ôÐK%.í¡>p©ø†þD‰E«6$Š}/¿Âqáa“8ª@i´özvÆÚÛ Ìñ †œqË\0—Ìæ3󅙦ÆfV?}Ô¹Õ’¤oÔ6†ïQ”WǪAg¯ESí ¬V;këG¥L¾ÓefÖîaW¥ÊêƒâI5ˆ…Ø[]BÊ>€€7’˜r}Ñ'óƒˆ@7˜¹~3B®‚pÿÞë·¸âó´sèÑj¶\ïØàžÝÖ¾Ô®BQ”mÝv˜Íì¶êÚM…årÂîÖ_®]cý*&VeÛ»{5óf4çù&¸Z{W»2°ñ.zèý ‘/,†9ŽÉ"cTdFý*Ñ{¼ŸñŒè=Œ'‰'ž,zTŒ}NÿYMöšÜ#SqŽi­¾Ç ãé’ôHëÝ%õ¦ïÔdßq/ùç~PKã³ÿåÐPK€Ÿ/res/color/abc_secondary_text_material_light.xmluP»NÃ0=7N¨—Jå100!¦õ€ø+2‰¥V$M{‡Ï`bãø#8 ŽjEåXG×:÷ø>¬ ñ-€àŽAí{,Èsò’|$ŸÈùÜܳÛÚ—ÚU(в­Û³™ÝV]»©°\®CØÝã˵k¬_ÅĪlcw¯¦sÞŒæ<ß×@kïjW"ÞE½?!ò%"Å0Ç1ùCdŒŠÌ¨_%z‚÷3ž½çñ$ñäÑ“EбÏé?ë É^“{äo*Î1­Õ÷¸a<=ÐC’i½»¤Þôšì;î%ÿüÃ/PKzœ¬läÐPK€Ÿ$res/color/abc_tint_btn_checkable.xml…QÁJÃ@|/›˜(ªVðàÁƒ)Ø^¤'Eü]“…Ô&MHÖ³þ…7ñâ?ùþN®±Å Ãdgßî¼¼ èÃ!b: O"Ú"&º¤%†à!x ž‚Sð|_ÀWp0¨µÔêV-ä}¦’Ÿuœªx޵çÅEVTP™•©$ß—‹¤*f !Ë’Â0ÕºœFQ¹¬'f{y$ËyT©úD>ê‚Æãÿ+#{¹ëδÊ)j•©X£à™Úoûf~ß™9$ç‰xØúÛààBýv¿}º:ð:~ƒM¼ðX45wÐÝNM`j„©ñš½ë9KϹAM¦èxgè]˜Þú÷7¹WmÎß\§“ËÜFû¹×ȵ£çнÜÉ臽¯NôælçÉkæÏkþ×7PK/y3é2ØPK€Ÿres/color/abc_tint_default.xml•“ËJÃP†ç$©Ö^ÔÞ.„JÁFp#®t/RÁ+=¦GZššÐœº_CDâÊ÷ðÜù"êŸ&±16„Nù89“é|“›J:½kDŒÖhŸ(ŸÐ$J`lƒp NA¸à܃7ð>A>ïJ.ÅÙ¥mŽ\ÑùÝ‹+~aEöfW˜}ì ï K˜2Rà …ë5ÈdLÛ²‡T,úynÊÞ5—ã3Ürºœ²Y~ÕÚ½©*wj4ºR:{†áB2àn+8Ý2íÁ¾Î[|$mj6Ó+°¹¦õ¤®û£b¤;¦Ó&®ù{Oà¼‚ÆØ—ÂXƒ”[b%ª£n |#t¬¹ñýþ›ŸÇºä7"y/ò8.ã†WsŽu%R³Ô¨AMΤ¡s9Ìe&9¥ù¥”ÈPK€Ÿres/color/abc_tint_edittext.xml’ÏJÃ@Æg³‰‰J¡þ)zðàAl/âÉ£x¾®ÉJŠI²Û‹}ñ&½ùŠú¥fíRꄳ™™Ì7̆S@.'btD.#Ú¦Æp¾¦¥õÁ18à Ü€1xsð z=¥…–wEìÁA€kl1%È2&ÏÉùJ¾‘“Icµ5wf­r³Äh”–yYSu^eA ×˺\-¡”®*DQfmu•$Mš™B7s÷{ž–E¢«Ç¤6Í™~²%âøÿʤkîû+k „acr“Z@¼Hˆõ""Á{†LÛ}öÉ/BQÇíÞ¿}Ÿ:"=ú§=ƒß³¶ó65÷ÔÃ^Màj”«;uï:O¶žwÃùÚÌžwÁÙ•›mØ“{ÙæüÍ•^î0£ë7|§7èv•·‘·üPK„¡/ò\PK€Ÿres/color/abc_tint_spinner.xml’ÁJÃ@†g³‰Y•BÕc!9¯Äút„Üø‚yðb±§¿ñ-x8ˆŸZñÚvpð´V×<ÀX5ÛM ojÄÏU,ò8ï·1¾Œ9#ÌWkºVì³óf¶Õþ­n°A—:tÌÒêºõ¿sØ¡Ë,]»ßÕoõ;¾²ûvÇlͰ5wø PKàø°:PK€Ÿ#res/color/abc_tint_switch_track.xml…QÁNƒ@eAФIULcÌ#ã…Ø°Ò÷„ ¶«yü×-ð`@?kéeìâÝÅSG™ó>lå8:‡ë[³¾;¨5£ÑŒ ú,=y£™_ëõ%×½uë×¾n/kù–Üõ½Ã\º¾ïËåUíënð½mð5Z¾}ÿÖöèÖâ}Ôsg[öĶìõPK"åÓ6PK€Ÿ(res/color/switch_thumb_material_dark.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ)res/color/switch_thumb_material_light.xmluP»NÃ0=7N¨—Jå100!¦õ€øbaE&±ÔФ©bïðLlü'ÁQ­¨ëèZç߇4¾\àÀ"¨]cyN^’ä9Ÿû`ƒ{v[ûR» EQ¶uÛa6³Ûªk7–Ëu»[c|¹võ«˜X•mcìîÕtΛќç›àhí]íÊÀBÄ»è¡÷'D¾D²æ8&ˆŒQ‘õ«DïQð~Æ3¢÷Ü1ž$žyI‰}|gäÝÁa·eþÔ[úž¿½õÆ”¼ÍyË{bñó¿ò?oó PK#tN5óôPK€Ÿ/res/color-v23/abc_btn_colored_text_material.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ.res/color-v23/abc_color_highlight_material.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ(res/color-v23/abc_tint_btn_checkable.xmluPËNÃ0ܵ’K¥B9p@‚ÔCƒÄU|Bü˜Ä"UóRâ;| âÂ?ðw0nmj…²Ñh²ãÉŽ³’RêÓ)}¡sÅD·´«)p\WÀx`2Œ2úQ7ê¹ÒÅoŸ—:_£ã¼­Ú¬ª®T”$ª)úvUÐ|^Ó-³l€·VÃÂ,ò¶ÎT·Îz=dÞE+£kJÓAW:7ˆzã”NÀïÄü|2ó™d&žnôCàc@@¿t[ Þñø²ž'ðQà9pé<±c{–n­Ûù;MñpPK€Ÿ"res/color-v23/abc_tint_default.xml•“ËJÃ@†Ï$©MÕ^ì}!èÂ…tÑnÄ{‘ºteÇt¤¥išÑ胈èBw¾ úIìBOø˜™““óMn&Ù4´ˆí’͈¶)ÌÏi5°ŽÀ¸W` Bð>Á(—CÉ¥¸¾õÝ»PŒþ×bÎoÚŽNŽÃXÃÑYá8ÁØ]á`Ïj õK_g¦¾ûäûfÿÃ/PKöýq`PK€Ÿ#res/color-v23/abc_tint_edittext.xmlQ±NÃ0}'M*•– ¦ KÅÄÌ€ú`R£T$M±R±!~†‚ µ©ŠàEO¿;ß»\¬€p€w;° à ˜GÌæëÜóùÈì÷µ‘F]ÝVÙ½Vóï³ZÊ›Â;×Òm>вª¨޲¨s‰8–ËyS-æscê³4ÕY®J©'61ɪ2•õ]ÊRW† £J$‰V…Ê 7dвª¨޲¨s‰8–ËyS-æscê³4ÕY®J©'61ɪ2•õ]ÊRW† £J$‰V…Ê 7d‚98ÔZju§rùªøw%*ZbíyQ‘T¦e"É÷eWÅ"¦É$Ѻœ‡al&ë©Ù˜FEÊrVªmØuZeµJU¤1xæ€N oÄü~0óX07þ!ø ¸PtàŸwü>ÞñX4™{èQ's`2Âd<£Í^°nç·ž3ÃyO´žûµ^_ s¶þ|Û;ÚÓËÞFû½·ä<õ{_W«kÛ;ÚÑ{³éùÛëtz÷}[·£?KôîÃþwþçž~PK©©˜PK€Ÿ,res/drawable/abc_btn_borderless_material.xml•PANÃ0œMBâK¤B{àÀ¡N­TŸ*ÞÐ? 71jÔ†D±«Ë7¸sá°Bb¤ÑÚëÙkC¬€pƒw <Xâ„sÊœ3ï˜kfÁLSc•ÕU¶7:ÿ¾×6î.DÞ¨ƒZï4’D=åMUä˜Í6ÖÖ÷Ršl£Keþa‘U¥TõVò°ìÄQTX]²‘Ñ;ÙªÁ3 L8ûDoÌ"pͽKæ#ä1îßöú1Ÿ'­ÃœfÅõª§¹ðšÀk"_Ý›`©«­ÿ©G âcèÿ1ôê2ÆdÐ?2Æg2–­çÏ êeôýRÄÔù çÂÁN»ÝÑ/»þPK?ÎØ-ýLPK€Ÿ'res/drawable/abc_btn_check_material.xmluP»N1œ=_7‘£@‚šqCò TtTÈÜYJ”-¥ ŸŸÄ…1ø„u‚±FcïŽw½VÐø@p…7c$0v‹_ÌÈKò†| ÉéÔÜSµrÕÆÕкîìÞ>o&ûRwíºÆ|¾ a·4ÆÓÖX¿H‰EÕ6Æî6¦sÞôæ²\×°w[W…¶Ã«èïÞyÈ <ŸG¢ *²`ü:‹GŒ¸?çê=÷ÔÓÌS&O‘<*iÌiZ£ªŸïèc2Âø Ò;†µb;êÙ=$ë‘×+³zÃ{j0o?—üó_PK&”ÿøæÐPK€Ÿ)res/drawable/abc_btn_colored_material.xmluO± Â0¼g« ÕAPÁÁÑ©`ã(Žnþkl-¶¶¤qÒÑ_ðkõUR*‚Ž÷¸wÉ»88@Xà  ÖÖè0dΘ;æž)DlÔE3 ÏSçØiŒ HêºÜJYE‰ÎUÚA¹TåI]ÉÖìºi­sø~¦®Ú¬²´ªùÝ; Œ¸>‰4Æœû óÅàHè5d}ù¥7p¹ŸòiÑx6­ó8ÖC­ÇÖf&øÇ7Çîü½çüdiwÒŸŒoPK»ô+»XPK€Ÿ+res/drawable/abc_btn_default_mtrl_shape.xmlu’MOƒ@†g¥´´µZÛš´êÁ“‡ŠG½z0Æ›',Ä–%ìz4ú;AÆ5³h ßtû÷àúêÛ‹¾¼ÞЦ/•ÔcZ½&UY^¯èËg¹ªé‹%³4´z=5£Š¦-+Í,É«òòw)öÌõâŒÂŸ7ûçÿøPKpqT{ФPK€Ÿ'res/drawable/abc_btn_radio_material.xmluP1N1œ=‰AŠ E$(¡I7ˆ7PÑQEæÎR¢ä¸èl‰žOâG0Ÿ°N0ÖhìÝñ®× Îñ `„Æ®ð‹)yF^’wä=9™ø`ƒ[UkWm] ­ëÎ>Ù‡Ãxlë®ÝÔX,Ö!ìoŒñ´5Ö/SbYµ±û­éœ7½¹,7Á5,äÝÎU¡íð"ú»÷;DÞD2Åœçcò“(¨Š,¿ÈâÜϸzDÏ-õ$ó”ÉS$JsšÖ¨êç;ú˜aô¬Ò;†µbkêé=$ë‘×;Ìê ï©Á¼ý\òÏ?|PK©nh3çÐPK€Ÿ/res/drawable/abc_cab_background_internal_bg.xmluA‚0EÿP&nXcŒ'`A7.Œpé`K(ðžÀ½çÔ‹¢?y™ÌLû+ Ñ@ØâÀƒÏv%™€Ù0GæÄ¸®)’:çšêR7ðýäš5úœ!ŠŠ¶­J™´È«ÄÄv§ºRI}QMnÔpx¼Æè’{ÜHöo=ˆèÉ€¬¹™Ëá*‡çûɼӢïÃ.~/ak·“Ÿ/|}«‰Ïýá£ÑGKx$l޹OÌò 9èOî7PK•öù±¸tPK€Ÿ0res/drawable/abc_cab_background_top_material.xmluO± Â0¼gŒ-è êààèÔ¡qGW!´…ˆ­)M? ?ãwê $X ^8.yï’{Hq'€pÀ@"€k'ü27Ì+óæ}²°µí$úUvöQ"ËLß·¥\aªF»<4òÂ6J·OÕUNE³”Îè¶òjk>c +~÷MD 5ö!ïÃàQ0óäúqT÷¼ßñŠðž3ëvä™EOPßãÑ !szOLf‰™ôgÆ/PK0८PPK€Ÿ/res/drawable/abc_dialog_material_background.xmlu‘½JÄ@…Ïlv²Ù‚‚芖Úl±+llµÑZB6šàîNÈŒµ>€¥•Ø ¾?ÏàãØëIHÜ!Ä>æædν“;<|um|XF8Å"<²B6É.Ù#‡ä˜\Kò@É3‘R'asÔTåpÝ<œ¤·ý~:×±9‰¯ ƒ2?K¯Ï+_ÎUß/Ó#eŒš¡× ç“\¥f‘Êçq®1%ÆdA £$ž…z\mGj„ÙMÇ:¨mR–å¬3i5¥~/<ìð¬OBˆòJÞÈ;ù ŸbCîY%?Œ×>éP7–^Ä€ùŸn5³bŸS}çü$-¥ÖmÑd‹æ6´¢ç>µu«§_õVO,|Å•ýù6,Ÿ×âë,|b òΩþ½é«ë -}©¥ž°êùpE]¯é«õæ9Ù×3ÿÜÉ/PKXÌçCÌPK€Ÿ'res/drawable/abc_edit_text_material.xml•’¿KÃ@Çß5I›¶ª¶âàà EGÑÍÅ¥¨H÷“« 6MÈt¬ÿ† N‚‹›ƒ?þ9ý^Hìâà ÞÝ÷Þ½ï%ƒlò "F[ÔfD-Êã ZFlƒp NÁŒ@æà¼‚7Ðj éJ>GÞàþïœÏÜë©6.Ôºmû‰;WkT¯3Áå€%5éø2¸™HÔ¤“aS³™O")£j5wæ'QàS¯7‘2>ráMxèŠ~¶Ð÷¢Ðqã[vN^lYi2Í@òíŸrOF ÎÏlÚE~$ÆžÀ x`Œ½ƒð ¾±6uP· ¾6rT KMWÑÀx™}SUg.÷±}²J³J´ª¦õ3­¦i{Дç´ Ís%óÌCÕ ;ZM3«©hçbËÞk¹fh~çT]Ù»{)+än‰‡¡yP‰Gå¾ÝßCäÍ_¦ùêýδ~Å}¹^üžFáÎó»eü ?PK8ËmdPK€Ÿ(res/drawable/abc_ic_ab_back_material.xmlu’½NÃ0ÇÏùjú©‚:°0ª4!Ph…X*:´RbBQHD UjZ‰„™à9ØXy ø»qÔª‚‹~wÎß>ë|¶J&½+DŒ6阕IÆZXTA lƒè‚3p^Áø_@ÓxxÏÉ0?¼ 8éú,ñ€J%ïÇý0IâÄQ¹< ýÙ8NøÅ|ºRÉþ»i^>FÑIÅ ™æØãÁ©Ç=êtú{»–ëöZv!:°­\ÏݳšQ£mµ#k7­\ºl¿'rRï>R.çÝ’8Q½p>>rœÉ0ð)-'ìa|çxã['ñ'N¶XÓD8ÙÔrTEôÌLÚAÜbŒƒKð­2¦hŒ©@: V÷o üÀòˆ @YÒ…•0ÞÀgÈþds&R¤<ÒkÊ4Õä~hêB[QhÚBÃð£#4}Eµõä½gµemÊRmÆ"É`ùfÌUDUžu/u¥/ÙùÙ?ýúPK%³þÝ|´PK€Ÿ3res/drawable/abc_ic_arrow_drop_right_black_24dp.xmlu“ËnÓ@†ÏÄ—8à$m©D©P„ª¨N¢JĂۉDbƒ e5JLm‘d¬É4a<KXÚ%K^ñð=–]«ŒôÍåÏœÿœÌI,òè·EÄè*}`DÛdö3*F´Àep Üp</)»ÿ¼ŸÀwðü¿€Ï6°íŸ‡XT¼PäºQŸDŠgOU!‰WB½È7GäyR(®b± ßç§JŒc)… §Ôl®âp©ž§±­V~~œ™6¯âÙ졘 ›„«èWœ:q¿×ftG}3÷»Ç´»;¾Õà8öncÎé|Lõ:_L¥ˆ§¨™£’5Ö)NÚÛ‹”JîÁr…s¾Ü7÷'bðäu ÃeÛ¶®_sNê{Ç<:Ä;YÄØuÆØ3p¾€¯à†ÅØP³³€ @lƒv· þb´Ì¾ýcI×ãéo“kúº™µ:ýÜCÈSª½Mc Ía;Ù=ë­^h[zÕšWh6Ñ·ûZkT4]›‚v¥TÛ†©Í.Õ¦G;ó´ÚF³ÏxÝKýs4÷ŒöùÎ9‚Ö)åÜ29k¥œŠ8æ“Ë´v4MzµÌ›W½tŽCó©æ`¥ÚÏ7~~ɯ—ëÕw²*=Ï{Ëþó[øPK˜9|ììèPK€Ÿ&res/drawable/abc_ic_clear_material.xmlu’AKÃ0Ç_Ú´k“ ‚;x<È(­Î1o¢‚‡ »ˆx,[µÅm-]ØÀ‹ý0~âòæUÿiS7†¦ý‘—_’òòR,zÕˆíP­“jˆ{´hP °ºàôÁøŸà p.â‰ ÓŒÂø>dóx("ªÕfq8O“LÜäãr|Y,´í»x4:KFIF–•":D@axåwc÷Èïù·ÝuÚŽßrüJ‹q» ‡I¬èüNû¹òó8×~ñqá[T©“a–ÄCj6#!ÒÏ›¢pL]5á’±¤^N½r1ç2Sw2§gfÑê°Ë»·@ãŒé€«çµÜßhzhð/K^¶*â-<†º [õjŸÖ'íÉ.®¬tk¨ïýáô…ãDï§Òñ'ó÷¿½”ÇšÊC[ÊÃXìcU2™t¦ú_àtÙëꬫßÒWjPž•ýS›PKѹaÛg¬PK€Ÿ.res/drawable/abc_ic_go_search_api_material.xmlu’ÁNÂ@†gÛmiEc8xÀă!¥•JðfÔă&\ŒñØ@µ…6e‰9Ï>Þ|+ý¶‰NóevþÎngf«“E ˆÑ5Ñ.)ÃúšÖV5PÇ .Á¼wð ¾ç"ž2Í(Œ#A†1G"¢Je‡ó,ÍÅÝ2®V‹øj•hÛq’œ§Iš“eeˆ.P¯wÓ>qü¤Õv;htÜn_šÓqýFëWT¤øN˦R)˜Œò4Q³ ‘zÞt…ã`êªî0{AöäåáÔ+’9—ßF³p(P lÁ,:‚?dŒÝ‚{ qÆtÀˆÕ–ó‘sú†Yð6Р¿nèÒÊXïá1Ô|måÕ>m@Ú‹½º†B3X]÷‡¦¯5Nôq&5¾¥É:äîoÔ±£êÐ6ê0ÖûX™L&5SýÐtéuÕëöYúÖ Š^Ù?³ùPKÜ#ÞT€PK€Ÿ.res/drawable/abc_ic_menu_overflow_material.xml’ÏNÂ@ÆgûZ‚‰‰< ñ`PZÞŒšxЄ„ÃͦT۔Р$\äè#yôx&ý¶lA¼8Í/³óufº]• *©DŒŽé“í“4¬ïimYP%pÚàtÀ)r« ž¦ñpÄ)“ üð5à¤ë³°ÏÊç§¡?Gþ”Ä…Bß­Mó% ®£A4!û<¸q¹K‹åbù`;Õ–g×íj£ìTkz[8'+ørMD^m•€@$À9][$´Ê¢|.šØY±HrÐÑùý‰®}Én”“âUæÿz4“Í9e³î¨?‰Â>U*çãKËŠ½Àºq]¾¨{ÑÐrÇoÖÄ­4YÓÄL0Ø©ïq̶`ÁŸ0ÆA(c*Ѐˆ“s;ß0Þ ô ]XëC<ºF'èÃ,PK€Ÿ1res/drawable/abc_ic_voice_search_api_material.xmluRMkÛ@Õ‡-5MH¡ÐzP¡‡¤•V²ìºôRÒB„B)= Y­D•ÈØK¹Ä§ÒŸÕÒ‘о±×ؘvÄÛÙyûv4;»6yôÖ&ôœ~ ¢Çd ó m­'À+` |.sh?÷ÀÀqts­©×««æ[­Éuo›©®éðð¦©ngÝ\^ÅGG›ø|-ôý¯MÛžum7'Ï›º~_è‚–ˇ •†jP*9 “ #%3vY›„ѰL˜Ì‚ "Ëh-FÀb8ÏÆ¡J¡U ´j¬òÞ]¨‘LÇl¡RH}*ó0—*ˆr1)Á¼æ|cnV0¨InvÉA€ÜáP¦Áãh¢T˜ª6 ®3“Y™ñ–DæXç˜ÝJ·ó{™°©;ê÷‹ëé¼k¦tzZk={Ç‹²®®Š…4 ²ì®âbö=žW‹x#vîÚS•¤¥ðè%îé…âð°!lÀ\€ÄñênŸ`¼Xàîðl˜?Åçš·áoöY—dÝûë'´á\qbòýƒ³·œCôësÎÇuð{|¶SÇ#S‡µS‡»Ý'¨'˜ë™÷ Îfo›³îç²÷z°9«øOoþPK˜”f]È<PK€Ÿ.res/drawable/abc_item_background_holo_dark.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ/res/drawable/abc_item_background_holo_light.xml’½NÃ0Çïê|-‘ ¢m˜24°!`eãÀ$F­hš(1BLðHˆ•×à¡Øá\œÆŠzÑ_ßý;[Ç €/€pŸ´Ò†ÐÚtH:&“.I鉆µäR\ßéC-²õZ,ùíÂX—•¨U>²Š?ªø>_fU1Ï ŽgR–gIR§3‘ózªÓ´È^Þ'´9iŠg.ENÕb!RYTð‚DÔË ¾“>H¯ˆ8\ÅwHßdy—4 ø‘WæÓÿ}©¹Šµ5ž®qt«½ÊÑÛí*ïþ>ß:ÖÔ ,u¬á xÏL÷Ûeª^nÈ,½°-zéãŽz¸ã-¸›î›Üqwòî_ßÙäN,Ü+ò‘…;Øp_“ŒÈÂ8%¿oa Á0Ï ÁÃæ¼î>Ö™ñf–±göPKoQ¨<>ôPK€Ÿ*res/drawable/abc_list_divider_material.xmluÁJÃ@†ÿi²I½ií¡…‚=õÐ½Šø¼z’,n°uC6 xòaô½|“ú'nH8ð1»ÿÎüÃl„9~lðð‚Ú-†8!gdM.É=y$Ï$I¬)_l¥ÞË¢±Ì¹Û»iš½µ+ l·¶iª­}nÍ!ó»ð°ËÝAgÕ«®×}±RÞf•AûòôW·§ŒO™cÉy"òD¾ ä+j rdDÌ1™Q¿ém(ž—Ã_´5×Ì磚4ÔH¨é¼Â;ÿfÃãEfNûZ¿»®Гà7ùaðSÜ Ód¢õ3¦^Ñdß~/ùç~PKù|9ïàPK€ŸBres/drawable/abc_list_selector_background_transition_holo_dark.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€ŸCres/drawable/abc_list_selector_background_transition_holo_light.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ,res/drawable/abc_list_selector_holo_dark.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ-res/drawable/abc_list_selector_holo_light.xml“OKÃ@Åß61‡@ÕÐ?âQPzhð$xòæÅ“gAc²Ò`Û”d¥G½zó*¨W¿”ßEßÚÄ.%¡Ú ÉÎÌîo6L,¸8´=|ØDa8ÅÂZÔuLQÔ%õD=Sž—«PÉ«Û4ºÏe ߟ¯gÉ$Ng¿á²LN›‘±žf2×y׳p¦sh6ÃIœ¥IŒ~¨Ôô$òh(Ça>(ƒ(áô.àæ ,¶íDÉ1ÊåHF*Í€GáòvÀ+„x£Þ©êEÑB—¹-ê‹¶AïP Æ÷¸6—ï>ŸÒtÍ9ýŽQÓ,jE3ÿ”(öo—1{a},Ÿ¥о]Á°  †ö?w¨àZuf/GpÊ^Ú½\Ów*z±Ö襎۩áv×஺o`p»5ÜÞ?¸ýÎ&·WÁÕsµ»b®°‚Ñ7ËgYKs_η¨ù¾PK{ï´R(PK€Ÿ1res/drawable/abc_ratingbar_indicator_material.xml•QMKÃ@}³“¥"~ÐJ  z±`sñ'xöÖÃ6 4˜ØÄ“þ ýþÿ‘Nâ®]BrèÀc6oçÍ›ìH(|€p/€¿Lp]0çŒ9ãšñÈX1„HcHY•”ŠKý¢×Y‚ ÐÏq¹å+ß_§u® ,›º.î°Š6I®«¥©XFÛ<ÔÅSX&UhUž—ÖIŽÑ(Ó¯Iy“¥UÍ^ï¤0æü ¢}2@'˜2wÊøáf^Áü•Ã7ðyÜvø‹¦æó™Sã›Ñ<‚és¯Ú—Ôöw¸9ü7iæèö²“=<Ž{<.IÇ-çi x±ÊêfŽÎû×ívOÿÚÕY¾;‡ììÈî‚v÷ PKS×4è˜PK€Ÿ5res/drawable-v21/abc_ratingbar_indicator_material.xml•QMKÃ@}“¤ù¨ˆU¬´àAÔSÑæ$ˆ'€Þ½n’…’…âIÿ†ÿÄ£?Ád'a· !=8á1ËÛ™y/;6|üXáßè à»1gŒKÆ ãŽ1R†e¥ l»®bø~R‰µˆ2‰ Pi&Ÿ‹D¾ÀóÄ[R\æºQªrQb±X)U>„a¯d.ꥮXÆEŠò5¬dš.ÇI•Ì1gâ]V·YZ+Öý$3ο šÑcí&-Ìøãp8»Oæ¯;|>ŸOù3ÑÔéÔxºÆjFÏ‚¾÷Ûײ¨ßá.à~ØÚG–јþCãh@㪣1иç<Р=‡Üe¼Í;}£­7lû¨÷¯ gï¸Iso¼õg¾ïÍîíÍì‡öìsPKb7W_*ÀPK€Ÿ'res/drawable/abc_ratingbar_material.xml•QMKÃ@}³“P?h¥ ½X°{ñ'xöÖÃ6 4˜Ø,ˆ'ýúü9þ#Ä]BrèÀc6oçÍ›ìH„øá_Ù à»8`2ΗŒkÆ#cÅ"!eUFøÔ/z%ý—[¾òýujr]`±ØSÜ)UE›$×ÕÒV,£m®tñ¤Ê¤R­ÊóR“ä2ýš”7YZöz§cÎß šÑ't‚)s§ŒiçÌÏ¾Ž€Ïã¦Ã_Ô5œÏœßÖˆúl/Øû°yAM‡»‚ÿ&íÝ^­Çdã¹ã1éñ¸å<íñ #Vµº™£óþu»ÝÓÀ¿vu-ßCvvÔî‚v÷ PKµI0ؘPK€Ÿ+res/drawable-v21/abc_ratingbar_material.xml•QMKÃ@}“¤ù¨ˆU¬´àEé©hs*ˆ'€Þ½n’….&&$âIÿ†ÿÄ£?Á¤“°Û†œð˜åí̼—>¾-€p‰/tð€}ŒGŒ Æ5ㆱfD Ű,•À¶«2†ï'¥ØŠ(•‚Z¥ò)Oä3ÿPKË“õ°*ÀPK€Ÿ-res/drawable/abc_ratingbar_small_material.xml•QËJÄ0=7©m (âÆ'ÛAü×î\dÚÂ[§$q¥Ÿ¡àçøGz[S§”é ‡$7÷Üs“#ã]„S||òAÀ-ֱŨf2ÎWŒ{ÆCˆ"ƒ”Ö¤ˆãÌèg½(sD‘~ÊÌŠ¯ÂpQ¸JטN—ÎÕ7JÙt™WÚÎ|Å,]UJ×ÊäVu¬ (\^a2)õKn®ËÂ:Öz£ ¯_ :!¢hÇœÛg|sH?¯àüe/ßDÄû¤íðMͯ½šÐ׈æ|/øû¸ýAmÿ^î á«ôs {uÉ?4v7h\ô4’ sïÏPƒF4v˜ÕñŽz¼à·öžFÞ:äuùáràQçx÷PK4·g[˜PK€Ÿ1res/drawable-v21/abc_ratingbar_small_material.xml•QMKÃ@}“¤ù¨ˆUŠ ÅSÑæTOþ½{Ý$ &&$ Å“þ ÿ‰G‚ÿHgÃnB{pÂc–·3ó^v\„øvÂ%¾D0AÀ¶1b0N3Æ cÉH9Ãqò ®Û6)Â0kÄZ$…D©¼OU&Ÿâ5k*.óý$W¥¨1Ÿ¯”ªïã¸MW²íÂT,ÒªŒEý7²m—çåJ– ñ&›Û"oë~PˆsÎ? º ¢OÆÚ#M:þ˜ñËáqöµOæ¯{¼ŽÏSþlèšGÎ'½šÀÔ8úaÌ,˜û°{-‡ºù=î þ»k| gYé?4ŽvhÌzÓwfgC Ú£qÈ]ÖÛY¯o´ñ†M þUsî–›è{ëm8ËòCoî`ov?´gŸPKak\)ÀPK€Ÿ+res/drawable/abc_seekbar_thumb_material.xml­“¿NÃ0ÆïšÔJ-TjQ+Ñ©CÃe`aAê€ÜÄ¢ÍÅ,eâYyÞ.’M­(†¡\ôÉñ¿Óï,Ùæ.Â>`T À%l¢C“&¤ÒéŠtMZ“^Hí¶Lò[ž²ÅŠG?û¼àBоټ+ØC,ÁqDB«f)IåMüÄ©ÌÒ¨ÈâMðˆï¤Ò!"¾’;0 Z—ôE±Ck“Ô ü©‘/c—þ{ô¡ºòœ«ê>À~¹–¾9å Ÿ¯| ÆOçÐÒ«gôòjz56¾nWåœMÏÀ[;jÎj/¯òêùû5sà/shæÁ?2,Ì} óðfÛ=¶d>7˜Gæa ó1­G5Ì:4ßxK¾™Á7¶ðU9œÊûÐï-ïæPK8[¶Ø`LPK€Ÿ/res/drawable/abc_seekbar_tick_mark_material.xmluAKÄ0…ß´M[ñ²¢‚‚¯+lÀ“xòxÜ›¥-›â®)MAð¢¿Ã»wÿ¡¾® [‹Nø˜ð’7™LŒIÎð `>¸Á.ý€œ’srAîÉY‘45u³2=”znªÞ0;S´5si×¶C–OUg› ó¹éûöZkWšzS¸…?X”v£‹öQwµÓár(“$®yª9»¦Œ7ÉqÂwïDdIÞÉ̶úÐë#aV$¢~5Ò‡H¹?âÿÇí=ž3ñ¾[æÃ‘/ó¾häÃÎ'—P¯êg„¿´Ø÷6­z;éù½Å£zûH%Ô›úâÉ Â_åŸÙ|PK÷&ôÈöPK€Ÿ+res/drawable/abc_seekbar_track_material.xmlTMKÃ@ÍG«ÁZZ[DúE)ØÔƒ R¯žD¼y”˜,4˜~,ˆx°ø<ŠoþŒGA'1Û.±‹š ]&óÞÎ΃UÁ€™@`ÞÀ„$À9,¢ˆ¨ šˆ]Äb€8Aœ!îˆGÄS¤c†Ìfô’Ží+Ÿº (ž †áöM”]w&þ$€B!tlŸ^x.‚¦í÷û;ÏÛc7˜ Wu»CƦG–:C:²Ã^RÐs&#Ëž^[ -NÒ4Ñ*ûö- ö|/d(ƒ„Ô§CM€1ðÖ/@Èâ™òŠø@)B ÿm >1r¸ó!E÷eüxD5§¸–„š•¤F‰›h‘ä¿oë ¹cÈÝ«Ii­èŒÃXóçDrÆ:²8¯"ðVç<˜ó4„þ½WuáÞ›omɽ#íêÒžÚ°è©$òj/¿„§ w1!GølÒ<ž¯Jf¶õK¢Áƒ4çÓ3áùôŒy¾,é«þ/MÁËFF/›ð²•ÑËvF/Û/[’™u2zÙ‘xÙ”xÙxY—è¤ß"yO¾PKDQŠ|¨€PK€Ÿ:res/drawable/abc_spinner_textfield_background_material.xml“KKÃ@…ï´©M_PEl+ö±pU±Y*î—ÅŠ¸‰É؆>R’qU—þ7‚ Á…[w>þœž)‰BÖ)sçäæžÜK'M:ÝkDŒ¶¨ÈˆJ,ħ´XeÐ;`ƒ¸}ðžÀ x¥’/LÁ/­·†Üþ=O=îû8ëºí™7æÕˆS.çL|.ºüZP>?Ïœþ@ g~8w§T(ÌÃ#WwLÙ¬9±=×±©Ý1=0 FcÓï:–;6ÌéЀ&g2ó"¤iŽàcxÌ[îíŽ_zù|Ä-ázDwL§môðLŒ½‚GÆØ;øŸà +S9«à+‹])èBÑåÊ!^ÇO f)óÒÁsĬF™™Ô´-£­D4é)¿wCñ,žá’9]ì%'䤔ï¢EíµPc-ô«*µ 1~ûØk1~LñK)½ôhe–æ}/¬·¹D½C¥^ô½Pöê•Ùs=Æ_íYæ4þ0—æ}œ(}4æÒúç\Z si$Ì¥žýï¥#÷#¼,áÞüPK¦¾Ü¹˜ˆPK€Ÿ*res/drawable/abc_switch_thumb_material.xmluP1N1œ=‰%ˆ E$(¡I7ˆ7PÑQEæÎR¢ä¸èl‰žOâG0Ÿ°N0ÖhìÝñ®× Îñ `„Æ®ð‹)yF^’wä=9™ø`ƒ[UkWm] ­ëÎ>Ù‡Ãxlë®ÝÔX,Ö!ìoŒñ´5Ö/SbYµ±û­éœ7½¹,7Á5,äÝÎU¡íð"ú»÷;DÞD2Åœçcò“(¨Š,¿ÈâÜϸzDÏ-õ$ó”ÉS$JsšÖ¨êç;ú˜aô¬Ò;†µbkêé=$ë‘×;Ìê ï©Á¼ý\òÏ?|PK ¯P»çÐPK€Ÿ+res/drawable/abc_tab_indicator_material.xmluP½NÃ0¼/©ªò30tD:Ô â˜ØØXI,µ¢iªØ#¼ ïÄûÀYµEÁY§³>Ÿïûl/s|¨ÀÚ~qBÎÉyO>Ó©6¸Gï¶®®ÖMo_ìÓÖa2±»¦ï6 –Ëuûc|½v­õ«t°ª»ÖØý³é7Ù\–›àZ2»>ö~õ"ï"™á"ÍôMTE¬_êGÜŸseDÏõtà)“§H•4žiZ£ªÃ—äšÜ¢zUiŽqVìqM=û£‡ z óŽQIÎßS£÷æwÉ?ÿðPK‰¹ªéÔPK€Ÿ)res/drawable/abc_text_cursor_material.xmluOKÄ0Åßôÿâe/^WØ\Å“À« 7K[6ÅÝMi {òsx÷î7ÔךÐRt /ó&“„È€à_p!ÀÆèõSrEnÈ-y&¯dC’DWõFwˆãC]všÙ꼩˜ ³5-Ò4ß—­©K¬Vºëš{¥l¡«]n×î`]˜Ê›7ÕVVùbß&Šl}ì»Y³¥ŒwÉpÉ{ŸDä…|OYúùfDÌ1 ¨ßMô>îϹĽq¨sç°„ó=u£/u¾`âÃè‹%øÕd¦…n¶y/?ÛÅDÏþ˜-ûÉ ñýæ¾pöþ­òÏßüPK-‚/ñPK€Ÿ.res/drawable/abc_textfield_search_material.xml•Q»NÃ@Üõ#v%$A¢    RÜ"5 |\ìC±ˆãÈw@A¿„ø>‰˜KΉå8Öíknç|ëRHŸÓ>}!³ÆD§´¶.pgÀ9 ' ÝVZhy}›Ç÷J&«\ÎÄxŠ< “B<š˜:eKÄ:}@PˆYRäiBÃáDëùI©x"3¡F¶1Šó,ó»¨**Éž—j™a´’Së¼À=^8¤=ø7b~^™ùËa&î.ê;À7̃÷õÃJÝX€x€¯4ùïU8-Ëq-Ç·Þôð~=ãýånÔœu/©õìÚ»Õç—ºý_tÿ¢ajnWêöt/:›ºÎ?t¯*ÿ6hÐ8†ßmÐàŠÆ¶yõsnm¿åyËÞPK³g˜µ%ôPK€Ÿ res/drawable/abc_vector_test.xmlu‘ÏJÃ@Ægò§M,- "=ô ×’&¦¶Z<EâQÄch¢ ¦&¤K ž|ϾŽo>”~k¶´ðÛÙýv&³³«“E‘FÄÔ¡5HæZ› öÀèƒ p ÞÀ;ø_ VKâô1dšË4 5›‹4^y)î~×­Öj=©mû!ͲË<ËK²¬"ÉU(BoúÇŽïgî.º§NCà÷AÖ9£Lâ»§‡¡ ; dN5ú/T¯‡ÏQ™§u»‰ŹçͧI< ç®Úp§ùÌ ‹'¯ŒçÞ*Ø0ä)ÐÊ"ž œê•-:Do·Ì|4ƒY0ñ.µÕý|ÃêðР‹ ]Úæûø u¯–òrs“Û•ÆhÚZCúÇXjú–&kÐ6jÚª¦¶QÓXçqƒj,5S¾_µ¯K¯«¾¶ÿ¥oõ»ê‹ÿ¹‡PKBÄ@dLdPK€Ÿ res/drawable/notification_bg.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ$res/drawable/notification_bg_low.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ-res/drawable/notification_icon_background.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ%res/drawable/notification_tile_bg.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ#res/drawable/tooltip_frame_dark.xmluÍjÂ@…Ï5æg)%‚‚»î„:Û">E—ÝI þN˜±ëö9Ü|0ߣ=Á‰ AïðqgNrs'@‚«‚.O¾¨­ÐV­È”¼’7òIÖ$ ]©«‚=3{cEVç›/‡8ÖÇÜšMÎ]fì±°óyy:UK¥\Víþ—EfJW;e §[›ìÌžgàG¤ìgù%aBí…ü±‚úNd@ý½£×qŸr‰Ÿ+ô½þ–ÜF¼ûÒŽ/~à“Ö'~þ}_“7îèÃyƒNÞá=¯ï zó6sÉ“wøPKÒ4€ŸàäPK€Ÿ$res/drawable/tooltip_frame_light.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ9res/drawable-watch-v20/abc_dialog_material_background.xmluNA‚0œ¥M¼ãÁ_À^<?àÑ74@‚,¡<Àøï¾S-BˆN3™vw§;-„ n8pm‹’1×ÌóÈô}[è:gMMi„¡¾d9eˆã¢më½R6-òJÛÄ5’ÔTJ×gÕäVõÃÃ7Ö”üÆ•ä{׈LP„•Ûÿdx¬‚éq}7ªw˜ñ}ɇ\ná´ëÉÏè×·ùü>|4G@Âå˜úÄ$_Ÿƒþä~PK€,¶tPK€Ÿ<res/drawable-v21/abc_action_bar_item_background_material.xmluŽM Â0…ßô7 *.\x‚Rš­¸ñ,¥-´Øšô^Æsê+¤(‚oø˜áM231”‚f ‚è•øH‘=¹’4mÌhò¼¾·Î -Š¢Ÿg{ÑÚ7}7Õ¾ ª1“®íM»Îëõq–¹ÁÚ±ÃC6œ÷ÈGÖ;ò¢¸Ñýó—¿(f}`H¸- yéñΨLDâŸyë?ù³ç PKŽY(äšPK€Ÿ-res/drawable-v21/abc_btn_colored_material.xmlÅ”;oÔ@…ï¬í}²°Ùl‚) ÉÓ€ ЃcY+^Û²‡"U¨ùtH4< $ %5-=%?Î<ÙŠHÃDŸ<9¾g®=Ç;uéc›ˆÑEŒh™Ê¹ jŒÀ*XSp Ü·Á]ð<ûà</Àø ¾ïàø ~á0žàxìíF< ÇÉg^Êqõ“(ɨÝμ |š“mGü‰ ËIŠ»Y¸7¸»›‘Ì©× ãœ‹{²¤ß/æ÷‹Šn·øç!LƒA1½ó×Ñéxq%a€™Ÿd1ÏrÚÞž ‘ÞrÝÜŸñ¹—ï”%;~2w½tßÍxî*›ãËáÁBÁåz©a¼'9LÓˆ£wÎ#î ¼FõZyÁLÏX—nâý_c/c¯Áð¼ïÁð |_À 6*2X¿1Náz´  M—ã æüÙe~²®[ÞÇ•É9”Z¯FëkÚb© Mö”ï°¬õ—=™Ö³UùZWmƤï´Í7*}j¨š³ZÍbMì®f½?UýǺoMóMj|¬òtßyÍ7¬ñYÚ>­bŸ¬23Ó§Ö» éKÇìßìŸZÏô©oࢦ/Ô|¶ö|“2[GÓ–J­]S×1êÔ³˜=•nî±ÒÍÌTÞ—ù&ä~mœ0·Íæ¶ÙÛÖ?äv]Ëm«!·éÈmÚÛFCnf>J7§J_i¨7Ï Ë8×ÔùÅλ?PK•±Åe&´PK€Ÿ3res/drawable-v21/abc_dialog_material_background.xmlu‘½N„@…ÏÀ² Éš]Km¶X+cbc«…1Z¢—ÂŒµ>€¥•±5ñ üyÇ^„¼äË\sîî˜pðeÛø°Š*pŠ&2&[d—ì‘CrL.È%y ä™X–Šƒ,âÊ…ÌaÛy0OnF£d©"}]i¸n™Ÿ%×±†ã”/ç2ƒç•é‘ÔZ¦ƒå<—ÉœY(óe”+L§±ÖÙï«0ŽÒ@ͪ-³P¦~Ýøy¤üÚfYe¹Ö™”\P¿vxÖ'!Ä y%oä|O1Æ„{ÖÈcÈuD 꺥á2_ç3¨fVì3«ïœŸEK© z4«G³;ZÑsŸÚF«§Wõ­žh|Å•ýù6[>§Çg4>#€qgVÿÞõÕõ&-}¥§žhê ¶¨ëu}µÞý/³3ûzÆâŸ;ùPK§«šCÌPK€Ÿ+res/drawable-v21/abc_edit_text_material.xml•“MkÛ0Çù¥q’eËÊh3HÙ=•5.¬”2Ø¥·BHÇ; 6ÍQg³Ä6‘F[¿C¥×ÞzÜô ôKµ¹Æ9T懤¿^žÿ#É.tæ1êÓ.#ê’)h¢EÑúK°öÀ[p>2pNÁø ®Á èt¤âJ|>΢RLîû"å_§V?Ÿ ©Ç]WÎ#ò<•¤ŠšÍ$•Bı¢V«h¿O¾ÅŠ‚ è|Èrj·‹æA¦T6#ßçÓ<æÔhðt2Ï’ mmÅJåoÂPF±˜q94Ã(›…<ÿ"pXNöýb3ÄO”˜!fš¤b;ç*ŠSŠ©ˆT6×gò‹ÅyœcàÏœ¿žç›ñ·³MþO­­Ôh K-°´WÐtÌMhkVÌ'&fYôœ}ÔëÖœŽ™Ã,_l±÷j¹î êžµî±YçZë\ËÓ­>½…æ¼#§Ðš–ögìšs¬î_êU¿ÚÏu¿&ÇòC•<Š»©ÉMïµQ“›óÀÜJ¿Kòè×ä±iþÃjöiƒø×ø[þKüU}”zõM¹•w_¾o¶ä¸PKâš$ΔPK€Ÿ.res/drawable-v21/abc_list_divider_material.xmluAOƒ@„ç xkLM<4±½rèz4žü^ñd Kl a71ñäŸñî?Ô¡.úÈ—·Ì2þ ‘" Á ßÎàK€;Œ•¹$k’‘GòL^H¹úàǦª_ƒRïué {ÑìšI’Ê®©Kd™q®½ÕÚ¦Úçvë7¶E³×yû¦»Êêác¥¬ÉÛŠñ¶þ¨ú×fGø”ôx–ˆ<'òE ‹£~N~X»"õ›‰ÞWÌõ’ø•ïý^JË5DßrâKOøÂÑ·âò*ôç˜ûú¼{ö‹‰žø¼`’'cžâT3Ì´áó¬pvìòÏÝüPK‘tb@öPK€Ÿ3res/drawable-v21/notification_action_background.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ4res/drawable-v23/abc_control_background_material.xmluOË Â0œmú:VèAÐ/è¡éÙ/ðàO„¶ÐbkBZÏzðWÿR7˜¢N6ÌÎf6)*[ÜDð`­Â)sÅÜ0÷ÎÕzÐqlUÓŸ'$‰:5V÷ Š¢›g³“rª»vTSée­G©ÌQÚv’‹™ç{c†Öe\)EÆõND&(ÃÚç>WÁ X?|é!ßs>ßWøêz¼;…/âý­E‹(gßOÆòýÉ~PKG¥r®0PK €Ÿr#UΩ © $res/drawable-ldpi-v4/ic_launcher.png‰PNG  IHDR$$ᘘsRGB®ÎébKGDÿÿÿ ½§“ pHYsgŸÒRtIMEÛ  1ûÐå )IDATXõ˜{°_UuÇ?kŸóûýîïyon’H $ÀT ÐŽV,0ã Ð¨Q‘Ò‘)%R:–ŽVÇ0H*ÛŠ“Ò2*IÔh#J á0‰$„ãMÈ;÷ù{œç>{õsï…”Kå*Ý3{Îï·ÏÞg}×w}×Úçl˜D{æà5úŸÏwüdÖ¼0ríYßñ¢ùou¾™Ìßߺk±§¥µ÷o8§86¦º¦;q÷¢ºz‘êú9¯Ÿ¿Goœ÷ò®}?zòÑ}·jC˜d»ë‡ç>PŸâ¿ô±s¯ØeÍÈg·Ð¡^[_•ˆ Sé긬ñÚ7÷ާ¶=´î‰Göݽüæ­÷¾­€Ôiü™ô°õà gfÒznÞqsññ)âÑŇ`7±ÆDQD–yþý;o¼dÃ)"‚ê"D¶ÿþ!Û–^7¦éîü䬙=¿˜=c‰d™ŠÐ­E2 pUÕ¬LÅœ¸¸|ò›Þûã»>g–ÈvîX½äí Ù÷O™ÈÈ7A+ ¡¨VD=°dÄ&!aÐ!m·[Äd¸?y(ì¸Ëwlï?¾‡¼zó›ÚñÞ ˜Íñ§g¨ñîLöÌÄÍЊ{— ºíb%%•ŒX-q–’$)Q˜G ÄÝ2¿ñ 9:²S;AëäNËî[öÙ›_sˆ¿ûú)lxdàwϲV3øÄ`ûÈ‚¡á#Ú_(½úÇÍ”V+¤Õêä½Ù¡Õ ÚA'[åäé—2Ã\,©pV–_³tn à«ýòäC¶jó‡¹ì×ðÈî9 zœÆWG\)†ÏGÔ Î9¬uØÔ’¦)Iœ‚­3ptXÕXi§ìß3|ó½·½rǤEýŽq0«6_vz³9ÒÓnw;™†Q“ $ b:í0a… Ilé„ý?›X2ë°‰»t"{÷üøÝoô›ìsミ|L–Ï ; QjZÉ5’ QvF{…1I”’Ä–$ÉHÓ ›eXk5MS\& Çž{D¿pÆoô¦µ)·ëL|€Í71Ï»Õ+1xW‡Ö{ú~9pD>wpû¬ïéì¼¼Xô?TïͨÔ=Š%" (êU£ Š/bp™b%hdp!³6¼~ãÀM½Z´6Ã_¸wð³âés¼ê=O]píߟt¬†~²çŠûT“kT}ú÷³çל¶dîƒ3×üèÁºcË€4‡bTÁó Å¢‡çÄ€ê4×Q¢Ä‘ŦF„j£ sNœ*µÿ¥y§gËOÿ¸ZwKº*!iâ¤5”ÑÊJcޤê%™UP%³ŽÌª¶üX½vÓâc "£ÄŠ êˆÂ‘"¾)b37¶ž4qÄ‘4 Q¤®TQ‡€@n ÔsBEËg9u2‹¤©ÃxŠ8q(€BÁ«2­¶˜÷¿{)ÊL~¶y»þŒ,m“Ú,/™¢™’9‡:ȬŠSp™Ã9Å©‡q01Cê L)8›¥YF¾8Œžê\Þ1íþO˜Õ»h|ý…gÞÊÙíkxiï:vø9ûŽlÅ9p¹ÀÀ)žgÄejTóDÈ xmÃð­’&¿ïF³GÕevÔ»Ìá²2r¼ïo!ç\d”{¡»6“³]ÅѽE^i¿„)ZÔ)¾WU¥šS¬NÕ9ÄeJ$á„…Q•H’w@M$wÎ)ªÂ¬Þ38ë´K¸õ«—òü–Ç ¢Î¸ž’4fÏ«;ùâ]Ÿ"Hú¹ð¬[£UÅ3%Q§8œÉŸ…ŒŽÑÄ«£I’Ç×am–U4ç)I²pþ¾|Ëj~ºñ~V>üs¦uŸÄô)sؼã1ªµ2Ÿºê6¦O™ÍãO¯"K5/ .×°o<_uЪph_N,jLâTÑLES°Yš8ç0Îä‘%÷çüqÒá™-³~Ó7¹þc_§Vm £åM¬UL§(ÎiÎ:êh»;ñ^¦ÒÉSQÅ9Å9k ^Î˜Ž…íXJÅ*'·˜3¦S¯vƒˆâ\ž-šiþÓQrÁ;H&$"a®ü|‘SEŒ¯ÂêFsñµ|{½ó}0³(‚ªÉ‹¦¢ž/^.ê×€Á›0$H¤.7> Jœ³é˜®Ttâ7=ƱüZ,s'œP*4P‡bPÍ3x4q<Ò~# 0°{mj°)ز”áJ×+â ýÕÃÛXùÐr†† ã5‚‚6ž]Ç«ï Xì©‚D«YÔá9µµAµUgãr&YmÀ¹•‹¯XôÚ+ì·Ö]É ÷숯+ñÜð€l:¼?¸ýüó/°±m}ܺ&b b”m»×óÜæGi6ÛÌš¶€Ô&ôü%ï<õƒüô‰Õ|{í—Y÷Ô=Ô{Á÷ ‚QO22˜ôÿ÷ò­7œý¾SŸmTç½ØiòÝ£ƒ»o»ìÊ‹íú‡¶°ëWGsÞ~ïGøÂg¾ÀEWœèÕ»Õ8téVl ï[õï8ÜÚÔÚ>õ >bD\–ïuI¤$í:'Íx?Ãéve¤…>üR†_ðrÝ©¢Y"³ùõÎW]ùï›?8QÈ?}Ûy|ã‹OûúñŸ]ÌwîÙö†ÉŸ¿ó¢‘ö]ÕU1øO'šoŽ "ÃC!¥R,-•}ÉsÍZ§6qâÒ:I§”ìÝ·}ÉÚ‡_ü½>ƒnYö!Û¿ÐZŠÈ-F­ÚU® ¢8¬B&ˆAŒ‡ÁÃ_U=Q'šÄ‰t:­8 £Gðù¥û—ízú²ë &eõ7ú&hé²ó•›×Œÿ¿úo—ìÜ¿oÿ‚z½Fwoz£A¥R‹J¥’ú~Áãù6ML„ 0ÔßÁEå»W¬ˆo¬Ë½vééŒ4[¬ú×¾7µéÿ_€ÆÀ¼çrxf%LYJ"ëÓ Ü‡°±ùÚ³ëÞ È{/™ý“N4òJ¥L©«@Á/ãÓÕ_—- pßW~õ[?¹ü·t ³2¿Vë~2mf™Z]i9F-I`ŠS»çËÇoxWeçîç]¡\¦R/S,z*ø’vdRþd&JÆK‚ñ<5Q'4‹χrÍwe¯H­QÄ÷div2Ai»Î‡D¤%Æày"ŲG¹V \)‡öiµQužrZë.Pi´«âSê2xžtþßušñò,éJŒöPò¦R,Öe®¹`öq+Ùw¦NLï=Az{çàü­‰ŒüפœžÌäs?RæŒÓÎõ¼òù¾×EAüĆ¿øX~ÿú/Í7=þ ÔU[â™ÒÐÀ‘Ã[¿öù'‡ÿüú30~Ì·ÿååßjã…ž¿‘—§IEND®B`‚PK €ŸÿÌ»•  7res/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png‰PNG  IHDRµú7ênpOl“µaåtnpTc 08 ÂöY.IDAT(ÏcdPgøÈ€ð³0|dxG0 ø> Æ€baàÇ+ÏÎ5BX¹.%IEND®B`‚PK €Ÿ°£²ˆCC5res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC5res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC5res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC5res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ‡ùHMM:res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM:res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €ŸúŽUOØØ<res/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.png‰PNG  IHDRJ~õsnpOlÿØdTnpTc (0 «ó³ÁIDAT8Ëc`£`ŒR#ÃÒ40‘jdü‘½IEND®B`‚PK €Ÿùž9 ­­<res/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png‰PNG  IHDR Ùs²tIDATxíѧ@ …áÇi4Ž9î$ Xìf` : Át˜âÇPãCý¢ÓõÎþþècȇp¤Kçþ'Ö i)† 2{†4£fÙ=…)ÌÞ’™"T Q8¸§ RuC‰ÄNGaIOq$Ú4ô¦þþιžoEª¡0IEND®B`‚PK €Ÿ Ç……7res/drawable-mdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png‰PNG  IHDRJ~õsLIDATxcøO"„Pÿ_þǰj)'IBRO¿¼ú裂_^¢i à4 âF5@á°Ñð Oò~Mƒÿÿ—8•ûÂ4oäé…~¤RIEND®B`‚PK €Ÿpåpûû3res/drawable-mdpi-v4/abc_ic_menu_cut_mtrl_alpha.png‰PNG  IHDRJ~õsÂIDATx^ÅÒAJÃPFaÑ&Ù€)F÷cšÆt"HÝŠ’8ý„@¹ƒpyé]çÜwÿ»¿ÂƒÁlrrئ¸®#Z@{{ЩÔzSý†Õ25=0¡Ž@¢Nè5o8'zàà* ÍõˆFç´©ž-© ½ùp ¹€g\|²)âe½~Þ¥إÔ%x,|«¯vöúm‡›±[¦ S¹öËT—Ë]ªÔtåzG—ørŸ_Ý¥.ôÿâì•uñoNv¨IEND®B`‚PK €ŸТy옘8res/drawable-mdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png‰PNG  IHDRJ~õs_IDATxíËÅÂ0@Ñ\epÆ@÷ÂuÄÈ ø\ê®økía´¹rçÆ‰¦È‚¶uüOK4^]xæþ@ã7`ŒŸö€=Ùç¯bÔüƒ`H£üÁü;Sñ$ýPXGPvIEND®B`‚PK €Ÿmv«µ‹‹9res/drawable-mdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png‰PNG  IHDRJ~õsRIDATxc´ààÿ—`°Ò¯þû£jx S€“~I_/ ¬Æq²5`hÄŧL²ÕxÄ KÐÇô‹z§¥W“÷ T þ2Ћÿ¾ƒ6÷û‘F]ýIEND®B`‚PK €Ÿ<œÜ¶5res/drawable-mdpi-v4/abc_ic_menu_share_mtrl_alpha.png‰PNG  IHDRJ~õsÕIDATxÅË%‚U@ч»&4±‰%qVpw¸;$6Àp÷qŸaÜÝÏ´—¾ëÉ÷ùf–Gzt{`VbÃ#÷zt%’/0 3^<ÙM„îÆÎ×ú†'\Ó©Ó]3£Ç+½Â¸—–Ff{ªG·[ÎêÃGk‚XÜòß6“‚ØT2'ˆÏ?á`^"Ã~!õ¶&²ìõS¡‹6¨Á[«ƒD™íŠAcîYœø´Êk´Úí”RÅŽšZ§LÈ¡ >34ø$Bq²ÃQû&9ä?ažjGiï ?IEND®B`‚PK €Ÿ°£²ˆCC/res/drawable-mdpi-v4/abc_ic_star_black_16dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC/res/drawable-mdpi-v4/abc_ic_star_black_36dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC/res/drawable-mdpi-v4/abc_ic_star_black_48dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC4res/drawable-mdpi-v4/abc_ic_star_half_black_16dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC4res/drawable-mdpi-v4/abc_ic_star_half_black_36dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC4res/drawable-mdpi-v4/abc_ic_star_half_black_48dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ$#d5§§6res/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.png‰PNG  IHDR:~›UnpOlÿØd4npTc (0ÿÿÿÿ¼V\¸ IDAT×cø¶îVIEND®B`‚PK €Ÿ‡ùHMM0res/drawable-mdpi-v4/abc_list_focused_holo.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM4res/drawable-mdpi-v4/abc_list_longpressed_holo.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM5res/drawable-mdpi-v4/abc_list_pressed_holo_dark.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM6res/drawable-mdpi-v4/abc_list_pressed_holo_light.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM?res/drawable-mdpi-v4/abc_list_selector_disabled_holo_dark.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM@res/drawable-mdpi-v4/abc_list_selector_disabled_holo_light.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ¯ßþÅ;res/drawable-mdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png‰PNG  IHDR@à½3ÏnpOlA‚Z@ÿë€'WnpLbæ°½fTnpTc (0 6 ÿþþþÿþþþ=-DIDATHÇí–Mnà Fcü—,ÒM®Ñ£µg­r‘nª*Š.À±Ôª Oºé 6–¾ç™þíÍýâ;–¾“sµw«ù¾²‰´šod³°àt,0ûˆ' ’H$uÅ×χÐ!Ú;m{á@Ô>ó¢×¿öÚ2È~YxaaÁˆ@ÄeO8ÏÈ‘çËküŒÉ¨}¼½pæÄ‘àÊ>çïã…“a ¼Ë3W®ÜXòVx¨=³©<<1ë†Ä| €§gâ`žyDÏ—Ôðë™ÍfF†gHÍžÉ`bÀÓ•kE°¶á>È¥&â ÖÖ+€+ù¬m“äšÊQ´¶–æY4û ÀŠü\­íï²)håxÐ*–µå’\dU±#›9ÀMïŠ +Ç–‡hÌ_j¢ÄqÊUØ9IEND®B`‚PK €Ÿøä«Ð9res/drawable-mdpi-v4/abc_popup_background_mtrl_mult.9.png‰PNG  IHDR@ ”¶npOlA‚Z@ÿíŒQ©npLb WòrTnpTc (  0 6 ÿÿÿÿ(á ò/IDATXÃÅ—Í’Ô …?™Ø•Òó¾©>ŒîõeÜZn­ÑIw€.¸!t—®ç¦:]YÃ9÷xáPé… è—VÀ\É¡nõi„’þþ],p…`Õø¨©üRMB¥\£äÑ•6ЉH’'$L• Š–·nL ‰"Q¾÷P Ò0`0!¡H¾±±€DT6D¡1LÌ<ðøý}\S§ˆë·<òÀÌ„É+ñ~À021…¯zêWtÑï°X<H2%ý wLœzƒž8U¦HP¢ÁÈÄܽóÌ’ 9Ã’¾!pêNàÄÄȰ§¸. bB“*SÇ,Ȳý Œ ·êJèc}þCUTèCñ_í XU$þUcꫨšÏÀ?¬@Z± • ÝAJÕ„t5ŸãÞºFFÙ1“®ø$"¡;Pö®-Hy\:×Ý9Èé°`—?ðØÏŸœïïý—XØpÒ6VÎŒt#"‹eåŒÅ±]+D]°UF†jD W˜ÇcqEtÜŒrîÿ^¦j`À~¼$U¶á«B¬®f-®,å­Öò}1ò.÷‚ãft܇2¸>FÙˆ(΋ÿ$ø `Ðxã°i´IEND®B`‚PK €Ÿ°£²ˆCC<res/drawable-mdpi-v4/abc_scrubber_control_off_mtrl_alpha.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCCAres/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCCAres/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ‡ùHMM:res/drawable-mdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM8res/drawable-mdpi-v4/abc_scrubber_track_mtrl_alpha.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €ŸNßr GG4res/drawable-mdpi-v4/abc_spinner_mtrl_am_alpha.9.png‰PNG  IHDR]\eºnpOl  ÿÙö*PnpTc (8Í ¼ŽIDAT(Ïí± Â0Eß¹"m 6`G$¦2Cƈ˜€ôD""AØ‘ZÄYòIþ_ïÎ~¹biFEó{’ÁžQPvÜ6,êè}=£z“øvâE}êzŸ¹4…a§NNj·¾ä&pc¯joóe¾˜IllK‹ùLÌ€+‰¹æ&R«‰g4JÊ¿xy¶u41ø§IEND®B`‚PK €Ÿó?.—‹‹6res/drawable-mdpi-v4/abc_switch_track_mtrl_alpha.9.png‰PNG  IHDR¦-wnpOlA‚Z@ÿcÊœi\npTc (8 9êøÅÆIDAT(Ï’1n1DŸ8AʈHT”œ!7€«DÊa8m: Α.)¢ˆ"صý(Ð&Àz!ÉëlÏé{þ#pîÚO³šÝ»qi4kò>٨Ŏ¢n_ûîÏj2}“I}sz1bç6³—4êÀpî¿R[k´êò¨‚²c»S•8‘Üqß]õÀ È\õ øâ°ð üìà(´ì€2hürf÷ço½Ü{/¸Õx¨È+åKîݸ,ßo99ü§ÝPIEND®B`‚PK €Ÿ‡ùHMM7res/drawable-mdpi-v4/abc_tab_indicator_mtrl_alpha.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ}ȃËË>res/drawable-mdpi-v4/abc_text_select_handle_left_mtrl_dark.png‰PNG  IHDR,»e~Ê’IDATxb 5ذï¨!Œ®‡Žb@»uT0€Q¸Ê",Â"ˆ ‚F"ˆ Š@»Î<Üç}Ø^èå^IuãHXß«41–§ÀÕ‚“̱–#µà°8¯®:0Ç>ðr#|Ái5°_ üéÁ'‚³üN;@‘¿)< ÈÑ –G€¦žùû½{ó$v5^árIEND®B`‚PK €Ÿ¾üM!ËË?res/drawable-mdpi-v4/abc_text_select_handle_left_mtrl_light.png‰PNG  IHDR,»e~Ê’IDATxb 5H¨ív „ÑõÐÃQ@ h·Žª†0 WY„EXDÐHDA¨`×ùχû¼oÛ ½Ü«#©±n Áë{•&ÆòXáZpÒ9Ör¤VçÕÀUæØG^n„/8­ö«?=˜£ãDpV€ß‰`(ò7…9šcÁòˆÐÔ3¿×›[Øâ¢ ÍfIEND®B`‚PK €ŸY˜77@res/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl_dark.png‰PNG  IHDRúKÝvþIDATxb 6ì;Êĵ€ÖêÂ&‚0 0‘“8Û îÐÅEqw-‡z°pèâd%²soÎ]g“/¾oå·‚ø@¿‘ xý„b8Ô8E¬—à!ÜA‡Ý„¢ØCi"Ä>¢·´‘Áv»7Û@éPˆMDHAº”B¢66 Ò£Œ6Š1/>=ÃÑà<ƒ §- >BŒ»»?res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl_dark.png‰PNG  IHDR,»e~Ê‚IDATxc lØwÔÌ0àáàÿdà÷@¼ˆ€X`ð;ÓñCÇÁ<9áè¡ã`j¾?Ôü`<êàQ:xÔÁƒ×5' 5 P9Yì§G¨€Š6 W3s>›3o(8:a úx@|Ÿ”4KI2<$;D‹·ô_IEND®B`‚PK €ŸØåYºº@res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl_light.png‰PNG  IHDR,»e~ÊIDATxc $Ôv;ƒ üŸ üˆ×q ~c:¾`è8ç!#=tŒÀCÍÁ÷‡šƒÿ¬ƒG<êàQ:øýPsðú¡æà„¡æ`*'‹ýôhPÑÁôjfΧ‚c`æ G' T/ˆï“’f)Iyê#¸6ýËIEND®B`‚PK €ŸMpÊwµµ=res/drawable-mdpi-v4/abc_textfield_activated_mtrl_alpha.9.png‰PNG  IHDR áy¤ÔnpOlÿØd8npTc (0 êkBIDATÓc`怑á?v &\:1GÊõÕIEND®B`‚PK €ŸÚ&oŲ²;res/drawable-mdpi-v4/abc_textfield_default_mtrl_alpha.9.png‰PNG  IHDR áy¤ÔnpOlÞ[6œP8npTc (0 êkBIDATÓc`怑á‰:*åàΜ¾$IEND®B`‚PK €Ÿœ ™h²²Dres/drawable-mdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png‰PNG  IHDR  *&¹npOlÿØd8npTc (0 ÿÿÿÿ=)ýIDAT×c` 0þÿ]/5‚äIEND®B`‚PK €ŸÌ瑯²²Bres/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png‰PNG  IHDR  *&¹npOl5D®_8npTc (0 ÿÿÿÐpK¶IDAT×c` 0þ¯Ç.#µ€º\Ö IEND®B`‚PK €ŸÈñâžuu$res/drawable-mdpi-v4/ic_launcher.png‰PNG  IHDR00Wù‡bKGDùC» pHYsgŸÒR vpAg00ÎîŒWžIDAThÞµYi´U•þö9§êŽoÈ{^&I˜B A& ˆÊ ‚( Ò "¨­`«¤— b *H£QédÅZTše†f !aJÈKHÞ”7Þ{ëVÕ9gïþQ÷¾€vK²ZÏZµÖ}µ^Uíïìý}ß>çvq<Öó8¢ëcx%~ÖUOè|¾TÌo«ÒÂ=î•V|› Šb0@@°°R—„Ç\UŠA'£T¤¼X¸½º¶Ì}M'1ûx8øVi‚Z"]J¼03Ÿ¼êo `Mz6 ºŠ4ÊhQ1“G°eZ­¿ª,b§H¤ Ó(Ä$Fñð:,,K’Ô9NØÔ©hL\eX–œuð߸õ…cT·‘j%€Àø×³W¿c\zg‚tðÃp DiáD(ðmšÙBSˆhû^ GT¥Ú!GUôS[QCê‡ÀpÌäœ(—²r)À rÞùÔú_N;ââ]#±.ˆµuØTðȽŸ¸p.SÆÄ¶VZA×Ë–dCi/óþ»ªèß?Aì*èÓBD)ÆÐƒ,RXİðp`Xöp©‡M=œeÔ“Õ¢Q@´³©üüs5‚¨‡™­ž{àymí?n*žüSß_Mí €8r \?ÊØC‡aApú·#‰°›mÍzÓâ>¶S1âûˆG‡±XÄœ"±iì&6Äq‚Vµó:Î'åÛ àX‘º´küÞ‘íÎ?ÿø°*u ‰ÒwŒí}àŽ—N"Ò¢ÚXÆ{¶ûv¶ÍþçÈ÷c¤Úgæ–?‰ù“°=Y…ú³ðA" @A`ÏðÞÃ9k-\ʈ¢ûL9³;ŽGˆItÿºKX©²"Rß>ÿ죎*@Ë×Ý kßÙÞ€K  cwR¨[Û±ÏU*£¹zÒçRçͨôb²®cãð]ˆa!&iH5Ø3œs‹á­Âúžßabálظiu ˆ…éÈË—Üó~<„F+êgæã¶ÿogþ ê–Ax!¼ðê&ÅT­ ‹o™Ø±ÛZ¡x–õQ¤É{|¢"äseR D€9“EïvdÂYFœÔ`cêXˆ3~d8Òƒ}•난\`ŒÖ¶Öê/ûêp`¼4ü Ö=·ÝÑkxßþ'âØw¼=›åta:\€º\ƒ”ê”c¿=&båºÇT ;<@ «Õ±YP‰BŠ<ˆ‚äÄqš•›oÐá=¼c8çðȤ ÃYK›Ê7^V5“º´»åþcT‚1µ_!ø6?#Üõ(²»Å—>´"ËÀKî|T„`qd)QÔ×øâ¶Q¸Z…t:+Ð*Ÿ™Ï%vûO…¯”Ò¤ŠD (»D‰€E Mžá›—c8'°©‡M<ÒD¤VqÔ»¹Zí~ÅÍõù¡ÍÇž>M}øÜ)üÚ jcù¢R•Q/JAØgÏøáUfÌlÇ!톹ïRþx?+WÜm^©=¸plÉ]øéó ¬'9(LEQ€à= ÂY5ÊŽª/!ˆ„fsÈ{†ˆ€H  @Ž¡´ M1 xÂÇÏ»ù+‹ÏÜ3(ÄÇ-س§Ü_ë_yë«ÞZí–Ï|êƒ8vÆ];8°:ýö ¡Ž ÒÛqÏW̧«2ÚöæÈoöoµWµMhÿÍæµmmÝÛVÿ<®ùSƒ|"…¡R«A¾hæ´!h£ Ôj‰"fd÷L›]>¬TjI£j]UF+ªwK]½¶vì0€VÊJµLPl ê›…Õ«nÆ” %ƒ Ò 1Ê%’ôÕBçö_ùäÆÉ…–T-:M¹£NÛÍıCõ*WõšG ÒÄÃ¥çÞ;xq€0””LhC0!€Òï™êQŠí=ɾûþäý¶E!à‘+ÔŒw¢ÒÄñð€ÇÈvß∩P,fȨ‚DIN¥I¬„SrNt3’˜‹C}l“ž~äòš‚œBj¡F®¤Ql30Æ@)¥4´2ð>…óŠÂ·H¨‡³iê‘ÆÙ×q¤^ («û4µžY‚¦Ÿdäj–%qö[!Nê"‚ÖD¤þ¬»HFN&—*挸B‰À;¸îÇ'S" ÏQ}9=¡nÁpôra.fDöÜP%sgÞ,Ù·”0M –LŽI²ßÜS­Df× eÊ™…3¼ã~è­ˆ#†q@SV䈜O¤£È›N,Üíl´çÙh-NÆóoÇš·b{åUh ÐÅl^ŃϔŠÁŒÌ­Ù‹HææÀ!xïSCD#©ä2í»!´BˆHMHöDÈy/1«L‰ò€Ò iRGT¯¢£< w? w? íåiÍ´àÝsÎÂÂ=NÁúîû°úµ[±¹5X…°uGpÜüop`B-Œœd’KÍà35#¢ÆzÁsÃfÏ\"C™*€ú-f®³ÏîeÙVHmå=qÒ»ÏÇÌÎC[ò™©Å#4y,ÜãdÌŸuúF^ÂÊõ7ãù×ï†Vùlö¥éØâ”ÒBav¿™ ¶ñ^a/Y;ýÒ†¡•Vrãh¥A!(Pd\fHçBSD¥¿ Ý/[äLK6…â&Õph(xÎŒËèéXëW9鄈/œ)C) ïSÉ>Ugø "ìœKs`öð¾±xøÉ›¡U­B@7´)Ê5fBjc´vÇÇ_Žu›îÅ%ßÿ(žXùG4”ÒYÿÃɵÒxsÛ&|ÿ'_Ä~>>pÔGpؼOa¬2Ò ( !°ˆfaÕÌ@“# !rPT${ÊJ¨µ4P#åÍ ›3“Í8gqK“Ü7â$BG[¾|îRl|s þpßRÜÿä/pâ{/ÀA èëÛ†ßüçRt÷®Á1G~þÓ„&»y 6 ßl=ÂÂù\> HnG eH9f‰•ˆ"œho‚ÁÑ ²Œê‚#Sij)œŒ×ä[ëS²ò˜=}|å¼åXÿÆcøí-ÃßŠŽ–wá¹õàýGŸˆÏóMäÃ2œ·ã*çý©Ìă="¢lM!ã\¼òðLnd@ë€jÀTòç$ŠtAD, ¦, ™jH“U„0wָ싋pÛ}?Äc+oÇÕßy¹0sÖ‚7\ìeÒhEÏN˜ÕÛg?+kf+ YËÎ*`tešŠwÌ05´×š`T3+ÂÁ›/Ïj8#­óF˜5mFæoA.ÌùÚP¤À ^$iŒ¦( ù^ØC‰gM/ ¶Î9E™m¸ŒÄJëÆ,*d ZÊR&Íôf Ez|–ÆgæY¶ª)­µ¨×ãìžÒÙ$½e8—Ž‹Åx¹ˆp¡PˆH›KÄ“g ŠÂf+¡¨Æ(i°ž˜ßÚ‹Ä5ÌnGý p2^Í‘YÎ_î5z¨FÛ’Õ¬jòÍ$ÉÛ&‹ Bi-JR£5Xt–éæŒ)¥ADP¤l–²ì}ì!À';rÚl7<”jp`¼¾›‹šñ&ië+ðÞBë€âdDZ*cUôõaÁüƒõÞ³ñcÕáý·½ølÍmc)EDŠR˜µ iš¢§g;Ê4S'Î7¨µc]÷=˜:³Œö m`/ðÞ7d…གྷB‹3~šÙ²iËS7ÿø™ÃÿðÄ¥jõ3ÏÒ•‹ïöW]¹ÛÕ+ºV©²1d‡V˾uÿ‰¸xɱزy¬ dТŒj¡ZT³óm3ú‰]§v컼f»ÏÉ­ Bc@¾!> ò A›µj#ƒ1 ¥*£uLžÜ e2‡'j¸ªxÏâRò¦©ÚXªúú»? ¢;Â0¯;§ÂwL˜FÌÀÐÐVÉ€\؆¡7\±Í¯Ž³¾¼ ­ª¬…M-„,:j6oê¡IÅ£$ß•^ßvÏMNFO/•ËR,´”K ÀÔ”HÍŠt¦A¢É{&¥T&‡œmÇx+°©—4òŽã8®.îhŸòÓ(J”nÙÂ/<áñ»†ðׯ;p|ïgçÛ$QQ-é¦ÁÁ×¹TØûŒJuä—¹|tvtI>_ R€Àg—dþ¢”†R&  ! 03lj¥U©UG=×nNÝØ5â׫£N½¾&âΙ1 áLܾü™ÿøæ¿Ÿ†$­AÄ£T˜¨.ûâÍüâ+[pÍù¶lÙ81Ì¥T.Q¹\F>_D>_–¶òÆ •ÑšD¨5Žãç,ÒÔ¢Õ0::â⌤…›Šù ŸJMÐ2À‰M"‚< ¿ºú¯øíÔ1ëåþ_[r¬Äè˜X’/߉¡¡~Ó1%àØ—P Œ¡Û˜°uRj',8µ¶É]wkj޾úë¯oXw¥û0 µ1…pr¦\‡/!(Gªs¦võ± âÈbù÷ßù´r§Ï‰¯º(ÛÊûñïöbæô…q±¬ÓŽÉ9”[ Q…UõšÀ¥$i¬ì}?M8ú[(˜Éµ\>„2|!‡0 ä`Hƒ$(¦ð.Ç=/•1q·×\ºs|»–ÝòY˜P†AÚSÓÈ4‚@Æ Dј@ þîlK’†9… G(µ„9“íôx ['A‹‚gÁ5ߨùàÂÆê“I=}ßèè¶÷pÈž/‚ ôèýÏqIÏæ ¥Ý‰ÂáÛ†ªëö³í\r\jGçÍš=çêͯÒg¿ó=ùÕo 2Ä»þc¢%.Ù±qo%tEXtdate:create2011-09-22T09:32:32-07:00¨’bÌ%tEXtdate:modify2011-09-16T07:27:36-07:00wjñTIEND®B`‚PK €Ÿ‡ùHMM5res/drawable-mdpi-v4/notification_bg_low_normal.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM6res/drawable-mdpi-v4/notification_bg_low_pressed.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM1res/drawable-mdpi-v4/notification_bg_normal.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM9res/drawable-mdpi-v4/notification_bg_normal_pressed.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ°£²ˆCC:res/drawable-mdpi-v4/notify_panel_notification_icon_bg.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿãa× >res/drawable-ldrtl-mdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png‰PNG  IHDRJ~õsFIDATxc üÇ^þ$ S É6S¢á¿ÿÿWøÜŽ©á%>·£kÀä¢ÉŒ £ `kx'y¿Â¦Á§–—ÿý(7%Rn2‘c‚IEND®B`‚PK €Ÿ9|ýý:res/drawable-ldrtl-mdpi-v17/abc_ic_menu_cut_mtrl_alpha.png‰PNG  IHDRJ~õsÄIDATxÚÅÓAJÃ@ÅqÑ&¹€Y½i’Þ AêU¬¤ÛŸf1„‰}«Çãý7ß¼yøo9èMfƒ§@Èën¢¾•'tj•CÌW#šÅU˜cž#9PcŠù*₳F£CóD@ÒÍ!ör$¤º‹Ñè”ê9Öï¶]}ü¦Î§+^¶Ö“^·ÖƒgÀ»{ÜRé¬GȶT|¸ÎÞΆò4&T‹ÛaÞ6¾zq{Låy·Ô*úòzôUØRŽhÓ–þF?ˆÎuñ½·5IEND®B`‚PK €Ÿ›”Ô>>;res/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png‰PNG  IHDR]\eºnpOl  ÿÑnØŸPnpTc (8¶È¿õ…IDAT(ÏåÐ1 Â` †áüÿ"]»x‚ÞQð4zž¡Çè:8KA‡V­¶Eºj!$ïñË‘^­´°¶$Å>®Srˆ]t–áˆÎė¬nŒõ<»S’$5z=êaòÉÉ hÃdn—#”Z­rEò”UªwÉì+¾¼Q^5ú߸×µW¡Üù IEND®B`‚PK €ŸŠ àà7res/drawable-hdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png‰PNG  IHDRJ~õsnpOl ¦*±«tnpTc 08 ôŒ>3IDAT8Ëcd0`øÀ@<``P` (01F5P¢Ax4”ˆÐðv4”誅A€¤rC«6à‡µäIEND®B`‚PK €Ÿ°£²ˆCC5res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_000.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC5res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_015.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC5res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_000.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC5res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_015.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ‡ùHMM:res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM:res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ@`‰ââ<res/drawable-hdpi-v4/abc_cab_background_top_mtrl_alpha.9.png‰PNG  IHDR$$K PnpOlÿØdTnpTc (0 †L†ú%IDATHÇíÎA0 ð¬ü9w$ÒŸÀç€/Û Më¨úäü»×þJIEND®B`‚PK €Ÿg>Ϋ«<res/drawable-hdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png‰PNG  IHDR00ý 1 rIDATxíÍÑ ƒÑ|u„R§ËÔm" †+J.¿§ÖZk/ɳÏÒõ‚‹}°ø|1°R"~”HQ" ‘€@N08ˆ-' @Èp@Èÿ#bò`O (P ÀD¡p÷¥Ì8túR& +Ð K°*e:;CG–Àe)PëÎcIeL@ã'©Óq& 8ÕÌʽÞÊ¥|ca*¾t)g2¨‚:ÕÔCA}r1P{BïÁ…Ï í }'í}„B*ƒ,Ýê=¸ñU䥟ÿ…ßËÛ’{ÐÁó¦ö‰,Aofbba¾Ô?ÚÛ¬´.Àº¾Œô`2LL+ [´­/µß²â®ë‹vÛѹ˜×·£ç~Éó][ß '~fLuËŽS½vckëÚ¼þODÅø· ?¸¥ÚC':ÝIEND®B`‚PK €Ÿ2Xwââ8res/drawable-hdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png‰PNG  IHDR$$K P©IDATxíÕÁ Â0‡ñÜu©ui¥CŽQÜ ª#hÇAª'ã'é{„“`¾ÿ%ðÊïZã w4”ß¼G68†ž¬c¡)W¾»0 ƒJZãNÌÈè÷¢¥Ð =Z»ÏuVO.¡½ŽŒœ3zµ„,vxë‰oìßBÖ³* X” %(A ÚSþËöuc.!CÁGhŽKŒ€âöËÐ ÀtOµ‹IEND®B`‚PK €Ÿ6CŸM××9res/drawable-hdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png‰PNG  IHDR$$K PžIDATxÚí•Í € ƒu0ˆ(3±Wp³J¸p( 0±\_(où¥+Lt|hÛ«·pXó˜ €ÞMþÊ 28d(B‹7Ëìâe—ÇLâ,ˆ7~8ˆ£¥A7…ºÓäl´òêêýãA­ROÍËcúAz´ïŸš~!çkú72¿`{>ÿþr´)g©ÖBÉ6Øæ— Ú|ÑÛ {áhIEND®B`‚PK €Ÿ®¤#……5res/drawable-hdpi-v4/abc_ic_menu_share_mtrl_alpha.png‰PNG  IHDR$$K PLIDATxíÓŒXgÀñwÌÞjÛ¶mÛf¬^P7¨µamÛ j·Amc8ßýf½hïÝÂíãûþ÷­•"Ù-‚øŒ Û¸™\’ýÕ¾‰.lh¼Ð$a‚è$X,,ú)©ë´°ï}-’ß*Ù Y:€,ƒ¢DÞ7Ñ÷€µ ©c¿üà ¦Q2½ÜœÓ Êq61NÒ¯CTq ðÔp‰ÿ<óµ“vY* ¤™åÓ {…±M‰ e„]Ó2ˆNaIA:ý[¡¯¤ú»ZÆKMCØ&…ã|ÊÉR@¶åy’Mö~ôØÚêúë*|l†4pG× g”²°OéœÆ:¹ÒÍö‰¢–¸ê’Å DO½o¢dðدT ¢SÈaW%q+¬f¼P?a=â…ê «/”膿º,!ˆG¯¼P1ˆO~óœuÖ\yƒÿ†ìâ1À"hŒ×IEND®B`‚PK €Ÿ°£²ˆCC/res/drawable-hdpi-v4/abc_ic_star_black_16dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC/res/drawable-hdpi-v4/abc_ic_star_black_36dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC/res/drawable-hdpi-v4/abc_ic_star_black_48dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC4res/drawable-hdpi-v4/abc_ic_star_half_black_16dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC4res/drawable-hdpi-v4/abc_ic_star_half_black_36dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC4res/drawable-hdpi-v4/abc_ic_star_half_black_48dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ$#d5§§6res/drawable-hdpi-v4/abc_list_divider_mtrl_alpha.9.png‰PNG  IHDR:~›UnpOlÿØd4npTc (0ÿÿÿÿ¼V\¸ IDAT×cø¶îVIEND®B`‚PK €Ÿ‡ùHMM0res/drawable-hdpi-v4/abc_list_focused_holo.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM4res/drawable-hdpi-v4/abc_list_longpressed_holo.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM5res/drawable-hdpi-v4/abc_list_pressed_holo_dark.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM6res/drawable-hdpi-v4/abc_list_pressed_holo_light.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM?res/drawable-hdpi-v4/abc_list_selector_disabled_holo_dark.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM@res/drawable-hdpi-v4/abc_list_selector_disabled_holo_light.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €ŸG(\2ââ;res/drawable-hdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png‰PNG  IHDR`$ÜX÷ÉnpOl A‚Z@ÿZÖnpLb µÍÄdTnpTc ( 0Q!ÿÿÿÿÿÿÿÿ‰L IDATXÃí˜1ŽÛ0Eß”½€±Å{†¤Èer†Ûì}rtr%MV$S˜"‡¤ )´À#ÈaÿñÏP3„{ÜãÿuÈ?üò>‘ÿN¦Lßäp¬<}Ë·—Ýg)ÒEAÈ;¬x»Ûç!“|Ù¹8¢­zÞ¹:éä7É®ÞàªÇlkž€D®·†È¡K¡&ÝáðõI:ùr@þoB‰D&’‚Ñ¥PÖ“îÕgóã¸"nkID‰H,Ž\ÿ#ºGàÄyâùåcþ‘×l!~çï_>ðÌ\xàD(Y¡Öµö@È_ùlè-ðM^YYY‹ió¡Ož"ž…%ÿäbà—|â· ‘JI×"nžÀÂÙ”|¸p®¥}•.mj.x…gsMϹÊ÷¤ª9ÏØ¸f~$á*nxùŠ`-N,<¾ïœz9åÁb`)Û«•ÙJ{‚IBQçtc3: u3µ¡¬¿ì9@m×ÚVjÀ—ÝÔ¸a\iÖ¢—Ïè@ëE·R¶àºÞøF m µ˜hÊn¤ µpe÷ÑZÕ6Êä„Ed‚ÝîíÉlÌ­yÔ^ì*sjÂÌÝ,j-’èÕPï†I´Òöf ’Y€¤äç±úƒŒh *„¼ïÀF™ˆ¬æÖŠÐ ¹¡LR9±è@¬Ã¼Jð?UÀ_ ÊCòIEND®B`‚PK €Ÿ3 ‚=JJ9res/drawable-hdpi-v4/abc_popup_background_mtrl_mult.9.png‰PNG  IHDR`0D·DnpOl A‚Z@ÿPSWnpLb ÿ{ÜTnpTc ( 0Q!ÿÿÿÿ‰^Ÿ•qIDAThÞí™]nÜ6…¿+Qšq\ȃ÷U4YQ»Žd#²„î£Í[xI=ú!otI‘ÒiP@¦ˆÇ`€sî¹ÿ„gþˆ>s ? ü$ð¿w%,äßâå@\ú_¿/‚¸€.dy"ójö©×i$xA|Ù‘9¼ÿ)šAׂ€È|c¯\¡sxM ƒ½9 ÝÇ€p¡AŠ¿OE  (EPBÈ]Èeöð·g¥p~HGL‡Æ(š+°ÀoZZZûŒ$ä`šÀ{73úD!‘„GÏ™[^òŠ»¿i%ÏðéÃîxÅKn9Óãh£9Wï^,½X¾Ã]þ8½®§\žÞ23™‹2 ¨+²þB¡ÃÑ÷Á‡î5}á^y DŽž^jÂ`4Ÿ·’hqtôœ«kzÎqŸs–…ÄÒekÁÜWG ·\Ô⚘…š¬×YœÈÑá8UGàdÈ” uS´QŽ®:ΪSV“š¢…[¹F®(«ì 4…uh³Ö¦ˆÙ(à*½ÜµÆ¦Ù¤Û•DmÏ÷ÙñZ뛕cc)Ú4´ä Dê# »¦^J’ìÔJ`×Ö7»Ã±ÿ´C9.ùÞ^¨¾£~o±¥›v• )lú­šPüPà+ÐÝ0]/¶»¡f#¦1º>~$WÍÎËl*CŸMºâícf~¸¯‰ÀÃ=3sAˆäYhY#y<3Óoïÿ~¨E…ûÏ¿¿cb¶„滹unéè9qæ†nù…[^pÙ½íbšC œšŒŒ \xä¾ò…¯<òÈ…Ñ,uº`Š.dögb E,xfÆ' 0320è©Ð E‚ËÊÂâ_3ŽÁ:Ref2ûK j0ráÂÀÀÌÄœ¶›í´ÚÒ4þpœž‰‘Î6vGtIqëãñLL¦Â…‘ñZ¸¢€-ÒE ü®˜F9€Y6œÌG.ŒæD!/h.Kµ‚à3f:í©k²j;éÉg4ÖTJ®ÙõOßx:æ´hok³×šäSR‰o^#U‘]ÿý0¿#à@w³e¥u7>s!E’ –¹² Ž€7CëÖ…bò–<—€®ëŠ)$ïÏ+qqKYï%Ÿ&:+|Ýx†×¬ßÇ—”¨N±»IEND®B`‚PK €Ÿ°£²ˆCC<res/drawable-hdpi-v4/abc_scrubber_control_off_mtrl_alpha.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCCAres/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCCAres/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ‡ùHMM:res/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM8res/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ>åìYY4res/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png‰PNG  IHDR$Òñ‰¦npOl  ÿT$@xPnpTc (8!$Öres/drawable-hdpi-v4/abc_text_select_handle_left_mtrl_dark.png‰PNG  IHDRB!m4}ÝIDATxb ذï( =ó*‚†¨ J B Š‚!‚¡‚ èöªþ®wíμÿ—¸/ ‚ì™È·%(`s¢ˆð?@½p@‡!`ïâ[%4`¡Eæ -…æ}1ŠáE LÞ—¢ˆ^ŠLûBQEøÙ"Œ"(‚"(‚"(âÖ]%E¬ÑyàÚS¿é‚Ö>È÷zÎQÞNí)"¼´U¾õ1GãÌ —/i4ÆJñyMæhœ¹áò%ÆX)>/£‰'¬Œ*¿”NOœ@˜ågãKk{@@–¿‰ÿ!¬j0ɳ(ÒógœNIEND®B`‚PK €Ÿ)iH鎎@res/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl_dark.png‰PNG  IHDR$žÑŠiUIDATxb l_K²a†O÷•k;Ö²×cÛ¶m_ÒØ6®`l[ßÑ9ÈQ1³"Þm=ÅD÷P9ªø"òX‚î핊B ä*4Í!èrÍB3Ñre¦*@©;”fšÄ¡Jðd½h<‡ªÁ´¢ÑèVʺE±jÑ=(‡G)ECÐë…}†ÚЕ(ë ÙÞC¿¡}PÖ²žÃáPVÈó»]/‘I°§@”åEp»¸•àa ð Á[àM‚o$À×_J€/^•¯Ü)î"¸F\G°£؉ ›3ÑY2$æ§Å^è ²2—á¿Ð±‰è)úË<÷A·& ·(÷x<Á@œ¡IJWšþèÄô„»SEø_4¢Gÿ•z©?Ø"á £–µö`7˜µôïp{¿ð\¹>IýIEND®B`‚PK €Ÿk¼%ß@res/drawable-hdpi-v4/abc_text_select_handle_right_mtrl_light.png‰PNG  IHDRB!m4}ÍIDATxb $ÔvÚ±ˆA Ã+)•P H@ €„J@ÊH@Âî$=&çÞôMÒ×ä7ð•ûþçšV´xÃ|ˆ×‰–µpm«k‘V!„U aeBX3!Ö„V"Äšš±– ±Ö±EB‚„ ÄÛ‰ˆ†X¼@^¼Vˆ†ž.^„P½½Id¾R­Aë|Ä=­üÚ€ßAúǘàdà³&B¨ãׄñ é:|‹€LZÖÚ‹Ý`ÑÒÙ#à‹ òø5X)ÈIEND®B`‚PK €Ÿ?|tºº=res/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png‰PNG  IHDR^ÍŒénpOlÿØd8npTc (0  øìõIDAT(Ïc`#02ü'Fq¦© v\ø„ŒIEND®B`‚PK €ŸD7o)ÀÀ;res/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.png‰PNG  IHDR^ÍŒénpOlÿC¸T @npTc (0 ÑJùIDAT(Ïc`#02ü'FU-v4ÎÔIEND®B`‚PK €ŸÒZ»²²Dres/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png‰PNG  IHDRâtÿnpOlÿØd8npTc (0ÿÿÿÿFåìIDAT×c`|€ñÿŠG—rsùIEND®B`‚PK €Ÿ]ÆÓª²²Bres/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png‰PNG  IHDRâtÿnpOl5D®_8npTc (0ÿÿÿõS×IDAT×c`|€ñ=aE6€@±.IEND®B`‚PK €Ÿü$úÚµ$µ$$res/drawable-hdpi-v4/ic_launcher.png‰PNG  IHDRHHUí³GbKGDùC» pHYsgŸÒR vpAgHHÎyð#ÞIDATxÚÍœy¼%Uuï¿kïª:çÜsçž›dFGDEœ˜˜‡(јhLœ$*O4qŒœbŒFÄx*4D†™¤™énšžo÷Î\U{ïõþ¨:çÞK·ù<¡?y)>‡s»ûœªÚ¿ý[kýÖPW8€Ç‡¿þl.zíw8}jŸ_ǘo,›ê\;ó†þ–Ÿõ }çs^È!y•±CÖ29VA Œp8:dì¦Â1ÃthÐf/ +ˆµÂŽp/‚%‘!:yë*ܲçrN˜…º]ÃÃ|—õ<˨8º*b©Ñ!£§–]Úzcïß9%9‹÷(!8Œ ˆ`‡âšäÄ{ö\s÷¯6î)§/¿¸×QûõOÞë×6Ìů»í ¯):ÝtÃ6ªÕ*­†Ãé.YeìÒõlzøÑë¢ÈÜôî Ÿcïܰÿàä ¶9’×Ã’ÕP¡‹£§±¼’} £|€¥ÂÏÍÕ³ÍlØ" Ó½GX?ºNÖžþñ ÿ±!º¥ý±Ïnذuì®_4ºmh0³ÑÈï^wø¹â'³áegŒ1ºÄòÅxžÐúÌùòu{‹{ÅÊäMyToõ»ÜæƒFX÷œ0¶“û}Âr;ÍV:4IIéÒ¢Å:Ì‘‘á¿æåqAñ^ñ®xÁ¯^Ö¦—µÐ€EÅ›ˆ cÃ¥¶[ÝšSŸ$±Ô†R¦·qÑ—ŽýÿPžVO>Í镽XÎ0c‰ý)Cíð=a£sÛs´ÓÕì8z©¡é§H5#Ç“áÈ C"-ß3r2uäÎãrOž\ðNqNq²4g<:‘ÉädÒ4Å»`ˆ3–#¢H?¹z]L}I»CÔ—tH;™;Ì_¹ñ*5áÑ=ÿÊäð vw~ØšÞrv-Yú'y˜ëm·YÞFó:GW>ÈÊøÅŒr<»ÒëÚC1U¼*^^.x¼ 8ïq¹ÃåçÎyœóxÞ,kë/å™ë?ÌaK^Šh–½ÿ›à5ä9ÇOíèÜÖnøûAíñçþJwÞ»Œ“ŸµŒ›¯žúod¯á2eõ’çóÔ¡¯û3^û c´þç.Ý=¤½­Î4“<›!»†@NÕ®À§Ò4#ë9²^NšfÅ«—¯4#ífdiN–æä™#Ï<.ó¸à} „€÷ç=Á²¼‡ už{ا™>Œ7nಛ_ÇØRC¯ëq™ ÙÔ4fz/ýQG6xï»c¾úWwÿÆë|ÜQ¬>‘‘v “““jmÂìÜîóÒ4Çù–f®‰ ˆ©±µóoh6Ö±µýc*•˜<Ë¡¨Ø#Y‚¢a ,÷žà Ýt/?¹û­¬=‹;6\QŠwuPA° =€ÿ5<‘ýÈÕ©Gjã/»\ úÞí¯&ÊPRé¦Mµ’,«V«¢8Y–¹Y' ‚è¦mP¡bŒÅÚ>súà”a^µd¢J ´¦¬ør—Ñjϯb¨„`ÈSÕV³%3SSÛÌ1ÞçÓË"q½Hg÷Àe_½çÀôˆ¾%ë#–r…étšHb6>¸ëCð"æ%ƺ+ŨíÈÀ„@0bQT1Rø °§Œ àJfyÐ`JÁè‹Ï9ÈSèvRÝ»»-s{‹Tõª¸b­1ÁüÄHFqš:Ç£‡Ø¾óQf;S¬^rgtÅ>ì×ÄvêÅdD¤´YÂ2j2J®CT¨3ïà‘™­˜ô`2³IT#щiÞFŒóHˆÄ˜"—þâÃ,ñ‚-`‘‚=:@h ‚WB‹Ê÷Â'iÉ(W€§Z²‹ò|ð!ry8ÉXw•÷^’øX‡%2)M2šDÆj»‘iµ¹ŽõÇ­ç[w<›][oÙ|·O»/;+øuÎyŒtiØT¶ESü*jùÝVq25µ<õš§õÉ¡.ƒ´—“gZDû®Óvð¹&ÄÏl²;Þë7ÓnåS{v·¿ÚNç>64îZë”óŸr~懧îë¤?öÉ/rö›·pxm/Íp´©šjè2{F û;EŒÖ)·‘½ÍÒž³;÷ìro[sðøw·>Ô´[jøé™Ù ÈF>‡šñÊpWãZ.Õaeh8¦R5D‰ÁFÌ€˜2E•yæô‘–à¨Bèû¥ ø2syÀåJÚ ô:NË“¶ y'Ñ´Y•Æ\wïž=ÓoýÙe÷}ó‡÷_@ÚO[ºÚÿlÉ’ñáÉh­vüœlo>@{®æfºfj{zù[_²ü ¯\¾[çfRþòîÚ7ŠÝÔxF¬±¶œï]±æúÔµ–iUÛùss{¥ÕìÚ]ÛZ~ëÆæ O|êÑWrÔäZ;&¾|ÃOÖ;oÙ,›ÞMc&%Ms¬…(*5KeHˆC¥S©YâÄ`Œ!N,QÌb‡ ø¼È÷|ð¸Léu½®#O=iWI;Ž<ƒ<X‘$K–ޱê I­¨4zÛ_ÿ¤“ì?¬Y¿ìûË×É+–¯\žÅI»ÜI·ÒjµB»‘†©i´õ¡Ö‹Uù×JÍÚj]ý_¿ãÅ&öí›Ïcûcdæ#ÆBt^îg—xŸeÆÆ  yêiε³½Sí$íÊùÍî–«wlMÏY»&âÌ×$áøÕmwæhvïh±{{“½»zÌL¥ÌîÍhÍæ´›]föxÒž'Ký í›÷WR0ÎX!Š I¥xUjõ Ëòu–úhÌðhÌÈxDµnHªcv‘ÄîÜl_úŠ?ø~ø×CëÕXº­ÝQYQçiêLÚñ:½Ë±{[ºV’Š‘uOªïëƒ\¯ÎÐð›6Ϫó)£ë—6ÚM”`ŒIQ•Ò)Òž·ÍÙœ©mÝú·Ú¿âOyþò©=7R¯H¥ cË„åkǰñ8q\!² Aˆ^ð.¼ÊRF rŸã|^„íàÁ#N_µ¨:Š"²ÐFŠwž,ódianÝv ÝðÒnuèuÝŠçÊ×ìÛ>þ)ŸgBžùRŽÝeEu 8!xñªB‚Ëe_€ +&bã–D¤ئ÷RÜLi!PÔf1ï@‹]×ÈÄà½ñ¸€‹  ¶`D-²ëWõŠ>ÅÀû•ŽYEµ8Ÿ’»Œ8B‚ú¾Î\$û (ôOy/ ¢‚j_Ú a9—[0C…t˜¡º ÷ÓÁ‹ EÅ҇ξ àB†ˆ)ÕW¹¡OkY”LŠBÀCELÀš¶¿EZ!AÊï—ç\ä† F .Kiu÷2œ¬f¼z(»f7`¬R­Œ@¿x1a^jižÚß4Õ¢L«Š#ÃŒ” }>*öš DÈDÐv3ì (ÁxÁ”Ònyˆ·2üJùç¸;:WŠ´¨F *‹‚Hùg‘è1ˆr×¥—vŠWrÊ!çqÊç3>¼Š·^ÇM÷ÿ#[÷Þ ÆSMF Áû9ZѺ˜ ª¨šÁßod Î{ Z %t¡ PBðÕ€ªÁu«û11UDÄ"XÉúÀg•A¦]¨ãþÑoÃi_%ôi>ÈÈÌ@×ôYj¥—µÉò”ñÚ!œü¤ßâÄC_ÁÈв»ŽXs:‡ôl6ï¼…›ø6í¼žôkï°}çýE®ø"@|˜gÐ ›W<ÕŒŒ±1Ò7=}ŒC+ÎYÀ6¶PÒÂYêàFCù=ThufxúáïäUÏûG®{‚ÁWú+» ,²øèûªB÷8ƇWsÖ©ïàM/¿‚a{½´Qþûü*Ü[ñV³£ƒ8ÞfpŸ} (®©äˆqÚ/à-H/9ýtŒ‰ÊÝÕÞ|¥o¨…ö T'N/ÌsˆAËÐ,ä.gÍ’Sø§ï|š‹?ö¶oßZn€-j= íp?G(}µ üüú+yÍŸÇwïard=Y–Î3)(FbêµåðÀl{{a2V³`Må5ü|[©_%Ø W?çKìØ½#kcT¥[žHžp¡Í‹˜ÚŸÎ_oaŸQÈó”ç÷.zó¥¸hŠ?zßÓøüW.bffcìÀ?=¨B(†À¼õ—ÿÉ›.<“üÍïsæ™/äSý„Éê±ô²vá&& ²~a¶µ{Ðùª(Z„ú®%²5TˆZPKûaÐ7®ý#jµ‘A)Ôˆ‘yJ.0×Ef6©¹úa´¼Ù”4ë²jÙÁ|ôÂ+øÈ{ÿ‰MS×ðÇŸÄ׿õIšÍÖ"  `ü 4»áž;y÷_ü6øÜË9⨃ùÆßÞÊŸ¼ö/©Õª4iYzÝ·¦TüOté!»‡SÓÁ"ä±k#‘¢’‚ï²ìA±­7Vؾ Ccq¶00·°0ÄJ顪vP®žÜuð!ç„#ÏäS﹎·½áãÜúпðÇï ߼실i†10Ʋqー÷Cðî¿z>cË„/|äç¼û¿ÂòɵxïJӗϧ ß(Íæ††­‘x^ûÌ£XDAU½ó½NºýG1€ñÑe¨Š*i÷-©ØÝÅ…,Êü¥èh¶È 4ÇÀÝœnÐBŒ>ó„ó8õ˜s¸ööæ›Wü5—_õy^}Îÿæø'ŸÆ×.ý×ßö]žþô§óéþ£yFˆÊü­ðuEêQ¨ê’5¯Z¤¾]KÆòvaóì^è‡Jiù&Ù?@ÖCLÅÆ÷6`Dè;j¡Œœq@´SÒ\©îyÇ0OY)ÄbPOd«œyêyöIçó“ë¿Ì7/ÿŸùÊ Gu<_øø8æˆg•×/†ôÌcÂÿ E´`qƒd”²Üké³§´ˆ…>µ@¶L[lÖkbý›)L̈)^qÁþ™AKŠˆ˜¡§‰] O»2È}ö¥ŠVR˜`l«œû¼wñǯý O>e’O½ÿ Ž9âY¥OòHq?ûžEd^†þ™¥¿K Âž™-„"œ¯T.Ü@U‚÷yÇ{‡HlÀ¾Ù’P…ê  Y`2}3ò!Ÿ/GªYö¡Ô}œç¾0 ÆØÁg\j°’”!½0ɾßß‘åiqÙºFÄ ¡Ï0!M{óÚupoû˜“æy–åyFР!¸_±k"Œ‰:ý¤|¾F¬ Ø1Ï*kã2Œ–Æ}Ml¿@•B±hÛx~n\Ì…n¯SÖæM_U~AthÄÔ±¹P@÷uPT#‚Eƒ!Þ?@ƒc)l`>"é¾lXàÄѲ8ðWÿ5{~§ªØÿªï+€)/¸°øU6’J4¯DZˆ˜"Š•¹£Îo°"ˆà5h†*ƈ.dí"']î¤ö.Ýò屦y|† æfÁPö½×ÿ;R‹>Ûûý‹:×s)êTå‚BGCäöÕHó?‹¼×|fv®E1¹¡—Î÷Å3*ŒÄ]À.® ‰ª%´õ±w¿Èiý¿ÎHô[Òÿ5ƒ&$ ¦B‚–¹[T6&BY½‘Áé5ð[­WǪŒG5’dè×Tš—‰,ÆZ…"@iègé,ªà±p |Ž(N©Qòò¦t‘Û÷E;üXâ=x_&ÔBPWú#\+²UêÕ¥ +Õ\¤h[}¡êWÀ`MÒ•l¼“è2êµ±RŠì ¢Ó ˜0„ÑÚZuAÁl~§UQˆ±6¡ï F§E>•$5~tíç¹îW"Q)h‘gí—Cû1+eXk-³i>÷÷྇n§V«ü¼.òÞ94H|ËŽ/ìöy|Ë LTC xOò:¢µ»ïº}sóæÿ¼JœÏôˆ'>¸ö"´gW cD_wÖE_|ÇÏîL3sšµ’ûàlˆw²®hc†¸ÛÖ«ßûÙÓX¹l<îäuÐaž!ÅÌt6ò©¯½†Ë~òL^}î…<õäç á1àè>à:¨íN‹Ë¯ü:ß¿ò‹ì™ÛÂG­œt‘£6Df”fâJgYUÞÜiT®«¯]ZIõÞK'k“µºIÞI¶6[»ßýê·œLR‰å5¯z£~ô¯ß¹€f¦§ôO.~†Q ÎÚø:=ójÉØaŠhšuÄeH¯¤ÙÌ~ž÷Ì»—=™ZµÆXÇlûÁE£,… ŒŽsìÉCìÜ~;ùÒïpì¡/àUç¼›cŽ:Pœwóz§)³1–4Mù׫¿Í÷~üvÍÞÏŠ•¬:l=Æ‚WŒ‘øôÓíï|kj÷,?þ§»á/:ï´F£ù– ³òYÆÔ&Ôùé,m\;ÛÚù¹úh¶µZY)Ç®8'\wÝí WVî кƒ×pøQcÌuëá§ßPîº}Æ%+†OíÄþ‚$~º†h<ÏÝδ—]ÕhÌ^öæ·¿Ák°t»íÙ~…ú¥Ù~Ü/W”u‡,gÕšÀÎ×ð_¸Ž“<›ß}ÙÛ9ôà# ’²”+€Ê¿_ßþÁgÙ>s+ã¸C(lcŠTBËTBTæ1V%¨oÖ*C¼üµg'#ËãM×=pû¶mêÚ£ŸD ùØDÝWì“pé„ä$zû#?fÓƒY¶rlÿmÙ¼•G6O±{êA¯'?íXÓ–©«ñg½m|öïÿü~^òêuUÆÆëfó¦-vÅòÕ¨ÊLÿΛ1÷c±1›¬UÖ¬[A¾ÊóÀ¶Ëyï§~ÂiÇýxþÅ$I‚±†È&Ü|Ûµüãw?Á¦7±ríO^»1…/²,¶/£ÓúueE UK¯£aÍHMÎ:ôEæ_¸Ì?°¹í›­:ßøÑ™¶ã§µ2’Õ@{.gbuÌ·>;?ì¹O }ß%/ᡇ 2†vwš±Ñe’gbWŽžrðÛôê_]lf›ÛÈ]Î<ëyÛ±B~R×í¼y®w¿“бR–-æg‚‚t  H{lÚI”­aé’ÕÄãÛ s‡ñË»¯cùAV¯]J,#‹£å`‚W‰]©äuÙºõÑô‘-’çéÝË–¬6C£QXzg|l•X[!ÏRm6÷Ò˜®°dYŒ=è&¦ï>‘øÄ‹ðØ'ѹþªyÞKŽç¾oãg—v8öÔ•Ø8 »æîÓû¶_A«·M³Lttd”ÉÉeºsúNÓhÍî0Z?´ÛmäC7HÑÇ„ê~!¦H„1,_>‰$fš;K˜šÙÈê5KX²|¸˜ÿ1”mk)Ìªì» öX‹4Å2NÄÒ|vvÆÎµv~µZׯ-[¾ÜX…,ËY½fI<ÎsŸr ›¶ýï3†Ç ÕZîÔ¾ô¡_>Žÿzˆóµï:8® æ^rç1SK&±œø”cØ»gF–«Á4–nÝ}çUlÇÉq5¸j­f"+&P<¥llYZØgAÝH ™ RôèÓ´ð1e^Â|wÕ³Yæ‘0ä#&´×kG­ÎžÓ¬÷Rµ­é¡d¹Lílèž©]Üü¯)¿éñ¸Éÿê˯DžÚ¦©ÆË’¯Øµg×S7{¶DëC“R« cŒ'pýy´·sÓ±ývSQr¥á+ÚÉ8Å.a0Hå]Pç=ÎuŇì{ R­›©ÖLnš³½ 3³žk/Ûö¯óq’;_<¿U #¸àÂ^¹ûìþÞgÓsßþ±gÛë5?:7·÷(—»PZjªÉdQŠ Ç‡Œàr-ZÓ¡?åaÄÍocŒ ¦¬ñ”Ųrö:Š‘ÉÉm,í*&û8©|æóÝuùY¿7aV¯X'Y/µ¡:qœ0:–¿9@O躋.ù-â¨ÂLcÎgÔkÒj¤q$õl||Ùû7Ü÷™æ 7:^FGÇ£Z&Ž«XÏ÷½úílSÌ6Š1Xk‰lTV%‚#w)½^‡VkNÛ­ž´fÓÙêhûà×Á,¯ï3Œ£H¡:Ec²,å_>ý› ?a|ä]—óžO¾œÑ‘µtºÛyÑKŸ¥?½òÖP­ “T|”T 339™"MâdI%¢:T¡RI¨VjT*‰ŽŒ×ïN’JnŒ5ƨµ6¸œ•ÝN{Ìy§y–I–夽”N§G·Ó£ÝlS—12óÃKî¸àuž ×GÜÛ.x%—üÃ¥#ôZœ' ÀÇ/ü!ïùäËX¿þ0Ž=ú4®»æ—X›WjÙèDL JÚzí@ÚSZ=Ocº‹sM5Kð!oÍ¥ç?iö˜»·Ÿ|k­Ñì²áGÚ½àMg|ûÞoÿ]UBYÅQamÔ”AãÄJ$tX 섇ï™ñGó¡¿ùC£1šÕùú'~óXOèºy~D2qÙ¿ÇP=f¨ž%4juËðXÌØDÌøÒ˜±% #cõ‘ˆúpLm(¦RI’¡ðà’»¨´V¦Ûî&•ª$‰V* µ¡ õ‘*õ‘*CÃjõ˜J-"J,ÖH`g™­k`z[•‰%+ùâûØoØþogPÿxÓ9_à’K_…5…^I*–Zˆp‰%Jœ(YEéu ×)´ `¬¢iÂød]Ž;±.wßݘе‘ "jm1ÌÅB0‘!Ž aÁC<"`#å3ïyâƒp€¾ðÝ7²le;¦ŠÉT#D‰!rk QÖ*Æ*6*«Ò®)æŒPŠhÎf †õƒµ¤q\€‘T-•Š%N"l s–Äòmb1‚= ¿®åôæW~€¿ùþ«œÅ/ÅŒP¶“‹£w娉 ”ƱˆcˆbkâÄ%BuÈR©Z¢Èb¬)÷Î ±Xü|u´–Ño\ÿïàù¯Y†±‚µQc Ͳ°M¡±P©*ÞÛâq¦T1ÆãƒE†ÊÐA2â$ÒêPL”(Õš-‡Í‹©Ø¢c°LíÖ¬ý Ћ^ü L©aD¤;ÉåPxa…*ŽƒºˆùŸ ÐÖ­<|­n;ôã|:eeôõF¢ï /Ÿ´¨:ÍÅH‚‰*B–&Fö\k£Ö…½®'‰'4NzŒ.5a÷·M»7}ßèðŠ×Uâá]1a£H£(cc²45ÓÓ»éšÝ8øÐCþ¥^—‡¾ÍׇFùÆ%P€èï:ïžËØ¡?áØãNЩ]ÓfÛŽ{6e=¾ã^B¥b´f„dÚ»p[/mjÏ܃Êò]Š[-3{Zêre|d9Ë´Z­™V¶õ~‰ÒK3›$µ,‰k-Aîï¥íôÒÙ·/™8øÒÙ=]³uæ?õèU/åÆoå”ÓWqß/gØšèo zë‡OeåòùçáÊä衦™OëmÓèC×½øyãcιüW·ZGZÇ­_kDƒŠU ÔG&&'Ø´ízm8òàãM³Ù 7Þ¸—okÊú34žÛ…«Vm°3'𗓇f0F Ää.çÒO?t —Äÿþh|@û|³r%tEXtdate:create2011-09-22T09:32:32-07:00¨’bÌ%tEXtdate:modify2011-09-16T07:27:36-07:00wjñTIEND®B`‚PK €Ÿ‡ùHMM5res/drawable-hdpi-v4/notification_bg_low_normal.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM6res/drawable-hdpi-v4/notification_bg_low_pressed.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM1res/drawable-hdpi-v4/notification_bg_normal.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM9res/drawable-hdpi-v4/notification_bg_normal_pressed.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ°£²ˆCC:res/drawable-hdpi-v4/notify_panel_notification_icon_bg.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €ŸP)(ÐÇÇ>res/drawable-ldrtl-hdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png‰PNG  IHDR$$K PŽIDATxíÕ± B1 „agØ6¬ÂAÞ‡â­À™†Y©9N ©ðýWtZÅ”7Þ˜Vuz/tU;äµ#™ó Ä’ {ϨMˆö¡Ì) Q§Ô7UFŒ¨YÕõMM‚Fx^Ó1”¦^ƒÑð|¼‰¡4µÆRPšš­ð¼¦b(M=›ZÆŒjØ•JRmÅ‚ÓJPãG2çS%Ò´Åֽ̓6©—ÈáTÌÐ.R´ã‡3YP`î»›`’PëÛ>ÛÉd0€ÑFM¾“ÔÆ¸&?«£×ÕÓ#õbEƒ…­:=+Mjkaø 0‚/ÏV“zñ0GÖšŒ`i§&“ÚY~¸+{U{«ùeËT÷àÑÁÁãìm]Ǭ­—Eaõ!Ü~=€¸a™Ì_pr¹‘ ¿úzïIEND®B`‚PK €Ÿعç¦8res/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png‰PNG  IHDR Ùs²npOl0ö3æ4tnpTc 08 R“ÖÖ;IDATHÇcd°aøÂ@>àa`0` 01PF 5€.ÈŽ†Á¨ GÃ`Ô€¡a Eõ3³$™5sÇIEND®B`‚PK €Ÿ°£²ˆCC6res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC6res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC6res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC6res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ‡ùHMM;res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM;res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿÿ;fcåå=res/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png‰PNG  IHDR00ý 1 npOlÿØdTnpTc (0(+),y[(IDATXÃíÏ 0±×ýwn§’ŽKö¨¼Ù@OÜ|˜ÍBd¸”IEND®B`‚PK €ŸÔÓÏ ää=res/drawable-xhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png‰PNG  IHDR@@`¹U«IDATxíбAAƒñ³¨ß¥7ƒaz­Ú `§€äŸ¾_‚™™™™Ù=a+ÞÐÃ&m@Ž“%fç§ h½°Š õT} E/€UL4/€P½@vt/Ý $€¼  н@t/ý $ &L/€˜0¼@t/ Œ|·rˆ/p¢¸ÏaŽrÊÖè¢RA Yøfffff[ÆwމIEND®B`‚PK €Ÿ`Ì6|²²8res/drawable-xhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png‰PNG  IHDR00ý 1 yIDATx^íØ± ! QšYÑ=&ŸK®Û:’՟ܼÐÞc“,sü¸Üöe 0­¨ïÅaÒC@}/Xô`T³°©æ1à×ß.Š  4àPÍcÀ¤Ú¸ú0çÓùZp29ƒ§½¬/fD™|NBIEND®B`‚PK €ŸrD›‡ìì4res/drawable-xhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png‰PNG  IHDR00ý 1 ³IDATxí—Nla …‰Œûl—eŒÏì‰ã2gè"à¹îâáûÓP¤Ü´8ï4úËù®÷Ü5•ö 0Hç+ ˆW ßéBõ«ì MöIKbUcÏßÜdm-»Ñ/{8pÓ1¶9îF÷öv€`/\¢[Pq£{{h¹Eß‘¢±4~ºÑ%= à”eÄÏ«BöÀ‚Ξ¿hMHªjì9 €-oÙ^þØ5qêQ•íåÏu?Vñû絇%,<ˆ¨ZNUDTíMBTµ-SñHê1€a a c J@Mzh퀺ô^Ø HªêsÑ1þb «àšŸ(E.âš’Ze."MZ?v]Hš0}®Y.úŒ,ˆ ‡¯d0ko8m²OÐX’+æ–IM?ËÜè'sÓ§Øf ¢ÊØ""ÞB¸D9¶ HwÆ[bø]±‡ßߣçU$ûôY㻜‹–õ]ÏK.Ú€_ÙX=ä¢,{´Wä¢ÏXAßÿ?ý·8ǰvÀY"JžIEND®B`‚PK €ŸݬÚóó9res/drawable-xhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png‰PNG  IHDR00ý 1 ºIDATxí×; Â@FဨÈìeÖee'¸0óp‚Wb “Âî(A‚wfˆSXÜóW«_=Ih¬9ÒòxíÊIØÏØpã³–"&°¤eÚ…E<`Ï·vsCEÔ‰”Œ©ã ®Òñ*ÇU‡‘ wÙxUà®’w59gÜYx7ýö%ü^Â÷w€ ( € ( €1²2УÒÿü¥;[ß3Ö27K9þ½ DŸþ=ÏfOKèM¯IEND®B`‚PK €Ÿ¥ÚÅ··:res/drawable-xhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png‰PNG  IHDR00ý 1 ~IDATxí—±  Dýñflº_—ÒM¯¤[¸·jÞ „7 ý^|œ'*Ò¾|ãIn ðµ(kAwŒ ~ri”Åy &äë l}`ß/úàÿz®ï Ä}0~Q]ùìò@d#Ô0 2b™'‘têS-‚6+IEND®B`‚PK €ŸO¯¹àà6res/drawable-xhdpi-v4/abc_ic_menu_share_mtrl_alpha.png‰PNG  IHDR00ý 1 §IDATxíÕ¬PaÀñ“mÛ¶]C˜ÞmÛ®¹1ÛæmÛ¶m¼zþÇûxnº'÷›>òçû¸ôä0~øqˆîÄ[dâá ƒíèOÙqb‹z¢é&V8Œæ XÁÍk±ÂëÚex‚æ€xG:f‚®‹xClúñ7G=S|¸ˆ#„Yœ&bóé½4ž—u„ÙCIâГCøñštñ0z’0‚·iL4±BtZs‡ÃH(ß‹8tç0~øs”ÞÄ¡<‡ ³ŒòýHÃQÂ;±jâ1Ø›§t#¦xCStÁL&¥xÇZ4)&6¸†æ•(,;x)VX…æ¥ÄõÐ…0“´Dc+n^Ð×à;';ï “ÄqñŠ´b¯ðç8ƒH(BA6fyŵ¸†#‘$kÄc(¯q< -ÑÅ™YL˜#T’w¨Álö³—©T°è¤ Ç ³ˆ%„7•XÇ #q3Y,œñ¡+#6(Ì94ãÅ »Ñì+ìýÑLE3N¬PMI±ÃTË-V‹É›'¦X£ ãÙÁÆQR~Cÿ½èÅŽ‚¾(VIEND®B`‚PK €Ÿ°£²ˆCC0res/drawable-xhdpi-v4/abc_ic_star_black_16dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC0res/drawable-xhdpi-v4/abc_ic_star_black_36dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC0res/drawable-xhdpi-v4/abc_ic_star_black_48dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC5res/drawable-xhdpi-v4/abc_ic_star_half_black_16dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC5res/drawable-xhdpi-v4/abc_ic_star_half_black_36dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC5res/drawable-xhdpi-v4/abc_ic_star_half_black_48dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ$#d5§§7res/drawable-xhdpi-v4/abc_list_divider_mtrl_alpha.9.png‰PNG  IHDR:~›UnpOlÿØd4npTc (0ÿÿÿÿ¼V\¸ IDAT×cø¶îVIEND®B`‚PK €Ÿ‡ùHMM1res/drawable-xhdpi-v4/abc_list_focused_holo.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM5res/drawable-xhdpi-v4/abc_list_longpressed_holo.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM6res/drawable-xhdpi-v4/abc_list_pressed_holo_dark.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM7res/drawable-xhdpi-v4/abc_list_pressed_holo_light.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM@res/drawable-xhdpi-v4/abc_list_selector_disabled_holo_dark.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMMAres/drawable-xhdpi-v4/abc_list_selector_disabled_holo_light.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ“pòÆÆ<res/drawable-xhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png‰PNG  IHDR€0sýº5npOlA‚Ú@ÿ°¬JnpLbÖέ+TnpTc (0l,ÿÿÿÿÿÿÿÿŸªçØíIDAThÞíY;Ž1}UöÁ !´D{$Rˆ¸é^œ@ŠÄMØ3 r’½Àt»ìvûSîA‰¶é²zzÆšä=¿WU¶#Ž8âˆ#ŽøoƒþÂ?öò'ðHýM»%G3r™ŒK (™©iØ#9t©`Ë%¸ëwŠPBíÖ’AöOþM!ÁªðSØ€³¹RûQÀBÁÛTàÉ,Uð åà8_ªa¤kíÁ‹2J²2”â÷ 9y¯C£îߺ/Qð‚ - Ú*¬ ýc²÷BÄ^ pø ‰o ÏJFE€nðFª„½ )T‰È$ú?¼m%~ŽÀôîéÝë—ð¦³茇oï?Þy€€B ˜¬Âsød0 æÓÛWw¸w×<~þâÙÏÏß³n@B.ˆ¨©þ Þ‚q–¯¸í¸þAoàp†Ã‡.Ö@´$H…nºÞ ÜÀsè ÷6ó®ƒ,®»&à0Åô·djõeþ·jŸÐWX IêWSäS,NA½Ç ‡9Dojíò2è‰è_ ÍÒÅHÝ¥•ÀÂÀÂâ„«@˜€ðH‚TrcK¾ ô& I×Z+¼0ÃIAWÎÁž¤ÅÕ]àÂÕ(  lõ›IpY ²±ƒ”A ûYηĬœð¤wOÀ*}õ<‹+pQû·€‰¬9€rhgBëAXï ­Ô  Bþ£$Áܤ@ÅÀk]E‰dÓ”uÓ;œx´RS1‚šGùœ@T2 mUqà+®ßªkˆr­ØkÔwƒ¿A† )/˜\÷àÝöÝ «LIf„ÞW_èT ¤kïGÿ Hïª%åzMÄ аm*ÀÅ1wOÀœ ÙT@ËcX ©h«8Ì`Ll‡'L˜1T¬æL7dpZ]û2“¸"ÓžIEND®B`‚PK €ŸKu@=:res/drawable-xhdpi-v4/abc_popup_background_mtrl_mult.9.png‰PNG  IHDR€@xß·ônpOlA‚Ú@ÿ¼gA¶npLb†×ú´TnpTc (0l,ÿÿÿÿiËÎÿ/IDATxÚí[=r%5þZÒ³½lgá¤DKˆˆ(¢=K´É^€½`«øIÙÂëçIjIÝ’Æ®"YÍØ35ïÇãç÷}ý«îào8<ðHÀ#xsÁî“!‰ÿïŽA€§ È4-øxçõ-è$Ž1 3 ¡Gq ïwðIÔÑAšsì oÁ¦z^4@À'†œÏ¨¡bF¢z­ä姆7°k Þð¹i¨™ 3¨÷tN½pü3D੼¾*ixÿž@[–}`àÄïéjý6×I?ïGÚ+¤Ìa Ð*Ÿà§=“bø;à¾eð+ô`. *ü,{ˆÏ€á(pƒÜ°JÝÂ|õÑO_òÌ~°¿/\ÿùóç?¿eaU6Sœl÷IÚæ÷o>ýŽN;Ís—7ßþ#VxÖ é"”O7«y†oa—ßÜÓýfúþ÷%<|¡ ™Šg8Á¬þÎî>`žâÄB^KX¤±$eINp´gü 0–ãÁÀW\—öf÷çààp±ûõîE‰A$D1® ‚T|€ƒÃ §ÝpjrƒŒ2nåYìHÙ€‡áL€úЉ$7y {,G5[rY‘Ä™(5À æuJ½¤ô4ª R£YŽ@€-ð5ÊNH­ýÌ¡h—s´Ë¡#`Ky&€š8 =ÁÞ7iýF@Zd%HR°4|è…¼Äj-È qbšêµ¿-ŽI”CŽ@€UÊOct€¨µ¡½oµœ‹Q9Ïl-¢Æ ³Kda  íÍZŽ`Ôô462Á^qö/ý»ÐÐ]&ð€¶-"Ž5=µ‰Ç”ê«ü“xè-|…Õ n×}–#È^’ï7Ùg9¡¡`ƒySìŠûÝ‚@ƒž 3P—Ú[ ‡ 0Y¾' dø!ì}i‘nh³éE,õ€ÿ×õž øû_¿ú´Î¢2XZËþõ ¿î¾_ý…;‚^LŠÈ*X ‰°¢(j_¿ùÌüŇ;l‘ýqóêÅ·/ß^ã ¬X¹I*‡fÊ*I—Â/pK\â Wx‚'¸Â%.q‰N¥ÈlËBóý':©ç›ºÀ ,8ãŒ3nðïpƒœqÆ-n±bÁÊZD+‚(<@à[±p9åºSeæ9RýoËž%/=ÁƈLmçFÒ ‹…eÿÍ §˜'Ù©d ά ‰‚#2UòGx¬\NŠ|½Â·¢Ì<Ã2'ëLÁ-A€ç]æ5ƒæh’f³FÓ?ñðÜ27y€Ö „¢ ëÖØæ·ˆ‘ˆu –q2ÂRÉ™µ]Ÿe¦|¿šÇRHHgy<&¨Un”&PÇÌ|‰‹°°D@î³Ò$ æÜ¥#Á3h‚`;#$Ó ×àa‹ò1;:“ þæÉ|¡À—8ûµ€ëJAÌäk+g þ y€¤À ‡èKôbn4n…Áì ÃZ‹>ÔÝdš‰= ë ~Wûr€pƒ)¾1 ¥[H“ÊÆ"éº Y@Ôµ¡Ö¨¸”úѦÌ×Úçzb$ª= ö8ª ¹î£ˆ¥JPìgÅçŸ׺Doü¼€ÊލŒ“ås£ŸÀdòok¿A‘•âoEöP”T9‡Ò,õ¹¡ØD] ÊUªTX<5Ö<5Ô¶H÷üÌPß(gÿ×ZV§2.z}IEND®B`‚PK €Ÿ°£²ˆCC=res/drawable-xhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCCBres/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCCBres/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ‡ùHMM;res/drawable-xhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM9res/drawable-xhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ>Ž ÚÀÀ5res/drawable-xhdpi-v4/abc_spinner_mtrl_am_alpha.9.png‰PNG  IHDR$0ÓNžnpOl ÿ“’1PnpTc ( 8,0ÊÃIIDATHÇ픿m1‡>ŸRÑ$% 030evˆ1 À ŒÀ @“tœ}_Š;þÞÙw(Ršøsåß{²Þ³”H$¿ÂÜN0=oñ7aô¦“Lg6/újæ”_ö3•z×§¾e#¯W}h¡Le(Aˆà áj*Ë8Q¶ŒØ`9 ‰$2Ä€-P4²)€-ªSqQ­²ÜÆ;†!MK=`cöw*ìSíöÕª ‡Ë³{àÀ$¦ T(9bÊðxàÈ”jõ9Q­šQàñ8f]šHÏ#æÌ»5\+»Ñ;«¥F2ZÊÊ=ÕýÍbP)EÚ¡¯¨þXH¿m"‘ø—üùäkÿ`…zîIEND®B`‚PK €Ÿ/º,íjj7res/drawable-xhdpi-v4/abc_switch_track_mtrl_alpha.9.png‰PNG  IHDR/ (xéònpOl  A‚ZAÿBƒÄð\npTc (8 °ýà¥IDATHÇÕ–?kA‡ŸÙ³1H(’Û­±±ˆ¥à—Ñ X ~†$vVÉ'Ĥ XhsQC A=‚·;E6ÈÞåöfw¹"¿jÙ™yæ—™ßûÂuV˜óF¤ÒFíNh£Li£RšÀ5ž²Å&K¥Ê¾sÄ>»á[Ë&ðZè[¥eD¬¸IEND®B`‚PK €Ÿ‡ùHMM8res/drawable-xhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ…%ÁPP?res/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl_dark.png‰PNG  IHDRX,á&ãIDATxbl`þ£ €öíƒF@Œ£8€$  H¨$  •P •P ½ïö]ÖÍW^“gàtY‡uYÞÊ%j A€:¿ +×hdXg%+×lDÜÍŠ,€_^YÀ/¯ÜZàŠw·2ÀÜU pè˜WÀànŸ^€o€µë ¹[`^Ÿk=ÀÂÑ*$À 0À 0À`z^ lÍk»Ø‡Óv°›¡méØu€{Þ[x=´šGY²æÞ+5 ì&Ùà]µO/;Ûˆ§Ù#¯ýä#1kÓ#Gpõ¯ Ïÿ®xºa¬µm ýò%ú Û'Æ'h÷ïgì÷>„‡u[á §µ·8qx’‹tUÉ£IEND®B`‚PK €ŸCåHmOO@res/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl_light.png‰PNG  IHDRX,á&ãIDATxbl ¡¶[о}ЃqG€¤  u€$ ¡*¡*¡÷ݾ˺ùïÊkò üB€.ë°.Ë[¹DM!PçÔ`å ë¬d嚈»YQ€ðËë øåã•[ \q#àîVXƒ»jÝój8ÜíÓ ð °v!w Ìëà`-°X8Z…`€`€8ÌBÏk­ymûpÚv3´-½»pcÏûq ¯‡öOó(KÖÜ;ðb¥FÝ$¼‹£öée‡cñ4{äÕ Ÿ|$fmzä®þuáùßB7Œ‚µ¶-¡ÿO¾D¿aûÄøíþáýìýÞ‡ð°n+|ô´ö'‡~Ñx¬Á}IEND®B`‚PK €Ÿÿ’(…GGAres/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl_dark.png‰PNG  IHDR(0c{8›IDATxÌÙ3xq€ñìd®5ÕcÖz©mÛv÷½˜êîCmÛê1¶“ë{ò.±.>œïy~g~ãó«ž[/Þ§á4Î Íh{ˆ:ŽxpBSXŽ" A›cHÓxÍnZpÈͰTìíö™ë.ŒýHu#pš hÆ'ÃR°!H„B؉T'· ¥Flµû3·AHŒBØ„;×¢§¬·2,«€X$ˆµH¶"p9ê «ÇÊx?sKáƒØÄ‡åHŽ%pj 6«Å’hÂ1ˆC¼˜‹ÄHóQ qX)òŠŒÿ—üÃà¾â²pâ²[Èê-p>< [0··¥ó?D‰?Hí¸¢Ì®¶¸\|Vøy†15 «1Ù0Ö#¬00Œ5†q¢ÔUÃø¡8ð›aÔ(¬2m+¼RAÃð*ôF™âÀRÃx«8ðaœSx¡mµ)Œ a‰aŒC¹ÂÀ Œ7Œ,¥ß‡oÕ¶ÑlV¸¥ûÝå—ž8Zhê¾UÏA‹‚8ôöN’‰» "«¯7»(tó/Fôn<Õ.ÄÕ`V$—…$¬qxË a’£:X:x<Å«ÎÀ9Xˆßˆ–"×®Kÿ¼Ce„[P•ø€=Hsâ%Ù˜€å¸„o(‡~”ã.£uQPµ¼äØWü;ÝWX+8IEND®B`‚PK €ŸOäaIIBres/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl_light.png‰PNG  IHDR(0c{8›IDATxb H¨íf4gÏ`r…Q†ƒÁzëXU\n7±mÛNßUœ¾ˆ]ÅN—k{w<'ß¿¶æâÌó¼õ|Ã{þsqà¤íAÔiÔ#€3šÂü8‰8ÍNÁ¯!ðê Ô㘛a>DÒ8ÃçFà>ÔBzQ‡N†y±1HŰ>'w ÒO5Øi÷;·QÈŰ ^;7¢’ jl¶2̃õˆ@,ÅFx¬\JˆÅª°6Ñwn%B›„°ž.C9ÄfXÑŸ°!XˆÄ!A,ľf¡â°dõ7ÿ .ùkº‹KÅ}ˆËî!µ«ÀÅ(¬Ç®†Î%~Ã×6ð D™}Íqø¤0Ð4ešÀé(WX†é&p3â ãØ`ï@”ºi¿+üjË–šÀ¨âÀ¨ * ˜ÀBÅ&ðâÀ·&ð’âÀ+Í£}La\ +Là$) ,Æd˜ªô{ø©ÍÍv…;:î]~*Šû oÇ©zêݤ«3I *|ŠÔîNvcãb\Æ÷v6ž‰2ˆÃÊ1¯/›…¡Øàð”Ã&xú»°tjy´i ë·9È·1.óàIdO8Ï,žCx‰ V­Ó±¿,Z­D†]›þ=x‹’>NAq”à=ÀïĽ’4LÁj\ÃW!„0Šð×±S>çúñÝ|3–¸>IEND®B`‚PK €Ÿ?8 ??@res/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl_dark.png‰PNG  IHDRX,á&ãIDATxb ذï( ];+Ž „Â( H@BKh)H@ZZ€$$÷9û,ÿwæPu |ìïªYÕÊV|s=À‚º•­°¶i+¬mX;Àú2Àú*Àú*ÀúÀú6€µu€™*Ü€õ%€µë 3M¸>ÖÖ0À 0À ðŠuÀ -puœ=gGÀ›GàÈ«†y8.Z¦‰è8X“_>Zä²(î´â3k°5Ó"ï¯ó‚ÁT1t¯Èœî¦îPòÐá²?nËO äÍêbØéî¤&€N¢m\ýºÏºÝaž-Àþ}0IÖñðnV^uûЫdͦmIEND®B`‚PK €Ÿ-×S>>Ares/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl_light.png‰PNG  IHDRX,á&ãIDATxb H¨í´kgÅ„P…# Hh - HÀAK@BK@€„ä>gŸåŸâΪŽïýýA5«ZÙŠo®‡XP·²Ö6­b€µ kX_X_X_X_Xß°¶0S…{à°¾°¶`}`¦ ×ÀÀÚÀâ`€`€^±î¸sá£®Ž€³GàìxóyÕÐ#ÀE«À4=kòËG‹\ÅV|à` ¶fZäýu^0˜*†î™ÓÝÔ*@:\öÇmùiA€¼Y] ;ÝÔÐI´«_÷¹@·;̳Ø¿&É:þÞ­ÓÊ«.`uêÑhf¸ÁIEND®B`‚PK €Ÿ‹¥4½½>res/drawable-xhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png‰PNG  IHDRŸ¶ÿ=npOlÿØd8npTc (0\…w›IDAT8Ëc`£` .ÀÈðŸT-L¤ÛB-ÐÈp¥ê¨IEND®B`‚PK €ŸæÅR»»<res/drawable-xhdpi-v4/abc_textfield_default_mtrl_alpha.9.png‰PNG  IHDRŸ¶ÿ=npOlÿ4&†û8npTc (0\…w›IDAT8Ëc`£` .ÀÈðŸT-LƒÕ/Ï–%zW IEND®B`‚PK €Ÿ¸'#Ô¸¸Eres/drawable-xhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png‰PNG  IHDRs¢–˜npOlÿØd8npTc (0&ÞA¬IDATÓc`ú€ñÿ?Ò4°00’¦ÂZ#=8£IEND®B`‚PK €Ÿd -¶¶Cres/drawable-xhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png‰PNG  IHDRs¢–˜npOlþû3n8npTc (0&ÞA¬IDATÓc`ú€ñÿ?R5h“¦ùM*v÷=;IEND®B`‚PK €Ÿ9“/8/8%res/drawable-xhdpi-v4/ic_launcher.png‰PNG  IHDR``â˜w8bKGDùC» pHYsgŸÒR vpAg``xÛÙô7XIDATxÚÝ}w¸%U•ïoí½«ê„ºo÷휡É9QT…QAŒ3*¨`#bz&ÆÁ€¢8`ÄБ¬"D Mjhºé¾ÃÍ'Wí°Þ»ªÎ9M îožu¿úNݺçœÚ{åõ[kïKØMÇ~?fÓ7°šß=°¶`·l~[WT0Æ Qs!@­2‰Éñ:Þ}Ò½»déwâöú¯ñîþÿÄ%•sp”z3J1?µm*ÆñÚ#^{·ÞƒUO¢P"¼ý„{v)]Ô.ýöŽC"ÄUOœŠ2Ow¯]ãöY2ý%‡M9è#N{økZ·n*ˆ¢@Ôr:±Xõø|ÿŽãñšNÀT¼D‹1Á „y¨£†6!B$ Ћ ´PC UhfÓAá'±ÝlÂQáO±Âœ‡ýÔ¥x\¿ ^\zàôòÇ帳ý˜ý^.—^ºc²Ö­q–ÅÐ wðq½»œ.bw1àO÷-C26kÍï™YˆïûËçW­9YQá»Û¶ŒÎ™;oLJëâ­ÇÞÁ}xÛ Ôñ Xþ%àa&†ð;4°‰,ZÄHÈ¢IMl§!܆=éëé G?Á:û9TÍ q1„`GXÞü‹œ+_`#¨mœÜtÑŠÇ7œ¶îaõžG†VaÓš–ˆ ÞÛÜåtÙmðȲ&zÇÄÆá{…×v2©ühÎ"yìŒ9ý‹fΜyÑ1S¾isX'¿8ôè=QÅëQÆlh$X@8X’hÐ1ø!€ÅX̸`±X„GEŒï’Fƒ~Â~§ˆy̪ŽG[Åúá§pòÜ“±Ò#+ùâ“åÉZõk[7FO><6¾ò䚎ބ¿ÞZá™óV>˜ìrºì6 ¨™•àÅ?Âø†©npéâsg/ûÎä¨û]e²(ŠÞøý;n{ëæá ö¬wœ(Í\„aó1Ra¾Òx½8ÜE˜e"L1Àb·'…cøpá>S p¸0Õ”0ÍÎÁ‘n1ŸÁŠŒœ'ŽQ–-<÷·bh4Ä/fßí–·þÔèXå°µ+ÇiËZ÷õù{ËÛúsC^ö™q;ô¸Ñ®§ËncÀìE ¢5B9^óØ V´mMù}cÛZ´Ö(•K_‹ß|ô­¶9KÔ÷ˆa-pŒ©Á¨OíåP{#ƒþCãþ_&¸ì–E8ã¶^ìwÛÁ8çöß¿=Æ÷¯j¡r‰Fó¼1¦îž¸GÍŠì×ì»Oš˜¬pÃÚQlZÓºëO¿l\tÐ1=bù±[Ë{âÞ›[(÷ízòìûã³—‚V¥ˆhÊ( ¢‚–qÓYgÔ™ÓçñOçôª¸•\/Öm?íÍgþÐG#Á¥ÇJþ‰aO5h`ш,  b$¨ÂA@P „ D–m°,þ`úýöæ¶;¦”§L,¡ó0‹ûòÎC#>zßHý¡»Ç_û㑇ÞóŹrõrk =}Ó$~ü•Gÿq«øÑ½åFÖöcÚ‚šºà/·Ÿ¿âß9?|{TŒ°}dü=9õ]CšñQG­ãL1$B `80µ0Š Á  f &†„ët½`.=d¬úM£:õ+þ?££ã\ñàv<ñ@ã¥ré¢0ò«Ÿ|оùC@HÀYÂO¾öÈ?žh½£#0ŠÇðÃ_ý›·‚>ùþÈœû`ßüÃFnZ¼Wß!‡í³Àì7ãXÙÄ6X.bÐ0¨ *L>pÀ F êp`xXX8§Ù:ã¬u`Hr}¢¼exx{ÿË·W=R¿î²Ïè3>~iŸ½æ×#î«?Û‹¹gªÀgþmׯÿ»«øl41Ž^ b‘þ6îk½ ûõ¯Šè3C¸ovu묩þu'Í(Na‡~êÅ\+É:¶F!zPÄ4è…D€À0ˆ1 ˜ÄzXhØ”ø–-¬s°ÖÂYc¬MâAP”α}ü ¹á‰à­s—Òk•J°`ñ ã®M6àÁ‡óN¾s—Óe·8áÇÝ¿"ô¡€)¸&˜½{_+¤Ùˆ§þi&޽{ßY{¾¬·ØËŠç‹ìGML¨aó*Ìû Bp€ûÖˆóh&ö–€5ãXÎtìùu‹Vq+/wÓi?¢#x Ї(cz*ñ¼Ô»ÜŒ†1õHP÷fÖ«a¬…5ÆXë`µ…1IbY'–’¦@«N?šØÒŽÑͤ4P'’Žu‹AЉÇ_»l—Ñg—'bóåIhòÖãvÜ*CÓd óÌÜñ±Aìù¥ ÞŠÝ í/"lÆr„(¡„(‚ÁÐ0¨B£ ‹ /; °°éT,Œv”äf0 0 8Ç^ $X…ÖHíÞZž>2]7KgÌn6F6È:íØœÓ»”>»TLÞŒÁñØâîÃqöâ×* 615Þ;ˆ=/`7aõc‘(aÃxŠЃ¥t€††F+|88ƒàR§›¹^ éký«1F[ca­…ÑÖ:˜ÄÁ«5´ê|ÕȆò¿Ì߯ª'¶’˜yÖ¢ql[ן|óýÏ;v©hè­ØjB€2–¸W©-ö SÁØé=˜ó p›±\”D€)Á0XhXÄh¢Ž1T° 5Œ#A ÆŸ`XpÛá¦Ñw¾ Ç€³€sgvH%ßK?;Jý™¦@*Ò$Ý«{gT.^}Ï,86’´u]0eÑ»„F»„·¾ ÷TÏ!DÍŒÀpKÜXÿš(ÑŒïèÅ0žB“«`UŒ£‰ ,Ä00h¢‚ $©]w™uï8]›ð#ÃY†µþÕ9ÀZ€-Ò{k‰nÂZ°„s 0)ÉÁçöÏßtn«¥TF$‰ƒN¶<ºßÿ? ˜R8Ò XSă´·:¾P³¾ o †q7i·¶!4f=Z±IJ¨ÅUÔÝZ®Í:'¶I¯ t~jhÿ㬱ÞÑZkÚ§³ kl Z'HZ!fÃé͸’û€¤”ÄD|¡ŽÅ9}š¢U·˜µ¨…O\~ÀóN+¹+ð‚×mGÿtÔjã˜Ö·TÖ㫨÷Ür0ã]DÒÔxX5â‡hÚqí>Ø3xfÊ“QƾKE€ô.•³Ø'Í3«Ïìcý4Þ·&µëÆÂ9“þn­ƒ³€6 „íÁs>f¾ §ž„f2‰í• DpÎ’³l­¥¢³vÉþ‡7~–˜™ê“€ÃÑ/ƒ»ÿ¸õy£Õ.Ñ€=öÜEy ” ¨6¡Üæ‘Gg*êý¸#ÁuW‘õÖ$LÂhÆpÍ–F@ÜèÇ@p¦âx4ã¬fm µ6þL´ö¿kƒ$ÑЉÉO£ÓÓXm½F˜L3­¸†Á⑘Û,¢ SJKpü’ObJa)’¤áýX !¬ ùò¾éú´mC‘S‘­†Ÿ›5ÏoÜò¼3ວNE£fqhϧ†S¥æ¾ž…ï%g%ºåš­ µZUãÐlUÑCû#SàXƒÙ´Ž¡±d„Õ‰E’è6COhÝ·ÐÚæÑŽ1®ãÕÁYB#°³°.F J˜^<qÒRSÄìHHź Q³¡ œâ&€<ù_È€ëW €Áøã†S…Õ¡x`6\ôfk7š5ª7ÆÇ Xí R©o3 HAP€F² ›ª·6L%Ü"É%ܦҮ¡2D§„7í3}o§c PÂæÉ{±aü.@ŠN+[vÖú±3;AD ¢C§Ím¼ò“o¸±lUæ,­ÿïe ´jA‘Û:†@ôŸâ,-ˆ“Ä5›“¢Ùœô„Ô‚‹®?€Ç7_k ¶U–ã/?ƒºÞ g´Ö©[£¡µöf(ñæÈhƒD?3?©ôëL tæˆ-\Jà;Ÿü<ÝðÔ[ã¸ñ/W`ýÈÝDƘ4"RÈÌ÷&Ækc8k±á …·¿ÏóG³ç“7¬> †' ©€b¹@‘ìáñÉ­×G…Þ“‰à=!Zùc Þ±5¦AcBZDA/„dH)"¨c¨YÄ‚4†œãôžK¥˜á؃³ÞI»ôÚ9oâZ­&X÷`bb…B¥”wøNÀ$¶®^«‰ÊD2\¯Ð±ñXßS=3+B(çš…|iÅóB³çU¬u a`4¼mûð\cÝ Fjµj"ÑMÍ©cä4+%„Q+G¡”„E«a­K¥:³ëmdL[ÚµÎ2]ï¬1iD”Ú~›2Á:8ǰÖ…}¡ÁÔ>¨ ô fé! f8vD–dg›>ó^8§EOòZ„Óß±ÿÿ>ÄIõ À+ŠÇ€¿ÀhÛ›$-' òDá” þÌL±‚³Æ¸Ž˜>'¶±9¡í×]§u9¬µa(ç9K:0Ùp`f8ga­†5Þ\ÁƒÀι~íS@±O»#>ó%84!eð¼Ðìo2AëøƒXHc„‰³OFqdñ ¬4ÀC+VÂ&›¡Ô"õ×W›#÷{õEÆU>*¥0 ­mSBD9¦CùpÒûÔ6;D䃢”h "ÿê¡o“³¿ç85KÙ«—~gÏ)lö»7_>È2h‚5›ÆU&brÄ<ôðíÓpÙ_íß¿dqŸÿì»Q{a1‰ € 0á†1šlÇðØfôpì´âƯÆ?Í»êÿMFùs€Êhð·ðs\œÿmIt4žhø¿K; u$â¤ÎǶjk’¸•†•méw¦câé«'‚K£–Ôyv†’ÚA§&FçZ‘‚k™Äç÷\[2-`ÎM‘g’÷ žiÙ}—j‚…µ†Ø3hɬEµYЪƒ.ÿÒøäGF " ^0@!I*Ò@x `ó†a|÷v_OøþÇý} XËó˜àÛùBlÆŸQÄR¼ Ÿ¦ú©DSi›] cjX·®™aïT¯m·ozѶrÐYcuBî:­ë†¬…éºg=³rb».³ãm=§°sJÜL:Oæ¶¶¤×Ž‘jLÆ4瘘 ÖqI*=ûwÏ€  ªøÒ%³ISMYTeŽåÎæÙô1ÞмN YÇF¬~|#&Ǹäú£ÿ6<Ö:`w;BHHæá$¹ wŠ8†û1‹gÓi¼_pF›CRHˆÞr Ö1%µ~ÔšÛ§3‹©lc4`´ƒÑÞæùÄÓ  eöºϱ°:%¾Ë¤={¿íbš1mF¸Ôî»ô»3F¸4jj_#ý½ óÌ‚7uN0 4[cõü}Ž»c#5ÚV­Ë¹tKHc0jÓ€f2ßÝïDÅH)¬­ôÑì¹3DzH\|Í‘Ï+Ì»QP FÌMª "Dv÷8€ n:0ÖÏÌÒ!±½å9nxØÊʰb÷£>PÒT!3+0I‡ƒ}½^ ÒˆÈ3Å¥ÒÍ]‘‹u™ÙèÀu\Û±îxÝ6-¯œÛ|NRçü5ç×Hái@€H‚¤b1¦–eÜ ôcŽ;q/ÑWžcüwƒ>`ÖÛ°ü¶u¸â¶'ù‡·•hño˜éußøÞl´vkWÖF·µài€ÞNÁ¸Yû¼ ¢/šŽF\{„sÙB²`zU~ªJ¾ÐÂÄ¿ºïÖ7¾V‰is› ·axtóX3Þ.L£Ÿ¾òšhò€—ð“õÖh¡Ùªq+™æ`Óø’ $È;ÐÜ¡v½rJäËÎ;ݶt#wÄ.“äÜ ¥ŽÙqÇ{|I‡8­šb@øJšµ:q7‰š ;¢¹Má;›Ö¶~ôÎ7Ï ¤ íÔiýGÕ±îj'êo‘÷Pž1Æë§OÄ[g5›ýšÍÆë;hî¡Î‰ÛN?yF}õº†¨ŒY.”êU‹;¯ÛžÓúi%Éß>ôZ|ê’ÍxÃY=0Ü¢ +ÿé>UüÀ”¿Õ Æ-BôA@`D?…jm|¶nÊc›µàlIêýwÝxïŸñö—ŠÿiœrÐ ¾ûá-ÒLûV\+.%², ’a 2ŠQì!K‚@ ¨÷EÁ‰—>ü—a¬ª`Íê-42<‰86ÐI’Œ¨ F„¨(Q( J„ @PJ!*H¡DX b!*d ­þæOCVk:¬µ`ÇÐ #‰-â¦Ç”’Ø"i:´Œ¸i cFܲЉƒ€‚QÒ¬³Ñ7eʼù³§þô¾›7¾ú…¯é}+€ÆÚ§†ÎélÎaú´i#jÎYèØ¡ÕŒÑl&hÖ55gê÷²Ysì«üfb´%û§¶ÕŒŸ™`gTG+’{œÝ¶±zÜX4tf36ä¤ bÀ)èØP½îDµRO&ÇQ>V¦ïßuñUé9èȃ޳ϋ1k>ëGW­ öXÇØº.ÄÖ #[±í-LŒÆ‰Ñ¬[èHÀø®«çtì˜Ê0²ŠñNH ¨€ B P%zú”{н=ý=SŸB¹Gr__?&í×–¾B°Ë¶nœøª¿âC_=ð™àt#iD˜AÀo}[¡YëR(€tns3»j´Cܲ¨W4UÆc†“jOo¥Šþ8ÇØp BHE 1Š0  ”D*„Q€Þ¾³ç÷A*‰PBBé}dš3À@äNZ»ÎY¼±Ý3ÓÃðN܇ª6Ï~­õ¦Èhß#¤‡8ö&$‰’–C{4ëÖjT'cá¬ct‡É£¶Ê}(Àgï™ÍÏ£í33@Â1S.Ãe7¼:Up1Á rŽAM!¹sëˆ ¡zÀȳaçÚBÆ94‘Í“Kˆàö@ºh‘Sß?/S‘´ktÓyGÂçS¦ÈÎ@;Ÿ]ÆÕ”\)B©œh;Kë%̺é³.Åfv0ev”Ûˆ¦cöÃe‰8ialrbÞ”À$„‰ÊvcVíÄ-#²ë&~FØÌtrñCnh9½fKxz¤lGâØE&Ÿbq=û 4+Ý2ÿ?k@·MXZtÊ%Š»˜àR"‘oE–©Öضp¾¿ÖÛôô{¼HŸãÚZàÒçSš•µâ:šÍ¦”–àнÏÁáK_raë±ì‰Ÿà‰M@ÝlG±Ð%C0;f„tè XÑ;3ðL(Øå¦ ð÷ÙŸØ:Ía—itÝY<ÀpÎVsnp:zfpúƶæxc9?oÿ©mã²  ¿x¢<}Æôr  ­ö`¹Îì·Kë"³µÜ5!f@ çb]Öå½pܯÇþ OFOiZ.3¦î‰Sý,Ž–¯þo<ºþZL6¶# KƒbJ|Óe›;%·SÉóà&ºÚ>%MôœqÌʇâ©`Q—}ìø ß•G€ïÎ<ö,ÐaÓüï•T ¨ý n¿/•+–* )¤dΑÅL=3­I}Èñ9—ðö–-ªõ1°˜3pZôZì¿ðd„AÑK[í fN]Š—ù1³ï[qÿª+ñغë0ZYƒ@Eˆ‚rÊhÛ2fs`ÎBÝFt–ßìœ`Ûff6סc‡Põáô>…ÓFyNFv03‰g$üÓ •›&)¸Ç+°ÿâ—cÛøãxxÍÕ¸÷‰_ûlÛÙÜldÓôï¼É–z8BH‚}êB@ghž…)w¼øÞ.á8’Ž3mí"÷Žƒgv©ÉËä”öéNÌ?Ò«`–Á23,·ŒÄ‚:CÊÎ8;s¼ìÖ&¨TÆ1¼žÐzâ;¶pŽSÂÿ}íK”fÑÖ0„ ”Ô¬œ0:êQLðŽ>i§^€@sÆLÚöN‚µÓÎpÔk`­Õ€oHùúl `X«!Hù¨“Ñgñ@Æ`îv:™0˜™JQP(”´Bmíè–|ÂLHLý¥X8øB\ôý·àÌw†ëÿðÀIH!ÓŽ†ç vÖY¤T¨WøÁO¿SÎÜ —ýø‹Øgî)(ÂXƒÎ€"mMDô T˜ž“ˆ ñØÐ­äœéžwWFŒœ¡™£v©éÉ^m7´³’$cúÔE^=(ÈqŽMtp¾##ìº ˆTоÙ5wÄ‘:Ýýà '}]p-æ-™ŠÏûu8ç#/Å]wßì1!!RFX<Û‘pÌ )$êõ~sÕxÓyÇà’+>€£Ž> ?úÖ-ø×S¿éúaLÒ–ž|¸¾_ÈçÎ XšÈ-:¤=û½[¸”,´}jçß:ކ¡QXÌ9I Ê¢ v²Òù î$™ˆÙ±Íb¦ÔÌd¬¦®ÁäƒJyÐ^/ÂEç߀»¸?¿öB|ú[¯À!|%ÞpÚÇpÄaÇ€ÈKµ ,9ë>œóÅo)%¬qøýMWâW×^Œ§6߃C<yßU8î°S!„Àdeõª Úpw‚E; “xÝÆC" ³pÖgæY&Ðaœ@ɰ#úIÇËÝã~Þø¢ËqáO_à‘H$:œßøHñÓ d Pè ƒ³,4˜2>¤ðB3žXg¨/>êM8êÀÆM˾knþ&>yÉKpøÞ¯ÃY¯úØÿà”Ø~¥¤›šô Ürûïñ‹«¿Š•oÁ>ûì‡Où¼ø¨7¡½&±‘@;8bß‹û4 Í’Ç»"‰z<ÑCåÎ`²Ævä©Yg˜ÙoV”ƒ‹ô¬‰ E± B.m6`±¸,Ýö6›8myã'×=e„!Òì’ÊÅ©8íÄฃ_‡›ïý®¿í»øèEWáèý߀·œña,Y²§ÿ¬µ¾‰À_–Ý+~õŸxtí°Ç^ ðÁw~/:â蟕3ˆr ±³¸ŸGÖ™Cí2ƒåXJѺ¶TÈeÖ x=uÚı¶áÚ<3ú{§e#€ °ÁŒ:€¾Œ¹¹4w2"STße@,›¿©#É!ÙíÀ:QOIµ18u!Î|ùq¡oÂM÷~×ÝtÞññŸãeGŸƒ7œ~..\Œ‡½—ýðB,{øwØsŸ98ïŸÆËŽ}æç –i‘§3;õ¥Î"#ªoôcØÆIs’-S>ƬK; U;ÃQ°sìœXúœ:¶ž¥(J)ÄBX€¬͇ay¤C)­VII@¸z6·^Ù!ŒÛI¶¾#|v;wƾxë+/Ɖ‡¿×ß~)®ºá›¸mÙ•X<çPüõá10³€œ÷)¼ü„ÅÌi‹»$^Šÿy=zŽˆv?»Ô¢À·Â õ9”夹·æœè]BÆÈ…¨ÝŠŸ5Ïâü!Úá‹.D´£*Óû¦DcBQ©”«CWvÈ>½wÜ‘õðÓbãnF¤Ùmʈ…³Á¹g~¯8á]øÞ•ò¿^‹ÓO#Î>닜:/%ª‘Ì#¹ÿéÈ·#˜“õÄtÔ”"$I¶WQ¾ª²;O+bÀcbÇÌNz‡˜gÄÝcÚigœ"§‰4ÃʦN©Ý!LpŽ™ˆ¢;:25ͤ­ Äzy¥Ù°c c5–Ì=/:â_0wq ¯yÅ9œ:Æ$`vB=-ã|ú÷µ§•Gu.ƒ„:q›Ì¼HŒMnI×ø(ˆÐ`fi~†pÆ4&ü·§ùºK’;g©\B…PL:Oµ»b]í«JŽu*7å;ŠÖ;:ïô&ïäoÏt’i…Ρ:Ù„NŒMg"ž“ìp0ˆ„o‹1 )©]¹{Ÿ€V«F£æÍwú6Î}YgÑIHÁÎ¥-Ï0îöœ<ÈhtÖ0–½v“|§ è\4 n—Ü8çt§p>œIáÕ”vhÃ{ZtIÐßΆ"ý­G:ÅÎyµý*åƒK…œ”RPRM!"å«J ®ˆ¦C“;ü…a$@©ásd@æ`‰h‡*\Äí Åé ]§Ú!âÉQì<ýÿ{©·³ë¿{´“{ÞàdIXök¸%• ,AÍ,€ÀÆšc€uëZN´Nî</¤Š4Ó u†”ÙL¨# ë|·µe‡É·ýÈß§i€ý÷}œÐnIods$Ñ¡«`šq½f&ç:‘È<ž³²+ÁYÖã“õ&ÄÚ·§·âîuÆ;× ù×} `ª#µi]ª–:ë4H‰™.ýƒ›Ü¡m~p“þvúí@ž¿G ºò™¶ÃÍjØÎ™|ù’¯I€ˆ)7];‡ò¹0òß) ¤!.ûÅ' ewQþüŒ–ÿÚ§ú”óÌÞ¶ÙÞå\ÛQM†)šÎí Öþ¦Kß™®ëý›¿ƒøÎ9€¸Ý6˜ Çyç©T,! Ê^àŒ 9Ï3Ñ!ŒmAôÚ¤D—£™ÉÇþã,£>¼óÌ/ PÏD¾qjãNFŽˆlWÁ³0²RÈÆÒá2¨ÃVu…°í€`L+…¥ßÃçYu¢³B÷Ü ï¡jã£<©àؤÑTÇØàÁÄ (£õ#ßOÈ)‚ JQݬÿ³”ÌZ%ÁDŠÙÛHµ@Òð™<üýl HQ@ßâßÓ¾³^Rc¦Bù®SÙú*nW‰8­×qZÐaÚµ@]¼Èóg…e¬ßö~qí…Ø>²%-¾“¯b=‡ð†Ÿƒ ËODP*ÄÚõ+ñõË/@µ>† s€¬íß´nAí·±aÁ2Ôr^áÌ!§£§¬˜ÙxÕ ±¤=¨F¸­Ú²eK0­[¿–ÿýÂÓQ¯?KIšu‹¢äW¸T•¢´ÞYAÎYgÍÝ1CÀ1;£q“ë:¦õPˆzPÈÒU[î´’Wßúe¼ï“'á'¿þ:êõ*¤ôÙìs)Â<“Ê/¥Âö‘-øúåŸÀÙ|n½û7(‹¾† ÐáŒ3,Çc[‘ê±RRµô˜†éùt£*Áf@…4S î·p½®Ç9S²º%Ï j“¶YoüG’X7<6$¾³ŽÇW.‡Ï ½÷î‡0ýÔY(Ò"÷>„ú¸úê䄸gYƒHkÛÎù5´Æ[-¹Y ¨:ie£æ¾}Ô13¾ùªU(•¦Ú²™ãêð;¦8 ÚK³Á¾9kÉÒùØ´n ?¾úøãí?Áÿü^¼üÅÿ‚b±˜VÑdŽídNx碟-7•RBJ…ѱí¸ú÷?Âo¯ÿ.&ë›1cÖæöÎA"Eg³äKÈ1,†=°T( Õ@Ò¬ýJ©X›Ô_,‡sæ”J~O¹$IPÓèæ¤´‰Y׌'?Æ{Ý|î§O—ÿÇ]v²rŒ(zpÍ/ïÆÝ÷ÝŒ¨nÙw@÷6+ÁYãÛݶÚh9põù2žµÑ~Qí“ÕᲪMhTÍ·7¯žø”S(©¸¿¼‚d­zyÔŠ» FX`Ì]8‡½ª.ûÕûð¾O½ºí·aÒÃÎu‰ü1VŠ€úªX³ÕÀÏûmœ{þÉøñï>‡¾AYˆ™s{Pêo/ÈØ”¢–?±ãz£Ù¨]ðñÁ 'Ãõæð‰ÃckΟ¬ ÿ¾Õª=ªuócZ7XWÿèHýÁ:C¿í™Yýå™Î}Ó¥(J¸íê Ï®ï9ÿtüäÚ+ñú“O„åFsRÖê×J¡ŽÛô®0è{…Yìd`ŒÕ:~\ëæÝòÁoœLvÛ¬´ ã”v|x—µúe™ AP!CHÆÜ…˜5wÛ¶¬Æ×ü\Ëxý+ßãŽ: €ßzŒÚ™"@å d€$‰q㭿ů®ù6®ÀìySpð’Å ‘n{Ɇð‹³Äª3KÏ3á<ÙJêU“œúo ±}=ÜÒäó*A½ÿùés®ºhŸ×CMïîú.Ìû/<‘ÓPɽöÞÃnÚ¸ §¾}^xì wª­;Õ€Oœs%¦OT< QXD½V·¥žH&-½>IÌ?ûëò7OÞóâ±Æ£/^?~߉•ßì,nQ'~qñ_P,ñ᯵²âFwq¾@Ž" á— ÁPcÞ‚AtÄLØûñ—Ÿ…ó¿p&–?r戭 BHH¡pË×àܽ_ûþ¹°áFpè̘Ý2d@~ùR@¥üºFgx;:Èwqƒã¸k!‚b‚0ˆL”E…ê+a5ôæaèKþU`ÕS˜/„rvhÃx`ý5hš¼î¼EÏp×O€FiS{§!Ñ Ø¶§¯D*ê#/~WZØ”˜úП‰d¬T Ä5?_í W¹^kb~ß«`5VÁù„Äutƒ»m8#ë‚n‡ÀB !,æ/šý™…õã·à“_}5>}ÑÛ±fh%DºØÎ:ƒ‡û+ÞsþiøìÅoÅxüæ,˜ :HÅPʯΑÒ3AHʉÜn:ÈìXŽ÷;c3óГC[bH âõë¶BkëHóµßíͧx0N;aT*G0 mØìPê³X2ý Ì™¾®¼th§t~Æ4æüÿ<·.»{/ÚÅBBhü×îÇçÎ%kA!´‰aÌ®6Ö9,Y´'í±Pظè‚Ðàdýþj¼V7*„Ìë%.»Î†Âñxgy/_ÀF‚µ«·€Ó0u  ªpY¸Ù“(ö%X¼Ç,Ë B:´Ÿ×N¸:ÁÄ—Êv[IWÉ‚Y`¶d6oÞ †‡7¾wõЦoí½t®J*eSèuØ÷¹ ¥¨YúnLÔ†°zà ˆã šUË¿°ïýâáøæ'žy·Ýç”G¾åC"P$º‰,FOâ\ºRE‰"õ&®ýÉ*\xÙ[pÔáâÖ?ß*fîå&«cß«·¶¾=æ-Z.ʯd;,UÚ‘(™¹ÊÓ|îXƒÅ ÃÛªh5 æ,èÇÄx ­ª@ßÔ"„´é ÉlíYÇ32»žæ.yrÈ~ù”ÖÄEDr6` ¦Z­ªmÃkV(¼¸Ú.ƒ0Nsu²…›³é¹îY¿JÜù±|Ûå¸î·w"*h6b±m|”÷˜·çŒ‘± ·Wš÷AS!RI(A~ë‚Lò󡵛̺’8¿:Åo²§@@ nù:!…¯ˆ6ªÛ!ÿû•:9Œnýª1ÚA €HÎlÁÅqCŒŒ¯uŽÝ«ØÈëµä¦kì¾û‡'ŸX‰;®}^hö¼nܺx¯pÎo/éœcIaÐWãŽ8iÒlÔ¬±† ( "Ø ¿µ°ëØëŸýâ;öûþ§}6éºògÖä—³ ) „‚RBªt©«ò½é‚ pàk²¬ÀVÁY ktâ+^lK.Žc[kn—xXƒøí£• ¿)ÊòΞ²KÍÆÊ5cÞ¬¥XñÀ¶ÿ} ¸éÚñÒWì÷í7 š­„µ—}{leÖWi£&q¼'ÂÇ‚KSª^G`§À¬àlJ(Vȳi–ˆˆH A@ˆ‚"HB©$E2‚ „ˆ"‡‡`§àœ‚ÓÖ(°SNYm[ÒØšéÇ‚0|Ëððºß êGq‚«×Ã+*8åÁO/½åy£Ùó¾uñ-×?Œ¾|_ÄqaaûØ“,¥½¥Yã~øw¿zá+²ÆÌÑ&ž§m F[-"”S©)P¢±O|+S&(À)…  !D”Â]dGâÈ¿ŸÿÎ3Øÿ· )ƒ>ׂ¤{2 ‚oO˜}N¥6öX”äž‹¹Ï¾÷Zœøš…Øwp,Æñð=Ïôϳè<.øêipÎa¢ºŽ-¦OY"¶®¤rqº=鸳gÞxëOWm}¼·ÜpX©õ ûQú TÑwF{lÒãAdÁp "GN»ôÓ<@¤ë„ d‹»eGiµƒ²pNÃØ‰®s½^#çô]Rñü‡VËl9`¿CqÿËä÷¾øˆ½êŽ·àÖ;†0Y™À¾üüÿW¥]²y7ÜyãJ¼àŸöôö àÂ_Ëk7>ñêVyÐEkÖ>õ®uCC¥ñáÕ‰˜õZ­*Zz±‡vU8nÂAJ%„ªAIQ¡*P JªEA‰U BTB©XF¡PDE£* åฅ8™Dµ6ŠÑÑ­Ø´qÆ·Y7º âñ‡ÖýÛŒù…ß]rÁýõ£^2'gç´ûý?Àš§6¢Ç3–ÿyûÿ#Už~ì2 ÈŽó¿üJÌ™3c£˜2µ>ðæËù˾;ýö»®}båªû§µ–›uCIìkð›l‘DI„¡€R …bRû§–ïB5)HMB… ö9…b»%F­dC¢“| ã$6ˆãIlÒ ?,´6<пCY[¶­:éfß¶iuK,Þ·G­ÜŒÙ gB¿}ÁåŸ_¾Ëè³Ëÿ‡Ì—>z¾ù˳ñÞ÷ |û×çÂ(tA$¸XVPŠF:ÝŸÁ$¾Õ¤ÕphV9݆ž­¸auC¾kù=›ï?þ „¥ià m“à?ó¿¦\}ý/o~ìÉ$H' î*Š* )}ÔF2 „‘`N۪ΰ+î]±ÍSpðK"T7ÇÍ]J|`7ý+©ÒU"ì»Ã–Ì;ºDT)õ*”zzú”ûŠ=…²D±¬P,ùëBÉ_GE¿åŒT!Ï9Ð[ûWíúºË8™6záœãu*Ž¢…b„b9B©¢XQ,(ÂHBäÑ>ÃñçÞu3;4k„§þ<Ÿ7¾ý™w9mvÛ¿³Ú-Úƒ{[¥È„¡ðxŽfH%„ð;\µ:f XòyÑ„§¿äHØ,L°ðÄ,U€ð&À à³ÀÛŠl-œ¸²o'êæ ¦¿Pÿì±èD™­ŽUdIEND®B`‚PK €ŸŽQ;ýîî;res/drawable-ldrtl-xhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png‰PNG  IHDR00ý 1 µIDATxí—]ŠQ…û)ŠѬC[„lCQg–“ŸNòZñ1ë’M˜™qÈC–á@ì/  Š$·ë)0缕p>¸\ëžNžõÿ‹”-'žJŸØ1$ÑNð¸FN(ØSÿ¡•‘ئοéu ¨ŠÈù—öP 1ÃydN»ô”9¨¡TBl$¾'³® vPqOКN :i@Ä™ Žš¶ zÒáD#ŽݪéÜ8¢Ä’ ¼’YG‚¶P±AÜÒ)}#ñ©°×”»È@Xñj`"`Çäèe‡0ã,9r.}φA亖À,ê k€0âÝÏJObãG¤*Þt\<¼fä˜ñZÜóÞôìí§X€}sÞ£µá ?ùы̋ù-»Eßû·ˆŒ^Ty]¿0z‘óÁù,¿=0¡Iƒ1wª9ŸÌµÄweöR;ÿ£ÿ ©šŽ­G?¾¶´Ô´aÔ;Þ4à­ŽrÚ35ȹËïújùÝúë{Ÿ‹ f´h©úžâÿae÷"ß'Ô ¾z{‘Xq±z‘×}ÖÜ9z‘×ÏÓ¿Jë—‘!~ÞIEND®B`‚PK €Ÿô<…<¡¡<res/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.png‰PNG  IHDR$0ÓNžnpOl ÿƒSîÔPnpTc ( 8 $,0¸5'˜èIDATHÇ픽 Â0F¿ÃˆŠŠ‚†Ž230sÀ&H,30 0M$DGlE¤Hˆà(ßuþy>ßÉ–2™Læ+¬mKÜÌo2Â4ÒU]Y¡ÊHNô$–@É9%°ªWÇÛW`ÓYML±*n-q¶¸„¦Ð“²ª§l*`Ï0áZjÌð'j$ '1åø òÀ‘i=› N¢àÔ”='Š75’D_bÆà¬}ús<@ÅüCM£Z°ˆi:ýæq¶f"l3ÿÕƒ¬[Üð¨ÊR¿–L&“ùî']… EI±IEND®B`‚PK €ŸE1`"9res/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png‰PNG  IHDR00ý 1 npOl@ F¨tnpTc 08 #$>g"AIDATXÃíØQ PÏ0æ¸þLca òVà}®Fp²@Ït| ,€€m"ܤÒwΡ]iL¶9IEND®B`‚PK €Ÿ°£²ˆCC7res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC7res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC7res/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC7res/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ‡ùHMM<res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM<res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ±a?íí>res/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png‰PNG  IHDRHHÿä{ÌnpOlÿØdTnpTc (0$*<@Â8ñ;0IDAThÞíб0İ'ûï Ð¥¡&ð9`Wé[AïÚ!A‚~ õ JfÊîIEND®B`‚PK €Ÿ_]àà>res/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png‰PNG  IHDR``H‘¿³§IDATxíÏ¡ @Åàá1¸S$ìM‡} ðÔ¹kÒo‚vÄ$I’$I’$IÊ-ßl:kà—°rÔ€khøBÚbª0çBTNP‡Ö@•“ÀÏÍèòÓ@ö‡üH ¦¬yâïÉŠ1µÔãDl:vPÉøöTVДœFVКœ–VГœîPÂwðº|@ $@ $@ $@ $Ð;H H ?z’ÓÝ Z‘Ó “ÓÀ ª9ß–Ê *è°ç´}V5#–ÜñwgÁ€J7hô?h Z¿¥4IEND®B`‚PK €Ÿ%«ÆÆ5res/drawable-xxhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png‰PNG  IHDRHHÿä{ÌIDATxíÚE–SQ…ájáÐ/¯6îÁ‡€»k¤‹wp· %ƒÁÝ5úãœÅ[7^jdz«½ùâ÷ìTuö×µA-`'ƒ<$K–‡ ²ƒþÚú¸Ahò\£§ ¼§TÞ±´Ú Mü;EÖâ&„“(ZŸ"Kõœ0¨÷øwôè9!Ð ,á8 ™ÄXæq„/XàŠœ PÀò€Y;ƒXòôé9QÐN,fEe&,Ûôœ(hËñàÂG±ÜÒs¢ ‡X—žå¾€ã€²X&%#æ8 ±.('æ8OÙ¼à`y¬äø/ê#Á+ÇrGÀq@;°|aFôÂÌ&ƒe•€ã€úÉcyÀÌç!–·L”pœoûkXà G™ÏxƳ€ãd¢‹K8¨‡wüŽ»ZF1IÀq7hâ‘$g »4Þç‚£ßä÷p…<Ѽ-‹”PA}lã÷Éã1wXÅD±I‰ Š1I ÁÔ!$%c”Ð ŠÒm…ä“rœä4y©éäã§’túÇñ³ƒ$%±ä9ÍYòŠ×’‚N¢š 1IÌñIzPš8IT¦c,ðœ60¥$ç Ÿ¤ïßÎ~ݧwÜŽ±4Ç'©:F'û*½…]Ÿ£$9£“½ò€Ó1~æskc€£$9ã=¦•îyˤÊÒ;±|fšÓ1®©|Ù0ˆåÛ1V¾Žyˆe®Û1ê «ÚVzz¶ôtŒÚZXÐ1j‹sAǸU1Çé:Æ<½ÂÑRÐ1^N»‚Žñ ]ú¼üޱÈb}'P~ÇXdmõ~ö;Æ7e?:úŽ‘<—ÊzíÈ;Æ ÷¹ÅVzÿŸQÚ 6¨ ú þ¬Ê_w½IEND®B`‚PK €ŸêƱÛ\\:res/drawable-xxhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png‰PNG  IHDRHHÿä{Ì#IDATxíÚµYDaFaÜi€pw Ñ ‰ñ Öª‚ˆˆqk:À]7ÁmþuùÎD×ßçÆ“Ct“Ç4+óàÍËL’ݣ㴳Ã×¶hIhœ+~ê‚ád€8ç·N©IÆe´£H6ô…¬!NT² we}YèíXвZÝaŽø‹Í= £&ctôÔGQLãB£d½gåHOýôÕÅîQ Öð±¬Î6UEÉÞžÒM“f=d+uñs»O›¬‡Ìű_d}haœf˜¬Ï¬SôpÞl\úé(«—ÕE‘,o´ÊŒq©é¢hÞR™§-ų¬J|푆“äìp ‘Š{åé)yFž–HÉ£Ú†.šÐþS›É3Ä‘)ƒºQù¾°~¤b?•yØ<‘†Uf¸S•¢xJ0.Ýn r?Ú*R°·Žþ«Å=f‹0«[µ*÷\š®Ö`#çzÀnqðãÅ*>Tn´ LÕ£Îþz+×ÕnQM¦w•fåÞ´LT“¥½®\³kÌÕd]”ëóß±Ötöqƒ§<Ộ*Šgjç­ÜÇV‹Ðè CýW?G«âYسʵ¹Ã›ÆåSG ¶ô£Ê¼ .RPrŠá*qD¤bÉ×G‡HǾ‘g»HÉuò\>¡}”<1¡mèy.‹”ì"Ï6‘’©ôÓž^J‘–£µçHM½ŒÏÓê"=S{Á¸©åžŸõ´wΩ{nõ@!„B!„B!„B!„´`ø_@ŽQ3†â'GŽ?fqšï74Ö{-T?àwùCÀ z«!(þ‡k‚Á¯n³¢øM…Ìnã Mð^ˆßß¹Ö~ ˜ï3áKâ®}L¶1´}Á~„æÁ#­‰Fs“x­Æ4À㬠q%Ÿ3™c*GySzïÜ)~Ià&!j#<_ShЇƒjFyŸ¾ôÝûV˜ÎÆU#xéu›1*ÖÉq@aÂç]æuŸ0ˆWÄ¥¢IæŽ?Ödª@øœ^³Jõ˜•üont÷…?ŒC.ŠÖ©¸TŒ:==€FüFXb¡[…1 𨠯§~‡S4ˈÄßd‚¹RðRtÉ`Ê<¯1#Ðãˆ@>Š:±Ð—à½6aŸYUŒîY mþ—+¬‡­` Ó‡Èq ñ­ ôýîâöÁk¥Ï–*Aòù¹Qüšæ5%d›1KXL¦§ N$ò‚À!<Þÿé©t$²êsÕ&˜3¹JÊüVt¸>íßwyyùÑõõõÓÍfsùâôô5€/±‡ûðýåÍ›ooo¾¹¹ùs»ÝþÄ%“0T\i\¦'hª¹…fWWWÏÎÎÎN_œž~àS ŸìÐϾ~ùòÛ»»»¿—eñÛíö·„æbåìP±hÄ/Åå{ À\\\œóêÕ€ €Ï_HÆð€Í÷ççîäää¿ ³H.Ò’ÏÄ$ѦÐä¢Ðä†?§`}ÞÿA‹s?xày0óCHŽÀþš¬ý!ü}q–`Ý tqgYË¡’’ÀWžPü¤‚ ÀSïÖ}“œPLECüŸ²£™Z*æ}a¦çÆÒ@¨ÔŒ¡¤?}A’¹°¦÷Ãe ~ÎÁã'ü.I'»åÃ݈¿ì´ÿtQ_ï[ˆg‹š*@nö§dBz›ãÒNSIŸ]@j€¢"Ì»…чŒèl0‡ý€ƒîX2ßjÙ?ÂØCQ̉ˆ³D¢ Rl|k{€\Ì1™^€ˆŒª.ÐÖ~DOeý܉Í@{ [l‚‰ ƒ °õ’}¬A‡w/¶PmÍo)±‡qh¦È ´6¡¦(¥f~býz­ œí±Š(DȈ àmI 7;”ÄVTd:íÔ`ñIFd¥bí+@Î9ÒN0D¡ owbÐdD²‰tTƒ0¹LôQ ÍöäÎØÊÍÒ[z4™í$z!ÿKFÉöHȈd3ý' “6À€Ë¢Hß ³Bx(ÓcmÂ}9=ŠÇþh+@© H%GjRi%7É’‹;ÅÑ?e€š+/hv1‘5"tp\N«I]—v„¥œ%—ÚLQMð¢Ðž*¯m‚kKT)"r”ú²7N:;Œ¨¤·&æN¡kÎ#¤×ïîxÕ,]À&ȃˆ:iuÚ´"Î^h„ߤ_Û¹Òrm«Ð]õàk+7¢Ö4Y#iâF ¦B€ ƒ €5âµU4¿#œJÈÚÕ v ÎVÓèÎÜM-éméæ‹Õâ_+…x~¤ß9H¯Þ¤îÕäYÈàÁÕ4wp˜ŒY«ø‘Õ@sFXíÆ0‘CD ÚAW}q\ßðAš[XÒ±5Ú*½6,õl!½±gH/`+6¢öy€Œ®#´Ù\r÷^ ¯É²_h2Ò)mù‚6» PÓ`° ÇÐTéW{UßP¢h²V 1J¿s§ûw»ÄÂa¤',^ˆDC#ÖYÝYŒ†Þ³&©tW©,¥ª‚g ƒ+€t#쮸=FùÒŒ4´€'Ä“1,Á"Í•f†Äê m‚ò(gÈ¡"F‹ÐD£š«Bôæ3BZ ÐÛgŠZþüÀ7ÅbÉ¡fIEND®B`‚PK €Ÿn{!  ;res/drawable-xxhdpi-v4/abc_popup_background_mtrl_mult.9.png‰PNG  IHDRÀ`áɵbnpOlA‚Ú@ÿ†®B npLbå™ _TnpTc (0¢Bÿÿÿÿ5ë5(IDATxÚí]½ŽE®ê™;‡$@’yž‘""‹„à5x" ‰‡ÎˆqàÌ †£Û™.‚éž®ª®žé=ÏU­nwöïÎþ¾®¯ªÿªÜÜÜÜÜÜÜÜÜÜÜÜÜÜn“á¿ðÛetóp:I×·çxíwñÖûuCMçC¼÷:žMÑqÛ>5»~žõVï×Dà­i÷àTÝï€Ðû *¸±üm!€ Ðù{-hnëy =6Þ=²'PãJoÑ@[àN`•àãÚî¹à­ðjÀOÆ5í@= ’\[?nÐaʼncQ@&üúŠ5V¤hT-5üÖc+: ~.8Ôñ¨¥IP06ÈþPÝk"tDxýÅÈÒobíŸ?Æt€Òÿ›håE­”²À_ Î· ž#ûF1É´ÞSu‹êy¦Å Ðͬ¥HJ`m?ðó³ò™š†cF-31\ÀÏÏ2øËµ Î+£á(® ÌÖMÂñ|À–ž rH’C ò~p¬Em+dµÏm>$ØÃóÏï}9¾…>.ÊlzñëW÷¿„˜ˆ +5… Ž±Xu‹ ¼øúî'¸e<~ó ˆéFâ§ÎŒ’/„æ@²¼À?@€ðìÃß²»?{!!•µV Ù±,ÙK¨t(ðCøûé÷ê–]ývçÃä3D ˜W/ài*ëÒo\|†Ììå»sÛ.ÞµõŠq*ŒòSBo†€ƒÃÜ6 0¬^Œ€R­ ÃãÆègÉ~0ücK]Cêçöu.4V=ÙçeÙ 04ÒV7hÉz2 ¹Q“ì Œæh ݵþÑ è&  Ø-(Ε!– #Aºõ»õIU#E ü°zmÅ[ˆ²9=1 ÃNŽ´ŠP3ȈÒþ‹¸õHPL£A ™ `cB+ ÁèÈY°’†— .DòÎgõ}c(¢Îƒ†ô Ýö= $´8~ØŽæà±¸uÛ¶À| ¨ ,cˆ>XãÀdÈ%¨W‚†µ… d7< |4°A¹ìn{6wéJc ½1ÄÜWp ê .=¡Âó¬j<Ô%è ª)ØŒh$J:£{@‡`3økF‚ÑþA­p@Ñ%së‘ Þ@µÐg7Ô‘€÷ Üö @såTããÛÆ§æÃÖ/rcˆ&D¸Ç4E•†¹ô{TCš³¡ì@ìÝšÕºqƒ;ËË(à¶Ÿ¡‘ÿ4öMûåêKh÷ãÜš¸áVÿ· ¿Â&Á)è• |²3g9•Ãßï‚íYÍž4¹ýï  Ý*n/Û x9øg’@ç{€]|BïŽrëÞFÌ@84¨UóÀ è ‚îâaSŤþ“{@§hK‚h'øº/BÛÁ˜lÐ_ÒûÁ£ã»cQí”§íL2˜ú¯+‚ð}àn=+ d£îÂ5Ñ= Ã¢ÚSOªxÍYý€ÂgL¬ºí#ÅíkvÄȬ_:ö²4T2ÚTÅñúåöü…ÃܶŸ/H‰­JСPu ÀÈJ9–øä{‡¹m?>bâ\HwrÓZO9õÔ&U±]õñ/½ÿÁ=‡Ú²ž|úN0ÁÌ0à 1+ˆ".ì€Ud‹®Ã·Oßþëòþ—>=Ãì§?}÷ÙÃþÿ¤à·RS1ÌWB—Á0ÀEº]Â\Âezá"½?®Ÿ¯×Eet‡GÂ9Ý&˜áœ`‚+8Á\¥ÇSº-ïÏë—°½Oxy YTj?E˜a€BúÃN+¼,G«ã3…IPÊ’åJ( ü¹ÅŸÒó"01Ù™ø³SzÚ豟…„¥í0&øù?Ì À$îõ‡_z@d¢2§°{Z="®Á·î@›Z«[ÊáˆåÏáúXà_>3À˜jíV´„ÌL†æÿ‰å>‘É5ÕÍ­Eÿ1m²_6Ú/W³(_™Ç=Æ$?Kà– ³²Ž¨t¤Ê̼ŠMާõj"$cA5":šLËP&Rû§þAìŠD!Ë#IP);¶¤–³Ê†d$˜UâY—ì3 %…Š Ì w¸’¨6¦+ –DFƒ‚ì³òJuâÌiÝQˆ'"¦BÑXP·€O«òÛð/´(ˆ¬åO"l"Ëres/drawable-xxhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCCCres/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCCCres/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ‡ùHMM<res/drawable-xxhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM:res/drawable-xxhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ’IJ´  6res/drawable-xxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png‰PNG  IHDR6HdÎçnpOl!ÿí¥ÊPnpTc (08BHý›ÓKSIDATXÃí”1RÂP†ÿp`‡:% çzj ml,¬¸ =5…^¡âTtÎ0ò>  ˜B÷+R$oç{»›]É0 Ã0 Ã0þ3îû+®•Èe}9 BWîíØ‘ò^„sèNzW)P–ª¢g=áy¯çˆ¨Ò§}*D„T‡£ÊXæÖ,!UÁÅ$ê¼i.U ¼R_GCI"f $?ª`L¼Ž*‘Dƒ)°:ªZS³ÚɮŠðU˜Ñ:!«]›9þ@ïR/¡‹.’•a†a†aüI>mx ™Õ•&ÕIEND®B`‚PK €Ÿµ‚È£SS8res/drawable-xxhdpi-v4/abc_switch_track_mtrl_alpha.9.png‰PNG  IHDRG0鞯ínpOl  ±á£AÿvÞkâ\npTc (8(-0qаÍŽIDATXÃí˜ËJA†ÿê6Š £q¡à@̨Aâ%“gHð]÷â{èÈñ ƒ.\̳KGâ…,‚ÓÓ_Ó‰¦µ«§Šð,gª«>N:—_z°ÿÆŒÍbŒBI è©Þè­Æ4¤^=ú³ ®s}UY›ÚVÕKt¨aðÀÁHÓ,³ÃݶÃ2Ó׿t H#¬p @ƒˆq Œ8ùà˜F®¾wC'ùÀ%QïD\pÊ':J(%^iÝ~¯.Qhîãf‚ jy9wYL0áˆ@bŒ*P'¿Õ*ãm^!†aÊ)Zî*3ŒÉí! !]”ÀìQ¢‹0ç³ÇHÌ·yM{h¾¹o¾¨ç·vq{·–Eõ(v˜ÀbõhѶ4I¢Câ5Ë<“%ÕxÙÜ߯;±¤÷êW,—é=P¬~}HöÏŠƒ11}šNašç¡9úLÜ: ƒÔ¸)jÊΔŠiñÓú8$Ízì²f“3²á$MzÄ™Lΰxè£9dÖþsÔ>ï zôΠ=Îc8½ù²²/«Ûãœ{ÄùaóÍ#Α=N%-7´Û`&{Û Iû½³ŸÖõ¤‰-8[öEâP{2N»f§`´§CË"A`δæ g͜؉@ÒºN8îh=ýÜ”ŸMDhvõÙCƒ±av M”·u6§1<Ï9üa$6 9 C@7Ǿ ºs}É…(;ðP¨PhwJoFÐý œ */\*<÷Enº!ÆÞ1îšTùŒUjReUŠÎ¥ÊBî KlgðÎ6KÌØ ¹ùdî~õZï4ª!=ÑULüÔ¹ŽTѦ¾¨bN<ÊÜöïíQ÷0½ŸÍð„IEND®B`‚PK €Ÿ‡ùHMM9res/drawable-xxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿt0h¤¤@res/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl_dark.png‰PNG  IHDR„B¡+Ž<3PLTE°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾ÅG9ÍtRNS P€¿ÿ0Ïpßï`¯@Ÿ—\7XIDATxíÙÅÅ0CQ2ýþ«Ý0ž¹œ  ÿÍù#æ´í_²@œW"iŠ8C&%“ÆIk„Ï4GÒ±Óh(´Gl´GœIQih@$D¡" Qá(€¸QADS@DU@DÙ¸7âFÜÌÊÎ…Q4*Ì'ú;Ù™W˜c:Ùv‚ÀºcÇöäå ÛÁ~÷ùØ6Û1¬Ò}#,Xæ²ÙÚû@²ÃØvþ½‚Ñ=:~vŠ`®x`N»ÁûÐq ™úë<“¬'¦V*yÌî ß3RÁ’ÊÁ¯ŠËrWüLp9¬íl¡¾Hb ÿí ] K¤Å#R®IEND®B`‚PK €ŸS*«¤¤Ares/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl_light.png‰PNG  IHDR„B¡+Ž<3PLTE`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹«®Ï«tRNS P€¿ÿ0Ïpßï`¯@Ÿ—\7XIDATxíÙÅÅ0CQ2ýþ«Ý0ž¹œ  ÿÍù#æ´í_²@œW"iŠ8C&%“ÆIk„Ï4GÒ±Óh(´Gl´GœIQih@$D¡" Qá(€¸QADS@DU@DÙ¸7âFÜÌÊÎ…Q4*Ì'ú;Ù™W˜c:Ùv‚ÀºcÇöäå ÛÁ~÷ùØ6Û1¬Ò}#,Xæ²ÙÚû@²ÃØvþ½‚Ñ=:~vŠ`®x`N»ÁûÐq ™úë<“¬'¦V*yÌî ß3RÁ’ÊÁ¯ŠËrWüLp9¬íl¡¾Hb ÿí ] K¤Å#R®IEND®B`‚PK €Ÿ´Á2ððBres/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl_dark.png‰PNG  IHDR<HªO–¥·IDATxåÛ3¸\M€ñk··þ5±mÛ¶m;écÛI›2n‚.¶mãzïNÞ §Xïž=çÌœçùõû®ÏÌ츟:; L¸ !aŽî±Ó T˜¡kìx!|˜ª[ì_± /&ë;:H¬=Îí±#BŒU£G¹5vJ!ÂäÅp·Å‚"B¥ê–Ø~Jl4<äôØÞjlŒ¢û:5¶'J b̃^N‹í†"‹” ‡Sb;Y«(B7»cÛ«±qŠîdWl[BÄYÚÇ;¶ò!lRˆ6ñŠmŽ<›å£•Õ±Mœ«ÈCs«bá„Ãä¡I¬cëã „C}C£XÅÖÁ'‡û‚:ÑÆ–Å—xƒ²‘Ææâ.„ËÜEn¸±É8áR'Nðr—[jlCx4ö n°Ø\ÐÄE$ ž¡™ÉþbsðNÃà×È ¶É¥›©¾>»/4~&Õàöšë¬2 ø úvþb@ðG$Ëຆ¨!ƒg<]ï5(x— >gPðüÜ à'2ø³AÁŸd°0ˆW\(ƒßüFß7(øž >jPðq¼Ê à52x„AÁ£dpYƒ‚+ü¾E|`@ìcu`½Á›Õà×Wƒq]ãØ¾–iÇi<ÁWp¦¦KµÏ‘)My•'Û¾ Qìu¤ÛA¬R b½A]”è•o g ÝåoíëÈ wÎã_¼qaì'”fF+ÏE±yhí¬VG—¬{yÔÂXD88¶@ÆZ1\úÞ¡ŸÙ&VMÔ–qØ”Ïe”³zf:áµ9v²ây  îØúíí:葆Éx§IÙYÈtÂÙ¥LLÃ-+Ï19N<Ž—ˆÆØ§QD¾ÄN´D’›ŽÕVÂ$ìÄÜÇ{”Àƒ¸³Ø‰©¨†D«Ów=ûâ¡Î‘WžIEND®B`‚PK €ŸÂå“ññCres/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl_light.png‰PNG  IHDR<HªO–¥¸IDATxåÛ3¸\M€ñk··þü¥‰mÛ¶mÛIÛfßÅMÐŶm\ïÝÉ;áëݳ眙ó<¿~ßõ™ùO‚×ÀyKgaN‚ ¡S! ÍÐ=vTSt/„u‹£ÄúâÅx]b‡«±A¢G¹=vH°XÑÃÜ;¥aòb°ÛbûÁ¡R tKl/%6ôszlw56FÑ=Û%1æA7§ÅvB„EJÐÅ)±í”X+¡“ݱ­ÕØ8E·³+¶% !⬭ãÛ ù6)D‹xÅ6F„ÍòÑÌêØJ¬䡱U±õðÂaòÐ Ö±µñ ¡¾ ^¬bkà„Ã}BhcÿÅ+—x…#ÍÅm—¹Üpc“qÂ¥Ž!9œàÅ.· ÔØºðhìAÍ`±)¸¡‰óH<B3ãýÅæà†Á/‘d“K;}}vŸiüD6ªÁ­!4×^ >h@ðõíüÉ€à÷H–Á5! QEO7(x² ÞcPðN|Æ àS2ø©AÁdðGƒ‚?È`a¯ .2(¸P¿6(ø• ¾kPð|Ø à£2x¥AÁ«eðƒ‚‡Éà .óóñž±Õ€uoRƒë\[ NÄUc¯ùZ¦¥qð_Á™š.Õ>E¦l4åUl_øœF±W‘l±:J5ˆõªƒ.Á¢Wh¼1œ €t—¿µ¯"+Ü9?ñÊ…±ð43Zy.ŠÍCýhgµÚºdÝË£îÆ"ºÀÁ±2ÖŠáÒ·ýÌ6°j¢ö‡Mù\ÄVÏLg`¼6ÇnGV<4Á-B]=Ò0Ïã4); ™N8»”‰I¸aÅâ9¦#ljÇñQÛñ8ŠÈçØ¦HrÓ±Úr‡8…»x‹xðwq;0•hÕcú |ÅaF!‚µKIEND®B`‚PK €ŸáS>Ö¦¦Ares/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl_dark.png‰PNG  IHDR„B¡+Ž<3PLTE°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾ÅG9ÍtRNSÿ¿€P Ï0ßpï`¯@Ÿb®åÍIDATxíÙÕaÅ0DÑ1­õú¯6aMàVpÌÖJ> ŸÊë¼, Ÿ/Ät —z4[Ï#€¦Àxš#@Ê€@d@À2   $D®\ tDf@@™e@<¢0 ˆÎ€° ˆ‹aøGü#þÿˆ9þ7f`øv†¯¨eøŸp¬ÊxžâŸ?ümK$Xw ÞAæ” –åb R我`t&µ`¸\Æ_TÇ>¥ÍËÌ|¿ãéØœÿØËâ&ó» N)Æ ã÷E”Uõ6¾)9^½v$çå2>*«,Oßgd[eGjðVAe[¾¼æ0ÅËæº½$æ²½Êw»ÞâtýèIEND®B`‚PK €Ÿ<ùN9¦¦Bres/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl_light.png‰PNG  IHDR„B¡+Ž<3PLTE`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹`}‹«®Ï«tRNSÿ¿€P Ï0ßpï`¯@Ÿb®åÍIDATxíÙÕaÅ0DÑ1­õú¯6aMàVpÌÖJ> ŸÊë¼, Ÿ/Ät —z4[Ï#€¦Àxš#@Ê€@d@À2   $D®\ tDf@@™e@<¢0 ˆÎ€° ˆ‹aøGü#þÿˆ9þ7f`øv†¯¨eøŸp¬ÊxžâŸ?ümK$Xw ÞAæ” –åb R我`t&µ`¸\Æ_TÇ>¥ÍËÌ|¿ãéØœÿØËâ&ó» N)Æ ã÷E”Uõ6¾)9^½v$çå2>*«,Oßgd[eGjðVAe[¾¼æ0ÅËæº½$æ²½Êw»ÞâtýèIEND®B`‚PK €Ÿ¡÷0ÇÇ?res/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png‰PNG  IHDR&!1npOlÿØd8npTc ( 0&ÚQ´&IDATHÇc`£`Œ‚Q0 FÁ(@Œ ÿ©g5]6jéß {µÓ¼IEND®B`‚PK €ŸÚã#0ÈÈ=res/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.png‰PNG  IHDR&!1npOlÿ¯ƒÊ”8npTc ( 0&ÚQ´'IDATHÇc`£`Œ‚Q0 FÁ(@Œ ÿ©g5]Æ49$Ûh,è8IEND®B`‚PK €ŸÓ¶dA»»Fres/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png‰PNG  IHDR$ v¯4UnpOlÿØd8npTc (0$ÿÿÿÿywîIDAT(Ïc`#0þÿOƒ˜¨å"ª¶Çs ÂIEND®B`‚PK €Ÿž.õººDres/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png‰PNG  IHDR$ v¯4UnpOlÿ4&†û8npTc (0$оg›IDAT(Ïc`#0þÿOƒX™×ÿé…Ÿ&ʪIEND®B`‚PK €ŸŠŸ¿Ì@res/drawable-ldrtl-xxhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png‰PNG  IHDRHHÿä{ÌËIDATxÚíÚ;ƒ0EÑT†5e‰ˆ]òSb'Hˆî¦¥Æ’ïÎNá©vP`Æ¿•Ò ªISk ¤i²‚vÒtXA§|×[ H H H è9 ó$@ $(ýׂÔ“¦Ñ Ф©±‚_ü[(ì÷CowÒLuí )é]ž÷Î@M¡´Û‚þn- ZfÈ`IEND®B`‚PK €ŸдzÁÁ<res/drawable-ldrtl-xxhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png‰PNG  IHDRHHÿä{̈IDATxíØEbpÅaV8ìë]ã~ü¸»F¶øw»ÎapŠ;D8Sù'Cxƒçͦޯ’væ â›&ˆ&¨ñi‚ºXÏîP¤È®°îßjç,eú§Ây:h/¨•—̯ÊNFà,£Jý¬¬ Š'Í¡ŠŸùiP<©ø—t¦@ñ¤ÓXà»™ÊF2ƒ}°Àù(œÔIËmÆ÷yíDnc©Ð“Öb)0aÀë'RÀ²! &]IJ'ùû°\ñ@:é–iÉ·˜åŽÒI,Ã’o1KÑ餒 âƒ"I÷°LO¾ÅTÿGIºŒe_ò-vû¿Ô‘¤…X Lðúñ¼Ã²Þé¤<Çr§i·±”éò@:)CߨÇt†1Œiìá8ëíC:)Ã÷çí B’8Uæ&Ö•$p–k+lÆ5öÚ£ïÔ™â<§Êœ¦=fÉÏ4ÌÉ0‚…\æ% Üâ"kéŒ<ƒ2 r~Á¡˜ æ ÄpâÅøó)†Sæ(E˜8ôé¹÷nŽ|zþP(Hà@™#¢Œ%+ƒŽϱätΑI2ÇI^ œ Ûk’F³œë<¤Þ1:•·‘ÎK¡c8uH tŒá+ìVüø£ÎI“ÔŽQãØlÁ"tŒÇ!YÇ8„)ìä­×1Æï;#y^§cËM§c _¿;ãXÞbÙðóë˜+nǸӯcB +·cœ‚åÎ_Yéé¥g(H¯…õŽ1¶8×:Æø;kÖ1ÆŸ}”µŽ1þ =©uŒñGq+ϤŽ1þFgU¡c äØ,¡ß1j3‹gñ£6­œ¤ß1jÓÁ.r‹B|Ç?MPôïƒÞÕÊ_ïÆûðIEND®B`‚PK €Ÿa"àÈ  =res/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png‰PNG  IHDR6HdÎçnpOl ÿÿ9VPnpTc (0806BHeÏ^HTIDATXÃí”=nÂ@F¿5Ž@"¢vIÇÒs‰äô‘’"]”Ž+ÐÐSPS$W@TÜ€Š. ¶÷¥0"ðcƒC‘Ì+\Ø;z;3ž‘ Ã0 Ã0 ã?ãæZ±Ü±S?Ä®Üûöëð@„sè^OúP¥ ,UU/zÆ9ò^ÏP¥Ï)ô©P¤"85†À2·f ©á(\ü@¢ÁæR¥À+,²0T$"Æ@|Tc¢,ê$$šLä *¦4OÌj#»f€ß«òÀŒ›3²Úе™ã÷ô.Å3§]‚j­»cߑdzà¶$•$JtHI·tž”„Nv¢4$WEû®‚‡3‹CJtx¥óÄ@W",<ÄyV˜Do= Г ®¦‚+lÄÄÀà¤ÕT¨suFŒ¨—Þ­ºˆ ¢_V­u-ZPe½ûz^B\$+Ã0 Ã0 Ãø3|âà ™Øo&IEND®B`‚PK €Ÿ°£²ˆCC8res/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC8res/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC8res/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC8res/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ‡ùHMM=res/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €Ÿ‡ùHMM=res/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €ŸE°<ÚGG:res/drawable-xxxhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png‰PNG  IHDR``H‘¿³IDATxíܱÂ@FaGàb÷ ˵œÐur'vÀ¾Ë/ Ïj¥÷þ¬/²&ÙŽÆ'`· ˜XØØ¹}=3…ø’=¿ífh0PÚLÐ6`i°5ø@Â$O€òï……—X@þ½P9FòïxÒÇf²#…ì ç8ÀDîq€…½ã5ZÉ?ºÿÅ @€ @€ @€ @À·  @€ @ÀFÖ8ÀB^q€5ºÅ.²ûpŠtŒdw¥‹y’Ù‡X@GÏH!£Wû¼+qæÎ›•½ZyqãäË|ßNïó‘6‡IEND®B`‚PK €ŸÛDbVŽŽ6res/drawable-xxxhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png‰PNG  IHDR``H‘¿³UIDATxí›Eva…㸻»ÃÐ1nˆ'+À gŒ»ûÈ w_ÚdOËáCfJ=Hõm9§¾AÿýÚû½Û%ù%ˆbX@‰ÆvÎñ„VR¤hå gÙÆÐâ˜Ë9º¢“3Ì.l!EI1 Pfó xÁÌBXÆ7þ•¯,Ír0p-å .§õñ-'¸Ô…܈ËC}|K —ù¡G/Ä%¡o ¤p© =|.I}|­@Z_pZ„KB¿âúÐÿ  —úø–ÀY\^‡<–ñ—cúø–À6ü4ôùÏ›ñ³NßJ'.½¬ üÇkHâÒÉ`}|ûÍÜüôÐ@©ïÎÓL?-èãÛ̈ohd!À"šxk.o 9Dÿñôñm¼ˆ¢ oO%fò5Š‚>¾=VYMAßlÍäyö O3ZÀ’è<åpw§é ˆNZ²¢àéÇëCØÂi’ Iš8Æ:S‚YÁËë‚#²‚§ß(<ý‚C©àéJO¿àÐ*è74Å¡ Ý«\f£¹¦T(A©0êïß‚V`ôß¿ :e|¸ÆÆr ½Xôñ }ØHôñÅ ÒøÀ~™‚ /ô“v>r—F&aÇ߃§UˆÒÊðÀŒ/©/d°[ò6Oвâ "ô… vå{°5›ïÑã }!|±B„¾ÁNý§6U_ȯWô…îé?;kûB] Ñ+hûBëõ m_è¸~£ï é„}¡úQXñ×mŠ¿ð¤ï éd}!}éOÜ:¥ŸlkûB›õÃye_¨ƒÁúý‚²/tR¿"Qö…z™¡ßò(ûBûr¸¨ô…žP•³]› /ô™éyXf­/ô™ÅyÿV„¾Ð“¬]ûyè õ²*}LM_¨ƒ“Ìô…’$xÈ)638þBt, äû ıÀ/NñÚq™Úœ/IEND®B`‚PK €ŸeîD­ÍÍ;res/drawable-xxxhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png‰PNG  IHDR``H‘¿³”IDATxÚíÛMJBQ‡ñF*jd"¢ø±ˆ&hº€F­!ÚB³ÀOE˨vá×<¡AÑ@Qï“£H¡òœÓížàÿ¼Ã ïå—;{7g¸àŽÓÅvm3Ä­ž9`΄2éÅTâÚØ°ÚêsÇL÷ € €D w@@@@@@@@@ 2ÀŸÛœ øT×Ðħjæ€<¾4'ks×À—ªv—|q:øÐ=1ûcÐQ6§JÌí7Gã~œ]jd Îqý@BwÏM']›IEND®B`‚PK €Ÿyk§¼11<res/drawable-xxxhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png‰PNG  IHDR``H‘¿³øIDATx^íÚQŠÂ0@Ñ|i3:{U«¸–AfJwÒ~˜;ÿ ¼Dô ÜûJs ôAIù=3333ã“Kyˆ‡ž¾¾0qd[zbàLíØ`ÿzedݾýo€·. m€3¤ÀØvök@eœ qÀ” p‹–T€¹233 šþ‚ï @€€ç& ø‚ç @@žï|? Û$ @€NbàŸ9`fföÿ/¾2¥\ã€c*À>ØRÓî|”xŒi»Òk.)_¬J[ ŒÔ·îìX•žØpàÆürÀÌ•ý_gßÌÌÌÌ~™º?ÝÛjIEND®B`‚PK €ŸaÈèSƒƒ8res/drawable-xxxhdpi-v4/abc_ic_menu_share_mtrl_alpha.png‰PNG  IHDR``H‘¿³JIDATxíØ¬lWÐ]Û¶mÛ¶mµmÛ¶mÛn£òÛ¶ÿÓ]µ^î¼?'š3ɬ؇[Q{ u¦·õÓ¬Y?o;Ã"Q/,ì mÚkõ˜#ö5F%£íys’ŽŽÏûô'­°W¾oŒjŒÎô/xBµÉ3p¶©V«…#7Δâ´È·¥x#r£Ÿ}"7š¥hŠÜh©÷ t«÷'ôzb‹{QšS#ft¹‰Ò´Z(r`2é'ÝC‘kùéFš?jÍ<îW ]a¨-S;Í(åFêXáØ¨-;è¬\³kÍì0ãT2²Æ§o¯«ä5KÿTŸQh¯ÕC5}ûfvfå:Ù>þÇÎöŽþZ4éã §Ö4pšÜ)7Ê©¦ŠœYß·Êî3OäÌSÉçÖŒœ™Ö9Æ*×Ï&‹Ú±3þš]¶è}çY2þÇîº+7ÑefˆÚ1Ÿ‡µj¯ð¼¿6aEï©ä‹G-ÙÁp•Œw„ÙݪU¹lµå­:6F¹áŽ3eÔ–M´ ]«;Ì™CëÑé>´JäÀÅÒõ²WäÁ4†I3Þù¦‹\ØIš'-9q/Fn¼!E§È¯k<úklà5)~‰Ü¸JŠ—"7¶–æ9‹FNL©¿4\j†È‡S¥ëë€È…©ýŒtŸY#ò`c‘®p¿y"¶2NÇFf>ÿ±–ž*is™iœTqìµgFW•>¥­0·ûʽn™¨=³9Ú³º¯ÍŸ¹²ýÊš>W®Ùuf‰ü™ÌAú+7È‘&ü™Ñ•š”ûΆQ,é•7[äÍ´nS(Óæ&ÓD=°ºg4µ œOY5ê‰Yíì7¹ÉÙvª.î744444ü æElM6ÇãIEND®B`‚PK €Ÿ°£²ˆCC2res/drawable-xxxhdpi-v4/abc_ic_star_black_16dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC2res/drawable-xxxhdpi-v4/abc_ic_star_black_36dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC2res/drawable-xxxhdpi-v4/abc_ic_star_black_48dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC7res/drawable-xxxhdpi-v4/abc_ic_star_half_black_16dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC7res/drawable-xxxhdpi-v4/abc_ic_star_half_black_36dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCC7res/drawable-xxxhdpi-v4/abc_ic_star_half_black_48dp.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCCDres/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ°£²ˆCCDres/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png‰PNG  IHDR:~›U IDATxÚc`å'ÞüIEND®B`‚PK €Ÿ–SÆÇ®®7res/drawable-xxxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png‰PNG  IHDRH`ü—npOl$ ,ÿ+n ±PnpTc (@8X`Äeš{õIDAThÞí×½ ‚P…aHŒ=Ž@Í.À"Ž {àêÔêtbk¡&kc¸Üï#š¼OOrÂÏ}C’€­di?(Um6§Vjq¦Ú™ÌÙkjõØ25Ñse–oR®cÔœ“rë—{¦vðœV3ï­P7hÎE…×Pê<çªÒóTZè4ç¡…÷AYéÙ{ÎSÕg÷²÷ åoåd=^ßúäÄ&9Ù~³3Ë„INl3“ÃÇ9GóLDåÄ'99¿ÍéÜ21('¾™ÈÉM’twÏDPNŒ31‰¹8Ýhž$é†_"ø/6†”*ÛIß½IEND®B`‚PK €Ÿ! ß--9res/drawable-xxxhdpi-v4/abc_switch_track_mtrl_alpha.9.png‰PNG  IHDR^@9npOl‰ÒõAÿò6m¾\npTc (8)5<@Õ‘5¡hIDAThÞíš;OTAÇÿ# KÖ» x4Yy4X¨ÑÆ@±Ù’ŠO ÑR[|…hEC½€šFX K4%Ys7°ŒùSà#’FæÌœ½aÿí½¹÷7'gfΠ誫‹%#õ!öàcwá*úOÑ#¡Mzúæü]FeúVÙÓåņЂô"C©(˜ñ * tïbÌ4m^¼dùÁ—ÁÐA¼´<³ØB&àÞÆ-S—²üó è@Ï„,Ï^|C.pÜã¦9”°üDpt ‡ ·™RI¦܆)Ä=þ÷¦Í™WË?PA2¸ïî6ÕòÌGîð#jð#îð£jð£îðCjðCîð×Ô௻•T¬E™¨RCáAK ¾í¿§ßr‡¯ªÁo»ÃWÔà+îðjðîðïÕàß]ìØ`YÅîËg¡Û]RK*ðµKÀwº{$•€›C¼ n÷·g£wnÑ鶉eª0u¼ j÷ytûBk?>%¶ÐjšxÌîOíÐÿK\ R_ôb¦ùÁ;úGoqFÜöŠ¾ã­¡xne~÷Úʼ6‘CTˆܾ=8ñkV9²òçèœsšãeµLYΰ~.ð:gÇ´þÆû,²Ä†5vƒ%Ù+P[Âñhâ]äáþu†hc5|Á:V°ÚA£‰]u•(6‘Ôê–¢6IEND®B`‚PK €Ÿ‡ùHMM:res/drawable-xxxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png‰PNG  IHDRV(µ¿IDATxÚc`€€ÿ 0 €•‘ùÀ®IEND®B`‚PK €ŸÓl†PAres/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl_dark.png‰PNG  IHDR°Xb~ƒ3PLTE°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾Å°¾ÅG9ÍtRNS@`€¿ÿPŸïß0Ï p¯Ò'õÃlIDATxíÚ²¨0DÑŽ4É$Øþ7û]ž ÐUÜœv-Ä”3?N) ¨àR¤ ¸¥ÎMÍ5nìx®8tRÜR >.«¤u§E§-ñ÷¨ÑŒ*†ÔÇ]çžñÍý “l°O…k\*P`šÎ‡9¯;aã[Œø:í¨ãëÏëŽ8¾@À¯ /ÐôѼiÐÆß¥—¾(ßõ(ãCßÍ'=ÊWUÊøÐóY¯R@¾ÒO» SÄ·à£F@_  ŠoÁŠ@@_  /VÆ·àShùCà …ç,òüá_ˆ¾ê™çV…}þ†ë éÙÞc°/"~x˾þù„ë )ãûPô…dñý ª¾ú×Ö[ }!U|CAÛRÿÖý®ï )ãwr©ì é/ o´}!ý¡ä³¾/$Œ¯ï éÏT¿õ}¡§_·yú…']|}_H_úÓö…ôæ-m_H ŸÒö…ô÷ý Um_HÿzbSÛÒ¿]¤®ë Éâ³¢ê ã“¢¤è ‰ã3ÀY»ûBúøæ¼àLÛÒÏ%m_H?)V¨kûBúd“ª¶/¤Ÿ Slq@W׊`bùı@, üE=›†ž+äPIEND®B`‚PK €ŸðÅp;µµ>res/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png‰PNG  IHDRH`ü—npOl $+ÿŽMƒkXnpTc (@8@HX_؉ôIDAThÞí×± ‚@†á#1ôv85[¸‹8‚îˆKP«Щ-…šøY›ÃqÿŠ÷™à ÷ç`ÚÉÒ6|P¢ÚlN­Äâ¥:šÌi”Z½¶LmðœV™åIZê4笥õáÎÕžÓ)ñ½ºšsSë (Õ{ÏéUƼ•ÖzyÍyjû¢¬ô<ç­jŠ»{3xÐf^9ÙN×·!9±É„GNš¿sf™0ɉm&“EÊßòÖþì%ü¹ÚŸY¨3–8;¥­|Û¯5þk‹~Í…;ŸÝ-ûå_øPK®gUhPK€Ÿ*res/layout/abc_action_bar_up_container.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ*res/layout/abc_action_menu_item_layout.xmlu‘»NÃ0†ORJzIo¨ÌH É‚b+HHH°BlÈ$¦‰hâ(qZº/ÀÎÂÌÈÀ»å9`þ´.A¨œè“¿œÇvJD"–ÈÓˆ¤ù åÑË`l€pÎ@ ®À-¸`æÑ£^—üRv¢ˆ³˜…§r9Û¢'b2ŒnÌú¾¢¬Ç†"•§SQ­FÌuý°»ÇÏ%U*jv$"2M59𻞤ZMM·„”"ÀçÂIvÖã(Um¾+=”ª©ÇÇŸ ÝXø.ٶʬ$"K«¿nõ}>°¦VÇ‘¾÷‘îJÃÓêª'e´iÛ‰ãñ€%Ö´#›EvÌ“iS*9ÄÿÝh%ZøFšvÁx/àŒÀx€´&-ª;øBT1Ö€ßÖrŸ…‰¼Çßš9®#õ7­×I¿®M®÷Ç5”Ós×j©5 3Ü\îŠØÎØ»¹‰›ŸQg̨+ån!3WÎ]óS¹Ê—Eý×>ªØGáÏYMÏDûç ¿PKŸˆŠPK€Ÿ%res/layout/abc_action_menu_layout.xml…AKÃ@…ß&Ö¶Ò–<(ôÞZ09x<)xU”¸BÊ`fâ÷0"&v¶nÀÀ¼n% =¹óëÓÙ¾3©JcƒˆÑ 3¢yÊ ñ)f° 6À8] À¸7àÜ`Ò£F#æž'ÃÞ¡8WT«Gî åg}ØíK÷b7›}>Œª{)=å“mgK_Èž¯¨ÓÉÖOz2<ÊD7 •ÕžHÝDÆJF!Ц‰»1ׇí¼'N¤¸¤J…‡^áB¦Éã˜ÖÖ|¥âÇI]_<Ýζ·Ý(px|á$"ÝâÑúúÿ™N^ܲR5Ä{èŠUi=x ÆÁx¯à ¼ƒÔ`잌±-#· >aux{2‡ïz¾©û }\ÒµÕ/â«ëááog³Ó{UTZ¢ÊÈžŽ6×,\q’gZG{­™¿h3…ÖúÈ4«¤åy³å3ZÓ3*¥»˜TéwT Íè :ž+imhæäoeô†ýÑË/PKç·ÖÀ€ìPK€Ÿ6res/layout-v17/abc_action_mode_close_item_material.xml…’ÏJÃ@Ægc[ÛÚX<…ŠæâÉ« *ž¼êš¬ÍÒæÉñ¤à;ø>€A<ùâɃwÁЃõK›(-Nøe'ßîÎÌÎF§2méDŒæé‚MQjð(7Lƒ°ÖÀ8 \‚+p nÀ=xo`±4M:T­†Üq¤ßÞ'Š*•“ÀîÅü¸+àÛ]iwú~­ÖågAOžJG¹T¯§Ÿ®mWQ³™~{˾$ K‹X˜ù+3êÀ€ø!ñ70ÁZøÚ¹““JE½ècß}ýî½wïîR¤*}6ˆ]¥·Œè"©†¾Gi«KàØ·À}ð8 /Ákð¼ÀGððוÊ0´§\Ω^!w}iK.|*¸)°‡ûÃ]w_R­¦FD@¦©ùГÔh¨a_H)ưòˆ?ã£Ø³iŽì¹˜È§3îH¶jè¹É\ÓÜç£ÑcîÎÊôólñ¹\îOàӇϽA(–ÈÛöP ÉÍMÕ³¢I{°¦7-DºÒZÌìÛánâ’:m« ö{àÒÖ–'e°ÓíFÏÛ‘¥­bܵƒƒnèF]Ï0"9¹¨á«&uOŒƒOà ø ¾ïàø~ƒçŒ±€X3Ù»6øƒvï(@•ÑãÖ@¿ƒŸ<;õ½ŠSq*‡±VMµfü޵µŒv¢´ZªµuŒvªîRá0ÎãÚF&u•GU¿–z«y­Jc™˜Ú®˜j3Z)«•š±Â®¼Âî,k× ¡ÝȬÁTk(%Y––jy;÷rŠÿ|ÝvP·¢Ú×|L½¯Û½ùϾÒR.j_+™¸Œ–Öohmm…VO5TîèžÎ/Ÿ‡®Uï?jµqŽZÝÎÔª·¢VRýŸ5—ËçÈåN&—|L­çïA1wõ=e§Üë¿PK‡m646ÔPK€Ÿ7res/layout-v17/abc_alert_dialog_button_bar_material.xml¥”¿oÓ@ÇßÅq~:$ ‘€C[)‘º¥RT‰¥¢Fdb79Õ±-û’(,-baæOà@B ,lLL ŠÄŸkákûN6N*õ¤OÎ÷½w÷Þ½w*D%"F×è#êløv(m5p\à6¸ž „à%x Þ€÷à#ø ¾Êý.P.sÊÅœêu/à¶+LÁ=— nAòMËâîp×ÞT«ÉÑ#Ï'Ç|8ÔhÈaßÂÃvÊCþŒ;ÑΆá˜so"žÎ¸%F°•ѯ5Œ}î8¹=ó½@¤Ó³dºÙLÆ;<°ql¥R/.¼ì /Y‹“˜®x{mM~uÉíÙÞêÂ÷ÐÝdeß vãM©ÓQ¶Ò`Ï76­¯„ð·z½p0²ÇfØUVoÜ3ýƒ^`‡=åO×C1wl:bÚFzßcŸÀð |Çàø ~ßà9cìx§1F¬×´ þ 5åwú«Œµ ÝéQ!ñÛÉyÜ vƒÊ‡‘VIµVÔGZ5£H­–jmåãbª¶©pÅq m5GKÆQ•÷²-{¹nåÔXƧ²ÓRMgF¢³Z1Ñô%v¥%vg=«‘Ñ4™_þfæ\ y®byq!¿W±*ïóäŸù\n!—š¬uÞ§ªõFF_ù§Ö´ˬu9ã—ÑBNt¥U—hõTC6î©øòq¨\mþG®VÏ‘«;™\m.É•ÿ}gåÊ9b¹›‰%ïSéù·¡åÞ´z»ì”·þPK²!ì}FPK€Ÿ7res/layout-v22/abc_alert_dialog_button_bar_material.xml¥”?oÓ@Æß‹ãüuHš M¥u (BBHEtDÆv“SÛ²/‰ÂÒ"ff&¾â# ±f‚"Á _ÖÂcç,[N*õ¢_ì{îõ½Ï½ç³B%º^ bt™fŒè<Ɇ{’VÀ°n‚`˜ ¯Àð|ŸÁ ü¿À*ælƒ]P,ö}}ÌÅ”ªU×ç–#tÁ]‡r9nBòtÓäNÛÚT©ÈÞ×#M“Ǽ?T«ÉnÏÂ"vÌþœÛáÌšfëSw$žM¸)ˆ•Ý=«i{ܶŸrkâ¹¾H†'óáz}Þ¿Ï}ˈ¼5á»¶ýÐ1¹¡ רPèØAâh,œ‹ÓÓw±’õuy× F^˜¦3¾Ñ¾%:ó'{º¿å¡V+Ž•;žnXÔn„ð¶ºÝÀXC=èÄQ†;ìêÞ~×·‚nœOU1µ-¢CV¢{¨ù{bì˜/à+8ßÀwðü/c/Á…±Ÿyƈ5¢ýn‚¿hpÿ@úÛ”¶:î[ø—ÿQœ/áMºJŃP+%Z#¼†Z9¥K­’hÍ8®–h+мo%ZîåBoGÐÖRÞV¤·²|Wå5žë‘ÔXÊG§$šÊ´¹–Okù¹¦.‰+,‰;íúµ”¦Èš \¯¥ÖuN®+9Ï/ÔüžÊæ<>!g¶–[¨¥"÷?›3ôòZ~b½)½¨‘Zð²/÷¿˜ÊËh¡&j¬•—hÕDC5ïÆþ²>âZmþG­ÖÎP«[©Zm.©•ßÊÓz¹x/·S^²9c={6”Ì9Ï3;áüÿPK- ó)f0PK€Ÿ(res/layout/abc_alert_dialog_material.xmlµUÏkA~“d³I¶­i?Оm5)XPêEEÄE«)bë¡n³c2t³v'm#B‹x¼zôà_ ‚go¼)(¢ààU¯ê›ÍL2lSšHø˜ÝoÞ¼÷Í›73IÈÀë,qÈ'ƒlà!t[q1("Î"® î (¢‰xŒx†xx‰x‹xø€ø†H£ÏÄ5Äââ)Â4«½Æx FF\»å7ù²",Ëõ¸Í™ïA"ÁÈåVìÊj5𛞃ã Ûq˜W£÷9 É¿[¬Zãh¹ÆB¶Â\áix¸â²Æ‚?ß¶@[j9¼†Ãò·F£¹Ùly—Ûß–u)°ët.2À‰sÌ£v 3™ºÁo3º©TÔ™¦í9R''åW1l6~À‹k3EŒW¥¼x†œ:åJà»n4mjj›ñie|Þ¥¿Èlׯʰ…‚²–&å†]¡±Æyc¶T +5Z·Ã¢²ªøõ’ÝX-4,)y¦É¼ŠÛt(¤ÓíÕƒa„¼åâ†n‘ œÁ={„¼A¼C|D|F|A|E|Gü@üDüBœ#„ÉG54†øƒ-}‘@þ‰Æ‹6À€dTcYkb,0z ¶Ús»\žH»d—#7ÁÜ\V³}AÖ­â~c/tˆuÑt:ˆÿ æ?Ùͤ\W|žðDZ×ø!é/%=ÆõN  WpV—3Èt;æsäŽi1÷ɘé([í˜DËåtKRGªË%n@"âLMGBÎÝE¯»*Oqm*O?ºKžîJ}™.7ýiéìõ=äJZÌa3)÷z§úê׿XÓŒæÿ.kz ×ôù%ÇÁèÔa<¦ª‰YéÔ„Ð’Þ¦ÅÂY‚3´ý_‘ûŸîÁõ“Ñi1>ÕÑצòwa€üµö(ñ˜Š×Šâãu«ò}u€38ßc=‹ÿñ Ƶ)>~W©}(p‡Üƒ;LœÍÅ1“;Ä<1@LµÖ¸Å—{ä@èYîñ.èwE¿g@?2Úû÷ŸŒ½—ê]$;¼£PKð÷í$° PK€Ÿ.res/layout/abc_alert_dialog_title_material.xml•”?oÓ@Æß³ëÄI\H“𯉠Q‰d,bbÈ‚”‰F,Á59œŽmÙ×TA‚æ#00!fV$–Έ :ð1``;çÆrƒ€‹~:ßs¯ß÷¹ó]L²é¹EÄè"½gDgH7<‡´l8 ®€k`ôÀxp^€—à5x>€àHç<z Rž'ÃX>T.»ŸJ5£Z-ˆ¤ðW2ðÉ0äRÈG#é»}ñHQµªGƒ $Çу;Ò'sSË]é%™Çã³`O=Ø—#5¦õu=‹4¶ÑÐã \é/˜f á,rO f¡@Êé=Ñ—¾ÀÄí wÅ])ö‘>‘xÔO³`ÜEì¶Ûú©ï…a©Ît»®Pžä^à¤òµZYœžÜ ùPÐÖÖX©ðf·ÇbÂãN5 &]>îF"îfµ,+V3äš3›na{ßcoÁ!ø>ƒ/à|ßÀwð\`Œ]÷±:Çû ð ­Ž¾ è*§'í4ž[ø­‘‘ž‹4NÏÛDu¦5s©±9•ÍÎÅ%}¢UrÚOôIÍCh›+jÚiÖE~¶|o£Ió>h…gÚÇÚR3vÉH5+×&+ÕJ+âþu ¯ô]ÉÖpJ¯¡”:?é­„Ý.ä·ØåE\e…VÍköB«åòe5œœ·¤ž©¿uÑ[æùzNß8öl¤»ÑÔÿù|ÅulþÇ·N´õ¥ÖÈê¶rû~g5ó\ô–éų’Û9½q|nWïÿSí»œóh踿¬…]Åyɼkš…»•yd¸s¿PK?×’ÐTPK€Ÿ2res/layout-v17/abc_alert_dialog_title_material.xml•“OkAÆßÙmš¤M5McÕ¢ h &ÇJoB…žlð"¢ÓdÜ nv—ÝéŸÚ|O~/T¿€ýžªOžˆ¢Œè8éû ˜çÀ° VÁ:¸B° Çà x ^ƒ}ð|ßÁYx¯”ËÂ÷e”Èû‚ŠE/æ[Rõiz:Œ¥W2 ÈqdRÄ;xk⮢©)ýÔ #ªTôÃuéuÓw[2‘ÒO*Ÿ÷ÃMu{[vT—ffôcWdµµš~îñØ“ÁÐÀu“¸dI›û¢Õ,ØûbMJì¨Ë¾ô‚2Rµú›Ç• ƒ¹×zÜ7¤ØF‚tײ"4ɃN¢£ÅE}×H6£(ŒUck¹˜žPUÉýÐkIå ª×M~¹ñ¶ ¥¥®RÑJ³™´»¢Ç“†©j‡½&î5c‘4ÍZ…B¢úð¢+ÑUìÁSbìØoÀ>x Þ÷à ø ¾“Œ±Óàxá2ö «Ò øÔÀOŒôz 8Е¥§c÷uü&ÈÉÎRV§ß—ˆªLkîHc*î¦ZɪK¯©V¶´¸¦kîA[³f)sú³Ñ¼Ù9ÊAcr<Ô9&Fš³AN¦¬ºE*dÚ䘺íá¹þ¾LUÝC1K~8Û$þíœÖ•ÇhS¶VjÓ–ŸY£besµv47×ÕûŸÏkú¸hés}¤ÿv1ó£1kؽ-üÇþ§ÚÌH«™º#VÙ«yknâl›>òyž?Sæ|_²ôúÁù¿Ot/E+£ëþÒ;se²ä×tsß ÉÈþðmþPK^g,}ìPK€Ÿ-res/layout/abc_cascading_menu_item_layout.xml½”½oÓ@Æ_'uí$mIÚ ,¨¢ R;TT0Ô &×äHNMlc_’FBJøø€ 6fØb„±°0T!Qx윕ÄRNúé|ïÞ{Þ÷ìK“MË‘AGhÛ :@ªáyƒ­ŽSà XWÀmÐ÷ÁCð¼¯Àð|߉˜yp\01!ù†<ïyœùÌ©p Öu[òfÍgm!»”˹¾àŽdR¸¥R¢JÙ쫬×|·å„ƒ¶Äšh„“‹ÅjËkˆ “ü*ó±jë8© Q•uWÃ:µº¤|^›Ì¯ gÕõhjêiÑ•ÒmR&TXƒ¯v=N¶ÝÎõ(^6§ÖàËÂáƒà~ðLf©Éjüšàø§09šA¦¹â±JjEˆfXsª¾‹$ggÕS)hyžëËRû\©9¥&wZ¥eÈËxX’¼­œ™©KéÍ•ËA¥Î›,(ÅË+n³Ì¼õ²ÏƒrÜ4Ùmp¢Mæ 8›ÓdÏÁKð¼ïÀ'ð|Ûà8jƸî2òt1ŠàÚúi‚.5=lÅh\¤õ]EóÔ{»ÿyDš¥iaj¶¦í(ml ™0íùÚamÏ}jÏÑð£VñÓƒuÆY½PÑ´4ÚÛƒÙGñ2º6Òײ -­ê”ôz~€þ¸¦ç•g3òlþæyFyh“±¿¿xN5(Õ Ÿ÷kñS®ú@ 餿cRù°£ÝíÈi±Þ#ÖtÿºˆµB~HïîÑïÎ.g=žX›ÌárˆkœÌ!Ìíú³š^P¹¥µoÑÒÏLiÃÎ{b ád7â}“ñãšÎÿCM?µÿPÓ§ZMç‡Ôt ýÅ!ÿšýÕ%ó( ÉãŽÊÃÔü¥†Ü»å‘Ó´8ŽžÇ––GÒo¬'ÿ¿tâ^‹ï/ã÷ÝOPKì¡íÉLPK€Ÿ(res/layout/abc_dialog_title_material.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ,res/layout-v17/abc_dialog_title_material.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ'res/layout/abc_expanded_menu_layout.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ*res/layout/abc_list_menu_item_checkbox.xmlu¿Oƒ@†ß£*`Ú†šÆ88]:ÀîèÝDwsÂY´¸ªôO2ñéìî`⨫ú–¡iô#O¾ïžã~|×Ïöñ`&p†6d—Ÿœ“+‘œÌI¿ŸÉy>Ó×ãRÞ%zËJ"¸îmÎ*y“)Öa–„i]‡Ñ¬àHju!K5Õ—š%º]³É}齞Æ*ÇŽs«0=É`Ûr•9b­‹ã ¨ÂXMdå› ?Ì',Ò TUÐü < ‡Ì/bA^Éy'Ÿä‹@xØ3}ÿ0f—XôÏ+~6ë!?VýV®y3³nà'Z'Ž`?Öûµn§YÛùÃm¬¸e^ºÍÖy߯m­¹ÎZÍ}Å?ýýPKµõ¸PK€Ÿ&res/layout/abc_list_menu_item_icon.xmlu‘ÏJÃ0Çéœíæ6º?ˆ}«gQoÂC‡W ]l‹ëZÚ̱“} @¼ ž}_Cð¨8=¨ßÖŒn2åC~ùä—¤IrdÐFÄhöQ™T ïPU° 6ÁhƒSƒkpnÁx•JŸƒ¡oÐg’LsÎuƒjµ9u˜Î­×çä~ eàS¡Û¼/ºãP ?ð¹#Ž=1"]çƒ^àO›MWÊpÛ²bÛ>[j e¾ÅÃs+±5-F\1ƒ¶ÐÞcO༂7ð&à|‚ Æ1“ÖÔ½~#VЖ€ÿ2ã“("oà+’–¾EI½I2f ÔTŽeŽí’~™®—¹ZÒ&.—9óK¹¥.Ÿ¹<Ž—î±¼Àé³nò;×XPW˜Ù#™“ûsÓ³²îæPKxèI`¬PK€Ÿ(res/layout/abc_list_menu_item_layout.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ'res/layout/abc_list_menu_item_radio.xmlu=OƒP†ß *`?ÒbœŒS‡²;Ýv7WÀBJ¡‹¦‰‰þ$ÿHgw7]Õr M£‡<9ç>—ûq® ®âÀ.tà m É>9"crN&$ 9y ý~"—Y©®§¹¼‹Õ†pœÛÌ/ y“„¬ý$öguíºA¹àHªðBæaª®Kt»z“û8Pz==ŒÂx)t:—2ˆ³ÓR©,…eÉ4È3ž2EJ-N<¯ð£p.‹±žûÙÜ“‹™—‡…×üÌx6Ž™_ ÄŠ¼’7òN>Éà@÷þð™bÐ?¯ù*,Ö.? Fý^Ž~7½n8ÐN´NL`=Öûµn¯Ykþá¶Ö\•+·ÝºÁ·v;ÎÜ裹¯ø§¿_PKP\†PK€Ÿ0res/layout/abc_popup_menu_header_item_layout.xml‘¿JÄ@ÆgÏËåîô í¬,.…V"ˆ…VWˆˆÚˆ,—õ²˜Ë…dý‹ >€O`+V¾€`%vâ;h«~÷H'üØì73;³³694m1š¤F4LÆð¿E¹€)г` ¬‚m‚Sp®À5¸÷`hH‰#µÇ‚'ŒææÚ¨^m3ãŸw°̾?cöÇ›|PK'6¶•$PK€Ÿ4res/layout-v17/abc_popup_menu_header_item_layout.xml‘¿oÓ@ÇßÙ qœuª e€ C<À€XP†vÊU,Dè_ì¶cÙmP¥vkÿ€þ ݘhçnH¬L([Åÿ@×Â×ÎE¶"xÖGçû¾÷î½wg’Ec“ˆÑ3"‡´áÿ-•ÖOÁ<C0‚p.Á¸·àèv•8VÃ$<åñTP³)ÂP&™ü$à ùbþA½óSþQª†ô¨ÕJ¸çÉØ‰™¢v[ï¤(²íÏw{ž/àÓùGÒSu:zˆ"Ö²"¿)\¶!)# Ä=…Ò#+ÜOy$FE2²á}-Å5<öÒ9zÚÝ ”J^ºn6 Dijv ¦óÈåÉ{7™»>c½Àìω±Ïà|?ÀÜ_à¼bŒMÀ“1bõõ}ÿ†u±núEEÏ­ÿ|uýFy\Mû-¢:R ­þ­QjN¾æšUjFHÆi®5«¹_W},¡õ+}ttÍ¢úê|ªœõSŸÅ*5kë¹J­çhÍ,5ösíQ%ŽþoçAkv©m¯ãZ•¸ü~L}ï›s™ï±¾wöwúPKBä/¯PPK€Ÿ)res/layout/abc_popup_menu_item_layout.xml”ÍkAÆßM›f³ý0µ­Ö‚x’J“ƒ‚ JQð V-ŠˆÈ47ƒ›Ýuw’Z¢Áƒxñ*þ¢(þ¯‚ý¸x=*ˆBõ™Íl3n£V'üØÝ'3ï¼Ï;}dÓ¤MdÑV:ž#ÚBºYD7©ÛFÁ(ƒ}à8΂:hƒÛàx žƒ—à-ø¾1·ƒ2ØŽ3  `dDòËò@r1¿Ê©Xäž'ÂX\áøÓcKASžw#Ör‰ƒHp_2)Ÿr9Q#ÇY`Õ‹n4}õѱXžêì8XMøî¡šËi|¼Ö =Qe’gBœDNCCz†EQ“uÖŸu.ܺ¤RI7Xä >ilìé` eÐ@Öq•y|~)ädÛ áŸNâ9NŒ<>'|Þ ¾Ø ¾2÷÷‚Eš˜ÐŸÌ®ßIRMX,n0—Ÿ|CT$Í%=QŸÜC-Z\ ¶=j&] æ×¢š™Ño帆A$Ë­=åú”Üo–çD,âå°ädäôt]Êpo¥Wë¼Áâr:¼4*,¼X‰x\Iƒçó±\ò8]³lšÇšï&˺ž€gàx^ƒwàø ¾€¯à˜²,kœ×Á p U¢I½ mÄsÈA—†®šê7Ž_¿Þ¿ª_ŸþÛ½di­hhê©4ÇЖµ6ÒÕò0’ÌyÚ¤1瘞s@¿¿;ÎÚK…¶Òò†¶ƒÚkÈ#÷I¼ASëïhC­O×)››ÊYém†>®sÎ'9çWå<­s¶»Úú4¿¿äœó(×Vï›xh°Ön§‘ÇÄJíTè¬kwÜhI×ó/yäÓuíµ†¥®‹×f³¹=Ô¹}‚¶ËÈmƒÎÍIv“Ä'ÃçøÜÔ¹2Wæìï±þWu- †/•ÔÖwÅ׺c×g´¬×Çðšî“¬WUlqšíQ;Y{U Þë˜~Ý5îåô6š©éŸ¼e=¤zvï)Ïð<Òã<Ï…U{r´Ç_Òž /¹wÍŸ<ZzW˜þþ²ù¦zöŒ÷eîÎôŽ´~s§þPKü'‰©'PK€Ÿ)res/layout/abc_screen_content_include.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ res/layout/abc_screen_simple.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ4res/layout/abc_screen_simple_overlay_action_mode.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ!res/layout/abc_screen_toolbar.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ%res/layout-v21/abc_screen_toolbar.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ3res/layout/abc_search_dropdown_item_icons_2line.xml½”OkÔ@ÆßÙíšìn[wë.j©— ì®à©  x©T)E§»ãîÐl’éÖ¡"âI„ú->nñ³¥n˶êb®~ì Ùé**ý·ÄêÀˆó±ˆ%V¤-â8¾áôÕëÑ£%;ö]î [­:.MOê:£4á­ OI¼‹ææ’!÷¥êÖß‘~’ZîñŽX“b•¸',®d_¬„Qdš«(M8fÜn{ê±°ÐUÊ]j4üVWô¸¿¨[N¯ÁÝ͆'üF4¹PðÕÀÁ¾=c&ÝB•{¾€¯à8?Á/0Ë[/À+ðì‚7€X…¦±F üF›Bä ?JèA«„Ï5ʇ_M>œwF›D• 4#Ö lix_‹5öžÊ;Áú{ú»‹Ö?«×7ƒ×0Dœ¬­x'Óù&ò`—¨°3’Gs8ÏLÄ:¶kS‘‡ñ”–öðòºvi·}ôóÞŠ¡·âˆ·+d„9çc-÷™r;i¿¹Q¿GÞþ¥ßO ¿óÇømžÂ¯™±—ÿË[ Mžà÷cÂo3Ão`ëzB¯j¿åpËa.”ØËïz/Y¬U›Ñ¿–xo]×e,éwl8ï„Zeÿ³ÃyÅ¿S—ÜKœ'Q]Òþ£z%£.fèÒ©Ë]—d jº'x«j-Ë[)£¦§ð–öO“ÑyÈŽ9?ÿPK&|èOœ|PK€Ÿres/layout/abc_search_view.xmlÍ–MlÜD†ÇÞÝzÿ²ÙMBXhCóRƒ´{("*—*$‘Z•*\HÛ‰=Ù5õÚÆžÍ&U¥´ê™;Bˆ;àL¯H!T!¸pé¥G?è;ÞñîÔx›DဥG¿öÌ÷}ïüìfHžXc„hä©gy–ÈK#ä32¼j`œgÁ¸ÞÀmðx|¾߀_À ‹1k`œçÁE° p|¾_ƒïÀÏà>˜Ól€+ Rál—¯ø>£uMF !¬zŽ ÍÇöCû#†Ñ èŽÍ÷ÐÅ¡{^—_…RÉ lærÊmÏ%ºn[¤XÜ¢æõVàu] ï}jY¶ÛZgÛœ”Ëòé’ÝjsÄØöÌnH·†^;vhoÙŽµ\–az¶ÅÛdlL>¶YÔ¯V“Ï´l7zbâ­`ròñes¯ƒ°¡IvyÏaC¤ã°uÛed|Ü hO¤s±Ÿæ0rÉŒm×ïò¨k¥bž¿æõÜ×lòbÑî° ¾p"D>¦çr8³ÆB3°#UéòJ¼z} ÀÇèA ÛÛ!ãdz:~µÁn›ƒ…«Úb6ëÁ(‘8 Ö£,I>½1 êbÌÇò²l5®ï{oì,7`l‹ñÆëèk¶E‡Å~s¥Ë½U¯ã;Œ3’Ë™ C²´ÔæÜ©Ù Í6ëаhz&õ¯76ãp¹\È÷0¡ÙìŽÈ×--OvqhÚ»à#ð)øÜß‚ïÁàøü~¿ßÁŸà/0£iÚ&xܳº¦™À!¸>Ÿ¢UIq§À?¸Nã>tè\ÑÅ5=O‘,Ñ£½*¾ËÉ÷yBª±vb¨i›ÄØZYùNÜ…6–ÐDÌ{ÐN*1Ÿ‘1 ˆO†ýôÔ;ß?FÚ‹RË µZ5%·7en%%]~§æû÷ˆ|…Vj9Mï÷T5‘‡ô8Y—¨Wœ}Ï)ú)Y¯ylDãe¨ãЬ£8Ô&âü[G]oŽ÷E{Añ´Dôý¸Žd¾qÍ”µba­\KY+˹¢úœï7ž¢M 5Xyë|œï¹cú¾u¸õ£!¹ýd q]5E3d[ñ]û’”¾ŸKñý}ÜWS|?­~2²ŽƒæÂ<â\¤y¼‹Åÿš’̭ۢ†Üjñ9£Œ•yL¾jn–ÌÍP´¸†¼¢-Iß Šö¼Ôʉ=š¨+§-öµ‰”=•¬UhO(9kˆ(´é”µý¤ò]\ïS)?’ßÉ„&Ús¸ÏöëÎÌ*gMÒ÷ølÝLYóeäýÕ{¯ßÅÙð~°÷ )ÚuNÆ9×›¬+Ö“{#þ]{똿kÁö‡ˆùšŸâ}ñÞÓÃz_Mñ¾:Úûãüþ©ó1¯Ì‡ŸrV nÓö?÷`Añàæˆ5™\{±Þ¡'ÿƒi#þ³=PK ç/d PK€Ÿ"res/layout-v17/abc_search_view.xmlÍ–MlE†¿]ÛõOÿ$!ÚЦ H È>UH "µ*U¹Êf=±‡®w—ÝqÜT‘Òªg$Ž!î€{.8ª'ĉ Êxgìé²&‰Â•íì»;ó}ß;?v† ôú8‘F'è± Ñ#]Ñ'4¼ê`œgÁ*¸^-à[à5ð&x|¾?€ßAcÖÁ<8 ΃‹`xà6x| ¾ß€ÁÏà®ì£=:À•Š`×Ųë2Ã3l“Q±(…Çr<´™eq×ç7åómÏØâb],cÛ鉫±06æxœÙÂܱI×y‹J¥ üÖöœžÝÂ{×hµ¸Ý^c›‚Êåèéowbl:fÏ76,†^[ÜçÜ’£–ËQ˜>o‰Gô«×£ç®áµ¹ =1q˜œ¼G|ÚÂé"¬o»¼íʰ>ұطU«-ÏèËt.†i#÷Y”1·ÝžºV*-ÏqW¾½l›XV*ñ.»àJ'|äc:¶€3«Ì7=¨J—gÂñff|¼†uasÓg‚¦§ãWW˜'¸9xQ­†9­r™Á°Åâ³]£Í®pÖ‡u²Ã[ ¾¡Bá2¦4x“Ï6†Ä --E­†ßs]Ç­¥¬n3Ñx}ÍŽì°6—{ÂYqº®Å£\δ ß§ÅÅŽî“ͦovX×ðñ€¦ÓmÇüf.—óÅ6¦8›Ý’yÐM­@;XÏ“¦½Þ€Áø | ¾wÀwà{ð øüî‚?À¬¦iëàUp œÒ5Í-àƒÛà=ð>ø(£i¤Õh±§À_¸Ná>tèBÑåõPðÕ›<Îãe÷©ã¥¨ŽÒP›ˆó;h3ÊxsTÚ•íÅÓ1Òwã:’ùÊ:öpo¦¬•Â!ÖÊË)kåßr®¨>Âñª)ÚÔPƒ•7ÏKí„2^F™‹sGœ‹ƒ­)í åv“uŵÖ-µ•¹Ð>£±Á\œK™‹·p_I™‹cÁŽ ‘uì7?æ!ç'é»Ìí:6ÄsJnG¹Õ‘[=>{ssß[QnyE‹k((Úbä{QÑ´rbß&êÊi ¡6‘²ÏÒÖØ}JÎ"Jm:e½ß¯|×û@ŠÇ¦äw<¡ÉöiÜçº3sÊù“ô=>o×SÖ|QÙ·ûyõŸÞë{8/Þöc1Eû¯Î®“8»âz“uÅzroÄ¿u¯ñ·Î;Äþ1‚æ¦x_:„÷ÆA½¯¥x_íýQ~Õù8­Ì‡›rVIvŽèûŸ{0¯x°3bM&×^¬7GèÉÿeÚˆÿqPK!¯KJ PK€Ÿ)res/layout/abc_select_dialog_material.xml…’Ï‹Ó@Çß$­Ý´¦«¬ ¬.lsYVð ì.‚­¢E˘Ì6ƒi'd¦]ê¥þ^ü/‚ø'xóè_ w½xPð¦ßÙ&$.,¾ðÉ›|ßÌ{3“çR‹Þ¸DŒ.Ò'Ft– Ã8¡Ê<° .ܰ$x^·àø~€ßà*r=OãȘÚmå*MŸñ\ãã€Çr2ºu:Q*³¡zÈc«‘ï§|®¦fÿPÆ&A¸øL„%†ºÝˆG‰ØS©Êïʉ¡f3–3‹!5ùã£:÷U,hm-[&ÝUƨñ@íNá'šz½"0TÙ@ ¥IòðIœ+ìu{»õõ4ËTnú³›}žeýTäfOMŒ­ òkD4RqOjóDŠCr]Ì"Ï‹R®5­¯'Æd·ÂPc¿c®ûeÖHCž=s¡7ùÔ(ÚØøÿ̰Üçi3Ç~™­Iô’µh þ31ö|ßÁOð X»>:Œ½#gñ èÖœ`+ðÁQü«wàÏúuVéÖloœÃÓAãøxEߨX ™¨¹–mUj=r–uœºVÔv+mµÔ•X}y\;U«[®mVšóg¶Z«¶–g;][{™¼…ÕÚ5í 4;îBó—9\¿ˆ÷jóvØÊÂ=vå=±î•ðþPKþÍ|Üø¤PK€Ÿ-res/layout-v17/abc_select_dialog_material.xml…’A‹Ó@Çß$­Ý¶6uY=*‹ 6àa¡»´ˆ¯%&³Íà4’i×z©g?w¯‚xò¼ß`?€èðª/úŸí„Æ…Å¿¼Éÿ½yo2y.5èØ%bt…¾2¢M²†µ¤µy ®‚<C0¼ïÀðß¶NÜc0Ž#bj6‹(WR¾ ó/a,ÒÉÃx©ݎ¤ÈFêiZ-.ÔLE¬„íkÂÅ$ÑÔéDa”ð}%UþH¤šêõXÌEÌs„ÔœçÏOú-È÷m`¤²¡ -9ê†iœ+œ}w×®úÅ,ËT®ûó;ý0ËúÉs½¯Rm:òüÆ3-"É‹B¿ü\Yäy‘ ‹‚¶·­³{APàüÓ°è—U#5 ÂìUóâV8ÓŠvvþŸ”§ó¼B/pÞZmnz½e º LŒ}ßÁðüÆn‚#‡±Ï.cÉY~ĺtû.?°¼òOÿÕ;ð]à@¿ÏÖº±‹dfj“:„6ž¾'k ÒÕ—þjLJÍ'gÕÇ©j¶·»Öz¥V[k]ã};¯§µs•¾åÞúZsÞã›Ö¨ìe6ï|Eóì÷6+õ®‘·4ÚFE»ͬ/@k¯êºmïUòlc鞺ÓòîØwÍÎø7PKÅ'!ÐPK€Ÿres/layout/abc_tooltip.xml’»oAÆgïb|~â$HP€¨I‘kPH®’ˆ”°øßÊw·§»h þ*jZ:z:ŠQ-5%IGà»cŒWVë§ùæ!Ç>ôÉ't•^ ¢ebƒÓÌÁ5pÜkà!Ø(ÁKð¼ïÁpŽÁ7ðôûVíÚ;y®d!³‘¢V«î™ÄðU’è¼Ô/u:¦Ð*³Òj“‘çéˆÚí§r4f;‹ÏeélÍú°KgoéÏ_mªy?É«5Ï™ïsï‚Óû€šu]Ãé=ãÞ NÝ„µÖt4ÃZpN]뜺ÿÙ¿ÒºNo½½™ÖÀqê=ús»ù|³ùßΟ»åôfâ7þ PKF3EÓÌPK€Ÿres/layout-v17/abc_tooltip.xml’=Ó0Ç'-MÛ´ôŽ"@°rÃeABB,€@êĸLc«I9>ÝË߀‰™ ‰ XÙ;߀—Â?Á¥VU$é'ûù?/ÎÛ§€Î7ˆ¡çŒè$Yþ …­³à¸®€[`Ä Áð ¼oÀ;p¾€¯`ôî÷Ø7W‹BpÍó± v»®«TiìEšÊ¢”‡‚º]¥¥È 7Råäy2¦Nç>O'Zíæ1âc™OFâAÈzÛª 0´Îm9I õzÖ½¦ŒQÂ)?P»æîžŒM‚°uaÓ­Ÿq=‘9AÆ÷wêÔz;’¹(gl®óoàÓ°ÊázT÷AÕ6&¼#ŵZ<µÂ,‰1Åå(*ljÈx¹i›c•E¼˜FZ”Ñ<öˆ4Âz‘{ ^€·à=ø>‚#ð |ßÀwðœcŒmW>c¯±F¯uð vëxÐï9zekulH¾}UžoãÑ€Y­ãh3¬•Ö]Òªþ1 N9ý×mÿ5þö§Efê>þy–sÍûI^­yNßÖ6œÚ›ÔªóšNíÌÖsò¦Ô¬µ–£)«+òÚ+òþgþJ ÚÔÖöZ—SÏÑ_1Ûñß2XÒ|{·ËÿØ_ºóùݲ¼…ßPKÖ‹U/ï PK€Ÿres/layout/main.xmluAKÃ@…ß$±‰6•‚ɹȬq\ü0B樾S¿kéuôxÞçç»ù#—ëÏÃFóZšËëž¶Vû[jaËËùõ¢—lúä áªëÿý‡£­Þì¬|7k÷Ÿ~gͬòÏn~PKrÖÏ’ PK€Ÿ"res/layout/notification_action.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ&res/layout-v17/notification_action.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ,res/layout/notification_action_tombstone.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ0res/layout-v17/notification_action_tombstone.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ/res/layout/notification_template_custom_big.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ/res/layout/notification_template_icon_group.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ5res/layout/notification_template_part_chronometer.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ.res/layout/notification_template_part_time.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ*res/layout/select_dialog_item_material.xmlu‘1KÃ@Çߥ­MÚ´´PÐA?€AqRqpQW9š³9L“œÖºØÝYpSg¿Š“8º¸9êªþÓ^M|áǽûݽ»ä¥@& "FóÔbD5Ò|—²h‚°–Á*ØÀ ŒÀ¸õºçj#ŠyÐdY©Ø ý0F.|_F‰¼T.÷b~&Õ CºT­FÜueÐÛÇŠl[ÏödÏK§>†§êh ]åQ­¦§ž/[V_Û“Ü4÷qÝ¡ÜÀ7qx»í)­9NÒõDŸ'½Ðé†}‡G'N,gºßÃLZ¸BŒÝ€ðžÀ3xà¬3ƈ5hûgÁ7¢ŠÑü{ΧQAÞÂS¡Ò¸¿¶îsºf¢ä•ŒK{ò~Ý›vFæE][È\³¡]1s¬…·H])wÞ>o&çîµ+çîHÇÔ™9÷¥•«½EmáO¦ßÊþéÍPKH¥!ú^€PK€Ÿ1res/layout/select_dialog_multichoice_material.xmlu‘Í.AÇ«g¬Ý±³ÄA„;æ@BÄHÄÁA|ÅA"m§ítÌîŒÙfqá $Nnâì žÁYâ$^ÀpÅf{ÍD¢&¿t׿«ªkªM*PÉ$b4B;Œ¨JڰߥÔúÁ(S`,ƒ-à.Á¸à <ƒJE‰Sµ†‚G¼YdY±°øA„½ð}¶ä¹ |¾ñ©ÎÈ0¤KÅbÈ]W6ë«â@Q©¤½uY÷b×çgÁ±ÚkKWyT.k×ɱe5dsEèP7âm¾ï‹¤mwݵNA$w• Å£8bɵCán¢Ím)ÚèŒ7Ý(@SžRáœã´jžhðÖ¤>˜¬ ‡‡‡N$ZN73ašÇ:MŒÝ€{ð^À+xà,0Æp®MƈUi¹àVÁjúKõØÊØâ+S.y/[¿[|V@Ê"êÛgýÕÞɸHê¥ZµGçš©Ö_ÕZOª±Atk¹Œ6C¹¤^oæŽ}}G>sG¼ÆZ!£}iÍÊäÞêܾŒ6ltþ£˜j94“ôWúgþ™_wN쟹þPKÃצ3  PK€Ÿ5res/layout-v17/select_dialog_multichoice_material.xmlu’½NÜ@ÇgmŽ;ß÷EQ”<@(p('B”"Ê-Yn—ó Ÿm|P$x¤Té¢Ô)"D /)UDG•‚>´¿í5¶ŒõÓîüwggvÖ6Õè½MÄè1}dDÈæ‚ ë'à)˜KàxGÙ> ŽÀ1ø NÀO𠜃 Ðnk¹§ûQ$ỹ$ÇI„•ÐcÌ¥ï«h¬$U«Ã˜ï*½O–¥5BÃWrKS³i¼×jè%®Ï÷Ãzc¢„ö¨Õ2®'ÓeÇ©à¥4[EÌ'|Ó—éANî®e"8WÞh—Ren½nÜÕ@ zÅ“ƒm)Þâ ëJNP5D¢àÙYOëè™ëŽžññœY˜„#—GÛn,Çn¾}c5zŽqû ¾ïà7øÎÀ?p –c!ØŸlÆNÁ@¬K){¿kX×¼™}zbÌgðu¨ró¶dÖké#O/ûn´¿d¦çZwÊÄÚ…ÖËóN›A‰V)i‹TIÏ›.åØ49ª¥ɘhµ’ve4§ûÅÄÖKÚ#+»G£Ð*(&­¯yǾÖõµoÕgßêsÞOvOÿÿPK©[Pû½`PK€Ÿ2res/layout/select_dialog_singlechoice_material.xmlu‘Í.AÇ«g¬Ý±³Ä„;æ@BÄHÄÁA|ÅA"m§ítÌîŒÙfqá $Nnâì žÁYâ$^ÀpÅf{ÍD¢&¿t׿«ªkªM*PÉ$b4B;Œ¨JڰߥÔúÁ(S`,ƒ-à.Á¸à <ƒJE‰Sµ†‚G¼YdY±°øA„½ð}¶ä¹ |¾ñ©ÎÈ0¤KÅbÈ]W6ë«â@Q©¤½uY÷b×çgÁ±ÚkKWyT.k×ɱe5dsEèP7âm¾ï‹¤mwݵNA$w• Å£8bɵCán¢Ím)ÚèŒ7Ý(@SžRáœã´jžhðÖ¤>˜¬ ‡‡‡N$ZN73ašÇ:MŒÝ€{ð^À+xà,0Æp®MƈUi¹àVÁjúKõØÊØâ+S.y/[¿[|V@Ê"êÛgýÕÞɸHê¥ZµGçš©Ö_ÕZOª±Atk¹Œ6C¹¤^oæŽ}}G>sG¼ÆZ!£}iÍÊäÞêܾŒ6ltþ£˜j94“ôWúgþ™_wN쟹þPK‡¶Ý¹  PK€Ÿ6res/layout-v17/select_dialog_singlechoice_material.xmlu’½NÜ@ÇgmŽ;ß÷E‰”<@(p('B”"Ê-Yn—ó Ÿm|P$x¤Té¢Ô)"D /)UDG•‚>´¿í5¶ŒõÓîüwggvÖ6Õè½MÄè1}dDÈæ‚ ë'à)˜KàxGÙ> ŽÀ1ø NÀO𠜃 Ðnk¹§ûQ$ỹ$ÇI„•ÐcÌ¥ï«h¬$U«Ã˜ï*½O–¥5BÃWrKS³i¼×jè%®Ï÷Ãzc¢„ö¨Õ2®'ÓeÇ©à¥4[EÌ'|Ó—éANî®e"8WÞh—Ren½nÜÕ@ zÅ“ƒm)Þâ ëJNP5D¢àÙYOëè™ëŽžññœY˜„#—GÛn,Çn¾}c5zŽqû ¾ïà7øÎÀ?p –c!ØŸlÆNÁ@¬K){¿kX×¼™}zbÌgðu¨ró¶dÖké#O/ûn´¿d¦çZwÊÄÚ…ÖËóN›A‰V)i‹TIÏ›.åØ49ª¥ɘhµ’ve4§ûÅÄÖKÚ#+»G£Ð*(&­¯yǾÖõµoÕgßêsÞOvOÿÿPKʰÑL½`PK€Ÿ3res/layout/support_simple_spinner_dropdown_item.xmlu±NÃ0E¯“¦q«T*йCÃŒ„ÄÈÀ„BQc5nÕF¥,åCø~‰¥3ÜT‰!ñ¬#?ßwýüìCb'| j—h#"䔜‘ rEnȶº7PÆèÒêÏÓ)¢È$›âÉ=¬uê2ŒFõ1Sz‘9 ‡Vç £®u® å­zvwZ­†Iž® 6˜N3çÊó8¶óL-;« ³y±Œ“ò1^)7æ °ncð*$¼Cˆù"ßä^1Æ1kGä‡Ñçú[G¯"`>áêÃcÖßûP×%0îÕwE«‰ ;íûu|Õ^i~«yÞ¶Òz­vؼ+;¾Oúü?37³‰þò PKI<›d ÐPK€Ÿ3res/layout-v16/notification_template_custom_big.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ3res/layout-v17/notification_template_custom_big.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ=res/layout-watch-v20/abc_alert_dialog_button_bar_material.xml­’=OÛ@ÇŸ³ã$8 ¨”‰Ù /*EH]ª ©K¥ÊŠMlA|–} ÊX•™¡R§~€~€N¼|‡Ž°Bÿ¶Ï²•gýt÷üï¹çþç;•ªô«DÄ蹌¨E²aüò¦ƒð¬€ ð |{`NÀ8à ”P§Ré†ÖÀCªÕxè9¾°„Ç}RφX¶íùÝgO®Ëh—T¯Ëà‹×u52ls!xÓÖ÷Å÷CÏ.¦eè:2=›Nãf3·½Ðé$û—Ëí>*ù0hùvÈáfiIŽŒ¨<Æ`Ý@ý®#Œ4¹m…;IZ^v…¶L3ê¸NÏŠŒli‡÷L+Ø7C'2³Âš‰áCG¬Jkø/?ˆ±ßà¸WàÜ€[pŽc?Uƈµ’? Ðêè'ýoA[ã7øtR“{›”÷ÏU‰¦>KåZ+ËSr-Pekj®i¬žæ•ŠZ)Õ´GòÊäU ûÆ}¬U Ú½Ôô‚¦Ê³ž¢Ÿ/œµ&Ϫ%§Ñþ;ÃVïyÿÌž¹·Gãq3×”-RFª¼‹q™¿Åø{ûÊþ6 þŸð·ú³¯ìïCÁ߸uìgo™=ñöÿPKN­SòÙ¸PK€Ÿ8res/layout-watch-v20/abc_alert_dialog_title_material.xml•“M‹Ó@‡ÿ“nÚômM—dEIAoâa•½¹(èAÆ&¤³6/$Ó®=èö(x¼xó(zõèðxô#(ÂêoÒ‰‰qWÝ)3ùÍdæéL¦Fm˜DŒŽÓsF´Bº íRQZà8pÜwAæàx^·à=ø ¾ƒ³˜¯Ñð>rFËËc>‹&ò~´ÛQ"¼Pr)¢ C¸ÔjME*ˆ±êïtô ;•#êvõãÈþH’mëç€'¾·¢w·'©¼-¼kÑ$tS²¬€?º“MÐl¢¹±x¹Ù¼pßS±Î¦=žlfÓÁ˜‡nÁfmM·œtÇQ"ée2¾'ë‚#KȱGý~>NwÞŠùУõõ‘”ñ•Á ޼€§N>j?$^:È×2ÍTÎ0לYt{÷š{>€àø¾‚oàcì$8ˆÙ´J‹süÒEmùÓR®Jí>~&Õ²3¶õY«>‹¨w!·Èl¦³Z‘±95vUf–Æ©ZeõR¶‡Zy¼ÔßRÕ£~€ûO'‡ðPY£ÈL¶ºØ£7ÈN—ÜÚÚ­‘­¾X“íãVö¨g3ýî±÷«ÈVrßfÅÍÖw°œÕôYW}ó³>_Ê—µ‘™U÷¸·Ïÿ8zˆýT¥WdÆ=|—¹_Õ#ϫ߀ò–¨/•ò#Ú{)Ûõ?kÇ¥’¡ÇýÛ!s7w©®Y«Ü£Ü‘p¿~PK$S'I(HPK€Ÿ&res/layout-v21/notification_action.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ0res/layout-v21/notification_action_tombstone.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ3res/layout-v21/notification_template_custom_big.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ3res/layout-v21/notification_template_icon_group.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK€Ÿ%res/layout-v26/abc_screen_toolbar.xmlcfà`È````daPÓPd(0 #c£\Í(ɉ! 0ÕH`QPKCVæ×/hPK €ŸƼ³þþresources.arsc þ@!ÍPD_{§Æä6Vz›¼ÜVˆ¹ä /W|¦ç)bÂõ1nÍñ"T{œ¾â)T€ºò*bš× S ’ Ì  = y ± ã  G ~ µ ì % X Ç B … à ÿ >‚Æ>u®è)k®ò4w·õ<¨àM‰Æí.k©ê'e§å$g¦æ*j«åUÅ?~½÷-h¤Ü@r©àPƒºò+m°î*i­ñ.i Ù T – Ù !_!¢!â! "g"¬"Ó" #D#x#´#ñ#0$`$–$Ä$õ$-%[%%Å%ü%8&s&¬&å&'W'•'Ó'(S(Ž(Å()>)w)ª)Ý)*H*€*¸*ò*&+^+—+Ñ+,X,—,Ô,-Y-ž-Ü-.P.Š.Å./J/Ž/Ó/0Z0›0Ú0"1h11É1282u2³2ï2)3c33×34U4–4×45K5ˆ5Æ5646h6œ6Õ67G7‚7·7ð7*8e8©8î8.9l9­9ó99:x:µ:î:);e;¨;ì;1<w<»<=B=‚=Ë=>M>ˆ>Ã>þ>>?~?»?ô?2@q@¬@á@AKA…A¿AùA@B‡BÁBýB:C~CÃCDND}D§DÓDE+E]EEÂEìEFMFvF§FØFG:GkGGÊGHUH„H´HèHIBIpI¢IÐI J:JhJ”JÅJèJ K2KbKŠK°K×K LFL€LµLäLM@MpM‘MºMíM#N[N”N¼NåNONO„O¾OæO&PaPŒP¹PæPQ3QhQ“QÈQþQ)RZRŠRµRßR S5S`SŠS½SéST8ToT“TÉTêTU3UIUnUUÏUV9VjV—VËVW6WIW]WjWtW|WŒW—W¨W¼WÐWÝWñWXXX X'X0XAXPXnX‚XŒX•X±X¸XÂXÏXÕXèXYYY#Y8YBYJYQYfYpYvY…Y”Y YÃYäYZ$Z/ZpDpIpPpXpcpqpƒpŽp p«p³p»pÉpÙpæpïpüpqqq'q5qGqPqYqaqnqxq’q²qÁqäqðqrCrpr„r·rÝrîr s+s¢L¢`¢}¢Ž¢£¢­¢Ç¢Ñ¢ê¢÷¢£#£=£J£d£ƒ£·£É£Ò£Þ£ë£ø£ÿ£¤/¤A¤\¤p¤‡¤Œ¤œ¤¬¤Ì¤Ü¤ù¤ ¥¥(¥3¥E¥U¥i¥z¥‹¥”¥¡¥º¥Ý¥è¥ ¦#¦I¦x¦³¦Ò¦â¦§I§h§t§“§¢§´§Ü§õ§¨?¨L¨¨£¨¯¨»¨ù¨©S©ˆ©½©ò©ª)ªNª]ªª§ªÏªçªÿª«e«{«—«»«Ë«ù« ¬,¬J¬o¬‚¬•¬¯¬Ç¬Ô¬ì¬û¬­=­N­X­u­‰­’­ž­±­¿­Ñ­Ù­ï­ú­®®&®.®=®H®[®n®®®–®¦®¯®µ®Ë®Ó®Ü®ñ®ù®¯¯"¯4¯H¯V¯`¯f¯w¯‚¯•¯¾¯È¯×¯â¯í¯ù¯° °°4°Y°z°—°º°Þ°é°ý°±,±;±O±k±y±Ÿ±à±è± ²²E²p²ƒ²Î²þ²³2³ƒ³µ³ä³´´(´8´H´a´ƒ´Ÿ´¾´µ*µ<µIµkµwµ‘µ¨µ·µÎµÞµïµþµ¶¶6¶C¶I¶c¶l¶u¶…¶š¶¬¶µ¶Ç¶á¶ð¶ú¶ ··0·C·M·]·i·p·‚··—·²·½·Ç·Õ·Ý·ú·¸¸¸9¸B¸V¸c¸s¸¸Š¸¸²¸»¸Ã¸Ö¸á¸ê¸ó¸þ¸¹¹'¹2¹A¹K¹R¹a¹k¹u¹}¹¹ ¹·¹Æ¹Í¹à¹÷¹ ºº#º6º>ºFºSºhºwº‘ººªº¶ºÓºéºöºÿº»%»=»O»V»f»x»»‹»»­»¶»¾»Î»Õ»Þ»ï»ú»¼¼,¼9¼@¼H¼V¼a¼j¼s¼†¼¼¡¼©¼Â¼×¼å¼ø¼ ½½,½U½k½Š½œ½ª½¶½Í½Ø½é½ÿ½¾,¾C¾O¾a¾l¾z¾‰¾˜¾¦¾¹¾È¾×¾ç¾õ¾¿¿%¿>¿Q¿f¿o¿{¿‹¿”¿ž¿«¿¿¿Ï¿Û¿ð¿ù¿À À,À@ÀHÀRÀ]À‰À”ÀÁÀíÀ)ÁXÁÁÁ¬ÁÂÁÎÁçÁ÷ÁÂ2ÂQÂ`Âr”ÂÇÂÌÂáÂ÷ÂüÂà Ã.Ã6ÃOÃhÖõÃÀÃÙÃïÃÄ Ä8Ä@ÄKÄVÄ|ĜľÄÌÄØÄöÄ.ÅPÅlŜũÅËÅåÅôÅÆ%Æ2Æ9ÆJÆTÆbÆwƓƞƦƵÆÇÆØÆáÆêÆûÆ ÇÇ3Ç:ÇYÇsÇ|LjǔǪÇÂÇåÇôÇÈÈ%È?ÈTÈkÈ~ȞȶÈÙÈäÈüÈ É'É8ÉOÉgÉ‚ÉəɤɲÉÄÉÔÉÜÉéÉõÉÊÊ#Ê3Ê@ÊNÊUÊ`ÊmÊÊ‹ÊʬʸÊÀÊËÊÖÊðÊýÊË#Ë.Ë9ËOËaË|˒ˬ˷ËÇËáË÷ËÌÌ$Ì3ÌEÌTÌ`Ìt̟̮̻̀̋̓ÌÉÌßÌèÌýÌ ÍÍ!Í*Í=Í[Íw͈͗͹ÍÊÍêÍùÍÎ-ÎHÎlΆΠδÎÐÎÝÎÏÏ/Ï:ÏIÏaÏnώϞϾÏËÏûÏÐ=ÐLÐhЉДÐÂÐÝÐìÐ.ÑXÑjÑ¡ÑÒÑÒkÒÍÒèÒÓ$ÓsÓ¦ÓãÓÔ*Ô?ÔHÔTÔiÔxÔÔ˜Ô¬ÔÁÔÍÔáÔîÔ÷Ô Õ"Õ5ÕFÕTÕgÕtÕ}Õ…ÕšÕ­ÕÂÕÓÕÝÕîÕùÕÖ ÖÖ+Ö?ÖSÖiÖrÖzÖ†ÖšÖ¤Ö²ÖÈÖÞÖêÖóÖþÖ×"×:×G×[×s×קײ×Ò×Ý׸ר ØØ>ÙkÚ¤ÛØÜ ÞBß}àµáòâ*äiå׿ èIéˆêÆëýì=î|ï¹ðôñ3ómô©õåö ø\ùžúØûäûûû üü"ü1ü:üFüUü^ümü|ü‹ü—ü¦ü»üÄüÍüÜüéüõüýýý'ý0ý?ýHýTýcýlý{ýŠý™ý¥ý´ýÉýÛýêýóýþþ)þ@þLþ^þnþþ£þ¶þÂþÑþÜþïþúþÿÿÿ$ÿ0ÿDÿTÿgÿrÿ€ÿ™ÿ°ÿÂÿÎÿÖÿäÿôÿ,7@JR\i„‘¡ÂÌÜêõü )/4=LXboŽª¹ÅÙ Composite AppGo,,android.support.v7.app.AppCompatViewInflaterres/anim/abc_fade_in.xmlres/anim/abc_fade_out.xml))res/anim/abc_grow_fade_in_from_bottom.xmlres/anim/abc_popup_enter.xmlres/anim/abc_popup_exit.xml,,res/anim/abc_shrink_fade_out_from_bottom.xml res/anim/abc_slide_in_bottom.xmlres/anim/abc_slide_in_top.xml!!res/anim/abc_slide_out_bottom.xmlres/anim/abc_slide_out_top.xmlres/anim/abc_tooltip_enter.xmlres/anim/abc_tooltip_exit.xml::res/color-v21/abc_btn_colored_borderless_text_material.xml::res/color-v23/abc_btn_colored_borderless_text_material.xml//res/color-v23/abc_btn_colored_text_material.xml..res/color-v23/abc_color_highlight_material.xml((res/color-v23/abc_tint_btn_checkable.xml""res/color-v23/abc_tint_default.xml##res/color-v23/abc_tint_edittext.xml%%res/color-v23/abc_tint_seek_thumb.xml""res/color-v23/abc_tint_spinner.xml''res/color-v23/abc_tint_switch_track.xml>>res/color/abc_background_cache_hint_selector_material_dark.xml??res/color/abc_background_cache_hint_selector_material_light.xml66res/color/abc_btn_colored_borderless_text_material.xml++res/color/abc_btn_colored_text_material.xml//res/color/abc_hint_foreground_material_dark.xml00res/color/abc_hint_foreground_material_light.xml99res/color/abc_primary_text_disable_only_material_dark.xml::res/color/abc_primary_text_disable_only_material_light.xml,,res/color/abc_primary_text_material_dark.xml--res/color/abc_primary_text_material_light.xml!!res/color/abc_search_url_text.xml..res/color/abc_secondary_text_material_dark.xml//res/color/abc_secondary_text_material_light.xml$$res/color/abc_tint_btn_checkable.xmlres/color/abc_tint_default.xmlres/color/abc_tint_edittext.xml!!res/color/abc_tint_seek_thumb.xmlres/color/abc_tint_spinner.xml##res/color/abc_tint_switch_track.xml((res/color/switch_thumb_material_dark.xml))res/color/switch_thumb_material_light.xml77res/drawable-hdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png55res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_000.png55res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_015.png55res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_000.png55res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_015.png::res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png::res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png<>res/drawable-hdpi-v4/abc_text_select_handle_left_mtrl_dark.png??res/drawable-hdpi-v4/abc_text_select_handle_left_mtrl_light.png@@res/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl_dark.pngAAres/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl_light.png??res/drawable-hdpi-v4/abc_text_select_handle_right_mtrl_dark.png@@res/drawable-hdpi-v4/abc_text_select_handle_right_mtrl_light.png==res/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png;;res/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.pngDDres/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.pngBBres/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png$$res/drawable-hdpi-v4/ic_launcher.png55res/drawable-hdpi-v4/notification_bg_low_normal.9.png66res/drawable-hdpi-v4/notification_bg_low_pressed.9.png11res/drawable-hdpi-v4/notification_bg_normal.9.png99res/drawable-hdpi-v4/notification_bg_normal_pressed.9.png::res/drawable-hdpi-v4/notify_panel_notification_icon_bg.png$$res/drawable-ldpi-v4/ic_launcher.png>>res/drawable-ldrtl-hdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png::res/drawable-ldrtl-hdpi-v17/abc_ic_menu_cut_mtrl_alpha.png;;res/drawable-ldrtl-hdpi-v17/abc_spinner_mtrl_am_alpha.9.png>>res/drawable-ldrtl-mdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png::res/drawable-ldrtl-mdpi-v17/abc_ic_menu_cut_mtrl_alpha.png;;res/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png??res/drawable-ldrtl-xhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png;;res/drawable-ldrtl-xhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png<>res/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png77res/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png55res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png55res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png55res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png55res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png::res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png::res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png<>res/drawable-mdpi-v4/abc_text_select_handle_left_mtrl_dark.png??res/drawable-mdpi-v4/abc_text_select_handle_left_mtrl_light.png@@res/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl_dark.pngAAres/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl_light.png??res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl_dark.png@@res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl_light.png==res/drawable-mdpi-v4/abc_textfield_activated_mtrl_alpha.9.png;;res/drawable-mdpi-v4/abc_textfield_default_mtrl_alpha.9.pngDDres/drawable-mdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.pngBBres/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png$$res/drawable-mdpi-v4/ic_launcher.png55res/drawable-mdpi-v4/notification_bg_low_normal.9.png66res/drawable-mdpi-v4/notification_bg_low_pressed.9.png11res/drawable-mdpi-v4/notification_bg_normal.9.png99res/drawable-mdpi-v4/notification_bg_normal_pressed.9.png::res/drawable-mdpi-v4/notify_panel_notification_icon_bg.png<>res/drawable-xhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png<>res/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png>>res/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png99res/drawable-xxhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png55res/drawable-xxhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png::res/drawable-xxhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png;;res/drawable-xxhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png77res/drawable-xxhdpi-v4/abc_ic_menu_share_mtrl_alpha.png11res/drawable-xxhdpi-v4/abc_ic_star_black_16dp.png11res/drawable-xxhdpi-v4/abc_ic_star_black_36dp.png11res/drawable-xxhdpi-v4/abc_ic_star_black_48dp.png66res/drawable-xxhdpi-v4/abc_ic_star_half_black_16dp.png66res/drawable-xxhdpi-v4/abc_ic_star_half_black_36dp.png66res/drawable-xxhdpi-v4/abc_ic_star_half_black_48dp.png88res/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.png22res/drawable-xxhdpi-v4/abc_list_focused_holo.9.png66res/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.png77res/drawable-xxhdpi-v4/abc_list_pressed_holo_dark.9.png88res/drawable-xxhdpi-v4/abc_list_pressed_holo_light.9.pngAAres/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_dark.9.pngBBres/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_light.9.png==res/drawable-xxhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png;;res/drawable-xxhdpi-v4/abc_popup_background_mtrl_mult.9.png>>res/drawable-xxhdpi-v4/abc_scrubber_control_off_mtrl_alpha.pngCCres/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.pngCCres/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png<जिजà¥à¤žà¤¾à¤¸à¤¾ पेस गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥Dजिजà¥à¤žà¤¾à¤¸à¤¾à¤•ो खोज गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ "थप विकलà¥à¤ªà¤¹à¤°à¥‚:निषà¥à¤•à¥à¤°à¤¿à¤¯ पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥4पà¥à¤°à¤¶à¥â€à¤¨ हटाउनà¥à¤¹à¥‹à¤¸à¥ भà¥à¤µà¤¾à¤‡à¤¸ खोजी+माथि खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥:संकà¥à¤·à¤¿à¤ªà¥à¤¤ पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥.सकà¥à¤°à¤¿à¤¯ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥(सबै हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ समà¥à¤ªà¤¨à¥à¤¨ भयो7साà¤à¥‡à¤¦à¤¾à¤°à¥€ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥...=%sతో భాగసà±à°µà°¾à°®à±à°¯à°‚ చేయండిCà°…à°¨à±à°µà°°à±à°¤à°¨à°¾à°¨à±à°¨à°¿ à°Žà°‚à°šà±à°•ోండి "à°…à°¨à±à°¨à±€ చూడండిఆనౠచేయిఆఫౠచేయి à°•à±à°¦à°¿à°‚à°šà°‚à°¡à°¿ పూరà±à°¤à°¯à°¿à°‚ది8పైకి నావిగేటౠచేయండి.à°ªà±à°°à°¶à±à°¨ శోధించండి4à°ªà±à°°à°¶à±à°¨à°¨à°¿ సమరà±à°ªà°¿à°‚à°šà±;à°ªà±à°°à°¶à±à°¨à°¨à± à°•à±à°²à°¿à°¯à°°à± చేయి+మరినà±à°¨à°¿ ఎంపికలౠవాయిసౠశోధనAవీరితో భాగసà±à°µà°¾à°®à±à°¯à°‚ చేయివెతà±à°•à± వెతà±à°•à±...à°¸à±à°ªà±‡à°¸à±Aహోమà±â€Œà°•ౠనావిగేటౠచేయండి999+AANAFAlt+Ctrl+Deel met Deel met %sDien navraag inFunksie+Kies 'n programKieslys+KlaarMeta+ Navigeer op Navigeer tuis Nog opsiesShift+ Sien allesSimbool+SoekSoek … Soeknavraag StemsoektogVee navraag uitVou indeleteenter spasiebalkВКЛ. Вижте вÑичкиГлаÑово търÑене Готово ЗаÑвка за търÑене ИЗКЛ.%Изберете приложение(Изпращане на заÑвката*ИзчиÑтване на заÑвката Още опции0Придвижване към „Ðачало“#Придвижване нагореСвиванеСподелÑне ÑÑŠÑ:СподелÑне ÑÑŠÑ: %sТърÑенеТърÑете…$клавиша за интервал $ข้อความค้นหาค้นหา*ค้นหาด้วยเสียงค้นหา… ดูทั้งหมด $ตัวเลือà¸à¸­à¸·à¹ˆà¸™ นำทางขึ้น*นำทางไปหน้าà¹à¸£à¸ ปิด ยุบ0ล้างข้อความค้นหา-ส่งข้อความค้นหา เปิด เมนู+เลือà¸à¹à¸­à¸› เสร็จสิ้นà¹à¸Šà¸£à¹Œà¸à¸±à¸š à¹à¸Šà¸£à¹Œà¸—าง %sHaku HakulausekeHaku…Jaa sovelluksessa %s Jakaminen:Kutista KÄYTÖSSÄLisää Lähetä kysely Näytä kaikki POIS KÄYTÖSTÄPuhehakuSiirry etusivulle Siirry ylösTyhjennä kyselyVaihto+Valikko+Valitse sovellus välilyönti-%s के साथ शेयर करें आवाज़ सरà¥à¤š0इसके साथ शेयर करेंऊपर जाà¤à¤‚8कोई à¤à¤ªà¥â€à¤²à¤¿à¤•ेशन चà¥à¤¨à¥‡à¤‚/कà¥à¤µà¥‡à¤°à¥€ सबमिट करें/कà¥â€à¤µà¥‡à¤°à¥€ साफ़ करें'खोजा जा रहा है… चालू छोटा करें(ज़à¥à¤¯à¤¾à¤¦à¤¾ विकलà¥à¤ª बंद सभी देखें सरà¥à¤š सरà¥à¤š करें सरà¥à¤š कà¥à¤µà¥‡à¤°à¥€हो गया'होम पेज पर जाà¤à¤‚&%s සමඟ බෙද෠ගන්නඅවසà·à¶± වූ2ඉහලට සංචà·à¶½à¶±à¶º කරන්න 'à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶šà¶ºà·’-à¶šà·Šâ€à¶»à·’යà·à·€à·’රහිතයි5ගෙදරට සංචà·à¶½à¶±à¶º කරන්න තවත් විකල්පමකන්න(යෙදුමක් à¶­à·à¶»à¶±à·Šà¶±/විමසුම යොමු කරන්න/විමසුම හිස් කරන්න "සමඟ බෙදà·à¶œà¶±à·Šà¶± "සියල්ල බලන්නසෙවීම %සෙවුම් විමසුමසොයන්න සොයන්න...හකුළන්නහඬ සෙවීමBẬT Chia sẻ vá»›iChia sẻ vá»›i %sChá»n má»™t ứng dụng Gá»­i truy vấn Thu gá»n Tìm kiếmTìm kiếm bằng giá»ng nóiTìm kiếm truy vấn Tìm kiếm… Tùy chá»n khácTẮT Xem tất cảXong Xóa truy vấn phím cáchÄiá»u hướng lên trên!Äiá»u hướng vá» trang chá»§*%s қолданбаÑымен бөліÑу Mәзір+ Іздеу Іздеу… Барлығын көруБаÑқа опциÑлар БөліÑу Дайын"Ð”Ð°ÑƒÑ‹Ñ Ð°Ñ€Ò›Ñ‹Ð»Ñ‹ іздеуЖоғары қозғалу(Ðегізгі бетте қозғалу Сұрақты жоюСұрақты жіберу Сұрақты іздеуТаÑалауÐ±Ð¾Ñ Ð¾Ñ€Ñ‹Ð½ ҚОСУЛЫ!Қолданбаны таңдауӨШІРУЛІВКЛУЧЕÐО Види ги Ñите'ГлаÑовно пребарувањеДвижи Ñе кон домаДвижи Ñе нагоре ИСКЛУЧЕÐО!Избери апликацијаИÑчиÑти барање Мени+ Повеќе опцииПоднеÑи барањеПребарајПребарај барање Пребарување… Собери Сподели Ñо Сподели Ñо %sвÑеленаизбриши копче Alt+ копче Ctrl+копче Function+ копче Meta+ копче Shift+ копче Sym+ копче enterHlasové vyhľadávanieHľadaÅ¥ OdoslaÅ¥ dopyt PrejsÅ¥ horePrejsÅ¥ na plochuVYPNUTÉ Vyhľadať…Vyhľadávací dopyt Vyhľadávanie VymazaÅ¥ dopytZAPNUTÉZbaliÅ¥ZdieľaÅ¥ pomocouZdieľaÅ¥ s aplikáciou %sZobraziÅ¥ vÅ¡etkoZvoľte aplikáciu medzerník odstrániťĎalÅ¡ie možnosti Інші опції ВИМК.Вибрати програмуГолоÑовий пошукЗгорнутиÐадіÑлати запитÐадіÑлати черезОчиÑтити запитПереглÑнути вÑÑ– Перейти вгору$Перейти на головний1ПоділитиÑÑ Ñ‡ÐµÑ€ÐµÐ· додаток %sПошуковий запит Пошук… УВІМК. пробілΑΠΕÎΕΡΓΟΠΟΙΗΣΗ Αναζήτηση Αναζήτηση…%ΔιαγÏαφή εÏωτήματος ΕÎΕΡΓΟΠΟΙΗΣΗ.Επιλέξτε κάποια εφαÏμογή#ΕÏώτημα αναζήτησηςΚοινή χÏήση μεΚοινή χÏήση με %s)ΠεÏισσότεÏες επιλογές)Πλοήγηση Ï€Ïος τα επάνω3Πλοήγηση στην αÏχική σελίδα ΠÏοβολή όλωνΣÏμπτυξη Τέλος#Υποβολή εÏωτήματος#Φωνητική αναζήτησηδιάστημα>999ACTIVAR Busca por vozConsulta de busca DESACTIVARDesprazarse cara arribaEscoller unha aplicaciónFeito Función +Ir á páxina de inicioMaiús +Menú + Máis opciónsSim + Ver todaseliminarespazo(%s-മായി പങàµà´•à´¿à´Ÿàµà´•7à´…à´¨àµà´µàµ‡à´·à´£à´‚ മായàµâ€Œà´•àµà´•àµà´•=à´…à´¨àµà´µàµ‡à´·à´£à´‚ സമർപàµà´ªà´¿à´•àµà´•àµà´• $ഇലàµà´²à´¾à´¤à´¾à´•àµà´•àµà´•1ഇവരàµà´®à´¾à´¯à´¿ പങàµà´•à´¿à´Ÿàµà´• "à´Žà´²àµà´²à´¾à´‚ കാണàµà´•Vഒരൠഅപàµà´²à´¿à´•àµà´•േഷൻ തിരഞàµà´žàµ†à´Ÿàµà´•àµà´•àµà´• à´“à´«àµഓൺ7കൂടàµà´¤àµ½â€ à´“à´ªàµâ€Œà´·à´¨àµà´•à´³àµâ€ à´šàµà´°àµà´•àµà´•àµà´•തിരയàµà´•തിരയàµà´•…തിരയൽ(തിരയൽ à´…à´¨àµà´µàµ‡à´·à´£à´‚ 'പൂർതàµà´¤à´¿à´¯à´¾à´•àµà´•à´¿ à´«à´‚à´—àµà´·à´¨àµâ€+Uà´®àµà´•ളിലേകàµà´•ൠനാവിഗേറàµà´±àµà´šàµ†à´¯àµà´¯àµà´• മെനàµ+മെറàµà´±+ à´¶à´¬àµà´¦à´¤à´¿à´°à´¯àµ½ à´¸àµâ€Œà´ªàµ†à´¯àµâ€Œà´¸àµRഹോമിലേകàµà´•ൠനാവിഗേറàµà´±àµà´šàµ†à´¯àµà´¯àµà´•Alles weergeven Delen met Delen met %sEen app selecteren Functie +GereedGesproken zoekopdracht Meer optiesMenu +Navigeren naar startpositieOmhoog navigeren SamenvouwenUITZoeken Zoeken… ZoekopdrachtZoekopdracht verzendenZoekopdracht wissenspatie verwijderen Funkcyjny+GotowePrzejdź do strony głównej Przejdź wyżejSzukaj Szukaj…UdostÄ™pnij dlaUdostÄ™pnij przez: %sWYÅ. WiÄ™cej opcjiWybierz aplikacjÄ™Wyczyść zapytanieWyszukiwane hasÅ‚oWyszukiwanie gÅ‚osoweWyÅ›lij zapytanieWÅ.Zobacz wszystkieZwiÅ„spacja Deljenje z%%Deljenje z drugimi prek aplikacije %sGlasovno iskanje IZKLOPLJENOIskalna poizvedbaIskanje Iskanje …Izbira aplikacijeIzbris poizvedbeKonÄanoKrmarjenje domovKrmarjenje navzgorMeni + Pokaži vsePoÅ¡iljanje poizvedbeStrni VKLOPLJENO VeÄ možnosti preslednicaHigit pang mga opsyonI-OFFI-ONI-clear ang query I-collapseIbahagi gamit ang %sIbahagi sa/kayIsumite ang queryMag-navigate pataasMag-navigate patungo sa homeMaghanap Maghanap…Paghahanap gamit ang bosesPumili ng isang appQuery sa paghahanapTapos na Tingnan lahat Function+Sym+space áˆáˆ‰áŠ•áˆ á‹­áˆ˜áˆáŠ¨á‰± መተáŒá‰ áˆªá‹« á‹­áˆáˆ¨áŒ¡መጠይቅ አጽዳ መጠይቅ ያስረክቡ áˆáŠ“áˆŒ+ ሰርá‹ ሰብስብ በርቷáˆተከናá‹áŠ—áˆ ተጨማሪ አማራጮች ከ%s ጋር አጋራ #ከሚከተለዠጋር ያጋሩ ወደ ላይ ይዳስሱ ወደ መáŠáˆ» ይዳስሱየድáˆá… áለጋየáለጋ ጥያቄ ጠáቷሠáˆáˆáŒ áˆáˆáŒâ€¦ áለጋ0ការស្វែងរក​សំឡáŸáž„*ចែករំលែក​ជាមួយ3ចែក​រំលែក​ជា​មួយ %s0ជម្រើស​ច្រើន​ទៀáž0ជ្រើស​កម្មវិធី​​3ដាក់​​​ស្នើ​សំណួរបង្រួម បិទ បើក !មើល​ទាំងអស់ $រកមើល​ទៅ​ដើម !រកមើល​ឡើងលើរួចរាល់ $សម្អាážâ€‹ážŸáŸ†ážŽáž½ážšស្វែងរក 'ស្វែងរក​សំណួរស្វែងរក…6%s à¦à¦° সাথে শেয়ার করà§à¦¨ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨... আরও বিকলà§à¦ª?উপরের দিকে নেভিগেট করà§à¦¨Kà¦à¦•টি অà§à¦¯à¦¾à¦ªà§à¦²à¦¿à¦•েশান বেছে নিন3à¦à¦° সাথে শেয়ার করà§à¦¨.কà§à¦¯à§‹à¦¯à¦¼à¦¾à¦°à§€ খà§à¦à¦œà§à¦¨/কà§à¦¯à§‹à¦¯à¦¼à¦¾à¦°à§€ জমা দিন2কà§à¦¯à§‹à¦¯à¦¼à¦¾à¦°à§€ সাফ করà§à¦¨খà§à¦à¦œà§à¦¨ চালà§ বনà§à¦§+ভয়েস অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨মà§à¦›à§à¦¨ %সঙà§à¦•à§à¦šà¦¿à¦¤ করà§à¦¨ "সবগà§à¦²à§‹ দেখà§à¦¨(সমà§à¦ªà¦¨à§à¦¨ হয়েছেসà§à¦ªà§‡à¦¸0হোম ঠনেভিগেট করà§à¦¨AKTIFBagikan dengan Bagikan ke %sCiutkan Hapus kueri Kirim kueriKueri penelusuran Lihat semuaNONAKTIFNavigasi ke beranda Navigasi naik Opsi lainPenelusuran suaraPilih aplikasiSelesaiTelusuri Telusuri...spasi7%s ನೊಂದಿಗೆ ಹಂಚಿಕೊಳà³à²³à²¿ ಆನà³ ಆಫà³1ಇನà³à²¨à²·à³à²Ÿà³ ಆಯà³à²•ೆಗಳà³:ಇವರೊಂದಿಗೆ ಹಂಚಿಕೊಳà³à²³à²¿(ಎಲà³à²²à²µà²¨à³à²¨à³‚ ನೋಡಿGಒಂದೠಅಪà³à²²à²¿à²•ೇಶನೠಆಯà³à²•ೆಮಾಡಿ %ಧà³à²µà²¨à²¿ ಹà³à²¡à³à²•ಾಟFಪà³à²°à²¶à³à²¨à³†à²¯à²¨à³à²¨à³ ತೆರವà³à²—ೊಳಿಸà³:ಪà³à²°à²¶à³à²¨à³†à²¯à²¨à³à²¨à³ ಸಲà³à²²à²¿à²¸à³7ಪà³à²°à²¶à³à²¨à³†à²¯à²¨à³à²¨à³ ಹà³à²¡à³à²•ಿMಮà³à²–ಪà³à²Ÿà²µà²¨à³à²¨à³ ನà³à²¯à²¾à²µà²¿à²—ೇಟೠಮಾಡಿಮà³à²—ಿದಿದೆAಮೇಲಕà³à²•ೆ ನà³à²¯à²¾à²µà²¿à²—ೇಟೠಮಾಡಿಸಂಕà³à²šà²¿à²¸à³ಹà³à²¡à³à²•ಿಹà³à²¡à³à²•ಿ…%s-тай хуваалцах Ðпп ÑонгохÐÑуулгыг илгÑÑÑ…!ÐÑуулгыг цÑвÑрлÑÑ… Бүгдийг харахДууÑÑан Дуут хайлт ДÑÑш шилжихИДЭВХГҮЙИДЭВХТЭЙ Мета+!ÐÑмÑлт Ñонголтууд)Ðүүр Ñ…ÑƒÑƒÐ´Ð°Ñ Ñ€ÑƒÑƒ шилжих Функц+ ХайлтХайх Хайх аÑуулга Хайх... Хуваалцах ХумихЦÑÑ+зайоруулах уÑтгах %s와(ê³¼) 공유검색 검색... 검색어검색어 보내기검색어 ì‚­ì œ 공유 대ìƒ사용 사용 안함ì‚­ì œ스페ì´ìŠ¤ë°” 앱 ì„ íƒ옵션 ë”보기완료 위로 íƒìƒ‰ ìŒì„± 검색ìž…ë ¥ ì „ì²´ 보기접기 홈 íƒìƒ‰ $àºàº±àºšà»„ປໜ້າຫຼັàºຂຶ້ນເທິງຊອàºàº«àº² $ຊອàºàº«àº²àº”້ວàºàºªàº½àº‡ ປິດ-ລຶບຂà»à»‰àº„ວາມຊອàºàº«àº² $ສົ່ງàºàº²àº™àºŠàº­àºàº«àº² ຫàºà»à»‰ $ເບິ່ງທັງຫມົດ ເປີດ ເລືອàºà»àº­àº±àºšàº¯ à»àºšà»ˆàº‡àº›àº±àº™àºàº±àºš$à»àºšà»ˆàº‡àº›àº±àº™àº”້ວຠ%sà»àº¥à»‰àº§à»† !ໂຕເລືອàºàº­àº·à»ˆàº™AfiÈ™aÈ›i-le pe toateAlegeÈ›i o aplicaÈ›ieCăutare vocală CăutaÈ›i CăutaÈ›i… DEZACTIVAÈšI FuncÈ›ie+Interogare de căutareMai multe opÈ›iuniMeniu+NavigaÈ›i la ecranul de pornireNavigaÈ›i în sus RestrângeÈ›iTerminatTrimiteÈ›i folosind %sTrimiteÈ›i interogarea TrimiteÈ›i laspaÈ›iuȘtergeÈ›i interogareaAKTIV Dërgo pyetjen Funksioni+JOAKTIV Kërkim me zëKërko Kërko pyetjen Kërko...Menyja+ Ndaje me %s Ngjitu lartOpsione të tjeraOrientohu për në shtëpiPastro pyetjenShikoji të gjithaShpalosShpërnda publikisht meU krye!Zgjidh një aplikacion hapësirëإرسال طلب البحث إيقا٠اختيار تطبيق البحث البحث الصوتيالتنقل إلى أعلى1التنقل إلى الشاشة الرئيسيةالقائمة+بحث بحث… تشغيل تصغيرتم خيارات إضاÙية طلب البحثعرض الكل محو طلب البحث مشاركة مع مشاركة مع %sOK Partager avec Rechercher…Sélectionner une application Tout afficherDijeli putem aplikacije %s Dijeljenje saDodatne opcije ISKLJUÄŒENOIdi goreIdi na poÄetnu IzbriÅ¡i upitOdabir aplikacije Pretražite… PretraživanjeSažmi UKLJUÄŒENOUpit za pretraživanje %s सह शेअर कराspacebar अधिक परà¥à¤¯à¤¾à¤¯à¤à¤‚टर करा #à¤à¤• अâ€à¥…प निवडा,कà¥à¤µà¥‡à¤°à¥€ सबमिट करा8कà¥â€à¤µà¥‡à¤°à¥€ सà¥â€à¤ªà¤·à¥â€à¤Ÿ करा पूरà¥à¤£ à¤à¤¾à¤²à¥‡ मेनू+2यांचà¥à¤¯à¤¾à¤¸à¤¹ शेअर करा/वर नेवà¥â€à¤¹à¤¿à¤—ेट करा वà¥à¤¹à¥‰à¤‡à¤¸ शोध शोध शोध कà¥à¤µà¥‡à¤°à¥€ शोधाशोधा… %संकà¥à¤·à¤¿à¤ªà¥à¤¤ करासरà¥à¤µ पहा हटवा8होमवर नेवà¥â€à¤¹à¤¿à¤—ेट करा ९९९+2%s ସହ ଶେୟାରà­â€ କରନà­à¬¤à­ ଅଧିକ ବିକଳà­à¬ª ଅନà­ ଅଫà­;ଉପରକୠନେଭିଗେଟୠକରନà­à¬¤à­à¬à¬£à­à¬Ÿà¬°à­Bà¬à¬¹à¬¾à¬™à­à¬• ସହ ଶେୟାରà­â€Œ କରନà­à¬¤à­2କà­à­±à­‡à¬°à­€ ଖାଲି କରନà­à¬¤à­2କà­à­±à­‡à¬°à­€ ଦାଖଲ କରନà­à¬¤à­2ଗୋଟିଠଆପà­â€ ବାଛନà­à¬¤à­ ଛୋଟ କରନà­à¬¤à­ଡିଲିଟà­â€ "ଭà¬à¬¸à­â€Œ ସରà­à¬šà­à¬š ମେନୠସବୠଦେଖନà­à¬¤à­ %ସରà­à¬šà­à¬š କରନà­à¬¤à­ %ସରà­à¬šà­à¬š କà­à­±à­‡à¬°à­€ସରà­à¬šà­à¬šâ€¦ସà­à¬ªà­‡à¬¸à­â€ହୋଇଗଲାNହୋମୠପେଜà­â€à¬•ୠନେଭିଗେଟୠକରନà­à¬¤à­ Још опција БриÑање упита!ГлаÑовна претрага Дели Ñа+Дељење Ñа апликацијом %sИСКЉУЧИИзбор апликацијеКретање нагоре"Одлазак на ПочетнуПретрагаПретражи Претражите... Прикажи Ñве Скупи Слање упита УКЉУЧИУпит за претрагутаÑтер за размакBrisanje upitaDeli saDeljenje sa aplikacijom %sGlasovna pretragaGotovo ISKLJUÄŒIIzbor aplikacije JoÅ¡ opcijaKretanje nagoreMenu+Odlazak na PoÄetnuPretraga Pretraži Pretražite... Prikaži sveSkupi Slanje upitaUKLJUÄŒIUpit za pretragutaster za razmak %s ile paylaÅŸAna ekrana gitAra Arama sorgusuAra…AÇBir uygulama seçinBittiDaraltDiÄŸer seçeneklerKAPATMenü+ Sesli aramaSorguyu gönderSorguyu temizle Tümünü göster Yukarı gitboÅŸluksil Üst Karakter+İşlev+Åžununla paylaÅŸ&%s Ú©Û’ ساتھ اشتراک کریںAlt+‎ Function+‎Menu+‎Meta+‎ Shift+‎Sym+‎Ø¢Ùآن Ø§Ø³ØªÙØ³Ø§Ø± تلاش کریں"Ø§Ø³ØªÙØ³Ø§Ø± جمع کرائیںØ§Ø³ØªÙØ³Ø§Ø± صا٠کریںاشتراک کریں مع اوپر نیویگیٹ کریں!ایک ایپ منتخب کریںتلاش تلاش کریں تلاش کریں… سبھی دیکھیں سکیڑیں صوتی تلاش مزید اختیارات ÛÙˆ گیا#Ûوم پر نیویگیٹ کریں>%sà§° জৰিয়তে শà§à¦¬à§‡à¦¯à¦¼à¦¾à§° কৰকCTRL+ অধিক বিকলà§à¦ªঅন কৰক %অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ কৰক(অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ কৰক…অফ কৰকHইয়াৰ জৰিয়তে শà§à¦¬à§‡à¦¯à¦¼à¦¾à§° কৰক-à¦à¦Ÿà¦¾ à¦à¦ªà§ বাছনি কৰকà¦à¦£à§à¦Ÿà¦¾à§° ওপৰলৈ যাওকNকণà§à¦ à¦§à§à¦¬à¦¨à¦¿à§° যোগেৰে সনà§à¦§à¦¾à¦¨ কৰক/গৃহ পৃষà§à¦ à¦¾à¦²à§ˆ যাওক,পà§à§°à¦¶à§à¦¨ দাখিল কৰক পà§à§°à¦¶à§à¦¨ মচকফাংশà§à¦¬à¦¨+ মচক মেটা+ মেনà§+শà§à¦¬à¦¿à¦«à§à¦Ÿ+ সংকà§à¦šà¦¿à¦¤ কৰক সকলো চাওক সনà§à¦§à¦¾à¦¨ কৰক?সনà§à¦§à¦¾à¦¨ কৰিব খোজা পà§à§°à¦¶à§à¦¨'সমà§à¦ªà¦¨à§à¦¨ কৰা হ'লসà§à¦ªà§‡à¦š ৯৯৯+Dijeli koristeći aplikaciju %s Dijeli saGlasovno pretraživanjeNavigiraj prema gore ObriÅ¡i upitOdaberite aplikaciju PoÅ¡alji upit Pretraži upit Pretraži...Traži ViÅ¡e opcijaVrati se na poÄetnu stranicu razmaknicaFn+Hlasové vyhledáváníHledatHotovo Odeslat dotazPÅ™ejít na plochu PÅ™ejít nahoruSbalit Sdílet pomocíSdílet s aplikací %s Smazat dotazVYPNUTOVybrat aplikaci Vyhledat…Vyhledávací dotaz Více možnostíZAPNUTO Zobrazit vÅ¡e mezerník+999Borrar consultaConsultaCtrl +Desplazarse hacia arribaEliminarEspacio Función +IntroIr a la pantalla de inicio Mayús +Menú +Meta +Seleccionar una aplicaciónSym +Aðgerðarlykill+ Deila með Deila með %s Fara heimFara uppFleiri valkostirHreinsa fyrirspurnKVEIKTLeitaLeitarfyrirspurnLeita…LokiðMinnkaRaddleitSLÖKKTSenda fyrirspurn Sjá alltValmynd+ Veldu forritbilsláCari Carian suaraCari…Fungsi+HIDUP Kongsi denganKongsi dengan %sKosongkan pertanyaan Lagi pilihanMATINavigasi ke atasNavigasi skrin utamaPertanyaan carian Pilih apl RuntuhkanSerah pertanyaanpadamruang AhendamineFunktsiooniklahv + HäälotsingJagamine rakendusega %s Jagamine: Kuva kõik Menüü +Navigeerimine avaekraanileNavigeerimine üles Otsige …Otsing OtsingupäringPäringu esitaminePäringu tühistamineRohkem valikuidSEES Tõstuklahv +Valige rakendusValmisVÄLJASkustutamisklahv sisestusklahvtühikALT + Altre opzioniCANCCTRL +Cancella queryCerca…Comprimi Condividi conCondividi tramite %s FUNZIONE +FineINVIO Invia queryMAIUSC +MENU +META +Query di ricercaRicercaRicerca vocaleSYM +Scegli un'applicazioneVai alla home page Vai in altoVisualizza tuttebarra spaziatriceAtliktaBendrinti naudojant!&Bendrinti naudojant programÄ… „%s“Daugiau parinkÄiųEiti į pagrindinį puslapį Eiti į viršų IeÅ¡koti... IÅ JUNGTAIÅ¡valyti užklausÄ…PaieÅ¡ka PaieÅ¡ka balsuPaieÅ¡kos užklausaPasirinkti programÄ…Pateikti užklausÄ…PeržiÅ«rÄ—ti viskÄ… Sutrauktitarpo klaviÅ¡asÄ®JUNGTI „Alt“ + „Ctrl“ + „Delete“ „Enter“ „Function“ + „Menu“ + „Meta“ + „Shift“ + „Sym“ + AKTIBATUTAAhozko bilaketaAukera gehiagoAukeratu aplikazio batBidali kontsultaBilaketa-kontsultaBilatu Bilatu… DESAKTIBATUTAEgindaEzabatu Funtzioa +Garbitu kontsulta Ikusi guztiak Joan goraJoan orri nagusiraKtrl +Maius +Menua +Partekatu %s aplikazioarekinPartekatu hauekinSartuTolestuZuriunea)%sની સાથે શેર કરોSpacebar*આની સાથે શેર કરો)ઉપર નૅવિગેટ કરો9àªàª• àªàªªà«àª²àª¿àª•ેશન પસંદ કરો,કà«àªµà«‡àª°à«€ સબમિટ કરો&કà«àªµà«‡àª°à«€ સાફ કરો ચાલૠડિલીટ કરોથઈ ગયà«àª‚ બંધબધà«àª‚ જà«àª“ મેનૂ+ વધૠવિકલà«àªªà«‹વૉઇસ શોધ શોધ કà«àªµà«‡àª°à«€ શોધોશોધો… સંકà«àªšàª¿àª¤ કરો0હોમ પર નેવિગેટ કરોBEFelfelé mozgatásHangalapú keresésKIKeresésKeresési lekérdezés Keresés…KészLekérdezés küldéseLekérdezés törlése'+Megosztás a következÅ‘ alkalmazással: %sMegosztás a következÅ‘vel:SzóközTovábbi lehetÅ‘ségekUgrás a fÅ‘oldalraVálasszon ki egy alkalmazást ÖsszecsukásÖsszes megtekintéseFn +Shift +Ввод#Выбрать приложениеГолоÑовой поиÑкДругие параметры Меню + ОТКЛ.Открыть доÑтуп5Открыть доÑтуп приложению "%s"Отправить Ð·Ð°Ð¿Ñ€Ð¾Ñ Перейти вверх-Перейти на главный Ñкран ПоиÑкПоиÑковый Ð·Ð°Ð¿Ñ€Ð¾Ñ Показать вÑе ПробелСвернутьУдалить Ð·Ð°Ð¿Ñ€Ð¾Ñ Buka konkeGoqaHambisa umbuzoImenyu+ Iyasesha...Izinketho eziningiKhetha uhlelo lokusebenzaKwenziweSesha Sula inkingaUkusesha ngezwiUmbuzo woseshoVALIWEVULIWEYabelana ne-%s Yabelana no-Zulazulela ekhayaZulazulela phezulususaAlternēšanas taustiņš +Funkcijas taustiņš +Gatavs IESLÄ’GTS IZSLÄ’GTSIesniegt vaicÄjumuIzvÄ“lieties lietotni KopÄ«got ar lietojumprogrammu %s KopÄ«got ar: MeklÄ“jiet…MeklÄ“tMeklēšana ar balsiMeklēšanas vaicÄjumsMeta taustiņš +NotÄ«rÄ«t vaicÄjumuPoga IzvÄ“lne +PÄrslÄ“gÅ¡anas taustiņš +PÄrvietoties augÅ¡up PÄrvietoties uz sÄkuma ekrÄnuSakļautSimbolu taustiņš + SkatÄ«t visuVadīšanas taustiņš + VairÄk opcijuatstarpes taustiņšdzēšanas taustiņšievadīšanas taustiņšAlt +  Ctrl + Dela med Dela med %sFler alternativ Funktion + Klart Komprimera Meny +  Meta + Navigera uppÃ¥t Röstsökning Skicka frÃ¥ga Skift +  Symbol + SökSök … SökfrÃ¥gaTa bort frÃ¥gan Visa allaVisa startsidan Välj en app blankstegreturCtrl+‎בוצע בחר ×פליקציה חיפוש חיפוש קולי חיפוש…כבויכווץ מחק ש×ילתהמקש רווח נווט לדף הבית נווט למעלה עוד ×פשרויותפועל ר××” הכל ש×ילתת חיפוש שלח ש×ילתה שתף ×¢× שתף ×¢× %s תפריט+ Angalia zoteChagua programu Chaguo zaidi Futa hojaHoja ya utafutaji IMEWASHWAIMEZIMWAKunja Nenda juu Nenda mwanzo Nimemaliza Shiriki na:Shiriki ukitumia %sTafutaTafuta kwa kutamka Tafuta…Wasilisha hojafutanafasiÔ±Õ†Õ‹Ô±ÕÕŽÔ±Ô¾Ô±ÕµÕ¬ Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€ Ô¸Õ¶Õ¿Ö€Õ¥Õ¬ Õ®Ö€Õ¡Õ£Õ«Ö€Ô¹Õ¡Ö„ÖÕ¶Õ¥Õ¬ Ô¿Õ«Õ½Õ¾Õ¥Õ¬ÕÕ¡ÕµÕ¶Õ¡ÕµÕ«Õ¶ Õ¸Ö€Õ¸Õ¶Õ¸Ö‚Õ´Õ„Ô»Ô±Õ‘ÕŽÔ±Ô¾Õ„Õ¡Ö„Ö€Õ¥Õ¬ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´Õ¨ ÕˆÖ€Õ¸Õ¶Õ¥Õ¬ÕˆÖ€Õ¸Õ¶Õ´Õ¡Õ¶ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´ ÕˆÖ€Õ¸Õ¶Õ¸Ö‚Õ´...ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ %s-Õ«Õ¶!ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´Õ¨ ÕˆÖ‚Õ²Õ²Õ¾Õ¥Õ¬ Õ¾Õ¥Ö€Ö‡ ÕˆÖ‚Õ²Õ²Õ¾Õ¥Õ¬ Õ¿Õ¸Ö‚Õ¶ ÕŠÕ¡Õ¿Ö€Õ¡Õ½Õ¿ Õ§ ÕÕ¥Õ½Õ¶Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€Õ¨ Õ¢Õ¡ÖÕ¡Õ¿ %s аркылуу бөлүшүүБардыгын көрүүБөлүшүүДаÑÑ€ Жогору Жыйнап коюу ИздөөИздөө талаптары Издөө…Колдонмо тандоо КҮЙҮК-Көбүрөөк мүмкүнчүлүктөр Талап жөнөтүү#Талаптарды тазалоо боштук Үйгө багыттооҮн аркылуу издөөӨЧҮК+%s ဖြင့် မျှá€á€±á€›á€”်á€á€±á€«á€€á€ºá€›á€”် ပိá€á€º?ပိုမိုရွေးá€á€»á€šá€ºá€…ရာများ 'ပြီးဆုံးပါပြီဖွင့်4မူလနေရာကို သွားရန်.မျှá€á€±á€–ို့ ရွေးပါ:ရှာစရာ အá€á€»á€€á€ºá€¡á€œá€€á€ºá€”ေရာYရှာစရာ အá€á€»á€€á€ºá€¡á€œá€€á€ºá€™á€»á€¬á€¸ ဖယ်ရှားရန်!_ရှာဖွေစရာ အá€á€»á€€á€ºá€¡á€œá€€á€ºá€€á€­á€¯ ပေးပို့ရန်ရှာဖွေပါ ရှာဖွေပါ... ရှာဖွေရန်Lအက်ပ်á€á€…်á€á€¯á€á€¯á€€á€­á€¯ ရွေးá€á€»á€šá€ºá€•ါ0အပေါ်သို့သွားရန်:အသံဖြင့် ရှာဖွေá€á€¼á€„်း7အားလုံးကို ကြည့်ရန် á‰á‰á‰+%s ilÉ™ paylaşınAKTİV AxtarışAxtarış sorÄŸusu Axtarış...Bununla paylaşınDEAKTİVDigÉ™r variantlarEvÉ™ naviqasiya et Funksiya+Hamısına baxın HazırdırMenyu+SorÄŸunu göndÉ™rinSorÄŸunu tÉ™mizlÉ™ SÉ™sli axtarış TÉ™tbiq seçin Yuxarı get Yığışdırın daxil olunkosmossilin%s orqali ulashishBoshiga o‘tishBoshqa parametrlarDastur tanlangHammasiOvozli qidiruvO‘CHIQProbelQidirish Qidirish… Ruxsat berishSo‘rov yaratishSo‘rovni izlashSo‘rovni tozalashTayyorYONIQ Yig‘ishYuqoriga o‘tishACTIVÉ DÉSACTIVÉEffacer la requêteEnvoyer la requête Fonction+Méta+PartagerPartager avec %sPlus d'optionsRecherche en cours... RechercherRecherche vocaleRequête de rechercheRevenir en haut de la pageRevenir à l'accueilRéduireSélectionnez une applicationTerminéVoir toutes les chaînesentréeespace supprimerc#‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€Žâ€Žâ€â€â€â€Žâ€â€Žâ€â€â€â€Žâ€Žâ€â€Žâ€â€â€Žâ€â€Žâ€â€â€Žâ€â€Žâ€â€â€Žâ€Žâ€â€Žâ€â€â€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€â€â€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€ŽOFF‎â€â€Žâ€Žâ€â€Žg)‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€Žâ€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€â€Žâ€â€â€Žâ€Žâ€â€â€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€â€â€Žâ€Žâ€â€Žâ€â€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€â€Žâ€â€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€Žâ€ŽSearch‎â€â€Žâ€Žâ€â€Žo5‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€â€â€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€â€â€Žâ€â€â€â€Žâ€Žâ€â€â€â€Žâ€Žâ€Žâ€â€Žâ€â€Žâ€Žâ€â€â€Žâ€â€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€â€â€Žâ€ŽVoice search‎â€â€Žâ€Žâ€â€Žh0‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€Žâ€â€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€â€Žâ€Žâ€â€â€â€â€â€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€â€â€â€Žâ€â€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€â€â€â€â€â€ŽAlt+‎â€â€Žâ€Žâ€â€Ži1‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€Žâ€â€â€Žâ€Žâ€â€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€â€Žâ€â€Žâ€â€â€â€â€â€â€Žâ€â€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€â€â€â€Žâ€â€Žâ€Žâ€â€â€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€ŽCtrl+‎â€â€Žâ€Žâ€â€Ži1‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€Žâ€â€â€Žâ€Žâ€â€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€â€Žâ€â€â€Žâ€â€Žâ€Žâ€â€â€Žâ€â€Žâ€â€â€â€Žâ€â€Žâ€Žâ€â€â€â€â€â€â€Žâ€Žâ€â€Žâ€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€â€â€Žâ€â€ŽMenu+‎â€â€Žâ€Žâ€â€Žo7‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€Žâ€â€â€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€â€Žâ€â€â€â€â€â€Žâ€â€Žâ€Žâ€â€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€Žâ€â€â€Žâ€Žâ€â€Žâ€â€Žâ€â€â€â€â€â€Žâ€ŽNavigate up‎â€â€Žâ€Žâ€â€Žl4‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€Žâ€â€â€Žâ€â€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€â€â€â€Žâ€â€â€â€Žâ€Žâ€Žâ€â€â€â€Žâ€Žâ€Žâ€â€â€Žâ€Žâ€â€â€Žâ€â€â€â€â€â€Žâ€â€â€Žâ€â€â€â€Žâ€â€ŽCollapse‎â€â€Žâ€Žâ€â€Žq9‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€Žâ€â€â€â€â€Žâ€Žâ€Žâ€Žâ€â€â€Žâ€Žâ€â€Žâ€Žâ€â€â€â€Žâ€Žâ€Žâ€â€â€â€â€â€â€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€â€Žâ€Žâ€Žâ€â€â€Žâ€â€Žâ€â€â€Žâ€Žâ€â€â€â€â€â€Žâ€â€Žâ€Žâ€â€â€â€â€Žâ€ŽChoose an app‎â€â€Žâ€Žâ€â€Žj4‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€â€â€â€â€Žâ€â€â€Žâ€Žâ€Žâ€â€â€â€â€Žâ€â€â€â€â€Žâ€Žâ€Žâ€â€â€â€â€Žâ€â€â€Žâ€â€Žâ€â€â€Žâ€â€â€â€â€Žâ€â€Žâ€â€Žâ€Žspace‎â€â€Žâ€Žâ€â€Žq;‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€Žâ€â€Žâ€Žâ€Žâ€â€â€Žâ€â€â€Žâ€Žâ€â€Žâ€â€Žâ€Žâ€Žâ€â€â€â€â€â€Žâ€Žâ€â€Žâ€â€Žâ€â€Žâ€Žâ€â€Žâ€â€â€Žâ€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€Žâ€â€â€â€â€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€ŽSearch query‎â€â€Žâ€Žâ€â€Ž€i‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€Žâ€â€Žâ€â€â€Žâ€â€â€â€Žâ€Žâ€â€â€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€â€Žâ€â€Žâ€â€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€Žâ€â€Žâ€â€Žâ€â€Žâ€Žâ€â€Žâ€â€â€â€â€â€Žâ€â€Žâ€â€Žâ€Žâ€â€â€â€ŽShare with ‎â€â€Žâ€Žâ€â€â€Ž%s‎â€â€Žâ€Žâ€â€â€â€Žâ€Žâ€â€Žâ€Žâ€â€Žg1‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€Žâ€â€Žâ€â€â€â€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€â€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€â€Žâ€â€â€â€Žâ€â€â€ŽON‎â€â€Žâ€Žâ€â€Žo9‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€Žâ€â€Žâ€â€â€â€â€Žâ€â€â€â€â€Žâ€Žâ€â€â€â€â€â€â€Žâ€â€â€â€â€Žâ€â€Žâ€Žâ€Žâ€â€Žâ€â€Žâ€â€â€â€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€Žâ€â€Žâ€â€â€Žâ€â€Žâ€â€â€Žâ€â€Žâ€Žâ€ŽShare with‎â€â€Žâ€Žâ€â€Žq;‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€Žâ€â€â€Žâ€Žâ€Žâ€â€â€â€Žâ€Žâ€â€â€â€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€â€â€Žâ€â€Žâ€Žâ€â€â€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€â€Žâ€â€Žâ€Žâ€Žâ€â€â€â€Žâ€â€Žâ€Žâ€Žâ€â€â€Žâ€â€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€â€Žâ€ŽMore options‎â€â€Žâ€Žâ€â€Žp:‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€Žâ€â€â€Žâ€Žâ€â€â€Žâ€Žâ€â€â€â€Žâ€â€â€â€â€â€â€Žâ€â€â€â€â€â€Žâ€â€Žâ€â€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€Žâ€â€â€Žâ€â€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€ŽClear query‎â€â€Žâ€Žâ€â€Ži3‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€Žâ€â€â€â€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€â€â€â€Žâ€â€Žâ€Žâ€Žâ€â€â€â€Žâ€Žâ€â€Žâ€Žâ€â€â€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€â€â€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€â€â€â€â€Žâ€â€â€ŽDone‎â€â€Žâ€Žâ€â€Žr<‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€Žâ€â€â€â€â€â€â€â€â€Žâ€â€Žâ€â€â€â€â€â€â€â€â€Žâ€â€â€Žâ€Žâ€â€â€â€Žâ€â€â€Žâ€â€â€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€â€â€Žâ€â€â€â€Žâ€Žâ€â€â€â€Žâ€Žâ€â€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€â€ŽNavigate home‎â€â€Žâ€Žâ€â€Žo;‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€â€â€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€Žâ€Žâ€Žâ€â€Žâ€Žâ€Žâ€â€â€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€Žâ€â€â€â€Žâ€Žâ€â€â€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€Žâ€Žâ€â€â€ŽFunction+‎â€â€Žâ€Žâ€â€Žm9‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€â€â€â€Žâ€Žâ€â€â€â€â€Žâ€â€Žâ€Žâ€â€â€Žâ€â€Žâ€â€â€Žâ€â€â€â€â€â€Žâ€Žâ€â€â€â€Žâ€Žâ€â€â€â€â€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€â€â€Žâ€â€Žâ€Žâ€â€â€â€â€Žâ€â€ŽSee all‎â€â€Žâ€Žâ€â€Žk7‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€â€â€â€Žâ€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€â€Žâ€â€Žâ€Žâ€â€Žâ€â€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€Žâ€Žâ€â€Žâ€â€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€â€â€Žâ€â€Žâ€â€Žâ€â€Žâ€â€ŽMeta+‎â€â€Žâ€Žâ€â€Žm;‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€â€â€â€Žâ€â€Žâ€â€â€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€Žâ€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€Žâ€Žâ€â€Žâ€â€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€â€â€Žâ€ŽSearch…‎â€â€Žâ€Žâ€â€Žj6‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€â€â€â€Žâ€â€â€â€Žâ€â€â€Žâ€â€â€â€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€Žâ€Žâ€Žâ€â€â€â€â€â€Žâ€â€â€â€Žâ€â€Žâ€â€Žâ€â€â€â€Žâ€Žâ€â€Žâ€â€â€â€Žâ€â€â€â€â€â€â€â€Žâ€Žâ€Žâ€â€â€Ž999+‎â€â€Žâ€Žâ€â€Žl8‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€â€â€â€â€Žâ€Žâ€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€â€â€Žâ€Žâ€â€â€Žâ€Žâ€â€â€â€Žâ€â€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€Žâ€â€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€â€â€â€Žâ€â€Žâ€Žâ€ŽShift+‎â€â€Žâ€Žâ€â€Žl8‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€â€â€â€â€Žâ€Žâ€â€Žâ€â€Žâ€â€â€Žâ€Žâ€â€Žâ€â€â€â€Žâ€â€Žâ€Žâ€â€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€â€â€Žâ€â€Žâ€â€Žâ€â€Žâ€â€Žâ€Žâ€Žâ€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€Žâ€Žâ€Žâ€â€Žâ€â€ŽSearch‎â€â€Žâ€Žâ€â€Žk7‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€â€â€â€â€Žâ€Žâ€â€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€â€Žâ€â€Žâ€Žâ€â€â€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€Žâ€Žâ€â€Žâ€Žâ€â€â€â€â€Žâ€Žâ€â€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€â€â€â€Žâ€Žâ€Ženter‎â€â€Žâ€Žâ€â€Žl8‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€â€â€â€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€â€â€â€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€â€Žâ€Žâ€â€â€â€â€â€â€Žâ€Žâ€â€â€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€Žâ€Ždelete‎â€â€Žâ€Žâ€â€Žr>‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€â€â€â€â€â€Žâ€â€â€â€â€â€Žâ€Žâ€â€â€â€Žâ€â€â€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€â€Žâ€Žâ€â€Žâ€â€Žâ€â€Žâ€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€ŽSubmit query‎â€â€Žâ€Žâ€â€Žj6‎â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€â€â€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€â€â€â€â€â€â€â€â€â€â€â€â€Žâ€Žâ€â€â€â€Žâ€â€â€â€â€â€Žâ€â€Žâ€â€Žâ€â€â€Žâ€Žâ€Žâ€â€Žâ€â€Žâ€â€Žâ€â€Žâ€Žâ€â€Žâ€Žâ€â€â€â€â€â€â€â€Žâ€Žâ€â€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€â€Žâ€Žâ€Žâ€Žâ€Žâ€Žâ€â€ŽSym+‎â€â€Žâ€Žâ€â€Ž Enter éµ使用「%sã€åˆ†äº« 分享å°è±¡刪除 å‘上ç€è¦½ æäº¤æŸ¥è©¢æœå°‹ æœå°‹â€¦ æœå°‹æŸ¥è©¢æ”¶åˆ 更多é¸é … 清除查詢 ç€è¦½ä¸»é  空白éµ 語音æœå°‹鏿“‡æ‡‰ç”¨ç¨‹å¼開啟關閉 顯示全部 Delete é”® Enter é”®使用%s分享关闭 分享方å¼完æˆå¼€å¯ æäº¤æŸ¥è¯¢æœç´¢ æœç´¢â€¦ æœç´¢æŸ¥è¯¢æ”¶èµ· 更多选项 查看全部 清除查询 空格键 语音æœç´¢转到上一层级转到主å±å¹• 选择应用ATIVARCompartilhar comCompartilhar com %s ConcluídoConsulta de pesquisa DESATIVARLimpar consulta Mais opçõesNavegar para a página inicialNavegar para cimaPesquisa por voz Pesquisar Pesquisar...RecolherSelecione um appVer tudoespaçoACTIVADOBuscar Buscar… BúsquedaBúsqueda por voz Compartir conCompartir con %sContraer DESACTIVADOElige una aplicación.Eliminar la consultaEnviar consulta Función+Listo Mayúscula+ Más opcionesNavegar a la página principalNavegar hacia arribaVer todoborrarespaciointroATIVADO DESATIVADOEscolher uma aplicação Função + Partilhar comPartilhar com a aplicação %sReduzir Choose an app Clear queryCollapseDone More options Navigate home Navigate upOFFONSearch Search query Search…See all Share with Share with %s Submit query Voice search Delete éµ ç€è¦½é¦–é  空格éµ與「%sã€åˆ†äº«鏿“‡åˆ†äº«å°è±¡ ´Ücom.example.android.multiproject ä H $2@T\n~Žanimattrboolcolordimendrawableidintegerlayoutstringstyle@˜| <N_—ªÁÕéü)?Oev¡¹Êáõ 5Kb™²Êãý8Rn€žºÔêü5Pcv†Ž¤¶Éåû'ATas‡˜­¹Ñè%DUew°½ÎÞõ0?GUoƒ›³ÈÕä÷2Datˆœ¾Òë  , E S d n ‚ “ ¥ ´ Ç ß   & 6 B i „ ‹ ˜ ° Ä à û  % 1 I V g p y £ ° · Â Ñ æ ù  - < J U r { ‹ ¢ ´ Í à ñ þ  7 H U i € š ¹ Ø ÷ 0B\t“¤µÈØñþ !3H]n{ޤ¹ÌÞêý(>O\n}˜½ÌÛæò 1@MYn„“¦±ÊÞò)7N\{”¶Ôô;ZyŽ–¢µÁÑÜëþ&:K^o~”¥¶Õäý$,8HSgs…ž¸Ñê0FVr‘´çFf…©Îò Op’¨Åã%Ibu‰Ÿ²ÊáùB]y¤Ðú%Gj™Áê )Eb}™ºÜõ'@Ym”¨¼Ðä$A_wµÛ(?W~¦Î÷ D a  £ È â ý %!M!v!¤!Ô!ø!("W"ˆ"¬"Ó"#2#Z##±#Ö#ö#$B$k$’$»$Ø$ö$%2%V%v%–%µ%Ô%&'&D&a&&¡&Å&è& '*'O'u'›'Å'è'(,(H(k(Ž(°(ß( )7)L)l)Œ)¬)Í)ð)*6*Y*{*š*º*ß*ý*+=+g+†+­+×+ÿ++,U,v,¢,Í,ì, -/-O-p-‹-§-Ê-î-...O.s.”.´.Û.þ./C/p/˜/´/Ë/í/0"030Y0|0—0´0Í0ì0141M1l1‹1¦1Ã1Ü1û12<2^22¡2Å2ç23!3;3`3x3ž3¾3ß3ü34>4a4€44¶4Ï4è45$5B5e5…5¦5Â5à5ø5616O6ƒ6¸6ß67%7D7g7ˆ7«7Ä7ã7 848_88¡8¾8ß8ü89D9`9~9›9º9Õ9ý9&:P:{:¤:Î:ó:;B;l;Œ;ž;¬;Í;ß;õ;<0<I<j<‰<©<Í<ä<==3=9=@=K=R=Z=`=m=‹=¢=´=É=ß=ò=>>+>:>P>h>z>‘>¬>º>Ä>ä>ê>÷>ý>???%?.?dfd”dÃdód+e[eƒe´eÙef"fLfrf”f¿fãfg6gXg„g¬gÏgüghEhehh½hÝhi$i?iaiˆi°iÉièij jDjmjŸjÎjúj4kik¢kÓkl3lgl›lÏlm3m_m”m¯mÐmñmn6nZn~n¢nÆnên o.oWoŽoÂoúo2pTp~pžpÏpýpqGqjq•q¶qßqr3rhr¥r×rsGs…s¸sóstXt‰tºtétuNu€u©uàuv/vZv„v¯vãvwFwXwvw‘wºwÜwx/xZxxšx¹xÛxýxy;yZyy§yÏyóyz*zMzkz“z³zÙzøz{8{\{{¦{Æ{ð{|7|^|†| |Å|ò|"}D}d}}ª}Õ}~,~Q~y~•~´~×~1[¸ë€I€o€Ÿ€Î€ú€'Uƒ¬×ú&‚J‚~‚ž‚Á‚Ý‚ƒ#ƒ@ƒfƒ…ƒ¤ƒÎƒëƒ„5„S„{„–„º„Õ„ù„'…M…u……½…é…† abc_fade_in abc_fade_outabc_grow_fade_in_from_bottomabc_popup_enterabc_popup_exitabc_shrink_fade_out_from_bottomabc_slide_in_bottomabc_slide_in_topabc_slide_out_bottomabc_slide_out_topabc_tooltip_enterabc_tooltip_exitactionBarDivideractionBarItemBackgroundactionBarPopupTheme actionBarSizeactionBarSplitStyleactionBarStyleactionBarTabBarStyleactionBarTabStyleactionBarTabTextStyleactionBarThemeactionBarWidgetThemeactionButtonStyleactionDropDownStyle actionLayoutactionMenuTextAppearanceactionMenuTextColoractionModeBackgroundactionModeCloseButtonStyleactionModeCloseDrawableactionModeCopyDrawableactionModeCutDrawableactionModeFindDrawableactionModePasteDrawableactionModePopupWindowStyleactionModeSelectAllDrawableactionModeShareDrawableactionModeSplitBackgroundactionModeStyleactionModeWebSearchDrawableactionOverflowButtonStyleactionOverflowMenuStyleactionProviderClassactionViewClassactivityChooserViewStylealertDialogButtonGroupStylealertDialogCenterButtonsalertDialogStylealertDialogTheme allowStackingalphaalphabeticModifiersarrowHeadLengtharrowShaftLengthautoCompleteTextViewStyleautoSizeMaxTextSizeautoSizeMinTextSizeautoSizePresetSizesautoSizeStepGranularityautoSizeTextType backgroundbackgroundSplitbackgroundStackedbackgroundTintbackgroundTintMode barLengthborderlessButtonStylebuttonBarButtonStylebuttonBarNegativeButtonStylebuttonBarNeutralButtonStylebuttonBarPositiveButtonStylebuttonBarStyle buttonGravitybuttonIconDimenbuttonPanelSideLayout buttonStylebuttonStyleSmall buttonTintbuttonTintMode checkboxStylecheckedTextViewStyle closeIconcloseItemLayoutcollapseContentDescription collapseIconcolor colorAccentcolorBackgroundFloatingcolorButtonNormalcolorControlActivatedcolorControlHighlightcolorControlNormal colorError colorPrimarycolorPrimaryDarkcolorSwitchThumbNormal commitIconcontentDescriptioncontentInsetEndcontentInsetEndWithActionscontentInsetLeftcontentInsetRightcontentInsetStartcontentInsetStartWithNavigationcontrolBackgroundcoordinatorLayoutStylecustomNavigationLayoutdefaultQueryHintdialogCornerRadiusdialogPreferredPadding dialogThemedisplayOptionsdividerdividerHorizontaldividerPaddingdividerVertical drawableSizedrawerArrowStyledropDownListViewStyledropdownListPreferredItemHeighteditTextBackground editTextColor editTextStyle elevation$$expandActivityOverflowButtonDrawablefirstBaselineToTopHeightfont fontFamilyfontProviderAuthorityfontProviderCertsfontProviderFetchStrategyfontProviderFetchTimeoutfontProviderPackagefontProviderQuery fontStylefontVariationSettings fontWeightgapBetweenBarsgoIconheighthideOnContentScrollhomeAsUpIndicator homeLayouticoniconTint iconTintModeiconifiedByDefaultimageButtonStyleindeterminateProgressStyleinitialActivityCount isLightTheme itemPaddingkeylineslastBaselineToBottomHeightlayout layout_anchorlayout_anchorGravitylayout_behaviorlayout_dodgeInsetEdgeslayout_insetEdgelayout_keyline lineHeightlistChoiceBackgroundIndicatorlistDividerAlertDialoglistItemLayout listLayoutlistMenuViewStylelistPopupWindowStylelistPreferredItemHeightlistPreferredItemHeightLargelistPreferredItemHeightSmalllistPreferredItemPaddingLeftlistPreferredItemPaddingRightlogologoDescriptionmaxButtonHeightmeasureWithLargestChildmultiChoiceItemLayoutnavigationContentDescriptionnavigationIconnavigationModenumericModifiers overlapAnchorpaddingBottomNoButtons paddingEnd paddingStartpaddingTopNoTitlepanelBackgroundpanelMenuListThemepanelMenuListWidthpopupMenuStyle popupThemepopupWindowStylepreserveIconSpacingprogressBarPaddingprogressBarStylequeryBackground queryHintradioButtonStyleratingBarStyleratingBarStyleIndicatorratingBarStyleSmallsearchHintIcon searchIconsearchViewStyle seekBarStyleselectableItemBackground""selectableItemBackgroundBorderless showAsAction showDividersshowText showTitlesingleChoiceItemLayoutspinBarsspinnerDropDownItemStyle spinnerStyle splitTrack srcCompatstate_above_anchorstatusBarBackground subMenuArrowsubmitBackgroundsubtitlesubtitleTextAppearancesubtitleTextColorsubtitleTextStylesuggestionRowLayoutswitchMinWidth switchPadding switchStyleswitchTextAppearance textAllCapstextAppearanceLargePopupMenutextAppearanceListItemtextAppearanceListItemSecondarytextAppearanceListItemSmalltextAppearancePopupMenuHeader""textAppearanceSearchResultSubtitletextAppearanceSearchResultTitletextAppearanceSmallPopupMenutextColorAlertDialogListItemtextColorSearchUrltheme thicknessthumbTextPadding thumbTint thumbTintModetickMark tickMarkTinttickMarkTintModetinttintModetitle titleMargintitleMarginBottomtitleMarginEndtitleMarginStarttitleMarginTop titleMarginstitleTextAppearancetitleTextColortitleTextStyletoolbarNavigationButtonStyle toolbarStyletooltipForegroundColortooltipFrameBackground tooltipTexttrack trackTint trackTintModettcIndexviewInflaterClass voiceIconwindowActionBarwindowActionBarOverlaywindowActionModeOverlaywindowFixedHeightMajorwindowFixedHeightMinorwindowFixedWidthMajorwindowFixedWidthMinorwindowMinWidthMajorwindowMinWidthMinor windowNoTitleabc_action_bar_embed_tabsabc_allow_stacked_button_bar abc_config_actionMenuItemAllCaps00abc_background_cache_hint_selector_material_dark11abc_background_cache_hint_selector_material_light((abc_btn_colored_borderless_text_materialabc_btn_colored_text_materialabc_color_highlight_material!!abc_hint_foreground_material_dark""abc_hint_foreground_material_light!!abc_input_method_navigation_guard++abc_primary_text_disable_only_material_dark,,abc_primary_text_disable_only_material_lightabc_primary_text_material_darkabc_primary_text_material_lightabc_search_url_textabc_search_url_text_normalabc_search_url_text_pressedabc_search_url_text_selected abc_secondary_text_material_dark!!abc_secondary_text_material_lightabc_tint_btn_checkableabc_tint_defaultabc_tint_edittextabc_tint_seek_thumbabc_tint_spinnerabc_tint_switch_trackaccent_material_darkaccent_material_light!!background_floating_material_dark""background_floating_material_lightbackground_material_darkbackground_material_light((bright_foreground_disabled_material_dark))bright_foreground_disabled_material_light''bright_foreground_inverse_material_dark((bright_foreground_inverse_material_lightbright_foreground_material_dark bright_foreground_material_lightbutton_material_darkbutton_material_light%%dim_foreground_disabled_material_dark&&dim_foreground_disabled_material_lightdim_foreground_material_darkdim_foreground_material_lighterror_color_material_darkerror_color_material_lightforeground_material_darkforeground_material_lighthighlighted_text_material_darkhighlighted_text_material_lightmaterial_blue_grey_800material_blue_grey_900material_blue_grey_950material_deep_teal_200material_deep_teal_500material_grey_100material_grey_300material_grey_50material_grey_600material_grey_800material_grey_850material_grey_900 notification_action_color_filternotification_icon_bg_colorprimary_dark_material_darkprimary_dark_material_lightprimary_material_darkprimary_material_light""primary_text_default_material_dark##primary_text_default_material_light##primary_text_disabled_material_dark$$primary_text_disabled_material_lightripple_material_darkripple_material_light$$secondary_text_default_material_dark%%secondary_text_default_material_light%%secondary_text_disabled_material_dark&&secondary_text_disabled_material_light##switch_thumb_disabled_material_dark$$switch_thumb_disabled_material_lightswitch_thumb_material_darkswitch_thumb_material_light!!switch_thumb_normal_material_dark""switch_thumb_normal_material_lighttooltip_background_darktooltip_background_light%%abc_action_bar_content_inset_material%%abc_action_bar_content_inset_with_nav&&abc_action_bar_default_height_material++abc_action_bar_default_padding_end_material--abc_action_bar_default_padding_start_material!!abc_action_bar_elevation_material--abc_action_bar_icon_vertical_padding_material,,abc_action_bar_overflow_padding_end_material..abc_action_bar_overflow_padding_start_material!!abc_action_bar_stacked_max_height$$abc_action_bar_stacked_tab_max_width..abc_action_bar_subtitle_bottom_margin_material++abc_action_bar_subtitle_top_margin_material%%abc_action_button_min_height_material$$abc_action_button_min_width_material--abc_action_button_min_width_overflow_material""abc_alert_dialog_button_bar_heightabc_alert_dialog_button_dimen$$abc_button_inset_horizontal_material""abc_button_inset_vertical_material&&abc_button_padding_horizontal_material$$abc_button_padding_vertical_material&&abc_cascading_menus_min_smallest_widthabc_config_prefDialogWidthabc_control_corner_materialabc_control_inset_materialabc_control_padding_material!!abc_dialog_corner_radius_materialabc_dialog_fixed_height_majorabc_dialog_fixed_height_minorabc_dialog_fixed_width_majorabc_dialog_fixed_width_minor))abc_dialog_list_padding_bottom_no_buttons$$abc_dialog_list_padding_top_no_titleabc_dialog_min_width_majorabc_dialog_min_width_minorabc_dialog_padding_materialabc_dialog_padding_top_material!!abc_dialog_title_divider_material abc_disabled_alpha_material_dark!!abc_disabled_alpha_material_lightabc_dropdownitem_icon_width""abc_dropdownitem_text_padding_left##abc_dropdownitem_text_padding_right##abc_edit_text_inset_bottom_material''abc_edit_text_inset_horizontal_material abc_edit_text_inset_top_materialabc_floating_window_z))abc_list_item_padding_horizontal_materialabc_panel_menu_list_width abc_progress_bar_height_material abc_search_view_preferred_heightabc_search_view_preferred_width,,abc_seekbar_track_background_height_material**abc_seekbar_track_progress_height_material((abc_select_dialog_padding_start_materialabc_switch_paddingabc_text_size_body_1_materialabc_text_size_body_2_materialabc_text_size_button_materialabc_text_size_caption_material abc_text_size_display_1_material abc_text_size_display_2_material abc_text_size_display_3_material abc_text_size_display_4_materialabc_text_size_headline_materialabc_text_size_large_materialabc_text_size_medium_material""abc_text_size_menu_header_materialabc_text_size_menu_materialabc_text_size_small_materialabc_text_size_subhead_material''abc_text_size_subtitle_material_toolbarabc_text_size_title_material$$abc_text_size_title_material_toolbar''compat_button_inset_horizontal_material%%compat_button_inset_vertical_material))compat_button_padding_horizontal_material''compat_button_padding_vertical_materialcompat_control_corner_material))compat_notification_large_icon_max_height((compat_notification_large_icon_max_widthdisabled_alpha_material_darkdisabled_alpha_material_light highlight_alpha_material_coloredhighlight_alpha_material_darkhighlight_alpha_material_lighthint_alpha_material_darkhint_alpha_material_light hint_pressed_alpha_material_dark!!hint_pressed_alpha_material_lightnotification_action_icon_sizenotification_action_text_sizenotification_big_circle_margin!!notification_content_margin_startnotification_large_icon_heightnotification_large_icon_width$$notification_main_column_padding_top notification_media_narrow_marginnotification_right_icon_size##notification_right_side_padding_top**notification_small_icon_background_padding%%notification_small_icon_size_as_largenotification_subtext_sizenotification_top_padnotification_top_pad_large_texttooltip_corner_radiustooltip_horizontal_paddingtooltip_margin##tooltip_precise_anchor_extra_offset tooltip_precise_anchor_thresholdtooltip_vertical_paddingtooltip_y_offset_non_touchtooltip_y_offset_touchabc_ab_share_pack_mtrl_alpha''abc_action_bar_item_background_materialabc_btn_borderless_materialabc_btn_check_materialabc_btn_check_to_on_mtrl_000abc_btn_check_to_on_mtrl_015abc_btn_colored_materialabc_btn_default_mtrl_shapeabc_btn_radio_materialabc_btn_radio_to_on_mtrl_000abc_btn_radio_to_on_mtrl_015abc_btn_switch_to_on_mtrl_00001abc_btn_switch_to_on_mtrl_00012abc_cab_background_internal_bgabc_cab_background_top_material!!abc_cab_background_top_mtrl_alphaabc_control_background_materialabc_dialog_material_backgroundabc_edit_text_materialabc_ic_ab_back_material""abc_ic_arrow_drop_right_black_24dpabc_ic_clear_material##abc_ic_commit_search_api_mtrl_alphaabc_ic_go_search_api_materialabc_ic_menu_copy_mtrl_am_alphaabc_ic_menu_cut_mtrl_alphaabc_ic_menu_overflow_materialabc_ic_menu_paste_mtrl_am_alpha abc_ic_menu_selectall_mtrl_alphaabc_ic_menu_share_mtrl_alphaabc_ic_search_api_materialabc_ic_star_black_16dpabc_ic_star_black_36dpabc_ic_star_black_48dpabc_ic_star_half_black_16dpabc_ic_star_half_black_36dpabc_ic_star_half_black_48dp abc_ic_voice_search_api_materialabc_item_background_holo_darkabc_item_background_holo_lightabc_list_divider_materialabc_list_divider_mtrl_alphaabc_list_focused_holoabc_list_longpressed_holoabc_list_pressed_holo_darkabc_list_pressed_holo_light11abc_list_selector_background_transition_holo_dark22abc_list_selector_background_transition_holo_light$$abc_list_selector_disabled_holo_dark%%abc_list_selector_disabled_holo_lightabc_list_selector_holo_darkabc_list_selector_holo_light abc_menu_hardkey_panel_mtrl_multabc_popup_background_mtrl_mult abc_ratingbar_indicator_materialabc_ratingbar_materialabc_ratingbar_small_material##abc_scrubber_control_off_mtrl_alpha((abc_scrubber_control_to_pressed_mtrl_000((abc_scrubber_control_to_pressed_mtrl_005abc_scrubber_primary_mtrl_alphaabc_scrubber_track_mtrl_alphaabc_seekbar_thumb_materialabc_seekbar_tick_mark_materialabc_seekbar_track_materialabc_spinner_mtrl_am_alpha))abc_spinner_textfield_background_materialabc_switch_thumb_materialabc_switch_track_mtrl_alphaabc_tab_indicator_materialabc_tab_indicator_mtrl_alphaabc_text_cursor_material%%abc_text_select_handle_left_mtrl_dark&&abc_text_select_handle_left_mtrl_light''abc_text_select_handle_middle_mtrl_dark((abc_text_select_handle_middle_mtrl_light&&abc_text_select_handle_right_mtrl_dark''abc_text_select_handle_right_mtrl_light""abc_textfield_activated_mtrl_alpha abc_textfield_default_mtrl_alpha))abc_textfield_search_activated_mtrl_alpha''abc_textfield_search_default_mtrl_alphaabc_textfield_search_materialabc_vector_test ic_launchernotification_action_backgroundnotification_bgnotification_bg_lownotification_bg_low_normalnotification_bg_low_pressednotification_bg_normalnotification_bg_normal_pressednotification_icon_backgroundnotification_template_icon_bg!!notification_template_icon_low_bgnotification_tile_bg!!notify_panel_notification_icon_bgtooltip_frame_darktooltip_frame_lightALTCTRLFUNCTIONMETASHIFTSYM action_baraction_bar_activity_contentaction_bar_containeraction_bar_rootaction_bar_spinneraction_bar_subtitleaction_bar_titleaction_containeraction_context_baraction_divider action_imageaction_menu_divideraction_menu_presenteraction_mode_baraction_mode_bar_stubaction_mode_close_button action_textactionsactivity_chooser_view_contentadd alertTitleallalwaysasync beginningblockingbottom buttonPanelcentercenter_horizontalcenter_verticalcheckbox chronometerclip_horizontal clip_verticalcollapseActionViewcontent contentPanelcustom customPaneldecor_content_parentdefault_activity_button disableHome edit_queryendexpand_activities_button expanded_menufillfill_horizontal fill_verticalfooforever group_dividerhomehomeAsUp icon_groupifRoomimageinfoitalicleftline1line3listMode list_itemmessagemiddlemultiplynevernonenormalnotification_backgroundnotification_main_column""notification_main_column_container parentPanelprogress_circularprogress_horizontalradioright right_icon right_sidescreenscrollIndicatorDownscrollIndicatorUp scrollView search_badge search_bar search_buttonsearch_close_btnsearch_edit_frame search_go_btnsearch_mag_icon search_platesearch_src_textsearch_voice_btnselect_dialog_listviewshortcut showCustomshowHomespacersplit_action_barsrc_atopsrc_insrc_overstart submenuarrow submit_areatabModetag_transition_grouptag_unhandled_key_event_managertag_unhandled_key_listenerstexttext2textSpacerNoButtonstextSpacerNoTitletimetitleDividerNoCustomtitle_templatetoptopPaneluniformupuseLogowithText wrap_contentabc_config_activityDefaultDurabc_config_activityShortDurcancel_button_image_alphaconfig_tooltipAnimTime##status_bar_notification_info_maxnumabc_action_bar_title_itemabc_action_bar_up_containerabc_action_menu_item_layoutabc_action_menu_layoutabc_action_mode_bar##abc_action_mode_close_item_materialabc_activity_chooser_view##abc_activity_chooser_view_list_item$$abc_alert_dialog_button_bar_materialabc_alert_dialog_materialabc_alert_dialog_title_materialabc_cascading_menu_item_layoutabc_dialog_title_materialabc_expanded_menu_layoutabc_list_menu_item_checkboxabc_list_menu_item_iconabc_list_menu_item_layoutabc_list_menu_item_radio!!abc_popup_menu_header_item_layoutabc_popup_menu_item_layoutabc_screen_content_includeabc_screen_simple%%abc_screen_simple_overlay_action_modeabc_screen_toolbar$$abc_search_dropdown_item_icons_2lineabc_search_viewabc_select_dialog_material abc_tooltipmainnotification_actionnotification_action_tombstone notification_template_custom_big notification_template_icon_group&¬ification_template_part_chronometernotification_template_part_timeselect_dialog_item_material""select_dialog_multichoice_material##select_dialog_singlechoice_material$$support_simple_spinner_dropdown_itemabc_action_bar_home_descriptionabc_action_bar_up_description$$abc_action_menu_overflow_descriptionabc_action_mode_done!!abc_activity_chooser_view_see_all**abc_activitychooserview_choose_applicationabc_capital_offabc_capital_onabc_font_family_body_1_materialabc_font_family_body_2_materialabc_font_family_button_material abc_font_family_caption_material""abc_font_family_display_1_material""abc_font_family_display_2_material""abc_font_family_display_3_material""abc_font_family_display_4_material!!abc_font_family_headline_materialabc_font_family_menu_material abc_font_family_subhead_materialabc_font_family_title_materialabc_menu_alt_shortcut_labelabc_menu_ctrl_shortcut_labelabc_menu_delete_shortcut_labelabc_menu_enter_shortcut_label abc_menu_function_shortcut_labelabc_menu_meta_shortcut_labelabc_menu_shift_shortcut_labelabc_menu_space_shortcut_labelabc_menu_sym_shortcut_labelabc_prepend_shortcut_labelabc_search_hint abc_searchview_description_clear abc_searchview_description_query!!abc_searchview_description_search!!abc_searchview_description_submit abc_searchview_description_voice""abc_shareactionprovider_share_with..abc_shareactionprovider_share_with_application abc_toolbar_collapse_descriptionapp_name button_sendsearch_menu_title%%status_bar_notification_info_overflowAlertDialog.AppCompatAlertDialog.AppCompat.LightAnimation.AppCompat.DialogAnimation.AppCompat.DropDownUpAnimation.AppCompat.TooltipBase.AlertDialog.AppCompat Base.AlertDialog.AppCompat.LightBase.Animation.AppCompat.Dialog##Base.Animation.AppCompat.DropDownUp Base.Animation.AppCompat.Tooltip Base.DialogWindowTitle.AppCompat**Base.DialogWindowTitleBackground.AppCompatBase.TextAppearance.AppCompat##Base.TextAppearance.AppCompat.Body1##Base.TextAppearance.AppCompat.Body2$$Base.TextAppearance.AppCompat.Button%%Base.TextAppearance.AppCompat.Caption&&Base.TextAppearance.AppCompat.Display1&&Base.TextAppearance.AppCompat.Display2&&Base.TextAppearance.AppCompat.Display3&&Base.TextAppearance.AppCompat.Display4&&Base.TextAppearance.AppCompat.Headline%%Base.TextAppearance.AppCompat.Inverse##Base.TextAppearance.AppCompat.Large++Base.TextAppearance.AppCompat.Large.Inverse::Base.TextAppearance.AppCompat.Light.Widget.PopupMenu.Large::Base.TextAppearance.AppCompat.Light.Widget.PopupMenu.Small$$Base.TextAppearance.AppCompat.Medium,,Base.TextAppearance.AppCompat.Medium.Inverse""Base.TextAppearance.AppCompat.Menu**Base.TextAppearance.AppCompat.SearchResult33Base.TextAppearance.AppCompat.SearchResult.Subtitle00Base.TextAppearance.AppCompat.SearchResult.Title##Base.TextAppearance.AppCompat.Small++Base.TextAppearance.AppCompat.Small.Inverse%%Base.TextAppearance.AppCompat.Subhead--Base.TextAppearance.AppCompat.Subhead.Inverse##Base.TextAppearance.AppCompat.Title++Base.TextAppearance.AppCompat.Title.Inverse%%Base.TextAppearance.AppCompat.Tooltip33Base.TextAppearance.AppCompat.Widget.ActionBar.Menu77Base.TextAppearance.AppCompat.Widget.ActionBar.Subtitle??Base.TextAppearance.AppCompat.Widget.ActionBar.Subtitle.Inverse44Base.TextAppearance.AppCompat.Widget.ActionBar.Title<>Base.TextAppearance.AppCompat.Widget.Button.Borderless.Colored33Base.TextAppearance.AppCompat.Widget.Button.Colored33Base.TextAppearance.AppCompat.Widget.Button.Inverse11Base.TextAppearance.AppCompat.Widget.DropDownItem55Base.TextAppearance.AppCompat.Widget.PopupMenu.Header44Base.TextAppearance.AppCompat.Widget.PopupMenu.Large44Base.TextAppearance.AppCompat.Widget.PopupMenu.Small++Base.TextAppearance.AppCompat.Widget.Switch99Base.TextAppearance.AppCompat.Widget.TextView.SpinnerItem66Base.TextAppearance.Widget.AppCompat.ExpandedMenu.Item55Base.TextAppearance.Widget.AppCompat.Toolbar.Subtitle22Base.TextAppearance.Widget.AppCompat.Toolbar.TitleBase.Theme.AppCompat Base.Theme.AppCompat.CompactMenuBase.Theme.AppCompat.Dialog!!Base.Theme.AppCompat.Dialog.Alert%%Base.Theme.AppCompat.Dialog.FixedSize$$Base.Theme.AppCompat.Dialog.MinWidth$$Base.Theme.AppCompat.DialogWhenLargeBase.Theme.AppCompat.Light((Base.Theme.AppCompat.Light.DarkActionBar!!Base.Theme.AppCompat.Light.Dialog''Base.Theme.AppCompat.Light.Dialog.Alert++Base.Theme.AppCompat.Light.Dialog.FixedSize**Base.Theme.AppCompat.Light.Dialog.MinWidth**Base.Theme.AppCompat.Light.DialogWhenLargeBase.ThemeOverlay.AppCompat%%Base.ThemeOverlay.AppCompat.ActionBar Base.ThemeOverlay.AppCompat.Dark**Base.ThemeOverlay.AppCompat.Dark.ActionBar""Base.ThemeOverlay.AppCompat.Dialog((Base.ThemeOverlay.AppCompat.Dialog.Alert!!Base.ThemeOverlay.AppCompat.LightBase.V21.Theme.AppCompatBase.V21.Theme.AppCompat.DialogBase.V21.Theme.AppCompat.Light%%Base.V21.Theme.AppCompat.Light.Dialog&&Base.V21.ThemeOverlay.AppCompat.DialogBase.V22.Theme.AppCompatBase.V22.Theme.AppCompat.LightBase.V23.Theme.AppCompatBase.V23.Theme.AppCompat.LightBase.V26.Theme.AppCompatBase.V26.Theme.AppCompat.Light!!Base.V26.Widget.AppCompat.ToolbarBase.V28.Theme.AppCompatBase.V28.Theme.AppCompat.LightBase.V7.Theme.AppCompatBase.V7.Theme.AppCompat.DialogBase.V7.Theme.AppCompat.Light$$Base.V7.Theme.AppCompat.Light.Dialog%%Base.V7.ThemeOverlay.AppCompat.Dialog--Base.V7.Widget.AppCompat.AutoCompleteTextView!!Base.V7.Widget.AppCompat.EditText Base.V7.Widget.AppCompat.ToolbarBase.Widget.AppCompat.ActionBar%%Base.Widget.AppCompat.ActionBar.Solid&&Base.Widget.AppCompat.ActionBar.TabBar''Base.Widget.AppCompat.ActionBar.TabText''Base.Widget.AppCompat.ActionBar.TabView""Base.Widget.AppCompat.ActionButton,,Base.Widget.AppCompat.ActionButton.CloseMode++Base.Widget.AppCompat.ActionButton.Overflow Base.Widget.AppCompat.ActionMode))Base.Widget.AppCompat.ActivityChooserView**Base.Widget.AppCompat.AutoCompleteTextViewBase.Widget.AppCompat.Button''Base.Widget.AppCompat.Button.Borderless//Base.Widget.AppCompat.Button.Borderless.Colored22Base.Widget.AppCompat.Button.ButtonBar.AlertDialog$$Base.Widget.AppCompat.Button.Colored""Base.Widget.AppCompat.Button.SmallBase.Widget.AppCompat.ButtonBar++Base.Widget.AppCompat.ButtonBar.AlertDialog--Base.Widget.AppCompat.CompoundButton.CheckBox00Base.Widget.AppCompat.CompoundButton.RadioButton++Base.Widget.AppCompat.CompoundButton.Switch''Base.Widget.AppCompat.DrawerArrowToggle..Base.Widget.AppCompat.DrawerArrowToggle.Common**Base.Widget.AppCompat.DropDownItem.SpinnerBase.Widget.AppCompat.EditText!!Base.Widget.AppCompat.ImageButton%%Base.Widget.AppCompat.Light.ActionBar++Base.Widget.AppCompat.Light.ActionBar.Solid,,Base.Widget.AppCompat.Light.ActionBar.TabBar--Base.Widget.AppCompat.Light.ActionBar.TabText55Base.Widget.AppCompat.Light.ActionBar.TabText.Inverse--Base.Widget.AppCompat.Light.ActionBar.TabView%%Base.Widget.AppCompat.Light.PopupMenu..Base.Widget.AppCompat.Light.PopupMenu.Overflow""Base.Widget.AppCompat.ListMenuView%%Base.Widget.AppCompat.ListPopupWindowBase.Widget.AppCompat.ListView''Base.Widget.AppCompat.ListView.DropDown##Base.Widget.AppCompat.ListView.MenuBase.Widget.AppCompat.PopupMenu((Base.Widget.AppCompat.PopupMenu.Overflow!!Base.Widget.AppCompat.PopupWindow!!Base.Widget.AppCompat.ProgressBar,,Base.Widget.AppCompat.ProgressBar.HorizontalBase.Widget.AppCompat.RatingBar))Base.Widget.AppCompat.RatingBar.Indicator%%Base.Widget.AppCompat.RatingBar.Small Base.Widget.AppCompat.SearchView**Base.Widget.AppCompat.SearchView.ActionBarBase.Widget.AppCompat.SeekBar&&Base.Widget.AppCompat.SeekBar.DiscreteBase.Widget.AppCompat.Spinner((Base.Widget.AppCompat.Spinner.Underlined**Base.Widget.AppCompat.TextView.SpinnerItemBase.Widget.AppCompat.Toolbar//Base.Widget.AppCompat.Toolbar.Button.NavigationPlatform.AppCompatPlatform.AppCompat.LightPlatform.ThemeOverlay.AppCompat$$Platform.ThemeOverlay.AppCompat.Dark%%Platform.ThemeOverlay.AppCompat.LightPlatform.V21.AppCompatPlatform.V21.AppCompat.LightPlatform.V25.AppCompatPlatform.V25.AppCompat.Light!!Platform.Widget.AppCompat.Spinner&&RtlOverlay.DialogWindowTitle.AppCompat//RtlOverlay.Widget.AppCompat.ActionBar.TitleItem,,RtlOverlay.Widget.AppCompat.DialogTitle.Icon))RtlOverlay.Widget.AppCompat.PopupMenuItem77RtlOverlay.Widget.AppCompat.PopupMenuItem.InternalGroup22RtlOverlay.Widget.AppCompat.PopupMenuItem.Shortcut66RtlOverlay.Widget.AppCompat.PopupMenuItem.SubmenuArrow..RtlOverlay.Widget.AppCompat.PopupMenuItem.Text//RtlOverlay.Widget.AppCompat.PopupMenuItem.Title++RtlOverlay.Widget.AppCompat.Search.DropDown11RtlOverlay.Widget.AppCompat.Search.DropDown.Icon111RtlOverlay.Widget.AppCompat.Search.DropDown.Icon211RtlOverlay.Widget.AppCompat.Search.DropDown.Query00RtlOverlay.Widget.AppCompat.Search.DropDown.Text..RtlOverlay.Widget.AppCompat.SearchView.MagIcon))RtlUnderlay.Widget.AppCompat.ActionButton22RtlUnderlay.Widget.AppCompat.ActionButton.OverflowTextAppearance.AppCompatTextAppearance.AppCompat.Body1TextAppearance.AppCompat.Body2TextAppearance.AppCompat.Button TextAppearance.AppCompat.Caption!!TextAppearance.AppCompat.Display1!!TextAppearance.AppCompat.Display2!!TextAppearance.AppCompat.Display3!!TextAppearance.AppCompat.Display4!!TextAppearance.AppCompat.Headline TextAppearance.AppCompat.InverseTextAppearance.AppCompat.Large&&TextAppearance.AppCompat.Large.Inverse44TextAppearance.AppCompat.Light.SearchResult.Subtitle11TextAppearance.AppCompat.Light.SearchResult.Title55TextAppearance.AppCompat.Light.Widget.PopupMenu.Large55TextAppearance.AppCompat.Light.Widget.PopupMenu.SmallTextAppearance.AppCompat.Medium''TextAppearance.AppCompat.Medium.InverseTextAppearance.AppCompat.Menu..TextAppearance.AppCompat.SearchResult.Subtitle++TextAppearance.AppCompat.SearchResult.TitleTextAppearance.AppCompat.Small&&TextAppearance.AppCompat.Small.Inverse TextAppearance.AppCompat.Subhead((TextAppearance.AppCompat.Subhead.InverseTextAppearance.AppCompat.Title&&TextAppearance.AppCompat.Title.Inverse TextAppearance.AppCompat.Tooltip..TextAppearance.AppCompat.Widget.ActionBar.Menu22TextAppearance.AppCompat.Widget.ActionBar.Subtitle::TextAppearance.AppCompat.Widget.ActionBar.Subtitle.Inverse//TextAppearance.AppCompat.Widget.ActionBar.Title77TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse33TextAppearance.AppCompat.Widget.ActionMode.Subtitle;;TextAppearance.AppCompat.Widget.ActionMode.Subtitle.Inverse00TextAppearance.AppCompat.Widget.ActionMode.Title88TextAppearance.AppCompat.Widget.ActionMode.Title.Inverse&&TextAppearance.AppCompat.Widget.Button99TextAppearance.AppCompat.Widget.Button.Borderless.Colored..TextAppearance.AppCompat.Widget.Button.Colored..TextAppearance.AppCompat.Widget.Button.Inverse,,TextAppearance.AppCompat.Widget.DropDownItem00TextAppearance.AppCompat.Widget.PopupMenu.Header//TextAppearance.AppCompat.Widget.PopupMenu.Large//TextAppearance.AppCompat.Widget.PopupMenu.Small&&TextAppearance.AppCompat.Widget.Switch44TextAppearance.AppCompat.Widget.TextView.SpinnerItem""TextAppearance.Compat.Notification''TextAppearance.Compat.Notification.Info((TextAppearance.Compat.Notification.Line2''TextAppearance.Compat.Notification.Time((TextAppearance.Compat.Notification.Title11TextAppearance.Widget.AppCompat.ExpandedMenu.Item00TextAppearance.Widget.AppCompat.Toolbar.Subtitle--TextAppearance.Widget.AppCompat.Toolbar.TitleTheme.AppCompatTheme.AppCompat.CompactMenuTheme.AppCompat.DayNight&&Theme.AppCompat.DayNight.DarkActionBarTheme.AppCompat.DayNight.Dialog%%Theme.AppCompat.DayNight.Dialog.Alert((Theme.AppCompat.DayNight.Dialog.MinWidth((Theme.AppCompat.DayNight.DialogWhenLarge$$Theme.AppCompat.DayNight.NoActionBarTheme.AppCompat.DialogTheme.AppCompat.Dialog.AlertTheme.AppCompat.Dialog.MinWidthTheme.AppCompat.DialogWhenLargeTheme.AppCompat.Light##Theme.AppCompat.Light.DarkActionBarTheme.AppCompat.Light.Dialog""Theme.AppCompat.Light.Dialog.Alert%%Theme.AppCompat.Light.Dialog.MinWidth%%Theme.AppCompat.Light.DialogWhenLarge!!Theme.AppCompat.Light.NoActionBarTheme.AppCompat.NoActionBarThemeOverlay.AppCompat ThemeOverlay.AppCompat.ActionBarThemeOverlay.AppCompat.Dark%%ThemeOverlay.AppCompat.Dark.ActionBarThemeOverlay.AppCompat.Dialog##ThemeOverlay.AppCompat.Dialog.AlertThemeOverlay.AppCompat.LightWidget.AppCompat.ActionBar Widget.AppCompat.ActionBar.Solid!!Widget.AppCompat.ActionBar.TabBar""Widget.AppCompat.ActionBar.TabText""Widget.AppCompat.ActionBar.TabViewWidget.AppCompat.ActionButton''Widget.AppCompat.ActionButton.CloseMode&&Widget.AppCompat.ActionButton.OverflowWidget.AppCompat.ActionMode$$Widget.AppCompat.ActivityChooserView%%Widget.AppCompat.AutoCompleteTextViewWidget.AppCompat.Button""Widget.AppCompat.Button.Borderless**Widget.AppCompat.Button.Borderless.Colored--Widget.AppCompat.Button.ButtonBar.AlertDialogWidget.AppCompat.Button.ColoredWidget.AppCompat.Button.SmallWidget.AppCompat.ButtonBar&&Widget.AppCompat.ButtonBar.AlertDialog((Widget.AppCompat.CompoundButton.CheckBox++Widget.AppCompat.CompoundButton.RadioButton&&Widget.AppCompat.CompoundButton.Switch""Widget.AppCompat.DrawerArrowToggle%%Widget.AppCompat.DropDownItem.SpinnerWidget.AppCompat.EditTextWidget.AppCompat.ImageButton Widget.AppCompat.Light.ActionBar&&Widget.AppCompat.Light.ActionBar.Solid..Widget.AppCompat.Light.ActionBar.Solid.Inverse''Widget.AppCompat.Light.ActionBar.TabBar//Widget.AppCompat.Light.ActionBar.TabBar.Inverse((Widget.AppCompat.Light.ActionBar.TabText00Widget.AppCompat.Light.ActionBar.TabText.Inverse((Widget.AppCompat.Light.ActionBar.TabView00Widget.AppCompat.Light.ActionBar.TabView.Inverse##Widget.AppCompat.Light.ActionButton--Widget.AppCompat.Light.ActionButton.CloseMode,,Widget.AppCompat.Light.ActionButton.Overflow))Widget.AppCompat.Light.ActionMode.Inverse**Widget.AppCompat.Light.ActivityChooserView++Widget.AppCompat.Light.AutoCompleteTextView++Widget.AppCompat.Light.DropDownItem.Spinner&&Widget.AppCompat.Light.ListPopupWindow((Widget.AppCompat.Light.ListView.DropDown Widget.AppCompat.Light.PopupMenu))Widget.AppCompat.Light.PopupMenu.Overflow!!Widget.AppCompat.Light.SearchView11Widget.AppCompat.Light.Spinner.DropDown.ActionBarWidget.AppCompat.ListMenuView Widget.AppCompat.ListPopupWindowWidget.AppCompat.ListView""Widget.AppCompat.ListView.DropDownWidget.AppCompat.ListView.MenuWidget.AppCompat.PopupMenu##Widget.AppCompat.PopupMenu.OverflowWidget.AppCompat.PopupWindowWidget.AppCompat.ProgressBar''Widget.AppCompat.ProgressBar.HorizontalWidget.AppCompat.RatingBar$$Widget.AppCompat.RatingBar.Indicator Widget.AppCompat.RatingBar.SmallWidget.AppCompat.SearchView%%Widget.AppCompat.SearchView.ActionBarWidget.AppCompat.SeekBar!!Widget.AppCompat.SeekBar.DiscreteWidget.AppCompat.Spinner!!Widget.AppCompat.Spinner.DropDown++Widget.AppCompat.Spinner.DropDown.ActionBar##Widget.AppCompat.Spinner.Underlined%%Widget.AppCompat.TextView.SpinnerItemWidget.AppCompat.Toolbar**Widget.AppCompat.Toolbar.Button.Navigation))Widget.Compat.NotificationActionContainer$$Widget.Compat.NotificationActionText Widget.Support.CoordinatorLayout@ TD „@ 0@P`p€ °        PT”'”@8T|˜´Ðì$@\x”°Ìè <Xt¬Èä8TpŒ¨Äàü4PlÐì$@\x”Èä8œ¸Ôð (D`”°Ìè „ ¼Øô , H d € œ ¸ Ô ð ( D ` | ˜ ´ Ð ì  $ @ \ x ” ° Ì è  t ¬ È ä  8 T p Œ ¨ Ä à ü 4Pl Èä4Plˆ¤ÀÜø0L°Ìè <Xt¬ÈŒ¨$”°Ìè <Xt¬Èä8TpŒ¨Äh„ ¼Øô,Hd€œ¸Ôð (D`|˜´Ðì$@˜ä8TpŒ¨Äàü4Plˆ¤ÀÜø0Lh„ ¼Øô,Hd€œ¸Ô8TpÔðTpŒ¨Äàü 4 P l ˆ ¤ À Ü ø !0!”!°!Ì!è!" "<"X"t""¬"È"ä"  @… !"#$%&'()*+,-./0123 45@6@78@9@:;@<L=>?@AJXm noB@CDEFGHI P0J@KLMNOJXm noPQRSTUVWXYZ[\]^_`abc@d@e@f@g@h@ijklm@n@op0 <Lhijƒqrs@tu@vwx@yz{|@}~@€‚ƒ„9ÿÿÿÿ…†‡BMˆ‰Š@‹Œ@Ž‘’JXm no“”•–—˜@™š@›œ P"#$'(€2€5w67pCUp€0žŸ w P2€CLUp€0  P2€CLUp€0¡¢@£¤¥¦§¨©@ª@«@¬@­@®¯°@±²³´µFMs¶·¸@¹@º@»@¼½¾@¿ÀÁÂÃ@ÄÅÆÇÈÉÊËÌÍÎÏÐÑ)?K„Ò2ILÓÔÕÖרÙÚÛÜÝÞßàáâãä@å@æçè éêëìíîïðñòóô@õ@ö÷JXm noøùúJXm noûüJXm noýþ@ÿ@@@@@     JXm noÀÀÀÀÀÀ€T`@ ÿÿÿÿÿÿÿÿTp`@ÿÿÿÿÿÿÿÿ`TTÔT¤@ 0ÿÿÿÿ@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð  !"$%& '( )!*"+#,¨ÿ- . /$0%1&2'3(4)5*6+738499: ;:<7=ÿÿÿ€>€?#@"A B C[YZÿD××ÖÿE¾¾¾€F222€G¾¾¾ÿH222ÿICpÿÿJ"WÿÿK L MÄË€fNˆ–fOOG7ÿP82&ÿQ+'!ÿRÄË€ÿSˆ–ÿTõõõÿUàààÿVúúúÿWuuuÿXBBBÿY000ÿZ!!!ÿ[ÿÿÿÿ\žžžÿ] ^8_;`5aÿÿÿÿbÞcÿÿÿMd9eÿÿÿ3fgÿÿÿ³hŠiÿÿÿ6j$kaaaÿl½½½ÿm,n-o½½½ÿpñññÿqaaaærÿÿÿæTÄT¤@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ![IT4T¤@ÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0@P`p€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!"#123456Ør € (€ € T< r@ 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàðstHu8vwxyz {|0}´~ýÿÿ€00‚$ƒ0„0…†‡ˆ‰ÐŠ@‹ŒŽ0fff‘@’@“”•033S–0š™y—˜™šš™™>›¸…>œ žŸ ¡ ¢£¤(¥¦0§@¨©ª«¬­®¯ °"±-²8³p´µ¶·¸¹º»¼½¾¿ÀÁÂÃ@Ä@Åš™™>Ƹ…>Ǹ…>ÈÍÌL>ÉÂõ=Ê?Ë\Â>Ì333?Íq= ?Î Ï Ð ÑÒ@Ó@Ô Õ^ÖרÙÚ Û ÜÝÞßàá`â!@ãäT,r@Ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒ6Tœr@X 0@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ÿÿÿÿpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿstPu@vwŠD»½TŒr@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0@ÿÿÿÿÿÿÿÿP`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿЏ0ÍÌL033s‘0ÍÌL’033s•0gfF–0fffT\r@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘0@’0š™Y•0š™9–0ö(\T,r@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×T,r@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«TLr@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑÔÕ TLr@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿu0» ½œcEEETcà@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP`ÿÿÿÿÿÿÿÿp€ °ÿÿÿÿÀÿÿÿÿÿÿÿÿÐÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0@ÿÿÿÿÿÿÿÿP`ÿÿÿÿÿÿÿÿp€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ °ÀÿÿÿÿÐàÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿ0@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP`p€ÿÿÿÿ ç1è2ë3ì4í5ò6ó7ö8÷9ø:ù;ú<ü=ÿ>? @ A B CDEFGHIJ#K$L%M'N(O*P,Q7R8S;T<UAVBåµ33Cÿÿÿ DWFXGYTðcà@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿö²Tpcà@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæ¨ë©öª÷« ¬­®¯:°Tðcà@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõ±Tðcà@xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ9cT0cà@ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ0@P`ÿÿÿÿÿÿÿÿpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿ ÿÿÿÿ°ÀÐÿÿÿÿàð 0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@P`p€ÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿ°ÀÿÿÿÿÿÿÿÿÿÿÿÿÐàðÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿ0ÿÿÿÿ@ÿÿÿÿP`p€ °ÀÐàÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿ 0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ÿÿÿÿÿÿÿÿåsétêuîvïwðxñyôzû{ý|þ}~€‚ƒ„… †‡ˆ‰Š‹ŒŽ‘ ’!“"”&•)–+—-˜.™/š0›1œ23ž4Ÿ5 6¡9¢=£>¤?¥@¦E§Tcà@ €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýgþh&iT0cà@ðÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ0@P`ÿÿÿÿÿÿÿÿpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿ ÿÿÿÿ°ÀÐÿÿÿÿàð 0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@P`p€ÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿ°ÀÿÿÿÿÿÿÿÿÿÿÿÿÐàðÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿ0ÿÿÿÿ@ÿÿÿÿP`p€ °ÀÐàÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿ 0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ÿÿÿÿÿÿÿÿå.é/ê0î1ï2ð3ñ4ô5û6ý7þ89:;<=>?@ ABCDEFGHIJKL M!N"O&P)Q+R-S.T/U0V1W2X3Y4Z5[6\9]=^>_?`@aEbTcà@ð€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýdþe&fT0cà@@ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ0@P`ÿÿÿÿÿÿÿÿpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿ ÿÿÿÿ°ÀÐÿÿÿÿàð 0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@P`p€ÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿ°ÀÿÿÿÿÿÿÿÿÿÿÿÿÐàðÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿ0ÿÿÿÿ@ÿÿÿÿP`p€ °ÀÐàÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿ 0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ÿÿÿÿÿÿÿÿå³é´êµî¶ï·ð¸ñ¹ôºû»ý¼þ½¾¿ÀÁÂÃÄÅ ÆÇÈÉÊËÌÍÎÏÐÑ Ò!Ó"Ô&Õ)Ö+×-Ø.Ù/Ú0Û1Ü2Ý3Þ4ß5à6á9â=ã>ä?å@æEçTcà@@€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýjþk&lTÐcà@àÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ0@P`ÿÿÿÿÿÿÿÿpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿ ÿÿÿÿ°ÀÐÿÿÿÿàð 0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@P`p€ÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿ°ÀÿÿÿÿÿÿÿÿÿÿÿÿÐàðÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿ0ÿÿÿÿ@ÿÿÿÿP`p€ °ÀÐàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåèééêêîëïìðíñîôïûðýñþòóôõö÷øùú ûüýþÿ !" & ) + - ./0123456Tcà@à€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýmþn&oT€cà@€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0@Pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`pÿÿÿÿ€ ÿÿÿÿ°ÀÐàðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ÿÿÿÿÿÿÿÿ@ÿÿÿÿPÿÿÿÿ`pÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéêîïðñýþ !"#$%& '( )&*)++,--..1/20Tcà@€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýpþq&r(†TÌ †l@ 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@PHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°Ô±²³´µ¶·¸¹º»¼½¾¿ÀÁýÂÃÄÅÆÇÈÉÊ$T¸h@ 0@ËÜÌ–ÍΖÏç¬ 'T` 'ð@ 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`ÐqÑrÒsÓtÔuÕvÖw×xØyÙzÚ{Û|Ü}Ý~Þ߀àá‚âƒã„ä…冿‡çˆè‰éŠê‹ëŒìíŽîïð‘ñ’ò“ó”ô•õ–ö—T 'ð@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïZTÀ 'ð@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP`pÿÿÿÿ€ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÀÿÿÿÿÕ[Ø\Ú]Ü^â_é`êaëbícîdïeôfõgT 'ð@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØoÚpT@ 'ð@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçhíiîjïkðlT 'ð@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØmT 'ð@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçn¼ +T° +@ 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð 0@P`p€ ÷¼ø½ù»úºûÃü·ý¾þ¿ÿš™™šššš˜šš š ™ ˜ ™ ®¯ô¡¥öõ¸ÁÀÆÇÄŹ À!•TÐ +@ca 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷¬ø­ù«ú¦ûªü°ý¢þ› ˜ ™ ±¯§¡¨¥õ©ž¤¡œ£Ÿ ® œ!•TÐ +@da 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷¸ø¹ùµú·û»üÂý´þÀ ˜ ™ ®¯¡¥Ãõ¿º¾½¶Á²³¼ ½!•TÐ +@fa 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ÓøÒùÖúÈûÏüÇýÌþÍ × Ø ®¯ÙÚÛÔÜÐËÑÎÉÄÊÅÆÕ É!•TÐ +@ja 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷âøãùàúåûßüáý¾þ¿ ˜ ™ >?ô¡¥ÞõèêéçëìäÝæ ç!•TÐ +@ka 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷õøóùôúòûøüîýðþú ˜ ™ þùô¡¥öõü÷ýûöÿïñí û!•TÐ +@pa 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷øùúû üý þ ˜ ™ ®¯ô¡¥öõ    !•TÐ +@ta 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷"ø'ù&ú#ûü!ýþ   $*+% () !•TÐ +@nb 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷1ø0ù.ú-û»ü:ý,þ3 ˜ ™ ®¯/¡¥;õ2647598²³¼ 5!•TÐ +@be 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷PøQùLúKûUüHýGþV < = >?@ABTCOSIMRFJDEN R!•TÐ +@de 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷qøfùpú]ûWüZý[þY X h a\_co`nbmjilkg^ed l!•TÐ +@ne 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷vø}ùyúû€üsýzþ ˜ ™ ®¯ô¡¥öõu{xtw|‚r~ t!íTÐ +@te 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷”øŠùŽú‰û…ü„ý‡þ† ˜ ™ ®¯ô¡¥“õ’‹‘Œƒˆ ‘!•TÐ +@af 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷£ø¢ù¤ú û¦üžý—þ– ˜ ™ ®¯¡¥°§Ÿ©¬ª¨œ«š›­ ¨!•TÐ +@bg 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷»ø¼ùºú´û²ü·ý¶þ± ˜ ™ ®¯ô¡¥ÂõÁ¹µÀ¸³¾¿½ À!•TÐ +@th 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ÊøÉùÈúÒûÇüÑýËþÏ ˜ ™ >?ô¡¥ÞõÐÆÍÃÄÎÅÓÔÌ Ä!•TÐ +@fi 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷áøâùÜúÙûÞüæýßþÛ ˜ ™ ®¯¡äçõå×ãÖÕÝàÙØÚ Õ!•TÐ +@hi 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ùøëùòúøûôüìýóþð ˜ ™ ®¯ô¡¥öõïî÷öíéêèñ õ!•TÐ +@si 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ÿøüùúûûüýþþý ˜ ™ ¯ô¡¥öõ  ú   !•TÐ +@vi 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷øùúûüýþ  ˜ ™ ®¯ô¡¥õ !•TÐ +@kk 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷)ø(ù$ú&û#ü0ý1þ/ ˜ ™ ®¯ô¡¥.õ "*,!+'%- !!•TÐ +@mk 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷5ø6ù;ú´û3ü8ý7þ2 E F DKGHICJ:?9>=<4AB@ =!•TÐ +@sk 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷PøOù^ú‚ûZü[ýQþV ˜ ™ ]¯ô¡¥\õRUSMNLXYW T!•TÐ +@uk 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷iøhù_ú´ûgüaý`þm ˜ ™ ®¯ô¡¥nõlfkRdbejc R!•TÐ +@el 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷zøyùxú}û{ütýoþs ˜ ™ ®¯ô¡¥€õqrup~vw| p!•TÐ +@gl 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷Šø†ùúˆûü‡ý…þ‚ < = š‰A‹‘ŽŒœ“„›¥ƒŸ ¡ ›!TÐ +@ml 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷¨ø£ù›ú¡û—ü˜ý™þš ˜ ™ •¯¢¥¥§õ¤ž“ Ÿ”¦–’œ !•TÐ +@nl 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷²ø³ù°ú®û©ü¬ýµþ– < = ¼¯­AB»C±·º¸¶¹¯ª«´ ¶!•TÐ +@pl 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷¿øÀùÆú¾ûÍüÇýÅþÌ ˜ ™ >?½¡¥ÏõÂÈÉÁËÊÃÄÎ Á!•TÐ +@sl 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ÚøÛùáúÙûÝü×ýÓþà < = >?@ABâCÜÖØÔÕÞÒÐÑß Õ!•TÐ +@tl 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ìøëùãúòûóüðýäþå ˜ ™ ®¯ô¡¥öõîæñíêïéèç í!•TÐ +@am 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷øùúÿû÷üøýþþ ˜ ™ ü¯ô¡¥öõû ù úý !•TÐ +@km 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷øùúûüýþ ˜ ™ ®¯ô¡¥öõ    !•TÐ +@bn 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷.øùú,û+ü ý'þ& ˜ ™ )¯ô¡¥-õi$"%#(!* %!qTÐ +@in 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷8ø9ù:ú=û6ü<ý7þ/ ˜ ™ ®¯ô¡¥@õ?35>4;012 >!•TÐ +@kn 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷LøNùDúMûFüGýCþB ˜ ™ ®¯ô¡¥öõQIKPJHEAO P!•TÐ +@mn 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷^øYù]úWûVüSýZþ[ ˜ ™ ih_\¥gõfcUbaTXdRe `!•TÐ +@ko 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷}øxùvúwû{üuýrþq ˜ ™ szô¡¥tõlomknypj| k!•TÐ +@lo 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷~øùŒú‹û†üˆý‚þ‡ ˜ ™ ®¯ô¡¥öõ€ƒ€€„‰Š… €!•TÐ +@ro 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷—ø˜ù•úšûüŽý’þ› ˜ ™ ®¯“¡¥žõ–‘Ÿ”œ›™ !•TÐ +@sq 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷¬øªù«ú±û®ü²ý£þ  ˜ ™ ®¯¢¡¥³õ¨§­¦¥¡¤°©¯ ¥!•TÐ +@ar 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ºø¹ùÁúÀûÃü¶ýµþ¾ ˜ ™ ®¯ô¡¥öõ»½Ä¼´¸ÅÆ¿ ·!•TÐ +@fr 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷=ø<ù7úÇûËüÊý0þ/ ˜ ™ DB34¨CõÉ1;92:È6> 9!•TÐ +@hr 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ÑøÐùÎúû#üÓýÏþ× ˜ ™ ®¯ô¡¥~õÔÒØÕxtÍÌÖ Õ!•TÐ +@mr 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ìøãùÛúàûêüÝýóþð ˜ ™ ëÜô¡¥ÚõáèßæåÞäâÙé ç!íTÐ +@or 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷øòùïúûüü÷ýñþð ˜ ™ ùóô¡¥õûÿõþýöúôîø ý!•TÐ +@sr 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ ø ùú´ûü ýþ ˜ ™ ®¯ô¡¥õ   !•TÐ +@srLatn 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷øùúû#üýþ& ˜ ™ ®¯ô¡¥(õ"' %$ !!•TÐ +@tr 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷*ø9ù2ú0û8ü/ý3þ. ˜ ™ ;¯=¡<:õ4-7,+65>)1 +!•TÐ +@ur 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷VøLùTúUûQüMýFþG @ © ®¯ACDöEBPJHOISK?R N!’TÐ +@as 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷cøaùYúoûlü_ý]þZ ˜ X g`fhjpõi\enmdb^Wk [!qTÐ +@bs 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷}øuù|úû#üwýþ& ˜ ™ ®¯ô¡¥~õzvy{xtsr$ !!•TÐ +@cs 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷„ø…ùŽú‚ûü‹ýŠþ ˜ ™ ®¯¡¥‘õŒ‰ƒ€‡ˆ† !•TÐ +@es 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷›ø–ù©ú§û¬üŸý¢þš X • —š™žœ˜ œ“”›¥žŸ ¡ ›!’TÐ +@is 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷¤ø¥ù¦ú¬û±ü³ý¯þ¨ ˜ ™ ®¯¡¡¥´õ²«§ª©°®¢£­ ©!•TÐ +@ms 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷Àø¿ù½ú=û6üÂý¾þ¹ ˜ ™ ů¸¡¥Æõ·¼ÁµÄ¶º»Ã µ!•TÐ +@et 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ÎøÏùÕúÙûÌüØýÚþÖ < = ÛÜÈA×ÝCÍÐÔÒÑÓÉËÊÇ Ñ!•TÐ +@it 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷óøôùßúèûõüòý¾þ¿ Þ á àéçíëöñìãâîœêðåæä ï!•TÐ +@lt 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ûøüùúú÷ûüýþþ        ýÿøù !•TÐ +@pt 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷‘ø’ùúŒû˜ü—ýŽþ‰ ˜ ™ ®¯ô¡¥™õ•”¥“Š‹– ”!•TÐ +@eu 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷!ø ùúûüýþ < " 'A#)C$&%( !•TÐ +@gu 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷=ø-ù7ú3û5ü.ý4þ1 ˜ ™ 2?ô¡¥+õ6;09:/8,*< :!•TÐ +@hu 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷Lø?ùKúEûOüMýAþ> ˜ ™ >?ô¡¥JõDGCBF@IHN B!•TÐ +@ru 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷\ø[ùUú´û_üSýWþ± X • >RPžQ` V]b^]ZTXYa ]!•TÐ +@zu 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷søtùhújûcüiýoþp ˜ ™ u¯ô¡¥öõfglnkemrqd k!•TÐ +@lv 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ˆø‡ùúxû‹ü|ýzþy v Œ wƒ†ŽŠ…„‚€{~}‰ €!•TÐ +@sv 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷¥ø›ù•ú—û¤ü¦ý,þ3 ‘ ’ ®¨–šž§Ÿ™¡£¢ œ“”˜  !•TÐ +@iw 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷³ø´ùµúªû·ü«ý¯þ¶ ˜ © ®?ô¡¥²õ¼®±¸¬¹­º»° ¬!•TÐ +@sw 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ÆøÅù¿úÇû½ü¾ýÃþ ˜ ™ ίô¡¥ÏõÌÀÁÊÍËÈÉÄ Ê!•TÐ +@hy 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ÞøÝùÑúßûàüÒýÐþÖ ˜ ™ >?ô¡¥áõÚ×ÙØÜÕÔÛÓ Ø!•TÐ +@ky 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ñøæùíúåûãüëýóþì ˜ ™ >?ô¡¥ðõêïéèîòäâç è!•TÐ +@my 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷úøù÷úøûüýöþù ˜ ™ ®¯ô¡¥öõýüþûôõ ÿ!TÐ +@az 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷øùúûüý þ ˜ ™ ¡¥õ      !•TÐ +@uz 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ø.ùú+û!ü ý#þ, ˜ ™ >?¡¥$õ&*)%("'- %!•TÐ +@enCA 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷¼ø½ù»úºûÃü·ý¾þ¿ ˜ ™ ®¯ô¡¥öõ¸ÁÀÆÇÄŹ À!•TÐ +@frCA 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷=ø<ù7ú@ûAü?ý0þ/ ˜ ™ DB34¨Cõ81;92:56> 9!•TÐ +@enGB 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷¼ø½ù»úºûÃü·ý¾þ¿ ˜ ™ ®¯ô¡¥öõ¸ÁÀÆÇÄŹ À!•TÐ +@enXC 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷VøKùSúUûXüMýEþQ H I _^WY\NaJZTO]`GRPL F![TÐ +@zhHK 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷nøfùlúzûtüqýsþr < = eb@ABoC±imjhgpdck h!•TÐ +@zhCN 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷‡ø†ùúzû‚üˆýxþ{ ˜ ™ uv¡¥„õ~ƒ}|…yw€ }!•TÐ +@enIN 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷¼ø½ù»úºûÃü·ý¾þ¿ ˜ ™ ®¯ô¡¥öõ¸ÁÀÆÇÄŹ À!•TÐ +@ptBR 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷‘ø’ùúŒû˜ü—ýŽþ‰ ˜ ™ ®¯ô¡¥™õ•”¥“Š‹– ”!•TÐ +@esUS 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷ªø«ù©ú§û¬ü£ý¢þš ˜ ™ ­¯¦¡¨®õ©œ¤¥žŸ ¡ ›!•TÐ +@ptPT 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷‘ø’ùúŒû˜ü²ý±þ° < = ¯³AB™C±•”¥“´µ¶ ”!•TÐ +@enAU 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷¼ø½ù»úºûÃü·ý¾þ¿ ˜ ™ ®¯ô¡¥öõ¸ÁÀÆÇÄŹ À!•TÐ +@zhTW 0@P`pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàð 0@P`p€ ÿÿÿÿÿÿÿÿ°À÷Éøfùlúzû‚üqýsþr < = Èb@ABÊC±imjhgpÌËk h!•x ZDTÌ? Z¼@ 0@P¨¸à0d¤ð@tœÄì<d¤Ìÿÿÿÿÿÿÿÿ 4tœÐø<|¤ä Lh¸à0@P`|˜´Ðø(8Tdt„¸Èð0 X h x Ð à  H p € ¸ Ä ì ü $ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ< ÔÈ`Txа€´èX¼ H”ì8 H ¬ È ä !4!\!x!ˆ!°!Ø!H"|"È"##4#\## #°#Ì#è#ø# $<$ˆ$¤$À$è$ø$ %0%@%P%x%Ð%(&°&ð&T'p'ì'(<(L(€(¬*ä,ô,@-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒ-œ-¬-Ô-ð- .(.D.`.|.˜.À.Ü.ø./™# š ¦$ É% ( )´µ*´µ+´ µ ,4Õ S[ÿÿÿÿ-ÔÖb×%Øb.>•9˜6™™šš››/ •9˜60 •:˜61 •;˜6Œÿÿÿÿ2 •<˜83 •=˜84 •>˜85 •?˜86 •@˜87 •A˜68 ˜9™Oš?›P9 •B˜6: ˜9™Oš?›P= •C˜8> ˜:™Oš?›P? •E˜6@—˜6ššA •˜8B •C •F˜D! ˜™Oš?›PE •G˜6F# ˜9™Oš?›PG •I˜6H% ˜9™Oš?›PI •J¾ ˜ÜKÓ •H˜8LÔ •H˜:MÕ •J˜6NÖ •J˜9OÙ PÛ Q¾ R/ ˜S/ ˜T¾ ˜9UF˜7V» •D˜KWÎ XÎ Y¾ ZÎ [D˜7\Ù ]Û ^_ _tC ® ,A`` a> V"W#b>     c> V"W#dó ea fC      R@S>—2gb hE V"W#iE     jE V"W#k l¢ mJ P6ÁM n£ 0,16 789 :?T™.š-«LM$OFP8TN‹oL P6ÁM pc qN V"W#r¤ 0-16 7 89 :?T™/š,‹«LM%OGP8TO‹ÿÿÿÿ  v^ mB †& ‰T á hÄ           R Ø 7 S  E ! #$ %  + 7 8 98:8;8<  @ A D" KLM$NKOFP8Q*R@S>TN]Äab$c  f)h)j% kmlŸmn6o' ‚ˆ( ‹—2˜›? œ@ @žPŸ0 0¡0°4±ô ²1³D »# ¼I ½J ¾K ÁL ÂN Ã&ÄÃË& ÌP Ú$ Ýç ÞÓ ß¼ àÓ áæ âÏ ãÐ äè å æ ûV üU ý-þbÿÿÿÿ    ‚< 1LTUWÿÿÿÿY[ª \ ® ÿÿÿÿ+ «+ .! [ÿÿÿÿ ¡ÿÿÿÿƒ¡ v^ mB †& ‰T á hÄ* , 0 .      2  > Ø 7 S 4 < ! #$ %  + 7 8 98:8;8<  @ A D" KLM%NKOGP8Q+RAS?TO]Äab$c  f)h)j% kmlŸmn6o' ‚ˆ( ‹ÿÿÿÿ—3˜›? œ@ @žPŸ0 0¡0°4±ô ²1³; »# ¼I ½J ¾K Á= ÂN Ã'ÄÃË& ÌP Ú$ ÝÊ ÞÓ ß¼ àÓ áæ âÏ ãÐ äË å æ ûV üU ý,þaÿÿÿÿ    „C 1LTUWÿÿÿÿY[ª \ ® ÿÿÿÿ+ «+ .! [ÿÿÿÿ ¡ÿÿÿÿ…J 1LTUWÿÿÿÿY[ª \ ® ÿÿÿÿ+ «+ .! [ÿÿÿÿ ¡ÿÿÿÿ    †'4D˜nÔmu—v5bG‡#4D˜nÔmbGˆ ÖØ@=0H& I‚[\¤Ôñ òøò ‰¯   123W[\dehp€´ÖÙ úÛ Šg 1R2R3R‹egÆŒ4Ì • —˜6«´SÜÿÿÿÿ¯ÔEÖØô?P€?޹ ¯Ô?@ SÜl Ô]?8º Ô?@ s Α12G €ÖÝ úß ’¯ÔehgÆ“d ”4¯ÔÚÿÿÿÿåÿÿÿÿ?X@0•r Ô–s 4â — ?@@˜r 4ã Ô™r ?0@0šÔ›x œÔ]Ô]žÔ]$ % BCÇÙ8Ûé DŸ~ 6i~ )*J8Êÿÿÿÿè¡4å ¯ÖØ¢e £&Ô¤g  2 4 ¥‚ 1R2R3R¦i §j ¨… 4Í ©k ÔEª@ «ˆ ¬üÿÿ«ÿÿÿÿ¬Ñ­u—v5bþÿÿÿ¬­®.û—¯Œ )°1û—)f±@ ² ¬üÿÿ«ÿÿÿÿ³6´™µš¶!;7<7·! $;6<6@$BGÿÿÿÿ¸! ;8<8@BGÿÿÿÿ¹ FU ¹R¿ÀÒR× %º— ` ¹¿Ò»ÖØÚÿÿÿÿ:;@<@B>¼™ ì?½©  ¯€ÔAåÿÿÿÿu—v5bþÿÿÿ¬­«ÿÿÿÿ¾› ÔB¿*4ê ÖØÀf ÁÔ]?8Âk-0,12š™?3'4» 5Å 6 789 :?@Æ AÌ BÑ CÇ DÍ EÒ TVÿÿÿÿ™.š›K-«ÅHÆLÇJÍ +7.</8O/PK~£0¤0Ãn.0-12š™?3(4» 5Å 6 7 89 :?@Æ AÌ BÑ CÇ DÍ EÒ TVÿÿÿÿ™/š›K,‹«ÅIÆMÇKÍ +7.</8O.PK~£0¤0ÄÅ¢ k †& & R Ã&Æ¢ k7 †& ' > Ã'Ë¥Ì Í³ØÎùÏØÐ÷Ñ÷Ò÷Ó‹ÿÿÿÿÔ÷ÕÖ*ØÖ‹ÿÿÿÿׂ1ØÿÿÿÿÙ ‚ƒÚ÷*ÛÖ Ø Ül ÖØÝ Þ ß à á â ã ä å æ ç è é êÏ ëÐ ìç íè î ï ð ñ ò ó! ô" õ# ö$ ÷% ø& ù' ú( û) ü* ý+ þ, ÿ- Ý . ß / 0 1 2 3 4  5  6  7  8  gë • ˜8ì ë • ˜8h9 : ; < =        > ?  A !B "C #D $E %F &H 'I ( ÿÿÿÿ)ó ÿÿÿÿ*J +K ,L -M .N /O 0P 1g 2h 3i 4j 5k 6l 7m 8n 9o :p ;q <r =s >t ?u @v Aw Bx Cy Dz E{ F| G} JPH· I€ J K‚ Lƒ M* N„ O, P… Q† R‡ S0 T U V W X Y Z& [@ \B ]ˆ ^‰ _L `R aŠ b‹ cŒ d eŽ f g h‘ i’ j“ k” l• m– n— o˜ p™ qš r› sP tQ uœ v wž xŸ yz{ÐÿT, Z¼@ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0@P`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó ó ü ý þ ÿ  TÜ Z¼@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿd@ kG Tä Z¼@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù» •¬šTø Z¼@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿD`|˜ÀÜ,TpŒ¨ÐìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌ ±Í³€´Î¶Ï´ÐµÑ±µÒµÓ±»ÿÿÿÿÔ±µÕ³*´Ö»ÿÿÿÿ×·1ؼÿÿÿÿÙ ·¸Úµ*Û³ ´ Ül ³´T Z¼@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`` Wgb Wpc WT€ Z¼@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0@P`p€ °ÀÐàðÿÿÿÿ 0@P`ÿÿÿÿpÿÿÿÿÿÿÿÿÿÿÿÿ€ °ÀÐàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð$4DTÿÿÿÿdt„ÿÿÿÿ”ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤ÿÿÿÿ´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÿÿÿÿÿÿÿÿÔpŒ(Dÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`p€¬ÿÿÿÿÿÿÿÿ¼Øèøÿÿÿÿÿÿÿÿ$ÿÿÿÿ4DÿÿÿÿÿÿÿÿÿÿÿÿTd€ÿÿÿÿÿÿÿÿÿÿÿÿ °ÀÐÿÿÿÿø(8Hÿÿÿÿp€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿ°ÿÿÿÿÀÿÿÿÿÐàð d t „ Ü ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4 D ÿÿÿÿT d ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿt ÿÿÿÿ.í/ð0ï1î2ñ3ö4õ5ô6ó7÷8ø9ù:ú;<=û>ü?ýABCDEG K LMNOPQV» •D˜8¬ WXYîZ \ ]^Q `R eS gT pU s_ !)P*N+M,O3R4S5K›ë ØÛÜö7+@HAIDlEÈf,h mnQ‚ —🇻~¼|ÃÄ\ÌÝät` /ua !)P*N+M,O3R4S5K›ë ØÛÜö7+@HAIDlEÈf,h mnQ‚ —🇻~¼|ÃÄ\ÌÝävb /wc /ŒQRŽST?8U“WÔm”X•Y–Z˜™]š_œcd¡h¢iÔm£n§’¨’©“ª´«ˆ ¬üÿÿbÿÿÿÿ­o®p¯q°Œ ±s² ¬üÿÿbÿÿÿÿ´vµw¶{»€½ƒ¿ˆÁ‹Â¥ æ Ä)P*N+M,O3R4S5KÅ¢ Æ¢ Ç.?š›5.</8P5ÈA?š›5.</8P5 þyÔUz4•\˜IT4 Z¼@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`R WgT WpU WTÌ Z¼@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾„T, Z¼@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^V eW xQ ymRyS ymRTü Z¼@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJ TÔ^X eY zV œ`a]½¾}{W œ`a]½¾}–Z˜Ó·|¸}¾„TÜ Z¼@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRßSÞTü Z¼@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§ è É.ÊATL Z¼@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ <Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^Z e[ |X QC}Y QC~f ÿÿÿÿ@ÿÿÿÿÀ\ T Z¼@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ <ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^] e^ Z aq€[ aqTð Z¼@ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ~ 6!zT i~!=ªPK€Ÿ«)?ÓøAndroidManifest.xmlþÊPK€ŸCVæ×/hres/anim/abc_fade_in.xmlPK€ŸCVæ×/hres/anim/abc_fade_out.xmlPK€Ÿk %bxT)res/anim/abc_grow_fade_in_from_bottom.xmlPK€Ÿûµ AüÒres/anim/abc_popup_enter.xmlPK€ŸJ#/ªüres/anim/abc_popup_exit.xmlPK€ŸÑgqhxT,kres/anim/abc_shrink_fade_out_from_bottom.xmlPK€ŸCVæ×/h = res/anim/abc_slide_in_bottom.xmlPK€ŸCVæ×/hº res/anim/abc_slide_in_top.xmlPK€ŸCVæ×/h!4 res/anim/abc_slide_out_bottom.xmlPK€ŸCVæ×/h² res/anim/abc_slide_out_top.xmlPK€Ÿ‚Pþ¥Ù„- res/anim/abc_tooltip_enter.xmlPK€ŸÅ ý‚Ù„R res/anim/abc_tooltip_exit.xmlPK€ŸCVæ×/h>vres/color/abc_background_cache_hint_selector_material_dark.xmlPK€Ÿ úTCæÔ?res/color/abc_background_cache_hint_selector_material_light.xmlPK€Ÿ”ºd\6dres/color/abc_btn_colored_borderless_text_material.xmlPK€ŸCVæ×/h+Úres/color/abc_btn_colored_text_material.xmlPK€ŸOš4/bres/color/abc_hint_foreground_material_dark.xmlPK€ŸÃx40Ãres/color/abc_hint_foreground_material_light.xmlPK€Ÿ2ÃPäÐ9%res/color/abc_primary_text_disable_only_material_dark.xmlPK€ŸH¼ÃäÐ:pres/color/abc_primary_text_disable_only_material_light.xmlPK€ŸóÌV4äÐ,¼res/color/abc_primary_text_material_dark.xmlPK€Ÿ‰³I§äÐ-úres/color/abc_primary_text_material_light.xmlPK€ŸFÝûúL!9res/color/abc_search_url_text.xmlPK€Ÿã³ÿåÐ.‚res/color/abc_secondary_text_material_dark.xmlPK€Ÿzœ¬läÐ/Ãres/color/abc_secondary_text_material_light.xmlPK€Ÿ/y3é2Ø$res/color/abc_tint_btn_checkable.xmlPK€Ÿ!x>¥”Ȉres/color/abc_tint_default.xmlPK€ŸÈð“•;h!res/color/abc_tint_edittext.xmlPK€Ÿ„¡/ò\!ð"res/color/abc_tint_seek_thumb.xmlPK€Ÿàø°:P$res/color/abc_tint_spinner.xmlPK€Ÿ"åÓ6#Ö%res/color/abc_tint_switch_track.xmlPK€ŸCVæ×/h(]'res/color/switch_thumb_material_dark.xmlPK€Ÿ9›EäÐ)â'res/color/switch_thumb_material_light.xmlPK€ŸѺ2ŒåÐ:)res/color-v21/abc_btn_colored_borderless_text_material.xmlPK€Ÿ#tN5óô:j*res/color-v23/abc_btn_colored_borderless_text_material.xmlPK€ŸCVæ×/h/Å+res/color-v23/abc_btn_colored_text_material.xmlPK€ŸCVæ×/h.Q,res/color-v23/abc_color_highlight_material.xmlPK€ŸI|>ñp(Ü,res/color-v23/abc_tint_btn_checkable.xmlPK€Ÿöýq`"C.res/color-v23/abc_tint_default.xmlPK€ŸÝ®ôœ#0res/color-v23/abc_tint_edittext.xmlPK€Ÿœî}ôòô%q1res/color-v23/abc_tint_seek_thumb.xmlPK€ŸÝ®ôœ"¶2res/color-v23/abc_tint_spinner.xmlPK€Ÿ©©˜'"4res/color-v23/abc_tint_switch_track.xmlPK€Ÿ?ÎØ-ýL,‘5res/drawable/abc_btn_borderless_material.xmlPK€Ÿ&”ÿøæÐ'è6res/drawable/abc_btn_check_material.xmlPK€Ÿ»ô+»X)#8res/drawable/abc_btn_colored_material.xmlPK€ŸpqT{Ф+59res/drawable/abc_btn_default_mtrl_shape.xmlPK€Ÿ©nh3çÐ';res/drawable/abc_btn_radio_material.xmlPK€Ÿ•öù±¸t/T<res/drawable/abc_cab_background_internal_bg.xmlPK€Ÿ0८P0i=res/drawable/abc_cab_background_top_material.xmlPK€ŸXÌçCÌ/u>res/drawable/abc_dialog_material_background.xmlPK€Ÿ8Ëmd'@res/drawable/abc_edit_text_material.xmlPK€Ÿ%³þÝ|´(×Ares/drawable/abc_ic_ab_back_material.xmlPK€Ÿ˜9|ììè3©Cres/drawable/abc_ic_arrow_drop_right_black_24dp.xmlPK€ŸѹaÛg¬&öEres/drawable/abc_ic_clear_material.xmlPK€ŸÜ#ÞT€.±Gres/drawable/abc_ic_go_search_api_material.xmlPK€Ÿl§ƒ….aIres/drawable/abc_ic_menu_overflow_material.xmlPK€Ÿ>F'èÃ,+BKres/drawable/abc_ic_search_api_material.xmlPK€Ÿ˜”f]È<1^Mres/drawable/abc_ic_voice_search_api_material.xmlPK€ŸCVæ×/h.…Ores/drawable/abc_item_background_holo_dark.xmlPK€ŸoQ¨<>ô/Pres/drawable/abc_item_background_holo_light.xmlPK€Ÿù|9ïà*«Qres/drawable/abc_list_divider_material.xmlPK€ŸCVæ×/hBòRres/drawable/abc_list_selector_background_transition_holo_dark.xmlPK€ŸCVæ×/hC‘Sres/drawable/abc_list_selector_background_transition_holo_light.xmlPK€ŸCVæ×/h,1Tres/drawable/abc_list_selector_holo_dark.xmlPK€Ÿ{ï´R(-ºTres/drawable/abc_list_selector_holo_light.xmlPK€ŸS×4è˜1gVres/drawable/abc_ratingbar_indicator_material.xmlPK€Ÿb7W_*À5ÙWres/drawable-v21/abc_ratingbar_indicator_material.xmlPK€ŸµI0ؘ'fYres/drawable/abc_ratingbar_material.xmlPK€ŸË“õ°*À+ÎZres/drawable-v21/abc_ratingbar_material.xmlPK€Ÿ4·g[˜-Q\res/drawable/abc_ratingbar_small_material.xmlPK€Ÿak\)À1¾]res/drawable-v21/abc_ratingbar_small_material.xmlPK€Ÿ8[¶Ø`L+F_res/drawable/abc_seekbar_thumb_material.xmlPK€Ÿ÷&ôÈö/ÿ`res/drawable/abc_seekbar_tick_mark_material.xmlPK€ŸDQŠ|¨€+Rbres/drawable/abc_seekbar_track_material.xmlPK€Ÿ¦¾Ü¹˜ˆ:Sdres/drawable/abc_spinner_textfield_background_material.xmlPK€Ÿ ¯P»çÐ*Sfres/drawable/abc_switch_thumb_material.xmlPK€Ÿ‰¹ªéÔ+’gres/drawable/abc_tab_indicator_material.xmlPK€Ÿ-‚/ñ)Ôhres/drawable/abc_text_cursor_material.xmlPK€Ÿ³g˜µ%ô.jres/drawable/abc_textfield_search_material.xmlPK€ŸBÄ@dLd kres/drawable/abc_vector_test.xmlPK€ŸCVæ×/h 7mres/drawable/notification_bg.xmlPK€ŸCVæ×/h$´mres/drawable/notification_bg_low.xmlPK€ŸCVæ×/h-5nres/drawable/notification_icon_background.xmlPK€ŸCVæ×/h%¿nres/drawable/notification_tile_bg.xmlPK€ŸÒ4€Ÿàä#Aores/drawable/tooltip_frame_dark.xmlPK€ŸCVæ×/h$rpres/drawable/tooltip_frame_light.xmlPK€Ÿ€,¶t9ópres/drawable-watch-v20/abc_dialog_material_background.xmlPK€ŸŽY(äš<rres/drawable-v21/abc_action_bar_item_background_material.xmlPK€Ÿ•±Åe&´-sres/drawable-v21/abc_btn_colored_material.xmlPK€Ÿ§«šCÌ3•ures/drawable-v21/abc_dialog_material_background.xmlPK€Ÿâš$Δ+9wres/drawable-v21/abc_edit_text_material.xmlPK€Ÿ‘tb@ö.`yres/drawable-v21/abc_list_divider_material.xmlPK€ŸCVæ×/h3²zres/drawable-v21/notification_action_background.xmlPK€ŸG¥r®04B{res/drawable-v23/abc_control_background_material.xmlPK €Ÿr#UΩ © $R|res/drawable-ldpi-v4/ic_launcher.pngPK €ŸÿÌ»•  7=‡res/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.pngPK €Ÿ°£²ˆCC5ˆres/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.pngPK €Ÿ°£²ˆCC53‰res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.pngPK €Ÿ°£²ˆCC5ɉres/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.pngPK €Ÿ°£²ˆCC5_Šres/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.pngPK €Ÿ‡ùHMM:õŠres/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.pngPK €Ÿ‡ùHMM:š‹res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.pngPK €ŸúŽUOØØ<?Œres/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.pngPK €Ÿùž9 ­­<qres/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.pngPK €Ÿ Ç……7xŽres/drawable-mdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.pngPK €Ÿpåpûû3Rres/drawable-mdpi-v4/abc_ic_menu_cut_mtrl_alpha.pngPK €ŸТy옘8žres/drawable-mdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.pngPK €Ÿmv«µ‹‹9Œ‘res/drawable-mdpi-v4/abc_ic_menu_selectall_mtrl_alpha.pngPK €Ÿ<œÜ¶5n’res/drawable-mdpi-v4/abc_ic_menu_share_mtrl_alpha.pngPK €Ÿ°£²ˆCC/Ï“res/drawable-mdpi-v4/abc_ic_star_black_16dp.pngPK €Ÿ°£²ˆCC/_”res/drawable-mdpi-v4/abc_ic_star_black_36dp.pngPK €Ÿ°£²ˆCC/ï”res/drawable-mdpi-v4/abc_ic_star_black_48dp.pngPK €Ÿ°£²ˆCC4•res/drawable-mdpi-v4/abc_ic_star_half_black_16dp.pngPK €Ÿ°£²ˆCC4–res/drawable-mdpi-v4/abc_ic_star_half_black_36dp.pngPK €Ÿ°£²ˆCC4©–res/drawable-mdpi-v4/abc_ic_star_half_black_48dp.pngPK €Ÿ$#d5§§6>—res/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.pngPK €Ÿ‡ùHMM09˜res/drawable-mdpi-v4/abc_list_focused_holo.9.pngPK €Ÿ‡ùHMM4Ô˜res/drawable-mdpi-v4/abc_list_longpressed_holo.9.pngPK €Ÿ‡ùHMM5s™res/drawable-mdpi-v4/abc_list_pressed_holo_dark.9.pngPK €Ÿ‡ùHMM6šres/drawable-mdpi-v4/abc_list_pressed_holo_light.9.pngPK €Ÿ‡ùHMM?´šres/drawable-mdpi-v4/abc_list_selector_disabled_holo_dark.9.pngPK €Ÿ‡ùHMM@^›res/drawable-mdpi-v4/abc_list_selector_disabled_holo_light.9.pngPK €Ÿ¯ßþÅ; œres/drawable-mdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.pngPK €Ÿøä«Ð9žres/drawable-mdpi-v4/abc_popup_background_mtrl_mult.9.pngPK €Ÿ°£²ˆCC<Þ¡res/drawable-mdpi-v4/abc_scrubber_control_off_mtrl_alpha.pngPK €Ÿ°£²ˆCCA{¢res/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.pngPK €Ÿ°£²ˆCCA£res/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.pngPK €Ÿ‡ùHMM:¿£res/drawable-mdpi-v4/abc_scrubber_primary_mtrl_alpha.9.pngPK €Ÿ‡ùHMM8d¤res/drawable-mdpi-v4/abc_scrubber_track_mtrl_alpha.9.pngPK €ŸNßr GG4¥res/drawable-mdpi-v4/abc_spinner_mtrl_am_alpha.9.pngPK €Ÿó?.—‹‹6 ¦res/drawable-mdpi-v4/abc_switch_track_mtrl_alpha.9.pngPK €Ÿ‡ùHMM7¨res/drawable-mdpi-v4/abc_tab_indicator_mtrl_alpha.9.pngPK €Ÿ}ȃËË>!©res/drawable-mdpi-v4/abc_text_select_handle_left_mtrl_dark.pngPK €Ÿ¾üM!ËË?Hªres/drawable-mdpi-v4/abc_text_select_handle_left_mtrl_light.pngPK €ŸY˜77@p«res/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl_dark.pngPK €Ÿ@B¼@66A­res/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl_light.pngPK €Ÿ€¢´>»»?š®res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl_dark.pngPK €ŸØåYºº@²¯res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl_light.pngPK €ŸMpÊwµµ=ʰres/drawable-mdpi-v4/abc_textfield_activated_mtrl_alpha.9.pngPK €ŸÚ&oŲ²;Ú±res/drawable-mdpi-v4/abc_textfield_default_mtrl_alpha.9.pngPK €Ÿœ ™h²²Då²res/drawable-mdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.pngPK €ŸÌ瑯²²Bù³res/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.pngPK €ŸÈñâžuu$ µres/drawable-mdpi-v4/ic_launcher.pngPK €Ÿ‡ùHMM5ÂÉres/drawable-mdpi-v4/notification_bg_low_normal.9.pngPK €Ÿ‡ùHMM6bÊres/drawable-mdpi-v4/notification_bg_low_pressed.9.pngPK €Ÿ‡ùHMM1Ëres/drawable-mdpi-v4/notification_bg_normal.9.pngPK €Ÿ‡ùHMM9ŸËres/drawable-mdpi-v4/notification_bg_normal_pressed.9.pngPK €Ÿ°£²ˆCC:CÌres/drawable-mdpi-v4/notify_panel_notification_icon_bg.pngPK €Ÿãa× >ÞÌres/drawable-ldrtl-mdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.pngPK €Ÿ9|ýý:¹Íres/drawable-ldrtl-mdpi-v17/abc_ic_menu_cut_mtrl_alpha.pngPK €Ÿ›”Ô>>;Ïres/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.pngPK €ŸŠ àà7¥Ðres/drawable-hdpi-v4/abc_ab_share_pack_mtrl_alpha.9.pngPK €Ÿ°£²ˆCC5 Òres/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_000.pngPK €Ÿ°£²ˆCC5 Òres/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_015.pngPK €Ÿ°£²ˆCC56Óres/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_000.pngPK €Ÿ°£²ˆCC5ÌÓres/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_015.pngPK €Ÿ‡ùHMM:bÔres/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.pngPK €Ÿ‡ùHMM:Õres/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.pngPK €Ÿ@`‰ââ<¬Õres/drawable-hdpi-v4/abc_cab_background_top_mtrl_alpha.9.pngPK €Ÿg>Ϋ«<èÖres/drawable-hdpi-v4/abc_ic_commit_search_api_mtrl_alpha.pngPK €Ÿû·,ÊÊ7í×res/drawable-hdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.pngPK €ŸûÅ`:””3 Ùres/drawable-hdpi-v4/abc_ic_menu_cut_mtrl_alpha.pngPK €Ÿ2Xwââ8ñÚres/drawable-hdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.pngPK €Ÿ6CŸM××9)Üres/drawable-hdpi-v4/abc_ic_menu_selectall_mtrl_alpha.pngPK €Ÿ®¤#……5WÝres/drawable-hdpi-v4/abc_ic_menu_share_mtrl_alpha.pngPK €Ÿ°£²ˆCC//ßres/drawable-hdpi-v4/abc_ic_star_black_16dp.pngPK €Ÿ°£²ˆCC/¿ßres/drawable-hdpi-v4/abc_ic_star_black_36dp.pngPK €Ÿ°£²ˆCC/Oàres/drawable-hdpi-v4/abc_ic_star_black_48dp.pngPK €Ÿ°£²ˆCC4ßàres/drawable-hdpi-v4/abc_ic_star_half_black_16dp.pngPK €Ÿ°£²ˆCC4táres/drawable-hdpi-v4/abc_ic_star_half_black_36dp.pngPK €Ÿ°£²ˆCC4 âres/drawable-hdpi-v4/abc_ic_star_half_black_48dp.pngPK €Ÿ$#d5§§6žâres/drawable-hdpi-v4/abc_list_divider_mtrl_alpha.9.pngPK €Ÿ‡ùHMM0™ãres/drawable-hdpi-v4/abc_list_focused_holo.9.pngPK €Ÿ‡ùHMM44äres/drawable-hdpi-v4/abc_list_longpressed_holo.9.pngPK €Ÿ‡ùHMM5Óäres/drawable-hdpi-v4/abc_list_pressed_holo_dark.9.pngPK €Ÿ‡ùHMM6såres/drawable-hdpi-v4/abc_list_pressed_holo_light.9.pngPK €Ÿ‡ùHMM?æres/drawable-hdpi-v4/abc_list_selector_disabled_holo_dark.9.pngPK €Ÿ‡ùHMM@¾æres/drawable-hdpi-v4/abc_list_selector_disabled_holo_light.9.pngPK €ŸG(\2ââ;içres/drawable-hdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.pngPK €Ÿ3 ‚=JJ9¤êres/drawable-hdpi-v4/abc_popup_background_mtrl_mult.9.pngPK €Ÿ°£²ˆCC<Eïres/drawable-hdpi-v4/abc_scrubber_control_off_mtrl_alpha.pngPK €Ÿ°£²ˆCCAâïres/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.pngPK €Ÿ°£²ˆCCA„ðres/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.pngPK €Ÿ‡ùHMM:&ñres/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.pngPK €Ÿ‡ùHMM8Ëñres/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.pngPK €Ÿ>åìYY4nòres/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.pngPK €Ÿ¯ªôää6ôres/drawable-hdpi-v4/abc_switch_track_mtrl_alpha.9.pngPK €Ÿ‡ùHMM7Qöres/drawable-hdpi-v4/abc_tab_indicator_mtrl_alpha.9.pngPK €Ÿ¯||H>óöres/drawable-hdpi-v4/abc_text_select_handle_left_mtrl_dark.pngPK €ŸCÅÓ ?eøres/drawable-hdpi-v4/abc_text_select_handle_left_mtrl_light.pngPK €Ÿ)iH鎎@Øùres/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl_dark.pngPK €Ÿ·À!¾ŒŒAÄûres/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl_light.pngPK €Ÿ:'Zr?¯ýres/drawable-hdpi-v4/abc_text_select_handle_right_mtrl_dark.pngPK €Ÿk¼%ß@ÿres/drawable-hdpi-v4/abc_text_select_handle_right_mtrl_light.pngPK €Ÿ?|tºº=wres/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.pngPK €ŸD7o)ÀÀ;Œres/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.pngPK €ŸÒZ»²²D¥res/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.pngPK €Ÿ]ÆÓª²²B¹res/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.pngPK €Ÿü$úÚµ$µ$$Ëres/drawable-hdpi-v4/ic_launcher.pngPK €Ÿ‡ùHMM5Â)res/drawable-hdpi-v4/notification_bg_low_normal.9.pngPK €Ÿ‡ùHMM6b*res/drawable-hdpi-v4/notification_bg_low_pressed.9.pngPK €Ÿ‡ùHMM1+res/drawable-hdpi-v4/notification_bg_normal.9.pngPK €Ÿ‡ùHMM9Ÿ+res/drawable-hdpi-v4/notification_bg_normal_pressed.9.pngPK €Ÿ°£²ˆCC:C,res/drawable-hdpi-v4/notify_panel_notification_icon_bg.pngPK €ŸP)(ÐÇÇ>Þ,res/drawable-ldrtl-hdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.pngPK €Ÿ7ØyØ:.res/drawable-ldrtl-hdpi-v17/abc_ic_menu_cut_mtrl_alpha.pngPK €ŸhÈ(½YY;é/res/drawable-ldrtl-hdpi-v17/abc_spinner_mtrl_am_alpha.9.pngPK €Ÿعç¦8›1res/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.pngPK €Ÿ°£²ˆCC6 3res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.pngPK €Ÿ°£²ˆCC6 3res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.pngPK €Ÿ°£²ˆCC674res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.pngPK €Ÿ°£²ˆCC6Î4res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.pngPK €Ÿ‡ùHMM;e5res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.pngPK €Ÿ‡ùHMM; 6res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.pngPK €Ÿÿ;fcåå=±6res/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.pngPK €ŸÔÓÏ ää=ñ7res/drawable-xhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.pngPK €Ÿ`Ì6|²²809res/drawable-xhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.pngPK €ŸrD›‡ìì48:res/drawable-xhdpi-v4/abc_ic_menu_cut_mtrl_alpha.pngPK €ŸݬÚóó9v<res/drawable-xhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.pngPK €Ÿ¥ÚÅ··:À=res/drawable-xhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.pngPK €ŸO¯¹àà6Ï>res/drawable-xhdpi-v4/abc_ic_menu_share_mtrl_alpha.pngPK €Ÿ°£²ˆCC0Ares/drawable-xhdpi-v4/abc_ic_star_black_16dp.pngPK €Ÿ°£²ˆCC0”Ares/drawable-xhdpi-v4/abc_ic_star_black_36dp.pngPK €Ÿ°£²ˆCC0%Bres/drawable-xhdpi-v4/abc_ic_star_black_48dp.pngPK €Ÿ°£²ˆCC5¶Bres/drawable-xhdpi-v4/abc_ic_star_half_black_16dp.pngPK €Ÿ°£²ˆCC5LCres/drawable-xhdpi-v4/abc_ic_star_half_black_36dp.pngPK €Ÿ°£²ˆCC5âCres/drawable-xhdpi-v4/abc_ic_star_half_black_48dp.pngPK €Ÿ$#d5§§7xDres/drawable-xhdpi-v4/abc_list_divider_mtrl_alpha.9.pngPK €Ÿ‡ùHMM1tEres/drawable-xhdpi-v4/abc_list_focused_holo.9.pngPK €Ÿ‡ùHMM5Fres/drawable-xhdpi-v4/abc_list_longpressed_holo.9.pngPK €Ÿ‡ùHMM6°Fres/drawable-xhdpi-v4/abc_list_pressed_holo_dark.9.pngPK €Ÿ‡ùHMM7QGres/drawable-xhdpi-v4/abc_list_pressed_holo_light.9.pngPK €Ÿ‡ùHMM@óGres/drawable-xhdpi-v4/abc_list_selector_disabled_holo_dark.9.pngPK €Ÿ‡ùHMMAžHres/drawable-xhdpi-v4/abc_list_selector_disabled_holo_light.9.pngPK €Ÿ“pòÆÆ<JIres/drawable-xhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.pngPK €ŸKu@=:jMres/drawable-xhdpi-v4/abc_popup_background_mtrl_mult.9.pngPK €Ÿ°£²ˆCC=ÊSres/drawable-xhdpi-v4/abc_scrubber_control_off_mtrl_alpha.pngPK €Ÿ°£²ˆCCBhTres/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.pngPK €Ÿ°£²ˆCCB Ures/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.pngPK €Ÿ‡ùHMM;®Ures/drawable-xhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.pngPK €Ÿ‡ùHMM9TVres/drawable-xhdpi-v4/abc_scrubber_track_mtrl_alpha.9.pngPK €Ÿ>Ž ÚÀÀ5øVres/drawable-xhdpi-v4/abc_spinner_mtrl_am_alpha.9.pngPK €Ÿ/º,íjj7 Yres/drawable-xhdpi-v4/abc_switch_track_mtrl_alpha.9.pngPK €Ÿ‡ùHMM8Ê[res/drawable-xhdpi-v4/abc_tab_indicator_mtrl_alpha.9.pngPK €Ÿ…%ÁPP?m\res/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl_dark.pngPK €ŸCåHmOO@^res/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl_light.pngPK €Ÿÿ’(…GGAÇ_res/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl_dark.pngPK €ŸOäaIIBmbres/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl_light.pngPK €Ÿ?8 ??@eres/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl_dark.pngPK €Ÿ-×S>>A³fres/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl_light.pngPK €Ÿ‹¥4½½>Phres/drawable-xhdpi-v4/abc_textfield_activated_mtrl_alpha.9.pngPK €ŸæÅR»»<iires/drawable-xhdpi-v4/abc_textfield_default_mtrl_alpha.9.pngPK €Ÿ¸'#Ô¸¸E~jres/drawable-xhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.pngPK €Ÿd -¶¶C™kres/drawable-xhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.pngPK €Ÿ9“/8/8%°lres/drawable-xhdpi-v4/ic_launcher.pngPK €Ÿ‡ùHMM6"¥res/drawable-xhdpi-v4/notification_bg_low_normal.9.pngPK €Ÿ‡ùHMM7Ã¥res/drawable-xhdpi-v4/notification_bg_low_pressed.9.pngPK €Ÿ‡ùHMM2e¦res/drawable-xhdpi-v4/notification_bg_normal.9.pngPK €Ÿ‡ùHMM:§res/drawable-xhdpi-v4/notification_bg_normal_pressed.9.pngPK €Ÿ°£²ˆCC;§§res/drawable-xhdpi-v4/notify_panel_notification_icon_bg.pngPK €ŸÛøT²²?C¨res/drawable-ldrtl-xhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.pngPK €ŸŽQ;ýîî;R©res/drawable-ldrtl-xhdpi-v17/abc_ic_menu_cut_mtrl_alpha.pngPK €Ÿô<…<¡¡<™«res/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.pngPK €ŸE1`"9”­res/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.pngPK €Ÿ°£²ˆCC7 ¯res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.pngPK €Ÿ°£²ˆCC7¡¯res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.pngPK €Ÿ°£²ˆCC79°res/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.pngPK €Ÿ°£²ˆCC7Ѱres/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.pngPK €Ÿ‡ùHMM<i±res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.pngPK €Ÿ‡ùHMM<²res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.pngPK €Ÿ±a?íí>·²res/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.pngPK €Ÿ_]àà>´res/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.pngPK €Ÿ%â2ä9<µres/drawable-xxhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.pngPK €Ÿ%«ÆÆ5š¶res/drawable-xxhdpi-v4/abc_ic_menu_cut_mtrl_alpha.pngPK €ŸêƱÛ\\:³¹res/drawable-xxhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.pngPK €Ÿ3ªÙÃ;g»res/drawable-xxhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.pngPK €Ÿ{Õ¼¼7Ƽres/drawable-xxhdpi-v4/abc_ic_menu_share_mtrl_alpha.pngPK €Ÿ°£²ˆCC1׿res/drawable-xxhdpi-v4/abc_ic_star_black_16dp.pngPK €Ÿ°£²ˆCC1iÀres/drawable-xxhdpi-v4/abc_ic_star_black_36dp.pngPK €Ÿ°£²ˆCC1ûÀres/drawable-xxhdpi-v4/abc_ic_star_black_48dp.pngPK €Ÿ°£²ˆCC6Áres/drawable-xxhdpi-v4/abc_ic_star_half_black_16dp.pngPK €Ÿ°£²ˆCC6$Âres/drawable-xxhdpi-v4/abc_ic_star_half_black_36dp.pngPK €Ÿ°£²ˆCC6»Âres/drawable-xxhdpi-v4/abc_ic_star_half_black_48dp.pngPK €ŸFø·««8RÃres/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.pngPK €Ÿ‡ùHMM2SÄres/drawable-xxhdpi-v4/abc_list_focused_holo.9.pngPK €Ÿ‡ùHMM6ðÄres/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.pngPK €Ÿ‡ùHMM7‘Åres/drawable-xxhdpi-v4/abc_list_pressed_holo_dark.9.pngPK €Ÿ‡ùHMM83Æres/drawable-xxhdpi-v4/abc_list_pressed_holo_light.9.pngPK €Ÿ‡ùHMMAÖÆres/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_dark.9.pngPK €Ÿ‡ùHMMB‚Çres/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_light.9.pngPK €ŸÒ%qéóó=/Ères/drawable-xxhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.pngPK €Ÿn{!  ;}Ïres/drawable-xxhdpi-v4/abc_popup_background_mtrl_mult.9.pngPK €Ÿ°£²ˆCC>רres/drawable-xxhdpi-v4/abc_scrubber_control_off_mtrl_alpha.pngPK €Ÿ°£²ˆCCCvÙres/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.pngPK €Ÿ°£²ˆCCCÚres/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.pngPK €Ÿ‡ùHMM<¾Úres/drawable-xxhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.pngPK €Ÿ‡ùHMM:eÛres/drawable-xxhdpi-v4/abc_scrubber_track_mtrl_alpha.9.pngPK €Ÿ’IJ´  6 Üres/drawable-xxhdpi-v4/abc_spinner_mtrl_am_alpha.9.pngPK €Ÿµ‚È£SS8jÞres/drawable-xxhdpi-v4/abc_switch_track_mtrl_alpha.9.pngPK €Ÿ‡ùHMM9âres/drawable-xxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.pngPK €Ÿt0h¤¤@·âres/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl_dark.pngPK €ŸS*«¤¤A¹äres/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl_light.pngPK €Ÿ´Á2ððB¼æres/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl_dark.pngPK €ŸÂå“ññC êres/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl_light.pngPK €ŸáS>Ö¦¦A^íres/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl_dark.pngPK €Ÿ<ùN9¦¦Bcïres/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl_light.pngPK €Ÿ¡÷0ÇÇ?iñres/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.pngPK €ŸÚã#0ÈÈ=òres/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.pngPK €ŸÓ¶dA»»F°óres/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.pngPK €Ÿž.õººDÏôres/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.pngPK €ŸŠŸ¿Ì@ëõres/drawable-ldrtl-xxhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.pngPK €ŸдzÁÁ<M÷res/drawable-ldrtl-xxhdpi-v17/abc_ic_menu_cut_mtrl_alpha.pngPK €Ÿa"àÈ  =húres/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.pngPK €Ÿ°£²ˆCC8Ðüres/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.pngPK €Ÿ°£²ˆCC8iýres/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.pngPK €Ÿ°£²ˆCC8þres/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.pngPK €Ÿ°£²ˆCC8›þres/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.pngPK €Ÿ‡ùHMM=4ÿres/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.pngPK €Ÿ‡ùHMM=Üÿres/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.pngPK €ŸE°<ÚGG:„res/drawable-xxxhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.pngPK €ŸÛDbVŽŽ6#res/drawable-xxxhdpi-v4/abc_ic_menu_cut_mtrl_alpha.pngPK €ŸeîD­ÍÍ;res/drawable-xxxhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.pngPK €Ÿyk§¼11<+res/drawable-xxxhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.pngPK €ŸaÈèSƒƒ8¶ res/drawable-xxxhdpi-v4/abc_ic_menu_share_mtrl_alpha.pngPK €Ÿ°£²ˆCC2 res/drawable-xxxhdpi-v4/abc_ic_star_black_16dp.pngPK €Ÿ°£²ˆCC2"res/drawable-xxxhdpi-v4/abc_ic_star_black_36dp.pngPK €Ÿ°£²ˆCC2µres/drawable-xxxhdpi-v4/abc_ic_star_black_48dp.pngPK €Ÿ°£²ˆCC7Hres/drawable-xxxhdpi-v4/abc_ic_star_half_black_16dp.pngPK €Ÿ°£²ˆCC7àres/drawable-xxxhdpi-v4/abc_ic_star_half_black_36dp.pngPK €Ÿ°£²ˆCC7xres/drawable-xxxhdpi-v4/abc_ic_star_half_black_48dp.pngPK €Ÿ°£²ˆCCDres/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.pngPK €Ÿ°£²ˆCCDµres/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.pngPK €Ÿ–SÆÇ®®7Zres/drawable-xxxhdpi-v4/abc_spinner_mtrl_am_alpha.9.pngPK €Ÿ! ß--9]res/drawable-xxxhdpi-v4/abc_switch_track_mtrl_alpha.9.pngPK €Ÿ‡ùHMM:áres/drawable-xxxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.pngPK €ŸÓl†PA†res/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl_dark.pngPK €ŸòÄBæres/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl_light.pngPK €Ÿ‚ˆ©úBGres/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl_dark.pngPK €ŸÞùÝnC¨res/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl_light.pngPK €Ÿ~¨?EEA "res/drawable-ldrtl-xxxhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.pngPK €Ÿá&#‰‰=®#res/drawable-ldrtl-xxxhdpi-v17/abc_ic_menu_cut_mtrl_alpha.pngPK €ŸðÅp;µµ>’'res/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.pngPK€Ÿ®gUh(£)res/layout/abc_action_bar_title_item.xmlPK€ŸCVæ×/h*z+res/layout/abc_action_bar_up_container.xmlPK€ŸŸˆŠ*,res/layout/abc_action_menu_item_layout.xmlPK€Ÿ|=È)@%ã-res/layout/abc_action_menu_layout.xmlPK€ŸCVæ×/h"_/res/layout/abc_action_mode_bar.xmlPK€Ÿç·ÖÀ€ì2Þ/res/layout/abc_action_mode_close_item_material.xmlPK€ŸÁkÞü¨H6¾1res/layout-v17/abc_action_mode_close_item_material.xmlPK€ŸCVæ×/h(Ê3res/layout/abc_activity_chooser_view.xmlPK€ŸCVæ×/h2O4res/layout/abc_activity_chooser_view_list_item.xmlPK€Ÿ‡m646Ô3Þ4res/layout/abc_alert_dialog_button_bar_material.xmlPK€Ÿ²!ì}F7u7res/layout-v17/abc_alert_dialog_button_bar_material.xmlPK€Ÿ- ó)f07 :res/layout-v22/abc_alert_dialog_button_bar_material.xmlPK€Ÿð÷í$° (ë<res/layout/abc_alert_dialog_material.xmlPK€Ÿ?×’ÐT.F@res/layout/abc_alert_dialog_title_material.xmlPK€Ÿ^g,}ì2öBres/layout-v17/abc_alert_dialog_title_material.xmlPK€Ÿì¡íÉL-ÓEres/layout/abc_cascading_menu_item_layout.xmlPK€ŸCVæ×/h(÷Hres/layout/abc_dialog_title_material.xmlPK€ŸCVæ×/h,|Ires/layout-v17/abc_dialog_title_material.xmlPK€ŸCVæ×/h'Jres/layout/abc_expanded_menu_layout.xmlPK€Ÿµõ¸*‰Jres/layout/abc_list_menu_item_checkbox.xmlPK€ŸxèI`¬&ýKres/layout/abc_list_menu_item_icon.xmlPK€ŸCVæ×/h(±Mres/layout/abc_list_menu_item_layout.xmlPK€ŸP\†'6Nres/layout/abc_list_menu_item_radio.xmlPK€Ÿ'6¶•$0©Ores/layout/abc_popup_menu_header_item_layout.xmlPK€ŸBä/¯P4œQres/layout-v17/abc_popup_menu_header_item_layout.xmlPK€Ÿü'‰©')­Sres/layout/abc_popup_menu_item_layout.xmlPK€ŸCVæ×/h)+Wres/layout/abc_screen_content_include.xmlPK€ŸCVæ×/h ±Wres/layout/abc_screen_simple.xmlPK€ŸCVæ×/h4.Xres/layout/abc_screen_simple_overlay_action_mode.xmlPK€ŸCVæ×/h!¿Xres/layout/abc_screen_toolbar.xmlPK€ŸCVæ×/h%=Yres/layout-v21/abc_screen_toolbar.xmlPK€Ÿ&|èOœ|3¿Yres/layout/abc_search_dropdown_item_icons_2line.xmlPK€Ÿ ç/d ¼\res/layout/abc_search_view.xmlPK€Ÿ!¯KJ "7ares/layout-v17/abc_search_view.xmlPK€ŸþÍ|Üø¤)Ñeres/layout/abc_select_dialog_material.xmlPK€ŸÅ'!Ð- hres/layout-v17/abc_select_dialog_material.xmlPK€ŸF3EÓ̃jres/layout/abc_tooltip.xmlPK€ŸÖ‹U/ï žlres/layout-v17/abc_tooltip.xmlPK€ŸrÖÏ’ Ùnres/layout/main.xmlPK€ŸCVæ×/h".pres/layout/notification_action.xmlPK€ŸCVæ×/h&­pres/layout-v17/notification_action.xmlPK€ŸCVæ×/h,0qres/layout/notification_action_tombstone.xmlPK€ŸCVæ×/h0¹qres/layout-v17/notification_action_tombstone.xmlPK€ŸCVæ×/h/Frres/layout/notification_template_custom_big.xmlPK€ŸCVæ×/h/Òrres/layout/notification_template_icon_group.xmlPK€ŸCVæ×/h5^sres/layout/notification_template_part_chronometer.xmlPK€ŸCVæ×/h.ðsres/layout/notification_template_part_time.xmlPK€ŸH¥!ú^€*{tres/layout/select_dialog_item_material.xmlPK€ŸÃצ3  11vres/layout/select_dialog_multichoice_material.xmlPK€Ÿ©[Pû½`50xres/layout-v17/select_dialog_multichoice_material.xmlPK€Ÿ‡¶Ý¹  2Pzres/layout/select_dialog_singlechoice_material.xmlPK€ŸʰÑL½`6P|res/layout-v17/select_dialog_singlechoice_material.xmlPK€ŸI<›d Ð3q~res/layout/support_simple_spinner_dropdown_item.xmlPK€ŸCVæ×/h3Þres/layout-v16/notification_template_custom_big.xmlPK€ŸCVæ×/h3n€res/layout-v17/notification_template_custom_big.xmlPK€ŸN­SòÙ¸=þ€res/layout-watch-v20/abc_alert_dialog_button_bar_material.xmlPK€Ÿ$S'I(H8Bƒres/layout-watch-v20/abc_alert_dialog_title_material.xmlPK€ŸCVæ×/h&Ð…res/layout-v21/notification_action.xmlPK€ŸCVæ×/h0S†res/layout-v21/notification_action_tombstone.xmlPK€ŸCVæ×/h3à†res/layout-v21/notification_template_custom_big.xmlPK€ŸCVæ×/h3p‡res/layout-v21/notification_template_icon_group.xmlPK€ŸCVæ×/h%ˆres/layout-v26/abc_screen_toolbar.xmlPK €ŸƼ³þþ‚ˆresources.arscPK——{›¯†zipflinger-7.2.2/test/resource/text.txt000066400000000000000000000011531430664457700202460ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */zipflinger-7.2.2/test/resource/two_files.zip000066400000000000000000000036151430664457700212450ustar00rootroot00000000000000PKôfâN,Ë¡’# compressed.randomUT »¶]¶]ux S_S=oÛ0Ýõ+4Ù(;éÔ,E‘¡´E‘á–N~äÉqüë{”ãÔ(2å œîÈwïÍp뻀õr‰Ðáj‰ÏC4V‚åÇ ›|‰´Å@6t Ú·àžÏ¨ÇÛïØÆ0uQÜ™ÄðÚQ…V3-ØäP3G³YÂdòm‚"¥d‚‡#îC[¸©eë&ŒŒÎXJ…ñ°oFûÆŽ­ñ[iA û\™ gm<µ9—¥ÓIÔ3@Ǧ7;š¥y]”u•ÓëN¿`CÐx6¶mtl'Ö'¼Üê¢Â§ «µ´¯·Â¬\iõ´¾ÈçKA+ŒIoé”Éê­ÔåUrvwÓßóÃa? ±Ê|뺖Híìó_F‘¢ Œ>3VÿS8ýª–PW]ˆN3ÂÀ"pºÆùR H}ˆŒŸÞìQÚeK¼™µÔÕsa¥.1õͪ$|ûz÷«Bð„¢´‘àÍAؚѽ—q®€§1ñ˜ÚÚð Õ//ÔA¶YÀQý}”\jì(nÄ#ÜhÙ¨A&tÂq&5d­öÆô¦N&ÙâvÏèI·ÝO5¬…˜€MB‹Å&›Êð¦œ\)CNÛe^¹ž½îHþ¥öpªM…ü6Röm’ièdZñ®ÓöL½d—6:‘2>‘O†ÅÎGb÷‚–o'fI¹—7¸íE^cYv£t!R™QöÀñ ÑÙ¸—ywaDƒ;¹§ø PK vÜN,Ë¡’  uncompressed.randomUT L‹]—¶]ux S_ZipInfo 3.00 of 20 April 2009, by Greg Roelofs and the Info-ZIP group. List name, date/time, attribute, size, compression method, etc., about files in list (excluding those in xlist) contained in the specified .zip archive(s). "file[.zip]" may be a wildcard name containing *, ?, [] (e.g., "[a-j]*.zip"). usage: zipinfo [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] or: unzip -Z [-12smlvChMtTz] file[.zip] [list...] [-x xlist...] main listing-format options: -s short Unix "ls -l" format (def.) -1 filenames ONLY, one per line -m medium Unix "ls -l" format -2 just filenames but allow -h/-t/-z -l long Unix "ls -l" format -v verbose, multi-page format miscellaneous options: -h print header line -t print totals for listed files or for all -z print zipfile comment -T print file times in sortable decimal format -C be case-insensitive -M page output through built-in "more" -x exclude filenames that follow from listing PKôfâN,Ë¡’# ¤compressed.randomUT»¶]ux S_PK vÜN,Ë¡’  ¤nuncompressed.randomUTL‹]ux S_PK°Çzipflinger-7.2.2/test/resource/zip_no_fd.zip000066400000000000000000000004741430664457700212210ustar00rootroot00000000000000PK €c‚N empty.txtUT ¿·£\rð¦\ux S_PK t‚N empty2.txtUT ïÔ£\rð¦\ux S_PK €c‚N ¤empty.txtUT¿·£\ux S_PK t‚N ¤Cempty2.txtUTïÔ£\ux S_PKŸ‡zipflinger-7.2.2/test/resource/zip_nofd_aligned.zip000066400000000000000000000011561430664457700225430ustar00rootroot00000000000000PK €c‚N empty.txtUT ¿·£\B§\ux S_PK t‚N empty2.txtUT ïÔ£\rð¦\ux S_PK 1p…NgtÒ file3.txtUT -§\B§\ux S_xxx PK verifyArchive(Path archiveFile) throws IOException { HashMap topDownEntries = new HashMap<>(); try (ZipInputStream zis = new ZipInputStream(Files.newInputStream(archiveFile))) { byte[] buffer = new byte[10_240]; ZipEntry zipEntry = zis.getNextEntry(); while (zipEntry != null) { while (zis.read(buffer) > 0) ; if (!zipEntry.getName().isEmpty()) { topDownEntries.put(zipEntry.getName(), zipEntry); } zipEntry = zis.getNextEntry(); } zis.closeEntry(); } // TODO: Compare entries parsed with bottom-up instead of returning them. Map bottomUpEntries = ZipArchive.listEntries(archiveFile); Assert.assertEquals( "Bottom-up and Top-down # entries don't match", topDownEntries.size(), bottomUpEntries.size()); for (String name : bottomUpEntries.keySet()) { Assert.assertTrue( "Top-down should contain entry " + name, topDownEntries.containsKey(name)); } for (String name : topDownEntries.keySet()) { Assert.assertTrue( "Bottom-up should contain entry " + name, bottomUpEntries.containsKey(name)); } // TODO: Compare sizes and crcs for (String name : bottomUpEntries.keySet()) { Entry e = bottomUpEntries.get(name); ZipEntry o = topDownEntries.get(name); long crc = e.getCrc() & 0xFFFFFFFFL; Assert.assertEquals("Entry " + name + " crcs don't match", crc, o.getCrc()); Assert.assertEquals( "Entry " + name + " match size", e.getCompressedSize(), o.getCompressedSize()); Assert.assertEquals( "Entry " + name + " match usize", e.getUncompressedSize(), o.getSize()); } return bottomUpEntries; } protected static byte[] toByteArray(ByteBuffer byteBuffer) { byte[] bytes = new byte[byteBuffer.remaining()]; byteBuffer.get(bytes); return bytes; } protected static void createZip(Path archive, Path[] files) throws IOException { Files.deleteIfExists(archive); try (OutputStream f = Files.newOutputStream(archive); ZipOutputStream s = new ZipOutputStream(f)) { for (Path file : files) { String name = file.getFileName().toString(); ZipEntry entry = new ZipEntry(name); byte[] bytes = Files.readAllBytes(file); s.putNextEntry(entry); s.write(bytes); s.closeEntry(); } } } static void createZip(long numFiles, int sizePerFile, Path file) throws IOException { Files.deleteIfExists(file); long fileId = 0; try (OutputStream f = Files.newOutputStream(file); ZipOutputStream s = new ZipOutputStream(f)) { s.setLevel(ZipOutputStream.STORED); for (int i = 0; i < numFiles; i++) { long id = fileId++; String name = String.format("file%06d", id); ZipEntry entry = new ZipEntry(name); byte[] bytes = new byte[sizePerFile]; s.putNextEntry(entry); s.write(bytes); s.closeEntry(); } } } } zipflinger-7.2.2/test/src/java/com/android/zipflinger/CompressorTest.java000066400000000000000000000036051430664457700266140ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.file.Files; import java.nio.file.Path; import java.util.zip.DataFormatException; import java.util.zip.Deflater; import java.util.zip.Inflater; import org.junit.Assert; import org.junit.Test; public class CompressorTest extends AbstractZipflingerTest { @Test public void testDeflateInflate() throws IOException, DataFormatException { Path src = getPath("file4.txt"); byte[] uncompressed = Files.readAllBytes(src); ByteBuffer compressed = Compressor.deflate(uncompressed, Deflater.DEFAULT_COMPRESSION); int uncompressedSize = uncompressed.length; int compressedSize = compressed.limit(); Assert.assertTrue( "Compressed size <= uncompressed size", compressedSize <= uncompressedSize); Inflater inflater = new Inflater(true); inflater.setInput(compressed.array(), 0, compressedSize); byte[] inflated = new byte[uncompressedSize]; int inflatedLength = inflater.inflate(inflated); Assert.assertEquals( "Inflated length is equal to original length", uncompressedSize, inflatedLength); Assert.assertArrayEquals("Before/After bytes", uncompressed, inflated); } } zipflinger-7.2.2/test/src/java/com/android/zipflinger/FreeStoreTest.java000066400000000000000000000251271430664457700263610ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import java.util.HashMap; import java.util.List; import org.junit.Assert; import org.junit.Test; public class FreeStoreTest extends AbstractZipflingerTest { private static class AllocRequest { long size; long offsetToPayload; } @Test public void testAlloc() { FreeStore store = new FreeStore(new HashMap<>()); Location allocated = store.ualloc(4); Assert.assertEquals("First alloc Location size", 4, allocated.size()); allocated = store.ualloc(1); Assert.assertEquals("Second alloc Location size", 1, allocated.size()); allocated = store.ualloc(10); Assert.assertEquals("Third alloc Location size", 10, allocated.size()); List freeLocations = store.getFreeLocations(); Assert.assertEquals("Num free zones", 1, freeLocations.size()); Assert.assertEquals( "First Location", new Location(15, Long.MAX_VALUE - 15), freeLocations.get(0)); } @Test public void testAllocZoneTooSmall() { FreeStore store = new FreeStore(new HashMap<>()); store.ualloc(20); store.free(new Location(5, 5)); List freeLocations = store.getFreeLocations(); Assert.assertEquals("Num free zones", 2, freeLocations.size()); Assert.assertEquals("First Location", new Location(5, 5), freeLocations.get(0)); Assert.assertEquals( "Rest Location", new Location(20, Long.MAX_VALUE - 20), freeLocations.get(1)); store.ualloc(5); freeLocations = store.getFreeLocations(); Assert.assertEquals("Num free zones", 2, freeLocations.size()); Assert.assertEquals("First Location", new Location(5, 5), freeLocations.get(0)); Assert.assertEquals( "Rest Location", new Location(25, Long.MAX_VALUE - 25), freeLocations.get(1)); } @Test public void testAllocPerfectMatch() { FreeStore store = new FreeStore(new HashMap<>()); store.ualloc(LocalFileHeader.VIRTUAL_HEADER_SIZE * 3); store.free( new Location( LocalFileHeader.VIRTUAL_HEADER_SIZE, LocalFileHeader.VIRTUAL_HEADER_SIZE + 5)); store.ualloc(5); List freeLocations = store.getFreeLocations(); Assert.assertEquals("Num free zones", 2, freeLocations.size()); Assert.assertEquals( "First Location", new Location( LocalFileHeader.VIRTUAL_HEADER_SIZE + 5, LocalFileHeader.VIRTUAL_HEADER_SIZE), freeLocations.get(0)); Assert.assertEquals( "Rest Location", new Location( LocalFileHeader.VIRTUAL_HEADER_SIZE * 3, Long.MAX_VALUE - LocalFileHeader.VIRTUAL_HEADER_SIZE * 3), freeLocations.get(1)); } @Test public void testAllocMiddletMatch() { FreeStore store = new FreeStore(new HashMap<>()); store.ualloc(200); store.free(new Location(20, 50)); store.ualloc(10); List freeLocations = store.getFreeLocations(); Assert.assertEquals("Num free zones", 2, freeLocations.size()); Assert.assertEquals("First Location", new Location(30, 40), freeLocations.get(0)); Assert.assertEquals( "Rest Location", new Location(200, Long.MAX_VALUE - 200), freeLocations.get(1)); } @Test public void testFree() { FreeStore store = new FreeStore(new HashMap<>()); store.ualloc(20); // Test that there is only one free location which is the remaining of the file List freeLocations = store.getFreeLocations(); Assert.assertEquals("Num free zones", 1, freeLocations.size()); Assert.assertEquals( "First Location", new Location(20, Long.MAX_VALUE - 20), freeLocations.get(0)); store.free(new Location(0, 5)); freeLocations = store.getFreeLocations(); Assert.assertEquals("Num free zones", 2, freeLocations.size()); Assert.assertEquals("First Location", new Location(0, 5), freeLocations.get(0)); } @Test public void testFreeMergingLeftRight() { FreeStore store = new FreeStore(new HashMap<>()); store.ualloc(20); // Test that there is only one free location which is the remaining of the file List freeLocations = store.getFreeLocations(); Assert.assertEquals("Num free zones", 1, freeLocations.size()); Assert.assertEquals( "First Location", new Location(20, Long.MAX_VALUE - 20), freeLocations.get(0)); store.free(new Location(0, 5)); freeLocations = store.getFreeLocations(); Assert.assertEquals("Num free zones", 2, freeLocations.size()); Assert.assertEquals("First Location", new Location(0, 5), freeLocations.get(0)); store.free(new Location(5, 5)); freeLocations = store.getFreeLocations(); Assert.assertEquals("Num free zones", 2, freeLocations.size()); Assert.assertEquals("First Location", new Location(0, 10), freeLocations.get(0)); store.free(new Location(10, 10)); freeLocations = store.getFreeLocations(); Assert.assertEquals("Num free zones", 1, freeLocations.size()); Assert.assertEquals( "First Location", new Location(0, Long.MAX_VALUE), freeLocations.get(0)); } @Test public void testFreeMergingRightLeft() { FreeStore store = new FreeStore(new HashMap<>()); store.ualloc(20); // Test that there is only one free location which is the remaining of the file List freeLocations = store.getFreeLocations(); Assert.assertEquals("Num free zones", 1, freeLocations.size()); Assert.assertEquals( "First Location", new Location(20, Long.MAX_VALUE - 20), freeLocations.get(0)); store.free(new Location(10, 10)); freeLocations = store.getFreeLocations(); Assert.assertEquals("Num free zones", 1, freeLocations.size()); Assert.assertEquals( "First Location", new Location(10, Long.MAX_VALUE - 10), freeLocations.get(0)); store.free(new Location(5, 5)); freeLocations = store.getFreeLocations(); Assert.assertEquals("Num free zones", 1, freeLocations.size()); Assert.assertEquals( "First Location", new Location(5, Long.MAX_VALUE - 5), freeLocations.get(0)); store.free(new Location(0, 5)); freeLocations = store.getFreeLocations(); Assert.assertEquals("Num free zones", 1, freeLocations.size()); Assert.assertEquals( "First Location", new Location(0, Long.MAX_VALUE), freeLocations.get(0)); } @Test public void testBadFree() { FreeStore store = new FreeStore(new HashMap<>()); store.ualloc(20); boolean exceptionCaught = false; try { store.free(new Location(5, 20)); } catch (IllegalStateException e) { exceptionCaught = true; } Assert.assertTrue("Unknown free did not throw an exception", exceptionCaught); } @Test public void testAlignment() { for (long alignment : ALIGNMENTS) { testAlignment(alignment); } } private void testAlignment(long alignment) { for (int offset = 0; offset < alignment; offset++) { Location allocated; AllocRequest allocationRequest = new AllocRequest(); allocationRequest.size = 40; allocationRequest.offsetToPayload = offset; FreeStore store = new FreeStore(new HashMap<>()); allocated = store.alloc( allocationRequest.size, allocationRequest.offsetToPayload, alignment); long padding = allocated.size() - allocationRequest.size; Assert.assertEquals( "Aligned alloc size=" + allocationRequest.size + " offset=" + offset + ", alignement=" + alignment, 0, (allocated.first + padding + allocationRequest.offsetToPayload) % alignment); } } @Test public void testMultipleAlignment() { for (long alignment : ALIGNMENTS) { testMultipleAlignment(alignment); } } private void testMultipleAlignment(long alignment) { Location allocated; AllocRequest allocationRequest = new AllocRequest(); FreeStore store = new FreeStore(new HashMap<>()); for (int offset = 0; offset < alignment; offset++) { allocationRequest.size = 40; allocationRequest.offsetToPayload = offset; allocated = store.alloc( allocationRequest.size, allocationRequest.offsetToPayload, alignment); long padding = allocated.size() - allocationRequest.size; Assert.assertEquals( "Aligned alloc size=" + allocationRequest.size + " offset=" + offset + ",alignment=" + alignment, 0, (allocated.first + padding + allocationRequest.offsetToPayload) % alignment); } } @Test public void testPadding() { int alignment = 4; for (long address = 0; address < alignment; address++) { for (long offset = 0; offset < alignment; offset++) { long padding = FreeStore.padFor(address, offset, alignment); Assert.assertEquals( "Padding with address=" + address + ", offset=" + offset, 0L, (address + offset + padding) % alignment, 0); } } } } zipflinger-7.2.2/test/src/java/com/android/zipflinger/IntsTest.java000066400000000000000000000050631430664457700253750ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import org.junit.Assert; import org.junit.Test; public class IntsTest { @Test public void testLongToUintOverflow() { boolean exceptionCaught = false; long i = 0x1_FF_FF_FF_FFL; try { Ints.longToUint(i); } catch (IllegalStateException e) { exceptionCaught = true; } Assert.assertTrue(exceptionCaught); } @Test public void testLongToUint() { boolean exceptionCaught = false; long i = 0xFF_FF_FF_FFL; try { Ints.longToUint(i); } catch (IllegalStateException e) { exceptionCaught = true; } Assert.assertFalse(exceptionCaught); } @Test public void testIntToUshortOverflow() { boolean exceptionCaught = false; int i = 0x1_FF_FF; try { Ints.intToUshort(i); } catch (IllegalStateException e) { exceptionCaught = true; } Assert.assertTrue(exceptionCaught); } @Test public void testIntToUshort() { boolean exceptionCaught = false; int i = 0xFF_FF; try { Ints.intToUshort(i); } catch (IllegalStateException e) { exceptionCaught = true; } Assert.assertFalse(exceptionCaught); } @Test public void testULongToLongOverflow() { boolean exceptionCaught = false; long i = 0x80_00_00_00_00_00_00_00L; try { Ints.ulongToLong(i); } catch (IllegalStateException e) { exceptionCaught = true; } Assert.assertTrue(exceptionCaught); } @Test public void testULongToLong() { boolean exceptionCaught = false; long i = 0x70_00_00_00_00_00_00_00L; try { Ints.ulongToLong(i); } catch (IllegalStateException e) { exceptionCaught = true; } Assert.assertFalse(exceptionCaught); } } zipflinger-7.2.2/test/src/java/com/android/zipflinger/MockInputStream.java000066400000000000000000000021461430664457700267040ustar00rootroot00000000000000/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import java.io.IOException; import java.io.InputStream; import java.util.Random; public class MockInputStream extends InputStream { private long size; private final Random random; MockInputStream(long size) { this.size = size; this.random = new Random(0); } @Override public int read() throws IOException { if (size == 0) { return -1; } size -= 1; return random.nextInt(256); } } zipflinger-7.2.2/test/src/java/com/android/zipflinger/ParsingTest.java000066400000000000000000000076771430664457700261000ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import org.junit.Assert; import org.junit.Test; public class ParsingTest extends AbstractZipflingerTest { @Test public void testMapWithoutDataDescriptors() throws Exception { ZipMap map = ZipMap.from(getPath("zip_no_fd.zip"), true); Map entries = map.getEntries(); Entry entry = entries.get("empty.txt"); Assert.assertEquals("First entry location", new Location(0, 67), entry.getLocation()); entry = entries.get("empty2.txt"); Assert.assertEquals("First entry location", new Location(67, 68), entry.getLocation()); } @Test public void testZipWithDataDescriptors() throws Exception { ZipMap map = ZipMap.from(getPath("zip_with_fd.zip"), true); Map entries = map.getEntries(); Entry entry = entries.get("empty.txt"); Assert.assertEquals("First entry location", new Location(0, 67 + 16), entry.getLocation()); entry = entries.get("empty2.txt"); Assert.assertEquals("First entry location", new Location(83, 84), entry.getLocation()); } // Create a zip entry with four deflated entries and DDs. Delete the second and third entries. // If DD parsing/preservation was successful, the gap created by the deleted entry will be // properly filled by overwriting the DDs and ZipInputStream will be able to parse the entire // archive. @Test public void testZipWithDataDescriptorEditing() throws Exception { Path archiveFile = getTestPath("testZipWithDDEditing.zip"); byte[] resourceBytes = new byte[1000]; try (OutputStream f = Files.newOutputStream(archiveFile); ZipOutputStream s = new ZipOutputStream(f)) { for (int i = 0; i < 4; i++) { ZipEntry entry = new ZipEntry("file" + i); s.putNextEntry(entry); s.setMethod(ZipOutputStream.DEFLATED); s.write(resourceBytes); s.closeEntry(); } } try (ZipArchive archive = new ZipArchive(archiveFile)) { archive.delete("file1"); } try (ZipArchive archive = new ZipArchive(archiveFile)) { archive.delete("file2"); } verifyArchive(archiveFile); } @Test public void testDataDescriptorInvalideLocation() throws Exception { ZipMap map = ZipMap.from(getPath("zip_with_fd.zip"), false); Map entries = map.getEntries(); Entry entry = entries.get("empty.txt"); Assert.assertEquals("Entry is valid", entry.getLocation(), Location.INVALID); } @Test public void testZipWithLargeEntriesAndDataDescriptors() throws Exception { Path target = getTestPath("largeEntriesDD.zip"); createZip(42, 1_000_000, target); ZipMap map = ZipMap.from(target, true); map.getEntries(); } // Gradle Plug-in features a "resource stripped" which generates invalid extra field (e.g:size=1) // Namely, they do not feature a valid ID-size-payload combination. @Test public void testStripped() throws Exception { ZipMap map = ZipMap.from(getPath("stripped.ap_"), true); } } zipflinger-7.2.2/test/src/java/com/android/zipflinger/RepoTest.java000066400000000000000000000111621430664457700253620ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.file.Path; import java.util.Random; import java.util.zip.Deflater; import org.junit.Assert; import org.junit.Test; public class RepoTest extends AbstractZipflingerTest { @Test public void testGetInputStream() throws Exception { byte[][] files = new byte[2][1024]; Random r = new Random(0); for (byte[] bytes : files) { r.nextBytes(bytes); } Path file = getTestPath("testGetContent.zip"); try (ZipArchive archive = new ZipArchive(file)) { for (int i = 0; i < files.length; i++) { archive.add( new BytesSource( files[i], Integer.toString(i), Deflater.NO_COMPRESSION + i)); } } try (ZipRepo repo = new ZipRepo(file)) { for (int i = 0; i < files.length; i++) { String entryName = Integer.toString(i); try (InputStream inputStream = repo.getInputStream(entryName)) { assertZipEntryMatch(inputStream, files[i]); } } } } @Test public void testGetContent() throws Exception { byte[][] files = new byte[2][1024]; Random r = new Random(0); for (byte[] bytes : files) { r.nextBytes(bytes); } Path file = getTestPath("testGetContent.zip"); try (ZipArchive archive = new ZipArchive(file)) { for (int i = 0; i < files.length; i++) { archive.add( new BytesSource( files[i], Integer.toString(i), Deflater.NO_COMPRESSION + i)); } } try (ZipRepo repo = new ZipRepo(file)) { for (int i = 0; i < files.length; i++) { String entryName = Integer.toString(i); ByteBuffer content = repo.getContent(entryName); Assert.assertArrayEquals("Content does not match", files[i], toByteArray(content)); } } } private void assertZipEntryMatch(InputStream inputStream, byte[] content) throws IOException { NoCopyByteArrayOutputStream outputStream = new NoCopyByteArrayOutputStream(content.length); byte[] buffer = new byte[8192]; // Exhauste input stream content int read; while ((read = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, read); } byte[] extracted = outputStream.toByteArray(); Assert.assertEquals("Content size differ", content.length, extracted.length); Assert.assertArrayEquals("Content differs", content, extracted); } @Test // Test that Ziprepo InputStream is compliant (returns bytes as [0-255] instead of [-128, 127]) public void testInputStream() throws IOException { Path f = getTestPath("testRepoInputStream.zip"); try (ZipArchive archive = new ZipArchive(f)) { byte[] bytes = new byte[1]; bytes[0] = -1; BytesSource s = new BytesSource(bytes, "foo", Deflater.NO_COMPRESSION); archive.add(s); } try (ZipRepo repo = new ZipRepo(f)) { InputStream in = repo.getInputStream("foo"); Assert.assertEquals("ZipRepo read() compliance", 255, in.read()); } } @Test public void testInputStreamOverflow() throws IOException { Path f = getTestPath("testInputStreamOverflow.zip"); final int fakeContentSize = 10; try (ZipArchive archive = new ZipArchive(f)) { byte[] bytes = new byte[fakeContentSize]; BytesSource s = new BytesSource(bytes, "foo", Deflater.NO_COMPRESSION); archive.add(s); } try (ZipRepo repo = new ZipRepo(f)) { InputStream in = repo.getInputStream("foo"); byte[] buffer = new byte[fakeContentSize]; in.read(buffer, buffer.length - 1, 1); } } } zipflinger-7.2.2/test/src/java/com/android/zipflinger/StableArchiveTest.java000066400000000000000000000154761430664457700272050ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import org.junit.Assert; import org.junit.Test; public class StableArchiveTest extends AbstractZipflingerTest { private void verifyBinaryIdentical(Path dst1, Path dst2) throws IOException { byte[] content1 = Files.readAllBytes(dst1); byte[] content2 = Files.readAllBytes(dst2); String message = String.format("Differing %s and %s", dst1.getFileName(), dst2.getFileName()); Assert.assertArrayEquals(message, content1, content2); } @Test public void testDifferentOrderFiles() throws Exception { Path dst1 = getTestPath("testDifferentOrderFiles1.zip"); try (Archive archive = new StableArchive(new ZipArchive(dst1))) { archive.add(new BytesSource(new byte[0], "a", 0)); archive.add(new BytesSource(new byte[0], "b", 0)); } Path dst2 = getTestPath("testDifferentOrderFiles2.zip"); try (Archive archive = new StableArchive(new ZipArchive(dst2))) { archive.add(new BytesSource(new byte[0], "b", 0)); archive.add(new BytesSource(new byte[0], "a", 0)); } verifyBinaryIdentical(dst1, dst2); } @Test public void testDifferentOrderZips() throws Exception { String base = "testDifferentOrderZip"; // Zip source 1 Path src1 = getTestPath(base + "Source1.zip"); try (Archive archive = new ZipArchive(src1)) { archive.add(new BytesSource(new byte[0], "a", 0)); archive.add(new BytesSource(new byte[0], "b", 0)); } // Zip source 2 Path src2 = getTestPath(base + "Source2.zip"); try (Archive archive = new StableArchive(new ZipArchive(src2))) { archive.add(new BytesSource(new byte[0], "c", 0)); archive.add(new BytesSource(new byte[0], "d", 0)); } // Create an archive by adding source 1 and then source 2. Path dst1 = getTestPath(base + "1.zip"); try (Archive archive = new StableArchive(new ZipArchive(dst1))) { ZipSource zipSource1 = new ZipSource(src1); zipSource1.select("a", "a"); zipSource1.select("b", "b"); ZipSource zipSource2 = new ZipSource(src2); zipSource2.select("c", "c"); zipSource2.select("d", "d"); archive.add(zipSource1); archive.add(zipSource2); } // Same archive but add zipSource in different order. // Create an archive by adding source 2 and then source 1. Path dst2 = getTestPath(base + "2.zip"); try (Archive archive = new StableArchive(new ZipArchive(dst2))) { ZipSource zipSource1 = new ZipSource(src1); zipSource1.select("a", "a"); zipSource1.select("b", "b"); ZipSource zipSource2 = new ZipSource(src2); zipSource2.select("c", "c"); zipSource2.select("d", "d"); archive.add(zipSource2); archive.add(zipSource1); } verifyBinaryIdentical(dst1, dst2); } @Test public void testDifferentOrderZipSelectedElements() throws Exception { String base = "testDifferentOrderZipEntries"; // Zip source 1 Path src1 = getTestPath(base + "Source1.zip"); try (Archive archive = new ZipArchive(src1)) { archive.add(new BytesSource(new byte[0], "a", 0)); archive.add(new BytesSource(new byte[0], "b", 0)); } // Zip source 2 Path src2 = getTestPath(base + "Source2.zip"); try (Archive archive = new StableArchive(new ZipArchive(src2))) { archive.add(new BytesSource(new byte[0], "c", 0)); archive.add(new BytesSource(new byte[0], "d", 0)); } // Create an archive by adding source 1 (b, a) and then source 2 (d, c). Path dst1 = getTestPath(base + "1.zip"); try (Archive archive = new StableArchive(new ZipArchive(dst1))) { ZipSource zipSource1 = new ZipSource(src1); zipSource1.select("b", "b"); zipSource1.select("a", "a"); ZipSource zipSource2 = new ZipSource(src2); zipSource2.select("d", "d"); zipSource2.select("c", "c"); archive.add(zipSource1); archive.add(zipSource2); } // Same archives order but different entry selection order. Path dst2 = getTestPath(base + "2.zip"); try (Archive archive = new StableArchive(new ZipArchive(dst2))) { ZipSource zipSource1 = new ZipSource(src1); zipSource1.select("a", "a"); zipSource1.select("b", "b"); ZipSource zipSource2 = new ZipSource(src2); zipSource2.select("c", "c"); zipSource2.select("d", "d"); archive.add(zipSource1); archive.add(zipSource2); } verifyBinaryIdentical(dst1, dst2); } @Test public void testDifferentOrderDelete() throws Exception { String base = "testDifferentOrderZipEntries"; // Zip source 1 Path src1 = getTestPath(base + "Source1.zip"); try (Archive archive = new ZipArchive(src1)) { archive.add(new BytesSource(new byte[0], "a", 0)); archive.add(new BytesSource(new byte[0], "b", 0)); archive.add(new BytesSource(new byte[0], "c", 0)); archive.add(new BytesSource(new byte[0], "d", 0)); } // Zip source 2 is a copy of Zip source 1 Path src2 = getTestPath(base + "Source2.zip"); Files.copy(src1, src2, StandardCopyOption.REPLACE_EXISTING); verifyBinaryIdentical(src1, src2); // Delete entries in order b, a, and c. try (Archive archive = new StableArchive(new ZipArchive(src1))) { archive.delete("b"); archive.delete("a"); archive.delete("c"); } // Delete entries in reverse order (c, a, and b). try (Archive archive = new StableArchive(new ZipArchive(src2))) { archive.delete("c"); archive.delete("a"); archive.delete("b"); } verifyBinaryIdentical(src1, src2); } } zipflinger-7.2.2/test/src/java/com/android/zipflinger/Zip64Test.java000066400000000000000000000120771430664457700253770ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import static java.util.zip.Deflater.NO_COMPRESSION; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import org.junit.Assert; import org.junit.Test; public class Zip64Test extends AbstractZipflingerTest { private static final int ONE_GIB = 1 << 30; @Test public void testZip64Parsing() throws Exception { Path archive = getPath("5GiBFile.zip"); verifyArchive(archive); } @Test public void testZip64Writing() throws Exception { Path dst = getTestPath("testZip64Writing.zip"); byte[] bytes = new byte[ONE_GIB]; try (ZipArchive archive = new ZipArchive(dst, Zip64.Policy.ALLOW)) { for (int i = 0; i < 5; i++) { BytesSource source = new BytesSource(bytes, "file" + i, NO_COMPRESSION); archive.add(source); } } verifyArchive(dst); } @Test public void testZip64Transfer() throws Exception { Path dst = getTestPath("testZip64Transfer.zip"); Path bigZipFile = getPath("5GiBFile.zip"); try (ZipArchive archive = new ZipArchive(dst, Zip64.Policy.ALLOW)) { ZipSource zipSource = new ZipSource(bigZipFile); zipSource.select("empty5GiB", "empty5GiB"); archive.add(zipSource); } verifyArchive(dst); } @Test public void testForbiddenZip64Add() throws Exception { Path dst = getTestPath("testForbiddenZip64Add.zip"); Path bigZipFile = getPath("5GiBFile.zip"); try (ZipArchive archive = new ZipArchive(dst, Zip64.Policy.FORBID)) { ZipSource zipSource = new ZipSource(bigZipFile); zipSource.select("empty5GiB", "empty5GiB"); archive.add(zipSource); Assert.fail("Adding " + bigZipFile.getFileName() + " to non-zip64 should have failed"); } catch (IllegalStateException expected) { } } @Test public void testAllowedZip64Add() throws Exception { Path dst = getTestPath("testAllowedZip64Add.zip"); Path bigZipFile = getPath("5GiBFile.zip"); try (ZipArchive archive = new ZipArchive(dst, Zip64.Policy.ALLOW)) { ZipSource zipSource = new ZipSource(bigZipFile); zipSource.select("empty5GiB", "empty5GiB"); archive.add(zipSource); } verifyArchive(dst); } @Test public void testForbiddenZip64Opening() throws Exception { Path bigZipFile = getPath("5GiBFile.zip"); Path src = getTestPath("testForbiddenZip64Opening.zip"); Files.copy(bigZipFile, src, StandardCopyOption.REPLACE_EXISTING); try (ZipArchive archive = new ZipArchive(src, Zip64.Policy.FORBID)) { Assert.fail( "Opening " + bigZipFile.getFileName() + " as FORBIDDEN zip64 should have failed"); } catch (IllegalStateException expected) { } } @Test public void testAllowedZip64Opening() throws Exception { Path bigZipFile = getPath("5GiBFile.zip"); Path src = getTestPath("testAllowedZip64Opening.zip"); Files.copy(bigZipFile, src, StandardCopyOption.REPLACE_EXISTING); try (ZipArchive archive = new ZipArchive(src, Zip64.Policy.ALLOW)) {} verifyArchive(bigZipFile); } @Test public void testForbiddenZip64Entries() throws Exception { Path dst = getTestPath("testAllowedZip64Entries.zip"); long numEntries = Ints.USHRT_MAX + 1; try { createArchive(dst, numEntries, Zip64.Policy.FORBID); Assert.fail("Archive with " + numEntries + " entries should have failed"); } catch (IllegalStateException expected) { } } @Test public void testAllowedZip64Entries() throws Exception { Path dst = getTestPath("testAllowedZip64Entries.zip"); long numEntries = Ints.USHRT_MAX + 1; createArchive(dst, numEntries, Zip64.Policy.ALLOW); verifyArchive(dst); } private static void createArchive(Path dst, long numEntries, Zip64.Policy policy) throws IOException { byte[] empty = new byte[0]; try (ZipArchive archive = new ZipArchive(dst, policy)) { for (int i = 0; i < numEntries; i++) { BytesSource source = new BytesSource(empty, Integer.toString(i), NO_COMPRESSION); archive.add(source); } } } } zipflinger-7.2.2/test/src/java/com/android/zipflinger/ZipFlingerTest.java000066400000000000000000001321761430664457700265370ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.Channels; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.nio.file.StandardOpenOption; import java.nio.file.attribute.FileTime; import java.util.List; import java.util.Map; import java.util.Random; import java.util.zip.Deflater; import org.junit.Assert; import org.junit.Test; public class ZipFlingerTest extends AbstractZipflingerTest { private static final int COMP_SPED = Deflater.BEST_SPEED; private static final int COMP_NONE = Deflater.NO_COMPRESSION; @Test public void testDeleteRecord() throws Exception { Path src = getPath("1-2-3files.zip"); Path dst = getTestPath("testDeleteRecord.zip"); Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING); try (ZipArchive zipArchive = new ZipArchive(dst)) { zipArchive.delete("file2.txt"); } // Test zip is a valid archive. Map entries = ZipArchive.listEntries(dst); Assert.assertEquals("Num entries", 2, entries.size()); Assert.assertTrue("Entries contains file1.txt", entries.containsKey("file1.txt")); Assert.assertFalse("Entries contains file2.txt", entries.containsKey("file2.txt")); Assert.assertTrue("Entries contains file3.txt", entries.containsKey("file3.txt")); // Topdown parsing with SDK zip. verifyArchive(dst); } @Test public void testAddFileEntry() throws Exception { Path src = getPath("1-2-3files.zip"); Path dst = getTestPath("testAddFileEntry.zip"); Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING); try (ZipArchive zipArchive = new ZipArchive(dst)) { BytesSource bs = new BytesSource(getPath("file4.txt"), "file4.txt", COMP_NONE); zipArchive.add(bs); } Map entries = ZipArchive.listEntries(dst); Assert.assertEquals("Num entries", 4, entries.size()); Assert.assertTrue("Entries contains file1.txt", entries.containsKey("file1.txt")); Assert.assertTrue("Entries contains file2.txt", entries.containsKey("file2.txt")); Assert.assertTrue("Entries contains file3.txt", entries.containsKey("file3.txt")); Assert.assertTrue("Entries contains file4.txt", entries.containsKey("file4.txt")); // Topdown parsing with SDK zip. verifyArchive(dst); } @Test public void testAddCompressedEntry() throws Exception { Path src = getPath("1-2-3files.zip"); Path dst = getTestPath("testAddCompressedEntry.zip"); Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING); ZipArchive zipArchive = new ZipArchive(dst); BytesSource bs = new BytesSource(getPath("file4.txt"), "file4.txt", COMP_SPED); zipArchive.add(bs); zipArchive.close(); Map entries = ZipArchive.listEntries(dst); Assert.assertEquals("Num entries", 4, entries.size()); Assert.assertTrue("Entries contains file1.txt", entries.containsKey("file1.txt")); Assert.assertTrue("Entries contains file2.txt", entries.containsKey("file2.txt")); Assert.assertTrue("Entries contains file3.txt", entries.containsKey("file3.txt")); Assert.assertTrue("Entries contains file4.txt", entries.containsKey("file4.txt")); Entry file4 = entries.get("file4.txt"); Assert.assertNotEquals( "file4.txt size", file4.getCompressedSize(), file4.getUncompressedSize()); verifyArchive(dst); } @Test public void testModifyingClosedArchive() throws IOException { Path dst = getTestPath("newArchive.zip"); ZipArchive zipArchive = new ZipArchive(dst); zipArchive.close(); boolean exceptionCaught = false; try { zipArchive.add(new BytesSource(dst, "", COMP_NONE)); } catch (IllegalStateException e) { exceptionCaught = true; } Assert.assertTrue("Exception thrown on post-close add", exceptionCaught); exceptionCaught = false; try { zipArchive.add(new BytesSource(new byte[10], "deadbeed", COMP_SPED)); } catch (IllegalStateException e) { exceptionCaught = true; } Assert.assertTrue("Exception thrown on post-close addCommpressedSource", exceptionCaught); exceptionCaught = false; try { zipArchive.add(new ZipSource(getPath("1-2-3files.zip"))); } catch (IllegalStateException e) { exceptionCaught = true; } Assert.assertTrue("Exception thrown on post-close add", exceptionCaught); exceptionCaught = false; try { zipArchive.delete("null"); } catch (IllegalStateException e) { exceptionCaught = true; } Assert.assertTrue("Exception thrown on post-close delete", exceptionCaught); exceptionCaught = false; try { zipArchive.close(); } catch (IllegalStateException e) { exceptionCaught = true; } Assert.assertTrue("Exception thrown on double close", exceptionCaught); } @Test public void testFileSourceCompressed() throws IOException { Path src = getPath("1-2-3files.zip"); Path dst = getTestPath("testFileSourceCompressed.zip"); Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING); try (ZipArchive zipArchive = new ZipArchive(dst)) { BytesSource source = new BytesSource(getPath("file4.txt"), "file4.txt", COMP_SPED); zipArchive.add(source); } Map entries = ZipArchive.listEntries(dst); Entry entry = entries.get("file4.txt"); Assert.assertTrue( "File source was compressed", entry.getUncompressedSize() != entry.getCompressedSize()); } @Test public void testInputStreamSourceCompressed() throws IOException { Path src = getPath("1-2-3files.zip"); Path dst = getTestPath("testInputStreamSourceCompressed.zip"); Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING); try (ZipArchive zipArchive = new ZipArchive(dst)) { InputStream stream = Files.newInputStream(getPath("file4.txt")); BytesSource source = new BytesSource(stream, "file4.txt", COMP_SPED); zipArchive.add(source); } Map entries = ZipArchive.listEntries(dst); Entry entry = entries.get("file4.txt"); Assert.assertTrue( "File source was compressed", entry.getUncompressedSize() != entry.getCompressedSize()); } @Test public void testBytesSourceCompressed() throws IOException { Path src = getPath("1-2-3files.zip"); Path dst = getTestPath("testBytesSourceCompressed.zip"); Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING); try (ZipArchive zipArchive = new ZipArchive(dst)) { byte[] bytes = Files.readAllBytes(getPath("file4.txt")); BytesSource source = new BytesSource(bytes, "file4.txt", COMP_SPED); zipArchive.add(source); } Map entries = ZipArchive.listEntries(dst); Entry entry = entries.get("file4.txt"); Assert.assertTrue( "File source was compressed", entry.getUncompressedSize() != entry.getCompressedSize()); } @Test public void testFileSourceAlignment() throws IOException { for (long aligment : ALIGNMENTS) { testFileSourceAlignment(aligment); } } private static String makeString(int size) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < size; i++) { sb.append('f'); } return sb.toString(); } private void testFileSourceAlignment(long alignment) throws IOException { Path dst = getTestPath("testFileSourceAlignment-" + alignment + ".zip"); try (ZipArchive zipArchive = new ZipArchive(dst)) { for (int length = 0; length < alignment; length++) { String name = makeString(length); BytesSource source = new BytesSource(getPath("file4.txt"), name, COMP_NONE); source.align(alignment); zipArchive.add(source); } } Map entries = verifyArchive(dst); for (Entry entry : entries.values()) { String name = entry.getName(); String message = "FileSource align on " + alignment + "namesize=" + name.length(); Assert.assertEquals(message, 0, entry.getPayloadLocation().first % alignment); } Files.delete(dst); } @Test public void testBytesSourceAlignment() throws IOException { for (long aligment : ALIGNMENTS) { testBytesSourceAlignment(aligment); } } public void testBytesSourceAlignment(long alignment) throws IOException { Path dst = getTestPath("testBytesSourceAlignment-" + alignment + ".zip"); try (ZipArchive zipArchive = new ZipArchive(dst)) { byte[] bytes = Files.readAllBytes(getPath("file4.txt")); BytesSource fileSource = new BytesSource(bytes, "file4.txt", COMP_NONE); fileSource.align(alignment); zipArchive.add(fileSource); } Map entries = verifyArchive(dst); Entry entry = entries.get("file4.txt"); Assert.assertEquals( "BytesSource alignment", 0, entry.getPayloadLocation().first % alignment); Files.delete(dst); } @Test public void testZipSourceAlignment() throws IOException { for (long aligment : ALIGNMENTS) { testZipSourceAlignment(aligment); } } public void testZipSourceAlignment(long alignment) throws IOException { Path dst = getTestPath("testZipSourceAlignment-" + alignment + ".zip"); ZipSource source = new ZipSource(getPath("4-5files.zip")); source.select("file4.txt", "file4.txt", ZipSource.COMPRESSION_NO_CHANGE, alignment); source.select("file5.txt", "file5.txt", ZipSource.COMPRESSION_NO_CHANGE, alignment); try (ZipArchive zipArchive = new ZipArchive(dst)) { zipArchive.add(source); } Map entries = verifyArchive(dst); Entry entry = entries.get("file4.txt"); Assert.assertEquals("ZipSource alignment", 0, entry.getPayloadLocation().first % alignment); entry = entries.get("file5.txt"); Assert.assertEquals("ZipSource alignment", 0, entry.getPayloadLocation().first % alignment); Files.delete(dst); } @Test public void testInputSourceAlignment() throws IOException { for (long aligment : ALIGNMENTS) { testInputSourceAlignment(aligment); } } public void testInputSourceAlignment(long alignment) throws IOException { Path dst = getTestPath("testInputSourceAlignment.zip"); try (ZipArchive zipArchive = new ZipArchive(dst); InputStream stream = Files.newInputStream(getPath("file4.txt"))) { BytesSource source = new BytesSource(stream, "file4.txt", COMP_NONE); source.align(alignment); zipArchive.add(source); } Map entries = ZipArchive.listEntries(dst); Entry entry = entries.get("file4.txt"); Assert.assertEquals( "InputSource alignment", 0, entry.getPayloadLocation().first % alignment); Files.delete(dst); } @Test public void testNameCollision() throws IOException { ZipArchive zipArchive = new ZipArchive(getTestPath("nonexistent.zip")); Path file = getPath("1-2-3files.zip"); BytesSource source = new BytesSource(file, "name", COMP_NONE); boolean exceptionCaught = false; try { zipArchive.add(source); zipArchive.add(source); zipArchive.close(); } catch (IllegalStateException e) { exceptionCaught = true; } Assert.assertTrue("Name collision detected", exceptionCaught); } @Test public void testExistentDoubleDelete() throws IOException { Path src = getPath("1-2-3files.zip"); Path archive = getTestPath("testExistentDoubleDelete.zip"); Files.copy(src, archive, StandardCopyOption.REPLACE_EXISTING); try (ZipArchive zipArchive = new ZipArchive(archive)) { zipArchive.delete("file4.txt"); zipArchive.delete("file4.txt"); } } @Test public void testNonExistentDelete() throws IOException { Path src = getPath("1-2-3files.zip"); Path archive = getTestPath("testNonExistentDelete.zip"); Files.copy(src, archive, StandardCopyOption.REPLACE_EXISTING); try (ZipArchive zipArchive = new ZipArchive(archive)) { zipArchive.delete("non-existent.txt"); } } // Test deleting an entry resulting in virtual entry. @Test public void testVirtualEntryExistingEntryDeleted() throws IOException { Path file = getTestPath("testVirtualEntryExisting.zip"); try (ZipArchive archive = new ZipArchive(file)) { byte[] entry1Bytes = new byte[1_000]; BytesSource source1 = new BytesSource(entry1Bytes, "entry1", COMP_NONE); archive.add(source1); byte[] entry2Bytes = new byte[1_000]; BytesSource source2 = new BytesSource(entry2Bytes, "entry2", COMP_NONE); archive.add(source2); byte[] entry3Bytes = new byte[1_000]; BytesSource source3 = new BytesSource(entry3Bytes, "entry3", COMP_NONE); archive.add(source3); } try (ZipArchive archiveDeleter = new ZipArchive(file)) { archiveDeleter.delete("entry2"); } verifyArchive(file); } @Test public void testVirtualEntryNewEntryDeleted() throws IOException { Path file = getTestPath("testVirtualEntryNew.zip"); try (ZipArchive archive = new ZipArchive(file)) { byte[] entry1Bytes = new byte[1_000]; BytesSource source1 = new BytesSource(entry1Bytes, "entry1", COMP_NONE); archive.add(source1); byte[] entry2Bytes = new byte[1_000]; BytesSource source2 = new BytesSource(entry2Bytes, "entry2", COMP_NONE); archive.add(source2); byte[] entry3Bytes = new byte[1_000]; BytesSource source3 = new BytesSource(entry3Bytes, "entry3", COMP_NONE); archive.add(source3); archive.delete("entry2"); } verifyArchive(file); } @Test public void testVirtualEntryLargeDelete() throws IOException { Path file = getTestPath("testVirtualEntryLargeDelete.zip"); try (ZipArchive archive = new ZipArchive(file)) { byte[] padding1Bytes = new byte[1]; BytesSource source1 = new BytesSource(padding1Bytes, "padding1", COMP_NONE); archive.add(source1); byte[] entry2Bytes = new byte[1_000_000]; BytesSource source2 = new BytesSource(entry2Bytes, "entry1", COMP_NONE); archive.add(source2); BytesSource source3 = new BytesSource(padding1Bytes, "padding2", COMP_NONE); archive.add(source3); byte[] entry4Bytes = new byte[65_536]; BytesSource source4 = new BytesSource(entry4Bytes, "entry2", COMP_NONE); archive.add(source4); BytesSource source5 = new BytesSource(padding1Bytes, "padding3", COMP_NONE); archive.add(source5); byte[] entry6Bytes = new byte[32_767]; BytesSource source6 = new BytesSource(entry6Bytes, "entry3", COMP_NONE); archive.add(source6); BytesSource source7 = new BytesSource(padding1Bytes, "padding4", COMP_NONE); archive.add(source7); } try (ZipArchive archive = new ZipArchive(file)) { archive.delete("entry1"); archive.delete("entry2"); archive.delete("entry3"); } verifyArchive(file); } // Test deleting an entry resulting in multiple virtual entry (more than 64KiB entry). @Test public void testMultipleVirtualEntry() throws IOException { Path file = getTestPath("testMultipleVirtualEntry.zip"); try (ZipArchive archive = new ZipArchive(file)) { byte[] entry1Bytes = new byte[1_000]; BytesSource source1 = new BytesSource(entry1Bytes, "entry1", COMP_NONE); archive.add(source1); byte[] entry2Bytes = new byte[128_000_000]; BytesSource source2 = new BytesSource(entry2Bytes, "entry2", COMP_NONE); archive.add(source2); byte[] entry3Bytes = new byte[1_000]; BytesSource source3 = new BytesSource(entry3Bytes, "entry3", COMP_NONE); archive.add(source3); } verifyArchive(file); } @Test public void TestDirectories() throws IOException { Path file = getPath("zip_with_directories.zip"); Map entries = ZipArchive.listEntries(file); Assert.assertTrue("Folder found", entries.get("contents/").isDirectory()); Assert.assertTrue("Sub-folder found", entries.get("contents/folder/").isDirectory()); Assert.assertFalse("File1 found", entries.get("contents/folder/b.txt").isDirectory()); Assert.assertFalse("File2 found", entries.get("contents/a.txt").isDirectory()); } @Test public void testCompressionDetection() throws Exception { Path src = getPath("1-2-3files.zip"); Path dst = getTestPath("testCompressionDetection.zip"); Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING); try (ZipArchive zipArchive = new ZipArchive(dst)) { BytesSource source = new BytesSource(new byte[0], "file4.txt", COMP_NONE); zipArchive.add(source); } Map entries = ZipArchive.listEntries(dst); Assert.assertTrue("file1.txt is compressed", entries.get("file1.txt").isCompressed()); Assert.assertTrue("file2.txt is compressed", entries.get("file2.txt").isCompressed()); Assert.assertTrue("file3.txt is compressed", entries.get("file3.txt").isCompressed()); Assert.assertFalse("file4.txt is not compressed", entries.get("file4.txt").isCompressed()); } @Test public void testCompressionMode() throws Exception { Path archiveFile = getTestPath("testCompressionMode.zip"); Path input = getPath("text.txt"); try (ZipArchive zipArchive = new ZipArchive(archiveFile)) { BytesSource source = new BytesSource(input, "text.tx", Deflater.NO_COMPRESSION); zipArchive.add(source); } long storedSize = Files.size(archiveFile); Files.deleteIfExists(archiveFile); try (ZipArchive zipArchive = new ZipArchive(archiveFile)) { BytesSource source = new BytesSource(input, "text.tx", Deflater.BEST_SPEED); zipArchive.add(source); } long speedSize = Files.size(archiveFile); Assert.assertTrue("NO_COMPRESSION is bigger than BEST_SPEED", storedSize > speedSize); Files.deleteIfExists(archiveFile); try (ZipArchive zipArchive = new ZipArchive(archiveFile)) { BytesSource source = new BytesSource(input, "text.tx", Deflater.BEST_COMPRESSION); zipArchive.add(source); } long compressionSize = Files.size(archiveFile); Assert.assertTrue( "BEST_SPEED is bigger than BEST_COMPRESSION", speedSize > compressionSize); } @Test public void testZipEntryChangeCompression() throws Exception { Path src = getPath("two_files.zip"); Path dst = getTestPath("testZipEntryChanges.zip"); Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING); Map entries = ZipArchive.listEntries(src); Assert.assertTrue("Entry compressed", entries.get("compressed.random").isCompressed()); Assert.assertFalse("Entry !compressed", entries.get("uncompressed.random").isCompressed()); try (ZipArchive archive = new ZipArchive(dst)) { ZipSource zipSource = new ZipSource(src); zipSource.select( "uncompressed.random", "a", Deflater.NO_COMPRESSION, Source.NO_ALIGNMENT); zipSource.select("uncompressed.random", "b", Deflater.BEST_SPEED, Source.NO_ALIGNMENT); zipSource.select( "compressed.random", "c", Deflater.NO_COMPRESSION, Source.NO_ALIGNMENT); zipSource.select("compressed.random", "d", Deflater.BEST_SPEED, Source.NO_ALIGNMENT); archive.add(zipSource); } verifyArchive(dst); entries = ZipArchive.listEntries(dst); Assert.assertFalse("Entry a was modified", entries.get("a").isCompressed()); Assert.assertTrue("Entry b was not modified", entries.get("b").isCompressed()); Assert.assertFalse("Entry c was not modified", entries.get("c").isCompressed()); Assert.assertTrue("Entry d was modified", entries.get("d").isCompressed()); } @Test public void testZipExtraction() throws Exception { try (ZipArchive archive = new ZipArchive(getTestPath("testZipExtraction.zip"))) { // Add compressed file Path file1File = getPath("file1.txt"); byte[] file1Bytes = Files.readAllBytes(file1File); archive.add(new BytesSource(file1Bytes, "file1.txt", Deflater.BEST_SPEED)); ByteBuffer file1ByteBuffer = archive.getContent("file1.txt"); Assert.assertArrayEquals( "Extracted content does not match what was presented for compression", file1Bytes, toByteArray(file1ByteBuffer)); // Add uncompressed file archive.add(new BytesSource(file1Bytes, "file1-2.txt", Deflater.NO_COMPRESSION)); ByteBuffer file1_2ByteBuffer = archive.getContent("file1-2.txt"); Assert.assertArrayEquals( "Extracted content does not match what was presented for storage(uncompressed)", file1Bytes, toByteArray(file1_2ByteBuffer)); } } @Test public void testZipExtractionWithInputstream() throws Exception { Path file1Path = getPath("file1.txt"); byte[] file1Bytes = Files.readAllBytes(file1Path); Path path = getTestPath("testZipStreamExtraction.zip"); try (ZipArchive archive = new ZipArchive(path)) { // Add compressed file archive.add(new BytesSource(file1Bytes, "1", Deflater.BEST_SPEED)); } try (ZipArchive archive = new ZipArchive(path)) { InputStream file1Stream = archive.getInputStream("1"); Assert.assertTrue( "Extracted content does not match what was presented for compression", streamMatch(file1Stream, new ByteArrayInputStream(file1Bytes))); // Add uncompressed file archive.add(new BytesSource(file1Bytes, "file1-2.txt", Deflater.NO_COMPRESSION)); InputStream file1_2Stream = archive.getInputStream("file1-2.txt"); Assert.assertTrue( "Extracted content does not match what was presented for storage", streamMatch(file1_2Stream, new ByteArrayInputStream(file1Bytes))); } } @Test public void testZipExtractionFromJavaZip() throws Exception { Path[] files = {getPath("file1.txt"), getPath("file2.txt"), getPath("file3.txt")}; Path archive = getTestPath("testZipExtractionFromJavaZip.zip"); createZip(archive, files); try (ZipArchive zipArchive = new ZipArchive(archive)) { for (Path file : files) { byte[] fileBytes = Files.readAllBytes(file); byte[] archiveBytes = toByteArray(zipArchive.getContent(file.getFileName().toString())); Assert.assertArrayEquals(fileBytes, archiveBytes); } } } @Test public void testZipExtractionFromZipUtils() throws Exception { Path src = getPath("1-2-3files.zip"); Path dst = getTestPath("testZipExtractionFromZipUtils.zip"); Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING); try (ZipArchive archive = new ZipArchive(dst)) { Path[] files = {getPath("file1.txt"), getPath("file2.txt"), getPath("file3.txt")}; for (Path file : files) { byte[] fileBytes = Files.readAllBytes(file); byte[] archiveBytes = toByteArray(archive.getContent(file.getFileName().toString())); Assert.assertArrayEquals(fileBytes, archiveBytes); } } } @Test public void testVirtualSpecialEntry() throws Exception { // Test the case where the space to fill in a virtual entry is between // max uint16_t and (max uint16_t - LHF size - name size (=1)). // This is a edge case where the virtual entry filling algorithm has to account // for not consuming as much as possible but leave enough space for the next LFH. int entrySize = Math.toIntExact(Ints.USHRT_MAX - LocalFileHeader.LOCAL_FILE_HEADER_SIZE - 2); Path dst = getTestPath("testVirtualSpecialEntry.zip"); try (ZipArchive archive = new ZipArchive(dst)) { archive.add(new BytesSource(new byte[entrySize], "a", 0)); archive.add(new BytesSource(new byte[10], "b", 0)); archive.delete("a"); } } @Test public void testBigZipParsing() throws Exception { Path archive = getTestPath("testBigkZipParsing.zip"); int numFiles = 3; int sizePerFile = 1_000_000_000; createZip(numFiles, sizePerFile, archive); Assert.assertTrue(Files.size(archive) > numFiles * sizePerFile); try (ZipArchive zipArchive = new ZipArchive(archive)) { List list = zipArchive.listEntries(); Assert.assertEquals("Num entries differ", list.size(), 3); } Files.delete(archive); } @Test public void testBigZipGeneration() throws Exception { Path archive = getTestPath("testBigZipGeneration.zip"); try (ZipArchive zipArchive = new ZipArchive(archive)) { for (int i = 0; i < 3; i++) { byte[] bytes = new byte[1_000_000_000]; BytesSource source = new BytesSource(bytes, "file" + i, Deflater.NO_COMPRESSION); zipArchive.add(source); } } Assert.assertTrue("Zip file below expected size", Files.size(archive) > 3_000_000_000L); verifyArchive(archive); Files.delete(archive); } @Test // Regression test for b/143215332 where "int cannot be converted to ushort" in the case // gap filling space is a multiple of (65_535 + [30-33]) bytes public void testGapTooBigForOneVirtualEntry() throws Exception { Path dst = getTestPath("testGapTooBigForOneVirtualEntry.zip"); try (ZipArchive archive = new ZipArchive(dst)) { // This entry will result in a 30 (header) + 1 (filename length) + max ushort (payload) // size archive.add(new BytesSource(new byte[65_535], "1", 0)); archive.add(new BytesSource(new byte[0], "file2", 0)); } try (ZipArchive archive = new ZipArchive(dst)) { archive.delete("1"); } verifyArchive(dst); } @Test public void testDeleteSmallestPossibleEntry() throws Exception { Path dst = getTestPath("testDeleteSmallestPossibleEntry.zip"); try (ZipArchive archive = new ZipArchive(dst)) { archive.add(new BytesSource(new byte[0], "", 0)); archive.add(new BytesSource(new byte[0], "file2", 0)); } try (ZipArchive archive = new ZipArchive(dst)) { archive.delete(""); } verifyArchive(dst); } private ByteBuffer extractCentralDirectory(Path archivePath) throws IOException { ZipMap map = ZipMap.from(archivePath, false); Path cdDumpPath = getTestPath("cd_dump"); try (ZipWriter writer = new ZipWriter(cdDumpPath)) { map.getCentralDirectory().write(writer); } // Extract the CD from the archive byte[] cdBytes = Files.readAllBytes(cdDumpPath); return ByteBuffer.wrap(cdBytes).order(ByteOrder.LITTLE_ENDIAN); } @Test // Regression test for b/141861587 public void testAttributes() throws Exception { int fileSize = 4; Path dst = getTestPath("testMadeByZero.zip"); try (ZipArchive archive = new ZipArchive(dst)) { archive.add(new BytesSource(new byte[fileSize], "file1", 0)); } ByteBuffer cd = extractCentralDirectory(dst); // Check signature int signature = cd.getInt(); Assert.assertEquals("CD signature not found", signature, CentralDirectoryRecord.SIGNATURE); // Check version Made-kby short versionMadeBy = cd.getShort(); Assert.assertEquals("Version Made-By field", versionMadeBy, Source.MADE_BY_UNIX); // Just to make sure we have the right record, skip to size and usize and check there cd.position(cd.position() + 14); int compressedSize = cd.getInt(); Assert.assertEquals("Bad CSize", fileSize, compressedSize); int ucompressedSize = cd.getInt(); Assert.assertEquals("Bad USize", fileSize, ucompressedSize); cd.position(cd.position() + 10); int externalAttributes = cd.getInt(); int expectedAttributes = Source.PERMISSION_DEFAULT; Assert.assertEquals("External Attributes", expectedAttributes, externalAttributes); } @Test public void testFullFileSource() throws Exception { // Create an executable file Path execFilePath = getTestPath("x.exe"); Files.createFile(execFilePath); execFilePath.toFile().setExecutable(true); // Create a symbolic link Path symbFilePath = getTestPath("symb"); Files.createSymbolicLink(symbFilePath, execFilePath); // Create an archive dst containing both + a followed symbolic link Path dst = getTestPath("testFullFileSource.zip"); try (ZipArchive archive = new ZipArchive(dst)) { FullFileSource fs = new FullFileSource(execFilePath, "x", Deflater.NO_COMPRESSION); archive.add(fs); fs = new FullFileSource( symbFilePath, "s", Deflater.NO_COMPRESSION, FullFileSource.Symlink.DO_NOT_FOLLOW); archive.add(fs); fs = new FullFileSource(symbFilePath, "f", Deflater.NO_COMPRESSION); archive.add(fs); } ZipMap map = ZipMap.from(dst); // Check executable Entry x = map.getEntries().get("x"); boolean isExecutable = (x.getExternalAttributes() & Source.PERMISSION_EXEC) == Source.PERMISSION_EXEC; Assert.assertTrue("Executable attribute preserved", isExecutable); // Check symbolic link was not followed Entry s = map.getEntries().get("s"); boolean isSymbolicLink = (s.getExternalAttributes() & Source.PERMISSION_LINK) == Source.PERMISSION_LINK; Assert.assertTrue("SymbolicLink attribute preserved", isSymbolicLink); // Check symbolic link was followed Entry f = map.getEntries().get("f"); isSymbolicLink = (f.getExternalAttributes() & Source.PERMISSION_LINK) == Source.PERMISSION_LINK; Assert.assertFalse("SymbolicLink attribute preserved", isSymbolicLink); } @Test public void testZipMergingAttributes() throws Exception { // Create an executable file Path execFilePath = getTestPath("x.exe"); Files.createFile(execFilePath); execFilePath.toFile().setExecutable(true); // Create a symbolic link Path symbFilePath = getTestPath("symb"); Files.createSymbolicLink(symbFilePath, execFilePath); // Create an archive src containing both + a followed symbolic link Path src = getTestPath("testZipMergingAttributesSrc.zip"); try (ZipArchive archive = new ZipArchive(src)) { FullFileSource fs = new FullFileSource(execFilePath, "x", Deflater.NO_COMPRESSION); archive.add(fs); fs = new FullFileSource( symbFilePath, "s", Deflater.NO_COMPRESSION, FullFileSource.Symlink.DO_NOT_FOLLOW); archive.add(fs); fs = new FullFileSource(symbFilePath, "f", Deflater.NO_COMPRESSION); archive.add(fs); } // Transfer entries from one archive to an archive "dst" Path dst = getTestPath("testZipMergingAttributesDst.zip"); try (ZipArchive archive = new ZipArchive(dst)) { ZipSource zipSource = ZipSource.selectAll(src); archive.add(zipSource); } ZipMap map = ZipMap.from(dst); // Check executable Entry x = map.getEntries().get("x"); boolean isExecutable = (x.getExternalAttributes() & Source.PERMISSION_EXEC) == Source.PERMISSION_EXEC; Assert.assertTrue("Executable attribute preserved", isExecutable); // Check symbolic link was not followed Entry s = map.getEntries().get("s"); boolean isSymbolicLink = (s.getExternalAttributes() & Source.PERMISSION_LINK) == Source.PERMISSION_LINK; Assert.assertTrue("SymbolicLink attribute preserved", isSymbolicLink); // Check symbolic link was followed Entry f = map.getEntries().get("f"); isSymbolicLink = (f.getExternalAttributes() & Source.PERMISSION_LINK) == Source.PERMISSION_LINK; Assert.assertFalse("SymbolicLink attribute preserved", isSymbolicLink); } // Regression test for b/144189353 (JD9 treats zero time/data stamp as invalid). @Test public void testTimeAndDateNotZero() throws Exception { // Make sure the default values are not zero. Assert.assertNotEquals("Bad time", CentralDirectoryRecord.DEFAULT_TIME, 0); Assert.assertNotEquals("Bad date", CentralDirectoryRecord.DEFAULT_DATE, 0); Path dst = getTestPath("testTimeAndDateNotZero.zip"); try (ZipArchive archive = new ZipArchive(dst)) { archive.add(new BytesSource(new byte[0], "", 0)); } // Check Local File Header values ByteBuffer lfh = ByteBuffer.wrap(Files.readAllBytes(dst)).order(ByteOrder.LITTLE_ENDIAN); Assert.assertEquals("Bad time", CentralDirectoryRecord.DEFAULT_TIME, lfh.getShort(10)); Assert.assertEquals("Bad date", CentralDirectoryRecord.DEFAULT_DATE, lfh.getShort(12)); // Check Central Directory values ByteBuffer cd = extractCentralDirectory(dst); Assert.assertEquals("Bad time", CentralDirectoryRecord.DEFAULT_TIME, cd.getShort(12)); Assert.assertEquals("Bad date", CentralDirectoryRecord.DEFAULT_DATE, cd.getShort(14)); } @Test public void testEmptyArchive() throws Exception { Path dst = getTestPath("testEmptyArchive.zip"); try (ZipArchive archive = new ZipArchive(dst)) {} verifyArchive(dst); Assert.assertEquals( "Archive size differ from ECOD", Files.size(dst), EndOfCentralDirectory.SIZE); } @Test public void testParseReadOnlyFile() throws Exception { Path src = getPath("1-2-3files.zip"); FileTime lastModifiedTime = Files.getLastModifiedTime(src); try (ZipArchive archive = new ZipArchive(src)) { List entries = archive.listEntries(); Assert.assertEquals("Unexpected number of entries", entries.size(), 3); } FileTime modifiedTime = Files.getLastModifiedTime(src); Assert.assertEquals( "Archive should not have been modified", lastModifiedTime, modifiedTime); } @Test public void testInvalidLFHName() throws Exception { // Create a normal archive Path file = getTestPath("testInvalidLFHName.zip"); try (ZipArchive archive = new ZipArchive(file)) { BytesSource src = new BytesSource(new byte[0], "a", Deflater.NO_COMPRESSION); archive.add(src); } // Try to parse it. It should be fine ZipMap.from(file, false); // Make the LFH invalid by having the entry name length zero while the CD is left untouched BytesSource zeroSrc = new BytesSource(new byte[0], "", Deflater.NO_COMPRESSION); try (ZipWriter writer = new ZipWriter(file)) { LocalFileHeader lfh = new LocalFileHeader(zeroSrc); lfh.write(writer); } // Parsing should now fail String message = ""; try { ZipMap.from(file, false); } catch (IllegalStateException e) { message = e.getMessage(); } int indexOfParameter = ZipMap.LFH_LENGTH_ERROR.indexOf('%'); String constantString = ZipMap.LFH_LENGTH_ERROR.substring(0, indexOfParameter); Assert.assertTrue(message.startsWith(constantString)); } @Test public void testTransferFromInputStream() throws Exception { byte[] content1 = new byte[] {1, 2, 3, 4}; byte[] content2 = new byte[] {5, 6, 7, 8, 9, 10}; ByteArrayInputStream stream1 = new ByteArrayInputStream(content1); Path file = getTestPath("testTransferFromInputStream.zip"); try (ZipArchive archive = new ZipArchive(file)) { archive.add( new BytesSource(content1, "file1.txt", Deflater.NO_COMPRESSION) { @Override public long writeTo(ZipWriter writer) throws IOException { writer.transferFrom(Channels.newChannel(stream1), content1.length); return content1.length; } }); archive.add(new BytesSource(content2, "file2.txt", Deflater.NO_COMPRESSION)); } Map entries = verifyArchive(file); Assert.assertEquals("Num entries", 2, entries.size()); Assert.assertTrue("Entries contains file1.txt", entries.containsKey("file1.txt")); Assert.assertTrue("Entries contains file2.txt", entries.containsKey("file2.txt")); try (ZipArchive zip = new ZipArchive(file)) { Assert.assertEquals(ByteBuffer.wrap(content1), zip.getContent("file1.txt")); Assert.assertEquals(ByteBuffer.wrap(content2), zip.getContent("file2.txt")); } } private Path createRandomFile(String filename, byte[] bytes) throws IOException { Random random = new Random(0); random.nextBytes(bytes); Path path = getTestPath(filename); try (OutputStream out = Files.newOutputStream(path, StandardOpenOption.CREATE, StandardOpenOption.WRITE)) { out.write(bytes); } return path; } @Test public void testLargeSource() throws IOException { byte[] bytes = new byte[4096]; Path srcPath = createRandomFile("testLargeSource.txt", bytes); Path tmpPath = getTestPath("testLargeSourceTmpPath.tmp"); // Test compressed FileBackedSource Path compressedDstFile = getTestPath("testLargeSourceCompressed.zip"); try (ZipArchive zipArchive = new ZipArchive(compressedDstFile)) { LargeFileSource s = new LargeFileSource(srcPath, tmpPath, "x", 1); zipArchive.add(s); } verifyArchive(compressedDstFile); try (ZipRepo zipRepo = new ZipRepo(compressedDstFile)) { ByteBuffer buffer = zipRepo.getContent("x"); Assert.assertEquals("FileBacked entry differ", ByteBuffer.wrap(bytes), buffer); } Assert.assertFalse("LargeSource tmp file was not deleted", Files.exists(tmpPath)); // Test uncompressed FileBackedSource Path uncompressedDstFile = getTestPath("testLargeSourceUncompressed.zip"); try (ZipArchive zipArchive = new ZipArchive(uncompressedDstFile)) { LargeFileSource s = new LargeFileSource(srcPath, tmpPath, "x", 0); zipArchive.add(s); } verifyArchive(uncompressedDstFile); try (ZipRepo zipRepo = new ZipRepo(uncompressedDstFile)) { ByteBuffer buffer = zipRepo.getContent("x"); Assert.assertEquals("FileBacked entry differ", ByteBuffer.wrap(bytes), buffer); } Assert.assertFalse("LargeSource tmp file was not deleted", Files.exists(tmpPath)); } @Test public void testLargeCompressedSourceNoTmp() throws IOException { byte[] bytes = new byte[4096]; Path srcPath = createRandomFile("testLargeCompressedSourceNoTmp.txt", bytes); Path archiveFile = getTestPath("testLargeCompressedSourceNoTmp.zip"); try (ZipArchive zipArchive = new ZipArchive(archiveFile)) { LargeFileSource s = new LargeFileSource(srcPath, "x", 1); zipArchive.add(s); s = new LargeFileSource(srcPath, "y", 1); zipArchive.add(s); } verifyArchive(archiveFile); try (ZipRepo zipRepo = new ZipRepo(archiveFile)) { ByteBuffer buffer = zipRepo.getContent("x"); Assert.assertEquals("FileBacked entry differ", ByteBuffer.wrap(bytes), buffer); buffer = zipRepo.getContent("y"); Assert.assertEquals("FileBacked entry differ", ByteBuffer.wrap(bytes), buffer); } } @Test public void testDetectLargeFileTmpCollision() throws Exception { Path tmpCollider = getTestPath("tmpFileToCollide.txt"); Files.createFile(tmpCollider); Path fooSrc = getTestPath("testTmpCollisionSrc.txt"); Files.createFile(fooSrc); Path f = getTestPath("testTmpCollisionArchive.zip"); try (ZipArchive archive = new ZipArchive(f)) { LargeFileSource s = new LargeFileSource(fooSrc, tmpCollider, "x", 1); archive.add(s); Assert.fail("Tmp file collision not detected"); } catch (IllegalStateException e) { } } @Test public void testDetectBadParameter() throws Exception { Path fooPath = getTestPath("testDetectBadParameter.txt"); Files.createFile(fooPath); Path f = getTestPath("testDetectBadParameter.zip"); try (ZipArchive archive = new ZipArchive(f)) { LargeFileSource s = new LargeFileSource(fooPath, null, "x", 0); archive.add(s); try { s = new LargeFileSource(fooPath, null, "x", 1); archive.add(s); Assert.fail("Adding a compressed large file without a tmp path did not throw"); } catch (IllegalStateException e) { } } } @Test public void testSmallInputStream() throws Exception { int streamSize = 500; Path a = getTestPath("testSmallInputStreamCompression.zip"); runInputStreamSource(a, Deflater.BEST_COMPRESSION, streamSize, streamSize); Path b = getTestPath("testSmallInputStreamNoCompression.zip"); runInputStreamSource(b, Deflater.NO_COMPRESSION, streamSize, streamSize); } void runInputStreamSource(Path path, int compressionLevel, long streamSize, int large_limit) throws IOException { try (ZipArchive archive = new ZipArchive(path); InputStream in = new MockInputStream(streamSize)) { archive.add(Sources.from(in, "foo", compressionLevel, large_limit)); } try (ZipRepo zipRepo = new ZipRepo(path)) { InputStream actual = zipRepo.getInputStream("foo"); InputStream expected = new MockInputStream(streamSize); Assert.assertTrue("InputStream entry differ", streamMatch(actual, expected)); } verifyArchive(path); } private boolean streamMatch(InputStream as, InputStream es) throws IOException { while(true) { int a = as.read(); int e = es.read(); if (a != e) { return false; } if (a == -1) { return true; } } } @Test public void testLargeInputStream() throws Exception { int streamSize = 20000; Path a = getTestPath("testLargeInputStreamCompression.zip"); runInputStreamSource(a, Deflater.BEST_COMPRESSION, streamSize, 5000); Path b = getTestPath("testLargeInputStreamNoCompression.zip"); runInputStreamSource(b, Deflater.NO_COMPRESSION, streamSize, 5000); } } zipflinger-7.2.2/test/src/java/com/android/zipflinger/ZipMergeTest.java000066400000000000000000000037501430664457700262030ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import java.nio.file.Path; import java.util.Map; import org.junit.Assert; import org.junit.Test; public class ZipMergeTest extends AbstractZipflingerTest { // Test 64 not allowed // Test merge zip into an other one // Test create zip and merge an other one // Test skipper // Test relocator @Test public void testMergeZips() throws Exception { Path dst = getTestPath("newArchive.zip"); ZipArchive zipArchive = new ZipArchive(dst); ZipSource zs1 = ZipSource.selectAll(getPath("1-2-3files.zip")); zipArchive.add(zs1); ZipSource zs2 = ZipSource.selectAll(getPath("4-5files.zip")); zipArchive.add(zs2); zipArchive.close(); Map entries = ZipArchive.listEntries(dst); Assert.assertEquals("Num entries", 5, entries.size()); Assert.assertTrue("Entries contains file1.txt", entries.containsKey("file1.txt")); Assert.assertTrue("Entries contains file2.txt", entries.containsKey("file2.txt")); Assert.assertTrue("Entries contains file3.txt", entries.containsKey("file3.txt")); Assert.assertTrue("Entries contains file4.txt", entries.containsKey("file4.txt")); Assert.assertTrue("Entries contains file5.txt", entries.containsKey("file5.txt")); // Topdown parsing with SDK zip. verifyArchive(dst); } } zipflinger-7.2.2/tools/000077500000000000000000000000001430664457700150535ustar00rootroot00000000000000zipflinger-7.2.2/tools/BUILD000066400000000000000000000051611430664457700156400ustar00rootroot00000000000000java_binary( name = "verify", srcs = [ "src/com/android/zipflinger/Verify.java", ], main_class = "com.android.zipflinger.Verify", deps = [ "//tools/base/zipflinger", ], ) java_binary( name = "map", srcs = [ "src/com/android/zipflinger/Mapper.java", ], main_class = "com.android.zipflinger.Mapper", deps = [ "//tools/base/zipflinger", ], ) # Debug tool to create zip files directly with zipflinger java_binary( name = "zip", srcs = [ "src/com/android/zipflinger/ZipCreator.java", ], main_class = "com.android.zipflinger.ZipCreator", deps = [ "//tools/base/zipflinger", ], ) java_library( name = "profiler_lib", srcs = [ "src/com/android/zipflinger/ApkMaker.java", "src/com/android/zipflinger/Profiler.java", ], visibility = [ "//tools/base/signflinger/tools:__subpackages__", "//tools/base/zipflinger/tools:__subpackages__", ], deps = [ "//tools/base/zipflinger", ], ) java_binary( name = "profileAdd", srcs = [ "src/com/android/zipflinger/ProfileAdd.java", ], data = [ "resources/zipflinger.profile", ], jvm_flags = [ "-javaagent:$(location //tools/base/tracer:trace_agent)=$(location resources/zipflinger.profile)", ], main_class = "com.android.zipflinger.ProfileAdd", deps = [ ":profiler_lib", "//tools/base/tracer:tools.tracer", "//tools/base/tracer:trace_agent", "//tools/base/zipflinger", ], ) java_binary( name = "profileCreate", srcs = [ "src/com/android/zipflinger/ProfileCreate.java", ], data = [ "resources/zipflinger.profile", ], jvm_flags = [ "-javaagent:$(location //tools/base/tracer:trace_agent)=$(location resources/zipflinger.profile)", ], main_class = "com.android.zipflinger.ProfileCreate", deps = [ ":profiler_lib", "//tools/base/tracer:tools.tracer", "//tools/base/tracer:trace_agent", "//tools/base/zipflinger", ], ) java_binary( name = "profileCompressor", srcs = [ "src/com/android/zipflinger/ProfileCompressor.java", ], data = [ "resources/zipflinger.profile", ], jvm_flags = [ "-javaagent:$(location //tools/base/tracer:trace_agent)=$(location resources/zipflinger.profile)", ], main_class = "com.android.zipflinger.ProfileCompressor", deps = [ ":profiler_lib", "//tools/base/tracer:tools.tracer", "//tools/base/tracer:trace_agent", "//tools/base/zipflinger", ], ) zipflinger-7.2.2/tools/android.sdktools.zipflinger_tools.iml000066400000000000000000000014301430664457700244250ustar00rootroot00000000000000 zipflinger-7.2.2/tools/resources/000077500000000000000000000000001430664457700170655ustar00rootroot00000000000000zipflinger-7.2.2/tools/resources/zipflinger.profile000066400000000000000000000004021430664457700226140ustar00rootroot00000000000000# A set of trace points to trace Zipflinger Trace: com.android.zipflinger.ZipArchive::* Trace: com.android.zipflinger.ZipWriter::* Trace: com.android.zipflinger.ZipReader::* Trace: com.android.zipflinger.ZipMap::* Trace: com.android.zipflinger.Compressor::* zipflinger-7.2.2/tools/src/000077500000000000000000000000001430664457700156425ustar00rootroot00000000000000zipflinger-7.2.2/tools/src/com/000077500000000000000000000000001430664457700164205ustar00rootroot00000000000000zipflinger-7.2.2/tools/src/com/android/000077500000000000000000000000001430664457700200405ustar00rootroot00000000000000zipflinger-7.2.2/tools/src/com/android/zipflinger/000077500000000000000000000000001430664457700222115ustar00rootroot00000000000000zipflinger-7.2.2/tools/src/com/android/zipflinger/ApkMaker.java000066400000000000000000000055331430664457700245550ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import static com.android.zipflinger.Profiler.DEX_SIZE; import static com.android.zipflinger.Profiler.NUM_DEX; import static com.android.zipflinger.Profiler.NUM_RES; import static com.android.zipflinger.Profiler.RES_SIZE; import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Random; import java.util.zip.Deflater; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ApkMaker { public static void createWithDescriptors( long numRes, int resSize, int numDex, int dexSize, String path) throws IOException { Random r = new Random(1); try (OutputStream f = Files.newOutputStream(Paths.get(path)); ZipOutputStream s = new ZipOutputStream(f)) { byte[] resourceBytes = new byte[resSize]; for (int i = 0; i < numRes; i++) { String name = String.format("res/foo/bar/%06d", i); ZipEntry entry = new ZipEntry(name); s.putNextEntry(entry); s.setLevel(Deflater.NO_COMPRESSION); r.nextBytes(resourceBytes); s.write(resourceBytes); s.closeEntry(); } byte[] dexBytes = new byte[dexSize]; for (int i = 0; i < numDex; i++) { String name = String.format("classes%d.dex", i); ZipEntry entry = new ZipEntry(name); s.putNextEntry(entry); s.setLevel(Deflater.NO_COMPRESSION); r.nextBytes(dexBytes); s.write(dexBytes); s.closeEntry(); } } } public static void createArchive(Archive archive) throws IOException { Random r = new Random(0); byte[] dexBytes = new byte[DEX_SIZE]; r.nextBytes(dexBytes); for (int i = 0; i < NUM_DEX; i++) { archive.add(new BytesSource(dexBytes, "classes" + i + ".dex", Deflater.BEST_SPEED)); } byte[] resBytes = new byte[RES_SIZE]; r.nextBytes(resBytes); for (int i = 0; i < NUM_RES; i++) { archive.add(new BytesSource(resBytes, "res/foo/" + i, Deflater.NO_COMPRESSION)); } } } zipflinger-7.2.2/tools/src/com/android/zipflinger/Mapper.java000066400000000000000000000026771430664457700243140ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import java.io.IOException; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Map; public class Mapper { public static void main(String[] args) throws IOException { for (String archivePath : args) { map(archivePath); } } private static void map(String archivePath) throws IOException { Map entries = ZipMap.from(Paths.get(archivePath), true).getEntries(); ArrayList sortedEntries = new ArrayList<>(entries.values()); sortedEntries.sort((e1, e2) -> (int) (e1.getLocation().first - e2.getLocation().last)); for (Entry e : sortedEntries) { Location l = e.getLocation(); System.out.println(l.first + "-" + l.last + " (size=" + l.size() + ") :" + e.getName()); } } } zipflinger-7.2.2/tools/src/com/android/zipflinger/ProfileAdd.java000066400000000000000000000047741430664457700251010ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import static com.android.zipflinger.Profiler.DEX_SIZE; import static com.android.zipflinger.Profiler.NUM_DEX; import static com.android.zipflinger.Profiler.NUM_RES; import static com.android.zipflinger.Profiler.RES_SIZE; import static com.android.zipflinger.Profiler.WARM_UP_ITERATION; import static com.android.zipflinger.Profiler.displayParameters; import static com.android.zipflinger.Profiler.prettyPrint; import com.android.tools.tracer.Trace; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.zip.Deflater; public class ProfileAdd { public static void main(String[] args) throws IOException { Path src = Files.createTempDirectory("tmp" + System.nanoTime()); Files.createDirectories(src); Path zipFile = src.resolve("profileAdd.zip"); zipFile.toFile().deleteOnExit(); // Fake 32 MiB aapt2 like zip archive. ApkMaker.createWithDescriptors(NUM_RES, RES_SIZE, NUM_DEX, DEX_SIZE, zipFile.toString()); byte[] fakeDex = new byte[DEX_SIZE]; for (int i = 0; i < WARM_UP_ITERATION; i++) { editArchive(i, zipFile, fakeDex); } displayParameters(); Trace.start(); long start = System.nanoTime(); try (Trace t = Trace.begin("Editing archive")) { editArchive(WARM_UP_ITERATION, zipFile, fakeDex); } long end = System.nanoTime(); Trace.flush(); prettyPrint("Edit time (ms)", (int) ((end - start) / 1_000_000L)); } private static void editArchive(int i, Path file, byte[] data) throws IOException { try (ZipArchive archive = new ZipArchive(file)) { String entry = String.format("classes%d.dex", i); archive.delete(entry); BytesSource s = new BytesSource(data, entry, Deflater.NO_COMPRESSION); archive.add(s); } } } zipflinger-7.2.2/tools/src/com/android/zipflinger/ProfileCompressor.java000066400000000000000000000032751430664457700265400ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import static com.android.zipflinger.Profiler.DEX_SIZE; import com.android.tools.tracer.Trace; import java.io.IOException; import java.nio.ByteBuffer; import java.util.Random; import java.util.zip.Deflater; public class ProfileCompressor { public static void main(String[] args) throws IOException { byte[] bytes = new byte[DEX_SIZE]; // Warmup Compressor.deflate(bytes, Deflater.BEST_COMPRESSION); Compressor.deflate(bytes, Deflater.BEST_SPEED); Trace.start(); runProfiling(bytes); try (Trace t = Trace.begin("Randomizing")) { Random r = new Random(0); r.nextBytes(bytes); } runProfiling(bytes); } private static void runProfiling(byte[] bytes) throws IOException { ByteBuffer compressedBytes = null; for (int i = Deflater.BEST_COMPRESSION; i >= Deflater.BEST_SPEED; i--) { compressedBytes = Compressor.deflate(bytes, i); } ByteBuffer decompressedBytes = Compressor.inflate(compressedBytes.array()); } } zipflinger-7.2.2/tools/src/com/android/zipflinger/ProfileCreate.java000066400000000000000000000040321430664457700255770ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import static com.android.zipflinger.Profiler.WARM_UP_ITERATION; import static com.android.zipflinger.Profiler.displayParameters; import static com.android.zipflinger.Profiler.prettyPrint; import com.android.tools.tracer.Trace; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; public class ProfileCreate { public static void main(String[] args) throws IOException { Path src = Files.createTempDirectory("tmp" + System.nanoTime()); Files.createDirectories(src); for (int i = 0; i < WARM_UP_ITERATION; i++) { Path zipFile = src.resolve("profileCreate" + i + ".zip"); zipFile.toFile().deleteOnExit(); createArchive(zipFile); } displayParameters(); Path zipFile = src.resolve("profileCreate.zip"); zipFile.toFile().deleteOnExit(); Trace.start(); long start = System.nanoTime(); try (Trace trace = Trace.begin("Creating archive")) { createArchive(zipFile); } long end = System.nanoTime(); Trace.flush(); prettyPrint("Create time (ms)", (int) ((end - start) / 1_000_000L)); } static void createArchive(Path src) throws IOException { Path zipFile = src.resolve("profileCreate.zip"); try (ZipArchive archive = new ZipArchive(zipFile)) { ApkMaker.createArchive(archive); } } } zipflinger-7.2.2/tools/src/com/android/zipflinger/Profiler.java000066400000000000000000000031371430664457700246420ustar00rootroot00000000000000/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; public class Profiler { static final int NUM_RES = 2500; static final int RES_SIZE = 1 << 12; // 4 KiB static final int NUM_DEX = 10; static final int DEX_SIZE = 1 << 22; // 4 MiB private static final int TOTAL_APK_SIZE = RES_SIZE * NUM_RES + DEX_SIZE * NUM_DEX; public static final int WARM_UP_ITERATION = 2; public static void prettyPrint(String label, int value) { String string = String.format(" - %-17s %1s %5d", label, ":", value); System.out.println(string); } public static void displayParameters() { System.out.println("Profiling with an APK :"); prettyPrint("Total size (MiB)", TOTAL_APK_SIZE / (1 << 20)); prettyPrint("Num res", NUM_RES); prettyPrint("Size res (KiB)", RES_SIZE / (1 << 10)); prettyPrint("Num dex", NUM_DEX); prettyPrint("Size dex (MiB)", DEX_SIZE / (1 << 20)); System.out.println("Checkout your tmp folder for json traces"); } } zipflinger-7.2.2/tools/src/com/android/zipflinger/Verify.java000066400000000000000000000070601430664457700243230ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class Verify { public static void main(String[] args) throws IOException { for (String archivePath : args) { verifyArchive(Paths.get(archivePath)); } } private static Map verifyArchive(Path archiveFile) throws IOException { System.out.println("Verifying: '" + archiveFile + "'"); HashMap topDownEntries = new HashMap<>(); try (ZipInputStream zis = new ZipInputStream(Files.newInputStream(archiveFile))) { byte[] buffer = new byte[10_240]; ZipEntry zipEntry = zis.getNextEntry(); while (zipEntry != null) { ByteArrayOutputStream fos = new ByteArrayOutputStream(); int len; while ((len = zis.read(buffer)) > 0) { fos.write(buffer, 0, len); } fos.close(); if (!zipEntry.getName().isEmpty()) { topDownEntries.put(zipEntry.getName(), zipEntry); } zipEntry = zis.getNextEntry(); } zis.closeEntry(); } Map bottomUpEntries = ZipArchive.listEntries(archiveFile); if (topDownEntries.size() != bottomUpEntries.size()) { System.out.println("Bottom-up and Top-down # entries don't match!"); } else { System.out.println( "Both BU and TD parsing found " + topDownEntries.size() + " entries."); } for (String name : bottomUpEntries.keySet()) { if (!topDownEntries.keySet().contains(name)) { System.out.println(name + " found in bottom-up but not in top-down"); } } for (String name : topDownEntries.keySet()) { if (!bottomUpEntries.keySet().contains(name)) { System.out.println(name + " found in top-down but not in bottom-up"); } } // TODO: Compare sizes and crcs for (String name : bottomUpEntries.keySet()) { Entry e = bottomUpEntries.get(name); ZipEntry o = topDownEntries.get(name); long crc = e.getCrc() & 0xFFFFFFFFL; if (crc != o.getCrc()) { System.out.println("Entry " + name + " crcs don't match"); } if (e.getCompressedSize() != o.getCompressedSize()) { System.out.println("Entry " + name + " compressed size don't match"); } if (e.getUncompressedSize() != o.getSize()) { System.out.println("Entry " + name + " uncompressed size don't match"); } } return bottomUpEntries; } } zipflinger-7.2.2/tools/src/com/android/zipflinger/ZipCreator.java000066400000000000000000000025371430664457700251450ustar00rootroot00000000000000/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.zipflinger; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class ZipCreator { public static void main(String[] args) throws IOException { if (args.length < 2) { System.out.println("Usage: Zip dest [files_to_zip]"); return; } Path dst = Paths.get(args[0]); Files.deleteIfExists(dst); try (ZipArchive archive = new ZipArchive(dst)) { for (int i = 1; i < args.length; i++) { Path src = Paths.get(args[i]); BytesSource source = new BytesSource(src, src.getFileName().toString(), 0); archive.add(source); } } } }