From a44a6ffc21b0ffde5c2a847fd2288c49056dcb93 Mon Sep 17 00:00:00 2001 From: tanaikech Date: Mon, 24 Apr 2017 14:36:33 +0900 Subject: [PATCH] 1st commit --- LICENCE | 8 + README.md | 1453 +++++++++++++++++++++++++++++++++++++++ doc.go | 62 ++ ggsrun.go | 246 +++++++ handler.go | 131 ++++ init.go | 58 ++ materials.go | 341 +++++++++ oauth.go | 254 +++++++ readme_Flow_exe1.png | Bin 0 -> 82399 bytes readme_Flow_exe2.png | Bin 0 -> 51357 bytes readme_flow.png | Bin 0 -> 32646 bytes readme_sheet.png | Bin 0 -> 5854 bytes readme_sublimedemo.gif | Bin 0 -> 297780 bytes readme_terminaldemo.gif | Bin 0 -> 388881 bytes sender.go | 383 +++++++++++ server/server.gs | 225 ++++++ utl/converter.go | 232 +++++++ utl/fetcher.go | 65 ++ utl/googlemimetypes.go | 244 +++++++ utl/transfer.go | 641 +++++++++++++++++ 20 files changed, 4343 insertions(+) create mode 100644 LICENCE create mode 100644 README.md create mode 100644 doc.go create mode 100644 ggsrun.go create mode 100644 handler.go create mode 100644 init.go create mode 100644 materials.go create mode 100644 oauth.go create mode 100644 readme_Flow_exe1.png create mode 100644 readme_Flow_exe2.png create mode 100644 readme_flow.png create mode 100644 readme_sheet.png create mode 100644 readme_sublimedemo.gif create mode 100644 readme_terminaldemo.gif create mode 100644 sender.go create mode 100644 server/server.gs create mode 100644 utl/converter.go create mode 100644 utl/fetcher.go create mode 100644 utl/googlemimetypes.go create mode 100644 utl/transfer.go diff --git a/LICENCE b/LICENCE new file mode 100644 index 0000000..0f63eb9 --- /dev/null +++ b/LICENCE @@ -0,0 +1,8 @@ +The MIT License (MIT) +Copyright (c) 2017 Kanshi TANAIKE + +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..df66509 --- /dev/null +++ b/README.md @@ -0,0 +1,1453 @@ +ggsrun +===== + + +# Table of Contents +- [Overview](#Overview) +- [Description](#Description) +- [Demo](#Demo) +- [Google APIs](#Google APIs) + - Comparison for Each Command + - Execution Flow of Commands ``exe1``, ``exe2`` and ``webapps`` + - For High Security + - Installation Flow +- [How to Install](#How to Install) + - [Install Execution API](#Install Execution API) + - [Install Web Apps](#Install Web Apps) +- [How to Execute Google Apps Script Using ggsrun](#How to Execute Google Apps Script Using ggsrun) +- [Samples](#Samples) + - Executes GAS and Retrieves Result Values + - Executes GAS with Values and Retrieves Feedbacked Values + - For Debug + - Executes GAS with Values and Downloads File + - Executes Existing Functions on Project + - Download Files + - Upload Files + - Show File List + - Search Files +- [Applications](#Applications) + - For Sublime Text + - For CoffeeScript + - Create Triggers + - Link to Various Resources +- [Appendix](#Appendix) + - Scopes + - Format of Data to GAS + - Access Log + - Experiment +- [Q&A](#Q&A) +- [Licence](#Licence) +- [Author](#Author) +- [Update History](#Update History) + + +# Overview +This is a CLI tool to execute Google Apps Script (GAS) on a terminal. + + +# Description +Will you want to develop GAS on your local PC? Generally, when we develop GAS, we have to login to Google using own browser and develop it on the Script Editor. Recently, I have wanted to have more convenient local-environment for developing GAS. So I created this "ggsrun". The main work is to execute GAS on local terminal and retrieve the results from Google. + +Features of "ggsrun" are as follows. + +1. **[Develops GAS using your terminal and text editor which got accustomed to using.](#demoterminal)** + +2. **[Executes GAS by giving values to your script.](#givevalues)** + +3. **[Executes GAS made of CoffeeScript.](#coffee)** + +4. **[Downloads spreadsheet, document and presentation, while executes GAS, simultaneously.](#filedownload)** + +5. **[Creates, updates and backs up project with GAS.](#fileupdate)** + +6. **[Downloads files from Google Drive and Uploads files to Google Drive.](#fileupdown)** + +You can see the release page [here](https://github.com/tanaikech/ggsrun/releases). + + +# Demo +This demonstration retrieves data from spreadsheet as shown in an image as an array. You can see the cell data retrieved by giving the range data. + +![](readme_sheet.png) + +The sample script is as follows. + +~~~javascript +function work(range) { + var sheetid = '1zKYnvVAiwkzgWngAhaSGdKCf2EvFzwOpBgPRAZzsvtM'; + var ss = SpreadsheetApp.openById(sheetid); + var sheet = ss.getSheetByName("sheet1"); + var data = sheet.getRange(range).getValues(); + return data; +} + +function main(range) { + return work(range); +} +~~~ + +![](readme_terminaldemo.gif) + +[Also you can see a demo for Sublime Text using ggsrun.](#demosublime) + +--- + + +# Google APIs +ggsrun uses Execution API, Web Apps and Drive API on Google. + +1. **[Execution API](https://developers.google.com/apps-script/guides/rest/api)** : This can be used by the authorization process of OAuth2. So you can use under higher security. But there are some [limitations](https://developers.google.com/apps-script/guides/rest/api#limitations). + +2. **[Drive API](https://developers.google.com/drive/v3/web/about-sdk)** : This can be used for downloading and uploading files. + +3. **[Web Apps](https://developers.google.com/apps-script/guides/web)** : This can be used without the authorization process. So a password can be set for using the server. The install process is very simple. However, the security is much lower than that of Execution API. ggsrun has to setup the access to Web Apps as "Anyone, even anonymous". There are no limitations. (I haven't confirmed it yet.) (I don't know whether this can be called an API.) + +And also ggsrun uses a server script (ggsrunif) which is deployed at Google side as an interface for executing GAS script. **This server script is provided as a GAS library. Using APIs and the server, there are 4 methods for executing GAS script.** These methods are provided as 4 commands. The comparison for each command is as follows. + +## Comparison for Each Command +Each command is used as ``$ ggsrun [Command] [Options]``. + +| | Command | Execution method | Security | Response speed | Access token | Server | Authorization
for Google Services | Script | Available scripts | Call function | Limitation | Error Message | Library\*6 | +|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| +| 1 | exe1
(e1) | Execution API | High | Slow\*1 | Yes | No | No | Upload
& Save to project
| Only standalone script | Functions in project | [Some limitations](https://developers.google.com/apps-script/guides/rest/api) | Error message
Line number
\*5 | Yes | +| 2 | exe1
(e1)
``-f`` | Execution API | High | Fast | Yes | No | No | No upload
& Only execute function on project | Standalone and Container-bound Script | Functions in project | [Some limitations](https://developers.google.com/apps-script/guides/rest/api) | Error message
Line number
\*5 | Yes | +| 3 | exe2
(e2) | Execution API | High | Fast | Yes | Yes | No | Upload
& No save | Standalone and Container-bound Script | Functions in execution script | [Some limitations](https://developers.google.com/apps-script/guides/rest/api) | Error message\*5 | No | +| 4 | webapps
(w) | Web Apps | Low\*2 | Fast | No\*2 | Yes | Yes\*3 | Upload
& No save | Standalone and Container-bound Script | Functions in execution script | \*4 | Error message\*5 | No | + +* \*1: At execution of GAS using "webapps", project is updated. So at first, project is downloaded and the project is backed up, your script adds to the project, the project is uploaded with existing project, and project is updated. Therefore, the speed becomes slow. +* \*2: Execution of GAS using "webapps" is not required authorization. +* \*3: [If the script includes API that the authorization is necessary, it has to be authorized for script on script editor.](https://developers.google.com/apps-script/guides/services/authorization) +* \*4: I have never confirmed about the limitation for Web Apps yet. +* \*5: For "exe1", when an error occurs, you can see the error message and line number at error. For "exe2" and "webapps", when an error occurs, you can see the error message. On the other hand, line number at error is NOT shown because the script is sent as one line. +* \*6: The server script is installed as a library. Here, whether libraries except for the server can be used. + +Please select one from above 4 commands to use ggsrun. I think that ``exe2`` is high security, high speed, easy to use, and it has some specialized functions. So I always use command ``exe2``. + + +## Execution Flow of Commands ``exe1``, ``exe2`` and ``webapps`` +Here, I explain the flow difference of ``exe1`` and ``exe2`` using flow of each command. The differences of functions have already been explained [above](#comparison). + + +### Flow of ``exe1`` +![](readme_Flow_exe1.png) + +1. Prepare sample script of GAS. For example, it's ``sample.gs``. +1. Execute ggsrun using command ``exe1``. +1. [URL request] At first, the project, which was enabled Execution API, on Google Drive is downloaded for the back up. +1. Add ``sample.gs`` to the downloaded project as a script with name of ``ggsrun.gs``. +1. [URL request] The project with ``sample.gs`` is uploaded and overwrites the project on Google. +1. [URL request] **Using Execution API, directly execute the function ``main()``** which is a default executing function and retrieves response. Of course, you can choose the function using option ``-f``. + +In this case, there are 3 times URL requests. + +When I executed above flow for the first time, I felt the low speed and high API cost. So in order to compare them, I made ``exe2`` and ``webapps``. + +### Flow of ``exe2`` and ``webapps`` +![](readme_Flow_exe2.png) + +The flow of ``exe2`` and ``webapps`` is the same. + +1. Prepare sample script of GAS. For example, it's ``sample.gs``. +1. Execute ggsrun using command ``exe2`` or ``webapps``. +1. [URL request] ``sample.gs`` is uploaded as a value, it executes the server function ``ggsrunif.ExecutionApi()`` for ``exe2`` or ``doPost()`` for ``webapps`` using Execution API. +1. In the server function, **Using ``(0,eval)(value)``, the function ``main()`` of the uploaded script is executed.** And then, retrieves the response in this one request. + +In this case, there is only 1 URL request. + +**Please don't worry. When you saw the flow of ``exe2``, if you don't want to use the server, you can use ggsrun using only ``exe1``. ``exe1`` doesn't required the server. And if you don't use ``doPost()`` and don't deploy web apps, ``webapps`` cannot be used by yourself and others.** + +The time due to API costs of ``exe2`` is shorter than that of ``exe1``. When the process time of script is small, you will be able to feel the shorter time by the low API cost. But, when the execution time of GAS script is close to the limitation time (6 min), the time due to API costs might not feel. + +## For High Security +Because ``(0,eval)(value)`` is used for the commands ``exe2`` and ``webapps``, I recommends ``exe1`` which has to authorize OAuth2. However, there are some functions which can be executed by only ``webapps``. Therefore, it requires user's careful-judgment. + +When you use ``exe1`` and ``exe2``, please don't public the client ID, client secret, refresh token and access token for the project with server. When you use ``webapps``, please don't public the URL of web application. + + +## Installation Flow +This is an installation flow for Execution API which is used for command ``exe1`` and ``exe2``, and Web Apps which is used command ``webapps``. Don't worry. These installations are not difficult. The details are [How to install Execution API](#installexecutionapi) and [How to install Web Apps](#installwebapps). + +![](readme_flow.png) + +If you want to trial test using very simple installation, please check [Trial Usage](#Trial Usage). + + + +# How to Install +Two important scripts are necessary to use ggsrun. + +##### 1. Client script which is run on local PC + +##### 2. Server script which is run on Google + +## 1. Get ggsrun Client (at local PC side) +Download an executable file of ggsrun from [the release page](https://github.com/tanaikech/ggsrun/releases) and import to a directory with path. + +or + +Use go get. + +~~~bash +$ go get -u github.com/tanaikech/ggsrun +~~~ + +## 2. Setup ggsrun Server (at Google side) +This is a common setup for Execution API and Web Apps. + +#### 1. Create project +On Google Drive, a project can be created as a standalone script or a container-bound script. The project can have several script in it. Please create a project, and then open the Script Editor. If a standalone script is created, you can use all functions on ggsrun. If a container-bound script is created, you cannot use command ``exe1``. + +- Open the project. And please operate follows using click. +- -> File +- -> Project properties +- -> **Get Script ID** + +#### 2. Install server +**ggsrun server is provided as a GAS library.** This can be used for a standalone script and a container-bound script. [If you want to read about Libraries, please check this.](https://developers.google.com/apps-script/guide_libraries). + +- Open the project. And please operate follows by click. +- -> Resource +- -> Library +- -> Input Script ID of "**``115-19njNHlbT-NI0hMPDnVO1sdrw2tJKCAJgOTIAPbi_jq3tOo4lVRov``**" to text box +- -> Add library +- -> Please select latest version +- -> Developer mode ON (If you don't want to use latest version, please select others.) +- -> Identifier is "**``ggsrunif``**". (This is a important point) + + +## Install Execution API +By installing this, you can use command ``exe1`` and ``exe2``. To use command ``exe1``, the project installed server has to be a standalone script. For the command ``exe2``, you can use a standalone script and a container-bound script. + +#### 1. [Deploy API executable](https://developers.google.com/apps-script/guides/rest/api) +1. On the Script Editor + - -> Publish + - -> Deploy as API executable + - -> Choose latest version and me as access + - **Ignore Current API ID** + + +#### 2. Enable APIs (Execution API and Drive API) +1. On the Script Editor + - -> Resources + - -> Cloud Platform Project + - -> Click "Projects currently associated with this script" +2. On the Console Project + - Library at left side + - -> Search "execution api", Click it + - -> **Enable "Google Apps Script Execution API"** + - Library at left side + - -> Search "drive api", Click it + - -> **Enable "Google Drive API"** + +#### 3. Get Client ID, Client Secret +1. On the Console Project + - Authentication information at left side + - -> Create a valid Client ID as OAyth client ID + - -> Choose **etc** + - -> Input Name (This is a name you want.) + - -> done + - -> Download a JSON file with Client ID and Client Secret as **``client_secret.json``** using download button. Please rename the file name to **``client_secret.json``**. + +#### 4. Create configure file (**``ggsrun.cfg``**) +1. Please run ggsrun with ``auth`` command on your terminal (and/or command prompt) as follows. At this time, ggsrun has to be run at the directory with ``client_secret.json``. + +``` +$ ggsrun auth +``` +- When above is run, your browser is launched and waits for login to Google. +- Please login to Google. +- [Authorization for Google Services](https://developers.google.com/apps-script/guides/services/authorization) is launched. Please authorize it. +- The authorization code can be retrieved automatically. And ``Done.`` is displayed on your terminal. + - If your browser isn't launched or spends for 30 seconds from the wait of authorization, it becomes the input work queue. This is a manual mode. Please copy displayed URL and paste it to your browser, and login to Google. A **code** is displayed on the browser. Please copy it and paste it to your terminal during the input work queue. If you cannot find the code on your browser, please check the URL of your browser. +- When ``Done`` is displayed on your terminal, the authorization is completed and ``ggsrun.cfg`` is created on a directory you currently stay. +- ``ggsrun.cfg`` includes client id, client secret, access token, refresh token, scopes and so on. +- At the default, there are 6 scopes. If you want to change the scopes, please modify ``ggsrun.cfg`` and run ``$ ggsrun auth``. +- You notice that ``script_id`` has no data. Don't worry. This is explained below. + +#### 5. Run ggsrun +Please create ``sample.gs`` with following script. + +``` +function main(){return Beacon()} +``` +1. **Execution function in the GAS file is ``main()``. This is fixed.** Although you can use other name's functions in the GAS file like [this sample](#coffee), the first execution function is ``main()``. +2. Here, Script ID is required. The Script ID is Script ID of project installed server. You can get as follows. + - Open Script Editor of the script with server + - -> File + - -> Object property + - -> Script ID +3. Execute ``sample.gs`` as follows. After ggsrun was run using option ``-i [Script ID]``, the script ID is saved in ``ggsrun.cfg``. So after this, the option ``-i`` for running ggsrun is NOT required. ``-j`` displays JSON result by parsing. + +``` +$ ggsrun e2 -s sample.gs -i [Script ID] -j +``` + +If following result is shown, installing ggsrun is finished. Enjoy developing GAS! + +~~~json +{ + "result": "This is a server for ggsrun. Version is 1.0.0. Autor is https://github.com/tanaikech .", + "GoogleElapsedTime": 0.001, + "TotalElapsedTime": 1.416, + "ScriptDate": "2017-01-01_00:00:00_GMT", + "API": "Execution API with server", + "message": [ + "'main()' in the script was run using ggsrun server. Server function is 'ggsrunif.ExecutionApi()'." + ] +} +~~~ + +### If an Error Occurred at First Run +If a following error occurs, + +``` +$ ./ggsrun.exe e2 -s sample.gs +Error: Status Code: 404. +{ + "error": { + "code": 404, + "message": "Requested entity was not found.", + "status": "NOT_FOUND" + } +} +``` +please confirm following settings. + +- Whether Execution API at [Google API Console](https://console.developers.google.com/) is enable. +- Whether for the project installed ggsrun server, API executable has been deployed as latest version. +- **After deployed API executable, each script in the project has been saved by the save button. This is important point!** + +### About Timeout of Execution +Now the script runtime is 6 min/execution at [Google](https://developers.google.com/apps-script/guides/services/quotas). By this, the current timeout of request for sending GAS script is 370 seconds. Alto this condition is the same to Web Apps. + +### Authorization for Google Services +When you use GAS, you have ever seen [a message of "Authorization required"](https://developers.google.com/apps-script/guides/services/authorization). When you execute GAS using ggsrun, such authorization message is displayed as an error message. + +**If you want to use spreadsheet and other Google APIs in Google Apps Script, please do authorization for each API on GAS script editor, before run ggsrun. When the authorization error occurs by running ggsrun client, check your GAS script and do authorization of API.** + +### Help +#### Command ``exe1`` +~~~ +$ ggsrun e1 -help +NAME: + ggsrun.exe exe1 - Updates project and Executes the function in the project. + +USAGE: + ggsrun.exe exe1 [command options] [arguments...] + +DESCRIPTION: + In this mode, an access token is required. + +OPTIONS: + --scriptid value, -i value Script ID of project on Google Drive + --scriptfile value, -s value GAS file (.gs, .gas, .js, .coffee) on local PC + --function value, -f value Function name which is executed. Default is 'main'. + --value value, -v value Give a value to the function which is executed. + --backup, -b Backup project with script ID you set as a file. + --onlyresult, -r Display only 'result' in JSON results + --jsonparser, -j Display results by JSON parser +~~~ +#### Command ``exe2`` +~~~ +$ ggsrun e2 -help +NAME: + ggsrun.exe exe2 - Uploads GAS and Executes the script using Execution API. + +USAGE: + ggsrun.exe exe2 [command options] [arguments...] + +DESCRIPTION: + In this mode, an access token is required. + +OPTIONS: + --scriptid value, -i value Script ID of project on Google Drive + --scriptfile value, -s value GAS file (.gs, .gas, .js, .coffee) on local PC + --function value, -f value Function name of server for executing GAS. Default is 'ggsrunif.ExecutionApi'. If you change the server, use this. + --value value, -v value Give a value to the function of GAS script which is executed. + --stringscript value, --ss value GAS script as strings. + --foldertree, -t Display a folder tree on Google Drive as an array. + --convert, --conv [Experiment] Download file using byte slice data. Use with '-v [File ID]'. + --log, -l Record access log. + --onlyresult, -r Display only 'result' in JSON results + --jsonparser, -j Display results by JSON parser +~~~ + +--- + + +## Install Web Apps +By installing this, you can use command ``webapps``. + +For the command ``webapps``, the authorization is NOT required. Web Apps is used for it. You may have already use it as ``doGet(e)`` and ``doPost(e)``. I applied this to ggsrun. + +**The project which was installed ggsrun server can be used both Execution API and Web Apps. So following flow can be accommodated to the project created at above section.** + +#### 1. [Deploy Web Apps](https://developers.google.com/apps-script/guides/web) +* Copy the following script and paste it to the project with server on Script Editor. This ``doPost()`` is executed. ``ggsrunif`` is the library of server. + +``` +function doPost(e) {return ggsrunif.WebApps(e, "password")} +``` +* ``password`` is used for using Web Apps at the server. You can select the password freely. In order to improve security even a little, it was introduced. +* On the Script Editor + - File + - -> Manage Versions + - -> Save New Version + - Publish + - -> Deploy as Web App + - -> At Execute the app as, select **"your account"** + - -> At Who has access to the app, select **"Anyone, even anonymous"** + - -> Click "Deploy" + - -> Copy **"Current web app URL"** + - -> Click "OK" + +#### 2. Run ggsrun +Please create ``sample.gs`` with following script. + +``` +function main(){return Beacon()} +``` +1. **Execution function in the GAS file is ``main()``. This is fixed.** Although you can use other name's functions in the GAS file like [this sample](#coffee), the first execution function is ``main()``. +2. Confirm URL of Web Apps. URL is ``https://script.google.com/macros/s/#####/exec``. +3. Execute ``sample.gs``. + +``` +$ ggsrun w -s sample.gs -p password -u https://script.google.com/macros/s/#####/exec -j +``` +If following result is shown when you run above, install of ggsrun for Web Apps is finished. Enjoy developing GAS! + +~~~json +{ + "result": "This is a server for ggsrun. Version is 1.0.0. Autor is https://github.com/tanaikech .", + "GoogleElapsedTime": 0.15, + "TotalElapsedTime": 1.945, + "ScriptDate": "2017-01-01_00:00:00_GMT", + "API": "Web Apps with server" +} +~~~ + +### Help +~~~ +$ ggsrun w --help +NAME: + ggsrun.exe webapps - Uploads GAS and Executes the script without OAuth using Web Apps. + +USAGE: + ggsrun.exe webapps [command options] [arguments...] + +DESCRIPTION: + In this mode, an access token is NOT required. + +OPTIONS: + --url value, -u value URL for using Web Apps. + --scriptfile value, -s value GAS file (.gs, .gas, .js, .coffee) on local PC + --value value, -v value Give a value to the function of GAS script which is executed. + --password value, -p value Password to use Web Apps (if you have set) + --log, -l Not record access log. No this option means 'Record log'. + --onlyresult, -r Display only 'result' in JSON results + --jsonparser, -j Display results by JSON parser +~~~ + +--- + + +# How to Execute Google Apps Script Using ggsrun +When you have the configure file ``ggsrun.cfg``, you can execute GAS. If you cannot find it, please download ``client_secret.json`` and run + +``` +$ ggsrun auth +``` + +By this, ``ggsrun.cfg`` is created on your working directory. + +In the case of using Execution API, + +~~~bash +$ ggsrun e1 -s sample.gs +~~~ + +If you want to execute CoffeeScript, although you can do it changing from ``sample.gs`` to ``sample.coffee``, please read the section of [CoffeeScript](#CoffeeScript). If you want to execute a function except for ``main()`` of default, you can use an option like ``-f foo``. This command ``exe1`` can be used to execute a function on project. + +~~~bash +$ ggsrun e1 -f foo +~~~ + +~~~bash +$ ggsrun e2 -s sample.gs +~~~ + +At ``e2``, you cannot select the executing function except for ``main()`` of default. + +``e1``, ``e2`` and ``-s`` mean using Execution API and GAS script file name, respectively. Sample codes which are shown here will be used Execution API. At this time, the executing function is ``main()``, which is a default, in the script. + +In the case of using Web Apps, + +~~~bash +$ ggsrun w -s sample.gs -p password -u [ WebApps URL ] +~~~ + +``w`` and ``-p`` mean using Web Apps and password you set at the server side, respectively. Using ``-u`` it imports Web Apps URL like ``-u https://script.google.com/macros/s/#####/exec``. + +---- + + +# Samples +Here, it introduces some samples for using ggsrun. Following samples are supposed that command ``exe2`` is used. If you want to use ``exe1`` and ``webbapps``, please change from ``e2`` to ``e1`` and ``w``. Basically usage is the same for all. + +## 1. Executes GAS and Retrieves Result Values +This may be most popular usage for this tool. + +**You can retrieve the results of script using ``return`` in function ``main()``.** Although you can include various name's functions in your script, the function which firstly run is ``main()``. + +**Script :** sample.gs + +~~~javascript +function main() { + return 1 + 1; +} +~~~ + +**Run :** + +~~~bash +$ ggsrun e2 -s sample.gs -j +~~~ + +**Execution function in the GAS file is ``main()``. This is fixed.** Although you can use other name's functions in the GAS file, the first execution function is ``main()``. + +Following results are output. The result is output as JSON. + +~~~json +{ + "result": 2, + "GoogleElapsedTime": 0.001, + "TotalElapsedTime": 1.309, + "ScriptDate": "2017-01-01_00:00:00_GMT", + "API": "Execution API with server", + "message": [ + "'main()' in the script was run using ggsrun server. Server function is 'ggsrunif.ExecutionApi()'." + ] +} +~~~ + + - ``"result"`` is the result returned from ``main()`` function. + - ``"GoogleElapsedTime"`` is the elapsed time on Google. The unit is second. + - ``"TotalElapsedTime"`` is the total elapsed time. The unit is second. + - ``"ScriptDate"`` is the executed time of script. This is also used for a log saving on Google, if option ``-l`` is used. + - ``"API"`` is API you used. + - ``"message"`` is included executed function on Google, retrieving access token and error messages. + +If you want to get only result, you can run using option ``-r``. + +~~~bash +$ ggsrun e2 -r -s sample.gs + +>>> 2 +~~~ + +## 2. Executes GAS with Values and Retrieves Feedbacked Values +### 1. Gives a number and executes GAS +At the current version, the number of values which can give to function is only 1. So if you want to give several values to function, please use array and JSON. + +**Script :** sample.gs + +~~~javascript +function main(values) { + return values + 1; +} +~~~ + +**Run :** + +~~~bash +$ ggsrun e2 -r -s sample.gs -v 1 +~~~ + +**Result :** + +~~~ +2 +~~~ + +### 2. Gives a String and Executes GAS +If you want to use double quotations and single quotations, they have to be escaped like ``\"`` and ``\'``. + +**Script :** sample.gs + +~~~javascript +function main(values) { + return values + "fuga"; +} +~~~ + +**Run : Pattern 1** + +~~~bash +$ ggsrun e2 -r -s sample.gs -v hoge +~~~ + +**Run : Pattern 2** + +~~~bash +$ ggsrun e2 -r -s sample.gs -v "hoge" +~~~ + +**Run : Pattern 3** + +~~~bash +$ ggsrun e2 -r -s sample.gs -v 'hoge' +~~~ + +**Result :** + +~~~ +"hogefuga" +~~~ + +### 3. Gives an Array and Executes GAS +Using an array, you can give some strings and numbers. **For array, space cannot be used. And single and double quotations have to be escaped. When you send a script and data, if an error occurred, please check the strings which should be escaped. It may lead to the solution of errors.** + +**Script :** sample.gs + +~~~javascript +function main(ar) { + ar.push("fuga"); + return ar; +} +~~~ + +**Run :** + +~~~bash +$ ggsrun e2 -r -s sample.gs -v [123,\"hoge\"] +~~~ + +**Result :** + +~~~json +[123,"hoge","fuga"] +~~~ + +When you use option ``-j``, the result is parsed with indent like below. + +~~~bash +$ ggsrun e2 -j -r -s sample.gs -v [123,\"hoge\"] +~~~ + +~~~json +[ + 123, + "hoge", + "fuga" +] +~~~ + +### 4. Gives JSON and Executes GAS +Using an array, you can give some strings and numbers. For JSON, also spaces cannot be used. + +**Script :** sample.gs + +~~~javascript +function main(jdata) { + jdata.fuga = "hoge"; + return jdata; +} +~~~ + +**Run :** + +~~~bash +$ ggsrun e2 -j -r -s sample.gs -v {\"hoge\":\"fuga\"\,\"foo\":123} +~~~ + +In this case, spaces cannot be used, and a comma has to be escaped like ``\,``. If you want to use some spaces and not to use ``\,``, + +~~~bash +$ ggsrun e2 -j -r -s sample.gs -v "{\"hoge\":\"fuga\", \"foo\":123}" +~~~ + +Please use ``\"`` for the JSON keys. + +**Result :** + +~~~json +{ + "foo": 123, + "fuga": "hoge", + "hoge": "fuga" +} +~~~ + +## 3. For Debug +You know ``Logger.log()`` can be used for a simple debug in GAS. In the of ggsrun, when ``Logger.log()`` is used in a script, the result of it cannot be seen, because the log cannot be output by API. So I prepared a function instead of ``Logger.log()`` for ggsrun. That is ``Log()``. You can use it in your GAS script for using ggsrun. The sample script is as follows. + +**Script :** sample.gs + +~~~javascript +function main() { + var n = 10; + var f1 = 1; + var f2 = 0; + var result = [[1]]; + for(var i = 0; i < n - 1; i++) { + var temp = f1; + f1 += f2; + f2 = temp; + + if (f1 % 3 == 0) { + Log(f1); // Here, output log + } + + result[i + 1] = [f1]; + } + return result; +} +~~~ + +**Run :** + +~~~bash +$ ggsrun e2 -s sample.gs +~~~ + +~~~json +{ + "result":[[1],[1],[2],[3],[5],[8],[13],[21],[34],[55]], + "logger":[3,21], + "GoogleElapsedTime":0.002, + "TotalElapsedTime":1.397, + "ScriptDate":"2017-04-10_01:27:51_GMT", + "API":"Execution API with server", + "message":["'main()' in the script was run using ggsrun server. Server function is 'ggsrunif.ExecutionApi()'."] +} +~~~ + +You can retrieve logs as ``logger``. If you use option ``-r``, only result is displayed and log is NOT displayed. You can use this for the simple debug. + +For "exe1", when an error occurs, you can see the error message and line number at error. For "exe2" and "webapps", when an error occurs, you can see the error message. On the other hand, line number at error is NOT shown because the script is sent as one line. + +When a result with error of "exe1" is below. You can see various error messages. + +~~~json +{ + "result": ###, + "TotalElapsedTime": 1.0, + "API": "Execution API without server", + "message": [ + "{code: #, message: ReferenceError, function: test, linenumber: #}", + "{detailmessage: ## is not defined.}", + "Function 'test()' was run." + ] +} +~~~ + +**So I always create GAS script using the command "exe2". When an error occurred, I debug the script using the command "exe1" and the method ``Log()``. By this, the developing efficiency becomes high.** + +## 4. Executes GAS with Values and Downloads File +At command ``exe2``, you can execute script and download file, simultaneously. So you can download file using ID created in the script. This cannot be used for ``exe1`` and ``webapps``. + +**Script :** sample.gs + +~~~javascript +function main(values) { + var r = values + 1; + return {res: r, fileid: '###', extension: 'pdf'}; +} +~~~ + +**Run :** + +~~~bash +$ ggsrun e2 -s sample.gs -v 1 -j +~~~ + +**Result :** + +~~~json +{ + "result": { + "res": 2 + }, + "GoogleElapsedTime": 0.001, + "TotalElapsedTime": 1.31, + "ScriptDate": "2017-01-01_00:00:00_GMT", + "API": "Execution API with server", + "message": [ + "File was downloaded as 'filename.pdf'.", + "'main()' in the script was run using ggsrun server. Server function is 'ggsrunif.ExecutionApi()'." + ] +} +~~~ + +By using ``{res: r, fileid: '###', extension: 'pdf'}`` as a return, a file can be downloaded, simultaneously. For ``res``, you can choose freely. But both ``fileid`` and ``extension`` are the reserved words. + +## 5. Executes Existing Functions on Project +Of course, ggsrun can execute a function on project. In this case, ``exe1`` is used. Also you can use ``-v`` for the function. + +**Function on project :** + +It supposes that this function is already existing on the project with server. + +~~~javascript +function foo(values) { + return values + 1; +} +~~~ + +**Run :** + +~~~bash +$ ggsrun e1 -f foo -v 1 -j +~~~ + +**Result :** + +~~~json +{ + "result": 2, + "TotalElapsedTime": 1.214, + "API": "Execution API without server", + "message": [ + "Function 'foo()' was run." + ] +} +~~~ + +``GoogleElapsedTime`` cannot output in this mode, because this mode doesn't use server. + +## 6. Download Files +ggsrun can download files from Google Drive by file ID and file name. The files also include GAS projects and scripts. + +**Run :** + +~~~bash +$ ggsrun d -f filename +~~~ + +~~~bash +$ ggsrun d -i fileid +~~~ + +If you want to convert and download files, you can use an option ``-e [extension]``. In the case of conversion from Google Docs to pdf file, + +~~~bash +$ ggsrun d -f filename -e pdf +~~~ + +You can convert only from Google Docs Files (spreadsheet, slide, documentation and so on). For example, you cannot convert image files and text data. + +Here, I could notice that the container-bound scripts can be downloaded! + +### Help +~~~ +$ ggsrun d -h +NAME: + ggsrun.exe download - Downloads files from Google Drive. + +USAGE: + ggsrun.exe download [command options] [arguments...] + +DESCRIPTION: + In this mode, an access token is required. + +OPTIONS: + --fileid value, -i value File ID on Google Drive + --filename value, -f value File Name on Google Drive + --extension value, -e value Extension (File format of downloaded file) + --rawdata, -r Save a project with GAS scripts as raw data (JSON data). + --jsonparser, -j Display results by JSON parser +~~~ + +## 7. Upload Files +ggsrun can upload local files to Google Drive. The files also include GAS projects and scripts. + +**Run :** Uploads files except for scripts + +~~~bash +$ ggsrun u -f filename +~~~ + +At this time, you can upload files to the specific folder using option ``-p [parent folder ID]``. When Microsoft Word, Excel and Powerpoint files are uploaded, they are automatically converted to Google Docs. If you don't want to convert them, please use option ``--nc``. + +**Run :** Uploads scripts + +This is not the update. This is uploaded a new file to Google Drive. + +~~~bash +$ ggsrun u -f [script filename .gs, .gas, .js] +~~~ + +Files upload and convert to GAS. If you want to create a project using several scripts and HTMLs, please use as follows. + +~~~bash +$ ggsrun u --pn [project name] -f script1.gs,script2.gs,index.html +~~~ + +These files are uploaded and converted to a project with the project name. When you open the created project, you can see these files in the project. The order of files is the same to the order when was uploaded. + +### Help +~~~ +$ ggsrun u -h +NAME: + ggsrun.exe upload - Uploads files to Google Drive. + +USAGE: + ggsrun.exe upload [command options] [arguments...] + +DESCRIPTION: + In this mode, an access token is required. + +OPTIONS: + --filename value, -f value File Name on local PC + --parentfolderid value, -p value Folder ID of parent folder on Google Drive + --projectname value, --pn value Upload several GAS scripts as a project. + --noconvert, --nc If you don't want to convert file to Google Apps format. + --jsonparser, -j Display results by JSON parser +~~~ + +## 8. Show File List +ggsrun can retrieve file list on Google Drive. The list also includes folders. + +**Run :** + +~~~bash +$ ggsrun ls -j +~~~ + +**Result :** + +In the case of ``ggsrun ls -j``, a statistical table is retrieved. But in the message, it shows ``If you want a file list, please use option '-s' or '-f'. The file name is automatically given.``. Using ``ggsrun ls -s -j``, file list is displayed to standard output. Using ``ggsrun ls -s -f``, file list is output to a file. + +~~~json +{ + "message": [ + "Total: 20, File: 15, Folder: 5", + "If you want a file list, please use option '-s' or '-f'. The file name is automatically given." + ] +} +~~~ + +### Help + +~~~ +$ ggsrun ls -h +NAME: + ggsrun.exe filelist - Outputs a file list on Google Drive. + +USAGE: + ggsrun.exe filelist [command options] [arguments...] + +DESCRIPTION: + In this mode, an access token is required. + +OPTIONS: + --searchbyname value, --sn value Search file using File Name. Output File ID. + --searchbyid value, --si value Search file using File ID. Output File Name. + --stdout, -s Output all file list to standard output. + --file, -f Output all file list to a JSON file. + --jsonparser, -j Display results by JSON parser +~~~ + + +## 9. Search Files +ggsrun can search files on Google Drive. + +**Run :** + +~~~bash +$ ggsrun ls -sn [file name] -j +~~~ + +~~~bash +$ ggsrun ls -si [file id] -j +~~~ + +**Result :** + +~~~json +{ + Name: "[file name]", + ID: "[file id]", + ModifiedTime: "2017-01-01T00:00:00.000Z", + URL: "https://docs.google.com/spreadsheets/d/#####/edit?usp=drivesdk" +} +~~~ + +Result includes file name, file id, modified time and URL. + +--- + +# Applications + +## 1. For Sublime Text +ggsrun can be also used as a builder for Sublime Text. Recently I had wished if GAS written by CoffeeScript could be built on Sublime Text. This is my large motivation for creating ggsrun. Now this was achieved. :) + +![](readme_sublimedemo.gif) + +Sample script is CoffeeScript as follows. The spreadsheet is the same to that of [terminal demo](#demoterminal). The terminal demo is not CoffeeScript. + +#### Script : + +~~~coffeescript +work = (range) -> + sheetid = '1zKYnvVAiwkzgWngAhaSGdKCf2EvFzwOpBgPRAZzsvtM' + ss = SpreadsheetApp.openById(sheetid) + sheet = ss.getSheetByName("sheet1") + sheet.getRange(range).getValues() + +main = () -> + range = 'a1:c5' + work(range) +~~~ + +``GAS.sublime-build`` is below. At this time, the current working directory is the same to source file. Please put ``ggsrun.cfg`` in the same directory with the source files. And in the ``GAS.sublime-build``, the path for ggsrun may be needed. Also ggsrun may be able to be used for other text editors. Please enjoy developing GAS using the editor you love! + +If you could confirm that ggsrun can be used on other editor, I'm glad if you tell me. + +#### ``GAS.sublime-build`` : +Since the file format is evaluated by the extension, GAS and CoffeeScript can be built by only this ``GAS.sublime-build``. + +~~~json +{ + "cmd": [ + "ggsrun", + "exe2", + "--onlyresult", + "--scriptfile=${file}" + ], + "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$", + "selector": "source.gs, source.gas, source.coffee", + "shell":"true", + "encoding": "UTF-8" +} +~~~ + + +## 2. For CoffeeScript +ggsrun can execute CoffeeScript. CoffeeScript can be still used for developing GAS. I prefer to use CoffeeSctipt. This is also one of my aims that I made ggsrun. + +**At the current stage, since GAS doesn't support ES2015 (ES6), please use CoffeeScript with version 1 series. CoffeeScript which used for this test is version 1.12.5. File format is evaluated by the extension.** + +In order to execute CoffeeScript, it required that CoffeeScript has already been installed. If you want to install CoffeeScript, please check here [http://coffeescript.org](http://coffeescript.org/). + +A flow of this sample script is as follows. + + 1. Calculates Fibonacci numbers by giving ``para = 20`` + 2. Creates new spreadsheet + 3. Imports the data to the spreadsheet + 4. Reads the data from the spreadsheet + 5. Downloads the spreadsheet as a CSV file + +### Sample script +``sample.coffee`` + +~~~coffeescript +Fibonacci = (n) -> + f1 = 1 + f2 = 0 + r = [1] + for i in [0..n - 2] + t = f1 + f1 += f2 + f2 = t + r[i + 1] = f1 + return r + +main = (para) -> # First execution function is main. + ar = Fibonacci(para) + ar = ([parseInt(i) + 1, e] for i, e of ar) + ss = SpreadsheetApp.create('samplesheet') + range = ss.getSheets()[0].getRange(1, 1, ar.length, ar[0].length) + range.setValues(ar) + data = range.getValues() + return res: data, fileid: ss.getId(), extension: "csv" +~~~ + +### Run + +~~~bash +$ ggsrun e2 -s sample.coffee -v 20 -j +~~~ + +The compile option for CoffeeScript is ``coffee -cb``. + +### Result + +When above script is executed, the created csv file is also downloaded, simultaneously. + +~~~json +{ + "result": { + "res":[[1,1],[2,1],[3,2],[4,3],[5,5],[6,8],[7,13],[8,21],[9,34],[10,55],[11,89],[12,144],[13,233],[14,377],[15,610],[16,987],[17,1597],[18,2584],[19,4181],[20,6765]] + }, + "GoogleElapsedTime": 1.44, + "TotalElapsedTime": 3.234, + "ScriptDate": "2017-01-01_00:00:00_GMT", + "API": "Execution API with server", + "message": [ + "File was downloaded as 'samplesheet.csv'.", + "'main()' in the script was run using ggsrun server. Server function is 'ggsrunif.ExecutionApi()'." + ] +} +~~~ + +**Downloaded CSV file :** ``samplesheet.csv`` + +``` +1,1 +2,1 +3,2 +4,3 +5,5 +6,8 +7,13 +8,21 +9,34 +10,55 +11,89 +12,144 +13,233 +14,377 +15,610 +16,987 +17,1597 +18,2584 +19,4181 +20,6765 +``` + +**And also I have created a GAS library made of CoffeeScript using ggsrun. You can see it [here](https://github.com/tanaikech/CreateImg).** + +## 3. Create Triggers +In this sample, it creates a trigger using ggsrun on the project. Execution API cannot create triggers because of [the limitation](https://developers.google.com/apps-script/guides/rest/api). So it uses Web Apps of the command ``webapps`` to create the trigger. In this case, it supposes the deployment of Web Apps. + +### Script 1 +At first, please create following ``trigger.gs`` file. ``sheetid`` and ``sheetname`` are spreadsheet ID and sheet name, respectively. This function is run by the trigger. When this function run, "a1" of spreadsheet changes from "ggsrun" to "trigger". + +``trigger.gs`` + +~~~javascript +function runByTrigger(){ + var sheetid = "#####"; + var sheetname = "#####"; + var ss = SpreadsheetApp.openById(sheetid).getSheetByName(sheetname); + ss.getRange("a1").setValue("trigger"); +} +~~~ + +### Script 2 +Next, please makes following ``create_trigger.gs`` file. ``time_min`` is imported when it is executed. + +``create_trigger.gs`` + +~~~javascript +function createTrigger(n, f){ + if (ScriptApp.getProjectTriggers().length === 1){ + ScriptApp.deleteTrigger(ScriptApp.getProjectTriggers()[0]); + } + var onTrigger = ScriptApp.newTrigger(f) + .timeBased() + .everyMinutes(parseInt(n)) + .create(); + return onTrigger.getHandlerFunction(); +} + +function main(time_min){ + var sheetid = "#####"; + var sheetname = "#####"; + var ss = SpreadsheetApp.openById(sheetid).getSheetByName(sheetname); + ss.getRange("a1").setValue("ggsrun"); + return createTrigger(time_min, "runByTrigger"); +} +~~~ + +### Run +Executes 2 scripts in continuous. You can also use a shell script for this. + +~~~bash +$ ggsrun e1 -s trigger.gs -f runByTrigger -j +{ + "result": null, + "TotalElapsedTime": 4.035, + "API": "Execution API without server", + "message": [ + "Project was updated.", + "Function 'runByTrigger()' was run." + ] +} +~~~ + +Using option ``-f``, it confirms errors in the sending script. No errors can be confirmed. + +~~~bash +$ ggsrun w -s create_trigger.gs -v 5 -p password -u https://script.google.com/macros/s/#####/exec -j +{ + "result": "runByTrigger", + "GoogleElapsedTime": 0.822, + "TotalElapsedTime": 2.583, + "ScriptDate": "2017-01-01_00:00:00_GMT", + "API": "Web Apps with server" +} +~~~ + +It returns the function name of ``runByTrigger`` without errors. When it opens the trigger list, the created trigger can be seen. And it was confirmed that "a1" of spreadsheet changed from "ggsrun" to "trigger". If you want to delete the trigger, please make the script and run ggsrun with the command ``webapps``. + +By this, it was found that the send of functions and the creation of new trigger are possible. + +## 4. Link to Various Resources +This is also one of my aims that I made ggsrun. As a sample, it introduces a link to Python. For executing GAS, ggsrun can use not only files, but also string scripts. This is a sample for it. + +### Flow +1. Set an initial variable ``n`` at Python script. ``n = 10''. This is sent to Google with the string script (``s1``). +2. Do double ``n`` at Google. This is back to Python script. +3. Do double the received value, create JSON data using Python script. This is sent to Google. +4. Do double the received value at Google. This is back to Python script on local PC. + +### Script : Python + +~~~python +import json +import subprocess + + +class ggsrun(object): + + def ggsrun(self, values, stringscript): + return json.loads(self.__res_cmd( + "ggsrun" + + " exe2 --onlyresult --stringscript=\"" + + stringscript.replace("\"", "\\\"").replace("\n", "") + + "\" --value=" + + values + ).decode("utf8")) + + def __res_cmd(self, cmd): + return subprocess.Popen( + cmd, stdout=subprocess.PIPE, + shell=True + ).communicate()[0] + + +def main(): + g = ggsrun() + s1 = """function main(dat){ + return parseInt(dat) * 2; +}""" + r1 = g.ggsrun(str(10), s1) + s2 = """function main(dat){ + return {calculation: '""" + str(r1) + """ * 2 * 2' , result: parseInt(dat) * 2} +}""" + r2 = g.ggsrun(str(r1 * 2), s2) + print(r1) + print(r2) + + +if __name__ == '__main__': + main() +~~~ + +**The script which can be used for ``--stringscript`` is only GAS, not CoffeeScript. And also this cannot be included comment out using ``//``.** + +### Result + +~~~ +20 +{'calculation': '20 * 2 * 2', 'result': 80} +~~~ + +The GAS script can be modified by the received values from Google. I think that this indicates the possibility of the creations of various scripts with higher degrees of freedom using various languages. + + +**I believe other applications. I'm very glad if you tell me when you found it.** + +--- + +# Appendix +## A1. Scopes +As the default, 6 scopes are set as follows. + +- https://www.googleapis.com/auth/drive +- https://www.googleapis.com/auth/drive.file +- https://www.googleapis.com/auth/drive.scripts +- https://www.googleapis.com/auth/script.external_request +- https://www.googleapis.com/auth/script.scriptapp +- https://www.googleapis.com/auth/spreadsheets + +If you want to change the scopes, + +1. Modify the scopes in ``ggsrun.cfg``. +2. Run ``$ ggsrun auth``. + +When you run ggsrun , if you see an error message below, + +"**Authorization Error: Please check SCOPEs of your GAS script and server using GAS Script Editor. +If the SCOPEs have changed, modify them in 'ggsrun.cfg' and delete a line of 'refresh_token', then, execute 'ggsrun' again. You can retrieve new access token with modified SCOPEs.**" + +Please confirm Scopes, which is used at your script, at the Script Editor on Google. + +## A2. Format of Data to GAS +Here it describes about the format of data received at GAS on Google. Data you inputted is converted by ggsrun as follows. +### For Execution Api +``` +{ + com: [strings and numbers sent by ggsrun] (string), + exefunc: Function name you want to execute (string), + Log: Whether it records a log. (boolean) +} +``` +This is a JSON format. + +### For Web Apps +``` +e.parameters.pass // Password you set + +e.parameters.com // Strings and numbers sent by ggsrun + +e.parameters.log // Whether it records a log. (boolean) +``` + +You can see the detail of ``e.parameters`` at [https://developers.google.com/apps-script/guides/web](https://developers.google.com/apps-script/guides/web). + +## A3. Access Log +ggsrun can record access log when a script is executed. ``exe1`` cannot record log, because it doesn't use server. ``exe2`` can record log using option ``-l``. When the option ``-l`` is NOT used, log is NOT recorded. ``webapps`` records log by compulsion, because ``webapps`` is NOT required the authorization. + +Access log which is a spreadsheet is ``ggsrun.log``. This is created besides the server project. + +## A4. Show Folder Tree +ggsrun can retrieve a folder tree on Google Drive as an array. You can do it as follows. + +~~~bash +$ ggsrun e2 -j -r -t +~~~ + +**Result :** + +~~~ +[ + [foldername1(folder1 id)], + [foldername1(folder1 id), sub foldername1s(sub folde1s id)], + [foldername1(folder2 id)], + [foldername2(folder2 id), sub foldername2s1(sub folde2s1 id)], + [foldername2(folder2 id), sub foldername2s1(sub folde2s1 id), sub foldername2s2(sub folde2s2 id)] +] +~~~ + + +## A5. Experiment 1 +As an experiment, it added a function to download files without Drive API using only Execution API. Files on Google are converted to byte slice by the server and feedbacked it as a text data. It is reconstructed by ggsrun. This is just experiment. If you have some advices, feel free to tell me. At the current version, it leaves the mimeType to Google site. + +~~~bash +$ ggsrun e2 --convert -j -v [file ID] +~~~ + +~~~json +{ + "result": "### Byte Slice of File ###", + "GoogleElapsedTime": 0.393, + "TotalElapsedTime": 2.343, + "ScriptDate": "2017-01-01_00:00:00_GMT", + "API": "Execution API with server", + "message": [ + "'main()' in the script was run using ggsrun server. Server function is 'ggsrunif.ExecutionApi()'.", + "File was downloaded as 'samplesheet'. MimeType is 'application/pdf'." + ] +} +~~~ + + +## A6. Trial Usage +Here, it introduces a Quickstart for ggsrun. So please also check [the detail information](#Google API). + +This is just very very simple trial test. I prepared this as a simple trial usage. You are not always necessary to do this trial. + +1. Download ggsrun [the release page](https://github.com/tanaikech/ggsrun/releases), or ``$ go get -u github.com/tanaikech/ggsrun``. +2. Create a standalone Script on Google Drive, and install a server to the script as a library. + - Script ID is ``115-19njNHlbT-NI0hMPDnVO1sdrw2tJKCAJgOTIAPbi_jq3tOo4lVRov``. +3. Copy and paste following function to the script. + - ``function doPost(e) {return ggsrunif.WebApps(e, "password")}`` +4. [Deploy Web Apps](https://developers.google.com/apps-script/guides/web) with + - File -> Manage Versions -> Save New Version - Publish -> Deploy as Web App -> At Execute the app as, select **"your account"** -> At Who has access to the app, select **"Anyone, even anonymous"** -> Click "Deploy" -> Copy **"Current web app URL"** -> Click "OK" +5. Create GAS file as ``sample.gs``. + - ``function main(){return Beacon()}`` +6. Run ggsrun at terminal or command prompt. If the server information is displayed, it's done. + - ``$ ggsrun w -s sample.gs -p password -j -u [URL of web apps]`` +7. After this trial was done, **Please stop the deployed Web Apps.** Because the web apps is deployed for anyone. + +--- + + +# Q&A +If your GAS script has errors when it executes at Google, it shows "Script Error on GAS side:". At that time, you can check your script. If it shows "Error:" without "GAS", that's the error inside ggsrun. + +When you executed a GAS script, if an error occurred, please check the strings which should be escaped. It may lead to the solution of errors. + +When an error occurs on ggsrun, solutions for most errors will be provided from ggsrun. However, also I think that there are errors I have never known. If you noticed bugs and errors of ggsrun, I'm glad when you tell me them. I would like to modify them. If the errors occur for your scripts when you use ggsrun, I think that modifying the errors will lead to the growth of this tool. + +#### 1. [Authorization for Google Services](https://developers.google.com/apps-script/guides/services/authorization) for your script +- When you execute your GAS script, Authorization for Google Services may be required. At that time, only one time, please execute your script on Script Editor with the project installed the ggsrun server. And please auth Authorization for Google Services. After this, you can execute your script using ggsrun. + +#### 2. In the case that result is ``Script Error on GAS side: Insufficient Permission`` +- Please confirm [Authorization for Google Services](https://developers.google.com/apps-script/guides/services/authorization) for the script you use on Script Editor. +- Please confirm about API you want to use at [Google API Console](https://console.developers.google.com). + +#### 3. In the case that a following error occurs +``` +Error: Status Code: 404. +{ + "error": { + "code": 404, + "message": "Requested entity was not found.", + "status": "NOT_FOUND" + } +} +``` +Please confirm following settings. + +- Whether Execution API at [Google API Console](https://console.developers.google.com/) is enable. +- Whether for the project installed ggsrun server, API executable has been deployed as latest version. +- After deployed API executable, each script in the project has been saved. This is important point! + +#### 4. In the case that a following error occurs +"**Script Error on GAS side: Script has attempted to perform an action that is not allowed when invoked through the Google Apps Script Execution API.**" + +When it uses ``exe1`` or ``exe2``, there is a case to see the error. That is one of [limitations](https://developers.google.com/apps-script/guides/rest/api#limitations) for ``exe1`` or ``exe2``. So please try to execute the same script using ``webapps``. It might be able to use. + +#### 5. In the case that a following error occurs +Please be careful for ``;`` of end of each line of the script. +When I have been creating sample GAS scripts for ggsrun, following error often occurred. + +``` +Missing ';' before statement. +``` + +In such case, please confirm whether ``;`` with end of each line in the script is placed to the correct position for Javascript. Although the script have no errors at Google Script Editor, when it is executed by ggsrun, the error occurred. Since ``exe2`` and ``webapps``of ggsrun send scripts as 1 line, it has to separate correctly between each line of the script. When it is executed by ``exe1``, no such errors occur since the function on Script Editor is directly called. + +When I had been developing applications using CoffeeScript and ggsrun, I have never seen above error yet. + +#### 6. Library +You can use various libraries for GAS by ggsrun. But there are one limitation. When you want to use libraries, please add them to the project with server, and execute scripts using ``exe1`` mode. At ``exe2`` mode, additional library cannot be used, because the mode executes on the server script. + + + +# Licence +[MIT](LICENCE) + + +# Author +[TANAIKE](https://github.com/tanaikech) + +If you have any questions and commissions for me, feel free to tell me using e-mail of tanaike@hotmail.com + + +# Update History +## ggsrun +* v1.0.0 (April 24, 2017) + + Initial release. + +## Server +* v1.0.0 (April 24, 2017) + + Initial release. + +[TOP](#TOP) diff --git a/doc.go b/doc.go new file mode 100644 index 0000000..4a80a70 --- /dev/null +++ b/doc.go @@ -0,0 +1,62 @@ +/* +Package main (doc.go) : +This is a CLI tool to execute Google Apps Script (GAS) on a terminal. + +Will you want to develop GAS on your local PC? Generally, when we develop GAS, we have to login to Google using own browser and develop it on the Script Editor. Recently, I have wanted to have more convenient local-environment for developing GAS. So I created this "ggsrun". The main work is to execute GAS on local terminal and retrieve the results from Google. + +# Features of "ggsrun" are as follows. + +1. Develops GAS using your terminal and text editor which got accustomed to using. + +2. Executes GAS by giving values to your script. + +3. Executes GAS made of CoffeeScript. + +4. Downloads spreadsheet, document and presentation, while executes GAS, simultaneously. + +5. Creates, updates and backs up project with GAS. + +6. Downloads files from Google Drive and Uploads files to Google Drive. + +You can see the release page https://github.com/tanaikech/ggsrun/releases + +# Google API + +ggsrun uses Execution API, Web Apps and Drive API on Google. About how to install ggsrun, please check my github repository. + +https://github.com/tanaikech/ggsrun/ + +You can read the detail information there. + + +--------------------------------------------------------------- + +# How to Execute Google Apps Script Using ggsrun +When you have the configure file `ggsrun.cfg`, you can execute GAS. If you cannot find it, please download `client_secret.json` and run + +$ ggsrun auth + +In the case of using Execution API, + +$ ggsrun e1 -s sample.gs + +If you want to execute a function except for `main()` of default, you can use an option like `-f foo`. This command `exe1` can be used to execute a function on project. + +$ ggsrun e1 -f foo + +$ ggsrun e2 -s sample.gs + +At `e2`, you cannot select the executing function except for `main()` of default. + +`e1`, `e2` and `-s` mean using Execution API and GAS script file name, respectively. Sample codes which are shown here will be used Execution API. At this time, the executing function is `main()`, which is a default, in the script. + +In the case of using Web Apps, + +$ ggsrun w -s sample.gs -p password -u [ WebApps URL ] + +`w` and `-p` mean using Web Apps and password you set at the server side, respectively. Using `-u` it imports Web Apps URL like `-u https://script.google.com/macros/s/#####/exec`. + + +--------------------------------------------------------------- +*/ +package main diff --git a/ggsrun.go b/ggsrun.go new file mode 100644 index 0000000..2edd6b9 --- /dev/null +++ b/ggsrun.go @@ -0,0 +1,246 @@ +// Package main (ggsrun.go) : +// This file is included all commands and options. +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +// main : main function +func main() { + app := cli.NewApp() + app.Name = appname + app.Author = "tanaike [ https://github.com/tanaikech/ggsrun ] " + app.Email = "tanaike@hotmail.com" + app.Usage = "Executes Google Apps Script (GAS) on Google and Feeds Back Results." + app.Version = "1.0.0" + app.Commands = []cli.Command{ + { + Name: "exe1", + Aliases: []string{"e1"}, + Usage: "Updates project and Executes the function in the project.", + Description: "In this mode, an access token is required.", + Action: exeAPIWithout, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "scriptid, i", + Usage: "Script ID of project on Google Drive", + }, + cli.StringFlag{ + Name: "scriptfile, s", + Usage: "GAS file (.gs, .gas, .js, .coffee) on local PC", + }, + cli.StringFlag{ + Name: "function, f", + Usage: "Function name which is executed. Default is '" + deffuncwithout + "'.", + }, + cli.StringFlag{ + Name: "value, v", + Usage: "Give a value to the function which is executed.", + }, + cli.BoolFlag{ + Name: "backup, b", + Usage: "Backup project with script ID you set as a file.", + }, + cli.BoolFlag{ + Name: "onlyresult, r", + Usage: "Display only 'result' in JSON results", + }, + cli.BoolFlag{ + Name: "jsonparser, j", + Usage: "Display results by JSON parser", + }, + }, + }, + { + Name: "exe2", + Aliases: []string{"e2"}, + Usage: "Uploads GAS and Executes the script using Execution API.", + Description: "In this mode, an access token is required.", + Action: exeAPIWith, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "scriptid, i", + Usage: "Script ID of project on Google Drive", + }, + cli.StringFlag{ + Name: "scriptfile, s", + Usage: "GAS file (.gs, .gas, .js, .coffee) on local PC", + }, + cli.StringFlag{ + Name: "function, f", + Usage: "Function name of server for executing GAS. Default is '" + deffuncserv + "'. If you change the server, use this.", + }, + cli.StringFlag{ + Name: "value, v", + Usage: "Give a value to the function of GAS script which is executed.", + }, + cli.StringFlag{ + Name: "stringscript, ss", + Usage: "GAS script as strings.", + }, + cli.BoolFlag{ + Name: "foldertree, t", + Usage: "Display a folder tree on Google Drive as an array.", + }, + cli.BoolFlag{ + Name: "convert, conv", + Usage: "[Experiment] Download file using byte slice data. Use with '-v [File ID]'.", + }, + cli.BoolFlag{ + Name: "log, l", + Usage: "Record access log.", + }, + cli.BoolFlag{ + Name: "onlyresult, r", + Usage: "Display only 'result' in JSON results", + }, + cli.BoolFlag{ + Name: "jsonparser, j", + Usage: "Display results by JSON parser", + }, + }, + }, + { + Name: "webapps", + Aliases: []string{"w"}, + Usage: "Uploads GAS and Executes the script without OAuth using Web Apps.", + Description: "In this mode, an access token is NOT required.", + Action: webAppsWith, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "url, u", + Usage: "URL for using Web Apps.", + }, + cli.StringFlag{ + Name: "scriptfile, s", + Usage: "GAS file (.gs, .gas, .js, .coffee) on local PC", + }, + cli.StringFlag{ + Name: "value, v", + Usage: "Give a value to the function of GAS script which is executed.", + }, + cli.StringFlag{ + Name: "password, p", + Usage: "Password to use Web Apps (if you have set)", + }, + cli.BoolFlag{ + Name: "log, l", + Usage: "Not record access log. No this option means 'Record log'.", + }, + cli.BoolFlag{ + Name: "onlyresult, r", + Usage: "Display only 'result' in JSON results", + }, + cli.BoolFlag{ + Name: "jsonparser, j", + Usage: "Display results by JSON parser", + }, + }, + }, + { + Name: "download", + Aliases: []string{"d"}, + Usage: "Downloads files from Google Drive.", + Description: "In this mode, an access token is required.", + Action: downloadFiles, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "fileid, i", + Usage: "File ID on Google Drive", + }, + cli.StringFlag{ + Name: "filename, f", + Usage: "File Name on Google Drive", + }, + cli.StringFlag{ + Name: "extension, e", + Usage: "Extension (File format of downloaded file)", + }, + cli.BoolFlag{ + Name: "rawdata, r", + Usage: "Save a project with GAS scripts as raw data (JSON data).", + }, + cli.BoolFlag{ + Name: "jsonparser, j", + Usage: "Display results by JSON parser", + }, + }, + }, + { + Name: "upload", + Aliases: []string{"u"}, + Usage: "Uploads files to Google Drive.", + Description: "In this mode, an access token is required.", + Action: uploadFiles, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "filename, f", + Usage: "File Name on local PC", + }, + cli.StringFlag{ + Name: "parentfolderid, p", + Usage: "Folder ID of parent folder on Google Drive", + }, + cli.StringFlag{ + Name: "projectname, pn", + Usage: "Upload several GAS scripts as a project.", + }, + cli.BoolFlag{ + Name: "noconvert, nc", + Usage: "If you don't want to convert file to Google Apps format.", + }, + cli.BoolFlag{ + Name: "jsonparser, j", + Usage: "Display results by JSON parser", + }, + }, + }, + { + Name: "filelist", + Aliases: []string{"ls"}, + Usage: "Outputs a file list on Google Drive.", + Description: "In this mode, an access token is required.", + Action: showFileList, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "searchbyname, sn", + Usage: "Search file using File Name. Output File ID.", + }, + cli.StringFlag{ + Name: "searchbyid, si", + Usage: "Search file using File ID. Output File Name.", + }, + cli.BoolFlag{ + Name: "stdout, s", + Usage: "Output all file list to standard output.", + }, + cli.BoolFlag{ + Name: "file, f", + Usage: "Output all file list to a JSON file.", + }, + cli.BoolFlag{ + Name: "jsonparser, j", + Usage: "Display results by JSON parser", + }, + }, + }, + { + Name: "auth", + Usage: "Retrieve access and refresh tokens. If you changed scopes, please use this.", + Description: "In this mode, 'client_secret.json' and Scopes are required.", + Action: reAuth, + Flags: []cli.Flag{ + cli.IntFlag{ + Name: "port, p", + Usage: "Port number of temporal web server for retrieving authorization code.", + Value: 8080, + }, + }, + }, + } + app.CommandNotFound = commandNotFound + app.Run(os.Args) +} diff --git a/handler.go b/handler.go new file mode 100644 index 0000000..8907703 --- /dev/null +++ b/handler.go @@ -0,0 +1,131 @@ +// Package main (handler.go) : +// Handler for ggsrun +package main + +import ( + "encoding/json" + "fmt" + "os" + + "github.com/tanaikech/ggsrun/utl" + "github.com/urfave/cli" +) + +// exeAPIWithout : exe1 +// Update project and Execution API withour server script. +func exeAPIWithout(c *cli.Context) error { + defAuthContainer(c). + ggsrunIni(c). + goauth(). + defExecutionContainer(). + exe1Function(c). + executionAPIwithoutServer(c). + esenderForExe1(c). + dispResult(c) + return nil +} + +// exeAPIWith : exe2 +// No update project. Only execute GAS using Execution API with server script. +func exeAPIWith(c *cli.Context) error { + defAuthContainer(c). + ggsrunIni(c). + goauth(). + defExecutionContainer(). + exe2Function(c). + dispResult(c) + return nil +} + +// webAppsWith : exe3 +// No update project. Only execute GAS using Web Apps with server script. +func webAppsWith(c *cli.Context) error { + defExecutionContainerWebApps(). + webAppswithServerForExe3(utl.ConvGasToRun(c), c). + dispResult(c) + return nil +} + +// downloadFiles : Download files from Google Drive. +func downloadFiles(c *cli.Context) error { + res := defAuthContainer(c). + ggsrunIni(c). + goauth(). + defDownloadContainer(c). + GetFileinf(). + Downloader(c) + dispTransferResult(c, res) + return nil +} + +// uploadFiles : +func uploadFiles(c *cli.Context) error { + res := defAuthContainer(c). + ggsrunIni(c). + goauth(). + defUploadContainer(c). + Uploader(c) + dispTransferResult(c, res) + return nil +} + +// showFileList : +func showFileList(c *cli.Context) error { + res := defAuthContainer(c). + ggsrunIni(c). + goauth(). + defDownloadContainer(c). + GetFileList(c) + dispTransferResult(c, res) + return nil +} + +// reAuth : Retrieve tokens again. +func reAuth(c *cli.Context) error { + defAuthContainer(c). + ggsrunIni(c). + reAuth() + fmt.Print("Done.") + return nil +} + +// dispResult : Display result +func (e *ExecutionContainer) dispResult(c *cli.Context) { + var dispRes []byte + if len(e.Msg) > 0 { + e.FeedBackData.Response.Result.Message = e.Msg + } + if c.Bool("jsonparser") { + dispRes, _ = json.MarshalIndent(e.FeedBackData.Response.Result, "", " ") + } else { + dispRes, _ = json.Marshal(e.FeedBackData.Response.Result) + } + if c.Bool("onlyresult") { + if c.Bool("jsonparser") { + onlyres, _ := json.MarshalIndent(e.FeedBackData.Response.Result.Result, "", " ") + fmt.Printf("%s\n", string(onlyres)) + } else { + onlyres, _ := json.Marshal(e.FeedBackData.Response.Result.Result) + fmt.Printf("%s\n", string(onlyres)) + } + } else { + fmt.Printf("%v\n", string(dispRes)) + } +} + +// dispTransferResult : Display result +func dispTransferResult(c *cli.Context, f *utl.FileInf) { + var dispRes []byte + if c.Bool("jsonparser") { + dispRes, _ = json.MarshalIndent(f, "", " ") + } else { + dispRes, _ = json.Marshal(f) + } + fmt.Printf("%s\n", string(dispRes)) +} + +// commandNotFound : +func commandNotFound(c *cli.Context, command string) { + fmt.Fprintf(os.Stderr, "'%s' is not a %s command. Check '%s --help' or '%s -h'.", command, c.App.Name, c.App.Name, c.App.Name) + os.Exit(2) +} diff --git a/init.go b/init.go new file mode 100644 index 0000000..2589623 --- /dev/null +++ b/init.go @@ -0,0 +1,58 @@ +// Package main (init.go) : +// These methods are for reading and writing configuration file (ggsrun.cfg). +package main + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + "path/filepath" + + "github.com/urfave/cli" +) + +// GgsrunIni : +func (a *AuthContainer) ggsrunIni(c *cli.Context) *AuthContainer { + if cfgdata, err := ioutil.ReadFile(filepath.Join(a.InitVal.workdir, cfgFile)); err == nil { + err = json.Unmarshal(cfgdata, &a.GgsrunCfg) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: Format error of '%s'. ", cfgFile) + os.Exit(1) + } + if c.Command.Names()[0] == "exe1" || + c.Command.Names()[0] == "exe2" { + if len(c.String("scriptid")) == 0 && len(a.GgsrunCfg.Scriptid) == 0 { + fmt.Fprintf(os.Stderr, "Error: No script id. Please use option '-i [Script ID]'. ") + os.Exit(1) + } + if len(c.String("scriptid")) > 0 { + a.GgsrunCfg.Scriptid = c.String("scriptid") + a.InitVal.update = true + } + if len(c.String("function")) > 0 { + a.Param.Function = c.String("function") + } + } + } else { + return a.readClientSecret() + } + return a +} + +func (a *AuthContainer) readClientSecret() *AuthContainer { + if csecret, err := ioutil.ReadFile(filepath.Join(a.InitVal.workdir, clientsecretFile)); err == nil { + err := json.Unmarshal(csecret, &a.Cs) + if err != nil || (len(a.Cs.Cid.ClientID) == 0 && len(a.Cs.Ciw.ClientID) == 0) { + fmt.Fprintf(os.Stderr, "Error: Please confirm '%s'. Error is %s.", clientsecretFile, err) + os.Exit(1) + } + if len(a.Cs.Cid.ClientID) == 0 && len(a.Cs.Ciw.ClientID) > 0 { + a.Cs.Cid = a.Cs.Ciw + } + } else { + fmt.Fprintf(os.Stderr, "Error: No materials for retrieving accesstoken. Please download '%s'", clientsecretFile) + os.Exit(1) + } + return a +} diff --git a/materials.go b/materials.go new file mode 100644 index 0000000..c9eb042 --- /dev/null +++ b/materials.go @@ -0,0 +1,341 @@ +// Package main (materials.go) : +// Materials for ggsrun. +package main + +import ( + "path/filepath" + "regexp" + "time" + + "github.com/tanaikech/ggsrun/utl" + "github.com/urfave/cli" +) + +// const : +const ( + appname = "ggsrun" + serverid = "115-19njNHlbT-NI0hMPDnVO1sdrw2tJKCAJgOTIAPbi_jq3tOo4lVRov" + + eapir1 = "Execution API without server" + eapir2 = "Execution API with server" + wapps = "Web Apps with server" + + clientsecretFile = "client_secret.json" + cfgFile = "ggsrun.cfg" + + deffuncserv = "ggsrunif.ExecutionApi" + deffuncwith = "main" + deffuncwithout = "main" + defprojectname = appname + defPort = 8080 + + oauthurl = "https://accounts.google.com/o/oauth2/" + sdownloadurl = "https://script.google.com/feeds/download/export?id=" + executionurl = "https://script.googleapis.com/v1/scripts/" + driveapiurl = "https://www.googleapis.com/drive/v3/files/" + chkatutl = "https://www.googleapis.com/oauth2/v3/" + uploadurl = "https://www.googleapis.com/upload/drive/v3/files/" +) + +// InitVal : Initial values +type InitVal struct { + pstart time.Time + workdir string + update bool + log bool + Port int +} + +// ResMsg : Response message also included errors +type ResMsg struct { + Msg []string +} + +// GgsrunCfg : Configuration file for ggsrun +type GgsrunCfg struct { + Scriptid string `json:"script_id"` + Clientid string `json:"client_id"` + Clientsecret string `json:"client_secret"` + Refreshtoken string `json:"refresh_token"` + Accesstoken string `json:"access_token,omitempty"` + Expiresin int64 `json:"expires_in,omitempty"` + Scopes []string `json:"scopes"` +} + +// Cinstalled : File of client-secret.json +type Cinstalled struct { + ClientID string `json:"client_id"` + Projectid string `json:"project_id"` + Authuri string `json:"auth_uri"` + Tokenuri string `json:"token_uri"` + Authproviderx509certurl string `json:"auth_provider_x509_cert_url"` + Clientsecret string `json:"client_secret"` + Redirecturis []string `json:"redirect_uris"` +} + +// Cs : Client_secret.json +type Cs struct { + Cid Cinstalled `json:"installed,omitempty"` + Ciw Cinstalled `json:"web,omitempty"` +} + +// Atoken : Accesstoken given from Google +type Atoken struct { + Accesstoken string `json:"access_token"` + Refreshtoken string `json:"refresh_token"` + Expiresin int64 `json:"expires_in"` +} + +// ChkAt : Condition of accesstoken retrieved using Drive API +type ChkAt struct { + Azu string `json:"azu,omitempty"` + Aud string `json:"aud,omitempty"` + Scope string `json:"scope,omitempty"` + Exp string `json:"exp,omitempty"` + Expiresin string `json:"expires_in,omitempty"` + Accesstype string `json:"access_type,omitempty"` + Error string `json:"error_description,omitempty"` +} + +// Param : Payload for Execution API +type Param struct { + Function string `json:"function"` + Parameters []string `json:"parameters,omitempty"` + DevMode bool `json:"devMode"` +} + +// e1para : Parameter for exe1 +type e1para struct { + Function string `json:"function"` + Parameters []interface{} `json:"parameters,omitempty"` + DevMode bool `json:"devMode"` +} + +// Com : Structure of data using Execution API +type Com struct { + Com string `json:"com,omitempty"` + Exefunc string `json:"exefunc,omitempty"` + Log bool `json:"log"` +} + +// Project : Project for uploading using Drive API +type Project struct { + Files []File `json:"files"` +} + +// File : Individual file in a project +type File struct { + ID string `json:"id,omitempty"` + Name string `json:"name"` + Type string `json:"type"` + Source string `json:"source"` +} + +// FeedBackData : Feedbacked data from function using Execution API (modified) +type FeedBackData struct { + Name string `json:"name"` + Done bool `json:"done"` + Response struct { + Type string `json:"@type"` + Result Resvalue `json:"result"` + } `json:"response"` + Error struct { + Code int `json:"code,omitempty"` + Message string `json:"message,omitempty"` + Status string `json:"status,omitempty"` + Detailes []ErrorMsg `json:"details,omitempty"` + } `json:"error"` +} + +// ErrorMsg : +type ErrorMsg struct { + Type string `json:"@type,omitempty"` + ErrorMessage string `json:"errorMessage,omitempty"` + ErrorType string `json:"errorType,omitempty"` + ScriptStackTraceElements []struct { + Function string `json:"function,omitempty"` + LineNumber int `json:"lineNumber,omitempty"` + } `json:"scriptStackTraceElements,omitempty"` +} + +// Resvalue : Results of ggsrun +type Resvalue struct { + Result interface{} `json:"result"` + Logger []interface{} `json:"logger,omitempty"` + GoogleEt float64 `json:"GoogleElapsedTime,omitempty"` + TotalEt float64 `json:"TotalElapsedTime,omitempty"` + Date string `json:"ScriptDate,omitempty"` + Uapi string `json:"API,omitempty"` + Message []string `json:"message,omitempty"` +} + +// DlFileByScript : Information of download file by script +type DlFileByScript struct { + Fileid string `json:"-"` + Extension string `json:"-"` +} + +// ProjectUpdaterMeta : Metadata for updating a project +type ProjectUpdaterMeta struct { + MimeType string `json:"mimeType"` +} + +// ByteSliceFile : File with byte slice +type ByteSliceFile struct { + FileData []int `json:"result"` + Name string `json:"name"` + MimeType string `json:"mimeType"` +} + +// serverInfToGetCode : For getting auth code +type serverInfToGetCode struct { + Response chan authCode + Start chan bool + End chan bool +} + +// authCode : For getting auth code +type authCode struct { + Code string + Err error +} + +// AuthContainer : Struct container for using OAuth2 +type AuthContainer struct { + *InitVal // Initial values + *ResMsg // Response message + *GgsrunCfg // Config for ggsrun + *Param // Payload for Execution API + *Cs // Client_secret.json + *Atoken // Accesstoken from Google + *ChkAt // Check accesstoken +} + +// ExecutionContainer : Struct container for using Execution API. +// 1. Upload script using Execution API +// 2. Update project using Drive API and execute script using Execution API +type ExecutionContainer struct { + *InitVal // Initial values + *ResMsg // Response message + *GgsrunCfg // Config for ggsrun + *Param // Payload for Execution API + *FeedBackData // Feedbacked data from function using Execution API + *Project // Project for uploading using Drive API + *DlFileByScript // Information of download file by script +} + +// DefAuthContainer : Struct container for authorization +func defAuthContainer(c *cli.Context) *AuthContainer { + var err error + a := &AuthContainer{ + &InitVal{}, + &ResMsg{}, + &GgsrunCfg{}, + &Param{}, + &Cs{}, + &Atoken{}, + &ChkAt{}, + } + a.InitVal.pstart = time.Now() + a.InitVal.workdir, err = filepath.Abs(".") + if err != nil { + panic(err) + } + a.Param.Function = c.String("function") + a.InitVal.log = c.Bool("log") + a.InitVal.Port = defPort + if c.Command.Names()[0] == "auth" { + if c.Int("port") != 0 { + a.InitVal.Port = c.Int("port") + } + } + // Default scopes for using Execution API and Drive API + // If you want to use own scopes, please write them to configuration file. + // They are used for retrieving access token. + a.GgsrunCfg.Scopes = []string{ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/drive.scripts", + "https://www.googleapis.com/auth/script.external_request", + "https://www.googleapis.com/auth/script.scriptapp", + "https://www.googleapis.com/auth/spreadsheets", + } + return a +} + +// DefExecutionContainer : Struct container for using Execution API +func (a *AuthContainer) defExecutionContainer() *ExecutionContainer { + e := &ExecutionContainer{ + &InitVal{}, + &ResMsg{}, + &GgsrunCfg{}, + &Param{}, + &FeedBackData{}, + &Project{}, + &DlFileByScript{}, + } + e.GgsrunCfg = a.GgsrunCfg + e.InitVal = a.InitVal + e.Msg = a.Msg + e.Param = a.Param + return e +} + +// DefExecutionContainerWebApps : Struct container for using WebApps +func defExecutionContainerWebApps() *ExecutionContainer { + var err error + e := &ExecutionContainer{ + &InitVal{}, + &ResMsg{}, + &GgsrunCfg{}, + &Param{}, + &FeedBackData{}, + &Project{}, + &DlFileByScript{}, + } + e.InitVal.pstart = time.Now() + e.InitVal.workdir, err = filepath.Abs(".") + if err != nil { + panic(err) + } + return e +} + +// DefDownloadContainer : Struct container for downloading files +func (a *AuthContainer) defDownloadContainer(c *cli.Context) *utl.FileInf { + p := &utl.FileInf{ + Msgar: a.Msg, + Accesstoken: a.GgsrunCfg.Accesstoken, + Workdir: a.InitVal.workdir, + PstartTime: a.InitVal.pstart, + FileID: c.String("fileid"), + WantExt: c.String("extension"), + WantName: c.String("filename"), + } + return p +} + +// DefUploadContainer : Struct container for uploading files +func (a *AuthContainer) defUploadContainer(c *cli.Context) *utl.FileInf { + p := &utl.FileInf{ + Msgar: a.Msg, + Accesstoken: a.GgsrunCfg.Accesstoken, + Workdir: a.InitVal.workdir, + PstartTime: a.InitVal.pstart, + UpFilename: regexp.MustCompile(`\s*,\s*`).Split(c.String("filename"), -1), + } + return p +} + +// defDownloadByScriptContainer : Struct container for downloading files by GAS +func (e *ExecutionContainer) defDownloadByScriptContainer() *utl.FileInf { + p := &utl.FileInf{ + Msgar: e.Msg, + Accesstoken: e.GgsrunCfg.Accesstoken, + Workdir: e.InitVal.workdir, + PstartTime: e.InitVal.pstart, + FileID: e.DlFileByScript.Fileid, + WantExt: e.DlFileByScript.Extension, + } + return p +} diff --git a/oauth.go b/oauth.go new file mode 100644 index 0000000..4ea54f5 --- /dev/null +++ b/oauth.go @@ -0,0 +1,254 @@ +// Package main (oauth.go) : +// Get accesstoken using refreshtoken, and confirm condition of accesstoken. +package main + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "log" + "net" + "net/http" + "net/url" + "os" + "os/exec" + "path/filepath" + "runtime" + "strconv" + "strings" + "time" + + "github.com/tanaikech/ggsrun/utl" +) + +// Goauth : +func (a *AuthContainer) goauth() *AuthContainer { + if len(a.GgsrunCfg.Clientid) > 0 && + len(a.GgsrunCfg.Clientsecret) > 0 && + len(a.GgsrunCfg.Refreshtoken) > 0 { + if (a.InitVal.pstart.Unix()-a.GgsrunCfg.Expiresin) > 0 || + len(a.GgsrunCfg.Accesstoken) == 0 { + a.getAtoken().makecfgfile() + } else { + if a.InitVal.update { + a.makecfgfile() + } + } + } else { + a.readClientSecret().getNewAccesstoken().makecfgfile() + } + return a +} + +// ReAuth : +func (a *AuthContainer) reAuth() { + a.readClientSecret().getNewAccesstoken().makecfgfile() +} + +// makecfgfile : +func (a *AuthContainer) makecfgfile() { + btok, _ := json.MarshalIndent(a.GgsrunCfg, "", "\t") + ioutil.WriteFile(filepath.Join(a.InitVal.workdir, cfgFile), btok, 0777) +} + +// getAtoken : Retrieves accesstoken from refreshtoken. +func (a *AuthContainer) getAtoken() *AuthContainer { + a.Msg = append(a.Msg, "Got a new accesstoken.") + values := url.Values{} + values.Set("client_id", a.GgsrunCfg.Clientid) + values.Set("client_secret", a.GgsrunCfg.Clientsecret) + values.Set("refresh_token", a.GgsrunCfg.Refreshtoken) + values.Set("grant_type", "refresh_token") + r := &utl.RequestParams{ + Method: "POST", + APIURL: oauthurl + "token", + Data: strings.NewReader(values.Encode()), + Contenttype: "application/x-www-form-urlencoded", + Accesstoken: "", + Dtime: 10, + } + body, err := r.FetchAPI() + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + json.Unmarshal(body, &a.Atoken) + a.GgsrunCfg.Accesstoken = a.Atoken.Accesstoken + a.GgsrunCfg.Expiresin = a.chkAtoken() - 360 // 6 minutes as adjustment time + return a +} + +// chkAtoken : For AuthContainer +func (a *AuthContainer) chkAtoken() int64 { + r := &utl.RequestParams{ + Method: "GET", + APIURL: chkatutl + "tokeninfo?access_token=" + a.GgsrunCfg.Accesstoken, + Data: nil, + Contenttype: "application/x-www-form-urlencoded", + Accesstoken: "", + Dtime: 10, + } + body, err := r.FetchAPI() + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + json.Unmarshal(body, &a.ChkAt) + if len(a.ChkAt.Error) > 0 { + a.getAtoken() + } + exp, _ := strconv.ParseInt(a.ChkAt.Exp, 10, 64) + return exp +} + +// chkAtoken : For ExecutionContainer +func (e *ExecutionContainer) chkAtoken() *ChkAt { + r := &utl.RequestParams{ + Method: "GET", + APIURL: chkatutl + "tokeninfo?access_token=" + e.GgsrunCfg.Accesstoken, + Data: nil, + Contenttype: "application/x-www-form-urlencoded", + Accesstoken: "", + Dtime: 10, + } + body, _ := r.FetchAPI() + var c ChkAt + json.Unmarshal(body, &c) + return &c +} + +func (a *AuthContainer) chkRedirectURI() bool { + for _, e := range a.Cs.Cid.Redirecturis { + if strings.Contains(e, "localhost") { + return true + } + } + return false +} + +func (a *AuthContainer) getCode() (string, error) { + p := a.InitVal.Port + if !a.chkRedirectURI() { + return "", fmt.Errorf("Go manual mode.") + } + fmt.Printf("\n### This is a automatic input mode.\n### Please follow opened browser, login Google and click authentication.\n### Moves to a manual mode if you wait for 30 seconds under this situation.\n") + a.Cs.Cid.Redirecturis = append(a.Cs.Cid.Redirecturis, "http://localhost:"+strconv.Itoa(p)+"/") + codepara := url.Values{} + codepara.Set("client_id", a.Cs.Cid.ClientID) + codepara.Set("redirect_uri", a.Cs.Cid.Redirecturis[len(a.Cs.Cid.Redirecturis)-1]) + codepara.Set("scope", strings.Join(a.GgsrunCfg.Scopes, " ")) + codepara.Set("response_type", "code") + codepara.Set("approval_prompt", "force") + codepara.Set("access_type", "offline") + codeurl := oauthurl + "auth?" + codepara.Encode() + s := &serverInfToGetCode{ + Response: make(chan authCode, 1), + Start: make(chan bool, 1), + End: make(chan bool, 1), + } + defer func() { + s.End <- true + }() + go func(port int) { + mux := http.NewServeMux() + mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + code := r.URL.Query().Get("code") + if len(code) == 0 { + fmt.Fprintf(w, `ggsrun status

Erorr.

`) + s.Response <- authCode{Err: fmt.Errorf("Not found code.")} + return + } + fmt.Fprintf(w, `ggsrun status

The authentication was done. Please close this page.

`) + s.Response <- authCode{Code: code} + }) + var err error + Listener, err := net.Listen("tcp", fmt.Sprintf("localhost:%d", port)) + if err != nil { + s.Response <- authCode{Err: err} + return + } + server := http.Server{} + server.Handler = mux + go server.Serve(Listener) + s.Start <- true + <-s.End + Listener.Close() + s.Response <- authCode{Err: err} + return + }(p) + <-s.Start + var cmd *exec.Cmd + switch runtime.GOOS { + case "darwin": + cmd = exec.Command("open", strings.Replace(codeurl, "&", `\&`, -1)) + case "linux": + cmd = exec.Command("xdg-open", strings.Replace(codeurl, "&", `\&`, -1)) + case "windows": + cmd = exec.Command("cmd", "/c", "start", strings.Replace(codeurl, "&", `^&`, -1)) + default: + return "", fmt.Errorf("Go manual mode.") + } + if err := cmd.Start(); err != nil { + return "", fmt.Errorf("Go manual mode.") + } + var result authCode + select { + case result = <-s.Response: + case <-time.After(time.Duration(30) * time.Second): // After 30 s, move to manual mode. + return "", fmt.Errorf("Go manual mode.") + } + if result.Err != nil { + return "", fmt.Errorf("Go manual mode.") + } + return result.Code, nil +} + +// getNewAccesstoken : Retrieve accesstoken when there is no refreshtoken. +func (a *AuthContainer) getNewAccesstoken() *AuthContainer { + var code string + var err error + code, err = a.getCode() + if err != nil { + codepara := url.Values{} + codepara.Set("client_id", a.Cs.Cid.ClientID) + codepara.Set("redirect_uri", a.Cs.Cid.Redirecturis[0]) + codepara.Set("scope", strings.Join(a.GgsrunCfg.Scopes, " ")) + codepara.Set("response_type", "code") + codepara.Set("approval_prompt", "force") + codepara.Set("access_type", "offline") + codeurl := oauthurl + "auth?" + codepara.Encode() + fmt.Printf("\n### This is a manual input mode.\n### Please input code retrieved by importing following URL to your browser.\n\n"+ + "[URL]==> %v\n"+ + "[CODE]==>", codeurl) + if _, err := fmt.Scan(&code); err != nil { + log.Fatalf("Error: %v.\n", err) + } + a.Cs.Cid.Redirecturis = append(a.Cs.Cid.Redirecturis, a.Cs.Cid.Redirecturis[0]) + } + tokenparams := url.Values{} + tokenparams.Set("client_id", a.Cs.Cid.ClientID) + tokenparams.Set("client_secret", a.Cs.Cid.Clientsecret) + tokenparams.Set("redirect_uri", a.Cs.Cid.Redirecturis[len(a.Cs.Cid.Redirecturis)-1]) + tokenparams.Set("code", code) + tokenparams.Set("grant_type", "authorization_code") + r := &utl.RequestParams{ + Method: "POST", + APIURL: oauthurl + "token", + Data: strings.NewReader(tokenparams.Encode()), + Contenttype: "application/x-www-form-urlencoded", + Accesstoken: "", + Dtime: 10, + } + body, err := r.FetchAPI() + if err != nil { + fmt.Fprintf(os.Stderr, "Error: [ %v ] - Code is wrong. ", err) + os.Exit(1) + } + json.Unmarshal(body, &a.Atoken) + a.GgsrunCfg.Clientid = a.Cs.Cid.ClientID + a.GgsrunCfg.Clientsecret = a.Cs.Cid.Clientsecret + a.GgsrunCfg.Refreshtoken = a.Atoken.Refreshtoken + a.GgsrunCfg.Accesstoken = a.Atoken.Accesstoken + a.GgsrunCfg.Expiresin = a.chkAtoken() - 360 // 6 minutes as adjustment time + return a +} diff --git a/readme_Flow_exe1.png b/readme_Flow_exe1.png new file mode 100644 index 0000000000000000000000000000000000000000..29c68fa23bc91fa2ae7a34de568297dfc5003433 GIT binary patch literal 82399 zcmbTdbySpH_dX7Y0s_(l(jd){(w%~ofW*);Al)Hdiqz2ENOug~-Q7rc2-4l(dEQqa zeLsKw)^DwQ&6;)3J!i++=bU}*ecgeI3R39L37^Bk!J)sEmQaR+Lx8}+JwZo)2D@|Q zAY=pwM-KN^LR7_B_h-se2bCWD?v@p1rpjyt%k)}v`q8z6gM(DWIAkjn%mq$o2%eL_ z@QW_`X-cLpol{{a-6bQZilm?2pQ79klT+W9pT6;YZM}4P(DZu!gkvQ%4pkfB!>6a@ ztzCE4C)THxtMbP0QnyTtV@Nby{HpH4cTJOxO@91*YrgOR}+S*(vIokuP z56FHs*WWk2J(p_Snp#;MONM73GdUmYS;ZlIVofE2K!u5eQY&!p+=I$|6dV|0kReD;?Bb}oD+#Y;| zxsuV4P7g59JuH{}N8EoeOa%nku!z0$e+^56GupYftZQSNPQ*v!#4-Qo_roFx`V^R$ zB2WT=RipnO<-kwjgStRtLl#uOwSYtM4G{?kZR9NIzv^xH*9vL!XE>wP!`JhuFumIr z2Xp??8-$_=^ot=rd%aU6L_`BC@gE$nevvYnsO0}-F>CPN z>LbJ5XI{wtQD1Jp>dlxqEx0x}?B;QrB=JL5DJ?dwg5i5zHtMlV|1dV|E$k~6P#|O6 zgGBj8UpT+@r{I%wi6w+Ou*_@p{i~zZCvVUbzTN1S6yJJwgmpdduKiRl`g>YsQFg3M zg1Q0-;KIlRMZ-ex%Um~~Mg6qf>HIklVk$0ex+vS^DIm-X#eDZb-YfYkj#Unk=$`w zZ+}a=(D0(&uSyHuG5zD%>SFuz-!UnHjjRD2*5$xDPns;RYyE!UC*;0D&>xpq?A&E& zo>6&t(j`2Wn@ju2YSElshz?-ssU08wYl1VL_~hY3u<`56erOh5JHEO&gvij-U_u?YMWrQ z7`wL!t}&65iv*@WwT}f4_@yvhDE2ccmD43w7lozC;8vSZYp=EtS|*(%SAe4JvWH*O zjP#W3-$t8rziTGWQ!B(K$U8lKH}F4@3OgD z=m41=_9J|e|6Q}*Lx>p)z#z=Xudh9HnqscX9Rf{=`E8L;Hb(M2J#RK%)>rR^a29eE zc$F@$g(+{!5Ll(Kdve`0V6fe}WrZQt*H&}hxvke*nt&=oZk(cG&sScX<^>W|srajx z>Ka6j$jK4#>jWywsy7S|v6)D-WIa&D+-S^AlB zXI)2xJl)_r>_Z;cMp{Fq2nYnyzm?{8iARQ2X*X4%{uC!SOsrs%UY}HUhuZ*Gv(nPA zR$XGbHX@46s?#v(M(mxTg5oZJrbNkp8kd1;CM~OareDF(P@1P!&pLX07>a`}~afIva%MyIoZAlry0Rih;|W!!aCQJ7e+r zoJDlY<@!VQ62I!}Kz*@aJCe;O1V0>YAfzk2z#2Gs<}lrv0fH_xxU_mb$i#4{r&yvbRPG)AtBx)ki?AOVs;jwAddnV2-AoC08N(+k(TaQ(JI?t6tPI zs@r?C$nAV`MW1s$)Fpk0vRh-=7X_YfN6AypY)rqydoT}P7@cMHnpFwNd%lldsO=9Z z`CjGGA~RQ}Vd?zhFjFFNGCOS^Q{3WPz_2H&AQrckcFe_4QVjvS2^!7ypzk7su)YTKpr(&91Zg{|65PyE$g zewX-NZdv>;u!HN0hWf8~D2s!gIoyrf2$dD-j@)M##p%}li}fBj!OtD8ce_GKxBT^Q zau(jSuxOky@>M##?~{q453PIfl#aT1A2k<5XE7m%^VM!hkME`9uKIiCiS#uE((JmZ zuA#Yaw(@eR-%$9m*ox;l{nAQ}G?M5Jwl3sZopOX-5uazYtu>Q=t1B(mVbNbYcV-|Y{$9dDwyD8!$9TNajFYj|`bHXOdP`vO*0F7c;(!Kxk`-`Em{`kg zoyjYV1z{q5TDMZOpG`Ek)D!;W*8$q9fr40@hofBtk<^Kwor5z6kIgNIoO0q9bbqwg zZb3&kGecFESUB6Ad3wL#Pv=8bn1$qA-)`P&63}ZplV67|T&^e~5wC4t1AOzNToly+ zSVfz45;6fvs$LjzoJ{LXu>vA@FaScXzqh-dmf+D{*keUyl~XuxS2saDhX5VRUW;XL zn~bp>Z)u^aV3Mg>Up3uOZ4Ic+tcu~VnTxn>P}eB(iPNvS3us2n2mx^bs5Tj*JHJsJ z?5yu*11-Ul#2fpeK284mKh~C`lRoX_!4oW4`<5#gFgXFr_`NndC?Cx((-TBvmyYKUHjb>Ad1#T5*^1 zZd`4V@c?D=E}>N22FJ^hhfG|SIu0kdqfc|1wKRZ_^W>J)SJh30wS;qO&T_vKFa-tj z)~EGEe0E(KwN~b;rsI`| z^0I@Etn|9{Zj;?CU)P(fpr@Q43vizu(^zZ)lfBQDJuM@$J2@3n1iKA=AcE_$;4xB7 zIoV%{;uu6EI#4n&cW=oSPOWtA8}bjW?K|ayylTf`z${-6Dp)7Fup!AJWkSm`B~x!M z1H$Dul(u=;9V=)*ki|LnQW-ym=hL&HT_^U*Ox=!M8m(=)^CbTW@z2%6Y&COVRe}9t zkrzx0W#<0Xj-j@7lyJE>LtSa=R(bb0vUex1gl+{w+Scg3tmiXmLrHkE4`Q5$BC{ds zs!>*cpU!rdpFU~Q#$wSGhzJEd6{%&s4X%a zB?*b4@K}a*LH%M@>N(F&S;oO9SF;3@PFejU3yF;T#0Q+D>j>OHjC@7e_C+4SE^wYs zH{$Qq))GY`AA~DP1r49G^_l^S;l$-HS7Ol|7z?J?C4nAFETbmAhsW9eOuJJGGp@|_ zpS1OAu0Uf8i#^!?UPUe7fBu3-47TvI(dgAf35c<3f7E2#bvd#~0d~b)J75XZd}D4~ zleNW<=u9|CZR^=QlBb|_J5#v?PC`nm%}DzcN!+9!Ucxv=uv=%XsC3ly%|kRUH=b zI1X}M>V`(FDeGL!199n+dk%E5^j)vl(m+s$Vr;G4cd758-qZuQQjlqM^63#C+cm@i zZUL|oJI+jLZ4~~XPUs^41tViovM^K0ifc$g(ovoLZEDc*Lc?u%fj_nEcBtj8TqpuD zdpS#eUDfN_%r18NOP0h2gmyK=tjdZHtL`Rq1*t*v950@hAx4774pzH}enB?!IZRe; z2+Ylme=r;jeu~gyu7G*kzJen0mn`FymL3X&;~>LzQT9CjTNEDbIEc{Nwu$~9 zCp4r_P4lk#<@_HLVe$$7M}C9|+{*sR-MwlloF>3hqTBF~d6;gz;b_0AT$833k=+~ z;EMSZJ3nEt-h_oMhxWfq2=?g%lK96r7tg&R#y~UfB$>Y=;KLJmd|slPYquatA`lzO zA9r-}!PJA649tG`qhDEycLZo-cC^~SK<3Zg01`xmOO3{#c>k0$`0JC4|3dilD7CdP zj9(1t>IqBz=4OnclCSm*olw0-a2r!u$nA!>&}-3`v&E_{{Y%gB-7IP}PzU#%P)&02 zMm2)UbPbuFRv_Wd>5<}-#eCRqRsSp7HHp=}eu_)oI(HH#!gG<3IlNJ)5BLpxN5|_@ zKbKsPO~*YyFSwM?dI($pJ39d{5yfyJhs$2AS;zJ(Y#)e?SP1Ybz{g(x?=p<>-wC*! z$Ze|MZMO$)z!C@Oq!+p;gD$e?d;gV+kqMsQqeAu4u@Mhn2CwK5ZxB5IgG|83u7#ts zT5#ZK{oOUmG(Ir?xA$A2h($qN+}2CrrJtKeq(2LRURV@>M;ui=7fVxLX1#tn}pGb%@?W))V@L8+^ES}@`f1Q?Jd}08ost+R-!t=)<^}h_z zjpwvPnJ!uSywMkx;W~7(GoDG^{6LdJkzzAls$EwBZW~9rqBwQZKk!=mjiaeB1z{0f zyMwCzxibSfT1Hid!o#l=fk`f;oeAKj1I1!Wss%ScI#1^7%^GReJL5qN`&H;itHob6 zdfdLKJ2iSg-A9kJtv`8`U(k$BsM=AeZe8}_;JJ3Q1N!T&P_9l1A$bGzpf^C>fACdW&BKw3>l`2K^HWn9%jp#D(rpF?M3z(eP5j3C-;dLC65PjSjTRKqP2i<3u8fr)%zM| zGoMj(fL3=NNU`^Pcu${ia;Y459t)2aiE>w(=wMiR@X?tkX@i^g_Jk0)t?xn-PP->8q_ z;AH-#d&rD1GGIy-a9?SrMJAs(07>IT`xzW#FQ?pwVS!QME(p26gp*i=E>O z;@)AQ;eNgwqbXY4Am%9Qv~~9M?8h=zUnK48A4*t?%1h*>2PTUp>8sqf`pZqH7$thQ zvM2@XQX?OhQ(yIS7D5zc!E8mFFV$t7#32x^wO5R4%z=qjj2Vg%0@Am$xip_g0p=yT zwDw#Su-siExndM4%{{T-Hx79#RYwqNHKC2m5E%!KIDPW3hLo5e!M5u+DJF^y@8b;s zA;s<|kFYKEP14rE_hv`00G)gm1uXo7UDYI3yB$Mn?9IrhL>~v@M3Q-!&E`|XJ2RR# zH43AV8<%IS)KS$tQ;PJ~Vo854zVDKnGaIU+GCRL3(f~ZxJ0cl$V@O0&A(3* z1_pc_9Pa_k^G@(+Mo1|IA-WBXU z)#=-O`hILt5WPrF z*atv58t+&QefjI_s=1=Qb~juqEtiNw5~oE*bS;C`#JRh-QXq;&66w7JZi7+3(*trs zOyoGwWU+d=NQX1zrTIPpT46aLROOYXeKR|HxYXP=J#<@UcYSzuv*!@c+J*YnYp`(K zmkLl-QMlc1;El1%Sp=>eS(70aa=^yPbuMffFazuC1SV-L%&%3)eq|cCn^}!hmRxDE z32ECb(3(?Y)+*(CWCroX>8D9*4ODcBlpe-MOpIk|$XC@>S9)BJpPRMx%%1jqlR0PK zRkKX%f=9l(!rJHKRGMxM*>h_38Y8UwCe^vr;B@#C0KswJBG)LV%2O(AWO%%*8;Iw( z=Vdp(7dn!&vP=)D4s><8Q)&D*w?%8+{L{=fqWWnh+2X|5%Bm6G?}`g0G7NA|GTzM; zH-s~3b6GEhWJ)O%3gbW4h4U?D>waONId*_;C3P%25;2l~PhZ)Mzl}R!f;m$33#z)X zo9jZ}ONJB+j90XA4!hH6@6v?S+k1=O@jKcDYkTQ71-9MyU zEc@?t+UE$<1|_^AeaZ~hays%3esQS`eB-YRCiz{WP2jQ1!n{R+nnFZ#&4clYzhfANS;_sdMi)nMA#6nkv&4TM4?u)@Q>TYxkliRfNJYc|WbMq<`=%W-$s3DYmkKp+;>AV}xXk)+w!t1`{x} zD)MWmB%i~vDFYSheiN^h>U{>HDLc4A3zB^C;`e@Zffx!9el4v9}tNd0Rx+sxc6A)PXQ3pTTg-bD#Go!XB;v~&M{LhN)z>$#&_!2=mD<20NH|nSq^913 z)pUwr0~pWLU1hgCdk%}X67^Z~|CsIrl4>0TL!E~iprLh3AFv>cd*@%4`<2*~fd`KU zPrATGB#Rb2|B)aPOz|zS>$NVj&2jMVn`^5S-!wawpj~iEPNRJfONLa_Lwv0rl^t&H zF2{LLUJ$WBO(2*p;{!X{FCW|B!s9!BhOBpj$A~vO7S6mL9`Fmdtver>q>e`RZ+oNH z`R|lBX;n-?FZ$k7zuvgL*(9>iY9hMjBI(YaP(MEDVuYAJ)_+3ksK3sDNSO z{`ux^v_!iEir6OJ5gVM;Cz2lPQ!aw3mgma3Zv&U)8}+qQi_yfHCdEFBZ&xb={hksZ z{;r%DQ?8gmK~!$DtgE#i>&)G?@7|Q-zEy;JzNC^(z}*hhQ(l8g=OgT_O%cA0r0zbY zWnt}dV}9WIgr!OpC%(1t^7vqgpLofIn1AL#YV*yH6F5+3`F#`?#FW7)jPZyd@ViP-a=^ItOE6w*tr)p41$=oH~}KWp8$ z^`;7=F12`t?G7;{Zj9MWxJ4If4pJ2#2Br5Zkwb2hCfjP3IRsqJ&{PRyI-E2nh~}s- ztM=z{10$&_`+u(chXu7|1Tr2Q{J5jj$wVX-cFuT+rL(0>7Pdukb*W}YdyfRqW9P}= z1qQ7i|K>Z`01!mMWAHuqmMOvQv$FmuT^CbsP_yYn0-k)@=Dw@!{#WGWa7l58oh6P) zqqBv0%|mw~*iP@8w$g29=IGSY%hHQr2gZko+D#tEBaE}ly-=3d?&-dB0S7n{JZ~v$ z!}hZtXlBkKHLOJtmbGpOolP+H&56cPpa;0&i1p)ksz*kZ9BCW zyU&y@4d4E|FD3hUqdIU`8gzo&ELwa~Izp#zS*?GvJCMvhla$%~B1=3}Wj<16z7K!L zck6VP^qoY{EA54sUIRo)@J{h4uF>Q`6T^0`TWMC%6`~`dcr=Q5RHdw z9R&V-%1+eJq6S4K{8XZEqb^HRs@vF&JL1C7!n{-*&SOdmk=GHl#^JiM?rH54%}~P* z3fFyYjbjvYXy9KY#5<_KkA3JB3 zv&E15zeco3Sbf~Y88h;1^19U3Ksa2y!S~W@feaXztp1EZl};2uxw&yvb?IG}a!LyZ zA>+{#!cY17R}D0PIN0IPUC@ZyQ~IG`+g;w< zGi^9a!}UQ}6_|GtQRzYWq9gv}7nP-k8IsRow`Z720jS!gr7mJkLXS%i7)|c{&u}1H zn|=4ytZ1^!y@IqXr2p`X1peh04U7F_$-7u`C4d@D`OW3SqW{&p7e3T-Q#V=o(@P!y z8nHT8;q~5&D1v1-njlpM-+Gb)%Kf;syzgRl)xh}>dD%}Hml9YIy_Jh|H-dQs2D7SS zU%kQ3jIdiY!-2;qFi%)f0*u2z1rLj#L|(}QQ)@qaqDy_4EQe=kI;OTdU|Y=1ut>qq zTPkobtK1INZTF_hWVO+B!ex#cu_6X*By*d+JXpHHKM*4M9N6_9X}GOoiU;C|8koL_ zhtjxumMxA8(f``>dx5oTAk#swZi4Z(iE%38`DI5laI_Kv=rnoHo$lOj;rX1oL?br> z(QC{;TR-zGP=u?RSMO}MZCN|>LEYJ(!P4_8WdcRWF4W7?6tzJGjmO-;NUxwgPpanB zT3M#NII{2tGD>fO)DOE(`DT=W?O;&J!=jPM7ZIp4-aS$1=e^o$8W-tAn3^4hF)WQ+ zbrjanpS3n(vix=$!iEEBDBR5VA#95|>4rlYc{BMkW$|4a;&BC6y=wQnNtLtl^Yt$C zWiCIg&Jre3mW{6Gj-on&B}pylr*BFWH$M(Ww9)u=?^jiMojDjY-~ZpBByS}Lkl1pa z;cg6Sv&ui<@B`{G4rII=NywY6M(`|A>x6;+R_DvvUNv%@UB?%E zwp;sqPVxN8IFRC72q-uVLR$hB$z-F`reWcGVH%`js+_m1C*Tn{+Y!6ES)sloP{gb3 znYa-CsdHSYH&Gbp?2b9D-jCE^o?P6>lDZ1H>D9afSh?leWVD#DpbBVCNfiSB;J6uz zJwROmc(eZ^Cb~9y?@;&wd#`c4DDV_wnob&H4#jZOkF|^t=n%@5IRaH70U6 zj&}6NF*Yz;55{$e@9OcF-1ybie~wV`>u192w?CIx9#W9LZ?qsCuk}cVL5q)P)zjAQ z#u$$rlR{WpZi!-;-U{4vU3wZ64cK zkwdmCdRSP~XNY6EwShs|3MFdydq_cD!fa*7pe%(X?3d;4U(3&f3YTk27sBRe4$|j$ zVtbXOwXW=rePh*F^l%(6SzTHYsF|~MVAC#>ee1ERV8{}WLgL3ETJVk&zF>yiKJ^f7 z6Vl~yf42|fx!}evRhF(22WGZ!wlzsPJ3I!a3uwLc%l~5d<%E%z4$$#D?D7|K@vgwM zsRRvPh^MkCO*1# zEK}bPt0F^7Y35_eT0>)yMki|Unx)gYlIy;D-gXrl(*wkNI&puc=qn3|2(ShcY(57Q z?0C4z`ORs;V-)qG*8WR;h&#YPXCO`5w9AX@z zUs^5oOg77sYpvcXH?TI}J-imEy(B>L6!zhtc@WKw2#F|G>^=e*Ox&wKHcCTHaOi1% z14UXIOez2g)NxqF@NVfW8i)4H$M;jrX^rrQIZ>;1wT$fBx6?Uplze0N^BB;nM>vH8 z!LWvz!&gIb`AT^f%qk|D#HKAbR2h(p#O1UZ=8j_bZ92xVr~iUs2?Th{J>ozOhhWg% z!L3}xD1*@tG{h3U1{vrM8c7@9Z^ETBGLI(E^HyiF!K|YLayh54(tW;%3#ncQ|89ZV zC?Gt8A|rtSHS&@-hwMDG1k(%)h*ml+C^dEt;{HTbuYW_?9&BU>aeir_=jlFosHKo> z7zcva;uQqUHon7d@Eg^!BZT5X^gbfbW%2bV4t~z?ZQW0Df-xF>IZ%HSN~Nh+K+vm? zek_z#j)M!fhzAReQqUcqJ7B^u>_-^{qyLfEaGh0~UQyl~V@+Xhts5d9z;YC;O+H?Y zVi3tMY2@&?$U8mvZEWD<)3dZWb-kQWF2skra~NBA?hL^AyHhxg%mV_J8-TgsH30^n z9?Kp78(2^u7|V*b5e|Rk`>1wx#9t+XR#F6bSa)*;tog4X>;N5D=h#5qtD@>xSi)%2 zAMoM7fP!yuw0{=R;{4%Q!=dne_CA31TpbWSV&DF0S1KrYgU9;#1E&5kj^U+X-Dd|X zk68KtACHOPLzKK0(xSfTpZ}ZR!oFZSe}+Jw4Exb|{L!8qewzl?;M`dt>74sFh{C;J z{R4gtbeRQ+<|6J}%l~Tc(xV`Xq^#Ht4p6stP0*Y7%KZ5k%)DR`Z`7`gj+KhP+N&@U zBdh`4bICH z;Qv2A_JIoE0&8kG0rvi?St-erw@Rj1myd;U8elUz!ei%;VAR~KK6Hd3j0Yxu2mX%QY%b* zK&uw=C$NacV1(mgKQ$O3Thjjw4)qsLcX<**yOz9~2%Nv>hc%vQ(B=q}Kg?XM0 zK1h=GfcSq#m2b@eHM(628OiB=ObGkt4rD#ken5qXM4C zZA+%?miiIgb&}x%*`-sVLt5($#K~dL*v%35SID&Z@#%ZBJs=1$grnM(7=3!Qic@LE z3yN7T^&;}0Y|~6H)ol`87FwSg$?U16v|aO!P-{uzK3waKc%7%$B9;|{H60wsG9P@r zj;}wKfwlWG=%@K)FK;-M*ZM)x{p4*wCZr|kxV z(FMY!^@38pgzRY1N$;!kV^0_v)NMv7>unNYoxO2&1JIls)XzXlV#l5Rn4lk;sMaCDWr-O1=5gjC z&5pLGZTR{F5f0%$CD0aGeCu!Gw-nBI8@zLs#a|m;%2y_T$i}~R;~aNSeE!DlEse_Q|Ovf z)jby}uStLaLB&cFt6XR2;903D$lD}fN|evhDB>&_sL3Jlyld^{V3Kg>8z_P6B9JY# z;31@7d$yMNem0eVgkSD+N2*X*kxQp?Gh5w=T-TZi%u(ntNAWFD7A{*bEvo=sVP|ty zvILOfrT)20tN;p){I0+2`M^Aoz;U14FQ<)kpX8xA3Zq^039Z3y^rqjZP~ycWi}jr4 z-)ZE5b3Kw|28kfFd2Pc(=jTiwBHo^#Q4s`|VJ`tth#Td#)qH4UHSD`7UVRXLs14d0 zLdsApW+!0%#%k*MbDl8Rz^o<@=XU0hLj?~-ry#K43lmC4QU%8x{ z#j+@Lr%VA3Mg)=3s{kqk`RwH8m;kTzNueCVUC*Eds`m$Ir(P;mQ>k{*bY>*wbdh)C zxsPHR1H_v#6}j@U<4d)+NK9I2?PHnSXu@#}Is_HQZVZf>*B=@2p{&Dttgr^kZT1Of zV7DUJwj?S*k{}R9@JMT`+9sfSm&y_UZGx7__U$aVjui=z2#P*)I#`fO;!6F8O`v+T zy1x@pyZn*{)fis}tBto(AUVZHu$`i^dhUe3D}yPTk~>7ugH+=bxeL5;VQYA4HU~&(lNU-*y6ms;TD>1$=;x)g}9tf=iRCm5&JW!%J5Wx1b%LQ4u_F$o~kwqd*j3zy08AJ_3z@J)?F1I7vS+8TTc6 zqE1$PGEWKnpGMZDW)e`WFjFWfD+QdNB4kPZf>kop|dkJD#Ts?rZH+MTfwgxpUP2S9w3v1q&0rZ6(cI3o0 z18pZe@UqaW1&m{zH3lyCteXSIg(hA?%$Y^o5#!li@?Ez!Kh8CKkf`LJR8UOPWj%z0 z6kc}lJCU|c(lgrZ9GP~8;lDdKjblbvZTWF*?JBfoW#ZPIdQD7y+H%Z;p1&-%i?RL? z<8b4DaIx<{mJ^bXs<9-@?&-9DmqxfZy@Wn}!V0h?;#O!AeiY(p95J*Mc{h`j2ZF}; z&A}yDU;Y#_ir>phyE(H$(P$aX35he)G)d(!2P4Flb!* z&AMfJmt=pRQ>W`B^m0FY%MC@J-|gc0GYqRRQo*DGC~zckuxcU)L##lh5B=)gH4oH| zXMhIv?Y0l_ZN$50!_cfQ@R5lLdbzYuF(lf3C{5p>v@WwVpNm)TNcPpk?HwKWS$Mh* zj2-PBWg)f>?hD#Uj+J!ea@YYYaX0mM5XDNOR)YXvkA_Je#jDH~SGe=jTmv?gZKFy2 zR@QsqILvkNgbig%b%RbsREt#5GT)rH=BDMe$B&(sIqp&5t+3=+)k#Einl4~mKDc zt@`kI=lK0p&a&sc{&>p`Xei<}&O@WCEQ$oyC?zuft+mMBbk)k{l#)CvnUH%YRSPu% zk4>ZuZPd&;Q4Q3gkEW_uv|Gl64RSFl|NR9a&)ca?^O-kvN&;k|WWr&BZefK&?nlc8 zUqn!>7dONQu-7Y1-xv1Hxyz;SKj!Yf3$%<4W7c7PKBAD~w=R5bWBwks&d!Kkpan*2 z@eimD2cq4)4rl*pcdnhI5VK(8mEGU9x;KH^_nt~sOo=R07|>Td-cL=IaCsou+UO!4 z&Z4K*G4QtkPH26`EO@cbgN)NGw*4#W3=sAXLTVZ;<6B#(D+IN8VyFR^GsGO5Zy(HI zJI3r9M0yL-bQ_v!9L5&U3JptivfI9ae;Y+zea%~O2Cj&;UU0U}tQb0b)-R%A( z^UbBoNb;aREbIgg-fiVs=}4`$`n)#_Wl*MyyNQQ|3_YJip1;qN`L*tIe!#6fP!>in ze3xANZAqP-HeT;UA&Gb3{m?80ih_ad$$D7bRKw5}d(G#U!rUWiO&nA)C(rTv1NFQX zNhx5Q=h-rSvfY`z?31WV+aK&-8ps#>#@ge`3YBgi=( zOkM*bZ*FJ5I~H*}?2Iz+EM*4D?@<|gnv7?)j8m~+Y#6w72F!+sAscX)vmK5COETXK zbAkYlG-GPO{(*Vp1%#_mJzrk?My0CV5dc|m_=8CyXp*82-xuvUmX(#&y3LO@$HDkj z{eaA9_-4y_3eErl0X_zb8uM)>4zq=sP6m3CshUGXPB^LH9V^Ul$_kl&9#Dr_laFna z12NSvQSohuoOXHSVpFnXa^E%2Q2D7GVg#~G@oE@Y-yOvZ+vCJvrgo`?_$dq>th zgx{Umi$=vYAl}N5Y(CA0Xxl^M>68%UQtA&&&}CEaeZWtdJWv} z+XZTLMr1c0Tg%(LP80TGie*{OSkRcQF!p^AWhBGM>^b8=RupWcHV&0D`?*x_qCP}a zt~tBFkUsKcD^?P#EnQGpx%8+$ecxrc==gabI*F=BjlaTF`|A~o$UNLKTK)Wtgqpt`C!HlrU#I}4piyBkQSe-4qPsHrm;88 zxw<)pf`XHns9~uTs!97oIaV;Cx7ae*?s{CF!;%lK$~;cA<)PU2WJ7YYcmnmwvuZYE z!6tzp$*Cm<$2+U<2NU+b=DyR*gIB3gGo_}Hun7EyZ62w;_9n)M8Y8>5K@vBxN_21u zoR51M6@apsk>3*iCOH1fBgyrX(=9hf?wVA!*8|(tg`wSRqsd7ZM{dvRW3`Ypg#{<^ zOBxkJ@bOFm6Avbnd68?l<)CEm0d*_FIkVxz^Fr=;K1(@X# zKJ}-BWqE!UUuS-5w6uBkNmEM)votXeC90}Mh0_3N^QgvWU}QPvbhvVPZ48?U*Ev)(eeGRa z?SSw4cFm+BHx`yBP8{NTMveKv)|a+9{da;Pdo;0}FGsqI25*&tWv={`8CF{c%Ka0! zGvo2&vsLDLT7ptHEt}Lcxz@5#N6+uCV+3e}4~y44fjaH(M=SZev$$~)RmD|?gAPB~ zDUS@;YA6_8R>MdtMCzc1cTLU@%0rS<1&^QMpUlNizV)iEdfOrvU^%r{DlB|LQRhAz z+dBGW0&1SGvvnGf1>NSYfW3HICzqB+JZ4NGD1PHkk&2p-dtSM9pZ@i^ylR8(j{O(g zBu*9;Cm@Ii&2cZ5b0f1Zo$)*8Mdu!+eYCUH;5J>pUd=(~Smj$h4ofxa?{{S5r@)a? zUm_DQn~B`ch-x@deJ-K@{jI#pDiAysl_FX&LuU$BWMv*uCQanFfas_9MP_HJAjfDw z-d_^HDgtV6@P^KdoBTP=^{ivMdG28ahiH6pp|eeP(s!|Q7TP6Ml{fKmx97%khh8p1 zT~+2n_ymt7FQqhz(CFLME687{B%ks1u4#KcV(l78%wSTw)>x$E2)Nq)7%6r3;W)Oq z3FWlTv~`uQ#8B*hB{(TBR$=HK-vcJJhjOV=O@6rZT{0s!Uy|K_$+cxT;`WMt{2AO5 zGm9SS#d8rGD4m`Uw%&B^AtHyB3cZSxk~ChWDsVUaOq7Df8!&{F;81SM%MPLnRU(yO zVy2bO>W#~mgIhCleOROJ{QN3P;l%K5bT6*cY?tm4GP|!raFDQ zl*+ezyWfZUvoC7<>U5;V=Juk+OoWWjneg@^1+5bB3}rK2oS)IDDmzdNqJgFZ>~D&d zs6UD#5K6FVxnnP0yF8gPk3v$@USSW^sdHtF4~TX@e=EBXs_duTeNV2Y;=&7i13;$^ zGQ>i!*PJLBU^I9YQm?KhogK(+9!E`qGbc_dCIysj*Vffsi^ZIA_Cc8a64*r}&sZ3j za7>Ny;0+&DwmW0HTd1dN|Trfpc&XMzjt}ldBz0LTru7clm zB1wwni24@TZ++vNuP)&=Or4|Fo&8XRM(`aVj8s2zRtZbPT0cMCv%OsM0(5z&D%gv= zykH`(>czMe1qhds@BNI?&Wpdl?&);xCXsunMj3R!d~A{ zMedb(eRK)5E4GRk9=3mQI zEFtZqFp`<=&!H=w2f{%3sqZyXGBuR$Ji;?iOHASzmX?5CBSJyA!*m zvK~4rY-cD$h*zr`ddGZt!j`#Rh~Z)oQLs#;e2tw$Io%hUvYXJk%$EsrfYJaq3&j8~ z!GwbEn8Yw48C5Kgqq?If4aH!kN6lo;0dW*6lFBL{vxm>&K9oFO$ZQz7epX8&RSTZ^@I7JyZ=fF&rR6#{er6I-f_4?h31e2## z7YzVPF72-z0ji2Zl-U?vVx|@pRUe5>AY)=&3IS6sddq?7{UinyrYz!urzWoe)X%Jc zet&BAwifZczMd2HlAgFaKvE}N)*`E#kgvuL#_raL?$hMvWdZT1Jgpjdu4Jp!;&Dq_ ztm*R2rJ_JOfq~cWMS|%X067d)nHy>T+z3|=eg{FXEE7A7pOtBk7r3m2vk@nU>aW&o7Xs`qV z1Pg-&cNjdlI|M>-1`mU~2X|-CpaBBGoiMmd(BKx_2@(kIeh<(4{Nz^Muj;G1{MW_I zneN@)yI1eM_B!-mba#icTE+}gjc|r0lpOQV{s(56roA}dB$3bgwzejm>h847A@J04W69`uhGPL6N2=noZWiHJF%cKgp z`bT<1DZ(v^%eO{j8(wu$gZ6z!s1(35QduEqo%zj@w4v%kg1q*NDr_F7+bk`~(q8jM ztU{8+>G77@0N~{l)YhXm0ylpm=klhA_&Bu^jYA8{9jLPSJ3Xx_X-)YasI>p_j=*6Z z#HuMo?%8;Y%=(t7Bai`=oZ@= z|G>?)cr^urGfe04lncl6?9+!5BJ1CsyV&9?TBP=Y-wg$li7Ho_hzoh%VF2|i8hD?> z5pmd^oT6G>$c4P2>sFZm%)`w06-|!R@`Wi3vp-z1l2bjo89BMlgTw8063*#6>wDAX z&F|h0mN?#X#u80xDn2KG-AM8qwE&@+$hpO!~bUrwpU;O$%a+s+=J!^iM3agjJ zq@HbNzm3&SOsPf`ikq#n(GIFIgtK6PqQ3zQsCC6x>tAK+XmINyg!=#LjvX z7MuTxaAq>I=?@3&_VO#c_A%SFHtyV7dHQb>gTWjT9upX|0tf7%)f=15PA}@sFa4g! zR70w7GO?MZKXB<3cWgiRe#Wo%iXHESf@nX$*V**W1igKheoZqccSqz^n`zfj z2^BRPpWYstcgOmPX$$MXvd@wyqU>espQWkzr3c>SfXT+bYjGcYMc~;i3Dd4A zBwhEY0%@_V*BOTyF)ahK2aGYKg5+SjDILQd3B}&tn{(gLCBCy+?>V|YKHo7_k&}S4 z1$)7yaVgfN$=51S4kjpQlazw>0*89L2qJFG>*(H{Q%7O*EK|t0;**r}alREg2}_G2 z>)etgR5xGmzKip1r};zkStGby{>(w-yDUZcRe#(u=%^rAL~7M z0O`*rKPI!5ZC3`rK`8!=ICHf9$KI$;v(jv=QVmt47j=^Lc9==7O7*XQqHEOIIJntY z1b&T1iM?xYyu$cr4RG@J|46j@rBJf3b!LpYX)4<7)ubbo{bJ#ruqn#-ma|$GyqXR@ zTk9{hR@Owqb(1>eJ5&<7D04FoL!ax?^ftD6;os%i+w%z`ACwDjdF58; z5+iSjH0BA|44B}M200}d>!+^~tf;h_Dw;19u$%RMh%G+gCQu_nuyX2uVX{C~J}^Jp zx1dDTX>=*qZpJt6a33&x?a@tt29QZtMs#;mo&9$7(3f^hGfGVBr6?fMYTQy}reIs!x@bi#U3znj!c|Fi@%cBo|7u9;8nWRi}O_9t8 z`66kOr9Y=3rW;b~Qz@GWnaU#h0;~NsW@p7+Q>Wve;c54~ir$Qa<~_DcAgm6R1t_cb zyBxTcW!(?5t@*h%OQqhEPOqCMf4BXc@&4D3lvb~p(xhSB(AS^Cr!)uH)EsZOB*q%P zdSc`seP-vp&lB|0yY}=|veU*my4(BiH&#*3TcLN29!;#JPC}V($f!yu*%gW(57vh2 zHF`5UggD1wYw=klNhmO1CNZ0P@|^W3@JdSSD|A=%g-%{JUxD|nRu zegD`Zb9!3fc|?8r&U|h5JpBhA5&b$Fbi`-)y4R8g_83C7t?e=!6PqMfsz2lJy?%)l z$Aae__vg9`P*_i($qA10b>$&c(oR6SPn6wsz{$02y>d-|iieuARk^0Mp{`gXU~}-E zuwfJ`WGX+`@W)@iU3);*KCCWG8!5pDq?WH3L&Wu*NCer1L&$T;`>n02HVfYbkC0)$ z=8s)V?rd(QR`$ik^kR2eAHVmfj-|qt222&wpo;!l%MFA#d=A9?PTsK!DR#s+TI8h_ z74I>~i9LNiMQ->wwp1HcIg%ba{XVGc+pn~J*Sk%FDB8O|)D+q!&t?evVWMw+53>;g zJEnU6eJ?dNjB9MY_Of@>V>pc#b3@gSr@P9!X>{GGpRN-KXmWe_4vT*gMe;Z`(Zp+E zPsYN*$;R!oEN-38^xkv0K6yWsv6(H>AhBzBKL;|hY9XEnfXQyTcC+U|4kA5jf`l0c*aQ$2;2 zs>EC9`(3qqs}JGx&7BjcWD-IN$^26!=-}UXV$c!?sc35p|fi# zJa_R!F6%$hStJ`iAk&e71i|W;C|sk16SG{bGxM`kn)lDozZ_>|+cqt+&fY2>YFW2` z*Ka0?COOxVPG-_a1#)S~f}hxEDyk5*-v%EakoTTrMMf{?)(mDeX3~)f2$ygDI@6R% z#TDJ|Yw=jND#W+GH#!gbm?ujUEkZ!F_gW!CVt|dx*E#+lfhUB_8z~~yUeiGkN0r_z z8z{ePn9ZZ}r$Vj=tb~p^FlzE=P8?%Git*$Yl2uiTe7n+8mBnI%Y9*%6d1n%xEz?kz zXg51*P3sq-DaX()QZfTLgKKSVOjU;jID9bKPBS48GCyBi8hx?}gP!epSmC}UJNoQ< zQT8iU&@CEwifY<~gc>cd&NTow#kPZ-($$}QF1Yy;2n$wGl5x|(87>F&r~;BM|g*_yf53#{Tfq=_5kB8Nh+uM`&&U@*eG)5 zDy~pDr0h9nMh}N`D;qV{p@~WcX~ZO2bvXM1Aq-7)J%FGLU%v>2xb74m*6(oVC;~ zDx;gGQ2D299W4^fLst?Pb`tZrnS!``#;k2yeu%~F5lr`7@>ah(%CpF0sVmo~(t)5g z6R;99#k%Tp^E{(N5{nh;Mx7-{Qp?on7dX^bu?{{t`Mf-GTFFeO$|cXUy+;mCIAJop zl0zRbhWyc_W&p=jMn*7|9?bz9W{VMQ(u%1YlfAMT&MEm_<4lRee1zELkZ0Z^OKy+s z^Ujj$w8&e;faIPa1BC1hOi~@0yCr@!zID^WX4V86B|T)$nb4x=OcT zhsmWb==J!v%IjX4Edp)l{^uq3f&(Q05UG|aj$(}bgQcu44OMPei#w& zKtXsCd~k_52*1*i+8k8UWP1nB>kf;sE_Y6OK5*X$L(X9iDDw8rVWw6%k9h}Yurr$* zbiJ+Xf;2jLRl1+0c5`#idP4J70 zKn;25l2=T&!IIN1hLW{-m&$X0lz1^dRH@BVycjEirE(QUkm+S`8n<4&kOyvUf)ot& zi^_%os}PAq9{)3NEdbAzeG0?QgqkL%Iw`=jdI*_C-HPx3qWwR7E3q0HpeBo@IXdZoctZh2lmG({$wE7d_%}G@e<(OWu_*xo zas^p2GOqvWh7=A0HJosjNZPcD@PF~E z0xTptdU~W|wWHdg$LFmZ?x!o{?vFc6%fh$lOzgbmd5`Rex> zxckEuzsP+B+GlT_@UIGpuV{}>I#q-k4r1NxAH)ZQ_AM-3EbJ>C{xM=eKNU7h_j+!w zh`Y}vp~&EbhBmH8ygwHXw!%hx3LUjdQ=puF|I(L|-lqSeHa4IE<%rvYotsOO>F(|h zgt+vhk)zd@rWnwM=5!({5JH6G-S(YDi{~etth=|U$7&|wWjU#A|Mpgj5g<@zY~Qvb z>SZW^+paI)J}mH}T5{Hk@7j~dFun%KAR5sg?eucqxw*cYNF)pm&e}w?=J{{A(Tq@k z1%JFqX`IN%11H(0MKZZ#Q;))cp2#?V7Uaz3xyWYo(A8>Hk=Idm&y0!xvrr1@R$ZVf zdZUkadrv(rPUXd_GfSJ7s&zgmQ}_W7GjmLutrfN>B5vl3!2^1(gF8**I#(ma0f zf4G4;EC5$A7-k%Mo8a@BoHQ%&P@(L1$+m@H2E@@BvFhE;e4D47{x|eXqu)pWVSI*X zKJjjM02{qw0Ug@eMAr~4^z8b)wqI%sGqtXVZp7TrI`0G%D_=XAiAPXfkLCDk{2q=c za$N6rED5;SJtt}KyeSfhzWgM+E`|2B#CJrQXfEvdA*(vB;zZB9=+)kTiO*i(I6Q}6 z{oU1RY4ku{d7WWlxM?i6`$Vruezd|M7REQszr{E&N$!b7aiUauLy*zxfZuMr7~&(V z1QolSCLC+U|4b+U_bp2yq^6wtL0}pQjqA0v6B(uj346hRD7g+~h-r|;Jrshzub4iU zms?jH!3ARG{XSlmSGmc|13l->>WvQ%w;u;i-3XN=NLn z6D!2;+mQzdHBxz~!Zt-cPhJZ@kCkl8&>n|-kQO=uC9?A(dUj-1LBAV`IX;blGEw{w zXLJ<gv-ztN?Ft~pFnsU2`l7JPZzrHRN*c!5gTA2O)=*i$FO1mE zKj^T!!wB#&u(+8LrD8u}#tSZBIXF6U{ASb~>Y^WkPGoG(R^4JRxB7h__`6&{>C2e5 zLPK`4(HA>gX)H=Nq7zDb`xr)b?VKaKAaf-&OwXX!j(73>YY;T#q$3UDeSCrss#x?# zVfO2b$Md65=*6&@`$jy^TOR#EHNUd?E5}-BAFtNhT=jf#b7F`tYd_7V6cAxZSZ>k1ITDm;1NuIeuC$Hkv>^ zK~GN@7CDFGg{u4Ykg~_S!O$BISb!7X5oi^?>>TUiFs%8T%2Eq@nSi;YPsfpZ~s-{YX<$-+dHrai1F4Sb+7OF#ccd3 z_UKoB`>6ug=V%8l&4nmtjF>#ec-}??A$xp30U#jIc;864=M{SYI;O*K)ls>SKO@ zP!ujLjI{V%zPb;MS4>GYj8Lqy2A3%;y7hbkIZ^*|Etcv1Qn=IeyCr;W1LKc)tZZ~_#L4}3u37!w?{~NQOd7N zg(}UI$KdK(cyIp9BpNi2QlFN?G5sT=fcMux{yX}(fX2IAx9zQWtNIV8bjgaOF*R8Q zJU`Xg_7?0XjDGvuS)pf%+TWEUFBKN6rRC|@yRuo;xKuNNOux%%SE}(Dz6v*;xYKDi z#p1D9u~(^)`4#SF!tZ2umhf0d`QFi9Rx`--U-aQGjQoZkaE?|%Y|frkDg$K~>U_O< zn2ct}*RT}G-5#Bg$Hn55P>7%iZ zUzP9^RKQmF$6oikuHJ@F=`y`Vsvrfoy#WbaT}??WQc;q2yV*a=gEtoo&y;7Bqx^(YIUu z%@zGygKeKzbBMbD3=X+ty-#5>Qvs!iTl06#{80>z&rj`vPlBNLfyWGSg6Z<};ZfR& z_Y^(rjJlhtx;k zqMb{?-zqEo(U=vEx01wq3fW*L9!Ain5>tuyl%q|-1TgBxv0}VHb9Kj}OOeLo9 zqDb~CJVk%ttAbSD@L|)UBsUN9OrP32q+^8lx0YW1Dqi?6F2D@A1OQ3dbLInSW^u zl<)An?CqMQ=q{&nse(bn@(FuT#D6-#jQtUAfzrQ-j5mh+5#Ikb;AuP^$ggGmdvbmt z_HHp{JcCJxyoeh%fBO6^IRY?j0_Tg_WMl|<{cz(U1y#xqH@rZA0+5(qI5Z1yNqTN5H1EyWf1yzo|0eMag{JatprBu{V zCV+|x)Eq!nNXLO%x2MN{66*-)$sv{cqMwKd^uQ_d`2xWGeEQFGG>h(aN;YJEcVe*3 z7UCs;wS`%Z-d9}IN{G5d;_Sb@7{hhIrf;Z({ATS$E|Ug2SS#l&_|N$1K7tUfaA6e) zD#nT-&Q(1u*!neZ?GMhaCO$M?8mocHE2=tVC0lmd6ON#jHd4woi*b4j2)TvnPb z4{oY0FB%f7{8dHEZa(aoY6vF#T;6Vz>Wb=q#eZ}B6AZ$~ra?*T|EC!UG?TDt>&E|M;Wp0&GkDSR?EC~52v(Q( zeZ5W_T*BAzH%%KD;ahZ>3K|T+Ad9qMabQ%mMNVIzCea^FO3A;6>JnSwXTyy&o{p6pt)&DzmMLeT+@Zw{vgI#z?M zQIP<200H*Y0h}_u;>f27QDHaz{Sqckgd!zBl{vL!9azIlt^SHa$XTBS< zJDyP(ogTrLU*f~shk7%Zp@@NEakBzpTi~jH*60~9L;d$ZaFG*PL4~7+0W!l2p^~R3 zJzPb{SIX%~djES5&lG1yNUTn1xsaKViW#0q`x*fT^(h{oA%4a2#*dSxm`CADv$s zblpJDy7_0TjPO6%X@|Yjur>~#QO_HVBO+gJ@9O1NfS-^4YVf?K0%XjC%#=vSt858q zKE%Hxk@M*q6Bie6@IB{Dz8&ri5MDSs-Ns5RgfWI(2(YTZEq>!YzLEy-MfeK?O<@?5cC5=}1z&)$YYkIbi+L zl$+I_Q}ZK(O5C}s?H~E*=9Nx=ypOdPlvw3bD5;%(4-}>zFm*$DL9j@)R3{9~%xYlY z^HUltl)nRZu!iHpdt)m=Rdczuvw~%h!+3&0y%KbKl4%FXh4M{$Fd2Uq&4*-zAofJp0%>YPD$f_{i({#h4OMEY3mUQvKK}L zhr}j7lesb=c^Em{aUzf^Gy2FBR`LNF;dm`y*MNo{Tk}LCvcR(N1qs;_)^Z99I1{J56W(17XQ%dx?y!j z`u3&egemGTZj0|yH!W7f&n3b?Q!F++nCdDMXlkI+XKtu zak>(zjvDaQpZ+$QN@rZ}+oUm7Gs9s27wI0K z_p=}8u(6?zSp=)AmbU2!ry0`L)Y}(PfKwhvweW_C1ARfT9D&BKo3gwAmgt)|(1Py6d15XQTO+lX}51@Dg z04^7N0ssJz2?M1>GXd^KMHlnE^P7D9DWh%hyIU#{lg`VoK1JEU;0R>jG&ery35LJ3 zRj<&KZ6(&A`8B24=pa_g-2_b~zq=zcW7)H=!dP;4#{zPoY}%^v13kH6_GO&O(LH0RKce4YAs z@1LOZWrt*)wcPz*jRSqV6xAW2Ep#4ICv4tAvHY(i?!~1Z=CxQ_P7KQ2E%)N%<2=E)j!r&b2Wo}lAv%4!{fS~dSdv_v%OL6miici1_;O4Vq!cpm=aW7w}rwg6DrAF-^lC| z0JB2;rYgJR!5vM|Q1rH`&Y2k%kfJ;v4Q;Eh;Q1a}r~kKclL5Cf3bIJjGu@b~gVw+n zQ{Mk;%qlue=WZgr=g`VA>^=@HfC4#db^RHDW+KqiDgPS)bU{^U0}{WG{EG+vX`1kY zWdT3CIXmw>3}Acyo8;54|28|Jjs~&Hy~=-)0bn zk^_J_^1i{#r)hzu*wnJ052%k`;9Bn8{QOU|78_3Z8`y@0hvnNStkY&A`_ftd(%n#I zgH_ynxuU&Sm$WS%()u__VZ0LHPk@}=NqDGd8LCqpCrq4YR>0hc)Bv+Qvn@~O1Ax9R zi;@WhLEMN33hPH!J4M;+s^b*ja9}GrjxPvI5kt|C`NPYdFWmV7Jg5j$n56~w<0qm| zFhKw>t%vVd{lA)x2>E!xJf5KrO!@*&Dhf7H4*g$EbX{8NC!h5i1OLkpsETxFVm$Nz zZklL;B?0T1Hq3jK1J-MO0qOMv(9xRJVQm$p=8~-AfdoLc;}le^ACZCIl@Z&}#Q?4q z7T7oh?1BCaInn#o``b}e?^6Wr>O797S3bN= zY!QRN-hP+JOpQnkze+MP5;&@1Fx$^*1XN4G~xoDJenkl^oWLEEJHF_TI7qgWB3G?w%hpY={7~ z$Tm8=2!41EunN?cKtEfUz>B&wDg4s4!2_Z)?`o8t0|yuM4PL#f<2#7$p>j>L^{ePy z6(K#p$ig71{w8-k;jlY}mp`Zxn46oceLHtYwBh(L#OQuoCN*KgIHXf=XBzO`aJ@VJ zzDT2;alJR%9R3Nc!tpc;4TGG7ajGbTD#aQwGjALHopNLU{H@$Cl*cGZ$DWN z!YhZd$00qd5`>qu$L`!U8oB1=(U#ro1h)>!tu@2}-zWq~bTA|V&qaLBjw%18C%l^q z9}5CU%@y`E?mQVTGHA{&SL80y2f@Ig=v_X}7WoAIvx#*5DQ;e-ocNv`45Tu|1PHi< zBAn9&xIbb9;^M;z>xQoVlsc^;hEah0wk}WEj}ewVor*o+%j-n^Nu#uW8?5NnM5HP$FA zn#iP!^Xk>B`P;7Kd@QReOXTg$`*=Y^@x@jj(tFRE&RXV_n#;4(BZ;g4YEv;0D>{hT z2$eY~SH{pcAH$R&mx&lyJ8X4UmEk=(#5oM2(U%aF^%WoV5T+hUss>F|P!L^c(zi z!rxL=6vIOB`2sA?MUDS;nKK=GL525!3vb;|_GZ|IPRYVp_Oze_dVcUgou&%CHvi66 z!5pXPCPF@&j0XBLh&O;Do}d2-&uBa~?uOWR!?MKG4o9<&z6zo&@S=PiS$73wa7D?4 z8(;{m`*HMsYs#isqCOaxZC~RA4JnNlfB*}AYexvMK-y@SI4ET=&MbcAaLx;81Rcg_ z2$`$UIwmCmhsfq@%=1~mD?W!u+3daf+4BDda1Dh1ZvZZhu29%n=Vxv~l@^z4Wfu#J z`C46O7e}IJg)zcX&z-uzWv&gV_ByWpm51(p(G;bZPtE{3cSDp;frSXXzsBGCkj_25 zgajt-5iF&l30&Va_)IsV0QcJC=ywjF@)0WwAKh&lg-lfpYBf4GnW5DA80rY=M^`W9 zY$we96}C)4%aQ9G(Phy)|xfh~`GcS$Fc4`G@tCEv=`G_J^g_CQsRagwr- z0H3Yx8w!_>q{DtKWiAQ(H3kOR;>$}qgU;t@Bc$ceSwD#vwoP8``$J){P&DuMF~43a+NDug6%fkBK0&x2%@q{<-hT4AC819q+y z%(;%P=?K-dk4@uy@uk{K>nsBRl^6GMQ|AVMt7knGr!KUk#Atxud@zv*jwTlQ8Q;BE zflp^d4okB?e-Bh$Q*!c+tR;%;EI(|bEj%PL`Nt8*WITltRRBOF8p(M3Qn0S9E6_Au zxdFnsZ?zK`q7Z(Qmo!N(+R`_RbAR+_@?2#AM7$(fG4TiDu!buKM=#fha)t$9 z{5@3s$Ge-SsF&J`$y6wG!)KGMa^v-*(AieJd>_!C!^HBxyPV44y749Rcung`l@J;x z-ZFzgLEi7y^#}2sX@WfEA?aa-*lF+P%>lDm+L?tJJF~ z5SGCDrtgZ)rT`6J7K1Dnt zSz5hh92ia(TNyIlg+(r1DWPYD<;a^qLEAJF+GBrmLwbBH5pxL|;vhDvRa!Ok8$Sjp zD>wfl;`OZ4Z}JT$GX?r1QJ8`Na7YC;<5694^fR-QIQ|9Tac|W3pZu#LZ3UEm1ck9l z=@*1|#|`CJLg6YAnRK^3`27hTb? zQ4RTRC$8PYz4wY*tykS*z6epLKFXJl11zn^1;bQu+3qMx?6`3D1%lSZy7^7O)+>(Z z8n>H|J^qsrwvO8FDXePxYf2n%-a78WVl^AcrzxRDjWJ+XX_ zP;FtEfB^Eb#@n|T&TbNoRoBDIZTY+HuD56fql^A$f7HS$w-*~Z(|SIs^+4~}^@pG@ zw5UW81xMLT;SBASv$fIy8f3o%;sjlZ9FmnzKZT~sW{?l4=`CY%Y9!x0*Vin8lqpv{ z%h1ulc^F@u@Vd);?3gr{I50v@}V7$#K3>G&aNduPFqtT$>GV0bxcb6)_@N(P{5 zpb7BHYGt|kiW{D`iXTTq@Bu&c2FXt3EdnXr0*0qY44~12_$vC3MDT_ssINlTSko8j zVz^pXxtC(u_ynUHIX#vhFA8h z4(;*Qu=g5Y-YBGNTv2K4_0`kFI>&S{#PJZ=P}H zDFl!$?MCp(Vp`Mhrrd6}z0H;{&9)}6rFSEk6QM@?+uATM1-}~aPrl}%`5Zn$*cV*S&)sjlk=v`%78sIpU52&Hh7k%p}NXo5NDlI;@I2A}fW8XjEnT#eYg^S}lEvtD_ zC~Uo*t-T~4I-LuZ7P*gO7YA5|U<0su-aegt#xtLrVf?Ng8iPOct%qP4&l}?}D<1)s z05YT{pLjv7=M5K@f%b;&up1D|T!^Gs!F&j$OuGit&q(9l$H$)9|GmtOo6BXyY@zYU zSv1dpx~vFsN$)k`{6cI47oXb;Bx<4ic-{|YiEJt4T{5gai(gvfdEPrIrdENDH+pcW zocmWb8?Fv*71N0QQJj}nfq>*N_?Fc4iqO!F$bLo0d@-ZcY_er=DCpG1_ZWA$(v9*=QhxmXEG0V;#-4|{h+-4W*NDnjqB zIgRI|Fn1Q=AQ0P9w4=e-%C*rA_meYj84SxHw?mN-VzUCzx2LbUB}bc}@glIYB_lGW ztLsyO2e(Z!rL4wRY1ZfNZ_qjf`)hnb+8X-F0mMS+B$r}0BSLtqt<#Cg}f1*xHE@2ef!-D%cnsI(I* z$AbMBBBhWv_(CS>$8h4~CKT%om(R%(56DT7R6RxLG}k^F|CSSb4~?%IbtKsd`ia*> z<+nTp-QlS+vXECE(XYhkuPT&GdM6#so;O5|)>x`_*yUw~1)rrAfR2x`y99V^v-_S9 zgAIiU8P(`;mI6UDHT!&Mu&v7%n7~mgy>fjY$7<_z%zr%%-+QY_wDOBJG@F^gimLBB zOv9$h`-17FjxfrDq%c=m{`7Fp5}%&R^7qar3*ah9k?llZ|Kln)9*BLUuDu06Jdg$px@AEZ^SC>2!8|zVDi*#uW&wjh68D#gd%$4vDhjJl5B$@2 z!*;ga)-S{ z*C>P+o+x%S&Hol-7#e^35^qdatQZiuY(7r6+I7Si5D^^I zIvlSwAZoy}p$w+dpBUq|_2F_=<%Kip=-5nT+q#xh{K5~-4$JNW-XL4ya-?eJ&(S$bUtHq7#` zIQT)OvTe!N=qcs)CX%0ou2dDAd9?y0KRzuqZ~ox}uyAik`DYx2{0M2HY-2Sl%GI{1 znjz>lqU(P0VUqLA*!NBLp=EY7ly|>1NW;{$K2<~1_0^O1v0>7teX-^Bh``le)88iS zJ#gL(;uo2|t=*0__;^~S&j-JJnzaE10 z_&kU#ISV9CD=<}ZEor;Mv-v-LM*jGiOwD1sX|dRTjk=(<-?_JKuUsZUsUn*_aov5P z*ko#MOGy3>+=lKQyR?S|UFq$jNH4mdA1=)?J7o&TwHc)d3kkFt8D-532i zv$?(4oK=rXxubN8&%M$ei(N}YgXe=l-bK#9SkW^CKA&?SI%K?d>;s|%FlUerySXDZ zn*&@dCEC8=0S=gUQbLY;QBIUmh5Yx^ zmt}&%T?A#IdWL&upRR@9T<4|AN!b5$P5t@@-$~*V-gaQ{}&g)!9}IlVZgt!Uz>ut$-PE; z2*M%l6{O=qWj~%l$d^yRxjkir`*;mV-1Y4d*sqGTVtp=DDq-1c^^L-Y0e+!_^U#&b zn%^Zk{lcK>k?O11TL)GFOpECG@)DW;sH!h`HzQKNWbnrZ^5Hxi*Q?XULxfe&W>}X4 zrwr7Ii18_&J?aUYq(NMO2ySoH_U##-gTph@%lctvhW_V(h`Y^DX?COeK;~0aPjl{e z__PR@v zK7`4-WkQ|W`5Cku83bNgp!E^PSX6!Hh&bf%7J*3e|2!uru!J@9~8t#0whkwRrNaTfJ|!5!kF%qBY={RTkxZ+ z4u7_qACa|S&pft9N6k&F#d_wev_OsGH>t-#7dO`%h5g7PUPp+r2O>Su3T_V9XMS>V z3?iXJf0%c_wSRC-4}0nQuCw?<|3fUf9Qf54&fE{4iubit2e&haN9mP1Z-4nn36?|7 z9Eih;5psi{O||CTF#lqMC9`6NK&Duj@0-i5)m}5 z^O3jv-3HJmOs@hr9*3-P!Ks$_Ox`!E9#PI;ifdV#Fmg$XPG@4OAyKSvS?yJxE~=3! z%vwl*o3skgx$|b%0D}fgzqFeV;a{z@T-XbRcIhgu9RsS}ky7%w-vD9#qJ@GIZ2Py1 z-cFZ9WnZeLb?GGQTo?@C6hQLb@z3ESyNQzh*h*0hqn(JwbSqiOTc$$pi0&uF?fCCf ztbFH|W%tc8;0iPl%vRd#@oO_0`KT!|LYlBXLw(-O;0z<bwXl1lBVq+wFy9|Fr@ENJNOBrt>eE2 z!u0VVs^T*;EJ3ff4~ zTotYod4vC#1DJBQ9b?VT+_T~ddID$kKl3CG$jviv0&i__VV1{N2V9DK+d&0OyE#sT z@EzfPg6qg_i9L~MiHM#ayqQQpHKk^w#Ftl0TZLg9#*3wya=Np4mAUq7)^S`OixSzUd1&=YW#T?sr&I2 zx2I>FX{d$z=ADjd zW_wR>)(!iKUX%$V#x}Obaet86mwjvQxKMR}lvQI;laecz%)l{q&RcREKcL_AfCZ$& zBsNY!Pf3~__eLk~rxaEw!@%eZV1ITl(ndS&cJ$&w1g)8GJ{(3$m`d{0w0WH)6kHkx z3)q%^^9{3t2zoIq?em9qR(n$D`VKRhHB}fk1YJ`nZ_JDu9;NODf;~7RhjQE=r7b4P zd6>Atxzr$0qpfc}{aRG?Iv20_9k*_0$RPsq)SzYzpgIG6W@P2Z5s#Wmlc!2Ulx=Jt zBOYv2wDmEnX9MZzx{Kh9Yz0SNm1ZLOYr`~>2W&f7eI**^HfFD*W%9FJTmHSo;n@Rv zs-O#zPBV{G*9f-+n!LV0mc0lLv=JIKVKH4@ft}(a+;so?G?b+)+V4=pij4`Qn8o<} z;}YK>bR6RDoh6OB6E3X_yzn_#OH!8xVCL{YQCaLb3M2GV5YZZL={YR9T>|uaqEBx2 z_b!h}TZv;2ge1$Slj4N^=vur_h?}*@pH3d2Qv`Vk*MvK;qMN5B@w%2XD#+7KbSm` zh?ezxR%<8lPLY~@>7;BGgdEHP`%GRHa2r>hWm_!T4lQnltk=kQzP2l9W@a1`-j z*G~8x^JSL-fb#1voQ!!N15|q4V2$)-=~~ccJYVA$GQq$=Jm2E)W`dN*Ce|%*aE`?%}@|2XKO+YF4Pff5L=}X(z`$>hM%vbINNzu09{WbOzXdYJnIxL}&J zqtT2{3A>))cPgQ2Od#iN@HYlOOd3Jf!-*wPO_y``DMv(A&uj3NHqG+mMZBz9d@n%s zZW(X6tWgSl={9 z7P=WynckQ%XyjsB)juK?bJEnOy{|u9WS0jkxdG5h6FnKwlzR#+&MS1!jqU*XQ$l^H zo(K~%unGZAQPevwJ(&RHgXKmb;1}SiR{N6@%F(||->|qen^-@h;(DkW<_ttO(|;j^ zwX&yme075ypMJ_;1z<#w3H09uhL6=oem#sJc)V_=5>B$#wiWrM%| zQ@%FEsJ>wmFyzo&6=YGyu7d}eY_W9|I?l7x_$&M=JKENXOa;&|;=KU6A8=vfG95NS zt8P#t!ghB*qy!j#-2v~%D1jt(dduo+N7vXQSE@hRQyNwm66jwH<&aE{dtbt0L_T9F zh!}e)3Irhp?-r{>5XHso@L-obwNeN3^sB3cli*HA%&U)QZz!q>JCce%KLy9f4zn8I zmslpYb>c~7v&BVtz%gAg`k7}p+EHE_$KB}>h!09j550=2&4+kbE)mT!SI9>3ZOwfK zvc9A)5RwK9CHU2zF2%tc`;Z~bd)rksUPgLEV5~J?)CPZ&*7ZaoX9~Lmx9}*TMkX%o zu}EpiBXSD;i|5q(+3@i6ZlUzSD#%;OuvMlXIP8UxyPE^zOarp$GwuQ|OF?>ecWusG zSqa3EGnup@#=jZgJeT|)R%?OS?}&rKq@h2Kp<+uGnX z6lyKpP+)xPxAeD12R%x8tb*bE3;YObJvm=D)LL(q^1Y)@;xn}-wZX(aG4_#({`=kQ z3)UoSSKM@}o3306QILNg0u_f}oy@24(N&3WF} z|Gu7h^L!p(jm*q3$KJ=>D|Zs8EUg}2u(v=+8i z-|?*8W}pG>lA0-kMpz>dw&F3YrP%6&d&-)XP0lBex8m^EiH7GM`()v<@FwZ_`3BO8 zv|XcrlfTgTFz=8T{NO^rG7&1v1novzJaz)p!&UEXoO4!ICj8o7Xpr+6kTo2)!YTD% zCF$f-Z}xbTJr8J#KM#xZ$C5NTtokEe5n`3B_?+fp?&*7<{5}O0h>JUT&Ei_TTbv(_ z6B379GRmj?A%{XfA07?i;=Bsgxw*N*$TUp(gi&k7X-)t9p`W5nP#-*A@h>}w7S9Pq z7k-7Z$FS3C{1Bjre1hl7U0zzDN5Dg^f8nr8Qq%QYWjf~a>-2*Gq4t*}ArBcG?GqF5 z%+U3$O0#!dSxfG$`o8U;V03GGt~O^UtzikX;TCM;zcUa% z{qXyM01veBHYAkKa0|*z!I--Y8WSY3)fFU#Gd*XjF}#owK1`e-qoZ zYeE=dRWv}r`R~0&q4a66;9-!)2Y7!+KEhj*NqsCCW%R<4wsN7A0yq23$Vi3a_atoX zxMEFbN}syCnd*{%^x;C!pBuv%I*Z-kUslm>pK>Tc2gMct6bF@|~5SCW> zyuzmrA@Dy9Vo?^ugVqV{voo=ci$pqCIEW24*v8T5BY%!Tij+??2tk#Sejk14>+ks@ zAizH)|Eb=wNW_BSKXP_Ou>!=JmkoXTEb^zo>S8YVE}l!5(#giRwe@j-59_}E@~y_R zf4Ize>9Kf9kEhDJ)#(^d+4K@DJj)VBA)(pl|Elgy9czOR^ zIo=>FtCV<^ZWua)%1NuWFyRvUC3%BCwIXT8P>CD)=pyFg^62boTcFQ-=YxuslQi_p z^L_f&BK9c6lzvzGv3;MXLW2*g`$}yPDlNZ|h;|O&WYnM3@8T81KGX267BE>TdiY@j1^++Yy!MYk zpFy96DM>_s_+M%NKX0S}xe~+4BbfI;|NGxL1uuedU<@(8?;L)7n78`(0{^~)BH4j3 z{)!u%ER+A&=S?0~9_)Ye8vgBMppXCZ2*@tvBL@DHIRWmY1M6Y(>CUbm_^@f2B9ck}mLgOt~V zTzm5uR5R80kI{(wJ~-(9)G4LVU=Fz4B$#p*3>HRaTfY2JlG~IUT%9X1>u0l6$Qki$ z5KTq~StE^O=eF?Nx|$Rp-aqBUk6@kDm|IhDok{)q@e|Q(jgiKgz|AEW2>y%6(0Jhb z+IDl=Y-p08uJ&?h8h#zwBH?{E?gJu&@ZAxZ4GEqBKLZ1b8{uwGtQs@iSpG|2_?Lj& zSRRFKl&nsR_BLqd4}$(RNQIM!>Q^xMu z77RB_P}^c9PSKfY%`yEIpDbF9tX?FKw}!MvpT5{~i%3)-JkxYSRfdf)fSe=uaeRyr zI*ysbRnQgxw^a=$0i=0q`y>Xjs0_(sVLG3R)-m0Q*4gJMw#CH)v)XO23r7|sFiVi~ zG>_89&UH?H^9u1-&v3*Kt`;s2nu(%Y5L%myErm#10@2_AeyC>@%!Ze3&cxF1BiQKm z7Qa}JDiAOz6lvWb(Qu)tA-?sQ?tL^JveNV1Qrh}@w`bE8;m~+y`fGqWmj2l!wSQLR z-biAV0^^xo&+6;e6nLe`>9!Ubes2x*Fy)13)<}ALaN=Ik@7a@jJq@9nZ;`qh&71xR zsr>$*`yxr3NT=C@gWU{bS!^H6Uf5K9JHBosI}R2F=|mlm9_$+kyt+?*Za5Q*T0YrS za-aJYoxMW572gvN6HNs{eZ-%|xq}(4|yyk;F zXJ0j`MbZ8Ye0mDKpmE;E(D^O;=!*vj;fnMxg($85p4Lo!&(ozi@}2S*2}>~sN|j8cuDn2e zj>s0PZr2v?6V%#bqR!>JD76|@tv!R{Fw(p`4yR+JJjf$VQ>xc*buCuz1^u7E%-~`l zn_i67TmMpZYy5h##SkK{0V!|7iv%)88*@WmauZE47G48d4fE{N`aB>0wV?FAtBPHq}mLW-cDz zLL*7kZPLaDb<Z+Z7 z4w6g?cQDmKAfB4;>&ewT?>k~%O%W#%*tXB?)~A-n=vD0s(}_KxW6RLH3ko-K48Emy zBfPfFG&HnEUlFi0KyElIF51g#8uZ}un81$CYKr*V<|`#Co5+Gt{D$q*;xEY&0`Al2 z0k>CA(tU^UM--2P3iU=8j`Te509zyiwo(gf7Ly1&Ce z9nG(I@L|s2nAOD)lDgo0!;*P*O$tIMte==}8M4~FWH4N{ShBEBtlg(0sPT-sU4`w} zCtS9)$YAEZ&#+H0wlv<0ko_U7>ag6%blU{hf5(udax)rhJY6pOJ%UH(aCK6s)Q}hF zMTAvvEm@4~ZqJ*BM)uBhTSK*1f%MOqlAogD_rODj0(07X)e{&JpA1tJqpA^99wENl z6OL(I{51+PRb_*L-e(|jI4VmtptC@ql};&D_4)~Spp|EhotDvZBJuYaDrAAG0?5uf z!6zHLg>3GCo6B&KCpSF?8dpKAYAnq-U8mhy0vhrhe-gNS_0(e8s6C3Ci_+LPdm&uf zJY32dZP9<*n#Zbiy%kRZ<;kJvV?(R&g>FJYfcQzyRJmvnEH8bu)eY0&?*Vn)fgrO^ z`EyvTWtI`#uWwK?#LIejJjJv9;oSd1J)ezPwby#zqQ3AGUf{J4o`KT z6S6H5F*)I$so`wDAUCAC2l#BG14te67RMfv1Y8}TvV^j4d)>ntq> z9`ow<@F!H-z5nj&OdlotNP{;5ZlTP2*8$?FJxdJhf%k5->M+@pC}fNyqE%2~v5CQ$ zKBf-)&yO#Z6G=2_zC?yF1|=1e*M5ygeyM*0s2xf1pb2Za8)Z zkQI}2>J&hEO2j=EK5>k81X!l25A%X&)|nJU7M?DSutOM`K$9y)qVm+^e-iK&B0Qgxj?8dQ%Q(I|9$v zhzB!R-TP{>*7gh;6yJDnnpx6Q{H|$`nvixiM`&Cu;3xE1xHRdT>@AF|PxzL``Za0v zZM{t=Z7=AXM8*}2LY=CQF6FYP+DEe5yWJ!n5wiYb=ZqZZqOJ;H7AESW^dT{X^(nRR zk8gfd5H;>}p1;ajSvQgK7&bfkZdp45wy9yQE zQqPw~T$&Y*((|GTSO8JeExa0!=%A-;LdxcoW=&3BPw_}-VhS#=KrM&C z?Qmpl3ZjZ*Z3>Y)8$Q`5%o!rnZiG_#gq!C16ujzcZR9nV3-H_(K>pId z5xVheNHxWM4EuYs+>Usc&zc!uTpY#@RFmD2Kq3X#RtTe5(oFGQ)YpzkRjWv{Ucg4D z!lI#y#!bji;CqY{ZNO+)jLtG1`9N43<;H#MM=Qr7vwRt-3r7CA+-nxYQEj1=fT1gM zot=swcCtjRbg^DJiZE`);)zC{4LqwtxOJlH-rusursxtH!|i4hl?KAU z;X`jOf=?7s=;oqKCgdIOKl|aJ8|d9ob9N24Zcw{@*Ia2cR;RkW9>i?rRS2+yj~y?Y zZU$5TM9M$!d3CBf^y(ChY$@aH%gL{LI;Y520UErKJlgdzD%yBJ!wr|8cGRbr74z2vyB`# zHRM}v9EL9%4n8Xx`iu}s=wU#bC%UJdMY(_SBvRr0gjgw!vGC^vEOXceUt*Q%{9&rw z$yM+vR9$~#+-#ci6G|UdMK0w1rsZ`M)udLBG+*MgUflg0g?_P7(>0Ozl3AdTc2r}1D;Di2&>Za&P0Qq@hhNotrO3?5i%2h(SO z$)4}{UjCGfSVxP;$rT7>om1%z+RLlO=J?_K%|G=%pP6tg^b&N-Ivgsm=KMM>vM>2pTacl^>`+%h5VKP0IObH2$fruE=h>L3*9tI{q=Op{Hm z6Dsw0<^}#<4!t2ibtz|Dx09b1wRX-8fXXHF6mZSemOo>gNTu5Pd*{fo@gFUK-h6i* zk#5LN;0T#E=Y)!)s&Fjm3B~;?EDs zk#2&NZ|6U2IWXq43IdZ@5}zouGJTR%A`v7NG}sY+p3pJHN=y@tm1|Yom9rbWJsk!a zx{$E=6nY7zR@%yScrz*gv}d6~?+x_RvE+8Brq&hZ)^VXo*)_$qwun^r;?pzjUrF?g z`Z|38WgJNKunMp6YPY)*O{=;oQg1&+maCyESJaLU`gq+ z7RmQHt)&*8*)%P@?#{lBjsMis2=$Z*r!l-f4Tq#I{Sk0&?K2sLh`O)!{~u*)0RBz7nO{BwPvf3h6-1<%Aro%PvSAJCUZ?KP3mtadyYO<+mLam zIU%=CYztPXu#9h54=)j>jHqO_na(#+H(VSRoImwjqtWK@pe-ID_(i1a&ykc_kWj$w zzJ(^oL>6}&H)%d79J0GQlJW>Y7C(p~0pg?9#jtQLrLZ!iA1k?q4znn%zbOA=OKb5tP*Rv&iex$n6I2p_^XIyI*B% zP7%XoFYr|Q`ws+M)CR}$?;kJuJ)4x*@g<|OxAJy zV?gqTUEB*4UkA#`G3!yY8fQbb8S}`?c*L&ZsBSpZVOUS@X}6frw*;oPS zbvGtK=%B6v!OE+e(+{78tOZ+vs&yuTuxYgT?XML{!$4as3e4bZwqG%;kSg1a26d9H z;1738s#?&HBAH0tkHHG(!ToJ1k}TV3Y(wer%sGMRrqy9pY0)YcI@YNsufLQn^mgl4 z5&nc8Mof_e&>m$LwykzqMVR;fN_Da^32!x@$COqiB~|t;x~pwqt1mUF&w51Ju;2){ zrlKDuucTdHdsrLoM6VaIpnP8=4!-Jh1Xtb~X_kmD6#X!+T1FSUiEKR>HZ}L9NE7*1HkP7k7LhTp zP>4z$kGw_+^A<%REm?yi6MriFOA49RcsQQ`Mg#;l)EDVASEgh`xz=GiaCmoX&2a-^ z_N2vwnoa($5tRfIuW3cWB860Yc{7cEqfbLt@(Z$$SkJa-0W}s9S-=1K}?9sn_&ck~=+0eBaft$L(xD_=~^O z5BX^MI4B?=09=@2yjU2_fHZJj^slu>+c2(%bSx}f@ zKAq;~3H-z-oQR&3wCK%Z^Mx@^y_}hvcKX)g_Ns!nAGO|%cgJ#auADz|H$<7Mh>?0^N%Mp^9Y?>(@Air|z4F<0 zO5+5<$umYFN$k<==V6Yo-mb}(42{dKR!KCrn7JK-<6dC-FFMug+}Zf+D?+@E%%JC+ z2Q^GO+KQVyBJnPH0x30BN!!^2fdqTA7gE&(%9WQ;Sr&C~*u_Ez9EhW}2(Kl4AjhDz7YQu34Yf82BB91m4R_UIycSC(IpGM+~DD$Pty1n z@u2!^(b8B<3fMX(s|8}rc&S_b#HWvB=6y#$6&;OrxilGSmPyC@E*C;;E>kD{CE_XE zT3s}g(;TX!C~gYiM=NlT$rqO0B;_EBNyL;{i27~Ct(YX;1_4j*xza*=U~iuorznK zof4JimnJUvJfS)hXI#4?(3-Ddgec+ugn6)z7gfE2j@WtEgV2cN2t|i2G=XA;YSKpU zuSo}e4e?@yL`7}F+tQa^Y*C}53KACN?i+y-{&XLUkW(~RK9)yNek(CM!}M&1~<-wD0t%0gSjyK77)_S$dW z?>DBj#7pFEwJA_VI@cI&WHr*`f5P+{G~RwKjaf2+RR-;jZ*W;+*z$0H8Aug)b69DW ziqbCmj4y({Y_34?8~f;h*h~PQ>(#mmOjf`7Qz_{b2J0}oksn^|o$U9~ehz8XO20uM#9No;<`{u?8OpjD~De>$(ztf&KiYbk6 z<^zz6{OUeE486fN*}gmnGk)6n6WcWrioe!_ zltp%CrMjQ0)C^j?oZ21{;kuj~0~V$S{Z2M@o$`B-y}R{SIIJoq7MZ1R9Ma6~lX zwpW75O73Zw3rlr`d~UekB+$A%$E*dSR{@uK9BUe(i(}jqN83fK#f2@nQ7m`q*Oc}- z1);#nOmD{}e`SYmNUrJK~iq3qvvfjFUSLor^pW^|^!DjYGgQ$Rs#`UYyZ_5Hu zZaM=a>$~h1GtP^5*y-uk;oh;ClKK&Uy_#gMb#s-h0U6pi0_uxJG&d~+U3CFmO7mxq66z5V>WNP&t2l1?XpE2`_-BbQDD z!?%zwZTJS_!yKE)SwMS$f#5TCdHY*9z|TMEAd7N&{@VWXX8m;}3e9QM_$RnKD7$?7>!VlT^&_($`AE7gvIn_E81BnP68+`k zWU(H^0DttJQ0vgc{U2C2S4WiLZWCgw4wED#_+cUl$bda3!qfH-`VWT#p`Wg;u?dyq zcfMrAE(MM#gz-BZ(LsLsWQWVk-x|d2eIqRXrnwf56^^MI{T2sU3O6e??;LaJ!)Apx zNSi2WWe0j6%T$rpM|TWI{3G?AGm5=pNPJ=9Z)}x~wLr@Ey1o=KSu3?nYsrBWiuvyk zA@5j}o6AE)_TejPqt(Z<8YT=Q;(yAi^&fNh9{v6DBE~-gZ#lsiXT;ijDtSB(?+N*jYRLY`EFwiBbiqV z`|K--XAZvNxLCl52^4`E0rXvV(j!#3bx|QL&|b)Y`ayj$fNj-w(S*lge6N074%$I((WQxA7toeJkk)`? zBm3RsiaSHBUSrhQx>4EM=Ki}`)S!O^E0HR)y7`|oyat`5Q$TR^&+ofjj3{*Q6_aU1 z5z*%N9RoWLN*SXwhiPGP!{MJyTg|PliiH%LubE)YKPLjS%^DtR-GfEF!0`$^z-fEk z7_C^a&d_O4J%4$!!G2k`7#XMG7fWquSL2}i#8TlIAb~t#yZ1y-dq?s8=qJ&ug);Pz zW&v998!xN+&KWda7U`&kZZ4;=BoS;p>oujdJn2C!c|goSV-I~ULN9;bI#{86)8Oj)Kci+x#;BuMUqh`5aG)J&o(h zuVFI|JC-e*4r^_C8uPPowdNp&Z<%7TAOFcs-=-bHdbl_zLTbt7{&x`z#`?iOO$j=k zXY&_hO&hPCF~*|1_4+<{%|-P2<#n zk}iONFq!>%$|iD~znjP?b#cvzsH? zEc!P!#IdTU=Z3+k)k$GFTSz=iXh(HkLxcv+9@tzhNZGc(iX~ocV|h-0)1!1uosizu zfmH$u=q|qtIezF_utMlM5HKKtaADLebh>L`UVB2$quq;w;gk7?OIO$J-2z$o>Pb?N z3xxmya?Cv~qE+xX#AR!n^|Jg1-`mY9_+SE8_H+N;>MhVjI#D@&D#av%Fb^B(lp$_5 zh{ovxrp**iwK14nl9iVS21>lHm#~^CJ_OvZQ_P)_gikPjHofb~kxh6NP?N3xy}~xB zlX$Fx8R^V{{SzgqcoX=3zR$M7?H-o=JDEqr$DlC)nbj9Vd=l*ihev+eJ0rTGQ1ah< zp*(39CV5NG5?JDm_3Ipe3KGxNSJy4xJ1qvEyyu|NAXc;Da7v${84$3%ds~_+gf)4` zP;eH$@BGsqk#w>gaU@6>hc=`|>zxdGTU@X$gP?62QdkmGdmPW9qa8H>Q1sq{w0wov zv)I7ESfrNs&dOXaDXG34pI57*AD3&TR_N48b=o)!o!s_fV`RJ{0@<{N&RX#yh4unx z;vHR}67W|-n+D&`sLm)|nQ&8?&v2yHJL zKknFA{7B|aS4n`8^LQZK33~qcs#x5TN5ZpXWRw<_J(Cs3t@8WpuZ{vu#rIrLCM>pQ zumZeqL}|I~MGpVTT{X{@ZQK^{v947nY;bAU^&_sRkpZh7`Tpo0`by0|Dh zwL~_LewPb%Z@Dnu3S-RuRw1+?&)?_%rAI06H5ucBi#6<+?F-$Lxfk9zthik-(o%1# z(<$H;@7DSEjy9ZhpulPN2;|V;$rCX@>Q@YDt=kul$Us)!Bq&?o)_z+aIvg2r??$-qEMAoBGcK=)^~8K zsAkZCBgSp?B7E+0-7_Km-}X)_4$4=y*3|k`JtF4}%mZ@)VAiZA?g$guB;e6qHygyY zjw3Z2EJ%zchIrUg%K>~wOj;vx;QniipM$yFEfizv@ave&+&3dRE>6Etp7_+%wktb! znCty{yP>0C@r^HOc19TNtH4sS+s6Lt5wH;&Iu}oU?LX!IUF9Pm5;@;NZTXhb%{;GRO4N;rr)x zmgvknoSM;KExVtG&8>#+TBlL1fzS2xUYxHBUXw*X%2=i$d|=Zqc0M=(VPPE^tQoQO zce>3;`OO7NS;J*LaRH{W`m=4n`EApCS@a1v6b94q&~A( zdoxuN`hz?P{iM~Tsdc|owyVkAlFGXy1kBZLW7OwbDdlGB-jRfSuVpshX5i}yrr(C}%@ky}qdWX;HG zNk@HhyMr*LuzwI>nvyJ7!-{$lT{Asq{0TqP%OT#UWcDR7r*+=tOo5eil5}?SFUZb% z^?l_UYH1|CjBk(|8m$17rY0(g`wnY^xlS#{EoeQ7!ZMZK7r3sZ=&bK^FwD*(3Lw1Y zW+`SX(SK<>8yuI^z#>btFPF)UYNyG9IbB|Mmbv_P_W)hubSz}nUF}z^U>%C*2dHMn zNL5r0;D{)-zZ@|vG#nzI#5b@>ZqaQmmWZ{I&-$L(5yk0f2XLj$Qp}Mf% zF>$#DCf}FTkx`bh7Z3y`&vQH3e*#+p%UL^|ke|CY}^`Dgb3zc&1BFd6`3sv(G1eF*PNffxAk))1Ju zJutZ$l0cHm+V^NyzD)4q_w2W=VPJa?*)U&s(ZR&`KlI7J56aYgV%=_uvKR^h;C~ zWzce&8^BFq3)EZK0{dfCni1KthS_AfYNt+v$3@6tIWu6UM&fG5oCny@X51#OV+`Py zi7hn^Mnk~vY!0U_A`P&mSC{8X?19pb=Q!~!4Y2+GzTI1YAVt3>Z%iBopL-jlN&%i` zG5R+aa_%wLJ}c#GhuxwI#MjWdR?P?=?@9D`_A9AfmT-N z0Bzef3!dv^#`sbNkkA-O9TcPqh8=7do)37;MS=&FmZR;_4UCP#Xp+Cz zOpPZe;R`Lm_rbJPV?P$vvi>%;vB$5EIS0*_NiW-b0fpG(132nKJBjW5VyGWSM`sVx zKp~RZmu_nhX@coGj6c)~q4E)lw{!hwV*%#Qaw8PvJr6jjyeHoCS@y3QRAgG~|DRat zJdN7UsuSzT-oIQ$%X`&$a-R!c=`7AX{=cF89C&ye!AY-DWl5VF=v-_V6FG3TB3|_m zqh<`|0tls1hGbkx&I{N~14QUgzy5Pg)g>gP)#b%KucI5(yOBlRUcOpx(@Q1S(AE8i zf2ySo8VdyW~rj7_Lf8qfbBw|?W+IF$J-#hOpx zAVqgebb=)M*EOwlB(e0)Ghw@LB?mhs6~X?ntM@=I@^%dcCo2}>6uwrj~q zMHV&VKPlNKna*2LEwsEN(XHN)=0cXKahQL4 z{zIeq%1ED7kd6+~)5)m2A71V1a_|lj`CeicL=nFAK1yKGz(os|@Ccl#Iu(x+j2dm+ z5ChNT5%%qYiC7G8ga7a1?M#Gj!!gf89gRrQ&l7T@iCpupq;qsGjt%O8%98Ug2Lrtx z8e#C=D1J=VEL;;(1p*q(Tf1=PXDoys5OQ6MBTtuCErrdd)dy%^6^kK{gCl}^ay0Uf>8r?; zPaT8ttVOTb|AGAhURFaizyapI82u0I@2v^Zca^jlBqfSZCizuD^;Z#L*06X>h;EZ# z;*dFux z2uwzXNqV0o(JFN&nrUh9pyJ{OuzBYvR?3v2#kJer-tk0u^ztk{xsrMEF1zcWR)#fj zgx-;l?Su7;W7_=j4R7i934sAPn%!2D>mFXnx$8d+Yp)5!e;C#`TeKKkJ7MIF$EJf` z*bk6DU1!i|8;bB~*0$tU3*oox!=ctHlxC_G@A@(-Vx?!N*|W@b+N1lv)Mr=jjbw>d z883ImL0Ut3mT*vk6~31GBL)@;av!-6-jEJf?keJ2Yf0?$AJjXOqqrWPlc{GM{f;3_ zGz{Tz+v=n|xe}~m{VY-6Nb1)4Jd4?WV*V~A^EGbNAG#WbF58;{UOp9&^-_U5TqvD^ zq4X(yytY}jR8s)+GXu}wL>WQTDJddyFD1=m0V~;&z<%`}*PLmKxPS50v-&|gE$rRS zv}q1M5O3-|Hzr3D7sMUXo|}-u8UR9@AK~f4W(;I-f8Eguv)M_vIA@e1O`-ATF#E3g zhA|wzwsVo|w?F|4tZN1e1D?%a$L2U?ZLKEp;J=fvZp= zzkOJ5v0CXw$v_6%sP*?}P_=LtdO17xb)ihbcaJF1r`{{agm30D(8>^EZn}U<62KSb zc#aQd3CnS{w_IFO;%g9ULZdeZ#dCPI!L)TW-x9fIZ$hCo7Rxz+mbEfxa{l*%HLXUX!)t4frgn^lOgR2> zUoPAem#oi?&>JH;?ET~H2ao4$1xWvL*-CP3qw{J$2=1msY>j(9K;+G8<}v7GlVuwu zPOyYu#&j#UpXpSZp`#J7egmkTY*kmateUr1Cq*&DqE?UE{O%AvN8n-jFUxVD7V|UV znPEiiZ6aQSMp}&?SR=aJzA`!~2!QZhDp@u`5zV4!+nYMe3cAkyJqMhI=l*M4 zeuYiKrvD$VH4=tn+l$8!v#wWP5O^j6r|~xqn)uN5nFOJt()wWzX;M8>PI0QoE6qL} z=MGB@$}T^&D^a$2?QBO;*))k9uYQ$lIJ-_{UllvxMeh7+`R@-w>k50M|9XsBB*F_9+mERywqu?HhgQ%T$cvC1VFE1 z{{8Z`C;^)52Y{p(z(8aa_B)w_cnumy<^PBu=-jobj{`eI+WK%LkV7lQH?SxNN<$n- zK;6M;hrAnTmmag*PGZk|z+G#7Js;_}O=-YowE_oJgoC`(D8QH4d8;cpXr`9o zvVM4ly9WMl3QQocCLIyA*fXH1XQ?JLGe3&W5m~2fxJbW)WYNR223r6ST4>bzLkfj3 zZ!4m|4W@+>PLMc6xPpX2ZY-H{$mfTFfct+2!emb_30UaU6cRzPjp?B}OPD&#Vl8XY zto~>G!=SXblUxpljfuM6s~BKOJ=8 zq$s2!c0jYQ`dN4K_Ndo*7SxReo^47eqb7~>GqhiPDub9AB84veAKfTBk#Rk zTL*I+AH9Wh9B6A?E7k6MOI*-aD1Z@YB~|k1p*;8(7E`>+&)s*(BfyTO<_KoOvkw@+ zspT~cGT;U@Ju5j@fQ!~A+5JB)fAA%SB9`pPfCF4>X#XY}$- zKE?wz-sK%Ap9flTyczodGI_iC;_qx<9OUmAi9Y$iOM>FV{WF3(D&OhB=VzoEML=SC zTyN0i17F?4&<+<1Tsq9jgx1|lH}iLFpG~^c0aMT}rgso@?0tU?4G+vF8sFgf(9R|W zi(G+MpOMg6zbf1zEfU4=<`gsNpndh?3#^4yPx{uXq%f7fs-Z*6wQ7m!@oIyp9;k2< zClmZo-^7OE)`rn&!58QKmfJb?%Er%4Q8VAvS5FaY zf8PNMc>HRb*6PNmP zElK#Q9~Y>rVryehWwL$<+)?o0JkyBEUrV3VX&kO*jH^Vj)!FO4lz)IJd&H2qd4o0I z;7?hrq3gnupY|sPgWUPaP5`}==5y1xQ3-?dzP27Cyb=`j-<_!Ao1z?Z;9$yCD>rk! zUauvdn^t4K0)XW_7nr)s<_vy8zt)G0j10AAo5jKK2CseY*XtG1;}$=n^y+;qgANv# z|BOBP5BR$3ouV2{uE*?2X0=U3Tf9aFnovWPPJ%`ZtSk-;0%Ar09Dfw#c;eIjLrB1= z6%~`cc+xb?CZYLX2KM@o3h`q}P?BYDKIr{4`)J@-F7oCJnMh&|jO?=8#Q*YpJAmKI zLI~ogI#<3&@;>rVZ0+TIU)S`l!4LI>(JdYQ*}Lf0ny-?WnJ%_JMv zcW6o1*a)o$^@BmJmb>m%r4D9L!0XAulcg@V9BfXDex{Oruzb%Nn(d?`omftWI+Pxv zGVDH6w*Xyxbo4fA{h?3;`9xW}5*{>*t5jODH%KoJx{c_L8#Tp582<5~7~(>?h>Wh~ z1UZ|-wB+H}0fQr9@_iJWIl(_$`$)F+g=kx_YI3t0>z8Hpm}OpVj5(jypyWZDBBbp> zhFOa=u%@Yq`SxZF%Pv}KJ9SlD`cT&i6EK&oU@#%n?>fUFqEF! zZ5$iy#ATg-7vz7Oz?45XK1xkZ-QadYs>PNW_0hMUmj9BdU#m1kSr{qXA|=B8_|x`X zrRCN~QV-G`w~-*=c|D@MTIzgH>F9F({mrEClaS`zgJoD1$$4Q)H5hoa7?1Et`r{z@ zL2GtHGTHvU<(ErsU)H(a>sviGMX`Z$>y_x-P>^F(Y&p&BHa}i0sm~G1F$3u934p%N zSBg(t?BB`#&)5cBD=fT&-PA>X3%LsbXsab1DlFC5p#O#SJf5+jA0@F zRCIBke>5GZ%%E9=_&*h0{(pJHyyk!a<0t|r{({XM>#;zUg;ZK$ z?O2Yt@Zg;>r|$4978#G`2Jy2~%H~^Mll4EYU-e2v(qDR0o96aNun2M&BlbEe6Ysx% z3X*bg>u>LF$=rnLJDj`i6f>#~O0yHo$)?#%ZKz~4%hiZJ$|&JnfGRa3St4DrZP9&k z%v9eaFT`3dQ4`LPkh^_{HFsxLp|c88wATB6Ugv+Pk0KbFt8w)*eQT zoBu$+PMF7dBc+N5{b|MiP~JteUL^3GSkk9n=10{R4wp}9-}`Ox;;RdrmM6w;4^NGt zgSu`vw1jdEO_7_>0(;LKoo{bR>DBD!z5)9677q$mw6GN7+rik(`-Fn9-x3u+XwDQ% zvOd#QTf+dEKffKJs`Ta{9m18qT*a2f63AjXJH~4PMk?91LrSBaQXIq)K(DJ+sK@)B z{ea?f6&8Ea!5aK-jS?yhB+o7eh=y}Pi5C~wtTJkvg2(F5etKTJQX_Rs6K>ttJ06R- zQ~!HFyQAqfSa%F>Z7~;T#?v8=xBmmU4z0&jkuu|OYPqC&EX!O$+r&^Ti`!jrA`Hk( zhnAo|!6RDu@t|igNS7fvuTW~rH^B7&Ne@nAm1H^st&NQ^F+q_x_YVqQk5#B( z#9#W%;`7e|=lYvD@-oZ>6L7A9$IbcHLhb$l849^g(OsjUM&pBz5V;xVyy|rgOb@B+ z7q_$myR+2BC#5ysc+i%STvt%($r|PY8z&Z=q5v6pT2YjS>n!S;uG^QmE5o|ve5FLG zHM{TYGJH_u$QJ*1DVW~I5$QsfSx|pz&J)xc_;Q!MwWEcSfypWf+w?7uX)Ay0or3Ga zU^}yD1bp_XF;0%89-6FWGXvPy0Xv)2-wb8hSVGonb3`zcxOn0{-Y2Md^muvU>l8j< zgP0Mp12cgWK4a2TuO)2~%UR78v0XdeP@&=o7<}aS_Xc%86N>v%*?^kxM;#1b7?<71 zFC|j7Af<3tFm!{Z-wr3aL+9zHgH1{Vyzs?U$|F>5TU5ll%q(|i$t>P)70(Sy^PO1)fFR1;3X@sd12d97GGw*Y+TXr9?K_sQd zvRJ9dyPNEd;%+yOZ69M(S2h3(SkbjFOM7d7!q@VYO?@^SJLu4`mDsn=`Ps{cKg>Fa z9%QxLn}|fkP~Kao>2LM?cB=kwcu~KnO|wJcY%imCiH1tDmT6{BHamqCv-r`F-(83M zNH-}F;mUxd-f))TFCTXt@)%J+je-P+Dh5&5%vUcJjog){Az72_r=Y%&)t?b1d%Omh zHPqDlv=E|$gus{x*#x`95*_Z1nbCI(Sps{o9#CaY&#a#`byB?mGnnbo{_z3A zxfpX01rZ_e24SWgh)9u(?}k?nht7~LDoh_^A2ANE z{xqM!aXUQ~#>QK+By-;Ge?j8yRxm~sv$%F3jM8!1h>UapljM{NM$%X<(*l8(V}g^4 zFVA{hgFw*=0-4J%WvY8wUw$@CTim_??GL0%>z34o!hIk@DIZDdNiY%L8S4Q*T5LED zwSr3YW3cLALMNp#IrH*pxKMKSCQ71Lt<2nnTuq&woEZnFK1L7Wz9W^Wzszzd`=vh| zvRiFa3Weu7(FNY!1buU&t@PP4c)(n(=M-?6zUM)TnnfIuV~u6@wIhVCxLhpF0v9gGJl+{9 z0{r2;m|E7_Q@$z`Fki0fKbL=CMB7>`_*-hU?Kkh@^T0M;etm6`;vTT%VoDee;vJH| z(YT-+X6PDUwjemWTH8@!(f1`? zWL8;T+j-7iu1}nYJS84o$_UB0plZXlRgHKg;!PN)4zJ4g4L!D*Zh2<*y{5b5eaxYO z7Yeigy<}63+*pY@#9`K(WVn0VR>|%D?iTrfv31sAQAJ(b7ewiX0ZHiw=?;ORyBirg zl@4j?A*4aNrMo3WO1is|?nd%EsL%U8?{$5D>M&={*=L`9)?W9$ehb_D5c5i&U>qN+ znbFy=`8G+Q3~{Y10=HF*Bj#~J#Dpt&%dz?f%<9mg!D!$mGb2r8*1*}5AxuVqVy!+H z9DQ${_2B_Uf)M_pITcuABd9e^=wYcbp%+_8eR^e@)NnXRKTQGJPigUrW10~k-Q>c3Qs%9>un+i zXsD#RF8UqW>NJ%fBy=eiaPV4!e`niPV~L87)ozVAhkt26E#7p-@^@I7i6AHE$&^(0 zd^|xOQguOEb$6Q2{IDe+Lwg|93x6B6BwDV3yUO!Te<^nmtD{AE3=rVHXvM*RSzk^XI~FdwiR3rFj# zn+bAS$Uy0WTy&J$R`%F*Y>8=3^&2q8H01Q+>EjGKrqvSOdL8Q3#qb z)3J5QH80h&8ACIavF|=}YwAqi@1`k0`H5~z+8eSiFt`;MmDI-Pb5OrBHyz%Y~qYTTf%v*sFm8M$({90THjpu z8Zmm$3V6S6>Wz7O#I{@l&XyTbal&=rO^6bv7hL!hy>c4qmKuh1&6fEBo8w3bL6c4v zsBX?$++-l@;OFZ=EhXCthaVhhC9sVxT_l#h#lG+K6Uh^xXecWz?XX7)7|KZVDi$E!5u3FU7V#waVj4N9)5BJQ zpz+9Dm9u5vTpp-zYVpGwQ_M2og?eiAtj=%>L$RQ6N!ecLq;0s4$d*Q-PA%v+VM{-z zLTxRI)O$;H+Q-VkbdwN#vGI}LXSukJ#F~Rg0dYU$EzQE%>JIC0WX)>vEG?W*Br}9P zPSFm4*~O8V|CkH3Qblu}_oqrfh^C5lP+bSCH^w1nW_oS+SVG8rWY(KFIz6$K!1z0f zbE&Rl{+5FV&_)=PC{ce;^xS3lBu;R57HM6ul)uymHqUG|dX<<@Q;A%zOeR7kBrb^S z2O@Lpi<}yQCdl_7uKD=s;bnhS=xS26B>_@gueCFgg5EqPxYBKKTaGqt+V(U0TrDl# z=C$%%V!+yI?PKV9#cfhIBr=t)ssV{q$h*sb$M!ReCc!?x19Cbty76}>cuH9ULr)xM@=Jq=av!oeZEtbhdV!i;8*KAl#Tqg`2LOdUzHJWp-LSF-KWA{ zbGevvaXCgO1}X54g(OmEP?n|8Ml%$1Huc!*kpB<*Q9S?YpNt?@Ye zw2qf2Gc?5r11U8jGEX_BYI#exX{P6}NP&RCYi#5c8;XlGkq84BPm+RE`t(O9wb+LN zucX*%S8bpvV>;z`4%Z!4n?*0Mjj%VT)qH zi)27ZL*a8Gps}^NL-;Y95+q0*PO3eD%NF{!r?vPEwHnHPcUY6u4N}#{uo4T zeYv){cSWnyn)x;7UE#N)1Nq#lYA%Hd4Cq?`aB2R7Y=7Aa&IG&Gu-RRG!p7i*{aSZq zoMvwZMyj9#jBdh_N_Cr1OrDg#(ZNFIQhFH*g{_*bA3OJDwH60l>Wc-S(_X#8%KC%T zdS~AG6Acb14TZf|+kW7EaGRHYqKu~n^SsvB*K)gD zc|m<~B|f!~e0(>`z+s_@jEGIso_-Ph;bLFj{xJgCRjJ;YlTtn%4!(})N275fE5uAV zu2h*#jdAJwipKiqaxFVJc=#OUU_Jt86sIFUdepevOJ#jEm(3tV06|`VO*s3;@fR#y z%VWTetrfX-x*UDmcB>u59EIH-&nnyP*=^LjiaBeFJ~f6Qs|bd*AI+~%>Kjhh);7EN zi!Pl^EtKG4cs`!J21Mr7lx#xUeyn4IY+=GeBG(Hh9gxZKeA(5wKWc*k;PQg(9ejeE9L&Z)&@aV7oQ?_Up& z14Nb2>RFb9CxA(Vx(g7+o87hQAfrkdzlHj#+bu2n4@v73q@QxsaIqNI44|Axo9(x) zf!V;yExy$El9jjS0xm)E3fzXMuiRv%OuOG9+(`cIWuy&%;GnDvBv;eNq&ERHO!BQW z4yIZ;+X0gY%?h!3MBZ1}`#OB*(9%9HwrB<((s}T zz8i0gE;O!1p=gh1i?*oHYE*s>IgPeJ{`le%2^8I~sR(<#zbd=Xa`S9@Xi3yx{Dc+a zBCHI5?`8GaNNZR?Np$nD_;`XH+V%YmTvHLDsu~}1`}>{-qkOvCG~l@ z4$O<4UfYPB#^V9I0Uygv~wl@l^nNZ z&3YHH?NsN3E5lyAGdB+|eq8Jbne`I!$>Gbt%!o2u+{=>5X`^}fSu2&*jqDUOj2PS+ zp`K6QwKk_zIipeIy4N8%;HsU4lR3-5jhC>?qFE5|HMkGWH7Ufh)fl`eS)bw8^EnVR zI}@kDiwrHJLFl8OCq9DtXGo?54zAMg;t#gTlg;#2%qiY!l3~29u|3b}f+5gSH*QvBoVUJl%1ChtG}mbjM+TPFi3f`0*Snrb8-4%CKHKZ+(}iskEEoLP;IP zebIlnIC8T(NR!0+0du#e)c=OK$S7@^D;2O0ikV-COnLUH4>&D0okf99O!jlV8(Pi&*;Qw9#vg0?GmOj?k`cHRWsy-%!U(loiH2;1p~_@w4>yVGja>{pQf)@+ z_%&;ih*~M)1x+MmOs3Z0#{fzp1Up&E6BYKMG8@q9EI7PjXbJ8pB-ue%5 z8e&_++5?$(cgKem-_pE}_rEhtSm`6qo|<;1;2l-;Y~cfMA3xxPUaQ~yYH&X!F+(%( zchXkPv1_I$CwE=n*C(2PAVrEB`jq2s{>Jj)%`dtHViuCtpq|Vwi-lScJ?9P#lij)4#>*_IKq5am=`@_1lfX^|Kf+|0mkMu@I z;yhlwY2Iag_95ot)d?Q$Q|Az@_lgb&v;n1DsIiylA=pGNRx5b z+mbJ>FK~AgalDmG;u^kvydXJRhAW&KkI#BbEPgAs)Qk_T@m(YNzlEqX`y080l?|JuFTb9p%tzySaTZP0+uHW_W+q(%8m@nXB8mp+EJab=b$RXv1%1N55LjtJ!>AFiBy? zf>sAJOCCaIN3(~Q0k$|+1LTxiIe+{sC<}4|(_MSf-e9T#u*G#h5}BC)+zlMbROK}3 z%Ui%!p##O6(v%SU3v^W#J^*a-_k0l)x{u?>#S(j`kTd(8nEgR*p5h{}oBgXJVIH6B zB8wEyA#EPyU0w~`XxTRKEvtzOH<`)KSYTEbvD4lX0PFt$E*X4OFuc$%0bV2>b?zlH zn3*ALY|ocu^(b~4wlN6R5!v}^z|RP{27Y0AroyCBQ9a(QF38qggD z6~y{&iSQQ<`01X~-ANR;%UyI5@Ww$%M+Tk<)0d7bP2Gr%VWtr-$OeMmK!boO|GJLC zg%X@GQ`tb*a-o%pA*kEQ3a5vn9rPPjwIo#k>i#{DwgHVTgp>i7u?vt$lb`GXj$`#} zbsLPJYV&b{4e`T8r>ilFhT06|M9%xq#TKCIhO46W`8}dFhjd6at2X%o|b6lxQ6h?r>(Fnx|aDZ8B%~<8pV%Z$dnClNwww- zgMcScTumPJ913iKMzfnfMIZ(PCqY7x|2mTzB&H`fDkAQTrejDcqq}ADliBz{H|NOE8Hd_#3Sf3`TM9gHq;|)uh>g5Oj?T~;h~uml z$f}-<#&SD72D+0=(b@ZL16`t7`79lEgPxp4w7jh>qOcAi=&NdzUrV(rfY2cbFp~4U z7&Pkv+h^^TO}`xoS~s~ox?vk43fO?mo9IPxs$|6qhVNWscei1?55&>^0MI^=|00=K z2#b6gQG_sPay)P`)ob-j-3Nei^AraPgv6Cgk(KttK$}*;zTMs9o7Z^M=8EqyDTElP zFPD?F`Rn%Q3h%rGt1m;P3@qSLBJ=ULcQt%rQqI0euU)C?f$_OoOD>i!o+RBtnHSUT zf)W_xRK9_iHePNcFJ|d&MZ0|08=QW-8l z%adzd9nfYFnZc;u)t7?P@P+JD^|T2#;U@^+yib{dp^Z5SU;UEw%(sBXoXnQYwNoCF z`r{d(_E)gIfH4m1I(l1wa=L3_Qu1a5C*L8BjT{3@^p>$tjj=C;J;mx7OmNH@Y6Eg6 zsqF9+U`+S#;SQ8tne5_}O09c=RZwh-BLnzE{G%BV#oCh~C+pDr>uU$>F&yjRRNHi* zp%0B%rN!BO_p^>CuO)mi9m2OZpJ&%;uykiAZ)7h1ew8&#%hPclIphTN(_zA7h)WR| zhe320>*v5cn)8@oyZe24NCJCABDv|n5CH+aygBcF$;i=yNHY!*ZuR0ZSlkshZPwvT zQiAGEyp69Y0P#CIIJgi&V1^rMw)pT(A2}X?_}`_PFPqk~w9r{t^T{QvnoPHu7n%JC zI5f!7;fjHM<>+qH1cb=L%bgf&MpJTZfGOJs8xSlhej(Lhyh+fyJ9fivg(DH&CAUpt z$9|S6BbKt>&<1%~9<h9Yftngyk7B{qAdj6tP)2gWf*-gyd8BfWpdpcASx;Cc)?G$GBM1RC4AGbRPK$F8$S=eKKh zDjKlK0K!5zmQX7%5p4HUAJw!U#e3M%g=6nF2jJjfz#$zGz!khKCU1`h7w;-S9jUi} zzVbwM3ks*&lK9C5z+XFhxKorEg#@S3PgG4sV&qJd*|9O;_JN3iT~7>W6X-ZJJ|ch? z@igiu$qo@;;L_92MZ;3>Khw%{ei{WHcYNYyd>Fs45+LCgzVQ01O>*NG>o%BOX{N+* z`@Tw*2<$-XT)?1XjIW)52UxP#IBHBU!ko3m9PySHmx4>;xd=Tq0L5mH06Sq#UagZn z?Zy4En3D`-?@2KN zb+2-7+kt#od6~Qj!V;P3Lw^1n=w2Kv%nMPAp*56g4DrX=5w^|l{6GBg8BDg7inu{eX%2ZCAuF_$T+Q3H(>Mhsz4Rw2JqFsoEX=j>t`&(EZ{Gq z%#8S@Sz@*W@K|BxWldzZp=BZF8H3&5%w3(SGN19FmNGCh_dJ!uj7a#xtryE$eB(sWG$ux%fLk__Lbnl0Ga90DPF+q zXwuUK6mYzQ#l%AJxFPi?xevy#j3Jl42_hfEr-&3(HHIA(UAc-9QKDqs{*89`Z~-G- z756qK+%!AS)~>S&VTLaE$%Uk&Ib6jJR8eT5z=Uyld%L3=8W@VDcJg8@xBiDbPNuP- zRsnq?kL$?2|2d5D<VsZo+U`?Ot z3XcLx)X6pOa6)2vaM!2@!`*&5;;RrZ|A2cS!|+%D%upnRz#0FkAP4UBJJ?4o1VNw~ zGdVii)384M&(p_#K8Rnzpx+I`B(ML^Uw?rUtslzj1!@OK{x5SJ_~5C%X7BSqCFTD) z(uyIlb8uJt-(Ld`79i^jJkC7-^HWd7(!gSm|M!QV{`E8iGkkRjzC_)Qlaem~DHQwn z=^pj*6`+xoU3>r*enkcV1>$hHrloZ00 zT?-2O(Yh9Q8z9539R0Ii&-k#GHN99=88+3#RDiccH)D*~SpE~y+?!AmU z;67?yX+LSU(5Zh0h>dx&vD9>8HpI8(c+M%ew`Yg^PDK4BR_opo8YbJjp$6mf0s!}Z~KXTf-!JjGhKPKA;I5%;9 z)H3++XEfY_V(T5*Xdvj#9UIW%?)7t6KF-v$9E18j&#$9?u{C@U>=6fcSw6FRdwUV=(_p*r!7J2;KgQTZpb!kz@Qut3u9 zTut5mB8;~JqG63`$|24;CWvEno;>|hn|%&QA$!-`N6598z~N+a)Bqfio_pn+S=V`7 zH)g)ju)OM(-W_;gO334kkL+dQKraRf0$E?!%Sbj4)`x1TB^2ykCm0mbiJphMo!nqkyODIp)NXZd=_c}K z8x4NTg4kzWr?8>wcWP}q3IbC-$ zdHi0DA%pmNlR5^3+r}es^9$3NV6ZwNi@!|{>CdG|(=K%4NxW!`&z`U5im_--75x23 zKx28~Z)iygZsu@ZP^7Mgb?sl$JYGr7SY>duR@5u@R6SlxxWpR56Ht+|KQ^mCh@=wh_&UP43Ya%mYJXAI?YENI z?M)Q%yu2z3;h^Kpkv?Bcsy@f@tTVvcnB!y$yJQM8$~;3$gUciXRQ^eGi^*~Ls0=R* zShMeO`H;iqGfmP_`*sf^!TV!CE#rs+{Dal;XM zvO7p~j$a4npc3Sf(zBVd$5k+{%Mo8i*`CX%1lCGA(B?j$6Cto_C=cdk-BOYfou4$j zZG(Da3A{hrg$1v7V%Clp7{Bs-#3ZttkkV(Yvr|Kue&5zz=fzzybcEE6S`@jTe9$G9 z=IwM*DN85}SvEbUCPU({p`|9tG$|BxLhe&F|pbZ^K zhnnG@fsj-N7b1P)&oDqle7$mDPR5we!c(Tsn7|bMs?GZzWb@)U&*~v)uajo2-&|K z@<0y@AFnlXnj)E?#+RKEMIHui_u)$vb&%VK6oL(@H~}wA$^d1PQBkqZ?3;#YamnJK zz&Fkh$_;YDug7w5vWj#JUj0TIR=8ngB)qWCj-W!!{Vqr!me?609$DE*J}dNY!Nq3I z{eaYQ`^CGVT#47qR3|jGvM4}vih%xULyLt(Zgct)!x_*-PqaSpR+QK?u z#0x=84;Hb#lc%5=|4J=TDaB%SPAK?u?=yW>gR3px#Mh))3TU)5oX-&4FNxPr#X5`n zS=S%AIKXVw!@OaW)wy*TS}>%h5{b~6_rqO!2v7L7?u$yth7;N2lhEnFxZ7lJ(FqOP7>Y<$Egh~Zfycl+{nPF$GnfrM?HkMHVy<+u z5=|v-o@Nc}SP!!;Bkj$~ragwDfu|B!C)eS;J@czXk46`3l_BnldDt4~Q7eHX4JW8W z+GB=@cZ1~`c*r!UK)_2higfHpZ-34ER_=ZsGZjex@wo867>!@_$yl% zE~%!Dh$vmoZ-$}vLTh(*N)ZpGOX7oI{bIhy>J2nRc&rpkj-8(Kha6Xnd2?cd>7O)X z+`EN@H-3cMRnKE3CowMqxJl&&tMH?>DD9f&@{TH^v$;)Z@`UKv*4fsd4e7a&!x=SA zgsQ8LiM3nqbHRPPCl`|a!c#V6N*7-iMH&}b5S&CQLPq6R^6RUMT?~09FzySv0 zzz+Fx`Q(pk;&wm66g_+a1z&f8+tS3ARnV_<&0#o!oUhnBkOovM=t&o$U2wn_FU6jx zCGhbCakoa7nmh@IGY`*SfLEok({<(qD_JYI@EO#cL(_Jz%3~btL{g)yMlmRcd~>dk z5IWdg1}%KPyFq32z_t?m6L{{)TZm$o$G{!ReT*Z^QYdw zK9v#k-RLeRS^lqe4T!g*m`gYap*iRL6=r8t9OZ^02)mS_YiqVEcuqtWFmYVygq8{3 zhIzcu)q91&h>$9+i7ULces-9C>P#|F-h}3iR03;PHW}bU-(ngS3*Tgy#-!8qyAzV%#-OJZ~T2(xY8FTU~d(7WN1> zXZiHuWY;lO;7TeNoF`Rso~ihSheTkJfZSVPQ1EdANCDSGiTg2|N;B^6_TYQ8%g;wy z*Be@jzo5!+B9>Gk_#zGizP3PvL?H2s=Yqr3WbV(lcRohAC(T_;qchWi^MQCUqn9N< zkz_NDobtp>rcx@qWV{`f$7!v#PtW7^baA?FF0J(S*WrGs9Ai+#ODhJJ7AgI2mqbIK zil9fa=WO6*3M>ngs6uk+FN>LTelX8YSB_a;Dm~h+DCM^dO`S#AXiEYX$^crOSILWN zi9(hZVx8oJ8@6+%@o)I|-B1(<0_A;VKQ2n(lumVnJ?!%f5#s#w5g7E(Z`XvjLZq&& zWi2Ifv~zd3x{&kn9OoyubbxBAeRyHr9=LOA3@q}ztW{Axs(bqBMU;E1(Bah_gEt0n?*^9E%2AL}C?@PWc z(s$r`U;^E7Sj0Z6t4(4iM7O#G)&po?Y{&Fg(qe8pJi?J5vDBNYNZ#|UDWU>O;%~z^ z%zh@xF&H{mN?nXtsq6Q}Y^yP^gr*(=;ldl2UGD&zmGf7U90s7<)UGK(ZgI-cvV~by z1Q;>p_d4z3E<4Pi7JEDBN)QxNEL??f7|lS*`_8C2HS*|dCr?}tR|KWj4GGNW z`eYw0t68&~I_7}j*Vb^ZMe;D)Zyo6*+M%EM3;FStt0bNHH;TJf*{i&YDAFdjTf>)g z^h)LY`|kr(YKSK)r0+i(6gwzH;NjVZ|Jd8BXfxe)wzN*{lbkS|^GvC|#tDklEL)1& zRzdoCT11XHOJpF3X&+wV1puAjz#vm%kY8#$x!zx{CqkLCMdqXGneD(}M*6J<+h=(d z!al$00@67~^?7>^-k_y6(2yf?pwni{-e5w*wBnXVq#GadsPy6-WHmYxr*dUl{k9Qx18Ny`MRNjCokAFQH4-%N_WG{2%9qJETn{d- zOOnTRC~jmQb|^qpB*hz5?)D!6%hpd5NOV95mr}xGlUTF_xSsA?2 zUWjb7Tr(q=w?V0-y%!q6`P9q2ffHb6MKfyQlRUcNn$RbHsY{qF_@_P2CJjc@aCYrM?P7g|3JRAeO9 z(~EhQf#eyfAIrdg0NQB1E9^fP@L9;k(pVb(pgTlmb)_G0Vz=^SlXv;(H-7|1;1u2}pkEoSyFzV) zsl&hKRYt%I_U`eQwF_KzTa4#^Xt>Dj#;5v^7eHATyCrg^J8fEY0&v_Jh-W)RFb3hd zC*0_J^zKoBCIj(Hr_v7f(Cybdap**_*4G8m5mDxB)V9PJEN{clv6W3Pwqsd4vzsyz z81OANxS6O`hO{{%wCuP63^aIKgAJama(eFvvtZSf1eDqoFv=hUV=Jf$6HgrUKn#OC<7d zIJX!dB7~YziwkeO*n+gwj@o*?>qF~r-qT5fC@8uCEb<;rCKj~4jiy2B5SdIIU<{4R z!S8&M4C!j!Q_BB(Xlb!wwP_3~=f{+1OeB_6V8{utQU4ht6yKFfS$G%|$o{Uo!Gj(M z`5nKAN#5?-YKvn3U=QI{rl2|Kn(bGtoXBaks$~$YNi5@Mxpc{`0^$;E|J`FtpX&i< zk*V;$14@g)Q>m*KEfFsFdwEmr982U#hVjI#E%QC&M6Lu;jLTC@C@M8daUQGTu=@?n z28h$ExZTzQ^`t_;{*r9&@*+@m+5vw-zY#YC<2A&vFQPY%B2Q~oK~yfI>gJj(p2?7$ zJwLoG=Zhvy9Rop?wv9B-C{H#R3EPag`|^4H3VVHRw+06}kZF5S$9(YmvKt${-LClY zM03ENxB=#cV*w^+A+l!1BQBJRW0(lfa$AsFjZ67gWGDH-UgJ9%>|BLtr8l{}IW@zt z5$TUC<)i7{Mb%ACt}-y(nk0xSRlp6R!{~;b#d$NkCP$;q5YyB3tvkyKX^fdDJ>*{R)#Vd`5dn{4SI85&PVtEzA(baf*TJ*ERpJcWvkpdG&N{pj>psGA4%wI4exF5;dT=JJ zMjHcW|_x^R_$?fFGP3A<5c#U%UKnrGv`uVGa;Hob6z{6^M z*<8UL_<1iiThtRuL_C?3(e$tyhomvFnkdr2(71pE%C8QligbNl6{;aF+b}2RrWiq& zcR-1ic-kBj_F6=MTr{jDSWS+!xufbciTGZfKH?%bYq6AYtRWd0#@VHVseG0UVp#9M z8a8B}q6gF!Ks3XNqMT`oG!WfB}^*F-YT&VDJkTSlxz-u~ft6~(8FmOJFi2`rlQn4>Cq&|Ma) zxmF5@HEC@kv2h64N^;+jXY44$3nVQy>h!E~7=pk0YDx%*i{x2$1pCmvKfVv4UGCE^ z{mgFdaFQ*V41@KC^0oB-=#=CbzOrzYLe-~$k*Z{-&lIu_Cp4C+;prs{X4Lysm!>FQ zmCAUIyBiiL)Y4dr*X7KhLKIu>Tp>IqaZmGlkSa|_SXT)CxcLOy;42#ynv6{$s4@oh zJbTP*2J}6_C0mQPm`Y`ap*~lot+Qy`k1%kN9Eo4|RUl`+*2GqFR&Dil)Kfw*&{vc! z^48Inld|gTFrMK(6Azo>4pXD;_sB<@G%1w@{oShy|4zCXj;(qDe_V| z2U~CZ?d!C@>?P*X!(3HmuETHiFp3Fa13sApBht1Z*+wpl%q=eQY) zzEn%0yV6V244M42U?G2gUZIjEk)5M&H2ayf<{)@DL6&??)J26a?b6IK!wYV!OyEbD zHj}z}lT1N@8{8K zx#mMgV}2D0lalwWv`dt!#L2i#LhL%%MR$ zCWToD>mK)US$eu9_((h;jHHviML;3hV9F)>+OXJHkdvVDxY z$m6f{oM4x%ht@QYNhiuuWxutL7ShgjlK%#`;W>>>oL+2!f5nQEAMi^v#7*LzDQQOs zMfz)@ut4zZj&cjhYhK{#tJK7IK}-}Gfgn&z7$&VV`@;Agda`efh`6$pt{Ejr?PB>g zoRT=5qOMtI>mR|iB*`}}2+h6{LNm)rorw(t)u0%cKvvjym^&DE6J5+35q1O=~& z7Ak+K&-eBZ<0}VUAb;HqKb86ilb(MnRp+`%ZkdSoEro)=)Jqf(Sf*1By5}|eI*n$N z%qh_Crz#UyI?QylK~JG;Sz@nIREt(lPA^#V^e5^$$uT+{fX9r?rInRUy7gu+3QDMK*twszsjV! z26`+2%4YBiDd{oIHG}BGU4kr4MH)y##0c-X3+pu|-jp&ac!(;Sl{$~J{|5XWESBHM`h$fZ zRG0eMpEi6DCZfz7qKG|odP;d1} zFd>-l_%}YU`<`^uO29dD)=&7YwT{?67DrPw&p-&M_KKAKYwx7peLO z)(!;U=Q1rIoy3?Lsr+Yl{ZbUc#QGA1R+);e*V^I}j)yn>TAmD#QbAMp;q&bC6!PPf zF7IzmyFpG}a})+u16&*Y{QZB=drDHosNjS8kai75rBvaT`IbgV4LdS;kMKj?8YZHI zjI25BY^ds3-Pq3lpIO^3gQ%6N<>}$_D#pa(d!ac4@rSx!puF5q>9(TXWBN8fZ7=`L zz>;uZaA=pWZgZAWuEZDr^%4~JX5(Tw1N{`=&!4BI;uAHc=Xdenwf&Lrt7tNPO$Pv- zZWC>3NzlI}zV5ild^U>SMTA_WIG2>sf!$b0|h*zdrzGO$r0`Mug=-vyA})c8oCI{{B9r)n~8Uhv%R41OnvK z?Zhxx?1-RM!&u>2UiiyPX`kdwn|1wpZJr3oe@3cwD6rbN&Xskd!FagynQ|`ncpvtYxmEO)&-6ANYwgimcH@|aw9FoEiPVZ_M z0t!pY+&s!yuyUmWDPPHKyF5?)58?hD9URUWA~V@0HZ)4{BZa)5Jr_W~ev*-YABdG> z9^x-l3kF>r9!KHdot)8_dECA`|K+a5?h5-vzoz>E4}jSAkoX9WCod3t^~wtDxIfVS zXPrtAZC`*yZ_>B=IK4{lFRj9%9JT5pe(bSWbi_g08V=>f4hC8i!|BZXke*{c?;aEx zg>@h4uWanf{iw~jE2Kw~;UZqe2zEQnKJ0DyC!1?M1GMh6V)E(y|#ClSBYcM=2_@nODtcmuv%v>S!lpEXEBgG+)o}YbQU|eSVp;& z#@;(9;9NLfJ)!n=uSd5;;;MYYn7WR4w zYt1QG*?~?UCv#)&sO-6>zd;0}A8{uAs#VL)C!F|7+c_Uo>)qh>h-ub@COY1v9{5g8 z@rieh_K$bHQf-RvLLvZjrF=h9Eauo5{^~hU>*6;Z`804(72y+A*_(2Xsm{}pC zjR0__-BV*I7#FOLggzqrX}78w>9x3%E){cAC`K|Kr*pk5RGl;Md3?Y`c%(p$Zn?2Y zA>7-4^LMiLCW#;rUzz9ku1&YYBb*DHSJQ2~9(@`qJJQOPiAFhFkR(^`xb}#k47=t$ zV8bzf>D2W({UC58XYWUk;&sb`62JEVlK<}-*z)v>8TH|E zTKTjtBIS`g!2a5!rS9`o?r(r(k2mshJ~^Y!+vry=Z-di)luSQ1zB@gsdo_|hkKp8D5u&V+_Jc`wRJzDKB*nY|58Y3DM;&J-CphHTmDmRKy8W$#*CS6y3Fr2Q4qN z183Ki+Fqh;b000`*k-VjpKfs)(XRDCi+5e=b^+G)WO>JL2cwoN6U-;pHJ5sr&tcwa z42G>i8$r;8Jr3+q*`skunlK_=EFek&tZUisnk0caX`9vc$L(YcC!iX5l(yOH(VpXw zgGaAY>LYl}KTQRE_K7^!sND88(rEg7tPa@P3Dv`~PRv}w$D@(N5{Z+u;MD@xf7Y%v z#3Xe_A>L{@OJv2j3zY6oTr*#gBsk1Z&JxSDs@>83g}gKxJ@49}ZV#ss7*M+X*f1O} zL;>3rqhe@RRttYfL^Y|PSE2f|A|Oy|=J7aP_|Tuu=lTMdz!g=K(cqhlt|!SXRbC|p zgSl;n4|-EXqNW77>a5+=Cc*8$kYP&ZbwK1TyQ;~_cV%>w;+k1%y!sKhn6ajs&*F)b zBiI6o@6O78m_;zk>>M0#G75QLVwHMCif>Ity!k4rYkfb5zmLb{;QrwoZG<_n)vo7hlq)2qEi)JyV&R8n^urP*D99+EtP~7Rn2)nF&zoPiD`Z z#OI#dWK=M$K;qZ%0HDR+2uve*&7&_r<%ZDM#$$7>Njrkl3RvKnoU-EQ;=Jo?p+jM< z&E*0P6Zq!VWz}te=jLlwSTmq-Bmyx>sp+ z>84h$q*6OgfjB?aB9Uc((3iwjCcM@eX-gEsR=japhSjUxuWqJM-T3!R-c`drS^9BZdwmAWNHb4d#oN5szbI&1o>S9dLJE|$m`qqrZeRqBaY>E{9@oYI>; zpPx}jiSJ2pI?tKgFSOg?PvoRoWppJkS-OV3&30O>pv!|dF}l?}Df>ly<;@@_`KtzX{vRLt}!E*NM0AzZ&GC@ZZ62-kOQ zvj0Q4Cf2=k1PIqhcep7We+btF1KL?SgG5XAK1RUChQqzuLp|{IU=nj}qjE~E7eEN< z8jkq0!$|T4EP?<_?$fKzHJC`o-C093mctegWYDb*?k)FbZ_McaW$)-SGLSXEpNaJ9 z;rjC}n`mH{+nHU>fC2C{mjUi;w6Wd&=Qp}+IeVvR%|J@fv*4Sjv0Ic}Vpk)A?fvLMPawlr2r;c2o?&DxZJY)c9-MYv*}7k6?=F4mc;EC`#E}P4DyHWslL%S2Qd2iFYNtjav5| z1ne+s0u9Va|3qvWPgQWZ&eYB1$bd7@bX4BvUw{yRwZg%H{(>4~5IC*``v<$ozemd! z7m;U_ctm7&MVDKd98umCYSoT}i-Xvw63LsV{5hsvI|xyVrh#_g!;`&Hm&kq}@amF0 z|2M-Jo_=Ri-=+lji8S{jt(W;vux}G0f`9{H+O;$T0q_Esi^=HEt5{TL;%0(0xJ@2P zHXTR6`W+O*@OPN~wqIuo91eSQLLTdIbDk5{8;QZ0l?wt^V6KVPefqyEj0NEC@1^iZ z6qkFd=*0LJD3}7ZjnP0yF&;vXY-LR`Re~=R&^m!s`SoU?lZnMD3;rw08m{5e1@JUcc@m$cSq31*rUzgxO@sRfEJ^vJ+LdgH0s5rFwxU- zEdK6>eC4q#0GxkN(yGn&r&u@68u=(8cb@k^L5~E?RVcki30v=5bZf+h1b%Zit^R+hc;Qp(qhuf;#(L?xMb@!7x(@KF z4(a{$I05$4=u1}3e-8vT6-G8-AO?yc={BV36aSY1Ez^eR7RdVPiOTN0o6WeELBpUs7o@xUAK*YAf7}YI;>u;w?}pP zT`HMZRLk1oOfZ%=9H2=0slxJr&1Qc86Tl^+u)bWd*jx!oux)M^a+jIpnE;N1i1|uK&1F-ZtZEn3sBkF>@UalTo~g{Mwr+f5_?H2krje@wd|vnia}Gj1 z{!cvopddR1%g}7(X#?p6x?Mk3FzGnQiP18FXWwU;2lrZSzs*=F~- z-NCTPf-$H0wJc{?on7itfqko)a*_;A$#R!1@1$o1Kp*d5<^AtA4n`gjLniSP7#Bu0 zLafFAkNkBqXa67h>l725dRUb}-6vTKEjM{kjuiX8(IC#}m*I-QRq=xs{|8QIE_CYu zjnnzEq3-k+V%}!*)&=9+KRj>A@rvP(p_W^9t?ziqg$)WuBeA?7kjNGqFS$tHx0%I< z6kY^SZCnVndAjb>?_e~OC)NSBb`VIx5wm&u%e}ccf zcWDkGLKO$xA)Qj1Aq;#reRwB~5B$*DO2D@K{=i`rKz$ZC@}YtGZM4b?S!Tq2BlVN5 zLN0KW#z|1^JM3#?nBT(UhPAUHh!FVO@!^9@ZOF533-N3&nw?IeuPSi{Q(%pHBdW}B zLH5X~!z9cdw$luakj<5W%rw2Nqk0D_O1tJi8+U$z(%-})&t3?$pfM<$oEf3dYJj%> z*yFeP!LKsEE!euyf`q>i^VBL^biJBzZQ97qU1dNUC^f~006w{V&6KxyvO|eDWY);ma z1S)wbKaN`mKLXCcFj>@+Uc2>cfxmpN6-?b|zIm&#GZs?yV>y-_*6^10t-}n*#;i_9 zu~cIDTKW(P@4T5s|5l;&iJCESOY$ck?1f0%_^<7}tt1U$- zs6tuN{eQUh&}cnCBO%f>7ON>Cq?>BSM?TLorws+Oc?j8JTONUTUtSF%IV?30N=F&t zBnW;wps+oM_UcL&qqB|YlSjX>=iiNAU9-pKX@C5y{1NyS7iRA|_8afx(SW*(4aXj) z5b}f9KE{b=UbjR^X$})ACb4wg=W9ge_&I-8zLuwjtDp!V}-x@f&+1 z%Er^Dg--YSolRUS?eL9@<~AhDL2xQ&tgm`qZJIL(SLY!(N;PAAxBOofrU;+#q@Ynb z#s<^f$+&>!az)2L*WOjmyM?yU!MN9B?(l=3n#7m>yncmD!5ylfO3N zXE0gW6w@;W<6VWua&~Yds*U~q^|%Kc`LiKDPoCPA3GDoH6F9m7H1K}1iSzE? zb~b`OsIFWiPD+qcA|?66O@l9h21S3k6L+I*TF$$^JplR?pmnePc-^SF8M9}NY!+72 z{NpHa;u)nC7O`?H3Kk8JdT+0w!mgz3l5gzjP_;W0ZPLvZ0?bN;c(FtF#fuHluP$Uv z=0-o|#tzkS`b0pRJ9zUzbS#!W{#ToHZRLsc$nE!7ilB4x5}Wqk)b=0J51NoT&lHl> zFH4bEU4TvHSfau5xtDbr=cGMzb~b8$*c$2QS9&DKbs9mg`$)f)j?&37QxF92I;J;P z0FilYb(K}q{T~1xe(JPUxOq+)ePB;8Ddi7%ke`IB!^%b9(?rYu{TKx;DJ| zI51-hZCqGx>@x!qOkf4N5m%8LaQqKbbT}>I78+Un7kB;Uc`%uF5N3i+Dx>d`g!h7= zPKtgh!#+&?jo;Qi7nuCwje&B|c~-r=}MNed$W*85K5u|K?@$}`OM>(!VE_(-8G zXLr~d3n`G5WX_84c*aKl#?h=mUxNlzX0ZUd5$ho~6z*8bPIWRvKb~NwfIy9we@Ob` z!kt8JXx>=`0qp90BM?=eyc}owX-zkZqsbyk^}LL1@xeD{)czzzFhqBSV>tHOyAhgl zSfL|;$5_GTd7~pM5~247A{!6()M!Dj3hgyF)(g7Rd>auA`{-5J-xUmk7eB|O@f4i$ zWLHV{@ClZn#3r4#$8>H&?Ijl8*DUAeHehac&Q5(e^`*f33?R2G0OZ2C2{x)e#Vffi zVIN;8i01bx(94@yVq;&Lm;iGO_IWecbw2dpxdR+{&C_}Uv(uSVT3BZpR%XZc;w^;3 z2E+bw_;(mQY(&wpfkk*{h6YY%EXGf_9xw$%5UchgH-YQINyY$z`#XS0X-9D5gO?=N z2R-f9%vjOY9_k_;DU zx2nAg*IRf*9Dr^?d=D!JIVXDjO@AVFb!N9ebw3Tks7$Y$AI{Num;VX49WjsMOdw7A z+%2Ew^dQc}J{a>)+z$4QBXaz&X3DiYH0BOAY+l5s698#iO;b$JGif)R*BeUa{olmj z6zFxt=&Qt*M4L<{E~4B;`EN;z6rsn5xXEZ4De}#5yj%uf=|Lx(snAHjS;0!8v7k;- zH04H`CA~z3C*~|H)mok1`xx0A5cjh!dBwcf3h-W!Y5{O~EG99Ehj^ML zIIpqHSyUkBoC7>5boV*e1D_vV+WW&lCM^x!Z0-a64jk{0N0*M#wN=g*t%=7^Be@bi zVO>@!_>lm~L*k&p&On8&9qB3Sn9v4Yrr1{VF+tAQOB{896*@d-ZXo0n%76r_cNmU> zWvV-uZvJ^s$KEtQOJa#KUmz+aLbMibs0x7}f+(IhEJj>4UGP+f>3397B+;sF($E$m z8foOpPOpGPxB>&RpCYWlpgK3oLu2{vNbf0JIiz@dT8tr!`!jz^xGn4#zy#My4-zI0 zL*^_-aRJleDBM#f5)SR11xEpkI03Azvu-5Iuu-yup4zhav+CI4ltYe1f%1YAg4Rpv zK&6a16t_KMygNUmN=?D42UJHgQzN=n?9d6nKjA}n5$~|jyK`gXNP+XRLox+7SSH#%V9JlFaatpU zdF`JLhcg9Jp|cE+erB7K07qCCeS*v8L>-FFX?I9zI;A#H#~&shvt% z)9EvO1l#jN1O+>DN(45f4EWS2BexTW!XuaU3TJ1WU9l}D_YlA9XGH!eb~X9X@lj+dLXPr|mQh)5u% z3c0w2M?sc9*VIPKFG*y4&#PCX|EgpWHQUtd4W5Nh~=@F%-3c;P_7&ieKl~K{xb4M&)Y+%=t*Wf zzR(Zs1JRZFGTXE5vmp0@z0A8(C0_Vn6H)J(MscoNCzkH5cQ}?7{k76$GV~807HTMjov)tGtYN8ht#3l81=Il;uuy)VvuNz}Y~Ex#L54xZM>=tWfeZ55wxFOC`i zUHubULQ=(|cnT`0za9UZBtiTe{-YPlY$;xQnz)`(4pE$43BLS?#RDh*g#5~0e*nn4`PsM$={j}mf=G${g0pB@o zDz0ydczJqU0H@#M`{TaYI8vt2ukI|IlRO6|VZ5(5wCfz7yBej*`nBYV)4y3=6pk?E zr#ZIYRefwfZth@(0#2KbooA(mv9P*x*L&I(`mQd2MxIK~(|Su%IV>Ptiy?XTJBm&9*2hIL)sW&(f8>ic^+u)n0*J`d?V!mR&ukVX`|b@q+J2pn>9 z5}3WIwyZ^GKn#3G_PK{adXFaRjGAuUL_8s!w!411J4Q4fAUi=I`G;&*8XWBul=js( zYgqWcmZ*&_HBLTzm5=IGh@L?tX8!QeEcJUhDo3c@SOTogEZ<{PAK2RN3*8@e zBI33#3Yl0m%h9R8rZUJgtWgmsv6l?EJg=g(tR=`a@Atla$2*i(0hF$@v3ukQBYLB!KaZ?!o`_ggYj3;76i2QY& z7t(0?q&Uxc=SV+dO8}>V*HvlgM03q~*=}1dHyksxWayxS$BXkc|Cu2osn+M5q`{-$ z&WuZ^ncYrGFE&yXwH+?rI6J=Z&?U?SZFP9D|#>TRc!-E6mIKTzji z!2IL+SmOqSL2j?*;R3~Deb2*}pX^na7k63IM;+Xah{2xU(p_WI;)w*u@*(Z=J-1 zf96ScSzxm_q$6i|mYNI2`EA8ThCJr^4Sb4Tum^??qL{_eyHQP6G;g5=folNoie46k&F`lXV+`rdG=gN+BrI52+;Gk})6CW6I4*Yjx8P!9aQA1Z>Z7 zId8Q{EuN0NGP}ocQueXQqRV+n){S-$6s2#$m&Inrw>9OCOFkD%BVHlv&kMl?!tG(si@|94JAjLb(Qz{(jQ;PirXr>(2de*NRE7JN^+m_wm398;vLPC z$@aIG0Zfd;&CP8h?n9YLP2_*{rLwi_C!&9I`9;pJH80msPhiP{XKo)0Y)In+z7NS7 z20>4GDzz47_!gRNa=KStrZNY) z%<+VY;H%!(rD=2s=a;TELHwb6y>w`xUp zmYT1~{n!<^o7bn`lXwh-9esl`!J#BcY9po^C^HMa{`>J11KZHKm%#oh=r*teP$l)L z7`u$AfOZG-E|W2I{3s(U^+Pi$&W`)}j#lh&yiTsctH>?18O;Fo{AmdFV7rvt|JGwO zQ-SBS+{@x)%n{``!qoD5CXi;8r^&+XJ$?}UAO>SIQN#JF^$x;pQw=)M&X|H<9)1sW znOv@U;=JXUq7UDZztvKyj*i%0__}AwI4^uy02psJB++JRd?nwxC~d#BvQUuUx7}Q? z@EJ?{eG4ncrHFlZnlqYBGoJ=RM7*X+NXUA!!!QpE`X9r8*4}kqWV<|~_tfsygz-QB zT0Rt0sJk)y=pUoQzC%nurAe~{qU^(u9t+qJ{h8Ej+2;I-5eHd|99z7IRYMg|2A-%) zYXxZb-a|XnafJYKzfiU`Q zmz2A`pU}{HPtM8ObP2bU69JA@tB{%tmIPrN;H$f1Murp7%e5rT^SBX}8Kvr|Rhs;6 zfvNJM$q?yv63fA+3yyiRb5E#uX{FDQOhNKRg`QdQfCwFJi(S#TbG9@$%%yBfL1_Y? z7VjSuK_<No{)-7;5xLuBn(Sjl=4rf zgHbxNpSs|=z3*G}=bKUrGtWpG%X~OpUYXrTXES1wDwwhy7zC{&F77|UZETS)ZzfE3 zL?hi_H|Naf(6;XMh7Zr2y?}x*+14f-Y{$OJL`kJx6$DfOZV!Xq0dXS4^Kip~yuAYl zi73~-3iwL0*_#472G)14aV>lLWc$9VF$is$k*?QP%q^zw(Fin<+NtHf5I~?WEtq}j z8|czxeOhvY&dnFJwdsuh(wz{D|9u_tlqb_VzCOY`(qq#PX$6sVp&_eV=n8RTDz>QR z0w3JxZnB^|GOdhsOtH>zI^SIp&806{>R>%TU#E81UjDf6zPHPRuYOE!K<@_Qcx-@Cj&GF8u=^|M@m5zo0w(t2o&@o$u+P$T&4eEWu(k-KVw#+~L7(~y z9dtQO!r2yk6u@*fgcZC5k9oBy6`-HXfn$`*F6Du0PD<1~oZ!3{f|uNQTmp$l|IDWd zb#O#I|3$~_@OnK*m^^y^Z&nCQFuVANOXQjnPWhiY;t}ZStiV^o;3|nZw2}b*iCB*b zA#hllct|iCQ{{KzL!3IDUHn|-t{ym!prJ<+4_aU3raKCX@I09DZC;^mEgoI&5Jk_= zxo$u^jrI#VGjoAe-JEd!H;FglhJzLd2PdW#UrV^+5f`Mg_GwyXO2FE@F#!(bCHte9zyyMY@5D};J=5bqKry5<}~=-e*y-2 z^1}Fhsr8mSmh$CIfvTY~Pmo%FAu9>q*S)ue;-Na9{`9%&7+Q7ap2VX}X6BddhL#ZI zzZmilEW7`7=k!k+y$YeBy~nGCPMtG4a(2C0lv@Ps`ri!;h8$0aeMcuu_Cs_@5EdIh zTgvPxCh4E1lJhk9f-=1X8gwVUq+m}AysXl~*GBsD$|w(WM>N6fG2E|GFlsqQoPGsk zzjmvheN-h{F(5f^=nQ2bz%KUO(}!; z_DR1Zie2O+a%QQ&JFy4vYrlNGBQ%w40O3)0K;%tOwcfcW;#~KfiO} zplZ?eYUi*1nE4fu(jWpqv%dO>e?R>LY3BZOvCgl#S6G<&2!e56 zyR!0?hO$0PFGX@}gyBIlvVop*nQ796BBVSyYN!xDB~J|z-5Fx??9{1zZ5K1+b8&{Z zOkx(>0kSXWGsNxoE#Qtcd3|olH%a~X^Sc5uA%Vg2z}NUD!(!kT;z(P=A~`E}KG2 zDgcI+_0Xdza4N)dd#r>2E8yoqv_0W(^zWt8vXi&{RA`HEH?q5c-+?YN?}aiN>Cu_j zG@$QByb^J7tQk<8fR5{_zlTH@PA9AgHZ#L_1~(C-6`Nw!00K9mb2Z`GZainCkKt92 z_?z5kR)?w-u^;@KXk1Zb%K)N2VnoZwcj;*Vohl)qcl)E%hHgD7R&f6QLQxG~++(hh z-*W>)_+#VW(}t;d0oT^zqFMihzm!D}rPtAD%~kN?{w$r4cfSz6jY+ZC%FBp837)#! zI^SPUrZzYD+K~1b;Tw_-j} zvMq2^>04=6O%w`-Ln$Am0_7s0LfXO#6zhg4=Y?I0k;QJ}0-rSp${8zor!md15wkn- z^x=ja$PN1suBPrbxCbZ6jhIZ)ZGH~m{$A@4XB;J=O#_^&yHB>Tk_+U8Dvva0c~XKP zRh8+dq%my9Agk{CUT)FNd1zEZ0@-EiP0dzS?y5K`UUGW^`BrgAv>;*=_Z_ywx)k`8 zv1BmBe#xET${U0<@&FtFz$%E*wM+f)ED}=`owf8-%_y5NhF+0t+(Pc(eOObuNIU)# zafB|j*a{;W>G+n|7ILkcA}<*mn9iIa9(^|waA*c=P(*DFOxhlAbEeM03ho$Ft}%B# z>Vf|12ssJ>+@#sgCK!V)(vQ$vFQbOR!tcJH_G&~W%y)oqN}FBK#&r13a4d#ndJ&h( zAlKDG(&k)^Xj4Zw-z#ja@7TVwHQ&Jf;Tzx@Rk$KK=+iTqx#83`4l^(RJ2}PS*F|tS zEM_inwZ}CY;E-k#hAb0d)0db6XMC7MB~)y?c|YvZV+J1;L*HY1x7f(se=z*Xt4hoj zO1e?%1$#OGhDI(HN`pTY>MUoL)iCBxRg)p=z{0F;4VdMU`(xsj-HdoA(`JYgr+(1Z=D z;JH(lQuRHD5gqOY&#T>X8rOTI#w`+l?fWh*IjmyQAAjkd0-|@9l1be;2+=4jlZbr| z8@$8jK%pcT58s(?2Nr~*Si@s?2mVuwrUOpDOr-@hA;}2E4hX`BrgGy{c!?0-cDlYi z<#D|S!YqE440+mE|AI-E&D`f2P-}dLM`C%muFE~7WQn~@JDx4JZyLSJ_CT%d}`>Hz}8@rtt!G|W9 zZ~uPGp;OHBU#-~9h2T3wziMtbIAfKURoK)S3Zaqh(tZ!2bBpgG#ndi+vE^;1U3b1X zfds-1NEVe3iM1#Z-AOvi2kfn;kvg1zD^*tAw1B_;&N(;LB)ta#0gebI$lff`i? z%C;#}ti+=>H#VgNfaRPk5!t-=&amVQF9K_yOViSHFN&9beG!^Y^A!q!*q zmBfVVwI^P1q`&_$mF7-tF9nB+AsT5sEoGg?4i~sz3VLsMm8r}R?Zx@eK-2Yb@FC6{ zR^^DRRd*J!>fRMawA=$hWJ3)HNYA2Ke98&ibUkZ_OTY4b*BUcBzZ+`Q3kZp+X+yMa zX~z|%?$6+XZ?GyI)y4!ga`Lwl7WZD>d7-OE2Nip!8 zGwcWLT{exAE%Q$g?>0E9b8+<=-VJpiYw-3Ch~8pcK(CwE`Z-cMu=dQIBP82Cc9Ix5 zO}zOhw)gI}mtn#F^5gVRyMjf&qi9Oqrk@1QZ|w2cdhKB|P0O@qAM))iEf{lrO5@3- z98*oX%R!Y3^n;_5-5K$NwuH6L6=ctvlfT2?0i; z*O75Gt(y;E=fz@t6-%emR4hw&|4qPvf|IyX?DH&K6;8l@0^|EgU8XzW!J6#U|q4)Rn0G#-bLSyjt^mz5>0C&8C#jDc*#~-iN zxp}4e9)R}Bq!MN|1xox^cR+^F2j&kp035xo_1}{?S5}y{#mWMJz-V|ZDZziGO>Y#% zMJj=+Tu7M6{;Q{4fY_BmuHaKvCX)Yo4A?^k=YQ)bkuWqClI1tE*!$jq>z+2p$2F(@ zV{4z!59kuKJ?6KXS&VIVtxc<5>KItK{wn9K21|;c=W0m*uy>xcew>#=rsDUfy9w}2lN Mh~|?*dGmMw3p1fCd;kCd literal 0 HcmV?d00001 diff --git a/readme_Flow_exe2.png b/readme_Flow_exe2.png new file mode 100644 index 0000000000000000000000000000000000000000..6b816b89764f6dda8e88c03160d2b4b928f469b0 GIT binary patch literal 51357 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 z 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 G2L2awt0~C< literal 0 HcmV?d00001 diff --git a/readme_sublimedemo.gif b/readme_sublimedemo.gif new file mode 100644 index 0000000000000000000000000000000000000000..d035a26637c2534818ebe1726f1dbc7ede6458ff GIT binary patch literal 297780 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 n_$J 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 literal 0 HcmV?d00001 diff --git a/sender.go b/sender.go new file mode 100644 index 0000000..9b539dc --- /dev/null +++ b/sender.go @@ -0,0 +1,383 @@ +// Package main (sender.go) : +// These methods are for sending GAS scripts to Google Drive. +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "math" + "mime/multipart" + "net/textproto" + "net/url" + "os" + "path/filepath" + "regexp" + "strconv" + "strings" + "time" + + "github.com/tanaikech/ggsrun/utl" + "github.com/urfave/cli" +) + +// Exe1Function : +func (e *ExecutionContainer) exe1Function(c *cli.Context) *ExecutionContainer { + if len(c.String("scriptfile")) > 0 || c.Bool("backup") { + return e.projectBackup(c).projectUpdate(utl.ConvGasToPut(c)) + } + return e +} + +// Exe2Function : +func (e *ExecutionContainer) exe2Function(c *cli.Context) *ExecutionContainer { + if c.Bool("foldertree") { + btof := "function main(){return new ggsrun(null, null, null).foldertree()}" + return e.executionAPIwithServer(utl.ConvStringToRun(c, btof)).esenderForExe2(c) + } + if c.Bool("convert") && len(c.String("value")) > 0 { + btof := "function main(e){return new ggsrun(e, null, null).nodocsdownloader()}" + return e.executionAPIwithServer(utl.ConvStringToRun(c, btof)).esenderForExe2(c).byteSliceConverter() + } else if c.Bool("convert") && len(c.String("value")) == 0 { + fmt.Fprintf(os.Stderr, "Error: No File ID. Please set it using '-v [ File ID ]'. ") + os.Exit(1) + } + if len(c.String("stringscript")) > 0 { + return e.executionAPIwithServer(utl.ConvStringToRun(c, c.String("stringscript"))).esenderForExe2(c) + } + return e.executionAPIwithServer(utl.ConvGasToRun(c)).esenderForExe2(c) +} + +// ExecutionAPIwithoutServer : +func (e *ExecutionContainer) executionAPIwithoutServer(c *cli.Context) *ExecutionContainer { + if len(e.Param.Function) == 0 { + e.Param.Function = deffuncwithout + e.Msg = append(e.Msg, fmt.Sprintf("Executed default function '%s()'.", deffuncwithout)) + } + e.Param.DevMode = true + return e +} + +// executionAPIwithServer : +func (e *ExecutionContainer) executionAPIwithServer(sendscript string) *ExecutionContainer { + if len(sendscript) == 0 { + fmt.Fprintf(os.Stderr, "Error: No script. Please set GAS script using '-s'. ") + os.Exit(1) + } + if len(e.Param.Function) == 0 { + e.Param.Function = deffuncserv + } + scr := &Com{ + Com: sendscript, + Exefunc: e.Param.Function, + Log: e.InitVal.log, + } + scri, _ := json.Marshal(scr) + e.Param.Parameters = []string{string(scri)} + e.Param.DevMode = true + return e +} + +// executionError : Check error for execution API +func (e *ExecutionContainer) executionError(body []byte, err error) { + if err != nil { + json.Unmarshal(body, &e.FeedBackData) + if e.FeedBackData.Error.Status == "UNAUTHENTICATED" { + if len(e.chkAtoken().Error) > 0 { + fmt.Printf("Invalid Access token. Please retrieve it again using command '%s auth'.\nCurrent access token is '%s'.\n", appname, e.GgsrunCfg.Accesstoken) + os.Exit(1) + } + fmt.Printf("Authorization Error: Please check SCOPEs of your GAS script and server using GAS Script Editor.\nIf the SCOPEs have changed, modify them in '%s' and delete a line of 'refresh_token', then, execute '%s' again. You can retrieve new access token with modified SCOPEs.\n", cfgFile, appname) + os.Exit(1) + } + if e.FeedBackData.Error.Message == "PERMISSION_DENIED" && + e.FeedBackData.Error.Code == 403 { + fmt.Printf("Error: Please check Execution API at Developer console.\nIf Execution API is unable, please enable it. Or please check 'client_secret.json'. It might be that that is not for the project with Execution API.\n") + os.Exit(1) + } + if e.FeedBackData.Error.Message == "Requested entity was not found." && + e.FeedBackData.Error.Code == 404 { + fmt.Printf("Error: Please check the deployment of API executable and/or the ggsrun server.\n - If you use command 'e1', please deploy API executable again. If you use command 'e2', please check both again.\n - After deployed API executable, please save each scripts on the project again. This is very important point!\n - When you use the server as library, please confirm server.\n - Also you can use 'Logger.log(ggsrunif.Beacon())' at Google Apps Script Editor to confirm server condition.\n - Also, please check the script ID.") + os.Exit(1) + } + if e.FeedBackData.Error.Detailes[0].ErrorMessage == "The script completed but the returned value is not a supported return type." && + e.FeedBackData.Error.Code == 500 { + fmt.Printf("Error: %s\n", e.FeedBackData.Error.Detailes[0].ErrorMessage) + os.Exit(1) + } + fmt.Fprintf(os.Stderr, "Error: %s.\n%s", err, body) + os.Exit(1) + } +} + +// MarshalJSON : For exe1 +func (e *e1para) MarshalJSON() ([]byte, error) { + var outd string + if len(e.Parameters) > 0 { + if regexp.MustCompile("^[+-]?[0-9]*[\\.]?[0-9]+$").Match([]byte(e.Parameters[0].(string))) || + regexp.MustCompile("^\\[|\\]$").Match([]byte(e.Parameters[0].(string))) || + regexp.MustCompile("^{|}$").Match([]byte(e.Parameters[0].(string))) { + outd = fmt.Sprintf("{\"devMode\":%t, \"parameters\":%v, \"function\":%q}", e.DevMode, e.Parameters, e.Function) + } else if regexp.MustCompile("([a-zA-Z]|[0-9].*[a-zA-Z]|[a-zA-Z].*[0-9])").Match([]byte(e.Parameters[0].(string))) { + outd = fmt.Sprintf("{\"devMode\":%t, \"parameters\":%q, \"function\":%q}", e.DevMode, e.Parameters, e.Function) + } + } else { + outd = fmt.Sprintf("{\"devMode\":%t, \"function\":%q}", e.DevMode, e.Function) + } + return []byte(outd), nil +} + +// EsenderForExe1 : Sends GAS to Google and retrieves results. +func (e *ExecutionContainer) esenderForExe1(c *cli.Context) *ExecutionContainer { + var paraint []interface{} + if len(c.String("value")) > 0 { + paraint = []interface{}{c.String("value")} + } + epara := &e1para{ + Function: e.Param.Function, + Parameters: paraint, + DevMode: e.Param.DevMode, + } + re, _ := json.Marshal(epara) + if len(re) == 0 { + fmt.Fprintf(os.Stderr, "Error: Format of values is wrong. Double and single quotates have to be escaped.\n - Inputted value was %s\n", c.String("value")) + os.Exit(1) + } + r := &utl.RequestParams{ + Method: "POST", + APIURL: executionurl + e.GgsrunCfg.Scriptid + ":run", + Data: bytes.NewBuffer(re), + Contenttype: "application/json;charset=UTF-8", + Accesstoken: e.GgsrunCfg.Accesstoken, + Dtime: 370, + } + body, err := r.FetchAPI() + e.executionError(body, err) + json.Unmarshal(body, &e.FeedBackData) + var dat string + if len(e.FeedBackData.Error.Message) > 0 { + if len(e.FeedBackData.Error.Detailes[0].ScriptStackTraceElements) > 0 { + dat = fmt.Sprintf("{code: %d, message: %s, function: %s, linenumber: %d}", e.FeedBackData.Error.Code, e.FeedBackData.Error.Message, e.FeedBackData.Error.Detailes[0].ScriptStackTraceElements[0].Function, e.FeedBackData.Error.Detailes[0].ScriptStackTraceElements[0].LineNumber) + } else { + dat = fmt.Sprintf("{code: %d, message: %s}", e.FeedBackData.Error.Code, e.FeedBackData.Error.Message) + } + e.Msg = append(e.Msg, dat) + } else { + var rs map[string]interface{} + json.Unmarshal(body, &rs) + e.FeedBackData.Response.Result.Result = rs["response"].(map[string]interface{})["result"] + } + if len(e.FeedBackData.Error.Detailes) > 0 { + dat = fmt.Sprintf("{detailmessage: %s}", e.FeedBackData.Error.Detailes[0].ErrorMessage) + e.Msg = append(e.Msg, dat) + } + e.FeedBackData.Response.Result.TotalEt = math.Trunc(time.Now().Sub(e.InitVal.pstart).Seconds()*1000) / 1000 + e.FeedBackData.Response.Result.Uapi = eapir1 + e.Msg = append(e.Msg, fmt.Sprintf("Function '%s()' was run.", e.Param.Function)) + return e +} + +// esenderForExe2 : Sends GAS to Google and retrieves results. +func (e *ExecutionContainer) esenderForExe2(c *cli.Context) *ExecutionContainer { + re, _ := json.Marshal(e.Param) + r := &utl.RequestParams{ + Method: "POST", + APIURL: executionurl + e.GgsrunCfg.Scriptid + ":run", + Data: bytes.NewBuffer(re), + Contenttype: "application/json;charset=UTF-8", + Accesstoken: e.GgsrunCfg.Accesstoken, + Dtime: 370, + } + body, err := r.FetchAPI() + e.executionError(body, err) + json.Unmarshal(body, &e.FeedBackData) + var dat string + if len(e.FeedBackData.Error.Message) > 0 { + dat = fmt.Sprintf("{code: %d, message: %s}", e.FeedBackData.Error.Code, e.FeedBackData.Error.Message) + e.Msg = append(e.Msg, dat) + } + if len(e.FeedBackData.Error.Detailes) > 0 { + if strings.Contains(e.FeedBackData.Error.Detailes[0].ErrorMessage, deffuncserv) { + dat = fmt.Sprintf("{server_error: Server for ggsrun is NOT found. Please deploy the server which is a library for GAS as 'ggsrunif'. Sctipt ID of the library is '%s'.}", serverid) + } else { + dat = fmt.Sprintf("{detailmessage: %s}", e.FeedBackData.Error.Detailes[0].ErrorMessage) + } + e.Msg = append(e.Msg, dat) + return e + } + e.FeedBackData.Response.Result.TotalEt = math.Trunc(time.Now().Sub(e.InitVal.pstart).Seconds()*1000) / 1000 + e.FeedBackData.Response.Result.Uapi = eapir2 + dlfileinf, _ := json.Marshal(e.FeedBackData.Response.Result.Result) + var rs map[string]interface{} + if err := json.Unmarshal(dlfileinf, &rs); err == nil { + fid, ok := rs["fileid"].(string) + if ok { + e.DlFileByScript.Fileid = fid + } + exn, ok := rs["extension"].(string) + if ok { + e.DlFileByScript.Extension = exn + } + if len(fid) > 0 && len(exn) > 0 { + delete(rs, "fileid") + delete(rs, "extension") + e.FeedBackData.Response.Result.Result = rs + res := e.defDownloadByScriptContainer(). + GetFileinf(). + Downloader(c) + e.Msg = append(e.Msg, res.Msgar...) + } + } + e.Msg = append(e.Msg, fmt.Sprintf("'%s()' in the script was run using ggsrun server. Server function is '%s()'.", deffuncwith, e.Param.Function)) + return e +} + +// ProjectUpdate : +func (e *ExecutionContainer) projectUpdate(sendscript string) *ExecutionContainer { + var overwrite bool + for i := range e.Project.Files { + if e.Project.Files[i].Name == defprojectname { + e.Project.Files[i].Source = sendscript + overwrite = true + } + } + if !overwrite { + filedata := &File{ + Name: defprojectname, + Type: "server_js", + Source: sendscript, + } + e.Project.Files = append(e.Project.Files, *filedata) + } + script, _ := json.Marshal(e.Project) + metadata, _ := json.Marshal(&ProjectUpdaterMeta{MimeType: "application/vnd.google-apps.script"}) + tokenparams := url.Values{} + tokenparams.Set("fields", "id,mimeType,name,parents") + var b bytes.Buffer + w := multipart.NewWriter(&b) + part := make(textproto.MIMEHeader) + part.Set("Content-Type", "application/json") + data, err := w.CreatePart(part) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + if _, err = io.Copy(data, bytes.NewReader(metadata)); err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + data, err = w.CreatePart(part) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + if _, err = io.Copy(data, bytes.NewReader(script)); err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + w.Close() + r := &utl.RequestParams{ + Method: "PATCH", + APIURL: uploadurl + e.GgsrunCfg.Scriptid + "?uploadType=multipart&" + tokenparams.Encode(), + Data: &b, + Contenttype: w.FormDataContentType(), + Accesstoken: e.GgsrunCfg.Accesstoken, + Dtime: 10, + } + res, err := r.FetchAPI() + if err != nil { + fmt.Fprintf(os.Stderr, "Error: Project cannot be updated. So the script cannot be executed. May your project be not a stand alone script? 'e1' command cannot be used to the stand alone script. Even if your script is a bound script, you can download a project using '-b' option.\n%v\n", err) + os.Exit(1) + } + e.Msg = append(e.Msg, "Project was updated.") + _ = res + return e +} + +// ProjectBackup : +func (e *ExecutionContainer) projectBackup(c *cli.Context) *ExecutionContainer { + r := &utl.RequestParams{ + Method: "GET", + APIURL: sdownloadurl + e.GgsrunCfg.Scriptid + "&format=json", + Data: nil, + Contenttype: "", + Accesstoken: e.GgsrunCfg.Accesstoken, + Dtime: 10, + } + res, err := r.FetchAPI() + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. Please check script ID or access token. ", err) + os.Exit(1) + } + json.Unmarshal(res, &e.Project) + if c.Bool("backup") { + btok, _ := json.MarshalIndent(e.Project, "", "\t") + filename := e.InitVal.pstart.Format("20060102_150405") + ".gs" + ioutil.WriteFile(filepath.Join(e.InitVal.workdir, filename), btok, 0777) + dat := fmt.Sprintf("Project was saved as '%s'.", filename) + e.Msg = append(e.Msg, dat) + } + return e +} + +// WebAppswithServerForExe3 : Sends GAS to Google and retrieves results. +func (e *ExecutionContainer) webAppswithServerForExe3(script string, c *cli.Context) *ExecutionContainer { + if len(c.String("url")) == 0 { + fmt.Fprintf(os.Stderr, "Error: No URL for Web Apps.") + os.Exit(1) + } + tokenparams := url.Values{} + tokenparams.Set("com", script) + tokenparams.Set("pass", c.String("password")) + tokenparams.Set("log", strconv.FormatBool(c.Bool("log"))) + r := &utl.RequestParams{ + Method: "POST", + APIURL: c.String("url"), + Data: strings.NewReader(tokenparams.Encode()), + Contenttype: "application/x-www-form-urlencoded", + Accesstoken: "", + Dtime: 370, + } + body, err := r.FetchAPI() + if err != nil { + fmt.Fprintf(os.Stderr, "Error: Please check Web Apps Service and/or URL of it. Web Apps Service might not be deployed. ") + os.Exit(1) + } + json.Unmarshal(body, &e.FeedBackData.Response.Result) + e.FeedBackData.Response.Result.TotalEt = math.Trunc(time.Now().Sub(e.InitVal.pstart).Seconds()*1000) / 1000 + e.FeedBackData.Response.Result.Uapi = wapps + dlfileinf, _ := json.Marshal(e.FeedBackData.Response.Result.Result) + var rs map[string]interface{} + if err := json.Unmarshal(dlfileinf, &rs); err == nil { + e.DlFileByScript.Fileid, _ = rs["fileid"].(string) + e.DlFileByScript.Extension, _ = rs["extension"].(string) + if len(e.DlFileByScript.Fileid) > 0 && len(e.DlFileByScript.Extension) > 0 { + delete(rs, "fileid") + delete(rs, "extension") + e.FeedBackData.Response.Result.Result = rs + e.Msg = append(e.Msg, "This mode cannot download files. Because this mode is not authorization.") + } + } + return e +} + +// ByteSliceConverter : +func (e *ExecutionContainer) byteSliceConverter() *ExecutionContainer { + if !strings.Contains(fmt.Sprintf("%s", e.FeedBackData.Response.Result.Result), "Error") { + var f ByteSliceFile + rr, _ := json.Marshal(e.FeedBackData.Response.Result.Result) + json.Unmarshal(rr, &f) + c := make([]uint8, len(f.FileData)) + for n := range f.FileData { + c[n] = uint8(f.FileData[n]) + } + ioutil.WriteFile(f.Name, c, 0777) + e.FeedBackData.Response.Result.Result = "### Byte Slice of File ###" + e.Msg = append(e.Msg, fmt.Sprintf("File was downloaded as '%s'. MimeType is '%s'.", f.Name, f.MimeType)) + } else { + e.FeedBackData.Response.Result.Result = "Server isn't installed or Wrong File ID." + } + return e +} diff --git a/server/server.gs b/server/server.gs new file mode 100644 index 0000000..3042ae2 --- /dev/null +++ b/server/server.gs @@ -0,0 +1,225 @@ +var VERSION = "1.0.0"; +var IGGSRUN; + +/** + * This method is for ggsrun with Execution API. + * "ggsrun" brings us more convenient development-environment of Google Apps Script + * on local PC. "ggsrun" sends your script of Google Apps Script created at local PC + * to Google and retrieves the results from Google. This library "ggsrunif" is used + * for "ggsrun" made of golang as an InterFace. Namely, this is a server script. + * WEB https://github.com/tanaikech + *

usage

+ *
+ * $ ggsrun e2 -s [Script File] options
+ * 
+ * @return {string} Executed result of script. + */ +function ExecutionApi(e) { + IGGSRUN = new ggsrun(e, null, []); + return IGGSRUN.executionapi(); +} + +/** + * This method is for ggsrun with Web Apps. + * "ggsrun" brings us more convenient development-environment of Google Apps Script + * on local PC. "ggsrun" sends your script of Google Apps Script created at local PC + * to Google and retrieves the results from Google. This library "ggsrunif" is used + * for "ggsrun" made of golang as an InterFace. Namely, this is a server script. + * WEB https://github.com/tanaikech + *

usage

+ *
+ * function doPost(e) {
+ *   var password = "password"; // Password for using Web Apps
+ *   return ggsrunif.WebApps(e, password);
+ * }
+ * 
+ * @param {e} Script and parameters. + * @param {password} Password for launching script sent from local PC. + * @return {string} Executed result of script. + */ +function WebApps(e, password) { + IGGSRUN = new ggsrun(e, password, []); + return IGGSRUN.webapps(); +// return new ggsrun(e, password).webapps(); +} + +/** + * This method is used to retrieve parameters as a log. Please use this in your script you send using ”ggsrun” instead of "Logger.log()". + * @param {Object} channelId Group to leave + * @return {Object} result + */ +function Log(l) { + IGGSRUN.logg(l); +} + +/** + * This method is a beacon to confirm the existence of ggsrun's server. + * WEB https://github.com/tanaikech + *

usage

+ *
+ * ggsrunif.Beacon()
+ * 
+ * @return {string} Same string for sending string. + */ +function Beacon() { + return new ggsrun(null, null, null).beacon(); +} + +// Server script +(function(x) { + var ggsrun; + + ggsrun = (function() { + var emessage, wmessage, logsheet, recLog; + ggsrun.help = "This is a server script for ggsrun using Execution API and Web Apps."; + ggsrun.name = 'ggsrun'; + + function ggsrun(e, pass, logar) { + this.e = e; + this.pass = pass; + this.ss = logsheet("ggsrun.log"); + this.logar = logar; + } + + ggsrun.prototype.beacon = function() { + return "This is a server for ggsrun. Version is " + VERSION + ". Autor is https://github.com/tanaikech ."; + }; + + ggsrun.prototype.logg = function(val) { + this.logar.push(val); + }; + + ggsrun.prototype.nodocsdownloader = function() { + return (function(id){ + try { + var file = DriveApp.getFileById(id); + return { + result: file.getBlob().getBytes(), + name: file.getName(), + mimeType: file.getBlob().getContentType() + }; + } catch(err) { + return { + result: "Error" + }; + } + })(this.e); + }; + + ggsrun.prototype.foldertree = function() { + return (function(folder, folderSt, results){ + var ar = []; + var folders = folder.getFolders(); + while(folders.hasNext()) ar.push(folders.next()); + folderSt += folder.getName() + "(" + folder.getId() + ")#_aabbccddee_#"; + var array_folderSt = folderSt.split("#_aabbccddee_#"); + array_folderSt.pop() + results.push(array_folderSt); + ar.length == 0 && (folderSt = ""); + for (var i in ar) arguments.callee(ar[i], folderSt, results); + return results; + })(DriveApp.getRootFolder(), "", []); + }; + + ggsrun.prototype.executionapi = function() { + var startTime = Date.now(); + var dateDat = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd_HH:mm:ss'_GMT'"); + var rec = JSON.parse(this.e); + if (rec.log) { + try { + recLog.call(this, [[ + dateDat, + "{API: \"Execution API\", ContentLength: " + this.e.length + ", ExecutedFunction: \"" + rec.exefunc + "()\"}", + rec.com + ]]); + } catch(err) { + var ss = err.message; // temporary + } + } + var res = ""; + try { + var resValues = (0,eval)((0,eval)(rec.com)); + res = emessage.call(this, rec.com ? resValues : "Error on GAS side: Bad parameters.", startTime, dateDat); + } catch(err) { + res = emessage.call(this, "Script Error on GAS side: " + err.message, startTime); + } + return res; + }; + + ggsrun.prototype.webapps = function() { + var startTime = Date.now(); + var dateDat = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd_HH:mm:ss'_GMT'"); + if (this.e.parameters.log == "false" || !this.e.parameters.log) { + try { + recLog.call(this, [[ + dateDat, + "{API: \"Web Apps\", ContentLength: " + this.e.contentLength + ", Password: \"" + this.e.parameters.pass + "\"}", + this.e.parameters.com + ]]); + } catch(err) { + var ss = err.message; // temporary + } + } + var res = ""; + if (this.e.parameters.pass == this.pass) { + try { + var resValues = (0,eval)((0,eval)(this.e.parameters.com[0])); + res = wmessage.call(this, this.e.parameters.com ? resValues : "Error on GAS side: Bad parameters.", startTime, dateDat); + } catch(err) { + res = wmessage.call(this, "Script Error on GAS side: " + err.message, startTime); + } + } else { + res = wmessage.call(this, "Error on GAS side: Bad password.", startTime); + } + return res; + }; + + emessage = function(data, startTime, dateDat) { + return { + result: data, + logger: this.logar, + GoogleElapsedTime: ((Date.now() - startTime) / 1000), + ScriptDate: dateDat + }; + }; + + wmessage = function(data, startTime, dateDat) { + return ContentService + .createTextOutput(JSON.stringify({ + result: data, + logger: this.logar, + GoogleElapsedTime: ((Date.now() - startTime) / 1000), + ScriptDate: dateDat + })) + .setMimeType(ContentService.MimeType.JSON); + }; + + logsheet = function(_log) { + var logit = DriveApp.getFilesByName(_log); + var logar = []; + while (logit.hasNext()) { + logar.push(logit.next().getId()); + } + if (logar.length == 0) { + var ss = SpreadsheetApp.create(_log); + var logss = DriveApp.getFileById(ss.getId()); + try { + DriveApp.getFileById(ScriptApp.getScriptId()).getParents().next().addFile(logss); + } catch(e) { + DriveApp.getFileById(SpreadsheetApp.getActiveSpreadsheet().getId()).getParents().next().addFile(logss); + } + logss.getParents().next().removeFile(logss); + } else { + var ss = SpreadsheetApp.openById(logar[0]); + } + return ss.getSheets()[0]; + }; + + recLog = function(logAr) { + this.ss.getRange(this.ss.getLastRow() + 1, 1, logAr.length, logAr[0].length).setValues(logAr); + }; + + return ggsrun; + })(); + return x.ggsrun = ggsrun; +})(this); diff --git a/utl/converter.go b/utl/converter.go new file mode 100644 index 0000000..dc996ea --- /dev/null +++ b/utl/converter.go @@ -0,0 +1,232 @@ +// Package utl (convert.go) : +// This is a convereter to send GAS script to Google. +package utl + +import ( + "bufio" + "fmt" + "os" + "os/exec" + "path/filepath" + "regexp" + "strings" + + "github.com/urfave/cli" +) + +// const : +const ( + deffuncwith = "main" +) + +// chkScript : Check the imported script. +func chkScript(c *cli.Context) (string, error) { + var scriptfile string + fext := filepath.Ext(c.String("scriptfile")) + if fext == ".coffee" { + var cmd *exec.Cmd + cmd = exec.Command("coffee", "-cb", c.String("scriptfile")) + if err := cmd.Run(); err != nil { + return "", err + } + scriptfile = strings.Replace(filepath.Base(c.String("scriptfile")), fext, ".js", -1) + } else { + scriptfile = c.String("scriptfile") + } + return scriptfile, nil +} + +// ConvGasToPut : Reads GAS source and formats it. +func ConvGasToPut(c *cli.Context) string { + scriptfile, err := chkScript(c) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: Compile error of CoffeeScript. Please check the script.\n%s\n", err.Error()) + os.Exit(1) + } + var res string + if len(scriptfile) > 0 { + fp, err := os.Open(scriptfile) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: Script '%s' is not found. ", scriptfile) + os.Exit(1) + } + defer fp.Close() + scripts := []string{} + s := bufio.NewScanner(fp) + for s.Scan() { + dat := s.Text() + dat += "\n" + scripts = append(scripts, dat) + } + if s.Err() != nil { + fmt.Fprintf(os.Stderr, "Error: %v .", s.Err()) + os.Exit(1) + } + mem := make([]byte, 0, 100) + for _, v := range scripts { + mem = append(mem, v...) + } + res = string(mem) + } else { + res = "" + } + return res +} + +// ConvGasToRun : Reads GAS source and formats it. +func ConvGasToRun(c *cli.Context) string { + scriptfile, err := chkScript(c) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: Compile error of CoffeeScript. Please check the script.\n%s\n", err.Error()) + os.Exit(1) + } + senddata := c.String("value") + var res string + if len(scriptfile) > 0 { + fp, err := os.Open(scriptfile) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: Script '%s' is not found. ", scriptfile) + os.Exit(1) + } + defer fp.Close() + scripts := []string{} + s := bufio.NewScanner(fp) + for s.Scan() { + dat := s.Text() + if strings.Contains(dat, "//") { + if !strings.Contains(dat, "://") || strings.Contains(dat, "// ") || strings.Contains(dat, " //") { + dat = dat[:strings.Index(dat, "//")] + } + } + if dat != "" { + conv := strings.Replace(strings.TrimSpace(dat), "\\", "\\\\", -1) + conv = strings.Replace(strings.TrimSpace(conv), "\"", "\\\"", -1) + conv = strings.Replace(conv, "'", "\\'", -1) + scripts = append(scripts, conv) + } + } + if s.Err() != nil { + fmt.Fprintf(os.Stderr, "Error: %v .", s.Err()) + os.Exit(1) + } + mem := make([]byte, 0, 100) + for _, v := range scripts { + mem = append(mem, v...) + } + st := string(mem) + if len(senddata) > 0 { + if regexp.MustCompile("^[+-]?[0-9]*[\\.]?[0-9]+$").Match([]byte(senddata)) { + st += "var defdata=" + senddata + ";" + } else if regexp.MustCompile("^\\[|\\]$").Match([]byte(senddata)) || regexp.MustCompile("^{|}$").Match([]byte(senddata)) { + dat := strings.Replace(strings.TrimSpace(senddata), "\"", "\\\"", -1) + senddata = strings.Replace(dat, "'", "\\'", -1) + st += "var defdata=" + senddata + ";" + } else { + if regexp.MustCompile("^\"|\"$").Match([]byte(senddata)) || regexp.MustCompile("^\\'|\\'$").Match([]byte(senddata)) { + dat := strings.Replace(strings.TrimSpace(senddata), "\"", "\\\"", -1) + senddata = strings.Replace(dat, "'", "\\'", -1) + st += "var defdata=" + senddata + ";" + } else { + st += "var defdata=\\\"" + senddata + "\\\";" + } + } + st += deffuncwith + "(defdata)" + } else { + st += deffuncwith + "()" + } + res = "\"" + st + "\"" + } else { + res = "" + } + return res +} + +// ConvStringToRun : Reads GAS source and formats it as a string script. +func ConvStringToRun(c *cli.Context, stringscript string) string { + senddata := c.String("value") + var res string + if len(stringscript) > 0 { + scripts := []string{} + s := bufio.NewScanner(strings.NewReader(stringscript)) + for s.Scan() { + dat := s.Text() + if strings.Contains(dat, "//") { + if !strings.Contains(dat, "://") || strings.Contains(dat, "// ") || strings.Contains(dat, " //") { + dat = dat[:strings.Index(dat, "//")] + } + } + if dat != "" { + conv := strings.Replace(strings.TrimSpace(dat), "\\", "\\\\", -1) + conv = strings.Replace(strings.TrimSpace(conv), "\"", "\\\"", -1) + conv = strings.Replace(conv, "'", "\\'", -1) + scripts = append(scripts, conv) + } + } + if s.Err() != nil { + fmt.Fprintf(os.Stderr, "Error: %v .", s.Err()) + os.Exit(1) + } + mem := make([]byte, 0, 100) + for _, v := range scripts { + mem = append(mem, v...) + } + st := string(mem) + if len(senddata) > 0 { + if regexp.MustCompile("^[+-]?[0-9]*[\\.]?[0-9]+$").Match([]byte(senddata)) { + st += "var defdata=" + senddata + ";" + } else if regexp.MustCompile("^\\[|\\]$").Match([]byte(senddata)) || regexp.MustCompile("^{|}$").Match([]byte(senddata)) { + dat := strings.Replace(strings.TrimSpace(senddata), "\"", "\\\"", -1) + senddata = strings.Replace(dat, "'", "\\'", -1) + st += "var defdata=" + senddata + ";" + } else { + if regexp.MustCompile("^\"|\"$").Match([]byte(senddata)) || regexp.MustCompile("^\\'|\\'$").Match([]byte(senddata)) { + dat := strings.Replace(strings.TrimSpace(senddata), "\"", "\\\"", -1) + senddata = strings.Replace(dat, "'", "\\'", -1) + st += "var defdata=" + senddata + ";" + } else { + st += "var defdata=\\\"" + senddata + "\\\";" + } + } + st += deffuncwith + "(defdata)" + } else { + st += deffuncwith + "()" + } + res = "\"" + st + "\"" + } else { + res = "" + } + return res +} + +// ConvGasToUpload : +func ConvGasToUpload(scriptfile string) string { + var res string + if len(scriptfile) > 0 { + fp, err := os.Open(scriptfile) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: Script '%s' is not found. ", scriptfile) + os.Exit(1) + } + defer fp.Close() + scripts := []string{} + s := bufio.NewScanner(fp) + for s.Scan() { + dat := s.Text() + dat += "\n" + scripts = append(scripts, dat) + } + if s.Err() != nil { + fmt.Fprintf(os.Stderr, "Error: %v .", s.Err()) + os.Exit(1) + } + mem := make([]byte, 0, 100) + for _, v := range scripts { + mem = append(mem, v...) + } + res = string(mem) + } else { + res = "" + } + + return res +} diff --git a/utl/fetcher.go b/utl/fetcher.go new file mode 100644 index 0000000..f718b37 --- /dev/null +++ b/utl/fetcher.go @@ -0,0 +1,65 @@ +// Package utl (fetcher.go) : +// These methods are for retrieving data from URL. +package utl + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "net/http" + "os" + "strconv" + "time" +) + +// RequestParams : Parameters for FetchAPI +type RequestParams struct { + Method string + APIURL string + Data io.Reader + Contenttype string + Accesstoken string + Dtime int64 +} + +// FetchAPI : For fetching data to URL. +func (r *RequestParams) FetchAPI() ([]byte, error) { + req, err := http.NewRequest( + r.Method, + r.APIURL, + r.Data, + ) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", r.Contenttype) + req.Header.Set("Authorization", "Bearer "+r.Accesstoken) + client := &http.Client{ + Timeout: time.Duration(r.Dtime) * time.Second, + } + res, err := client.Do(req) + if err != nil || res.StatusCode-300 >= 0 { + var msg []byte + var er string + if res == nil { + msg = []byte(err.Error()) + er = err.Error() + } else { + errmsg, err := ioutil.ReadAll(res.Body) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + msg = errmsg + er = "Status Code: " + strconv.Itoa(res.StatusCode) + } + return msg, errors.New(er) + } + body, err := ioutil.ReadAll(res.Body) + if err != nil { + return nil, err + } + defer res.Body.Close() + return body, err +} diff --git a/utl/googlemimetypes.go b/utl/googlemimetypes.go new file mode 100644 index 0000000..53cd3c6 --- /dev/null +++ b/utl/googlemimetypes.go @@ -0,0 +1,244 @@ +package utl + +const ( + extVsmime = `{ + "js": "application/vnd.google-apps.script+json", + "gs": "application/vnd.google-apps.script+json", + "gas": "application/vnd.google-apps.script+json", + "csv": "text/csv", + "htm": "text/html", + "html": "text/html", + "xbm": "text/html", + "shtml": "text/html", + "shtm": "text/html", + "txt": "text/plain", + "text": "text/plain", + "json": "application/json", + "doc": "application/msword", + "xls": "application/vnd.ms-excel", + "ppt": "application/vnd.ms-powerpoint", + "docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "pdf": "application/pdf", + "ps": "application/postscript", + "eps": "application/postscript", + "gif": "image/gif", + "png": "image/png", + "svg": "image/svg+xml", + "jpg": "image/jpeg", + "jpeg": "image/jpeg", + "bmp": "image/bmp", + "ico": "image/x-icon", + "tif": "image/tiff", + "tiff": "image/tiff", + "mp4": "video/mp4", + "zip": "application/zip" + }` + + googlemimetypes = `{ + "importFormats": { + "application/x-vnd.oasis.opendocument.presentation": [ + "application/vnd.google-apps.presentation" + ], + "text/tab-separated-values": [ + "application/vnd.google-apps.spreadsheet" + ], + "image/jpeg": [ + "image/jpeg" + ], + "image/bmp": [ + "image/bmp" + ], + "image/gif": [ + "image/gif" + ], + "application/vnd.ms-excel.sheet.macroenabled.12": [ + "application/vnd.google-apps.spreadsheet" + ], + "application/vnd.openxmlformats-officedocument.wordprocessingml.template": [ + "application/vnd.google-apps.document" + ], + "application/vnd.ms-powerpoint.presentation.macroenabled.12": [ + "application/vnd.google-apps.presentation" + ], + "application/vnd.ms-word.template.macroenabled.12": [ + "application/vnd.google-apps.document" + ], + "application/vnd.openxmlformats-officedocument.wordprocessingml.document": [ + "application/vnd.google-apps.document" + ], + "image/pjpeg": [ + "image/pjpeg" + ], + "application/vnd.google-apps.script+text/plain": [ + "application/vnd.google-apps.script" + ], + "application/vnd.ms-excel": [ + "application/vnd.google-apps.spreadsheet" + ], + "application/vnd.sun.xml.writer": [ + "application/vnd.google-apps.document" + ], + "application/vnd.ms-word.document.macroenabled.12": [ + "application/vnd.google-apps.document" + ], + "application/vnd.ms-powerpoint.slideshow.macroenabled.12": [ + "application/vnd.google-apps.presentation" + ], + "text/rtf": [ + "application/vnd.google-apps.document" + ], + "text/plain": [ + "text/plain" + ], + "application/vnd.oasis.opendocument.spreadsheet": [ + "application/vnd.google-apps.spreadsheet" + ], + "application/x-vnd.oasis.opendocument.spreadsheet": [ + "application/vnd.google-apps.spreadsheet" + ], + "image/png": [ + "image/png" + ], + "application/x-vnd.oasis.opendocument.text": [ + "application/vnd.google-apps.document" + ], + "application/msword": [ + "application/vnd.google-apps.document" + ], + "application/pdf": [ + "application/pdf" + ], + "application/json": [ + "application/json" + ], + "application/x-msmetafile": [ + "application/vnd.google-apps.drawing" + ], + "application/vnd.openxmlformats-officedocument.spreadsheetml.template": [ + "application/vnd.google-apps.spreadsheet" + ], + "application/vnd.ms-powerpoint": [ + "application/vnd.google-apps.presentation" + ], + "application/vnd.ms-excel.template.macroenabled.12": [ + "application/vnd.google-apps.spreadsheet" + ], + "image/x-bmp": [ + "image/x-bmp" + ], + "application/rtf": [ + "application/vnd.google-apps.document" + ], + "application/vnd.openxmlformats-officedocument.presentationml.template": [ + "application/vnd.google-apps.presentation" + ], + "image/x-png": [ + "image/x-png" + ], + "text/html": [ + "text/html" + ], + "application/vnd.oasis.opendocument.text": [ + "application/vnd.google-apps.document" + ], + "application/vnd.openxmlformats-officedocument.presentationml.presentation": [ + "application/vnd.google-apps.presentation" + ], + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [ + "application/vnd.google-apps.spreadsheet" + ], + "application/vnd.google-apps.script+json": [ + "application/vnd.google-apps.script" + ], + "application/vnd.openxmlformats-officedocument.presentationml.slideshow": [ + "application/vnd.google-apps.presentation" + ], + "application/vnd.ms-powerpoint.template.macroenabled.12": [ + "application/vnd.google-apps.presentation" + ], + "text/csv": [ + "text/csv" + ], + "application/vnd.oasis.opendocument.presentation": [ + "application/vnd.google-apps.presentation" + ], + "image/jpg": [ + "image/jpg" + ], + "text/richtext": [ + "application/vnd.google-apps.document" + ], + "application/postscript": [ + "application/postscript" + ], + "image/x-icon": [ + "image/x-icon" + ], + "image/tiff": [ + "image/tiff" + ], + "video/mp4": [ + "video/mp4" + ], + "application/zip": [ + "application/zip" + ], + "image/svg+xml": [ + "image/svg+xml" + ], + "application/postscript": [ + "application/postscript" + ] + }, + "exportFormats": { + "application/vnd.google-apps.form": [ + "application/zip" + ], + "application/vnd.google-apps.document": [ + "application/rtf", + "application/vnd.oasis.opendocument.text", + "text/html", + "application/pdf", + "application/epub+zip", + "application/zip", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "text/plain" + ], + "application/vnd.google-apps.drawing": [ + "image/svg+xml", + "image/png", + "application/pdf", + "image/jpeg" + ], + "application/vnd.google-apps.spreadsheet": [ + "application/x-vnd.oasis.opendocument.spreadsheet", + "text/tab-separated-values", + "application/pdf", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "text/csv", + "application/zip", + "application/vnd.oasis.opendocument.spreadsheet" + ], + "application/vnd.google-apps.script": [ + "application/vnd.google-apps.script+json" + ], + "application/vnd.google-apps.presentation": [ + "application/vnd.oasis.opendocument.presentation", + "application/pdf", + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "text/plain" + ] + } + }` + + defaultformat = `{ + "application/vnd.google-apps.form": "application/zip", + "application/vnd.google-apps.document": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/vnd.google-apps.drawing": "image/png", + "application/vnd.google-apps.spreadsheet": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/vnd.google-apps.script": "application/vnd.google-apps.script+json", + "application/vnd.google-apps.presentation": "application/vnd.openxmlformats-officedocument.presentationml.presentation" + }` +) diff --git a/utl/transfer.go b/utl/transfer.go new file mode 100644 index 0000000..a90d11c --- /dev/null +++ b/utl/transfer.go @@ -0,0 +1,641 @@ +// Package utl (transfer.go) : +// These methods are for downloading, uploading and retrieving file list from or to Google Drive. +package utl + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "math" + "mime/multipart" + "net/textproto" + "net/url" + "os" + "path/filepath" + "strconv" + "strings" + "time" + + "github.com/urfave/cli" +) + +const ( + sdownloadurl = "https://script.google.com/feeds/download/export?id=" + lurl = "https://www.googleapis.com/drive/v3/files?" + driveapiurl = "https://www.googleapis.com/drive/v3/files/" + uploadurl = "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&" +) + +// FileInf : File information for downloading and uploading +type FileInf struct { + Accesstoken string `json:"-"` + DlMime string `json:"-"` + MimeType string `json:"mimeType,omitempty"` + Workdir string `json:"-"` + PstartTime time.Time `json:"-"` + WantExt string `json:"-"` + WantName string `json:"-"` + WebLink string `json:"webContentLink,omitempty"` + WebView string `json:"webViewLink,omitempty"` + SearchByName string `json:"-"` + SearchByID string `json:"-"` + FileID string `json:"id,omitempty"` + FileName string `json:"name,omitempty"` + SaveName string `json:"saved_file_name,omitempty"` + Parents []string `json:"parents,omitempty"` + UpFilename []string `json:"upload_file_name,omitempty"` + UpFileID []string `json:"uid,omitempty"` + UppedFiles []uploadedFile `json:"uploaded_files,omitempty"` + TotalEt float64 `json:"TotalElapsedTime,omitempty"` + Msgar []string `json:"message,omitempty"` +} + +// dlError : Error messages. +type dlError struct { + Error struct { + Code int `json:"code"` + Message string `json:"message"` + } `json:"error"` +} + +// project : Project structure +type project struct { + Files []struct { + ID string `json:"id,omitempty"` + Name string `json:"name"` + Type string `json:"type"` + Source string `json:"source"` + } `json:"files"` +} + +// filea : Individual file in a project +type filea struct { + ID string `json:"id,omitempty"` + Name string `json:"name"` + Type string `json:"type"` + Source string `json:"source"` +} + +// fileListSt : File list. +type fileListSt struct { + NextPageToken string `json:"nextPageToken,omitempty"` + Files []struct { + ID string `json:"id,omitempty"` + Name string `json:"name,omitempty"` + MimeType string `json:"mimeType,omitempty"` + Parents []string `json:"parents,omitempty"` + CreatedTime string `json:"createdTime,omitempty"` + ModifiedTime string `json:"modifiedTime,omitempty"` + FullFileExtension string `json:"fullFileExtension,omitempty"` + Size string `json:"size,omitempty"` + WebLink string `json:"webContentLink,omitempty"` + WebView string `json:"webViewLink,omitempty"` + } +} + +// fileUploaderMeta : For uploading scripts. +type fileUploaderMeta struct { + Name string `json:"name"` + Parents []string `json:"parents,omitempty"` + MimeType string `json:"mimeType"` +} + +// uploadedFile : For uploading files. +type uploadedFile struct { + ID string `json:"id"` + Name string `json:"name"` + MimeType string `json:"mimeType"` + Parents []string `json:"parents,omitempty"` +} + +//dispDup : For duplicating values. +type dispDup struct { + Name string + FileID string + MimeType string + ModifiedTime string +} + +// saveScript : Back up a project. +func (p *FileInf) saveScript(data []byte, c *cli.Context) *FileInf { + var f project + json.Unmarshal(data, &f) + if c.Bool("rawdata") { + filename := filepath.Join(p.Workdir, p.FileName+".json") + p.SaveName = p.FileName + ".json" + p.Msgar = append(p.Msgar, fmt.Sprintf("Saved project as a JSON file '%s.json'.", p.FileName)) + btok, _ := json.MarshalIndent(f, "", "\t") + ioutil.WriteFile(filename, btok, 0777) + } else { + p.SaveName = "" + if len(f.Files) == 1 { + p.Msgar = append(p.Msgar, fmt.Sprintf("%s has %d script.", p.FileName, len(f.Files))) + } else { + p.Msgar = append(p.Msgar, fmt.Sprintf("%s has %d scripts.", p.FileName, len(f.Files))) + } + for _, e := range f.Files { + saveName := p.FileName + "_" + e.Name + "." + func(ex string) string { + var eext string + if len(ex) > 0 { + eext = ex + } else { + eext = "gs" + } + return eext + }(p.WantExt) + src := fmt.Sprintf("// Script ID in Project = %s \n%s", e.ID, e.Source) + ioutil.WriteFile(filepath.Join(p.Workdir, saveName), []byte(src), 0777) + p.Msgar = append(p.Msgar, fmt.Sprintf("Script was downloaded as '%s'.", saveName)) + } + } + return p +} + +// Downloader : Download files. +func (p *FileInf) Downloader(c *cli.Context) *FileInf { + ext := strings.ToLower(p.WantExt) + if len(ext) > 0 { + p.DlMime = extToMime(ext) + } else { + p.DlMime, ext = defFormat(p.MimeType) + } + if len(p.FileID) > 0 { + var body []byte + var gm map[string]interface{} + json.Unmarshal([]byte(googlemimetypes), &gm) + if gm["exportFormats"].(map[string]interface{})[p.MimeType] != nil { + for _, e := range gm["exportFormats"].(map[string]interface{})[p.MimeType].([]interface{}) { + if e == p.DlMime { + p.SaveName = p.FileName + "." + ext + } + } + if len(p.SaveName) == 0 { + dispRes, _ := json.MarshalIndent(gm["exportFormats"], "", " ") + fmt.Fprintf(os.Stderr, "Error: Bad extension or No extension. It supports as follows.\n%s ", string(dispRes)) + os.Exit(1) + } + if p.MimeType == "application/vnd.google-apps.script" { + p, body = p.writeFile(sdownloadurl + p.FileID + "&format=json") + p.saveScript(body, c) + } else { + p, _ = p.writeFile(driveapiurl + p.FileID + "/export?mimeType=" + p.DlMime) + } + } else { + p.SaveName = p.FileName + p, _ = p.writeFile(driveapiurl + p.FileID + "?alt=media") + } + } else { + fmt.Fprintf(os.Stderr, "Error: Please input File Name or File ID. ") + os.Exit(1) + } + p.TotalEt = math.Trunc(time.Now().Sub(p.PstartTime).Seconds()*1000) / 1000 + return p +} + +// writeFile : Create files on local. +func (p *FileInf) writeFile(durl string) (*FileInf, []byte) { + r := &RequestParams{ + Method: "GET", + APIURL: durl, + Data: nil, + Contenttype: "application/x-www-form-urlencoded", + Accesstoken: p.Accesstoken, + Dtime: 10, + } + body, err := r.FetchAPI() + var er dlError + json.Unmarshal(body, &er) + if err != nil || er.Error.Code-300 >= 0 { + fmt.Print(fmt.Sprintf("Error: %s Status code is %d. FileID: %s ", er.Error.Message, er.Error.Code, p.FileID)) + os.Exit(1) + } + if p.MimeType != "application/vnd.google-apps.script" { + ioutil.WriteFile(filepath.Join(p.Workdir, p.SaveName), body, 0777) + p.Msgar = append(p.Msgar, fmt.Sprintf("File was downloaded as '%s'.", p.SaveName)) + } + return p, body +} + +// nameToID : +func (p *FileInf) nameToID(name string) ([]byte, error) { + number := 1000 + tokenparams := url.Values{} + tokenparams.Set("orderBy", "name") + tokenparams.Set("pageSize", strconv.Itoa(number)) + tokenparams.Set("q", "name='"+name+"' and trashed=false") + tokenparams.Set("fields", "files(createdTime,fullFileExtension,id,mimeType,modifiedTime,name,parents,size,webContentLink,webViewLink)") + r := &RequestParams{ + Method: "GET", + APIURL: lurl + tokenparams.Encode(), + Data: nil, + Contenttype: "application/x-www-form-urlencoded", + Accesstoken: p.Accesstoken, + Dtime: 30, + } + return r.FetchAPI() +} + +// idToName : Convert file ID to file name. +func (p *FileInf) idToName(id string) ([]byte, error) { + tokenparams := url.Values{} + tokenparams.Set("fields", "createdTime,fullFileExtension,id,mimeType,modifiedTime,name,parents,size,webContentLink,webViewLink") + r := &RequestParams{ + Method: "GET", + APIURL: driveapiurl + id + "?" + tokenparams.Encode(), + Data: nil, + Contenttype: "application/x-www-form-urlencoded", + Accesstoken: p.Accesstoken, + Dtime: 30, + } + return r.FetchAPI() +} + +// GetFileinf : Retrieve file infomation using Drive API. +func (p *FileInf) GetFileinf() *FileInf { + if len(p.FileID) > 0 { + body, err := p.idToName(p.FileID) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: File ID '%s' Not found. %v .", p.FileID, err) + os.Exit(1) + } + var er dlError + json.Unmarshal(body, &er) + if err != nil || er.Error.Code-300 >= 0 { + fmt.Fprintf(os.Stderr, fmt.Sprintf("Error: %s Status code is %d. ", er.Error.Message, er.Error.Code)) + os.Exit(1) + } + json.Unmarshal(body, &p) + } else if len(p.WantName) > 0 { + finf, err := p.nameToID(p.WantName) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + var fl fileListSt + json.Unmarshal(finf, &fl) + if len(fl.Files) == 1 { + p.FileID = fl.Files[0].ID + p.FileName = fl.Files[0].Name + p.MimeType = fl.Files[0].MimeType + p.WebLink = fl.Files[0].WebLink + p.WebView = fl.Files[0].WebView + } else if len(fl.Files) > 1 { + fmt.Printf("# %d files were found. Please download them using File ID.\n", len(fl.Files)) + for i := range fl.Files { + dd := &dispDup{ + Name: fl.Files[i].Name, + FileID: fl.Files[i].ID, + MimeType: fl.Files[i].MimeType, + ModifiedTime: fl.Files[i].ModifiedTime, + } + rd, _ := json.MarshalIndent(dd, "", " ") + fmt.Printf("%s\n", rd) + } + os.Exit(1) + } else { + fmt.Fprintf(os.Stderr, "Error: File name '%s' is not found. ", p.WantName) + os.Exit(1) + } + } + if p.MimeType == "application/vnd.google-apps.folder" { + fmt.Fprintf(os.Stderr, "Error: '%s' is a Folder. Cannot download Folder yet. ", p.FileID) + os.Exit(1) + } + return p +} + +// extToMime : Convert from extension to mimeType of the file on Local. +func extToMime(ext string) string { + var fm map[string]interface{} + json.Unmarshal([]byte(extVsmime), &fm) + st, _ := fm[strings.Replace(strings.ToLower(ext), ".", "", 1)].(string) + return st +} + +// defFormat : Default download format +func defFormat(mime string) (string, string) { + var df map[string]interface{} + json.Unmarshal([]byte(defaultformat), &df) + dmime, _ := df[mime].(string) + var ext string + var fm map[string]interface{} + json.Unmarshal([]byte(extVsmime), &fm) + for i, v := range fm { + if v == dmime { + ext = i + } + } + return dmime, ext +} + +// scriptUploader : For uploading scripts. +func (p *FileInf) scriptUploader(metadata map[string]interface{}, pr []byte) *FileInf { + tokenparams := url.Values{} + tokenparams.Set("fields", "id,mimeType,name,parents") + var b bytes.Buffer + w := multipart.NewWriter(&b) + part := make(textproto.MIMEHeader) + part.Set("Content-Type", "application/json") + data, err := w.CreatePart(part) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + re, _ := json.Marshal(metadata) + if _, err = io.Copy(data, bytes.NewReader(re)); err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + data, err = w.CreatePart(part) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + if _, err = io.Copy(data, bytes.NewReader(pr)); err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + w.Close() + r := &RequestParams{ + Method: "POST", + APIURL: uploadurl + tokenparams.Encode(), + Data: &b, + Contenttype: w.FormDataContentType(), + Accesstoken: p.Accesstoken, + Dtime: 10, + } + body, err := r.FetchAPI() + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + var uf uploadedFile + json.Unmarshal(body, &uf) + p.UppedFiles = append(p.UppedFiles, uf) + return p +} + +// fileUploader : For uploading files. +func (p *FileInf) fileUploader(metadata map[string]interface{}, file string) *FileInf { + tokenparams := url.Values{} + tokenparams.Set("fields", "id,mimeType,name,parents") + var b bytes.Buffer + w := multipart.NewWriter(&b) + part := make(textproto.MIMEHeader) + part.Set("Content-Type", "application/json") + data, err := w.CreatePart(part) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + re, _ := json.Marshal(metadata) + if _, err = io.Copy(data, bytes.NewReader(re)); err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + fs, err := os.Open(file) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + defer fs.Close() + data, err = w.CreateFormFile("file", file) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + if _, err = io.Copy(data, fs); err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + w.Close() + r := &RequestParams{ + Method: "POST", + APIURL: uploadurl + tokenparams.Encode(), + Data: &b, + Contenttype: w.FormDataContentType(), + Accesstoken: p.Accesstoken, + Dtime: 10, + } + body, err := r.FetchAPI() + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + var uf uploadedFile + json.Unmarshal(body, &uf) + p.UppedFiles = append(p.UppedFiles, uf) + return p +} + +// Uploader : Main method for uploading +// "$ ggsrun u -f t1.gs,t2.gs" or "$ ggsrun u -f "t1.gs, t2.gs"" +func (p *FileInf) Uploader(c *cli.Context) *FileInf { + if len(c.String("projectname")) == 0 { + for _, elm := range p.UpFilename { + metadata := &fileUploaderMeta{ + Name: filepath.Base(elm), + Parents: []string{c.String("parentfolderid")}, + MimeType: func(flag bool) string { + var r string + if !flag { + r = extToGMime(filepath.Ext(elm)) + } + return r + }(c.Bool("noconvert")), + } + if metadata.MimeType == "application/vnd.google-apps.script" { + var pr project + filedata := &filea{ + Name: metadata.Name, + Type: "server_js", + Source: ConvGasToUpload(elm), + } + pr.Files = append(pr.Files, *filedata) + pre, _ := json.Marshal(pr) + upmeta, _ := json.Marshal(metadata) + var u map[string]interface{} + json.Unmarshal(upmeta, &u) + if len(c.String("parentfolderid")) == 0 { + delete(u, "parents") + } + _ = p.scriptUploader(u, pre) + p.Msgar = append(p.Msgar, fmt.Sprintf("Uploaded %s as %s. ", filepath.Base(elm), metadata.Name)) + } else { + upmeta, _ := json.Marshal(metadata) + var u map[string]interface{} + json.Unmarshal(upmeta, &u) + if len(c.String("parentfolderid")) == 0 { + delete(u, "parents") + } + p.fileUploader(u, elm) + p.Msgar = append(p.Msgar, fmt.Sprintf("Uploaded %s as %s.", filepath.Base(elm), metadata.Name)) + } + } + } else { + metadata := &fileUploaderMeta{ + Name: c.String("projectname"), + Parents: []string{c.String("parentfolderid")}, + MimeType: "application/vnd.google-apps.script", + } + upmeta, _ := json.Marshal(metadata) + var u map[string]interface{} + json.Unmarshal(upmeta, &u) + if len(c.String("parentfolderid")) == 0 { + delete(u, "parents") + } + var pr project + for _, elm := range p.UpFilename { + if filepath.Ext(elm) == ".gs" || + filepath.Ext(elm) == ".gas" || + filepath.Ext(elm) == ".js" || + filepath.Ext(elm) == ".htm" || + filepath.Ext(elm) == ".html" { + filedata := &filea{ + Name: strings.Replace(filepath.Base(elm), filepath.Ext(elm), "", -1), + Type: func(ex string) string { + var scripttype string + switch ex { + case ".gs", ".gas", ".js": + scripttype = "server_js" + case ".htm", ".html": + scripttype = "html" + } + return scripttype + }(filepath.Ext(elm)), + Source: ConvGasToUpload(elm), + } + pr.Files = append(pr.Files, *filedata) + } + } + p.Msgar = append(p.Msgar, fmt.Sprintf("Uploaded %d scripts as a project with a name of '%s'.", len(p.UpFilename), metadata.Name)) + pre, _ := json.Marshal(pr) + _ = p.scriptUploader(u, pre) + } + return p +} + +// extToGMime : Convert from extension to mimeType of the files on Google. +func extToGMime(ext string) string { + var fm map[string]interface{} + json.Unmarshal([]byte(extVsmime), &fm) + st, _ := fm[strings.Replace(strings.ToLower(ext), ".", "", 1)].(string) + if len(st) == 0 { + fmt.Fprintf(os.Stderr, "Error: Extension of '%s' cannot be uploaded. ", ext) + os.Exit(1) + } + var gm map[string]interface{} + json.Unmarshal([]byte(googlemimetypes), &gm) + return gm["importFormats"].(map[string]interface{})[st].([]interface{})[0].(string) +} + +// GetFileList : Retrieving file list on Google Drive. +func (p *FileInf) GetFileList(c *cli.Context) *FileInf { + if len(c.String("searchbyname")) > 0 { + p.SearchByName = c.String("searchbyname") + body, err := p.nameToID(p.SearchByName) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v. ", err) + os.Exit(1) + } + var fl fileListSt + json.Unmarshal(body, &fl) + if len(fl.Files) == 1 { + p.FileID = fl.Files[0].ID + p.FileName = fl.Files[0].Name + p.MimeType = fl.Files[0].MimeType + p.Parents = fl.Files[0].Parents + p.WebView = fl.Files[0].WebView + } else if len(fl.Files) > 1 { + for i := range fl.Files { + fmt.Printf("{\n Name: \"%s\",\n ID: \"%s\",\n ModifiedTime: \"%s\",\n URL: \"%s\"\n}\n", fl.Files[i].Name, fl.Files[i].ID, fl.Files[i].ModifiedTime, fl.Files[i].WebView) + } + os.Exit(1) + } else { + fmt.Fprintf(os.Stderr, "Error: File name '%s' is not found. ", p.SearchByName) + os.Exit(1) + } + return p + } + if len(c.String("searchbyid")) > 0 { + p.SearchByID = c.String("searchbyid") + body, err := p.idToName(p.SearchByID) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: File ID '%s' is not found. ", p.SearchByID) + os.Exit(1) + } + json.Unmarshal(body, &p) + return p + } + var fm fileListSt + var fl fileListSt + var dmy fileListSt + fm.NextPageToken = "" + for i := 0; ; { + _ = i + body, err := p.getList(fm.NextPageToken) + json.Unmarshal(body, &fl) + fm.NextPageToken = fl.NextPageToken + fm.Files = append(fm.Files, fl.Files...) + fl.NextPageToken = "" + fl.Files = dmy.Files + if len(fm.NextPageToken) == 0 || err != nil { + break + } + } + var fol, fil []string + for i := range fm.Files { + if strings.Contains(fm.Files[i].MimeType, "folder") { + fol = append(fol, fm.Files[i].Name) + } else { + fil = append(fil, fm.Files[i].Name) + } + } + p.Msgar = append(p.Msgar, fmt.Sprintf("Total: %d, File: %d, Folder: %d", len(fm.Files), len(fil), len(fol))) + p.Msgar = append(p.Msgar, fmt.Sprintf("If you want a file list, please use option '-s' or '-f'. The file name is automatically given.")) + if c.Bool("stdout") { + fmt.Printf("| File name | File ID | Modified time | Create time | Type |\n") + var ftype string + for i := range fm.Files { + if strings.Contains(fm.Files[i].MimeType, "folder") { + ftype = "Folder" + } else { + ftype = "File" + } + fmine := fmt.Sprintf("| %s | %s | %s | %s | %s |\n", fm.Files[i].Name, fm.Files[i].ID, fm.Files[i].ModifiedTime, fm.Files[i].CreatedTime, ftype) + fmt.Print(fmine) + } + } + if c.Bool("file") { + filename := filepath.Join(p.Workdir, p.PstartTime.Format("Files_20060102_150405")+".json") + p.Msgar = append(p.Msgar, fmt.Sprintf("Saved a JSON file as %s.", filename)) + btok, _ := json.MarshalIndent(fm, "", "\t") + ioutil.WriteFile(filename, btok, 0777) + } + return p +} + +// getList : For retrieving file list. +func (p *FileInf) getList(ptoken string) ([]byte, error) { + number := 1000 + tokenparams := url.Values{} + tokenparams.Set("orderBy", "name") + tokenparams.Set("pageSize", strconv.Itoa(number)) + tokenparams.Set("q", "trashed=false") + tokenparams.Set("fields", "files(createdTime,fullFileExtension,id,mimeType,modifiedTime,name,parents,size),nextPageToken") + if len(ptoken) > 0 { + tokenparams.Set("pageToken", ptoken) + } + r := &RequestParams{ + Method: "GET", + APIURL: lurl + tokenparams.Encode(), + Data: nil, + Contenttype: "application/x-www-form-urlencoded", + Accesstoken: p.Accesstoken, + Dtime: 30, + } + body, err := r.FetchAPI() + return body, err +}