根据word模板导出word、使用spring-thymeleaf模板生成html并通过docx4j把html转word,使用jxls根据excel模板导出excel
使用poi-tl 根据word模板生成word
官网
poi-tl(poi template language)是Word模板引擎,基于Word模板和数据生成新的文档。
在文档的任何地方做任何事情(Do Anything Anywhere)是poi-tl的星辰大海。
Apache POI不仅封装了易用的文档API(文本、图片、表格、页眉、页脚、图表等),也可以在底层直接操作文档XML结构,poi-tl正是一个基于Apache POI的Word模板引擎,并且拥有着让人喜悦的特性。
代码示例
XWPFTemplate template = XWPFTemplate.compile("template.docx").render(
new HashMap<String, Object>(){ {
put("title", "Hi, poi-tl Word模板引擎");
}});
template.writeAndClose(new FileOutputStream("output.docx"));
compile 编译模板 |
|
render 渲染数据 |
|
write 输出到流 |
XWPFTemplate template = XWPFTemplate.compile("~/file.docx").render(datas);
所有的标签都是以 { { 开始,以 }} 结束。
-
{ {template}} 文本
-
{ {@template}} 图片
-
{ {#template}} 表格
-
{ {*template}} 列表
-
{ {+template}} Word文档合并
-
{ {?list}}{ {/list}} if和foreach功能
1.依赖
<!--poi tl start导出word-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.9.1</version>
</dependency>
<!--poi tl send 导出word-->
2.代码
package com.shan.mydemo.controller;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.*;
import com.shan.mydemo.domain.HttpServletResponseUtils;
import com.shan.mydemo.domain.RvDclrBasicInfoFO;
import com.shan.mydemo.domain.RvDclrInfoFO;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.compress.archivers.zip.Zip64Mode;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.IntStream;
/**
* @author sc
* @createTime 2020/1/14 17:51
* @description poi-tl
*/
@Api(description = "poi操作word")
@Slf4j
@Controller
@RequestMapping("/poi-tl")
public class PoiTlDemoController {
/**
* poi-tl导出word 以及压缩包
* @return
*/
@GetMapping("/testWord")
public void testWord(HttpServletResponse response) throws IOException {
byte[] base64 = Base64.decodeBase64("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iVjrvaF8s5/KlaXc0S8iXO8RrDe96U3pb/7mb0bTrt5oXt0pesQjHjH6hYzr/bSsaT8iub4LUp1n/JG1TnyzFsFBBAgQWG4BAbLc62N2BAi0LPCK/3l/esvd32/5rD863ct2npLe9KQf/cK7+m/e8pa3zPxTp6rX1m+crt4TMv7L9MZjo/oO/pe//OXRj9wdf89G9UV29d/Hf5t59b+95z3vGU3rb//2b7McZvopWN84kNK3P5R13kYHbX9WSg8/8XeNrBdPlXn1u1PGA6/636o/9e8BWS/+1rsDUr1uKXwboXkRAQIElktAgCzXepgNAQIBAlWEvPurD6Rvfn+1tdEedspKesEjT143PlobpJQTVRFy739P6cEWf+v8SWekdOa/XTc+SmExTwIECBD4oYAAsRMIECAwp8ADx1bTyVtW5jyLl08VWH0wpZWTABEgQIBATwQESE8W0mUQIECAAAECBAgQKEFAgJSwSuZIgAABAgQIECBAoCcCAqQnC+kyCBAgQIAAAQIECJQgIEBKWCVzJECAAAECBAgQINATAQHSk4V0GQQIECBAgAABAgRKEBAgJaySORIgQIAAAQIECBDoiYAA6clCugwCBAgQIECAAAECJQgIkBJWyRwJECBAgAABAgQI9ERAgPRkIV0GAQIECBAgQIAAgRIEBEgJq2SOBAgQIECAAAECBHoiIEB6spAugwABAgQIECBAgEAJAgKkhFUyRwIECBAgQIAAAQI9ERAgPVlIl0GAAAECBAgQIECgBAEBUsIqmSMBAgQIECBAgACBnggIkJ4spMsgQIAAAQIECBAgUIKAAClhlcyRAAECBAgQIECAQE8EBEhPFtJlECBAgAABAgQIEChBQICUsErmSIAAAQIECBAgQKAnAgKkJwvpMggQIECAAAECBAiUICBASlglcyRAgAABAgQIECDQEwEB0pOFdBkECBAgQIAAAQIEShAQICWskjkSIECAAAECBAgQ6ImAAOnJQroMAgQIECBAgAABAiUICJASVskcCRAgQIAAAQIECPREQID0ZCFdBgECBAgQIECAAIESBARICatkjgQIECBAgAABAgR6IiBAerKQLoMAAQIECBAgQIBACQICpIRVMkcCBAgQIECAAAECPREQID1ZSJdBgAABAgQIECBAoAQBAVLCKpkjAQIECBAgQIAAgZ4ICJCeLKTLIECAAAECBAgQIFCCgAApYZXMkQABAgQIECBAgEBPBARITxbSZRAgQIAAAQIECBAoQUCAlLBK5kiAAAECBAgQIECgJwICpCcL6TIIECBAgAABAgQIlCAgQEpYJXMkQIAAAQIECBAg0BOBhQfIwYMH04UXXngC10033ZT27NnTE0aXQYAAAQIECBAgQIBAjsDCA2RyEnfddVe66qqr0jXXXJN27NiRM0fHECBAgAABAgQIECDQE4HwANm3b18677zz0u7du3tC6DIIECBAgAABAgQIEMgVCA2Q6u7HDTfckK6++uq0devWDef41Kc+dfT3d9xxR+61OI4AAQIECBAgQIAAgSUXCA2Qje5+bNu2LR05cuQErsOHDy85oekRIECAAAECBAgQKEdg+/btnU42LEBmfe/HysrKCObYsWOdAhmcAAECBAgQIECAQJ8E6q+zu7qmsACp7n7s3Lkz+ydfCZCutoRxCRAgQIAAAQIE+iwwiACpHq167Wtfmy655JK0a9eurPUUIFlMDiJAgAABAgQIECAwk8AgAmTWx68qQQEy0z5yMAECBAgQIECAAIEsgUEESJbExEECpIma1xAgQIAAAQIECBDYWECATPERID50CBAgQIAAAQIECLQvIEAESPu7yhkJECBAgAABAgQIbPJ1dldAYT8Fa9YLdAdkVjHHEyBAgAABAgQIENhcwB0Qd0A23yWOIECAAAECBAgQINCSgAARIC1tJachQIAAAQIECBAgsLmAABEgm+8SRxAgQIAAAQIECBBoSUCACJCWtpLTECBAgAABAgQIENhcQIAIkM13iSMIECBAgAABAgQItCQgQARIS1vJaQgQIECAAAECBAhsLiBABMjmu8QRBAgQIECAAAECBFoSECACpKWt5DQECBAgQIAAAQIENhcQIAJk813iCAIECBAgQIAAAQItCQgQAdLSVnIaAgQIECBAgAABApsLCBABsvkucQQBAgQIECBAgACBlgQEiABpaSs5DQECBAgQIECAAIHNBQSIANl8lziCAAECBAgQIECAQEsCAkSAtLSVnIYAAQIECBAgQIDA5gICRIBsvkscQYAAAQIECBAgQKAlAQEiQFraSk5DgAABAgQIECBAYHMBASJANt8ljiBAgAABAgQIECDQkoAAESAtbSWnIUCAAAECBAgQILC5gAARIJvvEkcQIECAAAECBAgQaElAgAiQlraS0xAgQIAAAQIECBDYXECACJDNd4kjCBAgQIAAAQIECLQkIEAESEtbyWkIECBAgAABAgQIbC4gQATI5rvEEQQIECBAgAABAgRaEhAgAqSlreQ0BAgQIECAAAECBDYXECACZPNd4ggCBAgQIECAAAECLQkIEAHS0lZyGgIECBAgQIAAAQKbCwgQAbL5LnEEAQIECBAgQIAAgZYEBIgAaWkrOQ0BAgQIECBAgACBzQUEiADZfJc4ggABAgQIECBAgEBLAgJEgLS0lZyGAAECBAgQIECAwOYCAkSAbL5LHEGAAAECBAgQIECgJQEBIkBa2kpOQ4AAAQIECBAgQGBzAQEiQDbfJY4gQIAAAQIECBAg0JKAABEgLW0lpyFAgAABAgQIECCwuYAAESCb7xJHECBAgAABAgQIEGhJQIAIkJa2ktMQIECAAAECBAgQ2FxAgAiQzXeJIwgQIECAAAECBAi0JCBABEhLW8lpCBAgQIAAAQIECGwuIEAEyOa7xBEECBAgQIAAAQIEWhIQIAKkpa3kNAQIECBAgAABAgQ2FxAgAmTzXeIIAgQIECBAgAABAi0JCBAB0tJWchoCBAgQIECAAAECmwsIEAGy+S5xBAECBAgQIECAAIGWBASIAGlpKzkNAQIECBAgQIAAgc0FBIgA2XyXOIIAAQIECBAgQIBASwKDCZDbb789nXPOOSO2888/Px08eDDt2LFjKmMNc+zYsZaonYYAAQIECBAgQIAAgUEESBUfBw4cSPv3709bt27NWnUBksXkIAIECBAgQIAAAQIzCfQ+QI4cOZJe+9rXpksuuSTt2rUrG0eAZFM5kAABAgQIECBAgEC2QO8D5K677ko33HDDCOQNb3jD6D9vuummtGfPng2RapgHH3wwG9OBBAgsRuB/f2/5H4X816dtWczFOysBAgQIEOiZwJYt3f6bubK6urq6SNP6vR+33XZb2r17d6qC5OUvf3l685vffNwdkW3btqXqbsnkn8OHDy9yes5NgECGwN4vbEk33rOScWQ3h+x/3LF08VkL/VTWzYUZlQABAgQILEBg+/btCzhr/ilDAmTy/R/79u1LO3fu3PAuSH0H5OjRo/lX40gCBBYi8NLPPJBu+Mry3o289oknp0seddJCrt1JCRAgQIBA3wROOeWUTi9p4QFSP4J19dVXr70BXYB0uuYGJzCzgACZmcwLCBAgQIDA0gr0PkCqx6r27t2bzj333NEdj2mPYE2ukDsgS7tnTWyAAgJkgIvukgkQIECgtwK9D5Bq5Q4dOjSKj1tuuWW0kPX7QTZaVQHS2z3vwgoUECAFLpopEyBAgACBKQKDCJAmqy9Amqh5DYHFCAiQxbg6KwECBAgQ6EJAgExRFyBdbEdjElhfQIDYGQQIECBAoD8CAkSA9Gc3u5LeCgiQ3i6tCyNAgACBAQoIEAEywG3vkksTECClrZj5EiBAgACB6QICRID4+CCw9AICZOmXyAQJECBAgEC2gAARINmbxYEEuhIQIF3JG5cAAQIECLQvIEAESPu7yhkJtCwgQFoGdToCBAgQINChgAARIB1uP0MTyBMQIHlOjiJAgAABAiUICBABUsI+NceBCwiQgW8Al0+AAAECvRIQIAKkVxvaxfRTQID0c11dFQECBAgMU0CACJBh7nxXXZSAAClquUyWAAECBAhsKCBABIgPEQJLLyBAln6JTJAAAQIECGQLCBABkr1ZHEigKwEB0pW8cQkQIECAQPsCAkSAtL+rnJFAywICpGVQpyNAgAABAh0KCBAB0uH2MzSBPAEBkufkKAIECBAgUIKAABEgJexTcxy4gAAZ+AZw+QQIECDQKwEBIkB6taFdTD8FBEg/19VVESBAgMAwBQSIABnmznfVRQkIkKKWy2QJECBAgMCGAgJEgPgQIbD0AgJk6ZfIBAkQIECAQLaAABEg2ZvFgQS6EhAgXckblwABAgQItC8gQARI+7vKGQm0LCBAWgZ1OgIECBAg0KGAABEgHW4/QxPIExAgeU6OIkCAAAECJQgIEAFSwj41x4ELCJCBbwCXT4AAAQK9EhAgAqRXG9rF9FNAgPRzXV0VAQIECAxTQIAIkGHufFddlIAAKWq5TJYAAQIECGwoIEAEiA8RAksvIECWfolMkAABAgQIZAsIEAGSvVkcSKArAQHSlbxxCRAgQIBA+wICRIC0v6uckUDLAgKkZVCnI0CAAAECHQoIEAHS4fYzNIE8AQGS5+QoAgQIECBQgoAAESAl7FNzHLiAABn4BnD5BAgQINArAQEiQHq1oV1MPwUESD/X1VURIECAwDAFBIgAGebOd9VFCQiQopbLZAkQIECAwIYCAkSA+BAhsPQCAmTpl8gECRAgQIBAtoAAESDZm8WBBLoSECBdyRuXAAECBAi0LyBABEj7u8oZCbQsIEBaBnU6AgQIECDQoYAAESAdbj9DE8gTECB5To4iQIAAAQIlCAgQAVLCPjXHgQsIkIFvAJdPgAABAr0SECACpFcb2sX0U0CA9HNdXRUBAgQIDFNAgAiQYe58V12UgAAparlMlgABAgQIbCggQASIDxECSy8gQJZ+iUyQAAECBAhkCwgQAZK9WRxIoCsBAdKVvHEJECBAgED7AgJEgLS/q5yRQMsCAqRlUKcjQIAAAQIdCggQAdLh9jM0gTwBAZLn5CgCBAgQIFCCgAARICXsU3McuIAAGfgGcPkECBAg0CsBASJAerWhXUw/BQRIP9fVVREgQIDAMAUEiAAZ5s531UUJCJCilstkCRAgQIDAhgICRID4ECGw9AICZOmXyAQJECBAgEC2gAARINmbxYEEuhIQIF3JG5cAAQIECLQvIEAESPu7yhkJtCwgQFoGdToCBAgQINChwCAC5ODBg+nCCy9cY77sssvS/v3709atW6fSr6ysjP7u6NGjHS6PoQkQqAQEiH1AgAABAgT6IzCIANm3b1/auXNn2rNnT/bKCZBsKgcSWLiAAFk4sQEIECBAgECYwGAC5Lzzzku7d+/OhhUg2VQOJLBwAQGycGIDECBAgACBMIHeB8iRI0fS3r1701vf+tYR6vnnn5+qR7J27NhxHPK2bdtSdezkn8OHD4cthoEIEFhfYO8XtqQb7/nhY5HL+Gf/446li89aXcapmRMBAgQIEFg6ge3bt3c6p5XV1dXQf7Wr+PjYxz6W/R6QY8eOdQpkcAIEUrr8zvvT27/8wNJSXH/2qenSR5+8tPMzMQIECBAgsEwC9ZNGXc0pPEAOHTqUrrjiinTVVVelXbt2Tb3uGkaAdLU1jEvgRwICxG4gQIAAAQL9ERAgU9ZSgPRnk7uS8gUESPlr6AoIECBAgEAt0PsAqd7Xcd99962956P6iVhf+9rXPILlY4BAQQICpKDFMlUCBAgQILCJwCACZPxN6Dm/A6QycwfExw6B5REQIMuzFmZCgAABAgTmFeh9gDQFEiBN5byOQPsCAqR9U2ckQIAAAQJdCQiQKfICpKstaVwCJwoIELuCAAECBAj0R0CACJD+7GZX0lsBAdLbpXVhBAgQIDBAAQEiQAa47V1yaQICpLQVM18CBAgQIDBdQIAIEB8fBJZeQIAs/RKZIAECBAgQyBYQIAIke7M4kEBXAgKkK3njEiBAgACB9gUEiABpf1c5I4GWBQRIy6BOR4AAAQIEOhQQIAKkw+1naAJ5AgIkz8lRBAgQIECgBAEBIkBK2KfmOHABATLwDeDyCRAgQKBXAgJEgPRqQ7uYfgoIkH6uq6siQIAAgWEKCBABMsyd76qLEhAgRS2XyRIgQIAAgQ0FBIgA8SFCYOkFBMjSL5EJEiBAgACBbAEBIkCyN4sDCXQlIEC6kjcuAQIECBBoX0CACJD2d5UzEmhZQIC0DOp0BAgQIECgQwEBIkA63H6GJpAnIEDynBxFgAABAgRKEBAgAqSEfWqOAxcQIAPfAC6fAAECBHolIEAESK82tIvpp4AA6ee6uioCBAgQGKaAABEgw9z5rrooAQFS1HKZLAECBAgQ2FBAgAgQHyIEll5AgCz9EpkgAQIECBDIFhAgAiR7sziQQFcCAqQreeMSIECAAIH2BQSIAGl/VzkjgZYFBEjLoE5HgAABAgQ6FBAgAqTD7WdoAnkCAiTPyVEECBAgQKAEAQEiQErYp+Y4cAEBMvAN4PIJECBAoFcCAkSA9GpDu5h+CgiQfq6rqyJAgACBYQoIEAEyzJ3vqosSECBFLZfJEiBAgACBDQUEiADxIUJg6QUEyNIvkQkSIECAAIFsAQEiQLI3iwMJdCUgQLqSNy4BAgQIEGhfQIAIkPZ3lTMSaFlAgLQM6nQECBAgQKBDAQEiQDrcfoYmkCcgQPKcHEWAAAECBEoQECACpIR9ao4DFxAgA98ALp8AAQIEeiUgQARIrza0i+mngADp57q6KgIECBAYpoAAESDD3PmuuigBAVLUcpksAQIECBDYUECACBAfIgSWXkCALP0SmSABAgQIEMgWECACJHuzOJBAVwICpCt54xIgQIAAgfYFBIgAaX9XOSOBlgUESMugTkeAAAECBDoUECACpMPtZ2gCeQICJM/JUQQIECBAoAQBASJAStin5jhwAQEy8A3g8gkQIECgVwICRID0akO7mH4KCJB+rqurIkCAAIFhCggQATLMne+qixIQIEUtl8kSIECAAIENBQSIAPEhQmDpBQTI0i+RCRIgQIAAgWwBASJAsjeLAwl0JSBAupI3LgECBAgQaF9AgAiQ9neVMxJoWUCAtAzqdAQIECBAoEMBASJAOtx+hiaQJyBA8pwcRYAAAQIEShAQIAKkhH1qjgMXECAD3wAunwABAgR6JSBABEivNrSL6aeAAOnnuroqAgQIEBimgAARIMPc+a66KAEBUtRymSwBAgQIENhQQIAIEB8iBJZeQIAs/RKZIAECBAgQyBYQIAIke7M4kEBXAgKkK3njEiBAgACB9gUEiABpf1c5I4GWBQRIy6BOR4AAAQIEOhQYVIAcOnQo7dmzJ1100UWj/9zoTw1z7NixDpfH0AQIVAICxD4gQIAAAQL9ERhUgBw8eDBdeOGF6aabbhIg/dnDrmQAAgJkAIvsEgkQIEBgMAKDCZC77ror3XDDDaOFPfvsswXIYLa4C+2DgADpwyq6BgIECBAg8EOBQQTIkSNH0t69e0ePXt16661p586dJwTItm3bUnXc5J/Dhw/bKwQIdCyw9wtb0o33rHQ8i+nD73/csXTxWavZ83vIkf+WfWw3B56cjm59ejdDD2jU93xjJX37geW+4Bf/VP6+PuX+T6aV1e8t9QUd3frvlnp+JkdgKALbt2/v9FJXVldX8z+7NZzqvn371qJj/P/f6HR1mR09erThqF5GgEBbAi/9zAPphq882NbpWj/PtU88OV3yqJOyz3vSt96VTvrOR7OPjz7wwYe+MD14xjOihx3ceP/16w+m/3zn8hbIf/zJk9J/Ofvk7HXZ8t1PpB/75tuzj48+8NjpT0s/eNil0cMajwCBdQROOeWUTl0WHiC33357OnDgQNq/f3/aunVrEiCdrrfBCTQSECCN2Bq/SIA0ppvphQJkJq65DxYgcxM6AYHWBHodIPWjV29961tPALvsssvWomQ9TXdAWttjTkRgbgEBMjfhTCcQIDNxNT5YgDSma/RCAdKIzYsILESg1wGynpg7IAvZR05KYKECAmShvCecXIDEeAuQGOd6FAES6200AhsJCJApOu6A+MAhsDwCAiR2LQRIjLcAiXEWILHORiOQIzC4AMlBqY4RILlSjiOweAEBsnjj8REESIy3AIlxFiCxzkYjkCMgQNwBydknjiHQqYAAieUXIDHeAiTGWYDEOhuNQI6AABEgOfvEMQQ6FRAgsfwCJMZbgMQ4C5BYZ6MRyBEQIAIkZ584hkCnAgIkll+AxHgLkBhnARLrbDQCOQICRIDk7BPHEOhUQIDE8guQGG8BEuMsQGKdjUYgR0CACJCcfeIYAp0KCJBYfgES4y1AYpwFSKyz0QjkCAgQAZKzTxxDoFMBARLLL0BivAVIjLMAiXU2GoEcAQEiQHL2iWMIdCogQGL5BUiMtwCJcRYgsc5GI5AjIEAESM4+cQyBTgUESCy/AInxFiAxzgIk1tloBHIEBIgAydknjiHQqYAAieUXIDHeAiTGWYDEOhuNQI6AABvut6UAACAASURBVBEgOfvEMQQ6FRAgsfwCJMZbgMQ4C5BYZ6MRyBEQIAIkZ584hkCnAgIkll+AxHgLkBhnARLrbDQCOQICRIDk7BPHEOhUQIDE8guQGG8BEuMsQGKdjUYgR0CACJCcfeIYAp0KCJBYfgES4y1AYpwFSKyz0QjkCAgQAZKzTxxDoFMBARLLL0BivAVIjLMAiXU2GoEcAQEiQHL2iWMIdCogQGL5BUiMtwCJcRYgsc5GI5AjIEAESM4+cQyBTgUESCy/AInxFiAxzgIk1tloBHIEBIgAydknjiHQqYAAieUXIDHeAiTGWYDEOhuNQI6AABEgOfvEMQQ6FRAgsfwCJMZbgMQ4C5BYZ6MRyBEQIAIkZ584hkCnAgIkll+AxHgLkBhnARLrbDQCOQICRIDk7BPHEOhUQIDE8guQGG8BEuMsQGKdjUYgR0CACJCcfeIYAp0KCJBYfgES4y1AYpwFSKyz0QjkCAgQAZKzTxxDoFMBARLLL0BivAVIjLMAiXU2GoEcAQEiQHL2iWMIdCogQGL5BUiMtwCJcRYgsc5GI5AjIEAESM4+cQyBTgUESCy/AInxFiAxzgIk1tloBHIEBIgAydknjiHQqYAAieUXIDHeAiTGWYDEOhuNQI6AABEgOfvEMQQ6FRAgsfwCJMZbgMQ4C5BYZ6MRyBEQIAIkZ584hkCnAgIkll+AxHgLkBhnARLrbDQCOQICRIDk7BPHEOhUQIDE8guQGG8BEuMsQGKdjUYgR0CACJCcfeIYAp0KCJBYfgES4y1AYpwFSKyz0QjkCAgQAZKzTxxDoFMBARLLL0BivAVIjLMAiXU2GoEcAQEiQHL2iWMIdCogQGL5BUiMtwCJcRYgsc5GI5AjIEAESM4+cQyBTgUESCy/AInxFiAxzgIk1tloBHIEBIgAydknjiHQqYAAieUXIDHeAiTGWYDEOhuNQI6AABEgOfvEMQQ6FRAgsfwCJMZbgMQ4C5BYZ6MRyBEQIAIkZ584hkCnAgIkll+AxHgLkBhnARLrbDQCOQICRIDk7BPHEOhUQIDE8guQGG8BEuMsQGKdjUYgR0CACJCcfeIYAp0KCJBYfgES4y1AYpwFSKyz0QjkCAgQAZKzTxxDoFMBARLLL0BivAVIjLMAiXU2GoEcAQEiQHL2iWMIdCogQGL5BUiMtwCJcRYgsc5GI5AjIEAESM4+cQyBTgUESCy/AInxFiAxzgIk1tloBHIEBIgAydknjiHQqYAAieUXIDHeAiTGWYDEOhuNQI6AABEgOfvEMQQ6FRAgsfwCJMZbgMQ4C5BYZ6MRyBEQIAIkZ584hkCnAgIkll+AxHgLkBhnARLrbDQCOQICRIDk7BPHEOhUQIDE8guQGG8BEuMsQGKdjUYgR0CACJCcfeIYAp0KCJBYfgES4y1AYpwFSKyz0QjkCAgQAZKzTxxDoFMBARLLL0BivAVIjLMAiXU2GoEcAQEiQHL2iWMIdCogQGL5BUiMtwCJcRYgsc5GI5AjMIgAOXToUNqzZ0+65ZZb0vnnn58OHjyYduzYsaHPysrK6O+PHj2a4+gYAgQWKCBAFoi7zqkFSIy3AIlxFiCxzkYjkCPQ+wA5cuRIeuMb35he8pKXjKJj3759I5crr7xSgOTsEMcQWAIBARK7CAIkxluAxDgLkFhnoxHIEeh9gEwi3H777enAgQNp//79aevWrVON3AHJ2T6OIRAjIEBinOtRBEiMtwCJcRYgsc5GI5AjMLgAqe6A7Ny5c/RI1kZ/BEjO9nEMgRgBARLjLEBinQVIrPex05+WfvCwS2MHNRoBAusKDCJA7rrrrnTBBRekO++8M910003rxse2bdtS9bjW5J/Dhw/bOgQIdCyw9wtb0o33/PB9Wcv4Z//jjqWLz1rNntq277w7PeTIx7OPjz7wvjNekI5ufXr0sIMb7z3fWEmXf27L0l738x++mq5//LHs+Z1y/yfTaffemH189IHfP/Up6XtnXhw97ODG+8r9KV33teXd19WC/F8/k7+vB7eAQRe8ffv2oJHWH2ZldXU1/1/tFqZavQH9Yx/7WPYjWMeO2aQtsDsFgbkELr/z/vT2Lz8w1zkW+eLrzz41Xfrok/OH+Kd3pJV/+Uj+8dFHPuJFafVf/WL0qIMb7+BXf5Au/tSJ3/haFog9j/yxdOOTpz+qPDnPle98PKV7rl+W6Z8wj9Uznp7SWZcv7fz6MrEv33cs7fzw95b2ch69bUu6+9+ftrTzG8rE6ieNurre8ACpfiLWFVdcka666qq0a9euqdddwwiQrraGcQn8SECABO8GARICLkBCmNcGESAx3gIkxrn0UXofINXjVx/4wAfS3r17R2vlDkjpW9b8hyggQIJXXYCEgAuQEGYBEsucBEgweKHD9T5A6ui48MILR0s06+8BcQek0J1t2r0SECDByylAQsAFSAizAIllFiDB3qUON4gAabI4HsFqouY1BBYjIEAW4zr1rAIkBFyAhDALkFhmARLsXepwAmTKygmQUre0efdRQIAEr6oACQEXICHMAiSWWYAEe5c6nAARIKXuXfMekIAACV5sARICLkBCmAVILLMACfYudTgBIkBK3bvmPSABARK82AIkBFyAhDALkFhmARLsXepwAkSAlLp3zXtAAgIkeLEFSAi4AAlhFiCxzAIk2LvU4QSIACl175r3gAQESPBiC5AQcAESwixAYpkFSLB3qcMJEAFS6t417wEJCJDgxRYgIeACJIRZgMQyC5Bg71KHEyACpNS9a94DEhAgwYstQELABUgIswCJZRYgwd6lDidABEipe9e8ByQgQIIXW4CEgAuQEGYBEsssQIK9Sx1OgAiQUveueQ9IQIAEL7YACQEXICHMAiSWWYAEe5c6nAARIKXuXfMekIAACV5sARICLkBCmAVILLMACfYudTgBIkBK3bvmPSABARK82AIkBFyAhDALkFhmARLsXepwAkSAlLp3zXtAAgIkeLEFSAi4AAlhFiCxzAIk2LvU4QSIACl175r3gAQESPBiC5AQcAESwixAYpkFSLB3qcMJEAFS6t417wEJCJDgxRYgIeACJIRZgMQyC5Bg71KHEyACpNS9a94DEhAgwYstQELABUgIswCJZRYgwd6lDidABEipe9e8ByQgQIIXW4CEgAuQEGYBEsssQIK9Sx1OgAiQUveueQ9IQIAEL7YACQEXICHMAiSWWYAEe5c6nAARIKXuXfMekIAACV5sARICLkBCmAVILLMACfYudTgBIkBK3bvmPSABARK82AIkBFyAhDALkFhmARLsXepwAkSAlLp3zXtAAgIkeLEFSAi4AAlhFiCxzAIk2LvU4QSIACl175r3gAQESPBiC5AQcAESwixAYpkFSLB3qcMJEAFS6t417wEJCJDgxRYgIeACJIRZgMQyC5Bg71KHEyACpNS9a94DEhAgwYstQELABUgIswCJZRYgwd6lDidABEipe9e8ByQgQIIXW4CEgAuQEGYBEsssQIK9Sx1OgAiQUveueQ9IQIAEL7YACQEXICHMAiSWWYAEe5c6nAARIKXuXfMekIAACV5sARICLkBCmAVILLMACfYudTgBIkBK3bvmPSABARK82AIkBFyAhDALkFhmARLsXepwAkSAlLp3zXtAAgIkeLEFSAi4AAlhFiCxzAIk2LvU4QSIACl175r3gAQESPBiC5AQcAESwixAYpkFSLB3qcMJEAFS6t417wEJCJDgxRYgIeACJIRZgMQyC5Bg71KHEyACpNS9a94DEhAgwYstQELABUgIswCJZRYgwd6lDidABEipe9e8ByQgQIIXW4CEgAuQEGYBEsssQIK9Sx1OgAiQUveueQ9IQIAEL7YACQEXICHMAiSWWYAEe5c6nAARIKXuXfMekIAACV5sARICLkBCmAVILLMACfYudTgBIkBK3bvmPSABARK82AIkBFyAhDALkFhmARLsXepwAkSAlLp3zXtAAgIkeLEFSAi4AAlhFiCxzAIk2LvU4QSIACl175r3gAQESPBiC5AQcAESwixAYpkFSLB3qcMJEAFS6t417wEJCJDgxRYgIeACJIRZgMQyC5Bg71KHEyACpNS9a94DEhAgwYstQELABUgIswCJZRYgwd6lDidABEipe9e8ByQgQIIXW4CEgAuQEGYBEsssQIK9Sx1OgAiQUveueQ9IQIAEL7YACQEXICHMAiSWWYAEe5c6nAARIKXuXfMekIAACV5sARICLkBCmAVILLMACfYudTgBIkBK3bvmPSABARK82AIkBFyAhDALkFhmARLsXepwAkSAlLp3zXtAAgIkeLEFSAi4AAlhFiCxzAIk2LvU4QSIACl175r3gAQESPBiC5AQcAESwixAYpkFSLB3qcMJEAFS6t417wEJCJDgxRYgIeACJIRZgMQyC5Bg71KHEyACpNS9a94DEhAgwYstQELABUgIswCJZRYgwd6lDidABEipe9e8ByQgQIIXW4CEgAuQEGYBEsssQIK9Sx1uEAFy++23p3POOWe0RmeffXa6+eab065duzZcsxrm2LFjpa6teRPojYAACV5KARICLkBCmAVILLMACfYudbjeB8ihQ4fS