From 788662d24928a789e1a983e6e9b35ed998ddf6b0 Mon Sep 17 00:00:00 2001
From: Johan Lindqvist <johli392@student.liu.se>
Date: Fri, 25 Oct 2019 22:45:08 +0900
Subject: [PATCH] Initial commit.

---
 LICENCE                                       |    0
 README.md                                     |   48 +
 app/.gitignore                                |    4 +
 app/AndroidManifest.xml                       |   52 +
 app/assets/models/andy.obj                    | 5003 +++++++++++++++++
 app/assets/models/andy.png                    |  Bin 0 -> 274616 bytes
 app/assets/models/andy_shadow.obj             |   18 +
 app/assets/models/andy_shadow.png             |  Bin 0 -> 28795 bytes
 app/assets/models/trigrid.png                 |  Bin 0 -> 37354 bytes
 app/assets/shaders/object.frag                |   73 +
 app/assets/shaders/object.vert                |   32 +
 app/assets/shaders/plane.frag                 |   31 +
 app/assets/shaders/plane.vert                 |   40 +
 app/assets/shaders/point_cloud.frag           |   21 +
 app/assets/shaders/point_cloud.vert           |   28 +
 app/assets/shaders/screenquad.frag            |   24 +
 app/assets/shaders/screenquad.vert            |   24 +
 app/build.gradle                              |   89 +
 app/jni/Android.mk                            |   46 +
 app/jni/Application.mk                        |    1 +
 app/jni/gstmredge.c                           | 1467 +++++
 app/res/layout/activity_about.xml             |   38 +
 app/res/layout/activity_arcore.xml            |   45 +
 app/res/layout/activity_edge.xml              |  101 +
 app/res/layout/activity_main.xml              |  284 +
 app/res/menu/main.xml                         |  118 +
 app/res/values/colors.xml                     |   13 +
 app/res/values/strings.xml                    |   79 +
 app/res/values/styles.xml                     |   12 +
 .../common/helpers/DisplayRotationHelper.java |  106 +
 .../java/common/helpers/FullScreenHelper.java |   47 +
 .../java/common/helpers/PermissionHelper.java |   84 +
 .../java/common/helpers/SnackbarHelper.java   |  106 +
 .../java/common/helpers/TapHelper.java        |   71 +
 .../common/rendering/BackgroundRenderer.java  |  219 +
 .../java/common/rendering/ObjectRenderer.java |  381 ++
 .../java/common/rendering/PlaneRenderer.java  |  448 ++
 .../common/rendering/PointCloudRenderer.java  |  155 +
 .../java/common/rendering/ShaderUtil.java     |   97 +
 app/src/main/assets/fontconfig/fonts.conf     |  126 +
 .../fontconfig/fonts/truetype/Ubuntu-R.ttf    |  Bin 0 -> 353824 bytes
 .../main/assets/ssl/certs/ca-certificates.crt | 4291 ++++++++++++++
 app/src/se/liu/mrleo/ARCoreActivity.java      |  511 ++
 app/src/se/liu/mrleo/AboutActivity.java       |   18 +
 app/src/se/liu/mrleo/EdgeActivity.java        | 2254 ++++++++
 app/src/se/liu/mrleo/MainActivity.java        |  397 ++
 app/src/se/liu/mrleo/edge/ImageEncoder.java   |   88 +
 app/src/se/liu/mrleo/edge/StillCamera.java    |  505 ++
 .../mrleo/edge/dialogs/BitrateSelector.java   |  139 +
 .../dialogs/CaptureResolutionSelector.java    |  154 +
 .../mrleo/edge/dialogs/FocusModeSelector.java |  136 +
 .../mrleo/edge/dialogs/MRObjectSelector.java  |  125 +
 .../edge/dialogs/MessageBoxFragment.java      |   39 +
 .../edge/dialogs/PacketSizeSelector.java      |  132 +
 .../edge/network/InternetConnection.java      |   60 +
 .../liu/mrleo/edge/network/TcpConnection.java |  292 +
 .../liu/mrleo/edge/network/UdpConnection.java |  253 +
 .../edge/streaming/GStreamerSurfaceView.java  |   85 +
 build.gradle                                  |   26 +
 gradle/wrapper/gradle-wrapper.jar             |  Bin 0 -> 53637 bytes
 gradle/wrapper/gradle-wrapper.properties      |    6 +
 gradlew                                       |  160 +
 rtplibrary/.gitignore                         |    1 +
 rtplibrary/LICENSE.txt                        |  201 +
 rtplibrary/README.md                          |  143 +
 rtplibrary/build.gradle                       |   22 +
 rtplibrary/proguard-rules.pro                 |   25 +
 rtplibrary/src/main/AndroidManifest.xml       |   12 +
 .../input/decoder/LoopFileInterface.java      |   10 +
 .../encoder/input/decoder/VideoDecoder.java   |  181 +
 .../input/decoder/VideoDecoderInterface.java  |   10 +
 .../com/pedro/encoder/input/gl/Sprite.java    |  174 +
 .../input/gl/SpriteGestureController.java     |   65 +
 .../encoder/input/gl/SurfaceManager.java      |  162 +
 .../pedro/encoder/input/gl/TextureLoader.java |   75 +
 .../input/gl/render/BaseRenderOffScreen.java  |   79 +
 .../encoder/input/gl/render/CameraRender.java |  129 +
 .../input/gl/render/ManagerRender.java        |  109 +
 .../input/gl/render/RenderHandler.java        |   32 +
 .../encoder/input/gl/render/ScreenRender.java |  139 +
 .../input/gl/render/SimpleCameraRender.java   |  160 +
 .../filters/AndroidViewFilterRender.java      |  132 +
 .../gl/render/filters/BaseFilterRender.java   |   79 +
 .../filters/BasicDeformationFilterRender.java |   90 +
 .../gl/render/filters/BeautyFilterRender.java |   87 +
 .../gl/render/filters/BlurFilterRender.java   |  103 +
 .../filters/BrightnessFilterRender.java       |  100 +
 .../render/filters/CartoonFilterRender.java   |   97 +
 .../gl/render/filters/ColorFilterRender.java  |  145 +
 .../render/filters/ContrastFilterRender.java  |  100 +
 .../render/filters/DuotoneFilterRender.java   |  198 +
 .../render/filters/EarlyBirdFilterRender.java |   87 +
 .../filters/EdgeDetectionFilterRender.java    |   84 +
 .../render/filters/ExposureFilterRender.java  |   97 +
 .../gl/render/filters/FireFilterRender.java   |   87 +
 .../gl/render/filters/GammaFilterRender.java  |  100 +
 .../render/filters/GreyScaleFilterRender.java |   84 +
 .../filters/HalftoneLinesFilterRender.java    |  157 +
 .../render/filters/Image70sFilterRender.java  |   84 +
 .../render/filters/LamoishFilterRender.java   |   84 +
 .../gl/render/filters/MoneyFilterRender.java  |   87 +
 .../render/filters/NegativeFilterRender.java  |   84 +
 .../gl/render/filters/NoFilterRender.java     |   84 +
 .../render/filters/PixelatedFilterRender.java |  106 +
 .../filters/PolygonizationFilterRender.java   |   87 +
 .../filters/RGBSaturationFilterRender.java    |  110 +
 .../render/filters/RainbowFilterRender.java   |   89 +
 .../gl/render/filters/RippleFilterRender.java |   97 +
 .../render/filters/RotationFilterRender.java  |  101 +
 .../filters/SaturationFilterRender.java       |  120 +
 .../gl/render/filters/SepiaFilterRender.java  |   84 +
 .../render/filters/SharpnessFilterRender.java |  103 +
 .../render/filters/SurfaceFilterRender.java   |  169 +
 .../filters/TemperatureFilterRender.java      |  107 +
 .../gl/render/filters/ZebraFilterRender.java  |  101 +
 .../object/BaseObjectFilterRender.java        |  165 +
 .../filters/object/GifObjectFilterRender.java |   38 +
 .../object/ImageObjectFilterRender.java       |   35 +
 .../object/TextObjectFilterRender.java        |   34 +
 .../input/video/Camera1ApiManager.java        |  426 ++
 .../input/video/Camera2ApiManager.java        |  540 ++
 .../encoder/input/video/CameraHelper.java     |   91 +
 .../input/video/CameraOpenException.java      |   12 +
 .../encoder/input/video/FaceDetectorUtil.java |   78 +
 .../pedro/encoder/input/video/FpsLimiter.java |   18 +
 .../com/pedro/encoder/input/video/Frame.java  |   54 +
 .../encoder/input/video/GetCameraData.java    |   10 +
 .../com/pedro/encoder/utils/CodecUtil.java    |  191 +
 .../java/com/pedro/encoder/utils/PCMUtil.java |   42 +
 .../encoder/utils/gl/GifStreamObject.java     |   95 +
 .../com/pedro/encoder/utils/gl/GlUtil.java    |  161 +
 .../encoder/utils/gl/ImageStreamObject.java   |   54 +
 .../encoder/utils/gl/StreamObjectBase.java    |   18 +
 .../encoder/utils/gl/TextStreamObject.java    |   76 +
 .../pedro/encoder/utils/gl/TranslateTo.java   |   10 +
 .../encoder/utils/gl/gif/GifDecoder.java      |  930 +++
 .../pedro/encoder/utils/gl/gif/GifFrame.java  |   54 +
 .../pedro/encoder/utils/gl/gif/GifHeader.java |   75 +
 .../encoder/utils/gl/gif/GifHeaderParser.java |  425 ++
 .../utils/gl/gif/SimpleBitmapProvider.java    |   37 +
 .../pedro/encoder/utils/yuv/NV21Utils.java    |  200 +
 .../com/pedro/encoder/utils/yuv/YUVUtil.java  |  244 +
 .../pedro/encoder/utils/yuv/YV12Utils.java    |  119 +
 .../encoder/video/FormatVideoEncoder.java     |   49 +
 .../com/pedro/encoder/video/GetVideoData.java |   21 +
 .../com/pedro/encoder/video/VideoEncoder.java |  660 +++
 .../pedro/rtplibrary/base/Camera1Base.java    |  583 ++
 .../pedro/rtplibrary/base/Camera2Base.java    |  573 ++
 .../pedro/rtplibrary/base/DisplayBase.java    |  370 ++
 .../pedro/rtplibrary/base/FromFileBase.java   |  472 ++
 .../network/AdapterBitrateParser.java         |   39 +
 .../rtplibrary/network/ByteArrayScanner.java  |  148 +
 .../network/ConnectionClassManager.java       |   94 +
 .../rtplibrary/network/LineBufferReader.java  |   89 +
 .../rtplibrary/network/QTagTxParser.java      |  145 +
 .../network/UploadBandwidthSampler.java       |  133 +
 .../pedro/rtplibrary/rtsp/RtspCamera1.java    |  109 +
 .../pedro/rtplibrary/rtsp/RtspCamera2.java    |  108 +
 .../pedro/rtplibrary/rtsp/RtspDisplay.java    |   72 +
 .../pedro/rtplibrary/rtsp/RtspFromFile.java   |  105 +
 .../rtplibrary/view/AutoFitTextureView.java   |   75 +
 .../com/pedro/rtplibrary/view/Filter.java     |   33 +
 .../pedro/rtplibrary/view/GlInterface.java    |  105 +
 .../rtplibrary/view/LightOpenGlView.java      |  139 +
 .../rtplibrary/view/OffScreenGlThread.java    |  229 +
 .../com/pedro/rtplibrary/view/OpenGlView.java |  152 +
 .../pedro/rtplibrary/view/OpenGlViewBase.java |  160 +
 .../rtplibrary/view/TakePhotoCallback.java    |    8 +
 .../com/pedro/rtsp/rtcp/BaseSenderReport.java |  130 +
 .../com/pedro/rtsp/rtcp/SenderReportTcp.java  |   44 +
 .../com/pedro/rtsp/rtcp/SenderReportUdp.java  |   55 +
 .../pedro/rtsp/rtp/packets/BasePacket.java    |   71 +
 .../pedro/rtsp/rtp/packets/H264Packet.java    |  124 +
 .../pedro/rtsp/rtp/packets/H265Packet.java    |  131 +
 .../rtsp/rtp/packets/VideoPacketCallback.java |    7 +
 .../pedro/rtsp/rtp/sockets/BaseRtpSocket.java |   28 +
 .../pedro/rtsp/rtp/sockets/RtpSocketTcp.java  |   54 +
 .../pedro/rtsp/rtp/sockets/RtpSocketUdp.java  |   64 +
 .../main/java/com/pedro/rtsp/rtsp/Body.java   |   54 +
 .../java/com/pedro/rtsp/rtsp/Protocol.java    |    9 +
 .../java/com/pedro/rtsp/rtsp/RtpFrame.java    |   69 +
 .../java/com/pedro/rtsp/rtsp/RtspClient.java  |  536 ++
 .../java/com/pedro/rtsp/rtsp/RtspSender.java  |  100 +
 .../java/com/pedro/rtsp/rtsp/VideoCodec.java  |    5 +
 .../java/com/pedro/rtsp/utils/AuthUtil.java   |   36 +
 .../pedro/rtsp/utils/ConnectCheckerRtsp.java  |   18 +
 .../com/pedro/rtsp/utils/CreateSSLSocket.java |   30 +
 .../com/pedro/rtsp/utils/RtpConstants.java    |   15 +
 .../pedro/rtsp/utils/TLSSocketFactory.java    |   77 +
 .../main/res/raw/android_view_fragment.glsl   |   14 +
 .../res/raw/basic_deformation_fragment.glsl   |   11 +
 .../src/main/res/raw/beauty_fragment.glsl     |  109 +
 .../src/main/res/raw/blur_fragment.glsl       |   28 +
 .../src/main/res/raw/brightness_fragment.glsl |   11 +
 .../src/main/res/raw/camera_fragment.glsl     |   11 +
 .../src/main/res/raw/cartoon_fragment.glsl    |   35 +
 .../src/main/res/raw/color_fragment.glsl      |   14 +
 .../src/main/res/raw/contrast_fragment.glsl   |   11 +
 .../src/main/res/raw/duotone_fragment.glsl    |   13 +
 .../src/main/res/raw/earlybird_fragment.glsl  |   50 +
 .../main/res/raw/edge_detection_fragment.glsl |   12 +
 .../src/main/res/raw/exposure_fragment.glsl   |   11 +
 .../src/main/res/raw/fire_fragment.glsl       |   21 +
 rtplibrary/src/main/res/raw/fxaa.glsl         |   77 +
 rtplibrary/src/main/res/raw/fxaa_pc.glsl      |   94 +
 .../src/main/res/raw/gamma_fragment.glsl      |   11 +
 .../src/main/res/raw/grey_scale_fragment.glsl |   12 +
 .../main/res/raw/halftone_lines_fragment.glsl |   84 +
 .../src/main/res/raw/image70s_fragment.glsl   |   14 +
 .../src/main/res/raw/lamoish_fragment.glsl    |   23 +
 .../src/main/res/raw/money_fragment.glsl      |   44 +
 .../src/main/res/raw/negative_fragment.glsl   |   10 +
 .../src/main/res/raw/object_fragment.glsl     |   19 +
 .../src/main/res/raw/object_vertex.glsl       |   15 +
 .../src/main/res/raw/pixelated_fragment.glsl  |   11 +
 .../main/res/raw/polygonization_fragment.glsl |   52 +
 .../src/main/res/raw/rainbow_fragment.glsl    |   40 +
 .../main/res/raw/rgb_saturation_fragment.glsl |   11 +
 .../src/main/res/raw/ripple_fragment.glsl     |   17 +
 .../src/main/res/raw/saturation_fragment.glsl |   23 +
 .../src/main/res/raw/sepia_fragment.glsl      |   14 +
 .../src/main/res/raw/sharpness_fragment.glsl  |   31 +
 .../src/main/res/raw/simple_fragment.glsl     |    9 +
 .../src/main/res/raw/simple_vertex.glsl       |   12 +
 .../src/main/res/raw/surface_fragment.glsl    |   20 +
 .../src/main/res/raw/surface_vertex.glsl      |   15 +
 .../main/res/raw/temperature_fragment.glsl    |   16 +
 .../src/main/res/raw/zebra_fragment.glsl      |   17 +
 rtplibrary/src/main/res/values/attrs.xml      |   25 +
 rtplibrary/src/main/res/values/strings.xml    |    3 +
 settings.gradle                               |    2 +
 231 files changed, 36087 insertions(+)
 create mode 100644 LICENCE
 create mode 100644 app/.gitignore
 create mode 100644 app/AndroidManifest.xml
 create mode 100755 app/assets/models/andy.obj
 create mode 100755 app/assets/models/andy.png
 create mode 100755 app/assets/models/andy_shadow.obj
 create mode 100755 app/assets/models/andy_shadow.png
 create mode 100755 app/assets/models/trigrid.png
 create mode 100755 app/assets/shaders/object.frag
 create mode 100755 app/assets/shaders/object.vert
 create mode 100755 app/assets/shaders/plane.frag
 create mode 100755 app/assets/shaders/plane.vert
 create mode 100755 app/assets/shaders/point_cloud.frag
 create mode 100755 app/assets/shaders/point_cloud.vert
 create mode 100755 app/assets/shaders/screenquad.frag
 create mode 100755 app/assets/shaders/screenquad.vert
 create mode 100644 app/build.gradle
 create mode 100644 app/jni/Android.mk
 create mode 100644 app/jni/Application.mk
 create mode 100644 app/jni/gstmredge.c
 create mode 100644 app/res/layout/activity_about.xml
 create mode 100644 app/res/layout/activity_arcore.xml
 create mode 100644 app/res/layout/activity_edge.xml
 create mode 100644 app/res/layout/activity_main.xml
 create mode 100644 app/res/menu/main.xml
 create mode 100644 app/res/values/colors.xml
 create mode 100644 app/res/values/strings.xml
 create mode 100644 app/res/values/styles.xml
 create mode 100755 app/src/arcore/examples/java/common/helpers/DisplayRotationHelper.java
 create mode 100755 app/src/arcore/examples/java/common/helpers/FullScreenHelper.java
 create mode 100755 app/src/arcore/examples/java/common/helpers/PermissionHelper.java
 create mode 100755 app/src/arcore/examples/java/common/helpers/SnackbarHelper.java
 create mode 100755 app/src/arcore/examples/java/common/helpers/TapHelper.java
 create mode 100755 app/src/arcore/examples/java/common/rendering/BackgroundRenderer.java
 create mode 100755 app/src/arcore/examples/java/common/rendering/ObjectRenderer.java
 create mode 100755 app/src/arcore/examples/java/common/rendering/PlaneRenderer.java
 create mode 100755 app/src/arcore/examples/java/common/rendering/PointCloudRenderer.java
 create mode 100755 app/src/arcore/examples/java/common/rendering/ShaderUtil.java
 create mode 100644 app/src/main/assets/fontconfig/fonts.conf
 create mode 100644 app/src/main/assets/fontconfig/fonts/truetype/Ubuntu-R.ttf
 create mode 100644 app/src/main/assets/ssl/certs/ca-certificates.crt
 create mode 100755 app/src/se/liu/mrleo/ARCoreActivity.java
 create mode 100644 app/src/se/liu/mrleo/AboutActivity.java
 create mode 100644 app/src/se/liu/mrleo/EdgeActivity.java
 create mode 100644 app/src/se/liu/mrleo/MainActivity.java
 create mode 100644 app/src/se/liu/mrleo/edge/ImageEncoder.java
 create mode 100644 app/src/se/liu/mrleo/edge/StillCamera.java
 create mode 100644 app/src/se/liu/mrleo/edge/dialogs/BitrateSelector.java
 create mode 100644 app/src/se/liu/mrleo/edge/dialogs/CaptureResolutionSelector.java
 create mode 100644 app/src/se/liu/mrleo/edge/dialogs/FocusModeSelector.java
 create mode 100644 app/src/se/liu/mrleo/edge/dialogs/MRObjectSelector.java
 create mode 100644 app/src/se/liu/mrleo/edge/dialogs/MessageBoxFragment.java
 create mode 100644 app/src/se/liu/mrleo/edge/dialogs/PacketSizeSelector.java
 create mode 100644 app/src/se/liu/mrleo/edge/network/InternetConnection.java
 create mode 100644 app/src/se/liu/mrleo/edge/network/TcpConnection.java
 create mode 100644 app/src/se/liu/mrleo/edge/network/UdpConnection.java
 create mode 100644 app/src/se/liu/mrleo/edge/streaming/GStreamerSurfaceView.java
 create mode 100644 build.gradle
 create mode 100644 gradle/wrapper/gradle-wrapper.jar
 create mode 100644 gradle/wrapper/gradle-wrapper.properties
 create mode 100755 gradlew
 create mode 100755 rtplibrary/.gitignore
 create mode 100755 rtplibrary/LICENSE.txt
 create mode 100755 rtplibrary/README.md
 create mode 100755 rtplibrary/build.gradle
 create mode 100755 rtplibrary/proguard-rules.pro
 create mode 100755 rtplibrary/src/main/AndroidManifest.xml
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/decoder/LoopFileInterface.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/decoder/VideoDecoder.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/decoder/VideoDecoderInterface.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/Sprite.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/SpriteGestureController.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/SurfaceManager.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/TextureLoader.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/BaseRenderOffScreen.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/CameraRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/ManagerRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/RenderHandler.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/ScreenRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/SimpleCameraRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/AndroidViewFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BaseFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BasicDeformationFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BeautyFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BlurFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BrightnessFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/CartoonFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/ColorFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/ContrastFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/DuotoneFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/EarlyBirdFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/EdgeDetectionFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/ExposureFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/FireFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/GammaFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/GreyScaleFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/HalftoneLinesFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/Image70sFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/LamoishFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/MoneyFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/NegativeFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/NoFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/PixelatedFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/PolygonizationFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/RGBSaturationFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/RainbowFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/RippleFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/RotationFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/SaturationFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/SepiaFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/SharpnessFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/SurfaceFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/TemperatureFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/ZebraFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/object/BaseObjectFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/object/GifObjectFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/object/ImageObjectFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/object/TextObjectFilterRender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/video/Camera1ApiManager.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/video/Camera2ApiManager.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/video/CameraHelper.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/video/CameraOpenException.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/video/FaceDetectorUtil.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/video/FpsLimiter.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/video/Frame.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/input/video/GetCameraData.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/utils/CodecUtil.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/utils/PCMUtil.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/utils/gl/GifStreamObject.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/utils/gl/GlUtil.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/utils/gl/ImageStreamObject.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/utils/gl/StreamObjectBase.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/utils/gl/TextStreamObject.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/utils/gl/TranslateTo.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/GifDecoder.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/GifFrame.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/GifHeader.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/GifHeaderParser.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/SimpleBitmapProvider.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/utils/yuv/NV21Utils.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/utils/yuv/YUVUtil.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/utils/yuv/YV12Utils.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/video/FormatVideoEncoder.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/video/GetVideoData.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/encoder/video/VideoEncoder.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera1Base.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera2Base.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/base/DisplayBase.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/base/FromFileBase.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/network/AdapterBitrateParser.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/network/ByteArrayScanner.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/network/ConnectionClassManager.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/network/LineBufferReader.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/network/QTagTxParser.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/network/UploadBandwidthSampler.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspCamera1.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspCamera2.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspDisplay.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspFromFile.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/view/AutoFitTextureView.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/view/Filter.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/view/GlInterface.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/view/LightOpenGlView.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/view/OffScreenGlThread.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlView.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlViewBase.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtplibrary/view/TakePhotoCallback.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/rtcp/BaseSenderReport.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/rtcp/SenderReportTcp.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/rtcp/SenderReportUdp.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/rtp/packets/BasePacket.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/rtp/packets/H264Packet.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/rtp/packets/H265Packet.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/rtp/packets/VideoPacketCallback.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/rtp/sockets/BaseRtpSocket.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/rtp/sockets/RtpSocketTcp.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/rtp/sockets/RtpSocketUdp.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/rtsp/Body.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/rtsp/Protocol.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/rtsp/RtpFrame.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/rtsp/RtspClient.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/rtsp/RtspSender.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/rtsp/VideoCodec.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/utils/AuthUtil.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/utils/ConnectCheckerRtsp.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/utils/CreateSSLSocket.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/utils/RtpConstants.java
 create mode 100644 rtplibrary/src/main/java/com/pedro/rtsp/utils/TLSSocketFactory.java
 create mode 100644 rtplibrary/src/main/res/raw/android_view_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/basic_deformation_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/beauty_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/blur_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/brightness_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/camera_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/cartoon_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/color_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/contrast_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/duotone_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/earlybird_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/edge_detection_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/exposure_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/fire_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/fxaa.glsl
 create mode 100644 rtplibrary/src/main/res/raw/fxaa_pc.glsl
 create mode 100644 rtplibrary/src/main/res/raw/gamma_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/grey_scale_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/halftone_lines_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/image70s_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/lamoish_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/money_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/negative_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/object_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/object_vertex.glsl
 create mode 100644 rtplibrary/src/main/res/raw/pixelated_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/polygonization_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/rainbow_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/rgb_saturation_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/ripple_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/saturation_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/sepia_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/sharpness_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/simple_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/simple_vertex.glsl
 create mode 100644 rtplibrary/src/main/res/raw/surface_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/surface_vertex.glsl
 create mode 100644 rtplibrary/src/main/res/raw/temperature_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/raw/zebra_fragment.glsl
 create mode 100644 rtplibrary/src/main/res/values/attrs.xml
 create mode 100755 rtplibrary/src/main/res/values/strings.xml
 create mode 100644 settings.gradle

diff --git a/LICENCE b/LICENCE
new file mode 100644
index 0000000..e69de29
diff --git a/README.md b/README.md
index e69de29..9408728 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1,48 @@
+MR-Leo - Android Client
+========================
+
+This repository contains an Android Studio project.
+
+### Building
+GStreamer development libraries for Android need to be installed on the system building the Android APK. 
+For installing those, see https://gstreamer.freedesktop.org/documentation/installing/for-android-development.html  
+
+Make sure that the system variable _GSTREAMER_ROOT_ANDROID_ has been set on the computer. On Ubuntu this can be fixed by adding
+`export GSTREAMER_ROOT_ANDROID="/<path_to_GStreamer_directory>` to the file _~/.profile_ and restarting the session.  
+
+The app has been tested with GStreamer 1.14.4: https://gstreamer.freedesktop.org/data/pkg/android/1.14.4/  
+
+Note that GStreamer 1.14.4 isn't compatible with the Clang compiler included in Android NDK 18b and later, the versions installed by Android Studio. You thus need to manually install NDK 17c, available at https://developer.android.com/ndk/downloads/older_releases, and then configure the Android Studio project to use that version (File➜Project Structure➜SDK Location➜Android NDK Location)  
+
+It contains a slightly modified version of https://github.com/pedroSG94/rtmp-rtsp-stream-client-java, which is used for streaming H.264 video using Android's MediaCodec framworks.
+
+### How to use Android Studio to build and run the app
+1. Enable Developer settings on your Android device. See https://www.greenbot.com/article/2457986/android/how-to-enable-developer-options-on-your-android-phone-or-tablet.html
+2. Enable USB Debugging in the Developer settings menu on your Android device.
+3. Open Android Studio
+4. Select _File➜Open➜Open File or Project_. Select the project.
+5. Connect your phone using a USB cable.
+6. Select _Build➜Make Project_.
+7. After it has successfully built the project, select _Run➜Run 'app'_.
+8. In the new options menu, select your phone.
+
+### Connecting the app to the server
+1. Make sure that the Android device and the PC that will act as a server are on the same WiFi network.
+2. Start the server (MR-Leo-server).
+3. Copy the IP address and port number printed to the console by the server.
+4. Start the app on the Android device.
+5. Enter the above IP address and port number to the main menu interface.
+6. Press the button _Edge MR_.
+7. After a point cloud is visible, press the green button to insert a 3D object to the scene. Remove the object with the red button.
+8. Change the configuration using the main menu (accesible from the menu button in the screen's top right).
+
+### Known limitations
+* Severe stuttering has been observed. It is under investigation.
+* The camera streaming doesn't support resuming operations after it has been suspended, i.e. the user has gone to the Android home screen or to another app. After it has been stopped it has to first be closed using the Android active apps list view (on many implementations swiped to the left) before it can be run again.
+* It will probably have many different issues on different phones.
+
+### Authors
+Johan Lindqvist  
+johli392@student.liu.se  
+johan.lindqvist@gmail.com  
+
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..5252475
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1,4 @@
+.externalNativeBuild/
+gst-build-*/
+src/org/freedesktop/gstreamer/GStreamer.java
+src/org/freedesktop/gstreamer/androidmedia
diff --git a/app/AndroidManifest.xml b/app/AndroidManifest.xml
new file mode 100644
index 0000000..db80bab
--- /dev/null
+++ b/app/AndroidManifest.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="se.liu.mrleo">
+
+    <uses-permission android:name="android.permission.CAMERA" />
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
+    <uses-feature android:name="android.hardware.camera" />
+    <uses-feature android:name="android.hardware.camera.autofocus" />
+    <uses-feature android:name="android.hardware.camera2.full" />
+    <uses-feature android:glEsVersion="0x00020000"/>
+    <uses-feature android:name="android.hardware.camera.ar" android:required="true"/>
+
+    <!-- Indicates that app requires ARCore ("AR Required"). Ensures app is only
+     visible in the Google Play Store on devices that support ARCore.
+     For "AR Optional" apps comment out this line. -->
+    <!-- <uses-feature android:name="android.hardware.camera.ar" /> -->
+
+    <application
+        android:allowBackup="true"
+        android:label="@string/app_name"
+        android:theme="@style/FullscreenTheme">
+
+        <activity
+            android:screenOrientation="landscape"
+            android:name="se.liu.mrleo.MainActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity>
+
+        <activity
+            android:screenOrientation="landscape"
+            android:name="se.liu.mrleo.ARCoreActivity"
+            />
+
+        <activity
+            android:screenOrientation="landscape"
+            android:name="se.liu.mrleo.AboutActivity"
+            />
+
+        <activity
+            android:screenOrientation="landscape"
+            android:name="se.liu.mrleo.EdgeActivity"
+            />
+
+        <meta-data android:name="com.google.ar.core" android:value="required" />
+
+    </application>
+</manifest>
diff --git a/app/assets/models/andy.obj b/app/assets/models/andy.obj
new file mode 100755
index 0000000..9097dea
--- /dev/null
+++ b/app/assets/models/andy.obj
@@ -0,0 +1,5003 @@
+# This file uses centimeters as units for non-parametric coordinates.
+
+g default
+v 0.036531 0.203676 -0.001768
+v 0.035000 0.204560 -0.002500
+v 0.033469 0.205443 -0.001768
+v 0.032835 0.205810 -0.000000
+v 0.033469 0.205443 0.001768
+v 0.035000 0.204560 0.002500
+v 0.036531 0.203676 0.001768
+v 0.037165 0.203310 -0.000000
+v 0.036951 0.204877 -0.001531
+v 0.035625 0.205642 -0.002165
+v 0.034299 0.206408 -0.001531
+v 0.033750 0.206725 -0.000000
+v 0.034299 0.206408 0.001531
+v 0.035625 0.205642 0.002165
+v 0.036951 0.204877 0.001531
+v 0.037500 0.204560 -0.000000
+v 0.036848 0.205993 -0.000884
+v 0.036083 0.206435 -0.001250
+v 0.035317 0.206877 -0.000884
+v 0.035000 0.207060 -0.000000
+v 0.035317 0.206877 0.000884
+v 0.036083 0.206435 0.001250
+v 0.036848 0.205993 0.000884
+v 0.037165 0.205810 -0.000000
+v 0.036250 0.206725 -0.000000
+v 0.027420 0.185957 0.006258
+v 0.020986 0.188283 0.004790
+v 0.020986 0.188283 -0.004790
+v 0.027420 0.185957 -0.006258
+v 0.028125 0.185957 0.000000
+v 0.021526 0.188283 0.000000
+v 0.024935 0.187127 0.002956
+v 0.026910 0.186366 0.002090
+v 0.022982 0.187924 0.002090
+v 0.024935 0.187127 -0.002956
+v 0.022982 0.187924 -0.002090
+v 0.026910 0.186366 -0.002090
+v 0.027766 0.186119 0.000000
+v 0.022169 0.188170 0.000000
+v -0.027420 0.185957 0.006258
+v -0.020986 0.188283 0.004790
+v -0.020986 0.188283 -0.004790
+v -0.027420 0.185957 -0.006258
+v -0.028125 0.185957 0.000000
+v -0.021526 0.188283 0.000000
+v -0.024935 0.187127 0.002956
+v -0.026910 0.186366 0.002090
+v -0.022982 0.187924 0.002090
+v -0.024935 0.187127 -0.002956
+v -0.022982 0.187924 -0.002090
+v -0.026910 0.186366 -0.002090
+v -0.027766 0.186119 0.000000
+v -0.022169 0.188170 0.000000
+v 0.000000 0.050001 -0.056250
+v -0.012517 0.050001 -0.054840
+v -0.024406 0.050001 -0.050679
+v -0.035071 0.050001 -0.043978
+v -0.043978 0.050001 -0.035071
+v -0.050679 0.050001 -0.024406
+v -0.054840 0.050001 -0.012517
+v -0.056250 0.050001 0.000000
+v -0.054840 0.050001 0.012517
+v -0.050679 0.050001 0.024406
+v -0.043978 0.050001 0.035071
+v -0.035071 0.050001 0.043978
+v -0.024406 0.050001 0.050679
+v -0.012517 0.050001 0.054840
+v 0.000000 0.050001 0.056250
+v 0.000000 0.040000 -0.046217
+v -0.010284 0.040000 -0.045058
+v -0.020053 0.040000 -0.041640
+v -0.028816 0.040000 -0.036134
+v -0.036134 0.040000 -0.028816
+v -0.041640 0.040000 -0.020053
+v -0.045058 0.040000 -0.010284
+v -0.046217 0.040000 0.000000
+v -0.045058 0.040000 0.010284
+v -0.041640 0.040000 0.020053
+v -0.036134 0.040000 0.028816
+v -0.028816 0.040000 0.036134
+v -0.020053 0.040000 0.041640
+v -0.010284 0.040000 0.045058
+v 0.000000 0.040000 0.046217
+v -0.034725 0.046910 0.043544
+v -0.024165 0.046910 0.050180
+v -0.012393 0.046910 0.054299
+v 0.000000 0.046910 0.055695
+v 0.000000 0.046910 -0.055695
+v -0.012393 0.046910 -0.054299
+v -0.024165 0.046910 -0.050180
+v -0.034725 0.046910 -0.043544
+v -0.043544 0.046910 -0.034725
+v -0.050180 0.046910 -0.024165
+v -0.054299 0.046910 -0.012393
+v -0.055695 0.046910 0.000000
+v -0.054299 0.046910 0.012393
+v -0.050180 0.046910 0.024165
+v -0.043544 0.046910 0.034725
+v -0.040731 0.041910 0.032482
+v -0.032482 0.041910 0.040731
+v -0.022604 0.041910 0.046938
+v -0.011593 0.041910 0.050791
+v 0.000000 0.041910 0.052098
+v 0.000000 0.041910 -0.052098
+v -0.011593 0.041910 -0.050791
+v -0.022604 0.041910 -0.046938
+v -0.032482 0.041910 -0.040731
+v -0.040731 0.041910 -0.032482
+v -0.046938 0.041910 -0.022604
+v -0.050791 0.041910 -0.011593
+v -0.052098 0.041910 0.000000
+v -0.050791 0.041910 0.011593
+v -0.046938 0.041910 0.022604
+v 0.012517 0.050001 -0.054840
+v 0.024406 0.050001 -0.050679
+v 0.035071 0.050001 -0.043978
+v 0.043978 0.050001 -0.035071
+v 0.050679 0.050001 -0.024406
+v 0.054840 0.050001 -0.012517
+v 0.056250 0.050001 0.000000
+v 0.054840 0.050001 0.012517
+v 0.050679 0.050001 0.024406
+v 0.043978 0.050001 0.035071
+v 0.035071 0.050001 0.043978
+v 0.024406 0.050001 0.050679
+v 0.012517 0.050001 0.054840
+v 0.010284 0.040000 -0.045058
+v 0.020053 0.040000 -0.041640
+v 0.028816 0.040000 -0.036134
+v 0.036134 0.040000 -0.028816
+v 0.041640 0.040000 -0.020053
+v 0.045058 0.040000 -0.010284
+v 0.046217 0.040000 0.000000
+v 0.045058 0.040000 0.010284
+v 0.041640 0.040000 0.020053
+v 0.036134 0.040000 0.028816
+v 0.028816 0.040000 0.036134
+v 0.020053 0.040000 0.041640
+v 0.010284 0.040000 0.045058
+v 0.034725 0.046910 0.043544
+v 0.024165 0.046910 0.050180
+v 0.012393 0.046910 0.054299
+v 0.012393 0.046910 -0.054299
+v 0.024165 0.046910 -0.050180
+v 0.034725 0.046910 -0.043544
+v 0.043544 0.046910 -0.034725
+v 0.050180 0.046910 -0.024165
+v 0.054299 0.046910 -0.012393
+v 0.055695 0.046910 0.000000
+v 0.054299 0.046910 0.012393
+v 0.050180 0.046910 0.024165
+v 0.043544 0.046910 0.034725
+v 0.040731 0.041910 0.032482
+v 0.032482 0.041910 0.040731
+v 0.022604 0.041910 0.046938
+v 0.011593 0.041910 0.050791
+v 0.011593 0.041910 -0.050791
+v 0.022604 0.041910 -0.046938
+v 0.032482 0.041910 -0.040731
+v 0.040731 0.041910 -0.032482
+v 0.046938 0.041910 -0.022604
+v 0.050791 0.041910 -0.011593
+v 0.052098 0.041910 0.000000
+v 0.050791 0.041910 0.011593
+v 0.046938 0.041910 0.022604
+v 0.000000 0.137500 0.000000
+v 0.000000 0.137500 0.054803
+v 0.000000 0.136062 0.056250
+v -0.012517 0.136062 0.054840
+v -0.012195 0.137500 0.053429
+v -0.024406 0.136062 0.050679
+v -0.023778 0.137500 0.049376
+v -0.035071 0.136062 0.043978
+v -0.034169 0.137500 0.042847
+v -0.043978 0.136062 0.035071
+v -0.042847 0.137500 0.034169
+v -0.050679 0.136062 0.024406
+v -0.049376 0.137500 0.023778
+v -0.054840 0.136062 0.012517
+v -0.053429 0.137500 0.012195
+v -0.056250 0.136062 0.000000
+v -0.054803 0.137500 0.000000
+v -0.054840 0.136062 -0.012517
+v -0.053429 0.137500 -0.012195
+v -0.050679 0.136062 -0.024406
+v -0.049376 0.137500 -0.023778
+v -0.043978 0.136062 -0.035071
+v -0.042847 0.137500 -0.034169
+v -0.035071 0.136062 -0.043978
+v -0.034169 0.137500 -0.042847
+v -0.024406 0.136062 -0.050679
+v -0.023778 0.137500 -0.049376
+v -0.012517 0.136062 -0.054840
+v -0.012195 0.137500 -0.053429
+v 0.000000 0.136062 -0.056250
+v 0.000000 0.137500 -0.054803
+v 0.012517 0.136062 0.054840
+v 0.012195 0.137500 0.053429
+v 0.024406 0.136062 0.050679
+v 0.023778 0.137500 0.049376
+v 0.035071 0.136062 0.043978
+v 0.034169 0.137500 0.042847
+v 0.043978 0.136062 0.035071
+v 0.042847 0.137500 0.034169
+v 0.050679 0.136062 0.024406
+v 0.049376 0.137500 0.023778
+v 0.054840 0.136062 0.012517
+v 0.053429 0.137500 0.012195
+v 0.056250 0.136062 0.000000
+v 0.054803 0.137500 0.000000
+v 0.054840 0.136062 -0.012517
+v 0.053429 0.137500 -0.012195
+v 0.050679 0.136062 -0.024406
+v 0.049376 0.137500 -0.023778
+v 0.043978 0.136062 -0.035071
+v 0.042847 0.137500 -0.034169
+v 0.035071 0.136062 -0.043978
+v 0.034169 0.137500 -0.042847
+v 0.024406 0.136062 -0.050679
+v 0.023778 0.137500 -0.049376
+v 0.012517 0.136062 -0.054840
+v 0.012195 0.137500 -0.053429
+v 0.000000 0.153477 -0.055769
+v -0.012410 0.153477 -0.054370
+v -0.024197 0.153477 -0.050246
+v -0.034771 0.153477 -0.043602
+v -0.043602 0.153477 -0.034771
+v -0.050246 0.153477 -0.024197
+v -0.054370 0.153477 -0.012410
+v -0.055769 0.153477 0.000000
+v -0.054370 0.153477 0.012410
+v -0.050246 0.153477 0.024197
+v -0.043602 0.153477 0.034771
+v -0.034771 0.153477 0.043602
+v -0.024197 0.153477 0.050246
+v -0.012410 0.153477 0.054370
+v 0.000000 0.153477 0.055769
+v 0.000000 0.159345 -0.054333
+v -0.012090 0.159345 -0.052971
+v -0.023574 0.159345 -0.048953
+v -0.033876 0.159345 -0.042479
+v -0.042480 0.159345 -0.033876
+v -0.048953 0.159345 -0.023574
+v -0.052971 0.159345 -0.012090
+v -0.054333 0.159345 0.000000
+v -0.052971 0.159345 0.012090
+v -0.048953 0.159345 0.023574
+v -0.042480 0.159345 0.033876
+v -0.033876 0.159345 0.042480
+v -0.023574 0.159345 0.048953
+v -0.012090 0.159345 0.052971
+v 0.000000 0.159345 0.054333
+v 0.000000 0.164974 -0.051968
+v -0.011564 0.164974 -0.050665
+v -0.022548 0.164974 -0.046822
+v -0.032402 0.164974 -0.040630
+v -0.040630 0.164974 -0.032402
+v -0.046822 0.164974 -0.022548
+v -0.050665 0.164974 -0.011564
+v -0.051968 0.164974 0.000000
+v -0.050665 0.164974 0.011564
+v -0.046822 0.164974 0.022548
+v -0.040630 0.164974 0.032402
+v -0.032402 0.164974 0.040630
+v -0.022548 0.164974 0.046822
+v -0.011564 0.164974 0.050665
+v 0.000000 0.164974 0.051968
+v 0.000000 0.170245 -0.048714
+v -0.010840 0.170245 -0.047493
+v -0.021136 0.170245 -0.043890
+v -0.030373 0.170245 -0.038086
+v -0.038086 0.170245 -0.030373
+v -0.043890 0.170245 -0.021136
+v -0.047493 0.170245 -0.010840
+v -0.048714 0.170245 0.000000
+v -0.047493 0.170245 0.010840
+v -0.043890 0.170245 0.021136
+v -0.038086 0.170245 0.030373
+v -0.030373 0.170245 0.038086
+v -0.021136 0.170245 0.043890
+v -0.010840 0.170245 0.047493
+v 0.000000 0.170245 0.048714
+v 0.000000 0.175052 -0.044626
+v -0.009930 0.175052 -0.043507
+v -0.019363 0.175052 -0.040207
+v -0.027824 0.175052 -0.034890
+v -0.034890 0.175052 -0.027824
+v -0.040207 0.175052 -0.019363
+v -0.043507 0.175052 -0.009930
+v -0.044626 0.175052 0.000000
+v -0.043507 0.175052 0.009930
+v -0.040207 0.175052 0.019363
+v -0.034890 0.175052 0.027824
+v -0.027824 0.175052 0.034890
+v -0.019363 0.175052 0.040207
+v -0.009930 0.175052 0.043507
+v 0.000000 0.175052 0.044626
+v 0.000000 0.179312 -0.039775
+v -0.008851 0.179312 -0.038777
+v -0.017258 0.179312 -0.035836
+v -0.024799 0.179312 -0.031097
+v -0.031097 0.179312 -0.024799
+v -0.035836 0.179312 -0.017258
+v -0.038777 0.179312 -0.008851
+v -0.039775 0.179312 0.000000
+v -0.038777 0.179312 0.008851
+v -0.035836 0.179312 0.017258
+v -0.031097 0.179312 0.024799
+v -0.024799 0.179312 0.031097
+v -0.017258 0.179312 0.035836
+v -0.008851 0.179312 0.038778
+v 0.000000 0.179312 0.039775
+v 0.000000 0.182961 -0.034243
+v -0.007620 0.182961 -0.033384
+v -0.014857 0.182961 -0.030852
+v -0.021350 0.182961 -0.026772
+v -0.026772 0.182961 -0.021350
+v -0.030852 0.182961 -0.014857
+v -0.033384 0.182961 -0.007620
+v -0.034243 0.182961 0.000000
+v -0.033384 0.182961 0.007620
+v -0.030852 0.182961 0.014857
+v -0.026772 0.182961 0.021350
+v -0.021350 0.182961 0.026772
+v -0.014857 0.182961 0.030852
+v -0.007620 0.182961 0.033384
+v 0.000000 0.182961 0.034243
+v 0.000000 0.185957 -0.028125
+v -0.006258 0.185957 -0.027420
+v -0.012203 0.185957 -0.025340
+v -0.017536 0.185957 -0.021989
+v -0.021989 0.185957 -0.017536
+v -0.025340 0.185957 -0.012203
+v -0.025340 0.185957 0.012203
+v -0.021989 0.185957 0.017536
+v -0.017536 0.185957 0.021989
+v -0.012203 0.185957 0.025340
+v -0.006258 0.185957 0.027420
+v 0.000000 0.185957 0.028125
+v 0.000000 0.188283 -0.021526
+v -0.004790 0.188283 -0.020986
+v -0.009340 0.188283 -0.019394
+v -0.013421 0.188283 -0.016830
+v -0.016830 0.188283 -0.013421
+v -0.019394 0.188283 -0.009340
+v -0.019394 0.188283 0.009340
+v -0.016830 0.188283 0.013421
+v -0.013421 0.188283 0.016830
+v -0.009340 0.188283 0.019394
+v -0.004790 0.188283 0.020986
+v 0.000000 0.188283 0.021526
+v 0.000000 0.189936 -0.014559
+v -0.003240 0.189936 -0.014194
+v -0.006317 0.189936 -0.013117
+v -0.009077 0.189936 -0.011382
+v -0.011382 0.189936 -0.009077
+v -0.013117 0.189936 -0.006317
+v -0.014194 0.189936 -0.003240
+v -0.014559 0.189936 0.000000
+v -0.014194 0.189936 0.003240
+v -0.013117 0.189936 0.006317
+v -0.011382 0.189936 0.009077
+v -0.009077 0.189936 0.011382
+v -0.006317 0.189936 0.013117
+v -0.003240 0.189936 0.014194
+v 0.000000 0.189936 0.014559
+v 0.000000 0.190922 -0.007342
+v -0.001634 0.190922 -0.007158
+v -0.003186 0.190922 -0.006615
+v -0.004578 0.190922 -0.005740
+v -0.005740 0.190922 -0.004578
+v -0.006615 0.190922 -0.003186
+v -0.007158 0.190922 -0.001634
+v -0.007342 0.190922 0.000000
+v -0.007158 0.190922 0.001634
+v -0.006615 0.190922 0.003186
+v -0.005740 0.190922 0.004578
+v -0.004578 0.190922 0.005740
+v -0.003186 0.190922 0.006615
+v -0.001634 0.190922 0.007158
+v 0.000000 0.190922 0.007342
+v 0.000000 0.191250 0.000000
+v 0.012410 0.153477 -0.054370
+v 0.024197 0.153477 -0.050246
+v 0.034771 0.153477 -0.043602
+v 0.043602 0.153477 -0.034771
+v 0.050246 0.153477 -0.024197
+v 0.054370 0.153477 -0.012410
+v 0.055769 0.153477 0.000000
+v 0.054370 0.153477 0.012410
+v 0.050246 0.153477 0.024197
+v 0.043602 0.153477 0.034771
+v 0.034771 0.153477 0.043602
+v 0.024197 0.153477 0.050246
+v 0.012410 0.153477 0.054370
+v 0.012090 0.159345 -0.052971
+v 0.023574 0.159345 -0.048953
+v 0.033876 0.159345 -0.042479
+v 0.042479 0.159345 -0.033876
+v 0.048953 0.159345 -0.023574
+v 0.052971 0.159345 -0.012090
+v 0.054333 0.159345 0.000000
+v 0.052971 0.159345 0.012090
+v 0.048953 0.159345 0.023574
+v 0.042480 0.159345 0.033876
+v 0.033876 0.159345 0.042480
+v 0.023574 0.159345 0.048953
+v 0.012090 0.159345 0.052971
+v 0.011564 0.164974 -0.050665
+v 0.022548 0.164974 -0.046822
+v 0.032402 0.164974 -0.040630
+v 0.040630 0.164974 -0.032402
+v 0.046822 0.164974 -0.022548
+v 0.050665 0.164974 -0.011564
+v 0.051968 0.164974 0.000000
+v 0.050665 0.164974 0.011564
+v 0.046822 0.164974 0.022548
+v 0.040630 0.164974 0.032402
+v 0.032402 0.164974 0.040630
+v 0.022548 0.164974 0.046822
+v 0.011564 0.164974 0.050665
+v 0.010840 0.170245 -0.047493
+v 0.021136 0.170245 -0.043890
+v 0.030373 0.170245 -0.038086
+v 0.038086 0.170245 -0.030373
+v 0.043890 0.170245 -0.021136
+v 0.047493 0.170245 -0.010840
+v 0.048714 0.170245 0.000000
+v 0.047493 0.170245 0.010840
+v 0.043890 0.170245 0.021136
+v 0.038086 0.170245 0.030373
+v 0.030373 0.170245 0.038086
+v 0.021136 0.170245 0.043890
+v 0.010840 0.170245 0.047493
+v 0.009930 0.175052 -0.043507
+v 0.019363 0.175052 -0.040207
+v 0.027824 0.175052 -0.034890
+v 0.034890 0.175052 -0.027824
+v 0.040207 0.175052 -0.019363
+v 0.043507 0.175052 -0.009930
+v 0.044626 0.175052 0.000000
+v 0.043507 0.175052 0.009930
+v 0.040207 0.175052 0.019363
+v 0.034890 0.175052 0.027824
+v 0.027824 0.175052 0.034890
+v 0.019363 0.175052 0.040207
+v 0.009930 0.175052 0.043507
+v 0.008851 0.179312 -0.038777
+v 0.017258 0.179312 -0.035836
+v 0.024799 0.179312 -0.031097
+v 0.031097 0.179312 -0.024799
+v 0.035836 0.179312 -0.017258
+v 0.038777 0.179312 -0.008851
+v 0.039775 0.179312 0.000000
+v 0.038777 0.179312 0.008851
+v 0.035836 0.179312 0.017258
+v 0.031097 0.179312 0.024799
+v 0.024799 0.179312 0.031097
+v 0.017258 0.179312 0.035836
+v 0.008851 0.179312 0.038777
+v 0.007620 0.182961 -0.033384
+v 0.014857 0.182961 -0.030852
+v 0.021350 0.182961 -0.026772
+v 0.026772 0.182961 -0.021350
+v 0.030852 0.182961 -0.014857
+v 0.033384 0.182961 -0.007620
+v 0.034243 0.182961 0.000000
+v 0.033384 0.182961 0.007620
+v 0.030852 0.182961 0.014857
+v 0.026772 0.182961 0.021350
+v 0.021350 0.182961 0.026772
+v 0.014857 0.182961 0.030852
+v 0.007620 0.182961 0.033384
+v 0.006258 0.185957 -0.027420
+v 0.012203 0.185957 -0.025340
+v 0.017536 0.185957 -0.021989
+v 0.021989 0.185957 -0.017536
+v 0.025340 0.185957 -0.012203
+v 0.025340 0.185957 0.012203
+v 0.021989 0.185957 0.017536
+v 0.017536 0.185957 0.021989
+v 0.012203 0.185957 0.025340
+v 0.006258 0.185957 0.027420
+v 0.004790 0.188283 -0.020986
+v 0.009340 0.188283 -0.019394
+v 0.013421 0.188283 -0.016830
+v 0.016830 0.188283 -0.013421
+v 0.019394 0.188283 -0.009340
+v 0.019394 0.188283 0.009340
+v 0.016830 0.188283 0.013421
+v 0.013421 0.188283 0.016830
+v 0.009340 0.188283 0.019394
+v 0.004790 0.188283 0.020986
+v 0.003240 0.189936 -0.014194
+v 0.006317 0.189936 -0.013117
+v 0.009077 0.189936 -0.011382
+v 0.011382 0.189936 -0.009077
+v 0.013117 0.189936 -0.006317
+v 0.014194 0.189936 -0.003240
+v 0.014559 0.189936 0.000000
+v 0.014194 0.189936 0.003240
+v 0.013117 0.189936 0.006317
+v 0.011382 0.189936 0.009077
+v 0.009077 0.189936 0.011382
+v 0.006317 0.189936 0.013117
+v 0.003240 0.189936 0.014194
+v 0.001634 0.190922 -0.007158
+v 0.003186 0.190922 -0.006615
+v 0.004578 0.190922 -0.005740
+v 0.005740 0.190922 -0.004578
+v 0.006615 0.190922 -0.003186
+v 0.007158 0.190922 -0.001634
+v 0.007342 0.190922 0.000000
+v 0.007158 0.190922 0.001634
+v 0.006615 0.190922 0.003186
+v 0.005740 0.190922 0.004578
+v 0.004578 0.190922 0.005740
+v 0.003186 0.190922 0.006615
+v 0.001634 0.190922 0.007158
+v 0.000000 0.147500 -0.054742
+v 0.000000 0.148994 -0.056130
+v -0.012490 0.148994 -0.054723
+v -0.012181 0.147500 -0.053369
+v -0.024354 0.148994 -0.050571
+v -0.023751 0.147500 -0.049320
+v -0.034996 0.148994 -0.043884
+v -0.034131 0.147500 -0.042799
+v -0.043884 0.148994 -0.034996
+v -0.042799 0.147500 -0.034131
+v -0.050571 0.148994 -0.024354
+v -0.049320 0.147500 -0.023751
+v -0.054723 0.148994 -0.012490
+v -0.053369 0.147500 -0.012181
+v -0.056130 0.148994 0.000000
+v -0.054742 0.147500 0.000000
+v -0.054723 0.148994 0.012490
+v -0.053369 0.147500 0.012181
+v -0.050571 0.148994 0.024354
+v -0.049320 0.147500 0.023751
+v -0.043884 0.148994 0.034996
+v -0.042799 0.147500 0.034131
+v -0.034996 0.148994 0.043884
+v -0.034131 0.147500 0.042799
+v -0.024354 0.148994 0.050571
+v -0.023751 0.147500 0.049320
+v -0.012490 0.148994 0.054723
+v -0.012181 0.147500 0.053369
+v 0.000000 0.148994 0.056130
+v 0.000000 0.147500 0.054742
+v 0.012490 0.148994 -0.054723
+v 0.012181 0.147500 -0.053369
+v 0.024354 0.148994 -0.050571
+v 0.023751 0.147500 -0.049320
+v 0.034996 0.148994 -0.043884
+v 0.034131 0.147500 -0.042799
+v 0.043884 0.148994 -0.034996
+v 0.042799 0.147500 -0.034131
+v 0.050571 0.148994 -0.024354
+v 0.049320 0.147500 -0.023751
+v 0.054723 0.148994 -0.012490
+v 0.053369 0.147500 -0.012181
+v 0.056130 0.148994 0.000000
+v 0.054742 0.147500 0.000000
+v 0.054723 0.148994 0.012490
+v 0.053369 0.147500 0.012181
+v 0.050571 0.148994 0.024354
+v 0.049320 0.147500 0.023751
+v 0.043884 0.148994 0.034996
+v 0.042799 0.147500 0.034131
+v 0.034996 0.148994 0.043884
+v 0.034131 0.147500 0.042799
+v 0.024354 0.148994 0.050571
+v 0.023751 0.147500 0.049320
+v 0.012490 0.148994 0.054723
+v 0.012181 0.147500 0.053369
+v 0.000000 0.147500 0.000000
+v -0.054402 0.044123 0.000000
+v -0.053038 0.044123 0.012106
+v -0.049014 0.044123 0.023604
+v -0.042533 0.044123 0.033919
+v -0.033919 0.044123 0.042533
+v -0.023604 0.044123 0.049014
+v -0.012106 0.044123 0.053038
+v 0.000000 0.044123 0.054402
+v 0.012106 0.044123 0.053038
+v 0.023604 0.044123 0.049014
+v 0.033919 0.044123 0.042533
+v 0.042533 0.044123 0.033919
+v 0.049014 0.044123 0.023604
+v 0.053038 0.044123 0.012106
+v 0.054402 0.044123 0.000000
+v 0.053038 0.044123 -0.012106
+v 0.049014 0.044123 -0.023604
+v 0.042533 0.044123 -0.033919
+v 0.033919 0.044123 -0.042533
+v 0.023604 0.044123 -0.049014
+v 0.012105 0.044123 -0.053038
+v 0.000000 0.044123 -0.054402
+v -0.012105 0.044123 -0.053038
+v -0.023604 0.044123 -0.049014
+v -0.033919 0.044123 -0.042533
+v -0.042533 0.044123 -0.033919
+v -0.049014 0.044123 -0.023604
+v -0.053038 0.044123 -0.012106
+v -0.049345 0.040490 0.000000
+v -0.048108 0.040490 0.010980
+v -0.044458 0.040490 0.021410
+v -0.038579 0.040490 0.030766
+v -0.030766 0.040490 0.038579
+v -0.021410 0.040490 0.044458
+v -0.010980 0.040490 0.048108
+v 0.000000 0.040490 0.049345
+v 0.010980 0.040490 0.048108
+v 0.021410 0.040490 0.044458
+v 0.030766 0.040490 0.038579
+v 0.038579 0.040490 0.030766
+v 0.044458 0.040490 0.021410
+v 0.048108 0.040490 0.010980
+v 0.049345 0.040490 0.000000
+v 0.048108 0.040490 -0.010980
+v 0.044458 0.040490 -0.021410
+v 0.038579 0.040490 -0.030766
+v 0.030766 0.040490 -0.038579
+v 0.021410 0.040490 -0.044458
+v 0.010980 0.040490 -0.048108
+v 0.000000 0.040490 -0.049345
+v -0.010980 0.040490 -0.048108
+v -0.021410 0.040490 -0.044458
+v -0.030766 0.040490 -0.038579
+v -0.038579 0.040490 -0.030766
+v -0.044458 0.040490 -0.021410
+v -0.048108 0.040490 -0.010980
+v -0.032286 0.040000 -0.000000
+v -0.030472 0.040000 0.006768
+v -0.025518 0.040000 0.011722
+v -0.018750 0.040000 0.013536
+v -0.011982 0.040000 0.011722
+v -0.007028 0.040000 0.006768
+v -0.005214 0.040000 -0.000000
+v -0.007028 0.040000 -0.006768
+v -0.011982 0.040000 -0.011723
+v -0.018750 0.040000 -0.013536
+v -0.025518 0.040000 -0.011723
+v -0.030472 0.040000 -0.006768
+v 0.000000 0.040000 0.000000
+v 0.032286 0.040000 -0.000000
+v 0.030472 0.040000 0.006768
+v 0.025518 0.040000 0.011722
+v 0.018750 0.040000 0.013536
+v 0.011982 0.040000 0.011722
+v 0.007028 0.040000 0.006768
+v 0.005214 0.040000 -0.000000
+v 0.007028 0.040000 -0.006768
+v 0.011982 0.040000 -0.011723
+v 0.018750 0.040000 -0.013536
+v 0.025518 0.040000 -0.011723
+v 0.030472 0.040000 -0.006768
+v 0.031250 0.012500 -0.000000
+v 0.029575 0.012500 0.006250
+v 0.025000 0.012500 0.010825
+v 0.018750 0.012500 0.012500
+v 0.012500 0.012500 0.010825
+v 0.007925 0.012500 0.006250
+v 0.006250 0.012500 -0.000000
+v 0.007925 0.012500 -0.006250
+v 0.012500 0.012500 -0.010826
+v 0.018750 0.012500 -0.012500
+v 0.025000 0.012500 -0.010826
+v 0.029575 0.012500 -0.006250
+v 0.062925 0.125000 -0.006250
+v 0.067500 0.125000 -0.010825
+v 0.073750 0.125000 -0.012500
+v 0.080000 0.125000 -0.010825
+v 0.084575 0.125000 -0.006250
+v 0.086250 0.125000 -0.000000
+v 0.084575 0.125000 0.006250
+v 0.080000 0.125000 0.010825
+v 0.073750 0.125000 0.012500
+v 0.067500 0.125000 0.010825
+v 0.062925 0.125000 0.006250
+v 0.061250 0.125000 -0.000000
+v 0.062925 0.075000 -0.006250
+v 0.067500 0.075000 -0.010825
+v 0.073750 0.075000 -0.012500
+v 0.080000 0.075000 -0.010825
+v 0.084575 0.075000 -0.006250
+v 0.086250 0.075000 0.000000
+v 0.084575 0.075000 0.006250
+v 0.080000 0.075000 0.010825
+v 0.073750 0.075000 0.012500
+v 0.067500 0.075000 0.010825
+v 0.062925 0.075000 0.006250
+v 0.061250 0.075000 0.000000
+v 0.025097 0.187407 0.002500
+v 0.023447 0.188085 0.001768
+v 0.022760 0.188360 0.000000
+v 0.023447 0.188085 -0.001768
+v 0.025097 0.187407 -0.002500
+v 0.026765 0.186760 -0.001768
+v 0.027488 0.186548 0.000000
+v 0.026765 0.186760 0.001768
+v 0.025000 0.039141 0.010825
+v 0.018750 0.039141 0.012500
+v 0.012500 0.039141 0.010825
+v 0.007925 0.039141 0.006250
+v 0.006250 0.039141 -0.000000
+v 0.007925 0.039141 -0.006250
+v 0.012500 0.039141 -0.010826
+v 0.018750 0.039141 -0.012500
+v 0.025000 0.039141 -0.010826
+v 0.029575 0.039141 -0.006250
+v 0.031250 0.039141 -0.000000
+v 0.029575 0.039141 0.006250
+v -0.033469 0.205443 -0.001768
+v -0.035000 0.204560 -0.002500
+v -0.036531 0.203676 -0.001768
+v -0.037165 0.203310 -0.000000
+v -0.036531 0.203676 0.001768
+v -0.035000 0.204560 0.002500
+v -0.033469 0.205443 0.001768
+v -0.032835 0.205810 -0.000000
+v -0.031250 0.012500 -0.000000
+v -0.029575 0.012500 0.006250
+v -0.025000 0.012500 0.010825
+v -0.018750 0.012500 0.012500
+v -0.012500 0.012500 0.010825
+v -0.007925 0.012500 0.006250
+v -0.006250 0.012500 -0.000000
+v -0.007925 0.012500 -0.006250
+v -0.012500 0.012500 -0.010826
+v -0.018750 0.012500 -0.012500
+v -0.025000 0.012500 -0.010826
+v -0.029575 0.012500 -0.006250
+v -0.025097 0.187407 0.002500
+v -0.023447 0.188085 0.001768
+v -0.022760 0.188360 0.000000
+v -0.023447 0.188085 -0.001768
+v -0.025097 0.187407 -0.002500
+v -0.026765 0.186760 -0.001768
+v -0.027488 0.186548 0.000000
+v -0.026765 0.186760 0.001768
+v -0.025000 0.039141 0.010825
+v -0.018750 0.039141 0.012500
+v -0.012500 0.039141 0.010825
+v -0.007925 0.039141 0.006250
+v -0.006250 0.039141 -0.000000
+v -0.007925 0.039141 -0.006250
+v -0.012500 0.039141 -0.010826
+v -0.018750 0.039141 -0.012500
+v -0.025000 0.039141 -0.010826
+v -0.029575 0.039141 -0.006250
+v -0.031250 0.039141 -0.000000
+v -0.029575 0.039141 0.006250
+v -0.036951 0.204877 -0.001531
+v -0.035625 0.205642 -0.002165
+v -0.034299 0.206408 -0.001531
+v -0.033750 0.206725 -0.000000
+v -0.034299 0.206408 0.001531
+v -0.035625 0.205642 0.002165
+v -0.036951 0.204877 0.001531
+v -0.037500 0.204560 -0.000000
+v -0.036848 0.205993 -0.000884
+v -0.036083 0.206435 -0.001250
+v -0.035317 0.206877 -0.000884
+v -0.035000 0.207060 -0.000000
+v -0.035317 0.206877 0.000884
+v -0.036083 0.206435 0.001250
+v -0.036848 0.205993 0.000884
+v -0.037165 0.205810 -0.000000
+v -0.036250 0.206725 -0.000000
+v -0.062925 0.125000 -0.006250
+v -0.067500 0.125000 -0.010825
+v -0.073750 0.125000 -0.012500
+v -0.080000 0.125000 -0.010825
+v -0.084575 0.125000 -0.006250
+v -0.086250 0.125000 -0.000000
+v -0.084575 0.125000 0.006250
+v -0.080000 0.125000 0.010825
+v -0.073750 0.125000 0.012500
+v -0.067500 0.125000 0.010825
+v -0.062925 0.125000 0.006250
+v -0.061250 0.125000 -0.000000
+v -0.062925 0.075000 -0.006250
+v -0.067500 0.075000 -0.010825
+v -0.073750 0.075000 -0.012500
+v -0.080000 0.075000 -0.010825
+v -0.084575 0.075000 -0.006250
+v -0.086250 0.075000 0.000000
+v -0.084575 0.075000 0.006250
+v -0.080000 0.075000 0.010825
+v -0.073750 0.075000 0.012500
+v -0.067500 0.075000 0.010825
+v -0.062925 0.075000 0.006250
+v -0.061250 0.075000 0.000000
+v -0.021552 0.000426 -0.001618
+v -0.020368 0.000426 -0.002802
+v -0.018750 0.000426 -0.003235
+v -0.017132 0.000426 -0.002802
+v -0.015948 0.000426 -0.001618
+v -0.015515 0.000426 -0.000000
+v -0.015948 0.000426 0.001617
+v -0.017132 0.000426 0.002802
+v -0.018750 0.000426 0.003235
+v -0.020368 0.000426 0.002802
+v -0.021552 0.000426 0.001617
+v -0.021985 0.000426 -0.000000
+v -0.024163 0.001675 -0.003125
+v -0.021875 0.001675 -0.005413
+v -0.018750 0.001675 -0.006250
+v -0.015625 0.001675 -0.005413
+v -0.013337 0.001675 -0.003125
+v -0.012500 0.001675 -0.000000
+v -0.013337 0.001675 0.003125
+v -0.015625 0.001675 0.005412
+v -0.018750 0.001675 0.006250
+v -0.021875 0.001675 0.005412
+v -0.024163 0.001675 0.003125
+v -0.025000 0.001675 -0.000000
+v -0.026405 0.003661 -0.004420
+v -0.023169 0.003661 -0.007655
+v -0.018750 0.003661 -0.008839
+v -0.014331 0.003661 -0.007655
+v -0.011095 0.003661 -0.004420
+v -0.009911 0.003661 -0.000000
+v -0.011095 0.003661 0.004419
+v -0.014331 0.003661 0.007654
+v -0.018750 0.003661 0.008839
+v -0.023169 0.003661 0.007654
+v -0.026405 0.003661 0.004419
+v -0.027589 0.003661 -0.000000
+v -0.028125 0.006250 -0.005413
+v -0.024163 0.006250 -0.009375
+v -0.018750 0.006250 -0.010825
+v -0.013337 0.006250 -0.009375
+v -0.009375 0.006250 -0.005413
+v -0.007925 0.006250 -0.000000
+v -0.009375 0.006250 0.005412
+v -0.013337 0.006250 0.009375
+v -0.018750 0.006250 0.010825
+v -0.024163 0.006250 0.009375
+v -0.028125 0.006250 0.005412
+v -0.029575 0.006250 -0.000000
+v -0.029207 0.009265 -0.006037
+v -0.024787 0.009265 -0.010457
+v -0.018750 0.009265 -0.012074
+v -0.012713 0.009265 -0.010457
+v -0.008294 0.009265 -0.006037
+v -0.006676 0.009265 -0.000000
+v -0.008294 0.009265 0.006037
+v -0.012713 0.009265 0.010456
+v -0.018750 0.009265 0.012074
+v -0.024787 0.009265 0.010456
+v -0.029207 0.009265 0.006037
+v -0.030824 0.009265 -0.000000
+v -0.018750 0.000000 -0.000000
+v -0.076552 0.062926 -0.001618
+v -0.075368 0.062926 -0.002802
+v -0.073750 0.062926 -0.003235
+v -0.072132 0.062926 -0.002802
+v -0.070948 0.062926 -0.001618
+v -0.070515 0.062926 0.000000
+v -0.070948 0.062926 0.001618
+v -0.072132 0.062926 0.002802
+v -0.073750 0.062926 0.003235
+v -0.075368 0.062926 0.002802
+v -0.076552 0.062926 0.001618
+v -0.076985 0.062926 0.000000
+v -0.079163 0.064174 -0.003125
+v -0.076875 0.064174 -0.005413
+v -0.073750 0.064174 -0.006250
+v -0.070625 0.064174 -0.005413
+v -0.068337 0.064174 -0.003125
+v -0.067500 0.064174 0.000000
+v -0.068337 0.064174 0.003125
+v -0.070625 0.064174 0.005413
+v -0.073750 0.064174 0.006250
+v -0.076875 0.064174 0.005413
+v -0.079163 0.064174 0.003125
+v -0.080000 0.064174 0.000000
+v -0.081405 0.066161 -0.004419
+v -0.078170 0.066161 -0.007655
+v -0.073750 0.066161 -0.008839
+v -0.069331 0.066161 -0.007655
+v -0.066095 0.066161 -0.004419
+v -0.064911 0.066161 0.000000
+v -0.066095 0.066161 0.004419
+v -0.069331 0.066161 0.007655
+v -0.073750 0.066161 0.008839
+v -0.078170 0.066161 0.007655
+v -0.081405 0.066161 0.004419
+v -0.082589 0.066161 0.000000
+v -0.083125 0.068750 -0.005413
+v -0.079163 0.068750 -0.009375
+v -0.073750 0.068750 -0.010825
+v -0.068337 0.068750 -0.009375
+v -0.064375 0.068750 -0.005413
+v -0.062925 0.068750 0.000000
+v -0.064375 0.068750 0.005413
+v -0.068337 0.068750 0.009375
+v -0.073750 0.068750 0.010825
+v -0.079163 0.068750 0.009375
+v -0.083125 0.068750 0.005413
+v -0.084575 0.068750 0.000000
+v -0.084207 0.071765 -0.006037
+v -0.079787 0.071765 -0.010456
+v -0.073750 0.071765 -0.012074
+v -0.067713 0.071765 -0.010456
+v -0.063294 0.071765 -0.006037
+v -0.061676 0.071765 0.000000
+v -0.063294 0.071765 0.006037
+v -0.067713 0.071765 0.010456
+v -0.073750 0.071765 0.012074
+v -0.079787 0.071765 0.010456
+v -0.084207 0.071765 0.006037
+v -0.085824 0.071765 0.000000
+v -0.073750 0.062500 0.000000
+v -0.076552 0.137074 -0.001618
+v -0.075368 0.137074 -0.002802
+v -0.073750 0.137074 -0.003235
+v -0.072132 0.137074 -0.002802
+v -0.070948 0.137074 -0.001618
+v -0.070515 0.137074 -0.000000
+v -0.070948 0.137074 0.001618
+v -0.072132 0.137074 0.002802
+v -0.073750 0.137074 0.003235
+v -0.075368 0.137074 0.002802
+v -0.076552 0.137074 0.001618
+v -0.076985 0.137074 -0.000000
+v -0.079163 0.135825 -0.003125
+v -0.076875 0.135825 -0.005413
+v -0.073750 0.135825 -0.006250
+v -0.070625 0.135825 -0.005413
+v -0.068337 0.135825 -0.003125
+v -0.067500 0.135825 -0.000000
+v -0.068337 0.135825 0.003125
+v -0.070625 0.135825 0.005413
+v -0.073750 0.135825 0.006250
+v -0.076875 0.135825 0.005413
+v -0.079163 0.135825 0.003125
+v -0.080000 0.135825 -0.000000
+v -0.081405 0.133839 -0.004419
+v -0.078170 0.133839 -0.007655
+v -0.073750 0.133839 -0.008839
+v -0.069331 0.133839 -0.007655
+v -0.066095 0.133839 -0.004419
+v -0.064911 0.133839 -0.000000
+v -0.066095 0.133839 0.004419
+v -0.069331 0.133839 0.007655
+v -0.073750 0.133839 0.008839
+v -0.078170 0.133839 0.007655
+v -0.081405 0.133839 0.004419
+v -0.082589 0.133839 -0.000000
+v -0.083125 0.131250 -0.005413
+v -0.079163 0.131250 -0.009375
+v -0.073750 0.131250 -0.010825
+v -0.068337 0.131250 -0.009375
+v -0.064375 0.131250 -0.005413
+v -0.062925 0.131250 -0.000000
+v -0.064375 0.131250 0.005413
+v -0.068337 0.131250 0.009375
+v -0.073750 0.131250 0.010825
+v -0.079163 0.131250 0.009375
+v -0.083125 0.131250 0.005413
+v -0.084575 0.131250 -0.000000
+v -0.084207 0.128235 -0.006037
+v -0.079787 0.128235 -0.010456
+v -0.073750 0.128235 -0.012074
+v -0.067713 0.128235 -0.010456
+v -0.063294 0.128235 -0.006037
+v -0.061676 0.128235 -0.000000
+v -0.063294 0.128235 0.006037
+v -0.067713 0.128235 0.010456
+v -0.073750 0.128235 0.012074
+v -0.079787 0.128235 0.010456
+v -0.084207 0.128235 0.006037
+v -0.085824 0.128235 -0.000000
+v -0.073750 0.137500 -0.000000
+v 0.021552 0.000426 -0.001618
+v 0.020368 0.000426 -0.002802
+v 0.018750 0.000426 -0.003235
+v 0.017132 0.000426 -0.002802
+v 0.015948 0.000426 -0.001618
+v 0.015515 0.000426 -0.000000
+v 0.015948 0.000426 0.001617
+v 0.017132 0.000426 0.002802
+v 0.018750 0.000426 0.003235
+v 0.020368 0.000426 0.002802
+v 0.021552 0.000426 0.001617
+v 0.021985 0.000426 -0.000000
+v 0.024163 0.001675 -0.003125
+v 0.021875 0.001675 -0.005413
+v 0.018750 0.001675 -0.006250
+v 0.015625 0.001675 -0.005413
+v 0.013337 0.001675 -0.003125
+v 0.012500 0.001675 -0.000000
+v 0.013337 0.001675 0.003125
+v 0.015625 0.001675 0.005412
+v 0.018750 0.001675 0.006250
+v 0.021875 0.001675 0.005412
+v 0.024163 0.001675 0.003125
+v 0.025000 0.001675 -0.000000
+v 0.026405 0.003661 -0.004420
+v 0.023169 0.003661 -0.007655
+v 0.018750 0.003661 -0.008839
+v 0.014331 0.003661 -0.007655
+v 0.011095 0.003661 -0.004420
+v 0.009911 0.003661 -0.000000
+v 0.011095 0.003661 0.004419
+v 0.014331 0.003661 0.007654
+v 0.018750 0.003661 0.008839
+v 0.023169 0.003661 0.007654
+v 0.026405 0.003661 0.004419
+v 0.027589 0.003661 -0.000000
+v 0.028125 0.006250 -0.005413
+v 0.024163 0.006250 -0.009375
+v 0.018750 0.006250 -0.010825
+v 0.013337 0.006250 -0.009375
+v 0.009375 0.006250 -0.005413
+v 0.007925 0.006250 -0.000000
+v 0.009375 0.006250 0.005412
+v 0.013337 0.006250 0.009375
+v 0.018750 0.006250 0.010825
+v 0.024163 0.006250 0.009375
+v 0.028125 0.006250 0.005412
+v 0.029575 0.006250 -0.000000
+v 0.029207 0.009265 -0.006037
+v 0.024787 0.009265 -0.010457
+v 0.018750 0.009265 -0.012074
+v 0.012713 0.009265 -0.010457
+v 0.008294 0.009265 -0.006037
+v 0.006676 0.009265 -0.000000
+v 0.008294 0.009265 0.006037
+v 0.012713 0.009265 0.010456
+v 0.018750 0.009265 0.012074
+v 0.024787 0.009265 0.010456
+v 0.029207 0.009265 0.006037
+v 0.030824 0.009265 -0.000000
+v 0.018750 0.000000 -0.000000
+v 0.076552 0.062926 -0.001618
+v 0.075368 0.062926 -0.002802
+v 0.073750 0.062926 -0.003235
+v 0.072132 0.062926 -0.002802
+v 0.070948 0.062926 -0.001618
+v 0.070515 0.062926 0.000000
+v 0.070948 0.062926 0.001618
+v 0.072132 0.062926 0.002802
+v 0.073750 0.062926 0.003235
+v 0.075368 0.062926 0.002802
+v 0.076552 0.062926 0.001618
+v 0.076985 0.062926 0.000000
+v 0.079163 0.064174 -0.003125
+v 0.076875 0.064174 -0.005413
+v 0.073750 0.064174 -0.006250
+v 0.070625 0.064174 -0.005413
+v 0.068337 0.064174 -0.003125
+v 0.067500 0.064174 0.000000
+v 0.068337 0.064174 0.003125
+v 0.070625 0.064174 0.005413
+v 0.073750 0.064174 0.006250
+v 0.076875 0.064174 0.005413
+v 0.079163 0.064174 0.003125
+v 0.080000 0.064174 0.000000
+v 0.081405 0.066161 -0.004419
+v 0.078170 0.066161 -0.007655
+v 0.073750 0.066161 -0.008839
+v 0.069331 0.066161 -0.007655
+v 0.066095 0.066161 -0.004419
+v 0.064911 0.066161 0.000000
+v 0.066095 0.066161 0.004419
+v 0.069331 0.066161 0.007655
+v 0.073750 0.066161 0.008839
+v 0.078170 0.066161 0.007655
+v 0.081405 0.066161 0.004419
+v 0.082589 0.066161 0.000000
+v 0.083125 0.068750 -0.005413
+v 0.079163 0.068750 -0.009375
+v 0.073750 0.068750 -0.010825
+v 0.068337 0.068750 -0.009375
+v 0.064375 0.068750 -0.005413
+v 0.062925 0.068750 0.000000
+v 0.064375 0.068750 0.005413
+v 0.068337 0.068750 0.009375
+v 0.073750 0.068750 0.010825
+v 0.079163 0.068750 0.009375
+v 0.083125 0.068750 0.005413
+v 0.084575 0.068750 0.000000
+v 0.084207 0.071765 -0.006037
+v 0.079787 0.071765 -0.010456
+v 0.073750 0.071765 -0.012074
+v 0.067713 0.071765 -0.010456
+v 0.063294 0.071765 -0.006037
+v 0.061676 0.071765 0.000000
+v 0.063294 0.071765 0.006037
+v 0.067713 0.071765 0.010456
+v 0.073750 0.071765 0.012074
+v 0.079787 0.071765 0.010456
+v 0.084207 0.071765 0.006037
+v 0.085824 0.071765 0.000000
+v 0.073750 0.062500 0.000000
+v 0.076552 0.137074 -0.001618
+v 0.075368 0.137074 -0.002802
+v 0.073750 0.137074 -0.003235
+v 0.072132 0.137074 -0.002802
+v 0.070948 0.137074 -0.001618
+v 0.070515 0.137074 -0.000000
+v 0.070948 0.137074 0.001618
+v 0.072132 0.137074 0.002802
+v 0.073750 0.137074 0.003235
+v 0.075368 0.137074 0.002802
+v 0.076552 0.137074 0.001618
+v 0.076985 0.137074 -0.000000
+v 0.079163 0.135825 -0.003125
+v 0.076875 0.135825 -0.005413
+v 0.073750 0.135825 -0.006250
+v 0.070625 0.135825 -0.005413
+v 0.068337 0.135825 -0.003125
+v 0.067500 0.135825 -0.000000
+v 0.068337 0.135825 0.003125
+v 0.070625 0.135825 0.005413
+v 0.073750 0.135825 0.006250
+v 0.076875 0.135825 0.005413
+v 0.079163 0.135825 0.003125
+v 0.080000 0.135825 -0.000000
+v 0.081405 0.133839 -0.004419
+v 0.078170 0.133839 -0.007655
+v 0.073750 0.133839 -0.008839
+v 0.069331 0.133839 -0.007655
+v 0.066095 0.133839 -0.004419
+v 0.064911 0.133839 -0.000000
+v 0.066095 0.133839 0.004419
+v 0.069331 0.133839 0.007655
+v 0.073750 0.133839 0.008839
+v 0.078170 0.133839 0.007655
+v 0.081405 0.133839 0.004419
+v 0.082589 0.133839 -0.000000
+v 0.083125 0.131250 -0.005413
+v 0.079163 0.131250 -0.009375
+v 0.073750 0.131250 -0.010825
+v 0.068337 0.131250 -0.009375
+v 0.064375 0.131250 -0.005413
+v 0.062925 0.131250 -0.000000
+v 0.064375 0.131250 0.005413
+v 0.068337 0.131250 0.009375
+v 0.073750 0.131250 0.010825
+v 0.079163 0.131250 0.009375
+v 0.083125 0.131250 0.005413
+v 0.084575 0.131250 -0.000000
+v 0.084207 0.128235 -0.006037
+v 0.079787 0.128235 -0.010456
+v 0.073750 0.128235 -0.012074
+v 0.067713 0.128235 -0.010456
+v 0.063294 0.128235 -0.006037
+v 0.061676 0.128235 -0.000000
+v 0.063294 0.128235 0.006037
+v 0.067713 0.128235 0.010456
+v 0.073750 0.128235 0.012074
+v 0.079787 0.128235 0.010456
+v 0.084207 0.128235 0.006037
+v 0.085824 0.128235 -0.000000
+v 0.073750 0.137500 -0.000000
+vt 0.055846 0.659882
+vt 0.055846 0.669764
+vt 0.055848 0.679645
+vt 0.055848 0.689527
+vt 0.055847 0.620355
+vt 0.055846 0.630237
+vt 0.055846 0.640118
+vt 0.055846 0.650000
+vt 0.042671 0.659882
+vt 0.042671 0.669764
+vt 0.042671 0.679646
+vt 0.042671 0.610473
+vt 0.042671 0.620355
+vt 0.042671 0.630237
+vt 0.042671 0.640119
+vt 0.042671 0.650000
+vt 0.029495 0.659882
+vt 0.029495 0.669764
+vt 0.029496 0.679646
+vt 0.029495 0.610473
+vt 0.029495 0.620355
+vt 0.029495 0.630237
+vt 0.029495 0.640118
+vt 0.029495 0.650000
+vt 0.016319 0.664823
+vt 0.016319 0.674705
+vt 0.016320 0.684587
+vt 0.016320 0.615414
+vt 0.016319 0.625296
+vt 0.016319 0.635178
+vt 0.016320 0.645059
+vt 0.016319 0.654941
+vt 0.851173 0.793896
+vt 0.856730 0.787051
+vt 0.855527 0.795680
+vt 0.846863 0.795712
+vt 0.842730 0.790247
+vt 0.851181 0.806034
+vt 0.856732 0.812949
+vt 0.842730 0.809753
+vt 0.846869 0.804239
+vt 0.855530 0.804296
+vt 0.857385 0.800000
+vt 0.858189 0.800000
+vt 0.845151 0.800000
+vt 0.843829 0.800000
+vt 0.748827 0.793896
+vt 0.744473 0.795680
+vt 0.743270 0.787051
+vt 0.753137 0.795712
+vt 0.757270 0.790247
+vt 0.748819 0.806034
+vt 0.753131 0.804239
+vt 0.757270 0.809753
+vt 0.743270 0.812949
+vt 0.744470 0.804296
+vt 0.742615 0.800000
+vt 0.741810 0.800000
+vt 0.754849 0.800000
+vt 0.756171 0.800000
+vt 0.418946 0.313941
+vt 0.450000 0.310442
+vt 0.450000 0.318024
+vt 0.420633 0.321332
+vt 0.389448 0.324263
+vt 0.392738 0.331094
+vt 0.362987 0.340889
+vt 0.367715 0.346817
+vt 0.340889 0.362987
+vt 0.346817 0.367715
+vt 0.324263 0.389448
+vt 0.331093 0.392737
+vt 0.313941 0.418945
+vt 0.321333 0.420632
+vt 0.310442 0.450000
+vt 0.318024 0.450000
+vt 0.313941 0.481055
+vt 0.321333 0.479367
+vt 0.324263 0.510552
+vt 0.331094 0.507263
+vt 0.340889 0.537013
+vt 0.346817 0.532286
+vt 0.362987 0.559111
+vt 0.367715 0.553183
+vt 0.389448 0.575737
+vt 0.392737 0.568906
+vt 0.418946 0.586059
+vt 0.420633 0.578667
+vt 0.450000 0.589558
+vt 0.450000 0.581976
+vt 0.372173 0.547592
+vt 0.395841 0.562464
+vt 0.422223 0.571696
+vt 0.450000 0.574825
+vt 0.450000 0.325175
+vt 0.422223 0.328306
+vt 0.395841 0.337537
+vt 0.372173 0.352408
+vt 0.352408 0.372172
+vt 0.337536 0.395841
+vt 0.328304 0.422223
+vt 0.325175 0.450000
+vt 0.328304 0.477775
+vt 0.337536 0.504159
+vt 0.352408 0.527827
+vt 0.376703 0.541912
+vt 0.358088 0.523298
+vt 0.363535 0.518954
+vt 0.381045 0.536466
+vt 0.398992 0.555918
+vt 0.402015 0.549642
+vt 0.423841 0.564613
+vt 0.425390 0.557822
+vt 0.450000 0.567560
+vt 0.450000 0.560594
+vt 0.423840 0.335387
+vt 0.450000 0.332441
+vt 0.450000 0.339404
+vt 0.425391 0.342179
+vt 0.398993 0.344083
+vt 0.402015 0.350358
+vt 0.376703 0.358087
+vt 0.381046 0.363535
+vt 0.358088 0.376703
+vt 0.363533 0.381045
+vt 0.344082 0.398992
+vt 0.350358 0.402015
+vt 0.335387 0.423841
+vt 0.342178 0.425390
+vt 0.332440 0.450000
+vt 0.339406 0.450000
+vt 0.335387 0.476159
+vt 0.342178 0.474609
+vt 0.344082 0.501008
+vt 0.350358 0.497985
+vt 0.481055 0.313941
+vt 0.479367 0.321332
+vt 0.510552 0.324263
+vt 0.507262 0.331094
+vt 0.537013 0.340889
+vt 0.532286 0.346817
+vt 0.559111 0.362987
+vt 0.553183 0.367714
+vt 0.575738 0.389448
+vt 0.568907 0.392737
+vt 0.586059 0.418945
+vt 0.578667 0.420632
+vt 0.589558 0.450000
+vt 0.581977 0.450000
+vt 0.586059 0.481055
+vt 0.578667 0.479367
+vt 0.575738 0.510552
+vt 0.568907 0.507263
+vt 0.559111 0.537013
+vt 0.553183 0.532286
+vt 0.537013 0.559111
+vt 0.532286 0.553183
+vt 0.510552 0.575737
+vt 0.507262 0.568906
+vt 0.481055 0.586059
+vt 0.479368 0.578667
+vt 0.504159 0.562464
+vt 0.527827 0.547592
+vt 0.477777 0.571696
+vt 0.477777 0.328306
+vt 0.504159 0.337537
+vt 0.527827 0.352408
+vt 0.547592 0.372172
+vt 0.562464 0.395841
+vt 0.571696 0.422223
+vt 0.574824 0.450000
+vt 0.571696 0.477775
+vt 0.562464 0.504159
+vt 0.547592 0.527827
+vt 0.518954 0.536466
+vt 0.536467 0.518954
+vt 0.541912 0.523298
+vt 0.523298 0.541912
+vt 0.497985 0.549642
+vt 0.501007 0.555918
+vt 0.474609 0.557822
+vt 0.476160 0.564613
+vt 0.474609 0.342179
+vt 0.476160 0.335387
+vt 0.497986 0.350358
+vt 0.501007 0.344083
+vt 0.518954 0.363535
+vt 0.523298 0.358087
+vt 0.536467 0.381045
+vt 0.541912 0.376703
+vt 0.549641 0.402015
+vt 0.555919 0.398992
+vt 0.557823 0.425390
+vt 0.564612 0.423841
+vt 0.560594 0.450000
+vt 0.567561 0.450000
+vt 0.557823 0.474609
+vt 0.564612 0.476159
+vt 0.549641 0.497985
+vt 0.555918 0.501008
+vt 0.150000 0.450000
+vt 0.150000 0.584317
+vt 0.120111 0.580950
+vt 0.091721 0.571016
+vt 0.066254 0.555014
+vt 0.044987 0.533746
+vt 0.028984 0.508278
+vt 0.019050 0.479889
+vt 0.015683 0.450000
+vt 0.019050 0.420111
+vt 0.028984 0.391721
+vt 0.044987 0.366255
+vt 0.066254 0.344987
+vt 0.091721 0.328984
+vt 0.120111 0.319050
+vt 0.150000 0.315683
+vt 0.118950 0.313961
+vt 0.150000 0.310462
+vt 0.038795 0.032928
+vt 0.071738 0.032928
+vt 0.071738 0.267072
+vt 0.038795 0.267072
+vt 0.104681 0.032928
+vt 0.104681 0.267072
+vt 0.137625 0.032928
+vt 0.137625 0.267072
+vt 0.170567 0.032928
+vt 0.170567 0.267072
+vt 0.203511 0.032928
+vt 0.203511 0.267072
+vt 0.236454 0.032928
+vt 0.236454 0.267072
+vt 0.269397 0.032928
+vt 0.269397 0.267072
+vt 0.302340 0.032928
+vt 0.302340 0.267072
+vt 0.335284 0.032928
+vt 0.335284 0.267072
+vt 0.368226 0.032928
+vt 0.368226 0.267072
+vt 0.401170 0.032928
+vt 0.401170 0.267072
+vt 0.434114 0.032928
+vt 0.434114 0.267072
+vt 0.467056 0.032928
+vt 0.467056 0.267072
+vt 0.500000 0.032928
+vt 0.500000 0.267072
+vt 0.961205 0.032928
+vt 0.961205 0.267072
+vt 0.928263 0.267072
+vt 0.928263 0.032928
+vt 0.895319 0.267072
+vt 0.895319 0.032928
+vt 0.862375 0.267072
+vt 0.862375 0.032928
+vt 0.829432 0.267072
+vt 0.829432 0.032928
+vt 0.796489 0.267072
+vt 0.796489 0.032928
+vt 0.763546 0.267072
+vt 0.763546 0.032928
+vt 0.730603 0.267072
+vt 0.730603 0.032928
+vt 0.697661 0.267072
+vt 0.697661 0.032928
+vt 0.664716 0.267072
+vt 0.664716 0.032928
+vt 0.631774 0.267072
+vt 0.631774 0.032928
+vt 0.598830 0.267072
+vt 0.598830 0.032928
+vt 0.565886 0.267072
+vt 0.565886 0.032928
+vt 0.532944 0.267072
+vt 0.532944 0.032928
+vt 0.179889 0.319050
+vt 0.208279 0.328984
+vt 0.233746 0.344987
+vt 0.255013 0.366255
+vt 0.271016 0.391721
+vt 0.280950 0.420111
+vt 0.284317 0.450000
+vt 0.280950 0.479889
+vt 0.271016 0.508278
+vt 0.255013 0.533746
+vt 0.233746 0.555014
+vt 0.208279 0.571016
+vt 0.179889 0.580950
+vt 0.089456 0.324280
+vt 0.062999 0.340905
+vt 0.040905 0.363000
+vt 0.024280 0.389456
+vt 0.013961 0.418950
+vt 0.010462 0.450000
+vt 0.013961 0.481050
+vt 0.024280 0.510543
+vt 0.040905 0.537001
+vt 0.062999 0.559096
+vt 0.089456 0.575720
+vt 0.118950 0.586039
+vt 0.150000 0.589538
+vt 0.181050 0.586039
+vt 0.181050 0.313961
+vt 0.210544 0.324280
+vt 0.237000 0.340905
+vt 0.259095 0.363000
+vt 0.275720 0.389456
+vt 0.286039 0.418950
+vt 0.289538 0.450000
+vt 0.286039 0.481050
+vt 0.275720 0.510543
+vt 0.259095 0.537001
+vt 0.237000 0.559096
+vt 0.210544 0.575720
+vt 0.800000 0.963545
+vt 0.763608 0.959445
+vt 0.767378 0.942927
+vt 0.800000 0.946603
+vt 0.729040 0.947350
+vt 0.736391 0.932084
+vt 0.698031 0.927865
+vt 0.708595 0.914618
+vt 0.672135 0.901969
+vt 0.685382 0.891405
+vt 0.652651 0.870960
+vt 0.667916 0.863609
+vt 0.640555 0.836393
+vt 0.657073 0.832622
+vt 0.636455 0.800000
+vt 0.653397 0.800000
+vt 0.640555 0.763607
+vt 0.657073 0.767378
+vt 0.652651 0.729040
+vt 0.667916 0.736391
+vt 0.672135 0.698032
+vt 0.685382 0.708595
+vt 0.698031 0.672135
+vt 0.708595 0.685382
+vt 0.729040 0.652650
+vt 0.736391 0.667916
+vt 0.763607 0.640555
+vt 0.767378 0.657073
+vt 0.800000 0.636455
+vt 0.800000 0.653397
+vt 0.770911 0.927450
+vt 0.800000 0.930727
+vt 0.743280 0.917782
+vt 0.718493 0.902207
+vt 0.697793 0.881507
+vt 0.682218 0.856721
+vt 0.672550 0.829089
+vt 0.669273 0.800000
+vt 0.672550 0.770911
+vt 0.682218 0.743280
+vt 0.697793 0.718493
+vt 0.718493 0.697793
+vt 0.743280 0.682218
+vt 0.770911 0.672550
+vt 0.800000 0.669273
+vt 0.774274 0.912713
+vt 0.800000 0.915612
+vt 0.749837 0.904163
+vt 0.727917 0.890389
+vt 0.709611 0.872084
+vt 0.695837 0.850163
+vt 0.687287 0.825726
+vt 0.684388 0.800000
+vt 0.687287 0.774274
+vt 0.695837 0.749838
+vt 0.709611 0.727918
+vt 0.727917 0.709611
+vt 0.749837 0.695837
+vt 0.774274 0.687287
+vt 0.800000 0.684388
+vt 0.777526 0.898465
+vt 0.800000 0.900997
+vt 0.756179 0.890995
+vt 0.737029 0.878962
+vt 0.721038 0.862971
+vt 0.709005 0.843822
+vt 0.701536 0.822474
+vt 0.699003 0.800000
+vt 0.701536 0.777526
+vt 0.709005 0.756179
+vt 0.721038 0.737029
+vt 0.737029 0.721038
+vt 0.756179 0.709005
+vt 0.777526 0.701536
+vt 0.800000 0.699003
+vt 0.780715 0.884493
+vt 0.800000 0.886665
+vt 0.762397 0.878083
+vt 0.745964 0.867758
+vt 0.732242 0.854036
+vt 0.721917 0.837603
+vt 0.715507 0.819285
+vt 0.713335 0.800000
+vt 0.715507 0.780715
+vt 0.721917 0.762398
+vt 0.732242 0.745964
+vt 0.745964 0.732242
+vt 0.762397 0.721917
+vt 0.780715 0.715507
+vt 0.800000 0.713335
+vt 0.783880 0.870625
+vt 0.800000 0.872441
+vt 0.768569 0.865268
+vt 0.754834 0.856637
+vt 0.743363 0.845167
+vt 0.734732 0.831431
+vt 0.729375 0.816120
+vt 0.727560 0.800000
+vt 0.729375 0.783880
+vt 0.734732 0.768569
+vt 0.743363 0.754835
+vt 0.754834 0.743363
+vt 0.768569 0.734732
+vt 0.783880 0.729375
+vt 0.800000 0.727558
+vt 0.787051 0.856731
+vt 0.800000 0.858189
+vt 0.774753 0.852427
+vt 0.763719 0.845495
+vt 0.754505 0.836281
+vt 0.747573 0.825248
+vt 0.747573 0.774753
+vt 0.754505 0.763719
+vt 0.763719 0.754505
+vt 0.774753 0.747573
+vt 0.787051 0.743268
+vt 0.800000 0.741810
+vt 0.790247 0.842730
+vt 0.800000 0.843829
+vt 0.780983 0.839489
+vt 0.772673 0.834267
+vt 0.765733 0.827327
+vt 0.760511 0.819017
+vt 0.760511 0.780983
+vt 0.765733 0.772673
+vt 0.772673 0.765733
+vt 0.780983 0.760511
+vt 0.790247 0.757270
+vt 0.800000 0.756171
+vt 0.793474 0.828592
+vt 0.800000 0.829327
+vt 0.787275 0.826423
+vt 0.781715 0.822929
+vt 0.777071 0.818285
+vt 0.773577 0.812725
+vt 0.771408 0.806526
+vt 0.770673 0.800000
+vt 0.771408 0.793474
+vt 0.773577 0.787275
+vt 0.777071 0.781715
+vt 0.781715 0.777071
+vt 0.787275 0.773577
+vt 0.793474 0.771408
+vt 0.800000 0.770673
+vt 0.796729 0.814331
+vt 0.800000 0.814700
+vt 0.793621 0.813245
+vt 0.790834 0.811493
+vt 0.788507 0.809166
+vt 0.786755 0.806379
+vt 0.785669 0.803271
+vt 0.785300 0.800000
+vt 0.785668 0.796729
+vt 0.786755 0.793622
+vt 0.788507 0.790835
+vt 0.790834 0.788508
+vt 0.793621 0.786755
+vt 0.796729 0.785669
+vt 0.800000 0.785300
+vt 0.800000 0.800000
+vt 0.832622 0.942927
+vt 0.836392 0.959445
+vt 0.863609 0.932084
+vt 0.870960 0.947350
+vt 0.891405 0.914618
+vt 0.901968 0.927865
+vt 0.914618 0.891405
+vt 0.927865 0.901969
+vt 0.932084 0.863608
+vt 0.947350 0.870960
+vt 0.942927 0.832622
+vt 0.959445 0.836393
+vt 0.946603 0.800000
+vt 0.963545 0.800000
+vt 0.942927 0.767378
+vt 0.959445 0.763608
+vt 0.932084 0.736391
+vt 0.947350 0.729040
+vt 0.914618 0.708595
+vt 0.927865 0.698032
+vt 0.891405 0.685382
+vt 0.901968 0.672135
+vt 0.863609 0.667916
+vt 0.870960 0.652650
+vt 0.832622 0.657073
+vt 0.836392 0.640555
+vt 0.829089 0.927450
+vt 0.856721 0.917782
+vt 0.881507 0.902207
+vt 0.902206 0.881507
+vt 0.917782 0.856721
+vt 0.927450 0.829090
+vt 0.930727 0.800000
+vt 0.927450 0.770910
+vt 0.917782 0.743280
+vt 0.902206 0.718493
+vt 0.881507 0.697793
+vt 0.856721 0.682218
+vt 0.829089 0.672550
+vt 0.825726 0.912713
+vt 0.850162 0.904163
+vt 0.872083 0.890389
+vt 0.890389 0.872083
+vt 0.904163 0.850163
+vt 0.912713 0.825726
+vt 0.915612 0.800000
+vt 0.912713 0.774274
+vt 0.904163 0.749838
+vt 0.890389 0.727918
+vt 0.872083 0.709611
+vt 0.850162 0.695837
+vt 0.825726 0.687286
+vt 0.822474 0.898465
+vt 0.843821 0.890995
+vt 0.862971 0.878962
+vt 0.878962 0.862971
+vt 0.890995 0.843822
+vt 0.898464 0.822474
+vt 0.900997 0.800000
+vt 0.898464 0.777526
+vt 0.890995 0.756179
+vt 0.878962 0.737029
+vt 0.862971 0.721038
+vt 0.843821 0.709005
+vt 0.822474 0.701536
+vt 0.819285 0.884493
+vt 0.837603 0.878083
+vt 0.854036 0.867758
+vt 0.867758 0.854036
+vt 0.878083 0.837603
+vt 0.884493 0.819285
+vt 0.886665 0.800000
+vt 0.884493 0.780715
+vt 0.878083 0.762398
+vt 0.867758 0.745964
+vt 0.854036 0.732242
+vt 0.837603 0.721917
+vt 0.819285 0.715507
+vt 0.816120 0.870625
+vt 0.831431 0.865268
+vt 0.845166 0.856637
+vt 0.856637 0.845166
+vt 0.865268 0.831431
+vt 0.870625 0.816120
+vt 0.872442 0.800000
+vt 0.870625 0.783880
+vt 0.865268 0.768569
+vt 0.856637 0.754835
+vt 0.845167 0.743363
+vt 0.831431 0.734732
+vt 0.816120 0.729375
+vt 0.812949 0.856731
+vt 0.825247 0.852427
+vt 0.836281 0.845495
+vt 0.845495 0.836281
+vt 0.852427 0.825247
+vt 0.852427 0.774753
+vt 0.845495 0.763719
+vt 0.836281 0.754505
+vt 0.825248 0.747573
+vt 0.812949 0.743270
+vt 0.809753 0.842730
+vt 0.819017 0.839488
+vt 0.827327 0.834267
+vt 0.834267 0.827327
+vt 0.839489 0.819017
+vt 0.839489 0.780983
+vt 0.834267 0.772673
+vt 0.827327 0.765733
+vt 0.819017 0.760511
+vt 0.809753 0.757270
+vt 0.806526 0.828592
+vt 0.812725 0.826423
+vt 0.818285 0.822929
+vt 0.822929 0.818285
+vt 0.826423 0.812725
+vt 0.828592 0.806526
+vt 0.829327 0.800000
+vt 0.828592 0.793474
+vt 0.826423 0.787275
+vt 0.822929 0.781715
+vt 0.818285 0.777071
+vt 0.812725 0.773577
+vt 0.806526 0.771408
+vt 0.803271 0.814331
+vt 0.806379 0.813245
+vt 0.809166 0.811493
+vt 0.811493 0.809166
+vt 0.813245 0.806379
+vt 0.814332 0.803271
+vt 0.814700 0.800000
+vt 0.814331 0.796729
+vt 0.813245 0.793622
+vt 0.811493 0.790835
+vt 0.809166 0.788508
+vt 0.806377 0.786755
+vt 0.803271 0.785668
+vt 0.760574 0.972734
+vt 0.800000 0.977177
+vt 0.800000 0.983714
+vt 0.759120 0.979109
+vt 0.723126 0.959631
+vt 0.689532 0.938522
+vt 0.661478 0.910468
+vt 0.640369 0.876875
+vt 0.627266 0.839426
+vt 0.622823 0.800000
+vt 0.627266 0.760574
+vt 0.640369 0.723127
+vt 0.661478 0.689532
+vt 0.689532 0.661478
+vt 0.723125 0.640370
+vt 0.760574 0.627266
+vt 0.800000 0.622823
+vt 0.719984 0.318489
+vt 0.750000 0.315109
+vt 0.750000 0.450000
+vt 0.691473 0.328466
+vt 0.665897 0.344538
+vt 0.644538 0.365896
+vt 0.628466 0.391473
+vt 0.618491 0.419984
+vt 0.615109 0.450000
+vt 0.618491 0.480016
+vt 0.628466 0.508527
+vt 0.644538 0.534103
+vt 0.665897 0.555462
+vt 0.691473 0.571534
+vt 0.719984 0.581509
+vt 0.750000 0.584891
+vt 0.839426 0.972735
+vt 0.876875 0.959631
+vt 0.910468 0.938522
+vt 0.938522 0.910468
+vt 0.959631 0.876875
+vt 0.972734 0.839426
+vt 0.977178 0.800000
+vt 0.972736 0.760574
+vt 0.959631 0.723127
+vt 0.938522 0.689532
+vt 0.910468 0.661478
+vt 0.876875 0.640370
+vt 0.839426 0.627265
+vt 0.720289 0.965521
+vt 0.685457 0.943634
+vt 0.656366 0.914545
+vt 0.634480 0.879710
+vt 0.620892 0.840881
+vt 0.616286 0.800000
+vt 0.620892 0.759120
+vt 0.634480 0.720289
+vt 0.656366 0.685456
+vt 0.685457 0.656366
+vt 0.720289 0.634479
+vt 0.759120 0.620892
+vt 0.800000 0.616286
+vt 0.840880 0.620892
+vt 0.840880 0.979108
+vt 0.879711 0.965521
+vt 0.914544 0.943634
+vt 0.943634 0.914545
+vt 0.965520 0.879710
+vt 0.979108 0.840881
+vt 0.983714 0.800000
+vt 0.979108 0.759120
+vt 0.965522 0.720289
+vt 0.943634 0.685456
+vt 0.914544 0.656366
+vt 0.879711 0.634479
+vt 0.780016 0.318491
+vt 0.808527 0.328466
+vt 0.834103 0.344538
+vt 0.855462 0.365896
+vt 0.871533 0.391473
+vt 0.881509 0.419984
+vt 0.884891 0.450000
+vt 0.881509 0.480016
+vt 0.871533 0.508527
+vt 0.855462 0.534103
+vt 0.834103 0.555462
+vt 0.808527 0.571534
+vt 0.780016 0.581509
+vt 0.346499 0.450000
+vt 0.349094 0.473031
+vt 0.356748 0.494908
+vt 0.369079 0.514533
+vt 0.385469 0.530921
+vt 0.405092 0.543252
+vt 0.426970 0.550906
+vt 0.450000 0.553501
+vt 0.473031 0.550906
+vt 0.494908 0.543252
+vt 0.514531 0.530921
+vt 0.530921 0.514533
+vt 0.543252 0.494908
+vt 0.550907 0.473031
+vt 0.553501 0.450000
+vt 0.550907 0.426969
+vt 0.543252 0.405092
+vt 0.530920 0.385468
+vt 0.514533 0.369079
+vt 0.494908 0.356749
+vt 0.473031 0.349092
+vt 0.450000 0.346500
+vt 0.426969 0.349092
+vt 0.405092 0.356749
+vt 0.385467 0.369079
+vt 0.369080 0.385468
+vt 0.356748 0.405092
+vt 0.349094 0.426969
+vt 0.377697 0.450000
+vt 0.381758 0.465156
+vt 0.392853 0.476252
+vt 0.408010 0.480313
+vt 0.423166 0.476252
+vt 0.434261 0.465156
+vt 0.438322 0.450000
+vt 0.450000 0.450000
+vt 0.434261 0.434844
+vt 0.423166 0.423748
+vt 0.408010 0.419687
+vt 0.392853 0.423747
+vt 0.381758 0.434844
+vt 0.522303 0.450000
+vt 0.518242 0.465156
+vt 0.507147 0.476252
+vt 0.491990 0.480313
+vt 0.476834 0.476252
+vt 0.465739 0.465156
+vt 0.461678 0.450000
+vt 0.465739 0.434844
+vt 0.476834 0.423748
+vt 0.491990 0.419687
+vt 0.507147 0.423747
+vt 0.518242 0.434844
+vt 0.176121 0.669763
+vt 0.176121 0.679645
+vt 0.176121 0.659881
+vt 0.176120 0.650000
+vt 0.176120 0.640118
+vt 0.176120 0.630236
+vt 0.176120 0.620354
+vt 0.055847 0.610473
+vt 0.176120 0.610473
+vt 0.176121 0.689527
+vt 0.473387 0.972703
+vt 0.473387 0.962787
+vt 0.486693 0.962787
+vt 0.486693 0.972703
+vt 0.460080 0.972703
+vt 0.460080 0.962787
+vt 0.446774 0.972702
+vt 0.446774 0.962787
+vt 0.433468 0.972703
+vt 0.433468 0.962787
+vt 0.420161 0.972702
+vt 0.420161 0.962787
+vt 0.500000 0.962787
+vt 0.500000 0.972703
+vt 0.566532 0.972703
+vt 0.566532 0.962787
+vt 0.579839 0.962787
+vt 0.579839 0.972703
+vt 0.553226 0.972703
+vt 0.553226 0.962787
+vt 0.539919 0.972703
+vt 0.539919 0.962787
+vt 0.526613 0.972703
+vt 0.526613 0.962787
+vt 0.513306 0.972703
+vt 0.513306 0.962787
+vt 0.153226 0.898485
+vt 0.153226 0.801515
+vt 0.166532 0.801515
+vt 0.166533 0.898485
+vt 0.139920 0.898485
+vt 0.139919 0.801515
+vt 0.126613 0.898485
+vt 0.126613 0.801515
+vt 0.113307 0.898485
+vt 0.113306 0.801515
+vt 0.100000 0.898485
+vt 0.100000 0.801515
+vt 0.086694 0.898485
+vt 0.086693 0.801515
+vt 0.073387 0.898485
+vt 0.073387 0.801515
+vt 0.060081 0.898485
+vt 0.060080 0.801515
+vt 0.046775 0.898485
+vt 0.046774 0.801516
+vt 0.033468 0.898485
+vt 0.033468 0.801516
+vt 0.020162 0.898485
+vt 0.020161 0.801516
+vt 0.179838 0.801515
+vt 0.179839 0.898485
+vt 0.183680 0.620354
+vt 0.183681 0.630236
+vt 0.183680 0.610473
+vt 0.183681 0.679645
+vt 0.183681 0.689527
+vt 0.183681 0.669763
+vt 0.183681 0.659881
+vt 0.183681 0.650000
+vt 0.183681 0.640118
+vt 0.460081 0.907136
+vt 0.473387 0.907136
+vt 0.446774 0.907136
+vt 0.433468 0.907136
+vt 0.420161 0.907136
+vt 0.566532 0.907136
+vt 0.579839 0.907136
+vt 0.553226 0.907136
+vt 0.539919 0.907136
+vt 0.526613 0.907136
+vt 0.513306 0.907136
+vt 0.500000 0.907136
+vt 0.486694 0.907136
+vt 0.344153 0.669764
+vt 0.344154 0.679646
+vt 0.223879 0.679645
+vt 0.223879 0.669763
+vt 0.344153 0.659882
+vt 0.223879 0.659881
+vt 0.344153 0.650000
+vt 0.223879 0.650000
+vt 0.344153 0.640119
+vt 0.223879 0.640118
+vt 0.223879 0.630236
+vt 0.344153 0.630237
+vt 0.344153 0.620355
+vt 0.223879 0.620354
+vt 0.344152 0.610473
+vt 0.223879 0.610473
+vt 0.344154 0.689528
+vt 0.223879 0.689527
+vt 0.526613 0.772703
+vt 0.513306 0.772703
+vt 0.513306 0.762787
+vt 0.526613 0.762787
+vt 0.539919 0.772702
+vt 0.539919 0.762787
+vt 0.553226 0.772703
+vt 0.553226 0.762787
+vt 0.566532 0.772702
+vt 0.566532 0.762787
+vt 0.579839 0.772702
+vt 0.579839 0.762787
+vt 0.500000 0.772703
+vt 0.500000 0.762787
+vt 0.433468 0.772703
+vt 0.420161 0.772703
+vt 0.420161 0.762787
+vt 0.433468 0.762787
+vt 0.446774 0.772703
+vt 0.446774 0.762787
+vt 0.460081 0.772703
+vt 0.460081 0.762787
+vt 0.473387 0.772703
+vt 0.473387 0.762787
+vt 0.486694 0.772703
+vt 0.486694 0.762787
+vt 0.216319 0.630236
+vt 0.216319 0.620354
+vt 0.216319 0.610472
+vt 0.216319 0.689527
+vt 0.216319 0.679645
+vt 0.216319 0.669763
+vt 0.216319 0.659881
+vt 0.216319 0.650000
+vt 0.216319 0.640118
+vt 0.539919 0.707136
+vt 0.526613 0.707136
+vt 0.553226 0.707136
+vt 0.566532 0.707136
+vt 0.579839 0.707136
+vt 0.433468 0.707136
+vt 0.420161 0.707136
+vt 0.446774 0.707136
+vt 0.460081 0.707136
+vt 0.473387 0.707136
+vt 0.486694 0.707136
+vt 0.500000 0.707136
+vt 0.513306 0.707136
+vt 0.357329 0.669764
+vt 0.357329 0.659882
+vt 0.357329 0.679646
+vt 0.357330 0.689528
+vt 0.357329 0.620355
+vt 0.357329 0.630237
+vt 0.357329 0.640119
+vt 0.357329 0.650000
+vt 0.370505 0.669763
+vt 0.370504 0.659882
+vt 0.370505 0.679645
+vt 0.370505 0.689527
+vt 0.370504 0.620355
+vt 0.370504 0.630237
+vt 0.370504 0.640119
+vt 0.370504 0.650000
+vt 0.383681 0.664822
+vt 0.383681 0.674704
+vt 0.383681 0.684586
+vt 0.383680 0.615414
+vt 0.383680 0.625296
+vt 0.383680 0.635178
+vt 0.383680 0.645059
+vt 0.383680 0.654941
+vt 0.357329 0.610473
+vt 0.370504 0.610473
+vt 0.042671 0.689527
+vt 0.029496 0.689527
+vt 0.246774 0.898485
+vt 0.233467 0.898485
+vt 0.233468 0.801515
+vt 0.246774 0.801515
+vt 0.260080 0.898485
+vt 0.260081 0.801515
+vt 0.273387 0.898485
+vt 0.273387 0.801515
+vt 0.286693 0.898485
+vt 0.286694 0.801515
+vt 0.300000 0.898485
+vt 0.300000 0.801515
+vt 0.313306 0.898485
+vt 0.313306 0.801515
+vt 0.326612 0.898485
+vt 0.326613 0.801515
+vt 0.339919 0.898485
+vt 0.339919 0.801516
+vt 0.353225 0.898485
+vt 0.353226 0.801516
+vt 0.366532 0.898485
+vt 0.366532 0.801516
+vt 0.379838 0.898485
+vt 0.379839 0.801516
+vt 0.220161 0.898485
+vt 0.220161 0.801515
+vt 0.486693 0.640604
+vt 0.486694 0.653910
+vt 0.473387 0.653910
+vt 0.473387 0.640604
+vt 0.460081 0.653910
+vt 0.460081 0.640604
+vt 0.446774 0.653910
+vt 0.446774 0.640604
+vt 0.433468 0.653910
+vt 0.433468 0.640604
+vt 0.420161 0.653910
+vt 0.420161 0.640604
+vt 0.579839 0.640604
+vt 0.579839 0.653910
+vt 0.566532 0.653910
+vt 0.566532 0.640604
+vt 0.553226 0.653910
+vt 0.553226 0.640604
+vt 0.539919 0.653910
+vt 0.539919 0.640604
+vt 0.526613 0.653910
+vt 0.526613 0.640604
+vt 0.513306 0.653910
+vt 0.513306 0.640604
+vt 0.500000 0.653910
+vt 0.500000 0.640604
+vt 0.486694 0.667217
+vt 0.473387 0.667217
+vt 0.460081 0.667217
+vt 0.446774 0.667217
+vt 0.433468 0.667217
+vt 0.420161 0.667217
+vt 0.579839 0.667217
+vt 0.566532 0.667217
+vt 0.553226 0.667217
+vt 0.539919 0.667217
+vt 0.526613 0.667217
+vt 0.513306 0.667217
+vt 0.500000 0.667217
+vt 0.486694 0.680523
+vt 0.473387 0.680523
+vt 0.460081 0.680523
+vt 0.446774 0.680523
+vt 0.433468 0.680523
+vt 0.420161 0.680523
+vt 0.579839 0.680523
+vt 0.566532 0.680523
+vt 0.553226 0.680523
+vt 0.539919 0.680523
+vt 0.526613 0.680523
+vt 0.513306 0.680523
+vt 0.500000 0.680523
+vt 0.486694 0.693830
+vt 0.473387 0.693830
+vt 0.460081 0.693830
+vt 0.446774 0.693830
+vt 0.433468 0.693830
+vt 0.420161 0.693830
+vt 0.579839 0.693830
+vt 0.566532 0.693830
+vt 0.553226 0.693830
+vt 0.539919 0.693830
+vt 0.526613 0.693830
+vt 0.513306 0.693830
+vt 0.500000 0.693830
+vt 0.480040 0.627297
+vt 0.466734 0.627297
+vt 0.453427 0.627298
+vt 0.440121 0.627297
+vt 0.426814 0.627298
+vt 0.573185 0.627297
+vt 0.559879 0.627297
+vt 0.546573 0.627297
+vt 0.533266 0.627297
+vt 0.519960 0.627297
+vt 0.506653 0.627297
+vt 0.493347 0.627297
+vt 0.286694 0.734983
+vt 0.286694 0.748289
+vt 0.273387 0.748289
+vt 0.273387 0.734983
+vt 0.260081 0.748289
+vt 0.260081 0.734983
+vt 0.246775 0.748289
+vt 0.246775 0.734983
+vt 0.233468 0.748289
+vt 0.233468 0.734983
+vt 0.220162 0.748289
+vt 0.220162 0.734983
+vt 0.379839 0.734984
+vt 0.379839 0.748290
+vt 0.366533 0.748290
+vt 0.366533 0.734984
+vt 0.353226 0.748290
+vt 0.353226 0.734983
+vt 0.339920 0.748290
+vt 0.339920 0.734983
+vt 0.326613 0.748290
+vt 0.326614 0.734983
+vt 0.313307 0.748289
+vt 0.313307 0.734983
+vt 0.300000 0.748289
+vt 0.300001 0.734983
+vt 0.286694 0.761596
+vt 0.273387 0.761596
+vt 0.260081 0.761596
+vt 0.246774 0.761596
+vt 0.233468 0.761596
+vt 0.220162 0.761595
+vt 0.379839 0.761597
+vt 0.366533 0.761596
+vt 0.353226 0.761596
+vt 0.339920 0.761596
+vt 0.326613 0.761596
+vt 0.313307 0.761596
+vt 0.300000 0.761596
+vt 0.286694 0.774902
+vt 0.273387 0.774902
+vt 0.260081 0.774902
+vt 0.246775 0.774902
+vt 0.233468 0.774902
+vt 0.220162 0.774902
+vt 0.379839 0.774903
+vt 0.366533 0.774903
+vt 0.353226 0.774903
+vt 0.339920 0.774903
+vt 0.326613 0.774903
+vt 0.313307 0.774902
+vt 0.300000 0.774902
+vt 0.286694 0.788209
+vt 0.273387 0.788209
+vt 0.260081 0.788209
+vt 0.246774 0.788208
+vt 0.233468 0.788208
+vt 0.220162 0.788208
+vt 0.379839 0.788209
+vt 0.366533 0.788209
+vt 0.353226 0.788209
+vt 0.339920 0.788209
+vt 0.326613 0.788209
+vt 0.313307 0.788209
+vt 0.300000 0.788209
+vt 0.280041 0.721676
+vt 0.266734 0.721676
+vt 0.253428 0.721676
+vt 0.240121 0.721676
+vt 0.226815 0.721676
+vt 0.373186 0.721677
+vt 0.359880 0.721677
+vt 0.346573 0.721677
+vt 0.333267 0.721677
+vt 0.319960 0.721677
+vt 0.306654 0.721677
+vt 0.293347 0.721676
+vt 0.286693 0.965017
+vt 0.273386 0.965017
+vt 0.273386 0.951711
+vt 0.286693 0.951711
+vt 0.260080 0.965017
+vt 0.260080 0.951711
+vt 0.246773 0.965017
+vt 0.246774 0.951711
+vt 0.233467 0.965017
+vt 0.233467 0.951711
+vt 0.220161 0.965017
+vt 0.220161 0.951711
+vt 0.379838 0.965017
+vt 0.366532 0.965017
+vt 0.366532 0.951711
+vt 0.379838 0.951711
+vt 0.353225 0.965017
+vt 0.353225 0.951711
+vt 0.339919 0.965017
+vt 0.339919 0.951711
+vt 0.326613 0.965017
+vt 0.326613 0.951711
+vt 0.313306 0.965017
+vt 0.313306 0.951711
+vt 0.300000 0.965017
+vt 0.300000 0.951711
+vt 0.273387 0.938405
+vt 0.286693 0.938405
+vt 0.260080 0.938404
+vt 0.246774 0.938404
+vt 0.233467 0.938404
+vt 0.220161 0.938404
+vt 0.366532 0.938405
+vt 0.379838 0.938405
+vt 0.353225 0.938405
+vt 0.339919 0.938405
+vt 0.326612 0.938405
+vt 0.313306 0.938405
+vt 0.300000 0.938405
+vt 0.273387 0.925098
+vt 0.286693 0.925098
+vt 0.260080 0.925098
+vt 0.246774 0.925098
+vt 0.233467 0.925098
+vt 0.220161 0.925098
+vt 0.366532 0.925098
+vt 0.379838 0.925098
+vt 0.353225 0.925098
+vt 0.339919 0.925098
+vt 0.326613 0.925098
+vt 0.313306 0.925098
+vt 0.300000 0.925098
+vt 0.273387 0.911792
+vt 0.286693 0.911792
+vt 0.260080 0.911792
+vt 0.246774 0.911791
+vt 0.233467 0.911791
+vt 0.220161 0.911791
+vt 0.366532 0.911792
+vt 0.379838 0.911792
+vt 0.353225 0.911792
+vt 0.339919 0.911792
+vt 0.326612 0.911792
+vt 0.313306 0.911792
+vt 0.300000 0.911792
+vt 0.280039 0.978324
+vt 0.266733 0.978324
+vt 0.253427 0.978324
+vt 0.240120 0.978324
+vt 0.226814 0.978324
+vt 0.373185 0.978324
+vt 0.359879 0.978324
+vt 0.346572 0.978324
+vt 0.333266 0.978324
+vt 0.319959 0.978324
+vt 0.306653 0.978324
+vt 0.293346 0.978324
+vt 0.513307 0.840604
+vt 0.526613 0.840604
+vt 0.526613 0.853910
+vt 0.513307 0.853910
+vt 0.539920 0.840604
+vt 0.539919 0.853910
+vt 0.553226 0.840604
+vt 0.553226 0.853910
+vt 0.566533 0.840604
+vt 0.566532 0.853911
+vt 0.579839 0.840604
+vt 0.579839 0.853911
+vt 0.420161 0.840604
+vt 0.433468 0.840604
+vt 0.433468 0.853910
+vt 0.420161 0.853910
+vt 0.446774 0.840604
+vt 0.446774 0.853910
+vt 0.460081 0.840604
+vt 0.460081 0.853910
+vt 0.473387 0.840604
+vt 0.473387 0.853910
+vt 0.486694 0.840604
+vt 0.486694 0.853910
+vt 0.500000 0.840604
+vt 0.500000 0.853910
+vt 0.526613 0.867217
+vt 0.513307 0.867217
+vt 0.539919 0.867217
+vt 0.553226 0.867217
+vt 0.566532 0.867217
+vt 0.579839 0.867217
+vt 0.433468 0.867217
+vt 0.420161 0.867217
+vt 0.446774 0.867217
+vt 0.460081 0.867217
+vt 0.473387 0.867217
+vt 0.486694 0.867217
+vt 0.500000 0.867217
+vt 0.526613 0.880523
+vt 0.513307 0.880523
+vt 0.539919 0.880523
+vt 0.553226 0.880523
+vt 0.566532 0.880523
+vt 0.579839 0.880523
+vt 0.433468 0.880523
+vt 0.420161 0.880523
+vt 0.446774 0.880523
+vt 0.460081 0.880523
+vt 0.473387 0.880523
+vt 0.486694 0.880523
+vt 0.500000 0.880523
+vt 0.526613 0.893830
+vt 0.513307 0.893830
+vt 0.539919 0.893830
+vt 0.553226 0.893830
+vt 0.566532 0.893830
+vt 0.579839 0.893830
+vt 0.433468 0.893830
+vt 0.420161 0.893830
+vt 0.446774 0.893830
+vt 0.460081 0.893830
+vt 0.473387 0.893830
+vt 0.486694 0.893830
+vt 0.500000 0.893830
+vt 0.519960 0.827297
+vt 0.533266 0.827297
+vt 0.546573 0.827297
+vt 0.559879 0.827298
+vt 0.573186 0.827298
+vt 0.426814 0.827297
+vt 0.440121 0.827297
+vt 0.453427 0.827297
+vt 0.466734 0.827297
+vt 0.480040 0.827297
+vt 0.493347 0.827297
+vt 0.506653 0.827297
+vt 0.113306 0.734983
+vt 0.126613 0.734983
+vt 0.126613 0.748289
+vt 0.113306 0.748289
+vt 0.139919 0.734983
+vt 0.139919 0.748289
+vt 0.153225 0.734983
+vt 0.153225 0.748289
+vt 0.166532 0.734983
+vt 0.166532 0.748289
+vt 0.179838 0.734983
+vt 0.179838 0.748289
+vt 0.020161 0.734983
+vt 0.033467 0.734983
+vt 0.033467 0.748290
+vt 0.020161 0.748290
+vt 0.046774 0.734983
+vt 0.046774 0.748290
+vt 0.060080 0.734983
+vt 0.060080 0.748290
+vt 0.073387 0.734983
+vt 0.073387 0.748289
+vt 0.086693 0.734983
+vt 0.086693 0.748289
+vt 0.100000 0.734983
+vt 0.100000 0.748289
+vt 0.126613 0.761596
+vt 0.113306 0.761596
+vt 0.139919 0.761596
+vt 0.153225 0.761596
+vt 0.166532 0.761596
+vt 0.179838 0.761596
+vt 0.033467 0.761596
+vt 0.020161 0.761596
+vt 0.046774 0.761596
+vt 0.060080 0.761596
+vt 0.073387 0.761596
+vt 0.086693 0.761596
+vt 0.100000 0.761596
+vt 0.126613 0.774902
+vt 0.113306 0.774902
+vt 0.139919 0.774902
+vt 0.153226 0.774902
+vt 0.166532 0.774902
+vt 0.179838 0.774902
+vt 0.033467 0.774903
+vt 0.020161 0.774903
+vt 0.046774 0.774903
+vt 0.060080 0.774903
+vt 0.073387 0.774902
+vt 0.086693 0.774902
+vt 0.100000 0.774902
+vt 0.126613 0.788209
+vt 0.113306 0.788209
+vt 0.139919 0.788209
+vt 0.153225 0.788209
+vt 0.166532 0.788209
+vt 0.179838 0.788209
+vt 0.033467 0.788209
+vt 0.020161 0.788209
+vt 0.046774 0.788209
+vt 0.060080 0.788209
+vt 0.073387 0.788209
+vt 0.086693 0.788209
+vt 0.100000 0.788209
+vt 0.119959 0.721676
+vt 0.133266 0.721676
+vt 0.146572 0.721676
+vt 0.159879 0.721676
+vt 0.173185 0.721676
+vt 0.026814 0.721677
+vt 0.040120 0.721677
+vt 0.053427 0.721677
+vt 0.066733 0.721677
+vt 0.080040 0.721677
+vt 0.093346 0.721676
+vt 0.106653 0.721676
+vt 0.113307 0.965017
+vt 0.113307 0.951711
+vt 0.126613 0.951711
+vt 0.126614 0.965017
+vt 0.139920 0.951711
+vt 0.139920 0.965017
+vt 0.153226 0.951711
+vt 0.153226 0.965017
+vt 0.166533 0.951711
+vt 0.166533 0.965017
+vt 0.179839 0.951711
+vt 0.179839 0.965017
+vt 0.020162 0.965017
+vt 0.020162 0.951711
+vt 0.033468 0.951711
+vt 0.033468 0.965017
+vt 0.046774 0.951711
+vt 0.046775 0.965017
+vt 0.060081 0.951711
+vt 0.060081 0.965017
+vt 0.073387 0.951711
+vt 0.073387 0.965017
+vt 0.086694 0.951711
+vt 0.086694 0.965017
+vt 0.100000 0.951711
+vt 0.100000 0.965017
+vt 0.113307 0.938404
+vt 0.126613 0.938404
+vt 0.139920 0.938404
+vt 0.153226 0.938404
+vt 0.166533 0.938404
+vt 0.179839 0.938404
+vt 0.020162 0.938404
+vt 0.033468 0.938404
+vt 0.046774 0.938404
+vt 0.060081 0.938404
+vt 0.073387 0.938404
+vt 0.086694 0.938404
+vt 0.100000 0.938404
+vt 0.113307 0.925098
+vt 0.126613 0.925098
+vt 0.139920 0.925098
+vt 0.153226 0.925098
+vt 0.166533 0.925098
+vt 0.179839 0.925098
+vt 0.020162 0.925098
+vt 0.033468 0.925098
+vt 0.046775 0.925098
+vt 0.060081 0.925098
+vt 0.073387 0.925098
+vt 0.086694 0.925098
+vt 0.100000 0.925098
+vt 0.113307 0.911791
+vt 0.126613 0.911792
+vt 0.139920 0.911791
+vt 0.153226 0.911791
+vt 0.166533 0.911791
+vt 0.179839 0.911791
+vt 0.020162 0.911792
+vt 0.033468 0.911791
+vt 0.046775 0.911792
+vt 0.060081 0.911791
+vt 0.073387 0.911792
+vt 0.086694 0.911791
+vt 0.100000 0.911791
+vt 0.119960 0.978324
+vt 0.133267 0.978324
+vt 0.146573 0.978324
+vt 0.159880 0.978324
+vt 0.173186 0.978324
+vt 0.026815 0.978324
+vt 0.040121 0.978324
+vt 0.053428 0.978324
+vt 0.066734 0.978324
+vt 0.080041 0.978324
+vt 0.093347 0.978324
+vt 0.106654 0.978324
+vn 0.618018 -0.340438 -0.708629
+vn 0.004816 0.013405 -0.999899
+vn 0.217515 0.376643 -0.900459
+vn 0.768904 0.058373 -0.636693
+vn -0.606408 0.366126 -0.705848
+vn -0.333953 0.694994 -0.636757
+vn -0.859035 0.511917 -0.000001
+vn -0.562362 0.826891 0.000000
+vn -0.606408 0.366126 0.705848
+vn -0.333953 0.694991 0.636759
+vn 0.004812 0.013407 0.999899
+vn 0.217514 0.376640 0.900461
+vn 0.618018 -0.340438 0.708629
+vn 0.768903 0.058373 0.636695
+vn 0.873073 -0.487589 0.000000
+vn 0.997294 -0.073511 0.000000
+vn 0.386277 0.669203 -0.634790
+vn 0.775055 0.444810 -0.448815
+vn -0.002361 0.893545 -0.448966
+vn -0.163222 0.986589 -0.000002
+vn -0.002361 0.893546 0.448965
+vn 0.386277 0.669201 0.634791
+vn 0.775054 0.444809 0.448817
+vn 0.936026 0.351932 0.000001
+vn 0.500086 0.865976 -0.000003
+vn 0.330416 0.939272 0.092697
+vn 0.396301 0.912607 0.100466
+vn 0.383211 0.922561 0.045064
+vn 0.287051 0.954669 0.078798
+vn 0.269162 0.959884 0.078574
+vn 0.330417 0.939272 -0.092697
+vn 0.396301 0.912607 -0.100466
+vn 0.269162 0.959884 -0.078575
+vn 0.287051 0.954669 -0.078798
+vn 0.383211 0.922561 -0.045061
+vn 0.388183 0.921582 0.000002
+vn 0.436573 0.899669 0.000001
+vn 0.202745 0.979232 0.000000
+vn 0.226299 0.974058 -0.000001
+vn -0.330416 0.939272 0.092697
+vn -0.383210 0.922561 0.045064
+vn -0.396301 0.912607 0.100466
+vn -0.287051 0.954669 0.078798
+vn -0.269162 0.959884 0.078574
+vn -0.330416 0.939272 -0.092702
+vn -0.287051 0.954669 -0.078800
+vn -0.269162 0.959884 -0.078576
+vn -0.396301 0.912607 -0.100467
+vn -0.383212 0.922561 -0.045065
+vn -0.388183 0.921582 0.000000
+vn -0.436572 0.899669 0.000001
+vn -0.202745 0.979232 0.000004
+vn -0.226299 0.974058 0.000001
+vn -0.222517 -0.006117 -0.974910
+vn 0.000000 -0.006117 -0.999981
+vn 0.000000 -0.296295 -0.955097
+vn -0.212529 -0.296295 -0.931150
+vn -0.433876 -0.006117 -0.900952
+vn -0.414401 -0.296294 -0.860513
+vn -0.623478 -0.006117 -0.781817
+vn -0.595493 -0.296294 -0.746725
+vn -0.781817 -0.006117 -0.623478
+vn -0.746725 -0.296294 -0.595493
+vn -0.900952 -0.006117 -0.433876
+vn -0.860512 -0.296295 -0.414401
+vn -0.974910 -0.006117 -0.222517
+vn -0.931150 -0.296294 -0.212530
+vn -0.999981 -0.006117 0.000000
+vn -0.955097 -0.296294 0.000000
+vn -0.974910 -0.006117 0.222517
+vn -0.931150 -0.296295 0.212529
+vn -0.900952 -0.006117 0.433876
+vn -0.860513 -0.296294 0.414401
+vn -0.781817 -0.006117 0.623478
+vn -0.746725 -0.296294 0.595493
+vn -0.623478 -0.006117 0.781817
+vn -0.595493 -0.296294 0.746725
+vn -0.433875 -0.006117 0.900952
+vn -0.414401 -0.296294 0.860513
+vn -0.222517 -0.006117 0.974910
+vn -0.212529 -0.296294 0.931150
+vn 0.000000 -0.006117 0.999981
+vn 0.000000 -0.296294 0.955097
+vn -0.510013 -0.575221 0.639536
+vn -0.354916 -0.575221 0.736991
+vn -0.182022 -0.575221 0.797489
+vn 0.000000 -0.575221 0.817998
+vn 0.000000 -0.575221 -0.817998
+vn -0.182022 -0.575221 -0.797489
+vn -0.354916 -0.575221 -0.736991
+vn -0.510013 -0.575221 -0.639537
+vn -0.639537 -0.575221 -0.510013
+vn -0.736991 -0.575221 -0.354916
+vn -0.797490 -0.575220 -0.182022
+vn -0.817999 -0.575220 0.000000
+vn -0.797489 -0.575221 0.182022
+vn -0.736991 -0.575221 0.354916
+vn -0.639537 -0.575221 0.510013
+vn -0.369762 -0.805164 0.463668
+vn -0.463668 -0.805164 0.369762
+vn -0.253177 -0.946117 0.201902
+vn -0.201902 -0.946117 0.253177
+vn -0.257316 -0.805164 0.534322
+vn -0.140502 -0.946117 0.291757
+vn -0.131967 -0.805164 0.578184
+vn -0.072058 -0.946117 0.315706
+vn 0.000000 -0.805163 0.593053
+vn 0.000000 -0.946117 0.323825
+vn -0.131967 -0.805163 -0.578184
+vn 0.000000 -0.805163 -0.593053
+vn 0.000000 -0.946117 -0.323826
+vn -0.072058 -0.946117 -0.315707
+vn -0.257316 -0.805164 -0.534322
+vn -0.140503 -0.946117 -0.291757
+vn -0.369763 -0.805164 -0.463667
+vn -0.201902 -0.946117 -0.253178
+vn -0.463667 -0.805164 -0.369762
+vn -0.253177 -0.946117 -0.201902
+vn -0.534322 -0.805164 -0.257316
+vn -0.291757 -0.946117 -0.140503
+vn -0.578184 -0.805163 -0.131967
+vn -0.315706 -0.946117 -0.072058
+vn -0.593054 -0.805163 0.000000
+vn -0.323827 -0.946116 0.000000
+vn -0.578184 -0.805163 0.131967
+vn -0.315710 -0.946116 0.072059
+vn -0.534323 -0.805163 0.257316
+vn -0.291758 -0.946116 0.140504
+vn 0.222517 -0.006117 -0.974910
+vn 0.212529 -0.296295 -0.931150
+vn 0.433876 -0.006117 -0.900952
+vn 0.414401 -0.296294 -0.860513
+vn 0.623478 -0.006117 -0.781817
+vn 0.595493 -0.296294 -0.746725
+vn 0.781817 -0.006117 -0.623478
+vn 0.746725 -0.296294 -0.595493
+vn 0.900952 -0.006117 -0.433876
+vn 0.860512 -0.296294 -0.414401
+vn 0.974910 -0.006117 -0.222517
+vn 0.931150 -0.296294 -0.212530
+vn 0.999981 -0.006117 0.000000
+vn 0.955097 -0.296294 0.000000
+vn 0.974910 -0.006117 0.222517
+vn 0.931150 -0.296294 0.212529
+vn 0.900952 -0.006117 0.433876
+vn 0.860513 -0.296294 0.414400
+vn 0.781817 -0.006117 0.623478
+vn 0.746725 -0.296294 0.595493
+vn 0.623478 -0.006117 0.781817
+vn 0.595493 -0.296294 0.746725
+vn 0.433875 -0.006117 0.900952
+vn 0.414401 -0.296294 0.860513
+vn 0.222517 -0.006117 0.974910
+vn 0.212529 -0.296294 0.931150
+vn 0.354916 -0.575221 0.736991
+vn 0.510014 -0.575221 0.639537
+vn 0.182022 -0.575221 0.797489
+vn 0.182022 -0.575221 -0.797489
+vn 0.354916 -0.575221 -0.736991
+vn 0.510013 -0.575221 -0.639537
+vn 0.639537 -0.575221 -0.510013
+vn 0.736991 -0.575221 -0.354916
+vn 0.797490 -0.575220 -0.182022
+vn 0.817999 -0.575220 0.000000
+vn 0.797489 -0.575221 0.182022
+vn 0.736991 -0.575221 0.354916
+vn 0.639537 -0.575221 0.510013
+vn 0.201902 -0.946117 0.253177
+vn 0.253177 -0.946117 0.201902
+vn 0.463668 -0.805163 0.369762
+vn 0.369763 -0.805163 0.463668
+vn 0.140502 -0.946117 0.291757
+vn 0.257316 -0.805164 0.534322
+vn 0.072058 -0.946117 0.315707
+vn 0.131967 -0.805163 0.578184
+vn 0.072058 -0.946117 -0.315707
+vn 0.131967 -0.805164 -0.578184
+vn 0.140503 -0.946117 -0.291757
+vn 0.257316 -0.805164 -0.534322
+vn 0.201902 -0.946117 -0.253178
+vn 0.369762 -0.805164 -0.463667
+vn 0.253177 -0.946117 -0.201902
+vn 0.463667 -0.805164 -0.369762
+vn 0.291757 -0.946117 -0.140503
+vn 0.534322 -0.805164 -0.257316
+vn 0.315706 -0.946117 -0.072058
+vn 0.578184 -0.805163 -0.131967
+vn 0.323827 -0.946116 0.000000
+vn 0.593054 -0.805163 0.000000
+vn 0.315710 -0.946116 0.072059
+vn 0.578184 -0.805163 0.131967
+vn 0.291758 -0.946116 0.140504
+vn 0.534323 -0.805163 0.257316
+vn 0.000000 1.000000 0.000000
+vn 0.000000 0.998395 -0.056639
+vn -0.012603 0.998395 -0.055220
+vn -0.024575 0.998395 -0.051030
+vn -0.035314 0.998395 -0.044283
+vn -0.044282 0.998395 -0.035314
+vn -0.051030 0.998395 -0.024576
+vn -0.055219 0.998395 -0.012605
+vn -0.056639 0.998395 0.000000
+vn -0.055219 0.998395 0.012604
+vn -0.051030 0.998395 0.024576
+vn -0.044282 0.998395 0.035314
+vn -0.035314 0.998395 0.044281
+vn -0.024575 0.998395 0.051030
+vn -0.012603 0.998395 0.055219
+vn 0.000000 0.998395 0.056639
+vn -0.222494 0.015512 0.974811
+vn 0.000000 0.015512 0.999880
+vn -0.222494 0.015512 -0.974811
+vn 0.000000 0.015512 -0.999880
+vn -0.433832 0.015512 -0.900860
+vn -0.623415 0.015512 -0.781738
+vn -0.781737 0.015512 -0.623415
+vn -0.900860 0.015512 -0.433832
+vn -0.974811 0.015512 -0.222494
+vn -0.999880 0.015512 0.000000
+vn -0.974811 0.015512 0.222494
+vn -0.900861 0.015512 0.433831
+vn -0.781738 0.015512 0.623414
+vn -0.623415 0.015512 0.781737
+vn -0.433831 0.015512 0.900861
+vn 0.222494 0.015512 -0.974811
+vn 0.433832 0.015512 -0.900860
+vn 0.623415 0.015512 -0.781738
+vn 0.781737 0.015512 -0.623415
+vn 0.900860 0.015512 -0.433832
+vn 0.974811 0.015512 -0.222494
+vn 0.999880 0.015512 0.000000
+vn 0.974811 0.015512 0.222494
+vn 0.900861 0.015512 0.433831
+vn 0.781738 0.015512 0.623415
+vn 0.623415 0.015512 0.781737
+vn 0.433831 0.015512 0.900861
+vn 0.222494 0.015512 0.974811
+vn 0.012603 0.998395 0.055219
+vn 0.024575 0.998395 0.051030
+vn 0.035314 0.998395 0.044282
+vn 0.044282 0.998395 0.035314
+vn 0.051030 0.998395 0.024575
+vn 0.055219 0.998395 0.012604
+vn 0.056639 0.998395 0.000000
+vn 0.055219 0.998395 -0.012605
+vn 0.051030 0.998395 -0.024576
+vn 0.044282 0.998395 -0.035314
+vn 0.035314 0.998395 -0.044282
+vn 0.024575 0.998395 -0.051030
+vn 0.012603 0.998395 -0.055219
+vn 0.000000 0.169480 -0.985534
+vn -0.219302 0.169481 -0.960824
+vn -0.211496 0.310860 -0.926626
+vn -0.000001 0.310860 -0.950456
+vn -0.427607 0.169481 -0.887935
+vn -0.412387 0.310860 -0.856331
+vn -0.614470 0.169480 -0.770521
+vn -0.592599 0.310860 -0.743096
+vn -0.770521 0.169480 -0.614471
+vn -0.743096 0.310860 -0.592600
+vn -0.887935 0.169480 -0.427607
+vn -0.856331 0.310860 -0.412387
+vn -0.960824 0.169480 -0.219302
+vn -0.926626 0.310859 -0.211496
+vn -0.985533 0.169481 0.000000
+vn -0.950456 0.310859 0.000000
+vn -0.960824 0.169481 0.219302
+vn -0.926626 0.310860 0.211497
+vn -0.887935 0.169481 0.427607
+vn -0.856331 0.310860 0.412387
+vn -0.770521 0.169480 0.614470
+vn -0.743096 0.310860 0.592599
+vn -0.614471 0.169480 0.770521
+vn -0.592599 0.310860 0.743096
+vn -0.427607 0.169480 0.887935
+vn -0.412387 0.310860 0.856331
+vn -0.219302 0.169480 0.960824
+vn -0.211496 0.310860 0.926626
+vn 0.000000 0.169480 0.985534
+vn 0.000000 0.310860 0.950456
+vn -0.198254 0.454112 -0.868607
+vn 0.000000 0.454112 -0.890945
+vn -0.386567 0.454112 -0.802713
+vn -0.555495 0.454112 -0.696568
+vn -0.696569 0.454112 -0.555495
+vn -0.802713 0.454112 -0.386567
+vn -0.868607 0.454112 -0.198254
+vn -0.890945 0.454112 0.000000
+vn -0.868607 0.454112 0.198254
+vn -0.802713 0.454112 0.386567
+vn -0.696569 0.454112 0.555495
+vn -0.555495 0.454112 0.696569
+vn -0.386566 0.454112 0.802713
+vn -0.198254 0.454112 0.868607
+vn 0.000000 0.454112 0.890945
+vn -0.180644 0.583925 -0.791454
+vn 0.000000 0.583925 -0.811808
+vn -0.352230 0.583925 -0.731413
+vn -0.506154 0.583925 -0.634697
+vn -0.634697 0.583925 -0.506154
+vn -0.731414 0.583925 -0.352230
+vn -0.791454 0.583925 -0.180644
+vn -0.811808 0.583925 0.000000
+vn -0.791454 0.583925 0.180644
+vn -0.731413 0.583925 0.352231
+vn -0.634697 0.583925 0.506153
+vn -0.506154 0.583925 0.634696
+vn -0.352230 0.583925 0.731414
+vn -0.180644 0.583925 0.791454
+vn 0.000000 0.583925 0.811808
+vn -0.159601 0.696823 -0.699260
+vn 0.000000 0.696823 -0.717243
+vn -0.311200 0.696823 -0.646213
+vn -0.447193 0.696823 -0.560763
+vn -0.560762 0.696824 -0.447194
+vn -0.646213 0.696824 -0.311200
+vn -0.699260 0.696824 -0.159601
+vn -0.717243 0.696823 -0.000001
+vn -0.699260 0.696823 0.159601
+vn -0.646213 0.696823 0.311201
+vn -0.560763 0.696824 0.447193
+vn -0.447194 0.696824 0.560762
+vn -0.311200 0.696824 0.646213
+vn -0.159601 0.696823 0.699260
+vn 0.000000 0.696824 0.717243
+vn -0.136308 0.790421 -0.597205
+vn 0.000000 0.790421 -0.612564
+vn -0.265781 0.790422 -0.551901
+vn -0.381927 0.790422 -0.478921
+vn -0.478921 0.790422 -0.381927
+vn -0.551900 0.790422 -0.265781
+vn -0.597205 0.790422 -0.136308
+vn -0.612563 0.790422 0.000000
+vn -0.597205 0.790422 0.136308
+vn -0.551900 0.790421 0.265782
+vn -0.478921 0.790421 0.381927
+vn -0.381927 0.790422 0.478921
+vn -0.265781 0.790422 0.551900
+vn -0.136308 0.790421 0.597206
+vn 0.000000 0.790422 0.612563
+vn -0.112059 0.863943 -0.490964
+vn 0.000000 0.863942 -0.503591
+vn -0.218499 0.863943 -0.453718
+vn -0.313983 0.863943 -0.393722
+vn -0.393723 0.863943 -0.313983
+vn -0.453719 0.863943 -0.218500
+vn -0.490964 0.863943 -0.112059
+vn -0.503590 0.863943 0.000001
+vn -0.490964 0.863943 0.112060
+vn -0.453719 0.863943 0.218500
+vn -0.393722 0.863943 0.313983
+vn -0.313983 0.863943 0.393723
+vn -0.218500 0.863943 0.453719
+vn -0.112059 0.863943 0.490964
+vn 0.000000 0.863943 0.503590
+vn -0.088047 0.918388 -0.385761
+vn 0.000000 0.918388 -0.395681
+vn -0.171679 0.918388 -0.356496
+vn -0.246703 0.918388 -0.309356
+vn -0.309356 0.918388 -0.246703
+vn -0.356496 0.918388 -0.171680
+vn -0.356496 0.918388 0.171679
+vn -0.309355 0.918388 0.246704
+vn -0.246703 0.918388 0.309356
+vn -0.171679 0.918388 0.356496
+vn -0.088047 0.918388 0.385760
+vn 0.000000 0.918388 0.395680
+vn -0.065167 0.956156 -0.285516
+vn 0.000000 0.956156 -0.292859
+vn -0.127067 0.956156 -0.263856
+vn -0.182594 0.956156 -0.228967
+vn -0.228966 0.956155 -0.182596
+vn -0.263857 0.956156 -0.127067
+vn -0.263857 0.956156 0.127065
+vn -0.228966 0.956156 0.182595
+vn -0.182594 0.956156 0.228967
+vn -0.127067 0.956156 0.263857
+vn -0.065167 0.956156 0.285516
+vn 0.000000 0.956156 0.292859
+vn -0.043999 0.980256 -0.192773
+vn 0.000000 0.980256 -0.197731
+vn -0.085793 0.980256 -0.178150
+vn -0.123284 0.980256 -0.154593
+vn -0.154593 0.980256 -0.123284
+vn -0.178150 0.980256 -0.085792
+vn -0.192774 0.980256 -0.044000
+vn -0.197732 0.980256 0.000000
+vn -0.192774 0.980256 0.044000
+vn -0.178150 0.980256 0.085793
+vn -0.154593 0.980256 0.123284
+vn -0.123284 0.980256 0.154595
+vn -0.085792 0.980256 0.178152
+vn -0.043999 0.980256 0.192775
+vn 0.000000 0.980256 0.197732
+vn -0.025567 0.993377 -0.112018
+vn 0.000000 0.993377 -0.114899
+vn -0.049853 0.993377 -0.103521
+vn -0.071638 0.993377 -0.089830
+vn -0.089831 0.993378 -0.071635
+vn -0.103520 0.993377 -0.049855
+vn -0.112018 0.993377 -0.025569
+vn -0.114899 0.993377 0.000000
+vn -0.112018 0.993377 0.025570
+vn -0.103520 0.993377 0.049855
+vn -0.089831 0.993377 0.071638
+vn -0.071638 0.993377 0.089834
+vn -0.049853 0.993377 0.103522
+vn -0.025567 0.993377 0.112019
+vn 0.000000 0.993377 0.114900
+vn 0.000000 1.000000 -0.000001
+vn 0.211496 0.310861 -0.926626
+vn 0.219302 0.169480 -0.960824
+vn 0.412388 0.310861 -0.856331
+vn 0.427607 0.169480 -0.887935
+vn 0.592599 0.310860 -0.743096
+vn 0.614470 0.169480 -0.770521
+vn 0.743096 0.310860 -0.592600
+vn 0.770521 0.169480 -0.614471
+vn 0.856331 0.310860 -0.412387
+vn 0.887935 0.169481 -0.427607
+vn 0.926626 0.310860 -0.211497
+vn 0.960824 0.169480 -0.219302
+vn 0.950456 0.310860 -0.000001
+vn 0.985534 0.169480 0.000000
+vn 0.926625 0.310861 0.211497
+vn 0.960824 0.169481 0.219302
+vn 0.856331 0.310860 0.412388
+vn 0.887935 0.169481 0.427607
+vn 0.743096 0.310860 0.592599
+vn 0.770521 0.169480 0.614470
+vn 0.592600 0.310860 0.743096
+vn 0.614471 0.169480 0.770521
+vn 0.412388 0.310860 0.856331
+vn 0.427607 0.169481 0.887935
+vn 0.211497 0.310860 0.926626
+vn 0.219302 0.169480 0.960824
+vn 0.198254 0.454112 -0.868607
+vn 0.386567 0.454112 -0.802713
+vn 0.555495 0.454112 -0.696569
+vn 0.696568 0.454111 -0.555496
+vn 0.802713 0.454112 -0.386567
+vn 0.868607 0.454112 -0.198254
+vn 0.890945 0.454112 0.000000
+vn 0.868607 0.454112 0.198255
+vn 0.802713 0.454112 0.386567
+vn 0.696569 0.454112 0.555495
+vn 0.555495 0.454112 0.696569
+vn 0.386566 0.454112 0.802714
+vn 0.198254 0.454112 0.868607
+vn 0.180644 0.583925 -0.791454
+vn 0.352230 0.583925 -0.731414
+vn 0.506154 0.583925 -0.634697
+vn 0.634697 0.583924 -0.506154
+vn 0.731413 0.583925 -0.352231
+vn 0.791454 0.583925 -0.180644
+vn 0.811808 0.583925 0.000000
+vn 0.791454 0.583925 0.180645
+vn 0.731414 0.583925 0.352230
+vn 0.634697 0.583925 0.506154
+vn 0.506154 0.583925 0.634697
+vn 0.352230 0.583925 0.731414
+vn 0.180644 0.583925 0.791454
+vn 0.159601 0.696824 -0.699260
+vn 0.311200 0.696824 -0.646213
+vn 0.447194 0.696824 -0.560762
+vn 0.560763 0.696824 -0.447193
+vn 0.646213 0.696824 -0.311200
+vn 0.699260 0.696824 -0.159601
+vn 0.717242 0.696824 0.000000
+vn 0.699260 0.696824 0.159602
+vn 0.646213 0.696824 0.311199
+vn 0.560763 0.696824 0.447193
+vn 0.447193 0.696824 0.560762
+vn 0.311200 0.696824 0.646213
+vn 0.159601 0.696823 0.699260
+vn 0.136308 0.790421 -0.597206
+vn 0.265781 0.790422 -0.551900
+vn 0.381927 0.790422 -0.478921
+vn 0.478921 0.790422 -0.381927
+vn 0.551900 0.790422 -0.265781
+vn 0.597205 0.790422 -0.136308
+vn 0.612563 0.790422 0.000000
+vn 0.597205 0.790422 0.136308
+vn 0.551900 0.790422 0.265781
+vn 0.478921 0.790422 0.381926
+vn 0.381927 0.790422 0.478921
+vn 0.265781 0.790421 0.551901
+vn 0.136308 0.790422 0.597205
+vn 0.112059 0.863942 -0.490965
+vn 0.218500 0.863943 -0.453719
+vn 0.313983 0.863943 -0.393722
+vn 0.393723 0.863943 -0.313983
+vn 0.453719 0.863943 -0.218500
+vn 0.490964 0.863943 -0.112060
+vn 0.503590 0.863943 0.000000
+vn 0.490964 0.863943 0.112060
+vn 0.453719 0.863943 0.218500
+vn 0.393723 0.863943 0.313984
+vn 0.313983 0.863943 0.393723
+vn 0.218499 0.863943 0.453719
+vn 0.112059 0.863943 0.490964
+vn 0.088047 0.918388 -0.385761
+vn 0.171679 0.918388 -0.356497
+vn 0.246703 0.918388 -0.309355
+vn 0.309355 0.918388 -0.246703
+vn 0.356496 0.918388 -0.171680
+vn 0.356496 0.918388 0.171679
+vn 0.309356 0.918388 0.246703
+vn 0.246703 0.918388 0.309356
+vn 0.171679 0.918388 0.356496
+vn 0.088047 0.918388 0.385760
+vn 0.065167 0.956156 -0.285517
+vn 0.127067 0.956156 -0.263857
+vn 0.182594 0.956156 -0.228966
+vn 0.228966 0.956156 -0.182595
+vn 0.263857 0.956156 -0.127067
+vn 0.263857 0.956156 0.127066
+vn 0.228966 0.956156 0.182594
+vn 0.182595 0.956156 0.228965
+vn 0.127067 0.956156 0.263854
+vn 0.065167 0.956156 0.285515
+vn 0.043999 0.980256 -0.192774
+vn 0.085793 0.980256 -0.178151
+vn 0.123284 0.980256 -0.154592
+vn 0.154593 0.980256 -0.123283
+vn 0.178150 0.980256 -0.085793
+vn 0.192774 0.980256 -0.043999
+vn 0.197732 0.980256 -0.000001
+vn 0.192774 0.980256 0.043999
+vn 0.178150 0.980256 0.085793
+vn 0.154593 0.980256 0.123284
+vn 0.123284 0.980256 0.154593
+vn 0.085793 0.980256 0.178149
+vn 0.043999 0.980256 0.192773
+vn 0.025567 0.993377 -0.112018
+vn 0.049853 0.993377 -0.103521
+vn 0.071638 0.993377 -0.089830
+vn 0.089831 0.993377 -0.071637
+vn 0.103520 0.993377 -0.049855
+vn 0.112018 0.993377 -0.025566
+vn 0.114899 0.993377 0.000000
+vn 0.112018 0.993377 0.025569
+vn 0.103520 0.993377 0.049857
+vn 0.089831 0.993377 0.071640
+vn 0.071638 0.993377 0.089833
+vn 0.049853 0.993377 0.103520
+vn 0.025567 0.993377 0.112017
+vn -0.219660 -0.159819 -0.962397
+vn -0.000001 -0.159820 -0.987146
+vn 0.000000 -0.998264 -0.058901
+vn -0.013107 -0.998264 -0.057424
+vn -0.428306 -0.159820 -0.889388
+vn -0.615476 -0.159821 -0.771782
+vn -0.771782 -0.159821 -0.615476
+vn -0.889388 -0.159820 -0.428307
+vn -0.962396 -0.159820 -0.219661
+vn -0.987146 -0.159819 0.000000
+vn -0.962397 -0.159819 0.219660
+vn -0.889388 -0.159820 0.428306
+vn -0.771782 -0.159820 0.615475
+vn -0.615476 -0.159820 0.771781
+vn -0.428307 -0.159820 0.889388
+vn -0.219661 -0.159821 0.962396
+vn 0.000001 -0.159820 0.987146
+vn 0.000000 -1.000000 0.000000
+vn -0.025556 -0.998264 -0.053067
+vn -0.036724 -0.998264 -0.046051
+vn -0.046050 -0.998264 -0.036724
+vn -0.053067 -0.998264 -0.025555
+vn -0.057424 -0.998264 -0.013107
+vn -0.058900 -0.998264 0.000000
+vn -0.057424 -0.998264 0.013107
+vn -0.053067 -0.998264 0.025556
+vn -0.046050 -0.998264 0.036725
+vn -0.036724 -0.998264 0.046051
+vn -0.025556 -0.998264 0.053067
+vn -0.013107 -0.998264 0.057424
+vn 0.000000 -0.998264 0.058900
+vn 0.219661 -0.159822 -0.962396
+vn 0.428307 -0.159821 -0.889388
+vn 0.615476 -0.159821 -0.771782
+vn 0.771782 -0.159821 -0.615475
+vn 0.889388 -0.159821 -0.428306
+vn 0.962396 -0.159820 -0.219661
+vn 0.987146 -0.159820 0.000000
+vn 0.962396 -0.159820 0.219661
+vn 0.889387 -0.159821 0.428308
+vn 0.771782 -0.159821 0.615475
+vn 0.615476 -0.159820 0.771781
+vn 0.428306 -0.159820 0.889388
+vn 0.219660 -0.159820 0.962397
+vn 0.013107 -0.998264 0.057424
+vn 0.013107 -0.998264 -0.057424
+vn 0.025556 -0.998264 -0.053067
+vn 0.036724 -0.998264 -0.046050
+vn 0.046050 -0.998264 -0.036724
+vn 0.053067 -0.998264 -0.025556
+vn 0.057424 -0.998264 -0.013107
+vn 0.058900 -0.998264 0.000000
+vn 0.057424 -0.998264 0.013106
+vn 0.053067 -0.998264 0.025556
+vn 0.046050 -0.998264 0.036724
+vn 0.036724 -0.998264 0.046050
+vn 0.025556 -0.998264 0.053067
+vn -0.036912 -0.999319 -0.000002
+vn -0.034527 -0.999373 0.007881
+vn -0.035182 -0.999237 0.016944
+vn -0.024746 -0.999499 0.019734
+vn -0.019694 -0.999501 0.024697
+vn -0.010578 -0.999703 0.021965
+vn -0.004293 -0.999814 0.018813
+vn 0.000000 -0.999814 0.019289
+vn 0.004293 -0.999814 0.018813
+vn 0.010578 -0.999703 0.021965
+vn 0.019694 -0.999501 0.024697
+vn 0.024746 -0.999499 0.019734
+vn 0.035182 -0.999237 0.016944
+vn 0.034527 -0.999373 0.007881
+vn 0.036912 -0.999319 -0.000001
+vn 0.034527 -0.999373 -0.007881
+vn 0.035182 -0.999237 -0.016943
+vn 0.024746 -0.999499 -0.019735
+vn 0.019695 -0.999501 -0.024697
+vn 0.010578 -0.999703 -0.021965
+vn 0.004294 -0.999814 -0.018813
+vn 0.000000 -0.999814 -0.019289
+vn -0.004294 -0.999814 -0.018813
+vn -0.010578 -0.999703 -0.021965
+vn -0.019695 -0.999501 -0.024697
+vn -0.024746 -0.999499 -0.019735
+vn -0.035182 -0.999237 -0.016943
+vn -0.034527 -0.999373 -0.007881
+vn -0.000001 -1.000000 -0.000002
+vn 0.000001 -1.000000 0.000001
+vn 0.000000 -1.000000 0.000001
+vn 0.000000 -1.000000 0.000001
+vn 0.000000 -1.000000 0.000001
+vn 0.000002 -1.000000 0.000000
+vn 0.000003 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000002 -1.000000 0.000000
+vn 0.000000 -1.000000 -0.000001
+vn 0.000000 -1.000000 -0.000001
+vn -0.000001 -1.000000 -0.000001
+vn -0.000001 -1.000000 -0.000001
+vn 0.000001 -1.000000 -0.000002
+vn -0.000001 -1.000000 0.000001
+vn 0.000000 -1.000000 0.000001
+vn 0.000000 -1.000000 0.000001
+vn 0.000000 -1.000000 0.000001
+vn -0.000002 -1.000000 0.000000
+vn -0.000003 -1.000000 0.000000
+vn -0.000002 -1.000000 0.000000
+vn 0.000000 -1.000000 -0.000001
+vn 0.000000 -1.000000 -0.000001
+vn 0.000001 -1.000000 -0.000001
+vn 0.000001 -1.000000 0.000000
+vn -0.020734 0.046316 -0.998712
+vn -0.614803 0.388649 -0.686272
+vn 0.604569 -0.314879 -0.731674
+vn 0.879862 -0.475229 0.000000
+vn 0.604569 -0.314878 0.731675
+vn -0.020736 0.046317 0.998712
+vn -0.614803 0.388649 0.686272
+vn -0.851492 0.524367 0.000000
+vn 0.499517 -0.043951 0.865189
+vn 0.865193 -0.043951 0.499509
+vn 0.000000 -0.043951 0.999034
+vn -0.499517 -0.043951 0.865189
+vn -0.865193 -0.043950 0.499509
+vn -0.999034 -0.043950 0.000000
+vn 0.999034 -0.043950 0.000000
+vn -0.865189 -0.043950 -0.499517
+vn -0.499517 -0.043951 -0.865189
+vn 0.000000 -0.043951 -0.999034
+vn 0.499517 -0.043951 -0.865189
+vn 0.865189 -0.043950 -0.499517
+vn -0.499985 0.007713 -0.866000
+vn -0.499985 -0.007713 -0.866000
+vn -0.866000 -0.007713 -0.499985
+vn -0.866000 0.007713 -0.499985
+vn 0.000000 0.007713 -0.999970
+vn 0.000000 -0.007713 -0.999970
+vn 0.499985 0.007713 -0.866000
+vn 0.499985 -0.007713 -0.866000
+vn 0.866000 0.007713 -0.499985
+vn 0.866000 -0.007713 -0.499985
+vn 0.999970 0.007713 0.000000
+vn 0.999970 -0.007713 0.000000
+vn 0.866000 0.007713 0.499985
+vn 0.866000 -0.007713 0.499985
+vn 0.499985 0.007713 0.866000
+vn 0.499985 -0.007713 0.866000
+vn 0.000000 0.007713 0.999970
+vn 0.000000 -0.007713 0.999970
+vn -0.499985 0.007713 0.866000
+vn -0.499985 -0.007713 0.866000
+vn -0.866000 0.007713 0.499985
+vn -0.866000 -0.007713 0.499985
+vn -0.999970 0.007713 0.000000
+vn -0.999970 -0.007713 0.000000
+vn 0.000000 -0.013768 0.999905
+vn 0.499953 -0.013768 0.865943
+vn -0.499953 -0.013768 0.865943
+vn -0.865948 -0.013768 0.499945
+vn -0.999905 -0.013768 0.000000
+vn -0.865943 -0.013768 -0.499953
+vn -0.499953 -0.013768 -0.865943
+vn 0.000000 -0.013768 -0.999905
+vn 0.499953 -0.013768 -0.865943
+vn 0.865943 -0.013768 -0.499953
+vn 0.999905 -0.013768 0.000000
+vn 0.865948 -0.013768 0.499945
+vn -0.001996 0.008585 -0.999961
+vn 0.609220 0.361371 -0.705876
+vn 0.614802 0.388648 -0.686273
+vn 0.020735 0.046316 -0.998712
+vn -0.615214 -0.345341 -0.708697
+vn -0.604568 -0.314878 -0.731675
+vn -0.870284 -0.492551 0.000000
+vn -0.879863 -0.475228 0.000000
+vn -0.615213 -0.345341 0.708697
+vn -0.604568 -0.314878 0.731676
+vn 0.020736 0.046317 0.998712
+vn -0.001995 0.008586 0.999961
+vn 0.609221 0.361371 0.705876
+vn 0.614803 0.388649 0.686272
+vn 0.861840 0.507181 0.000000
+vn 0.851492 0.524367 0.000000
+vn -0.865193 -0.043950 0.499509
+vn -0.499517 -0.043951 0.865189
+vn 0.000000 -0.043951 0.999034
+vn 0.499517 -0.043951 0.865189
+vn 0.865193 -0.043950 0.499509
+vn 0.999034 -0.043950 0.000000
+vn -0.999034 -0.043950 0.000000
+vn 0.865189 -0.043950 -0.499517
+vn 0.499517 -0.043951 -0.865189
+vn 0.000000 -0.043951 -0.999034
+vn -0.499517 -0.043951 -0.865189
+vn -0.865189 -0.043950 -0.499517
+vn 0.000000 -0.013768 0.999905
+vn -0.499953 -0.013768 0.865943
+vn 0.499953 -0.013768 0.865943
+vn 0.865948 -0.013768 0.499945
+vn 0.999905 -0.013768 0.000000
+vn 0.865943 -0.013768 -0.499953
+vn 0.499953 -0.013768 -0.865943
+vn 0.000000 -0.013768 -0.999905
+vn -0.499953 -0.013768 -0.865943
+vn -0.865943 -0.013768 -0.499953
+vn -0.999905 -0.013768 0.000000
+vn -0.865948 -0.013768 0.499945
+vn -0.768903 0.058373 -0.636696
+vn -0.217514 0.376642 -0.900460
+vn 0.333953 0.694994 -0.636757
+vn 0.562362 0.826891 0.000002
+vn 0.333954 0.694992 0.636759
+vn -0.217515 0.376641 0.900460
+vn -0.768903 0.058373 0.636695
+vn -0.997294 -0.073511 -0.000000
+vn -0.775054 0.444809 -0.448817
+vn -0.386276 0.669201 -0.634792
+vn 0.002361 0.893545 -0.448967
+vn 0.163221 0.986590 -0.000000
+vn 0.002361 0.893546 0.448966
+vn -0.386276 0.669201 0.634792
+vn -0.775053 0.444810 0.448817
+vn -0.936026 0.351932 -0.000000
+vn -0.500086 0.865976 0.000000
+vn 0.499985 0.007713 -0.866000
+vn 0.866000 0.007713 -0.499985
+vn 0.866000 -0.007713 -0.499985
+vn 0.499985 -0.007713 -0.866000
+vn 0.000000 0.007713 -0.999970
+vn 0.000000 -0.007713 -0.999970
+vn -0.499985 0.007713 -0.866000
+vn -0.499985 -0.007713 -0.866000
+vn -0.866000 0.007713 -0.499985
+vn -0.866000 -0.007713 -0.499985
+vn -0.999970 0.007713 0.000000
+vn -0.999970 -0.007713 0.000000
+vn -0.866000 0.007713 0.499985
+vn -0.866000 -0.007713 0.499985
+vn -0.499985 0.007713 0.866000
+vn -0.499985 -0.007713 0.866000
+vn 0.000000 0.007713 0.999970
+vn 0.000000 -0.007713 0.999970
+vn 0.499985 0.007713 0.866000
+vn 0.499985 -0.007713 0.866000
+vn 0.866000 0.007713 0.499985
+vn 0.866000 -0.007713 0.499985
+vn 0.999970 0.007713 0.000000
+vn 0.999970 -0.007713 0.000000
+vn -0.289759 -0.942366 -0.167292
+vn -0.468078 -0.841351 -0.270244
+vn -0.270243 -0.841351 -0.468077
+vn -0.167291 -0.942366 -0.289760
+vn 0.000000 -0.841351 -0.540489
+vn 0.000000 -0.942365 -0.334586
+vn 0.270246 -0.841352 -0.468075
+vn 0.167296 -0.942365 -0.289759
+vn 0.468075 -0.841353 -0.270244
+vn 0.289761 -0.942365 -0.167293
+vn 0.540486 -0.841353 0.000000
+vn 0.334585 -0.942366 0.000000
+vn 0.468075 -0.841353 0.270244
+vn 0.289760 -0.942365 0.167294
+vn 0.270246 -0.841352 0.468075
+vn 0.167296 -0.942365 0.289759
+vn 0.000000 -0.841351 0.540489
+vn 0.000000 -0.942365 0.334587
+vn -0.270243 -0.841351 0.468078
+vn -0.167291 -0.942365 0.289760
+vn -0.468077 -0.841351 0.270245
+vn -0.289759 -0.942366 0.167293
+vn -0.540491 -0.841350 -0.000000
+vn -0.334583 -0.942366 0.000000
+vn -0.631864 -0.683860 -0.364805
+vn -0.364803 -0.683861 -0.631865
+vn 0.000000 -0.683861 -0.729612
+vn 0.364808 -0.683861 -0.631862
+vn 0.631860 -0.683863 -0.364806
+vn 0.729609 -0.683865 0.000000
+vn 0.631860 -0.683864 0.364806
+vn 0.364807 -0.683863 0.631860
+vn 0.000000 -0.683864 0.729610
+vn -0.364802 -0.683863 0.631863
+vn -0.631864 -0.683861 0.364804
+vn -0.729613 -0.683860 -0.000000
+vn -0.758869 -0.481825 -0.438135
+vn -0.438134 -0.481821 -0.758872
+vn -0.000000 -0.481821 -0.876270
+vn 0.438134 -0.481822 -0.758872
+vn 0.758870 -0.481823 -0.438136
+vn 0.876268 -0.481824 0.000000
+vn 0.758870 -0.481823 0.438136
+vn 0.438134 -0.481822 0.758872
+vn -0.000000 -0.481822 0.876269
+vn -0.438134 -0.481821 0.758872
+vn -0.758870 -0.481825 0.438135
+vn -0.876266 -0.481828 -0.000000
+vn -0.838785 -0.248836 -0.484273
+vn -0.484270 -0.248841 -0.838785
+vn 0.000002 -0.248841 -0.968544
+vn 0.484273 -0.248839 -0.838784
+vn 0.838784 -0.248838 -0.484274
+vn 0.968546 -0.248836 0.000000
+vn 0.838785 -0.248844 0.484270
+vn 0.484275 -0.248853 0.838779
+vn 0.000002 -0.248857 0.968540
+vn -0.484271 -0.248855 0.838781
+vn -0.838786 -0.248843 0.484269
+vn -0.968547 -0.248833 0.000000
+vn 0.000001 -1.000000 0.000000
+vn -0.289764 -0.942364 -0.167296
+vn -0.468092 -0.841342 -0.270247
+vn -0.270246 -0.841346 -0.468085
+vn -0.167290 -0.942363 -0.289770
+vn 0.000000 -0.841347 -0.540496
+vn -0.000000 -0.942361 -0.334597
+vn 0.270251 -0.841346 -0.468082
+vn 0.167306 -0.942360 -0.289769
+vn 0.468085 -0.841348 -0.270242
+vn 0.289775 -0.942361 -0.167291
+vn 0.540496 -0.841347 -0.000000
+vn 0.334596 -0.942362 -0.000000
+vn 0.468085 -0.841348 0.270243
+vn 0.289774 -0.942361 0.167291
+vn 0.270251 -0.841346 0.468083
+vn 0.167306 -0.942360 0.289769
+vn 0.000000 -0.841347 0.540496
+vn -0.000000 -0.942361 0.334597
+vn -0.270246 -0.841346 0.468085
+vn -0.167291 -0.942363 0.289770
+vn -0.468092 -0.841342 0.270247
+vn -0.289764 -0.942364 0.167296
+vn -0.540505 -0.841341 -0.000000
+vn -0.334592 -0.942363 -0.000000
+vn -0.631879 -0.683841 -0.364817
+vn -0.364817 -0.683841 -0.631878
+vn 0.000000 -0.683847 -0.729626
+vn 0.364815 -0.683845 -0.631875
+vn 0.631876 -0.683847 -0.364810
+vn 0.729620 -0.683852 0.000000
+vn 0.631876 -0.683847 0.364810
+vn 0.364815 -0.683845 0.631875
+vn 0.000000 -0.683847 0.729626
+vn -0.364817 -0.683841 0.631878
+vn -0.631879 -0.683841 0.364816
+vn -0.729628 -0.683844 -0.000000
+vn -0.758871 -0.481814 -0.438144
+vn -0.438132 -0.481807 -0.758883
+vn 0.000000 -0.481808 -0.876277
+vn 0.438141 -0.481808 -0.758876
+vn 0.758876 -0.481807 -0.438144
+vn 0.876278 -0.481806 -0.000000
+vn 0.758876 -0.481807 0.438144
+vn 0.438141 -0.481808 0.758876
+vn 0.000000 -0.481808 0.876277
+vn -0.438132 -0.481807 0.758883
+vn -0.758871 -0.481814 0.438144
+vn -0.876269 -0.481823 0.000000
+vn -0.838782 -0.248835 -0.484278
+vn -0.484267 -0.248839 -0.838788
+vn 0.000000 -0.248833 -0.968546
+vn 0.484281 -0.248830 -0.838782
+vn 0.838790 -0.248820 -0.484273
+vn 0.968552 -0.248812 -0.000000
+vn 0.838790 -0.248820 0.484273
+vn 0.484281 -0.248830 0.838782
+vn -0.000000 -0.248833 0.968547
+vn -0.484267 -0.248839 0.838788
+vn -0.838782 -0.248835 0.484279
+vn -0.968548 -0.248826 0.000000
+vn 0.000000 -1.000000 0.000000
+vn -0.289764 0.942364 -0.167296
+vn -0.167290 0.942363 -0.289769
+vn -0.270246 0.841346 -0.468086
+vn -0.468092 0.841342 -0.270247
+vn -0.000000 0.942361 -0.334598
+vn 0.000000 0.841346 -0.540497
+vn 0.167306 0.942361 -0.289767
+vn 0.270251 0.841346 -0.468082
+vn 0.289775 0.942361 -0.167291
+vn 0.468085 0.841347 -0.270243
+vn 0.334596 0.942362 -0.000000
+vn 0.540495 0.841347 -0.000000
+vn 0.289774 0.942361 0.167290
+vn 0.468085 0.841347 0.270243
+vn 0.167306 0.942361 0.289767
+vn 0.270251 0.841346 0.468082
+vn 0.000000 0.942361 0.334598
+vn 0.000000 0.841346 0.540496
+vn -0.167291 0.942363 0.289768
+vn -0.270246 0.841346 0.468085
+vn -0.289763 0.942364 0.167296
+vn -0.468091 0.841342 0.270247
+vn -0.334592 0.942363 -0.000000
+vn -0.540505 0.841341 -0.000000
+vn -0.364806 0.683864 -0.631860
+vn -0.631860 0.683864 -0.364805
+vn 0.000000 0.683869 -0.729605
+vn 0.364804 0.683868 -0.631857
+vn 0.631858 0.683869 -0.364800
+vn 0.729600 0.683875 -0.000000
+vn 0.631858 0.683869 0.364800
+vn 0.364804 0.683868 0.631857
+vn 0.000000 0.683869 0.729604
+vn -0.364806 0.683864 0.631859
+vn -0.631860 0.683864 0.364805
+vn -0.729607 0.683867 0.000000
+vn -0.438124 0.481837 -0.758868
+vn -0.758856 0.481845 -0.438135
+vn 0.000000 0.481839 -0.876260
+vn 0.438133 0.481839 -0.758861
+vn 0.758861 0.481837 -0.438136
+vn 0.876261 0.481836 -0.000000
+vn 0.758861 0.481837 0.438135
+vn 0.438133 0.481839 0.758862
+vn -0.000000 0.481839 0.876260
+vn -0.438124 0.481838 0.758868
+vn -0.758856 0.481845 0.438135
+vn -0.876252 0.481854 0.000000
+vn -0.484268 0.248828 -0.838790
+vn -0.838785 0.248824 -0.484280
+vn -0.000000 0.248822 -0.968549
+vn 0.484282 0.248819 -0.838785
+vn 0.838792 0.248809 -0.484275
+vn 0.968554 0.248801 -0.000000
+vn 0.838792 0.248809 0.484275
+vn 0.484282 0.248819 0.838785
+vn -0.000000 0.248821 0.968549
+vn -0.484268 0.248828 0.838790
+vn -0.838784 0.248824 0.484280
+vn -0.968551 0.248815 0.000000
+vn 0.000000 1.000000 0.000001
+vn 0.289759 -0.942366 -0.167292
+vn 0.167291 -0.942365 -0.289760
+vn 0.270243 -0.841351 -0.468078
+vn 0.468078 -0.841351 -0.270244
+vn -0.000000 -0.942365 -0.334586
+vn -0.000000 -0.841351 -0.540489
+vn -0.167296 -0.942365 -0.289759
+vn -0.270246 -0.841352 -0.468075
+vn -0.289761 -0.942365 -0.167293
+vn -0.468075 -0.841353 -0.270244
+vn -0.334585 -0.942366 0.000000
+vn -0.540486 -0.841353 0.000000
+vn -0.289760 -0.942365 0.167294
+vn -0.468075 -0.841353 0.270244
+vn -0.167296 -0.942365 0.289759
+vn -0.270246 -0.841352 0.468075
+vn -0.000000 -0.942365 0.334587
+vn -0.000000 -0.841351 0.540489
+vn 0.167291 -0.942366 0.289760
+vn 0.270243 -0.841351 0.468078
+vn 0.289759 -0.942366 0.167293
+vn 0.468077 -0.841351 0.270245
+vn 0.334583 -0.942366 -0.000000
+vn 0.540491 -0.841350 -0.000000
+vn 0.364803 -0.683861 -0.631865
+vn 0.631864 -0.683861 -0.364805
+vn -0.000000 -0.683861 -0.729612
+vn -0.364808 -0.683861 -0.631862
+vn -0.631860 -0.683863 -0.364806
+vn -0.729609 -0.683865 -0.000000
+vn -0.631860 -0.683864 0.364806
+vn -0.364807 -0.683863 0.631860
+vn -0.000000 -0.683864 0.729609
+vn 0.364802 -0.683863 0.631863
+vn 0.631864 -0.683861 0.364804
+vn 0.729613 -0.683861 -0.000000
+vn 0.438134 -0.481821 -0.758872
+vn 0.758869 -0.481825 -0.438135
+vn 0.000000 -0.481821 -0.876270
+vn -0.438134 -0.481822 -0.758872
+vn -0.758870 -0.481823 -0.438136
+vn -0.876268 -0.481824 0.000000
+vn -0.758870 -0.481823 0.438136
+vn -0.438134 -0.481822 0.758872
+vn 0.000000 -0.481822 0.876269
+vn 0.438134 -0.481821 0.758872
+vn 0.758870 -0.481825 0.438135
+vn 0.876266 -0.481828 -0.000000
+vn 0.484270 -0.248841 -0.838785
+vn 0.838785 -0.248836 -0.484273
+vn -0.000002 -0.248841 -0.968545
+vn -0.484274 -0.248839 -0.838784
+vn -0.838784 -0.248838 -0.484274
+vn -0.968546 -0.248836 0.000000
+vn -0.838785 -0.248844 0.484270
+vn -0.484275 -0.248853 0.838779
+vn -0.000002 -0.248857 0.968540
+vn 0.484271 -0.248855 0.838781
+vn 0.838786 -0.248843 0.484269
+vn 0.968547 -0.248832 0.000000
+vn -0.000001 -1.000000 0.000000
+vn 0.289764 -0.942364 -0.167297
+vn 0.167290 -0.942363 -0.289770
+vn 0.270246 -0.841346 -0.468085
+vn 0.468091 -0.841342 -0.270247
+vn 0.000000 -0.942361 -0.334597
+vn -0.000000 -0.841347 -0.540496
+vn -0.167306 -0.942360 -0.289769
+vn -0.270251 -0.841346 -0.468082
+vn -0.289775 -0.942361 -0.167291
+vn -0.468085 -0.841347 -0.270243
+vn -0.334596 -0.942362 -0.000000
+vn -0.540496 -0.841347 -0.000000
+vn -0.289774 -0.942361 0.167291
+vn -0.468085 -0.841348 0.270243
+vn -0.167306 -0.942360 0.289769
+vn -0.270251 -0.841346 0.468083
+vn -0.000000 -0.942361 0.334598
+vn -0.000000 -0.841347 0.540496
+vn 0.167291 -0.942363 0.289770
+vn 0.270246 -0.841346 0.468085
+vn 0.289763 -0.942364 0.167296
+vn 0.468091 -0.841342 0.270247
+vn 0.334592 -0.942363 -0.000000
+vn 0.540505 -0.841341 -0.000000
+vn 0.364817 -0.683841 -0.631879
+vn 0.631879 -0.683841 -0.364817
+vn -0.000000 -0.683847 -0.729626
+vn -0.364815 -0.683845 -0.631875
+vn -0.631876 -0.683846 -0.364810
+vn -0.729621 -0.683852 0.000000
+vn -0.631876 -0.683846 0.364810
+vn -0.364815 -0.683845 0.631875
+vn -0.000000 -0.683847 0.729626
+vn 0.364817 -0.683841 0.631878
+vn 0.631879 -0.683841 0.364816
+vn 0.729628 -0.683844 -0.000000
+vn 0.438132 -0.481806 -0.758883
+vn 0.758871 -0.481815 -0.438144
+vn 0.000000 -0.481808 -0.876277
+vn -0.438141 -0.481808 -0.758876
+vn -0.758876 -0.481807 -0.438144
+vn -0.876278 -0.481805 0.000000
+vn -0.758876 -0.481807 0.438144
+vn -0.438142 -0.481808 0.758876
+vn 0.000000 -0.481808 0.876277
+vn 0.438132 -0.481807 0.758883
+vn 0.758871 -0.481814 0.438144
+vn 0.876269 -0.481823 -0.000000
+vn 0.484267 -0.248839 -0.838788
+vn 0.838782 -0.248835 -0.484279
+vn -0.000000 -0.248833 -0.968547
+vn -0.484281 -0.248830 -0.838782
+vn -0.838790 -0.248820 -0.484273
+vn -0.968552 -0.248813 0.000000
+vn -0.838790 -0.248820 0.484274
+vn -0.484281 -0.248830 0.838782
+vn 0.000000 -0.248833 0.968547
+vn 0.484267 -0.248839 0.838788
+vn 0.838782 -0.248835 0.484278
+vn 0.968548 -0.248826 -0.000000
+vn -0.000000 -1.000000 -0.000000
+vn 0.289764 0.942364 -0.167296
+vn 0.468092 0.841342 -0.270247
+vn 0.270246 0.841346 -0.468086
+vn 0.167290 0.942363 -0.289769
+vn -0.000000 0.841346 -0.540497
+vn 0.000000 0.942361 -0.334598
+vn -0.270250 0.841346 -0.468083
+vn -0.167306 0.942361 -0.289767
+vn -0.468085 0.841348 -0.270243
+vn -0.289775 0.942361 -0.167290
+vn -0.540496 0.841347 0.000000
+vn -0.334596 0.942362 -0.000000
+vn -0.468085 0.841347 0.270243
+vn -0.289775 0.942361 0.167291
+vn -0.270251 0.841346 0.468083
+vn -0.167306 0.942361 0.289768
+vn -0.000000 0.841346 0.540497
+vn 0.000000 0.942361 0.334598
+vn 0.270246 0.841346 0.468086
+vn 0.167291 0.942363 0.289768
+vn 0.468092 0.841342 0.270247
+vn 0.289764 0.942364 0.167295
+vn 0.540505 0.841341 -0.000000
+vn 0.334592 0.942363 -0.000000
+vn 0.631860 0.683864 -0.364805
+vn 0.364806 0.683864 -0.631860
+vn -0.000000 0.683869 -0.729605
+vn -0.364804 0.683868 -0.631857
+vn -0.631858 0.683869 -0.364800
+vn -0.729599 0.683875 -0.000000
+vn -0.631858 0.683869 0.364799
+vn -0.364804 0.683868 0.631857
+vn -0.000000 0.683869 0.729605
+vn 0.364806 0.683864 0.631860
+vn 0.631860 0.683864 0.364805
+vn 0.729607 0.683867 -0.000000
+vn 0.758856 0.481845 -0.438135
+vn 0.438124 0.481837 -0.758868
+vn -0.000000 0.481839 -0.876260
+vn -0.438133 0.481839 -0.758861
+vn -0.758861 0.481837 -0.438135
+vn -0.876261 0.481836 0.000000
+vn -0.758861 0.481838 0.438135
+vn -0.438133 0.481839 0.758861
+vn 0.000000 0.481839 0.876260
+vn 0.438124 0.481838 0.758868
+vn 0.758857 0.481845 0.438135
+vn 0.876252 0.481853 -0.000000
+vn 0.838785 0.248824 -0.484280
+vn 0.484268 0.248828 -0.838790
+vn -0.000000 0.248822 -0.968549
+vn -0.484282 0.248819 -0.838785
+vn -0.838792 0.248809 -0.484275
+vn -0.968555 0.248801 0.000000
+vn -0.838792 0.248809 0.484275
+vn -0.484282 0.248819 0.838785
+vn -0.000000 0.248822 0.968549
+vn 0.484268 0.248828 0.838790
+vn 0.838785 0.248824 0.484280
+vn 0.968551 0.248815 0.000000
+vn -0.000000 1.000000 0.000000
+s 1
+g Andy_GEO
+f 1/1/1 2/2/2 10/10/3 9/9/4
+f 2/2/2 3/3/5 11/11/6 10/10/3
+f 3/3/5 4/4/7 12/927/8 11/11/6
+f 4/758/7 5/5/9 13/13/10 12/12/8
+f 5/5/9 6/6/11 14/14/12 13/13/10
+f 6/6/11 7/7/13 15/15/14 14/14/12
+f 7/7/13 8/8/15 16/16/16 15/15/14
+f 8/8/15 1/1/1 9/9/4 16/16/16
+f 9/9/4 10/10/3 18/18/17 17/17/18
+f 10/10/3 11/11/6 19/19/19 18/18/17
+f 11/11/6 12/927/8 20/928/20 19/19/19
+f 12/12/8 13/13/10 21/21/21 20/20/20
+f 13/13/10 14/14/12 22/22/22 21/21/21
+f 14/14/12 15/15/14 23/23/23 22/22/22
+f 15/15/14 16/16/16 24/24/24 23/23/23
+f 16/16/16 9/9/4 17/17/18 24/24/24
+f 17/17/18 18/18/17 25/25/25
+f 18/18/17 19/19/19 25/26/25
+f 19/19/19 20/928/20 25/27/25
+f 20/20/20 21/21/21 25/28/25
+f 21/21/21 22/22/22 25/29/25
+f 22/22/22 23/23/23 25/30/25
+f 23/23/23 24/24/24 25/31/25
+f 24/24/24 17/17/18 25/32/25
+f 32/33/26 26/34/27 33/35/28
+f 34/36/29 27/37/30 26/34/27 32/33/26
+f 35/38/31 29/39/32 28/40/33 36/41/34
+f 37/42/35 29/39/32 35/38/31
+f 38/43/36 30/44/37 29/39/32 37/42/35
+f 33/35/28 26/34/27 30/44/37 38/43/36
+f 39/45/38 31/46/39 27/37/30 34/36/29
+f 36/41/34 28/40/33 31/46/39 39/45/38
+f 46/47/40 47/48/41 40/49/42
+f 48/50/43 46/47/40 40/49/42 41/51/44
+f 49/52/45 50/53/46 42/54/47 43/55/48
+f 51/56/49 49/52/45 43/55/48
+f 52/57/50 51/56/49 43/55/48 44/58/51
+f 47/48/41 52/57/50 44/58/51 40/49/42
+f 53/59/52 48/50/43 41/51/44 45/60/53
+f 50/53/46 53/59/52 45/60/53 42/54/47
+s 6
+f 55/61/54 54/62/55 88/63/56 89/64/57
+f 56/65/58 55/61/54 89/64/57 90/66/59
+f 57/67/60 56/65/58 90/66/59 91/68/61
+f 58/69/62 57/67/60 91/68/61 92/70/63
+f 59/71/64 58/69/62 92/70/63 93/72/65
+f 60/73/66 59/71/64 93/72/65 94/74/67
+f 61/75/68 60/73/66 94/74/67 95/76/69
+f 62/77/70 61/75/68 95/76/69 96/78/71
+f 63/79/72 62/77/70 96/78/71 97/80/73
+f 64/81/74 63/79/72 97/80/73 98/82/75
+f 65/83/76 64/81/74 98/82/75 84/84/77
+f 66/85/78 65/83/76 84/84/77 85/86/79
+f 67/87/80 66/85/78 85/86/79 86/88/81
+f 68/89/82 67/87/80 86/88/81 87/90/83
+f 85/86/79 84/84/77 581/91/84 582/92/85
+f 86/88/81 85/86/79 582/92/85 583/93/86
+f 87/90/83 86/88/81 583/93/86 584/94/87
+f 89/64/57 88/63/56 598/95/88 599/96/89
+f 90/66/59 89/64/57 599/96/89 600/97/90
+f 91/68/61 90/66/59 600/97/90 601/98/91
+f 92/70/63 91/68/61 601/98/91 602/99/92
+f 93/72/65 92/70/63 602/99/92 603/100/93
+f 94/74/67 93/72/65 603/100/93 604/101/94
+f 95/76/69 94/74/67 604/101/94 577/102/95
+f 96/78/71 95/76/69 577/102/95 578/103/96
+f 97/80/73 96/78/71 578/103/96 579/104/97
+f 98/82/75 97/80/73 579/104/97 580/105/98
+f 84/84/77 98/82/75 580/105/98 581/91/84
+f 100/106/99 99/107/100 608/108/101 609/109/102
+f 101/110/103 100/106/99 609/109/102 610/111/104
+f 102/112/105 101/110/103 610/111/104 611/113/106
+f 103/114/107 102/112/105 611/113/106 612/115/108
+f 105/116/109 104/117/110 626/118/111 627/119/112
+f 106/120/113 105/116/109 627/119/112 628/121/114
+f 107/122/115 106/120/113 628/121/114 629/123/116
+f 108/124/117 107/122/115 629/123/116 630/125/118
+f 109/126/119 108/124/117 630/125/118 631/127/120
+f 110/128/121 109/126/119 631/127/120 632/129/122
+f 111/130/123 110/128/121 632/129/122 605/131/124
+f 112/132/125 111/130/123 605/131/124 606/133/126
+f 113/134/127 112/132/125 606/133/126 607/135/128
+f 608/108/101 99/107/100 113/134/127 607/135/128
+f 114/136/129 143/137/130 88/63/56 54/62/55
+f 115/138/131 144/139/132 143/137/130 114/136/129
+f 116/140/133 145/141/134 144/139/132 115/138/131
+f 117/142/135 146/143/136 145/141/134 116/140/133
+f 118/144/137 147/145/138 146/143/136 117/142/135
+f 119/146/139 148/147/140 147/145/138 118/144/137
+f 120/148/141 149/149/142 148/147/140 119/146/139
+f 121/150/143 150/151/144 149/149/142 120/148/141
+f 122/152/145 151/153/146 150/151/144 121/150/143
+f 123/154/147 152/155/148 151/153/146 122/152/145
+f 124/156/149 140/157/150 152/155/148 123/154/147
+f 125/158/151 141/159/152 140/157/150 124/156/149
+f 126/160/153 142/161/154 141/159/152 125/158/151
+f 68/89/82 87/90/83 142/161/154 126/160/153
+f 141/159/152 586/162/155 587/163/156 140/157/150
+f 142/161/154 585/164/157 586/162/155 141/159/152
+f 87/90/83 584/94/87 585/164/157 142/161/154
+f 143/137/130 597/165/158 598/95/88 88/63/56
+f 144/139/132 596/166/159 597/165/158 143/137/130
+f 145/141/134 595/167/160 596/166/159 144/139/132
+f 146/143/136 594/168/161 595/167/160 145/141/134
+f 147/145/138 593/169/162 594/168/161 146/143/136
+f 148/147/140 592/170/163 593/169/162 147/145/138
+f 149/149/142 591/171/164 592/170/163 148/147/140
+f 150/151/144 590/172/165 591/171/164 149/149/142
+f 151/153/146 589/173/166 590/172/165 150/151/144
+f 152/155/148 588/174/167 589/173/166 151/153/146
+f 140/157/150 587/163/156 588/174/167 152/155/148
+f 615/175/168 616/176/169 153/177/170 154/178/171
+f 614/179/172 615/175/168 154/178/171 155/180/173
+f 613/181/174 614/179/172 155/180/173 156/182/175
+f 103/114/107 612/115/108 613/181/174 156/182/175
+f 625/183/176 626/118/111 104/117/110 157/184/177
+f 624/185/178 625/183/176 157/184/177 158/186/179
+f 623/187/180 624/185/178 158/186/179 159/188/181
+f 622/189/182 623/187/180 159/188/181 160/190/183
+f 621/191/184 622/189/182 160/190/183 161/192/185
+f 620/193/186 621/191/184 161/192/185 162/194/187
+f 619/195/188 620/193/186 162/194/187 163/196/189
+f 618/197/190 619/195/188 163/196/189 164/198/191
+f 617/199/192 618/197/190 164/198/191 165/200/193
+f 153/177/170 616/176/169 617/199/192 165/200/193
+f 166/201/194 196/202/195 194/203/196
+f 166/201/194 194/203/196 192/204/197
+f 166/201/194 192/204/197 190/205/198
+f 166/201/194 190/205/198 188/206/199
+f 166/201/194 188/206/199 186/207/200
+f 166/201/194 186/207/200 184/208/201
+f 166/201/194 184/208/201 182/209/202
+f 166/201/194 182/209/202 180/210/203
+f 166/201/194 180/210/203 178/211/204
+f 166/201/194 178/211/204 176/212/205
+f 166/201/194 176/212/205 174/213/206
+f 166/201/194 174/213/206 172/214/207
+f 166/201/194 172/214/207 170/215/208
+f 166/201/194 170/215/208 167/216/209
+f 167/216/209 170/215/208 169/217/210 168/218/211
+f 54/219/55 55/220/54 193/221/212 195/222/213
+f 193/221/212 55/220/54 56/223/58 191/224/214
+f 56/223/58 57/225/60 189/226/215 191/224/214
+f 57/225/60 58/227/62 187/228/216 189/226/215
+f 58/227/62 59/229/64 185/230/217 187/228/216
+f 59/229/64 60/231/66 183/232/218 185/230/217
+f 60/231/66 61/233/68 181/234/219 183/232/218
+f 61/233/68 62/235/70 179/236/220 181/234/219
+f 62/235/70 63/237/72 177/238/221 179/236/220
+f 63/237/72 64/239/74 175/240/222 177/238/221
+f 64/239/74 65/241/76 173/242/223 175/240/222
+f 65/241/76 66/243/78 171/244/224 173/242/223
+f 66/243/78 67/245/80 169/246/210 171/244/224
+f 67/245/80 68/247/82 168/248/211 169/246/210
+f 114/252/129 54/249/55 195/250/213 221/251/225
+f 115/254/131 114/252/129 221/251/225 219/253/226
+f 116/256/133 115/254/131 219/253/226 217/255/227
+f 117/258/135 116/256/133 217/255/227 215/257/228
+f 118/260/137 117/258/135 215/257/228 213/259/229
+f 119/262/139 118/260/137 213/259/229 211/261/230
+f 120/264/141 119/262/139 211/261/230 209/263/231
+f 121/266/143 120/264/141 209/263/231 207/265/232
+f 122/268/145 121/266/143 207/265/232 205/267/233
+f 123/270/147 122/268/145 205/267/233 203/269/234
+f 124/272/149 123/270/147 203/269/234 201/271/235
+f 125/274/151 124/272/149 201/271/235 199/273/236
+f 126/276/153 125/274/151 199/273/236 197/275/237
+f 68/247/82 126/276/153 197/275/237 168/248/211
+f 166/201/194 167/216/209 198/277/238
+f 166/201/194 198/277/238 200/278/239
+f 166/201/194 200/278/239 202/279/240
+f 166/201/194 202/279/240 204/280/241
+f 166/201/194 204/280/241 206/281/242
+f 166/201/194 206/281/242 208/282/243
+f 166/201/194 208/282/243 210/283/244
+f 166/201/194 210/283/244 212/284/245
+f 166/201/194 212/284/245 214/285/246
+f 166/201/194 214/285/246 216/286/247
+f 166/201/194 216/286/247 218/287/248
+f 166/201/194 218/287/248 220/288/249
+f 166/201/194 220/288/249 222/289/250
+f 166/201/194 222/289/250 196/202/195
+f 170/215/208 172/214/207 171/290/224 169/217/210
+f 172/214/207 174/213/206 173/291/223 171/290/224
+f 174/213/206 176/212/205 175/292/222 173/291/223
+f 176/212/205 178/211/204 177/293/221 175/292/222
+f 178/211/204 180/210/203 179/294/220 177/293/221
+f 180/210/203 182/209/202 181/295/219 179/294/220
+f 182/209/202 184/208/201 183/296/218 181/295/219
+f 184/208/201 186/207/200 185/297/217 183/296/218
+f 186/207/200 188/206/199 187/298/216 185/297/217
+f 188/206/199 190/205/198 189/299/215 187/298/216
+f 190/205/198 192/204/197 191/300/214 189/299/215
+f 192/204/197 194/203/196 193/301/212 191/300/214
+f 194/203/196 196/202/195 195/302/213 193/301/212
+f 195/302/213 196/202/195 222/289/250 221/303/225
+f 198/277/238 167/216/209 168/218/211 197/304/237
+f 200/278/239 198/277/238 197/304/237 199/305/236
+f 202/279/240 200/278/239 199/305/236 201/306/235
+f 204/280/241 202/279/240 201/306/235 203/307/234
+f 206/281/242 204/280/241 203/307/234 205/308/233
+f 208/282/243 206/281/242 205/308/233 207/309/232
+f 210/283/244 208/282/243 207/309/232 209/310/231
+f 212/284/245 210/283/244 209/310/231 211/311/230
+f 214/285/246 212/284/245 211/311/230 213/312/229
+f 216/286/247 214/285/246 213/312/229 215/313/228
+f 218/287/248 216/286/247 215/313/228 217/314/227
+f 220/288/249 218/287/248 217/314/227 219/315/226
+f 222/289/250 220/288/249 219/315/226 221/303/225
+s 1
+f 223/316/251 224/317/252 239/318/253 238/319/254
+f 224/317/252 225/320/255 240/321/256 239/318/253
+f 225/320/255 226/322/257 241/323/258 240/321/256
+f 226/322/257 227/324/259 242/325/260 241/323/258
+f 227/324/259 228/326/261 243/327/262 242/325/260
+f 228/326/261 229/328/263 244/329/264 243/327/262
+f 229/328/263 230/330/265 245/331/266 244/329/264
+f 230/330/265 231/332/267 246/333/268 245/331/266
+f 231/332/267 232/334/269 247/335/270 246/333/268
+f 232/334/269 233/336/271 248/337/272 247/335/270
+f 233/336/271 234/338/273 249/339/274 248/337/272
+f 234/338/273 235/340/275 250/341/276 249/339/274
+f 235/340/275 236/342/277 251/343/278 250/341/276
+f 236/342/277 237/344/279 252/345/280 251/343/278
+f 238/319/254 239/318/253 254/346/281 253/347/282
+f 239/318/253 240/321/256 255/348/283 254/346/281
+f 240/321/256 241/323/258 256/349/284 255/348/283
+f 241/323/258 242/325/260 257/350/285 256/349/284
+f 242/325/260 243/327/262 258/351/286 257/350/285
+f 243/327/262 244/329/264 259/352/287 258/351/286
+f 244/329/264 245/331/266 260/353/288 259/352/287
+f 245/331/266 246/333/268 261/354/289 260/353/288
+f 246/333/268 247/335/270 262/355/290 261/354/289
+f 247/335/270 248/337/272 263/356/291 262/355/290
+f 248/337/272 249/339/274 264/357/292 263/356/291
+f 249/339/274 250/341/276 265/358/293 264/357/292
+f 250/341/276 251/343/278 266/359/294 265/358/293
+f 251/343/278 252/345/280 267/360/295 266/359/294
+f 253/347/282 254/346/281 269/361/296 268/362/297
+f 254/346/281 255/348/283 270/363/298 269/361/296
+f 255/348/283 256/349/284 271/364/299 270/363/298
+f 256/349/284 257/350/285 272/365/300 271/364/299
+f 257/350/285 258/351/286 273/366/301 272/365/300
+f 258/351/286 259/352/287 274/367/302 273/366/301
+f 259/352/287 260/353/288 275/368/303 274/367/302
+f 260/353/288 261/354/289 276/369/304 275/368/303
+f 261/354/289 262/355/290 277/370/305 276/369/304
+f 262/355/290 263/356/291 278/371/306 277/370/305
+f 263/356/291 264/357/292 279/372/307 278/371/306
+f 264/357/292 265/358/293 280/373/308 279/372/307
+f 265/358/293 266/359/294 281/374/309 280/373/308
+f 266/359/294 267/360/295 282/375/310 281/374/309
+f 268/362/297 269/361/296 284/376/311 283/377/312
+f 269/361/296 270/363/298 285/378/313 284/376/311
+f 270/363/298 271/364/299 286/379/314 285/378/313
+f 271/364/299 272/365/300 287/380/315 286/379/314
+f 272/365/300 273/366/301 288/381/316 287/380/315
+f 273/366/301 274/367/302 289/382/317 288/381/316
+f 274/367/302 275/368/303 290/383/318 289/382/317
+f 275/368/303 276/369/304 291/384/319 290/383/318
+f 276/369/304 277/370/305 292/385/320 291/384/319
+f 277/370/305 278/371/306 293/386/321 292/385/320
+f 278/371/306 279/372/307 294/387/322 293/386/321
+f 279/372/307 280/373/308 295/388/323 294/387/322
+f 280/373/308 281/374/309 296/389/324 295/388/323
+f 281/374/309 282/375/310 297/390/325 296/389/324
+f 283/377/312 284/376/311 299/391/326 298/392/327
+f 284/376/311 285/378/313 300/393/328 299/391/326
+f 285/378/313 286/379/314 301/394/329 300/393/328
+f 286/379/314 287/380/315 302/395/330 301/394/329
+f 287/380/315 288/381/316 303/396/331 302/395/330
+f 288/381/316 289/382/317 304/397/332 303/396/331
+f 289/382/317 290/383/318 305/398/333 304/397/332
+f 290/383/318 291/384/319 306/399/334 305/398/333
+f 291/384/319 292/385/320 307/400/335 306/399/334
+f 292/385/320 293/386/321 308/401/336 307/400/335
+f 293/386/321 294/387/322 309/402/337 308/401/336
+f 294/387/322 295/388/323 310/403/338 309/402/337
+f 295/388/323 296/389/324 311/404/339 310/403/338
+f 296/389/324 297/390/325 312/405/340 311/404/339
+f 298/392/327 299/391/326 314/406/341 313/407/342
+f 299/391/326 300/393/328 315/408/343 314/406/341
+f 300/393/328 301/394/329 316/409/344 315/408/343
+f 301/394/329 302/395/330 317/410/345 316/409/344
+f 302/395/330 303/396/331 318/411/346 317/410/345
+f 303/396/331 304/397/332 319/412/347 318/411/346
+f 304/397/332 305/398/333 320/413/348 319/412/347
+f 305/398/333 306/399/334 321/414/349 320/413/348
+f 306/399/334 307/400/335 322/415/350 321/414/349
+f 307/400/335 308/401/336 323/416/351 322/415/350
+f 308/401/336 309/402/337 324/417/352 323/416/351
+f 309/402/337 310/403/338 325/418/353 324/417/352
+f 310/403/338 311/404/339 326/419/354 325/418/353
+f 311/404/339 312/405/340 327/420/355 326/419/354
+f 313/407/342 314/406/341 329/421/356 328/422/357
+f 314/406/341 315/408/343 330/423/358 329/421/356
+f 315/408/343 316/409/344 331/424/359 330/423/358
+f 316/409/344 317/410/345 332/425/360 331/424/359
+f 317/410/345 318/411/346 333/426/361 332/425/360
+f 318/411/346 319/412/347 43/55/48 333/426/361
+f 319/412/347 320/413/348 44/58/51 43/55/48
+f 320/413/348 321/414/349 40/49/42 44/58/51
+f 321/414/349 322/415/350 334/427/362 40/49/42
+f 322/415/350 323/416/351 335/428/363 334/427/362
+f 323/416/351 324/417/352 336/429/364 335/428/363
+f 324/417/352 325/418/353 337/430/365 336/429/364
+f 325/418/353 326/419/354 338/431/366 337/430/365
+f 326/419/354 327/420/355 339/432/367 338/431/366
+f 328/422/357 329/421/356 341/433/368 340/434/369
+f 329/421/356 330/423/358 342/435/370 341/433/368
+f 330/423/358 331/424/359 343/436/371 342/435/370
+f 331/424/359 332/425/360 344/437/372 343/436/371
+f 332/425/360 333/426/361 345/438/373 344/437/372
+f 333/426/361 43/55/48 42/54/47 345/438/373
+f 40/49/42 334/427/362 346/439/374 41/51/44
+f 334/427/362 335/428/363 347/440/375 346/439/374
+f 335/428/363 336/429/364 348/441/376 347/440/375
+f 336/429/364 337/430/365 349/442/377 348/441/376
+f 337/430/365 338/431/366 350/443/378 349/442/377
+f 338/431/366 339/432/367 351/444/379 350/443/378
+f 340/434/369 341/433/368 353/445/380 352/446/381
+f 341/433/368 342/435/370 354/447/382 353/445/380
+f 342/435/370 343/436/371 355/448/383 354/447/382
+f 343/436/371 344/437/372 356/449/384 355/448/383
+f 344/437/372 345/438/373 357/450/385 356/449/384
+f 345/438/373 42/54/47 358/451/386 357/450/385
+f 42/54/47 45/60/53 359/452/387 358/451/386
+f 45/60/53 41/51/44 360/453/388 359/452/387
+f 41/51/44 346/439/374 361/454/389 360/453/388
+f 346/439/374 347/440/375 362/455/390 361/454/389
+f 347/440/375 348/441/376 363/456/391 362/455/390
+f 348/441/376 349/442/377 364/457/392 363/456/391
+f 349/442/377 350/443/378 365/458/393 364/457/392
+f 350/443/378 351/444/379 366/459/394 365/458/393
+f 352/446/381 353/445/380 368/460/395 367/461/396
+f 353/445/380 354/447/382 369/462/397 368/460/395
+f 354/447/382 355/448/383 370/463/398 369/462/397
+f 355/448/383 356/449/384 371/464/399 370/463/398
+f 356/449/384 357/450/385 372/465/400 371/464/399
+f 357/450/385 358/451/386 373/466/401 372/465/400
+f 358/451/386 359/452/387 374/467/402 373/466/401
+f 359/452/387 360/453/388 375/468/403 374/467/402
+f 360/453/388 361/454/389 376/469/404 375/468/403
+f 361/454/389 362/455/390 377/470/405 376/469/404
+f 362/455/390 363/456/391 378/471/406 377/470/405
+f 363/456/391 364/457/392 379/472/407 378/471/406
+f 364/457/392 365/458/393 380/473/408 379/472/407
+f 365/458/393 366/459/394 381/474/409 380/473/408
+f 367/461/396 368/460/395 382/475/410
+f 368/460/395 369/462/397 382/475/410
+f 369/462/397 370/463/398 382/475/410
+f 370/463/398 371/464/399 382/475/410
+f 371/464/399 372/465/400 382/475/410
+f 372/465/400 373/466/401 382/475/410
+f 373/466/401 374/467/402 382/475/410
+f 374/467/402 375/468/403 382/475/410
+f 375/468/403 376/469/404 382/475/410
+f 376/469/404 377/470/405 382/475/410
+f 377/470/405 378/471/406 382/475/410
+f 378/471/406 379/472/407 382/475/410
+f 379/472/407 380/473/408 382/475/410
+f 380/473/408 381/474/409 382/475/410
+f 223/316/251 238/319/254 396/476/411 383/477/412
+f 383/477/412 396/476/411 397/478/413 384/479/414
+f 384/479/414 397/478/413 398/480/415 385/481/416
+f 385/481/416 398/480/415 399/482/417 386/483/418
+f 386/483/418 399/482/417 400/484/419 387/485/420
+f 387/485/420 400/484/419 401/486/421 388/487/422
+f 388/487/422 401/486/421 402/488/423 389/489/424
+f 389/489/424 402/488/423 403/490/425 390/491/426
+f 390/491/426 403/490/425 404/492/427 391/493/428
+f 391/493/428 404/492/427 405/494/429 392/495/430
+f 392/495/430 405/494/429 406/496/431 393/497/432
+f 393/497/432 406/496/431 407/498/433 394/499/434
+f 394/499/434 407/498/433 408/500/435 395/501/436
+f 395/501/436 408/500/435 252/345/280 237/344/279
+f 238/319/254 253/347/282 409/502/437 396/476/411
+f 396/476/411 409/502/437 410/503/438 397/478/413
+f 397/478/413 410/503/438 411/504/439 398/480/415
+f 398/480/415 411/504/439 412/505/440 399/482/417
+f 399/482/417 412/505/440 413/506/441 400/484/419
+f 400/484/419 413/506/441 414/507/442 401/486/421
+f 401/486/421 414/507/442 415/508/443 402/488/423
+f 402/488/423 415/508/443 416/509/444 403/490/425
+f 403/490/425 416/509/444 417/510/445 404/492/427
+f 404/492/427 417/510/445 418/511/446 405/494/429
+f 405/494/429 418/511/446 419/512/447 406/496/431
+f 406/496/431 419/512/447 420/513/448 407/498/433
+f 407/498/433 420/513/448 421/514/449 408/500/435
+f 408/500/435 421/514/449 267/360/295 252/345/280
+f 253/347/282 268/362/297 422/515/450 409/502/437
+f 409/502/437 422/515/450 423/516/451 410/503/438
+f 410/503/438 423/516/451 424/517/452 411/504/439
+f 411/504/439 424/517/452 425/518/453 412/505/440
+f 412/505/440 425/518/453 426/519/454 413/506/441
+f 413/506/441 426/519/454 427/520/455 414/507/442
+f 414/507/442 427/520/455 428/521/456 415/508/443
+f 415/508/443 428/521/456 429/522/457 416/509/444
+f 416/509/444 429/522/457 430/523/458 417/510/445
+f 417/510/445 430/523/458 431/524/459 418/511/446
+f 418/511/446 431/524/459 432/525/460 419/512/447
+f 419/512/447 432/525/460 433/526/461 420/513/448
+f 420/513/448 433/526/461 434/527/462 421/514/449
+f 421/514/449 434/527/462 282/375/310 267/360/295
+f 268/362/297 283/377/312 435/528/463 422/515/450
+f 422/515/450 435/528/463 436/529/464 423/516/451
+f 423/516/451 436/529/464 437/530/465 424/517/452
+f 424/517/452 437/530/465 438/531/466 425/518/453
+f 425/518/453 438/531/466 439/532/467 426/519/454
+f 426/519/454 439/532/467 440/533/468 427/520/455
+f 427/520/455 440/533/468 441/534/469 428/521/456
+f 428/521/456 441/534/469 442/535/470 429/522/457
+f 429/522/457 442/535/470 443/536/471 430/523/458
+f 430/523/458 443/536/471 444/537/472 431/524/459
+f 431/524/459 444/537/472 445/538/473 432/525/460
+f 432/525/460 445/538/473 446/539/474 433/526/461
+f 433/526/461 446/539/474 447/540/475 434/527/462
+f 434/527/462 447/540/475 297/390/325 282/375/310
+f 283/377/312 298/392/327 448/541/476 435/528/463
+f 435/528/463 448/541/476 449/542/477 436/529/464
+f 436/529/464 449/542/477 450/543/478 437/530/465
+f 437/530/465 450/543/478 451/544/479 438/531/466
+f 438/531/466 451/544/479 452/545/480 439/532/467
+f 439/532/467 452/545/480 453/546/481 440/533/468
+f 440/533/468 453/546/481 454/547/482 441/534/469
+f 441/534/469 454/547/482 455/548/483 442/535/470
+f 442/535/470 455/548/483 456/549/484 443/536/471
+f 443/536/471 456/549/484 457/550/485 444/537/472
+f 444/537/472 457/550/485 458/551/486 445/538/473
+f 445/538/473 458/551/486 459/552/487 446/539/474
+f 446/539/474 459/552/487 460/553/488 447/540/475
+f 447/540/475 460/553/488 312/405/340 297/390/325
+f 298/392/327 313/407/342 461/554/489 448/541/476
+f 448/541/476 461/554/489 462/555/490 449/542/477
+f 449/542/477 462/555/490 463/556/491 450/543/478
+f 450/543/478 463/556/491 464/557/492 451/544/479
+f 451/544/479 464/557/492 465/558/493 452/545/480
+f 452/545/480 465/558/493 466/559/494 453/546/481
+f 453/546/481 466/559/494 467/560/495 454/547/482
+f 454/547/482 467/560/495 468/561/496 455/548/483
+f 455/548/483 468/561/496 469/562/497 456/549/484
+f 456/549/484 469/562/497 470/563/498 457/550/485
+f 457/550/485 470/563/498 471/564/499 458/551/486
+f 458/551/486 471/564/499 472/565/500 459/552/487
+f 459/552/487 472/565/500 473/566/501 460/553/488
+f 460/553/488 473/566/501 327/420/355 312/405/340
+f 313/407/342 328/422/357 474/567/502 461/554/489
+f 461/554/489 474/567/502 475/568/503 462/555/490
+f 462/555/490 475/568/503 476/569/504 463/556/491
+f 463/556/491 476/569/504 477/570/505 464/557/492
+f 464/557/492 477/570/505 478/571/506 465/558/493
+f 465/558/493 478/571/506 29/39/32 466/559/494
+f 466/559/494 29/39/32 30/44/37 467/560/495
+f 467/560/495 30/44/37 26/34/27 468/561/496
+f 468/561/496 26/34/27 479/572/507 469/562/497
+f 469/562/497 479/572/507 480/573/508 470/563/498
+f 470/563/498 480/573/508 481/574/509 471/564/499
+f 471/564/499 481/574/509 482/575/510 472/565/500
+f 472/565/500 482/575/510 483/576/511 473/566/501
+f 473/566/501 483/576/511 339/432/367 327/420/355
+f 328/422/357 340/434/369 484/577/512 474/567/502
+f 474/567/502 484/577/512 485/578/513 475/568/503
+f 475/568/503 485/578/513 486/579/514 476/569/504
+f 476/569/504 486/579/514 487/580/515 477/570/505
+f 477/570/505 487/580/515 488/581/516 478/571/506
+f 478/571/506 488/581/516 28/40/33 29/39/32
+f 26/34/27 27/37/30 489/582/517 479/572/507
+f 479/572/507 489/582/517 490/583/518 480/573/508
+f 480/573/508 490/583/518 491/584/519 481/574/509
+f 481/574/509 491/584/519 492/585/520 482/575/510
+f 482/575/510 492/585/520 493/586/521 483/576/511
+f 483/576/511 493/586/521 351/444/379 339/432/367
+f 340/434/369 352/446/381 494/587/522 484/577/512
+f 484/577/512 494/587/522 495/588/523 485/578/513
+f 485/578/513 495/588/523 496/589/524 486/579/514
+f 486/579/514 496/589/524 497/590/525 487/580/515
+f 487/580/515 497/590/525 498/591/526 488/581/516
+f 488/581/516 498/591/526 499/592/527 28/40/33
+f 28/40/33 499/592/527 500/593/528 31/46/39
+f 31/46/39 500/593/528 501/594/529 27/37/30
+f 27/37/30 501/594/529 502/595/530 489/582/517
+f 489/582/517 502/595/530 503/596/531 490/583/518
+f 490/583/518 503/596/531 504/597/532 491/584/519
+f 491/584/519 504/597/532 505/598/533 492/585/520
+f 492/585/520 505/598/533 506/599/534 493/586/521
+f 493/586/521 506/599/534 366/459/394 351/444/379
+f 352/446/381 367/461/396 507/600/535 494/587/522
+f 494/587/522 507/600/535 508/601/536 495/588/523
+f 495/588/523 508/601/536 509/602/537 496/589/524
+f 496/589/524 509/602/537 510/603/538 497/590/525
+f 497/590/525 510/603/538 511/604/539 498/591/526
+f 498/591/526 511/604/539 512/605/540 499/592/527
+f 499/592/527 512/605/540 513/606/541 500/593/528
+f 500/593/528 513/606/541 514/607/542 501/594/529
+f 501/594/529 514/607/542 515/608/543 502/595/530
+f 502/595/530 515/608/543 516/609/544 503/596/531
+f 503/596/531 516/609/544 517/610/545 504/597/532
+f 504/597/532 517/610/545 518/611/546 505/598/533
+f 505/598/533 518/611/546 519/612/547 506/599/534
+f 506/599/534 519/612/547 381/474/409 366/459/394
+f 367/461/396 382/475/410 507/600/535
+f 507/600/535 382/475/410 508/601/536
+f 508/601/536 382/475/410 509/602/537
+f 509/602/537 382/475/410 510/603/538
+f 510/603/538 382/475/410 511/604/539
+f 511/604/539 382/475/410 512/605/540
+f 512/605/540 382/475/410 513/606/541
+f 513/606/541 382/475/410 514/607/542
+f 514/607/542 382/475/410 515/608/543
+f 515/608/543 382/475/410 516/609/544
+f 516/609/544 382/475/410 517/610/545
+f 517/610/545 382/475/410 518/611/546
+f 518/611/546 382/475/410 519/612/547
+f 519/612/547 382/475/410 381/474/409
+f 522/613/548 521/614/549 520/615/550 523/616/551
+f 521/614/549 522/613/548 224/317/252 223/316/251
+f 522/613/548 524/617/552 225/320/255 224/317/252
+f 524/617/552 526/618/553 226/322/257 225/320/255
+f 526/618/553 528/619/554 227/324/259 226/322/257
+f 528/619/554 530/620/555 228/326/261 227/324/259
+f 530/620/555 532/621/556 229/328/263 228/326/261
+f 532/621/556 534/622/557 230/330/265 229/328/263
+f 534/622/557 536/623/558 231/332/267 230/330/265
+f 536/623/558 538/624/559 232/334/269 231/332/267
+f 538/624/559 540/625/560 233/336/271 232/334/269
+f 540/625/560 542/626/561 234/338/273 233/336/271
+f 542/626/561 544/627/562 235/340/275 234/338/273
+f 544/627/562 546/628/563 236/342/277 235/340/275
+f 546/628/563 548/629/564 237/344/279 236/342/277
+f 523/630/551 520/631/550 576/632/565
+f 525/633/566 523/630/551 576/632/565
+f 527/634/567 525/633/566 576/632/565
+f 529/635/568 527/634/567 576/632/565
+f 531/636/569 529/635/568 576/632/565
+f 533/637/570 531/636/569 576/632/565
+f 535/638/571 533/637/570 576/632/565
+f 537/639/572 535/638/571 576/632/565
+f 539/640/573 537/639/572 576/632/565
+f 541/641/574 539/640/573 576/632/565
+f 543/642/575 541/641/574 576/632/565
+f 545/643/576 543/642/575 576/632/565
+f 547/644/577 545/643/576 576/632/565
+f 549/645/578 547/644/577 576/632/565
+f 521/614/549 223/316/251 383/477/412 550/646/579
+f 550/646/579 383/477/412 384/479/414 552/647/580
+f 552/647/580 384/479/414 385/481/416 554/648/581
+f 554/648/581 385/481/416 386/483/418 556/649/582
+f 556/649/582 386/483/418 387/485/420 558/650/583
+f 558/650/583 387/485/420 388/487/422 560/651/584
+f 560/651/584 388/487/422 389/489/424 562/652/585
+f 562/652/585 389/489/424 390/491/426 564/653/586
+f 564/653/586 390/491/426 391/493/428 566/654/587
+f 566/654/587 391/493/428 392/495/430 568/655/588
+f 568/655/588 392/495/430 393/497/432 570/656/589
+f 570/656/589 393/497/432 394/499/434 572/657/590
+f 572/657/590 394/499/434 395/501/436 574/658/591
+f 574/658/591 395/501/436 237/344/279 548/629/564
+f 524/617/552 522/613/548 523/616/551 525/659/566
+f 526/618/553 524/617/552 525/659/566 527/660/567
+f 528/619/554 526/618/553 527/660/567 529/661/568
+f 530/620/555 528/619/554 529/661/568 531/662/569
+f 532/621/556 530/620/555 531/662/569 533/663/570
+f 534/622/557 532/621/556 533/663/570 535/664/571
+f 536/623/558 534/622/557 535/664/571 537/665/572
+f 538/624/559 536/623/558 537/665/572 539/666/573
+f 540/625/560 538/624/559 539/666/573 541/667/574
+f 542/626/561 540/625/560 541/667/574 543/668/575
+f 544/627/562 542/626/561 543/668/575 545/669/576
+f 546/628/563 544/627/562 545/669/576 547/670/577
+f 548/629/564 546/628/563 547/670/577 549/671/578
+f 574/658/591 548/629/564 549/671/578 575/672/592
+f 520/615/550 521/614/549 550/646/579 551/673/593
+f 550/646/579 552/647/580 553/674/594 551/673/593
+f 552/647/580 554/648/581 555/675/595 553/674/594
+f 554/648/581 556/649/582 557/676/596 555/675/595
+f 556/649/582 558/650/583 559/677/597 557/676/596
+f 558/650/583 560/651/584 561/678/598 559/677/597
+f 560/651/584 562/652/585 563/679/599 561/678/598
+f 562/652/585 564/653/586 565/680/600 563/679/599
+f 564/653/586 566/654/587 567/681/601 565/680/600
+f 566/654/587 568/655/588 569/682/602 567/681/601
+f 568/655/588 570/656/589 571/683/603 569/682/602
+f 570/656/589 572/657/590 573/684/604 571/683/603
+f 572/657/590 574/658/591 575/672/592 573/684/604
+f 551/685/593 576/632/565 520/631/550
+f 553/686/594 576/632/565 551/685/593
+f 555/687/595 576/632/565 553/686/594
+f 557/688/596 576/632/565 555/687/595
+f 559/689/597 576/632/565 557/688/596
+f 561/690/598 576/632/565 559/689/597
+f 563/691/599 576/632/565 561/690/598
+f 565/692/600 576/632/565 563/691/599
+f 567/693/601 576/632/565 565/692/600
+f 569/694/602 576/632/565 567/693/601
+f 571/695/603 576/632/565 569/694/602
+f 573/696/604 576/632/565 571/695/603
+f 575/697/592 576/632/565 573/696/604
+f 549/645/578 576/632/565 575/697/592
+s 6
+f 578/103/96 577/102/95 111/130/123 112/132/125
+f 579/104/97 578/103/96 112/132/125 113/134/127
+f 580/105/98 579/104/97 113/134/127 99/107/100
+f 581/91/84 580/105/98 99/107/100 100/106/99
+f 582/92/85 581/91/84 100/106/99 101/110/103
+f 583/93/86 582/92/85 101/110/103 102/112/105
+f 584/94/87 583/93/86 102/112/105 103/114/107
+f 585/164/157 584/94/87 103/114/107 156/182/175
+f 586/162/155 585/164/157 156/182/175 155/180/173
+f 587/163/156 586/162/155 155/180/173 154/178/171
+f 588/174/167 587/163/156 154/178/171 153/177/170
+f 589/173/166 588/174/167 153/177/170 165/200/193
+f 590/172/165 589/173/166 165/200/193 164/198/191
+f 591/171/164 590/172/165 164/198/191 163/196/189
+f 592/170/163 591/171/164 163/196/189 162/194/187
+f 593/169/162 592/170/163 162/194/187 161/192/185
+f 594/168/161 593/169/162 161/192/185 160/190/183
+f 595/167/160 594/168/161 160/190/183 159/188/181
+f 596/166/159 595/167/160 159/188/181 158/186/179
+f 597/165/158 596/166/159 158/186/179 157/184/177
+f 598/95/88 597/165/158 157/184/177 104/117/110
+f 599/96/89 598/95/88 104/117/110 105/116/109
+f 600/97/90 599/96/89 105/116/109 106/120/113
+f 601/98/91 600/97/90 106/120/113 107/122/115
+f 602/99/92 601/98/91 107/122/115 108/124/117
+f 603/100/93 602/99/92 108/124/117 109/126/119
+f 604/101/94 603/100/93 109/126/119 110/128/121
+f 577/102/95 604/101/94 110/128/121 111/130/123
+f 606/133/126 605/131/124 76/698/605 77/699/606
+f 607/135/128 606/133/126 77/699/606 78/700/607
+f 79/701/608 608/108/101 607/135/128 78/700/607
+f 609/109/102 608/108/101 79/701/608 80/702/609
+f 610/111/104 609/109/102 80/702/609 81/703/610
+f 611/113/106 610/111/104 81/703/610 82/704/611
+f 612/115/108 611/113/106 82/704/611 83/705/612
+f 613/181/174 612/115/108 83/705/612 139/706/613
+f 139/706/613 138/707/614 614/179/172 613/181/174
+f 138/707/614 137/708/615 615/175/168 614/179/172
+f 137/708/615 136/709/616 616/176/169 615/175/168
+f 617/199/192 616/176/169 136/709/616 135/710/617
+f 135/710/617 134/711/618 618/197/190 617/199/192
+f 134/711/618 133/712/619 619/195/188 618/197/190
+f 133/712/619 132/713/620 620/193/186 619/195/188
+f 132/713/620 131/714/621 621/191/184 620/193/186
+f 131/714/621 130/715/622 622/189/182 621/191/184
+f 130/715/622 129/716/623 623/187/180 622/189/182
+f 129/716/623 128/717/624 624/185/178 623/187/180
+f 128/717/624 127/718/625 625/183/176 624/185/178
+f 127/718/625 69/719/626 626/118/111 625/183/176
+f 627/119/112 626/118/111 69/719/626 70/720/627
+f 628/121/114 627/119/112 70/720/627 71/721/628
+f 629/123/116 628/121/114 71/721/628 72/722/629
+f 630/125/118 629/123/116 72/722/629 73/723/630
+f 631/127/120 630/125/118 73/723/630 74/724/631
+f 632/129/122 631/127/120 74/724/631 75/725/632
+f 605/131/124 632/129/122 75/725/632 76/698/605
+f 633/726/633 634/727/634 77/699/606 76/698/605
+f 634/727/634 635/728/635 78/700/607 77/699/606
+f 80/702/609 636/729/636 81/703/610
+f 636/729/636 637/730/637 82/704/611 81/703/610
+f 637/730/637 638/731/638 83/705/612 82/704/611
+f 638/731/638 639/732/639 645/733/640 83/705/612
+f 640/734/641 641/735/642 70/720/627 69/719/626
+f 641/735/642 642/736/643 71/721/628 70/720/627
+f 73/723/630 643/737/644 74/724/631
+f 643/737/644 644/738/645 75/725/632 74/724/631
+f 644/738/645 633/726/633 76/698/605 75/725/632
+f 639/732/639 640/734/641 69/719/626 645/733/640
+f 635/728/635 79/701/608 78/700/607
+f 635/728/635 636/729/636 80/702/609 79/701/608
+f 642/736/643 72/722/629 71/721/628
+f 642/736/643 643/737/644 73/723/630 72/722/629
+f 646/739/646 133/712/619 134/711/618 647/740/647
+f 647/740/647 134/711/618 135/710/617 648/741/648
+f 137/708/615 138/707/614 649/742/649
+f 649/742/649 138/707/614 139/706/613 650/743/650
+f 650/743/650 139/706/613 83/705/612 651/744/651
+f 651/744/651 83/705/612 645/733/640 652/745/652
+f 653/746/653 69/719/626 127/718/625 654/747/654
+f 654/747/654 127/718/625 128/717/624 655/748/655
+f 130/715/622 131/714/621 656/749/656
+f 656/749/656 131/714/621 132/713/620 657/750/657
+f 657/750/657 132/713/620 133/712/619 646/739/646
+f 652/745/652 645/733/640 69/719/626 653/746/653
+f 648/741/648 135/710/617 136/709/616
+f 648/741/648 136/709/616 137/708/615 649/742/649
+f 655/748/655 128/717/624 129/716/623
+f 655/748/655 129/716/623 130/715/622 656/749/656
+s 1
+f 2/2/2 698/751/658 697/752/659 3/3/5
+f 1/1/1 699/753/660 698/751/658 2/2/2
+f 8/8/15 700/754/661 699/753/660 1/1/1
+f 7/7/13 701/755/662 700/754/661 8/8/15
+f 694/756/663 701/755/662 7/7/13 6/6/11
+f 5/5/9 695/757/664 694/756/663 6/6/11
+f 4/758/7 696/759/665 695/757/664 5/5/9
+f 3/3/5 697/752/659 696/760/665 4/4/7
+s 6
+f 648/761/648 702/762/666 713/763/667 647/764/647
+f 649/765/649 703/766/668 702/762/666 648/761/648
+f 650/767/650 704/768/669 703/766/668 649/765/649
+f 651/769/651 705/770/670 704/768/669 650/767/650
+f 652/771/652 706/772/671 705/770/670 651/769/651
+f 713/763/667 712/773/672 646/774/646 647/764/647
+f 653/775/653 707/776/673 706/777/671 652/778/652
+f 654/779/654 708/780/674 707/776/673 653/775/653
+f 655/781/655 709/782/675 708/780/674 654/779/654
+f 656/783/656 710/784/676 709/782/675 655/781/655
+f 657/785/657 711/786/677 710/784/676 656/783/656
+f 646/774/646 712/773/672 711/786/677 657/785/657
+s 10
+f 671/787/678 683/788/679 682/789/680 670/790/681
+f 672/791/682 684/792/683 683/788/679 671/787/678
+f 673/793/684 685/794/685 684/792/683 672/791/682
+f 674/795/686 686/796/687 685/794/685 673/793/684
+f 675/797/688 687/798/689 686/796/687 674/795/686
+f 676/799/690 688/800/691 687/798/689 675/797/688
+f 677/801/692 689/802/693 688/800/691 676/799/690
+f 678/803/694 690/804/695 689/802/693 677/801/692
+f 679/805/696 691/806/697 690/804/695 678/803/694
+f 680/807/698 692/808/699 691/806/697 679/805/696
+f 681/809/700 693/810/701 692/808/699 680/807/698
+f 670/790/681 682/789/680 693/811/701 681/812/700
+s 1
+f 695/757/664 34/813/29 32/814/26 694/756/663
+f 696/759/665 39/815/38 34/813/29 695/757/664
+f 697/752/659 36/816/34 39/817/38 696/760/665
+f 698/751/658 35/818/31 36/816/34 697/752/659
+f 699/753/660 37/819/35 35/818/31 698/751/658
+f 700/754/661 38/820/36 37/819/35 699/753/660
+f 701/755/662 33/821/28 38/820/36 700/754/661
+f 32/814/26 33/821/28 701/755/662 694/756/663
+s 6
+f 661/822/702 660/823/703 702/762/666 703/766/668
+f 662/824/704 661/822/702 703/766/668 704/768/669
+f 663/825/705 662/824/704 704/768/669 705/770/670
+f 664/826/706 663/825/705 705/770/670 706/772/671
+f 665/827/707 664/828/706 706/777/671 707/776/673
+f 666/829/708 665/827/707 707/776/673 708/780/674
+f 667/830/709 666/829/708 708/780/674 709/782/675
+f 668/831/710 667/830/709 709/782/675 710/784/676
+f 669/832/711 668/831/710 710/784/676 711/786/677
+f 658/833/712 669/832/711 711/786/677 712/773/672
+f 659/834/713 658/833/712 712/773/672 713/763/667
+f 660/823/703 659/834/713 713/763/667 702/762/666
+s 1
+f 715/835/714 714/836/715 737/837/716 738/838/717
+f 716/839/718 715/835/714 738/838/717 739/840/719
+f 717/841/720 716/839/718 739/840/719 740/842/721
+f 718/843/722 717/841/720 740/842/721 741/844/723
+f 734/845/724 719/846/725 718/843/722 741/844/723
+f 720/847/726 719/846/725 734/845/724 735/848/727
+f 721/849/728 720/847/726 735/848/727 736/850/729
+f 714/836/715 721/851/728 736/852/729 737/837/716
+s 6
+f 635/853/635 634/854/634 753/855/730 742/856/731
+f 636/857/636 635/853/635 742/856/731 743/858/732
+f 637/859/637 636/857/636 743/858/732 744/860/733
+f 638/861/638 637/859/637 744/860/733 745/862/734
+f 639/863/639 638/861/638 745/862/734 746/864/735
+f 753/855/730 634/854/634 633/865/633 752/866/736
+f 640/867/641 639/868/639 746/869/735 747/870/737
+f 641/871/642 640/867/641 747/870/737 748/872/738
+f 642/873/643 641/871/642 748/872/738 749/874/739
+f 643/875/644 642/873/643 749/874/739 750/876/740
+f 644/877/645 643/875/644 750/876/740 751/878/741
+f 633/865/633 644/877/645 751/878/741 752/866/736
+s 1
+f 735/848/727 734/845/724 46/879/40 48/880/43
+f 736/850/729 735/848/727 48/880/43 53/881/52
+f 737/837/716 736/852/729 53/882/52 50/883/46
+f 738/838/717 737/837/716 50/883/46 49/884/45
+f 739/840/719 738/838/717 49/884/45 51/885/49
+f 740/842/721 739/840/719 51/885/49 52/886/50
+f 741/844/723 740/842/721 52/886/50 47/887/41
+f 46/879/40 734/845/724 741/844/723 47/887/41
+s 6
+f 725/888/742 743/858/732 742/856/731 724/889/743
+f 726/890/744 744/860/733 743/858/732 725/888/742
+f 727/891/745 745/862/734 744/860/733 726/890/744
+f 728/892/746 746/864/735 745/862/734 727/891/745
+f 729/893/747 747/870/737 746/869/735 728/894/746
+f 730/895/748 748/872/738 747/870/737 729/893/747
+f 731/896/749 749/874/739 748/872/738 730/895/748
+f 732/897/750 750/876/740 749/874/739 731/896/749
+f 733/898/751 751/878/741 750/876/740 732/897/750
+f 722/899/752 752/866/736 751/878/741 733/898/751
+f 723/900/753 753/855/730 752/866/736 722/899/752
+f 724/889/743 742/856/731 753/855/730 723/900/753
+s 1
+f 716/839/718 754/902/754 755/901/755 715/835/714
+f 715/835/714 755/901/755 756/903/756 714/836/715
+f 714/836/715 756/903/756 757/904/757 721/851/728
+f 721/849/728 757/925/757 758/905/758 720/847/726
+f 720/847/726 758/905/758 759/906/759 719/846/725
+f 719/846/725 759/906/759 760/907/760 718/843/722
+f 718/843/722 760/907/760 761/908/761 717/841/720
+f 717/841/720 761/908/761 754/902/754 716/839/718
+f 754/902/754 762/910/762 763/909/763 755/901/755
+f 755/901/755 763/909/763 764/911/764 756/903/756
+f 756/903/756 764/911/764 765/912/765 757/904/757
+f 757/925/757 765/926/765 766/913/766 758/905/758
+f 758/905/758 766/913/766 767/914/767 759/906/759
+f 759/906/759 767/914/767 768/915/768 760/907/760
+f 760/907/760 768/915/768 769/916/769 761/908/761
+f 761/908/761 769/916/769 762/910/762 754/902/754
+f 762/910/762 770/917/770 763/909/763
+f 763/909/763 770/918/770 764/911/764
+f 764/911/764 770/919/770 765/912/765
+f 765/926/765 770/920/770 766/913/766
+f 766/913/766 770/921/770 767/914/767
+f 767/914/767 770/922/770 768/915/768
+f 768/915/768 770/923/770 769/916/769
+f 769/916/769 770/924/770 762/910/762
+s 12
+f 772/929/771 771/930/772 783/931/773 784/932/774
+f 773/933/775 772/929/771 784/932/774 785/934/776
+f 774/935/777 773/933/775 785/934/776 786/936/778
+f 775/937/779 774/935/777 786/936/778 787/938/780
+f 776/939/781 775/937/779 787/938/780 788/940/782
+f 777/941/783 776/939/781 788/940/782 789/942/784
+f 778/943/785 777/941/783 789/942/784 790/944/786
+f 779/945/787 778/943/785 790/944/786 791/946/788
+f 780/947/789 779/945/787 791/946/788 792/948/790
+f 781/949/791 780/947/789 792/948/790 793/950/792
+f 782/951/793 781/949/791 793/950/792 794/952/794
+f 771/930/772 782/953/793 794/954/794 783/931/773
+s 6
+f 795/955/795 807/956/796 808/957/797 796/958/798
+f 796/958/798 808/957/797 809/959/799 797/960/800
+f 797/960/800 809/959/799 810/961/801 798/962/802
+f 798/962/802 810/961/801 811/963/803 799/964/804
+f 799/964/804 811/963/803 812/965/805 800/966/806
+f 800/967/806 812/968/805 813/969/807 801/970/808
+f 801/970/808 813/969/807 814/971/809 802/972/810
+f 802/972/810 814/971/809 815/973/811 803/974/812
+f 803/974/812 815/973/811 816/975/813 804/976/814
+f 804/976/814 816/975/813 817/977/815 805/978/816
+f 805/978/816 817/977/815 818/979/817 806/980/818
+f 806/980/818 818/979/817 807/956/796 795/955/795
+f 807/956/796 819/981/819 820/982/820 808/957/797
+f 808/957/797 820/982/820 821/983/821 809/959/799
+f 809/959/799 821/983/821 822/984/822 810/961/801
+f 810/961/801 822/984/822 823/985/823 811/963/803
+f 811/963/803 823/985/823 824/986/824 812/965/805
+f 812/968/805 824/987/824 825/988/825 813/969/807
+f 813/969/807 825/988/825 826/989/826 814/971/809
+f 814/971/809 826/989/826 827/990/827 815/973/811
+f 815/973/811 827/990/827 828/991/828 816/975/813
+f 816/975/813 828/991/828 829/992/829 817/977/815
+f 817/977/815 829/992/829 830/993/830 818/979/817
+f 818/979/817 830/993/830 819/981/819 807/956/796
+f 819/981/819 831/994/831 832/995/832 820/982/820
+f 820/982/820 832/995/832 833/996/833 821/983/821
+f 821/983/821 833/996/833 834/997/834 822/984/822
+f 822/984/822 834/997/834 835/998/835 823/985/823
+f 823/985/823 835/998/835 836/999/836 824/986/824
+f 824/987/824 836/1000/836 837/1001/837 825/988/825
+f 825/988/825 837/1001/837 838/1002/838 826/989/826
+f 826/989/826 838/1002/838 839/1003/839 827/990/827
+f 827/990/827 839/1003/839 840/1004/840 828/991/828
+f 828/991/828 840/1004/840 841/1005/841 829/992/829
+f 829/992/829 841/1005/841 842/1006/842 830/993/830
+f 830/993/830 842/1006/842 831/994/831 819/981/819
+f 831/994/831 843/1007/843 844/1008/844 832/995/832
+f 832/995/832 844/1008/844 845/1009/845 833/996/833
+f 833/996/833 845/1009/845 846/1010/846 834/997/834
+f 834/997/834 846/1010/846 847/1011/847 835/998/835
+f 835/998/835 847/1011/847 848/1012/848 836/999/836
+f 836/1000/836 848/1013/848 849/1014/849 837/1001/837
+f 837/1001/837 849/1014/849 850/1015/850 838/1002/838
+f 838/1002/838 850/1015/850 851/1016/851 839/1003/839
+f 839/1003/839 851/1016/851 852/1017/852 840/1004/840
+f 840/1004/840 852/1017/852 853/1018/853 841/1005/841
+f 841/1005/841 853/1018/853 854/1019/854 842/1006/842
+f 842/1006/842 854/1019/854 843/1007/843 831/994/831
+f 843/1007/843 733/898/751 732/897/750 844/1008/844
+f 844/1008/844 732/897/750 731/896/749 845/1009/845
+f 845/1009/845 731/896/749 730/895/748 846/1010/846
+f 846/1010/846 730/895/748 729/893/747 847/1011/847
+f 847/1011/847 729/893/747 728/894/746 848/1012/848
+f 848/1013/848 728/892/746 727/891/745 849/1014/849
+f 849/1014/849 727/891/745 726/890/744 850/1015/850
+f 850/1015/850 726/890/744 725/888/742 851/1016/851
+f 851/1016/851 725/888/742 724/889/743 852/1017/852
+f 852/1017/852 724/889/743 723/900/753 853/1018/853
+f 853/1018/853 723/900/753 722/899/752 854/1019/854
+f 854/1019/854 722/899/752 733/898/751 843/1007/843
+f 796/958/798 855/1020/855 795/955/795
+f 797/960/800 855/1021/855 796/958/798
+f 798/962/802 855/1022/855 797/960/800
+f 799/964/804 855/1023/855 798/962/802
+f 800/966/806 855/1024/855 799/964/804
+f 801/970/808 855/1025/855 800/967/806
+f 802/972/810 855/1026/855 801/970/808
+f 803/974/812 855/1027/855 802/972/810
+f 804/976/814 855/1028/855 803/974/812
+f 805/978/816 855/1029/855 804/976/814
+f 806/980/818 855/1030/855 805/978/816
+f 795/955/795 855/1031/855 806/980/818
+s 12
+f 856/1032/856 868/1033/857 869/1034/858 857/1035/859
+f 857/1035/859 869/1034/858 870/1036/860 858/1037/861
+f 858/1037/861 870/1036/860 871/1038/862 859/1039/863
+f 859/1039/863 871/1038/862 872/1040/864 860/1041/865
+f 860/1041/865 872/1040/864 873/1042/866 861/1043/867
+f 861/1044/867 873/1045/866 874/1046/868 862/1047/869
+f 862/1047/869 874/1046/868 875/1048/870 863/1049/871
+f 863/1049/871 875/1048/870 876/1050/872 864/1051/873
+f 864/1051/873 876/1050/872 877/1052/874 865/1053/875
+f 865/1053/875 877/1052/874 878/1054/876 866/1055/877
+f 866/1055/877 878/1054/876 879/1056/878 867/1057/879
+f 867/1057/879 879/1056/878 868/1033/857 856/1032/856
+f 868/1033/857 880/1058/880 881/1059/881 869/1034/858
+f 869/1034/858 881/1059/881 882/1060/882 870/1036/860
+f 870/1036/860 882/1060/882 883/1061/883 871/1038/862
+f 871/1038/862 883/1061/883 884/1062/884 872/1040/864
+f 872/1040/864 884/1062/884 885/1063/885 873/1042/866
+f 873/1045/866 885/1064/885 886/1065/886 874/1046/868
+f 874/1046/868 886/1065/886 887/1066/887 875/1048/870
+f 875/1048/870 887/1066/887 888/1067/888 876/1050/872
+f 876/1050/872 888/1067/888 889/1068/889 877/1052/874
+f 877/1052/874 889/1068/889 890/1069/890 878/1054/876
+f 878/1054/876 890/1069/890 891/1070/891 879/1056/878
+f 879/1056/878 891/1070/891 880/1058/880 868/1033/857
+f 880/1058/880 892/1071/892 893/1072/893 881/1059/881
+f 881/1059/881 893/1072/893 894/1073/894 882/1060/882
+f 882/1060/882 894/1073/894 895/1074/895 883/1061/883
+f 883/1061/883 895/1074/895 896/1075/896 884/1062/884
+f 884/1062/884 896/1075/896 897/1076/897 885/1063/885
+f 885/1064/885 897/1077/897 898/1078/898 886/1065/886
+f 886/1065/886 898/1078/898 899/1079/899 887/1066/887
+f 887/1066/887 899/1079/899 900/1080/900 888/1067/888
+f 888/1067/888 900/1080/900 901/1081/901 889/1068/889
+f 889/1068/889 901/1081/901 902/1082/902 890/1069/890
+f 890/1069/890 902/1082/902 903/1083/903 891/1070/891
+f 891/1070/891 903/1083/903 892/1071/892 880/1058/880
+f 892/1071/892 904/1084/904 905/1085/905 893/1072/893
+f 893/1072/893 905/1085/905 906/1086/906 894/1073/894
+f 894/1073/894 906/1086/906 907/1087/907 895/1074/895
+f 895/1074/895 907/1087/907 908/1088/908 896/1075/896
+f 896/1075/896 908/1088/908 909/1089/909 897/1076/897
+f 897/1077/897 909/1090/909 910/1091/910 898/1078/898
+f 898/1078/898 910/1091/910 911/1092/911 899/1079/899
+f 899/1079/899 911/1092/911 912/1093/912 900/1080/900
+f 900/1080/900 912/1093/912 913/1094/913 901/1081/901
+f 901/1081/901 913/1094/913 914/1095/914 902/1082/902
+f 902/1082/902 914/1095/914 915/1096/915 903/1083/903
+f 903/1083/903 915/1096/915 904/1084/904 892/1071/892
+f 904/1084/904 787/938/780 786/936/778 905/1085/905
+f 905/1085/905 786/936/778 785/934/776 906/1086/906
+f 906/1086/906 785/934/776 784/932/774 907/1087/907
+f 907/1087/907 784/932/774 783/931/773 908/1088/908
+f 908/1088/908 783/931/773 794/954/794 909/1089/909
+f 909/1090/909 794/952/794 793/950/792 910/1091/910
+f 910/1091/910 793/950/792 792/948/790 911/1092/911
+f 911/1092/911 792/948/790 791/946/788 912/1093/912
+f 912/1093/912 791/946/788 790/944/786 913/1094/913
+f 913/1094/913 790/944/786 789/942/784 914/1095/914
+f 914/1095/914 789/942/784 788/940/782 915/1096/915
+f 915/1096/915 788/940/782 787/938/780 904/1084/904
+f 857/1035/859 916/1097/916 856/1032/856
+f 858/1037/861 916/1098/916 857/1035/859
+f 859/1039/863 916/1099/916 858/1037/861
+f 860/1041/865 916/1100/916 859/1039/863
+f 861/1043/867 916/1101/916 860/1041/865
+f 862/1047/869 916/1102/916 861/1044/867
+f 863/1049/871 916/1103/916 862/1047/869
+f 864/1051/873 916/1104/916 863/1049/871
+f 865/1053/875 916/1105/916 864/1051/873
+f 866/1055/877 916/1106/916 865/1053/875
+f 867/1057/879 916/1107/916 866/1055/877
+f 856/1032/856 916/1108/916 867/1057/879
+f 917/1109/917 918/1110/918 930/1111/919 929/1112/920
+f 918/1110/918 919/1113/921 931/1114/922 930/1111/919
+f 919/1113/921 920/1115/923 932/1116/924 931/1114/922
+f 920/1115/923 921/1117/925 933/1118/926 932/1116/924
+f 921/1117/925 922/1119/927 934/1120/928 933/1118/926
+f 922/1121/927 923/1122/929 935/1123/930 934/1124/928
+f 923/1122/929 924/1125/931 936/1126/932 935/1123/930
+f 924/1125/931 925/1127/933 937/1128/934 936/1126/932
+f 925/1127/933 926/1129/935 938/1130/936 937/1128/934
+f 926/1129/935 927/1131/937 939/1132/938 938/1130/936
+f 927/1131/937 928/1133/939 940/1134/940 939/1132/938
+f 928/1133/939 917/1109/917 929/1112/920 940/1134/940
+f 929/1112/920 930/1111/919 942/1135/941 941/1136/942
+f 930/1111/919 931/1114/922 943/1137/943 942/1135/941
+f 931/1114/922 932/1116/924 944/1138/944 943/1137/943
+f 932/1116/924 933/1118/926 945/1139/945 944/1138/944
+f 933/1118/926 934/1120/928 946/1140/946 945/1139/945
+f 934/1124/928 935/1123/930 947/1141/947 946/1142/946
+f 935/1123/930 936/1126/932 948/1143/948 947/1141/947
+f 936/1126/932 937/1128/934 949/1144/949 948/1143/948
+f 937/1128/934 938/1130/936 950/1145/950 949/1144/949
+f 938/1130/936 939/1132/938 951/1146/951 950/1145/950
+f 939/1132/938 940/1134/940 952/1147/952 951/1146/951
+f 940/1134/940 929/1112/920 941/1136/942 952/1147/952
+f 941/1136/942 942/1135/941 954/1148/953 953/1149/954
+f 942/1135/941 943/1137/943 955/1150/955 954/1148/953
+f 943/1137/943 944/1138/944 956/1151/956 955/1150/955
+f 944/1138/944 945/1139/945 957/1152/957 956/1151/956
+f 945/1139/945 946/1140/946 958/1153/958 957/1152/957
+f 946/1142/946 947/1141/947 959/1154/959 958/1155/958
+f 947/1141/947 948/1143/948 960/1156/960 959/1154/959
+f 948/1143/948 949/1144/949 961/1157/961 960/1156/960
+f 949/1144/949 950/1145/950 962/1158/962 961/1157/961
+f 950/1145/950 951/1146/951 963/1159/963 962/1158/962
+f 951/1146/951 952/1147/952 964/1160/964 963/1159/963
+f 952/1147/952 941/1136/942 953/1149/954 964/1160/964
+f 953/1149/954 954/1148/953 966/1161/965 965/1162/966
+f 954/1148/953 955/1150/955 967/1163/967 966/1161/965
+f 955/1150/955 956/1151/956 968/1164/968 967/1163/967
+f 956/1151/956 957/1152/957 969/1165/969 968/1164/968
+f 957/1152/957 958/1153/958 970/1166/970 969/1165/969
+f 958/1155/958 959/1154/959 971/1167/971 970/1168/970
+f 959/1154/959 960/1156/960 972/1169/972 971/1167/971
+f 960/1156/960 961/1157/961 973/1170/973 972/1169/972
+f 961/1157/961 962/1158/962 974/1171/974 973/1170/973
+f 962/1158/962 963/1159/963 975/1172/975 974/1171/974
+f 963/1159/963 964/1160/964 976/1173/976 975/1172/975
+f 964/1160/964 953/1149/954 965/1162/966 976/1173/976
+f 965/1162/966 966/1161/965 774/935/777 775/937/779
+f 966/1161/965 967/1163/967 773/933/775 774/935/777
+f 967/1163/967 968/1164/968 772/929/771 773/933/775
+f 968/1164/968 969/1165/969 771/930/772 772/929/771
+f 969/1165/969 970/1166/970 782/953/793 771/930/772
+f 970/1168/970 971/1167/971 781/949/791 782/951/793
+f 971/1167/971 972/1169/972 780/947/789 781/949/791
+f 972/1169/972 973/1170/973 779/945/787 780/947/789
+f 973/1170/973 974/1171/974 778/943/785 779/945/787
+f 974/1171/974 975/1172/975 777/941/783 778/943/785
+f 975/1172/975 976/1173/976 776/939/781 777/941/783
+f 976/1173/976 965/1162/966 775/937/779 776/939/781
+f 918/1110/918 917/1109/917 977/1174/977
+f 919/1113/921 918/1110/918 977/1175/977
+f 920/1115/923 919/1113/921 977/1176/977
+f 921/1117/925 920/1115/923 977/1177/977
+f 922/1119/927 921/1117/925 977/1178/977
+f 923/1122/929 922/1121/927 977/1179/977
+f 924/1125/931 923/1122/929 977/1180/977
+f 925/1127/933 924/1125/931 977/1181/977
+f 926/1129/935 925/1127/933 977/1182/977
+f 927/1131/937 926/1129/935 977/1183/977
+f 928/1133/939 927/1131/937 977/1184/977
+f 917/1109/917 928/1133/939 977/1185/977
+s 6
+f 978/1186/978 979/1187/979 991/1188/980 990/1189/981
+f 979/1187/979 980/1190/982 992/1191/983 991/1188/980
+f 980/1190/982 981/1192/984 993/1193/985 992/1191/983
+f 981/1192/984 982/1194/986 994/1195/987 993/1193/985
+f 982/1194/986 983/1196/988 995/1197/989 994/1195/987
+f 983/1198/988 984/1199/990 996/1200/991 995/1201/989
+f 984/1199/990 985/1202/992 997/1203/993 996/1200/991
+f 985/1202/992 986/1204/994 998/1205/995 997/1203/993
+f 986/1204/994 987/1206/996 999/1207/997 998/1205/995
+f 987/1206/996 988/1208/998 1000/1209/999 999/1207/997
+f 988/1208/998 989/1210/1000 1001/1211/1001 1000/1209/999
+f 989/1210/1000 978/1186/978 990/1189/981 1001/1211/1001
+f 990/1189/981 991/1188/980 1003/1212/1002 1002/1213/1003
+f 991/1188/980 992/1191/983 1004/1214/1004 1003/1212/1002
+f 992/1191/983 993/1193/985 1005/1215/1005 1004/1214/1004
+f 993/1193/985 994/1195/987 1006/1216/1006 1005/1215/1005
+f 994/1195/987 995/1197/989 1007/1217/1007 1006/1216/1006
+f 995/1201/989 996/1200/991 1008/1218/1008 1007/1219/1007
+f 996/1200/991 997/1203/993 1009/1220/1009 1008/1218/1008
+f 997/1203/993 998/1205/995 1010/1221/1010 1009/1220/1009
+f 998/1205/995 999/1207/997 1011/1222/1011 1010/1221/1010
+f 999/1207/997 1000/1209/999 1012/1223/1012 1011/1222/1011
+f 1000/1209/999 1001/1211/1001 1013/1224/1013 1012/1223/1012
+f 1001/1211/1001 990/1189/981 1002/1213/1003 1013/1224/1013
+f 1002/1213/1003 1003/1212/1002 1015/1225/1014 1014/1226/1015
+f 1003/1212/1002 1004/1214/1004 1016/1227/1016 1015/1225/1014
+f 1004/1214/1004 1005/1215/1005 1017/1228/1017 1016/1227/1016
+f 1005/1215/1005 1006/1216/1006 1018/1229/1018 1017/1228/1017
+f 1006/1216/1006 1007/1217/1007 1019/1230/1019 1018/1229/1018
+f 1007/1219/1007 1008/1218/1008 1020/1231/1020 1019/1232/1019
+f 1008/1218/1008 1009/1220/1009 1021/1233/1021 1020/1231/1020
+f 1009/1220/1009 1010/1221/1010 1022/1234/1022 1021/1233/1021
+f 1010/1221/1010 1011/1222/1011 1023/1235/1023 1022/1234/1022
+f 1011/1222/1011 1012/1223/1012 1024/1236/1024 1023/1235/1023
+f 1012/1223/1012 1013/1224/1013 1025/1237/1025 1024/1236/1024
+f 1013/1224/1013 1002/1213/1003 1014/1226/1015 1025/1237/1025
+f 1014/1226/1015 1015/1225/1014 1027/1238/1026 1026/1239/1027
+f 1015/1225/1014 1016/1227/1016 1028/1240/1028 1027/1238/1026
+f 1016/1227/1016 1017/1228/1017 1029/1241/1029 1028/1240/1028
+f 1017/1228/1017 1018/1229/1018 1030/1242/1030 1029/1241/1029
+f 1018/1229/1018 1019/1230/1019 1031/1243/1031 1030/1242/1030
+f 1019/1232/1019 1020/1231/1020 1032/1244/1032 1031/1245/1031
+f 1020/1231/1020 1021/1233/1021 1033/1246/1033 1032/1244/1032
+f 1021/1233/1021 1022/1234/1022 1034/1247/1034 1033/1246/1033
+f 1022/1234/1022 1023/1235/1023 1035/1248/1035 1034/1247/1034
+f 1023/1235/1023 1024/1236/1024 1036/1249/1036 1035/1248/1035
+f 1024/1236/1024 1025/1237/1025 1037/1250/1037 1036/1249/1036
+f 1025/1237/1025 1014/1226/1015 1026/1239/1027 1037/1250/1037
+f 1026/1239/1027 1027/1238/1026 668/831/710 669/832/711
+f 1027/1238/1026 1028/1240/1028 667/830/709 668/831/710
+f 1028/1240/1028 1029/1241/1029 666/829/708 667/830/709
+f 1029/1241/1029 1030/1242/1030 665/827/707 666/829/708
+f 1030/1242/1030 1031/1243/1031 664/828/706 665/827/707
+f 1031/1245/1031 1032/1244/1032 663/825/705 664/826/706
+f 1032/1244/1032 1033/1246/1033 662/824/704 663/825/705
+f 1033/1246/1033 1034/1247/1034 661/822/702 662/824/704
+f 1034/1247/1034 1035/1248/1035 660/823/703 661/822/702
+f 1035/1248/1035 1036/1249/1036 659/834/713 660/823/703
+f 1036/1249/1036 1037/1250/1037 658/833/712 659/834/713
+f 1037/1250/1037 1026/1239/1027 669/832/711 658/833/712
+f 979/1187/979 978/1186/978 1038/1251/1038
+f 980/1190/982 979/1187/979 1038/1252/1038
+f 981/1192/984 980/1190/982 1038/1253/1038
+f 982/1194/986 981/1192/984 1038/1254/1038
+f 983/1196/988 982/1194/986 1038/1255/1038
+f 984/1199/990 983/1198/988 1038/1256/1038
+f 985/1202/992 984/1199/990 1038/1257/1038
+f 986/1204/994 985/1202/992 1038/1258/1038
+f 987/1206/996 986/1204/994 1038/1259/1038
+f 988/1208/998 987/1206/996 1038/1260/1038
+f 989/1210/1000 988/1208/998 1038/1261/1038
+f 978/1186/978 989/1210/1000 1038/1262/1038
+s 10
+f 1039/1263/1039 1040/1264/1040 1052/1265/1041 1051/1266/1042
+f 1040/1264/1040 1041/1267/1043 1053/1268/1044 1052/1265/1041
+f 1041/1267/1043 1042/1269/1045 1054/1270/1046 1053/1268/1044
+f 1042/1269/1045 1043/1271/1047 1055/1272/1048 1054/1270/1046
+f 1043/1271/1047 1044/1273/1049 1056/1274/1050 1055/1272/1048
+f 1044/1275/1049 1045/1276/1051 1057/1277/1052 1056/1278/1050
+f 1045/1276/1051 1046/1279/1053 1058/1280/1054 1057/1277/1052
+f 1046/1279/1053 1047/1281/1055 1059/1282/1056 1058/1280/1054
+f 1047/1281/1055 1048/1283/1057 1060/1284/1058 1059/1282/1056
+f 1048/1283/1057 1049/1285/1059 1061/1286/1060 1060/1284/1058
+f 1049/1285/1059 1050/1287/1061 1062/1288/1062 1061/1286/1060
+f 1050/1287/1061 1039/1263/1039 1051/1266/1042 1062/1288/1062
+f 1051/1266/1042 1052/1265/1041 1064/1289/1063 1063/1290/1064
+f 1052/1265/1041 1053/1268/1044 1065/1291/1065 1064/1289/1063
+f 1053/1268/1044 1054/1270/1046 1066/1292/1066 1065/1291/1065
+f 1054/1270/1046 1055/1272/1048 1067/1293/1067 1066/1292/1066
+f 1055/1272/1048 1056/1274/1050 1068/1294/1068 1067/1293/1067
+f 1056/1278/1050 1057/1277/1052 1069/1295/1069 1068/1296/1068
+f 1057/1277/1052 1058/1280/1054 1070/1297/1070 1069/1295/1069
+f 1058/1280/1054 1059/1282/1056 1071/1298/1071 1070/1297/1070
+f 1059/1282/1056 1060/1284/1058 1072/1299/1072 1071/1298/1071
+f 1060/1284/1058 1061/1286/1060 1073/1300/1073 1072/1299/1072
+f 1061/1286/1060 1062/1288/1062 1074/1301/1074 1073/1300/1073
+f 1062/1288/1062 1051/1266/1042 1063/1290/1064 1074/1301/1074
+f 1063/1290/1064 1064/1289/1063 1076/1302/1075 1075/1303/1076
+f 1064/1289/1063 1065/1291/1065 1077/1304/1077 1076/1302/1075
+f 1065/1291/1065 1066/1292/1066 1078/1305/1078 1077/1304/1077
+f 1066/1292/1066 1067/1293/1067 1079/1306/1079 1078/1305/1078
+f 1067/1293/1067 1068/1294/1068 1080/1307/1080 1079/1306/1079
+f 1068/1296/1068 1069/1295/1069 1081/1308/1081 1080/1309/1080
+f 1069/1295/1069 1070/1297/1070 1082/1310/1082 1081/1308/1081
+f 1070/1297/1070 1071/1298/1071 1083/1311/1083 1082/1310/1082
+f 1071/1298/1071 1072/1299/1072 1084/1312/1084 1083/1311/1083
+f 1072/1299/1072 1073/1300/1073 1085/1313/1085 1084/1312/1084
+f 1073/1300/1073 1074/1301/1074 1086/1314/1086 1085/1313/1085
+f 1074/1301/1074 1063/1290/1064 1075/1303/1076 1086/1314/1086
+f 1075/1303/1076 1076/1302/1075 1088/1315/1087 1087/1316/1088
+f 1076/1302/1075 1077/1304/1077 1089/1317/1089 1088/1315/1087
+f 1077/1304/1077 1078/1305/1078 1090/1318/1090 1089/1317/1089
+f 1078/1305/1078 1079/1306/1079 1091/1319/1091 1090/1318/1090
+f 1079/1306/1079 1080/1307/1080 1092/1320/1092 1091/1319/1091
+f 1080/1309/1080 1081/1308/1081 1093/1321/1093 1092/1322/1092
+f 1081/1308/1081 1082/1310/1082 1094/1323/1094 1093/1321/1093
+f 1082/1310/1082 1083/1311/1083 1095/1324/1095 1094/1323/1094
+f 1083/1311/1083 1084/1312/1084 1096/1325/1096 1095/1324/1095
+f 1084/1312/1084 1085/1313/1085 1097/1326/1097 1096/1325/1096
+f 1085/1313/1085 1086/1314/1086 1098/1327/1098 1097/1326/1097
+f 1086/1314/1086 1075/1303/1076 1087/1316/1088 1098/1327/1098
+f 1087/1316/1088 1088/1315/1087 685/794/685 686/796/687
+f 1088/1315/1087 1089/1317/1089 684/792/683 685/794/685
+f 1089/1317/1089 1090/1318/1090 683/788/679 684/792/683
+f 1090/1318/1090 1091/1319/1091 682/789/680 683/788/679
+f 1091/1319/1091 1092/1320/1092 693/811/701 682/789/680
+f 1092/1322/1092 1093/1321/1093 692/808/699 693/810/701
+f 1093/1321/1093 1094/1323/1094 691/806/697 692/808/699
+f 1094/1323/1094 1095/1324/1095 690/804/695 691/806/697
+f 1095/1324/1095 1096/1325/1096 689/802/693 690/804/695
+f 1096/1325/1096 1097/1326/1097 688/800/691 689/802/693
+f 1097/1326/1097 1098/1327/1098 687/798/689 688/800/691
+f 1098/1327/1098 1087/1316/1088 686/796/687 687/798/689
+f 1040/1264/1040 1039/1263/1039 1099/1328/1099
+f 1041/1267/1043 1040/1264/1040 1099/1329/1099
+f 1042/1269/1045 1041/1267/1043 1099/1330/1099
+f 1043/1271/1047 1042/1269/1045 1099/1331/1099
+f 1044/1273/1049 1043/1271/1047 1099/1332/1099
+f 1045/1276/1051 1044/1275/1049 1099/1333/1099
+f 1046/1279/1053 1045/1276/1051 1099/1334/1099
+f 1047/1281/1055 1046/1279/1053 1099/1335/1099
+f 1048/1283/1057 1047/1281/1055 1099/1336/1099
+f 1049/1285/1059 1048/1283/1057 1099/1337/1099
+f 1050/1287/1061 1049/1285/1059 1099/1338/1099
+f 1039/1263/1039 1050/1287/1061 1099/1339/1099
+f 1100/1340/1100 1112/1341/1101 1113/1342/1102 1101/1343/1103
+f 1101/1343/1103 1113/1342/1102 1114/1344/1104 1102/1345/1105
+f 1102/1345/1105 1114/1344/1104 1115/1346/1106 1103/1347/1107
+f 1103/1347/1107 1115/1346/1106 1116/1348/1108 1104/1349/1109
+f 1104/1349/1109 1116/1348/1108 1117/1350/1110 1105/1351/1111
+f 1105/1352/1111 1117/1353/1110 1118/1354/1112 1106/1355/1113
+f 1106/1355/1113 1118/1354/1112 1119/1356/1114 1107/1357/1115
+f 1107/1357/1115 1119/1356/1114 1120/1358/1116 1108/1359/1117
+f 1108/1359/1117 1120/1358/1116 1121/1360/1118 1109/1361/1119
+f 1109/1361/1119 1121/1360/1118 1122/1362/1120 1110/1363/1121
+f 1110/1363/1121 1122/1362/1120 1123/1364/1122 1111/1365/1123
+f 1111/1365/1123 1123/1364/1122 1112/1341/1101 1100/1340/1100
+f 1112/1341/1101 1124/1366/1124 1125/1367/1125 1113/1342/1102
+f 1113/1342/1102 1125/1367/1125 1126/1368/1126 1114/1344/1104
+f 1114/1344/1104 1126/1368/1126 1127/1369/1127 1115/1346/1106
+f 1115/1346/1106 1127/1369/1127 1128/1370/1128 1116/1348/1108
+f 1116/1348/1108 1128/1370/1128 1129/1371/1129 1117/1350/1110
+f 1117/1353/1110 1129/1372/1129 1130/1373/1130 1118/1354/1112
+f 1118/1354/1112 1130/1373/1130 1131/1374/1131 1119/1356/1114
+f 1119/1356/1114 1131/1374/1131 1132/1375/1132 1120/1358/1116
+f 1120/1358/1116 1132/1375/1132 1133/1376/1133 1121/1360/1118
+f 1121/1360/1118 1133/1376/1133 1134/1377/1134 1122/1362/1120
+f 1122/1362/1120 1134/1377/1134 1135/1378/1135 1123/1364/1122
+f 1123/1364/1122 1135/1378/1135 1124/1366/1124 1112/1341/1101
+f 1124/1366/1124 1136/1379/1136 1137/1380/1137 1125/1367/1125
+f 1125/1367/1125 1137/1380/1137 1138/1381/1138 1126/1368/1126
+f 1126/1368/1126 1138/1381/1138 1139/1382/1139 1127/1369/1127
+f 1127/1369/1127 1139/1382/1139 1140/1383/1140 1128/1370/1128
+f 1128/1370/1128 1140/1383/1140 1141/1384/1141 1129/1371/1129
+f 1129/1372/1129 1141/1385/1141 1142/1386/1142 1130/1373/1130
+f 1130/1373/1130 1142/1386/1142 1143/1387/1143 1131/1374/1131
+f 1131/1374/1131 1143/1387/1143 1144/1388/1144 1132/1375/1132
+f 1132/1375/1132 1144/1388/1144 1145/1389/1145 1133/1376/1133
+f 1133/1376/1133 1145/1389/1145 1146/1390/1146 1134/1377/1134
+f 1134/1377/1134 1146/1390/1146 1147/1391/1147 1135/1378/1135
+f 1135/1378/1135 1147/1391/1147 1136/1379/1136 1124/1366/1124
+f 1136/1379/1136 1148/1392/1148 1149/1393/1149 1137/1380/1137
+f 1137/1380/1137 1149/1393/1149 1150/1394/1150 1138/1381/1138
+f 1138/1381/1138 1150/1394/1150 1151/1395/1151 1139/1382/1139
+f 1139/1382/1139 1151/1395/1151 1152/1396/1152 1140/1383/1140
+f 1140/1383/1140 1152/1396/1152 1153/1397/1153 1141/1384/1141
+f 1141/1385/1141 1153/1398/1153 1154/1399/1154 1142/1386/1142
+f 1142/1386/1142 1154/1399/1154 1155/1400/1155 1143/1387/1143
+f 1143/1387/1143 1155/1400/1155 1156/1401/1156 1144/1388/1144
+f 1144/1388/1144 1156/1401/1156 1157/1402/1157 1145/1389/1145
+f 1145/1389/1145 1157/1402/1157 1158/1403/1158 1146/1390/1146
+f 1146/1390/1146 1158/1403/1158 1159/1404/1159 1147/1391/1147
+f 1147/1391/1147 1159/1404/1159 1148/1392/1148 1136/1379/1136
+f 1148/1392/1148 674/795/686 673/793/684 1149/1393/1149
+f 1149/1393/1149 673/793/684 672/791/682 1150/1394/1150
+f 1150/1394/1150 672/791/682 671/787/678 1151/1395/1151
+f 1151/1395/1151 671/787/678 670/790/681 1152/1396/1152
+f 1152/1396/1152 670/790/681 681/812/700 1153/1397/1153
+f 1153/1398/1153 681/809/700 680/807/698 1154/1399/1154
+f 1154/1399/1154 680/807/698 679/805/696 1155/1400/1155
+f 1155/1400/1155 679/805/696 678/803/694 1156/1401/1156
+f 1156/1401/1156 678/803/694 677/801/692 1157/1402/1157
+f 1157/1402/1157 677/801/692 676/799/690 1158/1403/1158
+f 1158/1403/1158 676/799/690 675/797/688 1159/1404/1159
+f 1159/1404/1159 675/797/688 674/795/686 1148/1392/1148
+f 1101/1343/1103 1160/1405/1160 1100/1340/1100
+f 1102/1345/1105 1160/1406/1160 1101/1343/1103
+f 1103/1347/1107 1160/1407/1160 1102/1345/1105
+f 1104/1349/1109 1160/1408/1160 1103/1347/1107
+f 1105/1351/1111 1160/1409/1160 1104/1349/1109
+f 1106/1355/1113 1160/1410/1160 1105/1352/1111
+f 1107/1357/1115 1160/1411/1160 1106/1355/1113
+f 1108/1359/1117 1160/1412/1160 1107/1357/1115
+f 1109/1361/1119 1160/1413/1160 1108/1359/1117
+f 1110/1363/1121 1160/1414/1160 1109/1361/1119
+f 1111/1365/1123 1160/1415/1160 1110/1363/1121
+f 1100/1340/1100 1160/1416/1160 1111/1365/1123
diff --git a/app/assets/models/andy.png b/app/assets/models/andy.png
new file mode 100755
index 0000000000000000000000000000000000000000..6aa50ec2ba2b1188aaedd8c6804c852fa4b5a3a0
GIT binary patch
literal 274616
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

literal 0
HcmV?d00001

diff --git a/app/assets/models/andy_shadow.obj b/app/assets/models/andy_shadow.obj
new file mode 100755
index 0000000..bbc1908
--- /dev/null
+++ b/app/assets/models/andy_shadow.obj
@@ -0,0 +1,18 @@
+# This file uses centimeters as units for non-parametric coordinates.
+
+g default
+v -0.100000 -0.000000 0.100000
+v 0.100000 -0.000000 0.100000
+v -0.100000 0.000000 -0.100000
+v 0.100000 0.000000 -0.100000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 0.000000 1.000000
+vt 1.000000 1.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+s off
+g AndyBlobShadow_GEO
+f 4/4/1 3/3/2 1/1/3 2/2/4
diff --git a/app/assets/models/andy_shadow.png b/app/assets/models/andy_shadow.png
new file mode 100755
index 0000000000000000000000000000000000000000..45a09ce1ee81d685e07d99eb25f162280e72ef4a
GIT binary patch
literal 28795
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

literal 0
HcmV?d00001

diff --git a/app/assets/models/trigrid.png b/app/assets/models/trigrid.png
new file mode 100755
index 0000000000000000000000000000000000000000..05cbe6e52f39a5a9aa7e4e9c2b46b9b9b4d5e3b2
GIT binary patch
literal 37354
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
N22WQ%mvv4FO#r<4y{iBK

literal 0
HcmV?d00001

diff --git a/app/assets/shaders/object.frag b/app/assets/shaders/object.frag
new file mode 100755
index 0000000..a8a5673
--- /dev/null
+++ b/app/assets/shaders/object.frag
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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.
+ */
+
+precision mediump float;
+
+uniform sampler2D u_Texture;
+
+uniform vec4 u_LightingParameters;
+uniform vec4 u_MaterialParameters;
+uniform vec4 u_ColorCorrectionParameters;
+
+varying vec3 v_ViewPosition;
+varying vec3 v_ViewNormal;
+varying vec2 v_TexCoord;
+
+void main() {
+    // We support approximate sRGB gamma.
+    const float kGamma = 0.4545454;
+    const float kInverseGamma = 2.2;
+    const float kMiddleGrayGamma = 0.466;
+
+    // Unpack lighting and material parameters for better naming.
+    vec3 viewLightDirection = u_LightingParameters.xyz;
+    vec3 colorShift = u_ColorCorrectionParameters.rgb;
+    float averagePixelIntensity = u_ColorCorrectionParameters.a;
+
+    float materialAmbient = u_MaterialParameters.x;
+    float materialDiffuse = u_MaterialParameters.y;
+    float materialSpecular = u_MaterialParameters.z;
+    float materialSpecularPower = u_MaterialParameters.w;
+
+    // Normalize varying parameters, because they are linearly interpolated in the vertex shader.
+    vec3 viewFragmentDirection = normalize(v_ViewPosition);
+    vec3 viewNormal = normalize(v_ViewNormal);
+
+    // Apply inverse SRGB gamma to the texture before making lighting calculations.
+    // Flip the y-texture coordinate to address the texture from top-left.
+    vec4 objectColor = texture2D(u_Texture, vec2(v_TexCoord.x, 1.0 - v_TexCoord.y));
+    objectColor.rgb = pow(objectColor.rgb, vec3(kInverseGamma));
+
+    // Ambient light is unaffected by the light intensity.
+    float ambient = materialAmbient;
+
+    // Approximate a hemisphere light (not a harsh directional light).
+    float diffuse = materialDiffuse *
+            0.5 * (dot(viewNormal, viewLightDirection) + 1.0);
+
+    // Compute specular light.
+    vec3 reflectedLightDirection = reflect(viewLightDirection, viewNormal);
+    float specularStrength = max(0.0, dot(viewFragmentDirection, reflectedLightDirection));
+    float specular = materialSpecular *
+            pow(specularStrength, materialSpecularPower);
+
+    vec3 color = objectColor.rgb * (ambient + diffuse) + specular;
+    // Apply SRGB gamma before writing the fragment color.
+    color.rgb = pow(color, vec3(kGamma));
+    // Apply average pixel intensity and color shift
+    color *= colorShift * (averagePixelIntensity / kMiddleGrayGamma);
+    gl_FragColor.rgb = color;
+    gl_FragColor.a = objectColor.a;
+}
diff --git a/app/assets/shaders/object.vert b/app/assets/shaders/object.vert
new file mode 100755
index 0000000..2e1e6a4
--- /dev/null
+++ b/app/assets/shaders/object.vert
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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.
+ */
+
+uniform mat4 u_ModelView;
+uniform mat4 u_ModelViewProjection;
+
+attribute vec4 a_Position;
+attribute vec3 a_Normal;
+attribute vec2 a_TexCoord;
+
+varying vec3 v_ViewPosition;
+varying vec3 v_ViewNormal;
+varying vec2 v_TexCoord;
+
+void main() {
+    v_ViewPosition = (u_ModelView * a_Position).xyz;
+    v_ViewNormal = normalize((u_ModelView * vec4(a_Normal, 0.0)).xyz);
+    v_TexCoord = a_TexCoord;
+    gl_Position = u_ModelViewProjection * a_Position;
+}
diff --git a/app/assets/shaders/plane.frag b/app/assets/shaders/plane.frag
new file mode 100755
index 0000000..d0a4708
--- /dev/null
+++ b/app/assets/shaders/plane.frag
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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.
+ */
+
+precision highp float;
+uniform sampler2D u_Texture;
+uniform vec4 u_dotColor;
+uniform vec4 u_lineColor;
+uniform vec4 u_gridControl;  // dotThreshold, lineThreshold, lineFadeShrink, occlusionShrink
+varying vec3 v_TexCoordAlpha;
+
+void main() {
+  vec4 control = texture2D(u_Texture, v_TexCoordAlpha.xy);
+  float dotScale = v_TexCoordAlpha.z;
+  float lineFade = max(0.0, u_gridControl.z * v_TexCoordAlpha.z - (u_gridControl.z - 1.0));
+  vec3 color = (control.r * dotScale > u_gridControl.x) ? u_dotColor.rgb
+             : (control.g > u_gridControl.y)            ? u_lineColor.rgb * lineFade
+                                                        : (u_lineColor.rgb * 0.25 * lineFade) ;
+  gl_FragColor = vec4(color, v_TexCoordAlpha.z * u_gridControl.w);
+}
diff --git a/app/assets/shaders/plane.vert b/app/assets/shaders/plane.vert
new file mode 100755
index 0000000..9ac5a6d
--- /dev/null
+++ b/app/assets/shaders/plane.vert
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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.
+ */
+
+uniform mat4 u_Model;
+uniform mat4 u_ModelViewProjection;
+uniform mat2 u_PlaneUvMatrix;
+uniform vec3 u_Normal;
+
+attribute vec3 a_XZPositionAlpha; // (x, z, alpha)
+
+varying vec3 v_TexCoordAlpha;
+
+void main() {
+   vec4 local_pos = vec4(a_XZPositionAlpha.x, 0.0, a_XZPositionAlpha.y, 1.0);
+   vec4 world_pos = u_Model * local_pos;
+
+   // Construct two vectors that are orthogonal to the normal.
+   // This arbitrary choice is not co-linear with either horizontal
+   // or vertical plane normals.
+   const vec3 arbitrary = vec3(1.0, 1.0, 0.0);
+   vec3 vec_u = normalize(cross(u_Normal, arbitrary));
+   vec3 vec_v = normalize(cross(u_Normal, vec_u));
+
+   // Project vertices in world frame onto vec_u and vec_v.
+   vec2 uv = vec2(dot(world_pos.xyz, vec_u), dot(world_pos.xyz, vec_v));
+   v_TexCoordAlpha = vec3(u_PlaneUvMatrix * uv, a_XZPositionAlpha.z);
+   gl_Position = u_ModelViewProjection * local_pos;
+}
diff --git a/app/assets/shaders/point_cloud.frag b/app/assets/shaders/point_cloud.frag
new file mode 100755
index 0000000..463d052
--- /dev/null
+++ b/app/assets/shaders/point_cloud.frag
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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.
+ */
+
+precision mediump float;
+varying vec4 v_Color;
+
+void main() {
+    gl_FragColor = v_Color;
+}
diff --git a/app/assets/shaders/point_cloud.vert b/app/assets/shaders/point_cloud.vert
new file mode 100755
index 0000000..627fc1a
--- /dev/null
+++ b/app/assets/shaders/point_cloud.vert
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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.
+ */
+
+uniform mat4 u_ModelViewProjection;
+uniform vec4 u_Color;
+uniform float u_PointSize;
+
+attribute vec4 a_Position;
+
+varying vec4 v_Color;
+
+void main() {
+   v_Color = u_Color;
+   gl_Position = u_ModelViewProjection * vec4(a_Position.xyz, 1.0);
+   gl_PointSize = u_PointSize;
+}
diff --git a/app/assets/shaders/screenquad.frag b/app/assets/shaders/screenquad.frag
new file mode 100755
index 0000000..800d723
--- /dev/null
+++ b/app/assets/shaders/screenquad.frag
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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.
+ */
+#extension GL_OES_EGL_image_external : require
+
+precision mediump float;
+varying vec2 v_TexCoord;
+uniform samplerExternalOES sTexture;
+
+
+void main() {
+    gl_FragColor = texture2D(sTexture, v_TexCoord);
+}
diff --git a/app/assets/shaders/screenquad.vert b/app/assets/shaders/screenquad.vert
new file mode 100755
index 0000000..01c93e3
--- /dev/null
+++ b/app/assets/shaders/screenquad.vert
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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.
+ */
+
+attribute vec4 a_Position;
+attribute vec2 a_TexCoord;
+
+varying vec2 v_TexCoord;
+
+void main() {
+   gl_Position = a_Position;
+   v_TexCoord = a_TexCoord;
+}
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..22a1264
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,89 @@
+apply plugin: 'com.android.application'
+
+android {
+    compileSdkVersion 28
+
+    defaultConfig {
+        applicationId "se.liu.mrleo"
+        minSdkVersion 23
+        versionCode 1
+        versionName "1.0"
+
+        externalNativeBuild {
+            ndkBuild {
+                def gstRoot
+                if (project.hasProperty('gstAndroidRoot'))
+                    gstRoot = project.gstAndroidRoot
+                else
+                    gstRoot = System.env.GSTREAMER_ROOT_ANDROID
+                if (gstRoot == null)
+                    throw new FileNotFoundException('GSTREAMER_ROOT_ANDROID not set')
+
+                arguments "NDK_APPLICATION_MK=jni/Application.mk",
+                        "GSTREAMER_JAVA_SRC_DIR=src",
+                        "GSTREAMER_ROOT_ANDROID=$gstRoot",
+                        "GSTREAMER_ASSETS_DIR=src/main/assets"
+
+                targets "gstmredge"
+
+                abiFilters  'armeabi-v7a', 'arm64-v8a', 'x86'
+            }
+        }
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+            sourceSets {
+                main {
+                    manifest.srcFile 'AndroidManifest.xml'
+                    java.srcDirs = ['src']
+                    resources.srcDirs = ['src']
+                    aidl.srcDirs = ['src']
+                    renderscript.srcDirs = ['src']
+                    res.srcDirs = ['res']
+                    assets.srcDirs = ['assets']
+                }
+            }
+        }
+    }
+
+
+    externalNativeBuild {
+        ndkBuild {
+            path 'jni/Android.mk'
+        }
+    }
+
+    buildToolsVersion = '28.0.3'
+    compileOptions {
+        sourceCompatibility = '1.8'
+        targetCompatibility = '1.8'
+    }
+}
+
+afterEvaluate {
+    if (project.hasProperty('compileDebugJavaWithJavac')) {
+        project.compileDebugJavaWithJavac.dependsOn 'externalNativeBuildDebug'
+    }
+    if (project.hasProperty('compileReleaseJavaWithJavac')) {
+        project.compileReleaseJavaWithJavac.dependsOn 'externalNativeBuildRelease'
+    }
+}
+
+
+dependencies {
+    implementation fileTree(dir: 'libs', include: ['*.jar'])
+
+    api project(':rtplibrary')
+
+    // Edge
+    implementation 'com.obsez.android.lib.filechooser:filechooser:1.1.19'
+    implementation 'com.android.support:appcompat-v7:28.0.0'
+    implementation 'com.android.support:design:28.0.0'
+
+    // ARCore
+    implementation 'de.javagl:obj:0.3.0'
+    implementation 'com.google.ar:core:1.9.0'
+}
diff --git a/app/jni/Android.mk b/app/jni/Android.mk
new file mode 100644
index 0000000..5a1ae9c
--- /dev/null
+++ b/app/jni/Android.mk
@@ -0,0 +1,46 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE    := gstmredge
+LOCAL_SRC_FILES := gstmredge.c
+
+LOCAL_SHARED_LIBRARIES := gstreamer_android
+LOCAL_LDLIBS := -llog -landroid
+
+include $(BUILD_SHARED_LIBRARY)
+
+ifndef GSTREAMER_ROOT_ANDROID
+$(error GSTREAMER_ROOT_ANDROID is not defined!)
+endif
+
+ifeq ($(TARGET_ARCH_ABI),armeabi)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm
+else ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/armv7
+else ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm64
+else ifeq ($(TARGET_ARCH_ABI),x86)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86
+else ifeq ($(TARGET_ARCH_ABI),x86_64)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86_64
+else
+$(error Target arch ABI not supported: $(TARGET_ARCH_ABI))
+endif
+
+GSTREAMER_NDK_BUILD_PATH  := $(GSTREAMER_ROOT)/share/gst-android/ndk-build/
+
+
+include $(GSTREAMER_NDK_BUILD_PATH)/plugins.mk
+GSTREAMER_PLUGINS := $(GSTREAMER_PLUGINS_CORE) \
+                     $(GSTREAMER_PLUGINS_PLAYBACK) \
+                     $(GSTREAMER_PLUGINS_EFFECTS) \
+                     $(GSTREAMER_PLUGINS_CODECS) \
+                     $(GSTREAMER_PLUGINS_BAD) \
+                     $(GSTREAMER_PLUGINS_NET) \
+                     $(GSTREAMER_PLUGINS_SYS) \
+                     $(GSTREAMER_PLUGINS_CODECS_RESTRICTED)
+
+GSTREAMER_EXTRA_DEPS := gstreamer-video-1.0
+
+include $(GSTREAMER_NDK_BUILD_PATH)/gstreamer-1.0.mk
diff --git a/app/jni/Application.mk b/app/jni/Application.mk
new file mode 100644
index 0000000..bcfccde
--- /dev/null
+++ b/app/jni/Application.mk
@@ -0,0 +1 @@
+APP_ABI = armeabi-v7a arm64-v8a x86
diff --git a/app/jni/gstmredge.c b/app/jni/gstmredge.c
new file mode 100644
index 0000000..a3a1dba
--- /dev/null
+++ b/app/jni/gstmredge.c
@@ -0,0 +1,1467 @@
+#define GST_USE_UNSTABLE_API TRUE
+
+#define INCLUDE_LOCAL_PREVIEW
+
+#include <string.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <jni.h>
+#include <inttypes.h>
+#include <pthread.h>
+#include <android/log.h>
+#include <android/native_window.h>
+#include <android/native_window_jni.h>
+#include <gst/gst.h>
+#include <gst/video/video.h>
+#include <gst/video/videooverlay.h>
+#include <stdlib.h>
+#include <string.h>
+#include <jni.h>
+#include <android/native_window.h>
+#include <android/native_window_jni.h>
+#include <gst/gst.h>
+#include <pthread.h>
+#include <gst/video/videooverlay.h>
+#include <gst/interfaces/photography.h>
+
+#include <stdbool.h>
+
+GST_DEBUG_CATEGORY_STATIC(debug_category);
+
+#define MAX_OFFSET 20000
+#define MR_COLOR_CODE 144
+#define METADATA_COLOR_CODE 106
+#define PIXEL_CHECK_INTERVAL 2000
+
+
+#define FPS_TIME_SLICES 1000
+#define NSECS_PER_SEC (1000 * 1000 * 1000)
+#define NSECS_PER_MSEC (1000 * 1000)
+#define OBJECT_FOUND_COOLOFF 40
+#define FRAMERATE 30
+
+
+// These macros provide a way to store the
+// native pointer to GstContext, which might be 32 or 64 bits, into
+// a jlong, which is always 64 bits, without warnings.
+#if GLIB_SIZEOF_VOID_P == 8
+#define GET_CUSTOM_DATA(env, owner, fieldID)(GstContext*)(*(env))->GetLongField(env, owner, fieldID)
+#define SET_CUSTOM_DATA(env, owner, fieldID, data)(*(env))->SetLongField(env, owner, fieldID,(jlong)(data))
+#else
+#define GET_CUSTOM_DATA(env, owner, fieldID)(GstContext*)(jint)(*env)->GetLongField(env, owner, fieldID)
+#define SET_CUSTOM_DATA(env, owner, fieldID, data)(*env)->SetLongField(env, owner, fieldID,(jlong)(jint)data)
+#endif
+
+/**
+ * Structure to contain all our information, so we can pass it to callbacks.
+ */
+typedef struct _GstContext {
+  jobject app;            // Application instance, used to call its methods. A global reference is kept.
+  GstElement *pipeline;   // The running pipeline
+  GMainLoop *main_loop;   // GLib main loop
+  gboolean initialized;   // To avoid informing the UI multiple times about the initialization
+  GstElement *video_sink; // The video sink element which receives XOverlay commands
+  ANativeWindow *native_window; // The Android native window where video will be rendered
+  int receiver_port;
+  const char *local_host;
+  const char *stream_format;
+  // Camera
+  GstElement *ahcsrc;
+  int dest_port;
+  const char *dest_host;
+  int cam_width;
+  int cam_height;
+  int bitrate;
+  const char *video_file_source;
+  GstElement *encoder;
+  GstElement *filter;
+  int jitterbuffer;
+  jmethodID init_method;
+  int64_t start_time;
+  int total_received_frames;
+  int num_found_frames;
+  int mr_object_found_sent;
+  int metadata_found_sent;
+  int *frames_processed_per_time_slice;
+  int *metadata_found_times;
+  int *frame_arrival_times;
+} GstContext;
+
+// These global variables cache values which are not changing during execution
+static JavaVM *java_vm;
+static pthread_t gst_receiver_thread;
+static pthread_t gst_transmitter_thread;
+static pthread_key_t current_jni_env;
+static jfieldID native_receiver_data_field_id;
+static jfieldID native_transmitter_data_field_id;
+static jmethodID log_message_method_id;
+static jmethodID on_gstreamer_receiver_initialized_method_id;
+static jmethodID on_gstreamer_transmitter_initialized_method_id;
+static jmethodID on_error_method_id;
+static jmethodID on_state_changed_method_id;
+static jmethodID on_mr_object_found_method_id;
+static jmethodID register_receiver_fps_method_id;
+static jmethodID register_transmitter_fps_method_id;
+static jmethodID register_metadata_found_time_method_id;
+static jmethodID register_frame_arrival_time_method_id;
+static jmethodID on_first_frame_method_id;
+static jmethodID on_color_frame_source_method_id;
+static jmethodID on_transmission_start_method_id;
+
+static int64_t transmission_start_time;
+static int64_t transmission_start_time_pos_corr;
+static GstElement *transmission_pipeline = NULL;
+
+
+/**
+ * @brief Register this thread with the VM
+ */
+static JNIEnv *attach_current_thread(void) {
+  GST_DEBUG(".");
+  JNIEnv *env;
+  JavaVMAttachArgs args;
+  GST_DEBUG("Attaching thread %p", g_thread_self());
+  args.version = JNI_VERSION_1_4;
+  args.name = NULL;
+  args.group = NULL;
+
+  if ((*java_vm)->AttachCurrentThread(java_vm, &env, &args) < 0) {
+    GST_ERROR("Failed to attach current thread");
+    return NULL;
+  }
+  return env;
+}
+
+/**
+ * @brief Unregister this thread from the VM
+ */
+static void detach_current_thread(void *env) {
+  GST_DEBUG(".");
+  (void) env;
+  GST_DEBUG("Detaching thread %p", g_thread_self());
+  (*java_vm)->DetachCurrentThread(java_vm);
+}
+
+/**
+ * @brief Retrieve the JNI environment for this thread
+ */
+static JNIEnv *get_jni_env(void) {
+  GST_DEBUG(".");
+  JNIEnv *env;
+  if ((env = pthread_getspecific(current_jni_env)) == NULL) {
+    env = attach_current_thread();
+    pthread_setspecific(current_jni_env, env);
+  }
+  return env;
+}
+
+/**
+ * @return
+ */
+static int64_t get_time_nsec() {
+  struct timespec now;
+  clock_gettime(CLOCK_MONOTONIC, &now);
+  return (int64_t) now.tv_sec * 1000000000LL + now.tv_nsec;
+}
+
+/**
+ * @brief Sends a text message to the Android Activity.
+ * @param message String message.
+ * @param ctx GStreamer context 
+ */
+static void android_log(const gchar *message, GstContext *ctx) {
+  GST_DEBUG(".");
+  JNIEnv *env = get_jni_env();
+  GST_DEBUG("Setting message to: %s", message);
+  jstring jmessage = (*env)->NewStringUTF(env, message);
+  (*env)->CallVoidMethod(env, ctx->app, log_message_method_id, jmessage);
+  if ((*env)->ExceptionCheck(env)) {
+    GST_ERROR("Failed to call Java method");
+    (*env)->ExceptionClear(env);
+  }
+  (*env)->DeleteLocalRef(env, jmessage);
+}
+
+/**
+ * @brief Retrieve errors from the bus and show them in the UI.
+ * @param msg Error message.
+ * @param bus Unused
+ * @param ctx GStreamer context
+ */
+static void on_error_cb(GstBus *bus, GstMessage *msg, GstContext *ctx) {
+  GST_DEBUG(".");
+  (void) bus;
+  JNIEnv *env = get_jni_env();
+  GError *err;
+  gchar *debug_info;
+  jstring message;
+  gchar *message_string;
+  gst_message_parse_error(msg, &err, &debug_info);
+  message_string = g_strdup_printf(
+      "Error received from element %s: %s", GST_OBJECT_NAME(msg->src), err->message);
+  g_clear_error(&err);
+  g_free(debug_info);
+  android_log(message_string, ctx);
+  message = (*env)->NewStringUTF(env, message_string);
+  (*env)->CallVoidMethod(env, ctx->app, on_error_method_id, message);
+  if ((*env)->ExceptionCheck(env)) {
+    GST_ERROR("Failed to call Java method");
+    (*env)->ExceptionClear(env);
+  }
+  (*env)->DeleteLocalRef(env, message);
+  g_free(message_string);
+  gst_element_set_state(ctx->pipeline, GST_STATE_NULL);
+}
+
+/**
+ * @brief Notify UI about pipeline state changes
+ * @param msg The new state.
+ * @param bus Unused
+ * @param ctx GStreamer context
+ */
+static void on_state_changed_cb(GstBus *bus, GstMessage *msg, GstContext *ctx) {
+  (void) bus;
+  GstState old_state;
+  GstState new_state;
+  GstState pending_state;
+  gst_message_parse_state_changed(msg, &old_state, &new_state, &pending_state);
+  // Only pay attention to messages coming from the pipeline, not its children
+  if (GST_MESSAGE_SRC(msg) == GST_OBJECT(ctx->pipeline)) {
+    JNIEnv *env = get_jni_env();
+    GST_DEBUG("State changed to %s, notifying application",
+              gst_element_state_get_name(new_state));
+    gchar *message = g_strdup_printf("State changed to %s", gst_element_state_get_name(new_state));
+    android_log(message, ctx);
+    (*env)->CallVoidMethod(env, ctx->app, on_state_changed_method_id, new_state);
+    if ((*env)->ExceptionCheck(env)) {
+      (*env)->ExceptionDescribe(env);
+      GST_ERROR("Failed to call Java method");
+      (*env)->ExceptionClear(env);
+    }
+  }
+}
+
+/**
+ * @brief Callback for end of stream.
+ * @param bus Unused
+ * @param msg Unused
+ * @param ctx GStreamer context
+ */
+static void on_eos_cb(GstBus *bus, GstMessage *msg, GstContext *ctx) {
+  GST_DEBUG(".");
+  (void) msg;
+  (void) bus;
+  gst_element_set_state(ctx->pipeline, GST_STATE_PAUSED);
+}
+
+/**
+ * @brief If the pipeline is up and running calls the Android Activity's callback function once.
+ * @param ctx GStreamer context 
+ */
+static void check_initialization_complete(GstContext *ctx) {
+  GST_DEBUG(".");
+  JNIEnv *env = get_jni_env();
+  if (!ctx->initialized && ctx->native_window && ctx->main_loop) {
+    gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(ctx->video_sink),
+                                        (guintptr) ctx->native_window);
+    GST_DEBUG(
+        "Initialization complete, notifying application. native_window:%p main_loop:%p",
+        ctx->native_window, ctx->main_loop);
+    ctx->initialized = TRUE;
+    (*env)->CallVoidMethod(env, ctx->app, ctx->init_method);
+    if ((*env)->ExceptionCheck(env)) {
+      GST_ERROR("Failed to call Java method");
+      (*env)->ExceptionClear(env);
+    }
+  }
+}
+
+/**
+ *
+ * @param pad
+ * @param info
+ * @param ctx
+ * @return
+ */
+static GstPadProbeReturn gst_transmitter_probe_cb(
+    GstPad *pad, GstPadProbeInfo *info, GstContext *ctx) {
+  GST_DEBUG(".");
+  (void) pad;
+  GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER(info);
+  if (buffer == NULL) {
+    GST_DEBUG("Buffer null");
+    return GST_PAD_PROBE_OK;
+  }
+  if (ctx->start_time == 0) {
+    ctx->start_time = 1;
+  } else if (ctx->start_time == 1) {
+    ctx->start_time = get_time_nsec();
+    // Get start position
+    int64_t position;
+    gst_element_query_position(ctx->pipeline, GST_FORMAT_TIME, &position);
+    transmission_start_time = ctx->start_time;
+    transmission_start_time_pos_corr = ctx->start_time - position;
+    JNIEnv *env = get_jni_env();
+    (*env)->CallVoidMethod(env, ctx->app, on_transmission_start_method_id, position);
+    if ((*env)->ExceptionCheck(env)) {
+      GST_ERROR("Failed to call Java method");
+      (*env)->ExceptionClear(env);
+    }
+  }
+  return GST_PAD_PROBE_OK;
+}
+
+/**
+ *
+ * @param pad
+ * @param info
+ * @param userdata
+ * @return
+ */
+static GstPadProbeReturn gst_receiver_probe_cb(
+    GstPad *pad, GstPadProbeInfo *info, GstContext *ctx) {
+  (void) pad;
+  GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER(info);
+  GstMapInfo map;
+  int nonMatchingPixelFound = 0;
+  if (buffer == NULL) {
+    GST_DEBUG("Buffer null");
+    return GST_PAD_PROBE_OK;
+  }
+  if (!gst_buffer_map(buffer, &map, GST_MAP_READ)) {
+    return GST_PAD_PROBE_OK;
+  }
+  if (ctx->start_time == 0) {
+    ctx->start_time = get_time_nsec();
+    JNIEnv *env = get_jni_env();
+    (*env)->CallVoidMethod(env, ctx->app, on_first_frame_method_id);
+    if ((*env)->ExceptionCheck(env)) {
+      GST_ERROR("Failed to call Java method");
+      (*env)->ExceptionClear(env);
+    }
+  }
+  int64_t curr_time = get_time_nsec();
+  int curr_time_sec = (int) ((curr_time - ctx->start_time) / NSECS_PER_SEC);
+  int curr_time_msec = (int) ((curr_time - ctx->start_time) / NSECS_PER_MSEC);
+
+  if (ctx->frames_processed_per_time_slice &&
+      curr_time_sec >= 0 && curr_time_sec < FPS_TIME_SLICES) {
+    ctx->frames_processed_per_time_slice[curr_time_sec] += 1;
+  } else {
+    GST_ERROR("Could not store fps data for time: %" PRId64, curr_time_sec);
+  }
+
+  if (ctx->total_received_frames < (FRAMERATE * FPS_TIME_SLICES)) {
+    ctx->frame_arrival_times[ctx->total_received_frames] = curr_time_msec;
+  }
+  ctx->total_received_frames++;
+
+  nonMatchingPixelFound = 1;
+  if (ctx->metadata_found_sent > 0) {
+    ctx->metadata_found_sent--;
+  }
+  if (ctx->metadata_found_sent == 0) {
+    nonMatchingPixelFound = 0;
+    int offset = 0;
+    while (offset < map.size && offset < MAX_OFFSET) {
+      if ((*(map.data + offset)) != METADATA_COLOR_CODE) {
+        GST_ERROR("Non matching color: offset: %u, data: %u", offset, *(map.data + offset));
+        nonMatchingPixelFound = 1;
+        break;
+      }
+      offset += PIXEL_CHECK_INTERVAL;
+    }
+  }
+  if (nonMatchingPixelFound == 0) {
+#define METADATA_ARRAY_INTERVAL 10
+
+    ctx->metadata_found_times[ctx->num_found_frames * METADATA_ARRAY_INTERVAL] =
+        ctx->num_found_frames + 1;
+
+    ctx->metadata_found_times[ctx->num_found_frames * METADATA_ARRAY_INTERVAL + 1] =
+        curr_time_sec;
+
+    int time_since_transmission_start = (int) ((get_time_nsec() -
+        transmission_start_time) / (1000 * 1000));
+    ctx->metadata_found_times[ctx->num_found_frames * METADATA_ARRAY_INTERVAL + 2] =
+        time_since_transmission_start;
+
+    time_since_transmission_start -= (time_since_transmission_start / 1000) * 1000;
+    ctx->metadata_found_times[ctx->num_found_frames * METADATA_ARRAY_INTERVAL + 3] =
+        time_since_transmission_start;
+
+    int time_since_transmission_start_pos_corr = (int) ((get_time_nsec() -
+        transmission_start_time_pos_corr) / (1000 * 1000));
+    ctx->metadata_found_times[ctx->num_found_frames * METADATA_ARRAY_INTERVAL + 4] =
+        time_since_transmission_start_pos_corr;
+    time_since_transmission_start_pos_corr -= (time_since_transmission_start_pos_corr / 1000) * 1000;
+    ctx->metadata_found_times[ctx->num_found_frames * METADATA_ARRAY_INTERVAL + 5] =
+        time_since_transmission_start_pos_corr;
+
+    int64_t position;
+    gst_element_query_position(transmission_pipeline, GST_FORMAT_TIME, &position);
+    ctx->metadata_found_times[ctx->num_found_frames * 10 + 6] = (int) (position) / (1000 * 1000);
+
+    ctx->num_found_frames += 1;
+    ctx->metadata_found_sent = OBJECT_FOUND_COOLOFF;
+    GST_DEBUG("Probe: MR object found");
+  }
+  nonMatchingPixelFound = 1;
+  if (ctx->mr_object_found_sent > 0) {
+    ctx->mr_object_found_sent--;
+  }
+  if (ctx->mr_object_found_sent == 0) {
+    nonMatchingPixelFound = 0;
+    int offset = 0;
+    while (offset < map.size && offset < MAX_OFFSET) {
+      if ((*(map.data + offset)) != MR_COLOR_CODE) {
+        GST_ERROR("Non matching color: offset: %u, data: %u", offset, *(map.data + offset));
+        nonMatchingPixelFound = 1;
+        break;
+      }
+      offset += PIXEL_CHECK_INTERVAL;
+    }
+  }
+  gst_buffer_unmap(buffer, &map);
+  if (nonMatchingPixelFound == 0) {
+    JNIEnv *env = get_jni_env();
+    (*env)->CallVoidMethod(env, ctx->app, on_mr_object_found_method_id);
+    if ((*env)->ExceptionCheck(env)) {
+      GST_ERROR("Failed to call Java method");
+      (*env)->ExceptionClear(env);
+    }
+    ctx->mr_object_found_sent = OBJECT_FOUND_COOLOFF;
+    GST_DEBUG("Probe: MR object found");
+  }
+  return GST_PAD_PROBE_OK;
+}
+
+
+/**
+ * @brief Function to be run in a separate thread for the camera transmitter.
+ * Starts by creating all elements and then sends them to the GStreamer loop.
+ * The function doesn't return until the pipeline has been stopped.
+ * @param userdata Contains the context object.
+ * @return NULL when the thread exits.
+ */
+static void *transmitter_app_function(void *userdata) {
+  GST_DEBUG(".");
+  GstBus *bus;
+  GstContext *ctx = (GstContext *) userdata;
+  GSource *bus_source;
+  GError *error = NULL;
+  GMainContext *context = g_main_context_new();
+  g_main_context_push_thread_default(context);
+
+  GST_DEBUG("Stream format %s", ctx->stream_format);
+
+  /*  Build pipeline based on stream format. */
+#define PIPELINE_STRING_MAX_LENGTH 600
+  char pipelineString[PIPELINE_STRING_MAX_LENGTH];
+
+  /* The part of the pipeline that differ between sources. */
+  char sourceString[PIPELINE_STRING_MAX_LENGTH];
+
+  /* If the video file source is not empty the video file will
+   * be used as the source, played using decodebin.
+   * If no file is set it will instead use the Android camera
+   * via the ahcsrc plugin. */
+  if (strcmp(ctx->video_file_source, "") != 0) {
+    sprintf(sourceString,
+            "filesrc location=%s ! "
+            "decodebin name=decodebin ! ",
+            ctx->video_file_source);
+  } else {
+    sprintf(sourceString,
+            "ahcsrc name=ahcsrc ! "
+            "capsfilter name=cameracaps ! ");
+  }
+
+  sprintf(sourceString,
+          "%s"
+          #ifdef INCLUDE_LOCAL_PREVIEW
+          "tee name=t t. ! "
+          "queue !"
+          "glimagesink name=sink "
+          "t. !"
+#endif
+      , sourceString);
+
+  /* Add the encoding and transmitting elements.
+   * Both TCP and UDP transmission use the same settings
+   * for x264 enc. For UDP the payloader is rtp264pay and for
+   * and for TCP it's mpegtsmux. */
+  if (strcmp(ctx->stream_format, "TCP_H264_SW") == 0) {
+    GST_DEBUG("Stream is H264, TCP");
+    sprintf(pipelineString,
+            "%s"
+            // Encoder:
+            "x264enc name=encoder "
+            "tune=zerolatency "
+            "speed-preset=ultrafast "
+            "bitrate=%i "
+            "!"
+            // Payloader:
+            "mpegtsmux ! "
+            "tcpclientsink host=%s port=%i",
+            sourceString,
+            ctx->bitrate,
+            ctx->dest_host,
+            ctx->dest_port
+    );
+  } else if (strcmp(ctx->stream_format, "UDP_H264_SW") == 0) {
+    GST_DEBUG("Stream is H264, UDP");
+    sprintf(pipelineString,
+            "%s"
+            // Encoder:
+            "x264enc name=encoder "
+            "tune=zerolatency "
+            "speed-preset=ultrafast "
+            "bitrate=%i "
+            "key-int-max=1 "
+            "!"
+            // Payloader:
+            "rtph264pay "
+            "config-interval=1 "
+            "pt=96 "
+            "!"
+            "udpsink host=%s port=%i",
+            sourceString,
+            ctx->bitrate,
+            ctx->dest_host,
+            ctx->dest_port
+    );
+  } else {
+    android_log("Stream format is not recognized", ctx);
+    return NULL;
+  }
+
+  GST_DEBUG("Creating pipeline: %s", pipelineString);
+  android_log(pipelineString, ctx);
+
+  ctx->pipeline = gst_parse_launch(
+      pipelineString,
+      &error);
+
+  if (error) {
+    gchar *message = g_strdup_printf("Unable to build pipeline: %s", error->message);
+    g_clear_error(&error);
+    android_log(message, ctx);
+    g_free(message);
+    return NULL;
+  }
+
+  transmission_pipeline = ctx->pipeline;
+
+  ctx->encoder = gst_bin_get_by_name((GstBin *) (ctx->pipeline), "encoder");
+
+  /* x264enc parameter that might be relevant:
+   *  "rc-lookahead", 1
+   */
+
+  ctx->ahcsrc = gst_bin_get_by_name((GstBin *) (ctx->pipeline), "ahcsrc");
+  if (ctx->ahcsrc) {
+#if (GST_VERSION_MINOR < 16)
+    gst_photography_set_autofocus(GST_PHOTOGRAPHY(ctx->ahcsrc), false);
+#endif
+  }
+
+  GstElement *cameracaps = gst_bin_get_by_name((GstBin *) (ctx->pipeline), "cameracaps");
+  if (cameracaps) {
+    g_object_set(
+        cameracaps,
+        "caps", gst_caps_new_simple(
+            "video/x-raw",
+            "width", G_TYPE_INT, 640,
+            "height", G_TYPE_INT, 480,
+            NULL),
+        NULL);
+  }
+
+  ctx->filter = gst_bin_get_by_name((GstBin *) (ctx->pipeline), "capsfilter");
+  if (ctx->filter) {
+    g_object_set(
+        ctx->filter,
+        "caps", gst_caps_new_simple(
+            "video/x-raw",
+            "width", G_TYPE_INT, ctx->cam_width,
+            "height", G_TYPE_INT, ctx->cam_height,
+            NULL),
+        NULL);
+  }
+
+  // Set the pipeline to READY, so it can already
+  // accept a window handle, if we have one
+  gst_element_set_state(ctx->pipeline, GST_STATE_READY);
+
+  ctx->video_sink = gst_bin_get_by_interface((GstBin *) (ctx->pipeline), GST_TYPE_VIDEO_OVERLAY);
+
+#ifdef INCLUDE_LOCAL_PREVIEW
+  if (ctx->video_sink) {
+    GstPad *pad = gst_element_get_static_pad(ctx->video_sink, "sink");
+    gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER,
+                      (GstPadProbeCallback) gst_transmitter_probe_cb, ctx, NULL);
+  }
+#endif
+
+  // Instruct the bus to emit signals for each received
+  // message, and connect to the interesting signals
+  bus = gst_element_get_bus(ctx->pipeline);
+  bus_source = gst_bus_create_watch(bus);
+  g_source_set_callback(bus_source, (GSourceFunc) gst_bus_async_signal_func, NULL, NULL);
+  g_source_attach(bus_source, context);
+  g_source_unref(bus_source);
+  g_signal_connect(G_OBJECT(bus), "message::error", (GCallback) on_error_cb, ctx);
+  g_signal_connect(G_OBJECT(bus), "message::eos", (GCallback) on_eos_cb, ctx);
+  g_signal_connect(G_OBJECT(bus), "message::state-changed", (GCallback) on_state_changed_cb, ctx);
+  gst_object_unref(bus);
+
+  ctx->start_time = 0;
+
+  gst_element_set_state(ctx->pipeline, GST_STATE_PAUSED);
+
+  // Create a GLib Main Loop and set it to run
+  GST_DEBUG("Entering transmitter main loop");
+  ctx->main_loop = g_main_loop_new(context, FALSE);
+  check_initialization_complete(ctx);
+  g_main_loop_run(ctx->main_loop);
+  GST_DEBUG("Exited receiver main loop");
+  if (ctx->main_loop != NULL) {
+    g_main_loop_unref(ctx->main_loop);
+  }
+  ctx->main_loop = NULL;
+
+  // Free resources
+  g_main_context_pop_thread_default(context);
+  g_main_context_unref(context);
+  gst_element_set_state(ctx->pipeline, GST_STATE_NULL);
+  if (ctx->ahcsrc) {
+    gst_object_unref(ctx->ahcsrc);
+  }
+  if (ctx->video_sink) {
+    gst_object_unref(ctx->video_sink);
+    ctx->video_sink = NULL;
+  }
+  gst_object_unref(ctx->pipeline);
+  ctx->initialized = FALSE;
+  return NULL;
+}
+
+/**
+ * @brief Function to be run in a separate thread for the receiver.
+ * The player function starts and then doesn't return until the player has been stopped.
+ * @param userdata Contains the context object.
+ * @return NULL when the thread exits.
+ */
+static void *receiver_app_function(void *userdata) {
+  GST_DEBUG(".");
+  GstBus *bus;
+  GstContext *ctx = (GstContext *) userdata;
+  GSource *bus_source;
+  GError *error = NULL;
+  GMainContext *context = g_main_context_new();
+  g_main_context_push_thread_default(context);
+
+  GST_DEBUG("Receiver Stream format %s", ctx->stream_format);
+
+  // Build pipeline based on stream format.
+  char pipelineString[250];
+  if (strcmp(ctx->stream_format, "UDP_H264") == 0) {
+    GST_DEBUG("Stream is H264, UDP");
+    sprintf(pipelineString,
+            "udpsrc name=insrc port=0 ! "
+            "application/x-rtp, payload=96 ! "
+            "%s"
+            "rtph264depay ! "
+            "h264parse disable-passthrough=true ! "
+            "avdec_h264 output-corrupt=false ! "
+            "videoconvert ! "
+            "queue !"
+            "autovideosink name=sink",
+            (ctx->jitterbuffer ? " rtpjitterbuffer ! " : "")
+    );
+  } else if (strcmp(ctx->stream_format, "TCP_H264") == 0) {
+    GST_DEBUG("Stream is H264, TCP");
+    sprintf(pipelineString,
+            "tcpserversrc name=insrc port=0 host=%s ! "
+            "tsdemux ! "
+            "h264parse disable-passthrough=true ! "
+            "avdec_h264 output-corrupt=false ! "
+            "videoconvert ! "
+            "queue !"
+            "autovideosink name=sink",
+            ctx->local_host);
+  } else {
+    android_log("Stream format is not recognized", ctx);
+    return NULL;
+  }
+
+  GST_DEBUG("Creating receiver pipeline: %s", pipelineString);
+  android_log(pipelineString, ctx);
+
+  ctx->pipeline = gst_parse_launch(
+      pipelineString,
+      &error);
+
+  if (error) {
+    gchar *message = g_strdup_printf("Unable to build pipeline: %s", error->message);
+    g_clear_error(&error);
+    android_log(message, ctx);
+    g_free(message);
+    return NULL;
+  }
+
+  // Set the pipeline to READY, so it can already
+  // accept a window handle, if we have one
+  gst_element_set_state(ctx->pipeline, GST_STATE_READY);
+
+
+  ctx->video_sink = gst_bin_get_by_interface((GstBin *) (ctx->pipeline), GST_TYPE_VIDEO_OVERLAY);
+  if (!ctx->video_sink) {
+    GST_ERROR("Could not retrieve video sink");
+    return NULL;
+  }
+  GstPad *pad = gst_element_get_static_pad(ctx->video_sink, "sink");
+  gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER,
+                    (GstPadProbeCallback) gst_receiver_probe_cb, ctx, NULL);
+
+  // Instruct the bus to emit signals for each received
+  // message, and connect to the interesting signals
+  bus = gst_element_get_bus(ctx->pipeline);
+  bus_source = gst_bus_create_watch(bus);
+  g_source_set_callback(bus_source, (GSourceFunc) gst_bus_async_signal_func, NULL, NULL);
+  g_source_attach(bus_source, context);
+  g_source_unref(bus_source);
+  g_signal_connect(G_OBJECT(bus), "message::error", (GCallback) on_error_cb, ctx);
+  g_signal_connect(G_OBJECT(bus), "message::eos", (GCallback) on_eos_cb, ctx);
+  g_signal_connect(G_OBJECT(bus), "message::state-changed", (GCallback) on_state_changed_cb, ctx);
+  gst_object_unref(bus);
+
+  GstElement *insrc = gst_bin_get_by_name((GstBin *) (ctx->pipeline), "insrc");
+  gst_element_set_state(ctx->pipeline, GST_STATE_PAUSED);
+  gint port;
+  g_object_get(insrc, "port", &port, NULL);
+  if (!port) {
+    g_object_get(insrc, "current-port", &port, NULL);
+  }
+  ctx->receiver_port = port;
+  GST_DEBUG("Receiver server on port: %d", ctx->receiver_port);
+
+  ctx->start_time = 0;
+
+  // Create a GLib Main Loop and set it to run
+  GST_DEBUG("Entering receiver main loop");
+  ctx->main_loop = g_main_loop_new(context, FALSE);
+  check_initialization_complete(ctx);
+  g_main_loop_run(ctx->main_loop);
+  GST_DEBUG("Exited receiver main loop");
+  if (ctx->main_loop != NULL) {
+    g_main_loop_unref(ctx->main_loop);
+  }
+  ctx->main_loop = NULL;
+
+  // Free resources
+  g_main_context_pop_thread_default(context);
+  g_main_context_unref(context);
+  gst_element_set_state(ctx->pipeline, GST_STATE_NULL);
+  if (ctx->video_sink) {
+    gst_object_unref(ctx->video_sink);
+  }
+  gst_object_unref(ctx->pipeline);
+  ctx->video_sink = NULL;
+  ctx->initialized = FALSE;
+  return NULL;
+}
+
+/**
+ * @brief Initialize playback of a video stream.
+ * @param env 
+ * @param owner Android Activity 
+ * @param stream_format UDP_H264, TCP_H264 etc.
+ * @param local_host Local IP address for this device.
+ * @param receiver_port Port to listen to.
+ */
+static void native_receiver_init(JNIEnv *env, jobject owner,
+                                 jstring stream_format, jstring local_host, int jitterbuffer) {
+  GST_DEBUG(".");
+  GstContext *ctx = g_new0(GstContext, 1);
+  SET_CUSTOM_DATA(env, owner, native_receiver_data_field_id, ctx);
+  ctx->frames_processed_per_time_slice = malloc(sizeof(int) * FPS_TIME_SLICES);
+  if (ctx->frames_processed_per_time_slice) {
+    memset(ctx->frames_processed_per_time_slice, 0, sizeof(int) * FPS_TIME_SLICES);
+  }
+  ctx->metadata_found_times = malloc(sizeof(int) * FPS_TIME_SLICES);
+  if (ctx->metadata_found_times) {
+    memset(ctx->metadata_found_times, 0, sizeof(int) * FPS_TIME_SLICES);
+  }
+  ctx->frame_arrival_times = malloc(sizeof(int) * FPS_TIME_SLICES * FRAMERATE);
+  if (ctx->frame_arrival_times) {
+    memset(ctx->frame_arrival_times, 0, sizeof(int) * FPS_TIME_SLICES * FRAMERATE);
+  }
+  ctx->video_sink = NULL;
+  ctx->ahcsrc = NULL;
+  ctx->filter = NULL;
+  ctx->jitterbuffer = jitterbuffer;
+  ctx->encoder = NULL;
+  ctx->total_received_frames = 0;
+  ctx->num_found_frames = 0;
+  ctx->native_window = NULL;
+  ctx->mr_object_found_sent = 0;
+  ctx->metadata_found_sent = 0;
+  ctx->app = (*env)->NewGlobalRef(env, owner);
+  ctx->stream_format = (*env)->GetStringUTFChars(env, stream_format, 0);
+  ctx->local_host = (*env)->GetStringUTFChars(env, local_host, 0);
+  ctx->init_method = on_gstreamer_receiver_initialized_method_id;
+  pthread_create(&gst_receiver_thread, NULL, &receiver_app_function, ctx);
+}
+
+/**
+ * @brief Stop the transmitting GStreamer pipeline, threads and free the resources.
+ * @param env 
+ * @param owner Android Activity 
+ */
+static void native_transmitter_finalize(JNIEnv *env, jobject owner) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_transmitter_data_field_id);
+  if (ctx) {
+    if (ctx->main_loop != NULL) {
+      ctx->initialized = FALSE;
+      g_main_loop_quit(ctx->main_loop);
+      ctx->main_loop = NULL;
+    }
+    pthread_join(gst_transmitter_thread, NULL);
+    (*env)->DeleteGlobalRef(env, ctx->app);
+    g_free(ctx);
+    SET_CUSTOM_DATA(env, owner, native_transmitter_data_field_id, NULL);
+  }
+}
+
+/**
+ * @brief Stop the receiver GStreamer pipeline, threads and free the resources.
+ * @param env 
+ * @param owner Android Activity 
+ */
+static void native_receiver_finalize(JNIEnv *env, jobject owner) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_receiver_data_field_id);
+  if (ctx) {
+    if (ctx->main_loop != NULL) {
+      g_main_loop_quit(ctx->main_loop);
+      ctx->main_loop = NULL;
+      ctx->initialized = FALSE;
+    }
+    pthread_join(gst_receiver_thread, NULL);
+    (*env)->DeleteGlobalRef(env, ctx->app);
+    g_free(ctx);
+    SET_CUSTOM_DATA(env, owner, native_receiver_data_field_id, NULL);
+  }
+}
+
+/**
+ *
+ * @param env
+ * @param owner
+ */
+static void native_get_transmitter_fps(JNIEnv *env, jobject owner) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_transmitter_data_field_id);
+  if (ctx && ctx->frames_processed_per_time_slice) {
+    int i;
+    for (i = 0; i < FPS_TIME_SLICES; i++) {
+      (*env)->CallVoidMethod(env, ctx->app, register_transmitter_fps_method_id, i,
+                             ctx->frames_processed_per_time_slice[i]);
+      if ((*env)->ExceptionCheck(env)) {
+        GST_ERROR("Failed to call Java method");
+        (*env)->ExceptionClear(env);
+      }
+    }
+  }
+}
+
+/**
+ *
+ * @param env
+ * @param owner
+ */
+static void native_get_metadata_found_times(JNIEnv *env, jobject owner) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_receiver_data_field_id);
+  if (ctx && ctx->frames_processed_per_time_slice) {
+    int i;
+    for (i = 0; i < FPS_TIME_SLICES; i++) {
+      (*env)->CallVoidMethod(env, ctx->app, register_metadata_found_time_method_id, i,
+          ctx->metadata_found_times[i]);
+      if ((*env)->ExceptionCheck(env)) {
+        GST_ERROR("Failed to call Java method");
+        (*env)->ExceptionClear(env);
+      }
+    }
+  }
+}
+
+
+static void native_get_frame_arrival_times(JNIEnv *env, jobject owner) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_receiver_data_field_id);
+  if (ctx && ctx->frame_arrival_times) {
+    int i;
+    int last_frame_time = 0;
+    for (i = 0; i < FPS_TIME_SLICES * FRAMERATE; i++) {
+      (*env)->CallVoidMethod(env, ctx->app, register_frame_arrival_time_method_id, i,
+          ctx->frame_arrival_times[i], ctx->frame_arrival_times[i] - last_frame_time);
+      last_frame_time = ctx->frame_arrival_times[i];
+      if ((*env)->ExceptionCheck(env)) {
+        GST_ERROR("Failed to call Java method");
+        (*env)->ExceptionClear(env);
+      }
+    }
+  }
+}
+
+
+
+/**
+ *
+ * @param env
+ * @param owner
+ */
+static void native_get_receiver_fps(JNIEnv *env, jobject owner) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_receiver_data_field_id);
+  if (ctx && ctx->frames_processed_per_time_slice) {
+    int i;
+    for (i = 0; i < FPS_TIME_SLICES; i++) {
+      (*env)->CallVoidMethod(env, ctx->app, register_receiver_fps_method_id, i,
+          ctx->frames_processed_per_time_slice[i]);
+      if ((*env)->ExceptionCheck(env)) {
+        GST_ERROR("Failed to call Java method");
+        (*env)->ExceptionClear(env);
+      }
+    }
+  }
+}
+
+/**
+ * @brief Return all available encoder codecs.
+ * @param env 
+ * @param owner Android Activity 
+ * @return Astring with list of all codecs separated by ':'. Encoders have a leading '+' added
+ *         to them, decoders a leading '*'.
+ */
+static jstring native_get_encoders(JNIEnv *env, jobject owner) {
+  GST_DEBUG(".");
+  (void) owner;
+  GList *encoders = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_ENCODER,
+                                                          GST_RANK_NONE);
+  char *ret_str = "";
+  for (GList *it = encoders; it; it = it->next) {
+    GstElementFactory *el = it->data;
+    /* GST_DEBUG("element codec: %s\n", GST_OBJECT_NAME(el)); */
+    char *new_str = malloc(strlen(ret_str) + strlen(GST_OBJECT_NAME(el)) + 4);
+    new_str[0] = '\0';   // ensures the memory is an empty string
+    strcat(new_str, ret_str);
+    strcat(new_str, GST_OBJECT_NAME(el));
+    if (it->next) {
+      strcat(new_str, ",");
+    }
+    ret_str = new_str;
+  }
+  gst_plugin_feature_list_free(encoders);
+  jstring jmessage = (*env)->NewStringUTF(env, ret_str);
+  return jmessage;
+}
+
+/**
+ * @brief Return all available decoder codecs.
+ * @param env
+ * @param owner
+ * @return
+ */
+static jstring native_get_decoders(JNIEnv *env, jobject owner) {
+  GST_DEBUG(".");
+  (void) owner;
+  GList *decoders = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_DECODER,
+                                                          GST_RANK_NONE);
+  char *ret_str = "";
+  for (GList *it = decoders; it; it = it->next) {
+    GstElementFactory *el = it->data;
+    GST_DEBUG("element codec: %s\n", GST_OBJECT_NAME(el));
+    char *new_str = malloc(strlen(ret_str) + strlen(GST_OBJECT_NAME(el)) + 4);
+    new_str[0] = '\0';   // ensures the memory is an empty string
+    strcat(new_str, ret_str);
+    strcat(new_str, GST_OBJECT_NAME(el));
+    if (it->next) {
+      strcat(new_str, ",");
+    }
+    ret_str = new_str;
+  }
+  gst_plugin_feature_list_free(decoders);
+  jstring jmessage = (*env)->NewStringUTF(env, ret_str);
+  return jmessage;
+}
+
+/**
+ * @brief Start transmission.
+ * @param env 
+ * @param owner Android Activity 
+ */
+static void native_transmitter_play(JNIEnv *env, jobject owner) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_transmitter_data_field_id);
+  if (ctx) {
+    GST_DEBUG("Set transmitter pipeline to playing");
+    gst_element_set_state(ctx->pipeline, GST_STATE_PLAYING);
+  }
+}
+
+/**
+ * @brief Start stream playback.
+ * @param env 
+ * @param owner Android Activity 
+ */
+static void native_receiver_play(JNIEnv *env, jobject owner) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_receiver_data_field_id);
+  if (ctx) {
+    GST_DEBUG("Set receiver pipeline to playing");
+    gst_element_set_state(ctx->pipeline, GST_STATE_PLAYING);
+  }
+}
+
+/**
+ * @brief Pause stream playback.
+ * @param env 
+ * @param owner Android Activity 
+ */
+static void native_receiver_pause(JNIEnv *env, jobject owner) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_receiver_data_field_id);
+  if (ctx) {
+    gst_element_set_state(ctx->pipeline, GST_STATE_PAUSED);
+  }
+}
+
+/**
+ * Get the local port assigned to the video receiver.
+ * @param env
+ * @param owner Android Activity
+ * @return
+ */
+static int native_receiver_get_port(JNIEnv *env, jobject owner) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_receiver_data_field_id);
+  if (ctx) {
+    return ctx->receiver_port;
+  }
+  return 0;
+}
+
+/**
+ * @brief Pause the stream.
+ * @param env
+ * @param owner Android Activity
+ */
+static void native_transmitter_pause(JNIEnv *env, jobject owner) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA (env, owner, native_transmitter_data_field_id);
+  if (ctx) {
+    GST_DEBUG("Setting state to PAUSED");
+    gst_element_set_state(ctx->pipeline, GST_STATE_PAUSED);
+  }
+}
+
+/**
+ * @brief Must be called before any other functions.
+ * Makes it possible to reference and call functions and objects in the Android class.
+ * @param env
+ * @param klass
+ * @return True if successful.
+ */
+static jboolean native_class_init(JNIEnv *env, jclass klass) {
+  GST_DEBUG(".");
+  native_receiver_data_field_id =
+      (*env)->GetFieldID(env, klass, "native_custom_receiver_data", "J");
+  native_transmitter_data_field_id =
+      (*env)->GetFieldID(env, klass, "native_custom_transmitter_data", "J");
+  log_message_method_id =
+      (*env)->GetMethodID(env, klass, "logGStreamerMessage", "(Ljava/lang/String;)V");
+  on_gstreamer_receiver_initialized_method_id =
+      (*env)->GetMethodID(env, klass, "onGStreamerReceiverInitialized", "()V");
+  on_gstreamer_transmitter_initialized_method_id =
+      (*env)->GetMethodID(env, klass, "onGStreamerTransmitterInitialized", "()V");
+  on_error_method_id =
+      (*env)->GetMethodID(env, klass, "onError", "(Ljava/lang/String;)V");
+  on_state_changed_method_id =
+      (*env)->GetMethodID(env, klass, "onStateChanged", "(I)V");
+  on_color_frame_source_method_id =
+      (*env)->GetMethodID(env, klass, "onSourceColorDetected", "()V");
+  on_first_frame_method_id =
+      (*env)->GetMethodID(env, klass, "onFirstReceivedFrame", "()V");
+  on_transmission_start_method_id =
+      (*env)->GetMethodID(env, klass, "onTransmissionStart", "(J)V");
+  on_mr_object_found_method_id =
+      (*env)->GetMethodID(env, klass, "onMRObjectFound", "()V");
+  register_receiver_fps_method_id =
+      (*env)->GetMethodID(env, klass, "registerReceiverFpsForTime", "(II)V");
+  register_transmitter_fps_method_id =
+      (*env)->GetMethodID(env, klass, "registerTransmitterFpsForTime", "(II)V");
+  register_metadata_found_time_method_id =
+      (*env)->GetMethodID(env, klass, "registerMetadataFoundTime", "(II)V");
+  register_frame_arrival_time_method_id =
+      (*env)->GetMethodID(env, klass, "registerFrameArrivalTime", "(III)V");
+  if (!native_receiver_data_field_id ||
+      !log_message_method_id ||
+      !on_gstreamer_receiver_initialized_method_id ||
+      !on_gstreamer_transmitter_initialized_method_id ||
+      !on_error_method_id ||
+      !on_first_frame_method_id ||
+      !on_mr_object_found_method_id ||
+      !on_color_frame_source_method_id ||
+      !register_receiver_fps_method_id ||
+      !register_transmitter_fps_method_id ||
+      !on_transmission_start_method_id ||
+      !register_frame_arrival_time_method_id ||
+      !register_metadata_found_time_method_id ||
+      !on_state_changed_method_id) {
+    // We emit this message through the Android log
+    // instead of the GStreamer log because the later
+    // has not been initialized yet.
+    GST_ERROR("The calling class does not implement all necessary interface methods");
+    return JNI_FALSE;
+  }
+  return JNI_TRUE;
+}
+
+/**
+ * @brief Start the transmitter pipeline and create all elements int the GStreamer stack.
+ * @param env
+ * @param owner Android Activity
+ * @param dest_host Destination IP address passed as string.
+ * @param dest_port Destination port.
+ * @param stream_format UDP_H264_HW, TCP_H264_SW etc.
+ * @param width Image pixel width.
+ * @param height Image pixel height.
+ * @param bitrate Stream bitrate in Kbit/s.
+ */
+static void native_transmitter_init(JNIEnv *env, jobject owner,
+                                    jstring dest_host, int dest_port, jstring stream_format,
+                                    int width, int height,
+                                    int bitrate, jstring video_file_source) {
+  GST_DEBUG(".");
+  GstContext *ctx = g_new0(GstContext, 1);
+  SET_CUSTOM_DATA(env, owner, native_transmitter_data_field_id, ctx);
+  ctx->video_sink = NULL;
+  ctx->ahcsrc = NULL;
+  ctx->filter = NULL;
+  ctx->encoder = NULL;
+  ctx->native_window = NULL;
+  ctx->app = (*env)->NewGlobalRef(env, owner);
+  ctx->dest_port = dest_port;
+  ctx->stream_format = (*env)->GetStringUTFChars(env, stream_format, 0);
+  ctx->dest_host = (*env)->GetStringUTFChars(env, dest_host, 0);
+  ctx->init_method = on_gstreamer_transmitter_initialized_method_id;
+  ctx->cam_width = width;
+  ctx->cam_height = height;
+  ctx->mr_object_found_sent = 0;
+  ctx->frames_processed_per_time_slice = malloc(sizeof(int64_t) * FPS_TIME_SLICES);
+  if (ctx->frames_processed_per_time_slice) {
+    memset(ctx->frames_processed_per_time_slice, 0, sizeof(int64_t) * FPS_TIME_SLICES);
+  }
+  ctx->bitrate = bitrate;
+  ctx->video_file_source = (*env)->GetStringUTFChars(env, video_file_source, 0);
+  pthread_create(&gst_transmitter_thread, NULL, &transmitter_app_function, ctx);
+}
+
+/**
+ * @brief Map an Android drawing surface to the JNI GStreamer.
+ * @param env
+ * @param owner Android Activity
+ * @param surface Object reference.
+ */
+void native_transmitter_surface_init(JNIEnv *env, jobject owner, jobject surface) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_transmitter_data_field_id);
+  if (ctx) {
+    ANativeWindow *new_native_window = ANativeWindow_fromSurface(env, surface);
+    if (ctx->native_window) {
+      ANativeWindow_release(ctx->native_window);
+      if (ctx->native_window == new_native_window) {
+        if (ctx->video_sink) {
+          gst_video_overlay_expose(GST_VIDEO_OVERLAY(ctx->video_sink));
+        }
+        return;
+      }
+      ctx->initialized = FALSE;
+    }
+    ctx->native_window = new_native_window;
+    check_initialization_complete(ctx);
+  }
+}
+
+/**
+ * @brief Called when the surface is removed from the view.
+ * @param env
+ * @param owner Android Activity
+ */
+static void native_transmitter_surface_finalize(JNIEnv *env, jobject owner) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_transmitter_data_field_id);
+  if (ctx) {
+    if (ctx->video_sink) {
+      gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(ctx->video_sink), NULL);
+      gst_element_set_state(ctx->pipeline, GST_STATE_READY);
+    }
+    ANativeWindow_release(ctx->native_window);
+    ctx->native_window = NULL;
+    ctx->initialized = FALSE;
+  }
+}
+
+/**
+ * @brief Map an Android drawing surface to the JNI GStreamer.
+ * @param env
+ * @param owner Android Activity
+ * @param surface Object reference.
+ */
+static void native_receiver_surface_init(JNIEnv *env, jobject owner, jobject surface) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_receiver_data_field_id);
+  if (ctx) {
+    ANativeWindow *new_native_window = ANativeWindow_fromSurface(env, surface);
+    if (ctx->native_window) {
+      ANativeWindow_release(ctx->native_window);
+      if (ctx->native_window == new_native_window) {
+        if (ctx->video_sink) {
+          gst_video_overlay_expose(GST_VIDEO_OVERLAY(ctx->video_sink));
+        }
+        return;
+      }
+      ctx->initialized = FALSE;
+    }
+    ctx->native_window = new_native_window;
+    check_initialization_complete(ctx);
+  }
+}
+
+/**
+ * @brief Called when the surface is removed from the view.
+ * @param env
+ * @param owner Android Activity
+ */
+static void native_receiver_surface_finalize(JNIEnv *env, jobject owner) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_receiver_data_field_id);
+  if (ctx) {
+    if (ctx->video_sink) {
+      gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(ctx->video_sink), NULL);
+      gst_element_set_state(ctx->pipeline, GST_STATE_READY);
+    }
+    ANativeWindow_release(ctx->native_window);
+    ctx->native_window = NULL;
+    ctx->initialized = FALSE;
+  }
+}
+
+/**
+ * @brief Set camera resolution. This will also set the transmission video's resolution.
+ * @param env
+ * @param owner Android Activity
+ * @param width Width in pixels.
+ * @param height Height in pixels.
+ */
+void native_camera_set_resolution(JNIEnv *env, jobject owner, jint width, jint height) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_transmitter_data_field_id);
+  if (ctx && ctx->filter) {
+    gst_element_set_state(ctx->pipeline, GST_STATE_READY);
+    GstCaps *new_caps = gst_caps_new_simple(
+        "video/x-raw",
+        "width", G_TYPE_INT, width,
+        "height", G_TYPE_INT, height,
+        NULL);
+    g_object_set(
+        ctx->filter,
+        "caps", new_caps,
+        NULL);
+    gst_caps_unref(new_caps);
+    gst_element_set_state(ctx->pipeline, GST_STATE_PAUSED);
+  }
+}
+
+/**
+ * @brief Adjust white balance transform.
+ * @param env
+ * @param owner Android Activity
+ * @param wb_mode Index 0-8 for [AUTO, DAYLIGHT, CLOUDY_DAYLIGHT, TWILIGHT, INCANDESCENT,
+ *                FLUORESCENT, MANUAL, WARM_FLUORESCENT, SHADE]
+ */
+void native_camera_set_white_balance(JNIEnv *env, jobject owner, jint wb_mode) {
+#if (GST_VERSION_MINOR < 17)
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_transmitter_data_field_id);
+  if (ctx) {
+    GST_DEBUG("Setting WB_MODE (%d)", wb_mode);
+    if (ctx->ahcsrc) {
+      g_object_set(ctx->ahcsrc, GST_PHOTOGRAPHY_PROP_WB_MODE, wb_mode, NULL);
+    }
+  }
+#endif
+}
+
+/**
+ * @brief Enable or disable camera's auto focus..
+ * @param env
+ * @param owner Android Activity
+ * @param enabled True or false, enabled or disabled.
+ */
+void native_camera_set_auto_focus(JNIEnv *env, jobject owner, jboolean enabled) {
+#if (GST_VERSION_MINOR < 17)
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_transmitter_data_field_id);
+  if (ctx) {
+    GST_DEBUG("Setting Autofocus (%d)", enabled);
+    if (ctx->ahcsrc) {
+      gst_photography_set_autofocus(GST_PHOTOGRAPHY(ctx->ahcsrc), enabled);
+    }
+  }
+#endif
+}
+
+/**
+ * @brief Set if and how the camera image should be rotated.
+ * @param env
+ * @param owner Android Activity
+ * @param method Index 0-8 for [NONE,CLOCKWISE,ROTATE_180,COUNTERCLOCKWISE,
+ *               HORIZONTAL_FLIP,VERTICAL_FLIP,UPPER_LEFT_DIAGONAL,UPPER_RIGHT_DIAGONAL,AUTOMATIC]
+ */
+void native_camera_set_rotate_method(JNIEnv *env, jobject owner, jint method) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_transmitter_data_field_id);
+  if (ctx) {
+    g_object_set(ctx->video_sink, "rotate-method", method, NULL);
+  }
+}
+
+/**
+ * @brief Set camera encoder's bitrate.
+ * @param env
+ * @param owner Android Activity
+ * @param bitrate Bitrate in Kbit
+ */
+void native_transmitter_set_bitrate(JNIEnv *env, jobject owner, jint bitrate) {
+  GST_DEBUG(".");
+  GstContext *ctx = GET_CUSTOM_DATA(env, owner, native_transmitter_data_field_id);
+  if (!ctx) {
+    return;
+  }
+  ctx->bitrate = bitrate;
+  if (ctx->encoder) {
+    g_object_set(ctx->encoder, "bitrate", bitrate, NULL);
+  }
+}
+
+/**
+ * @brief List of implemented native methods.
+ * Maps a C function to a Java function in the Activity.
+ */
+static JNINativeMethod native_methods[] = {
+    {"nativeTransmitterInit",
+        "(Ljava/lang/String;ILjava/lang/String;IIILjava/lang/String;)V",
+        (void *) native_transmitter_init},
+    {"nativeTransmitterSurfaceInit",
+        "(Ljava/lang/Object;)V",
+        (void *) native_transmitter_surface_init},
+    {"nativeTransmitterSurfaceFinalize",
+        "()V",
+        (void *) native_transmitter_surface_finalize},
+    {"nativeTransmitterFinalize",
+        "()V",
+        (void *) native_transmitter_finalize},
+    {"nativeTransmitterPlay",
+        "()V",
+        (void *) native_transmitter_play},
+    {"nativeTransmitterPause",
+        "()V",
+        (void *) native_transmitter_pause},
+    {"nativeCameraSetResolution",
+        "(II)V",
+        (void *) native_camera_set_resolution},
+    {"nativeCameraSetRotateMethod",
+        "(I)V",
+        (void *) native_camera_set_rotate_method},
+    {"nativeCameraSetWhiteBalance",
+        "(I)V",
+        (void *) native_camera_set_white_balance},
+    {"nativeTransmitterSetBitrate",
+        "(I)V",
+        (void *) native_transmitter_set_bitrate},
+    {"nativeCameraSetAutoFocus",
+        "(Z)V",
+        (void *) native_camera_set_auto_focus},
+    {"nativeReceiverInit",
+        "(Ljava/lang/String;Ljava/lang/String;I)V",
+        (void *) native_receiver_init},
+    {"nativeReceiverSurfaceInit",
+        "(Ljava/lang/Object;)V",
+        (void *) native_receiver_surface_init},
+    {"nativeReceiverSurfaceFinalize",
+        "()V",
+        (void *) native_receiver_surface_finalize},
+    {"nativeReceiverFinalize",
+        "()V",
+        (void *) native_receiver_finalize},
+    {"nativeReceiverPlay",
+        "()V",
+        (void *) native_receiver_play},
+    {"nativeReceiverGetPort",
+        "()I",
+        (void *) native_receiver_get_port},
+    {"nativeReceiverPause",
+        "()V",
+        (void *) native_receiver_pause},
+    {"nativeGetTransmitterFps",
+        "()V",
+        (void *) native_get_transmitter_fps},
+    {"nativeGetMetadataFoundTimes",
+        "()V",
+        (void *) native_get_metadata_found_times},
+    {"nativeGetFrameArrivalTimes",
+        "()V",
+        (void *) native_get_frame_arrival_times},
+    {"nativeGetReceiverFps",
+        "()V",
+        (void *) native_get_receiver_fps},
+    {"nativeClassInit",
+        "()Z",
+        (void *) native_class_init},
+    {"nativeGetEncoders",
+        "()Ljava/lang/String;",
+        (void *) native_get_encoders},
+    {"nativeGetDecoders",
+        "()Ljava/lang/String;",
+        (void *) native_get_decoders}
+};
+
+
+/**
+ * @brief JNI_OnLoad
+ * Library initializer
+ */
+jint JNI_OnLoad(JavaVM *vm, void *reserved) {
+  gst_debug_set_default_threshold(GST_LEVEL_ERROR);
+  GST_DEBUG_CATEGORY_INIT(debug_category, "gstmredge", 0, "Android GST");
+  GST_DEBUG(".");
+  (void) reserved;
+  JNIEnv *env = NULL;
+  java_vm = vm;
+  if ((*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_4) != JNI_OK) {
+    GST_ERROR("Could not retrieve JNIEnv");
+    return 0;
+  }
+  jclass klass = (*env)->FindClass(env, "se/liu/mrleo/EdgeActivity");
+  (*env)->RegisterNatives(env, klass, native_methods, G_N_ELEMENTS(native_methods));
+  pthread_key_create(&current_jni_env, detach_current_thread);
+  return JNI_VERSION_1_4;
+
+}
diff --git a/app/res/layout/activity_about.xml b/app/res/layout/activity_about.xml
new file mode 100644
index 0000000..577e415
--- /dev/null
+++ b/app/res/layout/activity_about.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/textView"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="60dp"
+        android:focusableInTouchMode="true"
+        android:minHeight="80dp"
+        android:text="Mixed Reality using Edge Computing"
+        android:textAlignment="center"
+        android:textAppearance="?android:attr/textAppearanceLarge"
+        />
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="15dp"
+        android:gravity="center"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:text="@string/about_text"
+        android:id="@+id/textView2"
+        android:layout_below="@+id/textView"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentStart="true"/>
+
+    <Button
+        android:id="@+id/backbutton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Back"
+        />
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/app/res/layout/activity_arcore.xml b/app/res/layout/activity_arcore.xml
new file mode 100644
index 0000000..d00dc56
--- /dev/null
+++ b/app/res/layout/activity_arcore.xml
@@ -0,0 +1,45 @@
+<!--
+   Copyright 2018 Google Inc.
+
+   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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    >
+
+    <!--
+        android:layout_width="640px"
+        android:layout_height="480px"
+  -->
+    <android.opengl.GLSurfaceView
+        android:id="@+id/surfaceview"
+
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:layout_gravity="top"/>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <Button
+            android:id="@+id/clear_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:ems="1"
+            android:text="@string/clear_button_string"/>
+
+    </LinearLayout>
+</RelativeLayout>
diff --git a/app/res/layout/activity_edge.xml b/app/res/layout/activity_edge.xml
new file mode 100644
index 0000000..46b9130
--- /dev/null
+++ b/app/res/layout/activity_edge.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/root"
+    android:background="@color/colorBlack"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_marginBottom="0px"
+    android:gravity="center_horizontal"
+    android:orientation="horizontal">
+
+    <se.liu.mrleo.edge.streaming.GStreamerSurfaceView
+        android:id="@+id/gstreamer_receiver_surfaceview"
+        android:layout_width="wrap_content"
+        android:layout_alignParentStart="true"
+        android:layout_height="match_parent"
+        />
+
+    <SurfaceView
+        android:id="@+id/receiver_surface_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_alignParentStart="true"
+        android:visibility="gone" />
+
+    <ImageView
+        android:id="@+id/receiver_image_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_alignParentStart="true"
+        android:visibility="gone" />
+
+    <SurfaceView
+        android:id="@+id/rtp_lib_camera_surface"
+        android:layout_width="200dp"
+        android:layout_height="150dp"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentBottom="true"
+        android:visibility="gone" />
+
+    <se.liu.mrleo.edge.streaming.GStreamerSurfaceView
+        android:forceHasOverlappingRendering="true"
+        android:id="@+id/gstreamer_camera_surfaceview"
+        android:elevation="100dp"
+        android:layout_width="200dp"
+        android:layout_height="150dp"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentBottom="true"
+        android:visibility="gone" />
+
+    <TextureView
+        android:id="@+id/camera_textureview"
+        android:layout_width="200dp"
+        android:layout_height="150dp"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentBottom="true"
+        android:visibility="gone" />
+
+    <android.support.v7.widget.Toolbar
+        android:id="@+id/toolbar"
+        android:layout_width="70dp"
+        android:background="@color/colorDarkGrey"
+        android:layout_height="?attr/actionBarSize"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentTop="true" />
+
+    <Button
+        android:id="@+id/action_button_a"
+        android:layout_width="70dp"
+        android:layout_height="30dp"
+        android:layout_marginTop="15dp"
+        android:layout_alignParentEnd="true"
+        android:layout_below="@id/toolbar"
+        android:textColor="@color/colorWhite"
+        android:background="@color/colorDarkGreen"
+        android:text="Add" />
+
+    <Button
+        android:id="@+id/action_button_b"
+        android:layout_width="70dp"
+        android:layout_height="30dp"
+        android:layout_marginTop="15dp"
+        android:layout_below="@id/action_button_a"
+        android:layout_alignParentEnd="true"
+        android:textColor="@color/colorWhite"
+        android:background="@color/colorDarkRed"
+        android:text="Remove" />
+
+    <Button
+        android:id="@+id/exit_edge_button"
+        android:layout_width="70dp"
+        android:layout_height="30dp"
+        android:layout_alignParentEnd="true"
+        android:layout_marginTop="15dp"
+        android:layout_below="@id/action_button_b"
+        android:background="@color/colorDarkBlue"
+        android:text="Exit"
+        android:textColor="@color/colorWhite" />
+
+</RelativeLayout>
diff --git a/app/res/layout/activity_main.xml b/app/res/layout/activity_main.xml
new file mode 100644
index 0000000..36c3c95
--- /dev/null
+++ b/app/res/layout/activity_main.xml
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/root"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center_horizontal">
+
+    <LinearLayout
+        android:id="@+id/left_column"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_marginLeft="10sp"
+        android:layout_marginRight="10sp"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/topheader"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10sp"
+            android:layout_marginBottom="20sp"
+            android:maxWidth="220sp"
+            android:text="Mixed Reality"
+            android:textAlignment="center"
+            android:textSize="35sp" />
+
+        <TextView
+            android:id="@+id/subheader"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="20sp"
+            android:text="On the Edge"
+            android:textAlignment="center"
+            android:textSize="30sp" />
+
+        <Button
+            android:id="@+id/edge_button"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:height="30sp"
+            android:text="Start Edge MR"
+            android:textSize="20sp" />
+
+        <Button
+            android:id="@+id/edge_video_button"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:height="30sp"
+            android:text="Start Video MR"
+            android:textSize="20sp" />
+
+        <Button
+            android:id="@+id/arcore_button"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:height="30sp"
+            android:text="Start ARCore MR"
+            android:textSize="20sp" />
+
+        <RelativeLayout
+            android:id="@+id/lowerbuttons"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center_horizontal"
+            android:padding="0dp">
+
+            <Button
+                android:id="@+id/reset_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentStart="true"
+                android:height="30sp"
+                android:text="@string/reset"
+                android:textSize="20sp" />
+
+            <Button
+                android:id="@+id/about_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignBottom="@+id/reset_button"
+                android:layout_alignParentEnd="true"
+                android:height="30sp"
+                android:text="@string/about_app"
+                android:textSize="20sp"
+                tools:ignore="RelativeOverlap"
+                tools:visibility="visible" />
+        </RelativeLayout>
+    </LinearLayout>
+
+    <Button
+        android:id="@+id/center_column"
+        android:layout_width="2dp"
+        android:layout_height="match_parent"
+        android:layout_toEndOf="@id/left_column"
+        android:background="#888"
+        android:orientation="vertical" />
+
+    <TableLayout
+        android:id="@+id/right_column"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_centerVertical="true"
+        android:layout_marginLeft="10sp"
+        android:layout_toEndOf="@id/center_column"
+        android:orientation="vertical">
+
+        <TableRow
+            android:id="@+id/edge_device_address"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10sp"
+            android:gravity="start"
+            android:padding="0dp">
+
+            <LinearLayout
+                android:id="@+id/edge_device_address_left_column"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+
+                <TextView
+                    android:id="@+id/edge_server_host_header"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:ems="10"
+                    android:text="@string/edge_device_ip_address" />
+
+                <EditText
+                    android:id="@+id/edge_server_host_input"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:digits="0123456789."
+                    android:text=""
+                    tools:ignore="LabelFor,TextFields" />
+
+            </LinearLayout>
+
+            <LinearLayout
+                android:id="@+id/edge_device_address_right_column"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="0sp"
+                android:layout_marginEnd="10sp"
+                android:orientation="vertical">
+
+                <TextView
+                    android:id="@+id/edge_server_port_header"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:ems="10"
+                    android:text="@string/edge_device_port_number" />
+
+                <EditText
+                    android:id="@+id/edge_server_port_input"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:ems="10"
+                    android:inputType="number"
+                    android:text=""
+                    tools:ignore="LabelFor" />
+            </LinearLayout>
+        </TableRow>
+
+        <TableRow>
+
+            <TextView
+                android:id="@+id/end_device_transmission_header"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_span="2"
+                android:ems="10"
+                android:text="@string/end_device_transmission_method" />
+        </TableRow>
+
+        <TableRow>
+
+            <Spinner
+                android:id="@+id/end_device_transmission"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_span="2"
+                android:spinnerMode="dialog" />
+        </TableRow>
+
+        <TableRow>
+
+            <TextView
+                android:id="@+id/edge_device_transmission_header"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_span="2"
+                android:ems="10"
+                android:text="@string/edge_device_transmission_method" />
+        </TableRow>
+
+        <TableRow>
+
+            <Spinner
+                android:id="@+id/edge_device_transmission"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_span="2"
+                android:spinnerMode="dialog" />
+        </TableRow>
+
+        <TableRow
+            android:id="@+id/bitrates"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="start">
+
+            <LinearLayout
+                android:id="@+id/bitrates_left_column"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+
+                <TextView
+                    android:id="@+id/end_device_bitrate_header"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:ems="10"
+                    android:text="@string/end_device_bitrate" />
+
+                <EditText
+                    android:id="@+id/end_device_bitrate_input"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:ems="10"
+                    android:inputType="number"
+                    android:text=""
+                    tools:ignore="LabelFor" />
+            </LinearLayout>
+
+            <LinearLayout
+                android:id="@+id/bitrates_right_column"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+
+                <TextView
+                    android:id="@+id/edge_device_bitrate_header"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:ems="10"
+                    android:text="@string/edge_device_bitrate" />
+
+                <EditText
+                    android:id="@+id/edge_device_bitrate_input"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:ems="10"
+                    android:inputType="number"
+                    android:text=""
+                    tools:ignore="LabelFor" />
+            </LinearLayout>
+
+        </TableRow>
+
+
+        <TableRow
+            android:id="@+id/checkboxes"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="start"
+            android:padding="0dp">
+
+            <CheckBox
+                android:id="@+id/end_device_use_jitterbuffer"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:ems="10"
+                android:text="@string/end_device_use_jitterbuffer" />
+
+            <CheckBox
+                android:id="@+id/edge_device_use_jitterbuffer"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:ems="10"
+                android:text="@string/edge_device_use_jitterbuffer" />
+        </TableRow>
+    </TableLayout>
+</RelativeLayout>
\ No newline at end of file
diff --git a/app/res/menu/main.xml b/app/res/menu/main.xml
new file mode 100644
index 0000000..9ed4d29
--- /dev/null
+++ b/app/res/menu/main.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2016 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.
+-->
+<menu
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <item
+        android:id="@+id/about"
+        android:title="@string/about_app"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/server_settings"
+        android:title="@string/server_settings"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/jpeg_stream"
+        android:title="@string/jpeg_stream_disable"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/video_stream"
+        android:title="@string/video_stream_disable"
+        app:showAsAction="never"/>
+    
+    <item
+        android:id="@+id/switch_camera"
+        android:title="@string/switch_camera"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/capture_size"
+        android:title="@string/select_image_size"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/bitrate_in"
+        android:title="@string/receiver_bitrate"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/bitrate_out"
+        android:title="@string/transmitter_bitrate"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/receiver_stream_format"
+        android:title="@string/receiver_stream_format"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/transmitter_stream_format"
+        android:title="@string/transmitter_stream_format"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/packetsize"
+        android:title="@string/udp_packet_size"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/focus_mode"
+        android:title="@string/auto_focus_enabled"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/ar_object"
+        android:title="@string/select_ar_object"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/calibration_mode"
+        android:title="@string/enter_calibration_mode"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/debug_mode"
+        android:title="@string/debug_mode_enable"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/remove_calibration"
+        android:title="@string/remove_calibration"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/flash_mode"
+        android:title="@string/flash_enable"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/camera_preview"
+        android:title="@string/camera_preview_hide"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/write_benchmark_to_file"
+        android:title="@string/write_benchmark_to_file"
+        app:showAsAction="never"/>
+
+    <item
+        android:id="@+id/button_size"
+        android:title="@string/button_size_increase"
+        app:showAsAction="never"/>
+
+</menu>
diff --git a/app/res/values/colors.xml b/app/res/values/colors.xml
new file mode 100644
index 0000000..66e18d1
--- /dev/null
+++ b/app/res/values/colors.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="colorPrimary">#FF00FF</color>
+    <color name="colorPrimaryDark">#880088</color>
+    <color name="colorAccent">#FF4081</color>
+    <color name="colorDarkGreen">#008800</color>
+    <color name="colorDarkGrey">#888888</color>
+    <color name="colorDarkRed">#880000</color>
+    <color name="colorWhite">#FFFFFF</color>
+    <color name="colorBlack">#000000</color>
+    <color name="colorDarkBlue">#000088</color>
+    <color name="black_overlay">#66000000</color>
+</resources>
diff --git a/app/res/values/strings.xml b/app/res/values/strings.xml
new file mode 100644
index 0000000..b2403d3
--- /dev/null
+++ b/app/res/values/strings.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- EDGE -->
+    <string name="app_name">MR-Leo</string>
+    <string name="dummy_button">Dummy Button</string>
+    <string name="dummy_content">DUMMY\nCONTENT</string>
+    <string name="permission_camera_not_granted">The app need access to the camera to work.</string>
+    <string name="permission_storage_not_granted">The app needs permission to read external storage.</string>
+    <string name="picture_taken">Picture taken</string>
+    <string name="select_image_size">Select image size</string>
+    <string name="receiver_bitrate">Receiving video bitrate</string>
+    <string name="transmitter_bitrate">Transmitting video bitrate</string>
+    <string name="about_app">About</string>
+    <string name="about_title">About</string>
+    <string name="switch_camera">Switch camera</string>
+    <string name="zoom_controls_hide">Hide zoom controls</string>
+    <string name="zoom_controls_display">Display zoom controls</string>
+    <string name="camera_preview_hide">Hide camera preview</string>
+    <string name="camera_preview_display">Display camera preview</string>
+    <string name="auto_focus_enabled">Auto Focus enabled</string>
+    <string name="auto">Auto</string>
+    <string name="auto_focus_disabled">Auto Focus disabled</string>
+    <string name="remove_calibration">Remove stored camera calibration</string>
+    <string name="enter_calibration_mode">Enter camera calibration mode</string>
+    <string name="leave_calibration_mode">Leave camera calibration mode</string>
+    <string name="calibration_needed">Important! Calibration needed.</string>
+    <string name="flash_enable">Enable flashlight</string>
+    <string name="flash_disable">Disable flashlight</string>
+    <string name="jpeg_stream_enable">Enable JPEG stream</string>
+    <string name="jpeg_stream_disable">Disable JPEG stream</string>
+    <string name="video_stream_enable">Enable Video stream</string>
+    <string name="video_stream_disable">Disable Video stream</string>
+    <string name="switch_to_tcp">Switch to TCP</string>
+    <string name="switch_to_udp">Switch to UDP</string>
+    <string name="select_ar_object">Select AR object</string>
+    <string name="server_settings">Connection settings</string>
+    <string name="server_settings_description">Set address and port for the Edge Node.</string>
+    <string name="address">Address</string>
+    <string name="port">Port</string>
+    <string name="debug_mode_enable">Enter debug mode</string>
+    <string name="debug_mode_disable">Leave debug mode</string>
+    <string name="receiver_stream_format">Receiving:</string>
+    <string name="transmitter_stream_format">Transmitting:</string>
+    <string name="udp_packet_size">UDP packet size</string>
+    <string name="start_record">Start record</string>
+    <string name="start_button">Start</string>
+    <string name="switch_camera_button">Switch camera</string>
+    <string name="stop_button">Stop</string>
+    <string name="hint_rtsp">rtsp://123.123.123.123:12345</string>
+    <string name="hint_rtp">rtsp://192.1688.123.123:12345</string>
+    <string name="stop_record">Stop record</string>
+    <string name="button_play">Play</string>
+    <string name="button_stop">Stop</string>
+    <string name="button_size_increase">Increase button size</string>
+    <string name="button_size_decrease">Decrease button size</string>
+    <string name="select_encoder">Select encoder</string>
+    <string name="select_decoder">Select decoder</string>
+    <string name="write_benchmark_to_file">Write benchmark to file</string>
+    <!-- Strings used in Snackbar messages -->
+    <string name="arcore_unavailable">Please install ARCore.</string>
+    <string name="arcore_too_old">Please update ARCore.</string>
+    <string name="arcore_sdk_too_old">Please update the app with a newer version of the ARCore SDK.</string>
+    <string name="arcore_exception">This device does not support ARCore.</string>
+    <string name="camera_unavailable">Camera unavailable. Please restart the app.</string>
+    <string name="dismiss">Dismiss</string>
+    <string name="clear_button_string">X</string>
+
+    <string name="reset">Reset</string>
+    <string name="about_text">Johan Lindqvist\n\njohan.lindqvist@gmail.com\n\nhttp://github.com/johanokl\n\n© 2019</string>
+    <string name="edge_device_transmission_method">The edge device\'s method for image transmission.</string>
+    <string name="end_device_transmission_method">The end device\'s method for image transmission.</string>
+    <string name="edge_device_port_number">Edge node port numbe:</string>
+    <string name="edge_device_ip_address">Edge node IP address:</string>
+    <string name="end_device_bitrate">End device\'s bitrate (Kbit/s).</string>
+    <string name="edge_device_bitrate">Edge device\'s bitrate (Kbit/s).</string>
+    <string name="edge_device_use_jitterbuffer">Prevent UDP jitter on edge device (server).</string>
+    <string name="end_device_use_jitterbuffer">Prevent UDP jitter on (this) end device.</string>
+
+</resources>
diff --git a/app/res/values/styles.xml b/app/res/values/styles.xml
new file mode 100644
index 0000000..4d14935
--- /dev/null
+++ b/app/res/values/styles.xml
@@ -0,0 +1,12 @@
+<resources>
+    <!-- Base application theme. -->
+    <style name="FullscreenTheme" parent="Theme.AppCompat.Light.NoActionBar">
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowActionBar">false</item>
+        <item name="android:windowFullscreen">true</item>
+
+        <item name="colorPrimary">@color/colorPrimary</item>
+        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="colorAccent">@color/colorAccent</item>
+    </style>
+</resources>
diff --git a/app/src/arcore/examples/java/common/helpers/DisplayRotationHelper.java b/app/src/arcore/examples/java/common/helpers/DisplayRotationHelper.java
new file mode 100755
index 0000000..29805e7
--- /dev/null
+++ b/app/src/arcore/examples/java/common/helpers/DisplayRotationHelper.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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 arcore.examples.java.common.helpers;
+
+import android.app.Activity;
+import android.content.Context;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.DisplayManager.DisplayListener;
+import android.view.Display;
+import android.view.WindowManager;
+
+import com.google.ar.core.Session;
+
+/**
+ * Helper to track the display rotations. In particular, the 180 degree rotations are not notified
+ * by the onSurfaceChanged() callback, and thus they require listening to the android display
+ * events.
+ */
+public final class DisplayRotationHelper implements DisplayListener {
+  private boolean viewportChanged;
+  private int viewportWidth;
+  private int viewportHeight;
+  private final Context context;
+  private final Display display;
+
+  /**
+   * Constructs the DisplayRotationHelper but does not register the listener yet.
+   *
+   * @param context the Android {@link Context}.
+   */
+  public DisplayRotationHelper(Context context) {
+    this.context = context;
+    display = context.getSystemService(WindowManager.class).getDefaultDisplay();
+  }
+
+  /** Registers the display listener. Should be called from {@link Activity#onResume()}. */
+  public void onResume() {
+    context.getSystemService(DisplayManager.class).registerDisplayListener(this, null);
+  }
+
+  /** Unregisters the display listener. Should be called from {@link Activity#onPause()}. */
+  public void onPause() {
+    context.getSystemService(DisplayManager.class).unregisterDisplayListener(this);
+  }
+
+  /**
+   * Records a change in surface dimensions. This will be later used by {@link
+   * #updateSessionIfNeeded(Session)}. Should be called from {@link
+   * android.opengl.GLSurfaceView.Renderer
+   * #onSurfaceChanged(javax.microedition.khronos.opengles.GL10, int, int)}.
+   *
+   * @param width the updated width of the surface.
+   * @param height the updated height of the surface.
+   */
+  public void onSurfaceChanged(int width, int height) {
+    viewportWidth = width;
+    viewportHeight = height;
+    viewportChanged = true;
+  }
+
+  /**
+   * Updates the session display geometry if a change was posted either by {@link
+   * #onSurfaceChanged(int, int)} call or by {@link #onDisplayChanged(int)} system callback. This
+   * function should be called explicitly before each call to {@link Session#update()}. This
+   * function will also clear the 'pending update' (viewportChanged) flag.
+   *
+   * @param session the {@link Session} object to update if display geometry changed.
+   */
+  public void updateSessionIfNeeded(Session session) {
+    if (viewportChanged) {
+      int displayRotation = display.getRotation();
+      session.setDisplayGeometry(displayRotation, viewportWidth, viewportHeight);
+      viewportChanged = false;
+    }
+  }
+
+  /**
+   * Returns the current rotation state of android display. Same as {@link Display#getRotation()}.
+   */
+  public int getRotation() {
+    return display.getRotation();
+  }
+
+  @Override
+  public void onDisplayAdded(int displayId) {}
+
+  @Override
+  public void onDisplayRemoved(int displayId) {}
+
+  @Override
+  public void onDisplayChanged(int displayId) {
+    viewportChanged = true;
+  }
+}
diff --git a/app/src/arcore/examples/java/common/helpers/FullScreenHelper.java b/app/src/arcore/examples/java/common/helpers/FullScreenHelper.java
new file mode 100755
index 0000000..d095d93
--- /dev/null
+++ b/app/src/arcore/examples/java/common/helpers/FullScreenHelper.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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 arcore.examples.java.common.helpers;
+
+import android.app.Activity;
+import android.view.View;
+import android.view.WindowManager;
+
+/** Helper to set up the Android full screen mode. */
+public final class FullScreenHelper {
+  /**
+   * Sets the Android fullscreen flags. Expected to be called from {@link
+   * Activity#onWindowFocusChanged(boolean hasFocus)}.
+   *
+   * @param activity the Activity on which the full screen mode will be set.
+   * @param hasFocus the hasFocus flag passed from the {@link Activity#onWindowFocusChanged(boolean
+   *     hasFocus)} callback.
+   */
+  public static void setFullScreenOnWindowFocusChanged(Activity activity, boolean hasFocus) {
+    if (hasFocus) {
+      // https://developer.android.com/training/system-ui/immersive.html#sticky
+      activity
+          .getWindow()
+          .getDecorView()
+          .setSystemUiVisibility(
+              View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+                  | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+                  | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                  | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+                  | View.SYSTEM_UI_FLAG_FULLSCREEN
+                  | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+      activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+    }
+  }
+}
diff --git a/app/src/arcore/examples/java/common/helpers/PermissionHelper.java b/app/src/arcore/examples/java/common/helpers/PermissionHelper.java
new file mode 100755
index 0000000..d1c8258
--- /dev/null
+++ b/app/src/arcore/examples/java/common/helpers/PermissionHelper.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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 arcore.examples.java.common.helpers;
+
+import android.Manifest;
+import android.app.Activity;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.provider.Settings;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
+
+/**
+ * Helper to ask camera permission.
+ */
+public final class PermissionHelper {
+  public static final int CAMERA_PERMISSION_CODE = 0;
+  public static final int STORAGE_PERMISSION_CODE = 1;
+  private static final String CAMERA_PERMISSION = Manifest.permission.CAMERA;
+  private static final String READ_EXTERNAL_STORAGE = Manifest.permission.READ_EXTERNAL_STORAGE;
+  private static final String WRITE_EXTERNAL_STORAGE = Manifest.permission.WRITE_EXTERNAL_STORAGE;
+
+  /**
+   * Check to see we have the necessary permissions for this app.
+   */
+  public static boolean hasCameraPermission(Activity activity) {
+    return ContextCompat.checkSelfPermission(activity, CAMERA_PERMISSION)
+        == PackageManager.PERMISSION_GRANTED;
+  }
+
+  public static boolean hasStoragePermission(Activity activity) {
+    return ContextCompat.checkSelfPermission(activity, READ_EXTERNAL_STORAGE)
+            == PackageManager.PERMISSION_GRANTED &&
+        ContextCompat.checkSelfPermission(activity, WRITE_EXTERNAL_STORAGE)
+            == PackageManager.PERMISSION_GRANTED;
+  }
+
+  /**
+   * Check to see we have the necessary permissions for this app, and ask for them if we don't.
+   */
+  public static void requestCameraPermission(Activity activity) {
+    ActivityCompat.requestPermissions(
+        activity, new String[]{CAMERA_PERMISSION}, CAMERA_PERMISSION_CODE);
+  }
+
+  /**
+   * Check to see we have the necessary permissions for this app, and ask for them if we don't.
+   */
+  public static void requestStoragePermission(Activity activity) {
+    ActivityCompat.requestPermissions(
+        activity, new String[]{READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
+  }
+
+
+  /**
+   * Check to see if we need to show the rationale for this permission.
+   */
+  public static boolean shouldShowRequestPermissionRationale(Activity activity) {
+    return ActivityCompat.shouldShowRequestPermissionRationale(activity, CAMERA_PERMISSION);
+  }
+
+  /**
+   * Launch Application Setting to grant permission.
+   */
+  public static void launchPermissionSettings(Activity activity) {
+    Intent intent = new Intent();
+    intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+    intent.setData(Uri.fromParts("package", activity.getPackageName(), null));
+    activity.startActivity(intent);
+  }
+}
diff --git a/app/src/arcore/examples/java/common/helpers/SnackbarHelper.java b/app/src/arcore/examples/java/common/helpers/SnackbarHelper.java
new file mode 100755
index 0000000..9e80eae
--- /dev/null
+++ b/app/src/arcore/examples/java/common/helpers/SnackbarHelper.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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 arcore.examples.java.common.helpers;
+
+import android.app.Activity;
+import android.support.design.widget.BaseTransientBottomBar;
+import android.support.design.widget.Snackbar;
+import android.view.View;
+
+/**
+ * Helper to manage the sample snackbar. Hides the Android boilerplate code, and exposes simpler
+ * methods.
+ */
+public final class SnackbarHelper {
+  private static final int BACKGROUND_COLOR = 0xbf323232;
+  private Snackbar messageSnackbar;
+  private enum DismissBehavior { HIDE, SHOW, FINISH };
+
+  public boolean isShowing() {
+    return messageSnackbar != null;
+  }
+
+  /** Shows a snackbar with a given message. */
+  public void showMessage(Activity activity, String message) {
+    show(activity, message, DismissBehavior.HIDE);
+  }
+
+  /** Shows a snackbar with a given message, and a dismiss button. */
+  public void showMessageWithDismiss(Activity activity, String message) {
+    show(activity, message, DismissBehavior.SHOW);
+  }
+
+  /**
+   * Shows a snackbar with a given error message. When dismissed, will finish the activity. Useful
+   * for notifying errors, where no further interaction with the activity is possible.
+   */
+  public void showError(Activity activity, String errorMessage) {
+    show(activity, errorMessage, DismissBehavior.FINISH);
+  }
+
+  /**
+   * Hides the currently showing snackbar, if there is one. Safe to call from any thread. Safe to
+   * call even if snackbar is not shown.
+   */
+  public void hide(Activity activity) {
+    activity.runOnUiThread(
+        new Runnable() {
+          @Override
+          public void run() {
+            if (messageSnackbar != null) {
+              messageSnackbar.dismiss();
+            }
+            messageSnackbar = null;
+          }
+        });
+  }
+
+  private void show(
+      final Activity activity, final String message, final DismissBehavior dismissBehavior) {
+    activity.runOnUiThread(
+        new Runnable() {
+          @Override
+          public void run() {
+            messageSnackbar =
+                Snackbar.make(
+                    activity.findViewById(android.R.id.content),
+                    message,
+                    Snackbar.LENGTH_INDEFINITE);
+            messageSnackbar.getView().setBackgroundColor(BACKGROUND_COLOR);
+            if (dismissBehavior != DismissBehavior.HIDE) {
+              messageSnackbar.setAction(
+                  "Dismiss",
+                  new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                      messageSnackbar.dismiss();
+                    }
+                  });
+              if (dismissBehavior == DismissBehavior.FINISH) {
+                messageSnackbar.addCallback(
+                    new BaseTransientBottomBar.BaseCallback<Snackbar>() {
+                      @Override
+                      public void onDismissed(Snackbar transientBottomBar, int event) {
+                        super.onDismissed(transientBottomBar, event);
+                        activity.finish();
+                      }
+                    });
+              }
+            }
+            messageSnackbar.show();
+          }
+        });
+  }
+}
diff --git a/app/src/arcore/examples/java/common/helpers/TapHelper.java b/app/src/arcore/examples/java/common/helpers/TapHelper.java
new file mode 100755
index 0000000..a47abd2
--- /dev/null
+++ b/app/src/arcore/examples/java/common/helpers/TapHelper.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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 arcore.examples.java.common.helpers;
+
+import android.content.Context;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.View.OnTouchListener;
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+
+/**
+ * Helper to detect taps using Android GestureDetector, and pass the taps between UI thread and
+ * render thread.
+ */
+public final class TapHelper implements OnTouchListener {
+  private final GestureDetector gestureDetector;
+  private final BlockingQueue<MotionEvent> queuedSingleTaps = new ArrayBlockingQueue<>(16);
+
+  /**
+   * Creates the tap helper.
+   *
+   * @param context the application's context.
+   */
+  public TapHelper(Context context) {
+    gestureDetector =
+        new GestureDetector(
+            context,
+            new GestureDetector.SimpleOnGestureListener() {
+              @Override
+              public boolean onSingleTapUp(MotionEvent e) {
+                // Queue tap if there is space. Tap is lost if queue is full.
+                queuedSingleTaps.offer(e);
+                return true;
+              }
+
+              @Override
+              public boolean onDown(MotionEvent e) {
+                return true;
+              }
+            });
+  }
+
+  /**
+   * Polls for a tap.
+   *
+   * @return if a tap was queued, a MotionEvent for the tap. Otherwise null if no taps are queued.
+   */
+  public MotionEvent poll() {
+    return queuedSingleTaps.poll();
+  }
+
+  @Override
+  public boolean onTouch(View view, MotionEvent motionEvent) {
+    return gestureDetector.onTouchEvent(motionEvent);
+  }
+}
diff --git a/app/src/arcore/examples/java/common/rendering/BackgroundRenderer.java b/app/src/arcore/examples/java/common/rendering/BackgroundRenderer.java
new file mode 100755
index 0000000..6075f6a
--- /dev/null
+++ b/app/src/arcore/examples/java/common/rendering/BackgroundRenderer.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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 arcore.examples.java.common.rendering;
+
+import android.app.Activity;
+import android.content.Context;
+import android.opengl.GLES11Ext;
+import android.opengl.GLES20;
+import android.support.annotation.GuardedBy;
+import android.widget.Toast;
+
+import com.google.ar.core.Frame;
+import com.google.ar.core.Session;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+import java.util.HashMap;
+
+/**
+ * This class renders the AR background from camera feed. It creates and hosts the texture given to
+ * ARCore to be filled with the camera image.
+ */
+public class BackgroundRenderer {
+  private static final String TAG = BackgroundRenderer.class.getSimpleName();
+
+  // Shader names.
+  private static final String VERTEX_SHADER_NAME = "shaders/screenquad.vert";
+  private static final String FRAGMENT_SHADER_NAME = "shaders/screenquad.frag";
+
+  private static final int COORDS_PER_VERTEX = 3;
+  private static final int TEXCOORDS_PER_VERTEX = 2;
+  private static final int FLOAT_SIZE = 4;
+
+  private FloatBuffer quadVertices;
+  private FloatBuffer quadTexCoord;
+  private FloatBuffer quadTexCoordTransformed;
+
+  private int quadProgram;
+
+  private int quadPositionParam;
+  private int quadTexCoordParam;
+  private int textureId = -1;
+
+  private Activity callingActivity;
+
+  public BackgroundRenderer(Activity activity) {callingActivity = activity; }
+
+  public int getTextureId() {
+    return textureId;
+  }
+
+  /**
+   * Allocates and initializes OpenGL resources needed by the background renderer. Must be called on
+   * the OpenGL thread..
+   *
+   * @param context Needed to access shader source.
+   */
+  public void createOnGlThread(Context context) throws IOException {
+    // Generate the background texture.
+    int[] textures = new int[1];
+    GLES20.glGenTextures(1, textures, 0);
+    textureId = textures[0];
+    int textureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES;
+    GLES20.glBindTexture(textureTarget, textureId);
+    GLES20.glTexParameteri(textureTarget, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
+    GLES20.glTexParameteri(textureTarget, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
+    GLES20.glTexParameteri(textureTarget, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
+    GLES20.glTexParameteri(textureTarget, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
+
+    int numVertices = 4;
+
+    ByteBuffer bbVertices = ByteBuffer.allocateDirect(QUAD_COORDS.length * FLOAT_SIZE);
+    bbVertices.order(ByteOrder.nativeOrder());
+    quadVertices = bbVertices.asFloatBuffer();
+    quadVertices.put(QUAD_COORDS);
+    quadVertices.position(0);
+
+    ByteBuffer bbTexCoords =
+        ByteBuffer.allocateDirect(numVertices * TEXCOORDS_PER_VERTEX * FLOAT_SIZE);
+    bbTexCoords.order(ByteOrder.nativeOrder());
+    quadTexCoord = bbTexCoords.asFloatBuffer();
+    quadTexCoord.put(QUAD_TEXCOORDS);
+    quadTexCoord.position(0);
+
+    ByteBuffer bbTexCoordsTransformed =
+        ByteBuffer.allocateDirect(numVertices * TEXCOORDS_PER_VERTEX * FLOAT_SIZE);
+    bbTexCoordsTransformed.order(ByteOrder.nativeOrder());
+    quadTexCoordTransformed = bbTexCoordsTransformed.asFloatBuffer();
+
+    int vertexShader =
+        ShaderUtil.loadGLShader(TAG, context, GLES20.GL_VERTEX_SHADER, VERTEX_SHADER_NAME);
+    int fragmentShader =
+        ShaderUtil.loadGLShader(TAG, context, GLES20.GL_FRAGMENT_SHADER, FRAGMENT_SHADER_NAME);
+
+    quadProgram = GLES20.glCreateProgram();
+    GLES20.glAttachShader(quadProgram, vertexShader);
+    GLES20.glAttachShader(quadProgram, fragmentShader);
+    GLES20.glLinkProgram(quadProgram);
+    GLES20.glUseProgram(quadProgram);
+
+    ShaderUtil.checkGLError(TAG, "Program creation");
+
+    quadPositionParam = GLES20.glGetAttribLocation(quadProgram, "a_Position");
+    quadTexCoordParam = GLES20.glGetAttribLocation(quadProgram, "a_TexCoord");
+
+    ShaderUtil.checkGLError(TAG, "Program parameters");
+  }
+
+  private long starttime = 0;
+  private int frames = -1;
+
+  // Lock needed for synchronization.
+  private final Object logFpsLock = new Object();
+  @GuardedBy("logFpsLock")
+  private HashMap<Integer, Integer> mFps = new HashMap<>();
+
+
+  private void storeFrame() {
+    if (starttime == 0) {
+      starttime = System.nanoTime();
+    }
+    synchronized (logFpsLock) {
+      int second = (int) ((System.nanoTime() - starttime) / 1000000000);
+      mFps.put(second, (mFps.containsKey(second) ? mFps.get(second) : 0) + 1);
+    }
+  }
+
+
+  public int getFrames(int second) {
+    synchronized (logFpsLock) {
+      return mFps.containsKey(second) ? mFps.get(second) : 0;
+    }
+  }
+
+
+  /**
+   * Draws the AR background image. The image will be drawn such that virtual content rendered with
+   * the matrices provided by {@link com.google.ar.core.Camera#getViewMatrix(float[], int)} and
+   * {@link com.google.ar.core.Camera#getProjectionMatrix(float[], int, float, float)} will
+   * accurately follow static physical objects. This must be called <b>before</b> drawing virtual
+   * content.
+   *
+   * @param frame The last {@code Frame} returned by {@link Session#update()}.
+   */
+  public void draw(Frame frame) {
+    storeFrame();
+    // If display rotation changed (also includes view size change), we need to re-query the uv
+    // coordinates for the screen rect, as they may have changed as well.
+    if (frame.hasDisplayGeometryChanged()) {
+      //noinspection deprecation
+      frame.transformDisplayUvCoords(quadTexCoord, quadTexCoordTransformed);
+    }
+
+    // No need to test or write depth, the screen quad has arbitrary depth, and is expected
+    // to be drawn first.
+    GLES20.glDisable(GLES20.GL_DEPTH_TEST);
+    GLES20.glDepthMask(false);
+
+    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureId);
+
+    GLES20.glUseProgram(quadProgram);
+
+    // Set the vertex positions.
+    GLES20.glVertexAttribPointer(
+        quadPositionParam, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, 0, quadVertices);
+
+    // Set the texture coordinates.
+    GLES20.glVertexAttribPointer(
+        quadTexCoordParam,
+        TEXCOORDS_PER_VERTEX,
+        GLES20.GL_FLOAT,
+        false,
+        0,
+        quadTexCoordTransformed);
+
+    // Enable vertex arrays
+    GLES20.glEnableVertexAttribArray(quadPositionParam);
+    GLES20.glEnableVertexAttribArray(quadTexCoordParam);
+
+    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
+
+    // Disable vertex arrays
+    GLES20.glDisableVertexAttribArray(quadPositionParam);
+    GLES20.glDisableVertexAttribArray(quadTexCoordParam);
+
+    // Restore the depth state for further drawing.
+    GLES20.glDepthMask(true);
+    GLES20.glEnable(GLES20.GL_DEPTH_TEST);
+
+    ShaderUtil.checkGLError(TAG, "Draw");
+  }
+
+  private static final float[] QUAD_COORDS =
+      new float[] {
+        -1.0f, -1.0f, 0.0f, -1.0f, +1.0f, 0.0f, +1.0f, -1.0f, 0.0f, +1.0f, +1.0f, 0.0f,
+      };
+
+  private static final float[] QUAD_TEXCOORDS =
+      new float[] {
+        0.0f, 1.0f,
+        0.0f, 0.0f,
+        1.0f, 1.0f,
+        1.0f, 0.0f,
+      };
+}
diff --git a/app/src/arcore/examples/java/common/rendering/ObjectRenderer.java b/app/src/arcore/examples/java/common/rendering/ObjectRenderer.java
new file mode 100755
index 0000000..4eacadf
--- /dev/null
+++ b/app/src/arcore/examples/java/common/rendering/ObjectRenderer.java
@@ -0,0 +1,381 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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 arcore.examples.java.common.rendering;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.opengl.GLES20;
+import android.opengl.GLUtils;
+import android.opengl.Matrix;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+import java.nio.ShortBuffer;
+
+import de.javagl.obj.Obj;
+import de.javagl.obj.ObjData;
+import de.javagl.obj.ObjReader;
+import de.javagl.obj.ObjUtils;
+
+/** Renders an object loaded from an OBJ file in OpenGL. */
+public class ObjectRenderer {
+  private static final String TAG = ObjectRenderer.class.getSimpleName();
+
+  /**
+   * Blend mode.
+   *
+   * @see #setBlendMode(BlendMode)
+   */
+  public enum BlendMode {
+    /** Multiplies the destination color by the source alpha. */
+    Shadow,
+    /** Normal alpha blending. */
+    Grid
+  }
+
+  // Shader names.
+  private static final String VERTEX_SHADER_NAME = "shaders/object.vert";
+  private static final String FRAGMENT_SHADER_NAME = "shaders/object.frag";
+
+  private static final int COORDS_PER_VERTEX = 3;
+
+  // Note: the last component must be zero to avoid applying the translational part of the matrix.
+  private static final float[] LIGHT_DIRECTION = new float[] {0.250f, 0.866f, 0.433f, 0.0f};
+  private final float[] viewLightDirection = new float[4];
+
+  // Object vertex buffer variables.
+  private int vertexBufferId;
+  private int verticesBaseAddress;
+  private int texCoordsBaseAddress;
+  private int normalsBaseAddress;
+  private int indexBufferId;
+  private int indexCount;
+
+  private int program;
+  private final int[] textures = new int[1];
+
+  // Shader location: model view projection matrix.
+  private int modelViewUniform;
+  private int modelViewProjectionUniform;
+
+  // Shader location: object attributes.
+  private int positionAttribute;
+  private int normalAttribute;
+  private int texCoordAttribute;
+
+  // Shader location: texture sampler.
+  private int textureUniform;
+
+  // Shader location: environment properties.
+  private int lightingParametersUniform;
+
+  // Shader location: material properties.
+  private int materialParametersUniform;
+
+  // Shader location: color correction property
+  private int colorCorrectionParameterUniform;
+
+  private BlendMode blendMode = null;
+
+  // Temporary matrices allocated here to reduce number of allocations for each frame.
+  private final float[] modelMatrix = new float[16];
+  private final float[] modelViewMatrix = new float[16];
+  private final float[] modelViewProjectionMatrix = new float[16];
+
+  // Set some default material properties to use for lighting.
+  private float ambient = 0.3f;
+  private float diffuse = 1.0f;
+  private float specular = 1.0f;
+  private float specularPower = 6.0f;
+
+  public ObjectRenderer() {}
+
+  /**
+   * Creates and initializes OpenGL resources needed for rendering the model.
+   *
+   * @param context Context for loading the shader and below-named model and texture assets.
+   * @param objAssetName Name of the OBJ file containing the model geometry.
+   * @param diffuseTextureAssetName Name of the PNG file containing the diffuse texture map.
+   */
+  public void createOnGlThread(Context context, String objAssetName, String diffuseTextureAssetName)
+      throws IOException {
+    final int vertexShader =
+        ShaderUtil.loadGLShader(TAG, context, GLES20.GL_VERTEX_SHADER, VERTEX_SHADER_NAME);
+    final int fragmentShader =
+        ShaderUtil.loadGLShader(TAG, context, GLES20.GL_FRAGMENT_SHADER, FRAGMENT_SHADER_NAME);
+
+    program = GLES20.glCreateProgram();
+    GLES20.glAttachShader(program, vertexShader);
+    GLES20.glAttachShader(program, fragmentShader);
+    GLES20.glLinkProgram(program);
+    GLES20.glUseProgram(program);
+
+    ShaderUtil.checkGLError(TAG, "Program creation");
+
+    modelViewUniform = GLES20.glGetUniformLocation(program, "u_ModelView");
+    modelViewProjectionUniform = GLES20.glGetUniformLocation(program, "u_ModelViewProjection");
+
+    positionAttribute = GLES20.glGetAttribLocation(program, "a_Position");
+    normalAttribute = GLES20.glGetAttribLocation(program, "a_Normal");
+    texCoordAttribute = GLES20.glGetAttribLocation(program, "a_TexCoord");
+
+    textureUniform = GLES20.glGetUniformLocation(program, "u_Texture");
+
+    lightingParametersUniform = GLES20.glGetUniformLocation(program, "u_LightingParameters");
+    materialParametersUniform = GLES20.glGetUniformLocation(program, "u_MaterialParameters");
+    colorCorrectionParameterUniform =
+        GLES20.glGetUniformLocation(program, "u_ColorCorrectionParameters");
+
+    ShaderUtil.checkGLError(TAG, "Program parameters");
+
+    // Read the texture.
+    Bitmap textureBitmap =
+        BitmapFactory.decodeStream(context.getAssets().open(diffuseTextureAssetName));
+
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
+    GLES20.glGenTextures(textures.length, textures, 0);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
+
+    GLES20.glTexParameteri(
+        GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR_MIPMAP_LINEAR);
+    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
+    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, textureBitmap, 0);
+    GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
+
+    textureBitmap.recycle();
+
+    ShaderUtil.checkGLError(TAG, "Texture loading");
+
+    // Read the obj file.
+    InputStream objInputStream = context.getAssets().open(objAssetName);
+    Obj obj = ObjReader.read(objInputStream);
+
+    // Prepare the Obj so that its structure is suitable for
+    // rendering with OpenGL:
+    // 1. Triangulate it
+    // 2. Make sure that texture coordinates are not ambiguous
+    // 3. Make sure that normals are not ambiguous
+    // 4. Convert it to single-indexed data
+    obj = ObjUtils.convertToRenderable(obj);
+
+    // OpenGL does not use Java arrays. ByteBuffers are used instead to provide data in a format
+    // that OpenGL understands.
+
+    // Obtain the data from the OBJ, as direct buffers:
+    IntBuffer wideIndices = ObjData.getFaceVertexIndices(obj, 3);
+    FloatBuffer vertices = ObjData.getVertices(obj);
+    FloatBuffer texCoords = ObjData.getTexCoords(obj, 2);
+    FloatBuffer normals = ObjData.getNormals(obj);
+
+    // Convert int indices to shorts for GL ES 2.0 compatibility
+    ShortBuffer indices =
+        ByteBuffer.allocateDirect(2 * wideIndices.limit())
+            .order(ByteOrder.nativeOrder())
+            .asShortBuffer();
+    while (wideIndices.hasRemaining()) {
+      indices.put((short) wideIndices.get());
+    }
+    indices.rewind();
+
+    int[] buffers = new int[2];
+    GLES20.glGenBuffers(2, buffers, 0);
+    vertexBufferId = buffers[0];
+    indexBufferId = buffers[1];
+
+    // Load vertex buffer
+    verticesBaseAddress = 0;
+    texCoordsBaseAddress = verticesBaseAddress + 4 * vertices.limit();
+    normalsBaseAddress = texCoordsBaseAddress + 4 * texCoords.limit();
+    final int totalBytes = normalsBaseAddress + 4 * normals.limit();
+
+    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBufferId);
+    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, totalBytes, null, GLES20.GL_STATIC_DRAW);
+    GLES20.glBufferSubData(
+        GLES20.GL_ARRAY_BUFFER, verticesBaseAddress, 4 * vertices.limit(), vertices);
+    GLES20.glBufferSubData(
+        GLES20.GL_ARRAY_BUFFER, texCoordsBaseAddress, 4 * texCoords.limit(), texCoords);
+    GLES20.glBufferSubData(
+        GLES20.GL_ARRAY_BUFFER, normalsBaseAddress, 4 * normals.limit(), normals);
+    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
+
+    // Load index buffer
+    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBufferId);
+    indexCount = indices.limit();
+    GLES20.glBufferData(
+        GLES20.GL_ELEMENT_ARRAY_BUFFER, 2 * indexCount, indices, GLES20.GL_STATIC_DRAW);
+    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
+
+    ShaderUtil.checkGLError(TAG, "OBJ buffer load");
+
+    Matrix.setIdentityM(modelMatrix, 0);
+  }
+
+  /**
+   * Selects the blending mode for rendering.
+   *
+   * @param blendMode The blending mode. Null indicates no blending (opaque rendering).
+   */
+  public void setBlendMode(BlendMode blendMode) {
+    this.blendMode = blendMode;
+  }
+
+  /**
+   * Updates the object model matrix and applies scaling.
+   *
+   * @param modelMatrix A 4x4 model-to-world transformation matrix, stored in column-major order.
+   * @param scaleFactor A separate scaling factor to apply before the {@code modelMatrix}.
+   * @see Matrix
+   */
+  public void updateModelMatrix(float[] modelMatrix, float scaleFactor) {
+    float[] scaleMatrix = new float[16];
+    Matrix.setIdentityM(scaleMatrix, 0);
+    scaleMatrix[0] = scaleFactor;
+    scaleMatrix[5] = scaleFactor;
+    scaleMatrix[10] = scaleFactor;
+    Matrix.multiplyMM(this.modelMatrix, 0, modelMatrix, 0, scaleMatrix, 0);
+  }
+
+  /**
+   * Sets the surface characteristics of the rendered model.
+   *
+   * @param ambient Intensity of non-directional surface illumination.
+   * @param diffuse Diffuse (matte) surface reflectivity.
+   * @param specular Specular (shiny) surface reflectivity.
+   * @param specularPower Surface shininess. Larger values result in a smaller, sharper specular
+   *     highlight.
+   */
+  public void setMaterialProperties(
+      float ambient, float diffuse, float specular, float specularPower) {
+    this.ambient = ambient;
+    this.diffuse = diffuse;
+    this.specular = specular;
+    this.specularPower = specularPower;
+  }
+
+  /**
+   * Draws the model.
+   *
+   * @param cameraView A 4x4 view matrix, in column-major order.
+   * @param cameraPerspective A 4x4 projection matrix, in column-major order.
+   * @param colorCorrectionRgba Illumination intensity. Combined with diffuse and specular material
+   *     properties.
+   * @see #setBlendMode(BlendMode)
+   * @see #updateModelMatrix(float[], float)
+   * @see #setMaterialProperties(float, float, float, float)
+   * @see Matrix
+   */
+  public void draw(float[] cameraView, float[] cameraPerspective, float[] colorCorrectionRgba) {
+
+    ShaderUtil.checkGLError(TAG, "Before draw");
+
+    // Build the ModelView and ModelViewProjection matrices
+    // for calculating object position and light.
+    Matrix.multiplyMM(modelViewMatrix, 0, cameraView, 0, modelMatrix, 0);
+    Matrix.multiplyMM(modelViewProjectionMatrix, 0, cameraPerspective, 0, modelViewMatrix, 0);
+
+    GLES20.glUseProgram(program);
+
+    // Set the lighting environment properties.
+    Matrix.multiplyMV(viewLightDirection, 0, modelViewMatrix, 0, LIGHT_DIRECTION, 0);
+    normalizeVec3(viewLightDirection);
+    GLES20.glUniform4f(
+        lightingParametersUniform,
+        viewLightDirection[0],
+        viewLightDirection[1],
+        viewLightDirection[2],
+        1.f);
+
+    GLES20.glUniform4f(
+        colorCorrectionParameterUniform,
+        colorCorrectionRgba[0],
+        colorCorrectionRgba[1],
+        colorCorrectionRgba[2],
+        colorCorrectionRgba[3]);
+
+    // Set the object material properties.
+    GLES20.glUniform4f(materialParametersUniform, ambient, diffuse, specular, specularPower);
+
+    // Attach the object texture.
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
+    GLES20.glUniform1i(textureUniform, 0);
+
+    // Set the vertex attributes.
+    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBufferId);
+
+    GLES20.glVertexAttribPointer(
+        positionAttribute, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, 0, verticesBaseAddress);
+    GLES20.glVertexAttribPointer(normalAttribute, 3, GLES20.GL_FLOAT, false, 0, normalsBaseAddress);
+    GLES20.glVertexAttribPointer(
+        texCoordAttribute, 2, GLES20.GL_FLOAT, false, 0, texCoordsBaseAddress);
+
+    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
+
+    // Set the ModelViewProjection matrix in the shader.
+    GLES20.glUniformMatrix4fv(modelViewUniform, 1, false, modelViewMatrix, 0);
+    GLES20.glUniformMatrix4fv(modelViewProjectionUniform, 1, false, modelViewProjectionMatrix, 0);
+
+    // Enable vertex arrays
+    GLES20.glEnableVertexAttribArray(positionAttribute);
+    GLES20.glEnableVertexAttribArray(normalAttribute);
+    GLES20.glEnableVertexAttribArray(texCoordAttribute);
+
+    if (blendMode != null) {
+      GLES20.glDepthMask(false);
+      GLES20.glEnable(GLES20.GL_BLEND);
+      switch (blendMode) {
+        case Shadow:
+          // Multiplicative blending function for Shadow.
+          GLES20.glBlendFunc(GLES20.GL_ZERO, GLES20.GL_ONE_MINUS_SRC_ALPHA);
+          break;
+        case Grid:
+          // Grid, additive blending function.
+          GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
+          break;
+      }
+    }
+
+    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBufferId);
+    GLES20.glDrawElements(GLES20.GL_TRIANGLES, indexCount, GLES20.GL_UNSIGNED_SHORT, 0);
+    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
+
+    if (blendMode != null) {
+      GLES20.glDisable(GLES20.GL_BLEND);
+      GLES20.glDepthMask(true);
+    }
+
+    // Disable vertex arrays
+    GLES20.glDisableVertexAttribArray(positionAttribute);
+    GLES20.glDisableVertexAttribArray(normalAttribute);
+    GLES20.glDisableVertexAttribArray(texCoordAttribute);
+
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
+
+    ShaderUtil.checkGLError(TAG, "After draw");
+  }
+
+  private static void normalizeVec3(float[] v) {
+    float reciprocalLength = 1.0f / (float) Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
+    v[0] *= reciprocalLength;
+    v[1] *= reciprocalLength;
+    v[2] *= reciprocalLength;
+  }
+}
diff --git a/app/src/arcore/examples/java/common/rendering/PlaneRenderer.java b/app/src/arcore/examples/java/common/rendering/PlaneRenderer.java
new file mode 100755
index 0000000..849c026
--- /dev/null
+++ b/app/src/arcore/examples/java/common/rendering/PlaneRenderer.java
@@ -0,0 +1,448 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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 arcore.examples.java.common.rendering;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.opengl.GLES20;
+import android.opengl.GLSurfaceView;
+import android.opengl.GLUtils;
+import android.opengl.Matrix;
+
+import com.google.ar.core.Camera;
+import com.google.ar.core.Plane;
+import com.google.ar.core.Pose;
+import com.google.ar.core.TrackingState;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+import java.nio.ShortBuffer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/** Renders the detected AR planes. */
+public class PlaneRenderer {
+  private static final String TAG = PlaneRenderer.class.getSimpleName();
+
+  // Shader names.
+  private static final String VERTEX_SHADER_NAME = "shaders/plane.vert";
+  private static final String FRAGMENT_SHADER_NAME = "shaders/plane.frag";
+
+  private static final int BYTES_PER_FLOAT = Float.SIZE / 8;
+  private static final int BYTES_PER_SHORT = Short.SIZE / 8;
+  private static final int COORDS_PER_VERTEX = 3; // x, z, alpha
+
+  private static final int VERTS_PER_BOUNDARY_VERT = 2;
+  private static final int INDICES_PER_BOUNDARY_VERT = 3;
+  private static final int INITIAL_BUFFER_BOUNDARY_VERTS = 64;
+
+  private static final int INITIAL_VERTEX_BUFFER_SIZE_BYTES =
+      BYTES_PER_FLOAT * COORDS_PER_VERTEX * VERTS_PER_BOUNDARY_VERT * INITIAL_BUFFER_BOUNDARY_VERTS;
+
+  private static final int INITIAL_INDEX_BUFFER_SIZE_BYTES =
+      BYTES_PER_SHORT
+          * INDICES_PER_BOUNDARY_VERT
+          * INDICES_PER_BOUNDARY_VERT
+          * INITIAL_BUFFER_BOUNDARY_VERTS;
+
+  private static final float FADE_RADIUS_M = 0.25f;
+  private static final float DOTS_PER_METER = 10.0f;
+  private static final float EQUILATERAL_TRIANGLE_SCALE = (float) (1 / Math.sqrt(3));
+
+  // Using the "signed distance field" approach to render sharp lines and circles.
+  // {dotThreshold, lineThreshold, lineFadeSpeed, occlusionScale}
+  // dotThreshold/lineThreshold: red/green intensity above which dots/lines are present
+  // lineFadeShrink:  lines will fade in between alpha = 1-(1/lineFadeShrink) and 1.0
+  // occlusionShrink: occluded planes will fade out between alpha = 0 and 1/occlusionShrink
+  private static final float[] GRID_CONTROL = {0.2f, 0.4f, 2.0f, 1.5f};
+
+  private int planeProgram;
+  private final int[] textures = new int[1];
+
+  private int planeXZPositionAlphaAttribute;
+
+  private int planeModelUniform;
+  private int planeNormalUniform;
+  private int planeModelViewProjectionUniform;
+  private int textureUniform;
+  private int lineColorUniform;
+  private int dotColorUniform;
+  private int gridControlUniform;
+  private int planeUvMatrixUniform;
+
+  private FloatBuffer vertexBuffer =
+      ByteBuffer.allocateDirect(INITIAL_VERTEX_BUFFER_SIZE_BYTES)
+          .order(ByteOrder.nativeOrder())
+          .asFloatBuffer();
+  private ShortBuffer indexBuffer =
+      ByteBuffer.allocateDirect(INITIAL_INDEX_BUFFER_SIZE_BYTES)
+          .order(ByteOrder.nativeOrder())
+          .asShortBuffer();
+
+  // Temporary lists/matrices allocated here to reduce number of allocations for each frame.
+  private final float[] modelMatrix = new float[16];
+  private final float[] modelViewMatrix = new float[16];
+  private final float[] modelViewProjectionMatrix = new float[16];
+  private final float[] planeColor = new float[4];
+  private final float[] planeAngleUvMatrix =
+      new float[4]; // 2x2 rotation matrix applied to uv coords.
+
+  private final Map<Plane, Integer> planeIndexMap = new HashMap<>();
+
+  public PlaneRenderer() {}
+
+  /**
+   * Allocates and initializes OpenGL resources needed by the plane renderer. Must be called on the
+   * OpenGL thread, typically in {@link GLSurfaceView.Renderer#onSurfaceCreated(GL10, EGLConfig)}.
+   *
+   * @param context Needed to access shader source and texture PNG.
+   * @param gridDistanceTextureName Name of the PNG file containing the grid texture.
+   */
+  public void createOnGlThread(Context context, String gridDistanceTextureName) throws IOException {
+    int vertexShader =
+        ShaderUtil.loadGLShader(TAG, context, GLES20.GL_VERTEX_SHADER, VERTEX_SHADER_NAME);
+    int passthroughShader =
+        ShaderUtil.loadGLShader(TAG, context, GLES20.GL_FRAGMENT_SHADER, FRAGMENT_SHADER_NAME);
+
+    planeProgram = GLES20.glCreateProgram();
+    GLES20.glAttachShader(planeProgram, vertexShader);
+    GLES20.glAttachShader(planeProgram, passthroughShader);
+    GLES20.glLinkProgram(planeProgram);
+    GLES20.glUseProgram(planeProgram);
+
+    ShaderUtil.checkGLError(TAG, "Program creation");
+
+    // Read the texture.
+    Bitmap textureBitmap =
+        BitmapFactory.decodeStream(context.getAssets().open(gridDistanceTextureName));
+
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
+    GLES20.glGenTextures(textures.length, textures, 0);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
+
+    GLES20.glTexParameteri(
+        GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR_MIPMAP_LINEAR);
+    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
+    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, textureBitmap, 0);
+    GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
+
+    ShaderUtil.checkGLError(TAG, "Texture loading");
+
+    planeXZPositionAlphaAttribute = GLES20.glGetAttribLocation(planeProgram, "a_XZPositionAlpha");
+
+    planeModelUniform = GLES20.glGetUniformLocation(planeProgram, "u_Model");
+    planeNormalUniform = GLES20.glGetUniformLocation(planeProgram, "u_Normal");
+    planeModelViewProjectionUniform =
+        GLES20.glGetUniformLocation(planeProgram, "u_ModelViewProjection");
+    textureUniform = GLES20.glGetUniformLocation(planeProgram, "u_Texture");
+    lineColorUniform = GLES20.glGetUniformLocation(planeProgram, "u_lineColor");
+    dotColorUniform = GLES20.glGetUniformLocation(planeProgram, "u_dotColor");
+    gridControlUniform = GLES20.glGetUniformLocation(planeProgram, "u_gridControl");
+    planeUvMatrixUniform = GLES20.glGetUniformLocation(planeProgram, "u_PlaneUvMatrix");
+
+    ShaderUtil.checkGLError(TAG, "Program parameters");
+  }
+
+  /** Updates the plane model transform matrix and extents. */
+  private void updatePlaneParameters(
+      float[] planeMatrix, float extentX, float extentZ, FloatBuffer boundary) {
+    System.arraycopy(planeMatrix, 0, modelMatrix, 0, 16);
+    if (boundary == null) {
+      vertexBuffer.limit(0);
+      indexBuffer.limit(0);
+      return;
+    }
+
+    // Generate a new set of vertices and a corresponding triangle strip index set so that
+    // the plane boundary polygon has a fading edge. This is done by making a copy of the
+    // boundary polygon vertices and scaling it down around center to push it inwards. Then
+    // the index buffer is setup accordingly.
+    boundary.rewind();
+    int boundaryVertices = boundary.limit() / 2;
+    int numVertices;
+    int numIndices;
+
+    numVertices = boundaryVertices * VERTS_PER_BOUNDARY_VERT;
+    // drawn as GL_TRIANGLE_STRIP with 3n-2 triangles (n-2 for fill, 2n for perimeter).
+    numIndices = boundaryVertices * INDICES_PER_BOUNDARY_VERT;
+
+    if (vertexBuffer.capacity() < numVertices * COORDS_PER_VERTEX) {
+      int size = vertexBuffer.capacity();
+      while (size < numVertices * COORDS_PER_VERTEX) {
+        size *= 2;
+      }
+      vertexBuffer =
+          ByteBuffer.allocateDirect(BYTES_PER_FLOAT * size)
+              .order(ByteOrder.nativeOrder())
+              .asFloatBuffer();
+    }
+    vertexBuffer.rewind();
+    vertexBuffer.limit(numVertices * COORDS_PER_VERTEX);
+
+    if (indexBuffer.capacity() < numIndices) {
+      int size = indexBuffer.capacity();
+      while (size < numIndices) {
+        size *= 2;
+      }
+      indexBuffer =
+          ByteBuffer.allocateDirect(BYTES_PER_SHORT * size)
+              .order(ByteOrder.nativeOrder())
+              .asShortBuffer();
+    }
+    indexBuffer.rewind();
+    indexBuffer.limit(numIndices);
+
+    // Note: when either dimension of the bounding box is smaller than 2*FADE_RADIUS_M we
+    // generate a bunch of 0-area triangles.  These don't get rendered though so it works
+    // out ok.
+    float xScale = Math.max((extentX - 2 * FADE_RADIUS_M) / extentX, 0.0f);
+    float zScale = Math.max((extentZ - 2 * FADE_RADIUS_M) / extentZ, 0.0f);
+
+    while (boundary.hasRemaining()) {
+      float x = boundary.get();
+      float z = boundary.get();
+      vertexBuffer.put(x);
+      vertexBuffer.put(z);
+      vertexBuffer.put(0.0f);
+      vertexBuffer.put(x * xScale);
+      vertexBuffer.put(z * zScale);
+      vertexBuffer.put(1.0f);
+    }
+
+    // step 1, perimeter
+    indexBuffer.put((short) ((boundaryVertices - 1) * 2));
+    for (int i = 0; i < boundaryVertices; ++i) {
+      indexBuffer.put((short) (i * 2));
+      indexBuffer.put((short) (i * 2 + 1));
+    }
+    indexBuffer.put((short) 1);
+    // This leaves us on the interior edge of the perimeter between the inset vertices
+    // for boundary verts n-1 and 0.
+
+    // step 2, interior:
+    for (int i = 1; i < boundaryVertices / 2; ++i) {
+      indexBuffer.put((short) ((boundaryVertices - 1 - i) * 2 + 1));
+      indexBuffer.put((short) (i * 2 + 1));
+    }
+    if (boundaryVertices % 2 != 0) {
+      indexBuffer.put((short) ((boundaryVertices / 2) * 2 + 1));
+    }
+  }
+
+  private void draw(float[] cameraView, float[] cameraPerspective, float[] planeNormal) {
+    // Build the ModelView and ModelViewProjection matrices
+    // for calculating cube position and light.
+    Matrix.multiplyMM(modelViewMatrix, 0, cameraView, 0, modelMatrix, 0);
+    Matrix.multiplyMM(modelViewProjectionMatrix, 0, cameraPerspective, 0, modelViewMatrix, 0);
+
+    // Set the position of the plane
+    vertexBuffer.rewind();
+    GLES20.glVertexAttribPointer(
+        planeXZPositionAlphaAttribute,
+        COORDS_PER_VERTEX,
+        GLES20.GL_FLOAT,
+        false,
+        BYTES_PER_FLOAT * COORDS_PER_VERTEX,
+        vertexBuffer);
+
+    // Set the Model and ModelViewProjection matrices in the shader.
+    GLES20.glUniformMatrix4fv(planeModelUniform, 1, false, modelMatrix, 0);
+    GLES20.glUniform3f(planeNormalUniform, planeNormal[0], planeNormal[1], planeNormal[2]);
+    GLES20.glUniformMatrix4fv(
+        planeModelViewProjectionUniform, 1, false, modelViewProjectionMatrix, 0);
+
+    indexBuffer.rewind();
+    GLES20.glDrawElements(
+        GLES20.GL_TRIANGLE_STRIP, indexBuffer.limit(), GLES20.GL_UNSIGNED_SHORT, indexBuffer);
+    ShaderUtil.checkGLError(TAG, "Drawing plane");
+  }
+
+  static class SortablePlane {
+    final float distance;
+    final Plane plane;
+
+    SortablePlane(float distance, Plane plane) {
+      this.distance = distance;
+      this.plane = plane;
+    }
+  }
+
+  /**
+   * Draws the collection of tracked planes, with closer planes hiding more distant ones.
+   *
+   * @param allPlanes The collection of planes to draw.
+   * @param cameraPose The pose of the camera, as returned by {@link Camera#getPose()}
+   * @param cameraPerspective The projection matrix, as returned by {@link
+   *     Camera#getProjectionMatrix(float[], int, float, float)}
+   */
+  public void drawPlanes(Collection<Plane> allPlanes, Pose cameraPose, float[] cameraPerspective) {
+    // Planes must be sorted by distance from camera so that we draw closer planes first, and
+    // they occlude the farther planes.
+    List<SortablePlane> sortedPlanes = new ArrayList<>();
+
+    for (Plane plane : allPlanes) {
+      if (plane.getTrackingState() != TrackingState.TRACKING || plane.getSubsumedBy() != null) {
+        continue;
+      }
+
+      float distance = calculateDistanceToPlane(plane.getCenterPose(), cameraPose);
+      if (distance < 0) { // Plane is back-facing.
+        continue;
+      }
+      sortedPlanes.add(new SortablePlane(distance, plane));
+    }
+    Collections.sort(
+        sortedPlanes,
+        new Comparator<SortablePlane>() {
+          @Override
+          public int compare(SortablePlane a, SortablePlane b) {
+            return Float.compare(a.distance, b.distance);
+          }
+        });
+
+    float[] cameraView = new float[16];
+    cameraPose.inverse().toMatrix(cameraView, 0);
+
+    // Planes are drawn with additive blending, masked by the alpha channel for occlusion.
+
+    // Start by clearing the alpha channel of the color buffer to 1.0.
+    GLES20.glClearColor(1, 1, 1, 1);
+    GLES20.glColorMask(false, false, false, true);
+    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
+    GLES20.glColorMask(true, true, true, true);
+
+    // Disable depth write.
+    GLES20.glDepthMask(false);
+
+    // Additive blending, masked by alpha channel, clearing alpha channel.
+    GLES20.glEnable(GLES20.GL_BLEND);
+    GLES20.glBlendFuncSeparate(
+        GLES20.GL_DST_ALPHA, GLES20.GL_ONE, // RGB (src, dest)
+        GLES20.GL_ZERO, GLES20.GL_ONE_MINUS_SRC_ALPHA); // ALPHA (src, dest)
+
+    // Set up the shader.
+    GLES20.glUseProgram(planeProgram);
+
+    // Attach the texture.
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
+    GLES20.glUniform1i(textureUniform, 0);
+
+    // Shared fragment uniforms.
+    GLES20.glUniform4fv(gridControlUniform, 1, GRID_CONTROL, 0);
+
+    // Enable vertex arrays
+    GLES20.glEnableVertexAttribArray(planeXZPositionAlphaAttribute);
+
+    ShaderUtil.checkGLError(TAG, "Setting up to draw planes");
+
+    for (SortablePlane sortedPlane : sortedPlanes) {
+      Plane plane = sortedPlane.plane;
+      float[] planeMatrix = new float[16];
+      plane.getCenterPose().toMatrix(planeMatrix, 0);
+
+      float[] normal = new float[3];
+      // Get transformed Y axis of plane's coordinate system.
+      plane.getCenterPose().getTransformedAxis(1, 1.0f, normal, 0);
+
+      updatePlaneParameters(
+          planeMatrix, plane.getExtentX(), plane.getExtentZ(), plane.getPolygon());
+
+      // Get plane index. Keep a map to assign same indices to same planes.
+      Integer planeIndex = planeIndexMap.get(plane);
+      if (planeIndex == null) {
+        planeIndex = planeIndexMap.size();
+        planeIndexMap.put(plane, planeIndex);
+      }
+
+      // Set plane color. Computed deterministically from the Plane index.
+      int colorIndex = planeIndex % PLANE_COLORS_RGBA.length;
+      colorRgbaToFloat(planeColor, PLANE_COLORS_RGBA[colorIndex]);
+      GLES20.glUniform4fv(lineColorUniform, 1, planeColor, 0);
+      GLES20.glUniform4fv(dotColorUniform, 1, planeColor, 0);
+
+      // Each plane will have its own angle offset from others, to make them easier to
+      // distinguish. Compute a 2x2 rotation matrix from the angle.
+      float angleRadians = planeIndex * 0.144f;
+      float uScale = DOTS_PER_METER;
+      float vScale = DOTS_PER_METER * EQUILATERAL_TRIANGLE_SCALE;
+      planeAngleUvMatrix[0] = +(float) Math.cos(angleRadians) * uScale;
+      planeAngleUvMatrix[1] = -(float) Math.sin(angleRadians) * vScale;
+      planeAngleUvMatrix[2] = +(float) Math.sin(angleRadians) * uScale;
+      planeAngleUvMatrix[3] = +(float) Math.cos(angleRadians) * vScale;
+      GLES20.glUniformMatrix2fv(planeUvMatrixUniform, 1, false, planeAngleUvMatrix, 0);
+
+      draw(cameraView, cameraPerspective, normal);
+    }
+
+    // Clean up the state we set
+    GLES20.glDisableVertexAttribArray(planeXZPositionAlphaAttribute);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
+    GLES20.glDisable(GLES20.GL_BLEND);
+    GLES20.glDepthMask(true);
+
+    ShaderUtil.checkGLError(TAG, "Cleaning up after drawing planes");
+  }
+
+  // Calculate the normal distance to plane from cameraPose, the given planePose should have y axis
+  // parallel to plane's normal, for example plane's center pose or hit test pose.
+  public static float calculateDistanceToPlane(Pose planePose, Pose cameraPose) {
+    float[] normal = new float[3];
+    float cameraX = cameraPose.tx();
+    float cameraY = cameraPose.ty();
+    float cameraZ = cameraPose.tz();
+    // Get transformed Y axis of plane's coordinate system.
+    planePose.getTransformedAxis(1, 1.0f, normal, 0);
+    // Compute dot product of plane's normal with vector from camera to plane center.
+    return (cameraX - planePose.tx()) * normal[0]
+        + (cameraY - planePose.ty()) * normal[1]
+        + (cameraZ - planePose.tz()) * normal[2];
+  }
+
+  private static void colorRgbaToFloat(float[] planeColor, int colorRgba) {
+    planeColor[0] = ((float) ((colorRgba >> 24) & 0xff)) / 255.0f;
+    planeColor[1] = ((float) ((colorRgba >> 16) & 0xff)) / 255.0f;
+    planeColor[2] = ((float) ((colorRgba >> 8) & 0xff)) / 255.0f;
+    planeColor[3] = ((float) ((colorRgba >> 0) & 0xff)) / 255.0f;
+  }
+
+  private static final int[] PLANE_COLORS_RGBA = {
+    0xFFFFFFFF,
+    0xF44336FF,
+    0xE91E63FF,
+    0x9C27B0FF,
+    0x673AB7FF,
+    0x3F51B5FF,
+    0x2196F3FF,
+    0x03A9F4FF,
+    0x00BCD4FF,
+    0x009688FF,
+    0x4CAF50FF,
+    0x8BC34AFF,
+    0xCDDC39FF,
+    0xFFEB3BFF,
+    0xFFC107FF,
+    0xFF9800FF,
+  };
+}
diff --git a/app/src/arcore/examples/java/common/rendering/PointCloudRenderer.java b/app/src/arcore/examples/java/common/rendering/PointCloudRenderer.java
new file mode 100755
index 0000000..8a08a15
--- /dev/null
+++ b/app/src/arcore/examples/java/common/rendering/PointCloudRenderer.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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 arcore.examples.java.common.rendering;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+
+import com.google.ar.core.PointCloud;
+
+import java.io.IOException;
+
+/** Renders a point cloud. */
+public class PointCloudRenderer {
+  private static final String TAG = PointCloud.class.getSimpleName();
+
+  // Shader names.
+  private static final String VERTEX_SHADER_NAME = "shaders/point_cloud.vert";
+  private static final String FRAGMENT_SHADER_NAME = "shaders/point_cloud.frag";
+
+  private static final int BYTES_PER_FLOAT = Float.SIZE / 8;
+  private static final int FLOATS_PER_POINT = 4; // X,Y,Z,confidence.
+  private static final int BYTES_PER_POINT = BYTES_PER_FLOAT * FLOATS_PER_POINT;
+  private static final int INITIAL_BUFFER_POINTS = 1000;
+
+  private int vbo;
+  private int vboSize;
+
+  private int programName;
+  private int positionAttribute;
+  private int modelViewProjectionUniform;
+  private int colorUniform;
+  private int pointSizeUniform;
+
+  private int numPoints = 0;
+
+  // Keep track of the last point cloud rendered to avoid updating the VBO if point cloud
+  // was not changed.
+  private PointCloud lastPointCloud = null;
+
+  public PointCloudRenderer() {}
+
+  /**
+   * Allocates and initializes OpenGL resources needed by the plane renderer. Must be called on the
+   * OpenGL thread.
+   *
+   * @param context Needed to access shader source.
+   */
+  public void createOnGlThread(Context context) throws IOException {
+    ShaderUtil.checkGLError(TAG, "before create");
+
+    int[] buffers = new int[1];
+    GLES20.glGenBuffers(1, buffers, 0);
+    vbo = buffers[0];
+    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo);
+
+    vboSize = INITIAL_BUFFER_POINTS * BYTES_PER_POINT;
+    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vboSize, null, GLES20.GL_DYNAMIC_DRAW);
+    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
+
+    ShaderUtil.checkGLError(TAG, "buffer alloc");
+
+    int vertexShader =
+        ShaderUtil.loadGLShader(TAG, context, GLES20.GL_VERTEX_SHADER, VERTEX_SHADER_NAME);
+    int passthroughShader =
+        ShaderUtil.loadGLShader(TAG, context, GLES20.GL_FRAGMENT_SHADER, FRAGMENT_SHADER_NAME);
+
+    programName = GLES20.glCreateProgram();
+    GLES20.glAttachShader(programName, vertexShader);
+    GLES20.glAttachShader(programName, passthroughShader);
+    GLES20.glLinkProgram(programName);
+    GLES20.glUseProgram(programName);
+
+    ShaderUtil.checkGLError(TAG, "program");
+
+    positionAttribute = GLES20.glGetAttribLocation(programName, "a_Position");
+    colorUniform = GLES20.glGetUniformLocation(programName, "u_Color");
+    modelViewProjectionUniform = GLES20.glGetUniformLocation(programName, "u_ModelViewProjection");
+    pointSizeUniform = GLES20.glGetUniformLocation(programName, "u_PointSize");
+
+    ShaderUtil.checkGLError(TAG, "program  params");
+  }
+
+  /**
+   * Updates the OpenGL buffer contents to the provided point. Repeated calls with the same point
+   * cloud will be ignored.
+   */
+  public void update(PointCloud cloud) {
+    if (lastPointCloud == cloud) {
+      // Redundant call.
+      return;
+    }
+
+    ShaderUtil.checkGLError(TAG, "before update");
+
+    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo);
+    lastPointCloud = cloud;
+
+    // If the VBO is not large enough to fit the new point cloud, resize it.
+    numPoints = lastPointCloud.getPoints().remaining() / FLOATS_PER_POINT;
+    if (numPoints * BYTES_PER_POINT > vboSize) {
+      while (numPoints * BYTES_PER_POINT > vboSize) {
+        vboSize *= 2;
+      }
+      GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vboSize, null, GLES20.GL_DYNAMIC_DRAW);
+    }
+    GLES20.glBufferSubData(
+        GLES20.GL_ARRAY_BUFFER, 0, numPoints * BYTES_PER_POINT, lastPointCloud.getPoints());
+    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
+
+    ShaderUtil.checkGLError(TAG, "after update");
+  }
+
+  /**
+   * Renders the point cloud. ArCore point cloud is given in world space.
+   *
+   * @param cameraView the camera view matrix for this frame, typically from {@link
+   *     com.google.ar.core.Camera#getViewMatrix(float[], int)}.
+   * @param cameraPerspective the camera projection matrix for this frame, typically from {@link
+   *     com.google.ar.core.Camera#getProjectionMatrix(float[], int, float, float)}.
+   */
+  public void draw(float[] cameraView, float[] cameraPerspective) {
+    float[] modelViewProjection = new float[16];
+    Matrix.multiplyMM(modelViewProjection, 0, cameraPerspective, 0, cameraView, 0);
+
+    ShaderUtil.checkGLError(TAG, "Before draw");
+
+    GLES20.glUseProgram(programName);
+    GLES20.glEnableVertexAttribArray(positionAttribute);
+    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo);
+    GLES20.glVertexAttribPointer(positionAttribute, 4, GLES20.GL_FLOAT, false, BYTES_PER_POINT, 0);
+    //GLES20.glUniform4f(colorUniform, 31.0f / 255.0f, 188.0f / 255.0f, 210.0f / 255.0f, 1.0f);
+    GLES20.glUniform4f(colorUniform, 0.0f / 255.0f, 255.0f / 255.0f, 0.0f / 255.0f, 1.0f);
+    GLES20.glUniformMatrix4fv(modelViewProjectionUniform, 1, false, modelViewProjection, 0);
+    GLES20.glUniform1f(pointSizeUniform, 5.0f);
+
+    GLES20.glDrawArrays(GLES20.GL_POINTS, 0, numPoints);
+    GLES20.glDisableVertexAttribArray(positionAttribute);
+    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
+
+    ShaderUtil.checkGLError(TAG, "Draw");
+  }
+}
diff --git a/app/src/arcore/examples/java/common/rendering/ShaderUtil.java b/app/src/arcore/examples/java/common/rendering/ShaderUtil.java
new file mode 100755
index 0000000..b97a487
--- /dev/null
+++ b/app/src/arcore/examples/java/common/rendering/ShaderUtil.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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 arcore.examples.java.common.rendering;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.util.Log;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+/** Shader helper functions. */
+public class ShaderUtil {
+  /**
+   * Converts a raw text file, saved as a resource, into an OpenGL ES shader.
+   *
+   * @param type The type of shader we will be creating.
+   * @param filename The filename of the asset file about to be turned into a shader.
+   * @return The shader object handler.
+   */
+  public static int loadGLShader(String tag, Context context, int type, String filename)
+      throws IOException {
+    String code = readRawTextFileFromAssets(context, filename);
+    int shader = GLES20.glCreateShader(type);
+    GLES20.glShaderSource(shader, code);
+    GLES20.glCompileShader(shader);
+
+    // Get the compilation status.
+    final int[] compileStatus = new int[1];
+    GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compileStatus, 0);
+
+    // If the compilation failed, delete the shader.
+    if (compileStatus[0] == 0) {
+      Log.e(tag, "Error compiling shader: " + GLES20.glGetShaderInfoLog(shader));
+      GLES20.glDeleteShader(shader);
+      shader = 0;
+    }
+
+    if (shader == 0) {
+      throw new RuntimeException("Error creating shader.");
+    }
+
+    return shader;
+  }
+
+  /**
+   * Checks if we've had an error inside of OpenGL ES, and if so what that error is.
+   *
+   * @param label Label to report in case of error.
+   * @throws RuntimeException If an OpenGL error is detected.
+   */
+  public static void checkGLError(String tag, String label) {
+    int lastError = GLES20.GL_NO_ERROR;
+    // Drain the queue of all errors.
+    int error;
+    while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
+      Log.e(tag, label + ": glError " + error);
+      lastError = error;
+    }
+    if (lastError != GLES20.GL_NO_ERROR) {
+      throw new RuntimeException(label + ": glError " + lastError);
+    }
+  }
+
+  /**
+   * Converts a raw text file into a string.
+   *
+   * @param filename The filename of the asset file about to be turned into a shader.
+   * @return The context of the text file, or null in case of error.
+   */
+  private static String readRawTextFileFromAssets(Context context, String filename)
+      throws IOException {
+    try (InputStream inputStream = context.getAssets().open(filename);
+        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
+      StringBuilder sb = new StringBuilder();
+      String line;
+      while ((line = reader.readLine()) != null) {
+        sb.append(line).append("\n");
+      }
+      return sb.toString();
+    }
+  }
+}
diff --git a/app/src/main/assets/fontconfig/fonts.conf b/app/src/main/assets/fontconfig/fonts.conf
new file mode 100644
index 0000000..445d8ce
--- /dev/null
+++ b/app/src/main/assets/fontconfig/fonts.conf
@@ -0,0 +1,126 @@
+<?xml version="1.0"?>
+<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+<!-- /etc/fonts/fonts.conf file to configure system font access -->
+<fontconfig>
+
+<!-- Font directory list -->
+
+	<dir prefix="xdg">fontconfig/fonts</dir>
+
+<!-- Font cache directory list -->
+
+	<cachedir prefix="xdg">fontconfig</cachedir>
+
+<!--
+  Accept deprecated 'mono' alias, replacing it with 'monospace'
+-->
+	<match target="pattern">
+		<test qual="any" name="family">
+			<string>mono</string>
+		</test>
+		<edit name="family" mode="assign" binding="same">
+			<string>monospace</string>
+		</edit>
+	</match>
+
+<!--
+  Accept alternate 'sans serif' spelling, replacing it with 'sans-serif'
+-->
+	<match target="pattern">
+		<test qual="any" name="family">
+			<string>sans serif</string>
+		</test>
+		<edit name="family" mode="assign" binding="same">
+			<string>sans-serif</string>
+		</edit>
+	</match>
+
+<!--
+  Accept deprecated 'sans' alias, replacing it with 'sans-serif'
+-->
+	<match target="pattern">
+		<test qual="any" name="family">
+			<string>sans</string>
+		</test>
+		<edit name="family" mode="assign" binding="same">
+			<string>sans-serif</string>
+		</edit>
+	</match>
+
+	<config>
+<!--
+  These are the default Unicode chars that are expected to be blank
+  in fonts.  All other blank chars are assumed to be broken and
+  won't appear in the resulting charsets
+ -->
+		<blank>
+			<int>0x0020</int>	<!-- SPACE -->
+			<int>0x00A0</int>	<!-- NO-BREAK SPACE -->
+			<int>0x00AD</int>	<!-- SOFT HYPHEN -->
+			<int>0x034F</int>	<!-- COMBINING GRAPHEME JOINER -->
+			<int>0x0600</int>	<!-- ARABIC NUMBER SIGN -->
+			<int>0x0601</int>	<!-- ARABIC SIGN SANAH -->
+			<int>0x0602</int>	<!-- ARABIC FOOTNOTE MARKER -->
+			<int>0x0603</int>	<!-- ARABIC SIGN SAFHA -->
+			<int>0x06DD</int>	<!-- ARABIC END OF AYAH -->
+			<int>0x070F</int>	<!-- SYRIAC ABBREVIATION MARK -->
+			<int>0x115F</int>	<!-- HANGUL CHOSEONG FILLER -->
+			<int>0x1160</int>	<!-- HANGUL JUNGSEONG FILLER -->
+			<int>0x1680</int>	<!-- OGHAM SPACE MARK -->
+			<int>0x17B4</int>	<!-- KHMER VOWEL INHERENT AQ -->
+			<int>0x17B5</int>	<!-- KHMER VOWEL INHERENT AA -->
+			<int>0x180E</int>	<!-- MONGOLIAN VOWEL SEPARATOR -->
+			<int>0x2000</int>	<!-- EN QUAD -->
+			<int>0x2001</int>	<!-- EM QUAD -->
+			<int>0x2002</int>	<!-- EN SPACE -->
+			<int>0x2003</int>	<!-- EM SPACE -->
+			<int>0x2004</int>	<!-- THREE-PER-EM SPACE -->
+			<int>0x2005</int>	<!-- FOUR-PER-EM SPACE -->
+			<int>0x2006</int>	<!-- SIX-PER-EM SPACE -->
+			<int>0x2007</int>	<!-- FIGURE SPACE -->
+			<int>0x2008</int>	<!-- PUNCTUATION SPACE -->
+			<int>0x2009</int>	<!-- THIN SPACE -->
+			<int>0x200A</int>	<!-- HAIR SPACE -->
+			<int>0x200B</int>	<!-- ZERO WIDTH SPACE -->
+			<int>0x200C</int>	<!-- ZERO WIDTH NON-JOINER -->
+			<int>0x200D</int>	<!-- ZERO WIDTH JOINER -->
+			<int>0x200E</int>	<!-- LEFT-TO-RIGHT MARK -->
+			<int>0x200F</int>	<!-- RIGHT-TO-LEFT MARK -->
+			<int>0x2028</int>	<!-- LINE SEPARATOR -->
+			<int>0x2029</int>	<!-- PARAGRAPH SEPARATOR -->
+			<int>0x202A</int>	<!-- LEFT-TO-RIGHT EMBEDDING -->
+			<int>0x202B</int>	<!-- RIGHT-TO-LEFT EMBEDDING -->
+			<int>0x202C</int>	<!-- POP DIRECTIONAL FORMATTING -->
+			<int>0x202D</int>	<!-- LEFT-TO-RIGHT OVERRIDE -->
+			<int>0x202E</int>	<!-- RIGHT-TO-LEFT OVERRIDE -->
+			<int>0x202F</int>	<!-- NARROW NO-BREAK SPACE -->
+			<int>0x205F</int>	<!-- MEDIUM MATHEMATICAL SPACE -->
+			<int>0x2060</int>	<!-- WORD JOINER -->
+			<int>0x2061</int>	<!-- FUNCTION APPLICATION -->
+			<int>0x2062</int>	<!-- INVISIBLE TIMES -->
+			<int>0x2063</int>	<!-- INVISIBLE SEPARATOR -->
+			<int>0x206A</int>	<!-- INHIBIT SYMMETRIC SWAPPING -->
+			<int>0x206B</int>	<!-- ACTIVATE SYMMETRIC SWAPPING -->
+			<int>0x206C</int>	<!-- INHIBIT ARABIC FORM SHAPING -->
+			<int>0x206D</int>	<!-- ACTIVATE ARABIC FORM SHAPING -->
+			<int>0x206E</int>	<!-- NATIONAL DIGIT SHAPES -->
+			<int>0x206F</int>	<!-- NOMINAL DIGIT SHAPES -->
+			<int>0x2800</int>	<!-- BRAILLE PATTERN BLANK -->
+			<int>0x3000</int>	<!-- IDEOGRAPHIC SPACE -->
+			<int>0x3164</int>	<!-- HANGUL FILLER -->
+			<int>0xFEFF</int>	<!-- ZERO WIDTH NO-BREAK SPACE -->
+			<int>0xFFA0</int>	<!-- HALFWIDTH HANGUL FILLER -->
+			<int>0xFFF9</int>	<!-- INTERLINEAR ANNOTATION ANCHOR -->
+			<int>0xFFFA</int>	<!-- INTERLINEAR ANNOTATION SEPARATOR -->
+			<int>0xFFFB</int>	<!-- INTERLINEAR ANNOTATION TERMINATOR -->
+		</blank>
+<!--
+  Rescan configuration every 30 seconds when FcFontSetList is called
+ -->
+		<rescan>
+			<int>30</int>
+		</rescan>
+	</config>
+
+</fontconfig>
+
diff --git a/app/src/main/assets/fontconfig/fonts/truetype/Ubuntu-R.ttf b/app/src/main/assets/fontconfig/fonts/truetype/Ubuntu-R.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..45a038bade527cbbf30f197c5a116be3cfb2f0a3
GIT binary patch
literal 353824
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
RKO(u+N;ag(W=~{b005s0(a8V+

literal 0
HcmV?d00001

diff --git a/app/src/main/assets/ssl/certs/ca-certificates.crt b/app/src/main/assets/ssl/certs/ca-certificates.crt
new file mode 100644
index 0000000..287063b
--- /dev/null
+++ b/app/src/main/assets/ssl/certs/ca-certificates.crt
@@ -0,0 +1,4291 @@
+-----BEGIN CERTIFICATE-----
+MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx
+CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp
+ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa
+QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw
+NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft
+ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu
+QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq
+hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG
+qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL
+fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ
+Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4
+Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ
+54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b
+MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j
+ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej
+YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt
+A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF
+rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ
+pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB
+lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy
+YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50
+7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs
+YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6
+xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc
+unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/
+Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp
+ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42
+gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0
+jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+
+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD
+W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/
+RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r
+MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk
+BYn8eNZcLCZDqQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE
+AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw
+CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ
+BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND
+VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb
+qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY
+HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo
+G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA
+lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr
+IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/
+0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH
+k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47
+4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO
+m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa
+cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl
+uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI
+KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls
+ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG
+AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
+VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT
+VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG
+CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA
+cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA
+QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA
+7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA
+cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA
+QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA
+czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu
+aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt
+aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud
+DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF
+BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp
+D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU
+JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m
+AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD
+vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms
+tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH
+7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
+I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA
+h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF
+d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H
+pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE
+AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x
+CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW
+MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF
+RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC
+AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7
+09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7
+XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P
+Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK
+t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb
+X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28
+MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU
+fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI
+2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH
+K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae
+ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP
+BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ
+MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw
+RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
+bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm
+fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3
+gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe
+I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i
+5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi
+ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn
+MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ
+o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6
+zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN
+GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt
+r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK
+Z05phkOTOPu220+DkdRgfks+KzgHVZhepA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE
+BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w
+MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
+IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC
+SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1
+ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv
+UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX
+4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9
+KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/
+gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb
+rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ
+51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F
+be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe
+KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F
+v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn
+fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7
+jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz
+ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
+ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL
+e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70
+jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz
+WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V
+SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j
+pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX
+X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok
+fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R
+K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU
+ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU
+LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT
+LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
+IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
+MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
+bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
+dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
+H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
+uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
+mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
+a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
+E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
+WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
+VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
+Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
+cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
+IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
+AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
+YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
+Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
+c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
+mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw
+MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD
+VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul
+CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n
+tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl
+dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch
+PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC
++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O
+BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl
+MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk
+ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB
+IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X
+7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz
+43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
+eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl
+pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA
+WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx
+MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB
+ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV
+BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV
+6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX
+GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP
+dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH
+1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF
+62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW
+BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL
+MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU
+cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv
+b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6
+IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/
+iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
+GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh
+4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm
+XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1
+MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK
+EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh
+BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq
+xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G
+87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i
+2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U
+WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1
+0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G
+A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T
+AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr
+pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL
+ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm
+aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv
+hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm
+hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
+dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3
+P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y
+iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no
+xqE=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
+Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
+ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
+MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
+yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
+VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
+nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
+XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
+vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
+Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
+N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
+nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
+YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
+kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
+QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
+6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
+yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
+QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
+tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
+QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
+Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
+olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
+x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
+dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
+A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
+cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
+qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
+JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
+s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
+HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
+70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
+V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
+qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
+5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
+C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
+OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
+FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
+KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
+8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
+MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
+0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
+u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
+u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
+YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
+GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
+RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
+KeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
+VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
+cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
+BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
+VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
+0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
+ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
+A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
+aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
+flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc
+MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp
+b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT
+AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs
+aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H
+j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K
+f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55
+IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw
+FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht
+QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm
+/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ
+k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ
+MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC
+seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
+ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ
+hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+
+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U
+DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj
+B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
+rosot4LKGAfmt1t06SAZf7IbiVQ=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE
+AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG
+EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM
+FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC
+REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp
+Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM
+VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+
+SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ
+4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L
+cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi
+eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV
+HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG
+A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3
+DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j
+vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP
+DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc
+maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D
+lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv
+KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE
+BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h
+cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy
+MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg
+Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9
+thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM
+cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG
+L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i
+NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h
+X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b
+m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy
+Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja
+EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T
+KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF
+6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh
+OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD
+VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv
+ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl
+AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF
+661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9
+am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1
+ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481
+PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS
+3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k
+SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF
+3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM
+ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g
+StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz
+Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB
+jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
+DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
+ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
+VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
+mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
+IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
+mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
+XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
+dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
+jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
+BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
+DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
+9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
+jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
+Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
+ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
+R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg
+Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL
+MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD
+VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0
+ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX
+l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB
+HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B
+5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3
+WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD
+AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP
+gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+
+DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu
+BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs
+h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk
+LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
+Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow
+TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
+HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr
+6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV
+L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91
+1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx
+MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ
+QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB
+arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr
+Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi
+FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS
+P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN
+9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP
+AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz
+uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h
+9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
+A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t
+OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo
++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7
+KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2
+DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us
+H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ
+I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7
+5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h
+3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz
+Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
+Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow
+TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
+HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y
+ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E
+N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9
+tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX
+0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c
+/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X
+KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY
+zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS
+O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D
+34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP
+K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3
+AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv
+Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj
+QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
+cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS
+IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2
+HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa
+O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv
+033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u
+dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE
+kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41
+3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD
+u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq
+4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV
+BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu
+MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy
+MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx
+EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw
+ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk
+D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o
+OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A
+fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe
+IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n
+oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK
+/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj
+rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD
+3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE
+7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC
+yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd
+qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI
+hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR
+xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA
+SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo
+HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB
+emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC
+AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb
+7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x
+DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk
+F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF
+a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT
+Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV
+BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu
+MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy
+MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx
+EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw
+ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe
+NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH
+PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I
+x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe
+QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR
+yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO
+QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912
+H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ
+QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD
+i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs
+nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1
+rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI
+hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
+tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf
+GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb
+lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka
++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal
+TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i
+nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3
+gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr
+G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os
+zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x
+L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQsw
+CQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMT
+EkNBIFdvU2lnbiBFQ0MgUm9vdDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4
+NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEb
+MBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZIzj0CAQYFK4EEACID
+YgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiUt5v8
+KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES
+1ns2o0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQUqv3VWqP2h4syhf3RMluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB
+1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0Daupn75OcsqF1NnstTJFGG+rrQIwfcf3
+aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYua/GRspBl9JrmkO5K
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn
+MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL
+ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg
+b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa
+MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB
+ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw
+IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B
+AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb
+unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d
+BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq
+7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3
+0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX
+roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG
+A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j
+aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p
+26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA
+BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud
+EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN
+BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
+aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB
+AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd
+p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi
+1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc
+XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0
+eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu
+tGWaIZDgqtCYvDi1czyL+Nw=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn
+MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL
+ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo
+YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9
+MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy
+NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G
+A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA
+A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0
+Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s
+QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV
+eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795
+B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh
+z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T
+AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i
+ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w
+TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH
+MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD
+VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE
+VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
+bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B
+AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM
+bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi
+ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG
+VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c
+ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/
+AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBY
+MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNV
+BAMTJENlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDEx
+MDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgxCzAJBgNVBAYTAkNOMRowGAYDVQQK
+ExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlmaWNhdGlvbiBBdXRo
+b3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPX
+JYY1kBaiXW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgO
+gHzKtB0TiGsOqCR3A9DuW/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg
+5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg95k4ot+vElbGs/V6r+kHLXZ1L3PR8du9n
+fwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BKv0mUYQs4kI9dJGwlezt5
+2eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJ
+KoZIhvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8
+fHulwqZm46qwtyeYP0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G
+3CE4Q3RM+zD4F3LBMvzIkRfEzFg3TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yy
+SrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu+sif/a+RZQp4OBXllxcU3fng
+LDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+7Q9LGOHSJDy7
+XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV
+BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X
+DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ
+BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4
+QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny
+gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw
+zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q
+130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2
+JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw
+ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT
+AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj
+AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG
+9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h
+bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc
+fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu
+HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w
+t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET
+MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk
+BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4
+Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl
+cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0
+aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY
+F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N
+8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe
+rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K
+/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu
+7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC
+28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6
+lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E
+nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB
+0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09
+5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj
+WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN
+jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
+KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s
+ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM
+OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q
+619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn
+2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj
+o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v
+nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG
+5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq
+pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb
+dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0
+BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET
+MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb
+BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz
+MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx
+FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g
+Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2
+fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl
+LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV
+WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF
+TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb
+5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc
+CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri
+wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ
+wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG
+m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4
+F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng
+WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0
+2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF
+AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/
+0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw
+F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS
+g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj
+qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN
+h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/
+ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V
+btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj
+Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ
+8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW
+gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw
+PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz
+cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9
+MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz
+IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ
+ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR
+VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL
+kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd
+EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas
+H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0
+HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud
+DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4
+QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu
+Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/
+AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8
+yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR
+FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA
+ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB
+kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
+l7+ijrRU
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA
+MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy
+dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa
+MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy
+dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
+ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a
+iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt
+6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP
+0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f
+6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE
+EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN
+1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc
+h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT
+mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV
+4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO
+WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud
+DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd
+Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq
+hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh
+66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7
+/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS
+S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j
+2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R
+Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr
+RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy
+6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV
+V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5
+g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl
+++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x
+CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs
+dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x
+CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs
+dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat
+93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x
+Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P
+AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj
+FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG
+SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch
+p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal
+U5ORGpOucGpnutee5WEaXw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT
+AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD
+QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP
+MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do
+0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ
+UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d
+RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ
+OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv
+JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C
+AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O
+BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ
+LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY
+MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ
+44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I
+Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw
+i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN
+9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM
+MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD
+QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM
+MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD
+QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E
+jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo
+ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI
+ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu
+Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg
+AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7
+HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA
+uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa
+TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg
+xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q
+CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x
+O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs
+6GAqm4VKQPNriiTsBhYscw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM
+MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D
+ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU
+cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3
+WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg
+Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw
+IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH
+UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM
+TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU
+BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM
+kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x
+AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV
+HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y
+sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL
+I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8
+J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY
+VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB
+gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
+QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG
+A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz
+OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ
+VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3
+b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA
+DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn
+0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB
+OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE
+fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E
+Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m
+o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i
+sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW
+OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez
+Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS
+adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n
+3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ
+F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf
+CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29
+XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm
+djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/
+WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb
+AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq
+P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko
+b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj
+XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P
+5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi
+DrW5viSP
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD
+TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx
+MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j
+aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP
+T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03
+sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL
+TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5
+/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp
+7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz
+EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt
+hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP
+a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot
+aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg
+TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV
+PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv
+cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL
+tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd
+BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
+ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT
+ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL
+jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS
+ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy
+P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19
+xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d
+Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN
+5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe
+/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z
+AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ
+5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD
+VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
+IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
+MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz
+IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz
+MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj
+dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw
+EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp
+MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9
+28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq
+VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q
+DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR
+5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL
+ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a
+Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl
+UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s
++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5
+Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
+ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx
+hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV
+HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1
++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN
+YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t
+L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy
+ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt
+IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV
+HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w
+DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW
+PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF
+5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1
+glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH
+FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2
+pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD
+xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG
+tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq
+jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De
+fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
+OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ
+d0jQ
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC
+Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g
+Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0
+aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa
+Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg
+SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo
+aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp
+ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z
+7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//
+DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx
+zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8
+hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs
+4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u
+gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY
+NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E
+FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3
+j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG
+52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB
+echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
+ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI
+zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy
+wy39FCqQmbkHzJ8=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD
+TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2
+MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF
+Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh
+IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6
+dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO
+V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC
+GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN
+v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB
+AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB
+Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO
+76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK
+OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH
+ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi
+yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL
+buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj
+2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
+YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
+GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
+BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
+3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
+YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
+rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
+ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
+oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
+QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
+b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
+AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
+GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
+G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
+l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
+smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
+gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
+BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
+MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
+YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
+RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
+UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
+2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
+Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
+nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
+/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
+PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
+QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
+SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
+IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
+zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
+BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
+ZQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
+IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
+MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
+ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
+T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
+FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
+cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
+BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
+fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
+GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB
+hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
+BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5
+MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
+EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR
+6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X
+pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC
+9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV
+/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf
+Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z
++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w
+qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah
+SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC
+u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf
+Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq
+crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
+FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB
+/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl
+wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM
+4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV
+2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna
+FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ
+CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK
+boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke
+jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL
+S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb
+QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl
+0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB
+NVOFBkpdn627G190
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp
+ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow
+fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV
+BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM
+cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S
+HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996
+CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk
+3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz
+6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV
+HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
+EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv
+Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw
+Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww
+DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0
+5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
+Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI
+gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ
+aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl
+izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0
+aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla
+MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
+BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD
+VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW
+fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt
+TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL
+fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW
+1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7
+kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G
+A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v
+ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo
+dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu
+Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/
+HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
+pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS
+jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+
+xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn
+dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0
+MRMwEQYDVQQDEwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQG
+EwJJTDAeFw0wNDAzMjQxMTMyMThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMT
+CkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNpZ24xCzAJBgNVBAYTAklMMIIBIjAN
+BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49qROR+WCf4C9DklBKK
+8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTyP2Q2
+98CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb
+2CEJKHxNGGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxC
+ejVb7Us6eva1jsz/D3zkYDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7Kpi
+Xd3DTKaCQeQzC6zJMw9kglcq/QytNuEMrkvF7zuZ2SOzW120V+x0cAwqTwIDAQAB
+o4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2Zl
+ZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0PAQH/BAQD
+AgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRL
+AZs+VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWd
+foPPbrxHbvUanlR2QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0M
+cXS6hMTXcpuEfDhOZAYnKuGntewImbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq
+8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb/627HOkthIDYIb6FUtnUdLlp
+hbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VGzT2ouvDzuFYk
+Res3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U
+AGegcQCCSA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG
+A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh
+bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE
+ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS
+b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5
+7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS
+J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y
+HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP
+t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz
+FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY
+XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
+MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw
+hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js
+MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA
+A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj
+Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx
+XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o
+omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc
+A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF
+MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD
+bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha
+ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM
+HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03
+UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42
+tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R
+ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM
+lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp
+/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G
+A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G
+A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj
+dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy
+MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl
+cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js
+L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL
+BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni
+acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
+o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K
+zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8
+PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y
+Johw1+qRzT65ysCQblrGXnRl11z+o+I=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF
+MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD
+bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw
+NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV
+BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn
+ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0
+3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z
+qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR
+p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8
+HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw
+ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea
+HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw
+Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh
+c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E
+RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt
+dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku
+Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp
+3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
+nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF
+CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na
+xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX
+KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc
+MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj
+IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB
+IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE
+RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl
+U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290
+IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU
+ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC
+QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr
+rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S
+NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc
+QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH
+txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP
+BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
+AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp
+tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa
+IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl
+6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+
+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
+Cm26OWMohpLzGITY+9HPBVZkVw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
+b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
+cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
+JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
+mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
+VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
+AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
+AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
+BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
+pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
+dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
+fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
+NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
+H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
+b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
+cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA
+n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc
+biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp
+EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA
+bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu
+YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB
+AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW
+BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI
+QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I
+0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni
+lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9
+B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv
+ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
+IhNzbM8m9Yop5w==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw
+CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
+ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg
+RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
+Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf
+Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q
+RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD
+AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY
+JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv
+6pZjamVFkpUBtA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
+CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
+nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
+43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
+T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
+gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
+TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
+DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
+hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
+06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
+PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
+YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
+MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
+2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
+1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
+q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
+tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
+vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
+5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
+1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
+NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
+Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
+8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
+pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
+MrY=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw
+CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
+ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe
+Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw
+EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
+IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF
+K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG
+fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO
+Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd
+BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx
+AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/
+oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8
+sycX
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
+ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
+LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
+RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
+PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
+xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
+Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
+hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
+EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
+FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
+nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
+eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
+hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
+Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
++OkuE6N36B9K
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg
+RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
+Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y
+ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If
+xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV
+ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO
+DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ
+jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/
+CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi
+EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM
+fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY
+uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK
+chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t
+9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
+ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2
+SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd
++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc
+fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa
+sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N
+cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N
+0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie
+4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI
+r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1
+/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm
+gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx
+ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w
+MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD
+VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx
+FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu
+ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7
+gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH
+fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a
+ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT
+ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF
+MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk
+c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto
+dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt
+aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI
+hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk
+QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/
+h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
+nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR
+rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2
+9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
+MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
+DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
+PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
+Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
+rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
+OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
+xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
+7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
+aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
+SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
+ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
+AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
+R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
+JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
+Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV
+BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC
+aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV
+BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1
+Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz
+MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+
+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp
+em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
+ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY
+B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH
+D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF
+Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo
+q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D
+k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH
+fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut
+dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM
+ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8
+zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
+rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX
+U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6
+Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5
+XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF
+Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR
+HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY
+GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c
+77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3
++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK
+vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6
+FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl
+yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P
+AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD
+y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d
+NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB
+8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy
+dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1
+YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3
+dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh
+IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD
+LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG
+EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g
+KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD
+ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu
+bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg
+ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN
+BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R
+85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm
+4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV
+HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd
+QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t
+lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB
+o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4
+opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo
+dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW
+ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN
+AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y
+/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k
+SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy
+Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS
+Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl
+nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1
+MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1
+czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG
+CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy
+MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl
+ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS
+b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy
+euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO
+bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw
+WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d
+MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE
+1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/
+zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB
+BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF
+BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV
+v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG
+E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
+uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW
+iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v
+GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
+RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
+IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
+MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
+LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
+YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
+A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
+K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
+sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
+MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
+XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
+HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
+4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
+HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
+j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
+U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
+zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
+u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
+bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
+fF6adulZkMV8gzURZVE=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
+Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
+KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
+NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
+NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
+ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
+BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
+Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
+4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
+KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
+rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
+94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
+sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
+gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
+kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
+vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
+O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
+AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
+9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
+eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
+0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG
+A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3
+d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu
+dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq
+RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy
+MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD
+VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
+L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g
+Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi
+A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt
+ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH
+Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
+BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC
+R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX
+hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
+cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
+IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
+dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
+NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
+dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
+dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
+aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
+RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
+cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
+wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
+U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
+jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
+BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
+jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
+Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
+1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
+nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
+VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe
+MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0
+ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw
+IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL
+SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH
+SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh
+ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X
+DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1
+TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ
+fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA
+sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU
+WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS
+nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH
+dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip
+NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC
+AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF
+MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB
+uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl
+PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP
+JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/
+gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2
+j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6
+5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB
+o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS
+/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z
+Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE
+W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D
+hNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
+R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
+9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
+fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
+iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
+1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
+MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
+ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
+uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
+Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
+tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
+PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
+hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
+5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs
+IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg
+R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A
+PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8
+Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL
+TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL
+5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7
+S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe
+2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap
+EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td
+EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv
+/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN
+A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0
+abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF
+I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz
+4iIprn2DQKi6bA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
+MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
+R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
+MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
+AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
+ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
+7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
+kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
+mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
+KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
+6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
+4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
+oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
+UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
+AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
+MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
+KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
+MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
+NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
+BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
+MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
+So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
+tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
+CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
+qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
+rD6ogRLQy7rQkgu2npaqBA+K
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
+mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
+MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
+BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
+BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
+hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
+5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
+JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
+DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
+huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
+HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
+AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
+zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
+kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
+SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
+spki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0
+IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV
+VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8
+cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT
+QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh
+F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v
+c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w
+mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd
+VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX
+teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ
+f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe
+Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+
+nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB
+/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY
+MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
+9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX
+IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn
+ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z
+uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN
+Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja
+QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW
+koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9
+ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt
+DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm
+bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD
+VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1
+c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81
+WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG
+FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq
+XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL
+se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb
+KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd
+IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73
+y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt
+hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc
+QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4
+Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV
+HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ
+KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ
+L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr
+Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo
+ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY
+T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz
+GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m
+1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV
+OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH
+6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX
+QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD
+VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
+IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
+MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
+aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx
+MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy
+cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG
+A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl
+BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI
+hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed
+KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7
+G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2
+zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4
+ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG
+HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2
+Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V
+yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e
+beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r
+6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
+wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog
+zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW
+BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr
+ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp
+ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk
+cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt
+YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC
+CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow
+KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI
+hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ
+UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz
+X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x
+fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz
+a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd
+Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd
+SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O
+AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso
+M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge
+v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
+09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk
+MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH
+bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
+DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
+QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
+MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ
+FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw
+DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F
+uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX
+kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs
+ewv4n4Q=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk
+MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH
+bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
+DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
+QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
+MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc
+8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke
+hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI
+KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg
+515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO
+xwy8p2Fp8fc74SrL+SvzZpA3
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
+A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
+b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
+MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
+YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
+aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
+jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
+xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
+1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
+snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
+U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
+9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
+AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
+yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
+38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
+AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
+DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
+HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
+MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
+v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
+eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
+tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
+C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
+zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
+mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
+V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
+bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
+3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
+J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
+291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
+ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
+AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
+MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
+RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
+gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
+KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
+QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
+XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
+DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
+LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
+RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
+jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
+6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
+mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
+Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
+WD9f
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
+MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
+YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
+MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
+ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
+MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
+ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
+PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
+wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
+EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
+avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
+sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
+/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
+IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
+ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
+OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
+TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
+dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
+ReYNnyicsbkqWletNw+vHX/bvZ8=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
+EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
+ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
+NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
+EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
+AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
+E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
+/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
+DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
+GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
+tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
+AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
+FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
+WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
+9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
+gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
+2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
+4uJEvlz36hz1
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN
+BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
+c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl
+bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv
+b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ
+BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj
+YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5
+MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0
+dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg
+QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa
+jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi
+C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep
+lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof
+TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix
+RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
+dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p
+YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw
+NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK
+EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl
+cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
+c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz
+dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ
+fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns
+bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD
+75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP
+FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV
+HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp
+5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu
+b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA
+A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p
+6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
+TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7
+dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys
+Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI
+l7WdmplNsDz4SgCbZN2fOUvRJ9e4
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix
+DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k
+IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT
+N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v
+dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG
+A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh
+ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx
+QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
+dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA
+4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0
+AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10
+4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C
+ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV
+9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD
+gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6
+Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq
+NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko
+LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
+Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd
+ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I
+XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI
+M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot
+9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V
+Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea
+j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh
+X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ
+l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf
+bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4
+pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK
+e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0
+vm9qp/UsQu0yrbYhnr68
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx
+FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg
+Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG
+A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr
+b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ
+jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn
+PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh
+ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9
+nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h
+q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED
+MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC
+mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3
+7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB
+oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs
+EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO
+fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi
+AmvZWg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK
+MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu
+VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw
+MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw
+JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT
+3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU
++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp
+S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1
+bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi
+T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL
+vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK
+Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK
+dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT
+c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv
+l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N
+iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD
+ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
+6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt
+LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93
+nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3
++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK
+W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT
+AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq
+l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG
+4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ
+mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A
+7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN
+MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu
+VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN
+MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0
+MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7
+ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy
+RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS
+bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF
+/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R
+3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw
+EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy
+9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V
+GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ
+2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV
+WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD
+W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN
+AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
+t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV
+DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9
+TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G
+lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW
+mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df
+WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5
++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ
+tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA
+GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv
+8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4
+MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6
+ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD
+VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j
+b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq
+scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO
+xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H
+LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX
+uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD
+yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+
+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q
+rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN
+BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L
+hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB
+QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+
+HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu
+Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg
+QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB
+BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
+MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA
+A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb
+laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56
+awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo
+JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw
+LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT
+VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk
+LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb
+UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/
+QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+
+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls
+QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw
+cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy
+b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z
+ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4
+NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN
+TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p
+Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u
+uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+
+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA
+vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770
+Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx
+62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB
+AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw
+LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP
+BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB
+AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov
+MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5
+ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
+AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT
+AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh
+ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo
+AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa
+AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln
+bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p
+Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP
+PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv
+Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB
+EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu
+w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj
+cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV
+HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI
+VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS
+BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS
+b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS
+8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds
+ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl
+7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
+86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR
+hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/
+MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD
+VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0
+ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G
+CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y
+OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx
+FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp
+Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP
+kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc
+cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U
+fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7
+N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC
+xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1
++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM
+Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG
+SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h
+mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk
+ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c
+2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t
+HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG
+EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3
+MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl
+cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR
+dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB
+pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM
+b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm
+aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz
+IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT
+lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz
+AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5
+VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG
+ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2
+BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG
+AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M
+U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh
+bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C
++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F
+uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2
+XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
+MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
+dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
+UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
+ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
+c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
+OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
+mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
+BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
+qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
+gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
+bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
+dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
+6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
+h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
+/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
+pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB
+ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly
+aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
+ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w
+NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G
+A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD
+VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX
+SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR
+VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2
+w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF
+mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg
+4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9
+4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw
+EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx
+SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2
+ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8
+vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi
+Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ
+/L7fCg0=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt
+MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg
+Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i
+YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x
+CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG
+b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
+bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3
+HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx
+WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX
+1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk
+u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P
+99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r
+M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB
+BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh
+cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5
+gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO
+ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf
+aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
+Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA
+MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w
+ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw
+MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU
+T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b
+wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX
+/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0
+77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP
+uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx
+p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx
+Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2
+TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W
+G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw
+vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY
+EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1
+2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw
+DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E
+PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf
+gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS
+FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0
+V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P
+XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I
+i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t
+TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91
+09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky
+Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ
+AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj
+1oxx
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA
+MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w
+ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw
+MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU
+T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh
+/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e
+CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6
+1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE
+FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS
+gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X
+G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy
+YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH
+vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4
+t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/
+gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3
+5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w
+DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz
+Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0
+nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT
+RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT
+wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2
+t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa
+TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2
+o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU
+3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA
+iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f
+WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM
+S1IK
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx
+CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U
+cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow
+QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl
+blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm
+3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d
+oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G
+A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5
+DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK
+BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q
+j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx
+4nxp5V2a+EEfOzmTk51V6s2N8fvB
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1
+dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s
+YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz
+dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0
+aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh
+IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ
+KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw
+MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy
+b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx
+KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG
+A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u
+aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI
+hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9
+7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74
+BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G
+ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9
+JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0
+PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2
+0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
+0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/
+6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m
+v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7
+K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev
+bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw
+MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w
+MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD
+gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0
+b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh
+bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0
+cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp
+ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg
+ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq
+hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD
+AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w
+MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag
+RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t
+UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl
+cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
+Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG
+AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN
+AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS
+1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB
+3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv
+Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh
+HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm
+pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz
+sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE
+qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb
+mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9
+opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H
+YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC
+TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz
+MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw
+IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR
+dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp
+li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D
+rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ
+WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug
+F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU
+xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC
+Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv
+dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw
+ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl
+IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh
+c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy
+ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI
+KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T
+KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq
+y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p
+dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD
+VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL
+MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk
+fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8
+7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R
+cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y
+mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW
+xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK
+SnQ2+Q==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00
+MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV
+wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe
+rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341
+68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh
+4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp
+UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o
+abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc
+3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G
+KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt
+hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO
+Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt
+zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD
+ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
+MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2
+cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN
+qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5
+YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv
+b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2
+8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k
+NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj
+ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp
+q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt
+nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
+GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
+b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV
+BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
+YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa
+GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg
+Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J
+WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB
+rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp
++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1
+ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i
+Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz
+PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og
+/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH
+oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI
+yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud
+EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2
+A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL
+MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f
+BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn
+g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl
+fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K
+WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha
+B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc
+hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR
+TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD
+mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z
+ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y
+4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza
+8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00
+MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf
+qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW
+n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym
+c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+
+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1
+o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j
+IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq
+IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz
+8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh
+vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l
+7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG
+cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD
+ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
+AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC
+roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga
+W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n
+lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE
++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV
+csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd
+dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg
+KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM
+HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4
+WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
+GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
+b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV
+BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
+YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM
+V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB
+4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr
+H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd
+8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv
+vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT
+mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe
+btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc
+T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt
+WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ
+c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A
+4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD
+VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG
+CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0
+aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu
+dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw
+czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G
+A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC
+TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg
+Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0
+7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem
+d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd
++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B
+4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN
+t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x
+DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57
+k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s
+zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j
+Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT
+mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK
+4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00
+MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR
+/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu
+FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR
+U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c
+ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR
+FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k
+A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw
+eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl
+sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp
+VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q
+A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+
+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD
+ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
+KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI
+FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv
+oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg
+u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP
+0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf
+3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl
+8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+
+DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN
+PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/
+ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJF
+UzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJ
+R1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcN
+MDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3WjBoMQswCQYDVQQGEwJFUzEfMB0G
+A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScw
+JQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+
+WmmmO3I2F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKj
+SgbwJ/BXufjpTjJ3Cj9BZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGl
+u6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQD0EbtFpKd71ng+CT516nDOeB0/RSrFOy
+A8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXteJajCq+TA81yc477OMUxk
+Hl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMBAAGjggM7
+MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBr
+aS5ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIIC
+IwYKKwYBBAG/VQIBADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8A
+cgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIA
+YQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIAYQBsAGkAdABhAHQAIABWAGEA
+bABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQByAGEAYwBpAPMA
+bgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
+aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMA
+aQBvAG4AYQBtAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQA
+ZQAgAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEA
+YwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBuAHQAcgBhACAAZQBuACAAbABhACAA
+ZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcA
+LgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0dHA6
+Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+y
+eAT8MIGVBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQsw
+CQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0G
+A1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVu
+Y2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRhTvW1yEICKrNcda3Fbcrn
+lD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdzCkj+IHLt
+b8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg
+9J63NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XF
+ducTZnV+ZfsBn5OHiJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmC
+IoaZM3Fa6hlXPZHNqcCjbgcTpsnt+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6
+MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp
+dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX
+BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy
+MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp
+eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg
+/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl
+wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh
+AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2
+PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu
+AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR
+MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc
+HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/
+Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+
+f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO
+rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch
+6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3
+7CAFYd4=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID2DCCAsCgAwIBAgIQYFbFSyNAW2TU7SXa2dYeHjANBgkqhkiG9w0BAQsFADCB
+hTELMAkGA1UEBhMCREUxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZl
+cmxhZyBHbWJIMScwJQYDVQQLEx5TLVRSVVNUIENlcnRpZmljYXRpb24gU2Vydmlj
+ZXMxIjAgBgNVBAMTGVMtVFJVU1QgVW5pdmVyc2FsIFJvb3QgQ0EwHhcNMTMxMDIy
+MDAwMDAwWhcNMzgxMDIxMjM1OTU5WjCBhTELMAkGA1UEBhMCREUxKTAnBgNVBAoT
+IERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMScwJQYDVQQLEx5TLVRS
+VVNUIENlcnRpZmljYXRpb24gU2VydmljZXMxIjAgBgNVBAMTGVMtVFJVU1QgVW5p
+dmVyc2FsIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCo
+4wvfETeFgpq1bGZ8YT/ARxodRuOwVWTluII5KAd+F//0m4rwkYHqOD8heGxI7Gsv
+otOKcrKn19nqf7TASWswJYmM67fVQGGY4tw8IJLNZUpynxqOjPolFb/zIYMoDYuv
+WRGCQ1ybTSVRf1gYY2A7s7WKi1hjN0hIkETCQN1d90NpKZhcEmVeq5CSS2bf1XUS
+U1QYpt6K1rtXAzlZmRgFDPn9FcaQZEYXgtfCSkE9/QC+V3IYlHcbU1qJAfYzcg6T
+OtzoHv0FBda8c+CI3KtP7LUYhk95hA5IKmYq3TLIeGXIC51YAQVx7YH1aBduyw20
+S9ih7K446xxYL6FlAzQvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
+AQH/BAQDAgEGMB0GA1UdDgQWBBSafdfr639UmEUptCCrbQuWIxmkwjANBgkqhkiG
+9w0BAQsFAAOCAQEATpYS2353XpInniEXGIJ22D+8pQkEZoiJrdtVszNqxmXEj03z
+MjbceQSWqXcy0Zf1GGuMuu3OEdBEx5LxtESO7YhSSJ7V/Vn4ox5R+wFS5V/let2q
+JE8ii912RvaloA812MoPmLkwXSBvwoEevb3A/hXTOCoJk5gnG5N70Cs0XmilFU/R
+UsOgyqCDRR319bdZc11ZAY+qwkcvFHHVKeMQtUeTJcwjKdq3ctiR1OwbSIoi5MEq
+9zpok59FGW5Dt8z+uJGaYRo2aWNkkijzb2GShROfyQcsi1fc65551cLeCNVUsldO
+KjKNoeI60RAgIjl9NEVvcTvDHfz/sk+o4vYwHg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
+GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx
+MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg
+Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ
+iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa
+/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ
+jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI
+HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7
+sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w
+gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw
+KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG
+AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
+URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO
+H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm
+I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
+iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr
+MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG
+A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0
+MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp
+Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD
+QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz
+i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8
+h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV
+MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9
+UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni
+8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC
+h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD
+VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB
+AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm
+KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ
+X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr
+QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5
+pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN
+QSdJQO7e5iNEOdyhIta6A/I=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
+FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz
+MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv
+cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz
+Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO
+0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao
+wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj
+7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS
+8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT
+BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg
+JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC
+NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
+6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/
+3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm
+D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS
+CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl
+MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh
+U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz
+MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N
+IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11
+bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE
+RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO
+zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5
+bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF
+MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1
+VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC
+OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G
+CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW
+tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ
+q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb
+EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+
+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O
+VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY
+MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t
+dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5
+WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD
+VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8
+9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ
+DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9
+Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N
+QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ
+xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G
+A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T
+AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG
+kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr
+Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5
+Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU
+JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot
+RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl
+MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe
+U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX
+DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy
+dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj
+YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV
+OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr
+zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM
+VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ
+hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO
+ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw
+awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs
+OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
+DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF
+coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc
+okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8
+t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy
+1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/
+SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP
+MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx
+MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV
+BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o
+Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt
+5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s
+3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej
+vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu
+8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw
+DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG
+MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil
+zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/
+3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD
+FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6
+Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2
+ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y
+MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg
+TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS
+b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS
+M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC
+UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d
+Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p
+rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l
+pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb
+j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC
+KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS
+/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X
+cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH
+1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP
+px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7
+MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
+eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u
+2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS
+v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC
+wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy
+CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e
+vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6
+Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa
+Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL
+eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8
+FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc
+7uzXLg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX
+DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
+ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
+b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291
+qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp
+uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU
+Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE
+pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp
+5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M
+UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN
+GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy
+5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv
+6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK
+eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6
+B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/
+BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov
+L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG
+SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS
+CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen
+5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897
+IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK
+gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL
++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL
+vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm
+bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk
+N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC
+Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z
+ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX
+DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
+ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
+b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP
+cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW
+IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX
+xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy
+KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR
+9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az
+5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8
+6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7
+Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP
+bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt
+BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt
+XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF
+MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd
+INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
+U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp
+LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8
+Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp
+gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh
+/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw
+0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A
+fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq
+4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR
+1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/
+QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM
+94B7IWcnMFk=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
+MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
+U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
+NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
+ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
+ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
+DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
+8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
+X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
+K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
+1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
+A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
+zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
+YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
+bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
+DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
+L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
+eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
+VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
+WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
+ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
+MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
+aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
+Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
+nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
+HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
+Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
+dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
+HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
+CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
+sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
+4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
+8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
+mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
+ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
+VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
+ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
+dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
+OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
+8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
+Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
+hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
+6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
+DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
+AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
+bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
+ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
+qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
+0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
+sSi6
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
+Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9
+MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
+U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
+cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
+pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
+OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
+Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
+Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
+HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
+Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
+Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
+26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
+AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
+FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j
+ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js
+LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM
+BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0
+Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy
+dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh
+cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh
+YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg
+dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp
+bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ
+YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT
+TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ
+9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8
+jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW
+FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz
+ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1
+ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L
+EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu
+L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
+yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC
+O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V
+um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh
+NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
+Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9
+MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
+U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
+cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
+pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
+OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
+Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
+Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
+HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
+Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
+Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
+26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
+AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
+VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul
+F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC
+ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w
+ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk
+aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0
+YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg
+c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93
+d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG
+CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF
+wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS
+Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst
+0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc
+pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl
+CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF
+P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK
+1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm
+KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
+JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ
+8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm
+fyWl8kgAwKQB2j8=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1
+OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG
+A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ
+JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD
+vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo
+D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/
+Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW
+RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK
+HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN
+nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM
+0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i
+UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9
+Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg
+TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL
+BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
+2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX
+UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl
+6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK
+9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ
+HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI
+wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY
+XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l
+IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo
+hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr
+so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk
+MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0
+YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg
+Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT
+AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp
+Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9
+m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih
+FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/
+TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F
+EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco
+kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu
+HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF
+vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo
+19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC
+L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW
+bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX
+JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw
+FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
+BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc
+K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf
+ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik
+Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB
+sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e
+3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR
+ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip
+mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH
+b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf
+rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms
+hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y
+zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6
+MBr1mmz0DlP5OlvRHA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBk
+MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0
+YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg
+Q0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2MjUwNzM4MTRaMGQxCzAJBgNVBAYT
+AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp
+Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvEr
+jw0DzpPMLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r
+0rk0X2s682Q2zsKwzxNoysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f
+2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVP
+ACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpHWrumnf2U5NGKpV+GY3aF
+y6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1aSgJA/MTA
+tukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL
+6yxSNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0
+uPoTXGiTOmekl9AbmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrAL
+acywlKinh/LTSlDcX3KwFnUey7QYYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velh
+k6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3qPyZ7iVNTA6z00yPhOgpD/0Q
+VAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw
+FDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O
+BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqh
+b97iEoHF8TwuMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4R
+fbgZPnm3qKhyN2abGu2sEzsOv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv
+/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ82YqZh6NM4OKb3xuqFp1mrjX2lhI
+REeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLzo9v/tdhZsnPdTSpx
+srpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcsa0vv
+aGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciAT
+woCqISxxOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99n
+Bjx8Oto0QuFmtEYE3saWmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5W
+t6NlUe07qxS/TFED6F+KBZvuim6c779o+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N
+8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TCrvJcwhbtkj6EPnNgiLx2
+9CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX5OfNeOI5
+wSsSnqaeG8XmDtkx2Q==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAw
+ZzELMAkGA1UEBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdp
+dGFsIENlcnRpZmljYXRlIFNlcnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290
+IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcNMzEwNjI1MDg0NTA4WjBnMQswCQYD
+VQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2Vy
+dGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYgQ0Eg
+MjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7Bx
+UglgRCgzo3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD
+1ycfMQ4jFrclyxy0uYAyXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPH
+oCE2G3pXKSinLr9xJZDzRINpUKTk4RtiGZQJo/PDvO/0vezbE53PnUgJUmfANykR
+HvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8LiqG12W0OfvrSdsyaGOx9/
+5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaHZa0zKcQv
+idm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHL
+OdAGalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaC
+NYGu+HuB5ur+rPQam3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f
+46Fq9mDU5zXNysRojddxyNMkM3OxbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCB
+UWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDixzgHcgplwLa7JSnaFp6LNYth
+7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/BAQDAgGGMB0G
+A1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED
+MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWB
+bj2ITY1x0kbBbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6x
+XCX5145v9Ydkn+0UjrgEjihLj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98T
+PLr+flaYC/NUn81ETm484T4VvwYmneTwkLbUwp4wLh/vx3rEUMfqe9pQy3omywC0
+Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7XwgiG/W9mR4U9s70
+WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH59yL
+Gn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm
+7JFe3VE/23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4S
+nr8PyQUQ3nqjsTzyP6WqJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VN
+vBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyAHmBR3NdUIR7KYndP+tiPsys6DXhyyWhB
+WkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/giuMod89a2GQ+fYWVq6nTI
+fI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuWl8PVP3wb
+I+2ksx0WckNLIOFZfsLorSa/ovc=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+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
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
+BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu
+IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw
+WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD
+ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y
+IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn
+IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+
+6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob
+jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw
+izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl
++zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY
+zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP
+pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF
+KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW
+ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB
+AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
+BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0
+ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW
+IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA
+A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0
+uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+
+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7
+jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/
+u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D
+YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1
+puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa
+icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG
+DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x
+kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z
+Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+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
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL
+BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6
+ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw
+NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L
+cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg
+Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN
+QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT
+3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw
+3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6
+3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5
+BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN
+XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
+AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF
+AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw
+8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG
+nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP
+oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy
+d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg
+LvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
+KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
+BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
+YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1
+OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
+aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
+ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd
+AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC
+FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi
+1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq
+jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ
+wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/
+WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy
+NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC
+uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw
+IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6
+g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
+9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP
+BSeOE6Fuwg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
+KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
+BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
+YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1
+OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
+aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
+ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN
+8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/
+RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4
+hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5
+ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM
+EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1
+A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy
+WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ
+1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30
+6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT
+91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
+e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p
+TpPDpFQUWw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/
+MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow
+PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
+AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR
+IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q
+gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy
+yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts
+F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2
+jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx
+ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC
+VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK
+YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH
+EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN
+Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud
+DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE
+MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK
+UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf
+qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK
+ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE
+JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7
+hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1
+EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm
+nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX
+udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz
+ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe
+LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl
+pYYsfPQS
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL
+MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
+BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
+Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1
+OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
+SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc
+VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW
+Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q
+Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2
+1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq
+ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1
+Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX
+XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy
+dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6
+Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz
+JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290
+Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN
+irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8
+TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6
+g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB
+95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj
+S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw
+NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv
+b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD
+VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2
+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F
+VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1
+7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X
+Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+
+/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs
+81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm
+dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe
+Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu
+sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4
+pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs
+slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ
+arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD
+VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG
+9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl
+dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
+0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj
+TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed
+Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7
+Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI
+OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7
+vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW
+t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn
+HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx
+SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
+qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
+BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
+NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
+LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
+A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
+W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
+3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
+6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
+Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
+NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
+r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
+DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
+YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
+/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
+LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
+jVaMaA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
+IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
+BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
+MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
+YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
+dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
+BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
+papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
+DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
+KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
+XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
+rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
+BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
+Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
+LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
+MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
+ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
+gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
+YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
+b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
+9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
+zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
+OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
+HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
+2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
+oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
+KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
+m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
+MdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF
+MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL
+ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx
+MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc
+MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+
+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH
+iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj
+vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA
+0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB
+OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/
+BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E
+FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01
+GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW
+zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4
+1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE
+f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F
+jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN
+ZetX2fNXlrtIzYE=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc
+UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
+c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS
+S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg
+SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx
+OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry
+b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC
+VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE
+sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F
+ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY
+KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG
++7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG
+HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P
+IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M
+733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk
+Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G
+CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW
+AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
+aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5
+mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa
+XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ
+qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx
+EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT
+VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5
+NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT
+B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF
+10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz
+0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh
+MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH
+zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc
+46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2
+yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi
+laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP
+oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA
+BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE
+qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm
+4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL
+1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
+LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF
+H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo
+RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+
+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh
+15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW
+6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW
+nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j
+wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz
+aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy
+KwbQBM0=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES
+MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU
+V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz
+WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO
+LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE
+AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH
+K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX
+RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z
+rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx
+3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq
+hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC
+MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls
+XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D
+lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn
+aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ
+YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS
+MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp
+bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw
+VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy
+YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy
+dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2
+ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe
+Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx
+GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls
+aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU
+QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh
+xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0
+aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr
+IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h
+gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK
+O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO
+fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw
+lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
+hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID
+AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP
+NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t
+wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM
+7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh
+gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n
+oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs
+yZyQ2uypQjyttgI=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE
+BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn
+aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg
+QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg
+SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0
+MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD
+VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8
+dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom
+/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR
+Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3
+4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z
+5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0
+hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID
+AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX
+SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l
+VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
+URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf
+peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF
+Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW
++qtB4Uu2NQvAmxU=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQG
+EwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdp
+IMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBB
+LsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBI
+aXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5MDQxMFoXDTIzMTIx
+NjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBLBgNV
+BAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2
+ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVs
+ZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCdsGjW6L0UlqMACprx9MfMkU1x
+eHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a2uqsxgbPJQ1BgfbBOCK9
++bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EEDwnS3/faA
+z1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0p
+u5FbHH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6p
+lVxiSvgNZ1GpryHV+DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMB
+AAGjQjBAMB0GA1UdDgQWBBTdVRcT9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAb1gNl0Oq
+FlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3RfdCaqaXKGDsC
+QC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy
+o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKID
+gI6tflEATseWhvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm
+9ocJV612ph1jmv3XZch4gyt1O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsG
+tAuYSyher4hYyw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl
+eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT
+JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx
+MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
+Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg
+VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo
+I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng
+o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G
+A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB
+zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW
+RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
+MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
+BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
+dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
+3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
+tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
+Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
+VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
+79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
+c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
+Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
+c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
+UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
+Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
+BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
+Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
+VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
+ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
+8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
+iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
+Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
+XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
+qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
+VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
+L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
+jjxDah2nGN59PRbxYvnKkKj9
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB
+rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
+Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
+dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt
+Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa
+Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV
+BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l
+dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE
+AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B
+YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9
+hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l
+L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm
+SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM
+1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws
+6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
+DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw
+Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50
+aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH
+AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u
+7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0
+xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ
+rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim
+eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk
+USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB
+lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
+Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
+dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt
+SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG
+A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe
+MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v
+d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh
+cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn
+0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ
+M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a
+MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd
+oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI
+DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy
+oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0
+dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy
+bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF
+BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
+//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli
+CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE
+CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t
+3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS
+KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4
+nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO
+8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV
+ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb
+PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2
+6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr
+n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a
+qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4
+wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
+ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs
+pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4
+E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy
+aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s
+IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp
+Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV
+BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp
+Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu
+Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g
+Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
+IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU
+J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO
+JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY
+wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o
+koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN
+qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E
+Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe
+xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u
+7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
+sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI
+sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP
+cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
+N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
+KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
+kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
+CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
+Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
+imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
+2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
+DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
+F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
+TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp
+U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg
+SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln
+biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm
+GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve
+fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ
+aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj
+aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW
+kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC
+4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga
+FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
+ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
+nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
+t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
+SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
+BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
+rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
+NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
+BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
+BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
+MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
+p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
+5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
+WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
+4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
+hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB
+vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
+ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX
+MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
+IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y
+IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh
+bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF
+9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH
+H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H
+LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN
+/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT
+rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw
+WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs
+exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4
+sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+
+seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz
+4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+
+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR
+lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3
+7M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr
+MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl
+cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
+bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw
+CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h
+dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l
+cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h
+2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E
+lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV
+ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq
+299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t
+vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL
+dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
+AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF
+AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR
+zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3
+LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd
+7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw
+++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
+398znM/jra6O1I7mT1GvFpLgXPYHDw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx
+IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs
+cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v
+dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0
+MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl
+bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD
+DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r
+WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU
+Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs
+HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj
+z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf
+SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl
+AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG
+KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P
+AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j
+BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC
+VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX
+ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB
+ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd
+/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB
+A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn
+k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9
+iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv
+2G0xffX8oRAHh84vWdw+WNs=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBV
+MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNV
+BAMTIUNlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgw
+MTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFX
+b1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvcqN
+rLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1U
+fcIiePyOCbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcScc
+f+Hb0v1naMQFXQoOXXDX2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2
+ZjC1vt7tj/id07sBMOby8w7gLJKA84X5KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4M
+x1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR+ScPewavVIMYe+HdVHpR
+aG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ezEC8wQjch
+zDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDar
+uHqklWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221K
+mYo0SLwX3OSACCK28jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvA
+Sh0JWzko/amrzgD5LkhLJuYwTKVYyrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWv
+HYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0CAwEAAaNCMEAwDgYDVR0PAQH/
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R8bNLtwYgFP6H
+EtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1
+LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJ
+MuYhOZO9sxXqT2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2e
+JXLOC62qx1ViC777Y7NhRCOjy+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VN
+g64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC2nz4SNAzqfkHx5Xh9T71XXG68pWp
+dIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes5cVAWubXbHssw1ab
+R80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/EaEQ
+PkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGce
+xGATVdVhmVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+
+J7x6v+Db9NpSvd4MVHAxkUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMl
+OtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGikpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWT
+ee5Ehr7XHuQe+w==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBG
+MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNV
+BAMMEkNBIOayg+mAmuagueivgeS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgw
+MTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRl
+ZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k8H/r
+D195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld1
+9AXbbQs5uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExf
+v5RxadmWPgxDT74wwJ85dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnk
+UkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+L
+NVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFyb7Ao65vh4YOhn0pdr8yb
++gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc76DbT52V
+qyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6K
+yX2m+Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0G
+AbQOXDBGVWCvOGU6yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaK
+J/kR8slC/k7e3x9cxKSGhxYzoacXGKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwEC
+AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
+BBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUAA4ICAQBqinA4
+WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6
+yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj
+/feTZU7n85iYr83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6
+jBAyvd0zaziGfjk9DgNyp115j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2
+ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0AkLppRQjbbpCBhqcqBT/mhDn4t/lX
+X0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97qA4bLJyuQHCH2u2n
+FoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Yjj4D
+u9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10l
+O1Hm13ZBONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Le
+ie2uPAmvylezkolwQOQvT8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR1
+2KvxAmLBsX5VYc8T1yaw15zLKYs4SgsOkI26oQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
+gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
+MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
+UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
+NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
+dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
+dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
+38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
+KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
+DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
+qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
+JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
+PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
+BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
+jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
+eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
+vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
+IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
+i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
+O+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
diff --git a/app/src/se/liu/mrleo/ARCoreActivity.java b/app/src/se/liu/mrleo/ARCoreActivity.java
new file mode 100755
index 0000000..69770b5
--- /dev/null
+++ b/app/src/se/liu/mrleo/ARCoreActivity.java
@@ -0,0 +1,511 @@
+/*
+ * Copyright 2018 Google Inc. All Rights Reserved.
+ *
+ * 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 se.liu.mrleo;
+
+import android.annotation.SuppressLint;
+import android.content.pm.PackageManager;
+import android.opengl.GLES20;
+import android.opengl.GLSurfaceView;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.SystemClock;
+import android.support.annotation.GuardedBy;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+import android.widget.Button;
+import android.widget.Toast;
+
+import com.google.ar.core.Anchor;
+import com.google.ar.core.ArCoreApk;
+import com.google.ar.core.Camera;
+import com.google.ar.core.Config;
+import com.google.ar.core.Frame;
+import com.google.ar.core.HitResult;
+import com.google.ar.core.Plane;
+import com.google.ar.core.Point;
+import com.google.ar.core.Point.OrientationMode;
+import com.google.ar.core.PointCloud;
+import com.google.ar.core.Session;
+import com.google.ar.core.Trackable;
+import com.google.ar.core.TrackingState;
+import com.google.ar.core.exceptions.CameraNotAvailableException;
+import com.google.ar.core.exceptions.UnavailableApkTooOldException;
+import com.google.ar.core.exceptions.UnavailableArcoreNotInstalledException;
+import com.google.ar.core.exceptions.UnavailableSdkTooOldException;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Locale;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+import arcore.examples.java.common.helpers.PermissionHelper;
+import arcore.examples.java.common.helpers.DisplayRotationHelper;
+import arcore.examples.java.common.helpers.FullScreenHelper;
+import arcore.examples.java.common.helpers.SnackbarHelper;
+import arcore.examples.java.common.rendering.BackgroundRenderer;
+import arcore.examples.java.common.rendering.ObjectRenderer;
+import arcore.examples.java.common.rendering.ObjectRenderer.BlendMode;
+import arcore.examples.java.common.rendering.PlaneRenderer;
+import arcore.examples.java.common.rendering.PointCloudRenderer;
+
+/**
+ * This is a simple example that shows how to create an augmented reality (AR) application using the
+ * ARCore API. The application will display any detected planes and will allow the user to tap on a
+ * plane to place a 3d model of the Android robot.
+ */
+public class ARCoreActivity extends AppCompatActivity implements GLSurfaceView.Renderer {
+  private static final String TAG = ARCoreActivity.class.getSimpleName();
+
+  // Rendering. The Renderers are created here, and initialized when the GL surface is created.
+  private GLSurfaceView surfaceView;
+  private final BackgroundRenderer backgroundRenderer = new BackgroundRenderer(this);
+  private final ObjectRenderer virtualObject = new ObjectRenderer();
+  private final ObjectRenderer virtualObjectShadow = new ObjectRenderer();
+  private final PlaneRenderer planeRenderer = new PlaneRenderer();
+  private final PointCloudRenderer pointCloudRenderer = new PointCloudRenderer();
+
+  // Matrices pre-allocated here to reduce the number of allocations on every frame draw.
+  private final float[] anchorMatrix = new float[16];
+  private final float[] projectionMatrix = new float[16];
+  private final float[] viewMatrix = new float[16];
+  private final float[] colorCorrectionRgba = new float[4];
+
+  private long mStartTime = 0;
+  private long mAddObjectTime = 0;
+  private ArrayList<String> mMRObjectFoundTimes;
+
+  // Lock needed for synchronization.
+  private final Object singleTapAnchorLock = new Object();
+
+  // Tap handling and UI. This app allows you to place at most one anchor.
+  @GuardedBy("singleTapAnchorLock")
+  private MotionEvent queuedSingleTap;
+
+  private final SnackbarHelper snackbarHelper = new SnackbarHelper();
+  private DisplayRotationHelper displayRotationHelper;
+
+  // ARCore components
+  private Session session;
+  private boolean installRequested;
+
+  // Enable when doing benchmarking
+  public final static boolean AUTOMATE_TRIGGERS = true;
+  public final static int WRITE_BENCHMARK_DELAY = 60;
+
+  @Nullable
+  @GuardedBy("singleTapAnchorLock")
+  private Anchor anchor;
+
+  /**
+   * Handles a single tap during a {@link #onDrawFrame(GL10)} call.
+   */
+  private void handleTapOnDraw(TrackingState currentTrackingState, Frame currentFrame) {
+    synchronized (singleTapAnchorLock) {
+      if (anchor == null
+          && queuedSingleTap != null
+          && currentTrackingState == TrackingState.TRACKING) {
+        for (HitResult hit : currentFrame.hitTest(queuedSingleTap)) {
+          if (shouldCreateAnchorWithHit(hit)) {
+            Anchor newAnchor = hit.createAnchor();
+            setNewAnchor(newAnchor);
+            break;
+          }
+        }
+      }
+      queuedSingleTap = null;
+    }
+  }
+
+  /**
+   * Returns {@code true} if and only if {@code hit} can be used to create an anchor.
+   *
+   * <p>Checks if a plane was hit and if the hit was inside the plane polygon, or if an oriented
+   * point was hit. We only want to create an anchor if the hit satisfies these conditions.
+   */
+  private static boolean shouldCreateAnchorWithHit(HitResult hit) {
+    Trackable trackable = hit.getTrackable();
+    if (trackable instanceof Plane) {
+      // Check if any plane was hit, and if it was hit inside the plane polygon
+      return ((Plane) trackable).isPoseInPolygon(hit.getHitPose());
+    } else if (trackable instanceof Point) {
+      // Check if an oriented point was hit.
+      return ((Point) trackable).getOrientationMode() == OrientationMode.ESTIMATED_SURFACE_NORMAL;
+    }
+    return false;
+  }
+
+  @SuppressLint("ClickableViewAccessibility")
+  @Override
+  protected void onCreate(Bundle savedInstanceState) {
+    super.onCreate(savedInstanceState);
+    mMRObjectFoundTimes = new ArrayList<>();
+    setContentView(R.layout.activity_arcore);
+    surfaceView = findViewById(R.id.surfaceview);
+    displayRotationHelper = new DisplayRotationHelper(/*context=*/ this);
+
+    // Set up tap listener.
+    GestureDetector gestureDetector =
+        new GestureDetector(
+            this,
+            new GestureDetector.SimpleOnGestureListener() {
+              @Override
+              public boolean onSingleTapUp(MotionEvent e) {
+                synchronized (singleTapAnchorLock) {
+                  mAddObjectTime = SystemClock.elapsedRealtimeNanos();
+                  queuedSingleTap = e;
+                }
+                return true;
+              }
+
+              @Override
+              public boolean onDown(MotionEvent e) {
+                return true;
+              }
+            });
+    surfaceView.setOnTouchListener((unusedView, event) -> {
+      gestureDetector.onTouchEvent(event);
+      return true;
+    });
+    // Set up renderer.
+    surfaceView.setPreserveEGLContextOnPause(true);
+    surfaceView.setEGLContextClientVersion(2);
+    surfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); // Alpha used for plane blending.
+    surfaceView.setRenderer(this);
+    surfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
+    installRequested = false;
+
+    // Initialize the "Clear" button. Clicking it will clear the current anchor, if it exists.
+    Button clearButton = findViewById(R.id.clear_button);
+    clearButton.setOnClickListener(view -> {
+      {
+        synchronized (singleTapAnchorLock) {
+          setNewAnchor(null);
+        }
+      }
+    });
+
+    mStartTime = SystemClock.elapsedRealtimeNanos();
+
+    if (AUTOMATE_TRIGGERS) {
+      Timer mPointCloudTrigger = new Timer();
+      mPointCloudTrigger.schedule(new TimerTask() {
+        @Override
+        public void run() {
+          writeBenchmarkToFile(WRITE_BENCHMARK_DELAY);
+        }
+      }, WRITE_BENCHMARK_DELAY * 1000);
+    }
+  }
+
+  @Override
+  protected void onResume() {
+    super.onResume();
+
+    if (session == null) {
+      Exception exception = null;
+      int messageId = -1;
+      try {
+        switch (ArCoreApk.getInstance().requestInstall(this, !installRequested)) {
+          case INSTALL_REQUESTED:
+            installRequested = true;
+            return;
+          case INSTALLED:
+            break;
+        }
+
+        // ARCore requires camera permissions to operate. If we did not yet obtain runtime
+        // permission on Android M and above, now is a good time to ask the user for it.
+        if (!PermissionHelper.hasCameraPermission(this)) {
+          PermissionHelper.requestCameraPermission(this);
+          return;
+        }
+        session = new Session(this);
+      } catch (UnavailableArcoreNotInstalledException e) {
+        messageId = R.string.arcore_unavailable;
+        exception = e;
+      } catch (UnavailableApkTooOldException e) {
+        messageId = R.string.arcore_too_old;
+        exception = e;
+      } catch (UnavailableSdkTooOldException e) {
+        messageId = R.string.arcore_sdk_too_old;
+        exception = e;
+      } catch (Exception e) {
+        messageId = R.string.arcore_exception;
+        exception = e;
+      }
+
+      if (exception != null) {
+        snackbarHelper.showError(this, getString(messageId));
+        Log.e(TAG, "Exception creating session", exception);
+        return;
+      }
+
+      // Create default config and check if supported.
+      Config config = new Config(session);
+      session.configure(config);
+    }
+
+    // Note that order matters - see the note in onPause(), the reverse applies here.
+    try {
+      session.resume();
+    } catch (CameraNotAvailableException e) {
+      // In some cases (such as another camera app launching) the camera may be given to
+      // a different app instead. Handle this properly by showing a message and recreate the
+      // session at the next iteration.
+      snackbarHelper.showError(this, getString(R.string.camera_unavailable));
+      session = null;
+      return;
+    }
+    surfaceView.onResume();
+    displayRotationHelper.onResume();
+  }
+
+  @Override
+  public void onPause() {
+    super.onPause();
+    if (session != null) {
+      // Note that the order matters - GLSurfaceView is paused first so that it does not try
+      // to query the session. If Session is paused before GLSurfaceView, GLSurfaceView may
+      // still call session.update() and get a SessionPausedException.
+      displayRotationHelper.onPause();
+      surfaceView.onPause();
+      session.pause();
+    }
+  }
+
+  @Override
+  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] results) {
+    if (!PermissionHelper.hasCameraPermission(this)) {
+      Toast.makeText(this, "Camera permission is needed to run this application", Toast.LENGTH_LONG)
+          .show();
+      if (!PermissionHelper.shouldShowRequestPermissionRationale(this)) {
+        // Permission denied with checking "Do not ask again".
+        PermissionHelper.launchPermissionSettings(this);
+      }
+      finish();
+    }
+    if (results.length > 0 && results[0] == PackageManager.PERMISSION_GRANTED &&
+        requestCode == PermissionHelper.STORAGE_PERMISSION_CODE) {
+      writeBenchmarkToFile(WRITE_BENCHMARK_DELAY);
+    }
+  }
+
+  @Override
+  public void onWindowFocusChanged(boolean hasFocus) {
+    super.onWindowFocusChanged(hasFocus);
+    FullScreenHelper.setFullScreenOnWindowFocusChanged(this, hasFocus);
+  }
+
+  @Override
+  public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+    GLES20.glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
+
+    // Prepare the rendering objects. This involves reading shaders, so may throw an IOException.
+    try {
+      // Create the texture and pass it to ARCore session to be filled during update().
+      backgroundRenderer.createOnGlThread(/*context=*/ this);
+      planeRenderer.createOnGlThread(/*context=*/ this, "models/trigrid.png");
+      pointCloudRenderer.createOnGlThread(/*context=*/ this);
+
+      virtualObject.createOnGlThread(/*context=*/ this, "models/andy.obj", "models/andy.png");
+      virtualObject.setMaterialProperties(0.0f, 2.0f, 0.5f, 6.0f);
+
+      virtualObjectShadow.createOnGlThread(
+          /*context=*/ this, "models/andy_shadow.obj", "models/andy_shadow.png");
+      virtualObjectShadow.setBlendMode(BlendMode.Shadow);
+      virtualObjectShadow.setMaterialProperties(1.0f, 0.0f, 0.0f, 1.0f);
+    } catch (IOException ex) {
+      Log.e(TAG, "Failed to read an asset file", ex);
+    }
+  }
+
+  @Override
+  public void onSurfaceChanged(GL10 gl, int width, int height) {
+    displayRotationHelper.onSurfaceChanged(width, height);
+    GLES20.glViewport(0, 0, width, height);
+  }
+
+  @Override
+  public void onDrawFrame(GL10 gl) {
+    // Clear screen to notify driver it should not load any pixels from previous frame.
+    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
+
+    if (session == null) {
+      return;
+    }
+    // Notify ARCore session that the view size changed so that the perspective matrix and
+    // the video background can be properly adjusted.
+    displayRotationHelper.updateSessionIfNeeded(session);
+
+    try {
+      session.setCameraTextureName(backgroundRenderer.getTextureId());
+
+      // Obtain the current frame from ARSession. When the configuration is set to
+      // UpdateMode.BLOCKING (it is by default), this will throttle the rendering to the
+      // camera framerate.
+      Frame frame = session.update();
+      Camera camera = frame.getCamera();
+      TrackingState cameraTrackingState = camera.getTrackingState();
+
+      // Handle taps.
+      handleTapOnDraw(cameraTrackingState, frame);
+
+      // Draw background.
+      backgroundRenderer.draw(frame);
+
+      // If not tracking, don't draw 3d objects.
+      if (cameraTrackingState == TrackingState.PAUSED) {
+        return;
+      }
+
+      // Get projection and camera matrices.
+      camera.getProjectionMatrix(projectionMatrix, 0, 0.1f, 100.0f);
+      camera.getViewMatrix(viewMatrix, 0);
+
+      // Visualize tracked points.
+      PointCloud pointCloud = frame.acquirePointCloud();
+      pointCloudRenderer.update(pointCloud);
+      pointCloudRenderer.draw(viewMatrix, projectionMatrix);
+
+      // Application is responsible for releasing the point cloud resources after
+      // using it.
+      pointCloud.release();
+
+      // Visualize planes.
+      //planeRenderer.drawPlanes(
+      //    session.getAllTrackables(Plane.class), camera.getDisplayOrientedPose(), projectionMatrix);
+
+      // Visualize anchor.
+      boolean shouldDrawAnchor = false;
+      synchronized (singleTapAnchorLock) {
+        if (anchor != null && anchor.getTrackingState() == TrackingState.TRACKING) {
+          frame.getLightEstimate().getColorCorrection(colorCorrectionRgba, 0);
+
+          // Get the current pose of an Anchor in world space. The Anchor pose is updated
+          // during calls to session.update() as ARCore refines its estimate of the world.
+          anchor.getPose().toMatrix(anchorMatrix, 0);
+          shouldDrawAnchor = true;
+        }
+      }
+      if (shouldDrawAnchor) {
+        float scaleFactor = 1.0f;
+        frame.getLightEstimate().getColorCorrection(colorCorrectionRgba, 0);
+
+        // Update and draw the model and its shadow.
+        virtualObject.updateModelMatrix(anchorMatrix, scaleFactor);
+        virtualObjectShadow.updateModelMatrix(anchorMatrix, scaleFactor);
+        virtualObject.draw(viewMatrix, projectionMatrix, colorCorrectionRgba);
+        virtualObjectShadow.draw(viewMatrix, projectionMatrix, colorCorrectionRgba);
+      }
+      if (mAddObjectTime != 0) {
+        long mMRObjectFoundTime = (SystemClock.elapsedRealtimeNanos() - mAddObjectTime) / 1000000;
+        long timeSinceStart = (SystemClock.elapsedRealtimeNanos() - mStartTime) / 1000000;
+        mMRObjectFoundTimes.add(timeSinceStart + "," + mMRObjectFoundTime);
+        runOnUiThread(() -> Toast.makeText(ARCoreActivity.this, "Adding object took: " +
+            mMRObjectFoundTime + " ms.", Toast.LENGTH_SHORT).show());
+        mAddObjectTime = 0;
+      }
+    } catch (Throwable t) {
+      // Avoid crashing the application due to unhandled exceptions.
+      Log.e(TAG, "Exception on the OpenGL thread", t);
+    }
+  }
+
+  private void writeBenchmarkToFile(int maxSeconds) {
+    if (!PermissionHelper.hasStoragePermission(this)) {
+      PermissionHelper.requestStoragePermission(this);
+      return;
+    }
+    FileWriter fileWriter = null;
+    try {
+      //Delimiter used in CSV file
+      final String COMMA_DELIMITER = ",";
+      final String NEW_LINE_SEPARATOR = "\n";
+
+      File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
+      File file = new File(dir, "mr_arcore_" +
+          (new SimpleDateFormat("MM-dd", Locale.getDefault()).format(new Date())) + ".txt");
+
+      fileWriter = new FileWriter(file, true);
+
+      fileWriter.append("timestamp");
+      fileWriter.append(COMMA_DELIMITER);
+      fileWriter.append(DateFormat.getDateTimeInstance().format(new Date()));
+      fileWriter.append(NEW_LINE_SEPARATOR);
+
+      for (int i = 0; i < mMRObjectFoundTimes.size(); i++) {
+        fileWriter.append("mr_object_time");
+        fileWriter.append(COMMA_DELIMITER);
+        fileWriter.append(mMRObjectFoundTimes.get(i));
+        fileWriter.append(NEW_LINE_SEPARATOR);
+      }
+
+      if (maxSeconds == 0) {
+        maxSeconds = WRITE_BENCHMARK_DELAY;
+      }
+      for (int i = 0; i < maxSeconds; i++) {
+        fileWriter.append("fps");
+        fileWriter.append(COMMA_DELIMITER);
+        fileWriter.append(Integer.toString(i));
+        fileWriter.append(COMMA_DELIMITER);
+        int frames = backgroundRenderer.getFrames(i);
+        fileWriter.append(Integer.toString(frames));
+        fileWriter.append(NEW_LINE_SEPARATOR);
+        Log.d(TAG, "FPS: " + i + ": " + frames);
+      }
+      runOnUiThread(() -> Toast.makeText(this, "Measurements saved to location: " + file.getAbsolutePath(),
+          Toast.LENGTH_LONG).show());
+    } catch (Exception e) {
+      Log.e(TAG, "writeBenchmarkToFile exception: " + e.getMessage());
+      runOnUiThread(() -> Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show());
+    } finally {
+      try {
+        if (fileWriter != null) {
+          fileWriter.flush();
+          fileWriter.close();
+        }
+      } catch (Exception e) {
+        Log.d(TAG, "File error");
+      }
+    }
+  }
+
+
+  /**
+   * Sets the new anchor in the scene.
+   */
+  @GuardedBy("singleTapAnchorLock")
+  private void setNewAnchor(@Nullable Anchor newAnchor) {
+    if (anchor != null) {
+      anchor.detach();
+    }
+    anchor = newAnchor;
+  }
+}
diff --git a/app/src/se/liu/mrleo/AboutActivity.java b/app/src/se/liu/mrleo/AboutActivity.java
new file mode 100644
index 0000000..3d6a6ec
--- /dev/null
+++ b/app/src/se/liu/mrleo/AboutActivity.java
@@ -0,0 +1,18 @@
+package se.liu.mrleo;
+
+import android.os.Bundle;
+import android.app.Activity;
+
+/**
+ * Simple activity for displaying the About screen.
+ */
+public class AboutActivity extends Activity {
+
+  @Override
+  protected void onCreate(Bundle savedInstanceState) {
+    super.onCreate(savedInstanceState);
+    setContentView(R.layout.activity_about);
+    findViewById(R.id.backbutton).setOnClickListener(
+        v -> AboutActivity.this.finish());
+  }
+}
diff --git a/app/src/se/liu/mrleo/EdgeActivity.java b/app/src/se/liu/mrleo/EdgeActivity.java
new file mode 100644
index 0000000..a69e17f
--- /dev/null
+++ b/app/src/se/liu/mrleo/EdgeActivity.java
@@ -0,0 +1,2254 @@
+package se.liu.mrleo;
+
+import android.Manifest;
+import android.annotation.SuppressLint;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.graphics.SurfaceTexture;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.SystemClock;
+import android.support.annotation.NonNull;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.content.ContextCompat;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+import android.util.Pair;
+import android.util.Patterns;
+import android.util.Size;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.TextureView;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import com.pedro.rtplibrary.rtsp.RtspCamera2;
+import com.pedro.rtplibrary.rtsp.RtspFromFile;
+import com.pedro.rtsp.rtsp.Protocol;
+import com.pedro.rtsp.rtsp.VideoCodec;
+import com.pedro.rtsp.utils.ConnectCheckerRtsp;
+
+import org.freedesktop.gstreamer.GStreamer;
+import org.json.JSONObject;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.net.InetAddress;
+import java.net.InterfaceAddress;
+import java.net.NetworkInterface;
+import java.nio.charset.StandardCharsets;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Objects;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.regex.Pattern;
+
+import se.liu.mrleo.edge.ImageEncoder;
+import se.liu.mrleo.edge.StillCamera;
+import se.liu.mrleo.edge.dialogs.BitrateSelector;
+import se.liu.mrleo.edge.dialogs.CaptureResolutionSelector;
+import se.liu.mrleo.edge.dialogs.MRObjectSelector;
+import se.liu.mrleo.edge.dialogs.MessageBoxFragment;
+import se.liu.mrleo.edge.dialogs.PacketSizeSelector;
+import se.liu.mrleo.edge.network.InternetConnection;
+import se.liu.mrleo.edge.network.TcpConnection;
+import se.liu.mrleo.edge.network.UdpConnection;
+import se.liu.mrleo.edge.streaming.GStreamerSurfaceView;
+
+@SuppressWarnings("ApplySharedPref")
+public class EdgeActivity extends AppCompatActivity
+    implements
+    MRObjectSelector.Listener,
+    CaptureResolutionSelector.Listener,
+    PacketSizeSelector.Listener,
+    BitrateSelector.Listener {
+
+  public static final StringPair[] EndDeviceTransmissionMethods = new StringPair[]{
+      new StringPair("H.264 over TCP (with SW encoder)", "TCP_H264_SW"),
+      new StringPair("H.264 over UDP (with SW encoder)", "UDP_H264_SW"),
+      new StringPair("H.264 over UDP (with HW encoder)", "UDP_H264_HW"),
+  };
+
+  public static final StringPair[] EdgeNodeTransmissionMethods = new StringPair[]{
+      new StringPair("H.264 over TCP", "TCP_H264"),
+      new StringPair("H.264 over UDP", "UDP_H264"),
+      new StringPair("MJPEG over TCP", "TCP_MJPEG"),
+      new StringPair("MJPEG over UDP", "UDP_MJPEG"),
+  };
+
+  // Enable when doing benchmarking
+  public static boolean AUTOMATE_TRIGGERS = false;
+  public static final int INSERT_MR_OBJECT_INTERVAL_SEC = 10;
+  public static final int INSERT_MR_OBJECT_DELAY_SEC = 10;
+  public static final int SEND_PING_INTERVAL_SEC = 5;
+  public static final int WRITE_BENCHMARK_DELAY_SEC = 65;
+
+  private static String TAG = "EdgeActivity";
+
+  private static final String CAPTURE_SIZE_DIALOG = "CaptureSizeDialog";
+  private static final String ABOUT_DIALOG = "AboutDialog";
+  private static final String BITRATE_DIALOG = "BitrateDialog";
+  private static final String PACKETSIZE_DIALOG = "PacketsizeDialog";
+  private static final String MR_OBJECT_DIALOG = "MRObjectDialog";
+  public static final String STORED_SETTINGS = "StoredSettings";
+
+  private static final int REQUEST_EXTERNAL_STORAGE_PERMISSION = 2;
+
+  public enum CameraStreamer {
+    StillImage, GStreamer, RtpLib
+  }
+
+  private CameraStreamer mCameraStreamer = CameraStreamer.RtpLib;
+
+  // Force test mode, camera resolutions limited.
+  private boolean mForceTestMode = true;
+
+  // Context menu options.
+  private MenuItem mCaptureSizeMenuItem = null;
+  private MenuItem mBitrateInMenuItem = null;
+  private MenuItem mBitrateOutMenuItem = null;
+  private MenuItem mCalibrationModeMenuItem = null;
+  private MenuItem mDebugModeMenuItem = null;
+  private MenuItem mButtonSizeMenuItem = null;
+  private MenuItem mPacketSizeMenuItem = null;
+
+  private StillCamera mStillCamera = null;
+  private ImageEncoder mImageEncoder = null;
+  private TcpConnection mTcpConnection = null;
+  private UdpConnection mUdpConnection = null;
+  private boolean mUseTcp = false;
+  private boolean mJpegStream = false;
+
+  private String mSourceVideoFile = "";
+  private Size mTransmitterImageSize = new Size(640, 480);
+  private String mServerIP = "";
+  private int mServerTcpPort = 39200;
+  private int mServerUdpPort = 0;
+  private int mUdpPacketSize = 2000;
+  private int mBitrateIn = 5000;
+  private int mBitrateOut = 5000;
+  private int mVideoDestPort = 0;
+  private int mSessionId = 0;
+  private boolean mEdgeDeviceJitterBuffer = false;
+  private boolean mEndDeviceJitterBuffer = false;
+  private int mMRObjectFoundSent = 0;
+  private int mSourceFrameFoundSent = 0;
+
+  private boolean mDebugMode = false;
+  private boolean mButtonsLarge = false;
+  private Button mActionAButton = null;
+  private Button mActionBButton = null;
+  private Button mExitButton = null;
+
+  private long mActionAButtonTimer = 0;
+  private long mReceiverStartTime = 0;
+  private long mTransmissionStartTime = 0;
+  private long mTransmissionStartTimePosCorr = 0;
+  private long mPingTimerStart = 0;
+  private long mMRObjectFoundTime = 0;
+  private ArrayList<String> mMRObjectFoundTimes;
+  private ArrayList<String> mPingTimes;
+  private boolean mARTriggerSent = false;
+  private boolean mSourceColorTriggerSent = false;
+  private MRObjectSelector.MRObjects mMRObject = null;
+
+  @SuppressLint("UseSparseArrays")
+  private HashMap<Integer, Integer> mReceiverFps = new HashMap<>();
+  @SuppressLint("UseSparseArrays")
+  private HashMap<Integer, Integer> mTransmitterFps = new HashMap<>();
+  @SuppressLint("UseSparseArrays")
+  private HashMap<Integer, Integer> mMetadataFoundTimes = new HashMap<>();
+
+  @SuppressLint("UseSparseArrays")
+  private HashMap<Integer, Pair<Integer, Integer>> mFrameArrivalTimes = new HashMap<>();
+
+  private int mSourceColorFramesDetected = 0;
+  private boolean mGStreamerReceiverInitialized = false;
+  private boolean mGStreamerTransmitterInitialized = false;
+  private String mVideoReceiverFormat = null;
+
+  @SuppressWarnings("FieldCanBeLocal")
+  private boolean mUseImageView = true;
+  private String mStillCameraId = "0";
+
+  private RtspCamera2 mRtpLibCamera = null;
+  private RtspFromFile mRtpLibFile = null;
+  private boolean mRtpLibCameraSurfaceViewCreated = false;
+
+  private String mVideoTransmitterFormat = "";
+  private boolean mTransmitterStreamAnnounced = false;
+
+  private boolean mCalibrationModeEnabled = false;
+  private boolean mCalibrationNeeded = true;
+
+  private TextureView mCameraPreviewView = null;
+  private ImageView mImageReceiverImageView = null;
+  private SurfaceView mImageReceiverSurfaceView = null;
+  private SurfaceView mRtpLibCameraSurfaceView = null;
+  private GStreamerSurfaceView mGStreamerTransmitterView = null;
+  private Surface mGStreamerReceiverSurface = null;
+  private Surface mGStreamerTransmitterSurface = null;
+
+  private native void nativeReceiverInit(String streamFormat, String localHost,
+                                         int preventJitter);
+
+  private native void nativeTransmitterInit(String destHost, int port, String format,
+                                            int width, int height, int bitrate,
+                                            String videoFileSource);
+
+  private native void nativeReceiverFinalize();
+
+  private native void nativeTransmitterFinalize();
+
+  private native void nativeReceiverPlay();
+
+  private native void nativeTransmitterPlay();
+
+  @SuppressWarnings("unused")
+  private native String nativeGetEncoders();
+
+  private native int nativeReceiverGetPort();
+
+  @SuppressWarnings("unused")
+  private native String nativeGetDecoders();
+
+  private native void nativeTransmitterSetBitrate(int bitrate);
+
+  private native void nativeGetTransmitterFps();
+
+  private native void nativeGetReceiverFps();
+
+  private native void nativeGetMetadataFoundTimes();
+
+  private native void nativeGetFrameArrivalTimes();
+
+  @SuppressWarnings("unused")
+  private native void nativeTransmitterPause();
+
+  @SuppressWarnings("unused")
+  private native void nativeReceiverPause();
+
+  @SuppressWarnings("unused")
+  private native void nativeCameraSetResolution(int width, int height);
+
+  @SuppressWarnings("unused")
+  private native void nativeCameraSetRotateMethod(int rotation);
+
+  @SuppressWarnings("unused")
+  private native void nativeCameraSetWhiteBalance(int wb);
+
+  @SuppressWarnings("unused")
+  private native void nativeCameraSetAutoFocus(boolean af);
+
+  private static native boolean nativeClassInit();
+
+  private native void nativeReceiverSurfaceInit(Object surface);
+
+  private native void nativeReceiverSurfaceFinalize();
+
+  private native void nativeTransmitterSurfaceInit(Object surface);
+
+  private native void nativeTransmitterSurfaceFinalize();
+
+  // Native code will use this to keep private data
+  @SuppressWarnings("unused")
+  private long native_custom_receiver_data;
+  @SuppressWarnings("unused")
+  private long native_custom_transmitter_data;
+
+  final static int uiFlags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
+      View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
+      View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
+      View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
+      View.SYSTEM_UI_FLAG_FULLSCREEN |
+      View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
+
+  /**
+   * The constructor, called by the Android system when the Activity is created.
+   *
+   * @param savedInstanceState Bundle with the parameters.
+   */
+  @Override
+  protected void onCreate(Bundle savedInstanceState) {
+    super.onCreate(savedInstanceState);
+
+    mMRObjectFoundTimes = new ArrayList<>();
+    mPingTimes = new ArrayList<>();
+
+    SharedPreferences prefs = getSharedPreferences(STORED_SETTINGS, MODE_PRIVATE);
+    mServerIP = prefs.getString("edge_device_ip", mServerIP);
+    mServerTcpPort = prefs.getInt("edge_device_port", mServerTcpPort);
+    mVideoReceiverFormat = prefs.getString("edge_device_transmission", "UDP_H264");
+    mVideoTransmitterFormat = prefs.getString("end_device_transmission", "UDP_H264_HW");
+    mMRObject = MRObjectSelector.MRObjects.valueOf(prefs.getString("ar_object", "CUBE_A"));
+
+    Bundle bundle = getIntent().getExtras();
+    if (bundle != null) {
+      if (bundle.containsKey("edge_device_ip")) {
+        mServerIP = bundle.getString("edge_device_ip");
+      }
+      if (bundle.containsKey("edge_device_port")) {
+        mServerTcpPort = bundle.getInt("edge_device_port");
+      }
+      if (bundle.containsKey("edge_device_jitterbuffer")) {
+        mEdgeDeviceJitterBuffer = bundle.getBoolean("edge_device_jitterbuffer");
+      }
+      if (bundle.containsKey("end_device_jitterbuffer")) {
+        mEndDeviceJitterBuffer = bundle.getBoolean("end_device_jitterbuffer");
+      }
+      mSourceVideoFile = bundle.getString("source_video_file", "");
+      if (mSourceVideoFile != null && !mSourceVideoFile.isEmpty()) {
+        AUTOMATE_TRIGGERS = true;
+      }
+      String edgeNodeTransmission = bundle.getString("edge_device_transmission", "");
+      if (!edgeNodeTransmission.isEmpty()) {
+        mVideoReceiverFormat = edgeNodeTransmission;
+      }
+      String endDeviceTransmission = bundle.getString("end_device_transmission", "");
+      if (!endDeviceTransmission.isEmpty()) {
+        mVideoTransmitterFormat = endDeviceTransmission;
+      }
+    }
+
+    try {
+      GStreamer.init(this);
+    } catch (Exception e) {
+      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
+      finish();
+      return;
+    }
+
+    requestWindowFeature(Window.FEATURE_NO_TITLE);
+    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+    getWindow().getDecorView().setSystemUiVisibility(uiFlags);
+
+    setContentView(R.layout.activity_edge);
+
+    mExitButton = findViewById(R.id.exit_edge_button);
+    mExitButton.setOnClickListener(
+        v -> new AlertDialog.Builder(EdgeActivity.this)
+            .setTitle("Exit")
+            .setMessage("Do you want to leave the app?")
+            .setPositiveButton(android.R.string.yes,
+                (dialog, whichButton) -> EdgeActivity.this.finish())
+            .setNegativeButton(android.R.string.no, null).show());
+
+    mActionAButton = findViewById(R.id.action_button_a);
+    mActionAButton.setOnClickListener(mActionAOnClickListener);
+
+    mActionBButton = findViewById(R.id.action_button_b);
+    mActionBButton.setOnClickListener(mActionBOnClickListener);
+
+    final View decorView = getWindow().getDecorView();
+    decorView.setOnSystemUiVisibilityChangeListener(visibility -> {
+      if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
+        decorView.setSystemUiVisibility(uiFlags);
+      }
+    });
+
+    switch (mVideoReceiverFormat) {
+      case "UDP_MJPEG":
+      case "TCP_MJPEG":
+        mReceiverFps.clear();
+        mMetadataFoundTimes.clear();
+        mJpegStream = true;
+        if (mUseImageView) {
+          mImageReceiverImageView = findViewById(R.id.receiver_image_view);
+          mImageReceiverImageView.setVisibility(View.VISIBLE);
+        } else {
+          mImageReceiverSurfaceView = findViewById(R.id.receiver_surface_view);
+          mImageReceiverSurfaceView.setVisibility(View.VISIBLE);
+        }
+        mUseTcp = mVideoReceiverFormat.equals("TCP_MJPEG");
+        break;
+      case "UDP_H264":
+      case "TCP_H264":
+        mJpegStream = false;
+        GStreamerSurfaceView mGStreamerReceiverView = this.findViewById(R.id.gstreamer_receiver_surfaceview);
+        mGStreamerReceiverView.getHolder().addCallback(mGStreamerReceiverViewListener);
+        mGStreamerReceiverView.setVisibility(View.VISIBLE);
+        break;
+    }
+
+    switch (mVideoTransmitterFormat) {
+      case "UDP_H264_SW":
+      case "TCP_H264_SW":
+        mCameraStreamer = CameraStreamer.GStreamer;
+        Log.d(TAG, "Using CameraStreamer.GStreamer");
+        mGStreamerTransmitterView = this.findViewById(R.id.gstreamer_camera_surfaceview);
+        mGStreamerTransmitterView.getHolder().addCallback(mGStreamerTransmitterViewListener);
+        mGStreamerTransmitterView.setVisibility(View.VISIBLE);
+        mGStreamerTransmitterView.requestLayout();
+        break;
+      case "UDP_H264_HW":
+        mCameraStreamer = CameraStreamer.RtpLib;
+        Log.d(TAG, "Using CameraStreamer.RtpLib");
+        mRtpLibCameraSurfaceView = findViewById(R.id.rtp_lib_camera_surface);
+        mRtpLibCameraSurfaceView.getHolder().addCallback(mRtpLibCameraSurfaceViewListener);
+        mRtpLibCameraSurfaceView.setVisibility(View.VISIBLE);
+        //mRtpLibCameraSurfaceView.requestLayout();
+        break;
+      default:
+        mCameraStreamer = CameraStreamer.StillImage;
+        Log.d(TAG, "Using CameraStreamer.StillImage");
+        mCameraPreviewView = findViewById(R.id.camera_textureview);
+        mCameraPreviewView.setSurfaceTextureListener(mStillCameraPreviewTextureListener);
+        mCameraPreviewView.setVisibility(View.VISIBLE);
+        mCameraPreviewView.requestLayout();
+        mImageEncoder = new ImageEncoder();
+    }
+
+    setJpegStream(mJpegStream);
+
+    Log.d(TAG, "mVideoTransmitterFormat: " + mVideoTransmitterFormat);
+    Log.d(TAG, "mVideoReceiverFormat: " + mVideoReceiverFormat);
+
+    initTransmitter();
+
+    setSupportActionBar(findViewById(R.id.toolbar));
+    ActionBar actionBar = getSupportActionBar();
+    if (actionBar != null) {
+      actionBar.setDisplayShowTitleEnabled(false);
+      actionBar.setDisplayShowHomeEnabled(false);
+    }
+
+    mReceiverFps.clear();
+    mTransmitterFps.clear();
+
+    onBitrateSelected(BitrateSelector.Direction.Inbound, prefs.getInt("edge_device_bitrate", mBitrateIn));
+    onBitrateSelected(BitrateSelector.Direction.Outbound, prefs.getInt("end_device_bitrate", mBitrateOut));
+    onPacketSizeSelected(prefs.getInt("packet_size", mUdpPacketSize));
+    connectToTcpServer(mServerIP, mServerTcpPort);
+
+    if (prefs.contains("camera_width") && prefs.contains("camera_height")) {
+      onCaptureSizeSelected(new Size(
+          prefs.getInt("camera_width", 0),
+          prefs.getInt("camera_height", 0)));
+    } else {
+      onAutoCaptureSizeSelected();
+    }
+  }
+
+  /**
+   * Send the GStreamer video receiver's allocated port number and
+   * the configured video stream format to the server.
+   */
+  private void sendGStreamerReceiverInfo() {
+    try {
+      if (mGStreamerReceiverInitialized) {
+        JSONObject settingsJson = new JSONObject();
+        settingsJson.put("VideoReceiverPort", nativeReceiverGetPort());
+        switch (mVideoReceiverFormat) {
+          case "UDP_H264":
+            settingsJson.put("VideoReceiverFormat", "H264_UDP");
+            break;
+          case "TCP_H264":
+            settingsJson.put("VideoReceiverFormat", "H264_TCP");
+            break;
+        }
+        sendJSON(settingsJson);
+      }
+    } catch (Exception e) {
+      Log.e(TAG, "sendGStreamerReceiverInfo Exception: " + e.getMessage());
+    }
+  }
+
+  /**
+   * Send the image settings such as stored camera calibration and
+   * pixel resolution to the server.
+   */
+  private void sendImageSettings() {
+    JSONObject settingsJson = new JSONObject();
+    try {
+      settingsJson.put("Camera.width", mTransmitterImageSize.getWidth());
+      settingsJson.put("Camera.height", mTransmitterImageSize.getHeight());
+    } catch (Exception e) {
+      Log.e(TAG, e.getMessage());
+      return;
+    }
+    mCalibrationNeeded = true;
+    try {
+      SharedPreferences prefs = getSharedPreferences(STORED_SETTINGS, MODE_PRIVATE);
+      String prefName = "calibration_" +
+          mTransmitterImageSize.getWidth() + "_" + mTransmitterImageSize.getHeight() + "_";
+      if (prefs.contains(prefName + "fx") &&
+          prefs.contains(prefName + "fy") &&
+          prefs.contains(prefName + "cx") &&
+          prefs.contains(prefName + "cy") &&
+          prefs.contains(prefName + "k1") &&
+          prefs.contains(prefName + "k2") &&
+          prefs.contains(prefName + "k3") &&
+          prefs.contains(prefName + "p1") &&
+          prefs.contains(prefName + "p2")) {
+        settingsJson.put("Camera.fx", prefs.getFloat(prefName + "fx", 0));
+        settingsJson.put("Camera.fy", prefs.getFloat(prefName + "fy", 0));
+        settingsJson.put("Camera.cx", prefs.getFloat(prefName + "cx", 0));
+        settingsJson.put("Camera.cy", prefs.getFloat(prefName + "cy", 0));
+        settingsJson.put("Camera.k1", prefs.getFloat(prefName + "k1", 0));
+        settingsJson.put("Camera.k2", prefs.getFloat(prefName + "k2", 0));
+        settingsJson.put("Camera.k3", prefs.getFloat(prefName + "k3", 0));
+        settingsJson.put("Camera.p1", prefs.getFloat(prefName + "p1", 0));
+        settingsJson.put("Camera.p2", prefs.getFloat(prefName + "p2", 0));
+        mCalibrationNeeded = false;
+      }
+    } catch (Exception e) {
+      Log.e(TAG, "sendImageSettings: " + e.getMessage());
+    }
+    Log.d(TAG, "Calibration needed? " + (mCalibrationNeeded ? "Yes" : "No"));
+    sendJSON(settingsJson);
+  }
+
+  /**
+   * Store a camera calibration in the local file storage.
+   *
+   * @param jsonObject JSONObject containing the camera calibration.
+   */
+  private void storeCameraCalibration(JSONObject jsonObject) {
+    try {
+      if (jsonObject.has("Camera.fx") &&
+          jsonObject.has("Camera.fy") &&
+          jsonObject.has("Camera.cx") &&
+          jsonObject.has("Camera.cy") &&
+          jsonObject.has("Camera.k1") &&
+          jsonObject.has("Camera.k2") &&
+          jsonObject.has("Camera.k3") &&
+          jsonObject.has("Camera.p1") &&
+          jsonObject.has("Camera.p2")) {
+        String prefName = "calibration_" + jsonObject.getInt("Camera.width") +
+            "_" + jsonObject.getInt("Camera.height") + "_";
+        getSharedPreferences(STORED_SETTINGS, MODE_PRIVATE).edit()
+            .putFloat(prefName + "fx", (float) jsonObject.getDouble("Camera.fx"))
+            .putFloat(prefName + "fy", (float) jsonObject.getDouble("Camera.fy"))
+            .putFloat(prefName + "cx", (float) jsonObject.getDouble("Camera.cx"))
+            .putFloat(prefName + "cy", (float) jsonObject.getDouble("Camera.cy"))
+            .putFloat(prefName + "k1", (float) jsonObject.getDouble("Camera.k1"))
+            .putFloat(prefName + "k2", (float) jsonObject.getDouble("Camera.k2"))
+            .putFloat(prefName + "k3", (float) jsonObject.getDouble("Camera.k3"))
+            .putFloat(prefName + "p1", (float) jsonObject.getDouble("Camera.p1"))
+            .putFloat(prefName + "p2", (float) jsonObject.getDouble("Camera.p2"))
+            .commit();
+      }
+    } catch (Exception e) {
+      Log.e(TAG, "storeCameraCalibration JSON parse: " + e.getMessage());
+    }
+  }
+
+  /**
+   * Remove stored camera calibration.
+   *
+   * @param captureSize Resolution in pixels.
+   */
+  private void removeCameraCalibration(Size captureSize) {
+    try {
+      String prefName = "calibration_" + captureSize.getWidth() + "_"
+          + captureSize.getHeight() + "_";
+      getSharedPreferences(STORED_SETTINGS, MODE_PRIVATE).edit()
+          .remove(prefName + "fx")
+          .remove(prefName + "fy")
+          .remove(prefName + "cx")
+          .remove(prefName + "cy")
+          .remove(prefName + "k1")
+          .remove(prefName + "k2")
+          .remove(prefName + "k3")
+          .remove(prefName + "p1")
+          .remove(prefName + "p2")
+          .commit();
+      mCalibrationNeeded = true;
+    } catch (Exception e) {
+      Log.e(TAG, "removeCameraCalibration: " + e.getMessage());
+    }
+  }
+
+  /**
+   * Switch between the front and back cameras.
+   * Not suported by all camera streamers.
+   */
+  private void switchCamera() {
+    if (mImageEncoder != null) {
+      mImageEncoder.stop();
+    }
+    if (mStillCamera != null) {
+      int newCamera = Integer.parseInt(mStillCameraId) == 1 ? 0 : 1;
+      mStillCameraId = Integer.toString(newCamera);
+      mStillCamera.openCamera(mStillCameraId);
+    }
+  }
+
+  /**
+   * Callbacks for the still camera.
+   */
+  StillCamera.Listener mStillCameraListener = new StillCamera.Listener() {
+    @Override
+    public void onCameraOpened() {
+      Log.d(TAG, "onCameraOpened");
+      List<Size> dimensions = mStillCamera.getImageDimensions();
+      if (dimensions.size() == 0) {
+        Log.d(TAG, "onCameraOpened: No dimensions");
+        return;
+      }
+      onAutoCaptureSizeSelected();
+    }
+
+    @Override
+    public void onCameraDisconnected() {
+    }
+
+    @Override
+    public void onCameraError(int error) {
+    }
+  };
+
+  /**
+   * Init the options context menu.
+   */
+  @Override
+  public boolean onCreateOptionsMenu(Menu menu) {
+    getMenuInflater().inflate(R.menu.main, menu);
+    mCaptureSizeMenuItem = menu.findItem(R.id.capture_size);
+    mCalibrationModeMenuItem = menu.findItem(R.id.calibration_mode);
+    mBitrateInMenuItem = menu.findItem(R.id.bitrate_in);
+    mBitrateOutMenuItem = menu.findItem(R.id.bitrate_out);
+    MenuItem mReceiverStreamFormatMenuItem = menu.findItem(R.id.receiver_stream_format);
+    MenuItem mTransmitterStreamFormatMenuItem = menu.findItem(R.id.transmitter_stream_format);
+    mDebugModeMenuItem = menu.findItem(R.id.debug_mode);
+    mButtonSizeMenuItem = menu.findItem(R.id.button_size);
+    mPacketSizeMenuItem = menu.findItem(R.id.packetsize);
+
+    onBitrateSelected(BitrateSelector.Direction.Inbound, mBitrateIn);
+    onBitrateSelected(BitrateSelector.Direction.Outbound, mBitrateOut);
+    setTransportProtocol(mUseTcp);
+    setJpegStream(mJpegStream);
+    onPacketSizeSelected(mUdpPacketSize);
+    onCaptureSizeSelected(mTransmitterImageSize);
+    setAutoFocus(50);
+
+    if (mReceiverStreamFormatMenuItem != null) {
+      mReceiverStreamFormatMenuItem.setTitle(
+          getResources().getString(R.string.receiver_stream_format) +
+              mVideoReceiverFormat);
+    }
+    if (mTransmitterStreamFormatMenuItem != null) {
+      mTransmitterStreamFormatMenuItem.setTitle(
+          getResources().getString(R.string.transmitter_stream_format) +
+              mVideoTransmitterFormat);
+    }
+    return true;
+  }
+
+  /**
+   * Invoked when the Android activity is resumed after being out of focus.
+   */
+  @Override
+  protected void onResume() {
+    Log.d(TAG, "onResume");
+    super.onResume();
+    connectToTcpServer(mServerIP, mServerTcpPort);
+    sendImageSettings();
+  }
+
+  /**
+   * Invoked when the Android activity is stopped.
+   */
+  @Override
+  protected void onPause() {
+    Log.d(TAG, "onPause");
+    if (mTcpConnection != null) {
+      mTcpConnection.disconnect();
+      mTcpConnection.setRunning(false);
+      mTcpConnection = null;
+    }
+    if (mUdpConnection != null) {
+      mUdpConnection.disconnect();
+      mUdpConnection.setRunning(false);
+      mUdpConnection = null;
+    }
+    if (mStillCamera != null) {
+      mStillCamera.stop();
+    }
+    if (mImageEncoder != null) {
+      mImageEncoder.stop();
+    }
+    if (mRtpLibCamera != null) {
+      if (mRtpLibCamera.isStreaming()) {
+        mRtpLibCamera.stopStream();
+      }
+      mRtpLibCamera = null;
+      mRtpLibCameraSurfaceViewCreated = false;
+    }
+    if (mRtpLibFile != null) {
+      if (mRtpLibFile.isStreaming()) {
+        mRtpLibFile.stopStream();
+      }
+      mRtpLibFile = null;
+      mRtpLibCameraSurfaceViewCreated = false;
+    }
+    mVideoDestPort = 0;
+    mServerUdpPort = 0;
+    mGStreamerTransmitterInitialized = false;
+    mGStreamerReceiverInitialized = false;
+    try {
+      if (mGStreamerReceiverSurface != null) {
+        mGStreamerReceiverSurface = null;
+        nativeReceiverSurfaceFinalize();
+        nativeReceiverFinalize();
+      }
+    } catch (Exception e) {
+      Log.e(TAG, "nativeReceiverFinalize: " + e.getMessage());
+    }
+    try {
+      if (mGStreamerTransmitterSurface != null) {
+        mGStreamerTransmitterSurface = null;
+        nativeTransmitterSurfaceFinalize();
+        nativeTransmitterFinalize();
+      }
+    } catch (Exception e) {
+      Log.e(TAG, "nativeTransmitterFinalize: " + e.getMessage());
+    }
+    super.onPause();
+  }
+
+  /**
+   * Initialize the GStreamer video receiver.
+   */
+  private void initGStreamerReceiver() {
+    Log.d(TAG, "initGStreamerReceiver");
+    if (mGStreamerReceiverSurface != null) {
+      if (mGStreamerReceiverInitialized) {
+        nativeReceiverSurfaceFinalize();
+        nativeReceiverFinalize();
+        mGStreamerReceiverInitialized = false;
+      }
+      String localIP = "127.0.0.1";
+      try {
+        Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces();
+        while (nis.hasMoreElements()) {
+          NetworkInterface ni = nis.nextElement();
+          if (!ni.isLoopback()/*not loopback*/ && ni.isUp()/*it works now*/) {
+            for (InterfaceAddress ia : ni.getInterfaceAddresses()) {
+              if (ia.getAddress().getAddress().length == 4) { // IPv4
+                String[] hostTokens = ia.getAddress().toString().split(Pattern.quote("/"));
+                if (hostTokens.length > 0) {
+                  localIP = hostTokens[hostTokens.length - 1];
+                }
+              }
+            }
+          }
+        }
+      } catch (Exception ignore) {
+      }
+      Log.d(TAG, "Local IP: " + localIP);
+      nativeReceiverInit(mVideoReceiverFormat, localIP, mEndDeviceJitterBuffer ? 1 : 0);
+      nativeReceiverSurfaceInit(mGStreamerReceiverSurface);
+      mGStreamerReceiverInitialized = true;
+      sendGStreamerReceiverInfo();
+    }
+  }
+
+  /**
+   * Initialize the camera.
+   */
+  private void initTransmitter() {
+    Log.d(TAG, "initTransmitter");
+    if (ContextCompat.checkSelfPermission(this,
+        Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
+      finish();
+    }
+    if (mTcpConnection == null) {
+      return;
+    }
+    if (mCameraStreamer == CameraStreamer.StillImage) {
+      initStillCameraStream();
+      return;
+    }
+    if (!mTransmitterStreamAnnounced) {
+      try {
+        JSONObject settingsJson = new JSONObject();
+        switch (mVideoTransmitterFormat) {
+          case "UDP_H264_HW":
+          case "UDP_H264_SW":
+            settingsJson.put("VideoTransmitterFormat", "H264_UDP");
+            break;
+          case "TCP_H264_SW":
+            settingsJson.put("VideoTransmitterFormat", "H264_TCP");
+            break;
+          default:
+            Log.d(TAG, "Unknown transmitter format: " + mVideoTransmitterFormat);
+        }
+        settingsJson.put("VideoTransmitterUseJitterBuffer", mEdgeDeviceJitterBuffer);
+        sendJSON(settingsJson);
+        Log.d(TAG, "Sending GStreamerTransmitterFormat: " +
+            settingsJson.get("VideoTransmitterFormat"));
+        mTransmitterStreamAnnounced = true;
+      } catch (Exception e) {
+        Log.e(TAG, "mVideoTransmitterFormat Exception: " + e.getMessage());
+      }
+      return;
+    }
+    if (mCameraStreamer == CameraStreamer.GStreamer) {
+      initGStreamerTransmitter();
+    }
+    if (mCameraStreamer == CameraStreamer.RtpLib) {
+      initRtpLibTransmitter();
+    }
+  }
+
+  /**
+   * Start the GStreamer Camera
+   */
+  private void initGStreamerTransmitter() {
+    if (mGStreamerTransmitterSurface == null) {
+      Log.d(TAG, "initGStreamerTransmitter: Surface is null");
+      return;
+    }
+    if (mTransmitterImageSize == null) {
+      Log.d(TAG, "initGStreamerTransmitter: Image size is null");
+      return;
+    }
+    if (mVideoDestPort == 0) {
+      Log.d(TAG, "initGStreamerTransmitter: Destination port is 0");
+      return;
+    }
+    if (mGStreamerTransmitterInitialized) {
+      nativeTransmitterSurfaceFinalize();
+      nativeTransmitterFinalize();
+    }
+    Log.d(TAG, "Starting GStreamer transmitter with: " +
+        "  ServerIP: " + mServerIP +
+        ", VideoDestPort: " + mVideoDestPort +
+        ", VideoTransmitterFormat: " + mVideoTransmitterFormat +
+        ", ImageWidth: " + mTransmitterImageSize.getWidth() +
+        ", ImageHeight: " + mTransmitterImageSize.getHeight() +
+        ", BitrateOut: " + mBitrateOut +
+        ", SourceVideoFile: " + mSourceVideoFile);
+    nativeTransmitterInit(mServerIP, mVideoDestPort, mVideoTransmitterFormat,
+        mTransmitterImageSize.getWidth(), mTransmitterImageSize.getHeight(), mBitrateOut,
+        mSourceVideoFile);
+    nativeTransmitterSurfaceInit(mGStreamerTransmitterSurface);
+  }
+
+  /**
+   * Start the Still Camera transmitter.
+   */
+  private void initStillCameraStream() {
+    if (mStillCamera == null) {
+      mStillCamera = new StillCamera(this);
+      mStillCamera.attachListener(mStillCameraListener);
+    }
+    mStillCameraId = "0";
+    mStillCamera.init();
+    mStillCamera.openCamera("0");
+  }
+
+  private void initRtpLibTransmitter() {
+    Log.d(TAG, "initRtpLibTransmitter");
+    if (mRtpLibCameraSurfaceViewCreated && mTransmitterImageSize != null && mVideoDestPort != 0) {
+      if (mRtpLibCamera == null) {
+        if (mSourceVideoFile != null && !mSourceVideoFile.isEmpty()) {
+          mRtpLibFile = new RtspFromFile(mConnectCheckerRtsp, () -> {
+            if (mRtpLibFile != null && mRtpLibFile.isStreaming()) {
+              mRtpLibFile.stopStream();
+            }
+          });
+          mRtpLibFile.setProtocol(Protocol.UDP);
+          mRtpLibFile.setVideoCodec(VideoCodec.H264);
+        } else {
+          mRtpLibCamera = new RtspCamera2(mRtpLibCameraSurfaceView, mConnectCheckerRtsp);
+          mRtpLibCamera.setProtocol(Protocol.UDP);
+          mRtpLibCamera.setVideoCodec(VideoCodec.H264);
+        }
+      }
+      if (mRtpLibFile != null && mRtpLibFile.isStreaming()) {
+        mRtpLibFile.stopStream();
+      }
+      if (mRtpLibCamera != null && mRtpLibCamera.isStreaming()) {
+        mRtpLibCamera.stopStream();
+      }
+      setAutoFocus(50);
+      if (mRtpLibFile != null) {
+        new Timer().schedule(new TimerTask() {
+          @Override
+          public void run() {
+            try {
+              mRtpLibFile.prepareVideo(mSourceVideoFile,
+                  mTransmitterImageSize.getWidth(), mTransmitterImageSize.getHeight(),
+                  mBitrateOut * 1000, 0);
+              mRtpLibFile.startVideoStreamFixedPort(mServerIP, mVideoDestPort);
+            } catch (Exception e) {
+              Log.e(TAG, "RtpLib exception: " + e.getMessage());
+            }
+          }
+        }, 2000);
+      }
+      if (mRtpLibCamera != null) {
+        try {
+          mRtpLibCamera.prepareVideo(
+              mTransmitterImageSize.getWidth(), mTransmitterImageSize.getHeight(), 30,
+              mBitrateOut * 1000, false, 0);
+          mRtpLibCamera.startVideoStreamFixedPort(mServerIP, mVideoDestPort);
+        } catch (Exception e) {
+          Log.e(TAG, "RtpLib exception: " + e.getMessage());
+        }
+      }
+    }
+  }
+
+  /**
+   * Callbacks needed by the RTP Lib
+   */
+  ConnectCheckerRtsp mConnectCheckerRtsp = new ConnectCheckerRtsp() {
+    @Override
+    public void onConnectionSuccessRtsp() {
+      runOnUiThread(() -> Toast.makeText(EdgeActivity.this, "Connection success", Toast.LENGTH_SHORT).show());
+    }
+
+    @Override
+    public void onConnectionFailedRtsp(final String reason) {
+      runOnUiThread(() -> Toast.makeText(EdgeActivity.this, "Connection failed. " + reason, Toast.LENGTH_SHORT)
+          .show());
+      if (mRtpLibCamera != null) {
+        mRtpLibCamera.stopStream();
+      }
+      if (mRtpLibFile != null) {
+        mRtpLibFile.stopStream();
+      }
+    }
+
+    @Override
+    public void onDisconnectRtsp() {
+      runOnUiThread(() -> Toast.makeText(EdgeActivity.this, "Disconnected", Toast.LENGTH_SHORT).show());
+    }
+
+    @Override
+    public void onAuthErrorRtsp() {
+      runOnUiThread(() -> Toast.makeText(EdgeActivity.this, "Auth error", Toast.LENGTH_SHORT).show());
+      if (mRtpLibCamera != null) {
+        mRtpLibCamera.stopStream();
+      }
+      if (mRtpLibFile != null) {
+        mRtpLibFile.stopStream();
+      }
+    }
+
+    @Override
+    public void onAuthSuccessRtsp() {
+      runOnUiThread(() -> Toast.makeText(EdgeActivity.this, "Auth success", Toast.LENGTH_SHORT).show());
+    }
+  };
+
+  /**
+   * Callback function for the result after requesting permission to write the log file.
+   *
+   * @param requestCode  The camera permission.
+   * @param permissions  Unused
+   * @param grantResults PERMISSION_GRANTED if granted.
+   */
+  @Override
+  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
+                                         @NonNull int[] grantResults) {
+    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+      if (requestCode == REQUEST_EXTERNAL_STORAGE_PERMISSION) {
+        writeBenchmarkToFile(0);
+      }
+    } else {
+      Toast.makeText(this, R.string.permission_storage_not_granted, Toast.LENGTH_SHORT).show();
+    }
+  }
+
+  private InternetConnection.Listener communicationListener = new InternetConnection.Listener() {
+    @Override
+    public void disconnected() {
+      runOnUiThread(() -> Toast.makeText(EdgeActivity.this, "Server disconnected",
+          Toast.LENGTH_LONG).show());
+    }
+
+    /**
+     * Callback function for incoming data from the network connections.
+     * Data can be images or JSON configuration files.
+     */
+    @Override
+    public void dataAvailable(InternetConnection.Data data) {
+      int dataLength = data.data != null ? data.data.length : 0;
+      Log.d(TAG, "Network data received: type=" + data.type +
+          ", length=" + dataLength + " bytes");
+      int timeSlot;
+      switch (data.type) {
+        case InternetConnection.Data.Type.IMAGE_WITH_METADATA:
+          if (mReceiverStartTime == 0) {
+            onFirstReceivedFrame();
+          }
+          dataLength -= 4;
+          if (mMRObjectFoundSent > 0) {
+            mMRObjectFoundSent--;
+          }
+          if (mSourceFrameFoundSent > 0) {
+            mSourceFrameFoundSent--;
+          }
+          if (dataLength > 0) {
+            Log.d(TAG, "Metadata: " + (data.data[dataLength] & 0xFF));
+            switch (data.data[dataLength] & 0xFF) {
+              case 1:
+                if (mMRObjectFoundSent == 0) {
+                  mMRObjectFoundSent = 50;
+                  onMRObjectFound();
+                }
+                break;
+              case 2:
+                if (mSourceFrameFoundSent == 0) {
+                  mSourceFrameFoundSent = 50;
+                  onSourceColorDetected();
+                }
+                break;
+            }
+          }
+        case InternetConnection.Data.Type.IMAGE:
+          if (mReceiverStartTime == 0) {
+            onFirstReceivedFrame();
+          }
+          timeSlot = (int) Math.floor((SystemClock.elapsedRealtimeNanos() - mReceiverStartTime)
+              / 1000000000.0f);
+          Integer fps = mReceiverFps.get(timeSlot);
+          if (fps == null) {
+            fps = 0;
+          }
+          mReceiverFps.put(timeSlot, fps + 1);
+          if (dataLength > 0) {
+            final Bitmap bmp = BitmapFactory.decodeByteArray(data.data, 0, dataLength);
+            if (bmp == null) {
+              Log.d(TAG, "Image with length: " + dataLength + " bytes could not be decoded");
+            } else {
+              Log.d(TAG, "bmp: " + bmp.getWidth() + "x" + bmp.getHeight());
+              if (mImageReceiverImageView != null) {
+                runOnUiThread(() -> {
+                  Bitmap scaledBitmap = Bitmap.createScaledBitmap(bmp, bmp.getWidth(),
+                      bmp.getHeight(), false);
+                  mImageReceiverImageView.setImageBitmap(scaledBitmap);
+                });
+              }
+              if (mImageReceiverSurfaceView != null) {
+                Log.d(TAG, "mImageReceiverSurfaceView: " +
+                    mImageReceiverSurfaceView.getWidth() + "x" + mImageReceiverSurfaceView.getHeight());
+                runOnUiThread(() -> {
+                  SurfaceHolder holder = mImageReceiverSurfaceView.getHolder();
+                  Canvas canvas = holder.lockCanvas();
+                  Rect src = new Rect(0, 0, bmp.getWidth(), bmp.getHeight());
+                  canvas.drawBitmap(bmp, src, src, null);
+                  holder.unlockCanvasAndPost(canvas);
+                });
+              }
+            }
+          }
+          break;
+        case InternetConnection.Data.Type.JSON:
+          try {
+            JSONObject jsonSettings = new JSONObject(new String(data.data));
+            if (jsonSettings.has("VideoReceiverFormat")) {
+              String videoFormat = jsonSettings.getString("VideoReceiverFormat");
+              Log.d(TAG, "videoFormat: " + videoFormat);
+              boolean valid = false;
+              switch (mVideoTransmitterFormat) {
+                case "UDP_H264_HW":
+                case "UDP_H264_SW":
+                  if (videoFormat.equals("H264_UDP")) {
+                    valid = true;
+                  }
+                  break;
+                case "TCP_H264_SW":
+                  if (videoFormat.equals("H264_TCP")) {
+                    valid = true;
+                  }
+                  break;
+                default:
+                  valid = false;
+              }
+              if (!valid) {
+                runOnUiThread(() -> Toast.makeText(EdgeActivity.this, "Edge node expecting " +
+                        videoFormat + " but the end device want to send " + mVideoTransmitterFormat,
+                    Toast.LENGTH_LONG).show());
+                break;
+              }
+              if (jsonSettings.has("VideoReceiverPort")) {
+                mVideoDestPort = jsonSettings.getInt("VideoReceiverPort");
+                Log.d(TAG, "Video destination port: " + mVideoDestPort);
+                initTransmitter();
+              }
+            }
+            if (jsonSettings.has("SessionId")) {
+              mSessionId = jsonSettings.getInt("SessionId");
+              Log.d(TAG, "SessionId: " + mSessionId);
+            }
+            if (jsonSettings.has("UdpPort")) {
+              int udpPort = jsonSettings.getInt("UdpPort");
+              Log.d(TAG, "UdpPort: " + udpPort);
+              connectToUdpServer(udpPort);
+            }
+            storeCameraCalibration(jsonSettings);
+          } catch (Exception e) {
+            Log.e(TAG, "communicationListener JSON Parse: " + e.getMessage());
+          }
+          break;
+        case InternetConnection.Data.Type.PONG:
+          long pingTime = (SystemClock.elapsedRealtimeNanos() - mPingTimerStart) / 1000000;
+          long timeSinceStart = (SystemClock.elapsedRealtimeNanos() - mTransmissionStartTime) / 1000000;
+          mPingTimes.add(timeSinceStart + "," + pingTime);
+          break;
+        default:
+          Log.d(TAG, "Received data not processed. Type=" + data.type);
+      }
+    }
+  };
+
+  /**
+   * On click listener for the left action button.
+   */
+  Button.OnClickListener mActionAOnClickListener = view -> {
+    mARTriggerSent = false;
+    mActionAButtonTimer = SystemClock.elapsedRealtimeNanos();
+    if (mTcpConnection != null) {
+      mTcpConnection.sendData(new InternetConnection.Data(
+          InternetConnection.Data.Type.TRIGGER_A, 1, new byte[50]));
+    }
+  };
+
+  /**
+   * On click listener for the middle action button.
+   */
+  Button.OnClickListener mActionBOnClickListener = v ->
+      mTcpConnection.sendData(new InternetConnection.Data(
+          InternetConnection.Data.Type.TRIGGER_B, 1, new byte[50]));
+
+  /**
+   * Change listener for the SurfaceTexture for the Still Camera preview.
+   */
+  TextureView.SurfaceTextureListener
+      mStillCameraPreviewTextureListener = new TextureView.SurfaceTextureListener() {
+    @Override
+    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
+      if (mStillCamera != null && mStillCamera.isOpen()) {
+        onCaptureSizeSelected(mTransmitterImageSize);
+      }
+    }
+
+    @Override
+    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
+    }
+
+    @Override
+    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
+      return false;
+    }
+
+    @Override
+    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
+    }
+  };
+
+  /**
+   * Change listener for the SurfaceView for the GStreamer Receiver.
+   */
+  SurfaceHolder.Callback mGStreamerReceiverViewListener = new SurfaceHolder.Callback() {
+    @Override
+    public void surfaceCreated(SurfaceHolder surfaceHolder) {
+      Log.d(TAG, "Receiver surfaceCreated");
+    }
+
+    @Override
+    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
+      Log.d(TAG, "Receiver surfaceChanged " +
+          "width=" + width + ", height=" + height);
+      mGStreamerReceiverSurface = surfaceHolder.getSurface();
+      initGStreamerReceiver();
+    }
+
+    @Override
+    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
+      Log.d(TAG, "Receiver surfaceDestroyed");
+      if (mGStreamerReceiverSurface != null) {
+        mGStreamerReceiverSurface = null;
+        nativeReceiverSurfaceFinalize();
+        nativeReceiverFinalize();
+      }
+    }
+  };
+
+  /**
+   * Change listener for the SurfaceView for the GStreamer Camera Transmitter.
+   */
+  SurfaceHolder.Callback mGStreamerTransmitterViewListener = new SurfaceHolder.Callback() {
+    @Override
+    public void surfaceCreated(SurfaceHolder surfaceHolder) {
+      Log.d(TAG, "Transmitter surfaceCreated");
+    }
+
+    @Override
+    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
+      Log.d(TAG, "Transmitter surfaceChanged " +
+          "width=" + width + ", height=" + height);
+      mGStreamerTransmitterSurface = surfaceHolder.getSurface();
+      initTransmitter();
+    }
+
+    @Override
+    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
+      Log.d(TAG, "Camera surfaceDestroyed");
+      if (mGStreamerTransmitterSurface != null) {
+        mGStreamerTransmitterSurface = null;
+        nativeTransmitterSurfaceFinalize();
+        nativeTransmitterFinalize();
+      }
+    }
+  };
+
+  /**
+   * Change listener for the SurfaceView for the RTP Lib Camera Preview.
+   */
+  SurfaceHolder.Callback mRtpLibCameraSurfaceViewListener = new SurfaceHolder.Callback() {
+    @Override
+    public void surfaceCreated(SurfaceHolder surfaceHolder) {
+      Log.d(TAG, "RTP Lib Camera surfaceCreated");
+    }
+
+    @Override
+    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
+      Log.d(TAG, "RTP Lib Camera surfaceChanged");
+      mRtpLibCameraSurfaceViewCreated = true;
+      initTransmitter();
+    }
+
+    @Override
+    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
+      Log.d(TAG, "RTP Lib Camera surfaceDestroyed");
+      if (mRtpLibCamera != null) {
+        if (mRtpLibCamera.isStreaming()) {
+          mRtpLibCamera.stopStream();
+        }
+        mRtpLibCamera.stopPreview();
+      }
+      if (mRtpLibFile != null) {
+        if (mRtpLibFile.isStreaming()) {
+          mRtpLibFile.stopStream();
+        }
+      }
+      mRtpLibCameraSurfaceViewCreated = false;
+    }
+  };
+
+  /**
+   * Connect to the TCP server.
+   *
+   * @param serverIP   IP address without leading or ending tags.
+   * @param serverPort The port.
+   */
+  private void connectToTcpServer(String serverIP, int serverPort) {
+    if (serverIP.contains(" ") ||
+        serverIP.contains(Objects.requireNonNull(System.getProperty("line.separator"))) ||
+        serverPort > 65535 ||
+        serverPort < 1 ||
+        !Patterns.IP_ADDRESS.matcher(serverIP).matches()) {
+      runOnUiThread(() ->
+          Toast.makeText(EdgeActivity.this, "Invalid server address.", Toast.LENGTH_SHORT).show());
+      return;
+    }
+    if (mTcpConnection == null || !mServerIP.equals(serverIP) || mServerTcpPort != serverPort) {
+      if (mImageEncoder != null) {
+        mImageEncoder.setInternetConnection(null);
+      }
+      if (mTcpConnection != null) {
+        mTcpConnection.disconnect();
+        mTcpConnection = null;
+        mServerIP = "";
+      }
+      if (mUdpConnection != null) {
+        mUdpConnection.disconnect();
+        mUdpConnection = null;
+      }
+      try {
+        Log.d(TAG, "Setting up TCP connection");
+        mTcpConnection = new TcpConnection(InetAddress.getByName(serverIP), serverPort);
+        mTcpConnection.addDataListener(communicationListener);
+        new Thread(mTcpConnection).start();
+      } catch (Exception e) {
+        mTcpConnection = null;
+      }
+      getSharedPreferences(STORED_SETTINGS, MODE_PRIVATE).edit()
+          .putString("edge_device_ip", serverIP)
+          .putInt("edge_device_port", serverPort)
+          .commit();
+    }
+    mServerIP = serverIP;
+    mServerTcpPort = serverPort;
+    setTransportProtocol(mUseTcp);
+    setJpegStream(mJpegStream);
+    onPacketSizeSelected(mUdpPacketSize);
+    onBitrateSelected(BitrateSelector.Direction.Inbound, mBitrateIn);
+    onMRObjectSelected(mMRObject);
+    sendGStreamerReceiverInfo();
+  }
+
+  /**
+   * Connect to the UDP server on the same host we've already
+   * connected to.
+   */
+  private void connectToUdpServer(int udpPort) {
+    if (mUdpConnection != null) {
+      mUdpConnection.disconnect();
+      mUdpConnection = null;
+    }
+    mServerUdpPort = udpPort;
+    try {
+      Log.d(TAG, "Setting up UDP connection");
+      mUdpConnection = new UdpConnection(
+          InetAddress.getByName(mServerIP), mServerUdpPort);
+      mUdpConnection.addDataListener(communicationListener);
+      mUdpConnection.start();
+      mUdpConnection.setPacketSize(mUdpPacketSize);
+      mUdpConnection.setMaxBitrate(mBitrateOut);
+      for (int i = 0; i < 10; i++) {
+        byte[] sessionData = new byte[4];
+        sessionData[0] = (byte) (mSessionId >> 24);
+        sessionData[1] = (byte) (mSessionId >> 16);
+        sessionData[2] = (byte) (mSessionId >> 8);
+        sessionData[3] = (byte) (mSessionId);
+        mUdpConnection.sendData(new InternetConnection.Data(
+            InternetConnection.Data.Type.CONNECTION, 1, sessionData));
+      }
+      onPacketSizeSelected(mUdpPacketSize);
+      setTransportProtocol(mUseTcp);
+    } catch (Exception e) {
+      Log.e(TAG, "UDP: Exception: " + e.getMessage());
+      mUdpConnection = null;
+    }
+  }
+
+  /**
+   * Set the transport protocol that should be used for images in the MJPEG stream.
+   * Information about the config change is also sent to the server.
+   * Does not affect the RTP streams.
+   *
+   * @param useTcp True means use TCP, false means use UDP.
+   */
+  private void setTransportProtocol(boolean useTcp) {
+    mUseTcp = useTcp;
+    if (mImageEncoder != null) {
+      mImageEncoder.setInternetConnection(useTcp ? mTcpConnection : mUdpConnection);
+    }
+    try {
+      sendJSON(new JSONObject().put("TransportProtocol", (mUseTcp ? "TCP" : "UDP")));
+    } catch (Exception e) {
+      Log.e(TAG, "setTransportProtocol Exception: " + e.getMessage());
+    }
+  }
+
+  /**
+   * Sets if the server should send out the MJPEG video stream.
+   * Sends the command to the server.
+   * Displays and hides the image surface.
+   *
+   * @param enable False to disable and hide the surface.
+   */
+  private void setJpegStream(final boolean enable) {
+    Log.d(TAG, "Receive MJPEG: " + enable);
+    try {
+      sendJSON(new JSONObject().put("JpegStream", enable));
+    } catch (Exception e) {
+      Log.e(TAG, "setJpegStream Exception: " + e.getMessage());
+    }
+    mJpegStream = enable;
+  }
+
+  /**
+   * If a TCP network connection is active, sends a JSON object to the server.
+   *
+   * @param obj The JSONObject to send.
+   */
+  private void sendJSON(JSONObject obj) {
+    try {
+      if (mTcpConnection != null) {
+        byte[] retVal = obj.toString().getBytes(StandardCharsets.UTF_8);
+        mTcpConnection.sendData(new InternetConnection.Data(
+            InternetConnection.Data.Type.JSON, 1, retVal));
+      }
+    } catch (Exception e) {
+      Log.e(TAG, "sendJSON Exception: " + e.getMessage());
+    }
+  }
+
+  /**
+   * Callback for when switching back to the app.
+   * Sets the UI flags that might otherwise have been updated.
+   *
+   * @param hasFocus True if switched back, false if leaving.
+   */
+  @Override
+  public void onWindowFocusChanged(boolean hasFocus) {
+    Log.d(TAG, "onWindowFocusChangeed: hasFocus=" + hasFocus);
+    super.onWindowFocusChanged(hasFocus);
+    if (hasFocus) {
+      getWindow().getDecorView().setSystemUiVisibility(uiFlags);
+    }
+  }
+
+  /**
+   * Retrieves the different available resolutions.
+   * Information is retrieved from the active camera lib (StillCamera or GStreamer).
+   *
+   * @return List with the different resolutions.
+   */
+  private List<Size> getAvailableCameraResolutions() {
+    if (mForceTestMode) {
+      List<Size> retList = new ArrayList<>();
+      retList.add(new Size(640, 480));
+      return retList;
+    }
+    switch (mCameraStreamer) {
+      case StillImage:
+        if (mStillCamera != null) {
+          return mStillCamera.getImageDimensions();
+        }
+        break;
+      case GStreamer: {
+        List<Size> retList = new ArrayList<>();
+        retList.add(new Size(320, 240));
+        retList.add(new Size(640, 480));
+        return retList;
+      }
+      case RtpLib:
+        if ((mRtpLibCamera != null)) {
+          List<Size> retList = new ArrayList<>();
+          for (Size size : mRtpLibCamera.getResolutionsBack()) {
+            retList.add(new Size(size.getWidth(), size.getHeight()));
+          }
+          return retList;
+        }
+    }
+    return null;
+  }
+
+  /**
+   * Sets which object should be added to the scene when the user emits
+   * the action command.
+   * As this setting is sent as a simple model name to the server that
+   * does the rendering all selectable models might not be supported
+   * by all servers. This function does not add anything by itself.
+   *
+   * @param object The object to be added.
+   */
+  @Override
+  public void onMRObjectSelected(MRObjectSelector.MRObjects object) {
+    if (object != null) {
+      try {
+        mMRObject = object;
+        sendJSON(new JSONObject()
+            .put("UserInteractionConfiguration", true)
+            .put("3DObjectType", object.toString()));
+        getSharedPreferences(STORED_SETTINGS, MODE_PRIVATE).edit()
+            .putString("ar_object", object.toString())
+            .commit();
+      } catch (Exception e) {
+        Log.d(TAG, "onARBojectSelected exception: " + e.getMessage());
+      }
+    }
+  }
+
+  /**
+   * Writes to external storage the logs and statistics created by GStreamer.
+   *
+   * @param maxSeconds How many seconds back should be written. Everything before that is ignored.
+   */
+  private void writeBenchmarkToFile(int maxSeconds) {
+    Log.d(TAG, "writeBenchmarkToFile");
+    FileWriter fileWriter = null;
+    try {
+      if ((ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) !=
+          PackageManager.PERMISSION_GRANTED) ||
+          (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
+              PackageManager.PERMISSION_GRANTED)) {
+        ActivityCompat.requestPermissions(this,
+            new String[]{
+                Manifest.permission.READ_EXTERNAL_STORAGE,
+                Manifest.permission.WRITE_EXTERNAL_STORAGE
+            }, REQUEST_EXTERNAL_STORAGE_PERMISSION);
+        return;
+      }
+
+      if (mVideoReceiverFormat != null &&
+          !mVideoReceiverFormat.equals("UDP_MJPEG") &&
+          !mVideoReceiverFormat.equals("TCP_MJPEG")) {
+        nativeGetReceiverFps();
+        nativeGetMetadataFoundTimes();
+        nativeGetFrameArrivalTimes();
+      }
+      if (mVideoTransmitterFormat != null &&
+          !mVideoTransmitterFormat.equals("UDP_H264_HW")) {
+        nativeGetTransmitterFps();
+      }
+      //Delimiter used in CSV file
+      final String COMMA_DELIMITER = ",";
+      final String NEW_LINE_SEPARATOR = "\n";
+
+      SharedPreferences prefs = getSharedPreferences(STORED_SETTINGS, MODE_PRIVATE);
+      String inFormat = mVideoReceiverFormat + "_" + mBitrateIn;
+      String outFormat = mVideoTransmitterFormat + "_" + mBitrateOut;
+      String sourceVideoFile = prefs.getString("source_video_file", "");
+
+      String videoFileName = "";
+      File videoFile = new File(sourceVideoFile);
+      if (videoFile.exists()) {
+        videoFileName = videoFile.getName();
+      }
+      File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
+      File file = new File(dir, "mr_" + inFormat + "_" + outFormat +
+          "_" + mCameraStreamer.toString() + "_" +
+          (new SimpleDateFormat("MM-dd", Locale.getDefault()).format(new Date())) +
+          "_" + videoFileName + ".txt");
+
+      fileWriter = new FileWriter(file, true);
+
+      fileWriter.append("timestamp");
+      fileWriter.append(COMMA_DELIMITER);
+      fileWriter.append(DateFormat.getDateTimeInstance().format(new Date()));
+      fileWriter.append(NEW_LINE_SEPARATOR);
+
+      for (int i = 0; i < mMRObjectFoundTimes.size(); i++) {
+        fileWriter.append("mr_object_time");
+        fileWriter.append(COMMA_DELIMITER);
+        fileWriter.append(mMRObjectFoundTimes.get(i));
+        fileWriter.append(NEW_LINE_SEPARATOR);
+      }
+
+      for (int i = 0; i < maxSeconds * 2; i++) {
+        if (mMetadataFoundTimes.containsKey(i)) {
+          fileWriter.append("metadata_frame_time");
+          fileWriter.append(COMMA_DELIMITER);
+          fileWriter.append(Integer.toString(i));
+          fileWriter.append(COMMA_DELIMITER);
+          Integer time = mMetadataFoundTimes.get(i);
+          fileWriter.append(time == null ? "0" : time.toString());
+          fileWriter.append(NEW_LINE_SEPARATOR);
+        }
+      }
+
+      for (int i = 0; i < mPingTimes.size(); i++) {
+        fileWriter.append("udp_ping_time");
+        fileWriter.append(COMMA_DELIMITER);
+        fileWriter.append(mPingTimes.get(i));
+        fileWriter.append(NEW_LINE_SEPARATOR);
+      }
+
+      for (int i = 0; i < mFrameArrivalTimes.size(); i++) {
+        Pair<Integer, Integer> arrivalTime = mFrameArrivalTimes.get(i);
+        if (arrivalTime != null &&
+            arrivalTime.first != null &&
+            arrivalTime.first != 0) {
+          fileWriter.append("frame_arrival_time");
+          fileWriter.append(COMMA_DELIMITER);
+          fileWriter.append(Integer.toString(i));
+          fileWriter.append(COMMA_DELIMITER);
+          fileWriter.append(arrivalTime.first.toString());
+          fileWriter.append(COMMA_DELIMITER);
+          fileWriter.append(arrivalTime.second.toString());
+          fileWriter.append(NEW_LINE_SEPARATOR);
+        }
+      }
+
+
+      if (maxSeconds == 0) {
+        maxSeconds = WRITE_BENCHMARK_DELAY_SEC;
+      }
+      for (int i = 0; i < maxSeconds; i++) {
+        fileWriter.append("receiver");
+        fileWriter.append(COMMA_DELIMITER);
+        fileWriter.append(Integer.toString(i));
+        fileWriter.append(COMMA_DELIMITER);
+        if (mReceiverFps.containsKey(i)) {
+          Integer fps = mReceiverFps.get(i);
+          fileWriter.append(fps == null ? "0" : fps.toString());
+        } else {
+          fileWriter.append("0");
+        }
+        fileWriter.append(NEW_LINE_SEPARATOR);
+      }
+      if (!mTransmitterFps.isEmpty()) {
+        for (int i = 0; i < maxSeconds; i++) {
+          fileWriter.append("transmitter");
+          fileWriter.append(COMMA_DELIMITER);
+          fileWriter.append(Integer.toString(i));
+          fileWriter.append(COMMA_DELIMITER);
+          if (mTransmitterFps.containsKey(i)) {
+            Integer fps = mTransmitterFps.get(i);
+            fileWriter.append(fps == null ? "0" : fps.toString());
+          } else {
+            fileWriter.append("0");
+          }
+          fileWriter.append(NEW_LINE_SEPARATOR);
+        }
+      }
+      runOnUiThread(() -> Toast.makeText(this, "Measurements saved to location: " +
+          file.getAbsolutePath(), Toast.LENGTH_LONG).show());
+    } catch (Exception e) {
+      Log.e(TAG, "writeBenchmarkToFile exception: " + e.getMessage());
+      runOnUiThread(() -> Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show());
+    } finally {
+      try {
+        if (fileWriter != null) {
+          fileWriter.flush();
+          fileWriter.close();
+        }
+      } catch (Exception e) {
+        Log.d(TAG, "File error");
+      }
+    }
+  }
+
+  private String getSessionDescription() {
+    return "Streamer: " + mCameraStreamer.toString() + "\n" +
+        "End device streaming format: " + mVideoTransmitterFormat + "\n" +
+        "End device streaming bitrate: " + mBitrateOut + "\n" +
+        "End device jitterbuffer: " + mEndDeviceJitterBuffer + "\n" +
+        "Edge device streaming format: " + mVideoReceiverFormat + "\n" +
+        "Edge device streaming bitrate: " + mBitrateIn + "\n" +
+        "Edge device jitterbuffer: " + mEdgeDeviceJitterBuffer;
+  }
+
+  /**
+   * Called by the OS when a Menu Item in the drop down menu has been selected.
+   *
+   * @param item Selected MenuItem
+   * @return True
+   */
+  @Override
+  public boolean onOptionsItemSelected(MenuItem item) {
+    FragmentManager fragmentManager = getSupportFragmentManager();
+    switch (item.getItemId()) {
+      case R.id.about:
+        if (fragmentManager.findFragmentByTag(ABOUT_DIALOG) == null) {
+          MessageBoxFragment
+              .newInstance(R.string.about_title, getSessionDescription())
+              .show(getSupportFragmentManager(), ABOUT_DIALOG);
+        }
+        return true;
+      case R.id.bitrate_in:
+        if (fragmentManager.findFragmentByTag(BITRATE_DIALOG) == null) {
+          BitrateSelector
+              .newInstance(BitrateSelector.Direction.Inbound, null, mBitrateIn)
+              .show(getSupportFragmentManager(), BITRATE_DIALOG);
+        }
+        return true;
+      case R.id.bitrate_out:
+        if (fragmentManager.findFragmentByTag(BITRATE_DIALOG) == null) {
+          BitrateSelector
+              .newInstance(BitrateSelector.Direction.Outbound, null, mBitrateOut)
+              .show(getSupportFragmentManager(), BITRATE_DIALOG);
+        }
+        return true;
+      case R.id.packetsize:
+        if (fragmentManager.findFragmentByTag(PACKETSIZE_DIALOG) == null) {
+          PacketSizeSelector
+              .newInstance(null, mUdpPacketSize)
+              .show(getSupportFragmentManager(), PACKETSIZE_DIALOG);
+        }
+        return true;
+      case R.id.write_benchmark_to_file:
+        writeBenchmarkToFile(0);
+        return true;
+      case R.id.capture_size:
+        if (fragmentManager.findFragmentByTag(CAPTURE_SIZE_DIALOG) == null) {
+          final List<Size> sizes = getAvailableCameraResolutions();
+          if (sizes != null && sizes.size() != 0) {
+            CaptureResolutionSelector.newInstance(sizes, mTransmitterImageSize)
+                .show(fragmentManager, CAPTURE_SIZE_DIALOG);
+          } else {
+            Toast.makeText(this, "Could not retrieve camera properties.",
+                Toast.LENGTH_SHORT).show();
+          }
+        } else {
+          Log.d(TAG, "Fragment not found: " + CAPTURE_SIZE_DIALOG);
+        }
+        return true;
+      case R.id.debug_mode:
+        mDebugMode = !mDebugMode;
+        mDebugModeMenuItem.setTitle(mDebugMode ?
+            R.string.debug_mode_disable : R.string.debug_mode_enable);
+        try {
+          sendJSON(new JSONObject().put("DebugMode", mDebugMode));
+        } catch (Exception ignore) {
+        }
+        return true;
+      case R.id.button_size:
+        mButtonsLarge = !mButtonsLarge;
+        mButtonSizeMenuItem.setTitle(mButtonsLarge ?
+            R.string.button_size_decrease : R.string.button_size_increase);
+        double ratio = mButtonsLarge ? 2 : 0.5;
+        if (mActionAButton != null) {
+          mActionAButton.getLayoutParams().width =
+              (int) Math.round(ratio * mActionAButton.getLayoutParams().width);
+          mActionAButton.getLayoutParams().height =
+              (int) Math.round(ratio * mActionAButton.getLayoutParams().height);
+          mActionAButton.requestLayout();
+        }
+        if (mActionBButton != null) {
+          mActionBButton.getLayoutParams().width =
+              (int) Math.round(ratio * mActionBButton.getLayoutParams().width);
+          mActionBButton.getLayoutParams().height =
+              (int) Math.round(ratio * mActionBButton.getLayoutParams().height);
+          mActionBButton.requestLayout();
+        }
+        if (mExitButton != null) {
+          mExitButton.getLayoutParams().width =
+              (int) Math.round(ratio * mExitButton.getLayoutParams().width);
+          mExitButton.getLayoutParams().height =
+              (int) Math.round(ratio * mExitButton.getLayoutParams().height);
+          mExitButton.requestLayout();
+        }
+        return true;
+      case R.id.ar_object:
+        if (fragmentManager.findFragmentByTag(MR_OBJECT_DIALOG) == null) {
+          MRObjectSelector
+              .newInstance(mMRObject)
+              .show(getSupportFragmentManager(), MR_OBJECT_DIALOG);
+        }
+        return true;
+      case R.id.flash_mode:
+        if (mStillCamera == null) {
+          return true;
+        }
+        boolean flashEnabled = mStillCamera.isFlashEnabled();
+        mStillCamera.setFlashMode(!flashEnabled);
+        if (flashEnabled) {
+          item.setTitle(R.string.flash_enable);
+        } else {
+          item.setTitle(R.string.flash_disable);
+        }
+        return true;
+      case R.id.camera_preview:
+        boolean visible = true;
+        if (mCameraPreviewView != null) {
+          if (mCameraPreviewView.getVisibility() == View.VISIBLE) {
+            mCameraPreviewView.setVisibility(View.GONE);
+            visible = false;
+          } else {
+            mCameraPreviewView.setVisibility(View.VISIBLE);
+          }
+        }
+        if (mRtpLibCameraSurfaceView != null) {
+          if (mRtpLibCameraSurfaceView.getVisibility() == View.VISIBLE) {
+            mRtpLibCameraSurfaceView.setVisibility(View.GONE);
+          } else {
+            mRtpLibCameraSurfaceView.setVisibility(View.VISIBLE);
+          }
+        }
+        if (mGStreamerTransmitterView != null) {
+          if (mGStreamerTransmitterView.getVisibility() == View.VISIBLE) {
+            mGStreamerTransmitterView.setVisibility(View.GONE);
+            visible = false;
+          } else {
+            mGStreamerTransmitterView.setVisibility(View.VISIBLE);
+          }
+        }
+        item.setTitle(visible ? R.string.camera_preview_hide :
+            R.string.camera_preview_display);
+        return true;
+      case R.id.remove_calibration:
+        if (mTransmitterImageSize != null) {
+          removeCameraCalibration(mTransmitterImageSize);
+        }
+        return true;
+      case R.id.calibration_mode:
+        setCalibrationMode(!mCalibrationModeEnabled);
+        return true;
+      case R.id.switch_camera:
+        switchCamera();
+        return true;
+    }
+    return super.onOptionsItemSelected(item);
+  }
+
+  /**
+   * Enable or disable the camera calibration mode on the server.
+   * Used for switching between SLAM and calibration.
+   *
+   * @param calibrationMode True/false if should be enabled/disabled on server.
+   */
+  private void setCalibrationMode(boolean calibrationMode) {
+    if (mCalibrationModeEnabled == calibrationMode) {
+      return;
+    }
+    mCalibrationModeEnabled = calibrationMode;
+    if (mTcpConnection != null) {
+      byte[] enabled = new byte[1];
+      enabled[0] = calibrationMode ? (byte) 1 : 0;
+      mTcpConnection.sendData(new InternetConnection.Data(
+          InternetConnection.Data.Type.CALIBRATION, 1, enabled));
+    }
+    runOnUiThread(() -> {
+      if (mCalibrationModeMenuItem != null) {
+        mCalibrationModeMenuItem.setTitle(mCalibrationModeEnabled ?
+            R.string.leave_calibration_mode : R.string.enter_calibration_mode);
+      }
+    });
+  }
+
+  /**
+   * Manually set the focus distance.
+   *
+   * @param distance 0-100.
+   */
+  @SuppressWarnings("SameParameterValue")
+  private void setAutoFocus(int distance) {
+    if (mCameraStreamer == CameraStreamer.RtpLib) {
+      if (mRtpLibCamera != null) {
+        mRtpLibCamera.setFocus(false, distance);
+      }
+    }
+  }
+
+  /**
+   * Automatically select the best camera capture size from the list of available resolutions.
+   * Sets the default that later be changed using the options menu.
+   */
+  @Override
+  public void onAutoCaptureSizeSelected() {
+    if (mForceTestMode) {
+      onCaptureSizeSelected(new Size(640, 480));
+      return;
+    }
+    Point windowSize = new Point();
+    this.getWindowManager().getDefaultDisplay().getRealSize(windowSize);
+    if (mDebugMode) {
+      Toast.makeText(this, "Display size: " + windowSize.x + "x" + windowSize.y,
+          Toast.LENGTH_SHORT).show();
+    }
+    Size targetSize = new Size(windowSize.x, windowSize.y);
+    final List<Size> sizes = getAvailableCameraResolutions();
+    if (sizes != null && sizes.size() != 0) {
+      // Collect the supported resolutions that are at least as big as the preview Surface
+      List<Size> sameRatio = new ArrayList<>();
+      for (Size option : sizes) {
+        if (option.getHeight() == option.getWidth() * targetSize.getHeight() / targetSize.getWidth() &&
+            option.getWidth() * option.getHeight() < (1000 * 1000)) {
+          sameRatio.add(option);
+        }
+      }
+      class CompareSizesByArea implements Comparator<Size> {
+        public int compare(Size lhs, Size rhs) {
+          return Long.signum((long) lhs.getWidth() * lhs.getHeight() -
+              (long) rhs.getWidth() * rhs.getHeight());
+        }
+      }
+      onCaptureSizeSelected((sameRatio.size() > 0) ?
+          Collections.max(sameRatio, new CompareSizesByArea()) :
+          Collections.min(sizes, new CompareSizesByArea()));
+    }
+  }
+
+  /**
+   * A new capture size has been selected. Either automatically or by the user.
+   *
+   * @param captureSize Pixel resolution.
+   */
+  @Override
+  public void onCaptureSizeSelected(Size captureSize) {
+    if (mForceTestMode) {
+      captureSize = new Size(640, 480);
+    }
+    if (captureSize == null || captureSize.getWidth() < 1 || captureSize.getHeight() < 1) {
+      return;
+    }
+    if (captureSize == mTransmitterImageSize) {
+      return;
+    }
+    mTransmitterImageSize = captureSize;
+    runOnUiThread(() -> {
+      if (mCaptureSizeMenuItem != null) {
+        mCaptureSizeMenuItem.setTitle(getResources().getString(R.string.select_image_size) +
+            " (" + mTransmitterImageSize.getWidth() + "x" + mTransmitterImageSize.getHeight() + ")");
+      }
+      Log.d(TAG, "onCaptureSizeSelected: " +
+          mTransmitterImageSize.getWidth() + "x" + mTransmitterImageSize.getHeight());
+      if (mDebugMode) {
+        Toast.makeText(EdgeActivity.this, "Capture size: " +
+                mTransmitterImageSize.getWidth() + "x" + mTransmitterImageSize.getHeight(),
+            Toast.LENGTH_SHORT).show();
+      }
+      getSharedPreferences(STORED_SETTINGS, MODE_PRIVATE).edit()
+          .putInt("camera_width", mTransmitterImageSize.getWidth())
+          .putInt("camera_height", mTransmitterImageSize.getHeight())
+          .commit();
+      double ratio = (double) mTransmitterImageSize.getHeight() / (double) mTransmitterImageSize.getWidth();
+      Log.d(TAG, "Capture size ratio=" + ratio);
+      if (mCameraPreviewView != null && mCameraPreviewView.isAvailable()) {
+        int newHeight = (int) Math.round(ratio * mCameraPreviewView.getLayoutParams().width);
+        if (newHeight != mCameraPreviewView.getLayoutParams().height) {
+          mCameraPreviewView.getLayoutParams().height = newHeight;
+          mCameraPreviewView.requestLayout();
+        }
+        mCameraPreviewView.requestLayout();
+        SurfaceTexture texture = mCameraPreviewView.getSurfaceTexture();
+        if (texture != null) {
+          texture.setDefaultBufferSize(mTransmitterImageSize.getWidth(), mTransmitterImageSize.getHeight());
+          Surface mPreviewSurface = new Surface(texture);
+          if (mStillCamera != null && mStillCamera.isOpen()) {
+            Surface mImageEncoderSurface = mImageEncoder.getSurface(mTransmitterImageSize);
+            mStillCamera.startCapture(mPreviewSurface, mImageEncoderSurface);
+          }
+        }
+      }
+    });
+    sendImageSettings();
+    if (mCameraStreamer == CameraStreamer.GStreamer) {
+      nativeTransmitterPause();
+      nativeCameraSetResolution(mTransmitterImageSize.getWidth(), mTransmitterImageSize.getHeight());
+      nativeTransmitterPlay();
+    } else {
+      initTransmitter();
+    }
+  }
+
+  /**
+   * Camera stream bitrate has been selected.
+   * Inform all video senders including the server.
+   *
+   * @param bitrate Bitrate in Kbit.
+   */
+  @Override
+  public void onBitrateSelected(BitrateSelector.Direction direction, @NonNull Integer bitrate) {
+    Log.d(TAG, "Bitrate selected, direction=" + direction.toString() +
+        ", bitrate=" + bitrate + " (Kbit/s)");
+    switch (direction) {
+      case Outbound:
+        mBitrateOut = bitrate;
+        if (mTcpConnection != null) {
+          mTcpConnection.setMaxBitrate(mBitrateOut);
+        }
+        if (mUdpConnection != null) {
+          mUdpConnection.setMaxBitrate(mBitrateOut);
+        }
+        if (mCameraStreamer == CameraStreamer.GStreamer) {
+          nativeTransmitterSetBitrate(mBitrateOut);
+        }
+        runOnUiThread(() -> {
+          if (mBitrateOutMenuItem != null) {
+            mBitrateOutMenuItem.setTitle(getResources().getString(R.string.transmitter_bitrate) +
+                " (" + mBitrateOut + " Kbit/s)");
+          }
+        });
+        getSharedPreferences(STORED_SETTINGS, MODE_PRIVATE).edit()
+            .putInt("end_device_bitrate", mBitrateOut)
+            .commit();
+        break;
+      case Inbound:
+        mBitrateIn = bitrate;
+        try {
+          sendJSON(new JSONObject().put("VideoBitrate", mBitrateIn));
+        } catch (Exception ignore) {
+        }
+        if (mVideoReceiverFormat.equals("UDP_MJPEG") || mVideoReceiverFormat.equals("TCP_MJPEG")) {
+          try {
+            sendJSON(new JSONObject().put("JpegQuality",
+                Math.min((int) (((float) mBitrateIn / 10000f) * 100), 100)));
+          } catch (Exception ignore) {
+          }
+        }
+        runOnUiThread(() -> {
+          if (mBitrateInMenuItem != null) {
+            mBitrateInMenuItem.setTitle(getResources().getString(R.string.receiver_bitrate) +
+                " (" + mBitrateIn + " Kbit/s)");
+          }
+        });
+        getSharedPreferences(STORED_SETTINGS, MODE_PRIVATE).edit()
+            .putInt("edge_device_bitrate", mBitrateIn)
+            .commit();
+    }
+  }
+
+  /**
+   * A size for UDP packets has been selected. Send the configuration to the server
+   * and update the local UDP data sender.
+   *
+   * @param size The new size.
+   */
+  @Override
+  public void onPacketSizeSelected(@NonNull final Integer size) {
+    Log.d(TAG, "UDP Packet size: " + size + " bytes");
+    mUdpPacketSize = size;
+    getSharedPreferences(STORED_SETTINGS, MODE_PRIVATE).edit()
+        .putInt("packet_size", size)
+        .commit();
+    if (mUdpConnection != null) {
+      mUdpConnection.setPacketSize(mUdpPacketSize);
+    }
+    try {
+      sendJSON(new JSONObject().put("PacketSize", mUdpPacketSize));
+    } catch (Exception ignore) {
+    }
+    runOnUiThread(() -> {
+      if (mPacketSizeMenuItem != null) {
+        mPacketSizeMenuItem.setTitle(
+            getResources().getString(R.string.udp_packet_size) +
+                " (" + size.toString() + " bytes)");
+      }
+    });
+  }
+
+  /**
+   * Called by the native gstmredge C code.
+   */
+  @SuppressWarnings("unused")
+  private void logGStreamerMessage(final String message) {
+    Log.d(TAG, "GStreamer message: " + message);
+  }
+
+  /**
+   *
+   */
+  private void onMRObjectFound() {
+    if (!mARTriggerSent) {
+      mARTriggerSent = true;
+      mMRObjectFoundTime = (SystemClock.elapsedRealtimeNanos() - mActionAButtonTimer) / 1000000;
+      long timeSinceStart = (SystemClock.elapsedRealtimeNanos() - mReceiverStartTime) / 1000000;
+      mMRObjectFoundTimes.add(timeSinceStart + "," + mMRObjectFoundTime);
+      Log.d(TAG, "onMRObjectFound: Latency: " + mMRObjectFoundTime + " ms");
+      runOnUiThread(() -> Toast.makeText(EdgeActivity.this,
+          "MR Object: Elapsed time: " + mMRObjectFoundTime + " ms.",
+          Toast.LENGTH_SHORT).show());
+      try {
+        sendJSON(new JSONObject().put("MRFoundTime", mMRObjectFoundTime));
+      } catch (Exception ignore) {
+      }
+      new Timer().schedule(new TimerTask() {
+        @Override
+        public void run() {
+          mARTriggerSent = false;
+        }
+      }, 3000);
+    }
+  }
+
+  /**
+   *
+   */
+  @SuppressWarnings("unused")
+  private void onSourceColorDetected() {
+    if (!mSourceColorTriggerSent) {
+      mSourceColorTriggerSent = true;
+      mMetadataFoundTimes.put(mSourceColorFramesDetected * 10, mSourceColorFramesDetected + 1);
+      int timeSinceStart = (int) ((SystemClock.elapsedRealtimeNanos() - mTransmissionStartTime) / 1000000);
+      int timeSinceStartPosCorr = (int) ((SystemClock.elapsedRealtimeNanos() - mTransmissionStartTimePosCorr) / 1000000);
+      mMetadataFoundTimes.put(mSourceColorFramesDetected * 10 + 2, timeSinceStart);
+      timeSinceStart -= (timeSinceStart / 1000) * 1000;
+      mMetadataFoundTimes.put(mSourceColorFramesDetected * 10 + 3, timeSinceStart);
+
+      mMetadataFoundTimes.put(mSourceColorFramesDetected * 10 + 4, timeSinceStartPosCorr);
+      timeSinceStartPosCorr -= (timeSinceStartPosCorr / 1000) * 1000;
+      mMetadataFoundTimes.put(mSourceColorFramesDetected * 10 + 5, timeSinceStartPosCorr);
+
+      mSourceColorFramesDetected++;
+
+      runOnUiThread(() -> Toast.makeText(EdgeActivity.this,
+          "Source detected color frame",
+          Toast.LENGTH_SHORT).show());
+      new Timer().schedule(new TimerTask() {
+        @Override
+        public void run() {
+          mSourceColorTriggerSent = false;
+        }
+      }, 2000);
+    }
+  }
+
+  /**
+   *
+   */
+  private void onFirstReceivedFrame() {
+    if (mReceiverStartTime == 0) {
+      mReceiverStartTime = SystemClock.elapsedRealtimeNanos();
+      if (AUTOMATE_TRIGGERS) {
+        new Timer().schedule(new TimerTask() {
+          @Override
+          public void run() {
+            EdgeActivity.this.mActionAOnClickListener.onClick(mActionAButton);
+          }
+        }, INSERT_MR_OBJECT_DELAY_SEC * 1000, INSERT_MR_OBJECT_INTERVAL_SEC * 1000);
+        new Timer().schedule(new TimerTask() {
+          @Override
+          public void run() {
+            writeBenchmarkToFile(WRITE_BENCHMARK_DELAY_SEC);
+          }
+        }, WRITE_BENCHMARK_DELAY_SEC * 1000);
+      }
+    }
+  }
+
+  /**
+   *
+   */
+  @SuppressWarnings("unused")
+  private void onTransmissionStart(long position) {
+    if (mTransmissionStartTime == 0) {
+      mTransmissionStartTime = SystemClock.elapsedRealtimeNanos();
+      mTransmissionStartTimePosCorr = mTransmissionStartTime - position;
+      runOnUiThread(() -> Toast.makeText(EdgeActivity.this,
+          "Transmission started.",
+          Toast.LENGTH_SHORT).show());
+      if (AUTOMATE_TRIGGERS) {
+        new Timer().schedule(new TimerTask() {
+          @Override
+          public void run() {
+            mPingTimerStart = SystemClock.elapsedRealtimeNanos();
+            if (mUdpConnection != null) {
+              mUdpConnection.sendData(new InternetConnection.Data(
+                  InternetConnection.Data.Type.PING, 1, new byte[10]));
+            }
+          }
+        }, 0, SEND_PING_INTERVAL_SEC * 1000);
+      }
+    }
+  }
+
+  /**
+   * Called by the native gstmredge C code.
+   */
+  @SuppressWarnings("unused")
+  private void onError(final String message) {
+    Log.d(TAG, "GStreamer onError: " + message);
+  }
+
+
+  /**
+   * Called by the native gstmredge C code.
+   *
+   * @param state Integer for state.
+   */
+  @SuppressWarnings("unused")
+  private void onStateChanged(int state) {
+    Log.d(TAG, "GStreamer onStateChanged: " + state);
+  }
+
+
+  /**
+   * Called by the native gstmredge C code when the
+   * GStreamer receiver has been initialized.
+   */
+  @SuppressWarnings("unused")
+  private void onGStreamerReceiverInitialized() {
+    Log.d(TAG, "onGStreamerReceiverInitialized");
+    mGStreamerReceiverInitialized = true;
+    nativeReceiverPlay();
+    sendGStreamerReceiverInfo();
+  }
+
+  /*
+   */
+  @SuppressWarnings("unused")
+  private void registerTransmitterFpsForTime(int timeslice, int frames) {
+    Log.d(TAG, "Transmitter: Slice: " + timeslice + ", frames: " + frames);
+    mTransmitterFps.put(timeslice, frames);
+  }
+
+  /*
+   */
+  @SuppressWarnings("unused")
+  private void registerMetadataFoundTime(int num, int time) {
+    Log.d(TAG, "Object: Num: " + num + ", time: " + time);
+    mMetadataFoundTimes.put(num, time);
+  }
+
+  /*
+   */
+  @SuppressWarnings("unused")
+  private void registerFrameArrivalTime(int num, int time, int diff) {
+    Log.d(TAG, "Frame arrival: Num: " + num + ", time: " + time + ", diff: " + diff);
+    mFrameArrivalTimes.put(num, new Pair<>(time, diff));
+  }
+
+  /*
+   */
+  @SuppressWarnings("unused")
+  private void registerReceiverFpsForTime(int timeslice, int frames) {
+    Log.d(TAG, "Receiver: Slice: " + timeslice + ", frames: " + frames);
+    mReceiverFps.put(timeslice, frames);
+  }
+
+  /**
+   * Called by the native gstmredge C code when the
+   * GStreamer camera transmitter has been initialized.
+   */
+  @SuppressWarnings("unused")
+  private void onGStreamerTransmitterInitialized() {
+    Log.d(TAG, "onGStreamerTransmitterInitialized");
+    Log.d(TAG, "Transmitter started");
+    mMRObjectFoundTime = 0;
+    mGStreamerTransmitterInitialized = true;
+    nativeCameraSetResolution(mTransmitterImageSize.getWidth(), mTransmitterImageSize.getHeight());
+    nativeTransmitterPlay();
+  }
+
+  protected void onDestroy() {
+    Log.d(TAG, "onDestroy");
+    super.onDestroy();
+    clearCache();
+  }
+
+  public void clearCache() {
+    try {
+      File[] files = getBaseContext().getCacheDir().listFiles();
+      for (File file : files) {
+        try {
+          if (!file.delete()) {
+            Log.e(TAG, "Could not delete file: " + file.getName());
+          }
+        } catch (Exception ignore) {
+        }
+      }
+    } catch (Exception ignore) {
+    }
+  }
+
+  static {
+    System.loadLibrary("gstreamer_android");
+    System.loadLibrary("gstmredge");
+    nativeClassInit();
+  }
+
+  public static class StringPair {
+    private String s;
+    private String l;
+
+    StringPair(String longform, String shortform) {
+      l = longform;
+      s = shortform;
+    }
+
+    String getShort() {
+      return s;
+    }
+
+    String getLong() {
+      return l;
+    }
+  }
+
+}
diff --git a/app/src/se/liu/mrleo/MainActivity.java b/app/src/se/liu/mrleo/MainActivity.java
new file mode 100644
index 0000000..b101572
--- /dev/null
+++ b/app/src/se/liu/mrleo/MainActivity.java
@@ -0,0 +1,397 @@
+package se.liu.mrleo;
+
+import android.Manifest;
+import android.annotation.SuppressLint;
+import android.app.AlertDialog;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.util.Log;
+import android.util.Patterns;
+import android.view.View;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.Spinner;
+import android.widget.Toast;
+
+import com.obsez.android.lib.filechooser.ChooserDialog;
+
+import java.util.ArrayList;
+import java.util.Objects;
+
+public class MainActivity extends AppCompatActivity {
+
+  private static String TAG = "MainActivity";
+
+  private EditText edgeDevicePortInput;
+  private EditText edgeDeviceIPInput;
+  private Spinner edgeDeviceTransmissionInput;
+  private Spinner endDeviceTransmissionInput;
+  private CheckBox edgeDeviceUseJitterBufferInput;
+  private CheckBox endDeviceUseJitterBufferInput;
+  private EditText edgeDeviceBitrateInput;
+  private EditText endDeviceBitrateInput;
+
+  private static final int REQUEST_CAMERA_PERMISSION = 1;
+  private static final int REQUEST_EXTERNAL_STORAGE_PERMISSION = 2;
+
+
+  @Override
+  protected void onCreate(Bundle savedInstanceState) {
+    super.onCreate(savedInstanceState);
+    setContentView(R.layout.activity_main);
+
+    if (ContextCompat.checkSelfPermission(this,
+        Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
+      ActivityCompat.requestPermissions(this, new String[]{
+          Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
+    }
+
+    final Button arCoreButton = findViewById(R.id.arcore_button);
+    final Button aboutButton = findViewById(R.id.about_button);
+    final Button edgeButton = findViewById(R.id.edge_button);
+    final Button edgeVideoButton = findViewById(R.id.edge_video_button);
+    final Button resetConfigButton = findViewById(R.id.reset_button);
+    edgeDevicePortInput = findViewById(R.id.edge_server_port_input);
+    edgeDeviceIPInput = findViewById(R.id.edge_server_host_input);
+    edgeDeviceTransmissionInput = findViewById(R.id.edge_device_transmission);
+    endDeviceTransmissionInput = findViewById(R.id.end_device_transmission);
+    edgeDeviceBitrateInput = findViewById(R.id.edge_device_bitrate_input);
+    endDeviceBitrateInput = findViewById(R.id.end_device_bitrate_input);
+    edgeDeviceUseJitterBufferInput = findViewById(R.id.edge_device_use_jitterbuffer);
+    endDeviceUseJitterBufferInput = findViewById(R.id.end_device_use_jitterbuffer);
+
+    SharedPreferences prefs = getSharedPreferences(EdgeActivity.STORED_SETTINGS, MODE_PRIVATE);
+    String edgeServerIP = prefs.getString("edge_device_ip", "192.168.1.165");
+    int edgeServerPort = prefs.getInt("edge_device_port", 39200);
+    String edgeNodeTransmission = prefs.getString("edge_device_transmission", "");
+    String endDeviceTransmission = prefs.getString("end_device_transmission", "");
+    int edgeDeviceBitrate = prefs.getInt("edge_device_bitrate", 2000);
+    int endDeviceBitrate = prefs.getInt("end_device_bitrate", 2000);
+    boolean edgeDeviceJitterbuffer = prefs.getBoolean("edge_device_jitterbuffer", true);
+    boolean endDeviceJitterbuffer = prefs.getBoolean("end_device_jitterbuffer", false);
+
+    if (edgeDeviceIPInput != null) {
+      edgeDeviceIPInput.setText(edgeServerIP);
+    }
+    if (edgeDevicePortInput != null) {
+      edgeDevicePortInput.setText(String.valueOf(edgeServerPort));
+    }
+    if (edgeDeviceBitrateInput != null) {
+      edgeDeviceBitrateInput.setText(String.valueOf(edgeDeviceBitrate));
+    }
+    if (endDeviceBitrateInput != null) {
+      endDeviceBitrateInput.setText(String.valueOf(endDeviceBitrate));
+    }
+    if (edgeDeviceUseJitterBufferInput != null) {
+      edgeDeviceUseJitterBufferInput.setChecked(edgeDeviceJitterbuffer);
+    }
+    if (endDeviceUseJitterBufferInput != null) {
+      endDeviceUseJitterBufferInput.setChecked(endDeviceJitterbuffer);
+    }
+    if (edgeDeviceTransmissionInput != null) {
+      int selected = 0;
+      ArrayList<String> spinnerArray = new ArrayList<>();
+      for (int i = 0; i < EdgeActivity.EdgeNodeTransmissionMethods.length; i++) {
+        spinnerArray.add(EdgeActivity.EdgeNodeTransmissionMethods[i].getLong());
+        if (edgeNodeTransmission != null &&
+            edgeNodeTransmission.equals(
+                EdgeActivity.EdgeNodeTransmissionMethods[i].getShort())) {
+          selected = i;
+        }
+      }
+      edgeDeviceTransmissionInput.setAdapter(new ArrayAdapter<>(this,
+          android.R.layout.simple_spinner_dropdown_item, spinnerArray));
+      edgeDeviceTransmissionInput.getSelectedItemPosition();
+      edgeDeviceTransmissionInput.setSelection(selected);
+    }
+    if (endDeviceTransmissionInput != null) {
+      int selected = 0;
+      ArrayList<String> spinnerArray = new ArrayList<>();
+      for (int i = 0; i < EdgeActivity.EndDeviceTransmissionMethods.length; i++) {
+        spinnerArray.add(EdgeActivity.EndDeviceTransmissionMethods[i].getLong());
+        if (endDeviceTransmission != null &&
+            endDeviceTransmission.equals(
+                EdgeActivity.EndDeviceTransmissionMethods[i].getShort())) {
+          selected = i;
+        }
+      }
+      endDeviceTransmissionInput.setAdapter(new ArrayAdapter<>(this,
+          android.R.layout.simple_spinner_dropdown_item, spinnerArray));
+      endDeviceTransmissionInput.getSelectedItemPosition();
+      endDeviceTransmissionInput.setSelection(selected);
+    }
+
+    // Removes all whitespace in the port and server address fields.
+    TextWatcher textWhitespaceListener = new TextWatcher() {
+      @Override
+      final public void afterTextChanged(Editable s) {
+        try {
+          if (edgeDeviceIPInput != null) {
+            String oldIP = edgeDeviceIPInput.getText().toString();
+            String newIP = oldIP.replaceAll("\\s+", "");
+            if (!oldIP.equals(newIP)) {
+              edgeDeviceIPInput.setText(newIP);
+            }
+          }
+          if (edgeDevicePortInput != null) {
+            String oldPort = edgeDevicePortInput.getText().toString();
+            String newPort = oldPort.replaceAll("\\s+", "");
+            if (!oldPort.equals(newPort)) {
+              edgeDevicePortInput.setText(newPort);
+            }
+          }
+
+          if (edgeDeviceBitrateInput != null) {
+            String oldBitrate = edgeDeviceBitrateInput.getText().toString();
+            String newBitrate = oldBitrate.replaceAll("\\s+", "");
+            if (!oldBitrate.equals(newBitrate)) {
+              edgeDeviceBitrateInput.setText(newBitrate);
+            }
+          }
+          if (endDeviceBitrateInput != null) {
+            String oldBitrate = endDeviceBitrateInput.getText().toString();
+            String newBitrate = oldBitrate.replaceAll("\\s+", "");
+            if (!oldBitrate.equals(newBitrate)) {
+              endDeviceBitrateInput.setText(newBitrate);
+            }
+          }
+        } catch (Exception e) {
+          Log.d(TAG, "edgeDeviceIPInput.onTextChanged: " + e.getMessage());
+        }
+      }
+      @Override
+      final public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+      }
+
+      @Override
+      final public void onTextChanged(CharSequence s, int start, int before, int count) {
+      }
+    };
+
+    if (edgeDeviceIPInput != null) {
+      edgeDeviceIPInput.addTextChangedListener(textWhitespaceListener);
+    }
+    if (edgeDevicePortInput != null) {
+      edgeDevicePortInput.addTextChangedListener(textWhitespaceListener);
+    }
+    if (edgeDeviceBitrateInput != null) {
+      edgeDeviceBitrateInput.addTextChangedListener(textWhitespaceListener);
+    }
+    if (endDeviceBitrateInput != null) {
+      endDeviceBitrateInput.addTextChangedListener(textWhitespaceListener);
+    }
+
+    edgeButton.setOnClickListener(v -> {
+      try {
+        Intent intent = createEdgeIntent("");
+        if (intent != null) {
+          startActivity(intent);
+          finish();
+          return;
+        }
+      } catch (Exception e) {
+        Log.d(TAG, "Edge button exception: " + e.getMessage());
+      }
+      runOnUiThread(() -> Toast.makeText(MainActivity.this, "Can't connect.", Toast.LENGTH_SHORT).show());
+    });
+
+    arCoreButton.setOnClickListener(v -> {
+      Toast.makeText(getApplicationContext(), "ARcore", Toast.LENGTH_SHORT).show();
+      Intent intent = new Intent(MainActivity.this, ARCoreActivity.class);
+      intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
+      startActivity(intent);
+    });
+
+    edgeVideoButton.setOnClickListener(
+        v -> {
+          if ((ContextCompat.checkSelfPermission(this,
+              Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {
+            ActivityCompat.requestPermissions(this,
+                new String[]{
+                    Manifest.permission.READ_EXTERNAL_STORAGE,
+                }, REQUEST_EXTERNAL_STORAGE_PERMISSION);
+            return;
+          }
+          try {
+            final Intent intent = createEdgeIntent("");
+            if (intent == null) {
+              runOnUiThread(() -> Toast.makeText(MainActivity.this, "Can't connect.", Toast.LENGTH_SHORT).show());
+              return;
+            }
+            final String oldSourceVideo = getSharedPreferences(EdgeActivity.STORED_SETTINGS, MODE_PRIVATE)
+                .getString("source_video_file", "");
+
+            if (oldSourceVideo == null || oldSourceVideo.isEmpty()) {
+              new AlertDialog.Builder(MainActivity.this)
+                  .setMessage("The video player only supports videos in resolution 640x480.")
+                  .setPositiveButton("Ok", (dialog, which) -> {
+                    dialog.cancel();
+                    chooseVideoFile();
+                  }).show();
+            } else {
+              new AlertDialog.Builder(MainActivity.this)
+                  .setMessage("The previous session used the video file \n'" +
+                      oldSourceVideo + "'.\n" + "Use the same file this session?")
+                  .setPositiveButton("Yes", (dialog, which) -> {
+                    Intent intentWithVideo = createEdgeIntent(oldSourceVideo);
+                    startActivity(intentWithVideo);
+                    finish();
+                  })
+                  .setNegativeButton("No", (dialog, which) -> {
+                    dialog.cancel();
+                    chooseVideoFile();
+                  }).show();
+            }
+          } catch (Exception e) {
+            Log.d(TAG, "Edge button exception: " + e.getMessage());
+          }
+        });
+
+    resetConfigButton.setOnClickListener(new View.OnClickListener() {
+      @Override
+      public void onClick(View v) {
+        new AlertDialog.Builder(MainActivity.this)
+            .setMessage("Remove all stored configuration and reset to defaults?")
+            .setPositiveButton("Yes", (dialog, which) -> {
+              getSharedPreferences(EdgeActivity.STORED_SETTINGS, MODE_PRIVATE).edit()
+                  .clear()
+                  .commit();
+              finish();
+              startActivity(MainActivity.this.getIntent());
+            })
+            .setNegativeButton("No", (dialog, which) -> {
+              dialog.cancel();
+            }).show();
+      }
+    });
+
+    aboutButton.setOnClickListener(v -> {
+      Intent intent = new Intent(MainActivity.this, AboutActivity.class);
+      intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
+      startActivity(intent);
+    });
+  }
+
+  /**
+   * Callback function for the result after requesting permission to use the Android camera.
+   *
+   * @param requestCode  The camera permission.
+   * @param permissions  Unused
+   * @param grantResults PERMISSION_GRANTED if granted.
+   */
+  @Override
+  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
+                                         @NonNull int[] grantResults) {
+    if (requestCode == REQUEST_CAMERA_PERMISSION &&
+        !(grantResults.length > 0 &&
+            grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
+      Toast.makeText(this, R.string.permission_camera_not_granted, Toast.LENGTH_SHORT).show();
+    }
+    if (requestCode == REQUEST_EXTERNAL_STORAGE_PERMISSION &&
+        !(grantResults.length > 0 &&
+            grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
+      Toast.makeText(this, R.string.permission_storage_not_granted, Toast.LENGTH_SHORT).show();
+    }
+  }
+
+  private void chooseVideoFile() {
+    new ChooserDialog(MainActivity.this)
+        .withFilter(false, false, "mp4", "mpg")
+        .enableOptions(true)
+        .withChosenListener((path, pathFile) -> {
+          runOnUiThread(() -> Toast.makeText(MainActivity.this, "FILE: " + path, Toast.LENGTH_SHORT).show());
+          if (!path.isEmpty()) {
+            Intent intentWithVideo = createEdgeIntent(path);
+            startActivity(intentWithVideo);
+            finish();
+          }
+        })
+        .withOnCancelListener(dialog -> {
+          Log.d("CANCEL", "CANCEL");
+          dialog.cancel();
+        })
+        .build()
+        .show();
+  }
+
+  @SuppressLint("ApplySharedPref")
+  private Intent createEdgeIntent(String videoFile) {
+    if (ContextCompat.checkSelfPermission(this,
+        Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
+      ActivityCompat.requestPermissions(this, new String[]{
+          Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
+      return null;
+    }
+    if (edgeDeviceIPInput == null || edgeDevicePortInput == null) {
+      runOnUiThread(() -> Toast.makeText(MainActivity.this, "Invalid server address.", Toast.LENGTH_SHORT).show());
+      return null;
+    }
+    String serverIP = edgeDeviceIPInput.getText().toString();
+    int serverPort = Integer.valueOf(edgeDevicePortInput.getText().toString());
+
+    int edgeDeviceBitrate = Integer.valueOf(edgeDeviceBitrateInput.getText().toString());
+    int endDeviceBitrate = Integer.valueOf(endDeviceBitrateInput.getText().toString());
+
+    if (!serverIP.contains(" ") &&
+        !serverIP.contains(Objects.requireNonNull(System.getProperty("line.separator"))) &&
+        serverPort < 65536 &&
+        serverPort > 0 &&
+        edgeDeviceBitrate > 0 &&
+        endDeviceBitrate > 0 &&
+        // Verity that the server address is an IP address.
+        Patterns.IP_ADDRESS.matcher(serverIP).matches()) {
+      Toast.makeText(getApplicationContext(), "Edge", Toast.LENGTH_SHORT).show();
+      Intent intent = new Intent(MainActivity.this, EdgeActivity.class);
+      intent.putExtra("edge_device_ip", serverIP);
+      intent.putExtra("edge_device_port", serverPort);
+      intent.putExtra("edge_device_jitterbuffer", edgeDeviceUseJitterBufferInput.isChecked());
+      intent.putExtra("end_device_jitterbuffer", endDeviceUseJitterBufferInput.isChecked());
+      String edgeDeviceTransmissionShortForm = "";
+      String endDeviceTransmissionShortForm = "";
+      if (edgeDeviceTransmissionInput != null) {
+        edgeDeviceTransmissionShortForm =
+            EdgeActivity.EdgeNodeTransmissionMethods[
+                edgeDeviceTransmissionInput.getSelectedItemPosition()]
+                .getShort();
+      }
+      if (endDeviceTransmissionInput != null) {
+        endDeviceTransmissionShortForm =
+            EdgeActivity.EndDeviceTransmissionMethods[
+                endDeviceTransmissionInput.getSelectedItemPosition()]
+                .getShort();
+      }
+      intent.putExtra("edge_device_transmission", edgeDeviceTransmissionShortForm);
+      intent.putExtra("end_device_transmission", endDeviceTransmissionShortForm);
+      getSharedPreferences(EdgeActivity.STORED_SETTINGS, MODE_PRIVATE).edit()
+          .putString("edge_device_ip", serverIP)
+          .putInt("edge_device_port", serverPort)
+          .putInt("edge_device_bitrate", edgeDeviceBitrate)
+          .putInt("end_device_bitrate", endDeviceBitrate)
+          .putInt("edge_device_port", serverPort)
+          .putBoolean("edge_device_jitterbuffer", edgeDeviceUseJitterBufferInput.isChecked())
+          .putBoolean("end_device_jitterbuffer", endDeviceUseJitterBufferInput.isChecked())
+          .putString("edge_device_transmission", edgeDeviceTransmissionShortForm)
+          .putString("end_device_transmission", endDeviceTransmissionShortForm)
+          .commit();
+      if (!videoFile.equals("")) {
+        intent.putExtra("source_video_file", videoFile);
+        getSharedPreferences(EdgeActivity.STORED_SETTINGS, MODE_PRIVATE).edit()
+            .putString("source_video_file", videoFile)
+            .commit();
+      }
+      return intent;
+    }
+    runOnUiThread(() -> Toast.makeText(MainActivity.this, "Invalid server address.", Toast.LENGTH_SHORT).show());
+    return null;
+  }
+}
\ No newline at end of file
diff --git a/app/src/se/liu/mrleo/edge/ImageEncoder.java b/app/src/se/liu/mrleo/edge/ImageEncoder.java
new file mode 100644
index 0000000..1613b27
--- /dev/null
+++ b/app/src/se/liu/mrleo/edge/ImageEncoder.java
@@ -0,0 +1,88 @@
+package se.liu.mrleo.edge;
+
+import android.graphics.ImageFormat;
+import android.media.Image;
+import android.media.ImageReader;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.util.Log;
+import android.util.Size;
+import android.view.Surface;
+
+import java.nio.ByteBuffer;
+
+import se.liu.mrleo.edge.network.InternetConnection;
+
+public class ImageEncoder {
+
+  private ImageReader mImageReader;
+  private Handler mBackgroundHandler;
+  private HandlerThread mBackgroundThread = null;
+  private Surface mSurface;
+  private InternetConnection mInternetConnection = null;
+  private int mImageId = 1;
+
+  public ImageEncoder() {
+  }
+
+  public void setInternetConnection(InternetConnection connection) {
+    mInternetConnection = connection;
+  }
+
+  private final ImageReader.OnImageAvailableListener mOnImageAvailableListener =
+      reader -> {
+        Log.d("ImageEncoder", "The onImageAvailable thread id: " + Thread.currentThread().getId());
+        if (mInternetConnection == null) {
+          return;
+        }
+        Image image = reader.acquireLatestImage();
+        if (image == null) {
+          return;
+        }
+        Image.Plane[] planes = image.getPlanes();
+        ByteBuffer buffer = planes[0].getBuffer();
+        byte[] data = new byte[buffer.capacity()];
+        buffer.get(data);
+        image.close();
+        Log.d("ImageEncoder", "Calling Internet Connection");
+        mImageId++;
+        mInternetConnection.sendIfLatest(new InternetConnection.Data(
+            InternetConnection.Data.Type.IMAGE, mImageId, data));
+      };
+
+  private Handler getBackgroundThread() {
+    if (mBackgroundThread == null) {
+      mBackgroundThread = new HandlerThread("ImageEncoder");
+      mBackgroundThread.start();
+      mBackgroundHandler = new Handler(mBackgroundThread.getLooper());
+    }
+    return mBackgroundHandler;
+  }
+
+  public void stop() {
+    if (mBackgroundThread != null) {
+      try {
+        mImageReader = null;
+        mBackgroundThread.quitSafely();
+        mBackgroundThread.join();
+        mBackgroundThread = null;
+        mBackgroundHandler = null;
+      } catch (InterruptedException e) {
+        e.printStackTrace();
+      }
+    }
+  }
+
+  public Surface getSurface(Size size) {
+    if (mImageReader == null ||
+        mImageReader.getWidth() != size.getWidth() ||
+        mImageReader.getHeight() != size.getHeight()) {
+      int QUEUE_SIZE = 10;
+      mImageReader = ImageReader.newInstance(size.getWidth(), size.getHeight(),
+          ImageFormat.JPEG, QUEUE_SIZE);
+      mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, getBackgroundThread());
+      mSurface = mImageReader.getSurface();
+    }
+    return mSurface;
+  }
+}
\ No newline at end of file
diff --git a/app/src/se/liu/mrleo/edge/StillCamera.java b/app/src/se/liu/mrleo/edge/StillCamera.java
new file mode 100644
index 0000000..527b095
--- /dev/null
+++ b/app/src/se/liu/mrleo/edge/StillCamera.java
@@ -0,0 +1,505 @@
+package se.liu.mrleo.edge;
+
+import android.Manifest;
+import android.app.Activity;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.graphics.Rect;
+import android.graphics.SurfaceTexture;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraCaptureSession;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CameraMetadata;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.params.StreamConfigurationMap;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.support.annotation.NonNull;
+import android.support.v4.content.ContextCompat;
+import android.util.Log;
+import android.util.Size;
+import android.view.Surface;
+import android.widget.Toast;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+public class StillCamera {
+
+  public interface Listener {
+    void onCameraOpened();
+
+    void onCameraDisconnected();
+
+    void onCameraError(int error);
+  }
+
+  public enum FocusMode {
+    AUTOFOCUS, MANUAL, DISABLED
+  }
+
+  public enum Template {
+    PREVIEW, STILL_CAPTURE, RECORD,
+    VIDEO_SNAPSHOT, ZERO_SHUTTER_LAG
+  }
+
+  private FocusMode mFocusMode = FocusMode.AUTOFOCUS;
+  private Listener mListener;
+  private String mCameraId;
+  private CameraDevice mCameraDevice;
+  private CameraCaptureSession mCameraCaptureSession = null;
+  private CaptureRequest.Builder mCaptureRequestBuilder;
+  private List<Size> mImageDimensions;
+  private CameraCharacteristics mCameraCharacteristics;
+  private CameraManager mCameraManager;
+  private Activity mActivity;
+  private float mZoomLevel = 1f;
+  private boolean mFlashEnabled = false;
+  private Handler mBackgroundHandler;
+  private HandlerThread mBackgroundThread;
+  private boolean mCameraOpen = false;
+  private Template mCameraTemplate = Template.PREVIEW;
+
+  public StillCamera(Activity act) {
+    mActivity = act;
+  }
+
+  public boolean isOpen() {
+    return mCameraOpen;
+  }
+
+  public void attachListener(Listener listener) {
+    mListener = listener;
+  }
+
+  public void init() {
+    mCameraManager = (CameraManager) mActivity.getSystemService(Context.CAMERA_SERVICE);
+    // String[] cameraList = getCameraList();
+  }
+
+  /**
+   * @return The opened camera name ("0", "1").
+   */
+  @SuppressWarnings("unused")
+  public String getCurrentCamera() {
+    return mCameraId;
+  }
+
+  /**
+   * Open the camera and init the class.
+   * @param camera Camera name ("0", "1").
+   */
+  public void openCamera(String camera) {
+    if (camera.equals(mCameraId)) {
+      return;
+    }
+    try {
+      if (ContextCompat.checkSelfPermission(mActivity.getApplicationContext(),
+          Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
+        return;
+      }
+      stop();
+      mCameraCharacteristics = getCameraCharacteristics(camera);
+      assert mCameraCharacteristics != null;
+      StreamConfigurationMap map = mCameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+      assert map != null;
+      mImageDimensions = Arrays.asList(map.getOutputSizes(SurfaceTexture.class));
+      mCameraManager.openCamera(camera, camCallbacks, null);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  /**
+   * Available cameras.
+   * @return List of camera ids.
+   */
+  @SuppressWarnings("unused")
+  public String[] getCameraList() {
+    try {
+      if (mCameraManager != null) {
+        return mCameraManager.getCameraIdList();
+      }
+    } catch (CameraAccessException e) {
+      e.printStackTrace();
+    }
+    return null;
+  }
+
+  /**
+   * Get camera hardware/API properties.
+   * @param camera Camera name ("0", "1").
+   * @return Android object containing all attributes for the camera..
+   */
+  private CameraCharacteristics getCameraCharacteristics(String camera) {
+    try {
+      if (mCameraManager != null) {
+        return mCameraManager.getCameraCharacteristics(camera);
+      }
+    } catch (CameraAccessException e) {
+      e.printStackTrace();
+    }
+    return null;
+  }
+
+  /**
+   * Callbacks for Android Camera2 API.
+   */
+  private final CameraDevice.StateCallback camCallbacks = new CameraDevice.StateCallback() {
+    @Override
+    public void onOpened(@NonNull CameraDevice camera) {
+      Log.d("CAM", "onOpened");
+      mCameraId = camera.getId();
+      mCameraDevice = camera;
+      StillCamera.this.mCameraOpen = true;
+      if (mListener != null) {
+        mListener.onCameraOpened();
+      }
+    }
+
+    @Override
+    public void onClosed(@NonNull CameraDevice camera) {
+      Log.d("CAM", "onClosed");
+      StillCamera.this.mCameraOpen = false;
+      mCameraDevice = null;
+    }
+
+    @Override
+    public void onDisconnected(@NonNull CameraDevice camera) {
+      StillCamera.this.mCameraOpen = false;
+      Log.d("CAM", "onDisconnected");
+      stopCapture();
+      if (mCameraDevice != null) {
+        mCameraDevice.close();
+      }
+      mCameraDevice = null;
+      if (mListener != null) {
+        mListener.onCameraDisconnected();
+      }
+      mCameraId = null;
+      mCameraCaptureSession = null;
+    }
+
+    @Override
+    public void onError(@NonNull CameraDevice camera, int error) {
+      Log.d("CAM", "onError");
+      StillCamera.this.mCameraOpen = false;
+      mCameraDevice.close();
+      mCameraDevice = null;
+      mCameraId = null;
+      if (mListener != null) {
+        mListener.onCameraError(error);
+      }
+    }
+  };
+
+  public List<Size> getImageDimensions() {
+    return mImageDimensions;
+  }
+
+  /**
+   * Find the perfect capture resolution for this device's screen resolution.
+   * @param targetSize Where the image should be displayed.
+   * @return The optimal resolution in the camera's list.
+   */
+  @SuppressWarnings("unused")
+  public Size getOptimalImageDimension(Size targetSize) {
+    // Collect the supported resolutions that are at least as big as the preview Surface
+    List<Size> bigEnough = new ArrayList<>();
+    // Collect the supported resolutions that are smaller than the preview Surface
+    List<Size> notBigEnough = new ArrayList<>();
+    if (mImageDimensions == null || mImageDimensions.size() == 0) {
+      return null;
+    }
+    for (Size option : mImageDimensions) {
+      if (option.getHeight() == option.getWidth() * targetSize.getHeight() / targetSize.getWidth()) {
+        if ((option.getWidth() * 1.2) >= targetSize.getWidth() &&
+            (option.getHeight() * 1.2) >= targetSize.getHeight()) {
+          bigEnough.add(option);
+        } else {
+          notBigEnough.add(option);
+        }
+      }
+    }
+    Size ret;
+    // Pick the smallest of those big enough. If there is no one big enough, pick the
+    // largest of those not big enough.
+    class CompareSizesByArea implements Comparator<Size> {
+      @Override
+      public int compare(Size lhs, Size rhs) {
+        return Long.signum((long) lhs.getWidth() * lhs.getHeight() -
+            (long) rhs.getWidth() * rhs.getHeight());
+      }
+    }
+    if (bigEnough.size() > 0) {
+      ret = Collections.min(bigEnough, new CompareSizesByArea());
+    } else if (notBigEnough.size() > 0) {
+      ret = Collections.max(notBigEnough, new CompareSizesByArea());
+    } else {
+      ret = mImageDimensions.get(0);
+    }
+    return ret;
+  }
+
+  /**
+   * Capture qualities.
+   * @param template Internal Template for matching
+   * @return Android internal enum.
+   */
+  private int getCameraDeviceCameraTemplate(Template template) {
+    switch (template) {
+      case PREVIEW:
+        return CameraDevice.TEMPLATE_PREVIEW;
+      case RECORD:
+        return CameraDevice.TEMPLATE_RECORD;
+      case STILL_CAPTURE:
+        return CameraDevice.TEMPLATE_STILL_CAPTURE;
+      case VIDEO_SNAPSHOT:
+        return CameraDevice.TEMPLATE_VIDEO_SNAPSHOT;
+      case ZERO_SHUTTER_LAG:
+        return CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG;
+    }
+    return CameraDevice.TEMPLATE_PREVIEW;
+  }
+
+  @SuppressWarnings("unused")
+  public Template getCameraTemplate() {
+    return mCameraTemplate;
+  }
+
+  @SuppressWarnings("unused")
+  public void setCameraTemplate(Template template) {
+    mCameraTemplate = template;
+  }
+
+  /**
+   * Start capturing thecamera.
+   * @param previewSurface Where to preview the camera image.
+   * @param recordingSurface Where to output (encode) the camera image.
+   */
+  public void startCapture(Surface previewSurface, Surface recordingSurface) {
+    try {
+      if (!isOpen()) {
+        return;
+      }
+      Log.d("CAM", "startCapture");
+      stopCapture();
+      if (mCameraDevice == null) {
+        Log.d("StillCamera", "StillCamera is null");
+      }
+      mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(
+          getCameraDeviceCameraTemplate(mCameraTemplate));
+      List<Surface> captureSessionOutputs = new ArrayList<>();
+      if (previewSurface != null) {
+        mCaptureRequestBuilder.addTarget(previewSurface);
+        captureSessionOutputs.add(previewSurface);
+      }
+      if (recordingSurface != null) {
+        mCaptureRequestBuilder.addTarget(recordingSurface);
+        captureSessionOutputs.add(recordingSurface);
+      }
+      if (captureSessionOutputs.size() == 0) {
+        return;
+      }
+      mCameraDevice.createCaptureSession(captureSessionOutputs, new CameraCaptureSession.StateCallback() {
+        @Override
+        public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
+          if (mCameraDevice != null) {
+            mCameraCaptureSession = cameraCaptureSession;
+            mCaptureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
+            StillCamera.this.setFocusMode(StillCamera.this.getFocusMode());
+            restartSession();
+          }
+        }
+
+        @Override
+        public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
+          Toast.makeText(mActivity, "Camera configuration failed", Toast.LENGTH_SHORT).show();
+        }
+      }, null);
+    } catch (CameraAccessException e) {
+      Log.d("StillCamera", "CameraAccessException");
+    }
+  }
+
+  @SuppressWarnings("unused")
+  public void zoomIn() {
+    zoom(0.2f);
+  }
+
+  @SuppressWarnings("unused")
+  public void zoomOut() {
+    zoom(-0.2f);
+  }
+
+  /**
+   * Controls the zoom. See functions zoomIn and zoomOut.
+   * @param zoomChange Addition or subtraction.
+   */
+  private void zoom(float zoomChange) {
+    if (mCameraCharacteristics != null) {
+      float maxZoom = Math.min(3f, mCameraCharacteristics.get(
+          CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM));
+      mZoomLevel = Math.min(maxZoom, Math.max(1f, mZoomLevel + zoomChange));
+      Rect sensorSize = mCameraCharacteristics.get(
+          CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
+      int cropW = (int) (sensorSize.width() * (1 - 1 / mZoomLevel) / 2);
+      int cropH = (int) (sensorSize.width() * (1 - 1 / mZoomLevel) / 2);
+      Rect zoomRect = new Rect(cropW, cropH,
+          sensorSize.width() - cropW,
+          sensorSize.height() - cropH);
+      assert mCaptureRequestBuilder != null;
+      mCaptureRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoomRect);
+      restartSession();
+    }
+  }
+
+  /**
+   * Restart the capture requests.
+   */
+  private void restartSession() {
+    try {
+      if (mCameraCaptureSession != null) {
+        Log.d("CAM", "restartSession");
+        mCameraCaptureSession.setRepeatingRequest(mCaptureRequestBuilder.build(), null, getThread());
+      }
+    } catch (Exception ignore) {
+    }
+  }
+
+  /**
+   * Control the flash. If it's enable it's in torch mode and always on.
+   * @param enabled Lamp on or not.
+   */
+  public void setFlashMode(boolean enabled) {
+    if (enabled) {
+      mFlashEnabled = true;
+      mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
+    } else {
+      mFlashEnabled = true;
+      mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
+    }
+    restartSession();
+  }
+
+  /**
+   * Is flash enabled.
+   * @return True if enabled.
+   */
+  public boolean isFlashEnabled() {
+    return mFlashEnabled;
+  }
+
+  /**
+   * Set focus mode. Auto-focus or manual focus.
+   * @param mode Mode to use.
+   */
+  @SuppressWarnings("unused")
+  public void setFocusMode(FocusMode mode) {
+    if (mode == null) {
+      return;
+    }
+    mFocusMode = mode;
+    if (mCaptureRequestBuilder == null) {
+      return;
+    }
+    if (mFocusMode == FocusMode.AUTOFOCUS) {
+      int[] modes = mCameraCharacteristics.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES);
+      if (modes != null && modes.length != 0 &&
+          (modes.length != 1 && modes[0] != CameraCharacteristics.CONTROL_AF_MODE_OFF)) {
+        mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
+            CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
+        restartSession();
+        return;
+      }
+    }
+    assert mCaptureRequestBuilder != null;
+    mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
+    restartSession();
+  }
+
+  /**
+   * Current focus mode.
+   * @return FocusMode
+   */
+  public FocusMode getFocusMode() {
+    return mFocusMode;
+  }
+
+  /**
+   * Manually set the focus distance.
+   * @param focus 0-100%.
+   */
+  @SuppressWarnings("unused")
+  public void setFocusDistance(int focus) {
+    if (mFocusMode == FocusMode.MANUAL) {
+      int[] modes = mCameraCharacteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
+      if (modes != null) {
+        for (int mode : modes) {
+          if (mode == CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)
+            mCaptureRequestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE,
+                (float) (100 - focus) / 100);
+          restartSession();
+        }
+      }
+    }
+  }
+
+  /**
+   * Stops the capture (but not the thread).
+   */
+  private void stopCapture() {
+    Log.d("CAM", "stopCapture");
+    if (mCameraCaptureSession != null) {
+      try {
+        mCameraCaptureSession.stopRepeating();
+        mCameraCaptureSession.close();
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
+    }
+    mCameraCaptureSession = null;
+  }
+
+  /**
+   * Get the capturing thread. If none exists create one.
+   * @return The Thread handler.
+   */
+  public Handler getThread() {
+    if (mBackgroundThread == null) {
+      mBackgroundThread = new HandlerThread("Camera Background");
+      mBackgroundThread.start();
+      mBackgroundHandler = new Handler(mBackgroundThread.getLooper());
+    }
+    return mBackgroundHandler;
+  }
+
+  /**
+   * Stops the thread.
+   */
+  public void stop() {
+    if (mBackgroundThread != null) {
+      try {
+        Log.d("CAM", "stop");
+        stopCapture();
+        if (mCameraDevice != null) {
+          mCameraDevice.close();
+          mCameraId = null;
+          mCameraDevice = null;
+          mCameraOpen = false;
+        }
+        mBackgroundThread.quitSafely();
+        mBackgroundThread.join();
+        mBackgroundThread = null;
+        mBackgroundHandler = null;
+      } catch (InterruptedException e) {
+        e.printStackTrace();
+      }
+    }
+  }
+}
diff --git a/app/src/se/liu/mrleo/edge/dialogs/BitrateSelector.java b/app/src/se/liu/mrleo/edge/dialogs/BitrateSelector.java
new file mode 100644
index 0000000..2ae18f3
--- /dev/null
+++ b/app/src/se/liu/mrleo/edge/dialogs/BitrateSelector.java
@@ -0,0 +1,139 @@
+package se.liu.mrleo.edge.dialogs;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.AlertDialog;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class BitrateSelector extends DialogFragment {
+
+  public enum Direction {
+    Inbound, Outbound
+  }
+
+  private static final String ARG_BITRATES = "bitrates";
+  private static final String ARG_CURRENT_BITRATE = "current_bitrates";
+  private static final String ARG_DIRECTION = "current_direction";
+
+  private Listener mListener;
+
+  public static BitrateSelector newInstance(
+      Direction direction, List<Integer> captureBitrates, int currentBitrate) {
+    final BitrateSelector fragment = new BitrateSelector();
+    final Bundle args = new Bundle();
+    final ArrayList<Integer> bitratesArray = new ArrayList<>();
+    if (captureBitrates != null && !captureBitrates.isEmpty()) {
+      bitratesArray.addAll(captureBitrates);
+    } else {
+      for (int i = 100; i <= 10000; i += 100) {
+        bitratesArray.add(i);
+      }
+    }
+    args.putIntegerArrayList(ARG_BITRATES, bitratesArray);
+    args.putInt(ARG_CURRENT_BITRATE, currentBitrate);
+    args.putSerializable(ARG_DIRECTION, direction);
+    fragment.setArguments(args);
+    return fragment;
+  }
+
+  @Override
+  public void onAttach(Context context) {
+    super.onAttach(context);
+    mListener = (Listener) context;
+  }
+
+  @Override
+  public void onDetach() {
+    mListener = null;
+    super.onDetach();
+  }
+
+  @NonNull
+  @Override
+  public Dialog onCreateDialog(Bundle savedInstanceState) {
+    final Bundle args = getArguments();
+    ArrayList<Integer> bitrates = null;
+    if (args != null) {
+      bitrates = args.getIntegerArrayList(ARG_BITRATES);
+    }
+    if (bitrates == null || bitrates.size() == 0) {
+      throw new RuntimeException("No bitrates");
+    }
+    final int current = args.getInt(ARG_CURRENT_BITRATE);
+    final Direction direction = (Direction) args.getSerializable(ARG_DIRECTION);
+    final BitrateAdapter adapter = new BitrateAdapter(bitrates, current);
+    return new AlertDialog.Builder(requireActivity())
+        .setAdapter(adapter, (dialog, position) ->
+            mListener.onBitrateSelected(direction, adapter.getItem(position)))
+        .create();
+  }
+
+  private static class BitrateAdapter extends BaseAdapter {
+
+    private final List<Integer> mBitrates;
+    private final int mCurrentBitrate;
+
+    BitrateAdapter(List<Integer> bitrates, int current) {
+      mBitrates = bitrates;
+      mCurrentBitrate = current;
+    }
+
+    @Override
+    public int getCount() {
+      return mBitrates.size();
+    }
+
+    @Override
+    public Integer getItem(int position) {
+      return mBitrates.get(position);
+    }
+
+    @Override
+    public long getItemId(int position) {
+      if (position == 0) {
+        return 0;
+      }
+      return getItem(position).hashCode();
+    }
+
+    @Override
+    public View getView(int position, View view, ViewGroup parent) {
+      BitrateAdapter.ViewHolder holder;
+      if (view == null) {
+        view = LayoutInflater.from(parent.getContext())
+            .inflate(android.R.layout.simple_list_item_1, parent, false);
+        holder = new BitrateAdapter.ViewHolder();
+        holder.text = view.findViewById(android.R.id.text1);
+        view.setTag(holder);
+      } else {
+        holder = (BitrateAdapter.ViewHolder) view.getTag();
+      }
+      Integer bandwith = getItem(position);
+      String sb = bandwith.toString();
+      if (bandwith.equals(mCurrentBitrate)) {
+        sb += " *";
+      }
+      holder.text.setText(sb);
+      return view;
+    }
+
+    private static class ViewHolder {
+      TextView text;
+    }
+  }
+
+  public interface Listener {
+    void onBitrateSelected(Direction direction, @NonNull Integer bitrate);
+  }
+}
diff --git a/app/src/se/liu/mrleo/edge/dialogs/CaptureResolutionSelector.java b/app/src/se/liu/mrleo/edge/dialogs/CaptureResolutionSelector.java
new file mode 100644
index 0000000..55522ef
--- /dev/null
+++ b/app/src/se/liu/mrleo/edge/dialogs/CaptureResolutionSelector.java
@@ -0,0 +1,154 @@
+package se.liu.mrleo.edge.dialogs;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.AlertDialog;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.TextView;
+import android.util.Size;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import se.liu.mrleo.R;
+
+
+public class CaptureResolutionSelector extends DialogFragment {
+
+  private static final String ARG_CAPTURE_SIZES = "capture_sizes";
+  private static final String ARG_CURRENT_CAPTURE_SIZE = "current_capture_size";
+
+  private Listener mListener;
+
+  public static CaptureResolutionSelector newInstance(List<Size> capturesizes,
+                                                      Size currentSize) {
+    final CaptureResolutionSelector fragment = new CaptureResolutionSelector();
+    final Bundle args = new Bundle();
+    ArrayList<String> sizeArray = new ArrayList<>();
+    for (Size size : capturesizes) {
+      sizeArray.add(size.toString());
+    }
+    args.putStringArrayList(ARG_CAPTURE_SIZES, sizeArray);
+    args.putSize(ARG_CURRENT_CAPTURE_SIZE, currentSize);
+    fragment.setArguments(args);
+    return fragment;
+  }
+
+  @Override
+  public void onAttach(Context context) {
+    super.onAttach(context);
+    mListener = (Listener) context;
+  }
+
+  @Override
+  public void onDetach() {
+    mListener = null;
+    super.onDetach();
+  }
+
+  @NonNull
+  @Override
+  public Dialog onCreateDialog(Bundle savedInstanceState) {
+    final Bundle args = getArguments();
+    ArrayList<String> stringSizes = null;
+    if (args != null) {
+      stringSizes = args.getStringArrayList(ARG_CAPTURE_SIZES);
+    }
+    if (stringSizes == null || stringSizes.size() == 0) {
+      throw new RuntimeException("No ratios");
+    }
+    final List<Size> sizes = new ArrayList<>();
+    for (String sizeString : stringSizes) {
+      sizes.add(0, Size.parseSize(sizeString));
+    }
+    sizes.add(0, new Size(0, 0)); // Auto
+    final Size current = args.getSize(ARG_CURRENT_CAPTURE_SIZE);
+    final SizeAdapter adapter = new SizeAdapter(sizes, current);
+    return new AlertDialog.Builder(requireActivity())
+        .setAdapter(adapter, (dialog, position) -> {
+          Size newSize = adapter.getItem(position);
+          if (newSize.getWidth() == 0 && newSize.getHeight() == 0) {
+            mListener.onAutoCaptureSizeSelected();
+          } else {
+            mListener.onCaptureSizeSelected(newSize);
+          }
+        })
+        .create();
+  }
+
+  private static class SizeAdapter extends BaseAdapter {
+
+    private final List<Size> mSizes;
+    private final Size mCurrentSize;
+
+    SizeAdapter(List<Size> sizes, Size current) {
+      mSizes = sizes;
+      mCurrentSize = current;
+    }
+
+    @Override
+    public int getCount() {
+      return mSizes.size();
+    }
+
+    @Override
+    public Size getItem(int position) {
+      return mSizes.get(position);
+    }
+
+    @Override
+    public long getItemId(int position) {
+      return getItem(position).hashCode();
+    }
+
+    private int gcd(int p, int q) {
+      if (q == 0) {
+        return p;
+      }
+      return gcd(q, p % q);
+    }
+
+    @Override
+    public View getView(int position, View view, ViewGroup parent) {
+      SizeAdapter.ViewHolder holder;
+      if (view == null) {
+        view = LayoutInflater.from(parent.getContext())
+            .inflate(android.R.layout.simple_list_item_1, parent, false);
+        holder = new SizeAdapter.ViewHolder();
+        holder.text = view.findViewById(android.R.id.text1);
+        view.setTag(holder);
+      } else {
+        holder = (SizeAdapter.ViewHolder) view.getTag();
+      }
+      Size size = getItem(position);
+      if (size.getWidth() == 0 && size.getHeight() == 0) {
+        holder.text.setText(R.string.auto);
+      } else {
+        String sb = size.toString();
+        final int gcd = gcd(size.getWidth(), size.getHeight());
+        sb += " (" + (size.getWidth() / gcd) + ":" + (size.getHeight() / gcd) + ")";
+        if (size.equals(mCurrentSize)) {
+          sb += " *";
+        }
+        holder.text.setText(sb);
+      }
+      return view;
+    }
+
+    private static class ViewHolder {
+      TextView text;
+    }
+  }
+
+  public interface Listener {
+    void onCaptureSizeSelected(Size ratio);
+
+    void onAutoCaptureSizeSelected();
+  }
+}
diff --git a/app/src/se/liu/mrleo/edge/dialogs/FocusModeSelector.java b/app/src/se/liu/mrleo/edge/dialogs/FocusModeSelector.java
new file mode 100644
index 0000000..84b9f2a
--- /dev/null
+++ b/app/src/se/liu/mrleo/edge/dialogs/FocusModeSelector.java
@@ -0,0 +1,136 @@
+package se.liu.mrleo.edge.dialogs;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.AlertDialog;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import se.liu.mrleo.edge.StillCamera;
+
+@SuppressWarnings("unused")
+public class FocusModeSelector extends DialogFragment {
+
+  private static final String ARG_CURRENT_MODE = "current_mode";
+
+  private Listener mListener;
+
+  public static FocusModeSelector newInstance(StillCamera.FocusMode currentMode) {
+    final FocusModeSelector fragment = new FocusModeSelector();
+    final Bundle args = new Bundle();
+    args.putSerializable(ARG_CURRENT_MODE, currentMode);
+    fragment.setArguments(args);
+    return fragment;
+  }
+
+  @Override
+  public void onAttach(Context context) {
+    super.onAttach(context);
+    mListener = (Listener) context;
+  }
+
+  @Override
+  public void onDetach() {
+    mListener = null;
+    super.onDetach();
+  }
+
+  @NonNull
+  @Override
+  public Dialog onCreateDialog(Bundle savedInstanceState) {
+    final Bundle args = getArguments();
+    final StillCamera.FocusMode current;
+    if (args != null && args.getSerializable(ARG_CURRENT_MODE) != null) {
+      current = (StillCamera.FocusMode) args.getSerializable(ARG_CURRENT_MODE);
+    } else {
+      current = StillCamera.FocusMode.AUTOFOCUS;
+    }
+    final ModeAdapter adapter = new ModeAdapter(current);
+    return new AlertDialog.Builder(requireActivity())
+        .setAdapter(adapter, (dialog, position) -> {
+          if (position >= 0 && position < StillCamera.FocusMode.values().length) {
+            mListener.onFocusModeSelected(StillCamera.FocusMode.values()[position]);
+          }
+        })
+        .create();
+  }
+
+  private static class ModeAdapter extends BaseAdapter {
+
+    private final List<String> mModes;
+
+    ModeAdapter(StillCamera.FocusMode current) {
+      mModes = new ArrayList<>();
+      for (StillCamera.FocusMode mode : StillCamera.FocusMode.values()) {
+        String sb = "";
+        switch (mode) {
+          case AUTOFOCUS:
+            sb += "Autofocus";
+            break;
+          case MANUAL:
+            sb += "Manual";
+            break;
+          case DISABLED:
+            sb += "Disabled";
+            break;
+        }
+        if (mode.equals(current)) {
+          sb += " *";
+        }
+        mModes.add(sb);
+      }
+    }
+
+    @Override
+    public int getCount() {
+      return mModes.size();
+    }
+
+    @Override
+    public String getItem(int position) {
+      return mModes.get(position);
+    }
+
+    @Override
+    public long getItemId(int position) {
+      if (position == 0) {
+        return 0;
+      }
+      return getItem(position).hashCode();
+    }
+
+    @Override
+    public View getView(int position, View view, ViewGroup parent) {
+      ModeAdapter.ViewHolder holder;
+      if (view == null) {
+        view = LayoutInflater.from(parent.getContext())
+            .inflate(android.R.layout.simple_list_item_1, parent, false);
+        holder = new ModeAdapter.ViewHolder();
+        holder.text = view.findViewById(android.R.id.text1);
+        view.setTag(holder);
+      } else {
+        holder = (ModeAdapter.ViewHolder) view.getTag();
+      }
+      holder.text.setText(getItem(position));
+      return view;
+    }
+
+    private static class ViewHolder {
+      TextView text;
+    }
+  }
+
+  public interface Listener {
+    void onFocusModeSelected(StillCamera.FocusMode mode);
+  }
+
+}
diff --git a/app/src/se/liu/mrleo/edge/dialogs/MRObjectSelector.java b/app/src/se/liu/mrleo/edge/dialogs/MRObjectSelector.java
new file mode 100644
index 0000000..36c95ee
--- /dev/null
+++ b/app/src/se/liu/mrleo/edge/dialogs/MRObjectSelector.java
@@ -0,0 +1,125 @@
+package se.liu.mrleo.edge.dialogs;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.AlertDialog;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MRObjectSelector extends DialogFragment {
+
+  private static final String ARG_CURRENT_OBJECT = "current_object";
+
+  public enum MRObjects {
+    CUBE_A, CUBE_C
+  }
+  
+  private Listener mListener;
+
+  public static MRObjectSelector newInstance(MRObjects currentObject) {
+    final MRObjectSelector fragment = new MRObjectSelector();
+    final Bundle args = new Bundle();
+    args.putSerializable(ARG_CURRENT_OBJECT, currentObject);
+    fragment.setArguments(args);
+    return fragment;
+  }
+
+  @Override
+  public void onAttach(Context context) {
+    super.onAttach(context);
+    mListener = (Listener) context;
+  }
+
+  @Override
+  public void onDetach() {
+    mListener = null;
+    super.onDetach();
+  }
+
+  @NonNull
+  @Override
+  public Dialog onCreateDialog(Bundle savedInstanceState) {
+    final Bundle args = getArguments();
+    final MRObjects current;
+    if (args != null && args.getSerializable(ARG_CURRENT_OBJECT) != null) {
+      current = (MRObjects) args.getSerializable(ARG_CURRENT_OBJECT);
+    } else {
+      current = MRObjects.CUBE_A;
+    }
+    final ObjectAdapter adapter = new ObjectAdapter(current);
+    return new AlertDialog.Builder(requireActivity())
+        .setAdapter(adapter, (dialog, position) -> {
+          if (position >= 0 && position < MRObjects.values().length) {
+            mListener.onMRObjectSelected(MRObjects.values()[position]);
+          }
+        })
+        .create();
+  }
+
+  private static class ObjectAdapter extends BaseAdapter {
+    private final List<String> mObjects;
+
+    ObjectAdapter(MRObjects current) {
+      mObjects = new ArrayList<>();
+      for (MRObjects object : MRObjects.values()) {
+        String sb = object.toString();
+        if (object.equals(current)) {
+          sb += " *";
+        }
+        mObjects.add(sb);
+      }
+    }
+
+    @Override
+    public int getCount() {
+      return mObjects.size();
+    }
+
+    @Override
+    public String getItem(int position) {
+      return mObjects.get(position);
+    }
+
+    @Override
+    public long getItemId(int position) {
+      if (position == 0) {
+        return 0;
+      }
+      return getItem(position).hashCode();
+    }
+
+    @Override
+    public View getView(int position, View view, ViewGroup parent) {
+      ObjectAdapter.ViewHolder holder;
+      if (view == null) {
+        view = LayoutInflater.from(parent.getContext())
+            .inflate(android.R.layout.simple_list_item_1, parent, false);
+        holder = new ObjectAdapter.ViewHolder();
+        holder.text = view.findViewById(android.R.id.text1);
+        view.setTag(holder);
+      } else {
+        holder = (ObjectAdapter.ViewHolder) view.getTag();
+      }
+      holder.text.setText(getItem(position));
+      return view;
+    }
+
+    private static class ViewHolder {
+      TextView text;
+    }
+  }
+
+  public interface Listener {
+    void onMRObjectSelected(MRObjects object);
+  }
+
+}
diff --git a/app/src/se/liu/mrleo/edge/dialogs/MessageBoxFragment.java b/app/src/se/liu/mrleo/edge/dialogs/MessageBoxFragment.java
new file mode 100644
index 0000000..25babef
--- /dev/null
+++ b/app/src/se/liu/mrleo/edge/dialogs/MessageBoxFragment.java
@@ -0,0 +1,39 @@
+package se.liu.mrleo.edge.dialogs;
+
+import android.app.Dialog;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.StringRes;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.AlertDialog;
+
+public class MessageBoxFragment extends DialogFragment {
+
+  private static final String ARG_TITLE = "title";
+  private static final String ARG_MESSAGE = "message";
+
+  public static MessageBoxFragment newInstance(@StringRes int title, String message) {
+    MessageBoxFragment fragment = new MessageBoxFragment();
+    Bundle args = new Bundle();
+    args.putInt(ARG_TITLE, title);
+    args.putString(ARG_MESSAGE, message);
+    fragment.setArguments(args);
+    return fragment;
+  }
+
+  @NonNull
+  @Override
+  public Dialog onCreateDialog(Bundle savedInstanceState) {
+    final Bundle args = getArguments();
+    int title = 0;
+    String message = "";
+    if (args != null) {
+      title = args.getInt(ARG_TITLE);
+      message = args.getString(ARG_MESSAGE);
+    }
+    return new AlertDialog.Builder(requireActivity())
+        .setTitle(title)
+        .setMessage(message)
+        .create();
+  }
+}
diff --git a/app/src/se/liu/mrleo/edge/dialogs/PacketSizeSelector.java b/app/src/se/liu/mrleo/edge/dialogs/PacketSizeSelector.java
new file mode 100644
index 0000000..932e815
--- /dev/null
+++ b/app/src/se/liu/mrleo/edge/dialogs/PacketSizeSelector.java
@@ -0,0 +1,132 @@
+package se.liu.mrleo.edge.dialogs;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.AlertDialog;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class PacketSizeSelector extends DialogFragment {
+
+  private static final String ARG_PACKETSIZES = "packetsizes";
+  private static final String ARG_CURRENT_PACKETSIZE = "current_packetsize";
+
+  private Listener mListener;
+
+  public static PacketSizeSelector newInstance(List<Integer> inPacketsizes,
+                                               int currentPacketsize) {
+    final PacketSizeSelector fragment = new PacketSizeSelector();
+    final Bundle args = new Bundle();
+    final ArrayList<Integer> packetsizeArray = new ArrayList<>();
+    if (inPacketsizes != null && !inPacketsizes.isEmpty()) {
+      packetsizeArray.addAll(inPacketsizes);
+    } else {
+      for (int i = 50; i <= 20000; i += 50) {
+        packetsizeArray.add(i);
+      }
+    }
+    args.putIntegerArrayList(ARG_PACKETSIZES, packetsizeArray);
+    args.putInt(ARG_CURRENT_PACKETSIZE, currentPacketsize);
+    fragment.setArguments(args);
+    return fragment;
+  }
+
+  @Override
+  public void onAttach(Context context) {
+    super.onAttach(context);
+    mListener = (Listener) context;
+  }
+
+  @Override
+  public void onDetach() {
+    mListener = null;
+    super.onDetach();
+  }
+
+  @NonNull
+  @Override
+  public Dialog onCreateDialog(Bundle savedInstanceState) {
+    final Bundle args = getArguments();
+    ArrayList<Integer> packetSizes = new ArrayList<>();
+    if (args != null) {
+      packetSizes = args.getIntegerArrayList(ARG_PACKETSIZES);
+    }
+    if (packetSizes == null || packetSizes.size() == 0) {
+      throw new RuntimeException("No ratios");
+    }
+    final int current = args.getInt(ARG_CURRENT_PACKETSIZE);
+    final PacketSizeAdapter adapter = new PacketSizeAdapter(packetSizes, current);
+    return new AlertDialog.Builder(requireActivity())
+        .setAdapter(adapter, (dialog, position) ->
+            mListener.onPacketSizeSelected(adapter.getItem(position)))
+        .create();
+  }
+
+  private static class PacketSizeAdapter extends BaseAdapter {
+
+    private final List<Integer> mPacketSizes;
+    private final int mCurrentPacketSize;
+
+    PacketSizeAdapter(List<Integer> packetsizes, int current) {
+      mPacketSizes = packetsizes;
+      mCurrentPacketSize = current;
+    }
+
+    @Override
+    public int getCount() {
+      return mPacketSizes.size();
+    }
+
+    @Override
+    public Integer getItem(int position) {
+      return mPacketSizes.get(position);
+    }
+
+    @Override
+    public long getItemId(int position) {
+      if (position == 0) {
+        return 0;
+      }
+      return getItem(position).hashCode();
+    }
+
+    @Override
+    public View getView(int position, View view, ViewGroup parent) {
+      PacketSizeAdapter.ViewHolder holder;
+      if (view == null) {
+        view = LayoutInflater.from(parent.getContext())
+            .inflate(android.R.layout.simple_list_item_1, parent, false);
+        holder = new PacketSizeAdapter.ViewHolder();
+        holder.text = view.findViewById(android.R.id.text1);
+        view.setTag(holder);
+      } else {
+        holder = (PacketSizeAdapter.ViewHolder) view.getTag();
+      }
+      Integer size = getItem(position);
+      String sb = size.toString();
+      if (size.equals(mCurrentPacketSize)) {
+        sb += " *";
+      }
+      holder.text.setText(sb);
+      return view;
+    }
+
+    private static class ViewHolder {
+      TextView text;
+    }
+  }
+
+  public interface Listener {
+    void onPacketSizeSelected(@NonNull Integer size);
+  }
+}
diff --git a/app/src/se/liu/mrleo/edge/network/InternetConnection.java b/app/src/se/liu/mrleo/edge/network/InternetConnection.java
new file mode 100644
index 0000000..7634357
--- /dev/null
+++ b/app/src/se/liu/mrleo/edge/network/InternetConnection.java
@@ -0,0 +1,60 @@
+package se.liu.mrleo.edge.network;
+
+public interface InternetConnection {
+
+  class Data {
+    public Data(int _type, int _id, byte[] _data) {
+      type = _type;
+      id = _id;
+      data = _data;
+      protocol = Protocol.TCP;
+    }
+
+    public Data(int _type, int _id, byte[] _data, Protocol _protocol) {
+      type = _type;
+      id = _id;
+      data = _data;
+      protocol = _protocol;
+    }
+
+    public enum Protocol {
+      UDP,
+      TCP
+    }
+
+    public int id;
+    public int type;
+    public byte[] data;
+    public  Protocol protocol;
+
+    public final class Type {
+      public static final int CONNECTION = 1;
+      public static final int JSON = 2;
+      public static final int IMAGE = 3;
+      public static final int IMAGE_WITH_METADATA = 4;
+      public static final int CALIBRATION = 5;
+      public static final int TRIGGER_A = 6;
+      public static final int TRIGGER_B = 7;
+      public static final int PING = 21;
+      public static final int PONG = 22;
+
+      private Type() {
+      }
+    }
+  }
+
+  void disconnect();
+
+  void sendData(Data file);
+
+  void sendIfLatest(Data file);
+
+  interface Listener {
+    void disconnected();
+    void dataAvailable(Data file);
+  }
+
+  void setMaxBitrate(int bitrate);
+
+  void addDataListener(Listener listener);
+}
diff --git a/app/src/se/liu/mrleo/edge/network/TcpConnection.java b/app/src/se/liu/mrleo/edge/network/TcpConnection.java
new file mode 100644
index 0000000..eda01ea
--- /dev/null
+++ b/app/src/se/liu/mrleo/edge/network/TcpConnection.java
@@ -0,0 +1,292 @@
+package se.liu.mrleo.edge.network;
+
+import android.util.Log;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.util.LinkedList;
+import java.util.concurrent.LinkedBlockingQueue;
+
+
+public class TcpConnection implements InternetConnection, Runnable {
+  private static final String TAG = "TCP";
+  private LinkedBlockingQueue<Data> mSendQueue;
+  private volatile boolean mIsRunning;
+  private InetAddress mServerAddress;
+  private int mMaxBandwidth = Integer.MAX_VALUE;
+  private int mServerPort;
+  private LinkedList<Listener> mListeners = new LinkedList<>();
+
+  public TcpConnection(InetAddress address, int port) {
+    mSendQueue = new LinkedBlockingQueue<>();
+    mServerAddress = address;
+    mServerPort = port;
+  }
+
+  private static void bytesFromInt(byte[] arr, int offset, long val) {
+    arr[offset++] = (byte) (val >> 24);
+    arr[offset++] = (byte) (val >> 16);
+    arr[offset++] = (byte) (val >> 8);
+    arr[offset] = (byte) (val);
+  }
+
+  @SuppressWarnings("SameParameterValue")
+  private static void bytesFromShort(byte[] arr, int offset, int val) {
+    arr[offset++] = (byte) (val >> 8);
+    arr[offset] = (byte) (val);
+  }
+
+  private static int intFromBytes(byte a, byte b, byte c, byte d) {
+    return a << 24 | (b & 0xFF) << 16 | (c & 0xFF) << 8 | (d & 0xFF);
+  }
+
+  @Override
+  public void addDataListener(Listener listener) {
+    mListeners.add(listener);
+  }
+
+  @Override
+  public synchronized void sendIfLatest(Data data) {
+    try {
+      for (Data d : mSendQueue) {
+        if (d.type == data.type) {
+          mSendQueue.remove(d);
+        }
+      }
+    } catch (Exception e) {
+      Log.d(TAG, "sendIfLatest Exception: " + e.getMessage());
+    }
+  }
+
+  public synchronized void sendData(Data data) {
+    try {
+      mSendQueue.put(data);
+    } catch (Exception e) {
+      Log.d(TAG, "sendData Exception: " + e.getMessage());
+    }
+  }
+
+  @Override
+  public void setMaxBitrate(int bitrate) {
+    mMaxBandwidth = bitrate * 1024;
+  }
+
+  @Override
+  public void disconnect() {
+    Log.d(TAG, "disconnect");
+    setRunning(false);
+  }
+
+  /**
+   *
+   */
+  private class OutputWriterThread extends Thread {
+    private Socket mSocket;
+    private OutputStream mOutputStream = null;
+
+    OutputWriterThread(Socket socket) {
+      mSocket = socket;
+      try {
+        mOutputStream = mSocket.getOutputStream();
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
+    }
+
+    @Override
+    public void run() {
+      try {
+        int bytesSent = 0;
+        long startTime = System.currentTimeMillis();
+        while (!interrupted() && isRunning()) {
+          Data data = mSendQueue.take();
+          int offset = 0;
+          byte[] header = new byte[10];
+          bytesFromInt(header, 0, data.data.length);
+          bytesFromShort(header, 4, data.type);
+          bytesFromInt(header, 6, data.id);
+
+          mOutputStream.write(header);
+          bytesSent += header.length;
+          Log.d(TAG, "Sending type=" + data.type + ", length=" + data.data.length + ", header=" +
+              header.length + " bytes");
+          while (offset < data.data.length) {
+            long nowTime = System.currentTimeMillis();
+            long idleTime = 1000 - (nowTime - startTime);
+            if (idleTime < 0) {
+              startTime = nowTime;
+              idleTime = 1000;
+              bytesSent = 0;
+            }
+            int currPacketLength = Math.min(mMaxBandwidth - bytesSent, data.data.length - offset);
+            if (currPacketLength > 0) {
+              mOutputStream.write(data.data, offset, currPacketLength);
+              offset += currPacketLength;
+              bytesSent += currPacketLength;
+            }
+            if (bytesSent >= mMaxBandwidth) {
+              Log.d(TAG, "Throttling for " + idleTime);
+              bytesSent = 0;
+              Thread.sleep(idleTime);
+              startTime = System.currentTimeMillis();
+            }
+          }
+          mOutputStream.flush();
+        }
+      } catch (InterruptedException ex) {
+        Log.i(TAG, "sending thread interrupted.");
+        Thread.currentThread().interrupt();
+      } catch (Exception ex) {
+        Log.e(TAG, "Unexpected exception in sending thread:", ex);
+      }
+      Log.d(TAG, "Leaving sending thread");
+      setRunning(false);
+      synchronized (TcpConnection.this) {
+        TcpConnection.this.notifyAll();
+      }
+    }
+  }
+
+  /**
+   *
+   */
+  private class InputReaderThread extends Thread {
+    private Socket mSocket;
+    private InputStream mInputStream = null;
+
+    InputReaderThread(Socket socket) {
+      mSocket = socket;
+      try {
+        mInputStream = mSocket.getInputStream();
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
+    }
+
+    @Override
+    public void run() {
+      try {
+        byte[] resultBuff = new byte[0];
+        int mFileTransferSize = -1;
+        int currId = 0;
+        int currType = 0;
+        boolean mBufferInitialized = false;
+        int mNumReceivedBytes = 0;
+        int bytesRead = 0;
+        boolean rerun = false;
+        while (!interrupted() && isRunning()) {
+          byte[] buff = new byte[8192];
+          if (!rerun) {
+            bytesRead = mInputStream.read(buff, 0, buff.length);
+            if (bytesRead == -1) {
+              break;
+            }
+          }
+          rerun = false;
+          int consumedBuffer = 0;
+          if (mFileTransferSize > 0) {
+            consumedBuffer = Math.max(0, Math.min(mFileTransferSize - mNumReceivedBytes, bytesRead));
+            System.arraycopy(buff, 0, resultBuff, mNumReceivedBytes, consumedBuffer);
+            mNumReceivedBytes += consumedBuffer;
+          }
+          if (mFileTransferSize >= 0 && mNumReceivedBytes >= mFileTransferSize) {
+            mBufferInitialized = false;
+            byte[] outBuffer = resultBuff;
+            if (mNumReceivedBytes > mFileTransferSize) {
+              // Content for more than one file in buffer, copy to new
+              outBuffer = new byte[mFileTransferSize];
+              System.arraycopy(resultBuff, 0, outBuffer, 0, outBuffer.length);
+              byte[] tmp = new byte[resultBuff.length - mFileTransferSize];
+              System.arraycopy(resultBuff, mFileTransferSize, tmp, 0, tmp.length);
+              resultBuff = tmp;
+            } else {
+              resultBuff = new byte[0];
+            }
+            for (Listener listener : mListeners) {
+              listener.dataAvailable(new Data(currType, currId, outBuffer, Data.Protocol.TCP));
+            }
+            Log.d(TAG, "resultBuff.length=" + resultBuff.length);
+            mNumReceivedBytes = 0;
+            mFileTransferSize = -1;
+          }
+          if (mFileTransferSize == -1 && bytesRead > consumedBuffer) {
+            byte[] temp = new byte[resultBuff.length + (bytesRead - consumedBuffer)];
+            System.arraycopy(resultBuff, 0, temp, 0, resultBuff.length);
+            System.arraycopy(buff, consumedBuffer, temp, resultBuff.length, (bytesRead - consumedBuffer));
+            resultBuff = temp;
+          }
+          if (!mBufferInitialized && resultBuff.length >= 10) {
+            mFileTransferSize = intFromBytes(resultBuff[0], resultBuff[1], resultBuff[2], resultBuff[3]);
+            currType = intFromBytes((byte) 0, (byte) 0, resultBuff[4], resultBuff[5]);
+            currId = intFromBytes(resultBuff[6], resultBuff[7], resultBuff[8], resultBuff[9]);
+            mNumReceivedBytes = resultBuff.length - 10;
+            byte[] tmp = new byte[Math.max(mNumReceivedBytes, mFileTransferSize)];
+            System.arraycopy(resultBuff, 10, tmp, 0, mNumReceivedBytes);
+            resultBuff = tmp;
+            mBufferInitialized = true;
+            if (mNumReceivedBytes >= mFileTransferSize) {
+              rerun = true;
+              bytesRead = 0;
+            }
+            Log.d(TAG, "Finished initializing buffer");
+          }
+        }
+        Log.d(TAG, "Exited TCP loop");
+      } catch (Exception e) {
+        Log.w(TAG, e.toString());
+      }
+      setRunning(false);
+      synchronized (TcpConnection.this) {
+        TcpConnection.this.notifyAll();
+      }
+    }
+  }
+
+  @Override
+  public void run() {
+    try {
+      Socket socket = new Socket();
+      Log.d(TAG, "Starting socket");
+      socket.connect(new InetSocketAddress(mServerAddress, mServerPort), 5000);
+
+      OutputWriterThread outputWriter = new OutputWriterThread(socket);
+      InputReaderThread inputReader = new InputReaderThread(socket);
+
+      setRunning(true);
+      inputReader.start();
+      outputWriter.start();
+      //wait for the threads to finish, they never should
+      synchronized (TcpConnection.this) {
+        while (isRunning())
+          wait();
+      }
+      inputReader.interrupt();
+      outputWriter.interrupt();
+      Log.d(TAG, "socket closed");
+      socket.close();
+      inputReader.join();
+      outputWriter.join();
+    } catch (Exception ex) {
+      Log.e(TAG, "Thread exception");
+      Log.e(TAG, ex.toString());
+      for (Listener listener : mListeners) {
+        listener.disconnected();
+      }
+      setRunning(false);
+      Thread.currentThread().interrupt();
+    }
+  }
+
+  private boolean isRunning() {
+    return mIsRunning;
+  }
+
+  synchronized public void setRunning(boolean running) {
+    mIsRunning = running;
+    Log.d(TAG, "Connection: " + (running ? "running" : "stopped"));
+  }
+}
+
diff --git a/app/src/se/liu/mrleo/edge/network/UdpConnection.java b/app/src/se/liu/mrleo/edge/network/UdpConnection.java
new file mode 100644
index 0000000..f0266b9
--- /dev/null
+++ b/app/src/se/liu/mrleo/edge/network/UdpConnection.java
@@ -0,0 +1,253 @@
+package se.liu.mrleo.edge.network;
+
+import android.util.Log;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.util.LinkedList;
+import java.util.concurrent.LinkedBlockingQueue;
+
+public class UdpConnection implements InternetConnection {
+
+  private String TAG = "UDP";
+
+  private InputReaderThread mInputReader = null;
+  private static final int HEADER_SIZE = 16;
+
+  private static final int MAX_UDP_DATAGRAM_LENGTH = 5000;
+  private DatagramSocket mSocket = null;
+  private int mPacketSize = 600;
+  private InetAddress mServerAddress;
+  private int mServerPort;
+  private LinkedList<Listener> mListeners = new LinkedList<>();
+  private LinkedBlockingQueue<Data> mSendQueue;
+  private int mMaxBandwidth = Integer.MAX_VALUE;
+  private boolean mIsRunning = false;
+
+  public UdpConnection(InetAddress address, int port) {
+    mServerAddress = address;
+    mServerPort = port;
+    mSendQueue = new LinkedBlockingQueue<>();
+  }
+
+  public void start() {
+    disconnect();
+    try {
+      mSocket = new DatagramSocket();
+    } catch (Throwable e) {
+      e.printStackTrace();
+    }
+    mIsRunning = true;
+    mInputReader = new InputReaderThread();
+    mInputReader.start();
+    OutputWriterThread mOutputWriter = new OutputWriterThread();
+    mOutputWriter.start();
+  }
+
+  @Override
+  public void addDataListener(Listener listener) {
+    mListeners.add(listener);
+  }
+
+  public void setPacketSize(int packetSize) {
+    mPacketSize = packetSize;
+  }
+
+  @Override
+  public void setMaxBitrate(int bitrate) {
+    mMaxBandwidth = bitrate * 1024;
+  }
+
+  @Override
+  public void disconnect() {
+    mIsRunning = false;
+    if (mInputReader != null) {
+      mInputReader.kill();
+      mInputReader = null;
+      mSocket = null;
+    }
+  }
+
+  @Override
+  public synchronized void sendIfLatest(Data data) {
+    Log.d(TAG, "sendIfLatest: Adding bytes to TCP send list, numBytes=" + data.data.length);
+    try {
+      for (Data d : mSendQueue) {
+        if (d.type == data.type) {
+          mSendQueue.remove(d);
+        }
+      }
+      mSendQueue.put(data);
+    } catch (Exception e) {
+      Log.d(TAG, "sendIfLatest Exception: " + e.getMessage());
+    }
+  }
+
+  public synchronized void sendData(Data data) {
+    Log.d(TAG, "sendData: Adding bytes to UDP send list, numBytes=" + data.data.length);
+    try {
+      mSendQueue.put(data);
+    } catch (Exception e) {
+      Log.d(TAG, "sendData Exception: " + e.getMessage());
+    }
+  }
+
+  private class InputReaderThread extends Thread {
+    private boolean bKeepRunning = true;
+
+    public void run() {
+      Log.d(TAG, "Running InputReaderThread");
+      try {
+        byte[] outBuffer = null;
+        short currType = 0;
+        int currId = -1;
+        int receivedBytes = 0;
+        while (bKeepRunning) {
+          byte[] data = new byte[MAX_UDP_DATAGRAM_LENGTH];
+          mSocket.receive(new DatagramPacket(data, data.length));
+          short type = shortFromBytes(data[0], data[1]);
+          int id = intFromBytes(data[2], data[3], data[4], data[5]);
+          int total = intFromBytes(data[6], data[7], data[8], data[9]);
+          int offset = intFromBytes(data[10], data[11], data[12], data[13]);
+          short packetSize = shortFromBytes(data[14], data[15]);
+          if (id < currId) {
+            Log.d(TAG, "Old file packet");
+            continue;
+          }
+          if (outBuffer != null && (currId != id || currType != type)) {
+            Log.d(TAG, "New file. Received " + receivedBytes + " bytes of " +
+                ((outBuffer != null) ? outBuffer.length : 0));
+            Log.d(TAG, "Old id=" + currId + ", new id=" + id);
+            for (Listener listener : mListeners) {
+              listener.dataAvailable(new Data(currType, currId, outBuffer, Data.Protocol.UDP));
+            }
+            outBuffer = null;
+          }
+          if (outBuffer == null) {
+            if (total > 0) {
+              outBuffer = new byte[total];
+            } else {
+              outBuffer = null;
+            }
+            receivedBytes = 0;
+          }
+          if (outBuffer != null && outBuffer.length >= offset + packetSize) {
+            System.arraycopy(data, HEADER_SIZE, outBuffer, offset, packetSize);
+            receivedBytes += packetSize;
+          }
+          currId = id;
+          currType = type;
+          if (receivedBytes >= total) {
+            Log.d(TAG, "New file. Received " + receivedBytes + " bytes of " +
+                ((outBuffer != null) ? outBuffer.length : 0));
+            for (Listener listener : mListeners) {
+              listener.dataAvailable(new Data(currType, currId, outBuffer, Data.Protocol.UDP));
+            }
+            outBuffer = null;
+          }
+        }
+      } catch (Throwable e) {
+        Log.d(TAG, "InputReaderThread Exception.");
+        e.printStackTrace();
+      }
+      if (mSocket != null) {
+        mSocket.close();
+      }
+    }
+
+    private void kill() {
+      bKeepRunning = false;
+    }
+  }
+
+  private static void bytesFromInt(byte[] arr, int offset, long val) {
+    arr[offset++] = (byte) (val >> 24);
+    arr[offset++] = (byte) (val >> 16);
+    arr[offset++] = (byte) (val >> 8);
+    arr[offset] = (byte) (val);
+  }
+
+  private static short shortFromBytes(byte a, byte b) {
+    return (short) ((a & 0xFF) << 8 | (b & 0xFF));
+  }
+
+  private static void bytesFromShort(byte[] arr, int offset, int val) {
+    arr[offset++] = (byte) (val >> 8);
+    arr[offset] = (byte) (val);
+  }
+
+  private static int intFromBytes(byte a, byte b, byte c, byte d) {
+    return a << 24 | (b & 0xFF) << 16 | (c & 0xFF) << 8 | (d & 0xFF);
+  }
+
+  private class OutputWriterThread extends Thread {
+    @Override
+    public void run() {
+      try {
+        Log.d(TAG, "Running OutputWriterThread");
+        int bytesSent = 0;
+        long startTime = System.currentTimeMillis();
+
+        while (!interrupted() && isRunning()) {
+          Data data = mSendQueue.take();
+          Log.d(TAG, "Sending type=" + data.type + ", length=" + data.data.length + " (bytes)");
+          int offset = 0;
+          byte[] header = new byte[HEADER_SIZE];
+          bytesFromShort(header, 0, data.type);
+          bytesFromInt(header, 2, data.id);
+          bytesFromInt(header, 6, data.data.length);
+          do {
+            long nowTime = System.currentTimeMillis();
+            long idleTime = 1000 - (nowTime - startTime);
+            if (idleTime < 0) {
+              startTime = nowTime;
+              Log.d(TAG, "Sent " + bytesSent);
+              bytesSent = 0;
+            }
+            int currPacketLength = Math.min((offset + mPacketSize), data.data.length) - offset;
+            bytesFromInt(header, 10, offset);
+            bytesFromShort(header, 14, currPacketLength);
+            byte[] outPacket = new byte[currPacketLength + header.length];
+            System.arraycopy(header, 0, outPacket, 0, header.length);
+            System.arraycopy(data.data, offset, outPacket, header.length, currPacketLength);
+            DatagramPacket packet = new DatagramPacket(outPacket, outPacket.length,
+                mServerAddress, mServerPort);
+            offset += mPacketSize;
+            if (mSocket == null) {
+              return;
+            }
+            try {
+              mSocket.send(packet);
+            } catch (IOException e) {
+              Log.d(TAG, "mSocket Send Exception");
+              e.printStackTrace();
+            }
+            bytesSent += currPacketLength;
+            if (bytesSent >= mMaxBandwidth) {
+              Log.d(TAG, "Throttling for " + idleTime + " ms");
+              bytesSent = 0;
+              Thread.sleep(idleTime);
+              startTime = System.currentTimeMillis();
+            }
+          } while (offset < data.data.length);
+        }
+      } catch (Throwable e) {
+        Log.d(TAG, "UDP Exception: " + e.getMessage());
+        e.printStackTrace();
+      }
+    }
+  }
+
+  private boolean isRunning() {
+    return mIsRunning;
+  }
+
+  synchronized public void setRunning(boolean running) {
+    mIsRunning = running;
+    Log.d(TAG, "Connection: " + (running ? "running" : "stopped"));
+  }
+}
+
+
diff --git a/app/src/se/liu/mrleo/edge/streaming/GStreamerSurfaceView.java b/app/src/se/liu/mrleo/edge/streaming/GStreamerSurfaceView.java
new file mode 100644
index 0000000..88502c6
--- /dev/null
+++ b/app/src/se/liu/mrleo/edge/streaming/GStreamerSurfaceView.java
@@ -0,0 +1,85 @@
+package se.liu.mrleo.edge.streaming;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.SurfaceView;
+import android.view.View;
+
+// A simple SurfaceView whose width and height can be set from the outside
+public class GStreamerSurfaceView extends SurfaceView {
+  public int media_width = 320;
+  public int media_height = 240;
+
+  // Mandatory constructors, they do not do much
+  public GStreamerSurfaceView(Context context, AttributeSet attrs,
+                              int defStyle) {
+    super(context, attrs, defStyle);
+  }
+
+  public GStreamerSurfaceView(Context context, AttributeSet attrs) {
+    super(context, attrs);
+  }
+
+  public GStreamerSurfaceView(Context context) {
+    super(context);
+  }
+
+  // Called by the layout manager to find out our size and give us some rules.
+  // We will try to maximize our size, and preserve the media's aspect ratio if
+  // we are given the freedom to do so.
+  @Override
+  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+    int width = 0, height = 0;
+    int wmode = View.MeasureSpec.getMode(widthMeasureSpec);
+    int hmode = View.MeasureSpec.getMode(heightMeasureSpec);
+    int wsize = View.MeasureSpec.getSize(widthMeasureSpec);
+    int hsize = View.MeasureSpec.getSize(heightMeasureSpec);
+
+    Log.i("GStreamer", "onMeasure called with " + media_width + "x" + media_height);
+    // Obey width rules
+    switch (wmode) {
+      case View.MeasureSpec.AT_MOST:
+        if (hmode == View.MeasureSpec.EXACTLY) {
+          width = Math.min(hsize * media_width / media_height, wsize);
+          break;
+        }
+      case View.MeasureSpec.EXACTLY:
+        width = wsize;
+        break;
+      case View.MeasureSpec.UNSPECIFIED:
+        width = media_width;
+    }
+
+    // Obey height rules
+    switch (hmode) {
+      case View.MeasureSpec.AT_MOST:
+        if (wmode == View.MeasureSpec.EXACTLY) {
+          height = Math.min(wsize * media_height / media_width, hsize);
+          break;
+        }
+      case View.MeasureSpec.EXACTLY:
+        height = hsize;
+        break;
+      case View.MeasureSpec.UNSPECIFIED:
+        height = media_height;
+    }
+
+    // Finally, calculate best size when both axis are free
+    if (hmode == View.MeasureSpec.AT_MOST && wmode == View.MeasureSpec.AT_MOST) {
+      int correct_height = width * media_height / media_width;
+      int correct_width = height * media_width / media_height;
+
+      if (correct_height < height)
+        height = correct_height;
+      else
+        width = correct_width;
+    }
+
+    // Obey minimum size
+    width = Math.max(getSuggestedMinimumWidth(), width);
+    height = Math.max(getSuggestedMinimumHeight(), height);
+    setMeasuredDimension(width, height);
+  }
+
+}
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..e69434d
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,26 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+    repositories {
+        jcenter()
+        google()
+    }
+    dependencies {
+        classpath 'com.android.tools.build:gradle:3.4.2'
+        classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0'
+
+        // NOTE: Do not place your application dependencies here; they belong
+        // in the individual module build.gradle files
+    }
+}
+
+allprojects {
+    repositories {
+        jcenter()
+        google()
+    }
+}
+
+task clean(type: Delete) {
+    delete rootProject.buildDir
+}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000000000000000000000000000000000..05ef575b0cd0173fc735f2857ce4bd594ce4f6bd
GIT binary patch
literal 53637
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%0A4E@NZQQ#^lWkgO
zh<VR^Yt;uTO<O-|yyz*nd-eF@3OVN~D<cH`*PO1p>XT=hd}G;yt;@IMNQ?BSN0&rK
z3YaOiExFv%z0@GkbJ?4>%%2{emVech#L0YN-ln^z9}YWd*o*GI)bgk}CRy{k;7_+R
zUSCpc6K_j;XHS?cmFhA{L}ubyMj;DHrPsy3TDP9PByE<G9MG~(Gjg*<dr`8EsOcup
zn4LzGe{{JQ`#YB;Y23RzeRA`RRo=11lXr*kT}#mI?^W}6(GkCp+kGy2Ljq&)=GT1F
zZoWG<r|VOdxX0#zS+34&#JIG-pEWvss`U5iYZj7D-7ObRZ4^GWw$W&d*!(%yJd3^C
zt_dv+H5H4x-6p0#^{Du~LytB-ySnGzQRkRxoYO^<%gXb%q<HAcZ{D_P$5p@Qe2=bv
z*^@PM*`?24n!NTeEDyEv`K$GJPTj&w3bu<cm41<&x^7{1XjO|`=u5YKay`dG3QjFL
zziP|uynvTgzt$Yu9lEbEKjf#{y~Q7%KY5%sHUD9B=s%nLU2lIL@jA=A#`8t3<5T@l
z(-*j|o5b<r+Sbz06~Q9^Hl3>eX~t6au4PUEt6-Jm!`q?zn)fgI6#mn1>i3VaC-mN>
zHXkZq{m1m*u2bJX)J=W=G~c6m{;BWXLi{WKDE#G-K6v3#@5&jeZoN5&(ssS6iB{L$
z9(Li`bd~4X4|hzwl2qvJ?3nd3&F6A*?Tl#$>ZGU3gsnAQW*&dGD_hp%$*harwN{sw
z>z+CHdbQh3!z1;zzn{Jc`#HPDf#=(VQ}-YJ^|AKTaG6yur1L21%Vf_5pAP@Yo%&93
z#tVgd_owa&qVG0o>l&vlkJY`maOcSj3lBR!yzHH%y3y>wl~TWu_m_8liEX=<Ct-N@
z(&D?D(z9)sT@8&D+U)(sC1mri67JrGXUlaDJkP${X(1L>E2VQ+eUHqB(4_~%=E}9-
znssIEteGu^LW`7Tgr}*_n%9u=vW2bZ#+ys0xAwW%ta>?Xs)y>)I6vM{-LA}?N0+s2
zS{0`4Iqiti%)rTA0c~^MtvTxa^3%F&Wg;gsO3Ql9vK*eev-b9{tm%*s|G_zRzQ}R;
zXLWC`InUgzH}S%6mD*J{4)(!6Iqa8yy8OwEWB$e2O-~$lOM0^}Jn&pH=YsmG!nT8Y
z!FA8ucP%QsqB!rV_w-eNblwYUxrf>vJFodCcItlh1RXiq?98sH)rpLWGmHFQ%dL98
zrLSU9*yI=0aSz2q{@K}2>AV%#DieGmb#>XXkh+QSLM!8@J)4>+c1o;DYyYY0fZz^$
zm1%LOeWc?yto*|~)9m--Y_nybepP4*ZF9D*6k^>No!=o*6;!b7<j#mBAwTycGiA-#
zs=v%oy*T5L%)xl8Br|hGL5+_or94mPp0a;(UG(3?Q})m1ulN&O$DC~Ir@G?PY@Yf1
zkJ`ISzKZ&{;)~*cr-$1^|1DkcIQ);_u}h0jnM|$cmH(X2Vr}ehmHc<ZuiUCUuXD0O
z_ItGRD*cz*Uv%gCANKVA$FExZ&zCE0pH~s>@N@Rdi4)w<ZqInb{<J4O_xsZyJWn@G
zS-I5L_tTvEu5cC&nZi>te)U0_H&0kMy;N3vDzka{v|Vy*wocAGR`N39or~SYUZ;l~
z8{Zyw4%@ph$)ut3=IPeE^LKob%-b3qc5biA=a(-Z`^<fP^N5?-w?hG3lJ;p=uQ*$D
zUP!zybM6@zYkJL@ShjO#0`6ba7i;>*9eeIss`^fznU5yzo6z@xgIjI;dcEu>x0UZU
z<az#V=3`&BuONygKXYcxBp<nXGv8DnE)1)Ad!g1dFmtl@y&8*+B~h_uG93CFH_I5L
zPr24VZ~oq-l{OpK<z4<8W}|$(<)NtE6r;(#7xTE?UE<s4PJ3H?M&s3O_ua=s=PQ|?
ze6q|aGmcZZ>cOVKV<&dqPLF96nIq$<df3nJ>bb;Qo&R=yOR<@>iKlb<!`UhFTFgH#
zHtQ;V=SpB+B58HbukdA?<*ujNO5xsa>ocowe6-m2=1RCixG_`4?`Mm1uFO4cVSICf
z<_(1=xi;hT7C)zoNBA`PeXY`wbJi3uoH8ryRS{>xbMFOqiP1*aCpeeOPj)Xob!^FO
zv2Ag`Q;NMloV>G<#lNCxs&aWuLTY=GACKtsl+_QzdoJHS|9#QbDGL{V@tyePm#WO{
zx33pWO?G;=!dvy^^qbbwC*`CsE!Da_b9u@nQOP-$j4CUm^;Vi~Py7FTqVa}9=NQj^
zlvD8&k#e>vdcNaRK!Bsf-q+TC0)D>VzD8Us-2YlPaD&Npmc#j}T`}weL9tauu{Mb&
zZao@C#tg=KX<wpVo}Vb4W|k&8<KoVjpIpnWwr@PBXx_JL&B~Ko4{qpQA^b3Pm9*~4
z2IWG-tU7+9-HywH<);b;+OfX$+SN5<-LY`F+F4vrD|){>S!Un%pEK#Ldf%A}zk_$A
zU#e}X{!l8bQSot3xSa#*(`JzjZ5i{KadHY@4SMz0TljcYK27{IHC%QXXL}CceCKMZ
zpBK&@_3B-ANpeD>+}UM9d**tYCoj3P&~y8RwJzUgpE&Yuw#U@;{hcv#U+U)VYml4x
zjDywVU~#Ccy>Co=T9Eh8$tH~Yle70a=G%*2dv-e6Yc2oZ$Ibg3XWa^u`@;HJTYDAT
ziWT#h*}5O?@13xj$7))0k!s4?MUo-BC&h0Rtt;J;`ZUHheu=*0q8h8&`+TY$RUN!v
znBBPEy!B~`^<B=hX%6RWOT^R8E}dCoey`?>>6&jzPp@xedmid8pXU_MplmMUXYX{d
zw7DcI`Y6NMjE_2>{pPux|B?N<dr#%>%(PI0{qxiGK8sbpxBNH#RKmXH9A4+F3jQ>o
zs+$$dt^0fn?}V_`71Mrp|8cy3@ps0-6f3zeqCdssi(CBG>vD*Fxg7I;uZi9YpQsD|
z={dYwmrV0t=h@3!{HqFhxqOo1<~0jXW^8wQ)19HTl~L;UgF|mk+Vz(G+``<ptL2=M
z>@$vwKSh@Hrd&w9;;2@7Ni^g4g>qfj9N{vDgQqwAij!E`ptoS@7v5d{e-@QoTVsCV
zuYr&f+iJN5?21QSZn@rH!fcSOsQOZI&4(tpmVK`Lhu5q=@bz}Z=Z8DH_%4+{SQf)<
z@6^AH@iUJbOP21_4cT?xSA$E`4x3+Q&#a41T=_jxEBkZEHaW!wyB|roX;1X}w!D3{
z8(;OjMXzkUm`_Y*UZ8zJO`%w5fiI)o?iKT@iW}}ty1L~k8{6&t{)0-D5j&^xU3|RY
zJIl#b;pNryT>RJhwXd{adwKJQhJxHRRTE#G)@EO^>{_(yiueL?T{Z==Jl&WjHx`9&
z*;aXR<BqMm`&Vr}EB>WRYwOSc%R&b)2fY`JG85TcoVz@Rx9$1`3yUNzCBu#g8}3E(
z+a+=sKILyqKG1GAl}(|}E^S`#ian>oHXE)^Q?^ZgE>kJ|=lRWi|J#L=R$oz&d7|-E
z*hcl*E4EC_4K>qPzTf<vVJNp%H`IN4rS0iY-2%MdCx(Si*}vkN_?NGjyK0w&vDNxt
zJY{ohm$ke{-S(mr=9_bywmYu9{cyJRiYfb=HvH3K+1GroHDV@%KI^Ub+nY<YLJ#b6
z-&ki=P<O`dF3*oImV2Id7eunYzEt<6c~*tK{%hOi&pp4?TsM3B{X_M<xPnWX`<eAv
zU;G#7uu7M&<mU}4jCOsviqWcEc013d%G`bFE7zS3-XXP4drkY}2m9NuF=mx~x-Ip@
ze8;;#yI=6ASfoz4b|}KPRs754<wq`7d<ibLUu*4<&9-uB?u2XGPyXR$E_uk1JH_W>
z7whaSQN#PswnhE#4v`7r+HMiR|10`;=IgL0qMjV$TV)nx^4-p@kbS-<?hez9sZWjW
z8&2BEBNo>*-TA^^j*ou?iaKoOJMa}ADB~1ee3$?AeeUkN?Y__Js*feP)apK}GrhJ&
z`B1gM^XrQH@*RENyC1RX(5T?}RwuDV?(lEn4PO%f@G|usXE;*Mu;>0`@0#1Z1>Y2;
z_WSD}dUZYVcV%ZB+i_cy?l?w~zYnG@2!Cl>v2$A4CH@!fA2y{-z5deug>}yUzc<>x
zwMU+>=UCD8eE9|GFTv8cTwhckZY!G?leX0ST<#B{8}q{|UJCAdQ+Vn3%Dp=m8C>yy
zxQAWie)WZ71L>+(v;M^g&Ku5R+v3Zf<<gwV*J_eKRqaA_S;W(mt(CLRH%|!KuyfC$
zzV<Aep3-@to3%D_&WX!Ayt?R`(u3@VJ)0U6qCd&pc{?%U;FVTqCyS5&m3Y1gMeOZK
zs9;sA7S()Xs`6)grr;Hkh0_{hIn(y~?r*svEFd@Of^9^x+Fvd{fr-=8&u*PlmpfbA
zKkxVD-S=D{s5ovYpJ0`;|8>cPtEw+=PWh7a=xI@#VwqJz|C_~07ncOtExNFDev-pW
z>1Gl3BfD?6_3~a2WuD@|DDcHA+~|e0g7<@YRt}G4A1rS=wUPOFzWB1;OD^Z{XZ?Ge
z&vCJAiDiQ0kH~Mv4KWqM^UM!=nfKmMx_{`!Z4=Ha_Ju!fUPN%}o?rNVg5iDkrT3e!
z$!qxiXYi_b$os3DQQKnmTHf)ca)?0vIkknAH?r<8zJF+&^@g+m_*SbPeSh{=p?>Xz
zdluiCRvpL_dbOC}@hY?Aw}!*=iq&e{w<Z4ZfAHYRwdf1#0-7`5xcXiU3T%y9lsof#
z-mHMg)NmnN_P+m;2`^klmb-}+);s>r5BRoTBlVx~(>wPSUe%{IGAxP|^j>g{G5Uy*
z#<zWYx1Zfup2MFI<nuq}`Q<eolmC1<zu;ZRjSfpWo2j3;ax(rc3_6l7JSWlk${fuv
z`k8H9f3t6?ak)%6YqEQL!;kov_b)33H7`GNYWk5Ueo>`r7E3n%uwU@{#nFAi(SOV(
zPDIAc_G7Z!{ih)QEz3^*)l<)3<SO|$``_{2zV8ntUjEVl8-MGJbb_p>Y26ITuN$6E
z&{kcZ@iATVr{l?+Xa8>4ym|KTm+udk7k{uk_vF<%n{qSx_vdyO-QiqgP&{w8;f=Z9
zIC~r`b!<N0=(ckBlqYxhpz8|mf;F3-U;NLEI%9SBfKTTU76yi?oH*B1Ipyb<6qghw
z7WgJ+<^`7|7L}wz*Vy)kMMmEa6R<tBiFK9GfgD4Y0w$5!NBx4mq!*ZQwr-G^lrYU|
zN%sbQH<xKEbcA0_)64uV{p;5BeP;S?>uY@P|JMI?rT${sx|C+~PgnWNXU?=PK6hqs
z^5385^Yt0`G|H#`C=7SgPgB{WpBUz*{Ve6q;XOU9I-e3f+t>{yPe(jF{I|;H!KC)D
z5mN=G8>lQ6%oe(qnv)QGi2bWafqDOr4M*FLfBg|~%>75iA@#2TKZ~N>#3u;_G1Uam
zT6ps^lg+{pZ48CSd<+?T4bLWM?>u9+`P!A-xhnr=%nbR;d-c+feF`FPV|BF^WQ^CA
znB=b1oa;J2>eWBH&5O!?FQ2=$B{IxZIdAo}vuivV@9D&Iz2MJ1`t1s{>8jOkR#Mw_
z&wBXp5<1&+F4Jmu$%hqTvy`@6F%VPOt@!*bPvXv)x(J8n)v+PEPV-H8XUpC)-Zks&
zF(1>T9ufuq5@-6>tv}`!@~5CJz*>p%tm;NtLH@H}PoKGGs@XnQl}+sS#mGy2yR0_l
z==<NfSZ7$dc52@8wq-k?-#n~xd%Nl76J8IN-niHk;&WE=WNeycN|lpn<*F3DcNu=A
zA*Wxdvqy(k&6QjtAjWbfbIXLsY3IB)Sw0V05cW{%PIHsOI?W39?JOlR6Ra4$R=OSJ
zyChU5nsH<D2bada9;Rk~#~DK3L~FRb9mPu2t6oUC-dW}Ph3WAL+w}7rHBLNixbXRk
z@Y=37niXBnjK0qw{k~lt!pZ5*Wq0_wYf7uhh1Tm^bNe1~v&KKtW<CGG^kdQCezC*-
zZf$bHmEMQUx%M3`4|(&MVYTJqYesL@Brv6=pP4g{OKO?ym6dPIxNq&&c@e}RR?8;-
zehr)HVhz8{DY?1U$8A~I**7%{vY!8F+y1S&;o$$DTVC|eVb*qhvi0oOP_2?+jhL#t
z;%cY0w+3wJ35`5<V$)is>qn!uFPkZAf9jS_@V^aRa$5ct>nGjh59yW+d0()RT|_yy
zpv$~z(yn!HqkNX8mut@4ykqgBeOq<bXg__h`OLhPAOBc8ujjbF;PS2y|Ja?bo?YIR
z&=|E*_0GD&wAHVCeuVZuKILkab!%2(g55&vn$;#f)%Q;y5^;H$HL+n|mswErlF1yq
z=Ea<sPSl9G>aC)*chM)dn0fy;tKALJTx=|Pby>TE-0iHT-vkBk80s3WQixFQH|3b;
zy6$BS^Ys`1ukru;?C?Oh_t@(#-IsJOypgqP`_Lp-`eO0L=N#4-{1-oxN?=%j*{5Gv
zanqyr|7zBq&(1EKn0#gJoI{fZ>f2|0=y~?=>|t^H#wqT94W-nM2%lgy?7z;mDE{Q*
zOD*OPzQ(J)KGw3F)%T;#EcF`3`3^$$hm3uGPdh8l7sa>yIH&M}g1KAXA2L{%#B=w{
z*$d9{414*`REm2ss>Qb&K5@9O@>{U!&0*)BOI^QZoLhEun|y!BRy(!gWVmqNBi~I@
z+7rr3^C#xbQBm@|r>6hKKj6e&L)R}C_mp&9JF;Q_TZy-oB|80k=6vhv&Q1D${)KF&
zaDLIM%9xMrpI-do+}H5^`twB}PVcXuyGZ-t{wS52rgzC-{uG8amT_@&2`{;;A-Ko!
zb>S)7<yO9l%`D|jCn^eOzB268w7Tx|<i6_KcDsgkk8PtmW$s0KO`GHLq3M3vqdPzO
zQHw*5Yui;Wb1^U|OE55KV4r6Qhb%F5tw>ESh3_$&8eW+o6Ds-Nchku{v&$`cleTGU
z>Zs;kI_rA+?lfi3V5t*Vb1uzVbnWCjlgJxyT5jHy<KWWJ&{`y;B;w+_cDv(CwvL8H
zVn?Ol|F-*hh&lhm_p?4`n{Vgx*1wtkeed_Z?|;-Dum1g{nBSf&VXx4q$GUZQ1P??v
zYaE<gcSqDkl8<fSgS^O{$NRUl7Oa=g=YJ$ykuD&*L%+jI=F8()$B@Sftd{q64_BvH
zs2r|-`sH^@#r_R73Jv_HzB_OFlsL0ir9txNJ^jP(%s*z-$WM5C*yuEyf%bj&)C!G;
z_NUhBhmZfQP-$>K+I76;udw5sKL4({{iojq8~rX}m@g>b_v2&B2bqa;f2Vwlw6_yK
za??WMz~oPVYZ&4=9&|I-Xg27xf0)X!PwTY*&yQObcD1~H{poKTkALW+**~Uv{M;sg
zpL3D;eNol>+>d_$Xq@rwutHsnJo`uCKPC<HHCNofBrPlX?yZ#UOIev4wpMqxS7%fd
ztVpj&@o`-7-Y9qdwTV}Pgk=Ly`z%p2(~P*3yX4ZeX`9M2PWG%zNS)WP?p#K{yVJjC
z0nbmEoqyJ~=j@AZ=k7|Mv&k+m*%E*7Q|w;n-HVl*58Jj1*;=zcYP!74aP90cCx7jT
zXEWw)6gt_r@Q&5l^-&LQ&GNYPPpjQHv4lgH@7?7yBDJz-A}&j6tDkaPSX>q5e{^f%
z?2R^QOTMY7iL7~Te5SLHGq_v*YhUd$H?_^l%Rj%}R%x^>O|?ga|LPk<AE}a=a+|lQ
z`1G|^IvhND_Gg$#c%_Z4?eDJ<ZHHDIx}JOFWkhMb(o+7EWyea3UHZIjdS^_#vv4No
z!n>}GXScQ~E-YPlU?J0-Q|9VHoUdzGpNnqYD)2J7VuN#|Q)217xAXoQ*4}bGp6;tA
zvG>?f%UwCQt}HhVzCX#s*!sA!Qpyz{4U2`9a~CTtjh0<}c(2f!EfWosxj)9;;C#m8
z@%v-(vHMrH?$Es?VLJKDLz}8@zomv}FFm$4Wn0(O;F~#Z>1@m8IV#)E=?6Qy);LCl
zUb^ted7evdl*p{6XoZPMg0F6c_z9o?vTVlUbDz}g>kh8)e=$v*zv<xAJvt#5F8y%|
zy0-rI1mWG@v-NFvsftX#qOGemQ)k!pR0*-SmzVuE{pexLs#<tq`AlJ#CCfVaq$U=)
zXk}Q;b7I~4*!7A0Vz=&Dhk6QbY?BQBvUAdhof8xGTsM=?y|XLn+p4_zmIeztrxbV1
ziC(j0$3FMdD$jqv-Pt{9%jy*?8dk<nOuXK?nX6n=<M!*0HOZ2a%dXD%SblQ*gB*jb
z>pj8$x3Ye{uJ=iF&A<Osy~Ouuu3NCP;lASSm`$|{ombB|qQ7!igzt%a>r*^d{4lLM
zY!zEjVKI4=P;k|{4We6inYD_yw12-aqu}zal3<Ix2|kix5%<qu%1l42b3#gH`nwm$
z^FwWV?{^-$zd1`h(pIbNajMp_4c<qWR&4B={$QyV-vcjEO$n`k4fa8icY@c)Mn#2x
zRJU3DsC0+t(fO{ia>pm6`L6oWUGOK=?Dd}67d?BYXP6i-eU#tVGdt8qJLlEZ&X*dC
z7g|gG)7$<3#O(r>|G{SeRHaQ_t4t=oF*7>3qj%buO&|6t9hh}&3UAKt17Gt+r~UXP
zFZd_kX8EJab0P;4ws$?>`fiEDpI<*~3Zu7l^=#17Kl6N@kCNo{OW)GZJTcIY3>8`0
zGV^XA!;IiYFKOFPdhais-SYOL(fh3Opk&cEo*fDC)(Zot2H6<%yVd1~fA~>&x$8Z1
zcdx2!-*dg*4f7Uh6`AgIGvC@ao2yqhrdT(ZD|=<dzjIAnecwKu=xMvQ{k!U<lOJ}-
znSIqv))!sIt9(^X&g&IVwZ-Hz-^qEWve(w~27k#s`aJv;%ibc<?Ogv(@BR8}XOe{9
z(e+x4OAoDQ30)e*^+D9&PuD6f?<rdQgVt)PYj}&6@JS@@-g!YL+o)z|-GRW_^R6W)
z<;`IeIXkEFO+>SL)ntXLhJbh9mn8bWW0U!^W?t2s@+&pnPhEp==_K!reUmx+&eZTv
zeA<?CPVcQa|MgywU%$q^eXqOjN`%DE)!VaTy4iDk-<H+O9#~C(l<J(Lw`!GIY|qYs
zmMK3k?m73Wi|JmB^~11VGol^m-I_Y1><a7UxI;G!TXtLX30nR$H8aYT`d#FIjH|2j
zm|E$|$Erp0pD#||H0QL+_iND=2d_W9vDk0l(Tavdoy|OtPVLD0)*a$_dr@BT_KPR}
zW=ekEx$!6K(j$TShi)aEPi9?SxwOnbD{YGSws~DIE7P9-<&KP+@adbkmzA;ewU{q+
zGoFV|<Yf}^mJ-@F^>|&PVUM9v^tZ*g*YzB=Q|adl-srvMMt4uyQeEqYUf28cS>HVt
z`S*J*i-3#mw&WQhQ$jeeO_uw3LEEFh>IK^+Ynv}8my}n%2=?56!g;-`M_$=E=c1jr
z<L|xyHvPKY{?HW-ZH4nXCQ3P2`ZH=jU(j=QVTz8B*4);7zSQK+8u>F@>yJ&7ejaho
z*ul7@@ARDD8_BOH%*;p(O;A#|X54@Fs@O@T0`agj3zKw2zSuUM+IY$1i{pyT5uawf
z=oJYKZw=~OD{{$A!pbJ=cFgsZXDeFw?3CGhs%)Od<5M{)Vxc0jz8BSHj$QJ2o!FwJ
z+a4&KY29;6OsZ5pFFUhVpmZYp4%_b3NS*D=7m9v5xu{M|d$YyG$n1h^VK=kYEwk0F
zvlElbyu?<|JsLdssN3wq-p$*tMP_fhK8t^0;^Omd%8w3QR4TagJMH498-GiZdEXtf
zjd;$qQPkTquc80-RSVgz7R`b7!s-uo*3D_=IH$T*aPJKl3$w#VDt9nG4|Y>u8q-i+
zsJQ9HHb$G~3wOGo?%<goEa&JX6l^wSv)PI++sQmy8`GKcHJ{f=7EM`ktkUnB6lX-X
zd|*yB)7P?RHVw0MZtc8ukmuB+Ei<RJCbZ?`Mz8#<v|>w%soqDHEf=>g>iKEgtDVv6
zdFpuntlwdN-^;3b1#UPm{2G~K(X_PKVs7N_I<fRKkIqO&m4+qq@diFETlS)3ZBVJp
z4z0aiMwYJUjcz`D!s~Tk=3E-nTw%_+-n@}HJh_hqICINZe$ILI$L1B&^j#C2#pa4!
zbQQe&ckM#mRKIV+t6t2|-(ok*^}Juu*0qs2wH)G86P_!Ee7pTF=eFj&tsTKz*0)Sc
zE7IIJt(8rzj+6Q7VS%rkcRbd~pPbzGbno=I7~lM(_c{K)PG9uqsNJXcsihttSiecf
z@OXX5db54@2_`AWpY9J9ee_CFd>C!oe$SAprm&v-?cSFC`<yxWPHgY3jCNYQD!~1i
z)v>L5;w@8If_FKxUJVOO?6?_nJfHcY81rGXE31oK_ntau|59~ph2^?UvE^rW&9dM3
z_Rhaejq#kR2Uf2AcgSz*#}?}cyH;J8nSJN8?7N>vmhlxow9Y@=bmw7q;oNS|Np9ZL
zIk#HfVmJGBE9%wEZ_VGuQ|_A{`4lznL+MVYDMd5%cMHV1ei5xMvsDgCIv>}3{Zr0_
zwEG?bHI@u2|NfXivf6M{_o%}X*TnZ0OE0v)wpA57k;(Ibw``5;CEs;R)=mj|<&mYU
z_R`INLEki$&E`d6NvHSRoLb4f(r9<!hKQS@W;tK3{_b0_=briHDwfo>#;f1CxVHS<
zo9h;NVf(C24!fJCMEFK3?wKif=TP@YGqp2s@9aO^oSb}a+Oavhz3X(1s)hZz`?NI^
zZ@9g_CR647?(3BV^G6GfwhQ+EeDkVg{c<Lmci$9lO}Kpb!K<*0#UJkfvqx<hw@58n
zy@`u~!AXLFK?{4s7_xC3+B^o06+oBbM6g$g92fn^?sw~QR;UH%lEYJ&xvxw(*U-E1
zfIy^>!UTZ@X^pvi=7_!g@G|Vq+rUTDl9u1-yzH@YvW2bRBat~4>NmT5--xLDl~=t#
z`*N@K&-C(AtGl{R@%#ACzTH##cW>o;UVppK9~LuQ>+aRs_E1k$`h(HVJu!Og13q|(
zvI@mCglk$nKEC>IMem)xVMkvVY?uH3<6{+Ten6nw##0~MDl67^nLj+sb#Kw4ON{$N
zkMiyD{Zz9%=APp8@>M(d-v@ojV}1YeaUEyX`mU!H^P9e}j%ejy5z)4pOD-T#dFP#W
zeytx9<oQ>vINBb%#87d++S5-HV&uLhpX%>l@!_%H&iaspmZI`UleOfI9}lUKnIG`c
z(`Mm=U@p70NyhU+K1$YH>p$-~>-_JJtgP`<=EqNJ_dj`9-`maq=SR_#FILyp_#V8z
zRJZ)(Q|Y=pdiDEX9^W2PBYi*cL#+Ki_0Ik4AF=;f7*n_8(eWRhUGpEMbJeX|#J^u)
z#jVN(TlcPhTu`5Xyz%hvs$JH6-`~7`{pO~&zzeHo^Di7Ww6zm@w^iukj}u~zlgy0g
zZTYgpbiwhUHV2LVJ$o0g-@1AAV%x*Z54qmFfB)vi>5Y1`S<fnK-I3~bUz^Ls{rVL<
zOHJ-GgQZhTT^}F2cjbnl^2O!yosvPG#*2=#eQ^nS7rWrRRIeKAwX&I=6F+!3$@fV<
zoXlBUbH}5l{MK#9^y_QgADf&qKNjDpTH5}}ciYm}or0fMf3Oe>h&{LaYm39mW<k@#
z){6|AmoI(HIk`RTiicN6!z2UW)wW)D4i(x?H2Ja7D*C*Kj#QrU@nc_pY%nRC-|Ot=
zDrj8S)T44RbtlW-<&&owZqrxR>UO+sB3Y^NY=>y-9~+ljMQxj3bi~a&ljtpO`EBW%
z3>_Qh>19@Xeyx0?SKL!3cI?bV!If`Z;{so7;`a=H=49n3IdMv=(EelG^#x|rN~({q
z>@dvrYqhhP^P0JFYU$?1hSloKtF4k`dc&VAxc>ZD(Ztoh+j>6jvN3UtJ1v`VXTzbt
z>{iwO$94aPxFtUNk?a%wbFQbPc<8Q6qQ(g-lg!+nZt0n`y5f*y!8_(qPYF-ssT~q)
zJs(N@nsMM!Pu|>*AE!KR@LVP9>6(0)y{AJ^cDqrA+3y@(^DD6yzMszAx6@y=v&iY~
z*0TlgPEXpyeOre$YX{r)EQy1<QhCRGrTQMKg)QceRpH%#<Z?;qI%`SOe^afO_-ZDZ
z^%`lK{NdUk_CcC=|Izmy#W4#WRA^;gNSFTKuf5{o_aDt|_K*Cz{;hea|3iCn)-$KK
zmnJX1`)fzr{)g|S{x#NTc|79dUH&nLSL|KL2YufE$Ld+8Rqa?GeC=sOkNCOA8}8aj
z_Rsufklj#R6m<A=;p{Juj5psk^WEsb-7R{uXL66Isp7|fr(5+L*0O&JU6bkAEiE}e
z&U<^WsFO~@s?_D|XG=9^r=MDsvO7S~&R3+v$ycLi#fM<iz?Rz)ZtD_v2%9n;y{Y0P
zdUTRs^3EClz2PpMYF@50l}?#%^k5MQT-fQgF+$MWBv5tL%Pp4gwEx;p)@KhY)V4}X
z;ae)@=&Ez|h-*;%{lHl(J5!T(9@u7PD`&p;!Uo6k9z#K=i8JQ;^j+S(aB-T_lU345
z&pBj$XCyD=n0-gkHnSz`x=Qx!^re~SCnmccxpahUV~`h5X3|s<ah}`eJ2fB1JdL!A
z($!1L_&!TfTJ_1ImSwA1LOqVQYc9RCdP(*ow>1}!L<MSZ=(M>LCERuUsM-`6bES)m
z1CuR8dgr&-Z&rF`64;*|InVYKxAOJ0Wgh0YoiE!JJ~j1DmKM3VqO){S=k>q|xe>zC
zADFqWng0E;nAO8QM_q#QC%jb@Gxq;>Jip_!)E6J~-dVeT{WQ7fbouJ{qVpdU_{3~4
zmzMNxy7JgaU+(JUwVe~M%n;nJw<M}<{T$9dH}@dUxHYDgspj`3Zhqo=vod+#wTeF0
z$ds~+$=XteYu>Dju)VwS6FckCxydZ+X1Omu@#xU09ZT)f_1jlWxvI4~Zh@Zo^keJx
zeb8`BtrTZ3w%#4QwyfGuVB5>JNBa3sS6<#d`>DUq=C@~GR{h-gLC#hDDW7Ibthsvf
z`Y^-0d^Y~+p>@#>NjJhSD7Np}bS${#a<9$#J-b?UpFjG%+xj#subfWt?)Q3X0X}@L
zqG!%<`?vk9OikZ1??G;f(L#;Q({-<G`1YzO<%-a;3ZLnVy_8NipDq2&wfMS0xV3%I
ztavl#+{tf`Y@B#4GDlzy_uFNkXGPl9vQO@bRmz&n_xw@7o35RPGWI97PdA?Q@#eJS
zrO&4PS#`er7?-<W?97$s#^%<#+p|x9S@Pgr<O-e1Yc2SL{Z3rHdG3|8?+o?1)fNV`
zJ(mk_yLVzm;(m{w$C|co^}6TO%B5aU`_=4{peS)!^0>B5Q{jo`W7-qCZ8P3lr>IXb
zebw^X;oge4_pashKHh!aQ*^a--t(ZSk3NoeXWKvgtUMpK?@+V6vS8=TO{pel<}TjM
zJn{DDPg&N@hv%8!{cm&k*o>U7A%C6r7|RyD{bTS`Ve#QR|1W)zDkwi!b+>HhGv1Yj
z#}>Xz_{$KM$h?j5gJK6GPm#;MS-V*^9@S}NuP>@M$c{hscj1~^P0f~?YXy7zCKx=~
z!7F0o<6x7pSms$&26Om>s&%uP8D!mmM7MCXb-E@Mwms_NtgaE_-X*2Jal`EH{P!YU
zZE68G9&!J=6u{QJugU#^e3XR7E7?!1SMHf~UA~ZZKvgJ4>tJ)RhH`49x8nwfOL|<t
zq%Lu65%F8J$dyy8Ma*yEB#rLN5tH0PC#YZ5{kLF$rjX;#$Xh{M^dd|;yQ8iwxMk3q
z>U?mKrp|Mz2*b{)!W_PdR|78CH(nLqQNd;UWUE^5R^w^!-5Op?Syk!gu3dWgRbVTd
zj=QqnQL8sj#@{aIh9}$Z-7LtqaQOz#?McRY?%Z)rYb~0!KT1U9zVEe`Q@R&uUDN-`
z($cG6?4hE|PgUnn3i8tyM|fC%f6R8IW2^je!#0b(b+&u+CV4Ab#&~Biaiwl8)R1kR
zf646Q#c4|0jjz0B@iS6do@2>$_s_G{=Xgt6_K1DhK5gF|r?&yl3-Xx0PF~QwIwl}l
zEaRBs(h!~ucUG$xlVrCAddr0EnCNxjpH-Ul(o^D_v_BY`Z|*v|?&8mKGxhyen?J3-
z@s0b$qh~zbVdCpgg<15L{>kPtVLy}^W7PO{=bK%dZ-l1a`1tkRrrp!mO|E*s?m(M~
z*|Ne+sp(5MW}dIrcsc9PvxUbvV+#9>qL`vD-KgSUrD{;H^u1t?bkvOt)}3#KE3R3F
z&%DMNQ+jP$sNemVcUha7j2hw&v2nb0R{b^8s@Z4J>dJclv_0V`C*19NK4IS+&(AS7
z{RR7Lba(HvJ1Zdep}b)i+pS9(_b-27@ye;Sl2I))C@n8D4VoO=+j!2TtbG0KV>gry
zuf2U57=HPtSY`XJrhUcLZ#M7U^TPJ|iCWcd7Y<%JnfpzD!`zei&%VF=ZGG~2wqL@3
zv=%*6)nN?vSu)k<sMNAz<yz@w)7K|l*=~?qZk+htAaZFh@01H3-ucVlZt~jth_yoT
zp*Cl&;N%E_%`@aGHp(tmc~|iEUixyqzc&Olypr$VT~RV=>g>OnG863PyS(>#GWX3E
z4aL@_KL2O(L?p&bpS*i$uHN^vdfzW;ewmobsp_-9-n>8W%%h-JMS^>>gkCR2pCP+>
zPOxGD8w0}@J_ekJLqV3F!%khB8=hS*eO2`Cb*acM8&4TV#=v$K0|o6HUOb#Ceon&H
z4UUG2evgj%MjyMR&~H31&|O)5A^(Cshm<ccEuB#=FOcCa9ks?{32%Sd+I3g!-niGX
z)-Onv?@c+q>5<ykD7)|XjGxcj{ND1n-Iw$KYl`F!xc#Y>+*KHHq}-(@{K$6~8-+t1
z3)zzeQ<6KB#2Y1@d6JDP0;+y$99z28#aQuC2S@ag6rRNeiwaT$CLH{}_`{K163zXS
zGM3#c5IKJ2!44kzti${t4x9bquowGSAkyFQ>!L(m)A6K=m`6R2IyL6?JkoqQPvGO0
zGxch2Th6<Eh+$Dzu83P$duoGqu6g#2#bFQqPMe8_rKt62D(CLZl>Dx_rPKGE)-UF1
z%L^iNpF}3B-Y=TVJkQqrq~YH$jkV2lws@V{wC?kQsrr>|H#AF9WAx{rt9CnQcG=x_
zae%?zFCG`ZU7uZ4x5)6!haDGpXMQfo3{sS1+03gxUv63B<mWA6^>?(&@&aCDh^1c8
z{MDA*eb?;t#y_%L{p!<=VrI0YExr|{UlrILSS}lK;n!W6&HId!EuRHs7M=O>O*%QK
zy~6EO(S;8>lHpTltqEe}`nBM(K~t_sx0>m7osBcj^~P*>OV<gh-n4q-KEwJ=2H}4L
z{JQQWm1@PvNf`YutGZymlk2+hXV1gdNmY$Mi;kNVA7%W$B6+u)pJT7k%=cnO&!%Kf
z)_1uU_gw986PMWe(%ROm+~E~_0-~SpYSX+e=5$X{qfGwvEY_3RhE3ue+qSLqs(UXz
z+hDU$=FJUL%X#)cx%m3rQMS^;6IXLie)c);|J^v4X-VXb#O+T~&nA4VGTm>RbWG@7
z*`{sLDT&`_{M&K5_`!0kx;F9BoP%Mq(i;NZ*LOr0tnTx@vF5Saopp=(^)H6kYRKv*
zZ$C7(x8-K&rZ;n5zWiYsckv_lo>Ns{cet1MoZi8|{$+)1{)>v>BhibhrQd6`RCBdG
zfBj?Wiu%@g<EXVsCA<7={;D;Vm+ol~wz_wmUGPuX@%JC9W#u37Tm9>}ELgMTvHy=^
z7WvmR1npDbJWn)8xV22*&qG@6%GbWjcO}ob6@(pEw-7%VU-C!v`OKZn=bXb9Dr{3Z
zV0C}#!{tAGjz9n5bo~C2rwuy0k~QTf`}UfKL~KqG<SeQ?C6g(#ZeM{+)7h$J4`(w!
znRjT~GIrO?y8ANnTPJNgKK;3G{d&a>OpjbF<c!qLy4^Y_pZ4hX!@5^~W|pR6D_8A#
zaAd`MHm%mzlh69CJ@$C{SuMURUg3?WdGBP2GSAWOEPftwajW;fo!37cpDCd{+qByz
z-TcFnvoW7IZ>30n-kEilbLN?!3eu_`pWj?>GT9qslxG)z@>tWG(CvSMZhFUDkPJ@V
z?ej|X?5n~8xuW$B_sU*QV9%D`^q$E&;a^AZvuC@qC-a71Z0g}!r{U?o=xuqWviS!`
zt=Q(;)BoG<8dQE<xG!m8+s3u8mL8mJck}8WqfY&6Mb$mhM-@Ly#Af&{U3qX%XhK;$
zm(RM7%ewFEVZ6)!YMxB#_NRXiyRDZ$?|fV3!n^$(8DG!roWUE#y&;n6%isI?)2hO^
z#}-LF<>Br-qWF2miVc1IC*|y%FJ<KBPv6a(a63A;@^ENWT+!5N-(!|Obv^OCq~m|>
zjbk@&-@M%|=5piSj3|5Nsk<uKbXUHUYzgAbWsA}hoabmUHDj)0_A4GG`HP!atu>-8
z<$G$_m&U!k-;uva{*%QcUnlLV{EvdmRIfxo7qFf3OF}nQ$GZK-LgNf>w<^igkF_;U
zMO3!+i)J~eu9<ag*4NY{%Qw#AQa$zHaO&nAe@YCD|4Av`(#%-+R`&9Yh)e%Pi~qIn
zIvruFWS3r;dexv#)INCW)QJm1CBxb8?^oRQZu1L{h1Lbz(w4NPiCyRUcsZ(dZIqKW
zcigJWH}v*qi`qGtWbaTsR@yU>qnMF#O4bCI3bE_`bAG*F9=hM;h0bHP&SU?tMTVs=
zoIRUqg>K{G3L}X&slQ>e0%_r~|8^XZp0R&zl<F3<Zjs_Wbt((zuG`?W%Bt(?l)WC4
zoTE=H;@Md|V=w!OIl?JtJwH8j4*O=a_J8BtALeBbwZE*kU<+Zt&!1g5eV1%=7Ss0?
zk58<ad}DFk!3kA!ZG@M-dAxps@SD4y%i1i8ZQmv7_voLTx!aJ#cSq3Ez#!j;a&@5=
zYswzRC1ob=sZZo@6Ik>-bVq-@X%(M@M9uE`b>9OQ2O8hmH@WURd(4x#K+$<^!Krs@
zsyLO}S2H}j6Ck(ZhWrtarGLfvLihDPy6wa8qj;jV)YSd!(e^B7DP&F9!pOi7#>~KA
z!N9-(I@lC?XlXfQs#70j&$5b7esW@tOJ;FNQD#zU3H*SasX@`+(vBkk&ZXVGTC%!u
z>$Y3bTPi!UU*CEZ?d>SUqPV41Ouk0LXOg1duA97*eY^jA9Sr!e(EfmYsEu*kr4<4-
zH)a<9)+@eodcSx*!=9t7EzcyZ<>2@C{c=X;eC?hufoeZ;O;7ZP%s06IqHDfVSmd7d
zLO<*7tkU-V@G04J#Tx-LshRJN$m-te?5WSZ_}*K#UhwC~dkG5FXI-+6Rmz8~`qbaD
z_tlq=o)=H%e4g;&+NNzPIwm1n_Po`;EBAA<2_15~CUkP)g;P%+FUsx_63bnG?%UQZ
zzT&A%TOKI*E?uYEw6rp%eAU)dx<Yl)Hzxl4uey6)Q0eDq@49S`N1IBj$8TPkck;E$
z9D$o=I~ZJTI0O=G56Gl3|CsT0qhm#RegB(dQJyZhI_=GOZ<;F16}tJ<Clj+ZpXWdP
zXdmp5VN)O?<?OIBMdub@z7YS<InUo%%j~GpcaK&M_#*B1rK-j0OB&1fp4WV0I_)z9
z&s<5p!mp#~*r}bGmaHT8v$?ltTC(!uye)ExscS?(`_`Oyd9E?%pYr#d!01B{suFxW
zDr(ek?B%rE$^7O)r)~I6-5+m{%oYD5w2LXg8+Q0E=orjN$zIZu91INJ{0t0=*i(WF
z^nh8&&|YhJXT3<eWL?_k-Nx2DmSRE?8WWcB=DbtlnzZGL%7n7pCI@vmV*?5|S>M#T
zdnPA6jWZ;7@2anPTjfHR#EC}tPurHGap6&Dh)vYmu;@SHf5fjmpMCd@VAvV`pMBqd
z-+Np=|9SQE(^Ko`*Rvid`xBg++`56;^5PwRsp!<l8U>+G3Vn_(;$l4>I_ChhmR$>f
z_cP_B^UYdvhul+Ze2yItHF+$oHS2??DF5T&q@S0$<N`lR)`XeN5B^wL<9Jm3qv}N)
zsYP#(i_}CO4gavCXT8>sSzTv;R59E;@3Oloe?<k;{g98kb3!%*`|Q*0nIkkQm}_3h
z2U*tpp&x8n?}vY2X7xY$V`10j9}|0)r`jk#J}#u-*gbPuVt-ocaYGqS*^k0~**b5w
zubq>)Tk`P37e6{5?y=6Fk*BtD_cYywh5xTSkq!R+=%e!DazFn&x{h6*5w=+~`&Q3>
z*E8>|G_R5u=W4fQ$B%vUmF+yv_jYkc^yZd?YhKHFqi$N{-F(@&W$p4!#||u7`}{>=
z!kuWDNf(Y(hFP46c-FEn!Goh;{%ZeA=E%D~{6}J~lb7w(joF%eY=dlBNn!S}GdrqP
zdR*2&ejHVN-D_8x$`ALoB6rPu(|wYa_8Vm1VE=M+jrfGAS2i2(nk)Eu(uMcu(q|m^
z{VMZ*tJv8!OP5Q0=k+{2=k$`#+cp{<yvHfE=+Nd#TACg=gml@`rQRL*60$}l>zI_p
z=@edlpGg0uIfoa%KXz-ai(;xp-Z7n<d26mtUGUC&o=H*C#fcw<InSQXOJ0_JW7)h^
zn@a25hdx-CN`LN4<X_$^^y18)oVq-}hS%0MhbEl)b7+d<q5M-f!=hZwv!1pF20hb@
z+WKi-%eEq$$(82Q%V$<O$1f<gFFsOn{d$G!X&+_Hrl)-IZLim+{+$uIR!+_0WKCFk
z@5`qes%v`7t}dSF)o|)d;L$e8!#<qr)@%8BdFxJH%5__3xyOYGPeZud-#)SFJ-T+!
zToad7mG09dFX+F?xY1q6yZy1PRGZ<V#1ND6<T;&l%kRe2`vo|&=s#XARo9lT`erBJ
z+Pr`N%foln_#KnvJ^z?hQa{V0yQxie&SisMPD%Yti+=7W&x`!rZ5(<-OwEogndNlV
z`_Mtxi+gk)i}FtYP|U0O;l(No_xbHjJ@FYoRO^;Lyj~G{ER}cv!Ti)eeuqW>#2uD*
zF_1qXKl69bgRZ&fce;5Un{TqG?Yin3&BL~lYU^4~6p7suFI~RZYh%2Nv+2tCWAjb_
zu;!omvAS*lLtozd<FBRuDGI$ic&C01%dW6lQxD{5`H5=@-7Na$%U?2evDC(Q2ls8f
zEcv43*5bM6CVamgYWjqCbwEMUH;tD%k9B$TA8U!OXEsP&xmjwpPW~=A>uvhW&wY-b
zx@%QN7f+JarMBot7dbhj7nf=!@6Emvxcy$3(g&{4=$}^Wf2>*2_wb$RvoAH%#7mPy
z53auX{N{yKKaW?d9=e+QPV?OC>G_pQPq2!=^G?k<uD!N>8t)XZB`pov8@GjMhGoTg
zf4LPU-Fa<&<kSmZzxJH;Srn-mC1kdyATapCtyk+e%rG<$KK8d#>=T#X?N<+i{!3pw
z!4ewk&iQ(kQAo7e^(%s##cs#R^1JZ&mmJN~C{Eb7V~f?y?W|0vKi~3-o^t8Ws~+Li
zG3Q>r+B^T^HO|FeKL0HZ7l+xpaV7kF{(K&fK=5R}{FPyHbFaVM;jw0>NtTE0o3~=}
zrEZ(I$=%^ezj$uPli6ps97$4YVB43c;h&~^e8t|#xCuQ;=QfF#$R(D~RhE&9kCb?I
z*Z9tf?~lv&-M!bzV3uIcW-0e*_l5Ro%l&J!_OT~^tbJ&qV`ms=|LQB_yPMs$Ima!E
zcV0hVSNmOP$-8-*Ka_r-=jvR3Kk|nr*PM@Q?j9^-Zptw){GQgbfwec|xRl!#KG_|U
zwePxGcRbX4zjoKX&-#_hf{o{;J0+wno*iE&a!}%V()C*fA7q}K&e+4Cs;H}2!k2Zl
zTDhEYZcS1C((5ap2Wr2XYU8zoUHFb}j$iTi8~3k7A6Uh-rTMPyUhjy#mty$Oel5E5
zd}g-(sww;zT0Gx;k1=_;cgCW$Imz~_>=yIl%GCaLYsQ|Py82R!iNp)d1%(C`jJ}=R
z8GaYCPYWFqo|wRx&F1QMo$r)j{SH$l@e5)f#W&;`T-dbs=OUvOEoCbwI=E;i)F!2$
z_^zUMUNPuEoBD-cHfC-48VQ$KbNpJi>n!{mH2aoRRmA<J+g4^5K6ZNXF*xIGo#4I?
zzN~j@E(lBQzOt|5(gi841)smv&-)g(U2KD{&<-9|Aq|CF<&t-6Sxe>~^KFj$TN=5>
zeT#Q`#T5p>Ppu69V!!-KQj%AYK2q;vXJp(^o+w(Dq+B*p_`RCf?wv*_E(+`{ke+z|
zaLc_umdb^bg}+ba<=go~;pPvH;GY_a7M^J~u6Z`jCi7Jp^aCE-q^=JtYu$8Rqq=$1
zcFr~iUHAUgA0*NWCj9A{bpHFLejok!%jY|@RLt4UZ`>vDwEctKsZho+$!DumXRM!=
z@a>_lopav=KG_OR`II$v^WOTNQ98MA7E8^8DG@pz3pQMz>G8i}$Lx@O>UR#8Dcw0;
zc0vA~aIC@|{apza4kblDrlmbi&G9!0Sgknk!}lY?jUEc~INX{(w#ZC;%(>KjUIyQ{
zjf%OCo`2|jero0W4>IR2eBA5f$fRp?uS%|zn}6rj<8K}-x^yk;YMja^^Wc?C@Iimu
z(#!Xb<|Hyb+uN<VF27CLer?YKjsHwrOkGyE&A4YLHgC=JIC-%>7Cuh8Uful{-ZRV+
z{dLRnz}5d~?TRVsPIm(s7#RGa2iHSdm%7l_r7rk*#)8C>47~#QS?<B-&iZSf^$hj!
z^gVs%w9d&h=N||0Y5InK@Yf48FbXg**lJ|B-N-b!pp2J~kxOD$k*LVi^rdRkMQ$$x
zALRc^?RiR(=+tLZQ=TomRfK$&|9jmK_pE2lTIU%U7^D~(7$g`N7?Mgeb5eARQj=3N
z3rdh&VcNet@2~-nYxzGf!N#f|6CJ&`F}Y3?i{-YJaBozVoRstB^J^2%?bRnvd*3oW
z^KXxvx9jpb9B*W6T0OST+>z0^=dp&s(pRbf+o~H+8@7FWxApE!`95W<);P`Ozw$oh
zxroe_u(H-t?o;{6x^CyT6s1gm>GWX3I<;x1Sr*o*ZN8G7_bcg{SAp^DpUZ-r{bp@$
ze8|sr;%kk0ean`A?;c&9-s9cY9w(#b71Gqa^ojJ&W%8T>cRm|OXixpmJj?iZ!Q&0K
z)8_c7>fZQq$^Wq5KcpiSK!E_dWdU@07Kr9YZS5uJWTM<Y08&2T#FuF{ObiUctPBi>
zn93cKKug4vOPup_a})DYd@}P=o%8d`QW1;Ar-sDl3pt9|GIMupZ|lfid;bFe)5RsX
z?PfZ8a9qrAS|xbt$njLk>$wTjd7Ky5AG*It-{j&E`3L<*_aY|*OxyA$@%cT=>i0W~
zpWVA_Utj-^t)N4hne)wy8>RvW`xs@<PyOyxX(?MN%PQ;IR&n%eOk`@uvro%;qVB#g
zXuI0>`s3up^=DmAXO(k$n%CTZH81K==x@#yC(plYSa{__YqHg$S0y_$%VRfRlk-Tt
zx#`{as%h5)Q%dh!KX)n$OuMn;%-5~|=f8iU<}x*Gb&RUnT{&f*<2#SdEX|u4d%F0{
zc9BI9r;Tsy{wBFS)l$CAqgz$x(xz=4P3t@_W$RtF)j84oUDxnIQ(|`9finm1vm1)+
zeKBRK<QmP^*OrajG%`~R;%YZm#_!r^eqrPBg4Hjr=Bc(ft$UM@X}0JTdx^Z(+Q%EZ
zvLtpn`K;h}yDZN&dw*G|{O0hlx$##$4;{#DJ5zdnstf0D&lwgTkL36yyUb?@v|ZVw
z*7jD_rS<d~m#ZztZwmeWW;^jN6#VnV%F(&3`1<*VUzd^&o-x=HW3lCD<s^m8#?G$g
z|I|XXWVT-Uk{$U=TgAcY#eG3V@3RX{J$Fk*x|xOTVEFCmCsLl#%bp;my+!RfV}xth
zo4ei~vvd}pTN^lU(Qmgf<=sEIC-#eX%oFia&S(uPY`Jld<Kz3wT-qs)m7HrX*D0?E
zk$CQ>rI|nX-i8Ca{ry`O1y?k*Pg#9#BBzC!`g4in_Op)JFZ-eXB)i4t=w^qiws{+;
z9}P>`j(o}%C@C7nr}i&nU|@K`fU!sylyZ@hU_fF~acU84T(-5x5p)}d>;H_cQQT!u
zcXebtpAQgWaXlz}q-=$5CX?sa0zI3CcA?;yT?KZZ?d8+%z5ZLlbV8t=!`Y?fMNZzf
z2f1r!Y&hY2+bi~6_F45z+1sVc?<X1Df8it<{`%E{yH}?urnM~HICaGu9no&5tB;;n
zP8D?MD398Fc4|qVtm4awPM)!ykC#4Nq`c(6hvzFx=9=^utoNCEYS<*I=l|;c!~0ct
zW(`^{4RYd?UBSe_@STl;!3HziVfxiKv$!}jFWtWY)H8Q1N)IkcEJ=lQ*XB-*^}n1T
za{T{!vt4Unrz}v|XCyvluR?N1LxWnAzM-GV!Gxx8{xvgA?*?BIyRX0J<1y*K3UMBb
zls_Kgf6#6;Z@F%<wD+-TYHuz5&;OizeGB*?yag?yqJ~dGj|6s1Hc`F0T1#lgv~*X^
zvo40xM@`v|-YVtwb}>9|@a4wj`31KxzU7_1+p77S1IOJs<DHLR@Ewl1xoP#$RcE!A
z#oaONeKad{bzz{UwA1&$YJCpVG*5LY@_ZLN?6ghZA#bwcrnFFv`Hq=8_J!ZR_I7#A
z?In{RZrXbItZ$xl5I>*tJMQL7vXv<oeTu8>K5dKTT^03ao~ygRmTKtZ{OzTea<13A
z2X1;g{g0^rteB8)>2<z&r+4bM8Eju|v|m|Ya?-R6$DC4!l7?^B|F)=J(=C+Hx@dI&
zs^89X{>xGdshw(*cQ10<nqE9RFeaVh@aKJP_wFu#qU-kJY|oyl5^8;q4=u=xsQ%Vh
zcYZ>*QPq*OsBg}P6@osQt#>@i$;&Nqc|(V^)VYUy+Ejbo9oPK)_pKvw)pRlAGvDqx
zwE285Gw_j1wy0a2+*Z89d6oHx*x>1jX`5{IdtPl#TEC2Yy5illl9|66jw*&{M))<W
zuqs+AT1hIswaZkjQv39VVPVZf^+Ugxw4IPikyATgE|Ktl;U<0y&-BInEd3_3_)m&(
zyPny@dSNNUswdo~F8fR?xSj;n=RDHj?Q1f&cwLy`&2-MW%U@Dq=Ksb5S?1Q2R#V>R
z?(mn>dn;{LaFRh?b?Op<li~()4f$-G$5dw&^=xytH-9RT@9?-+=JF1a1!6X~4uO5=
z|84i5`tA*P(wo)omusBmr!)B`DmC0uJiX!m2IdWax243Hhu*le;dI>Nr6sJB<6I-p
z8@rn_OS)uOsAdTM6xL2;`6M28$n}!(7Z<H>NK5iTxqZ(XUn9_|&&{k147SAN07%jg
zE-A{)OLxxCEl4a%gs;<|8*<)X*iqzP+OE{Z+=ZVOCv0tsS{RU`so>$&v80o8qo6QP
z=e=cbm+?fFoqRX#$NB>&XR}v-Wa?Bqwz+=F$FpT?owBnmO76}6zOVBA?fiRRj-S`R
z&mi*g%mIOCyb@U#H!euN*wCiBb%xcn&{;Ww$GiGM+ZuIWo=BLjIBmXt!i7_LcatPm
zdK|C1YO^lto^;?=O{1v7>_c_}^Fn@WtYB@wl<x6<F3Y9TZ_NHyy_>3Qlxzfd$T=rn
zFVtC|!+n1{$M(p=y=^x?xZK@#W|pq+Avx~l>t^j0o0ng?^WIc1o+{ltftPpIJoT8v
zby>{saE`L~-HAVAtsb{s?dqx(UobgNQSguRb#9L1_x|2n6O+9q+;&rz<4WsAQXjvc
z4zG5xoT|9=x`e>A*S~)rowTdv&VL5Uwr{D21s#JsH+|J#b=Kk5GkMkRyIOB73p%#%
z_Lr<{+$-};?_SOGl=V_*OkwihxGuT*VP$+@>ci;WefgIAc%H1hYAbiSR$$fR#Vl$Q
z(mZ0HpWRS+ICEFf8eOr&75ZBx<i73aoF#F)Na|qXkG2e{v|n=%8reEEyFC)KjpU8t
z^xmC#Yi3GjltBCrmj6C{$2rzAYn=%8m^eR!xj_1HK(Xs5mv(zax59+w1&uSlG4A>%
z7?o4~@%`Oh(`=g!7tU2a7k#t%={&`CTlYCtpVkx97pPirHM3^^Kj#DPhG&jXc=~w8
zQ{fYzJw<+sgjK4kY`K;vB^Y#1Wtr0?>mAN=>P4$hJkYy%TB*JIN#;sfrFp#_`<M9i
z<P<IZAp1+{ub#n;S3kcR=O!$VoTTB`es<E7*<l8zrhyNAH`z>@{B@e~UA7XgV=EK-
zJ{j8ZecU{QJ6A3_#aKk%iE;50TZQf`3U?D2{U`inMU23K()tT!-cRm~3=G~(SQ}YL
zrM+WOdTDNIUWsc(aw@o}hZONsC!Y0UHWX>~|7E;*>$a#|?N^81Z3$(+KDDW%$zaEZ
zrN2w0mQ9@LVr2X(d#Bcp4~#V$hMwM{x=oRHp3J-R`>yb(e;<FbJ>WSj#C5|c@wV$-
z*X9G3&zqLpHvL*y?=QbnJW#OeZ%CnFS$`W#tG8tuOXz&=ve`$Km$8+IWG;Pny1~tP
z)sB<TlN9HEXnAmCy4Dvb*W-epn>wne8}+S}kUr7MwRuM8msgev{F>7jc|SO&<C&4M
za(|4#mgyD0m+`21+0FcUt-x?W<RZ_nOGR0h?mH85VBOA-w|||!v6690U`w)7>w?ey
z;ev1K&h9_$aw>V-4j1mqzuak09nP@G#?Jj(GVk*4%kO*~<KF!3>Qh~9R{E4L?CVOy
z)t7$FT56$@9Ba(8+9>_*3(3m8yWgJsD6(_@2HU$^@)OxNZ(=<&_wbpOUA)<am&>l(
zA&roOV#QuO<NtAX28MQFB1<6ey!`S!NHGLyfgn}FcO$YZM4pP)?N6B;sm9#a%Fr0L
zeAa}NVt&T%3tJQyEopO*_UYMjE3w>%&D{9*%$qE4j(SDEy&HGIEUbDX$E~VHFCnKr
zSK>A-`g(1V|Nn25zieuM-JieKHa)Fu^X$7DI_-ZypZ$66`#bxJf1i7I^#8niMhEMA
zQ#Z1fuUnw1xL7z@$VXB!qQ~>or^>jTIGMPZW&WNL{K-y-1SPLOSi!?uZuq6uU|&R|
z{=?HgCEI--?LTz8TBRoRSXGT}Pjza};aa18jrpHWZcnL^zMpvLecMOdV|U^k-#=#G
z^C#d?|BoLQ^7aakCFG`jNR}+!aOekTy?SM(M$i0D-xDSKAEf*I{>=4<>AUw2)zy_D
zht{ji5eQhbBs=0+L$>s@j+V(SH>bBQ%w3=Ps?6W1Smv%^#@o$rCSDVa?pFVDE#gqd
z+l|MLnHb+opYf~iY+1=}wb}LU4m;O7K6rI{!!H|`Si#xuVhJBZj%=3bTzaO^G<<qN
z*N$3YHVMTGL3gg{RGF2=crW=eZE9`%*21->Po+Aq*&Qx?nRB$kFexkVl-fa4?!NM0
zzgyD!wy=GFmsI#}#ltIGV*fqc$Lh29vH|aQ?*~q`g`ZO07Vdc7ZCzD)E=NLy<7-6W
zr)#1<m*z`ZFS*UW#hLSv%da&vrb%4MY5vY=bmX2;MET@Q-x>QtEic}QyVG!J&6DVx
zM!VlmyfPzi7t`)npATQ%a3_Q_Te5OuO(E0j8{cQW{r1{DCP?=}*!~>Z)ovx_{m;%s
z$3@*QSY0mp$VaW@o7c?go0wGHdJo)Mv*%4|X>_sfxiws;Wv{-ib(GZd)Zg+lH*V8Y
zSGyAeoc-Jm5AOfxe;GMv*In<2lazD!Z25fY;AycqtIC_FY7;n<G!mG@PW8PsmzeYH
z^{0#|iwv%B3&Icb?wGhxo#on@_D#39ZC!jP{l|;zTxAR04~FH07s!@r-01AreBrdc
z$&rWCL@zJcYI2!;=S#;Q+gXmE<+KX_8@Be^RjbmhJC|gyZi%^i_1%@wvmuuy?>qf1
zw0rzr)@sf16PxZo@HBg`$?E@DvT^R+WvlvC?=F@!D|ITqvLv@xy3lsry~LYYIf7Sp
zh5WQFn(u4vU^UmS5Od}_m*jD1%7JZ*^zLU{@TE?jZ&~tmL4Anmk<Di>t8BghOQB6`
z#z9NY&0Ob_{SFpaxE=b;6?dSUtM2&07q@16?O?l_<+f|F--~VgQhw?`{4Vrw!Gr!c
z&GrwS`riNj6!^ht_uumst_NNBXl<xdJi2bm#E#cyUvDrk-nHt1>7Ul=*ICV$T$SvT
zx;}ZEobvo5SJRZLnAdw$1Rspn`IGx6^w52lD@jvVJrKGlxZ@l1x2(oK)opz;%dWB(
zoIU-@k;(UTroxwH;`+6XyB_T|$}qWdD^quQj>P2^m-F>MxXHeWjwt<-BU(|lifeDa
zj?Kc^%I{VzUp+l;`W?x(3sE-v8m!m0#m(igb-UZyVmh(1|HZ~>Jn81*KU0Md?_Yl4
zpsI!P|BrF2n6<Y=_>|9?_3fNl)=gXQYf~i|xGIVsF8vfIE5&^>^X2j{+nD<F|805N
z%i3*wAY@-(q4>)?dra7j`jX5fdbUjb)%Is$S+d%Smv&P{?`#n45%`kv)F8cAY+{X0
z>d_U?KHPC;n|&`mx7N8XsPM$2k3SzS>&n?_m*JT5cS73ixY%b#=}D72zlZgG|E9{L
z+9+{2>#o1i9mU!2k2i0h=JQHzX<hNbg9Q`Qb|o|ZT_kGhFJHE{WOHQj0g<AZN#&e!
zmrh8U-wM;ROer|J?%c=!4d?Df&umr@i<aMf%y{Gay>r|ztu*JDS~scelK;ITmx?6{
z8i#^gzb`#_==Y_ZhqamS7W{l))#SZl_ohkhqWzm&(#5TQs=SqR(M)Vumho7`Yf%#0
z(u<ZYZRr7Kt)DV3i!90bEOO}Ls|zAwE~`1U=YLeW=kj{$gp4CLjFC27S|26Mx+d@N
zn&Y&#LZ<f-=NCa=^-~dc-;(4XIOddhvTuC4RPM;OcAJj1`pU1rJr0(XR_)(sZ`Iq?
zz9EzER6$DWi^?@pdcE^nO$zwJ&n)<K^jPK^KY900{hWIFbB@ju;+eQ$>vH4mH%`b2
z_&W;uPyV`mW8@si=@nvoAFU~GF5UO-4DYXxnLHD6nb-@86CMjh`ad?y^7O8d3Z1+n
zt#)&Sx<TjE;t2aQ=k69*g@4uBw=ZGU=YXTd^Q?}Fi>wf~QDyV8vRS$y<A>M0Gbc3D
z_f%+h+s}EpUp040MT3l|pIGXf6P{O6BVSan-L>F)*oS{IX1}7$zy8dTUv#llO8#5J
z`BuLr`E{vQOyQz^2XyWVSI<uSC>R#)df;kP+WPEY(zBNb7Qgyi|1&8|e?jwtNyRs8
z+O52f|MEC&vPdUas&}HAe410!GRHl-|Mr!N<wkOuEfL-F{j+b!y2n?3|5pi^$A73)
zgsp=+LOE{Pn!O$y>qWPBUpG*UJ6`yaP3`FHiika}lON^A2u=SmuY&!*;QJt*fA1{!
zbl<6;Q&cu%(;|`Y3Bq|t9Vh*jV|{2G*Y>|z>*(=`pPLVqT$K0`d50~KbCtU;$41{x
zDtt*>Hm=-h6%uR4T$tuKL;mBIcOPFGMXr1xaCQ5K1rY&>T#p=EH7_)C1sAl3C-U?r
zTzSpjw)~-i-7D2d%WV%O*0uKZU;Zwv_)q$cL~1Q(-g14d!x8@X*Ejypv~D}@^a=TR
zQcw#)CR=RdStbUC+iVOB=EV0=(0eCSLv#Hv2Z+?=UB4J;C6OQefz^daIzP2Rfk$vo
zl9;%`OvR7Ml4o^ZMqMg9GXEj}!|wP49!Wpm^efG~ZC1R&>!EY?dE4if=XZYJv!#Ar
z-CwqV1ARRv&r-g83g>^Os&hhMqee34X`wi;h=~&){T7MyjClN^l+%?{S}4xABv)eE
z!(1bkqMx;F8&l+8@zjbQzEnQDm-+6`HL^37NUpeHdiKtBndbM-OJCHQ#<ZQew=w-j
z*vUMZ?7n9=`I>{a>D<+vIqUVSmWWk1{9@Ny-&(kGwdv&m&f6E(ILkeo{A|ZA<I2g4
zPbggdBg^`0!tPdu4?4$`Kczm}QoHkjf#CZKP5PH&rP;nqt&qu7pOuvr7Q42pFY#)3
zW3NK+PP51N4o-~w+%;FKj_cv=L#3-O9Mfgx4B`7xvN2Lyr1GlTd#02Z>!eD(KhLsR
zJoUfq)|ZmYey!(`{up^nC2MDv`P^Cil0R%aQPwj5`4ujs7vUe+qJ_3ehP}Tb<T&m2
zY;Eb>2Y-Tv?rCW}lr4RF*2ysEXq!&vy0~pIcZ+z>TU@kG?mwy^((}Ofa7D~Di@Yfd
z3*PVCQMPeG5s!1=(#2x^`P^EuvEQ2%Oji8eSraWCQhIOF_B*Nxi4uAJ`LjxvHRw4u
zJ7%5_UG(N6Z}=Ja-lJPDay?%cJXt@vabNyk6PwyEr6P(SrY*k9@HQkWbKQhFcI_XU
zSs0tYynEzT)~YyZDnmn}4a<B7t-u$5=AM|eW!;%MiiM0HxvkwlsqfNLe0#2J#kHf{
zOMdLD&U3M8uDR89t(!&MP~*Z}mV^DfWDME^cYfjM|2uij15VF7pDpJl_0%kXk@Q%l
zb7rp9-OV3L<WD;7@$f$%vnYMqJY$XJ6T@Zr8`dUd`UqHlUg|lih3AJv>yhj&T#4r*
zO3rO!T;MuG<&exx;S;}qWS;r)T1W1Jm1Ct(u;!*IH^sLoO;+mlvfmW=%W-AI(HHTk
zJ)0*<SJfXfF)-w@Gcec_lS4xDvhlQ{_lBMh5_S}^wLPhlXym{l@UgW+<D>w`!-Yy6
zN=ui9ibS<;O1Q2P{P;ym+bo|c@gL%2JVg7o#OoUVKR9;%P_MN4t_^!^XL1QTsTMwb
zcJJNo?{oImzB~Km@B8iV8J-kIJMui{vNE{nxO$Gk<U>!69-PvYdB&yCv@4sZ=;q^j
zaz|yH{|J_!-nCneiRTsb?Q3^ayQiP7nwgk%w6J&1!%vHrKIfV?GrG)6HBUU;Cwl!O
zw^t87^C-TP;yF1r{SWK;$UA05+4Hh*vB@6gZjWetxcH2n|Hi)g3KLl`o9%UFv#p)8
z(bBQ{X!<qDL#O>FcD)wUTs`&DvUhgRW>3?Ldm^%9>$%wAH_Zt*s<S3}F#ErGzU}j+
zx*bnv_WhkcM|Vnr(2RNaQ(xSxjf*Sl_43?q8)QEB=7J5$!ELYCzPf#H(u8WGxtZJj
zyOQNE-OF5%ce}?h?y+*wse7AB43o?y4t#iJZ?d7X>|Xw+Ew-9IaWga%mr1%sF<w4>
zZBAG8h4(WT{au-CDg3BctLmcqnLS;3Dj{DKRysLO?@Hux+qmG7n%LqUM-9H8zkJZ(
zs>p4IE0-0f<+`W*dT1uzm1uG|%eZY8FQc=%zS#S`YQ6a9VXfc(_8!~Hcy*(;p^N+>
zzF!e-6GV6yh6Zgp@%@VGCqa)zwI&<?ZqdG|=d&+9nSH{RjkYaY-pC!g^+WE7tkr}G
zO0%1MjQ<H5{bp&cbu<6nWcN*U`3s-bLJ17%4E3sdDgV4;G=FLb`gANxFVx#%<sFye
z`SAMIY9*yZ`+n}p`fBnZ)uR6(!%Xf8o3{0zn63QaeQCl@wtWt#LJk%`SvvWEeNDlt
zSpn4(d%FL1&yaZEkT$XCh$v_7^eeYqGvot{J}E9%in!r_<mUQalY~OUUU}&2vByX+
zQFz%s!)%(YJ;QCwpsVci_Q7XYhKe4Z>hN5`jd^ae$8W3d&|~j=S`6pwcKdxgEYg`Q
zmKE_Q`P?Iu(8^95p`@I&LfbWe(0ZUsRVSk+u`)2s<i)sG0&T<_((8l_2FwkMF1{Ql
z@NbI5>5Z;JJVzeNDKsPt-w|V)vLt|GyMsr=5>Mv^t{X$$Lng*VKD+dL?_cgcU)DZd
z%D*M}(2_GHzm7Pk|5E?ue5=kqEam1V?`4xa&&|6!?{0qie%nv-_5XiKH%$MSD`Rb-
znrzi)=2MzreecBqp0w64%PP*O7BGM2ymLhNV}<vz+njgWw2~d&?E22VTG=$gL~*b3
zl0_9d#}*tfaM!rsdr)ANYT-2zes4F=W7R?_tDn4>7CG&LX`TDt)z7s0@}4X+Nsn+k
zJ|)g1ba_&?(6?**Wmo3$Ue$TFOeWgA`>=YYQ{daAR8Ql%FWFV)ZV7CVGQCnXQ*E|X
zsj_6DQQ(DBmC@w~Jv`d(21j1-+BPk`_2inY*;l+eUZ?Hb<S_S!hdIZtjOeMC*1Xg4
zvbe)>Yg6~mMQg=)bf=qtxwB&HmL;=V3-4Z0yL%!}=%V1=D|06c1-)eGF?8R2mDO2V
zZpK6b$*o+oG$j4~LZ*qCR7dR*KCpIA)|nOC^uEnA%BsxV`tolbV@$xh;NzPlO&{sJ
zdUI%=c=DR{3;VsD{A&xg9bmqo(=R4_X5G!OD~fSf=9~;=%JtxH(b%#+@VZh?QlReq
zZ#$F|HDr~}9f*2WWK-fdA=}se_vLJ(U?z*1Me3jJrB&W7yIS*lrS#UVMMo3TqMh>3
zhm<T{z{yr}seJC{#V<FkH(lr>bS?AnhIgzRw=HM4kc<8s9?s#RFBx?}WuH}Il;fc^
z^X(swXkLk5arQ>Qj>FlrHl^%p)M@f}zx@C3bnhdYtCOB@{k&^Iwf~7%6F#hZppbKE
zi`c_OQE@3EtkxU7-69*C_i}yfaCghl;(GUJUe9kXxdfkszkfJ5l_&eB)U0@*Tyuu+
zT1@}z)NR&R7v1Limbkyk|HH~AW~W~~^Sj@Qe=&^DcDkP+ufH{#>ykvm!{^!MvZe7!
zAqT^ML>)9&D!bpU71~}?^ssMQc}&omHIK^T&qP>N%g>y*yQ<HYE1p#-X;*pX#tWr;
z`D4;fZkRS->QlAT?(-`IFUP)WU&__le*Jo2gT&RQ1<6)9+8nZ>-l}Jp989>JnQ5CB
z=xp5Gba2hV87*&LUi`nQ&oV4jRY{CXMv<?0!rH~t5(OqNSi*h!+O##hrOG~k-raov
zm&T-~)P%)5vKR036*znU`{(&{3Z63GJGHLZmrL(gS!CTYRiVlWpA@s|+^v;j^i$_K
zow9MheJ6N}y`#!!<7>8#Tb51Stli<cqo{yYR!A;Mx^>5q&z+rT^gDRgIb<Gwv$+1>
zug-h7CO$6aPpWyh<iE(S3*B<hHqDM`>wIdn)G%s~OE-^h+r$U&Xa2RB`D}K0!Hgdr
zT<!)eJ1+UjsD4VGBDya0Y@z-7aLu_3re}p&zH2#a#rSq(_JrbYjVZtHEC^M9y@w%G
zUHQu1w#oA*XUDK|SWXt5TJh$&X!%uUn>mHCUqjB;tl4yZrc~I%m)|$eD>}UA+;WcM
z9;w936K{4L$y%_@VS%&FJnn>dADBEX?p`_hE6tB@_m5eYmd%0ZPtK1!bj!G8)63Y$
zYvR5aYea6;OFpb~{YmkX&8KhtkbQLX-M-YES!dPEyUP!0yyQA5ci!x)z~0_%d)J*b
z+IEFuo`UMZuwyrl=)J4D*&eHNp{^`xf}~vHy!C?5BLBr6vy4%%d{!`Vzmq=esr8kd
zM+>^kp2slFInJuTHTYm$S^FyEgK>V_UM!uV_3(|-&#2O}L)vBL#XUuS``TqHTReXE
z^SaFDy0ZKB`tM7h)!o=GAN6Bq?yKiTpPx)x_~hBlJ7>jC%6^#S{o6<Clf%iGCxn+c
zoy)sCQ|f^7?}}r!a;(esZ(7twO@7I|&O|nL=f@5Aib~Y)RHs}jUQ{XS$*I0)$F@&d
zLP=??w>7S<Tj96vfRMiY<f|K*LcM<82)cJPS~`8<$zP9ard~1)-}MjamSa$_VNOoW
z`Q?lZ49hTA-lCQ2kWoYxNZ}6QAPp%_4T=S=ytUmNxw*{Ocgw6t<vp5int3AeDoPm+
zB28QqZGM<}w!J-(7M7;2`hW5MCH}2;KbU_l?kYE96y(k<lRGze_w#wDZOi}t`TLjW
zfk1ps%7&MRk1lJU)Slb+W@X5wIff~#s&m=43w~#D-lsWrhvXM)r~9A%TxK3kyYn<~
zc6R3b$4j#Jooq>b`0eD0h`WVzIqn+Wxv>7u)*vTyrFkk%8pqE@v^%b-)E9CzpX8|g
z?)%PHH|-YhI%Pf4>Tt~(jVsUGc+T$Rvz;RO?B17^q2JZK_ltf_c8zM@7tr=_(XE;%
z_bUYoMcH&0FXeh2tbMNiP|U|Cp;OP)ct{664OZ#-u;DO6+uc_wZx8Rf+hV-NFyvpm
zZ*SB`hw`IKw|Hyrdn|K<vv`K%HRslc8NWgeMB-w1y|wAm<NaAGHC^J=WcNf3U!|R@
zRfqK6Om9t2R|>b?#oCf$nD(vy;7`xS=9^PeYX3L#i#&H@`SF8e#}+f4B|AF&HT4oL
zk1jeZu2Y<<Q|I)e=jhG-N4u2|dD!%ZZJai3?eagoS^TF`U*sg7`#MowN1#s4CGi{D
zP=9nq-i#^i3=GEwu~zBeNKQc-@P}0CQ^Rl8ONWd8bGv=wlFP=><9&D4LN8lPOSNoM
zxlpmP`>~p@%x%p=&w?l};cO-U3F%WVp6HDB@?LnMb?H*pS<`BbyBn97aH`o)Gyn1N
zoOJ%458(p)tc|6-ukA3@H-3K4^1Jo(n)IEQ?En2fZqNL~;GX{i;Wi%QMu8r&CxO!n
zH5*s#-f(2G(qX>^NAIpw+t_m2Gv?r?3LE9ek&^Sh7l^ts-ToLOH2-+2<azavO#1|m
zcN^`S@nECA>V>}PDK(ajc@l*+u6yG99*cgg3(eT0=2vIhx&Gm%h`LyY8s}rL3-?TP
z;NLg%$m|O57d75C`*h{<PyXm@d7F0gn(yMGl*(({N*14(yR!S$B&&$6UoSn_5+yhB
zg3)Sm-mB}PX0=T2jd#DB>S@~5tasqVluS|f?rBjPna!V7Yd;iTU6s+wSzH)s$`!n8
z;oKsfz8*o#&~00~(r&y9TYB-wnzZ1j2anBVXy%)+RCktl)IoNy%<vp<+3j6dT^|)M
z-pZHmwVva}Ug>RS2m5+owdM7DzBqGDbIt}+Z`=4wZokfXbok6*^{qJnA#GLnbJN$H
zAAOywPR$ATP7m=G&(7a`^ywV67N^O+oQk#UTfSMnmr351`Ehno*^d(DsT1yM-R(L2
z<=mT_6>1*VN%}9QGTc?Gd37qS_uDsxHkA^SOB-U=1r}O3)PH&Ru5(KdOKP%ry6dq=
z+ak4pe9MUs5Srp0dimP1-a|`PaxZG0EMH<2_HjaL_zI49tIKv~dB4cADp;~=I@c_Z
zwQIurUWT<sU9y~bbHN8D?UItyyBhy((^)Y!%J%IEv+OSyXJ2Ezx_am3yyX)W<fP4~
zWvlPrRLW|dIL+(Up2OQM_U=s)TfRkg?UV26?i)6>#5`#CWs>LECMol4C$G!ZMYpTi
zw~Ctne$lpb(z;OpzbQAbZ`tX|aQlkWK}Va#(^lP5`?5J^vG=?0Vy~`q)LS`xfA{o%
zeaq?{&Rf&gFVDQjvf%RdBWohJKHHkSE8|0-+K<17GFjU{nsLUezuXZO`Ji=C0>kgw
zb_E}__vG_yShO$;y^H*Bl^6MHlS0Hn_YZ-R;i7w*%TsH@4}Skp%W8jsUp3|3Gjro@
zrePv~IP9l=6gE5J_Ad2L$ied;iaFW$7Fx`Cx$=o|ulU5>*DIns_p%)bey+c1g6NqC
zQ<_BoG=-m63vMoVwOjmP`VY}|xAje$KH4)Fe*QHLOa0?^P~C9(gY7?L-7D|*BrF%X
z8gzE`;_zpt{q1wt`OmyJ&ny3!!CN24-3MN9|8_m5cVfq~2UcOCd)k+a{E=II_KBIH
zy5bzs(usNV0_PmwRlap&h}5iQ?@oD}zb}d?`gLYPH2d7OvW9b99~+c+s<<@GeSLo3
zHa6#X=X-K_rFpZ%RC_Hh|1Q`jxu;V7Lh}vQ%TXbnh9VcX`PUho_;q&Cw9~T!Bjjs(
zn{z&|R<+BQ+P13uMLEk61&$p4Sxb2KXuP-~UZSCKCgkyr$CZ9M4=WZL#AyW<c+2yD
z2+vZlcX6K}Cd<#+9Mk$iaox=q|9&Z4Z#P>5VkoNowChnkb-2N#!64<`o=Lk|HOr+J
z?u_QR@6eJoCFu>@lTt&!jjc(K*e3nW4p8xVetm=Qq0l)?CQSMeo-==EZ`i9XyzXpy
zN_*R?Re0QYFPazU=Fyk*yFll=ol@+^btk0CS_;dap4%VxZcq8#b1jC4o-=CHlo>yf
z{j>JI<I2hQXUmPAR2z2wHt3Gsuu)q7QQe*vo;Wqn#Wsa=7;kz!Ozcr?TYj<I{e$7Z
z<1<trS@a3yPx>KTF{MoI(DAwJ6&)G-9!Wg#=ofT7#CeMA{=0Ka{2zIG&5@~@<W$oX
z*5X&cOZl66$+_0z9`Ajvb2k?YDyqpEY8}}j@V{YQHeV0NCEHt%E#A#~_5BV<XW_Fn
z&i@ask9~i6`-R%}?|$ybV*a%&H`%t|bawhQqxW4EduPqBeY0<rn$5rWcF(RwrK>;O
zI5l_w^ZZBuvhD8vo_p$rvy7$63)g9))6>_=rd&9zQah)#Y>tRuQTi-XH5)OO^o{KO
z!Cjj!xycwQ9}1p-=JJw=36jrGUiNY7cyatAOD6YqL7gq<ez446dc^UKU`>;?l4I`9
zf3r`_5q)Fyi`^;WYo?C{*P*%YGRLj%Fz*x2J@Z}Sp~{@!3^yta-l!z{-(&seY4h~y
zE8l&r%(X1HgRd*z-O86a|KvtvxjkJODWy-(?LWM_j?2np(Te4HK^xmu-Yi|e_e;c#
zbAnrD^KmvWN;R&#`|anuFAsy)eE+pe)O!B6%)dOUab<CTL>INR_GLI*?KXFL9<}^)
z{o!-BU(ED=-)(XAjy~5nv8w-*;@98WBAnRhyDV^@gSxnky0KouTxUId&24Kk_6j`x
zJmdQesgfDYixzpBZF5<<PIZyo0%_Mq|6aGd8ggGZt>6%Fo0$4F=Kh2OM&7@JVwptm
zJF>bScQjzQ>uj=z<z3!`RJSRy_hx3)niy_)mw$>g%4d$&@=KHE>ni;yE3>}rQM82f
z_;ZmcS+65EyML@n|IK^;TR?qo*{`pY*RGb|WwfC!rsK9|;P#j=?MGPtKCgO_XJ~s^
z@u$w+%D(LfKF|5B|Kr`;M;f&^G?%ed?+^2F-gnx$Z?TfIDtqzAdenigZb#Fc8b$^N
zZe|7sE6jnefTH}Y)Z~%?_)1r#DjsdY<lIT#{)ZeyTF<kxxYXDO9A5P10E?7x>0{-<
z9_>Xc65pMzry1t9^DuM%_X=0j`@{H8<FUvp!y7J-b>6+4V|o8e*|Pli`s*3KZH#sh
zldjBpwsESvX8T*2GLD<Vf?Tz39^u*LEk41!=4`klq_|&>Ep}aA<aP6NQQlT(_9uI}
ze7<q!#XJdtzNnzeZOdo8F24P-^={awM(bN1^R;z<EYNIjXwBP_9o(jzTvX~4@%2Y~
zM$P5xPHio{S!=%@a69uY^2JTrwJtAazBt$aLiM`Ok2|VUgs-vn34QEq?UT`JkMCUZ
zbg%u_YaLb^O6@j{w_1|wy{`6t;}n-&xAsO?$)~i}aa!KrcU+a_y1#W9Z$#+54^m-!
zWqTIi$uy8NtUr;>d+1<2UvGg$^W1XwsEzk6LJZR1*-J?Vd`Vn(ZuZRFDLv=j+BVNS
z<IKexyji$dmV24la>m8o!Zn<y4P*Kreu;Wj$fjHCd^!Gw7t^eHuBSU+WHHT}>8j1S
z;%B+~%CBfkkc@J|w|Ox!FtD&PFt}mHDN+=In{7oZ&WXjTo_WQodBvF}nPsWi*CH(q
zhAfCRuF-jrG;!OH$fI4;^mi})m88(?mE@$7<#hQwBio#`o4IAvkL`a{|KRBKSw9kL
zzPU@j*OB(&W)pUvQT_bf&gbWB%fCHepMRgx<bw?}v%itYOVvi(y;FEYN_J!|$a}D|
zv9>M6+fvISsbi|PI?u;#)>C+-W1pTVzw8-bb$n5Nu*&^X_Ct1p^Dh0?kl?q|n*Y!-
z`p2fnKQ4U?U2rZ{|HBmHyxo(HA9f!2DsiUovB&yc?)%fHeAxB6DmnX2=R)1Jjcaud
z`L!5d3AN`qKRqs!H+Awsi5BZ!$KrNYYn^LN<xbBzJMrvOkEPC*?;;n(EMNFLl1ZnJ
zf92+dQoRxp&$)j8{<l(w<?PdrwCD5r^n~5he=SKokmTU8ecMmB;PZ>V=sUEP`1i^R
z`fL?iyFa#6O5^q~<@oHKzm*rA`f_Kb`Gou_a(Rg>@9gt4nt0Gum_1{L1&ij)-Cn6l
z!qIH=4EOxGZy296-~7mit*eyV?taZO%yH{~cH?c2?DfgJ><)kHVqd~OD{g^g*XtLa
zLd|yOrxx)W@U1IdG}qI*TZdP^^Hul<{U-$}nZB<S{2y8Ud?wSt`()vKPEQHdehyjn
z+3T<B3s~R!*>mKa&+m^nn>5!8+O(?pD<3vC*eSUw?D<T=)!()Sa%ev-oNVJ)Zcxa*
zUGVhYMYGBm&B_;CEI(oGwK|2s<^NeHZJsKwf3C4xDDuwHy&GJ_te<?8@#su)`O~D+
zKP6%HRE;x?+=o~M?UsC&D0BX!JjLm^g!v&mi<5EAeede#>lCfLk6Hq?F5M!YF2ula
zObctz0wc9TdKPmdxhq1hZjICaY%zH<v&uw<W*a5`lgX19oEknDxr9t%G2m!xuki4j
z)OgZo#!QC56^pKDeGOc_D4{ld<=QY;&yK(~Yu_j3uCBdnm-GJZ*L%^otMjXGS7k@P
z-2ZLn%ricGYTq6|eq&p`e($wguRp%uT7K`(kDbCUCf)weF7f@U|M|z&PX6Tc^-_Oz
zr~mVlfBj@(u+`gyODj7gAIr=w$&9s<d~@yQ;kcRCOul8#nSI>q`OA<4ZGJy(oE}fK
z68*Ts=G^lp8@(sSPmH4;E6wHmAR*s>HPfd5@{RSERpj13Hh%h@<)@EGm#0<i;mNfz
zI?CxM)4O_nzJ4^xIC;6YX4^625-x-8Cqlj6rK^&@70%r9^b_ZaF0P*;T+Lb!t%L10
zyZCR-E0ddlxcEu%f{!tC#frBc`&<%r>a%Iwg2G<E(-jN-w(jxh5X;`<vi$Q=F7MJ^
z0cm2NcS>D<RkG0_=2&q}jCz=*f7-O)8OuE^<L$&>)F`f>aL-jLevbR=ilzOpP4gza
z(-Pcy>v*=yd+(Y%8vCzj)vWXj=XhKiqp<huqppT8Oj7aB9;@BF&Nerya`6|lpB0-U
zo)^vC{z24g_MWT9&o1Kpb8*q;qigN*CZ8<pZT2~mvWBC5ZAR>go}+6dF3$*^`!PY~
zjzmA(;oQ=ReSXGS$CLwmw;TGdGfuwNRd9yuc+<xRe%iA;H1EgF-Ir&5d58Dm+lME{
zCRP`1mF$hYcx;E{b`w6wM@N^>e4U_GAi-xWdX+uduwz?#_Tt<uuIiP!z0rZyCd&$2
zGPg)s+Dr5vmEOJ0X+59u9VWKZYp!`*IVE*{hjD7dt=P0HrzUjUoH#9Upsu$h+i>p2
ztgp93S4(X(xpGba{-#}JZ*M)FZes8=JkPj%R%q<UgcVv@TO)U`4x3$=AsTnWL@P;q
z_ZsVy$stmudv9{ix^pZc`bJN=>&C-RXKwC(Ghfm8PFSjO#112&+|^m#vvd_#ud)<b
z<Mk#t)gb5QDZLn`d8}y~A~!?j@8oV(Idk-g^af_rc@Oo^h-{0P8@T#r$i4;<4Swlc
zo0=zTnQpO@I${tp-_X}dbJetY;yp8?oyBzC#ftE-KlYvxqq_9<j60<h#k|e9w@U4@
z+7@+js}o0{w({AujJcA$r`{h~V0}-nMJm`XF@IaSOO2=3`W7!Gef#POCogMy&v-U9
zM<(a!rJTU7dhb~d1t+rQesCV-%VC&%y4*baWWy1;XVaGiu5D1;bogPX@svZH^@e99
zFG*cyOXc5Dv9^HQi0xfm<ApAj$Kg8f7wl_jNfSPM=$41mw$mbfmIpIWY}nEf^4sy6
zz7KDDo^avynR^Y{w_D}Lg>ws6##w&3W^8V&X1r>b_2h|9pYXOXnKUKRGUrxeW$`Bm
zHl{|Qi6X0c`JX)AGRd)L4pUrsPnhD~=yvHdemQs2Ot{K-IfqI3Iu@Jd)D-<vU7#we
z!z9%lam482+KXMu2Q6nRcel02S1nICx72VmuiuyD)yuYR78cA)7ZtkSk)rVBg~yho
zU22n0$cb)c$X|O(^yI`pCR@YUk{7Ma-hGw##*NIjT?$u{TOSAh+<Pal+h}6tEU9Us
z6W8rvS+Kb6gu@(X*;f`PQVQ#eButczr?eH#6Ij!D?P}t?v{|!q9glyQJ8kR2%M)}<
zZna%De7vLT-G$?mA6tFj<{==sZG}p1ZLEsOrdd;u&vm-RxW>jp?a0ZO9^0~Bn;8h+
z37))hiuR_|1EPl7p(iS~mu=nF<$sJ<Xp7I;jvZl|@<!*sGq!b~N=f#fTdp$s@SQ8m
z&%FrIdX-kZS+v`Cwso=E<u8*KIxY}lbvXBKCbRbQ)2E8tHWvk4oRqTBA>xT@-I<_O
zIudq=9gnu=3%+>k<dol2;yOF<FlS%C<dH=|5)viicXKZ|?z+4{|3WU?UB_~xUjI*V
zS4H2y={me@+Reo73l@17_;;LMaCncfd{uzmcLo7=vx<e1*~iriA6dW9;4aVHbNfNw
zzDo<*Um7lZw6L$)@y*0zQt_!D<nC$n*elOpJ#$sN%{Q6XQIWO1$A0tdo3{RP#r}iy
zpT6e(Cv%@+&gnkg=KLqj9nD=_&GzTb4MTY}P4>PLi!^^Mv0}xIil2|pK4rUqh@EHO
z)cpw`a{stC=Rdb*$WZl8Udq{ZbZRQw{gdpiFZ7z<KXYctHPydt<lTNGv$Atz*V(D5
z9;Zz#e8Xm+UVPEx%7ep;zT7w%Db2Ih!^!wtDS!RR2h~6An%|2%+Z-sD_@iK-^5JmJ
zi3j?ZZQ1M(^=H)_d9a>idk#C_DYItz$LrOYm4x@J*6o}7@WIx=(@o7Y(|9*GNbm6L
zEZwg*|2S`5)BbsP(wVLtzP)x@NWnR2wa;(7=N$C^6f7CNve)fwo~4mVom8WshS`hh
zU$mS1yBOy`Oy{*b=AU^d`GWt>>kl4Bo(^8#aj;gX@ZHOeFCX?C*lc*~!Sf$%&A)$E
za?D(}=L-{)W>}04H;<iSro}PIUemh37yBEPRM)yO-`X})QDk?lti_t(R*NkC>eok&
zmmN<NVNX7q#=&vnQtX{3C54==Azfnnoiq1me%P)eo%QNWfrXI1S#(sFa%Q&g8eVnx
zS-G<!?(`h%E@yrG_NcK|T8LB$_uW+=PqXbmv_9+4tdt{PeWcq@ZnO~MD-}0)KU8Qe
z(Y9#r+cb&WooutaXWxFfF|8$n=cDGPkj<%XPu1DhyshbtH~+yKnBsJD+0tsW(zsA*
zru%!PgZFmn&OYtMTQ^y7PjFk0Y7E~w*-05Eo;R~PZ?d@SeW>8k-Jf$CGruk0@6OBK
z<^S2uu)Lzc>cz>V9Y5#%EjTFh!({r>hYxC>Eq4F;@}+E${@*<>`;M;dbL8jzR=B5N
z!J6|{D?%gft1jr)H}86uzEJFx?RrV!H<P$B9zWQ%p`>7@y%O`T0}i5p9+<3K@}*?y
z;{PVCt6!L0`+2N?=G(&>Ep7X}_-e)HEnOnYca7<5h(Td0`<ApE{kK~278N2p?&KYl
zT64GX>w@N87iGij-KI~m621RZHtl=Z&b{uBPu@-m>~xOY?RZbUtYqfG2r<V?u?i7}
zC$j$U@im!q@$B12ckV=7zZRjisM{;dV%j5Rl^2({Z8(_7{r}9{+aKqqr8v!yh}?Vq
zjLflOhijYL#dx+y?0y=1pjUUTfc*M`d$ZOlc&Tb%Hd4P{6Lqt)(^$J~<DFT1m+kt(
z6f09Xe_7PzCVM&0yLY{1LgjC!9S!`-vts>i(clw8CZF5Z6h!ZdZPnzNAkJy-a>$eY
znf9qCX4AUs)|st5bFQq*cKHE6X712SI}7G1&$zW{;<|HR9VbT5;N$)DM6u93`NbK3
zmkhB@D(AgSpSNzf74Sm%0sG5E$<8a=o11!Mw#z5Dr711Qz3_QWM6t<?nzyf~sQ3Kj
zGm~64b<gd!d8zXzGEe@xEaJE_Bj^4fSF*bneRTX|^}F|I_c~d-Z`vmha649U@G!o9
zsjn$K$EaH2hRxcA>m;^Fy-o3zS#r4N?vdXIn*5h$rv+FqQjS@-`jt^ydsx)R`5(($
zMb^1qeOucQD64hM?ZIl%ylqA~Df;WTi|dv=h?)PyT&s8XpR*h@E+rjp3S6yP$}i0F
z;!w-Ao`TTrpZz_m+V^)|h}_aVtK)?C<E0gD`tEt}k9={xx?lEx;l%L2&8u{$RNDpq
zv)HNq=)1;+N4NUkPydi@xbx!Sj7a;+S$&hXPu~*v$#$*8o$mF0(=s%BmlVIW`@%DO
z&b#I89U`mQh1Zx(cE9MS^LlB_hRd_7G~Y|?ykI)()ZM)%k0d@aJa+O>i)wq%v|;sP
z&XRdT2FKDS2`KE{{X((hhCBb|>4xdqa~H2DI(@4D@(DSquOVG)!(VRK>J8273e~f9
z>QDN|@oUrD^$-3Z{vxrnW#wyyFXx%1%k7_<e+_mFzPb6ytHn;s;;a@=cf0;QI50S}
zp*qvYxl+FO=+)zI%fDZ=Sms<4R8_Yu|H2O`|JM7LozvwWssEXGh||{OqrlVemzStT
zTJ3zualiZFBRQ+r0=?`@?=wHrv^Cj!?Dh9=7fb}+Fdi&%4S4zeiT=BVn^*5OOBK{e
z<5>Ib`kx<9_c^WAJ-CQ_!-^1HEANZDY&nBAe68N2x$C6+$~Ok0jk{#7v}>-P&-5YW
zXm<qDBB}K`x8J{Ad`iaUjKssIz8)dBF7D>MXF6-q6`?7=wSKMS>PZtj_iEuyC!5{v
z=O&hA^`3wKdZA_eiVN?(^TbzOV3eG9`@za{x~D`ZhuXV*-l+X&QtjCl7mXudaZao1
zdU~hr@6MVhS5CWUXqKGx3^zBdZ&}8_bh^OHQ>mY&`f6-8FKU0rt}-u1YhGUv!~I^9
zKC_D<M=Eq<{lqVdMR|u$=&Zk;sa+au9P6uFA{^<lG0Y`W+SdE+7a`V{ySMb#v90>9
z;UXWzK6jBp{{oKwrGE1~tar><6ysGm&pq~zhjpd$+ef)q&dx1SeZO?|4~Dl7-81#=
z`|cmlkhk~0{&Dq|`S+Je|6txVvEJYOv;51jf7*AC$zOhJIq9F!Z(ENIc`1j(UuOTf
z=Q;UhVHML}_X#;h%N&gl&ui5)o6D9N{NnW&m6tNk=j>ZWcV5U^J?pDuUf!Z`ul1KN
zFSxv*dGEFMxqlh2RSE6S{%KjoX3IbIv-O4}hMr$#%8mFhR<rzic<sP`*F0JGX?{=R
z1LbYmXMa~WbPKedKXI+uk-ZK7II9dBt%?nmB-c;fskkhMfg|U^E@>|rFJ?Vm))@A=
zkxzJ%3iTuIJU@^mKk2XPY}VZiceZWxZIa%*Wx>8Z3m>^`y&d{i^OML<c_%Ni%Czeh
z%qQ=xI(e{6{Mm(Hf8~z6*JrBT(y?;kAvR&D=!pj=9c?mbl#42Qa^-g_v!NyHH8q8q
z{M%-->^|cX&8xqrQU2QD^U@E@FP01cG36{wsCIQ%sTW=ybKsNEFR_d}Ar6-x&R5@X
z*mOa~%(#O$k{s6kIJ4A3Wn;1M-c=hex1Xrzy?5TT@|0Yqv*btLU)yp8uWNl^p7kmE
z@0Kkq_e?*>T62vlY`Q5U>+7nQd)m50_I<lpG-J{HbL}tnRuqP7WM5%8EcDGnb8m~|
z9<$lpt!KG51bTGz?AJK?B*`GM^USpzy`BH=uuLz#<n6FUPa)`SUBj{;wSE$p-M=Q3
zwW#s?_)FN-z6#vGe#1kHwM`-`HbmXn=T+JDJ@FFP^@Ia&&wqVgThi(MB3()0$%2e2
zw%uiMoNP<)s=QR)a=FW<$^Yu{%-pT)4;8)jWcMsF-kLHuVqyQa)la>C%xpY#`i_1;
z@MNZpE4zAaw+Ko{33$9q7v2`ca^ZGN#m>E&{%n<#tq)#|t9Yf>@^ISnV8semCT|Bd
zan3jHT+^L)-}HEJm4jP2Q`&9TJEvJ*)9&)G^;7urkCpLTam&Tu9MkVBw%9pcsPR#c
zT)v&5^Zvt{s@cykl>dzRC3pSe_np1>9>#vryYFTHB>ctkKURNR{F}Um?(r>3vd~O$
zz0NR0HKkbbw_z3c9#fC~bN4ytE8E;(p2@IV-SD?{%eU`Wx~^XMs&VM9w`q#=6!uNL
ztaVcUL79a-7jCfa_;0tjd!y-t6~|OoOwMe)$N!?8<7Z6W%sLl)H=!RtBY$z46kN>N
z$A0UcTi%;DtiM)z8GFvM%*eH^pLXf<bB569Yx)LhpDUD)KDJ%5R8RkO=db6}GZwPP
zUhxk<Ff(m$wdc?5C%Q44H?8U4woF{j#5Qool?pYvWp^0P{dxA4(eh2ylIKjD{&39O
z%64FB(50|1jcQ88DoeyJtY?(_&$pmb-r@6n4c7nMQ*Y;ISk^AsvytT%OF-UV?Z49B
zp1IpI{<6@j?=4+Y_5ScSCh^lR><=ij-)TKR_vM21FY24Gwf*8}*yR3lJLiPl_SBT?
z>Ze{at54gp>aOd%PX3GQ941zm^|~vrRuAm{@q6Xgl^b*?GR!;n_{u$R#}JE2Pi{~8
ze0%fr{vZ#X%NLy=9_F0oVRp98oZ<Jex~MxUOVjmBud$2#Sn~M$lCBV~-BaV<IS4V{
z<K~gkziPsC-~M98FJpzj&a?dM8*}Xzoqmz8q4dwM+Mrywr-<9w_MC;`4cGIJS9m)8
z&X^+Me${YxGmk*VdB^(oO=aS5YL+&Yne(*>YOT9#!Ml9vg1;_YxBOKW{1y8VUZkXc
zzuo8O`y($STElFV#memGg{FrupW7|>OFpsV=zs71<q>aA>0O#D{{LWL(YX&Q|K<N)
zOf=+oHhS}Q`IWURqRtBR+BcVd2@r{RXXli6-8dvn!rJd+y2h6+s}$L~TC$#;u=(<D
zjY@6D8nGT3*VrBFJCnp0-R-rGHov8PQO~(r^p<VL_on0N7vk3b+0p!MXX!4nx1|#E
zTgvQjonN$9?z3x#efu}IE#|w5UohM{-~3N)i+OXN?1e9~`S0w}b~nfK+g)1B#K54*
z&cI;IfO7U&a!#f`#!!`tV_HdS5o8%eF=X6o?NsoZ>Er*mOTT`>CauwNp1a9`d&<H^
z9fpB594B3bOFH)$mS@XeU1wVE`ce5uY>i^4*P>4O1N^Br+gC5%G_lFhx9Ys*_dEA3
zpWiFKJ%9hczYGD#y4XZ7OKqC*Qr$D$aJ6D@C9j%T$dphWqbINGHlMUz{iwq1aK%w^
z-pz_Tp598kTY5%4W=l?X>HYLp#p2T+=R7bw{G?>lZ=b1(dtXJf=zARgRkk^;d-<Mc
zlTvp)y1p~|>7j{LDL(Ace%*@o&r=h+kLNQT|Gs3`v&wA|rIo8wCuhm^$aG7pDXKks
zt@%1>^8WQVr5VK?Z=WzQimg0)zv%MQxWjiiS{|E*rI|?v#h9cN#ZKm7-Y4$7V#gta
zE7NWVW*RM!GOM0YeZ)&|QMc~*`~9EJ|Gc;B{oj>p-^1C;tFKOz(U<c)8p>v{M)u*1
z$tRy~5S=oY^{1Axk4!3O^R|ci-MjuCn7G#P)>C8s?la2mdun1&FP5LxrP}t?<(KjM
zt<U#=u9|c2Mq;qhu~Jd<PZ7s_+jb^@RXF^naNGREk3a4@np;$cOD@~x_hrLpE!Cff
zH7~Bd{=YEs(b^yDUzQzRDt$)x^*=v_imAJAe^Zoi)bjdr^o-NC{~O+DPWrXrgq`wf
zhD?6X;EXdbbNIXRY8<nshp;w(k#p$^yLRFDs|zz)nQpq>ey8z>MZinw^b5<*i5$CJ
z7Jmr}lDA&N^F;Mdm*EsXXT{SiCm6PE7JMwYcEJmc8uwp27uLIZrQP`cl3{}+lXvcQ
zz6}D5OH2AxTAzI0A+hkin`!o>tQuFh`^&S6+Bj1pwWqDRrkI^u6ewmV_wn7t{+{_4
zdu=z|WtQC6kvijLfzb|;yxCLK3?$P^EMqKP)mdMZ_-XO*OuU{cb$-cH{tE|KrMyiR
z%~)E$pwTj8KiXPO_ls$7CNVKE%wZ)m%|ntqWDWt6=BEa~^#iSbzRbUE%GTIZ(=}!_
zh2GLl)qJGhaZE~BnNgUB?LY6^h-o?Hv+o{#vG@nezo{+?7mu)iSlCm(Oxx);%a7vc
z_pFQG**-sa=Dodr9pj2eHx<?`n4*@vY@%aiTd`)yr5Wu@6BT)RQ!`gx(pgpzJ}>rC
zLHuFnHjD4Gd3J8K{Wme1uYC5kv=_JYif1Ms$Zp^EeA4Em-DNvY8AQLay*^tr*H9%Z
z&e<U4dQSM7_uI=_{!e>v;Z*kN)t#G<_US&>n8{K8w!!g!0IzkbM$OY*ht^x#aIn0M
z%AR+B%PhNmi$kldw}pO=(tT%^(rtc+za`$HSDkU@GLHBgj<+Aqzh2q>t4GZHZ_6^L
z^^dbFPB64x7r#_#H-FVE*Eg4&OhPloB)P;78uEOsie+(JxND2Uhp3N}Uj63s&9C}h
z7rST6(+kI|wa$2V^d(AI6-i8dHnC5KCn;`aM#Y+BNo^kCyG!T4zwPJz!)jha=y6^j
z!wp@1uV-BPFlAwp<}03K|9?qaS1*z?Iy1-Kxazd4W!~c1vM>3Z-nAdJw!V`p@w#~D
z((hkRRqock!*=m)`2uy(%w;Q|oqybB^LGc&-)j=SQ;vDY`T5Pfw&Yarh1t?eGiEQc
zSR46SqHuFfM~h`SN7;e}$z0PGe79_2xomi1g~sWGIiG&=@d)o=)9~MxcxrNQ(v!=%
zF1dCqBq9v=D^K*6OMJk+tj_7Sotsx%^OW>0GKzmiC;vBVJC{>q{m?`qdt>5J=l557
zD-3>$ESe{_wn#ry&hb54|9mEO>jdYnv+fUgC%GS5IP>Yw<Rg5$9?WW*Jy%)X_=17#
zS%<?tvl_qTEo|5^@lfuamx*qVcFoL8pW(aulHnPx=p##ZO_I3#&NjwX$~?1m;xBI0
z8HftCM<EF;3=C4-3=Gzo#X9V)7-A+t*M>!xONEO3<Kyu$n)$40p{d$hPaaVw-nH8@
zbxpi3Ur9LWy0SA<yR3n8rbt>rT8GR3=J)HKR>!~Q&W-U7pZ{0(A7APGMun6OOCt|G
ziurak{e6D@?>V(U9<PtDXD?v2_poTctu#$_&QaNWYdm&z`>U=|I=g)S$BVX{l50F8
zjvo^+`}k8}pTjis@9ZCzvhZ(X+hE&LSaVd}dQYXoBgOmwJ&s&gD&qOKWLfq%p=NWL
zn@IxGdKaBCm~^qEbZ^+n)z4~G<JCMBl0~L`nwFGRb5Drt+q^WxnDY{8nsG)`lOlV?
zPes{G-JTPyd1Lmnz);`l;I*lXg95)OneWbd!LAZ=mgR7Sr)`+kofWrcEi~?FSDsn>
z)S+{_=w6ZYx0WrN?ooPZX_fm{(Y0&DB$rjKiDV7Vj+D`n__Z!<)l3#k5j)Op%(s>$
zMYVJbKU{B>+;;Q&>&e?L7Jb!vt7ddbjN6w>B5(Hv3$<?9-9o-bS=++;)@xpMd2(cq
zQMjoFr;e{@)grk(&8M?=1+Aa8D%ElV)7~3jGK!Csw68Q#b=k-(*K>pC*ek(aY1!tG
z-1M39b0)tyS0+E_@T-pxcV1gNtK@Kr_p}}Rr&c-UDv5mLO*LOVwd82orr(dHKi^z_
z`-JAfb>DbT+}t_wemHlT(j&3JQ?I617B974{PyXi`q)Ep;rf-U3S_=*b~~%HqTF=e
zp^SR*+Q!?HKANdXxcT3j`cZFL>Y0S7BgvBQodqXO4|E7TrV}5yQG3ym@NX^|M&CZV
zxJ0_K?&5HE6TN@R;NbcLx{_vDJQE5V-ltqCJTd#d<hhcg+R9CpR*lQGqD8(*8@#>t
z?t<6MrBSX|-+t>%n^70LbzzZo-HUU6OXeT?%=P&A)$n`4Ymy^eUdHUuKYV!0>eWy5
z+WxC|tb2WE!kgpUvg2<bKKjpO<%SEZAB6-zQWSW%hC%Y|qwu^P(T5BcY+a=>b?-V}
z*{h}xrUji;{deu^uD3Ra`ClYno$L8M_{P3hi<XIB{dG*wd4srU=0BAy8NYisRF}^`
zns#B;M`zz}6&f!~&Z}EWyi*lVd-4CM<%fQbWBImQ-(S%2v%Ty4<JtV?zfR2jYAe55
zA5vI$;QiXg4WD-~a4_lf`q^K8m0sy@^*(W3>K3nCaj*2<YWE-9{CIBuf!TKjR|s$7
z{c$ac_s8`l6H#f28~?6nGcawP%u>>|@428-zs$js%TdCO##|TsC*I=-U10DwZBNAn
zvG4!XE58TN?=ITU%VVY>o7j=~_mW^r+x!hq&Bi?X4|i(%a5O$-a}%p|ynkMz`(nu#
zj^wx;`=csn_c+EgH*zYz5SBCl5SIP&z4*rTCkJ0I*yk{%=>~_OF!zx|?MIxuKD-s!
z<lfTlzQLtKOkin#&xO_k(dij_2|V95Sf|hZQS|ml(U<(s%<W%gB6oXzjLm-D=q=`1
zH1`;jXWj$l_WiRLYkr!#K=66ORGp&PmugJD2|eazng8`n?&QdoZzG*HJ&io1>vZ?!
z@ynmS7}^#7x`K4e5oks3<hgr9_b@RqD6ldx=wKFH;MslTMVXMQ8B!_t21kRB7TLC4
z_pQ>>7!gMe@rAmly2SSctY$G(%sjG$tvTP>I<gH^DeDT>bDdY)_hUh)*94c^Z|;)k
z-{>tB@vNCS*Yfw=_ciw|jraer`OlajsI8e25D@62*yP0j%V7SZr)^!cJ$05$Xqb0Q
zS4XWdy6*jo9oqZ9KiRb8(Y`KrE}`l(Ifdbl%Ql_<Hsju>mX+ZxuXVLwtmHbJ6nFX|
zSK6++=}ntY>Nu~j>f6xs)M%-S*CC;}NJo?S8zBPGTVGGP6D}xLe=#ek__^q9GtEhB
zZ<wa#8M&V*mguRpZkqB$dt360w!^Q~u4ga15N~w+>DSQR7Zbu_gK|x56Qe`)G7Iv9
zr2-6Q=+Bw%BIhUIGRL;DWY!#8@jVBkW?g-)-FGpo;B>IT6#M>3eUsPlp8V(SU(~*H
zVN%vbY1Wmi?iOYJ**QU0V)ubpO(~ZQS`t~AmuH2`w7>N}DfMgO)dJbgTxx!+*UeTl
zpAq?W#_{X-uI)JQ+R<PVzJ2HH%{ltp4}YuZi~Mc*-$>_#Q?Qm?Rt3u>8>vH{mFq4V
z*<LiMY$)N3I+VQ2=B}UVl#eclgEce0{XbUOmYQ5W{rZab>F4^|-gRi-W8E9Qd}^Dv
z`^I~gzZ9mHxMwEBHgo+yxo`EM*ld%%wLX_-pS;k#sPUxUrSb+pK^`T)>MYB((=~(K
zrj$7>tKe8#(R1RO;-YxL-)|PLzo2zrQA63yQhCc|CYyChSDwos-a28mWRb4ue#N?m
zd&w%>Hoa1uWZxYxVC}>&Su5Wbtp4zY;3dI7P2X0=7S1qf%32w+c>a&$E1l$oWv@=Z
zb@jNW+{e|gOD6q)H0kRUormnpttUNBEV?j3=BS#XXjFxpU}pGamCx=kdLNXQYd@Qy
zW~sa{KwkRO$-5?LHIgOi&c}i@w57j1nAF6)Vk3XbpXBMse)9F++;-4Xe(Ha;>U-OP
z4aGB<7#LQuF))yD;*Mi^Vo@qMixeR(PG1}P)=xN4z;=7=uD4|yMHkjRU{4a<CBkKT
zVmX(Pp$hM;D<%i)x4(@N-@g0VyKDXKA36U#=J$2!Rk3T}Pn{DzE$Y%N*GKcuojWtL
zcv<<gcmMu;{mb4^xki1$5nf)aO`kHI7SEq8rDnKPk=^;|7B*31tu#{=gXKwat`ij_
zi)Z`3yW%}9*{ElF%tZ|omi4#O7N$kF9*?O=tNqNMHdXPN{q{X?V&qH2*Trh6RGlr-
z`LB2Q@XCUU9X0C?Ey&qbnq{WSY`r$^s)&EZ)nz9FPOdH7eW+FSufmEGWs*kyalfX$
z&e`)!DM0)8o#lJ>y|q|&W6RFxGh3qh-WuJW-}x_l*U9@~zMop^I}#;kYQ6m!z9*r0
zd7#GcLq$@ncP{4%)RWruaGpx<k<zl5=N$@_Yi|Dj`{Izb-MwXDWzmb$@*+P~7}>sv
zT)9BGbxYsohzo`t##VXBAx9VWsp_nbxVW*)w5>JZX>a;I&22gle?AQ}^)Tl7&h5R`
zn#WlEv5k$q)Qo#?z4&fzJsNy&g5rPu^p%g~m?hK>hg)0UkGs3$sVr}qPR?~nw#vQ#
z9`x#0wBFYJtbaP><<eJy%V&O$I{RhMn?o|OcRGb*Tz4+f|95(-?aP}v-&f3?mu(}n
zyyv2H(DL$hmcvCy8%v_}Y+V-xWc0UXY<hk|TTsc%EZ66Kv*a6XCAT{Hi~f$fE2e$Y
z;qN`Ga5T-(X(P|m6>V=^7yMN*RXS41xtQ@Y*H0l)<7N9DeqMOk?YJ&<W4HRXhn)|N
z)&<OasCA5Ko-NOoK-b5{i(E_{rqw#Xku_ouC|{~>e5LY_Z4kT18@6@dHZET2$+oS-
zBKp-O-LjJI#ypnmw@n}KaJZ)MRHZiloVK9VX_<AJpR^}C&lBL>#QJEjtJupQ`KT>c
zbrugENk#^SbkJY~X2Fj%5P`NxuQ$-w`>=yR?d5C7uB>0BeqPCh%Wb`{rbnO%6Bp;b
z?Jsxbc$#mzJLR7l|38NMDLZ@@vP^aopEkF0^ZUJt&z^sOEq%cDoNS5g9HBWX!QAV3
z7vASyo^$Ze6wQbGCDz@vc<RVmE$d&I#I&AE(5nA*OTE<0l{=e_o1{G#&NykRe&;GD
zzgI-cmJlTgwnCYTZ$k5`6PLB>o6KHv$3N)henZ>mlLO6W8=7)1y|r`mYuP1c`_|1p
z)-K|DJ6trWGbrQ5fok<HY=!%?Y}U*Tn)1}@p}*1AU*f7eFII8J++P>ba{BGL+3Q>0
z)pH*@TlT0~>}QYm=9?k29WoM1XX!c#>&||Ab4}_;GZ|^q4e=p&W_cYC<12_blKq6^
z_|fW5?5N@Ed{OM#D`p0U8g2&Sj<It}P0KGzb;~R&E(tD8f`&h&qCFax8!Q|yQkS=>
zpm1}B2k+EvH$0jh;y4^vI|y(KP7vzMonm%lyKltht0~uS=B%n;Xut6Pp>tcBr>*=J
zo&Ia-|Hbx;E*F<4bEs`NShy_y-RYg@ZJ+NvKd<`RzpwA}^%<5F#vhA3Gj~y1oSQ_k
zjHINHSgOv0C<gBx=RS7M&?#QSaf4UVD9rL2+lF(6!N=I_rW$tm_RZ-L*k<ubX1nCC
zx9`7Jm9!=5q(@B+IT}>HI%-wS)!@j@VZpt3=j3H<4_&=3QqoEPRa>6E;Tr#{!}0DG
z&+eMVq-D)^JT+^#)M3fQ8(CMpW|g|@hMp8UH8XYVuC-CSW|;R*T5wt*?&7=I)3z;(
zF5P`W!?e~&L%MBY<jqx4>$6#Ae^!xv`>MlFN<-dZcgN*Qu{Ouc8aGy@K9|3_E3=^H
zoWYa6yAfM5Ca<4+@(%M?cGJ+%UawUN(YpdqmP9Svv$Fh$8eiSjRU9v^{#@K{ENj#G
zgzpaPtY`eb!F$>AEakE$Yu)cDj4|6egU7v*k%#}jmsaIwKkJvzs*RLqZOKTJT(tL1
z@&xX*!&<?!I%H(t9q{4aDLUtHM^oaS(}nGdl}eIFpY7(__L24Ybgr%&i5(T5D;~)0
zOPcY$r{sD?#*F@6y^|I1R;aRy8>mIpo))mTI<P4;^NPvgxZ0p=v*!PEx}3UXrr1fX
zhe~<pT-A=f7QW1Lu=&rK>2evVvmaZtYI!Lo&3w4(`9!mRiwgzcSszY+b$F`zYWBSX
zMb3KmVY+V(7A_V`^RGMjGOlv@>y4d{n<UJtwVd|GX+`Qz-&$pBW$rxvbrApe%2T~p
zH+;={HSL#&$a!ZrtrXF-X*+KCT|PS{y!y5;JI^!L=8tg_Zwe;NYjl3~?}qQx?EzJ{
zvP;&_VvA3A5}gyYdD$eL&#@Kvtm9UOZRIP!sr~5hXSUQEkFP)Y%l~8l5#KpSw3WUr
z;JR$x!`i%P&*c;R^H+TP^1Z4*%{=qn^0>~U^{x71{%;QcH$GciG5^-(q~2I(`Dmwx
z*yHRe(#uQ_B~Ph2EE%{}Rr;{|jvHTonX_GR-@A=}rG)<m+b_9C>l)un{t`Zau=WQt
zGxw#AFY1@p{k-DO@zz=ISf*5mU|i*{{)0&`wtTTZC-V2?A!C;B249Ng7cROnQD$PC
z;{D27i>l@3yh!VO#oMzfv}dEK$_*={oaTGomhJyir$=<}Yvc40$~By|Xd*x38-+F&
z+1e>jJd>n?1XLn-Rqn7^>v5&nUAJsO*#3gUVsi})#V>IkHuQdFoL+MBqIZwp<K*Yn
zF@-fTN87KgpHP<m(z0frPT;HKsvl$G9OlFw)qEu=(@>$8t|)hydxz@|gRk>F?P`4g
znos&8k6MOIX0V<KT3P*viGjfqvy2X|EG|jSC1y-v?xfRRhaE)P&fi#_yLH>OtgEhf
zOr3;Xj<kwT5EBp54|rKOOYZVS6=Ai@PWQaRo4Dl<v<s<c3aoTI5;@2C^ZEa0=j_~5
zzh@ug0mhu^3jDoFIU)-qTh21&h%Rtds6S<+cAhik)~^W;+fE<%Sa2&{?w-$G!LDkn
zqA5Y|i@U9ywIWRXj;xupq2WN_eD2#@SY@p<qWFy26BRD*6~5!HD9IN4Zr2rQ_wKTt
z=D|u`!c3;psYzV<wI_GDFSvN^cYleSZ+q1?%Lz@D+cs^hi>TJnEH3a#Fi+Lnz~UXI
z!}}v7qT=MDuCM#2q`9z$EMRbDTH?My=19QtaFNExj9$6xGU_(1Jtl8r>G(FQV(r$8
z8+g}VE<T*`?F?`Fm6?n31T6j>H(hx<c7dK-qsWy>`-?ZQTYh~Ic$%s6+@eRDq-JUf
zPc8nf?=UYkozqL}S@K4{R8j5X=2O~+`?#*Myi+Myw(rZ92DAMOXX=;evYyphWW6#&
zm-VdPqA0FacG+*D{<EM)sjg^76FU<F!)_J^1|!TUg%<lhnR(E5r3yy#a%%AX{7V5M
z|NJyXxQh?m2{92imoYGVRbwpSt1@fGgj~)v{_5Qhhj&ehF21e%%l_x1ZZ*3f>_6Nk
z&*$DuX=cg1G*ABfocA@)=iI(uU-yrxfZ@2C)NM1P8|M~fJ(eufxuR>rF*AJLmqpiG
zLiQFq8CV~@pt`2a_N820&+m1=G=AAtd)-Y?_#?c~Cf9#XTFJB4mOC2*7Ot+E*l}a#
ze}$#1t@d#^Pv?)m>(D!AqLB0bQnr21OPW4LoLIPS!jsVDmu|Nlil}+HJ7?vK7r{?h
zCvAv(Kd;;S;SZ<2IdMyDEVIo0I3xA<aCvf?UeZZ_#G&0d$7%BhZw<9yy!VzDcb(DP
zy<@Iq&a(;JPZAZ@pV&9|`uR)6Tu(wySX*wnpwbYqTEERI<8`j|{Q1JG{tNqVs6N;#
zwd1|*-XFa)XH3h};OCBP3auA5`xfoXU0wNRamGT|8_~;b-@Uuv(D&>4I|ZdZ5p|zh
z)*d~3S7TaEbG1ZwM!_=uf>gn#$cOv2ng2!@eBr3zEWc3{@yTt%y}yi)rM1~|{-tf1
zeCou;dHzfh>zLGx9SzyEHu^Z+nv<IGB2DwF?6d392D1&%xCu=<aO9TMyGDruS^lI4
z?HbPUeeT!a%-VSNeQug{@EMIpos1J_Js){bJGNx)%qO2j=6^ArZ!&Lz&~n?}$J-00
zr%GzttxP<+#d2}mZyou~E{ea!QInP1HjeMM%nS^tII)gDVkRr_v=WZS#_OQV0RsR0
zqB)i@da)j{PD)*%yM<M7LxpCjUXVtF>&5tmN2D}3C$oJNtzo#&oL&+zv+&RJp8iM9
z7VkW{M7(DoGI%_Hb9LGGn)LF`yDj(stNG2R(B>+5w!`F-km$vx4v$Ta`fUZ?2R1a^
zjxpA9IxwTbn(3HpMWKI7$8RP%4iAGXv-7VwDV(}6_fl_+O8SY_m8z4@uAaDL-$upk
z)taHfVkwIkNEB|83pc&G=eWVu*E#>zx2neJZtVW9YgjSq*Q!Go4zYfYme%h27!r4K
z@{#$MHW$@-nuYAs=d!&M+qUgUcCevZ=;DO5ZDCy#crNuU({wY^7w6)N?6vqMVZqn_
z=t~;EZoj8*r3#Plu4#s;hkf#Aty;(FVYKDeo?1~&-$PY5XGcxGe`?~MHBXf!F9&Rm
z*%Nc=`I|~fv!4&9^~(6iNXpe(-rc0W+{?*ZJoW0ny}82TA0{yJyiWi0aPHym$fFOd
z#GiWi=r{8;Mx8V4kgPp@LTj?t`Wbyjvl-{fan{Y5{J?p2gS(KLp=v_ZAs#v763f))
z#4{Hsrr+ANEI<4B6o+)xsV&|+&dAPQe5-U%!ZxNFcU9N=Uena;Jf*=er|mX9Ki%Z;
zhn2ThO`GvXTKM*+g)+S>CnbG&QtR~eU5smJ_W`p-R+BeJE)C%5aa-xto|VyKx7&ET
zkE#63$>u+=SST&vJEy7U?Ei9t$NDvzk;VUWR(c#@>RqM0aIbydo;i-z)6UI|nq9ta
zSzx&Kt@pt^^InO@o!w*c^<Vg_L+XyM;(wn;zpy<}V`q1vqxkUA=hA0io89uge9t$8
ztIh7PC{Jto!+##t;<qw$pIL3|u=>UlH_eg#q?L#JH;ex6hNBl#lq3&}?mFxCw}Gvq
zL#=84gI`SkKeS)P{Am33^WXdr?;RufCN5JvQFd|1X7<9Fx8EMzEyFe0<JJ9ev$rxk
z9zAb(V;Oamd&}ljmK)lq=Pszd*l5ie<8Hq5;7;iyJ2hTtFzw*n-oN;ZSgcQQ#-Ak#
zN6+vjuY2Bp(}{CO0fXLx{s%LTvaVfWDeiRRRM!4h!v<~_bq(gTUmm?uIT^a>x{Xp*
z$D!*E>PZre^;t&+)b~z*5&OYCibq&ZJgsw?&7*kKTzSl1^9gA8j4J~JgFFKRLwZqS
zN=~Y7a!#gha!z7#aRE730GNefUIBo5@INDy2s0N00|y5Kw_b=l0|NsC?9_Ws5C@C}
z7~VR97{0C{j=G+HZu$Y<sM?B;si}aDEec^^U=RVRgyJQQnhXpKaBaShex7cw!6ACS
zZpbG5(M7eG1*)5YL4e_}<1A>!hffDLijI9y9gq-2aV)x3!YCSFqH2WRz<^;uMpH`K
zVg?3=tI!J@U}kJ-lwm}fq=y**yB12t5Yk0M_sY?Gt=B}D7#Ipz7#Lh&rZF%uY-t2V
z29_Jg;0B_%>H>=LD=HmJOEOaPN-~oX2RozN`20;o@hS!ehT9B~TRUNvZfPuI!RiH1
zn3dRlz_POHZVVFxLm&$SgD%W4un!Vgv6|-&PTir!sYM?7xv4(+`Prof*o~HX6npz9
zD+9wXF35y1%=9gd>>OB)cCARxDJ{+{OLfc4Np(z4PAx9>P0UM7Pc6c3!5Q8-H_!>%
zKiSaTF3X42f^f*aZ_fF7X_@JzMTsTwOWx3fIj~kX^C=4hgCrLNg8|Ip;9&VFfYoU9
z`1DB3OUc3I@THXoyTU-Zl@(HAz%1C(s3V5ebf5fmoS|^8=yjJUI|D-=9|MCL%p|Z=
z_e)?k4CU54>>+D$Z`)mIVFrdbnhXpIC}v71U^UYda#JjJ)9xPd={&;1z%Z2)J)R1U
zv6|+TpI-vHcB8;IF*7f?B(bOjS4etX+pcn%i-AE|f`LH;#i0!rSdE4z0oRJu<kFIS
z90{vMYRT$NTnr3O5)2GlD5lPI#%d}gQ$WoIIU0LFpkKKQGkQzoWIwFtLW31o@q>QF
zA;P@kP^{*mM7;`*3lGur0{ZoN2wQ5yvD$*a#6iC`2VvaRczERrEr79Bpvdk6O>SkO
z-FkyCFfD-r=N&lcrhs&TvLuKGT^j?UA@x{xB8o3T3%JlVPe8jw2BH~M56r^U3|l6E
z)Lcg!d_^}N{bCS=@v12pZbLE_(yPRldO+cZegy}@RKZjtOvQ5{2fF*wuR1{3B%DEn
zO_140$U-6XqeaoJLO*F9Vb%XEd{*H&cOKn%^dr*|#!t<`XFN0}@ExFzZj}t$*{cYv
zwwDlL6(rCI1sD49l?Y32mJ?wK{=+QMeT076AHp*6YJ8SKyn<Pzf)X+MSyKoz-!|Yg
z6B;29qahrm$vt$JqaSL7u;o<~hAm*zkZ04eySy9iKm~-Ehq^G$B>s2>bhjI!ZSqIh
zGpz^19?ZhSnV2pA=ysxS)kfIq(ofh<?BRvJrWRr5`-Ozf#InK`-O=a^7!ejcUP6Qg
zkfa1DrLg+|efb!|f@8}uEP&M##0>nR`viTt2g0KIH5e9QBv*(>uzLZ03LRl`>v{~6
zF%uKSXzUZ}=$=5Ix<pu2u?e451nN>}v>7{uu{Sp3GZq|7MJjma@6bJfKCX|jNoEIz
zP3Zjxq_894A@s3kgf;JXVpxM@EYw2~3QyUGKIn)r-)#>O=HniML=P|YaTJ6_clN^@
ahPXym0=!w-KpG4g3>gFj85rUZfOr5}WJz!U

literal 0
HcmV?d00001

diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..0b7b698
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Fri Oct 25 22:16:46 JST 2019
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..9d82f78
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+esac
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/rtplibrary/.gitignore b/rtplibrary/.gitignore
new file mode 100755
index 0000000..796b96d
--- /dev/null
+++ b/rtplibrary/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/rtplibrary/LICENSE.txt b/rtplibrary/LICENSE.txt
new file mode 100755
index 0000000..8dada3e
--- /dev/null
+++ b/rtplibrary/LICENSE.txt
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   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.
diff --git a/rtplibrary/README.md b/rtplibrary/README.md
new file mode 100755
index 0000000..fc9d32b
--- /dev/null
+++ b/rtplibrary/README.md
@@ -0,0 +1,143 @@
+# rtmp-rtsp-stream-client-java
+
+[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-rtmp%20rtsp%20stream%20client%20java-green.svg?style=true)](https://android-arsenal.com/details/1/5333)
+[![Release](https://jitpack.io/v/pedroSG94/rtmp-rtsp-stream-client-java.svg)](https://jitpack.io/#pedroSG94/rtmp-rtsp-stream-client-java)
+
+Library for stream in RTMP and RTSP. All code in Java.
+
+If you need a player see this project:
+
+https://github.com/pedroSG94/vlc-example-streamplayer
+
+## Wiki
+
+https://github.com/pedroSG94/rtmp-rtsp-stream-client-java/wiki
+
+## Permissions:
+
+```xml
+<uses-permission android:name="android.permission.INTERNET" />
+<uses-permission android:name="android.permission.RECORD_AUDIO" />
+<uses-permission android:name="android.permission.CAMERA" />
+<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+<!--some devices need it-->
+<uses-feature android:name="android.hardware.camera" />
+<uses-feature android:name="android.hardware.camera2.full" />
+<uses-feature android:name="android.hardware.camera2.autofocus" />
+```
+
+## Compile
+
+To use this library in your project with gradle add this to your build.gradle:
+
+```gradle
+allprojects {
+  repositories {
+    maven { url 'https://jitpack.io' }
+  }
+}
+dependencies {
+  compile 'com.github.pedroSG94.rtmp-rtsp-stream-client-java:rtplibrary:1.4.0'
+}
+
+```
+
+## Features:
+
+- [x] Android min API 16.
+- [x] Support [camera1](https://developer.android.com/reference/android/hardware/Camera.html) and [camera2](https://developer.android.com/reference/android/hardware/camera2/package-summary.html) API
+- [x] Encoder type buffer to buffer.
+- [x] Encoder type surface to buffer.
+- [x] RTMP/RTSP auth wowza.
+- [x] Audio mode suppressor.
+- [x] Audio echo cancellation.
+- [x] Disable/Enable video and audio while streaming.
+- [x] Switch camera while streaming.
+- [x] Change video bitrate while streaming (API 19+).
+- [X] Get upload bandwidth used.
+- [X] Record MP4 file while streaming (API 18+).
+- [x] H264 and AAC hardware encoding.
+- [x] Force H264 and AAC Codec hardware/software encoding (Not recommended).
+- [x] RTSP TCP/UDP.
+- [x] Stream from video files like mp4, webm, etc (Limited by device decoders). [More info](https://github.com/pedroSG94/rtmp-rtsp-stream-client-java/wiki/Stream-from-file)
+- [x] Stream device display(API 21+).
+- [X] Set Image, Gif or Text to stream on real time.
+- [X] OpenGL real time filters. [More info](https://github.com/pedroSG94/rtmp-rtsp-stream-client-java/wiki/Real-time-filters)
+- [X] RTMPS and RTSPS
+
+### Backlog
+
+- H265 support
+
+## Use example:
+
+This code is a basic example.
+I recommend you go to Activities in app module and see all examples.
+
+### RTMP:
+
+```java
+
+//default
+
+//create builder
+RtmpCamera1 rtmpCamera1 = new RtmpCamera1(surfaceView, connectCheckerRtmp);
+//start stream
+if (rtmpCamera1.prepareAudio() && rtmpCamera1.prepareVideo()) {
+  rtmpCamera1.startStream("rtmp://yourEndPoint");
+} else {
+ /**This device cant init encoders, this could be for 2 reasons: The encoder selected doesnt support any configuration setted or your device hasnt a H264 or AAC encoder (in this case you can see log error valid encoder not found)*/
+}
+//stop stream
+rtmpCamera1.stopStream();
+
+//with params
+
+//create builder
+RtmpCamera1 rtmpCamera1 = new RtmpCamera1(surfaceView, connectCheckerRtmp);
+//start stream
+if (rtmpCamera1.prepareAudio(int bitrate, int sampleRate, boolean isStereo, boolean echoCanceler,
+      boolean noiseSuppressor) && rtmpCamera1.prepareVideo(int width, int height, int fps, int bitrate, boolean hardwareRotation, int rotation)) {
+  rtmpCamera1.startStream("rtmp://yourEndPoint");
+} else {
+ /**This device cant init encoders, this could be for 2 reasons: The encoder selected doesnt support any configuration setted or your device hasnt a H264 or AAC encoder (in this case you can see log error valid encoder not found)*/
+}
+//stop stream
+rtmpCamera1.stopStream();
+
+```
+
+### RTSP:
+
+```java
+
+//default
+
+//create builder
+//by default TCP protocol.
+RtspCamera1 rtspCamera1 = new RtspCamera1(surfaceView, connectCheckerRtsp);
+//start stream
+if (rtspCamera1.prepareAudio() && rtspCamera1.prepareVideo()) {
+  rtspCamera1.startStream("rtsp://yourEndPoint");
+} else {
+ /**This device cant init encoders, this could be for 2 reasons: The encoder selected doesnt support any configuration setted or your device hasnt a H264 or AAC encoder (in this case you can see log error valid encoder not found)*/
+}
+//stop stream
+rtspCamera1.stopStream();
+
+//with params
+
+//create builder
+RtspCamera1 rtspCamera1 = new RtspCamera1(surfaceView, connectCheckerRtsp);
+rtspCamera1.setProtocol(protocol);
+//start stream
+if (rtspCamera1.prepareAudio(int bitrate, int sampleRate, boolean isStereo, boolean echoCanceler,
+      boolean noiseSuppressor) && rtspCamera1.prepareVideo(int width, int height, int fps, int bitrate, boolean hardwareRotation, int rotation)) {
+  rtspCamera1.startStream("rtsp://yourEndPoint");
+} else {
+ /**This device cant init encoders, this could be for 2 reasons: The encoder selected doesnt support any configuration setted or your device hasnt a H264 or AAC encoder (in this case you can see log error valid encoder not found)*/
+}
+//stop stream
+rtspCamera1.stopStream();
+
+```
diff --git a/rtplibrary/build.gradle b/rtplibrary/build.gradle
new file mode 100755
index 0000000..316d267
--- /dev/null
+++ b/rtplibrary/build.gradle
@@ -0,0 +1,22 @@
+apply plugin: 'com.android.library'
+apply plugin: 'com.github.dcendents.android-maven'
+
+android {
+  compileSdkVersion 28
+
+  defaultConfig {
+    minSdkVersion 23
+    versionCode 140
+    versionName "1.4.0"
+  }
+  buildTypes {
+    release {
+      minifyEnabled false
+      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+    }
+  }
+}
+
+dependencies {
+  api 'com.android.support:support-annotations:28.0.0'
+}
diff --git a/rtplibrary/proguard-rules.pro b/rtplibrary/proguard-rules.pro
new file mode 100755
index 0000000..eb15854
--- /dev/null
+++ b/rtplibrary/proguard-rules.pro
@@ -0,0 +1,25 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /home/pedro/Android/Sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/rtplibrary/src/main/AndroidManifest.xml b/rtplibrary/src/main/AndroidManifest.xml
new file mode 100755
index 0000000..fb9f368
--- /dev/null
+++ b/rtplibrary/src/main/AndroidManifest.xml
@@ -0,0 +1,12 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.pedro.rtplibrary"
+    >
+
+  <application
+      android:allowBackup="true"
+      android:label="@string/app_name"
+      android:supportsRtl="true"
+      >
+  </application>
+
+</manifest>
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/decoder/LoopFileInterface.java b/rtplibrary/src/main/java/com/pedro/encoder/input/decoder/LoopFileInterface.java
new file mode 100644
index 0000000..acf1b92
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/decoder/LoopFileInterface.java
@@ -0,0 +1,10 @@
+package com.pedro.encoder.input.decoder;
+
+/**
+ * Created by pedro on 4/03/18.
+ */
+
+public interface LoopFileInterface {
+
+  void onReset(boolean isVideo);
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/decoder/VideoDecoder.java b/rtplibrary/src/main/java/com/pedro/encoder/input/decoder/VideoDecoder.java
new file mode 100644
index 0000000..b2095aa
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/decoder/VideoDecoder.java
@@ -0,0 +1,181 @@
+package com.pedro.encoder.input.decoder;
+
+import android.media.MediaCodec;
+import android.media.MediaExtractor;
+import android.media.MediaFormat;
+import android.util.Log;
+import android.view.Surface;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+/**
+ * Created by pedro on 20/06/17.
+ */
+public class VideoDecoder {
+
+  private final String TAG = "VideoDecoder";
+
+  private VideoDecoderInterface videoDecoderInterface;
+  private LoopFileInterface loopFileInterface;
+  private MediaExtractor videoExtractor;
+  private MediaCodec videoDecoder;
+  private MediaCodec.BufferInfo videoInfo = new MediaCodec.BufferInfo();
+  private boolean decoding;
+  private Thread thread;
+  private MediaFormat videoFormat;
+  private String mime = "";
+  private int width;
+  private int height;
+  private long duration;
+  private static boolean loopMode = false;
+  private volatile long seekTime = 0;
+  private volatile long startMs = 0;
+
+  public VideoDecoder(VideoDecoderInterface videoDecoderInterface,
+                      LoopFileInterface loopFileInterface) {
+    this.videoDecoderInterface = videoDecoderInterface;
+    this.loopFileInterface = loopFileInterface;
+  }
+
+  public boolean initExtractor(String filePath) throws IOException {
+    decoding = false;
+    videoExtractor = new MediaExtractor();
+    videoExtractor.setDataSource(filePath);
+    for (int i = 0; i < videoExtractor.getTrackCount() && !mime.startsWith("video/"); i++) {
+      videoFormat = videoExtractor.getTrackFormat(i);
+      mime = videoFormat.getString(MediaFormat.KEY_MIME);
+      if (mime.startsWith("video/")) {
+        videoExtractor.selectTrack(i);
+      } else {
+        videoFormat = null;
+      }
+    }
+    if (videoFormat != null) {
+      width = videoFormat.getInteger(MediaFormat.KEY_WIDTH);
+      height = videoFormat.getInteger(MediaFormat.KEY_HEIGHT);
+      duration = videoFormat.getLong(MediaFormat.KEY_DURATION);
+      return true;
+      //video decoder not supported
+    } else {
+      mime = "";
+      videoFormat = null;
+      return false;
+    }
+  }
+
+  public boolean prepareVideo(Surface surface) {
+    try {
+      videoDecoder = MediaCodec.createDecoderByType(mime);
+      videoDecoder.configure(videoFormat, surface, null, 0);
+      return true;
+    } catch (IOException e) {
+      Log.e(TAG, "Prepare decoder error:", e);
+      return false;
+    }
+  }
+
+  public void start() {
+    decoding = true;
+    videoDecoder.start();
+    thread = new Thread(new Runnable() {
+      @Override
+      public void run() {
+        decodeVideo();
+      }
+    });
+    thread.start();
+  }
+
+  public void stop() {
+    decoding = false;
+    seekTime = 0;
+    if (thread != null) {
+      thread.interrupt();
+      try {
+        thread.join(100);
+      } catch (InterruptedException e) {
+        thread.interrupt();
+      }
+      thread = null;
+    }
+    if (videoDecoder != null) {
+      videoDecoder.stop();
+      videoDecoder.release();
+      videoDecoder = null;
+    }
+    if (videoExtractor != null) {
+      videoExtractor.release();
+      videoExtractor = null;
+    }
+  }
+
+  private void decodeVideo() {
+    ByteBuffer[] inputBuffers = videoDecoder.getInputBuffers();
+    startMs = System.currentTimeMillis();
+    while (decoding) {
+      int inIndex = videoDecoder.dequeueInputBuffer(10000);
+      if (inIndex >= 0) {
+        ByteBuffer buffer = inputBuffers[inIndex];
+        int sampleSize = videoExtractor.readSampleData(buffer, 0);
+        if (sampleSize < 0) {
+          videoDecoder.queueInputBuffer(inIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
+        } else {
+          videoDecoder.queueInputBuffer(inIndex, 0, sampleSize, videoExtractor.getSampleTime(), 0);
+          videoExtractor.advance();
+        }
+      }
+      int outIndex = videoDecoder.dequeueOutputBuffer(videoInfo, 10000);
+      if (outIndex >= 0) {
+        while (videoExtractor.getSampleTime() / 1000
+            > System.currentTimeMillis() - startMs + seekTime) {
+          try {
+            Thread.sleep(10);
+          } catch (InterruptedException e) {
+            thread.interrupt();
+            return;
+          }
+        }
+        videoDecoder.releaseOutputBuffer(outIndex, videoInfo.size != 0);
+      }
+      if ((videoInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
+        seekTime = 0;
+        Log.i(TAG, "end of file out");
+        if (loopMode) {
+          loopFileInterface.onReset(true);
+        } else {
+          videoDecoderInterface.onVideoDecoderFinished();
+        }
+      }
+    }
+  }
+
+  public double getTime() {
+    if (decoding) {
+      return videoExtractor.getSampleTime() / 10E5;
+    } else {
+      return 0;
+    }
+  }
+
+  public void moveTo(double time) {
+    videoExtractor.seekTo((long) (time * 10E5), MediaExtractor.SEEK_TO_CLOSEST_SYNC);
+    seekTime = videoExtractor.getSampleTime() / 1000;
+    startMs = System.currentTimeMillis();
+  }
+
+  public void setLoopMode(boolean loopMode) {
+    this.loopMode = loopMode;
+  }
+
+  public int getWidth() {
+    return width;
+  }
+
+  public int getHeight() {
+    return height;
+  }
+
+  public double getDuration() {
+    return duration / 10E5;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/decoder/VideoDecoderInterface.java b/rtplibrary/src/main/java/com/pedro/encoder/input/decoder/VideoDecoderInterface.java
new file mode 100644
index 0000000..e3c2eb4
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/decoder/VideoDecoderInterface.java
@@ -0,0 +1,10 @@
+package com.pedro.encoder.input.decoder;
+
+/**
+ * Created by pedro on 6/07/17.
+ */
+
+public interface VideoDecoderInterface {
+
+  void onVideoDecoderFinished();
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/Sprite.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/Sprite.java
new file mode 100644
index 0000000..a475259
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/Sprite.java
@@ -0,0 +1,174 @@
+package com.pedro.encoder.input.gl;
+
+import android.graphics.PointF;
+import com.pedro.encoder.utils.gl.TranslateTo;
+
+/**
+ * Created by pedro on 17/11/17.
+ *
+ * Sprite is drawn from top left of the image.
+ * Sprite positions in screen:
+ *
+ *  0,0     100,0
+ *    ________
+ *   |        |
+ *   |        |
+ *   | Screen |
+ *   |        |
+ *   |________|
+ *
+ *  0,100   100,100
+ */
+
+public class Sprite {
+
+  private final float[] squareVertexDataSprite = {
+      //X  Y
+      0f, 1f, //top left
+      1f, 1f, //top right
+      0f, 0f, //bottom left
+      1f, 0f, //bottom right
+  };
+  private PointF scale;
+  private PointF position;
+
+  public Sprite() {
+    reset();
+  }
+
+  /**
+   * @param deltaX Position x in percent
+   * @param deltaY Position x in percent
+   */
+  public void translate(float deltaX, float deltaY) {
+    position.x = deltaX;
+    position.y = deltaY;
+  }
+
+  /**
+   * @param translation Predefined position
+   */
+  public void translate(TranslateTo translation) {
+    switch (translation) {
+      case CENTER:
+        this.position.x = 50f - scale.x / 2f;
+        this.position.y = 50f - scale.x / 2f;
+        break;
+      case BOTTOM:
+        this.position.x = 50f - scale.x / 2f;
+        this.position.y = 100f - scale.y;
+        break;
+      case TOP:
+        this.position.x = 50f - scale.x / 2f;
+        this.position.y = 0f;
+        break;
+      case LEFT:
+        this.position.x = 0f;
+        this.position.y = 50f - scale.y / 2f;
+        break;
+      case RIGHT:
+        this.position.x = 100f - scale.x;
+        this.position.y = 50f - scale.y / 2f;
+        break;
+      case TOP_LEFT:
+        this.position.x = 0f;
+        this.position.y = 0f;
+        break;
+      case TOP_RIGHT:
+        this.position.x = 100f - scale.x;
+        this.position.y = 0f;
+        break;
+      case BOTTOM_LEFT:
+        this.position.x = 0f;
+        this.position.y = 100f - scale.y;
+        break;
+      case BOTTOM_RIGHT:
+        this.position.x = 100f - scale.x;
+        this.position.y = 100f - scale.y;
+        break;
+      default:
+        break;
+    }
+  }
+
+  /**
+   * @param deltaX Scale x in percent
+   * @param deltaY Scale y in percent
+   */
+  public void scale(float deltaX, float deltaY) {
+    //keep old position
+    position.x /= deltaX / scale.x;
+    position.y /= deltaY / scale.y;
+    //set new scale.
+    scale = new PointF(deltaX, deltaY);
+  }
+
+  /**
+   * @return Scale in percent
+   */
+  public PointF getScale() {
+    return scale;
+  }
+
+  /**
+   * @return Position in percent
+   */
+  public PointF getTranslation() {
+    return position;
+  }
+
+  public void reset() {
+    scale = new PointF(100f, 100f);
+    position = new PointF(0f, 0f);
+  }
+
+  /**
+   * @return Actual vertex of sprite.
+   */
+  public float[] getTransformedVertices() {
+    PointF bottomRight = new PointF(squareVertexDataSprite[0], squareVertexDataSprite[1]);
+    PointF bottomLeft = new PointF(squareVertexDataSprite[2], squareVertexDataSprite[3]);
+    PointF topRight = new PointF(squareVertexDataSprite[4], squareVertexDataSprite[5]);
+    PointF topLeft = new PointF(squareVertexDataSprite[6], squareVertexDataSprite[7]);
+
+    //Traduce scale to Opengl vertex values
+    float scaleX = scale.x / 100f;
+    float scaleY = scale.y / 100f;
+
+    //Scale sprite
+    bottomRight.x /= scaleX;
+    bottomRight.y /= scaleY;
+
+    bottomLeft.x /= scaleX;
+    bottomLeft.y /= scaleY;
+
+    topRight.x /= scaleX;
+    topRight.y /= scaleY;
+
+    topLeft.x /= scaleX;
+    topLeft.y /= scaleY;
+
+    //Traduce position to Opengl values
+    float positionX = -position.x / scale.x;
+    float positionY = -position.y / scale.y;
+
+    //Translate sprite
+    bottomRight.x += positionX;
+    bottomRight.y += positionY;
+
+    bottomLeft.x += positionX;
+    bottomLeft.y += positionY;
+
+    topRight.x += positionX;
+    topRight.y += positionY;
+
+    topLeft.x += positionX;
+    topLeft.y += positionY;
+
+    //Recreate vertex like initial vertex.
+    return new float[] {
+        bottomRight.x, bottomRight.y, bottomLeft.x, bottomLeft.y, topRight.x, topRight.y, topLeft.x,
+        topLeft.y,
+    };
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/SpriteGestureController.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/SpriteGestureController.java
new file mode 100644
index 0000000..f8b25f9
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/SpriteGestureController.java
@@ -0,0 +1,65 @@
+package com.pedro.encoder.input.gl;
+
+import android.graphics.PointF;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.view.MotionEvent;
+import android.view.View;
+import com.pedro.encoder.input.gl.render.filters.object.BaseObjectFilterRender;
+import com.pedro.encoder.input.video.CameraHelper;
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class SpriteGestureController {
+
+  private BaseObjectFilterRender baseObjectFilterRender;
+  private float lastDistance;
+
+  public SpriteGestureController() {
+  }
+
+  public SpriteGestureController(BaseObjectFilterRender sprite) {
+    this.baseObjectFilterRender = sprite;
+  }
+
+  public BaseObjectFilterRender getBaseObjectFilterRender() {
+    return baseObjectFilterRender;
+  }
+
+  public void setBaseObjectFilterRender(BaseObjectFilterRender baseObjectFilterRender) {
+    this.baseObjectFilterRender = baseObjectFilterRender;
+  }
+
+  public boolean spriteTouched(View view, MotionEvent motionEvent) {
+    if (baseObjectFilterRender == null) return false;
+    float xPercent = motionEvent.getX() * 100 / view.getWidth();
+    float yPercent = motionEvent.getY() * 100 / view.getHeight();
+    PointF scale = baseObjectFilterRender.getScale();
+    PointF position = baseObjectFilterRender.getPosition();
+    boolean xTouched = xPercent >= position.x && xPercent <= position.x + scale.x;
+    boolean yTouched = yPercent >= position.y && yPercent <= position.y + scale.y;
+    return xTouched && yTouched;
+  }
+
+  public void moveSprite(View view, MotionEvent motionEvent) {
+    if (baseObjectFilterRender == null) return;
+    if (motionEvent.getPointerCount() == 1) {
+      float xPercent = motionEvent.getX() * 100 / view.getWidth();
+      float yPercent = motionEvent.getY() * 100 / view.getHeight();
+      PointF scale = baseObjectFilterRender.getScale();
+      baseObjectFilterRender.setPosition(xPercent - scale.x / 2f, yPercent - scale.y / 2f);
+    }
+  }
+
+  public void scaleSprite(MotionEvent motionEvent) {
+    if (baseObjectFilterRender == null) return;
+    if (motionEvent.getPointerCount() > 1) {
+      float distance = CameraHelper.getFingerSpacing(motionEvent);
+      float percent = distance >= lastDistance ? 1 : -1;
+      PointF scale = baseObjectFilterRender.getScale();
+      scale.x += percent;
+      scale.y += percent;
+      baseObjectFilterRender.setScale(scale.x, scale.y);
+      lastDistance = distance;
+    }
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/SurfaceManager.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/SurfaceManager.java
new file mode 100644
index 0000000..5819aae
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/SurfaceManager.java
@@ -0,0 +1,162 @@
+package com.pedro.encoder.input.gl;
+
+import android.opengl.EGL14;
+import android.opengl.EGLConfig;
+import android.opengl.EGLContext;
+import android.opengl.EGLDisplay;
+import android.opengl.EGLExt;
+import android.opengl.EGLSurface;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.util.Log;
+import android.view.Surface;
+import com.pedro.encoder.utils.gl.GlUtil;
+
+/**
+ * Created by pedro on 9/09/17.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class SurfaceManager {
+
+  private static final int EGL_RECORDABLE_ANDROID = 0x3142;
+
+  private EGLContext eglContext = null;
+  private EGLSurface eglSurface = null;
+  private EGLDisplay eglDisplay = null;
+
+  /**
+   * Creates an EGL context and an EGL surface.
+   */
+  public SurfaceManager(Surface surface, SurfaceManager manager) {
+    eglSetup(surface, manager.eglContext);
+  }
+
+  /**
+   * Creates an EGL context and an EGL surface.
+   */
+  public SurfaceManager(Surface surface, EGLContext eglContext) {
+    eglSetup(surface, eglContext);
+  }
+
+  /**
+   * Creates an EGL context and an EGL surface.
+   */
+  public SurfaceManager(Surface surface) {
+    eglSetup(surface, null);
+  }
+
+  public SurfaceManager() {
+    eglSetup(null, null);
+  }
+
+  public void makeCurrent() {
+    if (!EGL14.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) {
+      Log.e("Error", "eglMakeCurrent failed");
+    }
+  }
+
+  public void swapBuffer() {
+    EGL14.eglSwapBuffers(eglDisplay, eglSurface);
+  }
+
+  /**
+   * Sends the presentation time stamp to EGL.  Time is expressed in nanoseconds.
+   */
+  public void setPresentationTime(long nsecs) {
+    EGLExt.eglPresentationTimeANDROID(eglDisplay, eglSurface, nsecs);
+    GlUtil.checkEglError("eglPresentationTimeANDROID");
+  }
+
+  /**
+   * Prepares EGL.  We want a GLES 2.0 context and a surface that supports recording.
+   */
+  private void eglSetup(Surface surface, EGLContext eglSharedContext) {
+    eglDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
+    if (eglDisplay == EGL14.EGL_NO_DISPLAY) {
+      throw new RuntimeException("unable to get EGL14 display");
+    }
+    int[] version = new int[2];
+    if (!EGL14.eglInitialize(eglDisplay, version, 0, version, 1)) {
+      throw new RuntimeException("unable to initialize EGL14");
+    }
+
+    // Configure EGL for recording and OpenGL ES 2.0.
+    int[] attribList;
+    if (eglSharedContext == null) {
+      attribList = new int[] {
+          EGL14.EGL_RED_SIZE, 8, EGL14.EGL_GREEN_SIZE, 8, EGL14.EGL_BLUE_SIZE, 8,
+          EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT,
+          /* AA https://stackoverflow.com/questions/27035893/antialiasing-in-opengl-es-2-0 */
+          //EGL14.EGL_SAMPLE_BUFFERS, 1 /* true */,
+          //EGL14.EGL_SAMPLES, 4, /* increase to more smooth limit of your GPU */
+          EGL14.EGL_NONE
+      };
+    } else {
+      attribList = new int[] {
+          EGL14.EGL_RED_SIZE, 8, EGL14.EGL_GREEN_SIZE, 8, EGL14.EGL_BLUE_SIZE, 8,
+          EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT, EGL_RECORDABLE_ANDROID, 1,
+          /* AA https://stackoverflow.com/questions/27035893/antialiasing-in-opengl-es-2-0 */
+          //EGL14.EGL_SAMPLE_BUFFERS, 1 /* true */,
+          //EGL14.EGL_SAMPLES, 4, /* increase to more smooth limit of your GPU */
+          EGL14.EGL_NONE
+      };
+    }
+    EGLConfig[] configs = new EGLConfig[1];
+    int[] numConfigs = new int[1];
+    EGL14.eglChooseConfig(eglDisplay, attribList, 0, configs, 0, configs.length, numConfigs, 0);
+    GlUtil.checkEglError("eglCreateContext RGB888+recordable ES2");
+
+    // Configure context for OpenGL ES 2.0.
+    int[] attrib_list = {
+        EGL14.EGL_CONTEXT_CLIENT_VERSION, 2, EGL14.EGL_NONE
+    };
+
+    eglContext = EGL14.eglCreateContext(eglDisplay, configs[0],
+        eglSharedContext == null ? EGL14.EGL_NO_CONTEXT : eglSharedContext, attrib_list, 0);
+    GlUtil.checkEglError("eglCreateContext");
+
+    // Create a window surface, and attach it to the Surface we received.
+    if (surface == null) {
+      int[] surfaceAttribs = {
+          EGL14.EGL_WIDTH, 1, EGL14.EGL_HEIGHT, 1, EGL14.EGL_NONE
+      };
+      eglSurface = EGL14.eglCreatePbufferSurface(eglDisplay, configs[0], surfaceAttribs, 0);
+    } else {
+      int[] surfaceAttribs = {
+          EGL14.EGL_NONE
+      };
+      eglSurface = EGL14.eglCreateWindowSurface(eglDisplay, configs[0], surface, surfaceAttribs, 0);
+    }
+    GlUtil.checkEglError("eglCreateWindowSurface");
+  }
+
+  /**
+   * Discards all resources held by this class, notably the EGL context.
+   */
+  public void release() {
+    if (eglDisplay != EGL14.EGL_NO_DISPLAY) {
+      EGL14.eglMakeCurrent(eglDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE,
+          EGL14.EGL_NO_CONTEXT);
+      EGL14.eglDestroySurface(eglDisplay, eglSurface);
+      EGL14.eglDestroyContext(eglDisplay, eglContext);
+      EGL14.eglReleaseThread();
+      EGL14.eglTerminate(eglDisplay);
+    }
+    eglDisplay = EGL14.EGL_NO_DISPLAY;
+    eglContext = EGL14.EGL_NO_CONTEXT;
+    eglSurface = EGL14.EGL_NO_SURFACE;
+  }
+
+  public EGLContext getEglContext() {
+    return eglContext;
+  }
+
+  public EGLSurface getEglSurface() {
+    return eglSurface;
+  }
+
+  public EGLDisplay getEglDisplay() {
+    return eglDisplay;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/TextureLoader.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/TextureLoader.java
new file mode 100644
index 0000000..6c45f5b
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/TextureLoader.java
@@ -0,0 +1,75 @@
+package com.pedro.encoder.input.gl;
+
+import android.opengl.GLES20;
+import android.opengl.GLUtils;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.encoder.utils.gl.GlUtil;
+import com.pedro.encoder.utils.gl.GifStreamObject;
+import com.pedro.encoder.utils.gl.ImageStreamObject;
+import com.pedro.encoder.utils.gl.TextStreamObject;
+
+/**
+ * Created by pedro on 9/10/17.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class TextureLoader {
+
+  private TextStreamObject textStreamObject;
+  private GifStreamObject gifStreamObject;
+  private ImageStreamObject imageStreamObject;
+  private int[] textureId;
+
+  public TextureLoader() {
+  }
+
+  public void setTextStreamObject(TextStreamObject textStreamObject) {
+    this.textStreamObject = textStreamObject;
+    this.gifStreamObject = null;
+    this.imageStreamObject = null;
+  }
+
+  public void setGifStreamObject(GifStreamObject gifStreamObject) {
+    this.gifStreamObject = gifStreamObject;
+    this.textStreamObject = null;
+    this.imageStreamObject = null;
+  }
+
+  public void setImageStreamObject(ImageStreamObject imageStreamObject) {
+    this.imageStreamObject = imageStreamObject;
+    this.gifStreamObject = null;
+    this.textStreamObject = null;
+  }
+
+  public int[] load() {
+    if (textStreamObject != null) {
+      textureId = new int[textStreamObject.getNumFrames()];
+      GlUtil.createTextures(textStreamObject.getNumFrames(), textureId, 0);
+      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId[0]);
+      GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, textStreamObject.getImageBitmap(), 0);
+      textStreamObject.recycle();
+    } else if (imageStreamObject != null) {
+      textureId = new int[imageStreamObject.getNumFrames()];
+      GlUtil.createTextures(imageStreamObject.getNumFrames(), textureId, 0);
+      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId[0]);
+      GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, imageStreamObject.getImageBitmap(), 0);
+      imageStreamObject.recycle();
+    } else if (gifStreamObject != null) {
+      textureId = new int[gifStreamObject.getNumFrames()];
+      GlUtil.createTextures(gifStreamObject.getNumFrames(), textureId, 0);
+      for (int i = 0; i < gifStreamObject.getNumFrames(); i++) {
+        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId[i]);
+        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, gifStreamObject.getGifBitmaps()[i], 0);
+      }
+      gifStreamObject.recycle();
+    } else {
+      textureId = new int[] { -1 };
+    }
+    return textureId;
+  }
+
+  public void clear() {
+
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/BaseRenderOffScreen.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/BaseRenderOffScreen.java
new file mode 100644
index 0000000..e0c5f9f
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/BaseRenderOffScreen.java
@@ -0,0 +1,79 @@
+package com.pedro.encoder.input.gl.render;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.FloatBuffer;
+
+/**
+ * Created by pedro on 29/01/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public abstract class BaseRenderOffScreen {
+
+  protected FloatBuffer squareVertex;
+
+  public static final int FLOAT_SIZE_BYTES = 4;
+  public static final int SQUARE_VERTEX_DATA_STRIDE_BYTES = 5 * FLOAT_SIZE_BYTES;
+  public static final int SQUARE_VERTEX_DATA_POS_OFFSET = 0;
+  public static final int SQUARE_VERTEX_DATA_UV_OFFSET = 3;
+
+  protected float[] MVPMatrix = new float[16];
+  protected float[] STMatrix = new float[16];
+
+  protected RenderHandler renderHandler = new RenderHandler();
+
+  protected int width;
+  protected int height;
+
+  public abstract void initGl(int width, int height, Context context);
+
+  public abstract void draw();
+
+  public abstract void release();
+
+  public int getTexId() {
+    return renderHandler.getTexId()[0];
+  }
+
+  protected void initFBO(int width, int height) {
+    initFBO(width, height, renderHandler.getFboId(), renderHandler.getRboId(),
+        renderHandler.getTexId());
+  }
+
+  protected void initFBO(int width, int height, int[] fboId, int[] rboId, int[] texId) {
+    GlUtil.checkGlError("initFBO_S");
+
+    GLES20.glGenFramebuffers(1, fboId, 0);
+    GLES20.glGenRenderbuffers(1, rboId, 0);
+    GLES20.glGenTextures(1, texId, 0);
+
+    GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, rboId[0]);
+    GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16, width,
+        height);
+    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboId[0]);
+    GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT,
+        GLES20.GL_RENDERBUFFER, rboId[0]);
+
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE3);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texId[0]);
+    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
+    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
+    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
+    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
+
+    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA,
+        GLES20.GL_UNSIGNED_BYTE, null);
+    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,
+        GLES20.GL_TEXTURE_2D, texId[0], 0);
+
+    int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);
+    if (status != GLES20.GL_FRAMEBUFFER_COMPLETE) {
+      throw new RuntimeException("FrameBuffer uncompleted code: " + status);
+    }
+    GlUtil.checkGlError("initFBO_E");
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/CameraRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/CameraRender.java
new file mode 100644
index 0000000..9df5648
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/CameraRender.java
@@ -0,0 +1,129 @@
+package com.pedro.encoder.input.gl.render;
+
+import android.content.Context;
+import android.graphics.SurfaceTexture;
+import android.opengl.GLES11Ext;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.view.Surface;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.input.video.CameraHelper;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 29/01/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class CameraRender extends BaseRenderOffScreen {
+
+  private int[] textureID = new int[1];
+
+  private int program = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int aPositionHandle = -1;
+  private int aTextureCameraHandle = -1;
+  private int uOnFlipHandle = -1;
+
+  private SurfaceTexture surfaceTexture;
+  private Surface surface;
+  private boolean isFlipHorizontal = false, isFlipVertical = false;
+
+  public CameraRender() {
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  public void initGl(int width, int height, Context context) {
+    this.width = width;
+    this.height = height;
+    GlUtil.checkGlError("initGl start");
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.camera_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureCameraHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uOnFlipHandle = GLES20.glGetUniformLocation(program, "uOnFlip");
+
+    //camera texture
+    GlUtil.createExternalTextures(1, textureID, 0);
+    surfaceTexture = new SurfaceTexture(textureID[0]);
+    surfaceTexture.setDefaultBufferSize(width, height);
+    surface = new Surface(surfaceTexture);
+    initFBO(width, height);
+    GlUtil.checkGlError("initGl end");
+  }
+
+  @Override
+  public void draw() {
+    GlUtil.checkGlError("drawCamera start");
+    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, renderHandler.getFboId()[0]);
+
+    surfaceTexture.getTransformMatrix(STMatrix);
+    GLES20.glViewport(0, 0, width, height);
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureCameraHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureCameraHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform2f(uOnFlipHandle, isFlipHorizontal ? 1f : 0f, isFlipVertical ? 1f : 0f);
+    //camera
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
+    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureID[0]);
+    //draw
+    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
+
+    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
+    GlUtil.checkGlError("drawCamera end");
+  }
+
+  @Override
+  public void release() {
+    surfaceTexture = null;
+    surface = null;
+  }
+
+  public void updateTexImage() {
+    surfaceTexture.updateTexImage();
+  }
+
+  public SurfaceTexture getSurfaceTexture() {
+    return surfaceTexture;
+  }
+
+  public Surface getSurface() {
+    return surface;
+  }
+
+  public void setRotation(int rotation) {
+    float[] vertex = CameraHelper.getVertex(rotation);
+    squareVertex = ByteBuffer.allocateDirect(vertex.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(vertex).position(0);
+  }
+
+  public void setFlip(boolean isFlipHorizontal, boolean isFlipVertical) {
+    this.isFlipHorizontal = isFlipHorizontal;
+    this.isFlipVertical = isFlipVertical;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/ManagerRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/ManagerRender.java
new file mode 100644
index 0000000..9412b9d
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/ManagerRender.java
@@ -0,0 +1,109 @@
+package com.pedro.encoder.input.gl.render;
+
+import android.content.Context;
+import android.graphics.SurfaceTexture;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.view.Surface;
+import com.pedro.encoder.input.gl.render.filters.BaseFilterRender;
+import com.pedro.encoder.input.gl.render.filters.NoFilterRender;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by pedro on 27/01/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class ManagerRender {
+
+  //Increase it to render more than 1 filter and set filter by position.
+  // You must modify it before create your rtmp or rtsp object.
+  public static int numFilters = 1;
+
+  private CameraRender cameraRender;
+  private List<BaseFilterRender> baseFilterRender = new ArrayList<>(numFilters);
+  private ScreenRender screenRender;
+
+  private int width;
+  private int height;
+  private Context context;
+
+  public ManagerRender() {
+    cameraRender = new CameraRender();
+    for (int i = 0; i < numFilters; i++) baseFilterRender.add(new NoFilterRender());
+    screenRender = new ScreenRender();
+  }
+
+  public void initGl(int width, int height, Context context) {
+    this.width = width;
+    this.height = height;
+    this.context = context;
+    cameraRender.initGl(width, height, context);
+    for (int i = 0; i < numFilters; i++) {
+      int textId = i == 0 ? cameraRender.getTexId() : baseFilterRender.get(i - 1).getTexId();
+      baseFilterRender.get(i).setPreviousTexId(textId);
+      baseFilterRender.get(i).initGl(width, height, context);
+      baseFilterRender.get(i).initFBOLink();
+    }
+    screenRender.setTexId(baseFilterRender.get(numFilters - 1).getTexId());
+    screenRender.initGl(context);
+  }
+
+  public void drawOffScreen() {
+    cameraRender.draw();
+    for (BaseFilterRender baseFilterRender : baseFilterRender) baseFilterRender.draw();
+  }
+
+  public void drawScreen(int width, int height, boolean keepAspectRatio) {
+    screenRender.draw(width, height, keepAspectRatio);
+  }
+
+  public void release() {
+    cameraRender.release();
+    for (BaseFilterRender baseFilterRender : baseFilterRender) baseFilterRender.release();
+    screenRender.release();
+  }
+
+  public void enableAA(boolean AAEnabled) {
+    screenRender.setAAEnabled(AAEnabled);
+  }
+
+  public boolean isAAEnabled() {
+    return screenRender.isAAEnabled();
+  }
+
+  public void updateFrame() {
+    cameraRender.updateTexImage();
+  }
+
+  public SurfaceTexture getSurfaceTexture() {
+    return cameraRender.getSurfaceTexture();
+  }
+
+  public Surface getSurface() {
+    return cameraRender.getSurface();
+  }
+
+  public void setFilter(int position, BaseFilterRender baseFilterRender) {
+    final int id = this.baseFilterRender.get(position).getPreviousTexId();
+    final RenderHandler renderHandler = this.baseFilterRender.get(position).getRenderHandler();
+    this.baseFilterRender.get(position).release();
+    this.baseFilterRender.set(position, baseFilterRender);
+    this.baseFilterRender.get(position).initGl(width, height, context);
+    this.baseFilterRender.get(position).setPreviousTexId(id);
+    this.baseFilterRender.get(position).setRenderHandler(renderHandler);
+  }
+
+  public void setStreamSize(int encoderWidth, int encoderHeight) {
+    screenRender.setStreamSize(encoderWidth, encoderHeight);
+  }
+
+  public void setCameraRotation(int rotation) {
+    cameraRender.setRotation(rotation);
+  }
+
+  public void setCameraFlip(boolean isFlipHorizontal, boolean isFlipVertical) {
+    cameraRender.setFlip(isFlipHorizontal, isFlipVertical);
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/RenderHandler.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/RenderHandler.java
new file mode 100644
index 0000000..f9905af
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/RenderHandler.java
@@ -0,0 +1,32 @@
+package com.pedro.encoder.input.gl.render;
+
+public class RenderHandler {
+
+  private int[] fboId = new int[] { 0 };
+  private int[] rboId = new int[] { 0 };
+  private int[] texId = new int[] { 0 };
+
+  public int[] getTexId() {
+    return texId;
+  }
+
+  public int[] getFboId() {
+    return fboId;
+  }
+
+  public int[] getRboId() {
+    return rboId;
+  }
+
+  public void setFboId(int[] fboId) {
+    this.fboId = fboId;
+  }
+
+  public void setRboId(int[] rboId) {
+    this.rboId = rboId;
+  }
+
+  public void setTexId(int[] texId) {
+    this.texId = texId;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/ScreenRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/ScreenRender.java
new file mode 100644
index 0000000..d9b20e0
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/ScreenRender.java
@@ -0,0 +1,139 @@
+package com.pedro.encoder.input.gl.render;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+/**
+ * Created by pedro on 29/01/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class ScreenRender {
+
+  //rotation matrix
+  private final float[] squareVertexData = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private FloatBuffer squareVertex;
+
+  private float[] MVPMatrix = new float[16];
+  private float[] STMatrix = new float[16];
+  private boolean AAEnabled = false;  //FXAA enable/disable
+
+  private int texId;
+
+  private int program = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uResolutionHandle = -1;
+  private int uAAEnabledHandle = -1;
+
+  private int streamWidth;
+  private int streamHeight;
+
+  public ScreenRender() {
+    squareVertex =
+        ByteBuffer.allocateDirect(squareVertexData.length * BaseRenderOffScreen.FLOAT_SIZE_BYTES)
+            .order(ByteOrder.nativeOrder())
+            .asFloatBuffer();
+    squareVertex.put(squareVertexData).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  public void initGl(Context context) {
+    GlUtil.checkGlError("initGl start");
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.fxaa);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution");
+    uAAEnabledHandle = GLES20.glGetUniformLocation(program, "uAAEnabled");
+    GlUtil.checkGlError("initGl end");
+  }
+
+  public void draw(int width, int height, boolean keepAspectRatio) {
+    GlUtil.checkGlError("drawScreen start");
+
+    if (keepAspectRatio) {
+      if (width > height) { //landscape
+        int realWidth = height * streamWidth / streamHeight;
+        GLES20.glViewport((width - realWidth) / 2, 0, realWidth, height);
+      } else { //portrait
+        int realHeight = width * streamHeight / streamWidth;
+        GLES20.glViewport(0, (height - realHeight) / 2, width, realHeight);
+      }
+    } else {
+      GLES20.glViewport(0, 0, width, height);
+    }
+    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(BaseRenderOffScreen.SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        BaseRenderOffScreen.SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(BaseRenderOffScreen.SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        BaseRenderOffScreen.SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform2f(uResolutionHandle, width, height);
+    GLES20.glUniform1f(uAAEnabledHandle, AAEnabled ? 1f : 0f);
+
+    GLES20.glUniform1i(uSamplerHandle, 5);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE5);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texId);
+    //draw
+    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
+
+    GlUtil.checkGlError("drawScreen end");
+  }
+
+  public void release() {
+
+  }
+
+  public void setTexId(int texId) {
+    this.texId = texId;
+  }
+
+  public void setAAEnabled(boolean AAEnabled) {
+    this.AAEnabled = AAEnabled;
+  }
+
+  public boolean isAAEnabled() {
+    return AAEnabled;
+  }
+
+  public void setStreamSize(int streamWidth, int streamHeight) {
+    this.streamWidth = streamWidth;
+    this.streamHeight = streamHeight;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/SimpleCameraRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/SimpleCameraRender.java
new file mode 100644
index 0000000..ff3e670
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/SimpleCameraRender.java
@@ -0,0 +1,160 @@
+package com.pedro.encoder.input.gl.render;
+
+import android.content.Context;
+import android.graphics.SurfaceTexture;
+import android.opengl.GLES11Ext;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.view.Surface;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.input.video.CameraHelper;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+/**
+ * Created by pedro on 21/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class SimpleCameraRender {
+  public final static String TAG = "SimpleCameraRender";
+
+  private static final int FLOAT_SIZE_BYTES = 4;
+  private static final int SQUARE_VERTEX_DATA_STRIDE_BYTES = 5 * FLOAT_SIZE_BYTES;
+  private static final int SQUARE_VERTEX_DATA_POS_OFFSET = 0;
+  private static final int SQUARE_VERTEX_DATA_UV_OFFSET = 3;
+
+  private FloatBuffer squareVertex;
+
+  private float[] MVPMatrix = new float[16];
+  private float[] STMatrix = new float[16];
+
+  private int[] texturesID = new int[1];
+
+  private int program = -1;
+  private int textureID = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int aPositionHandle = -1;
+  private int aTextureCoordHandle = -1;
+  private int uOnFlipHandle = -1;
+
+  private SurfaceTexture surfaceTexture;
+  private Surface surface;
+  private int streamWidth;
+  private int streamHeight;
+  private boolean isFlipHorizontal = false, isFlipVertical = false;
+
+  public SimpleCameraRender() {
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  public void setRotation(int rotation) {
+    float[] vertex = CameraHelper.getVertex(rotation);
+    squareVertex = ByteBuffer.allocateDirect(vertex.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(vertex).position(0);
+  }
+
+  public int getTextureId() {
+    return textureID;
+  }
+
+  public SurfaceTexture getSurfaceTexture() {
+    return surfaceTexture;
+  }
+
+  public Surface getSurface() {
+    return surface;
+  }
+
+  public void updateFrame() {
+    surfaceTexture.updateTexImage();
+  }
+
+  public void drawFrame(int width, int height, boolean keepAspectRatio) {
+    GlUtil.checkGlError("drawFrame start");
+    surfaceTexture.getTransformMatrix(STMatrix);
+
+    if (keepAspectRatio) {
+      if (width > height) { //landscape
+        int realWidth = height * streamWidth / streamHeight;
+        GLES20.glViewport((width - realWidth) / 2, 0, realWidth, height);
+      } else { //portrait
+        int realHeight = width * streamHeight / streamWidth;
+        GLES20.glViewport(0, (height - realHeight) / 2, width, realHeight);
+      }
+    } else {
+      GLES20.glViewport(0, 0, width, height);
+    }
+    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureCoordHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureCoordHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform2f(uOnFlipHandle, isFlipHorizontal ? 1f : 0f, isFlipVertical ? 1f : 0f);
+    //camera
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
+    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureID);
+    //draw
+    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
+    GlUtil.checkGlError("drawFrame end");
+  }
+
+  /**
+   * Initializes GL state.  Call this after the EGL surface has been created and made current.
+   */
+  public void initGl(Context context) {
+    GlUtil.checkGlError("initGl start");
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.camera_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureCoordHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uOnFlipHandle = GLES20.glGetUniformLocation(program, "uOnFlip");
+
+    //camera texture
+    GlUtil.createExternalTextures(1, texturesID, 0);
+    textureID = texturesID[0];
+
+    surfaceTexture = new SurfaceTexture(textureID);
+    surface = new Surface(surfaceTexture);
+    GlUtil.checkGlError("initGl end");
+  }
+
+  public void release() {
+    surfaceTexture = null;
+    surface = null;
+  }
+
+  public void setStreamSize(int streamWidth, int streamHeight) {
+    this.streamWidth = streamWidth;
+    this.streamHeight = streamHeight;
+  }
+
+  public void setFlip(boolean isFlipHorizontal, boolean isFlipVertical) {
+    this.isFlipHorizontal = isFlipHorizontal;
+    this.isFlipVertical = isFlipVertical;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/AndroidViewFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/AndroidViewFilterRender.java
new file mode 100644
index 0000000..e1d5af8
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/AndroidViewFilterRender.java
@@ -0,0 +1,132 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.PorterDuff;
+import android.graphics.SurfaceTexture;
+import android.opengl.GLES11Ext;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Looper;
+import android.support.annotation.RequiresApi;
+import android.view.Surface;
+import android.view.View;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 4/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class AndroidViewFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uSamplerViewHandle = -1;
+
+  private int[] viewId = new int[1];
+  private View view;
+  private SurfaceTexture surfaceTexture;
+  private Surface surface;
+  private Handler mainHandler;
+
+  public AndroidViewFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+    mainHandler = new Handler(Looper.getMainLooper());
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.android_view_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uSamplerViewHandle = GLES20.glGetUniformLocation(program, "uSamplerView");
+
+    GlUtil.createExternalTextures(1, viewId, 0);
+    surfaceTexture = new SurfaceTexture(viewId[0]);
+    surface = new Surface(surfaceTexture);
+  }
+
+  @Override
+  protected void drawFilter() {
+    surfaceTexture.setDefaultBufferSize(getWidth(), getHeight());
+    if (view != null) {
+      mainHandler.post(new Runnable() {
+        @Override
+        public void run() {
+          Canvas canvas = surface.lockCanvas(null);
+          canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
+          view.draw(canvas);
+          surface.unlockCanvasAndPost(canvas);
+        }
+      });
+    }
+    surfaceTexture.updateTexImage();
+
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+    //android view
+    GLES20.glUniform1i(uSamplerViewHandle, 5);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE5);
+    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, viewId[0]);
+  }
+
+  @Override
+  public void release() {
+
+  }
+
+  public View getView() {
+    return view;
+  }
+
+  public void setView(final View view) {
+    this.view = view;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BaseFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BaseFilterRender.java
new file mode 100644
index 0000000..20525bc
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BaseFilterRender.java
@@ -0,0 +1,79 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.encoder.input.gl.render.BaseRenderOffScreen;
+import com.pedro.encoder.input.gl.render.RenderHandler;
+import com.pedro.encoder.utils.gl.GlUtil;
+
+/**
+ * Created by pedro on 29/01/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public abstract class BaseFilterRender extends BaseRenderOffScreen {
+
+  private int width;
+  private int height;
+
+  protected int previousTexId;
+  private RenderHandler renderHandler = new RenderHandler();
+
+  public void initGl(int width, int height, Context context) {
+    this.width = width;
+    this.height = height;
+    GlUtil.checkGlError("initGl start");
+    initGlFilter(context);
+    GlUtil.checkGlError("initGl end");
+  }
+
+  public void initFBOLink() {
+    initFBO(width, height, renderHandler.getFboId(), renderHandler.getRboId(),
+        renderHandler.getTexId());
+  }
+
+  protected abstract void initGlFilter(Context context);
+
+  public void draw() {
+    GlUtil.checkGlError("drawFilter start");
+    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, renderHandler.getFboId()[0]);
+    GLES20.glViewport(0, 0, width, height);
+    drawFilter();
+    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
+    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
+    GlUtil.checkGlError("drawFilter end");
+  }
+
+  protected abstract void drawFilter();
+
+  public void setPreviousTexId(int texId) {
+    this.previousTexId = texId;
+  }
+
+  @Override
+  public int getTexId() {
+    return renderHandler.getTexId()[0];
+  }
+
+  protected int getWidth() {
+    return width;
+  }
+
+  protected int getHeight() {
+    return height;
+  }
+
+  public int getPreviousTexId() {
+    return previousTexId;
+  }
+
+  public RenderHandler getRenderHandler() {
+    return renderHandler;
+  }
+
+  public void setRenderHandler(RenderHandler renderHandler) {
+    this.renderHandler = renderHandler;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BasicDeformationFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BasicDeformationFilterRender.java
new file mode 100644
index 0000000..7c44a3c
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BasicDeformationFilterRender.java
@@ -0,0 +1,90 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 4/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class BasicDeformationFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uTimeHandle = -1;
+
+  private final long START_TIME = System.currentTimeMillis();
+
+  public BasicDeformationFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.basic_deformation_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uTimeHandle = GLES20.glGetUniformLocation(program, "uTime");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    float time = ((float) (System.currentTimeMillis() - START_TIME)) / 1000.0f;
+    GLES20.glUniform1f(uTimeHandle, time);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BeautyFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BeautyFilterRender.java
new file mode 100644
index 0000000..59559c6
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BeautyFilterRender.java
@@ -0,0 +1,87 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 7/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class BeautyFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uResolutionHandle = -1;
+
+  public BeautyFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.beauty_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform2f(uResolutionHandle, 2f / getWidth(), 2f / getHeight());
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BlurFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BlurFilterRender.java
new file mode 100644
index 0000000..9712884
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BlurFilterRender.java
@@ -0,0 +1,103 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 4/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class BlurFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uBlurHandle = -1;
+  private int uResolutionHandle = -1;
+
+  private float blur = 40f;
+
+  public BlurFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.blur_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uBlurHandle = GLES20.glGetUniformLocation(program, "uBlur");
+    uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform1f(uBlurHandle, blur);
+    GLES20.glUniform2f(uResolutionHandle, getWidth(), getHeight());
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+
+  public float getBlur() {
+    return blur;
+  }
+
+  /**
+   * @param blur Range should be between 0.0 or more with 0.0 being normal.
+   */
+  public void setBlur(float blur) {
+    this.blur = blur;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BrightnessFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BrightnessFilterRender.java
new file mode 100644
index 0000000..faf04e1
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/BrightnessFilterRender.java
@@ -0,0 +1,100 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 31/01/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class BrightnessFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uBrightnessHandle = -1;
+
+  private float brightness = 0.5f;
+
+  public BrightnessFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.brightness_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uBrightnessHandle = GLES20.glGetUniformLocation(program, "uBrightness");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform1f(uBrightnessHandle, brightness);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+
+  public float getBrightness() {
+    return brightness;
+  }
+
+  /**
+   * @param brightness Range should be between 0.1 - 2.0 with 1.0 being normal.
+   */
+  public void setBrightness(float brightness) {
+    this.brightness = brightness;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/CartoonFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/CartoonFilterRender.java
new file mode 100644
index 0000000..2024d2a
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/CartoonFilterRender.java
@@ -0,0 +1,97 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 4/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class CartoonFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uCartoonHandle = -1;
+
+  private float cartoon = 0.007f;
+
+  public CartoonFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.cartoon_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uCartoonHandle = GLES20.glGetUniformLocation(program, "uCartoon");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform1f(uCartoonHandle, cartoon);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+
+  public float getCartoon() {
+    return cartoon;
+  }
+
+  public void setCartoon(float cartoon) {
+    this.cartoon = cartoon;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/ColorFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/ColorFilterRender.java
new file mode 100644
index 0000000..0db82c5
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/ColorFilterRender.java
@@ -0,0 +1,145 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Created by pedro on 30/01/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class ColorFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uColorHandle = -1;
+
+  private static final String HEX_PATTERN = "^#([A-Fa-f0-9]{6})$";
+
+  //by default tint with blue
+  private float red = 0f;
+  private float green = 0f;
+  private float blue = 1f;
+
+  public ColorFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.color_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uColorHandle = GLES20.glGetUniformLocation(program, "uColor");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform3f(uColorHandle, red, green, blue);
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+
+  public float getRed() {
+    return red;
+  }
+
+  public float getGreen() {
+    return green;
+  }
+
+  public float getBlue() {
+    return blue;
+  }
+
+  /**
+   * @param rgbHexColor color represented with 7 characters (1 to start with #, 2 for red, 2 for
+   * green and 2 for blue)
+   */
+  public void setRGBColor(String rgbHexColor) {
+    Pattern pattern = Pattern.compile(HEX_PATTERN);
+    Matcher matcher = pattern.matcher(rgbHexColor);
+    if (!matcher.matches()) {
+      throw new IllegalArgumentException(
+          "Invalid hexColor pattern (Should be: " + HEX_PATTERN + ")");
+    }
+    int r = Integer.valueOf(rgbHexColor.substring(1, 3), 16);
+    int g = Integer.valueOf(rgbHexColor.substring(3, 5), 16);
+    int b = Integer.valueOf(rgbHexColor.substring(5, 7), 16);
+    red = (float) r / 255.0f;
+    green = (float) g / 255.0f;
+    blue = (float) b / 255.0f;
+  }
+
+  /**
+   * Values range 0 to 255
+   */
+  public void setRGBColor(int r, int g, int b) {
+    red = (float) r / 255.0f;
+    green = (float) g / 255.0f;
+    blue = (float) b / 255.0f;
+  }
+
+  /**
+   * Get string color from color file resource and strip alpha values (alpha values is always auto
+   * completed)
+   */
+  public void setColor(Resources resources, int colorResource) {
+    String color = resources.getString(colorResource);
+    setRGBColor("#" + color.substring(3));
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/ContrastFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/ContrastFilterRender.java
new file mode 100644
index 0000000..2c3ed6e
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/ContrastFilterRender.java
@@ -0,0 +1,100 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 31/01/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class ContrastFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uContrastHandle = -1;
+
+  private float contrast = 0.5f;
+
+  public ContrastFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.contrast_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uContrastHandle = GLES20.glGetUniformLocation(program, "uContrast");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform1f(uContrastHandle, contrast);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+
+  public float getContrast() {
+    return contrast;
+  }
+
+  /**
+   * @param contrast Range should be between 0.1 - 2.0 with 1.0 being normal.
+   */
+  public void setContrast(float contrast) {
+    this.contrast = contrast;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/DuotoneFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/DuotoneFilterRender.java
new file mode 100644
index 0000000..3486a3c
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/DuotoneFilterRender.java
@@ -0,0 +1,198 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Created by pedro on 1/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class DuotoneFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uColorHandle = -1;
+  private int uColor2Handle = -1;
+
+  private static final String HEX_PATTERN = "^#([A-Fa-f0-9]{6})$";
+
+  //by default tint with green and blue
+  private float red = 0f;
+  private float green = 1f;
+  private float blue = 0f;
+  private float red2 = 0f;
+  private float green2 = 0f;
+  private float blue2 = 1f;
+
+  public DuotoneFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.duotone_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uColorHandle = GLES20.glGetUniformLocation(program, "uColor");
+    uColor2Handle = GLES20.glGetUniformLocation(program, "uColor2");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform3f(uColorHandle, red, green, blue);
+    GLES20.glUniform3f(uColor2Handle, red2, green2, blue2);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+
+  public float getRed() {
+    return red;
+  }
+
+  public float getGreen() {
+    return green;
+  }
+
+  public float getBlue() {
+    return blue;
+  }
+
+  public float getRed2() {
+    return red2;
+  }
+
+  public float getGreen2() {
+    return green2;
+  }
+
+  public float getBlue2() {
+    return blue2;
+  }
+
+  /**
+   * @param rgbHexColor color represented with 7 characters (1 to start with #, 2 for red, 2 for
+   * green and 2 for blue)
+   */
+  public void setRGBColor(String rgbHexColor, String rgbHexColor2) {
+    Pattern pattern = Pattern.compile(HEX_PATTERN);
+    Matcher matcher = pattern.matcher(rgbHexColor);
+    if (!matcher.matches()) {
+      throw new IllegalArgumentException(
+          "Invalid hexColor pattern (Should be: " + HEX_PATTERN + ")");
+    }
+    int r = Integer.valueOf(rgbHexColor.substring(1, 3), 16);
+    int g = Integer.valueOf(rgbHexColor.substring(3, 5), 16);
+    int b = Integer.valueOf(rgbHexColor.substring(5, 7), 16);
+    red = (float) r / 255.0f;
+    green = (float) g / 255.0f;
+    blue = (float) b / 255.0f;
+
+    matcher = pattern.matcher(rgbHexColor2);
+    if (!matcher.matches()) {
+      throw new IllegalArgumentException(
+          "Invalid hexColor pattern (Should be: " + HEX_PATTERN + ")");
+    }
+    r = Integer.valueOf(rgbHexColor2.substring(1, 3), 16);
+    g = Integer.valueOf(rgbHexColor2.substring(3, 5), 16);
+    b = Integer.valueOf(rgbHexColor2.substring(5, 7), 16);
+    red2 = (float) r / 255.0f;
+    green2 = (float) g / 255.0f;
+    blue2 = (float) b / 255.0f;
+  }
+
+  /**
+   * Values range 0 to 255
+   */
+  public void setRGBColor(int r, int g, int b, int r2, int g2, int b2) {
+    red = (float) r / 255.0f;
+    green = (float) g / 255.0f;
+    blue = (float) b / 255.0f;
+
+    red2 = (float) r2 / 255.0f;
+    green2 = (float) g2 / 255.0f;
+    blue2 = (float) b2 / 255.0f;
+  }
+
+  /**
+   * Get string color from color file resource and strip alpha values (alpha values is always auto
+   * completed)
+   */
+  public void setColor(Resources resources, int colorResource, int colorResource2) {
+    String color = resources.getString(colorResource);
+    String color2 = resources.getString(colorResource2);
+    setRGBColor("#" + color.substring(3), "#" + color2.substring(3));
+  }
+
+  /**
+   * @param colorResource int from color class with Color.parse or Color.NAME_COLOR (Ex:
+   * Color.BLUE)
+   * @param colorResource2 int from color class with Color.parse or Color.NAME_COLOR (Ex:
+   * Color.BLUE)
+   */
+  public void setColor(int colorResource, int colorResource2) {
+    red = Color.red(colorResource) / 255f;
+    green = Color.green(colorResource) / 255f;
+    blue = Color.blue(colorResource) / 255f;
+
+    red2 = Color.red(colorResource2) / 255f;
+    green2 = Color.green(colorResource2) / 255f;
+    blue2 = Color.blue(colorResource2) / 255f;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/EarlyBirdFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/EarlyBirdFilterRender.java
new file mode 100644
index 0000000..c3b2b16
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/EarlyBirdFilterRender.java
@@ -0,0 +1,87 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 4/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class EarlyBirdFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uResolutionHandle = -1;
+
+  public EarlyBirdFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.earlybird_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform2f(uResolutionHandle, getWidth(), getHeight());
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/EdgeDetectionFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/EdgeDetectionFilterRender.java
new file mode 100644
index 0000000..5205af3
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/EdgeDetectionFilterRender.java
@@ -0,0 +1,84 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 4/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class EdgeDetectionFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+
+  public EdgeDetectionFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.edge_detection_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/ExposureFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/ExposureFilterRender.java
new file mode 100644
index 0000000..1915fcc
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/ExposureFilterRender.java
@@ -0,0 +1,97 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 31/01/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class ExposureFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uExposureHandle = -1;
+
+  private float exposure = 0.5f;
+
+  public ExposureFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.exposure_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uExposureHandle = GLES20.glGetUniformLocation(program, "uExposure");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform1f(uExposureHandle, exposure);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+
+  public float getExposure() {
+    return exposure;
+  }
+
+  public void setExposure(float exposure) {
+    this.exposure = exposure;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/FireFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/FireFilterRender.java
new file mode 100644
index 0000000..e47246e
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/FireFilterRender.java
@@ -0,0 +1,87 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 4/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class FireFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uResolutionHandle = -1;
+
+  public FireFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.fire_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform2f(uResolutionHandle, getWidth(), getHeight());
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/GammaFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/GammaFilterRender.java
new file mode 100644
index 0000000..fbad1e7
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/GammaFilterRender.java
@@ -0,0 +1,100 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 2/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class GammaFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uGammaHandle = -1;
+
+  private float gamma = 0.5f;
+
+  public GammaFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.gamma_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uGammaHandle = GLES20.glGetUniformLocation(program, "uGamma");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform1f(uGammaHandle, gamma);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+
+  public float getGamma() {
+    return gamma;
+  }
+
+  /**
+   * @param gamma Range should be between 0.0 - 2.0 with 1.0 being normal.
+   */
+  public void setGamma(float gamma) {
+    this.gamma = gamma;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/GreyScaleFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/GreyScaleFilterRender.java
new file mode 100644
index 0000000..93973e2
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/GreyScaleFilterRender.java
@@ -0,0 +1,84 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 29/01/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class GreyScaleFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+
+  public GreyScaleFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.grey_scale_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/HalftoneLinesFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/HalftoneLinesFilterRender.java
new file mode 100644
index 0000000..56eb2c7
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/HalftoneLinesFilterRender.java
@@ -0,0 +1,157 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 4/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class HalftoneLinesFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uResolutionHandle = -1;
+  private int uModeHandle = -1;
+  private int uRowsHandle = -1;
+  private int uRotationHandle = -1;
+  private int uAntialiasHandle = -1;
+  private int uSampleDistHandle = -1;
+
+  private float mode = 1f;
+  private float rows = 40f;
+  private float rotation = 0f;
+  private float antialias = 0.2f;
+  private float[] sampleDist = new float[] { 2f, 2f };
+
+  public HalftoneLinesFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.halftone_lines_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution");
+    uModeHandle = GLES20.glGetUniformLocation(program, "uMode");
+    uRowsHandle = GLES20.glGetUniformLocation(program, "uRows");
+    uRotationHandle = GLES20.glGetUniformLocation(program, "uRotation");
+    uAntialiasHandle = GLES20.glGetUniformLocation(program, "uAntialias");
+    uSampleDistHandle = GLES20.glGetUniformLocation(program, "uSampleDist");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform2f(uResolutionHandle, getWidth(), getHeight());
+    GLES20.glUniform1f(uModeHandle, mode);
+    GLES20.glUniform1f(uRowsHandle, rows);
+    GLES20.glUniform1f(uRotationHandle, rotation);
+    GLES20.glUniform1f(uAntialiasHandle, antialias);
+    GLES20.glUniform2f(uSampleDistHandle, sampleDist[0], sampleDist[1]);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+
+  public float getMode() {
+    return mode;
+  }
+
+  public float getRows() {
+    return rows;
+  }
+
+  public float getRotation() {
+    return rotation;
+  }
+
+  public float getAntialias() {
+    return antialias;
+  }
+
+  public float[] getSampleDist() {
+    return sampleDist;
+  }
+
+  /**
+   * @param mode 1 to 7 values
+   */
+  public void setMode(int mode) {
+    if (mode < 1) {
+      this.mode = 1;
+    } else if (mode > 7) {
+      this.mode = 7;
+    } else {
+      this.mode = mode;
+    }
+  }
+
+  public void setRows(float rows) {
+    this.rows = rows;
+  }
+
+  public void setRotation(float rotation) {
+    this.rotation = rotation;
+  }
+
+  public void setAntialias(float antialias) {
+    this.antialias = antialias;
+  }
+
+  public void setSampleDist(float[] sampleDist) {
+    this.sampleDist = sampleDist;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/Image70sFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/Image70sFilterRender.java
new file mode 100644
index 0000000..9fbc552
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/Image70sFilterRender.java
@@ -0,0 +1,84 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 4/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class Image70sFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+
+  public Image70sFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.image70s_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/LamoishFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/LamoishFilterRender.java
new file mode 100644
index 0000000..1de8391
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/LamoishFilterRender.java
@@ -0,0 +1,84 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 3/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class LamoishFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+
+  public LamoishFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.lamoish_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/MoneyFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/MoneyFilterRender.java
new file mode 100644
index 0000000..7118c4e
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/MoneyFilterRender.java
@@ -0,0 +1,87 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 4/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class MoneyFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uResolutionHandle = -1;
+
+  public MoneyFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.money_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform2f(uResolutionHandle, getWidth(), getHeight());
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/NegativeFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/NegativeFilterRender.java
new file mode 100644
index 0000000..bf38912
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/NegativeFilterRender.java
@@ -0,0 +1,84 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 29/01/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class NegativeFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+
+  public NegativeFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.negative_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/NoFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/NoFilterRender.java
new file mode 100644
index 0000000..8ae041b
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/NoFilterRender.java
@@ -0,0 +1,84 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 29/01/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class NoFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+
+  public NoFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.simple_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/PixelatedFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/PixelatedFilterRender.java
new file mode 100644
index 0000000..0210df9
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/PixelatedFilterRender.java
@@ -0,0 +1,106 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 31/01/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class PixelatedFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uPixelatedHandle = -1;
+
+  private float pixelated = 0.01f;
+
+  public PixelatedFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.pixelated_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uPixelatedHandle = GLES20.glGetUniformLocation(program, "uPixelated");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform1f(uPixelatedHandle, pixelated);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+
+  public float getPixelated() {
+    return pixelated;
+  }
+
+  /**
+   * @param pixelated min value 0.0f, max value 1.0f
+   */
+  public void setPixelated(float pixelated) {
+    if (pixelated > 1.0f) {
+      this.pixelated = 1.0f;
+    } else if (pixelated < 0.0f) {
+      this.pixelated = 0.0f;
+    } else {
+      this.pixelated = pixelated;
+    }
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/PolygonizationFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/PolygonizationFilterRender.java
new file mode 100644
index 0000000..17b3236
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/PolygonizationFilterRender.java
@@ -0,0 +1,87 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 4/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class PolygonizationFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uResolutionHandle = -1;
+
+  public PolygonizationFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.polygonization_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform2f(uResolutionHandle, getWidth(), getHeight());
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/RGBSaturationFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/RGBSaturationFilterRender.java
new file mode 100644
index 0000000..cb0814f
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/RGBSaturationFilterRender.java
@@ -0,0 +1,110 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 18/07/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class RGBSaturationFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uRGBSaturationHandle = -1;
+
+  private float r = 1f, g = 1f, b = 1f;
+
+  public RGBSaturationFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.rgb_saturation_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uRGBSaturationHandle = GLES20.glGetUniformLocation(program, "uRGBSaturation");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform3f(uRGBSaturationHandle, r, g, b);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+
+  public float getR() {
+    return r;
+  }
+
+  public float getG() {
+    return g;
+  }
+
+  public float getB() {
+    return b;
+  }
+
+  /**
+   * Saturate red, green and blue colors 0% to 100% (0.0f to 1.0f)
+   */
+  public void setRGBSaturation(float r, float g, float b) {
+    this.r = r;
+    this.g = g;
+    this.b = b;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/RainbowFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/RainbowFilterRender.java
new file mode 100644
index 0000000..78a3067
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/RainbowFilterRender.java
@@ -0,0 +1,89 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 4/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class RainbowFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uTimeHandle = -1;
+
+  private long START_TIME = System.currentTimeMillis();
+
+  public RainbowFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.rainbow_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uTimeHandle = GLES20.glGetUniformLocation(program, "uTime");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    float time = ((float) (System.currentTimeMillis() - START_TIME)) / 1000.0f;
+    GLES20.glUniform1f(uTimeHandle, time);
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/RippleFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/RippleFilterRender.java
new file mode 100644
index 0000000..f0b4c82
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/RippleFilterRender.java
@@ -0,0 +1,97 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 2/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class RippleFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uResolutionHandle = -1;
+  private int uSpeedHandle = -1;
+  private int uTimeHandle = -1;
+
+  private float speed = 15f;
+  private float time = 0f;
+
+  public RippleFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.ripple_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution");
+    uSpeedHandle = GLES20.glGetUniformLocation(program, "uSpeed");
+    uTimeHandle = GLES20.glGetUniformLocation(program, "uTime");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform2f(uResolutionHandle, getWidth(), getHeight());
+    GLES20.glUniform1f(uSpeedHandle, speed);
+    time += 0.05f;
+    GLES20.glUniform1f(uTimeHandle, time);
+    if (time >= 1f) time = 0f;
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/RotationFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/RotationFilterRender.java
new file mode 100644
index 0000000..ce975d1
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/RotationFilterRender.java
@@ -0,0 +1,101 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class RotationFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+
+  private int rotation = 0;
+  private float[] rotationMatrix = new float[16];
+
+  public RotationFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+    Matrix.setIdentityM(rotationMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.simple_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+
+  public int getRotation() {
+    return rotation;
+  }
+
+  public void setRotation(int rotation) {
+    this.rotation = rotation;
+    //Set rotation
+    Matrix.setRotateM(rotationMatrix, 0, rotation, 0, 0, 1.0f);
+    //Translation
+    //Matrix.translateM(rotationMatrix, 0, 0f, 0f, 0f);
+    // Combine the rotation matrix with the projection and camera view
+    Matrix.multiplyMM(MVPMatrix, 0, rotationMatrix, 0, MVPMatrix, 0);
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/SaturationFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/SaturationFilterRender.java
new file mode 100644
index 0000000..6739725
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/SaturationFilterRender.java
@@ -0,0 +1,120 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 1/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class SaturationFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uShiftHandle = -1;
+  private int uWeightsHandle = -1;
+  private int uExponentsHandle = -1;
+  private int uSaturationHandle = -1;
+
+  private float saturation = -0.5f;
+  private final float shift = 1.0f / 255.0f;
+  private final float weights[] = { 2f / 8f, 5f / 8f, 1f / 8f };
+  private float exponents[] = new float[3];
+
+  public SaturationFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.saturation_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uShiftHandle = GLES20.glGetUniformLocation(program, "uShift");
+    uWeightsHandle = GLES20.glGetUniformLocation(program, "uWeights");
+    uExponentsHandle = GLES20.glGetUniformLocation(program, "uExponents");
+    uSaturationHandle = GLES20.glGetUniformLocation(program, "uSaturation");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform1f(uShiftHandle, shift);
+    GLES20.glUniform3f(uWeightsHandle, weights[0], weights[1], weights[2]);
+    GLES20.glUniform3f(uExponentsHandle, exponents[0], exponents[1], exponents[2]);
+    GLES20.glUniform1f(uSaturationHandle, saturation);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+
+  public float getSaturation() {
+    return saturation;
+  }
+
+  /**
+   * @param saturation between -1.0f and 1.0f means no change, while -1.0f indicates full desaturation,
+   * i.e. grayscale.
+   */
+  public void setSaturation(float saturation) {
+    if (saturation > 0.0f) {
+      exponents[0] = (0.9f * saturation) + 1.0f;
+      exponents[1] = (2.1f * saturation) + 1.0f;
+      exponents[2] = (2.7f * saturation) + 1.0f;
+      this.saturation = saturation;
+    } else {
+      this.saturation = saturation + 1.0f;
+    }
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/SepiaFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/SepiaFilterRender.java
new file mode 100644
index 0000000..4cbfd4c
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/SepiaFilterRender.java
@@ -0,0 +1,84 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 29/01/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class SepiaFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+
+  public SepiaFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.sepia_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/SharpnessFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/SharpnessFilterRender.java
new file mode 100644
index 0000000..ec6e646
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/SharpnessFilterRender.java
@@ -0,0 +1,103 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 3/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class SharpnessFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uStepSizeHandle = -1;
+  private int uSharpnessHandle = -1;
+
+  private float sharpness = 0.5f;
+
+  public SharpnessFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.sharpness_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uStepSizeHandle = GLES20.glGetUniformLocation(program, "uStepSize");
+    uSharpnessHandle = GLES20.glGetUniformLocation(program, "uBrightness");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform2f(uStepSizeHandle, 1f / getWidth(), 1f / getHeight());
+    GLES20.glUniform1f(uSharpnessHandle, sharpness);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+
+  public float getSharpness() {
+    return sharpness;
+  }
+
+  /**
+   * @param sharpness between 0 and 1. 0 means no change.
+   */
+  public void setSharpness(float sharpness) {
+    this.sharpness = sharpness;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/SurfaceFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/SurfaceFilterRender.java
new file mode 100644
index 0000000..d6f770a
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/SurfaceFilterRender.java
@@ -0,0 +1,169 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.graphics.PointF;
+import android.graphics.SurfaceTexture;
+import android.opengl.GLES11Ext;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.view.Surface;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.input.gl.Sprite;
+import com.pedro.encoder.input.gl.render.filters.object.BaseObjectFilterRender;
+import com.pedro.encoder.utils.gl.GlUtil;
+import com.pedro.encoder.utils.gl.TranslateTo;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+/**
+ * Created by pedro on 18/07/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class SurfaceFilterRender extends BaseObjectFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uSamplerSurfaceHandle = -1;
+  private int aTextureSurfaceHandle = -1;
+  private int uAlphaHandle = -1;
+
+  private int[] surfaceId = new int[] { -1 };
+  private Sprite sprite;
+  private FloatBuffer squareVertexSurface;
+  private SurfaceTexture surfaceTexture;
+  private Surface surface;
+  private float alpha = 1f;
+
+  public SurfaceFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    sprite = new Sprite();
+    float[] vertices = sprite.getTransformedVertices();
+    squareVertexSurface = ByteBuffer.allocateDirect(vertices.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertexSurface.put(vertices).position(0);
+    sprite.getTransformedVertices();
+
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.surface_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.surface_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    aTextureSurfaceHandle = GLES20.glGetAttribLocation(program, "aTextureSurfaceCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uSamplerSurfaceHandle = GLES20.glGetUniformLocation(program, "uSamplerSurface");
+    uAlphaHandle = GLES20.glGetUniformLocation(program, "uAlpha");
+
+    GlUtil.createExternalTextures(1, surfaceId, 0);
+    surfaceTexture = new SurfaceTexture(surfaceId[0]);
+    surface = new Surface(surfaceTexture);
+  }
+
+  @Override
+  protected void drawFilter() {
+    surfaceTexture.setDefaultBufferSize(getWidth(), getHeight());
+    surfaceTexture.updateTexImage();
+
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    squareVertexSurface.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureSurfaceHandle, 2, GLES20.GL_FLOAT, false,
+        2 * FLOAT_SIZE_BYTES, squareVertexSurface);
+    GLES20.glEnableVertexAttribArray(aTextureSurfaceHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+    //Surface
+    GLES20.glUniform1i(uSamplerSurfaceHandle, 5);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE5);
+    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, surfaceId[0]);
+    //Set alpha. 0f if no image loaded.
+    GLES20.glUniform1f(uAlphaHandle, surfaceId[0] == -1 ? 0f : alpha);
+  }
+
+  @Override
+  public void release() {
+    if (surfaceId != null) GLES20.glDeleteTextures(1, surfaceId, 0);
+    surfaceId = new int[] { -1 };
+    surfaceTexture.release();
+    surface.release();
+  }
+
+  public SurfaceTexture getSurfaceTexture() {
+    return surfaceTexture;
+  }
+
+  public Surface getSurface() {
+    return surface;
+  }
+
+  public void setAlpha(float alpha) {
+    this.alpha = alpha;
+  }
+
+  public void setScale(float scaleX, float scaleY) {
+    sprite.scale(scaleX, scaleY);
+    squareVertexSurface.put(sprite.getTransformedVertices()).position(0);
+  }
+
+  public void setPosition(float x, float y) {
+    sprite.translate(x, y);
+    squareVertexSurface.put(sprite.getTransformedVertices()).position(0);
+  }
+
+  public void setPosition(TranslateTo positionTo) {
+    sprite.translate(positionTo);
+    squareVertexSurface.put(sprite.getTransformedVertices()).position(0);
+  }
+
+  public PointF getScale() {
+    return sprite.getScale();
+  }
+
+  public PointF getPosition() {
+    return sprite.getTranslation();
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/TemperatureFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/TemperatureFilterRender.java
new file mode 100644
index 0000000..a7995e5
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/TemperatureFilterRender.java
@@ -0,0 +1,107 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 1/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class TemperatureFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uTemperatureHandle = -1;
+
+  private float temperature = 0.8f;
+
+  public TemperatureFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.temperature_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uTemperatureHandle = GLES20.glGetUniformLocation(program, "uTemperature");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    GLES20.glUniform1f(uTemperatureHandle, temperature);
+
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+
+  public float getTemperature() {
+    return temperature;
+  }
+
+  /**
+   * @param temperature min value 0f, max value 1f
+   */
+  public void setTemperature(float temperature) {
+    if (temperature < 0.0f) {
+      this.temperature = 0.0f;
+    } else if (temperature > 1.0f) {
+      this.temperature = 1.0f;
+    } else {
+      this.temperature = temperature;
+    }
+    this.temperature = 2.0f * this.temperature - 1.0f;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/ZebraFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/ZebraFilterRender.java
new file mode 100644
index 0000000..6380b47
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/ZebraFilterRender.java
@@ -0,0 +1,101 @@
+package com.pedro.encoder.input.gl.render.filters;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Created by pedro on 4/02/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class ZebraFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uTimeHandle = -1;
+  private int uLevelsHandle = -1;
+
+  private long START_TIME = System.currentTimeMillis();
+  private float levels = 8f;
+
+  public ZebraFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.zebra_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uTimeHandle = GLES20.glGetUniformLocation(program, "uTime");
+    uLevelsHandle = GLES20.glGetUniformLocation(program, "uLevels");
+  }
+
+  @Override
+  protected void drawFilter() {
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    float time = ((float) (System.currentTimeMillis() - START_TIME)) / 1000.0f;
+    GLES20.glUniform1f(uTimeHandle, time);
+    GLES20.glUniform1f(uLevelsHandle, levels);
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+  }
+
+  @Override
+  public void release() {
+
+  }
+
+  public float getLevels() {
+    return levels;
+  }
+
+  public void setLevels(float levels) {
+    this.levels = levels;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/object/BaseObjectFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/object/BaseObjectFilterRender.java
new file mode 100644
index 0000000..95c4e17
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/object/BaseObjectFilterRender.java
@@ -0,0 +1,165 @@
+package com.pedro.encoder.input.gl.render.filters.object;
+
+import android.content.Context;
+import android.graphics.PointF;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.rtplibrary.R;
+import com.pedro.encoder.input.gl.Sprite;
+import com.pedro.encoder.input.gl.TextureLoader;
+import com.pedro.encoder.input.gl.render.filters.BaseFilterRender;
+import com.pedro.encoder.utils.gl.GlUtil;
+import com.pedro.encoder.utils.gl.StreamObjectBase;
+import com.pedro.encoder.utils.gl.TranslateTo;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+/**
+ * Created by pedro on 03/08/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+abstract public class BaseObjectFilterRender extends BaseFilterRender {
+
+  //rotation matrix
+  private final float[] squareVertexDataFilter = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f, //bottom left
+      1f, -1f, 0f, 1f, 0f, //bottom right
+      -1f, 1f, 0f, 0f, 1f, //top left
+      1f, 1f, 0f, 1f, 1f, //top right
+  };
+
+  private int program = -1;
+  private int aPositionHandle = -1;
+  private int aTextureHandle = -1;
+  private int aTextureObjectHandle = -1;
+  private int uMVPMatrixHandle = -1;
+  private int uSTMatrixHandle = -1;
+  private int uSamplerHandle = -1;
+  private int uObjectHandle = -1;
+  protected int uAlphaHandle = -1;
+
+  private FloatBuffer squareVertexObject;
+
+  protected int[] streamObjectTextureId = new int[] { -1 };
+  protected TextureLoader textureLoader = new TextureLoader();
+  protected StreamObjectBase streamObject;
+  private Sprite sprite;
+  protected float alpha = 1f;
+  protected boolean shouldLoad = false;
+
+  public BaseObjectFilterRender() {
+    squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertex.put(squareVertexDataFilter).position(0);
+    sprite = new Sprite();
+    float[] vertices = sprite.getTransformedVertices();
+    squareVertexObject = ByteBuffer.allocateDirect(vertices.length * FLOAT_SIZE_BYTES)
+        .order(ByteOrder.nativeOrder())
+        .asFloatBuffer();
+    squareVertexObject.put(vertices).position(0);
+    Matrix.setIdentityM(MVPMatrix, 0);
+    Matrix.setIdentityM(STMatrix, 0);
+  }
+
+  @Override
+  protected void initGlFilter(Context context) {
+    String vertexShader = GlUtil.getStringFromRaw(context, R.raw.object_vertex);
+    String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.object_fragment);
+
+    program = GlUtil.createProgram(vertexShader, fragmentShader);
+    aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition");
+    aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord");
+    aTextureObjectHandle = GLES20.glGetAttribLocation(program, "aTextureObjectCoord");
+    uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
+    uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix");
+    uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler");
+    uObjectHandle = GLES20.glGetUniformLocation(program, "uObject");
+    uAlphaHandle = GLES20.glGetUniformLocation(program, "uAlpha");
+  }
+
+  @Override
+  protected void drawFilter() {
+    if (shouldLoad) {
+      streamObjectTextureId = textureLoader.load();
+      shouldLoad = false;
+    }
+
+    GLES20.glUseProgram(program);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+    squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+        SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
+    GLES20.glEnableVertexAttribArray(aTextureHandle);
+
+    squareVertexObject.position(SQUARE_VERTEX_DATA_POS_OFFSET);
+    GLES20.glVertexAttribPointer(aTextureObjectHandle, 2, GLES20.GL_FLOAT, false,
+        2 * FLOAT_SIZE_BYTES, squareVertexObject);
+    GLES20.glEnableVertexAttribArray(aTextureObjectHandle);
+
+    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
+    GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
+    //Sampler
+    GLES20.glUniform1i(uSamplerHandle, 4);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE4);
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId);
+    //Object
+    GLES20.glUniform1i(uObjectHandle, 5);
+    GLES20.glActiveTexture(GLES20.GL_TEXTURE5);
+  }
+
+  @Override
+  public void release() {
+    releaseTextureId();
+    sprite.reset();
+    if (streamObject != null) streamObject.recycle();
+  }
+
+  protected void releaseTextureId() {
+    if (streamObjectTextureId != null) GLES20.glDeleteTextures(1, streamObjectTextureId, 0);
+    streamObjectTextureId = new int[] { -1 };
+  }
+
+  public void setAlpha(float alpha) {
+    this.alpha = alpha;
+  }
+
+  public void setScale(float scaleX, float scaleY) {
+    sprite.scale(scaleX, scaleY);
+    squareVertexObject.put(sprite.getTransformedVertices()).position(0);
+  }
+
+  public void setPosition(float x, float y) {
+    sprite.translate(x, y);
+    squareVertexObject.put(sprite.getTransformedVertices()).position(0);
+  }
+
+  public void setPosition(TranslateTo positionTo) {
+    sprite.translate(positionTo);
+    squareVertexObject.put(sprite.getTransformedVertices()).position(0);
+  }
+
+  public PointF getScale() {
+    return sprite.getScale();
+  }
+
+  public PointF getPosition() {
+    return sprite.getTranslation();
+  }
+
+  public void setDefaultScale(int streamWidth, int streamHeight) {
+    sprite.scale(streamObject.getWidth() * 100 / streamWidth,
+        streamObject.getHeight() * 100 / streamHeight);
+    squareVertexObject.put(sprite.getTransformedVertices()).position(0);
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/object/GifObjectFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/object/GifObjectFilterRender.java
new file mode 100644
index 0000000..cde885e
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/object/GifObjectFilterRender.java
@@ -0,0 +1,38 @@
+package com.pedro.encoder.input.gl.render.filters.object;
+
+import android.opengl.GLES20;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.encoder.utils.gl.GifStreamObject;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Created by pedro on 27/07/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class GifObjectFilterRender extends BaseObjectFilterRender {
+
+  public GifObjectFilterRender() {
+    super();
+    streamObject = new GifStreamObject();
+  }
+
+  @Override
+  protected void drawFilter() {
+    super.drawFilter();
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,
+        streamObjectTextureId[((GifStreamObject) streamObject).updateFrame(
+            streamObjectTextureId.length)]);
+    //Set alpha. 0f if no image loaded.
+    GLES20.glUniform1f(uAlphaHandle, streamObjectTextureId[0] == -1 ? 0f : alpha);
+  }
+
+  public void setGif(InputStream inputStream) throws IOException {
+    releaseTextureId();
+    ((GifStreamObject) streamObject).load(inputStream);
+    textureLoader.setGifStreamObject((GifStreamObject) streamObject);
+    shouldLoad = true;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/object/ImageObjectFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/object/ImageObjectFilterRender.java
new file mode 100644
index 0000000..ae08f8a
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/object/ImageObjectFilterRender.java
@@ -0,0 +1,35 @@
+package com.pedro.encoder.input.gl.render.filters.object;
+
+import android.graphics.Bitmap;
+import android.opengl.GLES20;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.encoder.utils.gl.ImageStreamObject;
+
+/**
+ * Created by pedro on 27/07/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class ImageObjectFilterRender extends BaseObjectFilterRender {
+
+  public ImageObjectFilterRender() {
+    super();
+    streamObject = new ImageStreamObject();
+  }
+
+  @Override
+  protected void drawFilter() {
+    super.drawFilter();
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, streamObjectTextureId[0]);
+    //Set alpha. 0f if no image loaded.
+    GLES20.glUniform1f(uAlphaHandle, streamObjectTextureId[0] == -1 ? 0f : alpha);
+  }
+
+  public void setImage(Bitmap bitmap) {
+    releaseTextureId();
+    ((ImageStreamObject) streamObject).load(bitmap);
+    textureLoader.setImageStreamObject((ImageStreamObject) streamObject);
+    shouldLoad = true;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/object/TextObjectFilterRender.java b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/object/TextObjectFilterRender.java
new file mode 100644
index 0000000..838479c
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/gl/render/filters/object/TextObjectFilterRender.java
@@ -0,0 +1,34 @@
+package com.pedro.encoder.input.gl.render.filters.object;
+
+import android.opengl.GLES20;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.encoder.utils.gl.TextStreamObject;
+
+/**
+ * Created by pedro on 27/07/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class TextObjectFilterRender extends BaseObjectFilterRender {
+
+  public TextObjectFilterRender() {
+    super();
+    streamObject = new TextStreamObject();
+  }
+
+  @Override
+  protected void drawFilter() {
+    super.drawFilter();
+    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, streamObjectTextureId[0]);
+    //Set alpha. 0f if no image loaded.
+    GLES20.glUniform1f(uAlphaHandle, streamObjectTextureId[0] == -1 ? 0f : alpha);
+  }
+
+  public void setText(String text, float textSize, int textColor) {
+    releaseTextureId();
+    ((TextStreamObject) streamObject).load(text, textSize, textColor);
+    textureLoader.setTextStreamObject((TextStreamObject) streamObject);
+    shouldLoad = true;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/video/Camera1ApiManager.java b/rtplibrary/src/main/java/com/pedro/encoder/input/video/Camera1ApiManager.java
new file mode 100644
index 0000000..73284e3
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/video/Camera1ApiManager.java
@@ -0,0 +1,426 @@
+package com.pedro.encoder.input.video;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.graphics.ImageFormat;
+import android.graphics.SurfaceTexture;
+import android.hardware.Camera;
+import android.media.CamcorderProfile;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.SurfaceView;
+import android.view.TextureView;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by pedro on 20/01/17.
+ * This class need use same resolution, fps and imageFormat that VideoEncoder
+ * Tested with YV12 and NV21.
+ *
+ * Advantage = you can control fps of the stream.
+ * Disadvantages = you cant use all resolutions, only resolution that your camera support.
+ *
+ * If you want use all resolutions. You can use libYuv for resize images in OnPreviewFrame:
+ * https://chromium.googlesource.com/libyuv/libyuv/
+ */
+
+public class Camera1ApiManager implements Camera.PreviewCallback, Camera.FaceDetectionListener {
+
+  private String TAG = "Camera1ApiManager";
+  private Camera camera = null;
+  private SurfaceView surfaceView;
+  private TextureView textureView;
+  private SurfaceTexture surfaceTexture;
+  private GetCameraData getCameraData;
+  private boolean running = false;
+  private boolean lanternEnable = false;
+  private int cameraSelect;
+  private boolean isFrontCamera = false;
+  private boolean isPortrait = false;
+  private int cameraFacing = Camera.CameraInfo.CAMERA_FACING_BACK;
+  private Context context;
+
+  //default parameters for camera
+  private int width = 640;
+  private int height = 480;
+  private int fps = 30;
+  private int rotation = 0;
+  private int imageFormat = ImageFormat.NV21;
+  private byte[] yuvBuffer;
+  private List<Camera.Size> previewSizeBack;
+  private List<Camera.Size> previewSizeFront;
+  private float distance;
+
+  //Face detector
+  public interface FaceDetectorCallback {
+    void onGetFaces(Camera.Face[] faces);
+  }
+
+  private FaceDetectorCallback faceDetectorCallback;
+
+  public Camera1ApiManager(SurfaceView surfaceView, GetCameraData getCameraData) {
+    this.surfaceView = surfaceView;
+    this.getCameraData = getCameraData;
+    this.context = surfaceView.getContext();
+    init();
+  }
+
+  public Camera1ApiManager(TextureView textureView, GetCameraData getCameraData) {
+    this.textureView = textureView;
+    this.getCameraData = getCameraData;
+    this.context = textureView.getContext();
+    init();
+  }
+
+  public Camera1ApiManager(SurfaceTexture surfaceTexture, Context context) {
+    this.surfaceTexture = surfaceTexture;
+    this.context = context;
+    init();
+  }
+
+  private void init() {
+    cameraSelect = selectCameraBack();
+    previewSizeBack = getPreviewSize();
+    cameraSelect = selectCameraFront();
+    previewSizeFront = getPreviewSize();
+  }
+
+  public void setRotation(int rotation) {
+    this.rotation = rotation;
+  }
+
+  public void setSurfaceTexture(SurfaceTexture surfaceTexture) {
+    this.surfaceTexture = surfaceTexture;
+  }
+
+  public void start(CameraHelper.Facing cameraFacing, int width, int height, int fps) {
+    int facing = cameraFacing == CameraHelper.Facing.BACK ? Camera.CameraInfo.CAMERA_FACING_BACK
+        : Camera.CameraInfo.CAMERA_FACING_FRONT;
+    this.width = width;
+    this.height = height;
+    this.fps = fps;
+    this.cameraFacing = facing;
+    cameraSelect =
+        facing == Camera.CameraInfo.CAMERA_FACING_BACK ? selectCameraBack() : selectCameraFront();
+    start();
+  }
+
+  public void start(int width, int height, int fps) {
+    CameraHelper.Facing facing =
+        cameraFacing == Camera.CameraInfo.CAMERA_FACING_BACK ? CameraHelper.Facing.BACK
+            : CameraHelper.Facing.FRONT;
+    start(facing, width, height, fps);
+  }
+
+  private void start() {
+    if (!checkCanOpen()) {
+      throw new CameraOpenException("This camera resolution cant be opened");
+    }
+    yuvBuffer = new byte[width * height * 3 / 2];
+    try {
+      camera = Camera.open(cameraSelect);
+      Camera.CameraInfo info = new Camera.CameraInfo();
+      Camera.getCameraInfo(cameraSelect, info);
+      isFrontCamera = info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT;
+      isPortrait = context.getResources().getConfiguration().orientation
+          == Configuration.ORIENTATION_PORTRAIT;
+      Camera.Parameters parameters = camera.getParameters();
+      parameters.setPreviewSize(width, height);
+      parameters.setPreviewFormat(imageFormat);
+      int[] range = adaptFpsRange(fps, parameters.getSupportedPreviewFpsRange());
+      parameters.setPreviewFpsRange(range[0], range[1]);
+
+      List<String> supportedFocusModes = parameters.getSupportedFocusModes();
+      if (supportedFocusModes != null && !supportedFocusModes.isEmpty()) {
+        if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
+          parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
+        } else if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
+          parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
+        } else {
+          parameters.setFocusMode(supportedFocusModes.get(0));
+        }
+      }
+      camera.setParameters(parameters);
+      camera.setDisplayOrientation(rotation);
+      if (surfaceView != null) {
+        camera.setPreviewDisplay(surfaceView.getHolder());
+        camera.addCallbackBuffer(yuvBuffer);
+        camera.setPreviewCallbackWithBuffer(this);
+      } else if (textureView != null) {
+        camera.setPreviewTexture(textureView.getSurfaceTexture());
+        camera.addCallbackBuffer(yuvBuffer);
+        camera.setPreviewCallbackWithBuffer(this);
+      } else {
+        camera.setPreviewTexture(surfaceTexture);
+      }
+      camera.startPreview();
+      running = true;
+      Log.i(TAG, width + "X" + height);
+    } catch (IOException e) {
+      Log.e(TAG, "Error", e);
+    }
+  }
+
+  public void setPreviewOrientation(final int orientation) {
+    this.rotation = orientation;
+    if (camera != null && running) {
+      camera.stopPreview();
+      camera.setDisplayOrientation(orientation);
+      camera.startPreview();
+    }
+  }
+
+  public void setZoom(MotionEvent event) {
+    try {
+      if (camera != null && running && camera.getParameters() != null && camera.getParameters()
+          .isZoomSupported()) {
+        android.hardware.Camera.Parameters params = camera.getParameters();
+        int maxZoom = params.getMaxZoom();
+        int zoom = params.getZoom();
+        float newDist = CameraHelper.getFingerSpacing(event);
+
+        if (newDist > distance) {
+          if (zoom < maxZoom) {
+            zoom++;
+          }
+        } else if (newDist < distance) {
+          if (zoom > 0) {
+            zoom--;
+          }
+        }
+
+        distance = newDist;
+        params.setZoom(zoom);
+        camera.setParameters(params);
+      }
+    } catch (Exception e) {
+      Log.e(TAG, "Error", e);
+    }
+  }
+
+  private int selectCameraBack() {
+    return selectCamera(Camera.CameraInfo.CAMERA_FACING_BACK);
+  }
+
+  private int selectCameraFront() {
+    return selectCamera(Camera.CameraInfo.CAMERA_FACING_FRONT);
+  }
+
+  private int selectCamera(int facing) {
+    int number = Camera.getNumberOfCameras();
+    for (int i = 0; i < number; i++) {
+      Camera.CameraInfo info = new Camera.CameraInfo();
+      Camera.getCameraInfo(i, info);
+      if (info.facing == facing) return i;
+    }
+    return 0;
+  }
+
+  public void stop() {
+    if (camera != null) {
+      camera.stopPreview();
+      camera.setPreviewCallback(null);
+      camera.setPreviewCallbackWithBuffer(null);
+      camera.release();
+      camera = null;
+    }
+    running = false;
+  }
+
+  public boolean isRunning() {
+    return running;
+  }
+
+  private int[] adaptFpsRange(int expectedFps, List<int[]> fpsRanges) {
+    expectedFps *= 1000;
+    int[] closestRange = fpsRanges.get(0);
+    int measure = Math.abs(closestRange[0] - expectedFps) + Math.abs(closestRange[1] - expectedFps);
+    for (int[] range : fpsRanges) {
+      if (range[0] <= expectedFps && range[1] >= expectedFps) {
+        int curMeasure = Math.abs(range[0] - expectedFps) + Math.abs(range[1] - expectedFps);
+        if (curMeasure < measure) {
+          closestRange = range;
+          measure = curMeasure;
+        }
+      }
+    }
+    return closestRange;
+  }
+
+  @Override
+  public void onPreviewFrame(byte[] data, Camera camera) {
+    getCameraData.inputYUVData(new Frame(data, rotation, isFrontCamera && isPortrait, imageFormat));
+    camera.addCallbackBuffer(yuvBuffer);
+  }
+
+  /**
+   * See: https://developer.android.com/reference/android/graphics/ImageFormat.html to know name of
+   * constant values
+   * Example: 842094169 -> YV12, 17 -> NV21
+   */
+  public List<Integer> getCameraPreviewImageFormatSupported() {
+    List<Integer> formats;
+    if (camera != null) {
+      formats = camera.getParameters().getSupportedPreviewFormats();
+      for (Integer i : formats) {
+        Log.i(TAG, "camera format supported: " + i);
+      }
+    } else {
+      camera = Camera.open(cameraSelect);
+      formats = camera.getParameters().getSupportedPreviewFormats();
+      camera.release();
+      camera = null;
+    }
+    return formats;
+  }
+
+  private List<Camera.Size> getPreviewSize() {
+    List<Camera.Size> previewSizes;
+    Camera.Size maxSize;
+    if (camera != null) {
+      maxSize = getMaxEncoderSizeSupported();
+      previewSizes = camera.getParameters().getSupportedPreviewSizes();
+    } else {
+      camera = Camera.open(cameraSelect);
+      maxSize = getMaxEncoderSizeSupported();
+      previewSizes = camera.getParameters().getSupportedPreviewSizes();
+      camera.release();
+      camera = null;
+    }
+    //discard preview more high than device can record
+    Iterator<Camera.Size> iterator = previewSizes.iterator();
+    while (iterator.hasNext()) {
+      Camera.Size size = iterator.next();
+      if (size.width > maxSize.width || size.height > maxSize.height) {
+        Log.i(TAG, size.width + "X" + size.height + ", not supported for encoder");
+        iterator.remove();
+      }
+    }
+    return previewSizes;
+  }
+
+  public List<Camera.Size> getPreviewSizeBack() {
+    return previewSizeBack;
+  }
+
+  public List<Camera.Size> getPreviewSizeFront() {
+    return previewSizeFront;
+  }
+
+  /**
+   * @return max size that device can record.
+   */
+  private Camera.Size getMaxEncoderSizeSupported() {
+    if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_2160P)) {
+      return camera.new Size(3840, 2160);
+    } else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_1080P)) {
+      return camera.new Size(1920, 1080);
+    } else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_720P)) {
+      return camera.new Size(1280, 720);
+    } else {
+      return camera.new Size(640, 480);
+    }
+  }
+
+  public boolean isFrontCamera() {
+    return isFrontCamera;
+  }
+
+  public void switchCamera() throws CameraOpenException {
+    if (camera != null) {
+      int oldCamera = cameraSelect;
+      int number = Camera.getNumberOfCameras();
+      for (int i = 0; i < number; i++) {
+        if (cameraSelect != i) {
+          cameraSelect = i;
+          if (!checkCanOpen()) {
+            cameraSelect = oldCamera;
+            throw new CameraOpenException("This camera resolution cant be opened");
+          }
+          stop();
+          cameraFacing = cameraFacing == Camera.CameraInfo.CAMERA_FACING_BACK
+              ? Camera.CameraInfo.CAMERA_FACING_FRONT : Camera.CameraInfo.CAMERA_FACING_BACK;
+          start();
+          return;
+        }
+      }
+    }
+  }
+
+  private boolean checkCanOpen() {
+    List<Camera.Size> previews;
+    if (cameraSelect == selectCameraBack()) {
+      previews = previewSizeBack;
+    } else {
+      previews = previewSizeFront;
+    }
+    for (Camera.Size size : previews) {
+      if (size.width == width && size.height == height) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  public boolean isLanternEnable() {
+    return lanternEnable;
+  }
+
+  /**
+   * @required: <uses-permission android:name="android.permission.FLASHLIGHT"/>
+   */
+  public void enableLantern() {
+    if (camera != null) {
+      Camera.Parameters parameters = camera.getParameters();
+      List<String> supportedFlashModes = parameters.getSupportedFlashModes();
+      if (supportedFlashModes != null && !supportedFlashModes.isEmpty()) {
+        if (supportedFlashModes.contains(Camera.Parameters.FLASH_MODE_TORCH)) {
+          parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
+          camera.setParameters(parameters);
+          lanternEnable = true;
+        } else {
+          Log.e(TAG, "Lantern unsupported");
+        }
+      }
+    }
+  }
+
+  /**
+   * @required: <uses-permission android:name="android.permission.FLASHLIGHT"/>
+   */
+  public void disableLantern() {
+    if (camera != null) {
+      Camera.Parameters parameters = camera.getParameters();
+      parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
+      camera.setParameters(parameters);
+      lanternEnable = false;
+    }
+  }
+
+  public void enableFaceDetection(FaceDetectorCallback faceDetectorCallback) {
+    if (camera != null) {
+      this.faceDetectorCallback = faceDetectorCallback;
+      camera.setFaceDetectionListener(this);
+      camera.startFaceDetection();
+    }
+  }
+
+  public void disableFaceDetection() {
+    if (camera != null) {
+      faceDetectorCallback = null;
+      camera.stopFaceDetection();
+      camera.setFaceDetectionListener(null);
+    }
+  }
+
+  public boolean isFaceDetectionEnabled() {
+    return faceDetectorCallback != null;
+  }
+
+  @Override
+  public void onFaceDetection(Camera.Face[] faces, Camera camera) {
+    if (faceDetectorCallback != null) faceDetectorCallback.onGetFaces(faces);
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/video/Camera2ApiManager.java b/rtplibrary/src/main/java/com/pedro/encoder/input/video/Camera2ApiManager.java
new file mode 100644
index 0000000..6693d35
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/video/Camera2ApiManager.java
@@ -0,0 +1,540 @@
+package com.pedro.encoder.input.video;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.graphics.Rect;
+import android.graphics.SurfaceTexture;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraCaptureSession;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CameraMetadata;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.TotalCaptureResult;
+import android.hardware.camera2.params.Face;
+import android.hardware.camera2.params.StreamConfigurationMap;
+import android.os.Build;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.support.annotation.NonNull;
+import android.support.annotation.RequiresApi;
+import android.util.Log;
+import android.util.Size;
+import android.view.MotionEvent;
+import android.view.Surface;
+import android.view.SurfaceView;
+import android.view.TextureView;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static android.hardware.camera2.CameraMetadata.LENS_FACING_FRONT;
+
+/**
+ * Created by pedro on 4/03/17.
+ *
+ * <p>
+ * Class for use surfaceEncoder to buffer encoder.
+ * Advantage = you can use all resolutions.
+ * Disadvantages = you cant control fps of the stream, because you cant know when the inputSurface
+ * was renderer.
+ * <p>
+ * Note: you can use opengl for surfaceEncoder to buffer encoder on devices 21 < API > 16:
+ * https://github.com/google/grafika
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+public class Camera2ApiManager extends CameraDevice.StateCallback {
+
+  private final String TAG = "Camera2ApiManager";
+
+  private CameraDevice cameraDevice;
+  private SurfaceView surfaceView;
+  private TextureView textureView;
+  private Surface surfaceEncoder; //input surfaceEncoder from videoEncoder
+  private CameraManager cameraManager;
+  private Handler cameraHandler;
+  private CameraCaptureSession cameraCaptureSession;
+  private boolean prepared = false;
+  private int cameraId = -1;
+  private Surface preview;
+  private boolean isOpenGl = false;
+  private boolean isFrontCamera = false;
+  private CameraCharacteristics cameraCharacteristics;
+  private CaptureRequest.Builder builderPreview;
+  private CaptureRequest.Builder builderInputSurface;
+  private float fingerSpacing = 0;
+  private float zoomLevel = 1.0f;
+  private boolean lanternEnable = false;
+  private boolean running = false;
+
+  //Face detector
+  public interface FaceDetectorCallback {
+    void onGetFaces(Face[] faces);
+  }
+
+  private FaceDetectorCallback faceDetectorCallback;
+  private boolean faceDetectionEnabled = false;
+  private int faceDetectionMode;
+
+  public Camera2ApiManager(Context context) {
+    cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
+  }
+
+  public void prepareCamera(SurfaceView surfaceView, Surface surface) {
+    this.surfaceView = surfaceView;
+    this.surfaceEncoder = surface;
+    prepared = true;
+    isOpenGl = false;
+  }
+
+  public void prepareCamera(TextureView textureView, Surface surface) {
+    this.textureView = textureView;
+    this.surfaceEncoder = surface;
+    prepared = true;
+    isOpenGl = false;
+  }
+
+  public void prepareCamera(Surface surface) {
+    this.surfaceEncoder = surface;
+    prepared = true;
+    isOpenGl = false;
+  }
+
+  public void prepareCamera(SurfaceTexture surfaceTexture, int width, int height) {
+    surfaceTexture.setDefaultBufferSize(width, height);
+    this.surfaceEncoder = new Surface(surfaceTexture);
+    prepared = true;
+    isOpenGl = true;
+  }
+
+  public boolean isPrepared() {
+    return prepared;
+  }
+
+  private void startPreview(CameraDevice cameraDevice) {
+    try {
+      List<Surface> listSurfaces = new ArrayList<>();
+      preview = addPreviewSurface();
+      if (preview != null) {
+        listSurfaces.add(preview);
+      }
+      if (surfaceEncoder != null) {
+        listSurfaces.add(surfaceEncoder);
+      }
+      cameraDevice.createCaptureSession(listSurfaces, new CameraCaptureSession.StateCallback() {
+        @Override
+        public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
+          Camera2ApiManager.this.cameraCaptureSession = cameraCaptureSession;
+          try {
+            if (surfaceView != null || textureView != null) {
+              cameraCaptureSession.setRepeatingBurst(
+                  Collections.singletonList(drawSurface(preview, surfaceEncoder)),
+                  faceDetectionEnabled ? cb : null, cameraHandler);
+            } else {
+              cameraCaptureSession.setRepeatingBurst(
+                  Collections.singletonList(drawSurface(surfaceEncoder)),
+                  faceDetectionEnabled ? cb : null, cameraHandler);
+            }
+            Log.i(TAG, "Camera configured");
+          } catch (CameraAccessException | NullPointerException e) {
+            Log.e(TAG, "Error", e);
+          }
+        }
+
+        @Override
+        public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
+          cameraCaptureSession.close();
+          Log.e(TAG, "Configuration failed");
+        }
+      }, null);
+    } catch (CameraAccessException e) {
+      Log.e(TAG, "Error", e);
+    }
+  }
+
+  private Surface addPreviewSurface() {
+    Surface surface = null;
+    if (surfaceView != null) {
+      surface = surfaceView.getHolder().getSurface();
+    } else if (textureView != null) {
+      final SurfaceTexture texture = textureView.getSurfaceTexture();
+      surface = new Surface(texture);
+    }
+    return surface;
+  }
+
+  public void setFocus(boolean autofocus, float distance) {
+
+  }
+
+  private CaptureRequest drawSurface(Surface... surfaces) {
+    try {
+      builderInputSurface = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+      // johanokl
+      builderInputSurface.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
+      for (Surface surface : surfaces) builderInputSurface.addTarget(surface);
+      return builderInputSurface.build();
+    } catch (CameraAccessException | IllegalStateException e) {
+      Log.e(TAG, "Error", e);
+      return null;
+    }
+  }
+
+  public int getLevelSupported() {
+    try {
+      cameraCharacteristics = cameraManager.getCameraCharacteristics("0");
+      return cameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
+    } catch (CameraAccessException | IllegalStateException e) {
+      Log.e(TAG, "Error", e);
+      return -1;
+    }
+  }
+
+  public void openCamera() {
+    openCameraBack();
+  }
+
+  public void openCameraBack() {
+    openCameraFacing(CameraHelper.Facing.BACK);
+  }
+
+  public void openCameraFront() {
+    openCameraFacing(CameraHelper.Facing.FRONT);
+  }
+
+  public void openLastCamera() {
+    if (cameraId == -1) {
+      openCameraBack();
+    } else {
+      openCameraId(cameraId);
+    }
+  }
+
+  public Size[] getCameraResolutionsBack() {
+    try {
+      cameraCharacteristics = cameraManager.getCameraCharacteristics("0");
+      if (cameraCharacteristics.get(CameraCharacteristics.LENS_FACING)
+          != CameraCharacteristics.LENS_FACING_BACK) {
+        cameraCharacteristics = cameraManager.getCameraCharacteristics("1");
+      }
+      StreamConfigurationMap streamConfigurationMap =
+          cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+      return streamConfigurationMap.getOutputSizes(SurfaceTexture.class);
+    } catch (CameraAccessException e) {
+      Log.e(TAG, "Error", e);
+      return new Size[0];
+    }
+  }
+
+  public Size[] getCameraResolutionsFront() {
+    try {
+      cameraCharacteristics = cameraManager.getCameraCharacteristics("0");
+      if (cameraCharacteristics.get(CameraCharacteristics.LENS_FACING)
+          != CameraCharacteristics.LENS_FACING_FRONT) {
+        cameraCharacteristics = cameraManager.getCameraCharacteristics("1");
+      }
+      StreamConfigurationMap streamConfigurationMap =
+          cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+      return streamConfigurationMap.getOutputSizes(SurfaceTexture.class);
+    } catch (CameraAccessException e) {
+      Log.e(TAG, "Error", e);
+      return new Size[0];
+    }
+  }
+
+  public CameraCharacteristics getCameraCharacteristics() {
+    return cameraCharacteristics;
+  }
+  /**
+   * Select camera facing
+   *
+   * @param cameraFacing - CameraCharacteristics.LENS_FACING_FRONT, CameraCharacteristics.LENS_FACING_BACK,
+   * CameraCharacteristics.LENS_FACING_EXTERNAL
+   */
+  public void openCameraFacing(CameraHelper.Facing cameraFacing) {
+    int facing = cameraFacing == CameraHelper.Facing.BACK ? CameraMetadata.LENS_FACING_BACK
+        : CameraMetadata.LENS_FACING_FRONT;
+    try {
+      cameraCharacteristics = cameraManager.getCameraCharacteristics("0");
+      if (cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) == facing) {
+        openCameraId(0);
+      } else {
+        openCameraId(cameraManager.getCameraIdList().length - 1);
+      }
+    } catch (CameraAccessException e) {
+      Log.e(TAG, "Error", e);
+    }
+  }
+
+  public boolean isLanternSupported() {
+    return (cameraCharacteristics != null ? cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE) : false);
+  }
+
+  public boolean isLanternEnabled() {
+    return lanternEnable;
+  }
+
+  /**
+   * @required: <uses-permission android:name="android.permission.FLASHLIGHT"/>
+   */
+  public void enableLantern() throws Exception {
+    if ((cameraCharacteristics != null) && cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE)) {
+      if (builderInputSurface != null) {
+        try {
+          builderInputSurface.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
+          cameraCaptureSession.setRepeatingRequest(builderInputSurface.build(), faceDetectionEnabled ? cb : null, null);
+          lanternEnable = true;
+        } catch (CameraAccessException | IllegalStateException e) {
+          e.printStackTrace();
+        }
+      }
+    } else {
+      Log.e(TAG, "Lantern unsupported");
+      throw new Exception("Lantern unsupported");
+    }
+  }
+
+  /**
+   * @required: <uses-permission android:name="android.permission.FLASHLIGHT"/>
+   */
+  public void disableLantern() {
+    if ((cameraCharacteristics != null) && cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE)) {
+      if (builderInputSurface != null) {
+        try {
+          builderInputSurface.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
+          cameraCaptureSession.setRepeatingRequest(builderInputSurface.build(), faceDetectionEnabled ? cb : null, null);
+          lanternEnable = false;
+        } catch (CameraAccessException | IllegalStateException e) {
+          e.printStackTrace();
+        }
+      }
+    }
+  }
+
+  public void enableFaceDetection(FaceDetectorCallback faceDetectorCallback) {
+    int[] fd = cameraCharacteristics.get(
+        CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES);
+    int maxFD = cameraCharacteristics.get(CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT);
+    if (fd.length > 0) {
+      List<Integer> fdList = new ArrayList<>();
+      for (int FaceD : fd) {
+        fdList.add(FaceD);
+      }
+      if (maxFD > 0) {
+        this.faceDetectorCallback = faceDetectorCallback;
+        faceDetectionEnabled = true;
+        faceDetectionMode = Collections.max(fdList);
+        if (builderPreview != null) setFaceDetect(builderPreview, faceDetectionMode);
+        setFaceDetect(builderInputSurface, faceDetectionMode);
+        prepareFaceDetectionCallback();
+      } else {
+        Log.e(TAG, "No face detection");
+      }
+    } else {
+      Log.e(TAG, "No face detection");
+    }
+  }
+
+  public void disableFaceDetection() {
+    if (faceDetectionEnabled) {
+      faceDetectorCallback = null;
+      faceDetectionEnabled = false;
+      faceDetectionMode = 0;
+      prepareFaceDetectionCallback();
+    }
+  }
+
+  public boolean isFaceDetectionEnabled() {
+    return faceDetectorCallback != null;
+  }
+
+  private void setFaceDetect(CaptureRequest.Builder requestBuilder, int faceDetectMode) {
+    if (faceDetectionEnabled) {
+      requestBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE, faceDetectMode);
+    }
+  }
+
+  private void prepareFaceDetectionCallback() {
+    try {
+      cameraCaptureSession.stopRepeating();
+      if (builderPreview != null) {
+        cameraCaptureSession.setRepeatingRequest(builderPreview.build(),
+            faceDetectionEnabled ? cb : null, null);
+      }
+      cameraCaptureSession.setRepeatingRequest(builderInputSurface.build(),
+          faceDetectionEnabled ? cb : null, null);
+    } catch (CameraAccessException e) {
+      Log.e(TAG, "Error", e);
+    }
+  }
+
+  private final CameraCaptureSession.CaptureCallback cb =
+      new CameraCaptureSession.CaptureCallback() {
+
+        @Override
+        public void onCaptureCompleted(@NonNull CameraCaptureSession session,
+                                       @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
+          Face[] faces = result.get(CaptureResult.STATISTICS_FACES);
+          if (faceDetectorCallback != null) {
+            faceDetectorCallback.onGetFaces(faces);
+          }
+        }
+      };
+
+  @SuppressLint("MissingPermission")
+  public void openCameraId(Integer cameraId) {
+    this.cameraId = cameraId;
+    if (prepared) {
+      HandlerThread cameraHandlerThread = new HandlerThread(TAG + " Id = " + cameraId);
+      cameraHandlerThread.start();
+      cameraHandler = new Handler(cameraHandlerThread.getLooper());
+      try {
+        cameraManager.openCamera(cameraId.toString(), this, cameraHandler);
+        cameraCharacteristics = cameraManager.getCameraCharacteristics(Integer.toString(cameraId));
+        running = true;
+        isFrontCamera =
+            (LENS_FACING_FRONT == cameraCharacteristics.get(CameraCharacteristics.LENS_FACING));
+      } catch (CameraAccessException | SecurityException e) {
+        Log.e(TAG, "Error", e);
+      }
+    } else {
+      Log.e(TAG, "Camera2ApiManager need be prepared, Camera2ApiManager not enabled");
+    }
+  }
+
+  public boolean isRunning() {
+    return running;
+  }
+
+  public void switchCamera() {
+    if (cameraDevice != null) {
+      int cameraId = Integer.parseInt(cameraDevice.getId()) == 1 ? 0 : 1;
+      closeCamera(false);
+      prepared = true;
+      openCameraId(cameraId);
+    }
+  }
+
+  public float getMaxZoom() {
+    return (cameraCharacteristics != null ? cameraCharacteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM) : 1);
+  }
+
+  public Float getZoom() {
+    return zoomLevel;
+  }
+
+  public void setZoom(Float level) {
+    try {
+      float maxZoom = getMaxZoom();
+      Rect m = cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
+
+      if ((level <= maxZoom) && (level >= 1)) {
+        zoomLevel = level;
+        int minW = (int) (m.width() / (maxZoom * 10));
+        int minH = (int) (m.height() / (maxZoom * 10));
+        int difW = m.width() - minW;
+        int difH = m.height() - minH;
+        int cropW = (int) (difW / 10 * level);
+        int cropH = (int) (difH / 10 * level);
+        cropW -= cropW & 3;
+        cropH -= cropH & 3;
+        Rect zoom = new Rect(cropW, cropH, m.width() - cropW, m.height() - cropH);
+        if (builderPreview != null) builderPreview.set(CaptureRequest.SCALER_CROP_REGION, zoom);
+        builderInputSurface.set(CaptureRequest.SCALER_CROP_REGION, zoom);
+
+        if (builderPreview != null) {
+          cameraCaptureSession.setRepeatingRequest(builderPreview.build(),
+              faceDetectionEnabled ? cb : null, null);
+        }
+        cameraCaptureSession.setRepeatingRequest(builderInputSurface.build(),
+            faceDetectionEnabled ? cb : null, null);
+      }
+    } catch (CameraAccessException e) {
+      Log.e(TAG, "Error", e);
+    }
+  }
+
+  public void setZoom(MotionEvent event) {
+    float currentFingerSpacing;
+
+    if (event.getPointerCount() > 1) {
+      // Multi touch logic
+      currentFingerSpacing = CameraHelper.getFingerSpacing(event);
+      if (fingerSpacing != 0) {
+        if (currentFingerSpacing > fingerSpacing && getMaxZoom() > zoomLevel) {
+          zoomLevel += 0.1f;
+        } else if (currentFingerSpacing < fingerSpacing && zoomLevel > 1) {
+          zoomLevel -= 0.1f;
+        }
+        setZoom(zoomLevel);
+      }
+      fingerSpacing = currentFingerSpacing;
+    }
+  }
+
+  public boolean isFrontCamera() {
+    return isFrontCamera;
+  }
+
+  private void resetCameraValues() {
+    lanternEnable = false;
+    zoomLevel = 1.0f;
+  }
+
+  public void closeCamera(boolean reOpen) {
+    if (reOpen) {
+      try {
+        if (surfaceEncoder != null && isOpenGl) return;
+        cameraCaptureSession.stopRepeating();
+        if (surfaceView != null || textureView != null) {
+          cameraCaptureSession.setRepeatingBurst(Collections.singletonList(drawSurface(preview)),
+              null, cameraHandler);
+        }
+      } catch (Exception e) {
+        Log.e(TAG, "Error", e);
+      }
+    } else {
+      resetCameraValues();
+
+      cameraCharacteristics = null;
+      if (cameraCaptureSession != null) {
+        cameraCaptureSession.close();
+        cameraCaptureSession = null;
+      }
+      if (cameraDevice != null) {
+        cameraDevice.close();
+        cameraDevice = null;
+      }
+      if (cameraHandler != null) {
+        cameraHandler.getLooper().quitSafely();
+        cameraHandler = null;
+      }
+      prepared = false;
+      builderPreview = null;
+      builderInputSurface = null;
+      running = false;
+    }
+  }
+
+  @Override
+  public void onOpened(@NonNull CameraDevice cameraDevice) {
+    this.cameraDevice = cameraDevice;
+    startPreview(cameraDevice);
+    Log.i(TAG, "Camera opened");
+  }
+
+  @Override
+  public void onDisconnected(@NonNull CameraDevice cameraDevice) {
+    cameraDevice.close();
+    Log.i(TAG, "Camera disconnected");
+  }
+
+  @Override
+  public void onError(@NonNull CameraDevice cameraDevice, int i) {
+    cameraDevice.close();
+    Log.e(TAG, "Open failed");
+  }
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/video/CameraHelper.java b/rtplibrary/src/main/java/com/pedro/encoder/input/video/CameraHelper.java
new file mode 100644
index 0000000..d5f095b
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/video/CameraHelper.java
@@ -0,0 +1,91 @@
+package com.pedro.encoder.input.video;
+
+import android.content.Context;
+import android.view.MotionEvent;
+import android.view.Surface;
+import android.view.WindowManager;
+
+public class CameraHelper {
+
+  //Rotation matrix 0 degrees
+  private static final float[] vertex0 = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 0f,
+      1f, -1f, 0f, 1f, 0f,
+      -1f, 1f, 0f, 0f, 1f,
+      1f, 1f, 0f, 1f, 1f,
+  };
+
+  //Rotation matrix 90 degrees
+  private static final float[] vertex90 = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 1f, 0f,
+      1f, -1f, 0f, 1f, 1f,
+      -1f, 1f, 0f, 0f, 0f,
+      1f, 1f, 0f, 0f, 1f,
+  };
+
+  //Rotation matrix 180 degrees
+  private static final float[] vertex180 = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 1f, 1f,
+      1f, -1f, 0f, 0f, 1f,
+      -1f, 1f, 0f, 1f, 0f,
+      1f, 1f, 0f, 0f, 0f,
+  };
+
+  //Rotation matrix 270 degrees
+  private static final float[] vertex270 = {
+      // X, Y, Z, U, V
+      -1f, -1f, 0f, 0f, 1f,
+      1f, -1f, 0f, 0f, 0f,
+      -1f, 1f, 0f, 1f, 1f,
+      1f, 1f, 0f, 1f, 0f,
+  };
+
+  public static float[] getVertex(int rotation) {
+    switch (rotation) {
+      case 0:
+        return vertex0;
+      case 90:
+        return vertex90;
+      case 180:
+        return vertex180;
+      case 270:
+        return vertex270;
+      default:
+        return vertex0;
+    }
+  }
+
+  public static int getCameraOrientation(Context context) {
+    WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+    if (windowManager != null) {
+      int orientation = windowManager.getDefaultDisplay().getRotation();
+      switch (orientation) {
+        case Surface.ROTATION_0: //portrait
+          return 90;
+        case Surface.ROTATION_90: //landscape
+          return 0;
+        case Surface.ROTATION_180: //reverse portrait
+          return 270;
+        case Surface.ROTATION_270: //reverse landscape
+          return 180;
+        default:
+          return 0;
+      }
+    } else {
+      return 0;
+    }
+  }
+
+  public static float getFingerSpacing(MotionEvent event) {
+    float x = event.getX(0) - event.getX(1);
+    float y = event.getY(0) - event.getY(1);
+    return (float) Math.sqrt(x * x + y * y);
+  }
+
+  public enum Facing {
+    BACK, FRONT
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/video/CameraOpenException.java b/rtplibrary/src/main/java/com/pedro/encoder/input/video/CameraOpenException.java
new file mode 100644
index 0000000..4283124
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/video/CameraOpenException.java
@@ -0,0 +1,12 @@
+package com.pedro.encoder.input.video;
+
+/**
+ * Created by pedro on 12/04/17.
+ */
+
+public class CameraOpenException extends RuntimeException {
+
+  public CameraOpenException(String message) {
+    super(message);
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/video/FaceDetectorUtil.java b/rtplibrary/src/main/java/com/pedro/encoder/input/video/FaceDetectorUtil.java
new file mode 100644
index 0000000..f9dcf4c
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/video/FaceDetectorUtil.java
@@ -0,0 +1,78 @@
+package com.pedro.encoder.input.video;
+
+import android.graphics.Matrix;
+import android.graphics.PointF;
+import android.graphics.RectF;
+import android.hardware.Camera;
+import android.hardware.camera2.params.Face;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.view.View;
+
+public class FaceDetectorUtil {
+
+  public class FaceParsed {
+    private PointF position;
+    private PointF scale;
+
+    public FaceParsed(PointF position, PointF scale) {
+      this.position = position;
+      this.scale = scale;
+    }
+
+    public PointF getPosition() {
+      return position;
+    }
+
+    public void setPosition(PointF position) {
+      this.position = position;
+    }
+
+    public PointF getScale() {
+      return scale;
+    }
+
+    public void setScale(PointF scale) {
+      this.scale = scale;
+    }
+  }
+
+  @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+  public FaceParsed camera2Parse(Face face, View view, PointF scale, int rotation,
+      boolean isFrontCamera) {
+    //Parse face
+    RectF rect = new RectF(face.getBounds());
+    Matrix matrix = new Matrix();
+    matrix.setScale(isFrontCamera ? -1 : 1, 1);
+    matrix.postRotate(rotation);
+    matrix.postScale(1f, 1f);
+    matrix.postTranslate(view.getWidth(), view.getHeight());
+    matrix.mapRect(rect);
+    return getFace(rect, scale, view);
+  }
+
+  public FaceParsed camera1Parse(Camera.Face face, View view, PointF scale, int rotation,
+      boolean isFrontCamera) {
+    //Parse face
+    RectF rect = new RectF(face.rect);
+    Matrix matrix = new Matrix();
+    matrix.setScale(isFrontCamera ? -1 : 1, 1);
+    matrix.postRotate(rotation);
+    matrix.postScale(view.getWidth() / 2000f, view.getHeight() / 2000f);
+    matrix.postTranslate(view.getWidth() / 2f, view.getHeight() / 2f);
+    matrix.mapRect(rect);
+    return getFace(rect, scale, view);
+  }
+
+  private FaceParsed getFace(RectF rectF, PointF scale, View view) {
+    //Position
+    float posX = rectF.centerX() * 100 / view.getWidth();
+    float posY = rectF.centerY() * 100 / view.getHeight();
+    PointF positionParsed = new PointF(posX - scale.x / 2, posY - scale.y / 2);
+    //Scale
+    float scaleX = rectF.width() * 100 / view.getWidth();
+    float scaleY = rectF.height() * 100 / view.getHeight();
+    PointF scaleParsed = new PointF(scaleX, scaleY);
+    return new FaceParsed(positionParsed, scaleParsed);
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/video/FpsLimiter.java b/rtplibrary/src/main/java/com/pedro/encoder/input/video/FpsLimiter.java
new file mode 100644
index 0000000..acd7964
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/video/FpsLimiter.java
@@ -0,0 +1,18 @@
+package com.pedro.encoder.input.video;
+
+public class FpsLimiter {
+
+  private long lastFrameTimestamp = 0L;
+
+  public boolean limitFPS(int fps) {
+    if (System.currentTimeMillis() - lastFrameTimestamp > 1000 / fps) {
+      lastFrameTimestamp = System.currentTimeMillis();
+      return false;
+    }
+    return true;
+  }
+
+  public void reset() {
+    lastFrameTimestamp = 0;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/video/Frame.java b/rtplibrary/src/main/java/com/pedro/encoder/input/video/Frame.java
new file mode 100644
index 0000000..2e5b488
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/video/Frame.java
@@ -0,0 +1,54 @@
+package com.pedro.encoder.input.video;
+
+import android.graphics.ImageFormat;
+
+/**
+ * Created by pedro on 17/02/18.
+ */
+
+public class Frame {
+
+  private byte[] buffer;
+  private int orientation;
+  private boolean flip;
+  private int format = ImageFormat.NV21; //nv21 or yv12 supported
+
+  public Frame(byte[] buffer, int orientation, boolean flip, int format) {
+    this.buffer = buffer;
+    this.orientation = orientation;
+    this.flip = flip;
+    this.format = format;
+  }
+
+  public byte[] getBuffer() {
+    return buffer;
+  }
+
+  public void setBuffer(byte[] buffer) {
+    this.buffer = buffer;
+  }
+
+  public int getOrientation() {
+    return orientation;
+  }
+
+  public void setOrientation(int orientation) {
+    this.orientation = orientation;
+  }
+
+  public boolean isFlip() {
+    return flip;
+  }
+
+  public void setFlip(boolean flip) {
+    this.flip = flip;
+  }
+
+  public int getFormat() {
+    return format;
+  }
+
+  public void setFormat(int format) {
+    this.format = format;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/input/video/GetCameraData.java b/rtplibrary/src/main/java/com/pedro/encoder/input/video/GetCameraData.java
new file mode 100644
index 0000000..70b54c1
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/input/video/GetCameraData.java
@@ -0,0 +1,10 @@
+package com.pedro.encoder.input.video;
+
+/**
+ * Created by pedro on 20/01/17.
+ */
+
+public interface GetCameraData {
+
+  void inputYUVData(Frame frame);
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/utils/CodecUtil.java b/rtplibrary/src/main/java/com/pedro/encoder/utils/CodecUtil.java
new file mode 100644
index 0000000..d0fa5e2
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/utils/CodecUtil.java
@@ -0,0 +1,191 @@
+package com.pedro.encoder.utils;
+
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecList;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Created by pedro on 14/02/18.
+ */
+
+public class CodecUtil {
+
+  private static final String TAG = "CodecUtil";
+
+  public static final String H264_MIME = "video/avc";
+  public static final String H265_MIME = "video/hevc";
+
+  public enum Force {
+    FIRST_COMPATIBLE_FOUND, SOFTWARE, HARDWARE
+  }
+
+  public static List<MediaCodecInfo> getAllCodecs() {
+    List<MediaCodecInfo> mediaCodecInfoList = new ArrayList<>();
+    if (Build.VERSION.SDK_INT >= 21) {
+      MediaCodecList mediaCodecList = new MediaCodecList(MediaCodecList.ALL_CODECS);
+      MediaCodecInfo[] mediaCodecInfos = mediaCodecList.getCodecInfos();
+      mediaCodecInfoList.addAll(Arrays.asList(mediaCodecInfos));
+    } else {
+      int count = MediaCodecList.getCodecCount();
+      for (int i = 0; i < count; i++) {
+        MediaCodecInfo mci = MediaCodecList.getCodecInfoAt(i);
+        mediaCodecInfoList.add(mci);
+      }
+    }
+    return mediaCodecInfoList;
+  }
+
+  public static List<MediaCodecInfo> getAllHardwareEncoders(String mime) {
+    List<MediaCodecInfo> mediaCodecInfoList = getAllEncoders(mime);
+    List<MediaCodecInfo> mediaCodecInfoHardware = new ArrayList<>();
+    for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) {
+      String name = mediaCodecInfo.getName().toLowerCase();
+      if (!name.contains("omx.google") && !name.contains("sw")) {
+        mediaCodecInfoHardware.add(mediaCodecInfo);
+      }
+    }
+    return mediaCodecInfoHardware;
+  }
+
+  public static List<MediaCodecInfo> getAllHardwareDecoders(String mime) {
+    List<MediaCodecInfo> mediaCodecInfoList = getAllDecoders(mime);
+    List<MediaCodecInfo> mediaCodecInfoHardware = new ArrayList<>();
+    for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) {
+      String name = mediaCodecInfo.getName().toLowerCase();
+      if (!name.contains("omx.google") && !name.contains("sw")) {
+        mediaCodecInfoHardware.add(mediaCodecInfo);
+      }
+    }
+    return mediaCodecInfoHardware;
+  }
+
+  public static List<MediaCodecInfo> getAllSoftwareEncoders(String mime) {
+    List<MediaCodecInfo> mediaCodecInfoList = getAllEncoders(mime);
+    List<MediaCodecInfo> mediaCodecInfoSoftware = new ArrayList<>();
+    for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) {
+      String name = mediaCodecInfo.getName().toLowerCase();
+      if (name.contains("omx.google") || name.contains("sw")) {
+        mediaCodecInfoSoftware.add(mediaCodecInfo);
+      }
+    }
+    return mediaCodecInfoSoftware;
+  }
+
+  public static List<MediaCodecInfo> getAllSoftwareDecoders(String mime) {
+    List<MediaCodecInfo> mediaCodecInfoList = getAllDecoders(mime);
+    List<MediaCodecInfo> mediaCodecInfoSoftware = new ArrayList<>();
+    for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) {
+      String name = mediaCodecInfo.getName().toLowerCase();
+      if (name.contains("omx.google") || name.contains("sw")) {
+        mediaCodecInfoSoftware.add(mediaCodecInfo);
+      }
+    }
+    return mediaCodecInfoSoftware;
+  }
+
+  public static List<MediaCodecInfo> getAllEncoders(String mime) {
+    if (Build.VERSION.SDK_INT >= 21) {
+      return getAllEncodersAPI21(mime);
+    } else {
+      return getAllEncodersAPI16(mime);
+    }
+  }
+
+  public static List<MediaCodecInfo> getAllDecoders(String mime) {
+    if (Build.VERSION.SDK_INT >= 21) {
+      return getAllDecodersAPI21(mime);
+    } else {
+      return getAllDecodersAPI16(mime);
+    }
+  }
+
+  /**
+   * choose the video encoder by mime. API 21+
+   */
+  @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+  private static List<MediaCodecInfo> getAllEncodersAPI21(String mime) {
+    List<MediaCodecInfo> mediaCodecInfoList = new ArrayList<>();
+    MediaCodecList mediaCodecList = new MediaCodecList(MediaCodecList.ALL_CODECS);
+    MediaCodecInfo[] mediaCodecInfos = mediaCodecList.getCodecInfos();
+    for (MediaCodecInfo mci : mediaCodecInfos) {
+      if (!mci.isEncoder()) {
+        continue;
+      }
+      String[] types = mci.getSupportedTypes();
+      for (String type : types) {
+        if (type.equalsIgnoreCase(mime)) {
+          mediaCodecInfoList.add(mci);
+        }
+      }
+    }
+    return mediaCodecInfoList;
+  }
+
+  /**
+   * choose the video encoder by mime. API > 16
+   */
+  private static List<MediaCodecInfo> getAllEncodersAPI16(String mime) {
+    List<MediaCodecInfo> mediaCodecInfoList = new ArrayList<>();
+    int count = MediaCodecList.getCodecCount();
+    for (int i = 0; i < count; i++) {
+      MediaCodecInfo mci = MediaCodecList.getCodecInfoAt(i);
+      if (!mci.isEncoder()) {
+        continue;
+      }
+      String[] types = mci.getSupportedTypes();
+      for (String type : types) {
+        if (type.equalsIgnoreCase(mime)) {
+          mediaCodecInfoList.add(mci);
+        }
+      }
+    }
+    return mediaCodecInfoList;
+  }
+
+  /**
+   * choose the video encoder by mime. API 21+
+   */
+  @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+  private static List<MediaCodecInfo> getAllDecodersAPI21(String mime) {
+    List<MediaCodecInfo> mediaCodecInfoList = new ArrayList<>();
+    MediaCodecList mediaCodecList = new MediaCodecList(MediaCodecList.ALL_CODECS);
+    MediaCodecInfo[] mediaCodecInfos = mediaCodecList.getCodecInfos();
+    for (MediaCodecInfo mci : mediaCodecInfos) {
+      if (mci.isEncoder()) {
+        continue;
+      }
+      String[] types = mci.getSupportedTypes();
+      for (String type : types) {
+        if (type.equalsIgnoreCase(mime)) {
+          mediaCodecInfoList.add(mci);
+        }
+      }
+    }
+    return mediaCodecInfoList;
+  }
+
+  /**
+   * choose the video encoder by mime. API > 16
+   */
+  private static List<MediaCodecInfo> getAllDecodersAPI16(String mime) {
+    List<MediaCodecInfo> mediaCodecInfoList = new ArrayList<>();
+    int count = MediaCodecList.getCodecCount();
+    for (int i = 0; i < count; i++) {
+      MediaCodecInfo mci = MediaCodecList.getCodecInfoAt(i);
+      if (mci.isEncoder()) {
+        continue;
+      }
+      String[] types = mci.getSupportedTypes();
+      for (String type : types) {
+        if (type.equalsIgnoreCase(mime)) {
+          mediaCodecInfoList.add(mci);
+        }
+      }
+    }
+    return mediaCodecInfoList;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/utils/PCMUtil.java b/rtplibrary/src/main/java/com/pedro/encoder/utils/PCMUtil.java
new file mode 100644
index 0000000..3c95f04
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/utils/PCMUtil.java
@@ -0,0 +1,42 @@
+package com.pedro.encoder.utils;
+
+/**
+ * Created by pedro on 3/07/17.
+ */
+public class PCMUtil {
+
+  //no tested
+  //see https://stackoverflow.com/questions/15652432/how-to-mix-overlay-two-mp3-audio-file-into-one-mp3-file-not-concatenate/33255658#33255658
+  public static byte[] mixPCM(byte[] pcm1, byte[] pcm2) {
+    int len1 = pcm1.length;
+    int len2 = pcm2.length;
+    byte[] pcmL;
+    byte[] pcmS;
+    int lenL; // length of the longest
+    int lenS; // length of the shortest
+    if (len2 > len1) {
+      lenL = len1;
+      pcmL = pcm1;
+      lenS = len2;
+      pcmS = pcm2;
+    } else {
+      lenL = len2;
+      pcmL = pcm2;
+      lenS = len1;
+      pcmS = pcm1;
+    }
+    for (int idx = 0; idx < lenL; idx++) {
+      int sample;
+      if (idx >= lenS) {
+        sample = pcmL[idx];
+      } else {
+        sample = pcmL[idx] + pcmS[idx];
+      }
+      sample = (int) (sample * .71);
+      if (sample > 127) sample = 127;
+      if (sample < -128) sample = -128;
+      pcmL[idx] = (byte) sample;
+    }
+    return pcmL;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/GifStreamObject.java b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/GifStreamObject.java
new file mode 100644
index 0000000..dfe27dc
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/GifStreamObject.java
@@ -0,0 +1,95 @@
+package com.pedro.encoder.utils.gl;
+
+import android.graphics.Bitmap;
+import android.util.Log;
+import com.pedro.encoder.utils.gl.gif.GifDecoder;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Created by pedro on 22/09/17.
+ */
+
+public class GifStreamObject extends StreamObjectBase {
+
+  private static final String TAG = "GifStreamObject";
+
+  private int numFrames;
+  private Bitmap[] gifBitmaps;
+  private int[] gifDelayFrames;
+  private long startDelayFrame;
+  private int currentGifFrame;
+
+  public GifStreamObject() {
+  }
+
+  @Override
+  public int getWidth() {
+    return gifBitmaps != null ? gifBitmaps[0].getWidth() : 0;
+  }
+
+  @Override
+  public int getHeight() {
+    return gifBitmaps != null ? gifBitmaps[0].getHeight() : 0;
+  }
+
+  public void load(InputStream inputStreamGif) throws IOException {
+    GifDecoder gifDecoder = new GifDecoder();
+    if (gifDecoder.read(inputStreamGif, inputStreamGif.available()) == 0) {
+      Log.i(TAG, "read gif ok");
+      numFrames = gifDecoder.getFrameCount();
+      gifDelayFrames = new int[numFrames];
+      gifBitmaps = new Bitmap[numFrames];
+      for (int i = 0; i < numFrames; i++) {
+        gifDecoder.advance();
+        gifBitmaps[i] = gifDecoder.getNextFrame();
+        gifDelayFrames[i] = gifDecoder.getNextDelay();
+      }
+      Log.i(TAG, "finish load gif frames");
+    } else {
+      throw new IOException("Read gif error");
+    }
+  }
+
+  @Override
+  public void recycle() {
+    if (gifBitmaps != null) {
+      for (int i = 0; i < numFrames; i++) {
+        gifBitmaps[i].recycle();
+      }
+    }
+  }
+
+  @Override
+  public int getNumFrames() {
+    return numFrames;
+  }
+
+  public int[] getGifDelayFrames() {
+    return gifDelayFrames;
+  }
+
+  public Bitmap[] getGifBitmaps() {
+    return gifBitmaps;
+  }
+
+  public int updateFrame(int size) {
+    return size <= 1 ? 0 : updateFrame();
+  }
+
+  @Override
+  public int updateFrame() {
+    if (startDelayFrame == 0) {
+      startDelayFrame = System.currentTimeMillis();
+    }
+    if (System.currentTimeMillis() - startDelayFrame >= gifDelayFrames[currentGifFrame]) {
+      if (currentGifFrame >= numFrames - 1) {
+        currentGifFrame = 0;
+      } else {
+        currentGifFrame++;
+      }
+      startDelayFrame = 0;
+    }
+    return currentGifFrame;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/GlUtil.java b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/GlUtil.java
new file mode 100644
index 0000000..c7efe39
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/GlUtil.java
@@ -0,0 +1,161 @@
+package com.pedro.encoder.utils.gl;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Matrix;
+import android.opengl.EGL14;
+import android.opengl.GLES11Ext;
+import android.opengl.GLES20;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.util.Log;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+
+/**
+ * Created by pedro on 9/09/17.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class GlUtil {
+
+  private static final String TAG = "GlUtil";
+
+  public static int loadShader(int shaderType, String source) {
+    int shader = GLES20.glCreateShader(shaderType);
+    checkGlError("glCreateShader type=" + shaderType);
+    GLES20.glShaderSource(shader, source);
+    GLES20.glCompileShader(shader);
+    int[] compiled = new int[1];
+    GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
+    if (compiled[0] == 0) {
+      Log.e(TAG, "Could not compile shader " + shaderType + ":");
+      Log.e(TAG, " " + GLES20.glGetShaderInfoLog(shader));
+      GLES20.glDeleteShader(shader);
+      shader = 0;
+    }
+    return shader;
+  }
+
+  public static int createProgram(String vertexSource, String fragmentSource) {
+    int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
+    if (vertexShader == 0) {
+      return 0;
+    }
+    int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
+    if (pixelShader == 0) {
+      return 0;
+    }
+
+    int program = GLES20.glCreateProgram();
+    checkGlError("glCreateProgram");
+    if (program == 0) {
+      Log.e(TAG, "Could not create program");
+    }
+    GLES20.glAttachShader(program, vertexShader);
+    checkGlError("glAttachShader");
+    GLES20.glAttachShader(program, pixelShader);
+    checkGlError("glAttachShader");
+    GLES20.glLinkProgram(program);
+    int[] linkStatus = new int[1];
+    GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
+    if (linkStatus[0] != GLES20.GL_TRUE) {
+      Log.e(TAG, "Could not link program: ");
+      Log.e(TAG, GLES20.glGetProgramInfoLog(program));
+      GLES20.glDeleteProgram(program);
+      program = 0;
+    }
+    return program;
+  }
+
+  public static void createTextures(int cantidad, int[] texturesId, int position) {
+    GLES20.glGenTextures(cantidad, texturesId, position);
+    for (int i = 0; i < cantidad; i++) {
+      GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + position + i);
+      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texturesId[position + i]);
+      GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
+      GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
+      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
+          GLES20.GL_CLAMP_TO_EDGE);
+      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
+          GLES20.GL_CLAMP_TO_EDGE);
+    }
+  }
+
+  public static void createExternalTextures(int cantidad, int[] texturesId, int position) {
+    GLES20.glGenTextures(cantidad, texturesId, position);
+    for (int i = 0; i < cantidad; i++) {
+      GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + position + i);
+      GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, texturesId[position + i]);
+      GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER,
+          GLES20.GL_LINEAR);
+      GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER,
+          GLES20.GL_LINEAR);
+      GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S,
+          GLES20.GL_CLAMP_TO_EDGE);
+      GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T,
+          GLES20.GL_CLAMP_TO_EDGE);
+    }
+  }
+
+  public static String getStringFromRaw(Context context, int id) {
+    String str;
+    try {
+      Resources r = context.getResources();
+      InputStream is = r.openRawResource(id);
+      ByteArrayOutputStream baos = new ByteArrayOutputStream();
+      int i = is.read();
+      while (i != -1) {
+        baos.write(i);
+        i = is.read();
+      }
+      str = baos.toString();
+      is.close();
+    } catch (IOException e) {
+      str = "";
+    }
+    return str;
+  }
+
+  public static void checkGlError(String op) {
+    int error;
+    while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
+      Log.e(TAG, op + ": glError " + error);
+      throw new RuntimeException(op + ": glError " + error);
+    }
+  }
+
+  public static void checkEglError(String msg) {
+    int error;
+    if ((error = EGL14.eglGetError()) != EGL14.EGL_SUCCESS) {
+      throw new RuntimeException(msg + ": EGL error: 0x" + Integer.toHexString(error));
+    }
+  }
+
+  public static Bitmap getBitmap(int originalWidth, int originalHeight, int finalWidth,
+      int finalHeight) {
+    //Get opengl buffer
+    ByteBuffer buffer = ByteBuffer.allocateDirect(originalWidth * originalHeight * 4);
+    GLES20.glReadPixels(0, 0, originalWidth, originalHeight, GLES20.GL_RGBA,
+        GLES20.GL_UNSIGNED_BYTE, buffer);
+    //Create bitmap preview resolution
+    Bitmap bitmap = Bitmap.createBitmap(originalWidth, originalHeight, Bitmap.Config.ARGB_8888);
+    //Set buffer to bitmap
+    bitmap.copyPixelsFromBuffer(buffer);
+    //Scale to stream resolution
+    bitmap = Bitmap.createScaledBitmap(bitmap, finalWidth, finalHeight, false);
+    //Flip vertical
+    return flipVerticalBitmap(bitmap, finalWidth, finalHeight);
+  }
+
+  private static Bitmap flipVerticalBitmap(Bitmap bitmap, int width, int height) {
+    float cx = width / 2f;
+    float cy = height / 2f;
+    Matrix matrix = new Matrix();
+    matrix.postScale(1f, -1f, cx, cy);
+    return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/ImageStreamObject.java b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/ImageStreamObject.java
new file mode 100644
index 0000000..461f143
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/ImageStreamObject.java
@@ -0,0 +1,54 @@
+package com.pedro.encoder.utils.gl;
+
+import android.graphics.Bitmap;
+import android.util.Log;
+
+/**
+ * Created by pedro on 23/09/17.
+ */
+
+public class ImageStreamObject extends StreamObjectBase {
+
+  private static final String TAG = "ImageStreamObject";
+
+  private int numFrames;
+  private Bitmap imageBitmap;
+
+  public ImageStreamObject() {
+  }
+
+  @Override
+  public int getWidth() {
+    return imageBitmap != null ? imageBitmap.getWidth() : 0;
+  }
+
+  @Override
+  public int getHeight() {
+    return imageBitmap != null ? imageBitmap.getHeight() : 0;
+  }
+
+  public void load(Bitmap imageBitmap) {
+    this.imageBitmap = imageBitmap;
+    numFrames = 1;
+    Log.i(TAG, "finish load image");
+  }
+
+  @Override
+  public void recycle() {
+    if (imageBitmap != null) imageBitmap.recycle();
+  }
+
+  @Override
+  public int getNumFrames() {
+    return numFrames;
+  }
+
+  public Bitmap getImageBitmap() {
+    return imageBitmap;
+  }
+
+  @Override
+  public int updateFrame() {
+    return 0;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/StreamObjectBase.java b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/StreamObjectBase.java
new file mode 100644
index 0000000..ffc76f7
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/StreamObjectBase.java
@@ -0,0 +1,18 @@
+package com.pedro.encoder.utils.gl;
+
+/**
+ * Created by pedro on 9/10/17.
+ */
+
+public abstract class StreamObjectBase {
+
+  public abstract int getWidth();
+
+  public abstract int getHeight();
+
+  public abstract int updateFrame();
+
+  public abstract void recycle();
+
+  public abstract int getNumFrames();
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/TextStreamObject.java b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/TextStreamObject.java
new file mode 100644
index 0000000..17c57a0
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/TextStreamObject.java
@@ -0,0 +1,76 @@
+package com.pedro.encoder.utils.gl;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.util.Log;
+
+/**
+ * Created by pedro on 23/09/17.
+ */
+
+public class TextStreamObject extends StreamObjectBase {
+
+  private static final String TAG = "TextStreamObject";
+
+  private int numFrames;
+  private Bitmap imageBitmap;
+
+  public TextStreamObject() {
+  }
+
+  @Override
+  public int getWidth() {
+    return imageBitmap != null ? imageBitmap.getWidth() : 0;
+  }
+
+  @Override
+  public int getHeight() {
+    return imageBitmap != null ? imageBitmap.getHeight() : 0;
+  }
+
+  public void load(String text, float textSize, int textColor) {
+    numFrames = 1;
+    imageBitmap = textAsBitmap(text, textSize, textColor);
+    Log.i(TAG, "finish load text");
+  }
+
+  @Override
+  public void recycle() {
+    if (imageBitmap != null) imageBitmap.recycle();
+  }
+
+  private Bitmap textAsBitmap(String text, float textSize, int textColor) {
+    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+    paint.setTextSize(textSize);
+    paint.setColor(textColor);
+    paint.setAlpha(255);
+    paint.setTextAlign(Paint.Align.LEFT);
+
+    float baseline = -paint.ascent(); // ascent() is negative
+    int width = (int) (paint.measureText(text) + 0.5f); // round
+    int height = (int) (baseline + paint.descent() + 0.5f);
+    Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+    Canvas canvas = new Canvas(image);
+    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
+
+    canvas.drawText(text, 0, baseline, paint);
+    return image;
+  }
+
+  @Override
+  public int getNumFrames() {
+    return numFrames;
+  }
+
+  public Bitmap getImageBitmap() {
+    return imageBitmap;
+  }
+
+  @Override
+  public int updateFrame() {
+    return 0;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/TranslateTo.java b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/TranslateTo.java
new file mode 100644
index 0000000..45b4df3
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/TranslateTo.java
@@ -0,0 +1,10 @@
+package com.pedro.encoder.utils.gl;
+
+/**
+ * Created by pedro on 18/11/17.
+ */
+
+public enum TranslateTo {
+
+  CENTER, LEFT, RIGHT, TOP, BOTTOM, TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/GifDecoder.java b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/GifDecoder.java
new file mode 100644
index 0000000..488051f
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/GifDecoder.java
@@ -0,0 +1,930 @@
+/**
+ * Copyright (c) 2013 Xcellent Creations, Inc.
+ * Copyright 2014 Google, Inc. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ * associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.pedro.encoder.utils.gl.gif;
+
+import android.annotation.TargetApi;
+import android.graphics.Bitmap;
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.util.Log;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Arrays;
+
+/**
+ * Reads frame data from a GIF image source and decodes it into individual frames
+ * for animation purposes. Image data can be read from either and InputStream source
+ * or a byte[].
+ *
+ * This class is optimized for running animations with the frames, there
+ * are no methods to get individual frame images, only to decode the next frame in the
+ * animation sequence. Instead, it lowers its memory footprint by only housing the minimum
+ * data necessary to decode the next frame in the animation sequence.
+ *
+ * The animation must be manually moved forward using {@link #advance()} before requesting the next
+ * frame. This method must also be called before you request the first frame or an error will
+ * occur.
+ *
+ * Implementation adapted from sample code published in Lyons. (2004). <em>Java for Programmers</em>,
+ * republished under the MIT Open Source License
+ */
+public class GifDecoder {
+  private static final String TAG = GifDecoder.class.getSimpleName();
+
+  /**
+   * File read status: No errors.
+   */
+  static final int STATUS_OK = 0;
+  /**
+   * File read status: Error decoding file (may be partially decoded).
+   */
+  static final int STATUS_FORMAT_ERROR = 1;
+  /**
+   * File read status: Unable to open source.
+   */
+  static final int STATUS_OPEN_ERROR = 2;
+  /**
+   * Unable to fully decode the current frame.
+   */
+  static final int STATUS_PARTIAL_DECODE = 3;
+  /**
+   * max decoder pixel stack size.
+   */
+  private static final int MAX_STACK_SIZE = 4096;
+
+  /**
+   * GIF Disposal Method meaning take no action.
+   */
+  private static final int DISPOSAL_UNSPECIFIED = 0;
+  /**
+   * GIF Disposal Method meaning leave canvas from previous frame.
+   */
+  private static final int DISPOSAL_NONE = 1;
+  /**
+   * GIF Disposal Method meaning clear canvas to background color.
+   */
+  private static final int DISPOSAL_BACKGROUND = 2;
+  /**
+   * GIF Disposal Method meaning clear canvas to frame before last.
+   */
+  private static final int DISPOSAL_PREVIOUS = 3;
+
+  private static final int NULL_CODE = -1;
+
+  private static final int INITIAL_FRAME_POINTER = -1;
+
+  static final int LOOP_FOREVER = -1;
+
+  private static final int BYTES_PER_INTEGER = 4;
+
+  // Global File Header values and parsing flags.
+  // Active color table.
+  private int[] act;
+  // Private color table that can be modified if needed.
+  private final int[] pct = new int[256];
+
+  // Raw GIF data from input source.
+  private ByteBuffer rawData;
+
+  // Raw data read working array.
+  private byte[] block;
+
+  // Temporary buffer for block reading. Reads 16k chunks from the native buffer for processing,
+  // to greatly reduce JNI overhead.
+  private static final int WORK_BUFFER_SIZE = 16384;
+  @Nullable private byte[] workBuffer;
+  private int workBufferSize = 0;
+  private int workBufferPosition = 0;
+
+  private GifHeaderParser parser;
+
+  // LZW decoder working arrays.
+  private short[] prefix;
+  private byte[] suffix;
+  private byte[] pixelStack;
+  private byte[] mainPixels;
+  private int[] mainScratch;
+
+  private int framePointer;
+  private int loopIndex;
+  private GifHeader header;
+  private BitmapProvider bitmapProvider;
+  private Bitmap previousImage;
+  private boolean savePrevious;
+  private int status;
+  private int sampleSize;
+  private int downsampledHeight;
+  private int downsampledWidth;
+  private boolean isFirstFrameTransparent;
+
+  /**
+   * An interface that can be used to provide reused {@link Bitmap}s to avoid GCs
+   * from constantly allocating {@link Bitmap}s for every frame.
+   */
+  interface BitmapProvider {
+    /**
+     * Returns an {@link Bitmap} with exactly the given dimensions and config.
+     *
+     * @param width The width in pixels of the desired {@link Bitmap}.
+     * @param height The height in pixels of the desired {@link Bitmap}.
+     * @param config The {@link Bitmap.Config} of the desired {@link
+     * Bitmap}.
+     */
+    @NonNull
+    Bitmap obtain(int width, int height, Bitmap.Config config);
+
+    /**
+     * Releases the given Bitmap back to the pool.
+     */
+    void release(Bitmap bitmap);
+
+    /**
+     * Returns a byte array used for decoding and generating the frame bitmap.
+     *
+     * @param size the size of the byte array to obtain
+     */
+    byte[] obtainByteArray(int size);
+
+    /**
+     * Releases the given byte array back to the pool.
+     */
+    void release(byte[] bytes);
+
+    /**
+     * Returns an int array used for decoding/generating the frame bitmaps.
+     */
+    int[] obtainIntArray(int size);
+
+    /**
+     * Release the given array back to the pool.
+     */
+    void release(int[] array);
+  }
+
+  public GifDecoder(BitmapProvider provider, GifHeader gifHeader, ByteBuffer rawData) {
+    this(provider, gifHeader, rawData, 1 /*sampleSize*/);
+  }
+
+  public GifDecoder(BitmapProvider provider, GifHeader gifHeader, ByteBuffer rawData,
+      int sampleSize) {
+    this(provider);
+    setData(gifHeader, rawData, sampleSize);
+  }
+
+  public GifDecoder(BitmapProvider provider) {
+    this.bitmapProvider = provider;
+    header = new GifHeader();
+  }
+
+  public GifDecoder() {
+    this(new SimpleBitmapProvider());
+  }
+
+  public int getWidth() {
+    return header.width;
+  }
+
+  public int getHeight() {
+    return header.height;
+  }
+
+  ByteBuffer getData() {
+    return rawData;
+  }
+
+  /**
+   * Returns the current status of the decoder.
+   *
+   * <p> Status will update per frame to allow the caller to tell whether or not the current frame
+   * was decoded successfully and/or completely. Format and open failures persist across frames.
+   * </p>
+   */
+  public int getStatus() {
+    return status;
+  }
+
+  /**
+   * Move the animation frame counter forward.
+   *
+   * @return boolean specifying if animation should continue or if loopCount has been fulfilled.
+   */
+  public boolean advance() {
+    if (header.frameCount <= 0) {
+      return false;
+    }
+
+    if (framePointer == getFrameCount() - 1) {
+      loopIndex++;
+    }
+
+    if (header.loopCount != LOOP_FOREVER && loopIndex > header.loopCount) {
+      return false;
+    }
+
+    framePointer = (framePointer + 1) % header.frameCount;
+    return true;
+  }
+
+  /**
+   * Gets display duration for specified frame.
+   *
+   * @param n int index of frame.
+   * @return delay in milliseconds.
+   */
+  public int getDelay(int n) {
+    int delay = -1;
+    if ((n >= 0) && (n < header.frameCount)) {
+      delay = header.frames.get(n).delay;
+    }
+    return delay;
+  }
+
+  /**
+   * Gets display duration for the upcoming frame in ms.
+   */
+  public int getNextDelay() {
+    if (header.frameCount <= 0 || framePointer < 0) {
+      return 0;
+    }
+
+    return getDelay(framePointer);
+  }
+
+  /**
+   * Gets the number of frames read from file.
+   *
+   * @return frame count.
+   */
+  public int getFrameCount() {
+    return header.frameCount;
+  }
+
+  /**
+   * Gets the current index of the animation frame, or -1 if animation hasn't not yet started.
+   *
+   * @return frame index.
+   */
+  public int getCurrentFrameIndex() {
+    return framePointer;
+  }
+
+  /**
+   * Sets the frame pointer to a specific frame
+   *
+   * @return boolean true if the move was successful
+   */
+  public boolean setFrameIndex(int frame) {
+    if (frame < INITIAL_FRAME_POINTER || frame >= getFrameCount()) {
+      return false;
+    }
+    framePointer = frame;
+    return true;
+  }
+
+  /**
+   * Resets the frame pointer to before the 0th frame, as if we'd never used this decoder to
+   * decode any frames.
+   */
+  public void resetFrameIndex() {
+    framePointer = INITIAL_FRAME_POINTER;
+  }
+
+  /**
+   * Resets the loop index to the first loop.
+   */
+  public void resetLoopIndex() {
+    loopIndex = 0;
+  }
+
+  /**
+   * Gets the "Netscape" iteration count, if any. A count of 0 means repeat indefinitely.
+   *
+   * @return iteration count if one was specified, else 1.
+   */
+  public int getLoopCount() {
+    return header.loopCount;
+  }
+
+  /**
+   * Gets the number of loops that have been shown.
+   *
+   * @return iteration count.
+   */
+  public int getLoopIndex() {
+    return loopIndex;
+  }
+
+  /**
+   * Returns an estimated byte size for this decoder based on the data provided to {@link
+   * #setData(GifHeader, byte[])}, as well as internal buffers.
+   */
+  public int getByteSize() {
+    return rawData.limit() + mainPixels.length + (mainScratch.length * BYTES_PER_INTEGER);
+  }
+
+  /**
+   * Get the next frame in the animation sequence.
+   *
+   * @return Bitmap representation of frame.
+   */
+  public synchronized Bitmap getNextFrame() {
+    if (header.frameCount <= 0 || framePointer < 0) {
+      if (Log.isLoggable(TAG, Log.DEBUG)) {
+        Log.d(TAG, "unable to decode frame, frameCount="
+            + header.frameCount
+            + " framePointer="
+            + framePointer);
+      }
+      status = STATUS_FORMAT_ERROR;
+    }
+    if (status == STATUS_FORMAT_ERROR || status == STATUS_OPEN_ERROR) {
+      if (Log.isLoggable(TAG, Log.DEBUG)) {
+        Log.d(TAG, "Unable to decode frame, status=" + status);
+      }
+      return null;
+    }
+    status = STATUS_OK;
+
+    GifFrame currentFrame = header.frames.get(framePointer);
+    GifFrame previousFrame = null;
+    int previousIndex = framePointer - 1;
+    if (previousIndex >= 0) {
+      previousFrame = header.frames.get(previousIndex);
+    }
+
+    // Set the appropriate color table.
+    act = currentFrame.lct != null ? currentFrame.lct : header.gct;
+    if (act == null) {
+      if (Log.isLoggable(TAG, Log.DEBUG)) {
+        Log.d(TAG, "No Valid Color Table for frame #" + framePointer);
+      }
+      // No color table defined.
+      status = STATUS_FORMAT_ERROR;
+      return null;
+    }
+
+    // Reset the transparent pixel in the color table
+    if (currentFrame.transparency) {
+      // Prepare local copy of color table ("pct = act"), see #1068
+      System.arraycopy(act, 0, pct, 0, act.length);
+      // Forget about act reference from shared header object, use copied version
+      act = pct;
+      // Set transparent color if specified.
+      act[currentFrame.transIndex] = 0;
+    }
+
+    // Transfer pixel data to image.
+    return setPixels(currentFrame, previousFrame);
+  }
+
+  /**
+   * Reads GIF image from stream.
+   *
+   * @param is containing GIF file.
+   * @return read status code (0 = no errors).
+   */
+  public int read(InputStream is, int contentLength) {
+    if (is != null) {
+      try {
+        int capacity = (contentLength > 0) ? (contentLength + 4096) : 16384;
+        ByteArrayOutputStream buffer = new ByteArrayOutputStream(capacity);
+        int nRead;
+        byte[] data = new byte[16384];
+        while ((nRead = is.read(data, 0, data.length)) != -1) {
+          buffer.write(data, 0, nRead);
+        }
+        buffer.flush();
+
+        read(buffer.toByteArray());
+      } catch (IOException e) {
+        Log.w(TAG, "Error reading data from stream", e);
+      }
+    } else {
+      status = STATUS_OPEN_ERROR;
+    }
+
+    try {
+      if (is != null) {
+        is.close();
+      }
+    } catch (IOException e) {
+      Log.w(TAG, "Error closing stream", e);
+    }
+
+    return status;
+  }
+
+  public void clear() {
+    header = null;
+    if (mainPixels != null) {
+      bitmapProvider.release(mainPixels);
+    }
+    if (mainScratch != null) {
+      bitmapProvider.release(mainScratch);
+    }
+    if (previousImage != null) {
+      bitmapProvider.release(previousImage);
+    }
+    previousImage = null;
+    rawData = null;
+    isFirstFrameTransparent = false;
+    if (block != null) {
+      bitmapProvider.release(block);
+    }
+    if (workBuffer != null) {
+      bitmapProvider.release(workBuffer);
+    }
+  }
+
+  public synchronized void setData(GifHeader header, byte[] data) {
+    setData(header, ByteBuffer.wrap(data));
+  }
+
+  public synchronized void setData(GifHeader header, ByteBuffer buffer) {
+    setData(header, buffer, 1);
+  }
+
+  public synchronized void setData(GifHeader header, ByteBuffer buffer, int sampleSize) {
+    if (sampleSize <= 0) {
+      throw new IllegalArgumentException("Sample size must be >=0, not: " + sampleSize);
+    }
+    // Make sure sample size is a power of 2.
+    sampleSize = Integer.highestOneBit(sampleSize);
+    this.status = STATUS_OK;
+    this.header = header;
+    isFirstFrameTransparent = false;
+    framePointer = INITIAL_FRAME_POINTER;
+    resetLoopIndex();
+    // Initialize the raw data buffer.
+    rawData = buffer.asReadOnlyBuffer();
+    rawData.position(0);
+    rawData.order(ByteOrder.LITTLE_ENDIAN);
+
+    // No point in specially saving an old frame if we're never going to use it.
+    savePrevious = false;
+    for (GifFrame frame : header.frames) {
+      if (frame.dispose == DISPOSAL_PREVIOUS) {
+        savePrevious = true;
+        break;
+      }
+    }
+
+    this.sampleSize = sampleSize;
+    downsampledWidth = header.width / sampleSize;
+    downsampledHeight = header.height / sampleSize;
+    // Now that we know the size, init scratch arrays.
+    // TODO Find a way to avoid this entirely or at least downsample it (either should be possible).
+    mainPixels = bitmapProvider.obtainByteArray(header.width * header.height);
+    mainScratch = bitmapProvider.obtainIntArray(downsampledWidth * downsampledHeight);
+  }
+
+  private GifHeaderParser getHeaderParser() {
+    if (parser == null) {
+      parser = new GifHeaderParser();
+    }
+    return parser;
+  }
+
+  /**
+   * Reads GIF image from byte array.
+   *
+   * @param data containing GIF file.
+   * @return read status code (0 = no errors).
+   */
+  public synchronized int read(byte[] data) {
+    this.header = getHeaderParser().setData(data).parseHeader();
+    if (data != null) {
+      setData(header, data);
+    }
+
+    return status;
+  }
+
+  /**
+   * Creates new frame image from current data (and previous frames as specified by their
+   * disposition codes).
+   */
+  private Bitmap setPixels(GifFrame currentFrame, GifFrame previousFrame) {
+    // Final location of blended pixels.
+    final int[] dest = mainScratch;
+
+    // clear all pixels when meet first frame
+    if (previousFrame == null) {
+      Arrays.fill(dest, 0);
+    }
+
+    // fill in starting image contents based on last image's dispose code
+    if (previousFrame != null && previousFrame.dispose > DISPOSAL_UNSPECIFIED) {
+      // We don't need to do anything for DISPOSAL_NONE, if it has the correct pixels so will our
+      // mainScratch and therefore so will our dest array.
+      if (previousFrame.dispose == DISPOSAL_BACKGROUND) {
+        // Start with a canvas filled with the background color
+        int c = 0;
+        if (!currentFrame.transparency) {
+          c = header.bgColor;
+          if (currentFrame.lct != null && header.bgIndex == currentFrame.transIndex) {
+            c = 0;
+          }
+        } else if (framePointer == 0) {
+          // TODO: We should check and see if all individual pixels are replaced. If they are, the
+          // first frame isn't actually transparent. For now, it's simpler and safer to assume
+          // drawing a transparent background means the GIF contains transparency.
+          isFirstFrameTransparent = true;
+        }
+        fillRect(dest, previousFrame, c);
+      } else if (previousFrame.dispose == DISPOSAL_PREVIOUS) {
+        if (previousImage == null) {
+          fillRect(dest, previousFrame, 0);
+        } else {
+          // Start with the previous frame
+          int downsampledIH = previousFrame.ih / sampleSize;
+          int downsampledIY = previousFrame.iy / sampleSize;
+          int downsampledIW = previousFrame.iw / sampleSize;
+          int downsampledIX = previousFrame.ix / sampleSize;
+          int topLeft = downsampledIY * downsampledWidth + downsampledIX;
+          previousImage.getPixels(dest, topLeft, downsampledWidth, downsampledIX, downsampledIY,
+              downsampledIW, downsampledIH);
+        }
+      }
+    }
+
+    // Decode pixels for this frame into the global pixels[] scratch.
+    decodeBitmapData(currentFrame);
+
+    int downsampledIH = currentFrame.ih / sampleSize;
+    int downsampledIY = currentFrame.iy / sampleSize;
+    int downsampledIW = currentFrame.iw / sampleSize;
+    int downsampledIX = currentFrame.ix / sampleSize;
+    // Copy each source line to the appropriate place in the destination.
+    int pass = 1;
+    int inc = 8;
+    int iline = 0;
+    boolean isFirstFrame = framePointer == 0;
+    for (int i = 0; i < downsampledIH; i++) {
+      int line = i;
+      if (currentFrame.interlace) {
+        if (iline >= downsampledIH) {
+          pass++;
+          switch (pass) {
+            case 2:
+              iline = 4;
+              break;
+            case 3:
+              iline = 2;
+              inc = 4;
+              break;
+            case 4:
+              iline = 1;
+              inc = 2;
+              break;
+            default:
+              break;
+          }
+        }
+        line = iline;
+        iline += inc;
+      }
+      line += downsampledIY;
+      if (line < downsampledHeight) {
+        int k = line * downsampledWidth;
+        // Start of line in dest.
+        int dx = k + downsampledIX;
+        // End of dest line.
+        int dlim = dx + downsampledIW;
+        if (k + downsampledWidth < dlim) {
+          // Past dest edge.
+          dlim = k + downsampledWidth;
+        }
+        // Start of line in source.
+        int sx = i * sampleSize * currentFrame.iw;
+        int maxPositionInSource = sx + ((dlim - dx) * sampleSize);
+        while (dx < dlim) {
+          // Map color and insert in destination.
+          int averageColor;
+          if (sampleSize == 1) {
+            int currentColorIndex = ((int) mainPixels[sx]) & 0x000000ff;
+            averageColor = act[currentColorIndex];
+          } else {
+            // TODO: This is substantially slower (up to 50ms per frame) than just grabbing the
+            // current color index above, even with a sample size of 1.
+            averageColor = averageColorsNear(sx, maxPositionInSource, currentFrame.iw);
+          }
+          if (averageColor != 0) {
+            dest[dx] = averageColor;
+          } else if (!isFirstFrameTransparent && isFirstFrame) {
+            isFirstFrameTransparent = true;
+          }
+          sx += sampleSize;
+          dx++;
+        }
+      }
+    }
+
+    // Copy pixels into previous image
+    if (savePrevious && (currentFrame.dispose == DISPOSAL_UNSPECIFIED
+        || currentFrame.dispose == DISPOSAL_NONE)) {
+      if (previousImage == null) {
+        previousImage = getNextBitmap();
+      }
+      previousImage.setPixels(dest, 0, downsampledWidth, 0, 0, downsampledWidth, downsampledHeight);
+    }
+
+    // Set pixels for current image.
+    Bitmap result = getNextBitmap();
+    result.setPixels(dest, 0, downsampledWidth, 0, 0, downsampledWidth, downsampledHeight);
+    return result;
+  }
+
+  private void fillRect(int[] dest, GifFrame frame, int bgColor) {
+    // The area used by the graphic must be restored to the background color.
+    int downsampledIH = frame.ih / sampleSize;
+    int downsampledIY = frame.iy / sampleSize;
+    int downsampledIW = frame.iw / sampleSize;
+    int downsampledIX = frame.ix / sampleSize;
+    int topLeft = downsampledIY * downsampledWidth + downsampledIX;
+    int bottomLeft = topLeft + downsampledIH * downsampledWidth;
+    for (int left = topLeft; left < bottomLeft; left += downsampledWidth) {
+      int right = left + downsampledIW;
+      for (int pointer = left; pointer < right; pointer++) {
+        dest[pointer] = bgColor;
+      }
+    }
+  }
+
+  private int averageColorsNear(int positionInMainPixels, int maxPositionInMainPixels,
+      int currentFrameIw) {
+    int alphaSum = 0;
+    int redSum = 0;
+    int greenSum = 0;
+    int blueSum = 0;
+
+    int totalAdded = 0;
+    // Find the pixels in the current row.
+    for (int i = positionInMainPixels; i < positionInMainPixels + sampleSize
+        && i < mainPixels.length
+        && i < maxPositionInMainPixels; i++) {
+      int currentColorIndex = ((int) mainPixels[i]) & 0xff;
+      int currentColor = act[currentColorIndex];
+      if (currentColor != 0) {
+        alphaSum += currentColor >> 24 & 0x000000ff;
+        redSum += currentColor >> 16 & 0x000000ff;
+        greenSum += currentColor >> 8 & 0x000000ff;
+        blueSum += currentColor & 0x000000ff;
+        totalAdded++;
+      }
+    }
+    // Find the pixels in the next row.
+    for (int i = positionInMainPixels + currentFrameIw;
+        i < positionInMainPixels + currentFrameIw + sampleSize
+            && i < mainPixels.length
+            && i < maxPositionInMainPixels; i++) {
+      int currentColorIndex = ((int) mainPixels[i]) & 0xff;
+      int currentColor = act[currentColorIndex];
+      if (currentColor != 0) {
+        alphaSum += currentColor >> 24 & 0x000000ff;
+        redSum += currentColor >> 16 & 0x000000ff;
+        greenSum += currentColor >> 8 & 0x000000ff;
+        blueSum += currentColor & 0x000000ff;
+        totalAdded++;
+      }
+    }
+    if (totalAdded == 0) {
+      return 0;
+    } else {
+      return ((alphaSum / totalAdded) << 24) | ((redSum / totalAdded) << 16) | ((greenSum
+          / totalAdded) << 8) | (blueSum / totalAdded);
+    }
+  }
+
+  /**
+   * Decodes LZW image data into pixel array. Adapted from John Cristy's BitmapMagick.
+   */
+  private void decodeBitmapData(GifFrame frame) {
+    workBufferSize = 0;
+    workBufferPosition = 0;
+    if (frame != null) {
+      // Jump to the frame start position.
+      rawData.position(frame.bufferFrameStart);
+    }
+
+    int npix = (frame == null) ? header.width * header.height : frame.iw * frame.ih;
+    int available, clear, codeMask, codeSize, endOfInformation, inCode, oldCode, bits, code, count,
+        i, datum, dataSize, first, top, bi, pi;
+
+    if (mainPixels == null || mainPixels.length < npix) {
+      // Allocate new pixel array.
+      mainPixels = bitmapProvider.obtainByteArray(npix);
+    }
+    if (prefix == null) {
+      prefix = new short[MAX_STACK_SIZE];
+    }
+    if (suffix == null) {
+      suffix = new byte[MAX_STACK_SIZE];
+    }
+    if (pixelStack == null) {
+      pixelStack = new byte[MAX_STACK_SIZE + 1];
+    }
+
+    // Initialize GIF data stream decoder.
+    dataSize = readByte();
+    clear = 1 << dataSize;
+    endOfInformation = clear + 1;
+    available = clear + 2;
+    oldCode = NULL_CODE;
+    codeSize = dataSize + 1;
+    codeMask = (1 << codeSize) - 1;
+    for (code = 0; code < clear; code++) {
+      // XXX ArrayIndexOutOfBoundsException.
+      prefix[code] = 0;
+      suffix[code] = (byte) code;
+    }
+
+    // Decode GIF pixel stream.
+    datum = bits = count = first = top = pi = bi = 0;
+    for (i = 0; i < npix; ) {
+      // Load bytes until there are enough bits for a code.
+      if (count == 0) {
+        // Read a new data block.
+        count = readBlock();
+        if (count <= 0) {
+          status = STATUS_PARTIAL_DECODE;
+          break;
+        }
+        bi = 0;
+      }
+
+      datum += (((int) block[bi]) & 0xff) << bits;
+      bits += 8;
+      bi++;
+      count--;
+
+      while (bits >= codeSize) {
+        // Get the next code.
+        code = datum & codeMask;
+        datum >>= codeSize;
+        bits -= codeSize;
+
+        // Interpret the code.
+        if (code == clear) {
+          // Reset decoder.
+          codeSize = dataSize + 1;
+          codeMask = (1 << codeSize) - 1;
+          available = clear + 2;
+          oldCode = NULL_CODE;
+          continue;
+        }
+
+        if (code > available) {
+          status = STATUS_PARTIAL_DECODE;
+          break;
+        }
+
+        if (code == endOfInformation) {
+          break;
+        }
+
+        if (oldCode == NULL_CODE) {
+          pixelStack[top++] = suffix[code];
+          oldCode = code;
+          first = code;
+          continue;
+        }
+        inCode = code;
+        if (code >= available) {
+          pixelStack[top++] = (byte) first;
+          code = oldCode;
+        }
+        while (code >= clear) {
+          pixelStack[top++] = suffix[code];
+          code = prefix[code];
+        }
+        first = ((int) suffix[code]) & 0xff;
+        pixelStack[top++] = (byte) first;
+
+        // Add a new string to the string table.
+        if (available < MAX_STACK_SIZE) {
+          prefix[available] = (short) oldCode;
+          suffix[available] = (byte) first;
+          available++;
+          if (((available & codeMask) == 0) && (available < MAX_STACK_SIZE)) {
+            codeSize++;
+            codeMask += available;
+          }
+        }
+        oldCode = inCode;
+
+        while (top > 0) {
+          // Pop a pixel off the pixel stack.
+          mainPixels[pi++] = pixelStack[--top];
+          i++;
+        }
+      }
+    }
+
+    // Clear missing pixels.
+    for (i = pi; i < npix; i++) {
+      mainPixels[i] = 0;
+    }
+  }
+
+  /**
+   * Reads the next chunk for the intermediate work buffer.
+   */
+  private void readChunkIfNeeded() {
+    if (workBufferSize > workBufferPosition) {
+      return;
+    }
+    if (workBuffer == null) {
+      workBuffer = bitmapProvider.obtainByteArray(WORK_BUFFER_SIZE);
+    }
+    workBufferPosition = 0;
+    workBufferSize = Math.min(rawData.remaining(), WORK_BUFFER_SIZE);
+    rawData.get(workBuffer, 0, workBufferSize);
+  }
+
+  /**
+   * Reads a single byte from the input stream.
+   */
+  private int readByte() {
+    try {
+      readChunkIfNeeded();
+      return workBuffer[workBufferPosition++] & 0xFF;
+    } catch (Exception e) {
+      status = STATUS_FORMAT_ERROR;
+      return 0;
+    }
+  }
+
+  /**
+   * Reads next variable length block from input.
+   *
+   * @return number of bytes stored in "buffer".
+   */
+  private int readBlock() {
+    int blockSize = readByte();
+    if (blockSize > 0) {
+      try {
+        if (block == null) {
+          block = bitmapProvider.obtainByteArray(255);
+        }
+        final int remaining = workBufferSize - workBufferPosition;
+        if (remaining >= blockSize) {
+          // Block can be read from the current work buffer.
+          System.arraycopy(workBuffer, workBufferPosition, block, 0, blockSize);
+          workBufferPosition += blockSize;
+        } else if (rawData.remaining() + remaining >= blockSize) {
+          // Block can be read in two passes.
+          System.arraycopy(workBuffer, workBufferPosition, block, 0, remaining);
+          workBufferPosition = workBufferSize;
+          readChunkIfNeeded();
+          final int secondHalfRemaining = blockSize - remaining;
+          System.arraycopy(workBuffer, 0, block, remaining, secondHalfRemaining);
+          workBufferPosition += secondHalfRemaining;
+        } else {
+          status = STATUS_FORMAT_ERROR;
+        }
+      } catch (Exception e) {
+        Log.w(TAG, "Error Reading Block", e);
+        status = STATUS_FORMAT_ERROR;
+      }
+    }
+    return blockSize;
+  }
+
+  private Bitmap getNextBitmap() {
+    Bitmap.Config config =
+        isFirstFrameTransparent ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
+    Bitmap result = bitmapProvider.obtain(downsampledWidth, downsampledHeight, config);
+    setAlpha(result);
+    return result;
+  }
+
+  @TargetApi(12)
+  private static void setAlpha(Bitmap bitmap) {
+    if (Build.VERSION.SDK_INT >= 12) {
+      bitmap.setHasAlpha(true);
+    }
+  }
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/GifFrame.java b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/GifFrame.java
new file mode 100644
index 0000000..70f81d3
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/GifFrame.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright 2014 Google, Inc. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ * associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.pedro.encoder.utils.gl.gif;
+
+/**
+ * Inner model class housing metadata for each frame.
+ */
+class GifFrame {
+  int ix, iy, iw, ih;
+  /**
+   * Control Flag.
+   */
+  boolean interlace;
+  /**
+   * Control Flag.
+   */
+  boolean transparency;
+  /**
+   * Disposal Method.
+   */
+  int dispose;
+  /**
+   * Transparency Index.
+   */
+  int transIndex;
+  /**
+   * Delay, in ms, to next frame.
+   */
+  int delay;
+  /**
+   * Index in the raw buffer where we need to start reading to decode.
+   */
+  int bufferFrameStart;
+  /**
+   * Local Color Table.
+   */
+  int[] lct;
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/GifHeader.java b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/GifHeader.java
new file mode 100644
index 0000000..3336c5f
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/GifHeader.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright 2014 Google, Inc. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ * associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.pedro.encoder.utils.gl.gif;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A header object containing the number of frames in an animated GIF image as well as basic
+ * metadata like width and height that can be used to decode each individual frame of the GIF. Can
+ * be shared by one or more {@link GifDecoder}s to play the same animated GIF in multiple views.
+ */
+public class GifHeader {
+
+  int[] gct = null;
+  int status = GifDecoder.STATUS_OK;
+  int frameCount = 0;
+
+  GifFrame currentFrame;
+  List<GifFrame> frames = new ArrayList<>();
+  // Logical screen size.
+  // Full image width.
+  int width;
+  // Full image height.
+  int height;
+
+  // 1 : global color table flag.
+  boolean gctFlag;
+  // 2-4 : color resolution.
+  // 5 : gct sort flag.
+  // 6-8 : gct size.
+  int gctSize;
+  // Background color index.
+  int bgIndex;
+  // Pixel aspect ratio.
+  int pixelAspect;
+  //TODO: this is set both during reading the header and while decoding frames...
+  int bgColor;
+  int loopCount = 0;
+
+  public int getHeight() {
+    return height;
+  }
+
+  public int getWidth() {
+    return width;
+  }
+
+  public int getNumFrames() {
+    return frameCount;
+  }
+
+  /**
+   * Global status code of GIF data parsing.
+   */
+  public int getStatus() {
+    return status;
+  }
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/GifHeaderParser.java b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/GifHeaderParser.java
new file mode 100644
index 0000000..9503edb
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/GifHeaderParser.java
@@ -0,0 +1,425 @@
+/**
+ * Copyright 2014 Google, Inc. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+ * associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.pedro.encoder.utils.gl.gif;
+
+import android.util.Log;
+
+import java.nio.BufferUnderflowException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Arrays;
+
+/**
+ * A class responsible for creating {@link GifHeader}s from data
+ * representing animated gifs.
+ */
+public class GifHeaderParser {
+  public static final String TAG = "GifHeaderParser";
+
+  // The minimum frame delay in hundredths of a second.
+  static final int MIN_FRAME_DELAY = 2;
+  // The default frame delay in hundredths of a second for GIFs with frame delays less than the
+  // minimum.
+  static final int DEFAULT_FRAME_DELAY = 10;
+
+  private static final int MAX_BLOCK_SIZE = 256;
+  // Raw data read working array.
+  private final byte[] block = new byte[MAX_BLOCK_SIZE];
+
+  private ByteBuffer rawData;
+  private GifHeader header;
+  private int blockSize = 0;
+
+  public GifHeaderParser setData(ByteBuffer data) {
+    reset();
+    rawData = data.asReadOnlyBuffer();
+    rawData.position(0);
+    rawData.order(ByteOrder.LITTLE_ENDIAN);
+    return this;
+  }
+
+  public GifHeaderParser setData(byte[] data) {
+    if (data != null) {
+      setData(ByteBuffer.wrap(data));
+    } else {
+      rawData = null;
+      header.status = GifDecoder.STATUS_OPEN_ERROR;
+    }
+    return this;
+  }
+
+  public void clear() {
+    rawData = null;
+    header = null;
+  }
+
+  private void reset() {
+    rawData = null;
+    Arrays.fill(block, (byte) 0);
+    header = new GifHeader();
+    blockSize = 0;
+  }
+
+  public GifHeader parseHeader() {
+    if (rawData == null) {
+      throw new IllegalStateException("You must call setData() before parseHeader()");
+    }
+    if (err()) {
+      return header;
+    }
+
+    readHeader();
+    if (!err()) {
+      readContents();
+      if (header.frameCount < 0) {
+        header.status = GifDecoder.STATUS_FORMAT_ERROR;
+      }
+    }
+
+    return header;
+  }
+
+  /**
+   * Determines if the GIF is animated by trying to read in the first 2 frames
+   * This method reparses the data even if the header has already been read.
+   */
+  public boolean isAnimated() {
+    readHeader();
+    if (!err()) {
+      readContents(2 /* maxFrames */);
+    }
+    return header.frameCount > 1;
+  }
+
+  /**
+   * Main file parser. Reads GIF content blocks.
+   */
+  private void readContents() {
+    readContents(Integer.MAX_VALUE /* maxFrames */);
+  }
+
+  /**
+   * Main file parser. Reads GIF content blocks. Stops after reading maxFrames
+   */
+  private void readContents(int maxFrames) {
+    // Read GIF file content blocks.
+    boolean done = false;
+    while (!(done || err() || header.frameCount > maxFrames)) {
+      int code = read();
+      switch (code) {
+        // Image separator.
+        case 0x2C:
+          // The graphics control extension is optional, but will always come first if it exists.
+          // If one did
+          // exist, there will be a non-null current frame which we should use. However if one
+          // did not exist,
+          // the current frame will be null and we must create it here. See issue #134.
+          if (header.currentFrame == null) {
+            header.currentFrame = new GifFrame();
+          }
+          readBitmap();
+          break;
+        // Extension.
+        case 0x21:
+          code = read();
+          switch (code) {
+            // Graphics control extension.
+            case 0xf9:
+              // Start a new frame.
+              header.currentFrame = new GifFrame();
+              readGraphicControlExt();
+              break;
+            // Application extension.
+            case 0xff:
+              readBlock();
+              String app = "";
+              for (int i = 0; i < 11; i++) {
+                app += (char) block[i];
+              }
+              if (app.equals("NETSCAPE2.0")) {
+                readNetscapeExt();
+              } else {
+                // Don't care.
+                skip();
+              }
+              break;
+            // Comment extension.
+            case 0xfe:
+              skip();
+              break;
+            // Plain text extension.
+            case 0x01:
+              skip();
+              break;
+            // Uninteresting extension.
+            default:
+              skip();
+          }
+          break;
+        // Terminator.
+        case 0x3b:
+          done = true;
+          break;
+        // Bad byte, but keep going and see what happens break;
+        case 0x00:
+        default:
+          header.status = GifDecoder.STATUS_FORMAT_ERROR;
+      }
+    }
+  }
+
+  /**
+   * Reads Graphics Control Extension values.
+   */
+  private void readGraphicControlExt() {
+    // Block size.
+    read();
+    // Packed fields.
+    int packed = read();
+    // Disposal method.
+    header.currentFrame.dispose = (packed & 0x1c) >> 2;
+    if (header.currentFrame.dispose == 0) {
+      // Elect to keep old image if discretionary.
+      header.currentFrame.dispose = 1;
+    }
+    header.currentFrame.transparency = (packed & 1) != 0;
+    // Delay in milliseconds.
+    int delayInHundredthsOfASecond = readShort();
+    // TODO: consider allowing -1 to indicate show forever.
+    if (delayInHundredthsOfASecond < MIN_FRAME_DELAY) {
+      delayInHundredthsOfASecond = DEFAULT_FRAME_DELAY;
+    }
+    header.currentFrame.delay = delayInHundredthsOfASecond * 10;
+    // Transparent color index
+    header.currentFrame.transIndex = read();
+    // Block terminator
+    read();
+  }
+
+  /**
+   * Reads next frame image.
+   */
+  private void readBitmap() {
+    // (sub)image position & size.
+    header.currentFrame.ix = readShort();
+    header.currentFrame.iy = readShort();
+    header.currentFrame.iw = readShort();
+    header.currentFrame.ih = readShort();
+
+    int packed = read();
+    // 1 - local color table flag interlace
+    boolean lctFlag = (packed & 0x80) != 0;
+    int lctSize = (int) Math.pow(2, (packed & 0x07) + 1);
+    // 3 - sort flag
+    // 4-5 - reserved lctSize = 2 << (packed & 7); // 6-8 - local color
+    // table size
+    header.currentFrame.interlace = (packed & 0x40) != 0;
+    if (lctFlag) {
+      // Read table.
+      header.currentFrame.lct = readColorTable(lctSize);
+    } else {
+      // No local color table.
+      header.currentFrame.lct = null;
+    }
+
+    // Save this as the decoding position pointer.
+    header.currentFrame.bufferFrameStart = rawData.position();
+
+    // False decode pixel data to advance buffer.
+    skipImageData();
+
+    if (err()) {
+      return;
+    }
+
+    header.frameCount++;
+    // Add image to frame.
+    header.frames.add(header.currentFrame);
+  }
+
+  /**
+   * Reads Netscape extension to obtain iteration count.
+   */
+  private void readNetscapeExt() {
+    do {
+      readBlock();
+      if (block[0] == 1) {
+        // Loop count sub-block.
+        int b1 = ((int) block[1]) & 0xff;
+        int b2 = ((int) block[2]) & 0xff;
+        header.loopCount = (b2 << 8) | b1;
+        if (header.loopCount == 0) {
+          header.loopCount = GifDecoder.LOOP_FOREVER;
+        }
+      }
+    } while ((blockSize > 0) && !err());
+  }
+
+  /**
+   * Reads GIF file header information.
+   */
+  private void readHeader() {
+    String id = "";
+    for (int i = 0; i < 6; i++) {
+      id += (char) read();
+    }
+    if (!id.startsWith("GIF")) {
+      header.status = GifDecoder.STATUS_FORMAT_ERROR;
+      return;
+    }
+    readLSD();
+    if (header.gctFlag && !err()) {
+      header.gct = readColorTable(header.gctSize);
+      header.bgColor = header.gct[header.bgIndex];
+    }
+  }
+
+  /**
+   * Reads Logical Screen Descriptor.
+   */
+  private void readLSD() {
+    // Logical screen size.
+    header.width = readShort();
+    header.height = readShort();
+    // Packed fields
+    int packed = read();
+    // 1 : global color table flag.
+    header.gctFlag = (packed & 0x80) != 0;
+    // 2-4 : color resolution.
+    // 5 : gct sort flag.
+    // 6-8 : gct size.
+    header.gctSize = 2 << (packed & 7);
+    // Background color index.
+    header.bgIndex = read();
+    // Pixel aspect ratio
+    header.pixelAspect = read();
+  }
+
+  /**
+   * Reads color table as 256 RGB integer values.
+   *
+   * @param ncolors int number of colors to read.
+   * @return int array containing 256 colors (packed ARGB with full alpha).
+   */
+  private int[] readColorTable(int ncolors) {
+    int nbytes = 3 * ncolors;
+    int[] tab = null;
+    byte[] c = new byte[nbytes];
+
+    try {
+      rawData.get(c);
+
+      // TODO: what bounds checks are we avoiding if we know the number of colors?
+      // Max size to avoid bounds checks.
+      tab = new int[MAX_BLOCK_SIZE];
+      int i = 0;
+      int j = 0;
+      while (i < ncolors) {
+        int r = ((int) c[j++]) & 0xff;
+        int g = ((int) c[j++]) & 0xff;
+        int b = ((int) c[j++]) & 0xff;
+        tab[i++] = 0xff000000 | (r << 16) | (g << 8) | b;
+      }
+    } catch (BufferUnderflowException e) {
+      if (Log.isLoggable(TAG, Log.DEBUG)) {
+        Log.d(TAG, "Format Error Reading Color Table", e);
+      }
+      header.status = GifDecoder.STATUS_FORMAT_ERROR;
+    }
+
+    return tab;
+  }
+
+  /**
+   * Skips LZW image data for a single frame to advance buffer.
+   */
+  private void skipImageData() {
+    // lzwMinCodeSize
+    read();
+    // data sub-blocks
+    skip();
+  }
+
+  /**
+   * Skips variable length blocks up to and including next zero length block.
+   */
+  private void skip() {
+    try {
+      int blockSize;
+      do {
+        blockSize = read();
+        rawData.position(rawData.position() + blockSize);
+      } while (blockSize > 0);
+    } catch (IllegalArgumentException ex) {
+    }
+  }
+
+  /**
+   * Reads next variable length block from input.
+   *
+   * @return number of bytes stored in "buffer"
+   */
+  private int readBlock() {
+    blockSize = read();
+    int n = 0;
+    if (blockSize > 0) {
+      int count = 0;
+      try {
+        while (n < blockSize) {
+          count = blockSize - n;
+          rawData.get(block, n, count);
+
+          n += count;
+        }
+      } catch (Exception e) {
+        if (Log.isLoggable(TAG, Log.DEBUG)) {
+          Log.d(TAG,
+              "Error Reading Block n: " + n + " count: " + count + " blockSize: " + blockSize, e);
+        }
+        header.status = GifDecoder.STATUS_FORMAT_ERROR;
+      }
+    }
+    return n;
+  }
+
+  /**
+   * Reads a single byte from the input stream.
+   */
+  private int read() {
+    int curByte = 0;
+    try {
+      curByte = rawData.get() & 0xFF;
+    } catch (Exception e) {
+      header.status = GifDecoder.STATUS_FORMAT_ERROR;
+    }
+    return curByte;
+  }
+
+  /**
+   * Reads next 16-bit value, LSB first.
+   */
+  private int readShort() {
+    // Read 16-bit value.
+    return rawData.getShort();
+  }
+
+  private boolean err() {
+    return header.status != GifDecoder.STATUS_OK;
+  }
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/SimpleBitmapProvider.java b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/SimpleBitmapProvider.java
new file mode 100644
index 0000000..ec515db
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/utils/gl/gif/SimpleBitmapProvider.java
@@ -0,0 +1,37 @@
+package com.pedro.encoder.utils.gl.gif;
+
+import android.graphics.Bitmap;
+import android.support.annotation.NonNull;
+
+final class SimpleBitmapProvider implements GifDecoder.BitmapProvider {
+  @NonNull
+  @Override
+  public Bitmap obtain(int width, int height, Bitmap.Config config) {
+    return Bitmap.createBitmap(width, height, config);
+  }
+
+  @Override
+  public void release(Bitmap bitmap) {
+    bitmap.recycle();
+  }
+
+  @Override
+  public byte[] obtainByteArray(int size) {
+    return new byte[size];
+  }
+
+  @Override
+  public void release(byte[] bytes) {
+    // no-op
+  }
+
+  @Override
+  public int[] obtainIntArray(int size) {
+    return new int[size];
+  }
+
+  @Override
+  public void release(int[] array) {
+    // no-op
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/utils/yuv/NV21Utils.java b/rtplibrary/src/main/java/com/pedro/encoder/utils/yuv/NV21Utils.java
new file mode 100644
index 0000000..19ed3e3
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/utils/yuv/NV21Utils.java
@@ -0,0 +1,200 @@
+package com.pedro.encoder.utils.yuv;
+
+public class NV21Utils {
+
+  private static byte[] preAllocatedBufferRotate;
+  private static byte[] preAllocatedBufferColor;
+
+  public static void preAllocateBuffers(int length) {
+    preAllocatedBufferRotate = new byte[length];
+    preAllocatedBufferColor = new byte[length];
+  }
+
+  public static int[] toARGB(byte[] yuv, int width, int height) {
+    int[] argb = new int[width * height];
+    final int frameSize = width * height;
+    final int ii = 0;
+    final int ij = 0;
+    final int di = +1;
+    final int dj = +1;
+    int a = 0;
+    for (int i = 0, ci = ii; i < height; ++i, ci += di) {
+      for (int j = 0, cj = ij; j < width; ++j, cj += dj) {
+        int y = (0xff & ((int) yuv[ci * width + cj]));
+        int v = (0xff & ((int) yuv[frameSize + (ci >> 1) * width + (cj & ~1) + 0]));
+        int u = (0xff & ((int) yuv[frameSize + (ci >> 1) * width + (cj & ~1) + 1]));
+        y = y < 16 ? 16 : y;
+        int r = (int) (1.164f * (y - 16) + 1.596f * (v - 128));
+        int g = (int) (1.164f * (y - 16) - 0.813f * (v - 128) - 0.391f * (u - 128));
+        int b = (int) (1.164f * (y - 16) + 2.018f * (u - 128));
+        r = r < 0 ? 0 : (r > 255 ? 255 : r);
+        g = g < 0 ? 0 : (g > 255 ? 255 : g);
+        b = b < 0 ? 0 : (b > 255 ? 255 : b);
+        argb[a++] = 0xff000000 | (r << 16) | (g << 8) | b;
+      }
+    }
+    return argb;
+  }
+
+  public static byte[] toYV12(byte[] input, int width, int height) {
+    final int frameSize = width * height;
+    final int qFrameSize = frameSize / 4;
+    System.arraycopy(input, 0, preAllocatedBufferColor, 0, frameSize); // Y
+    for (int i = 0; i < qFrameSize; i++) {
+      preAllocatedBufferColor[frameSize + i + qFrameSize] = input[frameSize + i * 2 + 1]; // Cb (U)
+      preAllocatedBufferColor[frameSize + i] = input[frameSize + i * 2]; // Cr (V)
+    }
+    return preAllocatedBufferColor;
+  }
+
+  // the color transform, @see http://stackoverflow.com/questions/15739684/mediacodec-and-camera-color-space-incorrect
+  public static byte[] toNV12(byte[] input, int width, int height) {
+    final int frameSize = width * height;
+    final int qFrameSize = frameSize / 4;
+    System.arraycopy(input, 0, preAllocatedBufferColor, 0, frameSize); // Y
+    for (int i = 0; i < qFrameSize; i++) {
+      preAllocatedBufferColor[frameSize + i * 2] = input[frameSize + i * 2 + 1]; // Cb (U)
+      preAllocatedBufferColor[frameSize + i * 2 + 1] = input[frameSize + i * 2]; // Cr (V)
+    }
+    return preAllocatedBufferColor;
+  }
+
+  public static byte[] toI420(byte[] input, int width, int height) {
+    final int frameSize = width * height;
+    final int qFrameSize = frameSize / 4;
+    System.arraycopy(input, 0, preAllocatedBufferColor, 0, frameSize); // Y
+    for (int i = 0; i < qFrameSize; i++) {
+      preAllocatedBufferColor[frameSize + i] = input[frameSize + i * 2 + 1]; // Cb (U)
+      preAllocatedBufferColor[frameSize + i + qFrameSize] = input[frameSize + i * 2]; // Cr (V)
+    }
+    return preAllocatedBufferColor;
+  }
+
+  public static byte[] rotate90(byte[] data, int imageWidth, int imageHeight) {
+    // Rotate the Y luma
+    int i = 0;
+    for (int x = 0; x < imageWidth; x++) {
+      for (int y = imageHeight - 1; y >= 0; y--) {
+        preAllocatedBufferRotate[i++] = data[y * imageWidth + x];
+      }
+    }
+    // Rotate the U and V color components
+    int size = imageWidth * imageHeight;
+    i = size * 3 / 2 - 1;
+    for (int x = imageWidth - 1; x > 0; x = x - 2) {
+      for (int y = 0; y < imageHeight / 2; y++) {
+        preAllocatedBufferRotate[i--] = data[size + (y * imageWidth) + x];
+        preAllocatedBufferRotate[i--] = data[size + (y * imageWidth) + (x - 1)];
+      }
+    }
+    return preAllocatedBufferRotate;
+  }
+
+  public static byte[] rotate180(byte[] data, int imageWidth, int imageHeight) {
+    int count = 0;
+    for (int i = imageWidth * imageHeight - 1; i >= 0; i--) {
+      preAllocatedBufferRotate[count] = data[i];
+      count++;
+    }
+    for (int i = imageWidth * imageHeight * 3 / 2 - 1; i >= imageWidth * imageHeight; i -= 2) {
+      preAllocatedBufferRotate[count++] = data[i - 1];
+      preAllocatedBufferRotate[count++] = data[i];
+    }
+    return preAllocatedBufferRotate;
+  }
+
+  public static byte[] rotate270(byte[] data, int imageWidth, int imageHeight) {
+    // Rotate the Y luma
+    int i = 0;
+    for (int x = imageWidth - 1; x >= 0; x--) {
+      for (int y = 0; y < imageHeight; y++) {
+        preAllocatedBufferRotate[i++] = data[y * imageWidth + x];
+      }
+    }
+
+    // Rotate the U and V color components
+    i = imageWidth * imageHeight;
+    int uvHeight = imageHeight / 2;
+    for (int x = imageWidth - 1; x >= 0; x -= 2) {
+      for (int y = imageHeight; y < uvHeight + imageHeight; y++) {
+        preAllocatedBufferRotate[i++] = data[y * imageWidth + x - 1];
+        preAllocatedBufferRotate[i++] = data[y * imageWidth + x];
+      }
+    }
+    return preAllocatedBufferRotate;
+  }
+
+  public static byte[] rotatePixels(byte[] input, int width, int height, int rotation) {
+    byte[] output = new byte[input.length];
+
+    boolean swap = (rotation == 90 || rotation == 270);
+    boolean yflip = (rotation == 90 || rotation == 180);
+    boolean xflip = (rotation == 270 || rotation == 180);
+    for (int x = 0; x < width; x++) {
+      for (int y = 0; y < height; y++) {
+        int xo = x, yo = y;
+        int w = width, h = height;
+        int xi = xo, yi = yo;
+        if (swap) {
+          xi = w * yo / h;
+          yi = h * xo / w;
+        }
+        if (yflip) {
+          yi = h - yi - 1;
+        }
+        if (xflip) {
+          xi = w - xi - 1;
+        }
+        output[w * yo + xo] = input[w * yi + xi];
+        int fs = w * h;
+        int qs = (fs >> 2);
+        xi = (xi >> 1);
+        yi = (yi >> 1);
+        xo = (xo >> 1);
+        yo = (yo >> 1);
+        w = (w >> 1);
+        h = (h >> 1);
+        // adjust for interleave here
+        int ui = fs + (w * yi + xi) * 2;
+        int uo = fs + (w * yo + xo) * 2;
+        // and here
+        int vi = ui + 1;
+        int vo = uo + 1;
+        output[uo] = input[ui];
+        output[vo] = input[vi];
+      }
+    }
+    return output;
+  }
+
+  public static byte[] mirror(byte[] input, int width, int height) {
+    byte[] output = new byte[input.length];
+
+    for (int x = 0; x < width; x++) {
+      for (int y = 0; y < height; y++) {
+        int xo = x, yo = y;
+        int w = width, h = height;
+        int xi = xo, yi = yo;
+        yi = h - yi - 1;
+        output[w * yo + xo] = input[w * yi + xi];
+        int fs = w * h;
+        int qs = (fs >> 2);
+        xi = (xi >> 1);
+        yi = (yi >> 1);
+        xo = (xo >> 1);
+        yo = (yo >> 1);
+        w = (w >> 1);
+        h = (h >> 1);
+        // adjust for interleave here
+        int ui = fs + (w * yi + xi) * 2;
+        int uo = fs + (w * yo + xo) * 2;
+        // and here
+        int vi = ui + 1;
+        int vo = uo + 1;
+        output[uo] = input[ui];
+        output[vo] = input[vi];
+      }
+    }
+    return output;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/utils/yuv/YUVUtil.java b/rtplibrary/src/main/java/com/pedro/encoder/utils/yuv/YUVUtil.java
new file mode 100644
index 0000000..7604817
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/utils/yuv/YUVUtil.java
@@ -0,0 +1,244 @@
+package com.pedro.encoder.utils.yuv;
+
+import android.graphics.Bitmap;
+import android.media.MediaCodecInfo;
+import com.pedro.encoder.input.video.Frame;
+import com.pedro.encoder.video.FormatVideoEncoder;
+
+/**
+ * Created by pedro on 25/01/17.
+ * https://wiki.videolan.org/YUV/#I420
+ *
+ * Example YUV images 4x4 px.
+ *
+ * NV21 example:
+ *
+ * Y1   Y2   Y3   Y4
+ * Y5   Y6   Y7   Y8
+ * Y9   Y10  Y11  Y12
+ * Y13  Y14  Y15  Y16
+ * U1   V1   U2   V2
+ * U3   V3   U4   V4
+ *
+ *
+ * YV12 example:
+ *
+ * Y1   Y2   Y3   Y4
+ * Y5   Y6   Y7   Y8
+ * Y9   Y10  Y11  Y12
+ * Y13  Y14  Y15  Y16
+ * U1   U2   U3   U4
+ * V1   V2   V3   V4
+ *
+ *
+ * YUV420 planar example (I420):
+ *
+ * Y1   Y2   Y3   Y4
+ * Y5   Y6   Y7   Y8
+ * Y9   Y10  Y11  Y12
+ * Y13  Y14  Y15  Y16
+ * V1   V2   V3   V4
+ * U1   U2   U3   U4
+ *
+ *
+ * YUV420 semi planar example (NV12):
+ *
+ * Y1   Y2   Y3   Y4
+ * Y5   Y6   Y7   Y8
+ * Y9   Y10  Y11  Y12
+ * Y13  Y14  Y15  Y16
+ * V1   U1   V2   U2
+ * V3   U3   V4   U4
+ */
+
+public class YUVUtil {
+
+
+  public static void preAllocateBuffers(int length) {
+    NV21Utils.preAllocateBuffers(length);
+    YV12Utils.preAllocateBuffers(length);
+  }
+
+  public static byte[] NV21toYUV420byColor(byte[] input, int width, int height,
+      FormatVideoEncoder formatVideoEncoder) {
+    switch (formatVideoEncoder) {
+      case YUV420PLANAR:
+        return NV21Utils.toI420(input, width, height);
+      case YUV420SEMIPLANAR:
+        return NV21Utils.toNV12(input, width, height);
+      default:
+        return null;
+    }
+  }
+
+  public static byte[] rotateNV21(byte[] data, int width, int height, int rotation) {
+    switch (rotation) {
+      case 0:
+        return data;
+      case 90:
+        return NV21Utils.rotate90(data, width, height);
+      case 180:
+        return NV21Utils.rotate180(data, width, height);
+      case 270:
+        return NV21Utils.rotate270(data, width, height);
+      default:
+        return null;
+    }
+  }
+
+  public static byte[] YV12toYUV420byColor(byte[] input, int width, int height,
+      FormatVideoEncoder formatVideoEncoder) {
+    switch (formatVideoEncoder) {
+      case YUV420PLANAR:
+        return YV12Utils.toI420(input, width, height);
+      case YUV420SEMIPLANAR:
+        return YV12Utils.toNV12(input, width, height);
+      default:
+        return null;
+    }
+  }
+
+  public static byte[] rotateYV12(byte[] data, int width, int height, int rotation) {
+    switch (rotation) {
+      case 0:
+        return data;
+      case 90:
+        return YV12Utils.rotate90(data, width, height);
+      case 180:
+        return YV12Utils.rotate180(data, width, height);
+      case 270:
+        return YV12Utils.rotate270(data, width, height);
+      default:
+        return null;
+    }
+  }
+
+  public static Bitmap frameToBitmap(Frame frame, int width, int height, int orientation) {
+    int w = (orientation == 90 || orientation == 270) ? height : width;
+    int h = (orientation == 90 || orientation == 270) ? width : height;
+    int[] argb = NV21Utils.toARGB(rotateNV21(frame.getBuffer(), width, height, orientation), w, h);
+    return Bitmap.createBitmap(argb, w, h, Bitmap.Config.ARGB_8888);
+  }
+
+  public static byte[] ARGBtoYUV420SemiPlanar(int[] input, int width, int height) {
+    /*
+     * COLOR_FormatYUV420SemiPlanar is NV12
+     */
+    final int frameSize = width * height;
+    byte[] yuv420sp = new byte[width * height * 3 / 2];
+    int yIndex = 0;
+    int uvIndex = frameSize;
+
+    int a, R, G, B, Y, U, V;
+    int index = 0;
+    for (int j = 0; j < height; j++) {
+      for (int i = 0; i < width; i++) {
+
+        a = (input[index] & 0xff000000) >> 24; // a is not used obviously
+        R = (input[index] & 0xff0000) >> 16;
+        G = (input[index] & 0xff00) >> 8;
+        B = (input[index] & 0xff) >> 0;
+
+        // well known RGB to YUV algorithm
+        Y = ((66 * R + 129 * G + 25 * B + 128) >> 8) + 16;
+        U = ((-38 * R - 74 * G + 112 * B + 128) >> 8) + 128;
+        V = ((112 * R - 94 * G - 18 * B + 128) >> 8) + 128;
+
+        // NV21 has a plane of Y and interleaved planes of VU each sampled by a factor of 2
+        //    meaning for every 4 Y pixels there are 1 V and 1 U.  Note the sampling is every other
+        //    pixel AND every other scanline.
+        yuv420sp[yIndex++] = (byte) ((Y < 0) ? 0 : ((Y > 255) ? 255 : Y));
+        if (j % 2 == 0 && index % 2 == 0) {
+          yuv420sp[uvIndex++] = (byte) ((V < 0) ? 0 : ((V > 255) ? 255 : V));
+          yuv420sp[uvIndex++] = (byte) ((U < 0) ? 0 : ((U > 255) ? 255 : U));
+        }
+
+        index++;
+      }
+    }
+    return yuv420sp;
+  }
+
+  public static byte[] CropYuv(int src_format, byte[] src_yuv, int src_width, int src_height,
+      int dst_width, int dst_height) {
+    byte[] dst_yuv;
+    if (src_yuv == null) return null;
+    // simple implementation: copy the corner
+    if (src_width == dst_width && src_height == dst_height) {
+      dst_yuv = src_yuv;
+    } else {
+      dst_yuv = new byte[(int) (dst_width * dst_height * 1.5)];
+      switch (src_format) {
+        case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar: // I420
+        case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedPlanar: // YV12
+        {
+          // copy Y
+          int src_yoffset = 0;
+          int dst_yoffset = 0;
+          for (int i = 0; i < dst_height; i++) {
+            System.arraycopy(src_yuv, src_yoffset, dst_yuv, dst_yoffset, dst_width);
+            src_yoffset += src_width;
+            dst_yoffset += dst_width;
+          }
+
+          // copy u
+          int src_uoffset = 0;
+          int dst_uoffset = 0;
+          src_yoffset = src_width * src_height;
+          dst_yoffset = dst_width * dst_height;
+          for (int i = 0; i < dst_height / 2; i++) {
+            System.arraycopy(src_yuv, src_yoffset + src_uoffset, dst_yuv, dst_yoffset + dst_uoffset,
+                dst_width / 2);
+            src_uoffset += src_width / 2;
+            dst_uoffset += dst_width / 2;
+          }
+
+          // copy v
+          int src_voffset = 0;
+          int dst_voffset = 0;
+          src_uoffset = src_width * src_height + src_width * src_height / 4;
+          dst_uoffset = dst_width * dst_height + dst_width * dst_height / 4;
+          for (int i = 0; i < dst_height / 2; i++) {
+            System.arraycopy(src_yuv, src_uoffset + src_voffset, dst_yuv, dst_uoffset + dst_voffset,
+                dst_width / 2);
+            src_voffset += src_width / 2;
+            dst_voffset += dst_width / 2;
+          }
+        }
+        break;
+        case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar: // NV12
+        case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedSemiPlanar: // NV21
+        case MediaCodecInfo.CodecCapabilities.COLOR_TI_FormatYUV420PackedSemiPlanar:
+        case MediaCodecInfo.CodecCapabilities.COLOR_QCOM_FormatYUV420SemiPlanar: {
+          // copy Y
+          int src_yoffset = 0;
+          int dst_yoffset = 0;
+          for (int i = 0; i < dst_height; i++) {
+            System.arraycopy(src_yuv, src_yoffset, dst_yuv, dst_yoffset, dst_width);
+            src_yoffset += src_width;
+            dst_yoffset += dst_width;
+          }
+
+          // copy u and v
+          int src_uoffset = 0;
+          int dst_uoffset = 0;
+          src_yoffset = src_width * src_height;
+          dst_yoffset = dst_width * dst_height;
+          for (int i = 0; i < dst_height / 2; i++) {
+            System.arraycopy(src_yuv, src_yoffset + src_uoffset, dst_yuv, dst_yoffset + dst_uoffset,
+                dst_width);
+            src_uoffset += src_width;
+            dst_uoffset += dst_width;
+          }
+        }
+        break;
+
+        default: {
+          dst_yuv = null;
+        }
+        break;
+      }
+    }
+    return dst_yuv;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/utils/yuv/YV12Utils.java b/rtplibrary/src/main/java/com/pedro/encoder/utils/yuv/YV12Utils.java
new file mode 100644
index 0000000..258aaa3
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/utils/yuv/YV12Utils.java
@@ -0,0 +1,119 @@
+package com.pedro.encoder.utils.yuv;
+
+public class YV12Utils {
+
+  private static byte[] preAllocatedBufferRotate;
+  private static byte[] preAllocatedBufferColor;
+
+  public static void preAllocateBuffers(int length) {
+    preAllocatedBufferRotate = new byte[length];
+    preAllocatedBufferColor = new byte[length];
+  }
+
+  // the color transform, @see http://stackoverflow.com/questions/15739684/mediacodec-and-camera-color-space-incorrect
+  public static byte[] toNV12(byte[] input, int width, int height) {
+    final int frameSize = width * height;
+    final int qFrameSize = frameSize / 4;
+    System.arraycopy(input, 0, preAllocatedBufferColor, 0, frameSize); // Y
+    for (int i = 0; i < qFrameSize; i++) {
+      preAllocatedBufferColor[frameSize + i * 2] = input[frameSize + i + qFrameSize]; // Cb (U)
+      preAllocatedBufferColor[frameSize + i * 2 + 1] = input[frameSize + i]; // Cr (V)
+    }
+    return preAllocatedBufferColor;
+  }
+
+  public static byte[] toI420(byte[] input, int width, int height) {
+    final int frameSize = width * height;
+    final int qFrameSize = frameSize / 4;
+    System.arraycopy(input, 0, preAllocatedBufferColor, 0, frameSize); // Y
+    System.arraycopy(input, frameSize + qFrameSize, preAllocatedBufferColor, frameSize,
+        qFrameSize); // Cb (U)
+    System.arraycopy(input, frameSize, preAllocatedBufferColor, frameSize + qFrameSize,
+        qFrameSize); // Cr (V)
+    return preAllocatedBufferColor;
+  }
+
+  public static byte[] toNV21(byte[] input, int width, int height) {
+    final int frameSize = width * height;
+    final int qFrameSize = frameSize / 4;
+    System.arraycopy(input, 0, preAllocatedBufferColor, 0, frameSize); // Y
+    for (int i = 0; i < qFrameSize; i++) {
+      preAllocatedBufferColor[frameSize + i * 2 + 1] = input[frameSize + i + qFrameSize]; // Cb (U)
+      preAllocatedBufferColor[frameSize + i * 2] = input[frameSize + i]; // Cr (V)
+    }
+    return preAllocatedBufferColor;
+  }
+
+  public static byte[] rotate90(byte[] data, int imageWidth, int imageHeight) {
+    // Rotate the Y luma
+    int i = 0;
+    for (int x = 0; x < imageWidth; x++) {
+      for (int y = imageHeight - 1; y >= 0; y--) {
+        preAllocatedBufferRotate[i++] = data[y * imageWidth + x];
+      }
+    }
+    final int size = imageWidth * imageHeight;
+    final int colorSize = size / 4;
+    final int colorHeight = colorSize / imageWidth;
+    // Rotate the U and V color components
+    for (int x = 0; x < imageWidth / 2; x++) {
+      for (int y = colorHeight - 1; y >= 0; y--) {
+        //V
+        preAllocatedBufferRotate[i + colorSize] =
+            data[colorSize + size + (imageWidth * y) + x + (imageWidth / 2)];
+        preAllocatedBufferRotate[i + colorSize + 1] = data[colorSize + size + (imageWidth * y) + x];
+        //U
+        preAllocatedBufferRotate[i++] = data[size + (imageWidth * y) + x + (imageWidth / 2)];
+        preAllocatedBufferRotate[i++] = data[size + (imageWidth * y) + x];
+      }
+    }
+    return preAllocatedBufferRotate;
+  }
+
+  public static byte[] rotate180(byte[] data, int imageWidth, int imageHeight) {
+    int count = 0;
+    final int size = imageWidth * imageHeight;
+    for (int i = size - 1; i >= 0; i--) {
+      preAllocatedBufferRotate[count++] = data[i];
+    }
+    final int midColorSize = size / 4;
+    //U
+    for (int i = size + midColorSize - 1; i >= size; i--) {
+      preAllocatedBufferRotate[count++] = data[i];
+    }
+    //V
+    for (int i = data.length - 1; i >= imageWidth * imageHeight + midColorSize; i--) {
+      preAllocatedBufferRotate[count++] = data[i];
+    }
+    return preAllocatedBufferRotate;
+  }
+
+  public static byte[] rotate270(byte[] data, int imageWidth, int imageHeight) {
+    // Rotate the Y luma
+    int i = 0;
+    for (int x = imageWidth - 1; x >= 0; x--) {
+      for (int y = 0; y < imageHeight; y++) {
+        preAllocatedBufferRotate[i++] = data[y * imageWidth + x];
+      }
+    }
+
+    // Rotate the U and V color components
+    final int size = imageWidth * imageHeight;
+    final int colorSize = size / 4;
+    final int colorHeight = colorSize / imageWidth;
+
+    for (int x = 0; x < imageWidth / 2; x++) {
+      for (int y = 0; y < colorHeight; y++) {
+        //V
+        preAllocatedBufferRotate[i + colorSize] =
+            data[colorSize + size + (imageWidth * y) - x + (imageWidth / 2) - 1];
+        preAllocatedBufferRotate[i + colorSize + 1] =
+            data[colorSize + size + (imageWidth * y) - x + imageWidth - 1];
+        //U
+        preAllocatedBufferRotate[i++] = data[size + (imageWidth * y) - x + (imageWidth / 2) - 1];
+        preAllocatedBufferRotate[i++] = data[size + (imageWidth * y) - x + imageWidth - 1];
+      }
+    }
+    return preAllocatedBufferRotate;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/video/FormatVideoEncoder.java b/rtplibrary/src/main/java/com/pedro/encoder/video/FormatVideoEncoder.java
new file mode 100644
index 0000000..bd5b412
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/video/FormatVideoEncoder.java
@@ -0,0 +1,49 @@
+package com.pedro.encoder.video;
+
+import android.media.MediaCodecInfo;
+
+/**
+ * Created by pedro on 21/01/17.
+ */
+
+public enum FormatVideoEncoder {
+
+  YUV420FLEXIBLE, YUV420PLANAR, YUV420SEMIPLANAR, YUV420PACKEDPLANAR, YUV420PACKEDSEMIPLANAR,
+  YUV422FLEXIBLE, YUV422PLANAR, YUV422SEMIPLANAR, YUV422PACKEDPLANAR, YUV422PACKEDSEMIPLANAR,
+  YUV444FLEXIBLE, YUV444INTERLEAVED, SURFACE,
+  //take first valid color for encoder (YUV420PLANAR, YUV420SEMIPLANAR or YUV420PACKEDPLANAR)
+  YUV420Dynamical;
+
+  public int getFormatCodec() {
+    switch (this) {
+      case YUV420FLEXIBLE:
+        return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible;
+      case YUV420PLANAR:
+        return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar;
+      case YUV420SEMIPLANAR:
+        return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar;
+      case YUV420PACKEDPLANAR:
+        return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedPlanar;
+      case YUV420PACKEDSEMIPLANAR:
+        return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedSemiPlanar;
+      case YUV422FLEXIBLE:
+        return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV422Flexible;
+      case YUV422PLANAR:
+        return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV422Planar;
+      case YUV422SEMIPLANAR:
+        return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV422SemiPlanar;
+      case YUV422PACKEDPLANAR:
+        return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV422PackedPlanar;
+      case YUV422PACKEDSEMIPLANAR:
+        return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV422PackedSemiPlanar;
+      case YUV444FLEXIBLE:
+        return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV444Flexible;
+      case YUV444INTERLEAVED:
+        return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV444Interleaved;
+      case SURFACE:
+        return MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface;
+      default:
+        return -1;
+    }
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/video/GetVideoData.java b/rtplibrary/src/main/java/com/pedro/encoder/video/GetVideoData.java
new file mode 100644
index 0000000..1596f65
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/video/GetVideoData.java
@@ -0,0 +1,21 @@
+package com.pedro.encoder.video;
+
+import android.media.MediaCodec;
+
+import android.media.MediaFormat;
+import java.nio.ByteBuffer;
+
+/**
+ * Created by pedro on 20/01/17.
+ */
+
+public interface GetVideoData {
+
+  void onSpsPps(ByteBuffer sps, ByteBuffer pps);
+
+  void onSpsPpsVps(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps);
+
+  void getVideoData(ByteBuffer h264Buffer, MediaCodec.BufferInfo info);
+
+  void onVideoFormat(MediaFormat mediaFormat);
+}
diff --git a/rtplibrary/src/main/java/com/pedro/encoder/video/VideoEncoder.java b/rtplibrary/src/main/java/com/pedro/encoder/video/VideoEncoder.java
new file mode 100644
index 0000000..eed1d6d
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/encoder/video/VideoEncoder.java
@@ -0,0 +1,660 @@
+package com.pedro.encoder.video;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ImageFormat;
+import android.media.MediaCodec;
+import android.media.MediaCodecInfo;
+import android.media.MediaFormat;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.annotation.RequiresApi;
+import android.util.Log;
+import android.util.Pair;
+import android.view.Surface;
+import com.pedro.encoder.input.video.FpsLimiter;
+import com.pedro.encoder.input.video.Frame;
+import com.pedro.encoder.input.video.GetCameraData;
+import com.pedro.encoder.utils.CodecUtil;
+import com.pedro.encoder.utils.yuv.YUVUtil;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+/**
+ * Created by pedro on 19/01/17.
+ * This class need use same resolution, fps and imageFormat that Camera1ApiManagerGl
+ */
+
+public class VideoEncoder implements GetCameraData {
+
+  private String TAG = "VideoEncoder";
+  private MediaCodec videoEncoder;
+  private Thread thread;
+  private GetVideoData getVideoData;
+  private MediaCodec.BufferInfo videoInfo = new MediaCodec.BufferInfo();
+  private long presentTimeUs;
+  private boolean running = false;
+  private boolean spsPpsSetted = false;
+  private boolean hardwareRotation = false;
+
+  //surface to buffer encoder
+  private Surface inputSurface;
+  //buffer to buffer, 3 queue to optimize frames on rotation
+  private BlockingQueue<Frame> queue = new LinkedBlockingQueue<>(80);
+  private final Object sync = new Object();
+
+  //default parameters for encoder
+  private CodecUtil.Force force = CodecUtil.Force.HARDWARE;
+  private int width = 640;
+  private int height = 480;
+  private int fps = 30;
+  private int bitRate = 1200 * 1024; //in kbps
+  private int rotation = 90;
+  private int iFrameInterval = 1; // johanokl
+  private FormatVideoEncoder formatVideoEncoder = FormatVideoEncoder.YUV420Dynamical;
+  //for disable video
+  private boolean sendBlackImage = false;
+  private byte[] blackImage;
+  private FpsLimiter fpsLimiter = new FpsLimiter();
+  private String type = CodecUtil.H264_MIME;
+
+  public VideoEncoder(GetVideoData getVideoData) {
+    this.getVideoData = getVideoData;
+  }
+
+  /**
+   * Prepare encoder with custom parameters
+   */
+  public boolean prepareVideoEncoder(int width, int height, int fps, int bitRate, int rotation,
+      boolean hardwareRotation, int iFrameInterval, FormatVideoEncoder formatVideoEncoder) {
+    this.width = width;
+    this.height = height;
+    this.fps = fps;
+    this.bitRate = bitRate;
+    this.rotation = rotation;
+    this.hardwareRotation = hardwareRotation;
+    this.formatVideoEncoder = formatVideoEncoder;
+    MediaCodecInfo encoder = chooseVideoEncoder(type);
+    try {
+      if (encoder != null) {
+        videoEncoder = MediaCodec.createByCodecName(encoder.getName());
+        if (this.formatVideoEncoder == FormatVideoEncoder.YUV420Dynamical) {
+          this.formatVideoEncoder = chooseColorDynamically(encoder);
+          if (this.formatVideoEncoder == null) {
+            Log.e(TAG, "YUV420 dynamical choose failed");
+            return false;
+          }
+        }
+      } else {
+        Log.e(TAG, "Valid encoder not found");
+        return false;
+      }
+      MediaFormat videoFormat;
+      //if you dont use mediacodec rotation you need swap width and height in rotation 90 or 270
+      // for correct encoding resolution
+      String resolution;
+      if (!hardwareRotation && (rotation == 90 || rotation == 270)) {
+        resolution = height + "x" + width;
+        videoFormat = MediaFormat.createVideoFormat(type, height, width);
+      } else {
+        resolution = width + "x" + height;
+        videoFormat = MediaFormat.createVideoFormat(type, width, height);
+      }
+      Log.i(TAG, "Prepare video info: " + this.formatVideoEncoder.name() + ", " + resolution);
+      videoFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
+          this.formatVideoEncoder.getFormatCodec());
+      videoFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0);
+      videoFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
+      videoFormat.setInteger(MediaFormat.KEY_FRAME_RATE, fps);
+      videoFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iFrameInterval);
+      if (hardwareRotation) {
+        videoFormat.setInteger("rotation-degrees", rotation);
+      }
+      videoEncoder.configure(videoFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
+      running = false;
+      if (formatVideoEncoder == FormatVideoEncoder.SURFACE
+          && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+        inputSurface = videoEncoder.createInputSurface();
+      }
+      prepareBlackImage();
+      return true;
+    } catch (IOException | IllegalStateException e) {
+      Log.e(TAG, "Create VideoEncoder failed.", e);
+      return false;
+    }
+  }
+
+  private FormatVideoEncoder chooseColorDynamically(MediaCodecInfo mediaCodecInfo) {
+    for (int color : mediaCodecInfo.getCapabilitiesForType(CodecUtil.H264_MIME).colorFormats) {
+      if (color == FormatVideoEncoder.YUV420PLANAR.getFormatCodec()) {
+        return FormatVideoEncoder.YUV420PLANAR;
+      } else if (color == FormatVideoEncoder.YUV420SEMIPLANAR.getFormatCodec()) {
+        return FormatVideoEncoder.YUV420SEMIPLANAR;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Prepare encoder with default parameters
+   */
+  public boolean prepareVideoEncoder() {
+    return prepareVideoEncoder(width, height, fps, bitRate, rotation, false, 1,
+        formatVideoEncoder);
+  }
+
+  @RequiresApi(api = Build.VERSION_CODES.KITKAT)
+  public void setVideoBitrateOnFly(int bitrate) {
+    if (isRunning()) {
+      this.bitRate = bitrate;
+      Bundle bundle = new Bundle();
+      bundle.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, bitrate);
+      try {
+        videoEncoder.setParameters(bundle);
+      } catch (IllegalStateException e) {
+        Log.e(TAG, "encoder need be running", e);
+      }
+    }
+  }
+
+  @RequiresApi(api = Build.VERSION_CODES.KITKAT)
+  public void forceSyncFrame() {
+    if (isRunning()) {
+      Bundle bundle = new Bundle();
+      bundle.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0);
+      try {
+        videoEncoder.setParameters(bundle);
+      } catch (IllegalStateException e) {
+        Log.e(TAG, "encoder need be running", e);
+      }
+    }
+  }
+
+  public void setForce(CodecUtil.Force force) {
+    this.force = force;
+  }
+
+  public Surface getInputSurface() {
+    return inputSurface;
+  }
+
+  public void setInputSurface(Surface inputSurface) {
+    this.inputSurface = inputSurface;
+  }
+
+  public int getWidth() {
+    return width;
+  }
+
+  public int getHeight() {
+    return height;
+  }
+
+  public boolean isHardwareRotation() {
+    return hardwareRotation;
+  }
+
+  public boolean isRunning() {
+    return running;
+  }
+
+  public int getRotation() {
+    return rotation;
+  }
+
+  public void setFps(int fps) {
+    this.fps = fps;
+  }
+
+  public int getFps() {
+    return fps;
+  }
+
+  public void start() {
+    start(true);
+  }
+
+  public int getBitRate() {
+    return bitRate;
+  }
+
+  public String getType() {
+    return type;
+  }
+
+  public void setType(String type) {
+    this.type = type;
+  }
+
+  public void start(boolean resetTs) {
+    synchronized (sync) {
+      spsPpsSetted = false;
+      if (resetTs) presentTimeUs = System.nanoTime() / 1000;
+      videoEncoder.start();
+      //surface to buffer
+      if (formatVideoEncoder == FormatVideoEncoder.SURFACE
+          && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+        thread = new Thread(new Runnable() {
+          @Override
+          public void run() {
+            try {
+              if (Build.VERSION.SDK_INT >= 21) {
+                getDataFromSurfaceAPI21();
+              } else {
+                getDataFromSurface();
+              }
+            } catch (IllegalStateException e) {
+              Log.e(TAG, "Error, encoding while encoded is stopped", e);
+              stop();
+            }
+          }
+        });
+        //buffer to buffer
+      } else {
+        if (!(rotation == 0 || rotation == 90 || rotation == 180 || rotation == 270)) {
+          throw new RuntimeException("rotation value unsupported, select value 0, 90, 180 or 270");
+        }
+        thread = new Thread(new Runnable() {
+          @Override
+          public void run() {
+            YUVUtil.preAllocateBuffers(width * height * 3 / 2);
+            while (running && !Thread.interrupted()) {
+              try {
+                Frame frame = queue.take();
+                if (fpsLimiter.limitFPS(fps)) continue;
+                byte[] buffer = frame.getBuffer();
+                boolean isYV12 = frame.getFormat() == ImageFormat.YV12;
+                if (!hardwareRotation) {
+                  int orientation =
+                      frame.isFlip() ? frame.getOrientation() + 180 : frame.getOrientation();
+                  if (orientation >= 360) orientation -= 360;
+                  buffer = isYV12 ? YUVUtil.rotateYV12(buffer, width, height, orientation)
+                      : YUVUtil.rotateNV21(buffer, width, height, orientation);
+                }
+                buffer = (sendBlackImage) ? blackImage
+                    : isYV12 ? YUVUtil.YV12toYUV420byColor(buffer, width, height,
+                        formatVideoEncoder)
+                        : YUVUtil.NV21toYUV420byColor(buffer, width, height, formatVideoEncoder);
+                if (Thread.currentThread().isInterrupted()) return;
+                if (Build.VERSION.SDK_INT >= 21) {
+                  getDataFromEncoderAPI21(buffer);
+                } else {
+                  getDataFromEncoder(buffer);
+                }
+              } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+              } catch (IllegalStateException e) {
+                Log.e(TAG, "Error, encoding while encoded is stopped", e);
+                stop();
+              }
+            }
+          }
+        });
+      }
+      running = true;
+      thread.start();
+    }
+  }
+
+  public void stop() {
+    synchronized (sync) {
+      running = false;
+      if (thread != null) {
+        thread.interrupt();
+        try {
+          thread.join(1000);
+        } catch (InterruptedException e) {
+          thread.interrupt();
+        }
+        thread = null;
+      }
+      if (videoEncoder != null) {
+        videoEncoder.stop();
+        videoEncoder.release();
+        videoEncoder = null;
+      }
+      queue.clear();
+      fpsLimiter.reset();
+      spsPpsSetted = false;
+      inputSurface = null;
+    }
+  }
+
+  public void reset() {
+    synchronized (sync) {
+      stop();
+      prepareVideoEncoder(width, height, fps, bitRate, rotation, hardwareRotation, iFrameInterval,
+          formatVideoEncoder);
+      start(false);
+    }
+  }
+
+  @Override
+  public void inputYUVData(Frame frame) {
+    synchronized (sync) {
+      if (running) {
+        try {
+          queue.add(frame);
+        } catch (IllegalStateException e) {
+          Log.i(TAG, "frame discarded");
+        }
+      }
+    }
+  }
+
+  private void sendSPSandPPS(MediaFormat mediaFormat) {
+    //H265
+    if (type.equals(CodecUtil.H265_MIME)) {
+      List<ByteBuffer> byteBufferList =
+          extractVpsSpsPpsFromH265(mediaFormat.getByteBuffer("csd-0"));
+      getVideoData.onSpsPpsVps(byteBufferList.get(1), byteBufferList.get(2), byteBufferList.get(0));
+      //H264
+    } else {
+      getVideoData.onSpsPps(mediaFormat.getByteBuffer("csd-0"), mediaFormat.getByteBuffer("csd-1"));
+    }
+  }
+
+  @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+  private void getDataFromSurfaceAPI21() {
+    while (running && !Thread.interrupted()) {
+      for (; ; ) {
+        if (fpsLimiter.limitFPS(fps)) continue;
+        // johanokl
+        // Error, encoding while encoded is stopped
+        if (videoEncoder == null) {
+          break;
+        }
+        int outBufferIndex = videoEncoder.dequeueOutputBuffer(videoInfo, 0);
+        if (outBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
+          MediaFormat mediaFormat = videoEncoder.getOutputFormat();
+          getVideoData.onVideoFormat(mediaFormat);
+          sendSPSandPPS(mediaFormat);
+          spsPpsSetted = true;
+        } else if (outBufferIndex >= 0) {
+          //This ByteBuffer is H264
+          ByteBuffer bb = videoEncoder.getOutputBuffer(outBufferIndex);
+          if ((videoInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
+            if (!spsPpsSetted) {
+              Pair<ByteBuffer, ByteBuffer> buffers =
+                  decodeSpsPpsFromBuffer(bb.duplicate(), videoInfo.size);
+              if (buffers != null) {
+                getVideoData.onSpsPps(buffers.first, buffers.second);
+                spsPpsSetted = true;
+              }
+            }
+          }
+          videoInfo.presentationTimeUs = System.nanoTime() / 1000 - presentTimeUs;
+          getVideoData.getVideoData(bb, videoInfo);
+          videoEncoder.releaseOutputBuffer(outBufferIndex, false);
+        } else {
+          break;
+        }
+      }
+    }
+  }
+
+  private void getDataFromSurface() {
+    while (running && !Thread.interrupted()) {
+      ByteBuffer[] outputBuffers = videoEncoder.getOutputBuffers();
+      for (; ; ) {
+        if (fpsLimiter.limitFPS(fps)) continue;
+        int outBufferIndex = videoEncoder.dequeueOutputBuffer(videoInfo, 10000);
+        if (outBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
+          MediaFormat mediaFormat = videoEncoder.getOutputFormat();
+          getVideoData.onVideoFormat(mediaFormat);
+          sendSPSandPPS(mediaFormat);
+          spsPpsSetted = true;
+        } else if (outBufferIndex >= 0) {
+          //This ByteBuffer is H264
+          ByteBuffer bb = outputBuffers[outBufferIndex];
+          if ((videoInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
+            if (!spsPpsSetted) {
+              Pair<ByteBuffer, ByteBuffer> buffers =
+                  decodeSpsPpsFromBuffer(bb.duplicate(), videoInfo.size);
+              if (buffers != null) {
+                getVideoData.onSpsPps(buffers.first, buffers.second);
+                spsPpsSetted = true;
+              }
+            }
+          }
+          videoInfo.presentationTimeUs = System.nanoTime() / 1000 - presentTimeUs;
+          getVideoData.getVideoData(bb, videoInfo);
+          videoEncoder.releaseOutputBuffer(outBufferIndex, false);
+        } else {
+          break;
+        }
+      }
+    }
+  }
+
+  @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+  private void getDataFromEncoderAPI21(byte[] buffer) {
+    int inBufferIndex = videoEncoder.dequeueInputBuffer(-1);
+    if (inBufferIndex >= 0) {
+      ByteBuffer bb = videoEncoder.getInputBuffer(inBufferIndex);
+      bb.put(buffer, 0, buffer.length);
+      long pts = System.nanoTime() / 1000 - presentTimeUs;
+      videoEncoder.queueInputBuffer(inBufferIndex, 0, buffer.length, pts, 0);
+    }
+    for (; ; ) {
+      int outBufferIndex = videoEncoder.dequeueOutputBuffer(videoInfo, 0);
+      if (outBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
+        MediaFormat mediaFormat = videoEncoder.getOutputFormat();
+        getVideoData.onVideoFormat(mediaFormat);
+        sendSPSandPPS(mediaFormat);
+        spsPpsSetted = true;
+      } else if (outBufferIndex >= 0) {
+        //This ByteBuffer is H264
+        ByteBuffer bb = videoEncoder.getOutputBuffer(outBufferIndex);
+        if ((videoInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
+          if (!spsPpsSetted) {
+            Pair<ByteBuffer, ByteBuffer> buffers =
+                decodeSpsPpsFromBuffer(bb.duplicate(), videoInfo.size);
+            if (buffers != null) {
+              getVideoData.onSpsPps(buffers.first, buffers.second);
+              spsPpsSetted = true;
+            }
+          }
+        }
+        videoInfo.presentationTimeUs = System.nanoTime() / 1000 - presentTimeUs;
+        getVideoData.getVideoData(bb, videoInfo);
+        videoEncoder.releaseOutputBuffer(outBufferIndex, false);
+      } else {
+        break;
+      }
+    }
+  }
+
+  private void getDataFromEncoder(byte[] buffer) {
+    ByteBuffer[] inputBuffers = videoEncoder.getInputBuffers();
+    ByteBuffer[] outputBuffers = videoEncoder.getOutputBuffers();
+
+    int inBufferIndex = videoEncoder.dequeueInputBuffer(-1);
+    if (inBufferIndex >= 0) {
+      ByteBuffer bb = inputBuffers[inBufferIndex];
+      bb.clear();
+      bb.put(buffer, 0, buffer.length);
+      long pts = System.nanoTime() / 1000 - presentTimeUs;
+      videoEncoder.queueInputBuffer(inBufferIndex, 0, buffer.length, pts, 0);
+    }
+
+    for (; ; ) {
+      int outBufferIndex = videoEncoder.dequeueOutputBuffer(videoInfo, 0);
+      if (outBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
+        MediaFormat mediaFormat = videoEncoder.getOutputFormat();
+        getVideoData.onVideoFormat(mediaFormat);
+        sendSPSandPPS(mediaFormat);
+        spsPpsSetted = true;
+      } else if (outBufferIndex >= 0) {
+        //This ByteBuffer is H264
+        ByteBuffer bb = outputBuffers[outBufferIndex];
+        if ((videoInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
+          if (!spsPpsSetted) {
+            Pair<ByteBuffer, ByteBuffer> buffers =
+                decodeSpsPpsFromBuffer(bb.duplicate(), videoInfo.size);
+            if (buffers != null) {
+              getVideoData.onSpsPps(buffers.first, buffers.second);
+              spsPpsSetted = true;
+            }
+          }
+        }
+        videoInfo.presentationTimeUs = System.nanoTime() / 1000 - presentTimeUs;
+        getVideoData.getVideoData(bb, videoInfo);
+        videoEncoder.releaseOutputBuffer(outBufferIndex, false);
+      } else {
+        break;
+      }
+    }
+  }
+
+  /**
+   * choose the video encoder by mime.
+   */
+  private MediaCodecInfo chooseVideoEncoder(String mime) {
+    List<MediaCodecInfo> mediaCodecInfoList;
+    if (force == CodecUtil.Force.HARDWARE) {
+      mediaCodecInfoList = CodecUtil.getAllHardwareEncoders(mime);
+    } else if (force == CodecUtil.Force.SOFTWARE) {
+      mediaCodecInfoList = CodecUtil.getAllSoftwareEncoders(mime);
+    } else {
+      mediaCodecInfoList = CodecUtil.getAllEncoders(mime);
+    }
+    for (MediaCodecInfo mci : mediaCodecInfoList) {
+      Log.i(TAG, String.format("VideoEncoder %s", mci.getName()));
+      MediaCodecInfo.CodecCapabilities codecCapabilities = mci.getCapabilitiesForType(mime);
+      for (int color : codecCapabilities.colorFormats) {
+        Log.i(TAG, "Color supported: " + color);
+        if (formatVideoEncoder == FormatVideoEncoder.SURFACE) {
+          if (color == FormatVideoEncoder.SURFACE.getFormatCodec()) return mci;
+        } else {
+          //check if encoder support any yuv420 color
+          if (color == FormatVideoEncoder.YUV420PLANAR.getFormatCodec()
+              || color == FormatVideoEncoder.YUV420SEMIPLANAR.getFormatCodec()) {
+            return mci;
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  private void prepareBlackImage() {
+    Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+    Canvas canvas = new Canvas(b);
+    canvas.drawColor(Color.BLACK);
+    int x = b.getWidth();
+    int y = b.getHeight();
+    int[] data = new int[x * y];
+    b.getPixels(data, 0, x, 0, 0, x, y);
+    blackImage = YUVUtil.ARGBtoYUV420SemiPlanar(data, width, height);
+  }
+
+  public void startSendBlackImage() {
+    sendBlackImage = true;
+    if (Build.VERSION.SDK_INT >= 19) {
+      if (isRunning()) {
+        Bundle bundle = new Bundle();
+        bundle.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, 100 * 1024);
+        try {
+          videoEncoder.setParameters(bundle);
+        } catch (IllegalStateException e) {
+          Log.e(TAG, "encoder need be running");
+          e.printStackTrace();
+        }
+      }
+    }
+  }
+
+  public void stopSendBlackImage() {
+    sendBlackImage = false;
+    if (Build.VERSION.SDK_INT >= 19) {
+      setVideoBitrateOnFly(bitRate);
+    }
+  }
+
+  /**
+   * decode sps and pps if the encoder never call to MediaCodec.INFO_OUTPUT_FORMAT_CHANGED
+   */
+  private Pair<ByteBuffer, ByteBuffer> decodeSpsPpsFromBuffer(ByteBuffer outputBuffer, int length) {
+    byte[] mSPS = null, mPPS = null;
+    byte[] csd = new byte[length];
+    outputBuffer.get(csd, 0, length);
+    int i = 0;
+    int spsIndex = -1;
+    int ppsIndex = -1;
+    while (i < length - 4) {
+      if (csd[i] == 0 && csd[i + 1] == 0 && csd[i + 2] == 0 && csd[i + 3] == 1) {
+        if (spsIndex == -1) {
+          spsIndex = i;
+        } else {
+          ppsIndex = i;
+          break;
+        }
+      }
+      i++;
+    }
+    if (spsIndex != -1 && ppsIndex != -1) {
+      mSPS = new byte[ppsIndex];
+      System.arraycopy(csd, spsIndex, mSPS, 0, ppsIndex);
+      mPPS = new byte[length - ppsIndex];
+      System.arraycopy(csd, ppsIndex, mPPS, 0, length - ppsIndex);
+    }
+    if (mSPS != null && mPPS != null) {
+      return new Pair<>(ByteBuffer.wrap(mSPS), ByteBuffer.wrap(mPPS));
+    }
+    return null;
+  }
+
+  /**
+   * You need find 0 0 0 1 byte sequence that is the initiation of vps, sps and pps
+   * buffers.
+   *
+   * @param csd0byteBuffer get in mediacodec case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED
+   * @return list with vps, sps and pps
+   */
+  private List<ByteBuffer> extractVpsSpsPpsFromH265(ByteBuffer csd0byteBuffer) {
+    List<ByteBuffer> byteBufferList = new ArrayList<>();
+    int vpsPosition = -1;
+    int spsPosition = -1;
+    int ppsPosition = -1;
+    int contBufferInitiation = 0;
+    byte[] csdArray = csd0byteBuffer.array();
+    for (int i = 0; i < csdArray.length; i++) {
+      if (contBufferInitiation == 3 && csdArray[i] == 1) {
+        if (vpsPosition == -1) {
+          vpsPosition = i - 3;
+        } else if (spsPosition == -1) {
+          spsPosition = i - 3;
+        } else {
+          ppsPosition = i - 3;
+        }
+      }
+      if (csdArray[i] == 0) {
+        contBufferInitiation++;
+      } else {
+        contBufferInitiation = 0;
+      }
+    }
+    byte[] vps = new byte[spsPosition];
+    byte[] sps = new byte[ppsPosition - spsPosition];
+    byte[] pps = new byte[csdArray.length - ppsPosition];
+    for (int i = 0; i < csdArray.length; i++) {
+      if (i < spsPosition) {
+        vps[i] = csdArray[i];
+      } else if (i < ppsPosition) {
+        sps[i - spsPosition] = csdArray[i];
+      } else {
+        pps[i - ppsPosition] = csdArray[i];
+      }
+    }
+    byteBufferList.add(ByteBuffer.wrap(vps));
+    byteBufferList.add(ByteBuffer.wrap(sps));
+    byteBufferList.add(ByteBuffer.wrap(pps));
+    return byteBufferList;
+  }
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera1Base.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera1Base.java
new file mode 100644
index 0000000..8b8530d
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera1Base.java
@@ -0,0 +1,583 @@
+package com.pedro.rtplibrary.base;
+
+import android.content.Context;
+import android.hardware.Camera;
+import android.media.MediaCodec;
+import android.media.MediaFormat;
+import android.media.MediaMuxer;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.SurfaceView;
+import android.view.TextureView;
+import com.pedro.encoder.input.video.Camera1ApiManager;
+import com.pedro.encoder.input.video.CameraHelper;
+import com.pedro.encoder.input.video.CameraOpenException;
+import com.pedro.encoder.input.video.Frame;
+import com.pedro.encoder.input.video.GetCameraData;
+import com.pedro.encoder.utils.CodecUtil;
+import com.pedro.encoder.video.FormatVideoEncoder;
+import com.pedro.encoder.video.GetVideoData;
+import com.pedro.encoder.video.VideoEncoder;
+import com.pedro.rtplibrary.view.GlInterface;
+import com.pedro.rtplibrary.view.LightOpenGlView;
+import com.pedro.rtplibrary.view.OffScreenGlThread;
+import com.pedro.rtplibrary.view.OpenGlView;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.List;
+
+/**
+ * Wrapper to stream with camera1 api.
+ * Support stream with SurfaceView, TextureView and OpenGlView(Custom SurfaceView that use OpenGl).
+ * SurfaceView and TextureView use buffer to buffer encoding mode for H264 and OpenGlView use
+ * Surface to buffer mode(This mode is generally better because skip buffer processing).
+ *
+ * API requirements:
+ * SurfaceView and TextureView mode: API 16+.
+ * OpenGlView: API 18+.
+ *
+ * Created by pedro on 7/07/17.
+ */
+
+public abstract class Camera1Base
+    implements GetCameraData, GetVideoData {
+
+  private static final String TAG = "Camera1Base";
+
+  private Context context;
+  private Camera1ApiManager cameraManager;
+  protected VideoEncoder videoEncoder;
+  private GlInterface glInterface;
+  private boolean streaming = false;
+  private boolean videoEnabled = true;
+  //record
+  private MediaMuxer mediaMuxer;
+  private int videoTrack = -1;
+  private boolean recording = false;
+  private boolean canRecord = false;
+  private boolean onPreview = false;
+  private MediaFormat videoFormat;
+
+  public Camera1Base(SurfaceView surfaceView) {
+    context = surfaceView.getContext();
+    cameraManager = new Camera1ApiManager(surfaceView, this);
+    init();
+  }
+
+  public Camera1Base(TextureView textureView) {
+    context = textureView.getContext();
+    cameraManager = new Camera1ApiManager(textureView, this);
+    init();
+  }
+
+  @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+  public Camera1Base(OpenGlView openGlView) {
+    context = openGlView.getContext();
+    this.glInterface = openGlView;
+    this.glInterface.init();
+    cameraManager = new Camera1ApiManager(glInterface.getSurfaceTexture(), context);
+    init();
+  }
+
+  @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+  public Camera1Base(LightOpenGlView lightOpenGlView) {
+    context = lightOpenGlView.getContext();
+    this.glInterface = lightOpenGlView;
+    this.glInterface.init();
+    cameraManager = new Camera1ApiManager(glInterface.getSurfaceTexture(), context);
+    init();
+  }
+
+  @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+  public Camera1Base(Context context) {
+    this.context = context;
+    glInterface = new OffScreenGlThread(context);
+    glInterface.init();
+    cameraManager = new Camera1ApiManager(glInterface.getSurfaceTexture(), context);
+    init();
+  }
+
+  private void init() {
+    videoEncoder = new VideoEncoder(this);
+  }
+
+  /**
+   * Experimental
+   */
+  public void enableFaceDetection(Camera1ApiManager.FaceDetectorCallback faceDetectorCallback) {
+    cameraManager.enableFaceDetection(faceDetectorCallback);
+  }
+
+  /**
+   * Experimental
+   */
+  public void disableFaceDetection() {
+    cameraManager.disableFaceDetection();
+  }
+
+  /**
+   * Experimental
+   */
+  public boolean isFaceDetectionEnabled() {
+    return cameraManager.isFaceDetectionEnabled();
+  }
+
+  public boolean isFrontCamera() {
+    return cameraManager.isFrontCamera();
+  }
+
+  /**
+   * Basic auth developed to work with Wowza. No tested with other server
+   *
+   * @param user auth.
+   * @param password auth.
+   */
+  public abstract void setAuthorization(String user, String password);
+
+  /**
+   * Call this method before use @startStream. If not you will do a stream without video.
+   * NOTE: Rotation with encoder is silence ignored in some devices.
+   *
+   * @param width resolution in px.
+   * @param height resolution in px.
+   * @param fps frames per second of the stream.
+   * @param bitrate H264 in kb.
+   * @param hardwareRotation true if you want rotate using encoder, false if you want rotate with
+   * software if you are using a SurfaceView or TextureView or with OpenGl if you are using
+   * OpenGlView.
+   * @param rotation could be 90, 180, 270 or 0. You should use CameraHelper.getCameraOrientation with SurfaceView or TextureView
+   * and 0 with OpenGlView or LightOpenGlView.
+   * NOTE: Rotation with encoder is silence ignored in some devices.
+   * @return true if success, false if you get a error (Normally because the encoder selected
+   * doesn't support any configuration seated or your device hasn't a H264 encoder).
+   */
+  public boolean prepareVideo(int width, int height, int fps, int bitrate, boolean hardwareRotation,
+      int iFrameInterval, int rotation) {
+    if (onPreview) {
+      stopPreview();
+      onPreview = true;
+    }
+    FormatVideoEncoder formatVideoEncoder =
+        glInterface == null ? FormatVideoEncoder.YUV420Dynamical : FormatVideoEncoder.SURFACE;
+    return videoEncoder.prepareVideoEncoder(width, height, fps, bitrate, rotation, hardwareRotation,
+        iFrameInterval, formatVideoEncoder);
+  }
+
+  /**
+   * backward compatibility reason
+   */
+  public boolean prepareVideo(int width, int height, int fps, int bitrate, boolean hardwareRotation,
+      int rotation) {
+    return prepareVideo(width, height, fps, bitrate, hardwareRotation, 2, rotation);
+  }
+
+
+  /**
+   * Same to call:
+   * rotation = 0;
+   * if (Portrait) rotation = 90;
+   * prepareVideo(640, 480, 30, 1200 * 1024, false, rotation);
+   *
+   * @return true if success, false if you get a error (Normally because the encoder selected
+   * doesn't support any configuration seated or your device hasn't a H264 encoder).
+   */
+  public boolean prepareVideo() {
+    int rotation = CameraHelper.getCameraOrientation(context);
+    return prepareVideo(640, 480, 30, 1200 * 1024, false, rotation);
+  }
+
+  /**
+   * @param forceVideo force type codec used. FIRST_COMPATIBLE_FOUND, SOFTWARE, HARDWARE
+   */
+  public void setForce(CodecUtil.Force forceVideo) {
+    videoEncoder.setForce(forceVideo);
+  }
+
+  /**
+   * Start record a MP4 video. Need be called while stream.
+   *
+   * @param path where file will be saved.
+   * @throws IOException If you init it before start stream.
+   */
+  @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+  public void startRecord(final String path) throws IOException {
+    mediaMuxer = new MediaMuxer(path, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
+    recording = true;
+    if (!streaming) {
+      startEncoders();
+    } else if (videoEncoder.isRunning()) {
+      resetVideoEncoder();
+    }
+  }
+
+  /**
+   * Stop record MP4 video started with @startRecord. If you don't call it file will be unreadable.
+   */
+  @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+  public void stopRecord() {
+    recording = false;
+    if (mediaMuxer != null) {
+      if (canRecord) {
+        mediaMuxer.stop();
+        mediaMuxer.release();
+        canRecord = false;
+      }
+      mediaMuxer = null;
+    }
+    videoTrack = -1;
+    if (!streaming) stopStream();
+  }
+
+  /**
+   * Start camera preview. Ignored, if stream or preview is started.
+   *
+   * @param cameraFacing front or back camera. Like:
+   * {@link com.pedro.encoder.input.video.CameraHelper.Facing#BACK}
+   * {@link com.pedro.encoder.input.video.CameraHelper.Facing#FRONT}
+   * @param width of preview in px.
+   * @param height of preview in px.
+   * @param rotation camera rotation (0, 90, 180, 270). Recommended:
+   * {@link com.pedro.encoder.input.video.CameraHelper#getCameraOrientation(Context)}
+   */
+  public void startPreview(CameraHelper.Facing cameraFacing, int width, int height, int rotation) {
+    if (!isStreaming() && !onPreview && !(glInterface instanceof OffScreenGlThread)) {
+      if (glInterface != null && Build.VERSION.SDK_INT >= 18) {
+        boolean isPortrait = context.getResources().getConfiguration().orientation == 1;
+        if (isPortrait) {
+          glInterface.setEncoderSize(height, width);
+        } else {
+          glInterface.setEncoderSize(width, height);
+        }
+        glInterface.setRotation(0);
+        glInterface.start();
+        cameraManager.setSurfaceTexture(glInterface.getSurfaceTexture());
+      }
+      cameraManager.setRotation(rotation);
+      cameraManager.start(cameraFacing, width, height, videoEncoder.getFps());
+      onPreview = true;
+    } else {
+      Log.e(TAG, "Streaming or preview started, ignored");
+    }
+  }
+
+  public void startPreview(CameraHelper.Facing cameraFacing, int width, int height) {
+    startPreview(cameraFacing, width, height, CameraHelper.getCameraOrientation(context));
+  }
+
+  public void startPreview(CameraHelper.Facing cameraFacing) {
+    startPreview(cameraFacing, 640, 480);
+  }
+
+  public void startPreview(int width, int height) {
+    startPreview(CameraHelper.Facing.BACK, width, height);
+  }
+
+  public void startPreview() {
+    startPreview(CameraHelper.Facing.BACK);
+  }
+
+  /**
+   * Stop camera preview. Ignored if streaming or already stopped.
+   * You need call it after @stopStream to release camera properly if you will close activity.
+   */
+  public void stopPreview() {
+    if (!isStreaming() && onPreview && !(glInterface instanceof OffScreenGlThread)) {
+      if (glInterface != null && Build.VERSION.SDK_INT >= 18) {
+        glInterface.stop();
+      }
+      cameraManager.stop();
+      onPreview = false;
+    } else {
+      Log.e(TAG, "Streaming or preview stopped, ignored");
+    }
+  }
+
+  /**
+   * Change preview orientation can be called while stream.
+   *
+   * @param orientation of the camera preview. Could be 90, 180, 270 or 0.
+   */
+  public void setPreviewOrientation(int orientation) {
+    cameraManager.setPreviewOrientation(orientation);
+  }
+
+  /**
+   * Set zoomIn or zoomOut to camera.
+   *
+   * @param event motion event. Expected to get event.getPointerCount() > 1
+   */
+  public void setZoom(MotionEvent event) {
+    cameraManager.setZoom(event);
+  }
+
+  protected abstract void startStreamRtp(String url);
+
+  // johanokl
+  protected abstract void startRtpVideoStreamFixedPort(String host, int port);
+
+  // johanokl
+  public void startVideoStreamFixedPort(String host, int port) {
+    streaming = true;
+    if (!recording) {
+      startEncoders();
+    } else {
+      resetVideoEncoder();
+    }
+    startRtpVideoStreamFixedPort(host, port);
+    onPreview = true;
+  }
+
+
+  /**
+   * Need be called after @prepareVideo.
+   * This method override resolution of @startPreview to resolution seated in @prepareVideo. If you
+   * never startPreview this method startPreview for you to resolution seated in @prepareVideo.
+   *
+   * @param url of the stream like:
+   * protocol://ip:port/application/streamName
+   *
+   * RTSP: rtsp://192.168.1.1:1935/live/pedroSG94
+   * RTSPS: rtsps://192.168.1.1:1935/live/pedroSG94
+   * RTMP: rtmp://192.168.1.1:1935/live/pedroSG94
+   * RTMPS: rtmps://192.168.1.1:1935/live/pedroSG94
+   */
+  public void startStream(String url) {
+    streaming = true;
+    if (!recording) {
+      startEncoders();
+    } else {
+      resetVideoEncoder();
+    }
+    startStreamRtp(url);
+    onPreview = true;
+  }
+
+  private void startEncoders() {
+    prepareGlView();
+    videoEncoder.start();
+    cameraManager.setRotation(videoEncoder.getRotation());
+    cameraManager.start(videoEncoder.getWidth(), videoEncoder.getHeight(), videoEncoder.getFps());
+    onPreview = true;
+  }
+
+  private void resetVideoEncoder() {
+    if (glInterface != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+      glInterface.removeMediaCodecSurface();
+    }
+    videoEncoder.reset();
+    if (glInterface != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+      glInterface.addMediaCodecSurface(videoEncoder.getInputSurface());
+    }
+  }
+
+  private void prepareGlView() {
+    if (glInterface != null && Build.VERSION.SDK_INT >= 18) {
+      if (glInterface instanceof OffScreenGlThread) {
+        glInterface = new OffScreenGlThread(context);
+        ((OffScreenGlThread) glInterface).setFps(videoEncoder.getFps());
+      }
+      glInterface.init();
+      if (videoEncoder.getRotation() == 90 || videoEncoder.getRotation() == 270) {
+        glInterface.setEncoderSize(videoEncoder.getHeight(), videoEncoder.getWidth());
+      } else {
+        glInterface.setEncoderSize(videoEncoder.getWidth(), videoEncoder.getHeight());
+      }
+      glInterface.start();
+      if (videoEncoder.getInputSurface() != null) {
+        glInterface.addMediaCodecSurface(videoEncoder.getInputSurface());
+      }
+      cameraManager.setSurfaceTexture(glInterface.getSurfaceTexture());
+    }
+  }
+
+  protected abstract void stopStreamRtp();
+
+  /**
+   * Stop stream started with @startStream.
+   */
+  public void stopStream() {
+    if (streaming) {
+      streaming = false;
+      stopStreamRtp();
+    }
+    if (!recording) {
+      if (glInterface != null && Build.VERSION.SDK_INT >= 18) {
+        glInterface.removeMediaCodecSurface();
+        if (glInterface instanceof OffScreenGlThread) {
+          glInterface.stop();
+          cameraManager.stop();
+        }
+      }
+      videoEncoder.stop();
+      videoFormat = null;
+    }
+  }
+
+  /**
+   * Get supported preview resolutions of back camera in px.
+   *
+   * @return list of preview resolutions supported by back camera
+   */
+  public List<Camera.Size> getResolutionsBack() {
+    return cameraManager.getPreviewSizeBack();
+  }
+
+  /**
+   * Get supported preview resolutions of front camera in px.
+   *
+   * @return list of preview resolutions supported by front camera
+   */
+  public List<Camera.Size> getResolutionsFront() {
+    return cameraManager.getPreviewSizeFront();
+  }
+
+  /**
+   * Get video camera state
+   *
+   * @return true if disabled, false if enabled
+   */
+  public boolean isVideoEnabled() {
+    return videoEnabled;
+  }
+
+  /**
+   * Disable send camera frames and send a black image with low bitrate(to reduce bandwith used)
+   * instance it.
+   */
+  public void disableVideo() {
+    videoEncoder.startSendBlackImage();
+    videoEnabled = false;
+  }
+
+  /**
+   * Enable send camera frames.
+   */
+  public void enableVideo() {
+    videoEncoder.stopSendBlackImage();
+    videoEnabled = true;
+  }
+
+  public int getBitrate() {
+    return videoEncoder.getBitRate();
+  }
+
+  public int getResolutionValue() {
+    return videoEncoder.getWidth() * videoEncoder.getHeight();
+  }
+
+  public int getStreamWidth() {
+    return videoEncoder.getWidth();
+  }
+
+  public int getStreamHeight() {
+    return videoEncoder.getHeight();
+  }
+
+  /**
+   * Switch camera used. Can be called on preview or while stream, ignored with preview off.
+   *
+   * @throws CameraOpenException If the other camera doesn't support same resolution.
+   */
+  public void switchCamera() throws CameraOpenException {
+    if (isStreaming() || onPreview) {
+      cameraManager.switchCamera();
+    }
+  }
+
+  public GlInterface getGlInterface() {
+    if (glInterface != null) {
+      return glInterface;
+    } else {
+      throw new RuntimeException("You can't do it. You are not using Opengl");
+    }
+  }
+
+  /**
+   * Set video bitrate of H264 in kb while stream.
+   *
+   * @param bitrate H264 in kb.
+   */
+  @RequiresApi(api = Build.VERSION_CODES.KITKAT)
+  public void setVideoBitrateOnFly(int bitrate) {
+    videoEncoder.setVideoBitrateOnFly(bitrate);
+  }
+
+  /**
+   * Set limit FPS while stream. This will be override when you call to prepareVideo method.
+   * This could produce a change in iFrameInterval.
+   *
+   * @param fps frames per second
+   */
+  public void setLimitFPSOnFly(int fps) {
+    videoEncoder.setFps(fps);
+  }
+
+  /**
+   * Get stream state.
+   *
+   * @return true if streaming, false if not streaming.
+   */
+  public boolean isStreaming() {
+    return streaming;
+  }
+
+  /**
+   * Get preview state.
+   *
+   * @return true if enabled, false if disabled.
+   */
+  public boolean isOnPreview() {
+    return onPreview;
+  }
+
+  /**
+   * Get record state.
+   *
+   * @return true if recording, false if not recoding.
+   */
+  public boolean isRecording() {
+    return recording;
+  }
+
+  protected abstract void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps);
+
+  @Override
+  public void onSpsPps(ByteBuffer sps, ByteBuffer pps) {
+    if (streaming) onSpsPpsVpsRtp(sps, pps, null);
+  }
+
+  @Override
+  public void onSpsPpsVps(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) {
+    if (streaming) onSpsPpsVpsRtp(sps, pps, vps);
+  }
+
+  protected abstract void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info);
+
+  @Override
+  public void getVideoData(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) {
+    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 && recording) {
+      if (info.flags == MediaCodec.BUFFER_FLAG_KEY_FRAME
+          && !canRecord
+          && videoFormat != null) {
+        videoTrack = mediaMuxer.addTrack(videoFormat);
+        mediaMuxer.start();
+        canRecord = true;
+      }
+      if (canRecord) mediaMuxer.writeSampleData(videoTrack, h264Buffer, info);
+    }
+    if (streaming) getH264DataRtp(h264Buffer, info);
+  }
+
+
+  @Override
+  public void inputYUVData(Frame frame) {
+    videoEncoder.inputYUVData(frame);
+  }
+
+  @Override
+  public void onVideoFormat(MediaFormat mediaFormat) {
+    videoFormat = mediaFormat;
+  }
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera2Base.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera2Base.java
new file mode 100644
index 0000000..820d83f
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera2Base.java
@@ -0,0 +1,573 @@
+package com.pedro.rtplibrary.base;
+
+import android.content.Context;
+import android.media.MediaCodec;
+import android.media.MediaFormat;
+import android.media.MediaMuxer;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.util.Size;
+import android.view.MotionEvent;
+import android.view.Surface;
+import android.view.SurfaceView;
+import android.view.TextureView;
+import com.pedro.encoder.input.video.Camera2ApiManager;
+import com.pedro.encoder.input.video.CameraHelper;
+import com.pedro.encoder.input.video.CameraOpenException;
+import com.pedro.encoder.utils.CodecUtil;
+import com.pedro.encoder.video.FormatVideoEncoder;
+import com.pedro.encoder.video.GetVideoData;
+import com.pedro.encoder.video.VideoEncoder;
+import com.pedro.rtplibrary.view.GlInterface;
+import com.pedro.rtplibrary.view.LightOpenGlView;
+import com.pedro.rtplibrary.view.OffScreenGlThread;
+import com.pedro.rtplibrary.view.OpenGlView;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Wrapper to stream with camera2 api and microphone.
+ * Support stream with SurfaceView, TextureView, OpenGlView(Custom SurfaceView that use OpenGl) and
+ * Context(background mode).
+ * All views use Surface to buffer encoding mode for H264.
+ *
+ * API requirements:
+ * API 21+.
+ *
+ * Created by pedro on 7/07/17.
+ */
+@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+public abstract class Camera2Base implements GetVideoData {
+
+  protected Context context;
+  private Camera2ApiManager cameraManager;
+  protected VideoEncoder videoEncoder;
+  private boolean streaming = false;
+  private SurfaceView surfaceView;
+  private TextureView textureView;
+  private GlInterface glInterface;
+  private boolean videoEnabled = false;
+  //record
+  private MediaMuxer mediaMuxer;
+  private int videoTrack = -1;
+  private boolean recording = false;
+  private boolean canRecord = false;
+  private boolean onPreview = false;
+  private MediaFormat videoFormat;
+  private boolean isBackground = false;
+
+  public Camera2Base(SurfaceView surfaceView) {
+    this.surfaceView = surfaceView;
+    this.context = surfaceView.getContext();
+    init(context);
+  }
+
+  public Camera2Base(TextureView textureView) {
+    this.textureView = textureView;
+    this.context = textureView.getContext();
+    init(context);
+  }
+
+  public Camera2Base(OpenGlView openGlView) {
+    context = openGlView.getContext();
+    glInterface = openGlView;
+    glInterface.init();
+    init(context);
+  }
+
+  public Camera2Base(LightOpenGlView lightOpenGlView) {
+    this.context = lightOpenGlView.getContext();
+    glInterface = lightOpenGlView;
+    glInterface.init();
+    init(context);
+  }
+
+  public Camera2Base(Context context, boolean useOpengl) {
+    this.context = context;
+    if (useOpengl) {
+      glInterface = new OffScreenGlThread(context);
+      glInterface.init();
+    }
+    isBackground = true;
+    init(context);
+  }
+
+  private void init(Context context) {
+    cameraManager = new Camera2ApiManager(context);
+    videoEncoder = new VideoEncoder(this);
+  }
+
+  /**
+   * Experimental
+   */
+  public void enableFaceDetection(Camera2ApiManager.FaceDetectorCallback faceDetectorCallback) {
+    cameraManager.enableFaceDetection(faceDetectorCallback);
+  }
+
+  /**
+   * Experimental
+   */
+  public void disableFaceDetection() {
+    cameraManager.disableFaceDetection();
+  }
+
+  /**
+   * Experimental
+   */
+  public boolean isFaceDetectionEnabled() {
+    return cameraManager.isFaceDetectionEnabled();
+  }
+
+  public boolean isFrontCamera() {
+    return cameraManager.isFrontCamera();
+  }
+
+  /**
+   * Basic auth developed to work with Wowza. No tested with other server
+   *
+   * @param user auth.
+   * @param password auth.
+   */
+  public abstract void setAuthorization(String user, String password);
+
+  /**
+   * Call this method before use @startStream. If not you will do a stream without video.
+   *
+   * @param width resolution in px.
+   * @param height resolution in px.
+   * @param fps frames per second of the stream.
+   * @param bitrate H264 in kb.
+   * @param hardwareRotation true if you want rotate using encoder, false if you with OpenGl if you
+   * are using OpenGlView.
+   * @param rotation could be 90, 180, 270 or 0 (Normally 0 if you are streaming in landscape or 90
+   * if you are streaming in Portrait). This only affect to stream result.
+   * NOTE: Rotation with encoder is silence ignored in some devices.
+   * @return true if success, false if you get a error (Normally because the encoder selected
+   * doesn't support any configuration seated or your device hasn't a H264 encoder).
+   */
+  public boolean prepareVideo(int width, int height, int fps, int bitrate, boolean hardwareRotation,
+      int iFrameInterval, int rotation) {
+    if (onPreview) {
+      stopPreview();
+      onPreview = true;
+    }
+    boolean result =
+        videoEncoder.prepareVideoEncoder(width, height, fps, bitrate, rotation, hardwareRotation,
+            iFrameInterval, FormatVideoEncoder.SURFACE);
+    prepareCameraManager();
+    return result;
+  }
+
+  /**
+   * backward compatibility reason
+   */
+  public boolean prepareVideo(int width, int height, int fps, int bitrate, boolean hardwareRotation,
+      int rotation) {
+    return prepareVideo(width, height, fps, bitrate, hardwareRotation, 1, rotation);
+  }
+
+  /**
+   * Same to call:
+   * isHardwareRotation = true;
+   * if (openGlVIew) isHardwareRotation = false;
+   * prepareVideo(640, 480, 30, 1200 * 1024, isHardwareRotation, 90);
+   *
+   * @return true if success, false if you get a error (Normally because the encoder selected
+   * doesn't support any configuration seated or your device hasn't a H264 encoder).
+   */
+  public boolean prepareVideo() {
+    boolean isHardwareRotation = glInterface == null;
+    int rotation = CameraHelper.getCameraOrientation(context);
+    return prepareVideo(640, 480, 30, 1200 * 1024, isHardwareRotation, rotation);
+  }
+
+
+  /**
+   * @param forceVideo force type codec used. FIRST_COMPATIBLE_FOUND, SOFTWARE, HARDWARE
+   */
+  public void setForce(CodecUtil.Force forceVideo) {
+    videoEncoder.setForce(forceVideo);
+  }
+
+  /**
+   * Start record a MP4 video. Need be called while stream.
+   *
+   * @param path where file will be saved.
+   * @throws IOException If you init it before start stream.
+   */
+  public void startRecord(String path) throws IOException {
+    mediaMuxer = new MediaMuxer(path, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
+    recording = true;
+    if (!streaming) {
+      startEncoders();
+    } else if (videoEncoder.isRunning()) {
+      resetVideoEncoder();
+    }
+  }
+
+  /**
+   * Stop record MP4 video started with @startRecord. If you don't call it file will be unreadable.
+   */
+  public void stopRecord() {
+    recording = false;
+    if (mediaMuxer != null) {
+      if (canRecord) {
+        mediaMuxer.stop();
+        mediaMuxer.release();
+        canRecord = false;
+      }
+      mediaMuxer = null;
+    }
+    videoTrack = -1;
+    if (!streaming) stopStream();
+  }
+
+  /**
+   * Start camera preview. Ignored, if stream or preview is started.
+   *
+   * @param cameraFacing front or back camera. Like:
+   * {@link com.pedro.encoder.input.video.CameraHelper.Facing#BACK}
+   * {@link com.pedro.encoder.input.video.CameraHelper.Facing#FRONT}
+   * @param rotation camera rotation (0, 90, 180, 270). Recommended:
+   * {@link com.pedro.encoder.input.video.CameraHelper#getCameraOrientation(Context)}
+   */
+  public void startPreview(CameraHelper.Facing cameraFacing, int rotation) {
+    if (!isStreaming() && !onPreview && !isBackground) {
+      if (surfaceView != null) {
+        cameraManager.prepareCamera(surfaceView.getHolder().getSurface());
+      } else if (textureView != null) {
+        cameraManager.prepareCamera(new Surface(textureView.getSurfaceTexture()));
+      } else if (glInterface != null) {
+        boolean isCamera2Landscape = context.getResources().getConfiguration().orientation != 1;
+        if (isCamera2Landscape) {
+          glInterface.setEncoderSize(videoEncoder.getWidth(), videoEncoder.getHeight());
+        } else {
+          glInterface.setEncoderSize(videoEncoder.getHeight(), videoEncoder.getWidth());
+        }
+        glInterface.setRotation(rotation == 0 ? 270 : rotation - 90);
+        glInterface.start();
+        cameraManager.prepareCamera(glInterface.getSurfaceTexture(), videoEncoder.getWidth(),
+            videoEncoder.getHeight());
+      }
+      cameraManager.openCameraFacing(cameraFacing);
+      onPreview = true;
+    }
+  }
+
+  public void startPreview(CameraHelper.Facing cameraFacing) {
+    startPreview(cameraFacing, CameraHelper.getCameraOrientation(context));
+  }
+
+  public void startPreview() {
+    startPreview(CameraHelper.Facing.BACK);
+  }
+
+  /**
+   * Stop camera preview. Ignored if streaming or already stopped.
+   * You need call it after @stopStream to release camera properly if you will close activity.
+   */
+  public void stopPreview() {
+    if (!isStreaming() && onPreview && !isBackground) {
+      if (glInterface != null) {
+        glInterface.stop();
+      }
+      cameraManager.closeCamera(false);
+      onPreview = false;
+    }
+  }
+
+  protected abstract void startStreamRtp(String url);
+
+  /**
+   * Need be called after @prepareVideo
+   * This method override resolution of @startPreview to resolution seated in @prepareVideo. If you
+   * never startPreview this method startPreview for you to resolution seated in @prepareVideo.
+   *
+   * @param url of the stream like:
+   * protocol://ip:port/application/streamName
+   *
+   * RTSP: rtsp://192.168.1.1:1935/live/pedroSG94
+   * RTSPS: rtsps://192.168.1.1:1935/live/pedroSG94
+   * RTMP: rtmp://192.168.1.1:1935/live/pedroSG94
+   * RTMPS: rtmps://192.168.1.1:1935/live/pedroSG94
+   */
+  public void startStream(String url) {
+    streaming = true;
+    if (!recording) {
+      startEncoders();
+    } else {
+      resetVideoEncoder();
+    }
+    startStreamRtp(url);
+    onPreview = true;
+  }
+
+  // johanokl
+  protected abstract void startRtpVideoStreamFixedPort(String host, int port);
+
+  // johanokl
+  public void startVideoStreamFixedPort(String host, int port) {
+    streaming = true;
+    if (!recording) {
+      startEncoders();
+    } else {
+      resetVideoEncoder();
+    }
+    startRtpVideoStreamFixedPort(host, port);
+    onPreview = true;
+  }
+
+  private void startEncoders() {
+    prepareGlView();
+    videoEncoder.start();
+    if (onPreview) {
+      cameraManager.openLastCamera();
+    } else {
+      cameraManager.openCameraBack();
+    }
+    onPreview = true;
+  }
+
+  private void resetVideoEncoder() {
+    if (glInterface != null) glInterface.removeMediaCodecSurface();
+    videoEncoder.reset();
+    if (glInterface != null) {
+      glInterface.addMediaCodecSurface(videoEncoder.getInputSurface());
+    }
+  }
+
+  private void prepareGlView() {
+    if (glInterface != null && videoEnabled) {
+      if (glInterface instanceof OffScreenGlThread) {
+        glInterface = new OffScreenGlThread(context);
+        ((OffScreenGlThread) glInterface).setFps(videoEncoder.getFps());
+      }
+      glInterface.init();
+      if (videoEncoder.getRotation() == 90 || videoEncoder.getRotation() == 270) {
+        glInterface.setEncoderSize(videoEncoder.getHeight(), videoEncoder.getWidth());
+      } else {
+        glInterface.setEncoderSize(videoEncoder.getWidth(), videoEncoder.getHeight());
+      }
+      int rotation = videoEncoder.getRotation();
+      glInterface.setRotation(rotation == 0 ? 270 : rotation - 90);
+      glInterface.start();
+      if (videoEncoder.getInputSurface() != null) {
+        glInterface.addMediaCodecSurface(videoEncoder.getInputSurface());
+      }
+      cameraManager.prepareCamera(glInterface.getSurfaceTexture(), videoEncoder.getWidth(),
+          videoEncoder.getHeight());
+    }
+  }
+
+  protected abstract void stopStreamRtp();
+
+  /**
+   * Stop stream started with @startStream.
+   */
+  public void stopStream() {
+    if (streaming) {
+      streaming = false;
+      stopStreamRtp();
+    }
+    if (!recording) {
+      cameraManager.closeCamera(!isBackground);
+      onPreview = !isBackground;
+      if (glInterface != null) {
+        glInterface.removeMediaCodecSurface();
+        if (glInterface instanceof OffScreenGlThread) {
+          glInterface.removeMediaCodecSurface();
+          glInterface.stop();
+        }
+      }
+      videoEncoder.stop();
+      videoFormat = null;
+    }
+  }
+
+  /**
+   * Get supported preview resolutions of back camera in px.
+   *
+   * @return list of preview resolutions supported by back camera
+   */
+  public List<Size> getResolutionsBack() {
+    return Arrays.asList(cameraManager.getCameraResolutionsBack());
+  }
+
+  /**
+   * Get supported preview resolutions of front camera in px.
+   *
+   * @return list of preview resolutions supported by front camera
+   */
+  public List<Size> getResolutionsFront() {
+    return Arrays.asList(cameraManager.getCameraResolutionsFront());
+  }
+
+  /**
+   * Get video camera state
+   *
+   * @return true if disabled, false if enabled
+   */
+  public boolean isVideoEnabled() {
+    return videoEnabled;
+  }
+
+  /**
+   * Disable send camera frames and send a black image with low bitrate(to reduce bandwith used)
+   * instance it.
+   */
+  public void disableVideo() {
+    videoEncoder.startSendBlackImage();
+    videoEnabled = false;
+  }
+
+  /**
+   * Enable send camera frames.
+   */
+  public void enableVideo() {
+    videoEncoder.stopSendBlackImage();
+    videoEnabled = true;
+  }
+
+  /**
+   * Set zoomIn or zoomOut to camera.
+   *
+   * @param event motion event. Expected to get event.getPointerCount() > 1
+   */
+  public void setZoom(MotionEvent event) {
+    cameraManager.setZoom(event);
+  }
+
+  // johanokl
+  public void setFocus(boolean useAutofocus, float focusdistancepercentage) {
+    cameraManager.setFocus(useAutofocus, focusdistancepercentage);
+  }
+
+  public int getBitrate() {
+    return videoEncoder.getBitRate();
+  }
+
+  public int getResolutionValue() {
+    return videoEncoder.getWidth() * videoEncoder.getHeight();
+  }
+
+  public int getStreamWidth() {
+    return videoEncoder.getWidth();
+  }
+
+  public int getStreamHeight() {
+    return videoEncoder.getHeight();
+  }
+
+  /**
+   * Switch camera used. Can be called on preview or while stream, ignored with preview off.
+   *
+   * @throws CameraOpenException If the other camera doesn't support same resolution.
+   */
+  public void switchCamera() throws CameraOpenException {
+    if (isStreaming() || onPreview) {
+      cameraManager.switchCamera();
+    }
+  }
+
+  public GlInterface getGlInterface() {
+    if (glInterface != null) {
+      return glInterface;
+    } else {
+      throw new RuntimeException("You can't do it. You are not using Opengl");
+    }
+  }
+
+  private void prepareCameraManager() {
+    if (textureView != null) {
+      cameraManager.prepareCamera(textureView, videoEncoder.getInputSurface());
+    } else if (surfaceView != null) {
+      cameraManager.prepareCamera(surfaceView, videoEncoder.getInputSurface());
+    } else if (glInterface != null) {
+    } else {
+      cameraManager.prepareCamera(videoEncoder.getInputSurface());
+    }
+    videoEnabled = true;
+  }
+
+  /**
+   * Set video bitrate of H264 in kb while stream.
+   *
+   * @param bitrate H264 in kb.
+   */
+  public void setVideoBitrateOnFly(int bitrate) {
+    videoEncoder.setVideoBitrateOnFly(bitrate);
+  }
+
+  /**
+   * Set limit FPS while stream. This will be override when you call to prepareVideo method.
+   * This could produce a change in iFrameInterval.
+   *
+   * @param fps frames per second
+   */
+  public void setLimitFPSOnFly(int fps) {
+    videoEncoder.setFps(fps);
+  }
+
+  /**
+   * Get stream state.
+   *
+   * @return true if streaming, false if not streaming.
+   */
+  public boolean isStreaming() {
+    return streaming;
+  }
+
+  /**
+   * Get record state.
+   *
+   * @return true if recording, false if not recoding.
+   */
+  public boolean isRecording() {
+    return recording;
+  }
+
+  /**
+   * Get preview state.
+   *
+   * @return true if enabled, false if disabled.
+   */
+  public boolean isOnPreview() {
+    return onPreview;
+  }
+
+  protected abstract void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps);
+
+  @Override
+  public void onSpsPps(ByteBuffer sps, ByteBuffer pps) {
+    if (streaming) onSpsPpsVpsRtp(sps, pps, null);
+  }
+
+  @Override
+  public void onSpsPpsVps(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) {
+    if (streaming) onSpsPpsVpsRtp(sps, pps, vps);
+  }
+
+  protected abstract void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info);
+
+  @Override
+  public void getVideoData(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) {
+    if (recording) {
+      if (info.flags == MediaCodec.BUFFER_FLAG_KEY_FRAME
+          && !canRecord
+          && videoFormat != null) {
+        videoTrack = mediaMuxer.addTrack(videoFormat);
+        mediaMuxer.start();
+        canRecord = true;
+      }
+      if (canRecord) mediaMuxer.writeSampleData(videoTrack, h264Buffer, info);
+    }
+    if (streaming) getH264DataRtp(h264Buffer, info);
+  }
+
+  @Override
+  public void onVideoFormat(MediaFormat mediaFormat) {
+    videoFormat = mediaFormat;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/base/DisplayBase.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/DisplayBase.java
new file mode 100644
index 0000000..b0c5e6a
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/DisplayBase.java
@@ -0,0 +1,370 @@
+package com.pedro.rtplibrary.base;
+
+import android.content.Context;
+import android.content.Intent;
+import android.hardware.display.VirtualDisplay;
+import android.media.MediaCodec;
+import android.media.MediaFormat;
+import android.media.MediaMuxer;
+import android.media.projection.MediaProjection;
+import android.media.projection.MediaProjectionManager;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.view.Surface;
+import android.view.SurfaceView;
+import com.pedro.encoder.utils.CodecUtil;
+import com.pedro.encoder.video.FormatVideoEncoder;
+import com.pedro.encoder.video.GetVideoData;
+import com.pedro.encoder.video.VideoEncoder;
+import com.pedro.rtplibrary.view.GlInterface;
+import com.pedro.rtplibrary.view.OffScreenGlThread;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import static android.content.Context.MEDIA_PROJECTION_SERVICE;
+
+/**
+ * Wrapper to stream display screen of your device and microphone.
+ * Can be executed in background.
+ *
+ * API requirements:
+ * API 21+.
+ *
+ * Created by pedro on 9/08/17.
+ */
+@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+public abstract class DisplayBase implements GetVideoData {
+
+  private OffScreenGlThread glInterface;
+  protected Context context;
+  private MediaProjection mediaProjection;
+  private MediaProjectionManager mediaProjectionManager;
+  protected VideoEncoder videoEncoder;
+  private boolean streaming = false;
+  protected SurfaceView surfaceView;
+  private boolean videoEnabled = true;
+  //record
+  private MediaMuxer mediaMuxer;
+  private int videoTrack = -1;
+  private boolean recording = false;
+  private boolean canRecord = false;
+  private MediaFormat videoFormat;
+  private int dpi = 320;
+  private VirtualDisplay virtualDisplay;
+  private int resultCode = -1;
+  private Intent data;
+
+  public DisplayBase(Context context, boolean useOpengl) {
+    this.context = context;
+    if (useOpengl) glInterface = new OffScreenGlThread(context);
+    mediaProjectionManager =
+        ((MediaProjectionManager) context.getSystemService(MEDIA_PROJECTION_SERVICE));
+    this.surfaceView = null;
+    videoEncoder = new VideoEncoder(this);
+  }
+
+  /**
+   * Basic auth developed to work with Wowza. No tested with other server
+   *
+   * @param user auth.
+   * @param password auth.
+   */
+  public abstract void setAuthorization(String user, String password);
+
+  /**
+   * Call this method before use @startStream. If not you will do a stream without video.
+   *
+   * @param width resolution in px.
+   * @param height resolution in px.
+   * @param fps frames per second of the stream.
+   * @param bitrate H264 in kb.
+   * @param rotation could be 90, 180, 270 or 0 (Normally 0 if you are streaming in landscape or 90
+   * if you are streaming in Portrait). This only affect to stream result. This work rotating with
+   * encoder.
+   * NOTE: Rotation with encoder is silence ignored in some devices.
+   * @param dpi of your screen device.
+   * @return true if success, false if you get a error (Normally because the encoder selected
+   * doesn't support any configuration seated or your device hasn't a H264 encoder).
+   */
+  public boolean prepareVideo(int width, int height, int fps, int bitrate, int rotation, int dpi) {
+    this.dpi = dpi;
+    boolean result =
+        videoEncoder.prepareVideoEncoder(width, height, fps, bitrate, rotation, true, 2,
+            FormatVideoEncoder.SURFACE);
+    if (glInterface != null) {
+      glInterface = new OffScreenGlThread(context);
+      glInterface.setEncoderSize(videoEncoder.getWidth(), videoEncoder.getHeight());
+      glInterface.init();
+    }
+    return result;
+  }
+
+  /**
+   * Same to call:
+   * rotation = 0;
+   * if (Portrait) rotation = 90;
+   * prepareVideo(640, 480, 30, 1200 * 1024, true, 0);
+   *
+   * @return true if success, false if you get a error (Normally because the encoder selected
+   * doesn't support any configuration seated or your device hasn't a H264 encoder).
+   */
+  public boolean prepareVideo() {
+    return prepareVideo(640, 480, 30, 1200 * 1024, 0, 320);
+  }
+
+
+  /**
+   * @param forceVideo force type codec used. FIRST_COMPATIBLE_FOUND, SOFTWARE, HARDWARE
+   */
+  public void setForce(CodecUtil.Force forceVideo) {
+    videoEncoder.setForce(forceVideo);
+  }
+
+  /**
+   * Start record a MP4 video. Need be called while stream.
+   *
+   * @param path where file will be saved.
+   * @throws IOException If you init it before start stream.
+   */
+  public void startRecord(String path) throws IOException {
+    mediaMuxer = new MediaMuxer(path, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
+    recording = true;
+    if (!streaming) {
+      startEncoders(resultCode, data);
+    } else if (videoEncoder.isRunning()) {
+      resetVideoEncoder();
+    }
+  }
+
+  /**
+   * Stop record MP4 video started with @startRecord. If you don't call it file will be unreadable.
+   */
+  public void stopRecord() {
+    recording = false;
+    if (mediaMuxer != null) {
+      if (canRecord) {
+        mediaMuxer.stop();
+        mediaMuxer.release();
+        canRecord = false;
+      }
+      mediaMuxer = null;
+    }
+    videoTrack = -1;
+    if (!streaming) stopStream();
+  }
+
+  protected abstract void startStreamRtp(String url);
+
+  /**
+   * Create Intent used to init screen capture with startActivityForResult.
+   *
+   * @return intent to startActivityForResult.
+   */
+  public Intent sendIntent() {
+    return mediaProjectionManager.createScreenCaptureIntent();
+  }
+
+  public void setIntentResult(int resultCode, Intent data) {
+    this.resultCode = resultCode;
+    this.data = data;
+  }
+
+  /**
+   * Need be called after @prepareVideo
+   *
+   * @param url of the stream like:
+   * protocol://ip:port/application/streamName
+   *
+   * RTSP: rtsp://192.168.1.1:1935/live/pedroSG94
+   * RTSPS: rtsps://192.168.1.1:1935/live/pedroSG94
+   * RTMP: rtmp://192.168.1.1:1935/live/pedroSG94
+   * RTMPS: rtmps://192.168.1.1:1935/live/pedroSG94
+   */
+  public void startStream(String url) {
+    streaming = true;
+    if (!recording) {
+      startEncoders(resultCode, data);
+    } else {
+      resetVideoEncoder();
+    }
+    startStreamRtp(url);
+  }
+
+  private void startEncoders(int resultCode, Intent data) {
+    if (data == null) {
+      throw new RuntimeException("You need send intent data before startRecord or startStream");
+    }
+    videoEncoder.start();
+    if (glInterface != null) {
+      glInterface.setFps(videoEncoder.getFps());
+      glInterface.start();
+      glInterface.addMediaCodecSurface(videoEncoder.getInputSurface());
+    }
+    Surface surface =
+        (glInterface != null) ? glInterface.getSurface() : videoEncoder.getInputSurface();
+    mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);
+    virtualDisplay = mediaProjection.createVirtualDisplay("Stream Display", videoEncoder.getWidth(),
+        videoEncoder.getHeight(), dpi, 0, surface, null, null);
+  }
+
+  private void resetVideoEncoder() {
+    virtualDisplay.setSurface(null);
+    if (glInterface != null) {
+      glInterface.removeMediaCodecSurface();
+    }
+    videoEncoder.reset();
+    if (glInterface != null) {
+      glInterface.addMediaCodecSurface(videoEncoder.getInputSurface());
+    }
+    virtualDisplay.setSurface(
+        glInterface != null ? glInterface.getSurface() : videoEncoder.getInputSurface());
+  }
+
+  protected abstract void stopStreamRtp();
+
+  /**
+   * Stop stream started with @startStream.
+   */
+  public void stopStream() {
+    if (streaming) {
+      streaming = false;
+      stopStreamRtp();
+    }
+    if (!recording) {
+      if (mediaProjection != null) {
+        mediaProjection.stop();
+      }
+      if (glInterface != null) {
+        glInterface.removeMediaCodecSurface();
+        glInterface.stop();
+      }
+      videoEncoder.stop();
+      videoFormat = null;
+      data = null;
+    }
+  }
+
+  public GlInterface getGlInterface() {
+    if (glInterface != null) {
+      return glInterface;
+    } else {
+      throw new RuntimeException("You can't do it. You are not using Opengl");
+    }
+  }
+
+  /**
+   * Get video camera state
+   *
+   * @return true if disabled, false if enabled
+   */
+  public boolean isVideoEnabled() {
+    return videoEnabled;
+  }
+
+  /**
+   * Disable send camera frames and send a black image with low bitrate(to reduce bandwith used)
+   * instance it.
+   */
+  public void disableVideo() {
+    videoEncoder.startSendBlackImage();
+    videoEnabled = false;
+  }
+
+  /**
+   * Enable send display screen frames.
+   */
+  public void enableVideo() {
+    videoEncoder.stopSendBlackImage();
+    videoEnabled = true;
+  }
+
+  public int getBitrate() {
+    return videoEncoder.getBitRate();
+  }
+
+  public int getResolutionValue() {
+    return videoEncoder.getWidth() * videoEncoder.getHeight();
+  }
+
+  public int getStreamWidth() {
+    return videoEncoder.getWidth();
+  }
+
+  public int getStreamHeight() {
+    return videoEncoder.getHeight();
+  }
+
+  /**
+   * Set video bitrate of H264 in kb while stream.
+   *
+   * @param bitrate H264 in kb.
+   */
+  public void setVideoBitrateOnFly(int bitrate) {
+    if (Build.VERSION.SDK_INT >= 19) {
+      videoEncoder.setVideoBitrateOnFly(bitrate);
+    }
+  }
+
+  /**
+   * Set limit FPS while stream. This will be override when you call to prepareVideo method.
+   * This could produce a change in iFrameInterval.
+   *
+   * @param fps frames per second
+   */
+  public void setLimitFPSOnFly(int fps) {
+    videoEncoder.setFps(fps);
+  }
+
+  /**
+   * Get stream state.
+   *
+   * @return true if streaming, false if not streaming.
+   */
+  public boolean isStreaming() {
+    return streaming;
+  }
+
+  /**
+   * Get record state.
+   *
+   * @return true if recording, false if not recoding.
+   */
+  public boolean isRecording() {
+    return recording;
+  }
+
+  protected abstract void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps);
+
+  @Override
+  public void onSpsPps(ByteBuffer sps, ByteBuffer pps) {
+    if (streaming) onSpsPpsVpsRtp(sps, pps, null);
+  }
+
+  @Override
+  public void onSpsPpsVps(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) {
+    if (streaming) onSpsPpsVpsRtp(sps, pps, vps);
+  }
+
+  protected abstract void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info);
+
+  @Override
+  public void getVideoData(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) {
+    if (recording) {
+      if (info.flags == MediaCodec.BUFFER_FLAG_KEY_FRAME
+          && !canRecord
+          && videoFormat != null) {
+        videoTrack = mediaMuxer.addTrack(videoFormat);
+        mediaMuxer.start();
+        canRecord = true;
+      }
+      if (canRecord) mediaMuxer.writeSampleData(videoTrack, h264Buffer, info);
+    }
+    if (streaming) getH264DataRtp(h264Buffer, info);
+  }
+
+  @Override
+  public void onVideoFormat(MediaFormat mediaFormat) {
+    videoFormat = mediaFormat;
+  }
+}
+
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/base/FromFileBase.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/FromFileBase.java
new file mode 100644
index 0000000..67e6593
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/FromFileBase.java
@@ -0,0 +1,472 @@
+package com.pedro.rtplibrary.base;
+
+import android.content.Context;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+import android.media.MediaCodec;
+import android.media.MediaFormat;
+import android.media.MediaMuxer;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.util.Log;
+import com.pedro.encoder.input.decoder.LoopFileInterface;
+import com.pedro.encoder.input.decoder.VideoDecoder;
+import com.pedro.encoder.input.decoder.VideoDecoderInterface;
+import com.pedro.encoder.utils.CodecUtil;
+import com.pedro.encoder.video.FormatVideoEncoder;
+import com.pedro.encoder.video.GetVideoData;
+import com.pedro.encoder.video.VideoEncoder;
+import com.pedro.rtplibrary.view.GlInterface;
+import com.pedro.rtplibrary.view.LightOpenGlView;
+import com.pedro.rtplibrary.view.OffScreenGlThread;
+import com.pedro.rtplibrary.view.OpenGlView;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+/**
+ * Wrapper to stream a MP4 file with H264 video codec. Only Video is streamed.
+ * Can be executed in background.
+ *
+ * API requirements:
+ * API 18+.
+ *
+ * Created by pedro on 7/07/17.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public abstract class FromFileBase
+    implements GetVideoData, LoopFileInterface {
+
+  private static final String TAG = "FromFileBase";
+  private Context context;
+
+  protected VideoEncoder videoEncoder;
+  private GlInterface glInterface;
+  private boolean streaming = false;
+  private boolean videoEnabled = true;
+  //record
+  private MediaMuxer mediaMuxer;
+  private int videoTrack = -1;
+  private boolean recording = false;
+  private boolean canRecord = false;
+  private MediaFormat videoFormat;
+
+  private VideoDecoder videoDecoder;
+
+  private VideoDecoderInterface videoDecoderInterface;
+
+  private String videoPath;
+  private final Object sync = new Object();
+
+  public FromFileBase(VideoDecoderInterface videoDecoderInterface) {
+    init(videoDecoderInterface);
+  }
+
+  /**
+   * OpenGl mode, necessary context.
+   */
+  public FromFileBase(Context context, VideoDecoderInterface videoDecoderInterface) {
+    this.context = context;
+    glInterface = new OffScreenGlThread(context);
+    init(videoDecoderInterface);
+  }
+
+  public FromFileBase(OpenGlView openGlView, VideoDecoderInterface videoDecoderInterface) {
+    this.context = openGlView.getContext();
+    glInterface = openGlView;
+    init(videoDecoderInterface);
+  }
+
+  public FromFileBase(LightOpenGlView lightOpenGlView, VideoDecoderInterface videoDecoderInterface) {
+    this.context = lightOpenGlView.getContext();
+    glInterface = lightOpenGlView;
+    init(videoDecoderInterface);
+  }
+
+  private void init(VideoDecoderInterface videoDecoderInterface) {
+    this.videoDecoderInterface = videoDecoderInterface;
+    videoEncoder = new VideoEncoder(this);
+  }
+
+  /**
+   * Basic auth developed to work with Wowza. No tested with other server
+   *
+   * @param user auth.
+   * @param password auth.
+   */
+  public abstract void setAuthorization(String user, String password);
+
+  /**
+   * @param filePath to video MP4 file.
+   * @param bitRate H264 in kb.
+   * @return true if success, false if you get a error (Normally because the encoder selected
+   * doesn't support any configuration seated or your device hasn't a H264 encoder).
+   * @throws IOException Normally file not found.
+   */
+  // johanokl
+  public boolean prepareVideo(String filePath, int width, int height, int bitRate, int rotation) throws IOException {
+    videoPath = filePath;
+    videoDecoder = new VideoDecoder(videoDecoderInterface, this);
+    if (!videoDecoder.initExtractor(filePath)) return false;
+    if (width == 0) {
+      width = videoDecoder.getWidth();
+    }
+    if (height == 0) {
+      height = videoDecoder.getHeight();
+    }
+    boolean result =
+        videoEncoder.prepareVideoEncoder(width, height, 30,
+            bitRate, rotation, true, 1, FormatVideoEncoder.SURFACE);
+    if (context != null) {
+      if (glInterface instanceof OffScreenGlThread) {
+        glInterface = new OffScreenGlThread(context);
+      }
+      glInterface.setRotation(rotation);
+      glInterface.setEncoderSize(videoDecoder.getWidth(), videoDecoder.getHeight());
+      glInterface.init();
+    }
+    return result;
+  }
+
+  public boolean prepareVideo(String filePath) throws IOException {
+    return prepareVideo(filePath, 0, 0, 1200 * 1024, 0);
+  }
+
+  /**
+   * @param forceVideo force type codec used. FIRST_COMPATIBLE_FOUND, SOFTWARE, HARDWARE
+   */
+  public void setForce(CodecUtil.Force forceVideo) {
+    videoEncoder.setForce(forceVideo);
+  }
+
+  /**
+   * Start record a MP4 video. Need be called while stream.
+   *
+   * @param path where file will be saved.
+   * @throws IOException If you init it before start stream.
+   */
+  public void startRecord(String path) throws IOException {
+    mediaMuxer = new MediaMuxer(path, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
+    recording = true;
+    if (!streaming) {
+      startEncoders();
+    } else if (videoEncoder.isRunning()) {
+      resetVideoEncoder();
+    }
+  }
+
+  /**
+   * Stop record MP4 video started with @startRecord. If you don't call it file will be unreadable.
+   */
+  public void stopRecord() {
+    recording = false;
+    if (mediaMuxer != null) {
+      if (canRecord) {
+        mediaMuxer.stop();
+        mediaMuxer.release();
+        canRecord = false;
+      }
+      mediaMuxer = null;
+    }
+    videoTrack = -1;
+    if (!streaming) stopStream();
+  }
+
+  protected abstract void startStreamRtp(String url);
+
+  /**
+   * Need be called after @prepareVideo.
+   *
+   * @param url of the stream like:
+   * protocol://ip:port/application/streamName
+   *
+   * RTSP: rtsp://192.168.1.1:1935/live/pedroSG94
+   * RTSPS: rtsps://192.168.1.1:1935/live/pedroSG94
+   * RTMP: rtmp://192.168.1.1:1935/live/pedroSG94
+   * RTMPS: rtmps://192.168.1.1:1935/live/pedroSG94
+   */
+  public void startStream(String url) {
+    streaming = true;
+    if (!recording) {
+      startEncoders();
+    } else {
+      resetVideoEncoder();
+    }
+    startStreamRtp(url);
+  }
+
+  // johanokl
+  protected abstract void startRtpVideoStreamFixedPort(String host, int port);
+
+  // johanokl
+  public void startVideoStreamFixedPort(String host, int port) {
+    streaming = true;
+    if (!recording) {
+      startEncoders();
+    } else {
+      resetVideoEncoder();
+    }
+    startRtpVideoStreamFixedPort(host, port);
+  }
+
+  private void startEncoders() {
+    if (context != null) {
+      if (glInterface instanceof OffScreenGlThread) {
+        ((OffScreenGlThread) glInterface).setFps(videoEncoder.getFps());
+      }
+      glInterface.start();
+      glInterface.addMediaCodecSurface(videoEncoder.getInputSurface());
+      videoDecoder.prepareVideo(glInterface.getSurface());
+    } else {
+      videoDecoder.prepareVideo(videoEncoder.getInputSurface());
+    }
+    videoEncoder.start();
+    videoDecoder.start();
+  }
+
+  private void resetVideoEncoder() {
+    try {
+      if (context != null) {
+        glInterface.removeMediaCodecSurface();
+        glInterface.stop();
+      }
+      double time = videoDecoder.getTime();
+      videoDecoder.stop();
+      videoDecoder = new VideoDecoder(videoDecoderInterface, this);
+      if (!videoDecoder.initExtractor(videoPath)) {
+        throw new IOException("fail to reset video file");
+      }
+      videoEncoder.reset();
+      if (context != null) {
+        if (glInterface instanceof OffScreenGlThread) {
+          ((OffScreenGlThread) glInterface).setFps(videoEncoder.getFps());
+        }
+        glInterface.start();
+        glInterface.addMediaCodecSurface(videoEncoder.getInputSurface());
+        videoDecoder.prepareVideo(glInterface.getSurface());
+      } else {
+        videoDecoder.prepareVideo(videoEncoder.getInputSurface());
+      }
+      videoDecoder.start();
+      videoDecoder.moveTo(time);
+    } catch (IOException e) {
+      Log.e(TAG, "Error", e);
+    }
+  }
+
+  protected abstract void stopStreamRtp();
+
+  /**
+   * Stop stream started with @startStream.
+   */
+  public void stopStream() {
+    if (streaming) {
+      streaming = false;
+      stopStreamRtp();
+    }
+    if (!recording) {
+      if (context != null) {
+        glInterface.removeMediaCodecSurface();
+        glInterface.stop();
+      }
+      if (videoDecoder != null) videoDecoder.stop();
+      videoEncoder.stop();
+      videoFormat = null;
+    }
+  }
+
+  /**
+   * If you want reproduce video in loop.
+   * This mode clear all effects or stream object when video is restarted. TODO: No clear it.
+   *
+   * @param loopMode true in loop, false stop stream when video finish.
+   */
+  public void setLoopMode(boolean loopMode) {
+    videoDecoder.setLoopMode(loopMode);
+  }
+
+  public void reSyncFile() {
+  }
+
+  public GlInterface getGlInterface() {
+    if (glInterface != null) {
+      return glInterface;
+    } else {
+      throw new RuntimeException("You can't do it. You are not using Opengl");
+    }
+  }
+
+  /**
+   * Disable send camera frames and send a black image with low bitrate(to reduce bandwith used)
+   * instance it.
+   */
+  public void disableVideo() {
+    videoEncoder.startSendBlackImage();
+    videoEnabled = false;
+  }
+
+  /**
+   * Enable send MP4 file frames.
+   */
+  public void enableVideo() {
+    videoEncoder.stopSendBlackImage();
+    videoEnabled = true;
+  }
+
+  public int getBitrate() {
+    return videoEncoder.getBitRate();
+  }
+
+  public int getResolutionValue() {
+    return videoEncoder.getWidth() * videoEncoder.getHeight();
+  }
+
+  public int getStreamWidth() {
+    return videoEncoder.getWidth();
+  }
+
+  public int getStreamHeight() {
+    return videoEncoder.getHeight();
+  }
+
+  /**
+   * Get video camera state
+   *
+   * @return true if disabled, false if enabled
+   */
+  public boolean isVideoEnabled() {
+    return videoEnabled;
+  }
+
+  /**
+   * Set video bitrate of H264 in kb while stream.
+   *
+   * @param bitrate H264 in kb.
+   */
+  public void setVideoBitrateOnFly(int bitrate) {
+    if (Build.VERSION.SDK_INT >= 19) {
+      videoEncoder.setVideoBitrateOnFly(bitrate);
+    }
+  }
+
+  /**
+   * Set limit FPS while stream. This will be override when you call to prepareVideo method.
+   * This could produce a change in iFrameInterval.
+   *
+   * @param fps frames per second
+   */
+  public void setLimitFPSOnFly(int fps) {
+    videoEncoder.setFps(fps);
+  }
+
+  /**
+   * Get stream state.
+   *
+   * @return true if streaming, false if not streaming.
+   */
+  public boolean isStreaming() {
+    return streaming;
+  }
+
+  /**
+   * Get record state.
+   *
+   * @return true if recording, false if not recoding.
+   */
+  public boolean isRecording() {
+    return recording;
+  }
+
+  /**
+   * @return return time in second. 0 if no streaming
+   */
+  public double getVideoTime() {
+    return videoDecoder.getTime();
+  }
+
+  /**
+   * @return return duration in seconds. 0 if no streaming
+   */
+  public double getVideoDuration() {
+    return videoDecoder.getDuration();
+  }
+
+  /**
+   * Working but it is too slow. You need wait few seconds after call it to continue :(
+   *
+   * @param time second to move.
+   */
+  public void moveTo(double time) {
+    videoDecoder.moveTo(time);
+  }
+
+  @Override
+  public void onReset(boolean isVideo) {
+    synchronized (sync) {
+      try {
+        if (isVideo) {
+          if (context != null) {
+            glInterface.removeMediaCodecSurface();
+            glInterface.stop();
+          }
+          videoDecoder.stop();
+          videoDecoder = new VideoDecoder(videoDecoderInterface, this);
+          if (!videoDecoder.initExtractor(videoPath)) {
+            throw new IOException("fail to reset video file");
+          }
+          if (context != null) {
+            if (glInterface instanceof OffScreenGlThread) {
+              ((OffScreenGlThread) glInterface).setFps(videoEncoder.getFps());
+            }
+            glInterface.start();
+            glInterface.addMediaCodecSurface(videoEncoder.getInputSurface());
+            videoDecoder.prepareVideo(glInterface.getSurface());
+          } else {
+            videoDecoder.prepareVideo(videoEncoder.getInputSurface());
+          }
+          videoDecoder.start();
+        }
+      } catch (IOException e) {
+        Log.e(TAG, "Error", e);
+        if (isVideo) {
+          videoDecoderInterface.onVideoDecoderFinished();
+        }
+      }
+    }
+  }
+
+  protected abstract void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps);
+
+  @Override
+  public void onSpsPps(ByteBuffer sps, ByteBuffer pps) {
+    if (streaming) onSpsPpsVpsRtp(sps, pps, null);
+  }
+
+  @Override
+  public void onSpsPpsVps(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) {
+    if (streaming) onSpsPpsVpsRtp(sps, pps, vps);
+  }
+
+  protected abstract void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info);
+
+  @Override
+  public void getVideoData(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) {
+    if (recording) {
+      if (info.flags == MediaCodec.BUFFER_FLAG_KEY_FRAME
+          && !canRecord
+          && videoFormat != null) {
+        videoTrack = mediaMuxer.addTrack(videoFormat);
+        mediaMuxer.start();
+        canRecord = true;
+      }
+      if (canRecord) mediaMuxer.writeSampleData(videoTrack, h264Buffer, info);
+    }
+    if (streaming) getH264DataRtp(h264Buffer, info);
+  }
+
+  @Override
+  public void onVideoFormat(MediaFormat mediaFormat) {
+    videoFormat = mediaFormat;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/network/AdapterBitrateParser.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/AdapterBitrateParser.java
new file mode 100644
index 0000000..e4db020
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/AdapterBitrateParser.java
@@ -0,0 +1,39 @@
+package com.pedro.rtplibrary.network;
+
+public class AdapterBitrateParser {
+
+  public static long DELAY = 1000;
+  public static long DIFFERENCE = 500;
+  private static long cont = 0;
+  public static int maxVideoBitrate = 0;
+
+  public interface Callback {
+    void onNewBitrate(int bitrate);
+  }
+
+  public static void parseBitrate(int oldBitrate, int bandwidth, Callback callback) {
+    if (cont == 0) cont = System.currentTimeMillis();
+    if (System.currentTimeMillis() - cont > DELAY) {
+      cont = 0;
+      if (oldBitrate / 1000 - bandwidth >= DIFFERENCE
+          || maxVideoBitrate != 0 && oldBitrate / 1000 >= maxVideoBitrate) {
+        callback.onNewBitrate((int) (oldBitrate - (DIFFERENCE * 1000)));
+      } else if (oldBitrate / 1000 - bandwidth <= DIFFERENCE) {
+        callback.onNewBitrate((int) (oldBitrate + (DIFFERENCE * 1000)));
+      }
+    }
+  }
+
+  public static void calculateMaxVideoBitrate(int resolutionValue) {
+    maxVideoBitrate = (int) (1.65287774651705E-10 * Math.pow(resolutionValue, 2)
+        + 0.002653652033201 * resolutionValue
+        + 640.220156152395);
+  }
+
+  public static void reset() {
+    DELAY = 1000;
+    DIFFERENCE = 500;
+    cont = 0;
+    maxVideoBitrate = 0;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/network/ByteArrayScanner.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/ByteArrayScanner.java
new file mode 100644
index 0000000..d6cd659
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/ByteArrayScanner.java
@@ -0,0 +1,148 @@
+package com.pedro.rtplibrary.network;
+
+/*
+ *  Copyright (c) 2015, Facebook, Inc.
+ *  All rights reserved.
+ *
+ *  This source code is licensed under the BSD-style license found in the
+ *  LICENSE file in the root directory of this source tree. An additional grant
+ *  of patent rights can be found in the PATENTS file in the same directory.
+ *
+ */
+
+import java.util.NoSuchElementException;
+
+class ByteArrayScanner {
+  private byte[] mData;
+  private int mCurrentOffset;
+  private int mTotalLength;
+  private char mDelimiter;
+  private boolean mDelimiterSet;
+
+  public ByteArrayScanner reset(byte[] buffer, int length) {
+    mData = buffer;
+    mCurrentOffset = 0;
+    mTotalLength = length;
+    mDelimiterSet = false;
+    return this;
+  }
+
+  public ByteArrayScanner useDelimiter(char delimiter) {
+    throwIfNotReset();
+    mDelimiter = delimiter;
+    mDelimiterSet = true;
+    return this;
+  }
+
+  private void throwIfNotReset() {
+    if (mData == null) {
+      throw new IllegalStateException("Must call reset first");
+    }
+  }
+
+  private void throwIfDelimiterNotSet() {
+    if (!mDelimiterSet) {
+      throw new IllegalStateException("Must call useDelimiter first");
+    }
+  }
+
+  /**
+   * @return The next token, parsed as a string.
+   * @throws NoSuchElementException
+   */
+  public String nextString() throws NoSuchElementException {
+    throwIfNotReset();
+    throwIfDelimiterNotSet();
+    int offset = mCurrentOffset;
+    int length = advance();
+    return new String(mData, offset, length);
+  }
+
+  /**
+   * Matches the next token with a string.
+   *
+   * @param str String to match the next token with.
+   * @return True if the next token matches, false otherwise.
+   * @throws NoSuchElementException
+   */
+  public boolean nextStringEquals(String str) throws NoSuchElementException {
+    int offset = mCurrentOffset;
+    int length = advance();
+    if (str.length() != length) {
+      return false;
+    }
+    for (int i = 0; i < str.length(); i++) {
+      if (str.charAt(i) != mData[offset]) {
+        return false;
+      }
+      offset++;
+    }
+    return true;
+  }
+
+  /**
+   * @return The next token, parsed as an integer.
+   * @throws NoSuchElementException
+   */
+  public int nextInt() throws NoSuchElementException {
+    throwIfNotReset();
+    throwIfDelimiterNotSet();
+    int offset = mCurrentOffset;
+    int length = advance();
+    int value = parseInt(mData, offset, offset + length);
+    return value;
+  }
+
+  /**
+   * Move to the next token.
+   *
+   * @throws NoSuchElementException
+   */
+  public void skip() throws NoSuchElementException {
+    throwIfNotReset();
+    throwIfDelimiterNotSet();
+    advance();
+  }
+
+  private int advance() throws NoSuchElementException {
+    throwIfNotReset();
+    throwIfDelimiterNotSet();
+    if (mTotalLength <= mCurrentOffset) {
+      throw new NoSuchElementException(
+          "Reading past end of input stream at " + mCurrentOffset + ".");
+    }
+    int index = indexOf(mData, mCurrentOffset, mTotalLength, mDelimiter);
+    if (index == -1) {
+      int length = mTotalLength - mCurrentOffset;
+      mCurrentOffset = mTotalLength;
+      return length;
+    } else {
+      int length = index - mCurrentOffset;
+      mCurrentOffset = index + 1;
+      return length;
+    }
+  }
+
+  private static int parseInt(byte[] buffer, int start, int end) throws NumberFormatException {
+    int radix = 10;
+    int result = 0;
+    while (start < end) {
+      int digit = buffer[start++] - '0';
+      if (digit < 0 || digit > 9) {
+        throw new NumberFormatException("Invalid int in buffer at " + (start - 1) + ".");
+      }
+      int next = result * radix + digit;
+      result = next;
+    }
+    return result;
+  }
+
+  private static int indexOf(byte[] data, int start, int end, char ch) {
+    for (int i = start; i < end; i++) {
+      if (data[i] == ch) {
+        return i;
+      }
+    }
+    return -1;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/network/ConnectionClassManager.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/ConnectionClassManager.java
new file mode 100644
index 0000000..c551bda
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/ConnectionClassManager.java
@@ -0,0 +1,94 @@
+/*
+ *  Copyright (c) 2015, Facebook, Inc.
+ *  All rights reserved.
+ *
+ *  This source code is licensed under the BSD-style license found in the
+ *  LICENSE file in the root directory of this source tree. An additional grant
+ *  of patent rights can be found in the PATENTS file in the same directory.
+ *
+ */
+
+package com.pedro.rtplibrary.network;
+
+/**
+ * <p>
+ * Class used to calculate the approximate bandwidth of a user's connection.
+ * </p>
+ * <p>
+ * This class notifies all subscribed {@link ConnectionClassStateChangeListener} with the new
+ * ConnectionClass when the network's ConnectionClass changes.
+ * </p>
+ */
+public class ConnectionClassManager {
+
+  private static final int BYTES_TO_BITS = 8;
+
+  /** Current bandwidth of the user's connection depending upon the response. */
+  private ConnectionClassStateChangeListener listener;
+  /**
+   * The lower bound for measured bandwidth in bits/ms. Readings
+   * lower than this are treated as effectively zero (therefore ignored).
+   */
+  static final long BANDWIDTH_LOWER_BOUND = 10;
+
+  // Singleton.
+  private static class ConnectionClassManagerHolder {
+    public static final ConnectionClassManager instance = new ConnectionClassManager();
+  }
+
+  /**
+   * Retrieval method for the DownloadBandwidthManager singleton.
+   *
+   * @return The singleton instance of DownloadBandwidthManager.
+   */
+  public static ConnectionClassManager getInstance() {
+    return ConnectionClassManagerHolder.instance;
+  }
+
+  // Force constructor to be private.
+  private ConnectionClassManager() {
+  }
+
+  /**
+   * Adds bandwidth to the current filtered latency counter. Sends a broadcast to all
+   * {@link ConnectionClassStateChangeListener} if the counter moves from one bucket
+   * to another (i.e. poor bandwidth -> moderate bandwidth).
+   */
+  public synchronized void addBandwidth(long bytes, long timeInMs) {
+
+    //Ignore garbage values.
+    if (timeInMs == 0 || (bytes) * 1.0 / (timeInMs) * BYTES_TO_BITS < BANDWIDTH_LOWER_BOUND) {
+      return;
+    }
+    double bandwidth = (bytes) * 1.0 / (timeInMs) * BYTES_TO_BITS;
+    if (listener != null) listener.onBandwidthStateChange(bandwidth);
+  }
+
+  /**
+   * Interface for listening to when ConnectionClassManager
+   * changes state.
+   */
+  public interface ConnectionClassStateChangeListener {
+    /**
+     * The method that will be called when ConnectionClassManager
+     * changes ConnectionClass.
+     */
+    void onBandwidthStateChange(double bandwidth);
+  }
+
+  /**
+   * Method for adding new listeners to this class.
+   *
+   * @param listener {@link ConnectionClassStateChangeListener} to add as a listener.
+   */
+  public void register(ConnectionClassStateChangeListener listener) {
+    this.listener = listener;
+  }
+
+  /**
+   * Method for removing listeners from this class.
+   */
+  public void remove() {
+    listener = null;
+  }
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/network/LineBufferReader.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/LineBufferReader.java
new file mode 100644
index 0000000..73a193d
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/LineBufferReader.java
@@ -0,0 +1,89 @@
+/*
+ *  Copyright (c) 2015, Facebook, Inc.
+ *  All rights reserved.
+ *
+ *  This source code is licensed under the BSD-style license found in the
+ *  LICENSE file in the root directory of this source tree. An additional grant
+ *  of patent rights can be found in the PATENTS file in the same directory.
+ *
+ */
+
+package com.pedro.rtplibrary.network;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+
+/**
+ * Class for reading {@code /proc/net/xt_qtaguid/stats} line by line with a small,
+ * reusable byte buffer.
+ */
+class LineBufferReader {
+
+  private byte[] mFileBuffer;
+  private FileInputStream mInputStream;
+  private int mFileBufIndex;
+  private int mBytesInBuffer;
+
+  public LineBufferReader() {
+    mFileBuffer = new byte[512];
+  }
+
+  /**
+   * Sets the FileInputStream for reading.
+   *
+   * @param is The FileInputStream to set.
+   */
+  public void setFileStream(FileInputStream is) {
+    mInputStream = is;
+    mBytesInBuffer = 0;
+    mFileBufIndex = 0;
+  }
+
+  /**
+   * @param lineBuffer The buffer to fill with the current line.
+   * @return The index in the buffer at which the line terminates.
+   */
+  public int readLine(byte[] lineBuffer) throws IOException {
+    if (mFileBufIndex >= mBytesInBuffer) {
+      mBytesInBuffer = mInputStream.read(mFileBuffer);
+      mFileBufIndex = 0;
+    }
+    int i;
+    for (i = 0; mBytesInBuffer != -1 && i < lineBuffer.length && mFileBuffer[mFileBufIndex] != '\n';
+        i++) {
+      lineBuffer[i] = mFileBuffer[mFileBufIndex];
+      mFileBufIndex++;
+      if (mFileBufIndex >= mBytesInBuffer) {
+        mBytesInBuffer = mInputStream.read(mFileBuffer);
+        mFileBufIndex = 0;
+      }
+    }
+    // Move past the newline character.
+    mFileBufIndex++;
+    // If there are no more bytes to be read into the buffer,
+    // we have reached the end of this file. Exit.
+    if (mBytesInBuffer == -1) {
+      return -1;
+    }
+    return i;
+  }
+
+  /**
+   * Skips a line in the current file stream.
+   */
+  public void skipLine() throws IOException {
+    if (mFileBufIndex >= mBytesInBuffer) {
+      mBytesInBuffer = mInputStream.read(mFileBuffer);
+      mFileBufIndex = 0;
+    }
+    for (int i = 0; mBytesInBuffer != -1 && mFileBuffer[mFileBufIndex] != '\n'; i++) {
+      mFileBufIndex++;
+      if (mFileBufIndex >= mBytesInBuffer) {
+        mBytesInBuffer = mInputStream.read(mFileBuffer);
+        mFileBufIndex = 0;
+      }
+    }
+    // Move past the newline character.
+    mFileBufIndex++;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/network/QTagTxParser.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/QTagTxParser.java
new file mode 100644
index 0000000..f901965
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/QTagTxParser.java
@@ -0,0 +1,145 @@
+package com.pedro.rtplibrary.network;
+
+/*
+ *  Copyright (c) 2015, Facebook, Inc.
+ *  All rights reserved.
+ *
+ *  This source code is licensed under the BSD-style license found in the
+ *  LICENSE file in the root directory of this source tree. An additional grant
+ *  of patent rights can be found in the PATENTS file in the same directory.
+ *
+ */
+
+import android.os.StrictMode;
+import android.util.Log;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.NoSuchElementException;
+
+/**
+ * Class for parsing total number of downloaded bytes
+ * from {@code /proc/net/xt_qtaguid/stats}.
+ */
+class QTagTxParser {
+  private static final String TAG = "QTagParser";
+  private static final String QTAGUID_UID_STATS = "/proc/net/xt_qtaguid/stats";
+
+  private static final ThreadLocal<byte[]> sLineBuffer = new ThreadLocal<byte[]>() {
+    @Override
+    public byte[] initialValue() {
+      return new byte[512];
+    }
+  };
+
+  private static long sPreviousBytes = -1;
+  private static LineBufferReader sStatsReader = new LineBufferReader();
+  private static ByteArrayScanner sScanner = new ByteArrayScanner();
+  public static QTagTxParser sInstance;
+
+  public static synchronized QTagTxParser getInstance() {
+    if (sInstance == null) {
+      sInstance = new QTagTxParser(QTAGUID_UID_STATS);
+    }
+    return sInstance;
+  }
+
+  private String mPath;
+
+  // @VisibleForTesting
+  public QTagTxParser(String path) {
+    mPath = path;
+  }
+
+  /**
+   * Reads the qtaguid file and returns a difference from the previous read.
+   *
+   * @param uid The target uid to read bytes downloaded for.
+   * @return The difference between the current number of bytes downloaded and
+   */
+  public long parseDataUsageForUidAndTag(int uid) {
+    // The format of each line is
+    // idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes
+    // (There are many more fields but we are not interested in them)
+    // For us parts: 1, 2, 3 are to see if the line is relevant
+    // and part 5 is the received bytes
+    // (part numbers start from 0)
+
+    // Permit disk reads here, as /proc/net/xt_qtaguid/stats isn't really "on
+    // disk" and should be fast.
+    StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
+    try {
+      long tagTxBytes = 0;
+
+      FileInputStream fis = new FileInputStream(mPath);
+      sStatsReader.setFileStream(fis);
+      byte[] buffer = sLineBuffer.get();
+
+      try {
+        int length;
+        sStatsReader.skipLine(); // skip first line (headers)
+
+        int line = 2;
+        while ((length = sStatsReader.readLine(buffer)) != -1) {
+          try {
+
+            // Content is arranged in terms of:
+            // idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets rx_tcp_bytes
+            // rx_tcp_packets rx_udp_bytes rx_udp_packets rx_other_bytes rx_other_packets tx_tcp_bytes tx_tcp_packets
+            // tx_udp_bytes tx_udp_packets tx_other_bytes tx_other_packets
+
+            // The ones we're interested in are:
+            // idx - ignore
+            // interface, filter out local interface ("lo")
+            // tag - ignore
+            // uid_tag_int, match it with the UID of interest
+            // cnt_set - ignore
+            // rx_bytes
+
+            sScanner.reset(buffer, length);
+            sScanner.useDelimiter(' ');
+
+            sScanner.skip();
+            if (sScanner.nextStringEquals("lo")) {
+              continue;
+            }
+            sScanner.skip();
+            if (sScanner.nextInt() != uid) {
+              continue;
+            }
+            sScanner.skip();
+            sScanner.skip();
+            sScanner.skip();
+            int txBytes = sScanner.nextInt();
+            tagTxBytes += txBytes;
+            line++;
+            // If the line is incorrectly formatted, ignore the line.
+          } catch (NumberFormatException e) {
+            Log.e(TAG, "Cannot parse byte count at line" + line + ".");
+            continue;
+          } catch (NoSuchElementException e) {
+            Log.e(TAG, "Invalid number of tokens on line " + line + ".");
+            continue;
+          }
+        }
+      } finally {
+        fis.close();
+      }
+
+      if (sPreviousBytes == -1) {
+        sPreviousBytes = tagTxBytes;
+        return -1;
+      }
+      long diff = tagTxBytes - sPreviousBytes;
+      sPreviousBytes = tagTxBytes;
+      return diff;
+    } catch (IOException e) {
+      Log.e(TAG,
+          "Error reading from /proc/net/xt_qtaguid/stats. Please check if this file exists.");
+    } finally {
+      StrictMode.setThreadPolicy(savedPolicy);
+    }
+
+    // Return -1 upon error.
+    return -1;
+  }
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/network/UploadBandwidthSampler.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/UploadBandwidthSampler.java
new file mode 100644
index 0000000..ac1e147
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/UploadBandwidthSampler.java
@@ -0,0 +1,133 @@
+package com.pedro.rtplibrary.network;
+
+/*
+ *  Copyright (c) 2015, Facebook, Inc.
+ *  All rights reserved.
+ *
+ *  This source code is licensed under the BSD-style license found in the
+ *  LICENSE file in the root directory of this source tree. An additional grant
+ *  of patent rights can be found in the PATENTS file in the same directory.
+ *
+ */
+
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Process;
+import android.os.SystemClock;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Class used to read from the file {@code /proc/net/xt_qtaguid/stats} periodically, in order to
+ * determine a ConnectionClass.
+ */
+public class UploadBandwidthSampler {
+
+  /**
+   * Time between polls in ms.
+   */
+  static final long SAMPLE_TIME = 1000;
+
+  /**
+   * The DownloadBandwidthManager that keeps track of the moving average and ConnectionClass.
+   */
+  private final ConnectionClassManager mConnectionClassManager;
+
+  private AtomicInteger mSamplingCounter;
+
+  private Handler mHandler;
+  private HandlerThread mThread;
+
+  private long mLastTimeReading;
+
+  // Singleton.
+  private static class UploadBandwidthSamplerHolder {
+    public static final UploadBandwidthSampler instance =
+        new UploadBandwidthSampler(ConnectionClassManager.getInstance());
+  }
+
+  /**
+   * Retrieval method for the DeviceBandwidthSampler singleton.
+   *
+   * @return The singleton instance of DeviceBandwidthSampler.
+   */
+  public static UploadBandwidthSampler getInstance() {
+    return UploadBandwidthSamplerHolder.instance;
+  }
+
+  private UploadBandwidthSampler(ConnectionClassManager connectionClassManager) {
+    mConnectionClassManager = connectionClassManager;
+    mSamplingCounter = new AtomicInteger();
+    mThread = new HandlerThread("ParseThread");
+    mThread.start();
+    mHandler = new SamplingHandler(mThread.getLooper());
+  }
+
+  /**
+   * Method call to start sampling for download bandwidth.
+   */
+  public void startSampling() {
+    if (mSamplingCounter.getAndIncrement() == 0) {
+      mHandler.sendEmptyMessage(SamplingHandler.MSG_START);
+      mLastTimeReading = SystemClock.elapsedRealtime();
+    }
+  }
+
+  /**
+   * Finish sampling and prevent further changes to the
+   * ConnectionClass until another timer is started.
+   */
+  public void stopSampling() {
+    if (mSamplingCounter.decrementAndGet() == 0) {
+      mHandler.sendEmptyMessage(SamplingHandler.MSG_STOP);
+    }
+  }
+
+  private class SamplingHandler extends Handler {
+    static final int MSG_START = 1;
+    static final int MSG_STOP = 2;
+
+    public SamplingHandler(Looper looper) {
+      super(looper);
+    }
+
+    @Override
+    public void handleMessage(Message msg) {
+      switch (msg.what) {
+        case MSG_START:
+          addSample();
+          sendEmptyMessageDelayed(MSG_START, SAMPLE_TIME);
+          break;
+        case MSG_STOP:
+          addSample();
+          removeMessages(MSG_START);
+          break;
+        default:
+          throw new IllegalArgumentException("Unknown what=" + msg.what);
+      }
+    }
+
+    /**
+     * Method for polling for the change in total bytes since last update and
+     * adding it to the BandwidthManager.
+     */
+    private void addSample() {
+      long byteDiff = QTagTxParser.getInstance().parseDataUsageForUidAndTag(Process.myUid());
+      synchronized (this) {
+        long curTimeReading = SystemClock.elapsedRealtime();
+        if (byteDiff != -1) {
+          mConnectionClassManager.addBandwidth(byteDiff, curTimeReading - mLastTimeReading);
+        }
+        mLastTimeReading = curTimeReading;
+      }
+    }
+  }
+
+  /**
+   * @return True if there are still threads which are sampling, false otherwise.
+   */
+  public boolean isSampling() {
+    return (mSamplingCounter.get() != 0);
+  }
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspCamera1.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspCamera1.java
new file mode 100644
index 0000000..1d0b873
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspCamera1.java
@@ -0,0 +1,109 @@
+package com.pedro.rtplibrary.rtsp;
+
+import android.content.Context;
+import android.media.MediaCodec;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.util.Log;
+import android.view.SurfaceView;
+import android.view.TextureView;
+import com.pedro.encoder.utils.CodecUtil;
+import com.pedro.rtplibrary.base.Camera1Base;
+import com.pedro.rtplibrary.view.LightOpenGlView;
+import com.pedro.rtplibrary.view.OpenGlView;
+import com.pedro.rtsp.rtsp.Protocol;
+import com.pedro.rtsp.rtsp.RtspClient;
+import com.pedro.rtsp.rtsp.VideoCodec;
+import com.pedro.rtsp.utils.ConnectCheckerRtsp;
+import java.nio.ByteBuffer;
+
+/**
+ * More documentation see:
+ * {@link com.pedro.rtplibrary.base.Camera1Base}
+ *
+ * Created by pedro on 10/02/17.
+ */
+
+public class RtspCamera1 extends Camera1Base {
+
+  private RtspClient rtspClient;
+
+  public RtspCamera1(SurfaceView surfaceView, ConnectCheckerRtsp connectCheckerRtsp) {
+    super(surfaceView);
+    rtspClient = new RtspClient(connectCheckerRtsp);
+  }
+
+  public RtspCamera1(TextureView textureView, ConnectCheckerRtsp connectCheckerRtsp) {
+    super(textureView);
+    rtspClient = new RtspClient(connectCheckerRtsp);
+  }
+
+  @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+  public RtspCamera1(OpenGlView openGlView, ConnectCheckerRtsp connectCheckerRtsp) {
+    super(openGlView);
+    rtspClient = new RtspClient(connectCheckerRtsp);
+  }
+
+  @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+  public RtspCamera1(LightOpenGlView lightOpenGlView, ConnectCheckerRtsp connectCheckerRtsp) {
+    super(lightOpenGlView);
+    rtspClient = new RtspClient(connectCheckerRtsp);
+  }
+
+  @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+  public RtspCamera1(Context context, ConnectCheckerRtsp connectCheckerRtsp) {
+    super(context);
+    rtspClient = new RtspClient(connectCheckerRtsp);
+  }
+
+  /**
+   * Internet protocol used.
+   *
+   * @param protocol Could be Protocol.TCP or Protocol.UDP.
+   */
+  public void setProtocol(Protocol protocol) {
+    rtspClient.setProtocol(protocol);
+  }
+
+  public void setVideoCodec(VideoCodec videoCodec) {
+    videoEncoder.setType(videoCodec == VideoCodec.H265 ? CodecUtil.H265_MIME : CodecUtil.H264_MIME);
+  }
+
+  @Override
+  public void setAuthorization(String user, String password) {
+    rtspClient.setAuthorization(user, password);
+  }
+
+  @Override
+  protected void startStreamRtp(String url) {
+    rtspClient.setUrl(url);
+  }
+
+  // johanokl
+  @Override
+  protected void startRtpVideoStreamFixedPort(String host, int port) {
+    Log.d("RTSP", "Start stream RTP host=" + host + ", port=" + port);
+    rtspClient.setVideoPort(port);
+    rtspClient.setUrl("rtp://" + host + ":" + 100);
+  }
+
+
+  @Override
+  protected void stopStreamRtp() {
+    rtspClient.disconnect();
+  }
+
+  @Override
+  protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) {
+    ByteBuffer newSps = sps.duplicate();
+    ByteBuffer newPps = pps.duplicate();
+    ByteBuffer newVps = vps != null ? vps.duplicate() : null;
+    rtspClient.setSPSandPPS(newSps, newPps, newVps);
+    rtspClient.connect();
+  }
+
+  @Override
+  protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) {
+    rtspClient.sendVideo(h264Buffer, info);
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspCamera2.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspCamera2.java
new file mode 100644
index 0000000..a4e93bc
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspCamera2.java
@@ -0,0 +1,108 @@
+package com.pedro.rtplibrary.rtsp;
+
+import android.content.Context;
+import android.media.MediaCodec;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.util.Log;
+import android.view.SurfaceView;
+import android.view.TextureView;
+
+import com.pedro.encoder.utils.CodecUtil;
+import com.pedro.rtplibrary.base.Camera2Base;
+import com.pedro.rtplibrary.view.LightOpenGlView;
+import com.pedro.rtplibrary.view.OpenGlView;
+import com.pedro.rtsp.rtsp.Protocol;
+import com.pedro.rtsp.rtsp.RtspClient;
+import com.pedro.rtsp.rtsp.VideoCodec;
+import com.pedro.rtsp.utils.ConnectCheckerRtsp;
+
+import java.nio.ByteBuffer;
+
+/**
+ * More documentation see:
+ * {@link com.pedro.rtplibrary.base.Camera2Base}
+ *
+ * Created by pedro on 4/06/17.
+ */
+@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+public class RtspCamera2 extends Camera2Base {
+
+  private RtspClient rtspClient;
+
+  public RtspCamera2(SurfaceView surfaceView, ConnectCheckerRtsp connectCheckerRtsp) {
+    super(surfaceView);
+    rtspClient = new RtspClient(connectCheckerRtsp);
+  }
+
+  public RtspCamera2(TextureView textureView, ConnectCheckerRtsp connectCheckerRtsp) {
+    super(textureView);
+    rtspClient = new RtspClient(connectCheckerRtsp);
+  }
+
+  public RtspCamera2(OpenGlView openGlView, ConnectCheckerRtsp connectCheckerRtsp) {
+    super(openGlView);
+    rtspClient = new RtspClient(connectCheckerRtsp);
+  }
+
+  public RtspCamera2(LightOpenGlView lightOpenGlView, ConnectCheckerRtsp connectCheckerRtsp) {
+    super(lightOpenGlView);
+    rtspClient = new RtspClient(connectCheckerRtsp);
+  }
+
+  public RtspCamera2(Context context, boolean useOpengl, ConnectCheckerRtsp connectCheckerRtsp) {
+    super(context, useOpengl);
+    rtspClient = new RtspClient(connectCheckerRtsp);
+  }
+
+  /**
+   * Internet protocol used.
+   *
+   * @param protocol Could be Protocol.TCP or Protocol.UDP.
+   */
+  public void setProtocol(Protocol protocol) {
+    rtspClient.setProtocol(protocol);
+  }
+
+  public void setVideoCodec(VideoCodec videoCodec) {
+    videoEncoder.setType(videoCodec == VideoCodec.H265 ? CodecUtil.H265_MIME : CodecUtil.H264_MIME);
+  }
+
+  @Override
+  public void setAuthorization(String user, String password) {
+    rtspClient.setAuthorization(user, password);
+  }
+
+  @Override
+  protected void startStreamRtp(String url) {
+    rtspClient.setUrl(url);
+  }
+
+  // johanokl
+  @Override
+  protected void startRtpVideoStreamFixedPort(String host, int port) {
+    Log.d("RTSP", "Start stream RTP host=" + host + ", port=" + port);
+    rtspClient.setVideoPort(port);
+    rtspClient.setUrl("rtp://" + host + ":" + 100);
+  }
+
+  @Override
+  protected void stopStreamRtp() {
+    rtspClient.disconnect();
+  }
+
+  @Override
+  protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) {
+    ByteBuffer newSps = sps.duplicate();
+    ByteBuffer newPps = pps.duplicate();
+    ByteBuffer newVps = vps != null ? vps.duplicate() : null;
+    rtspClient.setSPSandPPS(newSps, newPps, newVps);
+    rtspClient.connect();
+  }
+
+  @Override
+  protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) {
+    rtspClient.sendVideo(h264Buffer, info);
+  }
+}
+
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspDisplay.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspDisplay.java
new file mode 100644
index 0000000..7294e32
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspDisplay.java
@@ -0,0 +1,72 @@
+package com.pedro.rtplibrary.rtsp;
+
+import android.content.Context;
+import android.media.MediaCodec;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import com.pedro.encoder.utils.CodecUtil;
+import com.pedro.rtplibrary.base.DisplayBase;
+import com.pedro.rtsp.rtsp.Protocol;
+import com.pedro.rtsp.rtsp.RtspClient;
+import com.pedro.rtsp.rtsp.VideoCodec;
+import com.pedro.rtsp.utils.ConnectCheckerRtsp;
+import java.nio.ByteBuffer;
+
+/**
+ * More documentation see:
+ * {@link com.pedro.rtplibrary.base.DisplayBase}
+ *
+ * Created by pedro on 9/08/17.
+ */
+@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+public class RtspDisplay extends DisplayBase {
+
+  private RtspClient rtspClient;
+
+  public RtspDisplay(Context context, boolean useOpengl, ConnectCheckerRtsp connectCheckerRtsp) {
+    super(context, useOpengl);
+    rtspClient = new RtspClient(connectCheckerRtsp);
+  }
+
+  /**
+   * Internet protocol used.
+   *
+   * @param protocol Could be Protocol.TCP or Protocol.UDP.
+   */
+  public void setProtocol(Protocol protocol) {
+    rtspClient.setProtocol(protocol);
+  }
+
+  public void setVideoCodec(VideoCodec videoCodec) {
+    videoEncoder.setType(videoCodec == VideoCodec.H265 ? CodecUtil.H265_MIME : CodecUtil.H264_MIME);
+  }
+
+  @Override
+  public void setAuthorization(String user, String password) {
+    rtspClient.setAuthorization(user, password);
+  }
+
+  @Override
+  protected void startStreamRtp(String url) {
+    rtspClient.setUrl(url);
+  }
+
+  @Override
+  protected void stopStreamRtp() {
+    rtspClient.disconnect();
+  }
+
+  @Override
+  protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) {
+    ByteBuffer newSps = sps.duplicate();
+    ByteBuffer newPps = pps.duplicate();
+    ByteBuffer newVps = vps != null ? vps.duplicate() : null;
+    rtspClient.setSPSandPPS(newSps, newPps, newVps);
+    rtspClient.connect();
+  }
+
+  @Override
+  protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) {
+    rtspClient.sendVideo(h264Buffer, info);
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspFromFile.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspFromFile.java
new file mode 100644
index 0000000..19994b5
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspFromFile.java
@@ -0,0 +1,105 @@
+package com.pedro.rtplibrary.rtsp;
+
+import android.content.Context;
+import android.media.MediaCodec;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.util.Log;
+
+import com.pedro.encoder.input.decoder.VideoDecoderInterface;
+import com.pedro.encoder.utils.CodecUtil;
+import com.pedro.rtplibrary.base.FromFileBase;
+import com.pedro.rtplibrary.view.LightOpenGlView;
+import com.pedro.rtplibrary.view.OpenGlView;
+import com.pedro.rtsp.rtsp.Protocol;
+import com.pedro.rtsp.rtsp.RtspClient;
+import com.pedro.rtsp.rtsp.VideoCodec;
+import com.pedro.rtsp.utils.ConnectCheckerRtsp;
+import java.nio.ByteBuffer;
+
+/**
+ * More documentation see:
+ * {@link com.pedro.rtplibrary.base.FromFileBase}
+ *
+ * Created by pedro on 4/06/17.
+ */
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class RtspFromFile extends FromFileBase {
+
+  private RtspClient rtspClient;
+
+  public RtspFromFile(ConnectCheckerRtsp connectCheckerRtsp,
+      VideoDecoderInterface videoDecoderInterface) {
+    super(videoDecoderInterface);
+    rtspClient = new RtspClient(connectCheckerRtsp);
+  }
+
+  public RtspFromFile(Context context, ConnectCheckerRtsp connectCheckerRtsp,
+      VideoDecoderInterface videoDecoderInterface) {
+    super(context, videoDecoderInterface);
+    rtspClient = new RtspClient(connectCheckerRtsp);
+  }
+
+  public RtspFromFile(OpenGlView openGlView, ConnectCheckerRtsp connectCheckerRtsp,
+      VideoDecoderInterface videoDecoderInterface) {
+    super(openGlView, videoDecoderInterface);
+    rtspClient = new RtspClient(connectCheckerRtsp);
+  }
+
+  public RtspFromFile(LightOpenGlView lightOpenGlView, ConnectCheckerRtsp connectCheckerRtsp,
+      VideoDecoderInterface videoDecoderInterface) {
+    super(lightOpenGlView, videoDecoderInterface);
+    rtspClient = new RtspClient(connectCheckerRtsp);
+  }
+
+  /**
+   * Internet protocol used.
+   *
+   * @param protocol Could be Protocol.TCP or Protocol.UDP.
+   */
+  public void setProtocol(Protocol protocol) {
+    rtspClient.setProtocol(protocol);
+  }
+
+  public void setVideoCodec(VideoCodec videoCodec) {
+    videoEncoder.setType(videoCodec == VideoCodec.H265 ? CodecUtil.H265_MIME : CodecUtil.H264_MIME);
+  }
+
+  @Override
+  public void setAuthorization(String user, String password) {
+    rtspClient.setAuthorization(user, password);
+  }
+
+  @Override
+  protected void startStreamRtp(String url) {
+    rtspClient.setUrl(url);
+  }
+
+  // johanokl
+  @Override
+  protected void startRtpVideoStreamFixedPort(String host, int port) {
+    Log.d("RTSP", "Start stream RTP host=" + host + ", port=" + port);
+    rtspClient.setVideoPort(port);
+    rtspClient.setUrl("rtp://" + host + ":" + 100);
+  }
+
+  @Override
+  protected void stopStreamRtp() {
+    rtspClient.disconnect();
+  }
+
+  @Override
+  protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) {
+    ByteBuffer newSps = sps.duplicate();
+    ByteBuffer newPps = pps.duplicate();
+    ByteBuffer newVps = vps != null ? vps.duplicate() : null;
+    rtspClient.setSPSandPPS(newSps, newPps, newVps);
+    rtspClient.connect();
+  }
+
+  @Override
+  protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) {
+    rtspClient.sendVideo(h264Buffer, info);
+  }
+}
+
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/AutoFitTextureView.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/AutoFitTextureView.java
new file mode 100644
index 0000000..03d9cfc
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/AutoFitTextureView.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2014 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.pedro.rtplibrary.view;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.TextureView;
+
+/**
+ * A {@link TextureView} that can be adjusted to a specified aspect ratio.
+ */
+public class AutoFitTextureView extends TextureView {
+
+  private int mRatioWidth = 0;
+  private int mRatioHeight = 0;
+
+  public AutoFitTextureView(Context context) {
+    this(context, null);
+  }
+
+  public AutoFitTextureView(Context context, AttributeSet attrs) {
+    this(context, attrs, 0);
+  }
+
+  public AutoFitTextureView(Context context, AttributeSet attrs, int defStyle) {
+    super(context, attrs, defStyle);
+  }
+
+  /**
+   * Sets the aspect ratio for this view. The size of the view will be measured based on the ratio
+   * calculated from the parameters. Note that the actual sizes of parameters don't matter, that
+   * is, calling setAspectRatio(2, 3) and setAspectRatio(4, 6) make the same result.
+   *
+   * @param width Relative horizontal size
+   * @param height Relative vertical size
+   */
+  public void setAspectRatio(int width, int height) {
+    if (width < 0 || height < 0) {
+      throw new IllegalArgumentException("Size cannot be negative.");
+    }
+    mRatioWidth = width;
+    mRatioHeight = height;
+    requestLayout();
+  }
+
+  @Override
+  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+    int width = MeasureSpec.getSize(widthMeasureSpec);
+    int height = MeasureSpec.getSize(heightMeasureSpec);
+    if (0 == mRatioWidth || 0 == mRatioHeight) {
+      setMeasuredDimension(width, height);
+    } else {
+      if (width < height * mRatioWidth / mRatioHeight) {
+        setMeasuredDimension(width, width * mRatioHeight / mRatioWidth);
+      } else {
+        setMeasuredDimension(height * mRatioWidth / mRatioHeight, height);
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/Filter.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/Filter.java
new file mode 100644
index 0000000..1445b6d
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/Filter.java
@@ -0,0 +1,33 @@
+package com.pedro.rtplibrary.view;
+
+import com.pedro.encoder.input.gl.render.filters.BaseFilterRender;
+
+public class Filter {
+
+  private int position;
+  private BaseFilterRender baseFilterRender;
+
+  public Filter() {
+  }
+
+  public Filter(int position, BaseFilterRender baseFilterRender) {
+    this.position = position;
+    this.baseFilterRender = baseFilterRender;
+  }
+
+  public int getPosition() {
+    return position;
+  }
+
+  public void setPosition(int position) {
+    this.position = position;
+  }
+
+  public BaseFilterRender getBaseFilterRender() {
+    return baseFilterRender;
+  }
+
+  public void setBaseFilterRender(BaseFilterRender baseFilterRender) {
+    this.baseFilterRender = baseFilterRender;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/GlInterface.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/GlInterface.java
new file mode 100644
index 0000000..1305d88
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/GlInterface.java
@@ -0,0 +1,105 @@
+package com.pedro.rtplibrary.view;
+
+import android.graphics.SurfaceTexture;
+import android.view.Surface;
+import com.pedro.encoder.input.gl.render.filters.BaseFilterRender;
+
+public interface GlInterface {
+
+  /**
+   * Initialize necessary classes.
+   */
+  void init();
+
+  /**
+   * Set video encoder size use to Opengl
+   * @param width video encoder width in px
+   * @param height video encoder height in px
+   */
+  void setEncoderSize(int width, int height);
+
+  /**
+   * Get SurfaceTexture generated by Opengl. This should be called after start render.
+   * @return surface texture generated by Opengl.
+   */
+  SurfaceTexture getSurfaceTexture();
+
+  /**
+   * Get Surface generated by Opengl. This should be called after start render.
+   * @return surface texture generated by Opengl.
+   */
+  Surface getSurface();
+
+  /**
+   * Set surface from MediaCodec class to Opengl.
+   * This surface is used to copy pixels from Opengl surface to this surface and encode this pixels.
+   * @param surface surface created from MediaCodec.
+   */
+  void addMediaCodecSurface(Surface surface);
+
+  /**
+   * Remove surface generated from MediaCodec.
+   */
+  void removeMediaCodecSurface();
+
+  /**
+   * Capture an Image from Opengl.
+   *
+   * @param takePhotoCallback callback where you will get your image like a bitmap.
+   */
+  void takePhoto(TakePhotoCallback takePhotoCallback);
+
+  /**
+   * Set a filter to stream.
+   * You can select any filter from {@link com.pedro.encoder.input.gl.render.filters} or create
+   * your own filter if you extends from {@link com.pedro.encoder.input.gl.render.filters.BaseFilterRender}
+   *
+   * @param baseFilterRender filter to set. You can modify parameters to filter after set it to stream.
+   */
+  void setFilter(int filterPosition, BaseFilterRender baseFilterRender);
+
+  /**
+   * Set filter in position 0.
+   * @param baseFilterRender filter to set. You can modify parameters to filter after set it to stream.
+   */
+  void setFilter(BaseFilterRender baseFilterRender);
+  
+  /**
+   * Enable or disable Anti aliasing (This method use FXAA).
+   *
+   * @param AAEnabled true is AA enabled, false is AA disabled. False by default.
+   */
+  void enableAA(boolean AAEnabled);
+
+  void setRotation(int rotation);
+
+  /**
+   * Get Anti alias is enabled.
+   * @return true is enabled, false is disabled.
+   */
+  boolean isAAEnabled();
+
+  /**
+   * INTERNAL METHOD.
+   *
+   * Set wait time for next frame to OpenglView, LightOpenglView or OffScreenGlThread.
+   *
+   * @param waitTime time in milliseconds
+   */
+  void setWaitTime(int waitTime);
+
+  /**
+   * INTERNAL METHOD.
+   *
+   * Start Opengl rendering.
+   *
+   */
+  void start();
+
+  /**
+   * INTERNAL METHOD.
+   *
+   * Stop Opengl rendering.
+   */
+  void stop();
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/LightOpenGlView.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/LightOpenGlView.java
new file mode 100644
index 0000000..8a37622
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/LightOpenGlView.java
@@ -0,0 +1,139 @@
+package com.pedro.rtplibrary.view;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.SurfaceTexture;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.util.AttributeSet;
+import android.view.Surface;
+import com.pedro.encoder.input.gl.SurfaceManager;
+import com.pedro.encoder.input.gl.render.SimpleCameraRender;
+import com.pedro.encoder.input.gl.render.filters.BaseFilterRender;
+import com.pedro.encoder.utils.gl.GlUtil;
+import com.pedro.rtplibrary.R;
+
+/**
+ * Created by pedro on 21/02/18.
+ * Light version of OpenGlView for devices too slow.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class LightOpenGlView extends OpenGlViewBase {
+
+  private SimpleCameraRender simpleCameraRender = null;
+  private boolean keepAspectRatio = false;
+  private boolean isFlipHorizontal = false, isFlipVertical = false;
+
+  public LightOpenGlView(Context context) {
+    super(context);
+  }
+
+  public LightOpenGlView(Context context, AttributeSet attrs) {
+    super(context, attrs);
+    TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.LightOpenGlView);
+    try {
+      keepAspectRatio = typedArray.getBoolean(R.styleable.LightOpenGlView_keepAspectRatio, false);
+      isFlipHorizontal = typedArray.getBoolean(R.styleable.LightOpenGlView_isFlipHorizontal, false);
+      isFlipVertical = typedArray.getBoolean(R.styleable.LightOpenGlView_isFlipVertical, false);
+    } finally {
+      typedArray.recycle();
+    }
+  }
+
+  @Override
+  public void init() {
+    if (!initialized) simpleCameraRender = new SimpleCameraRender();
+    simpleCameraRender.setFlip(isFlipHorizontal, isFlipVertical);
+    waitTime = 200;
+    initialized = true;
+  }
+
+  public boolean isKeepAspectRatio() {
+    return keepAspectRatio;
+  }
+
+  public void setKeepAspectRatio(boolean keepAspectRatio) {
+    this.keepAspectRatio = keepAspectRatio;
+  }
+
+  public void setCameraFlip(boolean isFlipHorizontal, boolean isFlipVertical) {
+    simpleCameraRender.setFlip(isFlipHorizontal, isFlipVertical);
+  }
+
+  @Override
+  public void run() {
+    releaseSurfaceManager();
+    surfaceManager = new SurfaceManager(getHolder().getSurface());
+    surfaceManager.makeCurrent();
+    simpleCameraRender.setStreamSize(encoderWidth, encoderHeight);
+    simpleCameraRender.setRotation(rotation);
+    simpleCameraRender.initGl(getContext());
+    simpleCameraRender.getSurfaceTexture().setOnFrameAvailableListener(this);
+    semaphore.release();
+    try {
+      while (running) {
+        synchronized (sync) {
+          sync.wait(waitTime);
+          if (frameAvailable) {
+            frameAvailable = false;
+            surfaceManager.makeCurrent();
+            simpleCameraRender.updateFrame();
+            simpleCameraRender.drawFrame(previewWidth, previewHeight, keepAspectRatio);
+            surfaceManager.swapBuffer();
+            if (takePhotoCallback != null) {
+              takePhotoCallback.onTakePhoto(
+                  GlUtil.getBitmap(previewWidth, previewHeight, encoderWidth, encoderHeight));
+              takePhotoCallback = null;
+            }
+
+            synchronized (sync) {
+              if (surfaceManagerEncoder != null) {
+                surfaceManagerEncoder.makeCurrent();
+                simpleCameraRender.drawFrame(encoderWidth, encoderHeight, false);
+                long ts = simpleCameraRender.getSurfaceTexture().getTimestamp();
+                surfaceManagerEncoder.setPresentationTime(ts);
+                surfaceManagerEncoder.swapBuffer();
+              }
+            }
+          }
+        }
+      }
+    } catch (InterruptedException ignore) {
+      Thread.currentThread().interrupt();
+    } finally {
+      simpleCameraRender.release();
+      releaseSurfaceManager();
+    }
+  }
+
+  @Override
+  public SurfaceTexture getSurfaceTexture() {
+    return simpleCameraRender.getSurfaceTexture();
+  }
+
+  @Override
+  public Surface getSurface() {
+    return simpleCameraRender.getSurface();
+  }
+
+  @Override
+  public void setFilter(int filterPosition, BaseFilterRender baseFilterRender) {
+
+  }
+
+  @Override
+  public void setFilter(BaseFilterRender baseFilterRender) {
+    setFilter(0, baseFilterRender);
+  }
+
+  @Override
+  public void enableAA(boolean AAEnabled) {
+
+  }
+
+  @Override
+  public boolean isAAEnabled() {
+    return false;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OffScreenGlThread.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OffScreenGlThread.java
new file mode 100644
index 0000000..e7ba595
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OffScreenGlThread.java
@@ -0,0 +1,229 @@
+package com.pedro.rtplibrary.view;
+
+import android.content.Context;
+import android.graphics.SurfaceTexture;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.view.Surface;
+import com.pedro.encoder.input.gl.SurfaceManager;
+import com.pedro.encoder.input.gl.render.ManagerRender;
+import com.pedro.encoder.input.gl.render.filters.BaseFilterRender;
+import com.pedro.encoder.input.video.FpsLimiter;
+import com.pedro.encoder.utils.gl.GlUtil;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.Semaphore;
+
+/**
+ * Created by pedro on 4/03/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class OffScreenGlThread
+    implements GlInterface, Runnable, SurfaceTexture.OnFrameAvailableListener {
+
+  private final Context context;
+  private Thread thread = null;
+  private boolean frameAvailable = false;
+  private boolean running = true;
+  private boolean initialized = false;
+
+  private SurfaceManager surfaceManager = null;
+  private SurfaceManager surfaceManagerEncoder = null;
+
+  private ManagerRender textureManager = null;
+
+  private final Semaphore semaphore = new Semaphore(0);
+  private final BlockingQueue<Filter> filterQueue = new LinkedBlockingQueue<>();
+  private final Object sync = new Object();
+  private int encoderWidth, encoderHeight;
+  private boolean loadAA = false;
+
+  private boolean AAEnabled = false;
+  private int waitTime = 10;
+  private int fps = 30;
+  private FpsLimiter fpsLimiter = new FpsLimiter();
+  //used with camera
+  private TakePhotoCallback takePhotoCallback;
+  private int rotation = 0;
+
+  public OffScreenGlThread(Context context) {
+    this.context = context;
+  }
+
+  @Override
+  public void init() {
+    if (!initialized) textureManager = new ManagerRender();
+    initialized = true;
+  }
+
+  @Override
+  public void setEncoderSize(int width, int height) {
+    this.encoderWidth = width;
+    this.encoderHeight = height;
+  }
+
+  public void setFps(int fps) {
+    this.fps = fps;
+  }
+
+  @Override
+  public SurfaceTexture getSurfaceTexture() {
+    return textureManager.getSurfaceTexture();
+  }
+
+  @Override
+  public Surface getSurface() {
+    return textureManager.getSurface();
+  }
+
+  @Override
+  public void addMediaCodecSurface(Surface surface) {
+    synchronized (sync) {
+      surfaceManagerEncoder = new SurfaceManager(surface, surfaceManager);
+    }
+  }
+
+  @Override
+  public void removeMediaCodecSurface() {
+    synchronized (sync) {
+      if (surfaceManagerEncoder != null) {
+        surfaceManagerEncoder.release();
+        surfaceManagerEncoder = null;
+      }
+    }
+  }
+
+  @Override
+  public void takePhoto(TakePhotoCallback takePhotoCallback) {
+    this.takePhotoCallback = takePhotoCallback;
+  }
+
+  @Override
+  public void setFilter(int filterPosition, BaseFilterRender baseFilterRender) {
+    filterQueue.add(new Filter(filterPosition, baseFilterRender));
+  }
+
+  @Override
+  public void setFilter(BaseFilterRender baseFilterRender) {
+    setFilter(0, baseFilterRender);
+  }
+
+  @Override
+  public void enableAA(boolean AAEnabled) {
+    this.AAEnabled = AAEnabled;
+    loadAA = true;
+  }
+
+  @Override
+  public void setRotation(int rotation) {
+    this.rotation = rotation;
+  }
+
+  @Override
+  public boolean isAAEnabled() {
+    return textureManager != null && textureManager.isAAEnabled();
+  }
+
+  @Override
+  public void setWaitTime(int waitTime) {
+    this.waitTime = waitTime;
+  }
+
+  @Override
+  public void start() {
+    synchronized (sync) {
+      thread = new Thread(this);
+      running = true;
+      thread.start();
+      semaphore.acquireUninterruptibly();
+    }
+  }
+
+  @Override
+  public void stop() {
+    synchronized (sync) {
+      if (thread != null) {
+        thread.interrupt();
+        try {
+          thread.join(1000);
+        } catch (InterruptedException e) {
+          thread.interrupt();
+        }
+        thread = null;
+      }
+      fpsLimiter.reset();
+      running = false;
+    }
+  }
+
+  private void releaseSurfaceManager() {
+    if (surfaceManager != null) {
+      surfaceManager.release();
+      surfaceManager = null;
+    }
+  }
+
+  @Override
+  public void run() {
+    releaseSurfaceManager();
+    surfaceManager = new SurfaceManager();
+    surfaceManager.makeCurrent();
+    textureManager.setStreamSize(encoderWidth, encoderHeight);
+    textureManager.setCameraRotation(rotation);
+    textureManager.initGl(encoderWidth, encoderHeight, context);
+    textureManager.getSurfaceTexture().setOnFrameAvailableListener(this);
+    semaphore.release();
+    try {
+      while (running) {
+        if (fpsLimiter.limitFPS(fps)) continue;
+        synchronized (sync) {
+          sync.wait(waitTime);
+          if (frameAvailable) {
+            frameAvailable = false;
+            surfaceManager.makeCurrent();
+            textureManager.updateFrame();
+            textureManager.drawOffScreen();
+            textureManager.drawScreen(encoderWidth, encoderHeight, false);
+            surfaceManager.swapBuffer();
+
+            synchronized (sync) {
+              if (surfaceManagerEncoder != null) {
+                surfaceManagerEncoder.makeCurrent();
+                textureManager.drawScreen(encoderWidth, encoderHeight, false);
+                long ts = textureManager.getSurfaceTexture().getTimestamp();
+                surfaceManagerEncoder.setPresentationTime(ts);
+                surfaceManagerEncoder.swapBuffer();
+                if (takePhotoCallback != null) {
+                  takePhotoCallback.onTakePhoto(
+                      GlUtil.getBitmap(encoderWidth, encoderHeight, encoderWidth, encoderHeight));
+                  takePhotoCallback = null;
+                }
+              }
+            }
+          }
+          if (!filterQueue.isEmpty()) {
+            Filter filter = filterQueue.poll();
+            textureManager.setFilter(filter.getPosition(), filter.getBaseFilterRender());
+          } else if (loadAA) {
+            textureManager.enableAA(AAEnabled);
+            loadAA = false;
+          }
+        }
+      }
+    } catch (InterruptedException ignore) {
+      Thread.currentThread().interrupt();
+    } finally {
+      textureManager.release();
+      releaseSurfaceManager();
+    }
+  }
+
+  @Override
+  public void onFrameAvailable(SurfaceTexture surfaceTexture) {
+    synchronized (sync) {
+      frameAvailable = true;
+      sync.notifyAll();
+    }
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlView.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlView.java
new file mode 100644
index 0000000..98a770c
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlView.java
@@ -0,0 +1,152 @@
+package com.pedro.rtplibrary.view;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.SurfaceTexture;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.util.AttributeSet;
+import android.view.Surface;
+import com.pedro.encoder.input.gl.SurfaceManager;
+import com.pedro.encoder.input.gl.render.ManagerRender;
+import com.pedro.encoder.input.gl.render.filters.BaseFilterRender;
+import com.pedro.encoder.utils.gl.GlUtil;
+import com.pedro.rtplibrary.R;
+
+/**
+ * Created by pedro on 9/09/17.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public class OpenGlView extends OpenGlViewBase {
+
+  private ManagerRender managerRender = null;
+  private boolean loadAA = false;
+
+  private boolean AAEnabled = false;
+  private boolean keepAspectRatio = false;
+  private boolean isFlipHorizontal = false, isFlipVertical = false;
+
+  public OpenGlView(Context context) {
+    super(context);
+  }
+
+  public OpenGlView(Context context, AttributeSet attrs) {
+    super(context, attrs);
+    TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.OpenGlView);
+    try {
+      keepAspectRatio = typedArray.getBoolean(R.styleable.OpenGlView_keepAspectRatio, false);
+      AAEnabled = typedArray.getBoolean(R.styleable.OpenGlView_AAEnabled, false);
+      ManagerRender.numFilters = typedArray.getInt(R.styleable.OpenGlView_numFilters, 1);
+      isFlipHorizontal = typedArray.getBoolean(R.styleable.OpenGlView_isFlipHorizontal, false);
+      isFlipVertical = typedArray.getBoolean(R.styleable.OpenGlView_isFlipVertical, false);
+    } finally {
+      typedArray.recycle();
+    }
+  }
+
+  @Override
+  public void init() {
+    if (!initialized) managerRender = new ManagerRender();
+    managerRender.setCameraFlip(isFlipHorizontal, isFlipVertical);
+    waitTime = 10;
+    initialized = true;
+  }
+
+  @Override
+  public SurfaceTexture getSurfaceTexture() {
+    return managerRender.getSurfaceTexture();
+  }
+
+  @Override
+  public Surface getSurface() {
+    return managerRender.getSurface();
+  }
+
+  @Override
+  public void setFilter(int filterPosition, BaseFilterRender baseFilterRender) {
+    filterQueue.add(new Filter(filterPosition, baseFilterRender));
+  }
+
+  @Override
+  public void setFilter(BaseFilterRender baseFilterRender) {
+    setFilter(0, baseFilterRender);
+  }
+
+  @Override
+  public void enableAA(boolean AAEnabled) {
+    this.AAEnabled = AAEnabled;
+    loadAA = true;
+  }
+
+  public boolean isKeepAspectRatio() {
+    return keepAspectRatio;
+  }
+
+  public void setKeepAspectRatio(boolean keepAspectRatio) {
+    this.keepAspectRatio = keepAspectRatio;
+  }
+
+  public void setCameraFlip(boolean isFlipHorizontal, boolean isFlipVertical) {
+    managerRender.setCameraFlip(isFlipHorizontal, isFlipVertical);
+  }
+
+  @Override
+  public boolean isAAEnabled() {
+    return managerRender != null && managerRender.isAAEnabled();
+  }
+
+  @Override
+  public void run() {
+    releaseSurfaceManager();
+    surfaceManager = new SurfaceManager(getHolder().getSurface());
+    surfaceManager.makeCurrent();
+    managerRender.setStreamSize(encoderWidth, encoderHeight);
+    managerRender.setCameraRotation(rotation);
+    managerRender.initGl(previewWidth, previewHeight, getContext());
+    managerRender.getSurfaceTexture().setOnFrameAvailableListener(this);
+    semaphore.release();
+    try {
+      while (running) {
+        synchronized (sync) {
+          sync.wait(waitTime);
+          if (frameAvailable) {
+            frameAvailable = false;
+            surfaceManager.makeCurrent();
+            managerRender.updateFrame();
+            managerRender.drawOffScreen();
+            managerRender.drawScreen(previewWidth, previewHeight, keepAspectRatio);
+            surfaceManager.swapBuffer();
+            if (takePhotoCallback != null) {
+              takePhotoCallback.onTakePhoto(
+                  GlUtil.getBitmap(previewWidth, previewHeight, encoderWidth, encoderHeight));
+              takePhotoCallback = null;
+            }
+            //stream object loaded but you need reset surfaceManagerEncoder
+            synchronized (sync) {
+              if (surfaceManagerEncoder != null) {
+                surfaceManagerEncoder.makeCurrent();
+                managerRender.drawScreen(encoderWidth, encoderHeight, false);
+                long ts = managerRender.getSurfaceTexture().getTimestamp();
+                surfaceManagerEncoder.setPresentationTime(ts);
+                surfaceManagerEncoder.swapBuffer();
+              }
+            }
+          }
+          if (!filterQueue.isEmpty()) {
+            Filter filter = filterQueue.take();
+            managerRender.setFilter(filter.getPosition(), filter.getBaseFilterRender());
+          } else if (loadAA) {
+            managerRender.enableAA(AAEnabled);
+            loadAA = false;
+          }
+        }
+      }
+    } catch (InterruptedException ignore) {
+      Thread.currentThread().interrupt();
+    } finally {
+      managerRender.release();
+      releaseSurfaceManager();
+    }
+  }
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlViewBase.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlViewBase.java
new file mode 100644
index 0000000..7225b38
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlViewBase.java
@@ -0,0 +1,160 @@
+package com.pedro.rtplibrary.view;
+
+import android.content.Context;
+import android.graphics.SurfaceTexture;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import com.pedro.encoder.input.gl.SurfaceManager;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.Semaphore;
+
+/**
+ * Created by pedro on 10/03/18.
+ */
+
+@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+public abstract class OpenGlViewBase extends SurfaceView
+    implements GlInterface, Runnable, SurfaceTexture.OnFrameAvailableListener,
+    SurfaceHolder.Callback {
+
+  public final static String TAG = "OpenGlViewBase";
+
+  protected Thread thread = null;
+  protected boolean frameAvailable = false;
+  protected boolean running = false;
+  protected boolean initialized = false;
+
+  protected SurfaceManager surfaceManager = null;
+  protected SurfaceManager surfaceManagerEncoder = null;
+
+  protected final Semaphore semaphore = new Semaphore(0);
+  protected final BlockingQueue<Filter> filterQueue = new LinkedBlockingQueue<>();
+  protected final Object sync = new Object();
+  protected int previewWidth, previewHeight;
+  protected int encoderWidth, encoderHeight;
+  protected int waitTime;
+  protected TakePhotoCallback takePhotoCallback;
+  protected int rotation = 0;
+
+  public OpenGlViewBase(Context context) {
+    super(context);
+    getHolder().addCallback(this);
+  }
+
+  public OpenGlViewBase(Context context, AttributeSet attrs) {
+    super(context, attrs);
+    getHolder().addCallback(this);
+  }
+
+  @Override
+  public abstract void init();
+
+  @Override
+  public abstract SurfaceTexture getSurfaceTexture();
+
+  @Override
+  public abstract Surface getSurface();
+
+  @Override
+  public void setRotation(int rotation) {
+    this.rotation = rotation;
+  }
+
+  @Override
+  public void takePhoto(TakePhotoCallback takePhotoCallback) {
+    this.takePhotoCallback = takePhotoCallback;
+  }
+
+  @Override
+  public void addMediaCodecSurface(Surface surface) {
+    synchronized (sync) {
+      surfaceManagerEncoder = new SurfaceManager(surface, surfaceManager);
+    }
+  }
+
+  @Override
+  public void removeMediaCodecSurface() {
+    synchronized (sync) {
+      if (surfaceManagerEncoder != null) {
+        surfaceManagerEncoder.release();
+        surfaceManagerEncoder = null;
+      }
+    }
+  }
+
+  @Override
+  public void setWaitTime(int waitTime) {
+    this.waitTime = waitTime;
+  }
+
+  @Override
+  public void setEncoderSize(int width, int height) {
+    this.encoderWidth = width;
+    this.encoderHeight = height;
+  }
+
+  @Override
+  public void start() {
+    synchronized (sync) {
+      Log.i(TAG, "Thread started.");
+      thread = new Thread(this);
+      running = true;
+      thread.start();
+      semaphore.acquireUninterruptibly();
+    }
+  }
+
+  @Override
+  public void stop() {
+    synchronized (sync) {
+      if (thread != null) {
+        thread.interrupt();
+        try {
+          thread.join(1000);
+        } catch (InterruptedException e) {
+          thread.interrupt();
+        }
+        thread = null;
+      }
+      running = false;
+      rotation = 0;
+    }
+  }
+
+  protected void releaseSurfaceManager() {
+    if (surfaceManager != null) {
+      surfaceManager.release();
+      surfaceManager = null;
+    }
+  }
+
+  @Override
+  public void onFrameAvailable(SurfaceTexture surfaceTexture) {
+    synchronized (sync) {
+      frameAvailable = true;
+      sync.notifyAll();
+    }
+  }
+
+  @Override
+  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+    Log.i(TAG, "size: " + width + "x" + height);
+    this.previewWidth = width;
+    this.previewHeight = height;
+  }
+
+  @Override
+  public void surfaceCreated(SurfaceHolder holder) {
+  }
+
+  @Override
+  public void surfaceDestroyed(SurfaceHolder holder) {
+    stop();
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/TakePhotoCallback.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/TakePhotoCallback.java
new file mode 100644
index 0000000..82c63c4
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/TakePhotoCallback.java
@@ -0,0 +1,8 @@
+package com.pedro.rtplibrary.view;
+
+import android.graphics.Bitmap;
+
+public interface TakePhotoCallback {
+
+  void onTakePhoto(Bitmap bitmap);
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/rtcp/BaseSenderReport.java b/rtplibrary/src/main/java/com/pedro/rtsp/rtcp/BaseSenderReport.java
new file mode 100644
index 0000000..78a37b7
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/rtcp/BaseSenderReport.java
@@ -0,0 +1,130 @@
+package com.pedro.rtsp.rtcp;
+
+import android.util.Log;
+import com.pedro.rtsp.rtsp.Protocol;
+import com.pedro.rtsp.rtsp.RtpFrame;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Random;
+
+public abstract class BaseSenderReport {
+
+  protected static final String TAG = "BaseSenderReport";
+  protected static final int PACKET_LENGTH = 28;
+  private static final int MTU = 1500;
+  private final long interval = 3000;
+
+  private final byte[] videoBuffer = new byte[MTU];
+  private final byte[] audioBuffer = new byte[MTU];
+
+  private long videoTime;
+  private long audioTime;
+  private int videoPacketCount;
+  private int videoOctetCount;
+  private int audioPacketCount;
+  private int audioOctetCount;
+
+  BaseSenderReport() {
+    /*							     Version(2)  Padding(0)					 					*/
+    /*									 ^		  ^			PT = 0	    						*/
+    /*									 |		  |				^								*/
+    /*									 | --------			 	|								*/
+    /*									 | |---------------------								*/
+    /*									 | ||													*/
+    /*									 | ||													*/
+    videoBuffer[0] = (byte) Integer.parseInt("10000000", 2);
+    audioBuffer[0] = (byte) Integer.parseInt("10000000", 2);
+
+    /* Packet Type PT */
+    videoBuffer[1] = (byte) 200;
+    audioBuffer[1] = (byte) 200;
+
+    /* Byte 2,3          ->  Length		                     */
+    setLong(videoBuffer, PACKET_LENGTH / 4 - 1, 2, 4);
+    setLong(audioBuffer, PACKET_LENGTH / 4 - 1, 2, 4);
+    /* Byte 4,5,6,7      ->  SSRC                            */
+    setLong(videoBuffer, new Random().nextInt(), 4, 8);
+    setLong(audioBuffer, new Random().nextInt(), 4, 8);
+    /* Byte 8,9,10,11    ->  NTP timestamp hb				 */
+    /* Byte 12,13,14,15  ->  NTP timestamp lb				 */
+    /* Byte 16,17,18,19  ->  RTP timestamp		             */
+    /* Byte 20,21,22,23  ->  packet count				 	 */
+    /* Byte 24,25,26,27  ->  octet count			         */
+  }
+
+  public static BaseSenderReport getInstance(Protocol protocol) {
+    return protocol == Protocol.TCP ? new SenderReportTcp() : new SenderReportUdp();
+  }
+
+  public abstract void setDataStream(OutputStream outputStream, String host);
+
+  public void update(RtpFrame rtpFrame) {
+    if (rtpFrame.getChannelIdentifier() == (byte) 2) {
+      updateVideo(rtpFrame);
+    } else {
+      updateAudio(rtpFrame);
+    }
+  }
+
+  public abstract void sendReport(byte[] buffer, RtpFrame rtpFrame, String type, int packetCount,
+      int octetCount) throws IOException;
+
+  private void updateVideo(RtpFrame rtpFrame) {
+    videoPacketCount++;
+    videoOctetCount += rtpFrame.getLength();
+    setLong(videoBuffer, videoPacketCount, 20, 24);
+    setLong(videoBuffer, videoOctetCount, 24, 28);
+    if (System.currentTimeMillis() - videoTime >= interval) {
+      videoTime = System.currentTimeMillis();
+      setData(videoBuffer, System.nanoTime(), rtpFrame.getTimeStamp());
+      try {
+        sendReport(videoBuffer, rtpFrame, "Video", videoPacketCount, videoOctetCount);
+      } catch (IOException e) {
+        Log.e(TAG, "Error", e);
+      }
+    }
+  }
+
+  private void updateAudio(RtpFrame rtpFrame) {
+    audioPacketCount++;
+    audioOctetCount += rtpFrame.getLength();
+    setLong(audioBuffer, audioPacketCount, 20, 24);
+    setLong(audioBuffer, audioOctetCount, 24, 28);
+    if (System.currentTimeMillis() - audioTime >= interval) {
+      audioTime = System.currentTimeMillis();
+      setData(audioBuffer, System.nanoTime(), rtpFrame.getTimeStamp());
+      try {
+        sendReport(audioBuffer, rtpFrame, "Audio", audioPacketCount, audioOctetCount);
+      } catch (IOException e) {
+        Log.e(TAG, "Error", e);
+      }
+    }
+  }
+
+  public void reset() {
+    videoPacketCount = videoOctetCount = 0;
+    audioPacketCount = audioOctetCount = 0;
+    videoTime = audioTime = 0;
+    setLong(videoBuffer, videoPacketCount, 20, 24);
+    setLong(videoBuffer, videoOctetCount, 24, 28);
+    setLong(audioBuffer, audioPacketCount, 20, 24);
+    setLong(audioBuffer, audioOctetCount, 24, 28);
+  }
+
+  public abstract void close();
+
+  private void setLong(byte[] buffer, long n, int begin, int end) {
+    for (end--; end >= begin; end--) {
+      buffer[end] = (byte) (n % 256);
+      n >>= 8;
+    }
+  }
+
+  private void setData(byte[] buffer, long ntpts, long rtpts) {
+    long hb = ntpts / 1000000000;
+    long lb = ((ntpts - hb * 1000000000) * 4294967296L) / 1000000000;
+    setLong(buffer, hb, 8, 12);
+    setLong(buffer, lb, 12, 16);
+    setLong(buffer, rtpts, 16, 20);
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/rtcp/SenderReportTcp.java b/rtplibrary/src/main/java/com/pedro/rtsp/rtcp/SenderReportTcp.java
new file mode 100644
index 0000000..8c9f155
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/rtcp/SenderReportTcp.java
@@ -0,0 +1,44 @@
+package com.pedro.rtsp.rtcp;
+
+import android.util.Log;
+import com.pedro.rtsp.rtsp.RtpFrame;
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class SenderReportTcp extends BaseSenderReport {
+
+  private OutputStream outputStream;
+  private byte tcpHeader[];
+
+  public SenderReportTcp() {
+    super();
+    tcpHeader = new byte[] { '$', 0, 0, PACKET_LENGTH };
+  }
+
+  @Override
+  public void setDataStream(OutputStream outputStream, String host) {
+    this.outputStream = outputStream;
+  }
+
+  @Override
+  public void sendReport(byte[] buffer, RtpFrame rtpFrame, String type, int packetCount,
+      int octetCount) throws IOException {
+    sendReportTCP(buffer, rtpFrame.getChannelIdentifier(), type, packetCount, octetCount);
+  }
+
+  @Override
+  public void close() {
+
+  }
+
+  private void sendReportTCP(byte[] buffer, byte channelIdentifier, String type, int packet,
+      int octet) throws IOException {
+    synchronized (outputStream) {
+      tcpHeader[1] = (byte) (channelIdentifier + 1);
+      outputStream.write(tcpHeader);
+      outputStream.write(buffer, 0, PACKET_LENGTH);
+      outputStream.flush();
+      Log.i(TAG, "wrote report: " + type + ", packets: " + packet + ", octet: " + octet);
+    }
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/rtcp/SenderReportUdp.java b/rtplibrary/src/main/java/com/pedro/rtsp/rtcp/SenderReportUdp.java
new file mode 100644
index 0000000..554e498
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/rtcp/SenderReportUdp.java
@@ -0,0 +1,55 @@
+package com.pedro.rtsp.rtcp;
+
+import android.util.Log;
+import com.pedro.rtsp.rtsp.RtpFrame;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.DatagramPacket;
+import java.net.InetAddress;
+import java.net.MulticastSocket;
+import java.net.UnknownHostException;
+
+public class SenderReportUdp extends BaseSenderReport {
+
+  private MulticastSocket multicastSocket;
+  private DatagramPacket datagramPacket = new DatagramPacket(new byte[] { 0 }, 1);
+
+  public SenderReportUdp() {
+    super();
+    try {
+      multicastSocket = new MulticastSocket();
+      multicastSocket.setTimeToLive(64);
+    } catch (IOException e) {
+      Log.e(TAG, "Error", e);
+    }
+  }
+
+  @Override
+  public void setDataStream(OutputStream outputStream, String host) {
+    try {
+      datagramPacket.setAddress(InetAddress.getByName(host));
+    } catch (UnknownHostException e) {
+      Log.e(TAG, "Error", e);
+    }
+  }
+
+  @Override
+  public void sendReport(byte[] buffer, RtpFrame rtpFrame, String type, int packetCount,
+      int octetCount) throws IOException {
+    sendReportUDP(buffer, rtpFrame.getRtcpPort(), type, packetCount, octetCount);
+  }
+
+  @Override
+  public void close() {
+    multicastSocket.close();
+  }
+
+  private void sendReportUDP(byte[] buffer, int port, String type, int packet, int octet)
+      throws IOException {
+    datagramPacket.setData(buffer);
+    datagramPacket.setPort(port);
+    datagramPacket.setLength(PACKET_LENGTH);
+    multicastSocket.send(datagramPacket);
+    Log.i(TAG, "wrote report: " + type + ", packets: " + packet + ", octet: " + octet);
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/rtp/packets/BasePacket.java b/rtplibrary/src/main/java/com/pedro/rtsp/rtp/packets/BasePacket.java
new file mode 100644
index 0000000..a033656
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/rtp/packets/BasePacket.java
@@ -0,0 +1,71 @@
+package com.pedro.rtsp.rtp.packets;
+
+import android.media.MediaCodec;
+import com.pedro.rtsp.utils.RtpConstants;
+import java.nio.ByteBuffer;
+import java.util.Random;
+
+public abstract class BasePacket {
+
+  protected final static int maxPacketSize = RtpConstants.MTU - 28;
+  protected byte channelIdentifier;
+  protected int rtpPort;
+  protected int rtcpPort;
+  private final long clock;
+  private int seq = 0;
+  private int ssrc;
+
+  public BasePacket(long clock) {
+    this.clock = clock;
+    ssrc = new Random().nextInt();
+  }
+
+  public abstract void createAndSendPacket(ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo);
+
+  public void setPorts(int rtpPort, int rtcpPort) {
+    this.rtpPort = rtpPort;
+    this.rtcpPort = rtcpPort;
+  }
+
+  public void reset() {
+    seq = 0;
+    ssrc = new Random().nextInt();
+  }
+
+  protected byte[] getBuffer(int size) {
+    byte[] buffer = new byte[size];
+    buffer[0] = (byte) Integer.parseInt("10000000", 2);
+    buffer[1] = (byte) RtpConstants.payloadType;
+    setLongSSRC(buffer, ssrc);
+    requestBuffer(buffer);
+    return buffer;
+  }
+
+  protected void updateTimeStamp(byte[] buffer, long timestamp) {
+    long ts = timestamp * clock / 1000000000L;
+    setLong(buffer, ts, 4, 8);
+  }
+
+  protected void setLong(byte[] buffer, long n, int begin, int end) {
+    for (end--; end >= begin; end--) {
+      buffer[end] = (byte) (n % 256);
+      n >>= 8;
+    }
+  }
+
+  protected void updateSeq(byte[] buffer) {
+    setLong(buffer, ++seq, 2, 4);
+  }
+
+  protected void markPacket(byte[] buffer) {
+    buffer[1] |= 0x80;
+  }
+
+  private void setLongSSRC(byte[] buffer, int ssrc) {
+    setLong(buffer, ssrc, 8, 12);
+  }
+
+  private void requestBuffer(byte[] buffer) {
+    buffer[1] &= 0x7F;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/rtp/packets/H264Packet.java b/rtplibrary/src/main/java/com/pedro/rtsp/rtp/packets/H264Packet.java
new file mode 100644
index 0000000..d28ed43
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/rtp/packets/H264Packet.java
@@ -0,0 +1,124 @@
+package com.pedro.rtsp.rtp.packets;
+
+import android.media.MediaCodec;
+import com.pedro.rtsp.rtsp.RtpFrame;
+import com.pedro.rtsp.utils.RtpConstants;
+import java.nio.ByteBuffer;
+
+/**
+ * RFC 3984
+ */
+public class H264Packet extends BasePacket {
+
+  private byte[] header = new byte[5];
+  private byte[] stapA;
+  private VideoPacketCallback videoPacketCallback;
+
+  public H264Packet(byte[] sps, byte[] pps, VideoPacketCallback videoPacketCallback) {
+    super(RtpConstants.clockVideoFrequency);
+    this.videoPacketCallback = videoPacketCallback;
+    channelIdentifier = (byte) 2;
+    setSpsPps(sps, pps);
+  }
+
+  @Override
+  public void createAndSendPacket(ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo) {
+    // We read a NAL units from ByteBuffer and we send them
+    // NAL units are preceded with 0x00000001
+    byteBuffer.rewind();
+    byteBuffer.get(header, 0, 5);
+    long ts = bufferInfo.presentationTimeUs * 1000L;
+    int naluLength = bufferInfo.size - byteBuffer.position() + 1;
+    int type = header[4] & 0x1F;
+    if (type == 5) {
+      byte[] buffer = getBuffer(stapA.length + RtpConstants.RTP_HEADER_LENGTH);
+      updateTimeStamp(buffer, ts);
+
+      markPacket(buffer); //mark end frame
+      System.arraycopy(stapA, 0, buffer, RtpConstants.RTP_HEADER_LENGTH, stapA.length);
+
+      updateSeq(buffer);
+      RtpFrame rtpFrame =
+          new RtpFrame(buffer, ts, stapA.length + RtpConstants.RTP_HEADER_LENGTH, rtpPort, rtcpPort,
+              channelIdentifier);
+      videoPacketCallback.onVideoFrameCreated(rtpFrame);
+    }
+    // Small NAL unit => Single NAL unit
+    if (naluLength <= maxPacketSize - RtpConstants.RTP_HEADER_LENGTH - 2) {
+      int cont = naluLength - 1;
+      int length = cont < bufferInfo.size - byteBuffer.position() ? cont
+          : bufferInfo.size - byteBuffer.position();
+      byte[] buffer = getBuffer(length + RtpConstants.RTP_HEADER_LENGTH + 1);
+
+      buffer[RtpConstants.RTP_HEADER_LENGTH] = header[4];
+      byteBuffer.get(buffer, RtpConstants.RTP_HEADER_LENGTH + 1, length);
+
+      updateTimeStamp(buffer, ts);
+      markPacket(buffer); //mark end frame
+
+      updateSeq(buffer);
+      RtpFrame rtpFrame =
+          new RtpFrame(buffer, ts, naluLength + RtpConstants.RTP_HEADER_LENGTH, rtpPort, rtcpPort,
+              channelIdentifier);
+      videoPacketCallback.onVideoFrameCreated(rtpFrame);
+    }
+    // Large NAL unit => Split nal unit
+    else {
+      // Set FU-A header
+      header[1] = (byte) (header[4] & 0x1F);  // FU header type
+      header[1] += 0x80; // set start bit to 1
+      // Set FU-A indicator
+      header[0] = (byte) ((header[4] & 0x60) & 0xFF); // FU indicator NRI
+      header[0] += 28;
+
+      int sum = 1;
+      while (sum < naluLength) {
+        int cont = naluLength - sum > maxPacketSize - RtpConstants.RTP_HEADER_LENGTH - 2 ?
+            maxPacketSize
+                - RtpConstants.RTP_HEADER_LENGTH
+                - 2 : naluLength - sum;
+        int length = cont < bufferInfo.size - byteBuffer.position() ? cont
+            : bufferInfo.size - byteBuffer.position();
+        byte[] buffer = getBuffer(length + RtpConstants.RTP_HEADER_LENGTH + 2);
+
+        buffer[RtpConstants.RTP_HEADER_LENGTH] = header[0];
+        buffer[RtpConstants.RTP_HEADER_LENGTH + 1] = header[1];
+        updateTimeStamp(buffer, ts);
+        byteBuffer.get(buffer, RtpConstants.RTP_HEADER_LENGTH + 2, length);
+        sum += length;
+        // Last packet before next NAL
+        if (sum >= naluLength) {
+          // End bit on
+          buffer[RtpConstants.RTP_HEADER_LENGTH + 1] += 0x40;
+          markPacket(buffer); //mark end frame
+        }
+        updateSeq(buffer);
+        RtpFrame rtpFrame =
+            new RtpFrame(buffer, ts, length + RtpConstants.RTP_HEADER_LENGTH + 2, rtpPort, rtcpPort,
+                channelIdentifier);
+        videoPacketCallback.onVideoFrameCreated(rtpFrame);
+        // Switch start bit
+        header[1] = (byte) (header[1] & 0x7F);
+      }
+    }
+  }
+
+  private void setSpsPps(byte[] sps, byte[] pps) {
+    stapA = new byte[sps.length + pps.length + 5];
+
+    // STAP-A NAL header is 24
+    stapA[0] = 24;
+
+    // Write NALU 1 size into the array (NALU 1 is the SPS).
+    stapA[1] = (byte) (sps.length >> 8);
+    stapA[2] = (byte) (sps.length & 0xFF);
+
+    // Write NALU 2 size into the array (NALU 2 is the PPS).
+    stapA[sps.length + 3] = (byte) (pps.length >> 8);
+    stapA[sps.length + 4] = (byte) (pps.length & 0xFF);
+
+    // Write NALU 1 into the array, then write NALU 2 into the array.
+    System.arraycopy(sps, 0, stapA, 3, sps.length);
+    System.arraycopy(pps, 0, stapA, 5 + sps.length, pps.length);
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/rtp/packets/H265Packet.java b/rtplibrary/src/main/java/com/pedro/rtsp/rtp/packets/H265Packet.java
new file mode 100644
index 0000000..a120f77
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/rtp/packets/H265Packet.java
@@ -0,0 +1,131 @@
+package com.pedro.rtsp.rtp.packets;
+
+import android.media.MediaCodec;
+import com.pedro.rtsp.rtsp.RtpFrame;
+import com.pedro.rtsp.utils.RtpConstants;
+import java.nio.ByteBuffer;
+
+/**
+ * RFC 7798.
+ */
+public class H265Packet extends BasePacket {
+
+  private byte[] header = new byte[6];
+  private byte[] stapA;
+  private VideoPacketCallback videoPacketCallback;
+
+  public H265Packet(byte[] sps, byte[] pps, byte[] vps, VideoPacketCallback videoPacketCallback) {
+    super(RtpConstants.clockVideoFrequency);
+    this.videoPacketCallback = videoPacketCallback;
+    channelIdentifier = (byte) 2;
+    setSpsPpsVps(sps, pps, vps);
+  }
+
+  @Override
+  public void createAndSendPacket(ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo) {
+    // We read a NAL units from ByteBuffer and we send them
+    // NAL units are preceded with 0x00000001
+    byteBuffer.rewind();
+    byteBuffer.get(header, 0, 6);
+    long ts = bufferInfo.presentationTimeUs * 1000L;
+    int naluLength = bufferInfo.size - byteBuffer.position() + 1;
+    int type = (header[4] >> 1) & 0x3f;
+    if (type == 20) {
+      byte[] buffer = getBuffer(stapA.length + RtpConstants.RTP_HEADER_LENGTH);
+      updateTimeStamp(buffer, ts);
+
+      markPacket(buffer); //mark end frame
+      System.arraycopy(stapA, 0, buffer, RtpConstants.RTP_HEADER_LENGTH, stapA.length);
+
+      updateSeq(buffer);
+      RtpFrame rtpFrame =
+          new RtpFrame(buffer, ts, stapA.length + RtpConstants.RTP_HEADER_LENGTH, rtpPort, rtcpPort,
+              channelIdentifier);
+      videoPacketCallback.onVideoFrameCreated(rtpFrame);
+    }
+    // Small NAL unit => Single NAL unit
+    if (naluLength <= maxPacketSize - RtpConstants.RTP_HEADER_LENGTH - 3) {
+      int cont = naluLength - 1;
+      int length = cont < bufferInfo.size - byteBuffer.position() ? cont
+          : bufferInfo.size - byteBuffer.position();
+      byte[] buffer = getBuffer(length + RtpConstants.RTP_HEADER_LENGTH + 2);
+      //Set PayloadHdr (exact copy of nal unit header)
+      buffer[RtpConstants.RTP_HEADER_LENGTH] = header[4];
+      buffer[RtpConstants.RTP_HEADER_LENGTH + 1] = header[5];
+      byteBuffer.get(buffer, RtpConstants.RTP_HEADER_LENGTH + 2, length);
+
+      updateTimeStamp(buffer, ts);
+      markPacket(buffer); //mark end frame
+
+      updateSeq(buffer);
+      RtpFrame rtpFrame =
+          new RtpFrame(buffer, ts, naluLength + RtpConstants.RTP_HEADER_LENGTH, rtpPort, rtcpPort,
+              channelIdentifier);
+      videoPacketCallback.onVideoFrameCreated(rtpFrame);
+    }
+    // Large NAL unit => Split nal unit
+    else {
+      //Set PayloadHdr (16bit type=49)
+      header[0] = 49 << 1;
+      header[1] = 1;
+      // Set FU header
+      //   +---------------+
+      //   |0|1|2|3|4|5|6|7|
+      //   +-+-+-+-+-+-+-+-+
+      //   |S|E|  FuType   |
+      //   +---------------+
+      header[2] = (byte) type;  // FU header type
+      header[2] += 0x80; // Start bit
+
+      int sum = 1;
+      while (sum < naluLength) {
+        int cont = naluLength - sum > maxPacketSize - RtpConstants.RTP_HEADER_LENGTH - 3 ?
+            maxPacketSize
+                - RtpConstants.RTP_HEADER_LENGTH
+                - 3 : naluLength - sum;
+        int length = cont < bufferInfo.size - byteBuffer.position() ? cont
+            : bufferInfo.size - byteBuffer.position();
+        byte[] buffer = getBuffer(length + RtpConstants.RTP_HEADER_LENGTH + 3);
+
+        buffer[RtpConstants.RTP_HEADER_LENGTH] = header[0];
+        buffer[RtpConstants.RTP_HEADER_LENGTH + 1] = header[1];
+        buffer[RtpConstants.RTP_HEADER_LENGTH + 2] = header[2];
+        updateTimeStamp(buffer, ts);
+        byteBuffer.get(buffer, RtpConstants.RTP_HEADER_LENGTH + 3, length);
+        sum += length;
+        // Last packet before next NAL
+        if (sum >= naluLength) {
+          // End bit on
+          buffer[RtpConstants.RTP_HEADER_LENGTH + 2] += 0x40;
+          markPacket(buffer); //mark end frame
+        }
+        updateSeq(buffer);
+        RtpFrame rtpFrame =
+            new RtpFrame(buffer, ts, length + RtpConstants.RTP_HEADER_LENGTH + 3, rtpPort, rtcpPort,
+                channelIdentifier);
+        videoPacketCallback.onVideoFrameCreated(rtpFrame);
+        // Switch start bit
+        header[2] = (byte) (header[2] & 0x7F);
+      }
+    }
+  }
+
+  private void setSpsPpsVps(byte[] sps, byte[] pps, byte[] vps) {
+    stapA = new byte[sps.length + pps.length + 6];
+
+    stapA[0] = 48 << 1;
+    stapA[1] = 1;
+
+    // Write NALU 1 size into the array (NALU 1 is the SPS).
+    stapA[2] = (byte) (sps.length >> 8);
+    stapA[3] = (byte) (sps.length & 0xFF);
+
+    // Write NALU 2 size into the array (NALU 2 is the PPS).
+    stapA[sps.length + 4] = (byte) (pps.length >> 8);
+    stapA[sps.length + 5] = (byte) (pps.length & 0xFF);
+
+    // Write NALU 1 into the array, then write NALU 2 into the array.
+    System.arraycopy(sps, 0, stapA, 4, sps.length);
+    System.arraycopy(pps, 0, stapA, 6 + sps.length, pps.length);
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/rtp/packets/VideoPacketCallback.java b/rtplibrary/src/main/java/com/pedro/rtsp/rtp/packets/VideoPacketCallback.java
new file mode 100644
index 0000000..8737bd7
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/rtp/packets/VideoPacketCallback.java
@@ -0,0 +1,7 @@
+package com.pedro.rtsp.rtp.packets;
+
+import com.pedro.rtsp.rtsp.RtpFrame;
+
+public interface VideoPacketCallback {
+  void onVideoFrameCreated(RtpFrame rtpFrame);
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/rtp/sockets/BaseRtpSocket.java b/rtplibrary/src/main/java/com/pedro/rtsp/rtp/sockets/BaseRtpSocket.java
new file mode 100644
index 0000000..ed7419a
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/rtp/sockets/BaseRtpSocket.java
@@ -0,0 +1,28 @@
+package com.pedro.rtsp.rtp.sockets;
+
+import com.pedro.rtsp.rtsp.Protocol;
+import com.pedro.rtsp.rtsp.RtpFrame;
+import com.pedro.rtsp.utils.ConnectCheckerRtsp;
+import java.io.OutputStream;
+
+public abstract class BaseRtpSocket {
+
+  protected final static String TAG = "BaseRtpSocket";
+  protected ConnectCheckerRtsp connectCheckerRtsp;
+
+  BaseRtpSocket(ConnectCheckerRtsp connectCheckerRtsp) {
+    this.connectCheckerRtsp = connectCheckerRtsp;
+  }
+
+  public static BaseRtpSocket getInstance(ConnectCheckerRtsp connectCheckerRtsp,
+      Protocol protocol) {
+    return protocol == Protocol.TCP ? new RtpSocketTcp(connectCheckerRtsp)
+        : new RtpSocketUdp(connectCheckerRtsp);
+  }
+
+  public abstract void setDataStream(OutputStream outputStream, String host);
+
+  public abstract void sendFrame(RtpFrame rtpFrame);
+
+  public abstract void close();
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/rtp/sockets/RtpSocketTcp.java b/rtplibrary/src/main/java/com/pedro/rtsp/rtp/sockets/RtpSocketTcp.java
new file mode 100644
index 0000000..5286741
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/rtp/sockets/RtpSocketTcp.java
@@ -0,0 +1,54 @@
+package com.pedro.rtsp.rtp.sockets;
+
+import android.util.Log;
+import com.pedro.rtsp.rtsp.RtpFrame;
+import com.pedro.rtsp.utils.ConnectCheckerRtsp;
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class RtpSocketTcp extends BaseRtpSocket {
+
+  private OutputStream outputStream;
+  private byte tcpHeader[];
+
+  public RtpSocketTcp(ConnectCheckerRtsp connectCheckerRtsp) {
+    super(connectCheckerRtsp);
+    tcpHeader = new byte[] { '$', 0, 0, 0 };
+  }
+
+  @Override
+  public void setDataStream(OutputStream outputStream, String host) {
+    this.outputStream = outputStream;
+  }
+
+  @Override
+  public void sendFrame(RtpFrame rtpFrame) {
+    try {
+      sendFrameTCP(rtpFrame);
+    } catch (IOException e) {
+      Log.e(TAG, "TCP send error: ", e);
+      connectCheckerRtsp.onConnectionFailedRtsp("Error send packet, " + e.getMessage());
+    }
+  }
+
+  @Override
+  public void close() {
+
+  }
+
+  private void sendFrameTCP(RtpFrame rtpFrame) throws IOException {
+    synchronized (outputStream) {
+      int len = rtpFrame.getLength();
+      tcpHeader[1] = rtpFrame.getChannelIdentifier();
+      tcpHeader[2] = (byte) (len >> 8);
+      tcpHeader[3] = (byte) (len & 0xFF);
+      outputStream.write(tcpHeader);
+      outputStream.write(rtpFrame.getBuffer(), 0, len);
+      outputStream.flush();
+      Log.i(TAG, "wrote packet: "
+          + (rtpFrame.getChannelIdentifier() == (byte) 2 ? "Video" : "Audio")
+          + ", size: "
+          + rtpFrame.getLength());
+    }
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/rtp/sockets/RtpSocketUdp.java b/rtplibrary/src/main/java/com/pedro/rtsp/rtp/sockets/RtpSocketUdp.java
new file mode 100644
index 0000000..a529502
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/rtp/sockets/RtpSocketUdp.java
@@ -0,0 +1,64 @@
+package com.pedro.rtsp.rtp.sockets;
+
+import android.util.Log;
+import com.pedro.rtsp.rtsp.RtpFrame;
+import com.pedro.rtsp.utils.ConnectCheckerRtsp;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.DatagramPacket;
+import java.net.InetAddress;
+import java.net.MulticastSocket;
+import java.net.UnknownHostException;
+
+public class RtpSocketUdp extends BaseRtpSocket {
+
+  private MulticastSocket multicastSocket;
+  private DatagramPacket datagramPacket = new DatagramPacket(new byte[] { 0 }, 1);
+
+  public RtpSocketUdp(ConnectCheckerRtsp connectCheckerRtsp) {
+    super(connectCheckerRtsp);
+    try {
+      multicastSocket = new MulticastSocket();
+      multicastSocket.setTimeToLive(64);
+    } catch (IOException e) {
+      Log.e(TAG, "Error", e);
+    }
+  }
+
+  @Override
+  public void setDataStream(OutputStream outputStream, String host) {
+    try {
+      datagramPacket.setAddress(InetAddress.getByName(host));
+    } catch (UnknownHostException e) {
+      Log.e(TAG, "Error", e);
+    }
+  }
+
+  @Override
+  public void sendFrame(RtpFrame rtpFrame) {
+    try {
+      sendFrameUDP(rtpFrame);
+    } catch (IOException e) {
+      Log.e(TAG, "TCP send error: ", e);
+      connectCheckerRtsp.onConnectionFailedRtsp("Error send packet, " + e.getMessage());
+    }
+  }
+
+  @Override
+  public void close() {
+    multicastSocket.close();
+  }
+
+  private void sendFrameUDP(RtpFrame rtpFrame) throws IOException {
+    datagramPacket.setData(rtpFrame.getBuffer());
+    datagramPacket.setPort(rtpFrame.getRtpPort());
+    datagramPacket.setLength(rtpFrame.getLength());
+    multicastSocket.send(datagramPacket);
+    Log.i(TAG, "wrote packet: "
+        + (rtpFrame.getChannelIdentifier() == (byte) 2 ? "Video" : "Audio")
+        + ", size: "
+        + rtpFrame.getLength()
+        + ", port: "
+        + rtpFrame.getRtpPort());
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/Body.java b/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/Body.java
new file mode 100644
index 0000000..6989439
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/Body.java
@@ -0,0 +1,54 @@
+package com.pedro.rtsp.rtsp;
+
+import com.pedro.rtsp.utils.RtpConstants;
+
+/**
+ * Created by pedro on 21/02/17.
+ */
+
+public class Body {
+
+  public static String createH264Body(int trackVideo, String sps, String pps) {
+    return "m=video 0 RTP/AVP "
+        + RtpConstants.payloadType
+        + "\r\n"
+        + "a=rtpmap:"
+        + RtpConstants.payloadType
+        + " H264/"
+        + RtpConstants.clockVideoFrequency
+        + "\r\n"
+        + "a=fmtp:"
+        + RtpConstants.payloadType
+        + " packetization-mode=1;sprop-parameter-sets="
+        + sps
+        + ","
+        + pps
+        + ";\r\n"
+        + "a=control:trackID="
+        + trackVideo
+        + "\r\n";
+  }
+
+  public static String createH265Body(int trackVideo, String sps, String pps, String vps) {
+    return "m=video 0 RTP/AVP "
+        + RtpConstants.payloadType
+        + "\r\n"
+        + "a=rtpmap:"
+        + RtpConstants.payloadType
+        + " H265/"
+        + RtpConstants.clockVideoFrequency
+        + "\r\n"
+        + "a=fmtp:"
+        + RtpConstants.payloadType
+        + " sprop-sps="
+        + sps
+        + "; sprop-pps="
+        + pps
+        + "; sprop-vps="
+        + vps
+        + ";\r\n"
+        + "a=control:trackID="
+        + trackVideo
+        + "\r\n";
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/Protocol.java b/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/Protocol.java
new file mode 100644
index 0000000..c0d7c79
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/Protocol.java
@@ -0,0 +1,9 @@
+package com.pedro.rtsp.rtsp;
+
+/**
+ * Created by pedro on 24/02/17.
+ */
+
+public enum Protocol {
+  UDP, TCP
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/RtpFrame.java b/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/RtpFrame.java
new file mode 100644
index 0000000..7da1e00
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/RtpFrame.java
@@ -0,0 +1,69 @@
+package com.pedro.rtsp.rtsp;
+
+public class RtpFrame {
+
+  private byte[] buffer;
+  private long timeStamp;
+  private int length;
+  private int rtpPort; //rtp udp
+  private int rtcpPort; //rtcp udp
+  private byte channelIdentifier; //rtcp tcp
+
+  public RtpFrame(byte[] buffer, long timeStamp, int length, int rtpPort, int rtcpPort,
+      byte channelIdentifier) {
+    this.buffer = buffer;
+    this.timeStamp = timeStamp;
+    this.length = length;
+    this.rtpPort = rtpPort;
+    this.rtcpPort = rtcpPort;
+    this.channelIdentifier = channelIdentifier;
+  }
+
+  public byte[] getBuffer() {
+    return buffer;
+  }
+
+  public void setBuffer(byte[] buffer) {
+    this.buffer = buffer;
+  }
+
+  public long getTimeStamp() {
+    return timeStamp;
+  }
+
+  public void setTimeStamp(long timeStamp) {
+    this.timeStamp = timeStamp;
+  }
+
+  public int getLength() {
+    return length;
+  }
+
+  public void setLength(int length) {
+    this.length = length;
+  }
+
+  public int getRtpPort() {
+    return rtpPort;
+  }
+
+  public void setRtpPort(int rtpPort) {
+    this.rtpPort = rtpPort;
+  }
+
+  public int getRtcpPort() {
+    return rtcpPort;
+  }
+
+  public void setRtcpPort(int rtcpPort) {
+    this.rtcpPort = rtcpPort;
+  }
+
+  public byte getChannelIdentifier() {
+    return channelIdentifier;
+  }
+
+  public void setChannelIdentifier(byte channelIdentifier) {
+    this.channelIdentifier = channelIdentifier;
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/RtspClient.java b/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/RtspClient.java
new file mode 100644
index 0000000..87007aa
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/RtspClient.java
@@ -0,0 +1,536 @@
+package com.pedro.rtsp.rtsp;
+
+import android.media.MediaCodec;
+import android.util.Base64;
+import android.util.Log;
+
+import com.pedro.rtsp.utils.AuthUtil;
+import com.pedro.rtsp.utils.ConnectCheckerRtsp;
+import com.pedro.rtsp.utils.CreateSSLSocket;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.net.SocketAddress;
+import java.nio.ByteBuffer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Created by pedro on 10/02/17.
+ */
+
+public class RtspClient {
+
+  private final String TAG = "RtspClient";
+  private static final Pattern rtspUrlPattern =
+      Pattern.compile("^rtsps?://([^/:]+)(?::(\\d+))*/([^/]+)/?([^*]*)$");
+
+  private final long timestamp;
+  private String host = "";
+  private int port;
+  private String path;
+  private int sampleRate = 32000;
+
+  private final int trackVideo = 1;
+  private Protocol protocol = Protocol.TCP;
+  private int mCSeq = 0;
+  private String authorization = null;
+  private String user;
+  private String password;
+  private String sessionId;
+  private ConnectCheckerRtsp connectCheckerRtsp;
+
+  // johanokl
+  private boolean mIsRtpStream = false;
+
+  //sockets objects
+  private Socket connectionSocket;
+  private BufferedReader reader;
+  private BufferedWriter writer;
+  private Thread thread;
+  private byte[] sps, pps, vps;
+  //default sps and pps to work only audio
+  private String defaultSPS = "Z0KAHtoHgUZA";
+  private String defaultPPS = "aM4NiA==";
+  //for udp
+  private int[] videoPorts = new int[] { 5002, 5003 };
+  //for tcp
+  private OutputStream outputStream;
+  private volatile boolean streaming = false;
+  //for secure transport
+  private boolean tlsEnabled = false;
+  private RtspSender rtspSender;
+
+  public RtspClient(ConnectCheckerRtsp connectCheckerRtsp) {
+    this.connectCheckerRtsp = connectCheckerRtsp;
+    long uptime = System.currentTimeMillis();
+    timestamp = (uptime / 1000) << 32 & (((uptime - ((uptime / 1000) * 1000)) >> 32)
+        / 1000); // NTP timestamp
+    sps = defaultSPS.getBytes();
+    pps = defaultPPS.getBytes();
+  }
+
+  public void setProtocol(Protocol protocol) {
+    this.protocol = protocol;
+  }
+
+  public void setAuthorization(String user, String password) {
+    this.user = user;
+    this.password = password;
+  }
+
+  public boolean isStreaming() {
+    return streaming;
+  }
+
+  public void setUrl(String url) {
+    Matcher rtspMatcher = rtspUrlPattern.matcher(url);
+    mIsRtpStream = false;
+    // johanokl
+    if (url.startsWith("rtp://")) {
+      host = url.substring(6, url.indexOf(":", 6));
+      port = Integer.parseInt(url.substring(url.indexOf(":", 6) + 1));
+      Log.d(TAG, "Host: " + host);
+      Log.d(TAG, "Port: " + port);
+      path = "";
+      mIsRtpStream = true;
+      return;
+    }
+    if (rtspMatcher.matches()) {
+      tlsEnabled = rtspMatcher.group(0).startsWith("rtsps");
+    } else {
+      streaming = false;
+      connectCheckerRtsp.onConnectionFailedRtsp(
+          "Endpoint malformed, should be: rtsp://ip:port/appname/streamname");
+      return;
+    }
+    host = rtspMatcher.group(1);
+    port = Integer.parseInt((rtspMatcher.group(2) != null) ? rtspMatcher.group(2) : "554");
+    path = "/" + rtspMatcher.group(3) + "/" + rtspMatcher.group(4);
+  }
+
+  public OutputStream getOutputStream() {
+    return outputStream;
+  }
+
+  public void setSampleRate(int sampleRate) {
+    this.sampleRate = sampleRate;
+  }
+
+  public String getHost() {
+    return host;
+  }
+
+  public int getPort() {
+    return port;
+  }
+
+  public String getPath() {
+    return path;
+  }
+
+  public ConnectCheckerRtsp getConnectCheckerRtsp() {
+    return connectCheckerRtsp;
+  }
+
+  public void setSPSandPPS(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) {
+    byte[] mSPS = new byte[sps.capacity() - 4];
+    sps.position(4);
+    sps.get(mSPS, 0, mSPS.length);
+    this.sps = mSPS;
+    byte[] mPPS = new byte[pps.capacity() - 4];
+    pps.position(4);
+    pps.get(mPPS, 0, mPPS.length);
+    this.pps = mPPS;
+    //H264 haven't vps so assume H265 if not null.
+    if (vps != null) {
+      byte[] mVPS = new byte[vps.capacity() - 4];
+      vps.position(4);
+      vps.get(mVPS, 0, mVPS.length);
+      this.vps = mVPS;
+    } else {
+      this.vps = null;
+    }
+  }
+
+  // johanokl
+  public void forceConnect() {
+    Log.d(TAG, "ForceConnect");
+    rtspSender.setDataStream( new OutputStream() {
+      @Override
+      public void write(int i) throws IOException {
+        Log.d("RTSP", "" + i);
+      }
+    }, host);
+    rtspSender.setVideoPorts(videoPorts[0], videoPorts[1]);
+    rtspSender.start();
+    streaming = true;
+    if (connectCheckerRtsp != null) {
+      connectCheckerRtsp.onConnectionSuccessRtsp();
+    }
+  }
+
+  public void connect() {
+    if (!streaming) {
+      rtspSender = new RtspSender(connectCheckerRtsp, protocol, sps, pps, vps, sampleRate);
+      // johanokl
+      if (mIsRtpStream) {
+        forceConnect();
+        return;
+      }
+      thread = new Thread(new Runnable() {
+        @Override
+        public void run() {
+          try {
+            if (!tlsEnabled) {
+              connectionSocket = new Socket();
+              SocketAddress socketAddress = new InetSocketAddress(host, port);
+              connectionSocket.connect(socketAddress, 5000);
+            } else {
+              connectionSocket = CreateSSLSocket.createSSlSocket(host, port);
+              if (connectionSocket == null) throw new IOException("Socket creation failed");
+            }
+            connectionSocket.setSoTimeout(5000);
+            reader = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
+            outputStream = connectionSocket.getOutputStream();
+            writer = new BufferedWriter(new OutputStreamWriter(outputStream));
+            writer.write(sendOptions());
+            writer.flush();
+            getResponse(false);
+            writer.write(sendAnnounce());
+            writer.flush();
+            //check if you need credential for stream, if you need try connect with credential
+            String response = getResponse(false);
+            int status = getResponseStatus(response);
+            if (status == 403) {
+              connectCheckerRtsp.onConnectionFailedRtsp("Error configure stream, access denied");
+              Log.e(TAG, "Response 403, access denied");
+              return;
+            } else if (status == 401) {
+              if (user == null || password == null) {
+                connectCheckerRtsp.onAuthErrorRtsp();
+                return;
+              } else {
+                writer.write(sendAnnounceWithAuth(response));
+                writer.flush();
+                int statusAuth = getResponseStatus(getResponse(false));
+                if (statusAuth == 401) {
+                  connectCheckerRtsp.onAuthErrorRtsp();
+                  return;
+                } else if (statusAuth == 200) {
+                  connectCheckerRtsp.onAuthSuccessRtsp();
+                } else {
+                  connectCheckerRtsp.onConnectionFailedRtsp(
+                      "Error configure stream, announce with auth failed");
+                }
+              }
+            } else if (status != 200) {
+              connectCheckerRtsp.onConnectionFailedRtsp("Error configure stream, announce failed");
+            }
+            writer.write(sendSetup(trackVideo, protocol));
+            writer.flush();
+            getResponse(true);
+            writer.write(sendRecord());
+            writer.flush();
+            getResponse(true);
+
+            rtspSender.setDataStream(outputStream, host);
+            rtspSender.setVideoPorts(videoPorts[0], videoPorts[1]);
+            rtspSender.start();
+            streaming = true;
+            connectCheckerRtsp.onConnectionSuccessRtsp();
+          } catch (IOException | NullPointerException e) {
+            Log.e(TAG, "connection error", e);
+            connectCheckerRtsp.onConnectionFailedRtsp("Error configure stream, " + e.getMessage());
+            streaming = false;
+          }
+        }
+      });
+      thread.start();
+    }
+  }
+
+  public void disconnect() {
+    if (streaming) {
+      streaming = false;
+      rtspSender.stop();
+      thread = new Thread(new Runnable() {
+        @Override
+        public void run() {
+          try {
+            if (writer != null) {
+              writer.write(sendTearDown());
+            }
+            if (connectionSocket != null) {
+              connectionSocket.close();
+            }
+          } catch (IOException e) {
+            Log.e(TAG, "disconnect error", e);
+          }
+          connectCheckerRtsp.onDisconnectRtsp();
+        }
+      });
+      thread.start();
+      mCSeq = 0;
+      sps = null;
+      pps = null;
+      sessionId = null;
+    }
+  }
+
+  private String sendAnnounce() {
+    String body = createBody();
+    String announce;
+    if (authorization == null) {
+      announce = "ANNOUNCE rtsp://"
+          + host
+          + ":"
+          + port
+          + path
+          + " RTSP/1.0\r\n"
+          + "CSeq: "
+          + (++mCSeq)
+          + "\r\n"
+          + "Content-Length: "
+          + body.length()
+          + "\r\n"
+          + "Content-Type: application/sdp\r\n\r\n"
+          + body;
+    } else {
+      announce = "ANNOUNCE rtsp://"
+          + host
+          + ":"
+          + port
+          + path
+          + " RTSP/1.0\r\n"
+          + "CSeq: "
+          + (++mCSeq)
+          + "\r\n"
+          + "Content-Length: "
+          + body.length()
+          + "\r\n"
+          + "Authorization: "
+          + authorization
+          + "\r\n"
+          + "Content-Type: application/sdp\r\n\r\n"
+          + body;
+    }
+    Log.i(TAG, announce);
+    return announce;
+  }
+
+  private String createBody() {
+    String sSPS = Base64.encodeToString(sps, 0, sps.length, Base64.NO_WRAP);
+    String sPPS = Base64.encodeToString(pps, 0, pps.length, Base64.NO_WRAP);
+    String sVPS = vps != null ? Base64.encodeToString(vps, 0, vps.length, Base64.NO_WRAP) : null;
+    String videoBody = sVPS == null ? Body.createH264Body(trackVideo, sSPS, sPPS)
+        : Body.createH265Body(trackVideo, sSPS, sPPS, sVPS);
+    return "v=0\r\n"
+        +
+        // TODO: Add IPV6 support
+        "o=- "
+        + timestamp
+        + " "
+        + timestamp
+        + " IN IP4 "
+        + "127.0.0.1"
+        + "\r\n"
+        + "s=Unnamed\r\n"
+        + "i=N/A\r\n"
+        + "c=IN IP4 "
+        + host
+        + "\r\n"
+        +
+        // means the session is permanent
+        "t=0 0\r\n"
+        + "a=recvonly\r\n"
+        + videoBody;
+  }
+
+  private String sendSetup(int track, Protocol protocol) {
+    String params =
+        (protocol == Protocol.UDP) ? ("UDP;unicast;client_port=" + (5000 + 2 * track) + "-" + (5000
+            + 2 * track
+            + 1) + ";mode=record")
+            : ("TCP;interleaved=" + 2 * track + "-" + (2 * track + 1) + ";mode=record");
+    String setup = "SETUP rtsp://"
+        + host
+        + ":"
+        + port
+        + path
+        + "/trackID="
+        + track
+        + " RTSP/1.0\r\n"
+        + "Transport: RTP/AVP/"
+        + params
+        + "\r\n"
+        + addHeaders(authorization);
+    Log.i(TAG, setup);
+    return setup;
+  }
+
+  private String sendOptions() {
+    String options =
+        "OPTIONS rtsp://" + host + ":" + port + path + " RTSP/1.0\r\n" + addHeaders(authorization);
+    Log.i(TAG, options);
+    return options;
+  }
+
+  private String sendRecord() {
+    String record = "RECORD rtsp://"
+        + host
+        + ":"
+        + port
+        + path
+        + " RTSP/1.0\r\n"
+        + "Range: npt=0.000-\r\n"
+        + addHeaders(authorization);
+    Log.i(TAG, record);
+    return record;
+  }
+
+  private String sendTearDown() {
+    String teardown =
+        "TEARDOWN rtsp://" + host + ":" + port + path + " RTSP/1.0\r\n" + addHeaders(authorization);
+    Log.i(TAG, teardown);
+    return teardown;
+  }
+
+  private String addHeaders(String authorization) {
+    return "CSeq: "
+        + (++mCSeq)
+        + "\r\n"
+        + (sessionId != null ? "Session: " + sessionId + "\r\n" : "")
+        // For some reason you may have to remove last "\r\n" in the next line to make the RTSP client work with your wowza server :/
+        + (authorization != null ? "Authorization: " + authorization + "\r\n" : "")
+        + "\r\n";
+  }
+
+  private String getResponse(boolean checkStatus) {
+    try {
+      String response = "";
+      String line;
+
+      while ((line = reader.readLine()) != null) {
+        if (line.contains("Session")) {
+          Pattern rtspPattern = Pattern.compile("Session: (\\w+)");
+          Matcher matcher = rtspPattern.matcher(line);
+          if (matcher.find()) {
+            sessionId = matcher.group(1);
+          }
+          sessionId = line.split(";")[0].split(":")[1].trim();
+        }
+        if (line.contains("server_port")) {
+          Pattern rtspPattern = Pattern.compile("server_port=([0-9]+)-([0-9]+)");
+          Matcher matcher = rtspPattern.matcher(line);
+          if (matcher.find()) {
+            videoPorts[0] = Integer.parseInt(matcher.group(1));
+            videoPorts[1] = Integer.parseInt(matcher.group(2));
+          }
+        }
+        response += line + "\n";
+        //end of response
+        if (line.length() < 3) break;
+      }
+      if (checkStatus && getResponseStatus(response) != 200) {
+        connectCheckerRtsp.onConnectionFailedRtsp("Error configure stream, " + response);
+      }
+      Log.i(TAG, response);
+      return response;
+    } catch (IOException e) {
+      Log.e(TAG, "read error", e);
+      return null;
+    }
+  }
+
+  private String sendAnnounceWithAuth(String authResponse) {
+    authorization = createAuth(authResponse);
+    Log.i("Auth", authorization);
+    String body = createBody();
+    String announce = "ANNOUNCE rtsp://"
+        + host
+        + ":"
+        + port
+        + path
+        + " RTSP/1.0\r\n"
+        + "CSeq: "
+        + (++mCSeq)
+        + "\r\n"
+        + "Content-Length: "
+        + body.length()
+        + "\r\n"
+        + "Authorization: "
+        + authorization
+        + "\r\n"
+        + "Content-Type: application/sdp\r\n\r\n"
+        + body;
+    Log.i(TAG, announce);
+    return announce;
+  }
+
+  private String createAuth(String authResponse) {
+    Pattern authPattern =
+        Pattern.compile("realm=\"(.+)\",\\s+nonce=\"(\\w+)\"", Pattern.CASE_INSENSITIVE);
+    Matcher matcher = authPattern.matcher(authResponse);
+    //digest auth
+    if (matcher.find()) {
+      Log.i(TAG, "using digest auth");
+      String realm = matcher.group(1);
+      String nonce = matcher.group(2);
+      String hash1 = AuthUtil.getMd5Hash(user + ":" + realm + ":" + password);
+      String hash2 = AuthUtil.getMd5Hash("ANNOUNCE:rtsp://" + host + ":" + port + path);
+      String hash3 = AuthUtil.getMd5Hash(hash1 + ":" + nonce + ":" + hash2);
+      return "Digest username=\""
+          + user
+          + "\",realm=\""
+          + realm
+          + "\",nonce=\""
+          + nonce
+          + "\",uri=\"rtsp://"
+          + host
+          + ":"
+          + port
+          + path
+          + "\",response=\""
+          + hash3
+          + "\"";
+      //basic auth
+    } else {
+      Log.i(TAG, "using basic auth");
+      String data = user + ":" + password;
+      String base64Data = Base64.encodeToString(data.getBytes(), Base64.DEFAULT);
+      return "Basic " + base64Data;
+    }
+  }
+
+  private int getResponseStatus(String response) {
+    Matcher matcher =
+        Pattern.compile("RTSP/\\d.\\d (\\d+) (\\w+)", Pattern.CASE_INSENSITIVE).matcher(response);
+    if (matcher.find()) {
+      return Integer.parseInt(matcher.group(1));
+    } else {
+      return -1;
+    }
+  }
+
+  public int[] getVideoPorts() {
+    return videoPorts;
+  }
+
+  // johanokl
+  public void setVideoPort(int port) {
+    videoPorts = new int[]{port, port + 1};
+  }
+
+  public void sendVideo(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) {
+    if (isStreaming()) {
+      rtspSender.sendVideoFrame(h264Buffer, info);
+    }
+  }
+}
+
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/RtspSender.java b/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/RtspSender.java
new file mode 100644
index 0000000..b04a441
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/RtspSender.java
@@ -0,0 +1,100 @@
+package com.pedro.rtsp.rtsp;
+
+import android.media.MediaCodec;
+import android.util.Log;
+import com.pedro.rtsp.rtcp.BaseSenderReport;
+import com.pedro.rtsp.rtp.packets.BasePacket;
+import com.pedro.rtsp.rtp.packets.H264Packet;
+import com.pedro.rtsp.rtp.packets.H265Packet;
+import com.pedro.rtsp.rtp.packets.VideoPacketCallback;
+import com.pedro.rtsp.rtp.sockets.BaseRtpSocket;
+import com.pedro.rtsp.utils.ConnectCheckerRtsp;
+import com.pedro.rtsp.utils.RtpConstants;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+public class RtspSender implements VideoPacketCallback {
+
+  private final static String TAG = "RtspSender";
+  private final BasePacket videoPacket;
+  private final BaseRtpSocket rtpSocket;
+  private final BaseSenderReport baseSenderReport;
+  private BlockingQueue<RtpFrame> rtpFrameBlockingQueue =
+      new LinkedBlockingQueue<>(getCacheSize(10));
+  private Thread thread;
+
+  public RtspSender(ConnectCheckerRtsp connectCheckerRtsp, Protocol protocol, byte[] sps,
+      byte[] pps, byte[] vps, int sampleRate) {
+    videoPacket =
+        vps == null ? new H264Packet(sps, pps, this) : new H265Packet(sps, pps, vps, this);
+    rtpSocket = BaseRtpSocket.getInstance(connectCheckerRtsp, protocol);
+    baseSenderReport = BaseSenderReport.getInstance(protocol);
+  }
+
+  /**
+   * @param size in mb
+   * @return number of packets
+   */
+  private int getCacheSize(int size) {
+    return size * 1024 * 1024 / RtpConstants.MTU;
+  }
+
+  public void setDataStream(OutputStream outputStream, String host) {
+    rtpSocket.setDataStream(outputStream, host);
+    baseSenderReport.setDataStream(outputStream, host);
+  }
+
+  public void setVideoPorts(int rtpPort, int rtcpPort) {
+    videoPacket.setPorts(rtpPort, rtcpPort);
+  }
+
+  public void sendVideoFrame(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) {
+    videoPacket.createAndSendPacket(h264Buffer, info);
+  }
+
+  @Override
+  public void onVideoFrameCreated(RtpFrame rtpFrame) {
+    try {
+      rtpFrameBlockingQueue.add(rtpFrame);
+    } catch (IllegalStateException e) {
+      Log.i(TAG, "Video frame discarded");
+    }
+  }
+
+  public void start() {
+    thread = new Thread(new Runnable() {
+      @Override
+      public void run() {
+        while (!Thread.interrupted()) {
+          try {
+            RtpFrame rtpFrame = rtpFrameBlockingQueue.take();
+            rtpSocket.sendFrame(rtpFrame);
+            baseSenderReport.update(rtpFrame);
+          } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+          }
+        }
+      }
+    });
+    thread.start();
+  }
+
+  public void stop() {
+    if (thread != null) {
+      thread.interrupt();
+      try {
+        thread.join(1000);
+      } catch (InterruptedException e) {
+        thread.interrupt();
+      }
+      thread = null;
+    }
+    rtpFrameBlockingQueue.clear();
+    baseSenderReport.reset();
+    baseSenderReport.close();
+    rtpSocket.close();
+    videoPacket.reset();
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/VideoCodec.java b/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/VideoCodec.java
new file mode 100644
index 0000000..17a55c0
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/rtsp/VideoCodec.java
@@ -0,0 +1,5 @@
+package com.pedro.rtsp.rtsp;
+
+public enum VideoCodec {
+  H264, H265
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/utils/AuthUtil.java b/rtplibrary/src/main/java/com/pedro/rtsp/utils/AuthUtil.java
new file mode 100644
index 0000000..a3ba03a
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/utils/AuthUtil.java
@@ -0,0 +1,36 @@
+package com.pedro.rtsp.utils;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * Created by pedro on 22/02/17.
+ */
+
+public class AuthUtil {
+
+  private static char[] hexArray =
+      { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+
+  public static String getMd5Hash(String buffer) {
+    MessageDigest md;
+    try {
+      md = MessageDigest.getInstance("MD5");
+      return bytesToHex(md.digest(buffer.getBytes("UTF-8")));
+    } catch (NoSuchAlgorithmException | UnsupportedEncodingException ignore) {
+    }
+    return "";
+  }
+
+  private static String bytesToHex(byte[] bytes) {
+    char[] hexChars = new char[bytes.length * 2];
+    int v;
+    for (int j = 0; j < bytes.length; j++) {
+      v = bytes[j] & 0xFF;
+      hexChars[j * 2] = hexArray[v >>> 4];
+      hexChars[j * 2 + 1] = hexArray[v & 0x0F];
+    }
+    return new String(hexChars);
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/utils/ConnectCheckerRtsp.java b/rtplibrary/src/main/java/com/pedro/rtsp/utils/ConnectCheckerRtsp.java
new file mode 100644
index 0000000..44c5b19
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/utils/ConnectCheckerRtsp.java
@@ -0,0 +1,18 @@
+package com.pedro.rtsp.utils;
+
+/**
+ * Created by pedro on 20/02/17.
+ */
+
+public interface ConnectCheckerRtsp {
+
+  void onConnectionSuccessRtsp();
+
+  void onConnectionFailedRtsp(String reason);
+
+  void onDisconnectRtsp();
+
+  void onAuthErrorRtsp();
+
+  void onAuthSuccessRtsp();
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/utils/CreateSSLSocket.java b/rtplibrary/src/main/java/com/pedro/rtsp/utils/CreateSSLSocket.java
new file mode 100644
index 0000000..f2b2eda
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/utils/CreateSSLSocket.java
@@ -0,0 +1,30 @@
+package com.pedro.rtsp.utils;
+
+import android.util.Log;
+import java.io.IOException;
+import java.net.Socket;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * Created by pedro on 25/02/17.
+ * this class is used for secure transport, to use replace socket on RtmpConnection with this and
+ * you will have a secure stream under ssl/tls.
+ */
+
+public class CreateSSLSocket {
+
+  /**
+   * @param host variable from RtspConnection
+   * @param port variable from RtspConnection
+   */
+  public static Socket createSSlSocket(String host, int port) {
+    try {
+      TLSSocketFactory socketFactory = new TLSSocketFactory();
+      return socketFactory.createSocket(host, port);
+    } catch (NoSuchAlgorithmException | KeyManagementException | IOException e) {
+      Log.e("CreateSSLSocket", "Error", e);
+      return null;
+    }
+  }
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/utils/RtpConstants.java b/rtplibrary/src/main/java/com/pedro/rtsp/utils/RtpConstants.java
new file mode 100644
index 0000000..9d8e960
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/utils/RtpConstants.java
@@ -0,0 +1,15 @@
+package com.pedro.rtsp.utils;
+
+/**
+ * Created by pedro on 19/02/17.
+ */
+
+public class RtpConstants {
+  public static final long clockVideoFrequency = 90000L;
+  public static final int RTP_HEADER_LENGTH = 12;
+  public static final int MTU = 1300;
+  public static final int payloadType = 96;
+
+  public static final int VIDEO_ALLOC_SIZE = 128 * 1024;
+  public static final int AUDIO_ALLOC_SIZE = 4 * 1024;
+}
diff --git a/rtplibrary/src/main/java/com/pedro/rtsp/utils/TLSSocketFactory.java b/rtplibrary/src/main/java/com/pedro/rtsp/utils/TLSSocketFactory.java
new file mode 100644
index 0000000..349824e
--- /dev/null
+++ b/rtplibrary/src/main/java/com/pedro/rtsp/utils/TLSSocketFactory.java
@@ -0,0 +1,77 @@
+package com.pedro.rtsp.utils;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.net.UnknownHostException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
+
+/**
+ * @author fkrauthan
+ */
+public class TLSSocketFactory extends SSLSocketFactory {
+
+  private SSLSocketFactory internalSSLSocketFactory;
+
+  public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {
+    SSLContext context = SSLContext.getInstance("TLS");
+    context.init(null, null, null);
+    internalSSLSocketFactory = context.getSocketFactory();
+  }
+
+  @Override
+  public String[] getDefaultCipherSuites() {
+    return internalSSLSocketFactory.getDefaultCipherSuites();
+  }
+
+  @Override
+  public String[] getSupportedCipherSuites() {
+    return internalSSLSocketFactory.getSupportedCipherSuites();
+  }
+
+  @Override
+  public Socket createSocket() throws IOException {
+    return enableTLSOnSocket(internalSSLSocketFactory.createSocket());
+  }
+
+  @Override
+  public Socket createSocket(Socket s, String host, int port, boolean autoClose)
+      throws IOException {
+    return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));
+  }
+
+  @Override
+  public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
+    return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
+  }
+
+  @Override
+  public Socket createSocket(String host, int port, InetAddress localHost, int localPort)
+      throws IOException, UnknownHostException {
+    return enableTLSOnSocket(
+        internalSSLSocketFactory.createSocket(host, port, localHost, localPort));
+  }
+
+  @Override
+  public Socket createSocket(InetAddress host, int port) throws IOException {
+    return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
+  }
+
+  @Override
+  public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort)
+      throws IOException {
+    return enableTLSOnSocket(
+        internalSSLSocketFactory.createSocket(address, port, localAddress, localPort));
+  }
+
+  private Socket enableTLSOnSocket(Socket socket) {
+    if (socket != null && (socket instanceof SSLSocket)) {
+      ((SSLSocket) socket).setEnabledProtocols(new String[] { "TLSv1.1", "TLSv1.2" });
+    }
+    return socket;
+  }
+}
diff --git a/rtplibrary/src/main/res/raw/android_view_fragment.glsl b/rtplibrary/src/main/res/raw/android_view_fragment.glsl
new file mode 100644
index 0000000..4039e1d
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/android_view_fragment.glsl
@@ -0,0 +1,14 @@
+#extension GL_OES_EGL_image_external : require
+precision mediump float;
+
+uniform samplerExternalOES uSamplerView;
+uniform sampler2D uSampler;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec4 color = texture2D(uSampler, vTextureCoord);
+  vec4 viewColor = texture2D(uSamplerView, vec2(vTextureCoord.x, 1.0 - vTextureCoord.y));
+  color.rgb *= 1.0 - viewColor.a;
+  gl_FragColor = color + viewColor;
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/basic_deformation_fragment.glsl b/rtplibrary/src/main/res/raw/basic_deformation_fragment.glsl
new file mode 100644
index 0000000..e809fb4
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/basic_deformation_fragment.glsl
@@ -0,0 +1,11 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform float uTime;
+
+varying vec2 vTextureCoord;
+
+void main() {
+	float waveu = sin((vTextureCoord.y + uTime) * 20.0) * 0.5 * 0.05 * 0.3;
+  gl_FragColor = texture2D(uSampler, vTextureCoord + vec2(waveu, 0));
+}
diff --git a/rtplibrary/src/main/res/raw/beauty_fragment.glsl b/rtplibrary/src/main/res/raw/beauty_fragment.glsl
new file mode 100644
index 0000000..c33e62e
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/beauty_fragment.glsl
@@ -0,0 +1,109 @@
+precision highp float;
+
+uniform sampler2D uSampler;
+uniform vec2 uResolution;
+
+varying vec2 vTextureCoord;
+
+const vec4 params = vec4(0.748, 0.874, 0.241, 0.241);
+const vec3 W = vec3(0.299,0.587,0.114);
+const mat3 saturateMatrix = mat3(
+                                1.1102,-0.0598,-0.061,
+                                -0.0774,1.0826,-0.1186,
+                                -0.0228,-0.0228,1.1772);
+
+vec2 blurCoordinates[24];
+
+float hardLight(float color) {
+    if(color <= 0.5) {
+        color = color * color * 2.0;
+    } else {
+        color = 1.0 - ((1.0 - color)*(1.0 - color) * 2.0);
+    }
+    return color;
+}
+
+void main() {
+    vec3 centralColor = texture2D(uSampler, vTextureCoord).rgb;
+
+    blurCoordinates[0] = vTextureCoord.xy + uResolution * vec2(0.0, -10.0);
+    blurCoordinates[1] = vTextureCoord.xy + uResolution * vec2(0.0, 10.0);
+    blurCoordinates[2] = vTextureCoord.xy + uResolution * vec2(-10.0, 0.0);
+    blurCoordinates[3] = vTextureCoord.xy + uResolution * vec2(10.0, 0.0);
+    blurCoordinates[4] = vTextureCoord.xy + uResolution * vec2(5.0, -8.0);
+    blurCoordinates[5] = vTextureCoord.xy + uResolution * vec2(5.0, 8.0);
+    blurCoordinates[6] = vTextureCoord.xy + uResolution * vec2(-5.0, 8.0);
+    blurCoordinates[7] = vTextureCoord.xy + uResolution * vec2(-5.0, -8.0);
+    blurCoordinates[8] = vTextureCoord.xy + uResolution * vec2(8.0, -5.0);
+    blurCoordinates[9] = vTextureCoord.xy + uResolution * vec2(8.0, 5.0);
+    blurCoordinates[10] = vTextureCoord.xy + uResolution * vec2(-8.0, 5.0);
+    blurCoordinates[11] = vTextureCoord.xy + uResolution * vec2(-8.0, -5.0);
+    blurCoordinates[12] = vTextureCoord.xy + uResolution * vec2(0.0, -6.0);
+    blurCoordinates[13] = vTextureCoord.xy + uResolution * vec2(0.0, 6.0);
+    blurCoordinates[14] = vTextureCoord.xy + uResolution * vec2(6.0, 0.0);
+    blurCoordinates[15] = vTextureCoord.xy + uResolution * vec2(-6.0, 0.0);
+    blurCoordinates[16] = vTextureCoord.xy + uResolution * vec2(-4.0, -4.0);
+    blurCoordinates[17] = vTextureCoord.xy + uResolution * vec2(-4.0, 4.0);
+    blurCoordinates[18] = vTextureCoord.xy + uResolution * vec2(4.0, -4.0);
+    blurCoordinates[19] = vTextureCoord.xy + uResolution * vec2(4.0, 4.0);
+    blurCoordinates[20] = vTextureCoord.xy + uResolution * vec2(-2.0, -2.0);
+    blurCoordinates[21] = vTextureCoord.xy + uResolution * vec2(-2.0, 2.0);
+    blurCoordinates[22] = vTextureCoord.xy + uResolution * vec2(2.0, -2.0);
+    blurCoordinates[23] = vTextureCoord.xy + uResolution * vec2(2.0, 2.0);
+
+    float sampleColor = centralColor.g * 22.0;
+    sampleColor += texture2D(uSampler, blurCoordinates[0]).g;
+    sampleColor += texture2D(uSampler, blurCoordinates[1]).g;
+    sampleColor += texture2D(uSampler, blurCoordinates[2]).g;
+    sampleColor += texture2D(uSampler, blurCoordinates[3]).g;
+    sampleColor += texture2D(uSampler, blurCoordinates[4]).g;
+    sampleColor += texture2D(uSampler, blurCoordinates[5]).g;
+    sampleColor += texture2D(uSampler, blurCoordinates[6]).g;
+    sampleColor += texture2D(uSampler, blurCoordinates[7]).g;
+    sampleColor += texture2D(uSampler, blurCoordinates[8]).g;
+    sampleColor += texture2D(uSampler, blurCoordinates[9]).g;
+    sampleColor += texture2D(uSampler, blurCoordinates[10]).g;
+    sampleColor += texture2D(uSampler, blurCoordinates[11]).g;
+    sampleColor += texture2D(uSampler, blurCoordinates[12]).g * 2.0;
+    sampleColor += texture2D(uSampler, blurCoordinates[13]).g * 2.0;
+    sampleColor += texture2D(uSampler, blurCoordinates[14]).g * 2.0;
+    sampleColor += texture2D(uSampler, blurCoordinates[15]).g * 2.0;
+    sampleColor += texture2D(uSampler, blurCoordinates[16]).g * 2.0;
+    sampleColor += texture2D(uSampler, blurCoordinates[17]).g * 2.0;
+    sampleColor += texture2D(uSampler, blurCoordinates[18]).g * 2.0;
+    sampleColor += texture2D(uSampler, blurCoordinates[19]).g * 2.0;
+    sampleColor += texture2D(uSampler, blurCoordinates[20]).g * 3.0;
+    sampleColor += texture2D(uSampler, blurCoordinates[21]).g * 3.0;
+    sampleColor += texture2D(uSampler, blurCoordinates[22]).g * 3.0;
+    sampleColor += texture2D(uSampler, blurCoordinates[23]).g * 3.0;
+    sampleColor = sampleColor / 62.0;
+
+    float highPass = centralColor.g - sampleColor + 0.5;
+
+    for(int i = 0; i < 5;i++)
+    {
+        highPass = hardLight(highPass);
+    }
+    float luminance = dot(centralColor, W);
+    float alpha = pow(luminance, params.r);
+
+    vec3 smoothColor = centralColor + (centralColor-vec3(highPass))*alpha*0.1;
+
+    smoothColor.r = clamp(pow(smoothColor.r, params.g),0.0,1.0);
+    smoothColor.g = clamp(pow(smoothColor.g, params.g),0.0,1.0);
+    smoothColor.b = clamp(pow(smoothColor.b, params.g),0.0,1.0);
+
+    vec3 screen = vec3(1.0) - (vec3(1.0)-smoothColor) * (vec3(1.0)-centralColor);
+    vec3 lighten = max(smoothColor, centralColor);
+    vec3 softLight = 2.0 * centralColor*smoothColor + centralColor*centralColor
+                     - 2.0 * centralColor*centralColor * smoothColor;
+
+    gl_FragColor = vec4(mix(centralColor, screen, alpha), 1.0);
+    gl_FragColor.rgb = mix(gl_FragColor.rgb, lighten, alpha);
+    gl_FragColor.rgb = mix(gl_FragColor.rgb, softLight, params.b);
+
+    vec3 satColor = gl_FragColor.rgb * saturateMatrix;
+    gl_FragColor.rgb = mix(gl_FragColor.rgb, satColor, params.a);
+
+    gl_FragColor.rgb = vec3(gl_FragColor.rgb + vec3(-0.096));
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/blur_fragment.glsl b/rtplibrary/src/main/res/raw/blur_fragment.glsl
new file mode 100644
index 0000000..8df5e82
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/blur_fragment.glsl
@@ -0,0 +1,28 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform vec2 uResolution;
+uniform float uBlur;
+
+varying vec2 vTextureCoord;
+
+float sCurve(float x) {
+  x = x * 2.0 - 1.0;
+  return -x * abs(x) * 0.5 + x + 0.5;
+}
+
+void main() {
+  vec4 A = vec4(0.0);
+	vec4 C = vec4(0.0);
+	float width = 1.0 / uResolution.x;
+	float divisor = 0.0;
+  float weight = 0.0;
+  float radiusMultiplier = 1.0 / uBlur;
+  for (float x = -20.0; x <= 20.0; x++)	{
+    A = texture2D(uSampler, vTextureCoord + vec2(x * width, 0.0));
+    weight = sCurve(1.0 - (abs(x) * radiusMultiplier));
+    C += A * weight;
+		divisor += weight;
+  }
+  gl_FragColor = vec4(C.rgb / divisor, 1.0);
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/brightness_fragment.glsl b/rtplibrary/src/main/res/raw/brightness_fragment.glsl
new file mode 100644
index 0000000..3676ff6
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/brightness_fragment.glsl
@@ -0,0 +1,11 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform float uBrightness;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec4 pixel = texture2D(uSampler, vTextureCoord);
+  gl_FragColor = vec4(pixel.rgb + vec3(uBrightness), pixel.a);
+}
diff --git a/rtplibrary/src/main/res/raw/camera_fragment.glsl b/rtplibrary/src/main/res/raw/camera_fragment.glsl
new file mode 100644
index 0000000..b1f5124
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/camera_fragment.glsl
@@ -0,0 +1,11 @@
+#extension GL_OES_EGL_image_external : require
+precision mediump float;
+
+uniform samplerExternalOES sCamera;
+uniform vec2 uOnFlip;
+varying vec2 vTextureCoord;
+
+void main() {
+  vec2 coord = vec2(uOnFlip.y == 1.0 ? 1.0 - vTextureCoord.x : vTextureCoord.x, uOnFlip.x == 1.0 ? 1.0 - vTextureCoord.y : vTextureCoord.y);
+  gl_FragColor = texture2D(sCamera, coord);
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/cartoon_fragment.glsl b/rtplibrary/src/main/res/raw/cartoon_fragment.glsl
new file mode 100644
index 0000000..85b9ee3
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/cartoon_fragment.glsl
@@ -0,0 +1,35 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform float uCartoon;
+
+varying vec2 vTextureCoord;
+
+#define PI 3.1415927
+
+void main(){
+	vec3 t = texture2D(uSampler, vTextureCoord).rgb;
+	vec3 t00 = texture2D(uSampler, vTextureCoord + vec2(-uCartoon, -uCartoon)).rgb;
+	vec3 t10 = texture2D(uSampler, vTextureCoord + vec2(uCartoon, -uCartoon)).rgb;
+	vec3 t01 = texture2D(uSampler, vTextureCoord + vec2(-uCartoon, uCartoon)).rgb;
+	vec3 t11 = texture2D(uSampler, vTextureCoord + vec2(uCartoon, uCartoon)).rgb;
+	vec3 tm = (t00 + t01 + t10 + t11) / 4.0;
+	t = t - tm;
+	t = t * t * t;
+	vec3 v = 10000.0 * t;
+	float g = (tm.x - 0.3) * 5.0;
+	vec3 col0 = vec3(0.0, 0.0, 0.0);
+	vec3 col1 = vec3(0.2, 0.5, 1.0);
+	vec3 col2 = vec3(1.0, 0.8, 0.7);
+	vec3 col3 = vec3(1.0, 1.0, 1.0);
+	vec3 c;
+	if (g > 2.0) c = mix(col2, col3, g - 2.0);
+	else if (g > 1.0) c = mix(col1, col2, g - 1.0);
+	else c = mix(col0, col1, g);
+	c = clamp(c, 0.0, 1.0);
+	v = clamp(v, 0.0, 1.0);
+	v = c * (1.0 - v);
+	v = clamp(v, 0.0, 1.0);
+	if (v == col0) v = col3;
+	gl_FragColor = vec4(v, 1.0);
+}
diff --git a/rtplibrary/src/main/res/raw/color_fragment.glsl b/rtplibrary/src/main/res/raw/color_fragment.glsl
new file mode 100644
index 0000000..b497f82
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/color_fragment.glsl
@@ -0,0 +1,14 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform vec3 uColor;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec4 pixel = texture2D(uSampler, vTextureCoord);
+  float grey = pixel.r + pixel.g + pixel.b / 3.0;
+  vec3 average = vec3(grey, grey, grey);
+  vec4 color = vec4(average.rgb * uColor, 1.0);
+  gl_FragColor = color;
+}
diff --git a/rtplibrary/src/main/res/raw/contrast_fragment.glsl b/rtplibrary/src/main/res/raw/contrast_fragment.glsl
new file mode 100644
index 0000000..f890632
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/contrast_fragment.glsl
@@ -0,0 +1,11 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform float uContrast;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec4 pixel = texture2D(uSampler, vTextureCoord);
+  gl_FragColor = vec4((pixel.rgb - vec3(0.5)) * uContrast + vec3(0.5), pixel.a);
+}
diff --git a/rtplibrary/src/main/res/raw/duotone_fragment.glsl b/rtplibrary/src/main/res/raw/duotone_fragment.glsl
new file mode 100644
index 0000000..db4990f
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/duotone_fragment.glsl
@@ -0,0 +1,13 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform vec3 uColor;
+uniform vec3 uColor2;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec4 pixel = texture2D(uSampler, vTextureCoord);
+  float grey = pixel.r + pixel.g + pixel.b / 3.0;
+  gl_FragColor = vec4((1.0 - grey) * uColor + grey * uColor2, pixel.a);
+}
diff --git a/rtplibrary/src/main/res/raw/earlybird_fragment.glsl b/rtplibrary/src/main/res/raw/earlybird_fragment.glsl
new file mode 100644
index 0000000..20737b3
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/earlybird_fragment.glsl
@@ -0,0 +1,50 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform vec2 uResolution;
+
+varying vec2 vTextureCoord;
+
+mat3 saturationMatrix(float saturation) {
+  vec3 luminance = vec3(0.3086, 0.6094, 0.0820);
+  float oneMinusSat = 1.0 - saturation;
+  vec3 red = vec3(luminance.x * oneMinusSat);
+  red.r += saturation;
+
+  vec3 green = vec3(luminance.y * oneMinusSat);
+  green.g += saturation;
+
+  vec3 blue = vec3(luminance.z * oneMinusSat);
+  blue.b += saturation;
+
+  return mat3(red, green, blue);
+}
+
+void levels(inout vec3 col, in vec3 inleft, in vec3 inright, in vec3 outleft, in vec3 outright) {
+  col = clamp(col, inleft, inright);
+  col = (col - inleft) / (inright - inleft);
+  col = outleft + col * (outright - outleft);
+}
+
+void main() {
+  vec3 col = texture2D(uSampler, vTextureCoord).rgb;
+  vec2 fragCoord = vTextureCoord * uResolution;
+  vec2 coord = (fragCoord + fragCoord -  uResolution) / uResolution.y;
+  vec3 gradient = vec3(pow(1.0 - length(coord * 0.4), 0.6) * 1.2);
+  vec3 grey = vec3(184.0 / 255.0);
+  vec3 tint = vec3(252.0, 243.0, 213.0) / 255.0;
+  col = saturationMatrix(0.68) * col;
+  levels(col, vec3(0.0), vec3(1.0), vec3(27.0, 0.0, 0.0) / 255.0, vec3(255.0) / 255.0);
+  col = pow(col, vec3(1.19));
+  //brightnessAdjust
+  col += 0.13;
+  //contrastAdjust
+  float t = 0.5 - 1.05 * 0.5;
+  col = col * 1.05 + t;
+
+  col = saturationMatrix(0.85) * col;
+  levels(col, vec3(0.0), vec3(235.0 / 255.0), vec3(0.0, 0.0, 0.0) / 255.0, vec3(255.0) / 255.0);
+  col = mix(tint * col, col, gradient);
+  col = 1.0 - (1.0 - col) / grey; //colorBurn
+  gl_FragColor = vec4(col, 1.0);
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/edge_detection_fragment.glsl b/rtplibrary/src/main/res/raw/edge_detection_fragment.glsl
new file mode 100644
index 0000000..5f742d2
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/edge_detection_fragment.glsl
@@ -0,0 +1,12 @@
+#extension GL_OES_standard_derivatives : enable
+precision mediump float;
+
+uniform sampler2D uSampler;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec4 color = texture2D(uSampler, vTextureCoord);
+  float gray = length(color.rgb);
+  gl_FragColor = vec4(vec3(step(0.06, length(vec2(dFdx(gray), dFdy(gray))))), 1.0);
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/exposure_fragment.glsl b/rtplibrary/src/main/res/raw/exposure_fragment.glsl
new file mode 100644
index 0000000..a598b22
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/exposure_fragment.glsl
@@ -0,0 +1,11 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform float uExposure;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec4 pixel = texture2D(uSampler, vTextureCoord);
+  gl_FragColor = vec4(pixel.rgb * pow(2.0, uExposure), pixel.a);
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/fire_fragment.glsl b/rtplibrary/src/main/res/raw/fire_fragment.glsl
new file mode 100644
index 0000000..f477696
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/fire_fragment.glsl
@@ -0,0 +1,21 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform vec2 uResolution;
+
+varying vec2 vTextureCoord;
+
+vec2 texel_size = vec2(6.0, 6.0);
+
+void main() {
+  vec2 fragCoord = vTextureCoord * uResolution;
+  fragCoord = floor(fragCoord / texel_size);	// Pixelify
+  fragCoord /= uResolution / texel_size;	// Correct scale
+  float reaction_coordinate = texture2D(uSampler, fragCoord).r;	// Use red channel
+  float mixval = ((reaction_coordinate - 0.55) * 10.0 + 0.5) * 2.0;
+  gl_FragColor = vec4(mix(vec3(1.0, 0.58, 0.0), vec3(1.0, 0.7, 0.4), mixval), reaction_coordinate);
+  gl_FragColor.rgb = vec3(1.0, 0.2, 0.0);	// Red
+  if (gl_FragColor.a > 0.65) gl_FragColor.rgb = vec3(1.0, 1.0, 1.0);	// White
+  else if (gl_FragColor.a > 0.37) gl_FragColor.rgb = vec3(1.4, 0.8, 0.0);	// Yellow
+  gl_FragColor.a = float(gl_FragColor.a > 0.1);
+}
diff --git a/rtplibrary/src/main/res/raw/fxaa.glsl b/rtplibrary/src/main/res/raw/fxaa.glsl
new file mode 100644
index 0000000..c38d7c1
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/fxaa.glsl
@@ -0,0 +1,77 @@
+/*
+* http://www.geeks3d.com/20110405/fxaa-fast-approximate-anti-aliasing-demo-glsl-opengl-test-radeon-geforce/3/
+*/
+precision highp float;
+
+#define FXAA_SPAN_MAX 8.0
+#define FXAA_REDUCE_MUL (1.0 / 8.0)
+#define FXAA_REDUCE_MIN (1.0 / 256.0)
+
+uniform sampler2D uSampler;
+uniform vec2 uResolution;
+uniform float uAAEnabled;
+
+varying vec2 vTextureCoord;
+
+vec4 FxaaTexOff(sampler2D tex, vec2 p, vec2 o, vec2 r){
+  return texture2D(tex, p + (o * r));
+}
+/**
+ *
+ * @param posPos {@link vec4} Output of FxaaVertexShader interpolated across screen.
+ * @param tex {@link sampler2D} The input texture.
+ * @param rcpFrame {@link vec2} Constant {1.0/frameWidth, 1.0/frameHeight}.
+ */
+vec3 FxaaPixelShader(sampler2D tex, vec2 uv, vec2 pos, vec2 rcpFrame) {
+/*---------------------------------------------------------*/
+    vec3 rgbNW = texture2D(tex, pos).xyz;
+    vec3 rgbNE = FxaaTexOff(tex, pos, vec2(1,0), rcpFrame).xyz;
+    vec3 rgbSW = FxaaTexOff(tex, pos, vec2(0,1), rcpFrame).xyz;
+    vec3 rgbSE = FxaaTexOff(tex, pos, vec2(1,1), rcpFrame).xyz;
+    vec3 rgbM  = texture2D(tex, uv).xyz;
+/*---------------------------------------------------------*/
+    vec3 luma = vec3(0.299, 0.587, 0.114);
+    float lumaNW = dot(rgbNW, luma);
+    float lumaNE = dot(rgbNE, luma);
+    float lumaSW = dot(rgbSW, luma);
+    float lumaSE = dot(rgbSE, luma);
+    float lumaM  = dot(rgbM,  luma);
+/*---------------------------------------------------------*/
+    float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));
+    float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));
+/*---------------------------------------------------------*/
+    vec2 dir;
+    dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));
+    dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));
+/*---------------------------------------------------------*/
+    float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);
+    float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);
+    dir = min(vec2( FXAA_SPAN_MAX,  FXAA_SPAN_MAX),
+          max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),
+          dir * rcpDirMin)) * rcpFrame.xy;
+/*--------------------------------------------------------*/
+    vec3 rgbA = (1.0 / 2.0) * (
+        texture2D(tex, uv + dir * (1.0 / 3.0 - 0.5)).xyz +
+        texture2D(tex, uv + dir * (2.0 / 3.0 - 0.5)).xyz);
+    vec3 rgbB = rgbA * (1.0 / 2.0) + (1.0 / 4.0) * (
+        texture2D(tex, uv + dir * (0.0 / 3.0 - 0.5)).xyz +
+        texture2D(tex, uv + dir * (3.0 / 3.0 - 0.5)).xyz);
+    float lumaB = dot(rgbB, luma);
+    if((lumaB < lumaMin) || (lumaB > lumaMax)) {
+        return rgbA;
+    }
+    return rgbB;
+}
+
+vec4 PostFX(sampler2D tex, vec2 uv) {
+  vec2 rcpFrame = vec2(1.0 / uResolution.x, 1.0 / uResolution.y);
+  vec4 c = vec4(0.0);
+  vec2 pos = uv - (rcpFrame * (0.5 + FXAA_REDUCE_MUL));
+  c.rgb = FxaaPixelShader(tex, uv, pos, rcpFrame);
+  c.a = 1.0;
+  return c;
+}
+
+void main() {
+	gl_FragColor = uAAEnabled == 1.0 ? PostFX(uSampler, vTextureCoord) : texture2D(uSampler, vTextureCoord);
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/fxaa_pc.glsl b/rtplibrary/src/main/res/raw/fxaa_pc.glsl
new file mode 100644
index 0000000..e92817d
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/fxaa_pc.glsl
@@ -0,0 +1,94 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform vec2 uResolution;
+uniform float uAAEnabled;
+
+varying vec2 vTextureCoord;
+
+vec4 FxaaTexTop(vec2 pos) {
+	vec4 color;
+	color.rgb = texture2D(uSampler, pos).rgb;
+	color.a = dot(color.rgb, vec3(0.299, 0.587, 0.114));
+	return color;
+}
+
+/* PC console FXAA implementation */
+vec4 FxaaPixelShader(vec2 pos, vec4 fxaaConsolePosPos, vec2 fxaaConsoleRcpFrameOpt,
+  vec2 fxaaConsoleRcpFrameOpt2, float fxaaConsoleEdgeSharpness, float fxaaConsoleEdgeThreshold,
+  float fxaaConsoleEdgeThresholdMin) {
+
+	float lumaNw = FxaaTexTop(fxaaConsolePosPos.xy).a;
+	float lumaSw = FxaaTexTop(fxaaConsolePosPos.xw).a;
+	float lumaNe = FxaaTexTop(fxaaConsolePosPos.zy).a;
+	float lumaSe = FxaaTexTop(fxaaConsolePosPos.zw).a;
+
+	vec4 rgbyM = FxaaTexTop(pos.xy);
+	float lumaM = rgbyM.w;
+
+	float lumaMaxNwSw = max(lumaNw, lumaSw);
+	lumaNe += 1.0/384.0;
+	float lumaMinNwSw = min(lumaNw, lumaSw);
+
+	float lumaMaxNeSe = max(lumaNe, lumaSe);
+	float lumaMinNeSe = min(lumaNe, lumaSe);
+
+	float lumaMax = max(lumaMaxNeSe, lumaMaxNwSw);
+	float lumaMin = min(lumaMinNeSe, lumaMinNwSw);
+
+	float lumaMaxScaled = lumaMax * fxaaConsoleEdgeThreshold;
+
+	float lumaMinM = min(lumaMin, lumaM);
+	float lumaMaxScaledClamped = max(fxaaConsoleEdgeThresholdMin, lumaMaxScaled);
+	float lumaMaxM = max(lumaMax, lumaM);
+	float dirSwMinusNe = lumaSw - lumaNe;
+	float lumaMaxSubMinM = lumaMaxM - lumaMinM;
+	float dirSeMinusNw = lumaSe - lumaNw;
+
+	if (lumaMaxSubMinM < lumaMaxScaledClamped)
+		return rgbyM;
+
+	vec2 dir;
+	dir.x = dirSwMinusNe + dirSeMinusNw;
+	dir.y = dirSwMinusNe - dirSeMinusNw;
+
+	vec2 dir1 = normalize(dir.xy);
+	vec4 rgbyN1 = FxaaTexTop(pos.xy - dir1 * fxaaConsoleRcpFrameOpt);
+	vec4 rgbyP1 = FxaaTexTop(pos.xy + dir1 * fxaaConsoleRcpFrameOpt);
+
+	float dirAbsMinTimesC = min(abs(dir1.x), abs(dir1.y)) * fxaaConsoleEdgeSharpness;
+	vec2 dir2 = clamp(dir1.xy / dirAbsMinTimesC, -2.0, 2.0);
+
+	vec4 rgbyN2 = FxaaTexTop(pos.xy - dir2 * fxaaConsoleRcpFrameOpt2);
+	vec4 rgbyP2 = FxaaTexTop(pos.xy + dir2 * fxaaConsoleRcpFrameOpt2);
+
+	vec4 rgbyA = rgbyN1 + rgbyP1;
+	vec4 rgbyB = ((rgbyN2 + rgbyP2) * 0.25) + (rgbyA * 0.25);
+
+	bool twoTap = (rgbyB.w < lumaMin) || (rgbyB.w > lumaMax);
+	if (twoTap)
+		rgbyB.xyz = rgbyA.xyz * 0.5;
+
+	return rgbyB;
+}
+
+void main() {
+  if (uAAEnabled == 1.0) {
+	  vec2 uFxaaConsoleRcpFrameOpt = vec2(0.5 / uResolution.x, 0.5 / uResolution.y);
+    vec2 uFxaaConsoleRcpFrameOpt2 = vec2(2.0 / uResolution.x, 2.0 / uResolution.y);
+    vec4 uFrameSize = vec4(uResolution.x, uResolution.y, 1.0 / uResolution.x, 1.0 / uResolution.y);
+
+  	vec4 fxaaConsolePosPos;
+	  fxaaConsolePosPos.xy = vTextureCoord * uFrameSize.xy - 1.0;
+	  fxaaConsolePosPos.zw = fxaaConsolePosPos.xy + 2.0;
+	  fxaaConsolePosPos *= uFrameSize.zwzw;
+
+	  const float fxaaConsoleEdgeSharpness = 8.0;
+	  const float fxaaConsoleEdgeThreshold = 0.125;
+	  const float fxaaConsoleEdgeThresholdMin = 0.0625;
+	  gl_FragColor = FxaaPixelShader(vTextureCoord, fxaaConsolePosPos, uFxaaConsoleRcpFrameOpt,
+	  uFxaaConsoleRcpFrameOpt2, fxaaConsoleEdgeSharpness, fxaaConsoleEdgeThreshold, fxaaConsoleEdgeThresholdMin);
+  } else {
+    gl_FragColor = texture2D(uSampler, vTextureCoord);
+  }
+}
diff --git a/rtplibrary/src/main/res/raw/gamma_fragment.glsl b/rtplibrary/src/main/res/raw/gamma_fragment.glsl
new file mode 100644
index 0000000..08fc072
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/gamma_fragment.glsl
@@ -0,0 +1,11 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform float uGamma;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec4 pixel = texture2D(uSampler, vTextureCoord);
+  gl_FragColor = vec4(pow(pixel.rgb, vec3(uGamma)), pixel.a);
+}
diff --git a/rtplibrary/src/main/res/raw/grey_scale_fragment.glsl b/rtplibrary/src/main/res/raw/grey_scale_fragment.glsl
new file mode 100644
index 0000000..5e7284b
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/grey_scale_fragment.glsl
@@ -0,0 +1,12 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+
+varying vec2 vTextureCoord;
+const vec3 luma = vec3(0.299, 0.587, 0.114);
+
+void main() {
+  vec4 pixel = texture2D(uSampler, vTextureCoord);
+  float grey = dot(pixel.rgb, luma);
+  gl_FragColor = vec4(grey, grey, grey, pixel.a);
+}
diff --git a/rtplibrary/src/main/res/raw/halftone_lines_fragment.glsl b/rtplibrary/src/main/res/raw/halftone_lines_fragment.glsl
new file mode 100644
index 0000000..c0bd85b
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/halftone_lines_fragment.glsl
@@ -0,0 +1,84 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform vec2 uResolution;
+uniform float uMode;
+uniform float uRows;
+uniform float uRotation;
+uniform float uAntialias;
+uniform vec2 uSampleDist;
+
+varying vec2 vTextureCoord;
+
+float rgbToGray(vec4 rgba) {
+  const vec3 W = vec3(0.2125, 0.7154, 0.0721);
+  return dot(rgba.xyz, W);
+}
+
+float avgerageGray(vec2 uv, float stepX, float stepY) {
+	// get samples around pixel
+	vec4 colors[9];
+	colors[0] = texture2D(uSampler,uv + vec2(-stepX, stepY));
+	colors[1] = texture2D(uSampler,uv + vec2(0, stepY));
+	colors[2] = texture2D(uSampler,uv + vec2(stepX, stepY));
+	colors[3] = texture2D(uSampler,uv + vec2(-stepX, 0));
+	colors[4] = texture2D(uSampler,uv);
+	colors[5] = texture2D(uSampler,uv + vec2(stepX, 0));
+	colors[6] = texture2D(uSampler,uv + vec2(-stepX, -stepY));
+	colors[7] = texture2D(uSampler,uv + vec2(0, -stepY));
+	colors[8] = texture2D(uSampler,uv + vec2(stepX, -stepY));
+	// sum + return averaged gray
+  vec4 result = vec4(0);
+	for (int i = 0; i < 9; i++) {
+		result += colors[i];
+	}
+	return rgbToGray(result) / 9.0;
+}
+
+vec2 rotateCoord(vec2 uv, float rads) {
+  uv *= mat2(cos(rads), sin(rads), -sin(rads), cos(rads));
+	return uv;
+}
+
+void main() {
+  // halftone line coords
+  vec2 uvRow = fract(rotateCoord(vTextureCoord, uRotation) * uRows);
+  vec2 uvFloorY = vec2(vTextureCoord.x, floor(vTextureCoord.y * uRows) / uRows) + vec2(0., (1.0 / uRows) * 0.5); // add y offset to get center row color
+  // get averaged gray for row
+  float averagedBW = avgerageGray(uvFloorY, uSampleDist.x/uResolution.x, uSampleDist.y/uResolution.y);
+  // use averaged gray to set line thickness
+  vec3 finalColor = vec3(1.);
+  if(uMode == 1.) {
+    if(uvRow.y > averagedBW) finalColor = vec3(0.0);
+  } else if(uMode == 2.) {
+    if(distance(uvRow.y + 0.5, averagedBW * 2.) < 0.2) finalColor = vec3(0.0);
+  } else if(uMode == 3.) {
+    float distFromRowCenter = 1.0 - distance(uvRow.y, 0.5) * 2.0;
+    finalColor = vec3(1.0 - smoothstep(averagedBW - uAntialias, averagedBW + uAntialias, distFromRowCenter));
+  } else if(uMode == 4.) {
+    vec2 uvRow2 = fract(rotateCoord(vTextureCoord, -uRotation) * uRows);
+    float distFromRowCenter1 = 1.0 - distance(uvRow.y, 0.5) * 2.0;
+    float distFromRowCenter2 = 1.0 - distance(uvRow2.y, 0.5) * 2.0;
+    float distFromRowCenter = min(distFromRowCenter1, distFromRowCenter2);
+    finalColor = vec3(1.0 - smoothstep(averagedBW - uAntialias, averagedBW + uAntialias, distFromRowCenter));
+  } else if(uMode == 5.) {
+    vec2 uvRow2 = fract(rotateCoord(vTextureCoord, -uRotation) * uRows);
+    float distFromRowCenter1 = 1.0 - distance(uvRow.y, 0.5) * 2.0;
+    float distFromRowCenter2 = 1.0 - distance(uvRow2.y, 0.5) * 2.0;
+    float distFromRowCenter = mix(distFromRowCenter1, distFromRowCenter2, 0.5);
+    finalColor = vec3(1.0 - smoothstep(averagedBW - uAntialias, averagedBW + uAntialias, distFromRowCenter));
+  } else if(uMode == 6.) {
+    float rot = floor(averagedBW * 6.28) / 6.28;
+    rot = rot * 4.;
+    vec2 uvRow = fract(rotateCoord(vTextureCoord, rot) * uRows);
+    float distFromRowCenter = 1.0 - distance(uvRow.y, 0.5) * 2.0;
+    finalColor = vec3(1.0 - smoothstep(averagedBW - uAntialias, averagedBW + uAntialias, distFromRowCenter));
+  } else if(uMode == 7.) {
+    vec4 originalColor = texture2D(uSampler, uvFloorY);
+    float distFromRowCenter = 1.0 - distance(uvRow.y, 0.5) * 2.0;
+		float mixValue = 1.0 - smoothstep(averagedBW - uAntialias, averagedBW + uAntialias, distFromRowCenter);
+    finalColor = mix(originalColor.rgb, vec3(1.), mixValue);
+  }
+  // draw
+	gl_FragColor = vec4(finalColor, 1.0);
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/image70s_fragment.glsl b/rtplibrary/src/main/res/raw/image70s_fragment.glsl
new file mode 100644
index 0000000..43ee1d8
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/image70s_fragment.glsl
@@ -0,0 +1,14 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec4 texColor = texture2D(uSampler, vTextureCoord);
+  float avg = (texColor.r + texColor.g + texColor.b) / 3.0; // grayscale
+	texColor.r *= abs(cos(avg));
+  texColor.g *= abs(sin(avg));
+  texColor.b *= abs(atan(avg) * sin(avg));
+  gl_FragColor = texColor;
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/lamoish_fragment.glsl b/rtplibrary/src/main/res/raw/lamoish_fragment.glsl
new file mode 100644
index 0000000..2dc35dc
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/lamoish_fragment.glsl
@@ -0,0 +1,23 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec4 color = texture2D(uSampler, vTextureCoord);
+  vec3 ncolor = vec3(0.0, 0.0, 0.0);
+  float value;
+  if (color.r < 0.5) value = color.r;
+  else value = 1.0 - color.r;
+  float red = 4.0 * value * value * value;
+  if (color.r < 0.5) ncolor.r = red;
+  else ncolor.r = 1.0 - red;
+  if (color.g < 0.5) value = color.g;
+  else value = 1.0 - color.g;
+  float green = 2.0 * value * value;
+  if (color.g < 0.5) ncolor.g = green;
+  else ncolor.g = 1.0 - green;
+  ncolor.b = color.b * 0.5 + 0.25;
+  gl_FragColor = vec4(ncolor.rgb, color.a);
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/money_fragment.glsl b/rtplibrary/src/main/res/raw/money_fragment.glsl
new file mode 100644
index 0000000..1776557
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/money_fragment.glsl
@@ -0,0 +1,44 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform vec2 uResolution;
+
+varying vec2 vTextureCoord;
+
+const int kNumPatrones = 6;
+
+void main() {
+  vec2 texCoord = vTextureCoord * uResolution.xy;
+  vec2 xy = texCoord.xy / uResolution.yy;
+  float amplitud = 0.03;
+  float frecuencia = 10.0;
+  float gris = 1.0;
+  float divisor = 8.0 / uResolution.y;
+  float grosorInicial = divisor * 0.2;
+  // x: seno del angulo, y: coseno del angulo, z: factor de suavizado
+  vec3 datosPatron[kNumPatrones];
+  datosPatron[0] = vec3(-0.7071, 0.7071, 3.0); // -45
+  datosPatron[1] = vec3(0.0, 1.0, 0.6); // 0
+  datosPatron[2] = vec3(0.0, 1.0, 0.5); // 0
+  datosPatron[3] = vec3(1.0, 0.0, 0.4); // 90
+  datosPatron[4] = vec3(1.0, 0.0, 0.3); // 90
+  datosPatron[5] = vec3(0.0, 1.0, 0.2); // 0
+  vec4 color = texture2D(uSampler, vec2(texCoord.x / uResolution.x, xy.y));
+  gl_FragColor = color;
+  for(int i = 0; i < kNumPatrones; i++) {
+    float coseno = datosPatron[i].x;
+    float seno = datosPatron[i].y;
+    vec2 punto = vec2(xy.x * coseno - xy.y * seno, xy.x * seno + xy.y * coseno);
+    float grosor = grosorInicial * float(i + 1);
+    float dist = mod(punto.y + grosor * 0.5 - sin(punto.x * frecuencia) * amplitud, divisor);
+    float brillo = 0.3 * color.r + 0.4 * color.g + 0.3 * color.b;
+    if(dist < grosor && brillo < 0.75 - 0.12 * float(i)) {
+      // Suavizado
+      float k = datosPatron[i].z;
+      float x = (grosor - dist) / grosor;
+      float fx = abs((x - 0.5) / k) - (0.5 - k) / k;
+      gris = min(fx, gris);
+    }
+  }
+  gl_FragColor = vec4(gris, gris, gris, 1.0);
+}
diff --git a/rtplibrary/src/main/res/raw/negative_fragment.glsl b/rtplibrary/src/main/res/raw/negative_fragment.glsl
new file mode 100644
index 0000000..907d13d
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/negative_fragment.glsl
@@ -0,0 +1,10 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec3 negative = 1.0 - texture2D(uSampler, vTextureCoord).rgb;
+  gl_FragColor = vec4(negative, 1.0);
+}
diff --git a/rtplibrary/src/main/res/raw/object_fragment.glsl b/rtplibrary/src/main/res/raw/object_fragment.glsl
new file mode 100644
index 0000000..224c1cd
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/object_fragment.glsl
@@ -0,0 +1,19 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform sampler2D uObject;
+uniform float uAlpha;
+
+varying vec2 vTextureCoord;
+varying vec2 vTextureObjectCoord;
+
+void main() {
+  vec4 samplerPixel = texture2D(uSampler, vTextureCoord);
+  vec4 objectPixel = texture2D(uObject, vTextureObjectCoord);
+  if (vTextureObjectCoord.x < 0.0 || vTextureObjectCoord.x > 1.0 ||
+  vTextureObjectCoord.y < 0.0 || vTextureObjectCoord.y > 1.0) {
+    gl_FragColor = samplerPixel;
+  } else {
+    gl_FragColor = mix(samplerPixel, objectPixel, objectPixel.a * uAlpha);
+  }
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/object_vertex.glsl b/rtplibrary/src/main/res/raw/object_vertex.glsl
new file mode 100644
index 0000000..cf572f7
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/object_vertex.glsl
@@ -0,0 +1,15 @@
+attribute vec4 aPosition;
+attribute vec4 aTextureCoord;
+attribute vec4 aTextureObjectCoord;
+
+uniform mat4 uMVPMatrix;
+uniform mat4 uSTMatrix;
+
+varying vec2 vTextureCoord;
+varying vec2 vTextureObjectCoord;
+
+void main() {
+  gl_Position = uMVPMatrix * aPosition;
+  vTextureCoord = (uSTMatrix * aTextureCoord).xy;
+  vTextureObjectCoord = (uSTMatrix * aTextureObjectCoord).xy;
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/pixelated_fragment.glsl b/rtplibrary/src/main/res/raw/pixelated_fragment.glsl
new file mode 100644
index 0000000..4e1eb27
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/pixelated_fragment.glsl
@@ -0,0 +1,11 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform float uPixelated;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec2 coord = vec2(uPixelated * floor(vTextureCoord.x / uPixelated), uPixelated * floor(vTextureCoord.y / uPixelated));
+  gl_FragColor = texture2D(uSampler, coord);
+}
diff --git a/rtplibrary/src/main/res/raw/polygonization_fragment.glsl b/rtplibrary/src/main/res/raw/polygonization_fragment.glsl
new file mode 100644
index 0000000..36b7af3
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/polygonization_fragment.glsl
@@ -0,0 +1,52 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform vec2 uResolution;
+
+varying vec2 vTextureCoord;
+
+vec2 hash2(vec2 p) {
+  return fract(sin(vec2(dot(p, vec2(127.1, 311.7)),dot(p, vec2(269.5, 183.3)))) * 43758.5453);
+}
+
+vec2 voronoi(in vec2 x) {
+  vec2 n = floor(x);
+  vec2 f = fract(x);
+  //----------------------------------
+  // regular voronoi
+  //----------------------------------
+  vec2 mg, mr;
+  float md = 8.0;
+  for(int j = -1; j <= 1; j++)
+    for(int i = -1; i <= 1; i++) {
+      vec2 g = vec2(float(i), float(j));
+		  vec2 o = hash2(n + g);
+      vec2 r = g + o - f;
+      float d = dot(r, r);
+      if(d < md) {
+        md = d;
+        mr = r;
+        mg = g;
+      }
+    }
+  return mr;
+}
+
+vec3 VoronoiColor(float steps, vec2 p, vec2 uv) {
+  vec2 c = voronoi(steps * p);
+  vec2 uv1 = uv;
+  uv1.x += c.x / steps;
+  uv1.y += c.y / steps * uResolution.x / uResolution.y;
+  return texture2D(uSampler, vec2(uv1.x, uv1.y)).xyz;
+}
+
+void main() {
+  vec2 p = (vTextureCoord * uResolution).xy / uResolution.xx;
+  vec2 uv = (vTextureCoord * uResolution).xy / uResolution.xy;
+  vec3 color = vec3(0.0, 0.0, 0.0);
+  for (float i = 0.0; i < 4.0; i += 1.0) {
+    float steps = 30.0 * pow(2.0, i);
+    color += VoronoiColor(steps, p, uv);
+  }
+	gl_FragColor = vec4(color * 0.25, 1.0);
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/rainbow_fragment.glsl b/rtplibrary/src/main/res/raw/rainbow_fragment.glsl
new file mode 100644
index 0000000..a12fd0c
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/rainbow_fragment.glsl
@@ -0,0 +1,40 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform float uTime;
+
+varying vec2 vTextureCoord;
+
+#define posterSteps 4.0
+#define lumaMult 0.5
+#define timeMult 0.15
+#define BW 0
+
+float rgbToGray(vec4 rgba) {
+	const vec3 W = vec3(0.2125, 0.7154, 0.0721);
+  return dot(rgba.xyz, W);
+}
+
+vec3 hsv2rgb(vec3 c) {
+  vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
+  vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
+  return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
+}
+
+void main() {
+  vec4 color = texture2D(uSampler, vTextureCoord);
+  float luma = rgbToGray(color) * lumaMult;
+  float lumaIndex = floor(luma * posterSteps);
+  float lumaFloor = lumaIndex / posterSteps;
+  float lumaRemainder = (luma - lumaFloor) * posterSteps;
+  if(mod(lumaIndex, 2.) == 0.) lumaRemainder = 1.0 - lumaRemainder; // flip luma remainder for smooth color transitions
+  float lumaCycle = mod(luma + uTime * timeMult, 1.);
+  vec3 roygbiv = hsv2rgb(vec3(lumaCycle, 1., lumaRemainder));
+  if(BW == 1) {
+    float bw = rgbToGray(vec4(roygbiv, 1.));
+    gl_FragColor = vec4(vec3(bw), 1.0);
+  } else {
+    gl_FragColor = vec4(roygbiv, 1.0);
+  }
+}
+
diff --git a/rtplibrary/src/main/res/raw/rgb_saturation_fragment.glsl b/rtplibrary/src/main/res/raw/rgb_saturation_fragment.glsl
new file mode 100644
index 0000000..fcfb5fa
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/rgb_saturation_fragment.glsl
@@ -0,0 +1,11 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform vec3 uRGBSaturation;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec4 pixel = texture2D(uSampler, vTextureCoord);
+  gl_FragColor = vec4(pixel.r * uRGBSaturation.r, pixel.g * uRGBSaturation.g, pixel.b * uRGBSaturation.b, 1.0);
+}
diff --git a/rtplibrary/src/main/res/raw/ripple_fragment.glsl b/rtplibrary/src/main/res/raw/ripple_fragment.glsl
new file mode 100644
index 0000000..c549b0d
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/ripple_fragment.glsl
@@ -0,0 +1,17 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform vec2 uResolution;
+uniform float uSpeed;
+uniform float uTime;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec2 cPos = -1.0 + 2.0 * vTextureCoord;
+  float ratio = uResolution.x / uResolution.y;
+  cPos.x *= ratio;
+  float cLength = length(cPos);
+  vec2 uv = vTextureCoord + (cPos / cLength) * cos(cLength * uSpeed - uTime * uSpeed) * 0.03;
+  gl_FragColor = texture2D(uSampler, uv);
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/saturation_fragment.glsl b/rtplibrary/src/main/res/raw/saturation_fragment.glsl
new file mode 100644
index 0000000..fde0f69
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/saturation_fragment.glsl
@@ -0,0 +1,23 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform float uShift;
+uniform vec3 uWeights;
+uniform vec3 uExponents;
+uniform float uSaturation;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec4 oldcolor = texture2D(uSampler, vTextureCoord);
+  float kv = dot(oldcolor.rgb, uWeights) + uShift;
+  vec3 new_color = uSaturation * oldcolor.rgb + (1.0 - uSaturation) * kv;
+  gl_FragColor= vec4(new_color, oldcolor.a);
+
+  vec4 color = texture2D(uSampler, vTextureCoord);
+  float de = dot(color.rgb, uWeights);
+  float inv_de = 1.0 / de;
+  vec3 verynew_color = de * pow(color.rgb * inv_de, uExponents);
+  float max_color = max(max(max(verynew_color.r, verynew_color.g), verynew_color.b), 1.0);
+  gl_FragColor = gl_FragColor + vec4(verynew_color / max_color, color.a);
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/sepia_fragment.glsl b/rtplibrary/src/main/res/raw/sepia_fragment.glsl
new file mode 100644
index 0000000..4dc71fa
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/sepia_fragment.glsl
@@ -0,0 +1,14 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec4 pixel = texture2D(uSampler, vTextureCoord);
+  vec4 sepia = vec4(clamp(pixel.x * 0.393 + pixel.y * 0.769 + pixel.z * 0.189, 0.0, 1.0),
+    clamp(pixel.x * 0.349 + pixel.y * 0.686 + pixel.z * 0.168, 0.0, 1.0),
+    clamp(pixel.x * 0.272 + pixel.y * 0.534 + pixel.z * 0.131, 0.0, 1.0),
+    pixel.w);
+  gl_FragColor = sepia;
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/sharpness_fragment.glsl b/rtplibrary/src/main/res/raw/sharpness_fragment.glsl
new file mode 100644
index 0000000..c39dfd6
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/sharpness_fragment.glsl
@@ -0,0 +1,31 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform vec2 uStepSize;
+uniform float uSharpness;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec3 nbr_color = vec3(0.0, 0.0, 0.0);
+  vec2 coord;
+  vec4 color = texture2D(uSampler, vTextureCoord);
+
+  coord.x = vTextureCoord.x - 0.5 * uStepSize.x;
+  coord.y = vTextureCoord.y - uStepSize.y;
+  nbr_color += texture2D(uSampler, coord).rgb - color.rgb;
+
+  coord.x = vTextureCoord.x - uStepSize.x;
+  coord.y = vTextureCoord.y + 0.5 * uStepSize.y;
+  nbr_color += texture2D(uSampler, coord).rgb - color.rgb;
+
+  coord.x = vTextureCoord.x + uStepSize.x;
+  coord.y = vTextureCoord.y - 0.5 * uStepSize.y;
+  nbr_color += texture2D(uSampler, coord).rgb - color.rgb;
+
+  coord.x = vTextureCoord.x + uStepSize.x;
+  coord.y = vTextureCoord.y + 0.5 * uStepSize.y;
+  nbr_color += texture2D(uSampler, coord).rgb - color.rgb;
+
+  gl_FragColor = vec4(color.rgb - 2.0 * uSharpness * nbr_color, color.a);
+}
diff --git a/rtplibrary/src/main/res/raw/simple_fragment.glsl b/rtplibrary/src/main/res/raw/simple_fragment.glsl
new file mode 100644
index 0000000..6ad4190
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/simple_fragment.glsl
@@ -0,0 +1,9 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  gl_FragColor = texture2D(uSampler, vTextureCoord);
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/simple_vertex.glsl b/rtplibrary/src/main/res/raw/simple_vertex.glsl
new file mode 100644
index 0000000..42defee
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/simple_vertex.glsl
@@ -0,0 +1,12 @@
+attribute vec4 aPosition;
+attribute vec4 aTextureCoord;
+
+uniform mat4 uMVPMatrix;
+uniform mat4 uSTMatrix;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  gl_Position = uMVPMatrix * aPosition;
+  vTextureCoord = (uSTMatrix * aTextureCoord).xy;
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/surface_fragment.glsl b/rtplibrary/src/main/res/raw/surface_fragment.glsl
new file mode 100644
index 0000000..0061c1e
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/surface_fragment.glsl
@@ -0,0 +1,20 @@
+#extension GL_OES_EGL_image_external : require
+precision mediump float;
+
+uniform samplerExternalOES uSamplerSurface;
+uniform sampler2D uSampler;
+uniform float uAlpha;
+
+varying vec2 vTextureCoord;
+varying vec2 vTextureSurfaceCoord;
+
+void main() {
+  vec4 color = texture2D(uSampler, vTextureCoord);
+  vec4 surfaceColor = texture2D(uSamplerSurface, vTextureSurfaceCoord);
+  if (vTextureSurfaceCoord.x < 0.0 || vTextureSurfaceCoord.x > 1.0 ||
+  vTextureSurfaceCoord.y < 0.0 || vTextureSurfaceCoord.y > 1.0) {
+    gl_FragColor = color;
+  } else {
+    gl_FragColor = mix(color, surfaceColor, surfaceColor.a * uAlpha);
+  }
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/surface_vertex.glsl b/rtplibrary/src/main/res/raw/surface_vertex.glsl
new file mode 100644
index 0000000..07f66ea
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/surface_vertex.glsl
@@ -0,0 +1,15 @@
+attribute vec4 aPosition;
+attribute vec4 aTextureCoord;
+attribute vec4 aTextureSurfaceCoord;
+
+uniform mat4 uMVPMatrix;
+uniform mat4 uSTMatrix;
+
+varying vec2 vTextureCoord;
+varying vec2 vTextureSurfaceCoord;
+
+void main() {
+  gl_Position = uMVPMatrix * aPosition;
+  vTextureCoord = (uSTMatrix * aTextureCoord).xy;
+  vTextureSurfaceCoord = (uSTMatrix * aTextureSurfaceCoord).xy;
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/temperature_fragment.glsl b/rtplibrary/src/main/res/raw/temperature_fragment.glsl
new file mode 100644
index 0000000..8699480
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/temperature_fragment.glsl
@@ -0,0 +1,16 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform float uTemperature;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  vec4 pixel = texture2D(uSampler, vTextureCoord);
+  pixel.r = pixel.r + pixel.r * (1.0 - pixel.r) * uTemperature;
+  pixel.b = pixel.b - pixel.b * (1.0 - pixel.b) * uTemperature;
+  if (uTemperature > 0.0) pixel.g = pixel.g + pixel.g * (1.0 - pixel.g) * uTemperature * 0.25;
+  float value = max(pixel.r, max(pixel.g, pixel.b));
+  if (value > 1.0) pixel.rgb /= value;
+  gl_FragColor = pixel;
+}
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/raw/zebra_fragment.glsl b/rtplibrary/src/main/res/raw/zebra_fragment.glsl
new file mode 100644
index 0000000..a8bcc17
--- /dev/null
+++ b/rtplibrary/src/main/res/raw/zebra_fragment.glsl
@@ -0,0 +1,17 @@
+precision mediump float;
+
+uniform sampler2D uSampler;
+uniform float uTime;
+uniform float uLevels;
+
+varying vec2 vTextureCoord;
+
+void main() {
+  float phase = uTime * 0.5;
+	vec4 tx = texture2D(uSampler, vTextureCoord);
+	vec4 x = tx;
+	x = mod(x + phase, 1.0);
+	x = floor(x * uLevels);
+	x = mod(x, 2.0);
+	gl_FragColor= vec4(vec3(x), tx.a);
+}
diff --git a/rtplibrary/src/main/res/values/attrs.xml b/rtplibrary/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..a5b7249
--- /dev/null
+++ b/rtplibrary/src/main/res/values/attrs.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+  <attr name="keepAspectRatio"
+      format="boolean"/>
+  <attr name="isFlipHorizontal"
+      format="boolean"/>
+  <attr name="isFlipVertical"
+      format="boolean"/>
+
+  <declare-styleable name="OpenGlView">
+    <attr name="AAEnabled"
+        format="boolean"/>
+    <attr name="numFilters"
+        format="integer"/>
+    <attr name="keepAspectRatio"/>
+    <attr name="isFlipHorizontal"/>
+    <attr name="isFlipVertical"/>
+  </declare-styleable>
+
+  <declare-styleable name="LightOpenGlView">
+    <attr name="keepAspectRatio"/>
+    <attr name="isFlipHorizontal"/>
+    <attr name="isFlipVertical"/>
+  </declare-styleable>
+</resources>
\ No newline at end of file
diff --git a/rtplibrary/src/main/res/values/strings.xml b/rtplibrary/src/main/res/values/strings.xml
new file mode 100755
index 0000000..b2079c3
--- /dev/null
+++ b/rtplibrary/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+<resources>
+  <string name="app_name">builder</string>
+</resources>
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..fe80474
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,2 @@
+include ':app'
+include ':rtplibrary'
\ No newline at end of file
-- 
GitLab