Browse code

added CHANGELOG.txt appinfo/info.xml appinfo/signature.json js/showsmstables.js lib/Migration/Version116Date20230508212745.php lib/Migration/Version117Date20230509183517.php lib/Migration/Version118Date20230509194216.php lib/Migration/Version120Date20230520072431.php lib/Migration/Version121Date20230523201743.php lib/Migration/Version123Date20230524182156.php

DoubleBastionAdmin authored on 24/05/2023 14:49:31
Showing 10 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,112 @@
1
+======= CHANGELOG =======
2
+
3
+Versions:
4
+
5
+== 1.0.0 - 2022-1-27 ==
6
+* Initial release.
7
+
8
+== 1.0.1 - 2022-3-31 ==
9
+* Changed presentation text.
10
+
11
+== 1.0.2 - 2022-4-13 ==
12
+* Changed application controller class, to respect custom path of 'datadirectory'.
13
+* Fixed filters row arrow not showing up when using Apache.
14
+* Added the 'Contributors.txt' file.
15
+
16
+== 1.0.3 - 2022-4-15 ==
17
+* Changed the way the app gets the timezone.
18
+
19
+== 1.0.4 - 2022-5-7 ==
20
+* Changed the data type of the 'message' column in the 'sms_relent_sent' and 'sms_relent_received' tables.
21
+
22
+== 1.0.5 - 2022-5-9 ==
23
+* Changed string length for 'message' column in 'sms_relent_sent' and 'sms_relent_received' tables.
24
+* Changed syntax of SQL queries and of encryption function.
25
+* Changed structure of webhook URLs in case Nextcloud is served on a subdirectory.
26
+
27
+== 1.0.6 - 2022-8-13 ==
28
+* Added support for Twilio.
29
+* Added support for new lines in messages and email notifications.
30
+* Solved column width issue in sent/received SMS tables.
31
+* Minor explanatory text changes.
32
+
33
+== 1.0.7 - 2022-8-16 ==
34
+* Solved bug related to receiving messages on Twilio number when it's not associated with any Messaging Service.
35
+* Changed css properties for Network column.
36
+
37
+== 1.0.8 - 2022-8-23 ==
38
+* Added support for Flowroute.
39
+* Added automatic scrolling to bottom of received/sent messages table when clicking on 'Received/Sent SMS Messages' button.
40
+* Added scroll bar to info pop-up notes.
41
+
42
+== 1.0.9 - 2022-9-3 ==
43
+* Added support for MMS.
44
+* Minor CSS improvements.
45
+* Small changes to explanatory text.
46
+
47
+== 1.1.0 - 2022-9-5 ==
48
+* Solved issue with previewing images picked from Nextcloud.
49
+* Text changes to README.md.
50
+
51
+== 1.1.1 - 2022-9-9 ==
52
+* Changed signature verification process for Twilio.
53
+* Removed Alphanumeric Sender ID for Flowroute, since it's not supported.
54
+* Minor text changes on presentation page and settings page.
55
+
56
+== 1.1.2 - 2022-10-27 ==
57
+* Changed CSS settings to match the modifications introduced in Nextcloud 25.
58
+
59
+== 1.1.3 - 2022-12-1 ==
60
+* Fixed SQL error that appeared in fresh installations.
61
+* Added support for dark themes.
62
+* Updated explanatory text for Telnyx on the Settings page.
63
+
64
+== 1.1.4 - 2022-12-2 ==
65
+* Changed migration files to prevent installation errors.
66
+* Modified 3 svg files converting text objects to paths.
67
+
68
+== 1.1.5 - 2023-2-28 ==
69
+* Fixed issue related to Twilio message signing.
70
+* Updated message pricing information in app description.
71
+
72
+== 1.1.6 - 2023-5-8 ==
73
+* Implemented showing display names of message authors before their messages.
74
+* Added checkbox to enable/disable prepending display names before messages.
75
+* Custom display names can be now saved for external phone numbers.
76
+* Restrictions for groups or users can be placed on phone numbers by admins.
77
+* Admins can see just their own messages or all the messages in their message tables.
78
+* Auto-replies with 'daily mode' and 'vacation mode' can be configured for any controlled phone number.
79
+* Added a new message table that lists all the messages grouped by phone numbers.
80
+* Added the ability to see all the messages sent/received to/from a phone number, by clicking on 
81
+  a button located below the number, in the 'Received SMS Messages' and 'Sent SMS Messages' tables
82
+
83
+== 1.1.7 - 2023-5-9 ==
84
+* Fixed bug related to not being able to see messages in pop-up windows and on grouped messages table.
85
+
86
+== 1.1.8 - 2023-5-9 ==
87
+* Fixed migration issue bug.
88
+
89
+== 1.1.9 - 2023-5-9 ==
90
+* Made the app available to upgrade to for Nextcloud 26.
91
+
92
+== 1.2.0 - 2023-5-20 ==
93
+* Fixed auto-reply bug.
94
+* Moved the API keys and alphanumeric sender ID fields from the Personal settings page to the Admin 
95
+  settings page.
96
+* Available phone numbers are loaded automatically when the app's icon is clicked.
97
+* When only one phone number is available, it is selected automatically in the 'Set ID' field.
98
+* Admins can share their API keys with other non-admins.
99
+* Admins can see only their messages and the messages of the non-admins whith whom they share their API 
100
+  keys. Non-admins can see only their messages.
101
+* Added pop-up window that shows the messages exchanged between 2 phone numbers and allows sending replies.
102
+
103
+== 1.2.1 - 2023-5-23 ==
104
+* Allowed non-admin users to see incoming messages received on the phone numbers they are restricted to.
105
+* Customized confirm pop-up windows.
106
+
107
+== 1.2.2 - 2023-5-24 ==
108
+* Changed how non-admins view sent messages.
109
+
110
+== 1.2.3 - 2023-5-24 ==
111
+* Fixed 'Load more messages' bug.
112
+* Changed the way the display name is searched for and added to old messages, during app upgrade.
0 113
new file mode 100644
... ...
@@ -0,0 +1,90 @@
1
+<?xml version="1.0"?>
2
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
3
+      xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
4
+    <id>sms_relentless</id>
5
+    <name>SMS Relentless</name>
6
+    <summary>Send and receive SMS in Nextcloud</summary>
7
+    <description><![CDATA[
8
+This application allows sending and receiving SMS and MMS messages in Nextcloud. An SMS/MMS enabled phone number acquired from 
9
+Telnyx or Plivo or Twilio or Flowroute is needed. The 'libcurl' PHP library has to be installed on the server. Detailed instructions 
10
+on how to configure and use this application can be found on the 'Admin documentation' page.
11
+
12
+### Features:
13
+
14
+* 🚀 Use one or multiple local phone numbers in countries of your choice, to send and receive SMS/MMS messages with your browser, on any device connected to the Internet.
15
+
16
+* 📑 Sent and received SMS/MMS messages are stored in the database per sending/receiving user and can be viewed in paginated tables with filters for every column.
17
+
18
+* 🖼️  Up to 10 files of various formats, including jpeg, png and gif, can be sent as MMS messages from MMS enabled phone numbers. Files included in incoming MMS messages are not downloaded automatically. They are stored as URL links to the actual files, so that the receivers can download them only if they trust the senders.
19
+
20
+* 📔 SMS/MMS messages older than a specified number of days can be deleted in bulk with one click and they are automatically archived in csv files stored in Nextcloud, before being removed from the database. This makes them available for future analysis.
21
+
22
+* 💻 Sending SMS/MMS messages to thousands of recipients can be achieved by uploading a txt/csv file containing the recipients' phone numbers and the same SMS/MMS is sent automatically to all. The time interval between two consecutive messages is configurable.
23
+
24
+* 👤 The Display Name of Nextcloud users can be prepended to their messages, so that the origin of the messages is much clearer.
25
+
26
+* ⚠️  Admins can restrict the use of specific phone numbers to specific groups or users.
27
+
28
+* ✉️  Auto-replies in 'daily mode' and 'vacation mode' can be configured for any controlled phone number.
29
+
30
+* 🔏 SMS/MMS messages coming from Telnyx, Plivo and Twilio are checked for authenticity by verifying the SMS provider's signature.
31
+
32
+* 📧 Users receive notifications in Nextcloud and (optionally) emails when new SMS/MMS messages arrive.
33
+
34
+* 📄 Each sent message receives a delivery receipt displayed in the Sent SMS Messages table.
35
+
36
+* 📱 It works with regular 'long code' (10-digit) phone numbers, but also with 'toll-free' numbers and 'short codes'. Users see a list with their current phone numbers and can set them as Sender IDs. Setting alphanumeric Sender IDs is also possible. 
37
+
38
+* 💵 It allows checking the current Telnyx/Plivo/Twilio balance by selecting the provider on the left panel.
39
+
40
+* 💰 The only ongoing cost is about $1 per month (depending on the country) for an SMS/MMS enabled phone number located in a country chosen by the user. No contracts.
41
+
42
+* 💸 Low prices per SMS: starting from $0.0060 per sent message and $0.0040 per received message (Telnyx), or $0.0070 per sent message and $0 per received message (Plivo), or $0.0099 per sent message and 0.0079 per received message (Twilio), or $0.0055 per sent message and 0.0040 per received message (Flowroute) in the USA.
43
+
44
+We have no affiliation with Telnyx, Plivo, Twilio or Flowroute.
45
+
46
+### Documentation
47
+
48
+* [Admin documentation](https://www.doublebastion.com/install-nextcloud/#install-sms-relentless)
49
+
50
+### Donations
51
+
52
+* 🎁 [Donate](https://www.doublebastion.com/donations/)
53
+
54
+    ]]></description>
55
+    <version>1.2.3</version>
56
+    <licence>AGPL</licence>
57
+    <author mail="contact@doublebastion.com">Double Bastion LLC</author>
58
+    <namespace>SMSRelentless</namespace>
59
+	<documentation>
60
+		<admin>https://www.doublebastion.com/install-nextcloud/#install-sms-relentless</admin>
61
+	</documentation>
62
+    <category>office</category>
63
+    <category>organization</category>
64
+
65
+    <website>https://www.doublebastion.com/sms-relentless/</website>
66
+    <bugs>https://git.doublebastion.com/sms-relentless/issues/develop</bugs>
67
+    <repository>https://git.doublebastion.com/sms-relentless/develop/</repository>
68
+
69
+    <screenshot>https://git.doublebastion.com/sms-relentless/raw/develop/img/sms_relentless_screenshot.png</screenshot>
70
+
71
+    <dependencies>
72
+            <nextcloud min-version="25" max-version="26" />
73
+    </dependencies>
74
+
75
+    <navigations>
76
+        <navigation>
77
+            <name>SMS Relentless</name>
78
+            <route>sms_relentless.page.index</route>
79
+            <order>102</order>
80
+            <icon>../img/sms_relentless.svg</icon>
81
+        </navigation>
82
+    </navigations>
83
+
84
+    <settings>
85
+            <personal>OCA\SMSRelentless\Settings\Personal</personal>
86
+            <personal-section>OCA\SMSRelentless\Settings\PersonalSection</personal-section>
87
+            <admin>OCA\SMSRelentless\Settings\Admin</admin>
88
+    	    <admin-section>OCA\SMSRelentless\Settings\AdminSection</admin-section>
89
+    </settings>
90
+</info>
0 91
new file mode 100644
... ...
@@ -0,0 +1,858 @@
1
+{
2
+    "hashes": {
3
+        "CHANGELOG.txt": "df74107d5ce8d397c0cc4378089e6384021ecbb3d2b559f51ea354f32d0bc016ad5f7b64b724724b2aa828a4dc4913848ddd3c65bebdaef8e57330a5d1eabf3e",
4
+        "COPYING.txt": "a0a86214ea153fb07ff35ceec0848dd1703eae22de036a825efc8394e50f65e3044832f3b49cf7e45a39edc470bdf738abc36a3a78ca7df3a6e73c14eaef94a8",
5
+        "Contributors.txt": "8ab4ea9b8c38e4d115af6ca08e8e27592198b763982bd166b67f38ee0b9f2b7e093cd58ce0927ae38ee3bc015b129add2ffeb3967288c804da493241bc67ba9b",
6
+        "README.md": "1303375a0e275dee4117b365e323d5b918a916d28460d202dd3990d1d07d1ca4c88136e0aa05d1222894a37339072f05a9d8c8cc32dd91ae85a703cfb48b9dc4",
7
+        "appinfo\/info.xml": "b67a2b88dcbc823adc626803e964ceec32ff08630bffc13e2e90fdc818d6a37aa99193c6fa427e9f1e697dbc1d606be6acb588c591fa5454532358661b052a3c",
8
+        "appinfo\/routes.php": "201af4a964d75ace65e4d46aff122afa72390d324b5cab798158985e13234f6f92f6c7320970dc55cd8f64735f07612e107acd8e2574960afb93fe308fa8b5fa",
9
+        "css\/style.css": "c021733ef461a794669690194ddddb16e4a8d45fa5b860e3fccdfc0b6a71c243077535c0661d968461b18ba14e82c72179c5f3e9c14010537d09e2d71f6b9787",
10
+        "img\/add.svg": "5711a740d20d8243b4fa9a52783689af96b3b01af6e422ec6a9f0aca16db068869a5a302e6960168d9c90e2dc0a69eed851d69e7f1bf33684304cf861f990604",
11
+        "img\/arrow-top-small.svg": "3fba2fbf3a27f4d6b44d1c94da2260d025bbe682a3db18c21b9aa548f4878609770cdaa2e5c24e8b5cd97249647187b7499ab18bcd843ae7ee145def41561bbf",
12
+        "img\/arrow-top.svg": "389b15b7bfa8c90a79cd80958d1150538ddd0aeed875eae3a498b9bee8da3e63752fbc6c073cf58405fc35633a9b786e34b3ca1f6d234af685277aa8d439e1a6",
13
+        "img\/arrowDown.svg": "6fb30b189e848b26369238f7446eb1533327a4e99c70b699c10bb03088eeb7d47393f18d4f16bc03edb945f36cf13b96f05b763dba821c0b04b209cd81624103",
14
+        "img\/arrowUp.svg": "4f6a413d836635fd7e2e4d5846ee257c9a13e80624468e444ec906febfcf07a1c84f48d29cce730f29729cc8fbbbd3dab490e2192e5beb2707a6a4b1036bfd76",
15
+        "img\/check.svg": "aff77744fbd4e8eef8d91fd9e128e9e8be2830a93db9ba8d8a8277e78c8610d6ea5ec9678b3dfd2b8f2b4f8970dc40c4111e7af5011b0873bf461f5fbdeeaa88",
16
+        "img\/clearfilters.svg": "f554eff67f4c1440eb3865ea98b00bcde1f27361ae5888dfa7db1ed95d074915aaba0f6aed3f70d6d7c4cb5ca592dbc3f3175f958708e54830f895e8b652b499",
17
+        "img\/closewnd.svg": "38f6ba89d70905ab3d2c7d524fee42ce08f007622bb1256d04556cccdf40f549d39ab2fc455c878e6c318c03a8680d042c8e7d0dff9360a921e397e38567bf9a",
18
+        "img\/dots.svg": "e4a46301c4b70f3820be8d6906ccec273a96edaaab44d7c133bb58f5499f2fc6381f2029c27d0393e3d31e1cf10bc55ee98f05347fa6af3533cc74290d9bb909",
19
+        "img\/filter_icon.svg": "5258d0d0e3677c10a8ae5d8cc37318855e5a6d5071d5a61ee6d29aad7109292502d60571f2c5ae716295dd8f93a327c060ec7c65f2f9cbfee4b85086682a385e",
20
+        "img\/garbage.svg": "b76cde0659b7f127a810406d2b734f03871e3a7c8bc53acb723c2a97fa6ca0801a26cfebd4ceaa28d2ad237a67a222e00aafaecaf7e749cc8e8f93ae35a4c4f3",
21
+        "img\/garbage_bright.svg": "45bbad63a659b6add876294f8aebda1cf03790b0c253ba442f04fd9677c1a35795eb823dbb92bbf38066e8cdf89fb34671763dabbcdad4722aba3ffcaa21581b",
22
+        "img\/group.svg": "fbc10073fb9f5ac1780ccad2c61586512a922359b48ff76194bc5be2711ba99efcf9ce42a694e4cf1209dc78cf2bd077e12f98590c1fe1123260a23419cd256f",
23
+        "img\/incoming.svg": "c8f6e4c7e55c7fff5c74a87fe14e9f404fe5954a546949f148fd60cae7dd2e9165e883c34f1a3eb5500c12ae2bf281ab1607e04c4b75bd6322571ccf7e6ccc25",
24
+        "img\/list.svg": "2364a4ad93d0e4c85345a293f4f6b0e4135cbfb8b7b5e1ecd81d08affd0e0441439f9cd9e60da77eaa53052ef20cec20b49263e387b500c1fb4a3607b081e73f",
25
+        "img\/nextcloud_logo.svg": "4e0d3f0c371d668d83d443e5b1f69f0eedcc759092601d8fe8710dd97b16fd53aa3f9667bba7f305dc3aacfbc14e29b09b78da8b7bf6f41dcb83f5b16473991e",
26
+        "img\/nextcloud_logo_bright.svg": "aeab941556e29f9537508171583bb3309372866122c150c887c21d6a567c5aa06d2653db67c7151b064d4e2fa25f1fc63df21c786ede02ca5f40f12e5c1bad26",
27
+        "img\/outgoing.svg": "b5be7538df66570991b975b1fdca452144fdc27a14521dfb2ae4d0393d0f3b8abb6837458892e04adbdec0182ee3fd25ae33c6792457154dc2cab6e35bd6eb9e",
28
+        "img\/question.svg": "c2bb43256a2b8c43997dd6b40a2db8c811e3a2a28a0ebc11c8e87d71c21b8cfea3367a39730e6675ca77c9ec6e9adb4bab65cee474c02276f905b4477e28b1bf",
29
+        "img\/refresh_logo.svg": "a95a19645bbde5e2146a3ec669950bc6029bfc6104886552eaeb4746733657ecbe4f9199e676ee2e9852ef0c5adb612d93e300e3fa9713fc611e1f8e7c1d5183",
30
+        "img\/reply.svg": "7e78973c9ef21f69c5138b036192a889350ba4333df42c3e343ab34ecc497574a601d5c6e2275846c9fd2adc525e209c006e9a957dff5d0c53fe1a69ee557e09",
31
+        "img\/sms_relentless.svg": "010ad7cee20f3a256a24bee2482b6798f042a3992c7df5d56ba803cca93552c3cda2a68d1772e67143ce45207b89d397e34ba6909f6b8515134db64e2c5497eb",
32
+        "img\/sms_relentless_dark.svg": "cbe97fe9fe636790ea0b415035cd78321ff53ec93ab1276d4ef609555592fa13d09b2037c20e06bbb9024fcfcc0ebb806c89572b08adcfe4ee9d06c6466b685a",
33
+        "img\/sms_relentless_delete_old_messages.png": "077c74a6f138ed1c46ee9426c0c0573bbee12b71c85ae0cb3ebba1ea040b4f88099405d1074a49496050f092e47af03feac9afb85ed1a2480d74d9f07716d287",
34
+        "img\/sms_relentless_filter_messages_by_date_and_keyword.png": "a014a100ec4be4e5d2e09b8d8afc85125fc3f5fdd4379c8338c209a08cfc65a547b1ebbebe6dcc81d05b68081a66982a31f85bf7f7b6c66f441e679743f65814",
35
+        "img\/sms_relentless_grey.svg": "ffac810d151f22067a4ce4985b6c84ec6f6bbf7f1c0a8711ad4a374b838251d3681edfa8439e18c1fcb78160fcdfa20d4f08527a594c5080938aa611991acb2e",
36
+        "img\/sms_relentless_logo.png": "bcc8bc7301aa9c4811ee875b5deb4ed21d9c7eca187970643962f0ae11a7483adc5257e26b307c41644dfef63ec82c4e61a221f133c62827e1d4418928c253c5",
37
+        "img\/sms_relentless_mms_sending.png": "063dcd7d06eced6be8a33c00abd9605ec196c3962c526212990760ee5f157fac0f9778d50d84ff5593a01ea0cdc15d5e848dbe39af47d082909e671f45832bef",
38
+        "img\/sms_relentless_received.png": "1161fbf9e9351510edf200ae89f36730af1c1410cda4186f631d15797e2e484e384898eae1dd97d2904a4d6272f551bb25071a01ecaae101acefb32f855e6f50",
39
+        "img\/sms_relentless_screenshot.png": "5bddd3148637473bd5d0b551df701094c8983e1a7706d753697df1bcec27029b88ef92146c7bc9213914dcdfce65eeaf6eb49d9aa95ce4d6e7f6317f4d9324ab",
40
+        "img\/sms_relentless_send_mass_sms.png": "f8043b8d2dd53058c28552ef96e637072337d1c751930f3418ba8ea7a394507246f35ed98f8123ff1e9e6598babbafdc5b893dbedc0624a2d9c5c1184c6ad60e",
41
+        "img\/sms_relentless_send_sms.png": "0a028ba48f0b86d820dd2fc13327c9069665a327f461310847286bc6ae085fbb7337162b27125b2d42fd7136a30c9dc7f6866501912647899aa0cc7ae676f706",
42
+        "img\/sms_relentless_sent.png": "7aef983c66793540b102f6879151449ad0da60751d89eae68ffeec7b20ac6e84a1d92388fb808d10dbf63f7bedb68c888dda509ea2ecd7715ca8f264e05a470f",
43
+        "img\/user-grey.svg": "1128d96d0a4281591140149de57924e014a1d709ab97d351100c901569bbabc8c8834caf1a5932408b7918997547c323b8b9f4f410e1f03a4eeb89045bd95ff8",
44
+        "img\/user.svg": "d69cf4ee448f7ba5d46fcee24895e8705c297f078d943ecee1ea242b470c5e89318a5eb077c81e9c2a656f903c4e869298cc2935cf05a4a5f79e295dbf86df60",
45
+        "js\/adminsettings.js": "817e186eb3c18f49ebb0db58d39e6ce9ba266ccc5706c55e4e8244785371e6074a49474dc4967eaef892e32e058b36676bca613c8c1ba8db876f0379cd66585e",
46
+        "js\/arrowup.js": "819fd1975011e2819502cbe5bd006204122d5e73560f6f7fabe9c9f14c7086206e54c8b51e3b005820a1e2d9d29c9254ce2c1c8687285efc8daf3d667e51e738",
47
+        "js\/deleteoldsms.js": "119caf1bdcb36616939bebd024963bc32a19e5ca318630a5a36c72c41c480d72a81b385a2c9891f87ae7d42c25c30fe1b5bb122caca802c4eb31387850fb4363",
48
+        "js\/sendsms.js": "5606b17557daddbfdbe505e5be133c06ee0143a84314d245e771daf0e95fa92e35c954321944f00ee9b81e1f29fd08cfab0de27514b42c819ff33860513a688a",
49
+        "js\/settings.js": "4ca5e175ebe913ad1db8bdb0ea7d50c4c8f54aaf8788736a95540a803f4a3e666b504e5c37ab45aa8122e29b818be464d129b1cd3d3033346dbf380ba8a5cd96",
50
+        "js\/showsmstables.js": "7d415ea8ce05507285621ffbdfe6d877b151cbf56d1d53fb5830b1ef0db185371522884bc1ad63f58aea3dbeece91bddfcd01978473491f415db3af5d015ce4a",
51
+        "js\/tiff.js": "0c20e8d4f9f602ef497a26a50d8fd253abd55cf53afb0699638264550e931aba9b5b41c1ab0fdabee064046aab13b921c8d6988d76048f6c9795bed5aaac8aa7",
52
+        "js\/tiff.min.js": "c35f67b587aab62db7a3de662779a7b3264d70f5f856142cae88eadd1b477e474977f2b8c5ab31c16be002cb7ca9b52282e6de533b6fd79a02e6d33815919cb4",
53
+        "l10n\/en_GB.js": "30be5a195908c731891e456c699053a5b9675e5c21bcfbe6f2091f467dab6bf0dff3ea167b9f96e7c6b492d74709d5c732a5eabdbec30c129607b0990773609e",
54
+        "l10n\/en_GB.json": "7f1567f247b9b4ad32dd836903f34ae02cb93c26b34e7eec509ddd1a6e320d64be2d907796017c379afd7a9fd75c9ed5bd00187e93da4100132beed5c16ca74b",
55
+        "lib\/AppConfig.php": "c52269913ee80151397520bbebe4f0c725526910ce18f8717ba1c8016a5f4dcdc9a6f9350bc56c8a6b607ea342ee0cbe0f65afd9f03c31902190c008f41c9672",
56
+        "lib\/AppInfo\/Application.php": "7e5ff3a817b1d46e8b05e2453c34450c5629c25b5c3955593b36a22e5ff0a6a67a197665d476f7904c3dc8712105687153954c22a12f597828247a56a80f509b",
57
+        "lib\/Controller\/AuthorApiController.php": "d019b31f73493f7bec44a7e87d56255c79204b9d03376fc3492a7639b32eb7a9a5ec040fea82cd74f54f3ae0dba8389ee487f0f3a05a0c57a4380eab69595210",
58
+        "lib\/Controller\/PageController.php": "07da5883ea41b3f7993a3e358a03a3db592a30fa81ea1ed0f26a234fcc3824a243316b76824fb9a24f40304ae945c48118dd4bed1f0d2f6993e479ab2c1dcab6",
59
+        "lib\/Controller\/SmsrelentlessController.php": "ed7b3db597923fcf1a1cdd207a505612aa9c7bde2e95d2136231c529c6eb71554bbf323570b44c915e832846951d1ed4b5f713a8ef2baac88a3a34d5cbdaa2bf",
60
+        "lib\/Migration\/Version100Date20211106192148.php": "96b9793edf72598c0330aed9f0c6c27ebf02287bd84b6b7a0285fc784bdf6442b560bc5dd2e55b464bb384a24831ae17d7ea144b0896d9b11cb82a27fbf602ff",
61
+        "lib\/Migration\/Version106Date20220813144231.php": "33f1f2953e038350e37c670462cc79fa48ab3a72b595f5fce970fdcc6d7eefa3401722da4cc532c7114d0c8aab7fbf0281afb374a695d5c1c1b311c30f64c9b8",
62
+        "lib\/Migration\/Version108Date20220823132408.php": "5d94388496cd88cec1dbbe67a2e9d6ae6fd5db7ed42d4bc737710d3c51ad4d8ad29d53a62739e05e2986e2d4c96374f4660a53dd7b7808d30e44e5c605105971",
63
+        "lib\/Migration\/Version114Date20221202011625.php": "920ee001204afad537bf2b7dbdb7c78e95b4ad0c79f5f693bd56347a1df91045cd83348f99e2ad714df2a735cf1a1d85aeb385c675ef6e90eed26f18b0b7d344",
64
+        "lib\/Migration\/Version116Date20230508212745.php": "556137e5580eb33beffbf6198447581b71de677c2a2561508c0d7f2f51e3ab7ca9feb0715b994a2753616838ad732e01e6cacbcfb521eaf559fb40200f0594fd",
65
+        "lib\/Migration\/Version117Date20230509183517.php": "dd289fe9ed0947b1174390dbd921ee696b50af9bdb360585376a6d5334e390dbcae65833c13c332732309f8fbaf8d83d047df6accb8118c9e4fdde8370db7b18",
66
+        "lib\/Migration\/Version118Date20230509194216.php": "165c805c76bedec7f48811fb4a83685287daa07660cf369b952ed2dbd9a6c0bf1bee2b78d3642478acc37ebd597f0df7d9eb7035c047acfc69146b664afdd286",
67
+        "lib\/Migration\/Version120Date20230520072431.php": "322eda5d5112d5e52a466c91ba02c40f1e77231c627c155e00cf6a924fbe16b4d6cee69978b0b3789c5daa03dfdb3fbf0f33b42fd40811aa366c7a227db4c31e",
68
+        "lib\/Migration\/Version121Date20230523201743.php": "d4f5e1520213a4f0a1d74c6faa1da8a4988dacf8d3f3c7aa8bb932744789a366e1758e2a9be14c7768ca7114ac0e7588ad53b7a9ad6bc1a45da5ef22806126b4",
69
+        "lib\/Migration\/Version123Date20230524182156.php": "7bc033f8852ac9b79e15bea2e13421c603acfcc443304bd36cb0f015991a0816b90950e6b45a84ebe5e03e92c4604e3473dbc90bd72810166a6a20f97eec546c",
70
+        "lib\/Service\/SmsrelentlessService.php": "0d5eebe447f8e748d009f85cf24505c58e71d5f3a7175cda321ef3f15b4d3503417c40f6629b14f387d034f2c6d84950105bdd8c2fbce4e48019665bf1ec64de",
71
+        "lib\/Settings\/Admin.php": "e4e5f6e8fc5748b11c90b676326dc228fbc52fe1f77a07e7b7460c6dbf2a8013b5e0b0f9084aac3f941478ae6ae75c47be17df3d229d8a998363b9a1d289f405",
72
+        "lib\/Settings\/AdminSection.php": "1c8fb26e8347d67c69af385b0aa33be2764135a4672b872b6c6d41bef3eac6733ca2796c393c8ff334ff56accd7ed4d4c38ca50baff2360d8d8be02b9f8a7c08",
73
+        "lib\/Settings\/Personal.php": "db6fc80342c865841edcae7d2cce5e50d04473a9ac47e26c2daabce493bbb1bbb922bbe9eb7353d759965506dbf1b4c99ce8e9c93f5c43769e1064cba19f95dd",
74
+        "lib\/Settings\/PersonalSection.php": "e65e1a8939e3818e7cd295ce86581a603b1e2fedb732ce51ed1fce62cb61ebae9b93742b1d923f08e14cdc6bd5cf2818d47917321e0aa1736932830c05a81682",
75
+        "providers\/Flowroute\/readme.txt": "25f08fea0f30105e850dbf07bb7a9351e47883640dd87d26981cf50f02ab5af8ef59dbd1fbe5e4127c0e019e13ce036f9414401b9d3f3a924c4125c291e53446",
76
+        "providers\/Plivo\/composer.json": "2d8def5ce9444d4bfe4ff32e008e6aeec924efd40e0cb61f3a72585fc4cf89e7b62970e796d56ebdd5d2f6378f39d3ad540ffdd02c31e2c4daae9b760482619e",
77
+        "providers\/Plivo\/composer.lock": "d9a2b89de334156eaded5ca4cdaee9b53c05e5d78584faf000a141692225a1bf6a1dd9ea6259bee2158ca7669c4000b3c366703fcd1f55a835278aa9f653c7c1",
78
+        "providers\/Plivo\/vendor\/autoload.php": "597387bcc320be22e8b0060c456fc745d8e3fbb06cd1cfbdf093b0ee52aa30cb7e4c31d6d8c38450f52387c0cd5f9d0483e3976611d96f391f5651b71d2095fc",
79
+        "providers\/Plivo\/vendor\/composer\/ClassLoader.php": "2b6fa585122ace1ba816410acbd8372cb75329917aae6363dbad48e396cca581452616e1386a2e445a8fbb0e461b988279103f4f89adf704bce7726f761abf0e",
80
+        "providers\/Plivo\/vendor\/composer\/InstalledVersions.php": "62b61a5303337c975905fa55addb6b1157034fecaa5fb3b5bad251ef7fa1b1ba840308f64fd2e1244d2098b7f87431e35939a153298530cdbd82f81b99cabaa2",
81
+        "providers\/Plivo\/vendor\/composer\/LICENSE": "f3bb64009f41a425df5a9bbab53490f0eb9b74fa8d6aaa2f57efb928edc4ffff330260666edeaa04a91fed708c3663371cf01b284f3a08d6698aaef7a23f355a",
82
+        "providers\/Plivo\/vendor\/composer\/autoload_classmap.php": "1844f7843fdaabef42d1d9e4c09f92f51a5ad45b26d44b34a2aa9202a183489239a0f5ee6502f302b169ccfa3a4bea7308771ca02d3bad96095b5b2194a65377",
83
+        "providers\/Plivo\/vendor\/composer\/autoload_files.php": "c0eaa5b28b83539deb67f24a98ebff5ac0483f9117a72d5cbba02e26f1f18cd4c93ebc23786047ee61eeef11961c55ae6cd4d4096a16f18a19d2af49a47820bb",
84
+        "providers\/Plivo\/vendor\/composer\/autoload_namespaces.php": "0ac6bde683c053d62b7024686ecced083ca1a326d5346a248b1a058ac74a5af71d515d311ce76df799a518027f734b80b9e7f6e8022a9556c0f24ce90240d822",
85
+        "providers\/Plivo\/vendor\/composer\/autoload_psr4.php": "91bffab80b2ba961f206bf3008a7380f81b7cac7b09afe4bcd2d4787d8b4c839ffe2a67442e04010918631b1c76b66304e7d7bce76371e741b444f2ef527355f",
86
+        "providers\/Plivo\/vendor\/composer\/autoload_real.php": "2ff5b7a817e3acbf585fe506b11345f6f3ab0f21c0ee96c67037f09de6130126d4c0e728ea22508192787a451322369197610726f96f32a12f91b7e48cee86a1",
87
+        "providers\/Plivo\/vendor\/composer\/autoload_static.php": "4fdf5e58875a6dc6bab4aafefd254cf3504f78feecdeda5fb431a56f84b37d2cf8fab8e233ecaadc2667f1be492ded264423f3200e1095aa507172b0dad3f60b",
88
+        "providers\/Plivo\/vendor\/composer\/installed.json": "0365a8c8cb376a0b3ca8cdf63147012435d2488c5ab585db3f9e0d926b588887992c1c8cfe07ac187f5f72afa9a3db936c6885d443db444147d7c87ff0f3084b",
89
+        "providers\/Plivo\/vendor\/composer\/installed.php": "923c151f9cca2fe9489aa4cfe04053d20e1923dfb388cc6aea2486557d77284fe6d9d2a77a7acd94496237465f03b712166a2f2f5837ab13bbb7f0aed8d52552",
90
+        "providers\/Plivo\/vendor\/composer\/platform_check.php": "49e79f2c7c1c32796dfef02f64feda4fc8fc5aa05197465fba579997d332cb9dfcad3511efbb34a32a2b2c8d8901be4ca39867026b2471fb17999ba840c3c340",
91
+        "providers\/Plivo\/vendor\/firebase\/php-jwt\/LICENSE": "6f6cbdccc57476f5386f5336c1efa105b4116760a329ae2fedb30fabe1f34f7c1a3073e7f711e07284c8b57b3b8ab6dcb38ba8d71f6835ac024ad524ad658f94",
92
+        "providers\/Plivo\/vendor\/firebase\/php-jwt\/README.md": "8f3226941b2d676aa31b66f5a38f6fa78a4073ec7ea6d6a3aaf0209072cbc8df2ebee65f64460e350f499f8448542443f9859db75f927fcbe70f1f59384e1a70",
93
+        "providers\/Plivo\/vendor\/firebase\/php-jwt\/composer.json": "82e17e8f606504476175a3c5116bff37c3d58faf5fbd9590cc4047f787b6aae79a84c660bf2e8dca453b998926dec84e6d5bca5d81b6817e09d99c6774cd04e3",
94
+        "providers\/Plivo\/vendor\/firebase\/php-jwt\/src\/BeforeValidException.php": "8aac5fb14b6d94bcf048a1cd4935af09c25183e74eaad8f2db19902f1f017a33261707b12be8080d5a662bd01d997d4d5805cfcdf3127f447feb6ec6b971f563",
95
+        "providers\/Plivo\/vendor\/firebase\/php-jwt\/src\/ExpiredException.php": "7cf0ec0dd02717f5152abf5c01979526fbb89f04c01802915745097c8606e432b41a4de5bf92b7cd1543b37a939ce8e133b7622f29cc48798c321654dfb94a3a",
96
+        "providers\/Plivo\/vendor\/firebase\/php-jwt\/src\/JWK.php": "3f134e7503b44f882a92a699dc4cbb4d7415bb93526438e4395cbe877ab2da700d3ef7a8c037d7d2ffabb84e20165f93e338bb32c2bad9426e63708da4f842e3",
97
+        "providers\/Plivo\/vendor\/firebase\/php-jwt\/src\/JWT.php": "9e5e21477b0495c3cc6fdff79d9b6acc136c0187d732cfa4ea438d9802be4642c2fe0e76b288238fa29bb0a8e37e31d57546d548519436dc49de467cfa704ed1",
98
+        "providers\/Plivo\/vendor\/firebase\/php-jwt\/src\/SignatureInvalidException.php": "0c00a3a08bf4fc2eb675fe8ad3d8cb732a82a8f88d37dba5e510ec798a49342b8089098dfae1f1ef1906e62a4b8e465fb7b4c6d17c9c0d8e66ba33ab271e5c88",
99
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/CHANGELOG.md": "f99b50bf2d30b8e842d2db14a28068364b330b402db7bb1fe87fd4e1e3a9009edb05a519a4c35be68ba99c4c334680ff52ff0bebb84ab99de8814959d34e9c90",
100
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/LICENSE": "ed4199d68a412c0515450194549bac0c6a6d838b3950c036bff6c97457fade76fc914d11bf008321b3e2622ef0a3c14da0bee2f109529cfa5a5fdc11fc6452ae",
101
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/README.md": "dcb463420d7da1805c5cc020988f60c15fc5623a2493556ba4bba63d431c21f0584c1e65f27bf0a4c7962074aacf40d763981f878a10e12327cff9b89204ae57",
102
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/UPGRADING.md": "4f2540329c6e06bc0f05a574b0ce5d77ac3f7fa4032371665dce41a766cd28ee12a0b7803ca507faf005f6a3ec5107a60978b69a4fede8bc562333b736576f55",
103
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/composer.json": "8746b3c8b0fcf0ede926b6a60b4d34e7a3e0e9664aef67b34e7e238c25179d22ce599e8c4a580e9f3d73122a0c9b373b87526874c947878ab339e662b03c150d",
104
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/BodySummarizer.php": "649dbacf3be500e6171769c18b1eec1888bfe831dcef8464ebce4461d5fd337c60a200d3c89f9bd7c2714c0567e5e220b31ec2970e7a013f914123824ea324a8",
105
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/BodySummarizerInterface.php": "d0a1271ad03136dca5752c0dfaa7fa678c6fb03890be828780201cd9fbdc8169ff4fd7c17867cf82ef1672ecf0e9f871f682ade1a8ff37e7b84d24c572e1b962",
106
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Client.php": "8fc98c3490398476a81f660a0dda38306acedaab2f662f762881c11f98bab8b5194ea6c05477bfb2676848f54229087df8fac0e6aacec6499f2313e09b940ea4",
107
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/ClientInterface.php": "d1ab53fbb1b6695e6537050421b3a749a7b34b3184015da449a1c76987fd6944bcc1c4cca7247b98b338926af89fa477f9be4897e6316cefb2c1656520c3ea2d",
108
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/ClientTrait.php": "ec1e95b2f1c56e4443c6fcf695ede88e02f1129b7027287f968a0ef2f7debb7533ce2371a27b5ee07f78818786b0a6d1b3d2f8ce28f44f4a8f7e275bbd1b6727",
109
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Cookie\/CookieJar.php": "3fa0964d59cbba956bb47fe103f02e4707a2a6ebe5a60dd5c33f59402a090b6f0110c2795b52f961f6ddf338567382e1248f1e27bf2d0e2033a43efd15e2705c",
110
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Cookie\/CookieJarInterface.php": "a3c6b9138e285d6c6b7521dc7059a04e1c80bc0de7a925c93ecde6c95cb7fadab91ee05e9594d6b891872a557a1b98fc6717ca1d1d46e00992c9cdcdb934a71a",
111
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Cookie\/FileCookieJar.php": "35111b9229059f54b537baec960b8480d5e3caf2961ca3e7e45de3fa5ad5bd0b0a91c2c4231f6386a4966bf9d97aa308a7e444000dae9b21f8c58b6832dee68b",
112
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Cookie\/SessionCookieJar.php": "9cf11d2908913a7555e9e190e6a4ffb0f0e26ddb3d141faeb0e7bafaa6f0b3259119ce6febb6d01b5a7f5a3193f72a099f08ea45b5955bdc7120bfd4857879a6",
113
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Cookie\/SetCookie.php": "7d6c4c14c9d652c27da23923cb577fa999e24f81c1b82f13fa329da3eda3373ba7a832b72d793d924fda9d6a3a02cb39db97e49e17feab3ecc93f395e614d44b",
114
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/BadResponseException.php": "4b7a572e9796b8043d56dc6650709e59bde237b3bacab1206b807485cc850ec99dde86892696d73121c345f1c88a9d2e879dc91be2cd438defe2609e521011b4",
115
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/ClientException.php": "0011418b0cd07eff70f99645a008c30e9a6a90b9ec396e8cf70ffc281140054bf313eba40d97ed34b59e04e5fd6712330d34268353493d112b8029c1c42e5046",
116
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/ConnectException.php": "bca929720f3f8f4484899b18b40f5d4d40ebc4105b316679a9349b97200c74ad2ae6408e2362b4639bcc4a3150fe63ca1e08bc1b159c51744d76466c41203c83",
117
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/GuzzleException.php": "444ae2d2847cc99d9a3895e2d23f0abe59bf0eae279809f7a4983e34098ee0a0ad7408d251df821c4029621060aff1ea0dc890615535ea4368e5796151a767cb",
118
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/InvalidArgumentException.php": "2647ca6c297960b01b29435db7522ece3a997def6b3af71e26113abd43ca4493501c130e7767b845db0e723f9955164ce33664d49bd67a45bd29d270a66e0e3b",
119
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/RequestException.php": "b0b3163e4eb96ace90c03faf9406b89ae21c7cd5fcabe78035d5d9e1e7ba0ff72bcf31b877ce2d5cd38e940cf0ead52659c3637dfa3567745fb46a11cc9de31a",
120
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/ServerException.php": "9cab599fd913d8f0bb1b8f448932ae0b5c5b1cd7d83fc4e1e4c13fec29b0a849a5385a6c40183b8dc58404ed020227b9ea4483ac89d135c6c82e4c7985604044",
121
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/TooManyRedirectsException.php": "99c4e6f908a5dc03939ca083232cf48cecd742616e00839ae25ca173ec458e6da10be2690b98588b76e0f3c24ee7f35c09ed5c848f9348c639c414aecedf6c2d",
122
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/TransferException.php": "665600a8617328454b70a43fbb72c81ea196584dc22e10324b3c861974aa55ff5867b30b86a65123f1bd4fece75049a9f6c4bfeef5410a9f29913d350358178b",
123
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Handler\/CurlFactory.php": "1dd7a848ab73a8db9354fa2f0461a995320ccb677b29464812a484730a85f405d8b6c9b39783881b299328cb8f99e67b9d959b00672bf60a4559b136fdae8119",
124
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Handler\/CurlFactoryInterface.php": "0d063ee120e0ff6042a58d29b109bf6573494d427e20184a4d448ef31fe0cb0cedd60bb47c7289d5f6e1027413a28f9f57921823605d4f11086da5c9be8c0902",
125
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Handler\/CurlHandler.php": "ae0388a0146bd0cfff1c597570f58acec92876d3d01298e1988dabc717ffd76895b45359cafd7bbc62ca1fb5e7e96fdab70697a2cb469c8c5d0298aef12e44e9",
126
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Handler\/CurlMultiHandler.php": "d03d4a374657d671554d06e5622eef0d1b06d0a39a9167ec6f894ee28af31defe1d4306f937376cf5997c1421643e08e757880e45a1c9c10959c967022160f96",
127
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Handler\/EasyHandle.php": "7438c054921687fcc4bea6ef6b49aae15651a95cced2cf73ffe46bb15abdf924afdd4784e8d2121ca851934fafce69d3661f1a792e6f2352cc5f5c1803ace3de",
128
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Handler\/MockHandler.php": "0d8e2e43e0b8079f20de6b86c241afdc83bb5bcdc5a91ac47084ffdf2a3904a79e5db6fbafa4715785ded8fb90dd8fc418aa05bc0fa8c52220555720f81e827e",
129
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Handler\/Proxy.php": "9caf11da430da351eff6e9be0a1e8e029bce41283a6d8215e2215d6abbd3f021018564d1e6717f65f280703d5e4dab78a2b522042d63c5a9cfd019b0bb0aa4f9",
130
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Handler\/StreamHandler.php": "e45738ddf123fa57df229fccc94622b9a2ad5dd9bf6f65d24756239b587937bac9b7a37220e65c55f2abbd7159bc16ac785893d4aac5c192e6422af4fc4f1222",
131
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/HandlerStack.php": "900b9df966c3c1f3aadc45bd42a81e8ab153c74d0eb90cb3c8b2f9d46115353f45e5bcaf0eaba1281ab98dffb3d136a0c0fa0058fe73d906eebb741b273c150a",
132
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/MessageFormatter.php": "99460bb55080cbc7e08eb6f1b3c8abc71c38cd5d6e04422bdf8144ca554e7d7de29fc5d5dbf7aab5f7440c4ec9d779d684f8194f90139a1ece1bb086f14e3cc5",
133
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/MessageFormatterInterface.php": "609462659ab00682e7fdd1bb56aed5ad3cf54a2ee3b641623175b9dca0136b4e1cbd3cb0541526ed86d05174a18a9333ba52a9e50f4c05ece55cdc636815e385",
134
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Middleware.php": "42fea3a5bff7eb363a7af1f85a21a9322aee8d7e343295209815739f8bbd5dc372f14e3e8c5454f7650a3b9d802ca25fa069d64fa16b0f5d4d48c3d626ba3527",
135
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Pool.php": "a6d17779976754d7c16127680ae32f8e45ed54c3ef4a2a6364a1e4100ce732b8494b2848977ba6b2bf6fd296d7a54b30a2f021cba5a88ddd0d1e0f3a3712b9cd",
136
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/PrepareBodyMiddleware.php": "268182133f0e484b56fa23193d20def23166eeabcc2fd9626b17cbc20188d76549adaa4c768df695b787d31b2eb26a5316f0a3531ad3ed022aaddf0574fc2ac8",
137
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/RedirectMiddleware.php": "38bbd75b92a6764b0502cea113e222d5cce7abe53c7ea0c01e441fbbb6b0514f2f54388ff14d459ed611925eaf9b48c0aee1b1fb41892d07d1b260734a1d2afb",
138
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/RequestOptions.php": "239e524c17dadb296efbd8b9ba82b94ddfcd90c83377fe4bf2890dae5dbc62f58032205274575f14bb2e745112ee59bb559936b992d9a227dec00f5b2e32c03d",
139
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/RetryMiddleware.php": "01236bb2265c0761148ccdda7d3668c10f9539119bcdcc36f10d077ca32013ca0169938d6f4bd0703018f38fac53b2bd34e873a07d8e5287c26fb64b7284dfe8",
140
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/TransferStats.php": "4fe882f7f801ba55a3934e00d81aef09edd092eadef498f3bb424f7f32dc8d568940806a9d8e80b1b6c768cffd41ecf0814a0bb366195b2400f08a8e310a8c19",
141
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Utils.php": "c3e52199a0a1755f52b6902b78d008de10e33ff8b93242a709d7a12e8c05c1c2c09c2874439606f0f3ce6b353bbe3b8ac385a236307b428fbccc078e1959c7c1",
142
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/functions.php": "f45c62cbff0de0255f4f149ee3e93c52bdae44492d43c9314a48d8a793ef028f8a8f704a2b28c5b84491687c3b682e9f85c4ea61bf63de56c6cc6a4ba8081ae8",
143
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/functions_include.php": "058a92f735b5848dc18be383478bd1659a0b578beba1dce5a1ef3b7a0b6b5f643e2f222dd72ed09ec72e8a5c5c9fae9757979f7c4016c5654bcce9d7dfd42d37",
144
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/.php_cs.dist": "4d42019074dff2a1a5bebfa51568de254e5128b88ad309bbed5e8348ef213035cf3a4da66ae6753354a0dcf6ccc0001bfafa2453028bffb3548f2ede26c30177",
145
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/CHANGELOG.md": "0c021cdbfea029de4a20511445e64d0d6c35400025f1361cc913754adce9b2dc16efeac12cbdd489ffcbb76e95f91108dcc557fb9dfdacc99e5bb98f20b55b43",
146
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/LICENSE": "9699a00cb2c5ebf932515e1232b83f79c944f8100881df096de09e25222fa01173bf24d9e083db7d9605d1e4f5dfa14c726aed52c0fc2499643714a9e64c4cc5",
147
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/Makefile": "a350f48cbb68a05cd07f787522193851f9cdc6b2643e34eb502fe261387d97e5ceb8499a22b20ff2fec5d7352ff239a952fa3b129ba3407fae871683d65e9bbe",
148
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/README.md": "1ea705deca28d726cc65d0f55db886545b9f5309ccc085bb482f627a0ddb5f8609d6635f65686e3e26b9a23cb8bf03b3e8d02a26d25eaf8195dc6c2cc93be0bf",
149
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/composer.json": "74a66451bfa422f886266ff300b4ca5f7b0ed62199293635671718caced457f6eab5b8c9467f24e999762f56368fb35742dc0adaa35a233d32c72783112a6c50",
150
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/phpstan-baseline.neon": "916bcb7d298578dfc4770a3c49ee558eef9a20dbff8e3d097506379c8680917b08a8f96f2b59d96b1b56b1ccf4a5478c868a2da504a1935956db70f51528494f",
151
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/phpstan.neon.dist": "ddfcf700a47b916ed1072c979f13d6d51327c9bc389c49ad264ba23279b01151b90aaeef0a81a13eafd40115d407ceaf471c20a61b47f1b4796f8adf3c1ad218",
152
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/psalm.xml": "52c09c8b7daf6d90db16a5ce50b7a8ce15c1ffa02265fd1d4b117cf717331475245bfd4f2dc45d3990d67333988a11081e13ebf783bca8854a1df9c1b0cc9cfa",
153
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/AggregateException.php": "97b6e46aa16ad26a2b714129b83d933cba02ec7afcda514ef67c5027cf5b9b93a5d7cbc72560307adf294179a4d7b86a6da9caa835bcf5be17e398501bb88fba",
154
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/CancellationException.php": "b958ade84fa4e6c7a7efed66dfb6a7f83b9743a9ac6581276eb99bcab667ebcdfea92a9bb114d086c5831d26abf7f6ec3e03254067e2b29abaec995e28cbce8d",
155
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/Coroutine.php": "d1c789e47536cf8c9db52acf791bc6de0d61790856a78f0cf6a9c98a1628d2c42cdf9e5e94e05fea802a099bd3ae3c65b790f2fb5a342bd130654c4cfb4fcf07",
156
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/Create.php": "a3651bfb1f458675c58397460c8534c2819404fc89422467f119de4cd80147177e462a9965bde6a75e74e4354c3c6935cebe1891e6a53a1bb26383f22e9dbccc",
157
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/Each.php": "e57ea03f69e1680b56676ca1057e8defe7eaefeffb456b636f3cb32295eb6be36073c7a9a621f656c40d5661c0fbfaa3a632961d82ec7f116ab7fb5aa9db196a",
158
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/EachPromise.php": "c7d79757cca80b7352ffd12a6743a515255e4a89764f65067035b16fe39c09b6dabb833aec3fad3cb741aefd778f620202caf79e98b86095c6b252f4e555bbcd",
159
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/FulfilledPromise.php": "952eac7f7cc150394dedb72ac97e624db8156ecd41c8afc382ed0cf8e4c2c6c94879b7ddf6ff76608c6a95ef30ee136f44fa03ab9f5ce4b7fa01bcd0c7e7574f",
160
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/Is.php": "894b3c475b5a828e442745507fae4b35bf394fc9fc93905258f9736a67112c321b1f3e353f8f3fb84e8778bff67bd9d27a6fd5ab6dab3218a30d82b8fd14ae0a",
161
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/Promise.php": "bbfba94124c36b87941e1548162708a5543f156d64a8f465f78397a02bdc34c764b60f73d5e77a3a2e48727f4cbd91f60b9c1cd47c0fe205994c4ffdadb99c5c",
162
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/PromiseInterface.php": "8d8d1d9e04d75ceb6d3e656794fa93170a3b1f9c2dd3b53ba6b4dd3e599f880599cab0b1ec15eaedc1b26d09d6c535dc9fe92802ea8ab1ed5927ee8cda7cb9b3",
163
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/PromisorInterface.php": "1058176a68078d02c288528673176648e38d2b8093e67b0984d73ebc710c0bda7019689303b1f064726cbbfc9382e733443e9d5443a77715ba40bb798ac79e04",
164
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/RejectedPromise.php": "53914a46ca238b8d079333f9c71180aed015a77bf765cd2793790dde21fa7fcf67dcedc5c797a1d7caa06d788bd9631628712861b1185f3cef9aa63260aff0cd",
165
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/RejectionException.php": "6dae5e0b0b47538e5c94a3d4890623e3ec41be8198a1d00ca84d77f32b9d074cae13e25ea90e2af614e802aa28271def466e5ab623c187df49425cdfc5bc05f3",
166
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/TaskQueue.php": "431a73762758dd08406a41587115a11e61f921cc01997ea71efd803b2e3882b9cb7f6d89694e06ecd2992f2bffa38ba55d631dba7fabfce3b84d68dd4913a02f",
167
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/TaskQueueInterface.php": "f0b2b36ffb75337c590f82d3d7d19a4caa4eecd6003c0bec7ef935604dfe35f4e960f49da7115b3b3cf65c61d04bdf258310ae1b4f4b6cff4eb09f52626adc11",
168
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/Utils.php": "9bb1eebf4d0f43bc47cda6f70f08b3fde962355075bb87d40ec75d41b552c262a79023a72e2e8d776b6d0db1ef1d412e398ae16d96476aa5c72afbdab9d5a9fc",
169
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/functions.php": "b756c2bce2557e9c6b8db2ebfb026354418c93f54169d1e9249478532bb02e1062c30e14060a3bae195098c74deb4f7580943aca944a162615c44139acfa7861",
170
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/functions_include.php": "17063296fca8aa655e7d5267abcf04051cd58fab5a7ff02530e1becb5002306252d5ec55c82461cc51f62c881c51dd80da53ed9d90640b6d0dd56d5e8f819022",
171
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/CHANGELOG.md": "0540da857957565d77741b846932c739e0883751660d561b2a0990a7cec8188573c2d31400cf9f125d1b6eab482455d19f30a8363354341e3c54088a0c418e7a",
172
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/LICENSE": "5d25479f1c9c0b802e2944e029d7011f9b9d3f7b37f7c12eb77321ba448414f79b0b254c0846d2e5e1b8826bed85d7c377803a4ad5d5afb288f220c761822043",
173
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/README.md": "b9759cedfe2199b2477e95fc0770f35ed6a4a18c6e6b4b4e30a20f75945505dcc76834e20e61e3aed90fd790c677536bb43f593de8a68558a200000eca8d0bdc",
174
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/composer.json": "27ad0b2937068e201fd0312a7dcfba706a8a318ca4e09d80f29611803bfb28d48433ba5f2b452da8bd76fdfe2b9f073f81f2e2cd6fc3e4223b20637408f6c836",
175
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/AppendStream.php": "d94d352d6f640589e84fe2aae0bd20880c4d6e897a29a47d4dffe6aed4d852fd5df274db2e68124c7f15b84d6f4fc684873fd03d003db39caa61b024b053e396",
176
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/BufferStream.php": "eee7de67e107fb33e8f97949743726a30e8201fd874490fc93870a410b1e0e3a059b75dda972b3a844b8c739b9b768a73d65c61bf8030589d0d787aa26f70e8e",
177
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/CachingStream.php": "e9b1e3d5e2bfae610677b9d216643be7b2e8b97cf661bc5c67631f994df0dc88a9a9ac7bb9dd68fcfd2ed343cadbbae227a8a46baa3b732733497e24f1338be7",
178
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/DroppingStream.php": "63db37354a2eba98b768f0929ee9a4ffbce1647a79cc9aee5e994cb693e53cfdb9f7a0fc4c32b68b46c64b39438b1c53a30532f5f8fb442f07062a6b4861e39e",
179
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/FnStream.php": "bd25e2ca8ea196a5e876c5b9d01c6f2a27b206f7ba05d047cb46476c52191a594f1280c7435b6429e4ea411fe5fc01a2388e213df26d27c5ae5094a0d0f2d619",
180
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Header.php": "27014466522ffca93b4a3da6e96a5e8501f11691f7642a2e5091f3d0c1b146789ea41fd7fa1e3948f264926e7b764b557b1b564a95a7b5cd56c17c8ddfb6b7d1",
181
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/InflateStream.php": "e19b69eb2f1d2f8782f7285414095ea810f746d02a447badef5ec7185623235f17f5689682b185ba124e71a19b0dcf3d36b64894d183e25edf27f1d1e34c1c0f",
182
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/LazyOpenStream.php": "8c262a2c574767d61a9eb084d6848bef77d047601ec5688a90fbc012d5349d9b4ea188444fe509c8ffbcbf6ecdfd839a461505ed3746b6e1c5283860f7fd4a2d",
183
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/LimitStream.php": "81a43b1ec261207c1a52faac2c5099a429e43083bbe0c9099f447859d2ea12a45d30e7f0b5a994696084b3c59401bc28564685c432644caf6a9d8b9669404c91",
184
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Message.php": "4e9b857c226b57e2d2faea27643d6f213bba65bf158889a528fd684cf1acce6f480805d04da39a32fbd25be9fc51c4f1a3c1bbc9e92f3707fcf33a120b2aa256",
185
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/MessageTrait.php": "367bacfe383be2caeb0064fe80e5f6b138050dd4189bb65ff82d8f86d0b1b604090b61a2473d7e80c733c395cb893fa9eb2dad0a63a353c19da32e940a1de01a",
186
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/MimeType.php": "98467f19beca7d4239963d4d91a7896d44539c13a5c694c4aa8ec68f3b57031367d1cddff19fb51c389393cd1402a574c9afdc448766c8807228d726796d2e9c",
187
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/MultipartStream.php": "5bbb8f71ad1f2f421eac8c0d40c3a18372516e8ab8f2bb3f917871bec9aef0eafbef930902084aa3ca64a8ae930edb1f2befe1e6b49dec387ea239c5c475c099",
188
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/NoSeekStream.php": "f003ec01ce15f5dd56200396a84a2c94a1b134d320230983ef91efb1abc770827018894a1b8d1f3a68c2aa481e8f0bfbaec4c568d0b0fe251a61f76ee22efa38",
189
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/PumpStream.php": "15192b83cabf910107b30bde59197618e524aece85f9d396dcd8459174fe50a1cb82de51e5225b8e6ea64fbeec7b4d94f035bba2ed893efebb660105021fc98d",
190
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Query.php": "8ace1f141c08396103431803ed35e1bf247fdf7f7c7b727ca63e58a1cfdd7e353a6c266c8a7bdbb863e5d290414ea630bbe37f55f275cc5a5b946b794ce01740",
191
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Request.php": "e0582b7b304fddcd81a214bd8ecd4db301479eddec3084b18b822f5e22fbc9d1fe3f3d2f6ba52959619dfbd0e98db304b2400e67675fca41f470ca6126085da2",
192
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Response.php": "32524250d58fba5c152472ed37160a9aba92c586c9b2a6bc55f97134e490636189bc8708fd8ca4145478a5bb20ea51b5bc417fa8d61ab08fab3479a04c4506e2",
193
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Rfc7230.php": "beb2f85fd643c3cdb3c92b401c4df1385bc6fcddf7dfbfbed88396611438720a1b86ecb9b913472ca8edf1bd9782a3692b2138195fb366ac1b8a7f1b0b81d390",
194
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/ServerRequest.php": "f3fead87c83ce2f73b2890ec79cc620f319c59ebc41a041e4b70b38bb1e412c928fd7ff0f10d96fffed841cdc1ef2874d5ddb0e7cfbbad3ffa81ce7484365c05",
195
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Stream.php": "7d108ed410ba89cad35637f837d97f7ef53c43a4666d0502e3e7dc4aad06e7bc365f311961d2bb8768faf9d9c6d64d09e080aa9bc65638084a127e7a563acbbb",
196
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/StreamDecoratorTrait.php": "e1b90e1d97a4a1ed1eb1552bcaa9011f79733167b7e5e3f2af8cfdc54adf0d64a414ed630ec74418020fd8ecc7c75e43db6bbe0fdb9ec6d3ea928bd3bb3f4561",
197
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/StreamWrapper.php": "7ed1833a91a1f56b743172192b7ce4399928b261eddba6bdcdde958bbeedeadcaadff4fe5b3913dad0e4b2cd9346f47b43849cc65bbdb839c9d9e4b586638eef",
198
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/UploadedFile.php": "a66f1119bd7327a19315456f17ac2d3ecb40e564705d41047a91a02b431efcde1eab2750b2f354fd2f5c10c1ec1b5968e84e758d51210f011dafa8df5fb35c0c",
199
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Uri.php": "fc5c81c97687dcd34ebd18c6714479eb6b4d1c7d58963bf7f1f732eae98a04b094dd9c99d58f4bff265b2faf0629a456c391ab5b96534c927420f51a95dda637",
200
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/UriNormalizer.php": "8992ef486358f43df4a9567a6a232ad76883d9c7cacdc94707343e5465c857a4385739f66d0024136df94c59e60a5ccbf1850634a55f2cc1f56adddc717434e0",
201
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/UriResolver.php": "46e4c0ed24579ad9a0cf467141fda7dce6dd3a3d3281a1606261f322462d1b19bca413f3c5590b7ad42fda1fc57e60ba86d121b5af0c5b5a2ea21bbdf07f44fa",
202
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Utils.php": "be75312627f929b2ac94cd6d12972816a13660a40d25cf87f6fc7fb7af416316ba8988656147a16becfa8120ce2a484c84d9f399b43dea2cd3c7ed916f7d8302",
203
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/functions.php": "f31604b89969730b482cd03a13b1356ff9b91324eeaa9ec45a45f86be2bd52a8209cec55aa878d5875a3c82fadd86848d558789d0072e853505d644f0a2603ab",
204
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/functions_include.php": "5b85d1438039f778c454f67bfd3ff2933d06b1aa4bbf9dc516e385bd36cd749f7001de6278c5a1b4e3c5a7d280876d4d35337f87a0dcc6e521ccc20a3ddad1bb",
205
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/AUTHORS.md": "bd202fc574c862a7c3d4a27653605b6fa377823744a793a7848ddaa7001166fd645d6047892d79c8488786d82fee785b87b19e9af1d04512503eb195bd300aad",
206
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/CHANGELOG.md": "ef87f930b797ba0b32dec670491e021b5c881f6986624c1906d8f910e8393b37e6d7f5eb9f860c1bb8447ce61a206bca80db4b2279c57bb064a28be3d83690fd",
207
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/Jenkinsfile": "98d95e7185d040e9aea6e75118ec17ac34e38e17f8ad5a38d869ea02c0c9de5dd79d208a78da23ccb87444df7b7de827b314469027ee7573cc51423521786320",
208
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/LICENSE.txt": "0974968907abaaf61b640ece98a502e3c677b7cf734ccc82cb522b3e166c50eaccb189b4d31b03bdfe8e61a97b3ce06917a7ff5c7c60887e2ae944f909fb6e72",
209
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/README.md": "ddaea1367057ed09023311b6ce37938985c188fbbcb6867c6c3ddfbdb984b954e42fd6450d1e5cfe10374ddc4448f9b96d6130d465983d634ddb3c0b01a276a4",
210
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/ci\/config.yml": "d50e43de2ba68261ae35625f8ce984903baffc3c6535d31a7fb3c5efddd08f71cf0ec3aaf22ee9e17e93852dd99284b653b343a053ba50a45cf6716033131e3f",
211
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/composer.json": "c6b4f35c928d33d62b48139a8be5d85868fdcd0716380865f8dbe0f5a708600ad7dffb3ba510a45bf4a8002f7e1fbefb1c835de7e3e2d9b7c1cbddf9fa2b565d",
212
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Examples\/JWT.php": "ee8052cfd45be4eac77df60902c518a14bf2df07ae7218322493a8e2d115280b87c65f9637ca766a63d82dce36c7c78e894984dc83031a9b7a8d5a6345d38214",
213
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Examples\/Phlo.php": "f9d6482c51987aaa3d7f0db59cd45030e17284262681866999309205161094d96a55a39dd2898d0b7980074d764e1bde6cb6ad1f50be8a40cc9d557431c1bf91",
214
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Examples\/SSML.php": "932a827eedcd81956c275529815a2f7542636b0cb887fcf182648e8f972006f6ba8ea4a763b3de48aac989f26a5e44752c7d3a62df256ee2b6a1c922de677e14",
215
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Authentication\/BasicAuth.php": "42c036c38225556834ad5cb916db0c4783c7127909053ef623e7f71aa51c9fc968b9523fe5dcdaebee769cecdb0c4c76215116cbf5959b268c8792fa96754531",
216
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/BaseClient.php": "029f2be5a3c7734b5030b4fa96e0d7c0c1252bb7b30b9f001a78abaa646d6d3821a127859e5d170ea5e3c7f5c86d06112f28152c5cb2315f94dbccd318f9e5e0",
217
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Exceptions\/PlivoAuthenticationException.php": "7ee7458999adea1ab1722358f669467cb35265eb616ef2eb16e6bc3d42a7f3c2fcb0b42655df8f4f21127bfecded765bcb479a6923dbf1a184e00f6e26321ab4",
218
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Exceptions\/PlivoNotFoundException.php": "bf54dd70534e988c27d5e7d17bf8edf9dc65191b77677d9ffbf95ae3bd019f1ba368065e82440e04f9a0d7045cd62b5915943273b5d8d72ba01676ebf2975edb",
219
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Exceptions\/PlivoRequestException.php": "6655a36e42e700283235b84889088e378bab6861ae98ea99c20bde017ed39b83dc743e5c166e8129b9910a434b119578b23523fdfd5e9e1dcf3d57c5cf9375ef",
220
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Exceptions\/PlivoResponseException.php": "4f18628f90b1c5142446f0e394d5071a91995baec240344a1afa47687ae463cdc3dd18a79008813077a3511c1b00dff7a8715d26990afcb6f9726598c96822f3",
221
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Exceptions\/PlivoRestException.php": "758babb40ea45fb50dafe5231605196214736f014860618af9ca7161157255cdf20c5b0bf534f6f6b30a4f9bf612b5ff5edd2f7adc45553ef12555354f82c15a",
222
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Exceptions\/PlivoServerException.php": "b2b8f6d1d03a720885ce5718b1c80bc75c7f483f72a1d2d2313b98a37e152ca78bb688f7923f025563517a52de7e915325cf86e463a2083c30ca2473446b91c6",
223
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Exceptions\/PlivoValidationException.php": "5faec3f351037d6affa710c10f733c57a7919cb04820f93ef0c19f75b2f2b2b8ae1a0d004c216673977539b713ca31475f233fdd21698a390319364d2b9a4ba3",
224
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Exceptions\/PlivoXMLException.php": "a66429863ac7caad7e0d77f7a1fc105fea0a45e7eecb753e64bfd5a76c89b5eb06e4228bd63a78134090774458a646e10a11417855d3e72b2a6fd75aa754c625",
225
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Http\/PlivoRequest.php": "3fa26ce55e1b201dbe78e4bf3615f8c38d9e6c4e96e5b3673f6cf7985bc4055b88f227677273189381bd29076ae5e8baba6c0cef4bd612f2ff8fbd2847b6c129",
226
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Http\/PlivoResponse.php": "3f9f1ce15ef75db2e028f198d1bb337c37f31fa6dc7e5b985ad589f6a4dd7d873e3dae968b80f5e1eb6056b4bd00e1a4df4d54242206861302f9d6263d177bbe",
227
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/HttpClients\/HttpClientsFactory.php": "a9fbd6c007260fc2169648c9c764ff7b5988af0874b21211f8e85e8a995897d597cbc0c9fce4ec5c8d60a901ea05c5a8cd70684c2302ea17bff528ac674ea578",
228
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/HttpClients\/PlivoGuzzleHttpClient.php": "dc661dc489b30bfa98e0d75f04147d164ad953e7dc51326a20fa94846fe30afff07ce92958c27a9bce9fd15371543852c0be4c24031cf382b54403a0901189ce",
229
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/HttpClients\/PlivoHttpClientInterface.php": "61a18efcb4383bea7598ad9167ffe49a73e295d2ed3229c015f9a5ea08b00362005df1388cf6846f1c331b123b187290a1651341c76ce2cd4233926c927b6e9c",
230
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/MessageClient.php": "f96e09d05b71a2e0b6675300132634f5664026bbb84472a1e7ca5f72b679390170ed5aa0d4e21a4dd1bc646cf0267f0f9240c931657f7cca9b2bdea501586d26",
231
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Account\/Account.php": "22bf526a376e6045fe9045ef4eaef52c769ceb8a7c3ef11902e66acdbb673fa521f70f446e6724155c8499cc700a6cf4f4d435ed06d81baab69f638cb15651ef",
232
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Account\/AccountInterface.php": "5093f51c3803de918f3a500f1754f47a3dbf990008804c07e543da253a22641b96ca2ae5faa7e6800cfa10a41f7d407e5d29e9907c0970a9183a8795be9f7543",
233
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Account\/Address\/Address.php": "7ba3e1e7e136d43989fa0449b29882d78fcea39cb764e54228c7a4a899d5ce4db2deae9d9ff9ed5cc53a8af72f98c55914c10be3dbb7b9a354b8a06e17cce829",
234
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Account\/Address\/AddressInterface.php": "36182073184f67cb024e0c020307d4d74c8b5c65e3ac7affcb76e189c91af9750c318404d8ba3a5a6e104d64459c59c80d7a944395796f0f5aaad18d43d93720",
235
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Application\/Application.php": "9431715557954e8ac1cc340f3f568a6eddd6e00a0ff0356154b2778b118f620d0afad3979e79eef0a583b313256fdd018516cc8128a441dc667b39668b6f506b",
236
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Application\/ApplicationCreateResponse.php": "cb1167e6057eb71e102d55ad2ac3cc2c7aa2a757b317cc97d8d08dc400548d4ac56379653583d53185ee8ab37c4dd189b66af011bc9a32baae55991922c41466",
237
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Application\/ApplicationInterface.php": "77af1063e341dacee15504837264b8140ffa3e8f537b9eb0b102e8f6d184deefab6a08ff7f771965c31d6c84333de9963b2e998bd0389bd0517479d5ee150d3f",
238
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Application\/ApplicationList.php": "0840ebcf3a0d9688cc68a82f11484339d8dadc9d1a50787ee11b3849a361a421f30417ad4322633c53633b4cf58ff7980de6ef87471fc88b16d090f127763450",
239
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Call\/Call.php": "8e0a3bd97abbb7b9d03e22a4eca6eac4989653c43facff064a374f6787698bcc91320352d105f66aa3f31cc0d70902c8cef0f9264062ec4bf4e5cba6d07549ec",
240
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Call\/CallCreateResponse.php": "a3a07958282fc5a6e7b99978427e2361e8828a63c06a940159a7fbb356ab9621a899e6e2a25c27d445fb92ac34b63d8e5a8b6f0782b7f20c7d9f4308306903ee",
241
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Call\/CallInterface.php": "9aa42eadb3b1c06c802d46f1a11b17acf59e0c78ae65b6c9039b4afd9fe53f171cd8023be738a359128afef545a6fddd43bc039d94b014d122e9714f9591ab71",
242
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Call\/CallList.php": "9883c38a74497c496cbf7c4a837051cb6bfa0ed0b9ca9298f8908e7195a000196f7c79b4846417c64af0aeddb6327e45ad4b36352a28e8300c977e21db0fbd0e",
243
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Call\/CallLive.php": "14fc226091078fd069998fe41625d086407e0c22455dde078284f9a3e8fb34fbcac0b75484c5350b437387dc203db7690d9fe1f02aeb09da2d5c57f7b2ffa651",
244
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Call\/CallQueued.php": "64552d83e5911b11202ae4a965bcd7c408643c446566c3d09aebb0bd02fac0dca41477988aae62e91bfb42913900f1eeae9d20693c6bc29651e2734b06cf18da",
245
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Call\/CallRecording.php": "d23438ea994b0ab936c3917d77ae9bb38bc9ca14dff4c5c120a0f583db46891af3bde1a8c3f55d15bacae99723e510184c14c60eb6d3d411d46aa90c5c8acfa8",
246
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/CallFeedback\/CallFeedbackCreateResponse.php": "cff0c47988bfee02787a2d73df6b3165749844c1a93b1fb91e87e80582bd28c8c7efe101fcd532bdab62886eadc6354924eea81278da5037ad9d3ee5d8dc8f29",
247
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/CallFeedback\/CallFeedbackInterface.php": "7860708568f488bd0832e626123f4bb5ab986fa5d54f305d4744503ceb4e919857b78a02b766e7241d324a77d86592f60f26d1ed78955f5550bd0fcc7bbabcab",
248
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Conference\/Conference.php": "8b97d6c9abee836cce410fa1216fdb5aa8a4df0c8543a75c2415bb31a5ee2d87531d5d162b218660a33cdc30539861cb09d85a780feab2d5321d0e8ce06194cc",
249
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Conference\/ConferenceInterface.php": "34f563cac4a75ca234e4517cb4678998461011440f30f9d81895adfdbb2e1960009114773ac30901dfbd2596d327554fd335057de66516b656f7a96446f4b06b",
250
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Conference\/ConferenceMember.php": "1a880200a2988394ed0436702f805ce60762be1774e1d156f38e45be39cc72203fd4f04411a521ceba8fa9647cb00f6d1bc6d94798b66f12175fc68d88c51dcb",
251
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Conference\/ConferenceRecording.php": "1c3239209726556971c2cccc812ce5bb5a3fc8c7a0e4f3ef520e037acde32d9659dea1dc5d3803e1f7cfd39e945a1680983bdeba8cf62459fc168f0df731adab",
252
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Endpoint\/Endpoint.php": "4c9a87fd6042a3eb486af5dc899d1e4c0948de5ebb1467cc85704030947e2588e79d23407ff662a21b097fb46a05925c3df29dd6e2a038555cf44844342cb206",
253
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Endpoint\/EndpointCreateReponse.php": "f77356f3ca29ef7163e47530004a5d79c1da73e922b17333a89512e39c7d3cc842b161d9dcbc745075f6a6c7ae27b7f7cf85f56a6d5bb796b87db4efbb8425ae",
254
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Endpoint\/EndpointInterface.php": "09914bc8e8eeca2812a4dc07469137011eec1dd77b99e3aefc8d5b8f4675b8f221bc54e37417f6c45b07896b84bed953f8c85831f9e7cc7b85b7293142b60fff",
255
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Lookup\/LookupInterface.php": "040b0a2c01ca3c0c02c2c8450b47e8d1847ab7158014ae161ce971e330712d14d389cd746a353707d2bd2667dc604e55c662af8eb15796cfc613f285e170ed15",
256
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Media\/Media.php": "72b83f02669ec7b942dd898a74c22e909cd9b058ea2e903e92ef4dd9e985305311d53c30a0c54a3f0c210433aeb7b8bd04a4b3a768c853aa73ee4dad9c621a56",
257
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Media\/MediaInterface.php": "1cda06754bd1ba503a8405561594f9d3cd5befee2cc6d9cee98542886c71601bd8744899e7ede346df6b90552f05a9eadeec4cb4d11fdab3269de88170cae961",
258
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Message\/Message.php": "54ae356246cc911258552001390f10f701929afa24801b2bc6cde72484c915e2e738a03d04aee90908003efb3b4b3cc8106f92d7ff87d2119e8a350f7aeab54e",
259
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Message\/MessageCreateResponse.php": "75495f459ecf577e2e0c2f8c075d569f36df80c5c828fd1d6b84a001de2c3d032add50b5ef08177d5c68014fccbc939c8ff89ce6c884ac0c1b64f4301d81cc5e",
260
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Message\/MessageInterface.php": "e96af121fd4a851e4c1f27297c602a5e6862e0ac54974aedb19248f017f2d98386ea9b495ef6cb775aacafa7b51b6117665c803356442786142c15e86066ef41",
261
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Message\/MessageList.php": "baacdb72ec116be9a14b8e7e55d6c40cfd8b04c5bd1b0d93d5c9919ccba2591105e03dee96effee29e95ab7b7e58e45569760ae825351c1891877dd96853254e",
262
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Number\/Number.php": "1bf8e1b1844ccced8d8068a80ae45b6904f59b0fa0e7d6a7c5b43adda906859ec11d709a501f560aac3f8315176e9260ba4796aa9cbbd637431ec94f0ec0c668",
263
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Number\/NumberInterface.php": "e633bf2e705735759f6e27f9e747e3e05e839484b57672e2da405b7e2d8615653fa828f8295a442d13f5b64645fd009ba6cd923f0c163f2070710c7df57a1a70",
264
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/ConferenceBridge\/ConferenceBridge.php": "3da97309ccefdb15596bab5180d386e2a78cf938823225820f5b206d8d8f366209dcf96bd139cd0364729c8b733612ae067d03e1e29aef472c4dc82527d3002f",
265
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/ConferenceBridge\/ConferenceBridgeMember.php": "9ee728dc1f37fc183fd4890ca5d213bb1f47899d2379a16009de7ae32b75b459444a1a329357faff349909ee89843ac5798c75699fb2b8d939501f61dc09b564",
266
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/MultiiPartyCall\/MultiPartyCall.php": "d13d863ee416714a697600882f33b88a8bc9de8d5603149fa199f787d7d904d55aaa6646cfdb3d71caa99e4e95d7e352199e8b54230d3c64cfb81924f1b603f9",
267
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/MultiiPartyCall\/MultiPartyCallMember.php": "6e8f1c6a1177d0c933352bc2d8bd54c989db7679f2feb893f430e9e634c446d033d01a82ea740185b1926734f285facdb3d99b18ffcefe83be723fc08b50fc12",
268
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/Node\/NodeClass.php": "b8a08dfe16a42c08ea66d141b3b4471caffd2bbf89fa4b360a1b16a7072ea29d538792c16b93f1e3f1a1a01d564acf1a40906c32482c4cef0ef42f1647e483d8",
269
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/Node\/NodeMember.php": "e13f76753f278f07e8778f1d0ad64c9ff401633423ab2476700ad0711ea5534f7caa871b5e10fbb26096feca64471205082f9ba45de607e7ce71eccda0e7db91",
270
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/Phlo.php": "da8e7b69e9290d876b6ebe6778c09ab68f47f13cb22438ac92d6eb880b7fe72ffcc68c681cbb9be074e36f3ce4afefc69680e7a3493d3046a04ca9ec432d7a99",
271
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/PhloRestClient.php": "5f3b9bb5e3f7dd96572f1dc71531caeb0b14b21ba7c291561c1ebb040c3ded22bfc0dbd9030843cfeda8b4f83e69d86ed9db2b3b7d0cc8b311ec64000f3b935c",
272
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/Phlorunner.php": "c1f3764aa4a4c14a33614bc7cdaa05043d268b24f88cb2312bec3596e5e7e5286e9d0429edb8583b640723784b28ebf69df691d5e4ec53b7d7912252832c3ed9",
273
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PhoneNumber\/PhoneNumber.php": "57bb602a9f511dd39c7143c50a9ca6537bd83f398eeb6f198feec689877a9a423d9cfb0645c4d20eaf30490ae6b6ebb91fbf1d00ce633a2007333ddd6273b032",
274
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PhoneNumber\/PhoneNumberBuyResponse.php": "6929f9a7447425d76afae60b91de8d6a5a42a1e7864871dc73a40199181d5af8be9f645185ce1e796e75440d138cd0f69ef86ef404879d74b58107ce32824b6b",
275
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PhoneNumber\/PhoneNumberInterface.php": "3720a8056618a019c64de2e4e05e99e0b30cf48de07117e75172b8ba02f2b2c60a1e0b12c3cc07b3f5ba8aeee2e747c3eed43b5bf589c29c7236b47b5ce75747",
276
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Powerpack\/Numberpool.php": "a774de315b1d34a61c9b9af9b21b8fd1f624b48bcdbc7ed1302ed25cc21093e05ce1533c0ce4788ad36ab28792878321a99b941cf9e1a8ec7fa2f2ab1d16f872",
277
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Powerpack\/Numbers.php": "f62f6534b223fa353f2363e38fb1069c3d10544a4cae2efeaff30019c0cfec7de2b4b9f551cfc16bf26fa1dfb916f6d916f9cd1d1357f8cf6f7cc84815812237",
278
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Powerpack\/Powerpack.php": "895da995fc1445bb6f7458c3904c918d8ba8e8db75e94e558f04ab8355058bf82d881d7c282fd8e03acf723c232f3081733a9ace2bef1da42c3e9f4de452d2cb",
279
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Powerpack\/PowerpackInterface.php": "e09a8e4e67ece27935a81730b7587bf29afe72ff9aac57b6c0efa6fdbc4b7cf4c91d60bdcc506a2c0b86f7a4cf7df70c38135e295504417d39024a4671b3cd33",
280
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Powerpack\/Shortcode.php": "afd1a0a277918a55fabfc2b46460ab6a8740ac68e1d7b9a0180d88229d7a93269305765fdc362c02cc2996ff7c3d8c95417bc90bb74e44f9c2cf12f023f45b08",
281
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Powerpack\/Tollfree.php": "0c63aaf33046375a8d7c0f9c7c092ca1041f553b1987ad5e2944630dd23f865785e06205b0711c215468630455d8c2264c0b141fee5cbdb4bf9430e6ef90527d",
282
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/Inbound.php": "285fd073a2fbf84c533af3c0e60b369689592882364413a1879691a025655bf4bdc40831d13d96c59ec7a8827233e92d478c14d1d648df885c75fbe3d054351b",
283
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/Local.php": "5140df58e671179a4edbfa82fcb7b7277e440706406200255ade35177e9a715c3340f5920c4a57c351b6e222f7bb1ef20b207d0830c487bd14b9fa713d3d8c4f",
284
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/Message.php": "ae4e8bbe3a668748ba57bfa571cabcd97932d6cb7a8a63ea04689863ccf75a63e0aa867fad60c39e263cc685521a8465b46f730014933dcdc941ebf152fc437b",
285
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/Outbound.php": "7656989e6b1da4e4887f8443304e422ad2aa01c9c05aea5b5245b4f3edc333935be4f573fc5105e13cf03ba6ed0ee0ea323cc76c833846bc5cfa01f3a0f33763",
286
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/OutboundNetwork.php": "900ae54c0c0aa0f85af4f02da252a34907999bcd311e9e39ef8d8e27a16fc6c8bbde5d5f6460af6b8e68cf584419ccd7fbc4de177cb827cabb5ae9b2c896494e",
287
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/PhoneNumbers.php": "cb51001dfd504ac52dfd39e2a0fcd01686de42e78464c76767f99fbc7884cc2d6e304cedd72e66dde42852f72cd833dc49dc1e92fe1487b2682648432e7979fa",
288
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/Pricing.php": "5d197bd5eef109ba3d877f6de48f8567f135466adf1d811d32908d8d4fa7c8961592733d6bdbaa4f646c3d25a31c8098768dff183d192617b2c1726e8f41c447",
289
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/PricingInterface.php": "dc940fc2f0338348b06fefb22caa65b98fbfd37063621fb4e4f1e23c5dfe21149e2e648c1a32b09012b34c5bd622fe28126bd33ba1255c6ae3c370dabce6ee97",
290
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/Tollfree.php": "ad733c0d904ecfd646e79a3b6bb3ade270f99df5e6353bd6c8695322a71238fae107a55d33167063dc2e4b1b905273bb0631f051d06cbfcf5d01c94e9252fbdb",
291
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/Voice.php": "ab645548152bfd840951e981c0d18aad23d613afefd4453af077a6055f902d6bea6a0bcc805288f130da6686d8419913e86422cae35b57c1087eea3371b7e799",
292
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Recording\/Recording.php": "def8da050e24afea59514b4fda360ecd1d80a49df2013b258e3d78304d6eb2ccbe21ff1ac50a851079234a1460d0f2750da8fb59c9ff184e8ba1f1becdfffe6c",
293
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Recording\/RecordingInterface.php": "1953832ff8be0a6801f306632f3ca3bc46f067d08662b8ca6d53e29d53507a48750bdd891d2d0164c029f675b8c4c1dfa6765c9abf328578838b428dcea22615",
294
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Resource.php": "b8a8f583217c43c3eceedcb8f047efa1569bfe5f440fcf4f252f1a8402f484e18abff63229521f89697c1f7df21a2ff919488fcd9df42b5aaf7a160a50f0c62a",
295
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/ResourceInterface.php": "85bde5b0479b85aefa79139d36192ac334e3deb3a07353b7b1b0cea1180a050a92dcb563ef4a968b6436f60ac990fc5c1322ba3ee6f4ffd41d2997d604653b6b",
296
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/ResourceList.php": "71fc010407c57d77f5b31105f6e645d04347d961c3c81eef6cacc7b8dd475d86bd228c5ea5dd5976ce34d025b0753083b5361a47cde5d5daf0507678762106fe",
297
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/ResponseDelete.php": "3acf13bc2797c0ed58c78abac46ae2822a67b9c9194b3c9864738516847618c0033fe12c5a62d9dcb7d110ffd4264c534fded370d04a2960a2da32059fecaa8e",
298
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/ResponseUpdate.php": "4db3ee43405d0a456dbc23801c2c0d71676c3f88ac7c4161395ad275e7fd0dc6b53aee99a882706da4f14fc6c35844d54143a7fa3b6597a5a25d59ed67e0e6bc",
299
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/SubAccount\/SubAccount.php": "b39e628ab06827320f3dcb47d3ea55d459af1a133430e8e51e8e6aed5216c31b54498c836cfd2a5c5f2d9cda4bcac03ac476bd8ae81c3ee2c7865ddfcd359dfb",
300
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/SubAccount\/SubAccountCreateResponse.php": "3b92a7ef8da848a7a5d7b79436ae557657e97141ecb2bad076e69d495d78f94f6e9c68464dd7e790d64dc563428e4567a1baf96df1f8bc97cfdcb946e60e94ce",
301
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/SubAccount\/SubAccountInterface.php": "a4cec509ce127faf30261cf75555a2905c6e551223b4b90949251f0822dc20d7b97efadbcb6bb189cc9302acffed8106ceab79628a7531c161f4f713d6a26c4e",
302
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/SubAccount\/SubAccountList.php": "228e0fc0fc27fb523c9d2d9e62de77a5deb3bb2a29c10d91d7c59b6cf36b3e12b8b1935a69fb0ceda72c4008b2a04436e6aa3f84740edf265d0f647eed7c52d4",
303
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/RestClient.php": "91f01799f98c6d65e1a0a8025668fb0c9f5fa4b77d44e86790b34599c2b9045cbce2cb3a5dcd93a1fa8523cb688d9f2b895d7d5f2377f64f2e33ce68e621dd82",
304
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Util\/ArrayOperations.php": "04a84eb09d1ba33c3414dfc74d1c4b31c3149dc8e3a038912be632673a92e693da8e531a987c5ce747aa11fe01bf65bc05ac91924ccbb8f157c15c62f8ce9694",
305
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Util\/jwt.php": "61ef00cfe10afee4047149729431595a9e21d44b25de3e8808014312a869110bc22898552fd9216cda6906c91de2b3ef9d723ff0d4e18020d1b7f5d1050fe810",
306
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Util\/signatureValidation.php": "2bf40afd282bd8711459cff1b366510ea253508349adca2f64ad101b6c4e3e20bf405194b9e421ea7cad5b738716624127969de5497e16e3647872e0b3bfc6a6",
307
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Util\/v3SignatureValidation.php": "d70083f5ecd20fc41035462a2a27e04a9367d9b7b13e6bad5579dde4556ff187b8ecdfa17b2c07a0fcf88cce0141baf7dccfaad85a17aa2fd1a7afe7998d1037",
308
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Version.php": "365ed59af02f30183af840aafe55b67b682919cbb3d662f860baf1defaede8a67fccc5a7f087209494239466f356fc83f612faa02f9f03a301f5ffc66b52bd09",
309
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Break.php": "89a669d486a72465efc2c6128deb6760dd86c9fb69cd8c0f57c209d10eb74067efb50bc6f0e68e2d1c9c2f39862ef3fa03a35c65b7395aea6ca963a013869658",
310
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Conference.php": "bf673327e263996b05a0b45e323168e3d44b27a65efb8a8acb0eccb0276360c1a0391f08edc34ac617aa079c6c2b1f45eba6142446a7ae2286e23f337819caef",
311
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Cont.php": "45ed9435166f1b72dc5ee98afaf3547ae646d16d41677ce5409a6005ccb9ff23743e4c528385a1e0a8f5570eb7ec9374433f609bb8cdcbdfe756842f1005c52f",
312
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/DTMF.php": "14c619e3f01d6dee2dbbe9b718c6c64458a97bf70ae333455aa45c9cce91e4bab693f5265de0099c9cef2334a5310bb85e3374c5f0cde9b93c3051cdf5b57a4f",
313
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Dial.php": "5370d1f1a1ca8420560fa204d295558ba9aeb626fb7149ee06e12acf7f4b7d079307f329f91594e138847a2b3dd9e3f3e9a9e6e774a3c1095c3201ab249e9c03",
314
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Element.php": "4913c3c78365a85eb5c90aa721b0e1cf535c00d5815f509e336ce635cf47a9d9aed1346ff0cbc875eabae65190be2875d0820312a6a5c90c6df3acfa23bc80c0",
315
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Emphasis.php": "d6fda7993f909d3a1a50441ef74003811252d68a33ec2da63d3551236a005952d3b6c7e2bcdf5d9c85d33bee2a9255dbc2b95988cbe0e115b42eeb667d58ca38",
316
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/GetDigits.php": "e41a4e05fd55fec82a24cb2a545db122000251abc0986715a4d5866dc64604ac340c59cf0a30a35ffeeaf17713eed730a7705f32aa20aa3b14ffea368cdddfe2",
317
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/GetInput.php": "cb11a5e0311d3b8938f7d94462d24c5d4b8a2ea4d733943253ffcf36aaa648cd3a4337d732799f382526e0e2b2059dd1489e9ac7fc5ae478eb1db07b3830a711",
318
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Hangup.php": "6a7ac35846ffaf61d8de286929bdce05974799b26b17f4d61e68b6f740cff49bc4a0b72899d1150ae03d72e4f8c4dc7cac491872e76be0aec6b1a665446a9226",
319
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Lang.php": "c16c3db519373df61712fb1748f91785d79ba0fcd7e85a32cff1d17ae89768cbc10b3c4cbceab380fa9762cc1b6948d8fa56054d78185f8c9c1d6c60a012f527",
320
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Message.php": "541a76d5dc1e25633d7bf67c83d1fa123820296b4755e7e48aca094040ba0c2acc6215eb29176551516941b8e8225e6084fbf89892893557e12f678cbe2abb86",
321
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Number.php": "82569de717d895eca9c4270a3fc48022e666e59e6d6c74dffe4982a8db1f6031d80c51863226c750cef5db111f0de940878baaafb352153bd0d053f716c43fe2",
322
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/P.php": "d8bc0f70c13af91549bf4c37ce4c95b6683590ac9c9a3006bf2a4dc02d85ea63a33d0d8fce4a6465f25e0f86b35994d98e7bf75c07e30737305a7f2707ceb444",
323
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Phoneme.php": "9bce52123dcc7451f21ecb2e155884479b7530715d78d175cd616da86198151481632af22cfc19f9c70a4cf0f29f3262f335982fc9988e4aa3a435cd74f14c59",
324
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Play.php": "9b25a9f3a6149ad856c4aa008c405192bf2804432d83d3a572cf066dbb151b8298272b0a9185bb26a5faa51c03d069aed172ddb135d4dff3fb99af9fe982ded5",
325
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/PlivoXML.php": "03c37815022f4b4e7ea917f69b5516c3bb5499e68b65ed1b50f7427d9827de1e84037745d25b420c1f81ab829f51ae752b126943005c82b06a668c8ff895e923",
326
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/PreAnswer.php": "f66f22bedaae6dce341d650d5ded5007d867361c570162a642e0a15f5fd6e90b49a4c8fac2d3a1cb5fea446c75e30834a1106a3acd1ac02a87b5a7df7c1d5af2",
327
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Prosody.php": "12c8b634b226bad4ec0a7dea7b8249959943bc5ab0e71f75fd42afbf6d1413834563c38430e9348bde2cdf1059f266a2ef59fb7a8f6187ecec135ee9d5dede4b",
328
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Record.php": "070470af5650220e0556baa6b109684e1abceb6e80af620ec750f0c691824249121e1c6aef6cc1c91bebb45b76ea9db24f9cadbdbab8857b367ba2521d1cd001",
329
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Redirect.php": "34e09e0b208c4dde1c4b53c451b09f23985c8f74737e73f4675053494cfc81b14920afd6620ff161877c4e1b7b6e7381cf3f824a2b06508d84299aa4e0e45690",
330
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Response.php": "8db3a9e823e3c11b8377829c783d93f0b7cf98afc6d837e514803b478a7887d6602bae6efac9dae6a2e7683d8409c23f78c463185754fd7916845aec23e42c58",
331
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/S.php": "d0dc3f3bcc818d107fd8e4be38718587edf610e3f840d7e6763ce8fef51a1e96de3b49076995802aac9edc7d8a976ef024a1d45ef634599a56d13c56a8ba73de",
332
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/SayAs.php": "46c8fff6a9dbb36df1bb14d0c4247569e00ce77b37730d7f8fe6fc4a404a632ae70e48c774f40c4ac0e19b10ecca7c09686c7d5a6fc7d5311edcba657177b6db",
333
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Speak.php": "d18aafc18ac404a85d18627ddc66d2810ba1061f8e0d3d3634d5f5258b239a139649a8cf479367dc026929010288a291aa1144aec2415a2de6083040b8a4a96f",
334
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Sub.php": "9d34d26e76074e65fc01a3a477ac176027b1ceb5dca2fff450111bd2cfc0027c7f7338777b494728ae2617a27075888ea699d4226b60049c4fec633d42cff8d5",
335
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/User.php": "2dab0ac6bb38d9216c1b39b81ce20f1a2af1d385c90ea13aa566176eeb288f8ce80e11048209abf8c38151207137cc86b754b7784cc478dcfa1f567fcf929520",
336
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/W.php": "798d6f10e6d07a54b29916216dbb2382f25bbf2f96e15906f842cd2ae4aee22b8f3e56535264b1da6d40835d5b9da6a9f4346303f7602c9562587b29fa419f3b",
337
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Wait.php": "99e6e66fb4d2a81f0419ac823be64ea8c81e6ffc8313934b41d6189519d053b54b5e95dbc7b869dc979b72b551b5654dcd6eef0540c3b01eb900716e97d52dd9",
338
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/BaseTestCase.php": "662140921fab3f1e7be65bef2d063673900eb3c41de8ddf68320de194e254ec3fbba3322790812c258698af81da35277cbdfc0d2fc957fd5f68956e7db2ceac2",
339
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/accountGetResponse.json": "1ee7d7e260e8678fa70fa47206ac7c4645e9d698da7017ab05fb56266710e34bce48b19d3c65541a084be28cfe918e81fd52073064071daba77355af2eddbbf2",
340
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/accountModifyResponse.json": "ef0e777d38b4605ab58d951f26e975566b61a26ebe5710b9c8c7588aae799c68cf76dc5860f44aaa666864f3fc1f74185b5eba888c1dfa8c2004fb8baf6d859a",
341
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/applicationCreateResponse.json": "19336630707d50a021e3dd3cbcd8a229f9f6123211e27fdba211494bc40e9b9fc5573ef328806bf00b937106e7c894ef96a98080f6003d91cdec67f50196849d",
342
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/applicationGetResponse.json": "26a3aee28fa9219455b0c7a54d47eaf1ee7e9fb526185d1598d5611246c1ad7b0cb1abb05b12d21189463955e25d2da906cf5b04f1bd4c3b826d44de47c0d56d",
343
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/applicationListResponse.json": "b363791ef3276030677b53f555a42deb02a9873cb5b21e17aee9176d425ed38c562da7fc162cf5771f0bd259b46d615ded3799f34f6fef590e2df97180ebd228",
344
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/applicationModifyResponse.json": "742b49b7f428a281b1189fd5f23811931f2d6c71fa271ead086b6acfac63bafed22b86f2e460fcea35d8bdd46786c5db83707f35c7a855efbb92e51ec01a4859",
345
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/break.xml": "6707a46a4316a9f23104a23e4ce9c79f8b4f969639c08f5196a9aa94ba3abd4a1972a29d6131e563a685732e8cb0a4fc90a76f2d0ff5b72637fba2f974abecd3",
346
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/callCreateResponse.json": "513446e1e7fb97b30b86dad2119bc9fe73e70f01f4976ac40e57e41e7d96a2faf978fc72fe2ff49e3326fdef8e17cb4da24bf665be81089aad1232716e42e114",
347
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/callGetResponse.json": "2958c05e7fe02f5f6f2f8834b34050599df05c6f5751fde2fb038853383683e78b2b33b9534bf8da38770173e08ea9c7015d7b2d4f270efddcaedffd77ce661a",
348
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/callListResponse.json": "b2b35a27aaff76dafc6f5a42b6ff515e56ea9d7c196670613b97c2b4c0b7f2dfc3ba7ca705b2618f3851e1db554268018c7c2bb658e94b66493576048c54ab49",
349
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/callUpdateResponse.json": "06be7ca7ccaf82f24f23e8c33382d372ba639662283023a9b6ef555fa24d273efd845ab27fd423dd4267d66a8df24604f96113aa3bb8f8dcfa49e713f3d71bbf",
350
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceDeleteAllResponse.json": "6722c7663c8877f4bd5d417638d5a0fde3db7cd2ba1880dc66a7ce9ad25a14de60b4942d84647cc21c0b12211227161349109162ef3eafc2a9607c2645d3c93a",
351
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceDeleteResponse.json": "9a8baf62bab7971a89490d637633a3d498d4442bb11ca29486d21a3dde432ca6c0cb36d236bbc94859efac83b2e56d33442a13a4395f4b026dfece2103ca790d",
352
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceGetResponse.json": "950fb7d6e6e120ce670da43937ab4ce9e7a7df5296848cb52261f5f854bd89d47f26d76f89929adc59bdadbc8d0e77de79f29edc5d6e6b4b73aff1a0c126bd43",
353
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceListResponse.json": "9f5635d9e0988b03c2bffa8457962cb6870a39d4354ec6c065b58949850b188d2829fcd3db1761ec42a4bed30ee3704b6c353d2b9372742cd6d8b00bff273dc3",
354
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceMemberDeafCreateResponse.json": "b39ae8d7a1de7d5732afdc00da955a91850b855f6463b143b5837023dd8281b450fa79635a3fc729b5b198c6af5cb57f9c6797c8eb56daf72b7c7131196fb4da",
355
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceMemberDeleteResponse.json": "ec18404f82674de8b7ca25eaf95074cefef51b13b038de14dc9ed5f2664c6e6c5c87d3f7a08eeab3926869e171ac26d1647ba1cca03253085a194cb0fbe16975",
356
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceMemberKickCreateResponse.json": "9f924beac462c4ad9f42a705f7bfde5aafe5e73563b07e98ac9db42e95d3c657f5c4ba0d6ea64b01e2e061563fec41d53f8ae8fbd7f5e08857a903c948019e1c",
357
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceMemberMuteCreateResponse.json": "c3f1c38b6c8295b28d531c446199454fd7422d00e3cf71fdd318a821edca4afba444f8cea38175c0853b34dcda5dcc2c6317a9f3103e16474fb36c43241a52de",
358
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceMemberPlayCreateResponse.json": "ac345d15512ca5debe0a20092d8a4bba1f725a581799a632bbdccea771f1b6094b6df3362120a29c1d9109cd8ca8857447c3be08436fa94a5a4304725b75ef4d",
359
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceMemberPlayDeleteResponse.json": "10b6ab89ba98b9d6d08dba8637971ca9260757c318a4842521c7d2bb2a1b967498453aee4cef6fd964cf2e614c25364f543412a0a88b877154b3faa9f18ab3ca",
360
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceMemberSpeakCreateResponse.json": "b2b01526d4838a72c816ad9c6ca7f9cb473a89818d4444b48aefc269d0173fc9eeed1e2473667517280c18315d67a548f41937ab4b7d26f2edd4d0e13486aff7",
361
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceMemberSpeakDeleteResponse.json": "d42658e98680911d21be32033be208b53071e3ee2c514a86809ef4d06cc138ca0a74d9b2e546c54b51c66f3aa891cf0ba3b4db9a6a07e7f06ed37bfb39ef3a6f",
362
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceRecordCreateResponse.json": "c9d8570ab20fea79181b1416cdc44b8e9f8b18b06ad446a0929ecbec53a6bb3d66ddc8609a2baff92d8ddf9bb68b802ac4eb3d62e958d2cdc1485711a6286ed8",
363
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/contSpeak.xml": "1115d194144f96d3b4ba895d45268e346e7e56bd308b4b7c58bf62712380908bb71d5250323bfa6d13b8d25e64a86580437f7ac1f2c63896965e3c13909c240d",
364
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/defaultSpeak.xml": "2449ff96f102465168a4551ddac6ff85bc680370b423d46ee10b345c128755560e0bf48c070081e8045839503450c0f8b443fe0b33b455410ad5dfd639a6adb0",
365
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/emphasisSpeak.xml": "1ae7422578c6921013c5dd65650f0c1efa50512824b429334cc150ee6872dd2a7981a125b07a8023e360d8a881a32333de24f1b595c95a339507dfb29732af83",
366
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/endpointCreateResponse.json": "e0cd43507839270c51117e48fdf3158e67662c1bdf9c8c964b57a13c15517ab7c83483855764b763f63bfee011bb893c20eca7e7a0b3b8872bbb1f26228ed720",
367
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/endpointGetResponse.json": "05359131cc3ed432c1b29f3766d019be556f58e5e7f7b502d866d0057c04917ad7011bea5afd7ca8f2814dc75c45a52930d48464f7fd740ae94b45d0a07d3627",
368
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/endpointListResponse.json": "d6488ec5e6277af9a34629d901a211e37c9a522107f84ea77f861c417345ddfa409d7de389ae69b719997600a0495289bcde64791ef07c257f75bdef4fa8006e",
369
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/endpointUpdateResponse.json": "3f20870d3ef78c57407bd42cd424775a7014473d891020bfc41fd78c9187acc3d7fc2a2d7a137eb5bf9e8741525db9aec853889b11d2d3ff508f7fb16a4bfc88",
370
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/langSpeak.xml": "1eb16f6028ee00a12e677560ec9b3ca4921deb2d6da15b3686c43f506e9a13ab0cf811d71e942e1f225989f3a486ee39b4949d17d8692ac0a50574845491cc8f",
371
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/liveCallDtmfCreateResponse.json": "f30ceb762f24445068ff4a688935a84cb64840310bd518806c1259ec26fd60da6a8be9f11c9c0882d08c857058944cf1c69c95035517716dba322a1a865435f2",
372
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/liveCallGetResponse.json": "339633aa5d9cd2aea4a86dc48dd8c63ea8c0c56d5cc0f4513bcd2d66df425ce4b74b246a8c39d6cb0dcde75a8c01d4ec8347e69342649ac27599a79a72fafd9e",
373
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/liveCallListGetResponse.json": "7e8efa8df76422d6a9bb0133c81d96b9ed932f7f529644a109b35e9f8f301b3a548e8e7f6a9213e301f25e914b98c3855160ca7e0d6f0283e947cd6fc95c5ed8",
374
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/liveCallPlayCreateResponse.json": "4cf2ddd4f3087fdcdf772219c5ed84ffe1dc027208540059bc532961b6c4cad382bce98dec481e0245c99e288c9523e8f33ae7c3c35316c8130f49f81db40604",
375
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/liveCallRecordCreateResponse.json": "02f2c4c88fc63e5585f6e5988d5f615488507a7d7eba442430753a60f0cc2763c38abf905042c9ae0f7d017dc50caf67f269267972b5a7fdd4fe7675572589a6",
376
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/liveCallSpeakCreateResponse.json": "ef69736cd0199704894c2fd938e4f84768b09a6b9d2f334ef0a83b1750db0bf0eab538471fead4397b49ffa8e86011da111e867d5d8b3532bf3f4250958d6146",
377
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/liveCallSpeakDeleteResponse.json": "63a9fda757cfbe1a338c42f19532609e8607f3c2c8a317ec8e5aa2a164b0e9f9a652129bbf7fbf9fe05c38a0f68138ba10b4d256f48dda1fa292c18f2b717d3b",
378
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/lookupGetResponse.json": "6b2dd461ce651012160ed88d092de0859ff1cc132c57091a1064b5745b83cd6e5144e8204b6810da7bb675eca802fff54fa298f03be6ef858c59058acd24e640",
379
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/mediaGetResponse.json": "251c9d7226411a160031776b1c7039d7e7f3d715ad7bb89131353611a2509a570656b8e29577e505102cf588ba50cab34b3b74351dd33e2a99333676d48b7aaf",
380
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/mediaListResponse.json": "1512baf046701056ae6b5ef06a1e6405cd62a27d4b82f5b38ed2b2ef6faddfd147b6d57074d04d77cc14325d50d7908c0446acd4a5a0355e9dd9316f80b0f448",
381
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/mediaResponse.json": "329e01ec90033528ca170704dc7a3de8f5d004a609fda5abaee4ad610b1559464a97b423ca27248f49fa3696f12ce6c1b3ef69ba198ae57877927ff78257231f",
382
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/messageGetResponse.json": "10494dc350e9a659083f44802a899a893e67fd82acdc506210c827642e27bb4ca1fca7c00a73a7aa20900ead392b9983ae719c6a9aaeeb0ff9f9b9e02539ca4b",
383
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/messageListResponse.json": "5751782fdb135ac45cec47687b7bcb10d4e2c4c8ae88461baca0eb6f0f81b8144aca9b610cc6ef7f3cffd4b5dc2ddac08247e74608166d147bafb1a9ecd4b834",
384
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/messageSendResponse.json": "ae5ef8b7e2a5db03fc5c04e96cef35b3f819f1670cce72e0e729b57de018bd6ffc254e00f20fa7c662eea100f78bb1824f0080275ac270f7e1229566683fc62a",
385
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/mmsmediaListResponse.json": "fa4d1e3885b6c84d72c9f9a4a414de7d1ae1d574db325cd773600c7a17f83fcbe2a84c0daa8fc690d5f5d95431b1ffe5097c17279593ccb4155d5f99b1a853c6",
386
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/numberCreateResponse.json": "e7acbc2aac3a716dd50e27de2e8937e27fe70da7dfcce17561f4d81a2de53e8cdfb5a695255e1ac65c8c49e4b894722e7ecc9297b9d040dadff97d1cb61ea414",
387
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/numberGetResponse.json": "261a85df87eb4ebd1d310575e8f33d94f74c30f5ba3aef1ed47654f7569ebe4310019c5dd317a8c6e2b015a1ac3f72455118e0878d688817580b18b747d6dda4",
388
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/numberListResponse.json": "134543e58c07917a79e0498e85466b9cbb1c97a0e3087473463419bc6c178bc278ca75e148f885eead7f6b1074063256fa61745c57a0dec4ac060c4b03afc499",
389
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/numberUpdateResponse.json": "e7acbc2aac3a716dd50e27de2e8937e27fe70da7dfcce17561f4d81a2de53e8cdfb5a695255e1ac65c8c49e4b894722e7ecc9297b9d040dadff97d1cb61ea414",
390
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/numberpoolListResponse.json": "961fe25a8fe8c35dee1b0608a24d741b6ab91f2104a9f2af2080279d6cbe4e631416d7b3d8e3772715e376a603cb740d652435a0f2d7971e64e00eb44e7cd518",
391
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/numberpoolResponse.json": "c725314dd96d000028683c175528d15657c046cb421add91a927472c235ae5c1ee1aab060aa0eec56b6c717138623684f827a2de50bdbec1017e7bff937b437f",
392
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/pSpeak.xml": "1e49af0752b825db21fc50126642fde3f39dd8b63cec3db00c3df92ca38935d58b8752ad14928278b98ef23421d0926d624b6aae948f9473398d25e2d087b963",
393
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/paramBreak.xml": "1202da39615a87758a5fd85096a4d98f6c2726d705ef0b1086cfc66cd0f456b15e3f79d9850e1bb8b99e9114e41b3ca19ee4fd269a42c002c205de005c72ceef",
394
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/phoneNumberCreateResponse.json": "a1dd38958ee69b5036aaa1c86cc730802dc2d7612eb1de9266f9a6651f6f067cf9a42d44c736bf85d1f40048f01f99fa05ccb3fb26baf3875e3bea98fbb9bbd8",
395
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/phoneNumberListResponse.json": "f2c263fdf122dfcf98289f6cd9276cd8c22fe4ff5bffca19b3509800d07909664e9ddfa3e145da04c06dfc6c5227a39868d17ca947e55b65a9cb18a6faadfe57",
396
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/phonemeSpeak.xml": "30620187252e4a92154e06e611a2cda1ca881a0d85b1c6c36e3c713734c0be9ce79bb9ad38a11e040cff437c5676c01638eecbacc5b50a20e0adb506565a9475",
397
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/powerpackDeleteResponse.json": "f170bba1b0b6bb42c88bc74353ea4db09b82f07f5a2166f693d0579e5b7d6beacb8cf11e39cff546345333b14752456212584e284c2c360cc673d009fd2aa018",
398
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/powerpackListResponse.json": "0cf4f36945bf4f73377a6688f99bb3efb0c35924ca9278bd777ecd0081c3f667d45de4a34f7101588b7a7b3b20179d18a393dcc468ed88df8eb53b5e2463d7c1",
399
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/powerpackResponse.json": "4318b75a2ac1642f6ee33fc62f18765a5142aa52e0353082a9d38cbc7660e40f24e1665a59c723ba90ba9a86edb4cd4a396bb9a0c00cebf6d5944e0ba84e7919",
400
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/pricingGetResponse.json": "25a616f338c147cb22228535abafa9c1439f663230d1fc5109af24f4f11a637c5d0cfdbfbf3b2762b87d0b4693f14223254e431f3b8ab1f518b32ea884e2d1fd",
401
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/prosodySpeak.xml": "0529a04b9ebbfc245e7d50bce1177e3eea9f0f6ede900e9fd3a447f86078ca86fe8c9911fad4645494cc784394194c5e6b63141a2a9125a1ecdde2cbe8bd7c86",
402
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/recordingGetResponse.json": "bdf9cd97b6c687685b9c37a0921bcba910dfc811abe416be7b17fefbf857c3ee1233e987570eb444d168edd660c26acb55377f60b8aa0a898f0c9af1743edc81",
403
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/recordingListResponse.json": "2d831eb418cd0de8a0d63da8a2ed133005a3e15e4e021c3451a737c45f42e5753ca5143204acf2f8bdf6ee91cf1ee8b04ee960f942ae0e62bfc3583ab44a1dbb",
404
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/sSpeak.xml": "b81f50357fb60ad968d8e949aed15c7544abed0a45c26c5bdcd4b166fa1d9bf74f57137fcfd378fec345e1fb2281ac38c30b2a3150cc6fcdc13581ea29379796",
405
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/sayAsSpeak.xml": "84e2d4a310c8d1fccc5be4be4cab026e1dde129ed2e18ab4fedcd50512cee91a52cf437606cc936c474cbfa508a105f36272edb6bcae29388f2a75bcb354de6b",
406
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/shortcodeListResponse.json": "449e0c165ad81254715b4521e5f4d39b0a6d1ecd583bf337e8b85ba40550a0942c04a8e33b69e5327a275fca4e42e31dd1719f100c8d6e459939a3696ede1a71",
407
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/shortcodeResponse.json": "867e2309b5c912c9dac5b06929a835b578b0dd3391c43f6e0d454adccf997060e1e5013051b394a94d44af3e5cfea67a88f4376088a376a031d6fde5fafa09be",
408
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/speak.xml": "a781afeb86ed31833e74d834de6d9834783264ec43678fe3e70a7f963e97a9dfd05dcb5ae75f51fdeec1d5d8d299d8c476454307a23efb830022a477500c02f2",
409
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/subSpeak.xml": "06ff8e0c15b36727265d9f80c736a1781438c04445e91bd563b73a1f9ed4b501458f7e3ec22607dcd96e9f95da6e6d874c39381ca061a768c2b664a1b4bfc504",
410
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/subaccountCreateResponse.json": "7fb28239b065aab21f14d158e51ab6bfff6b10de97ca558da02adb639fd15e99343ca54277d0e0b0dc6be11c01abe6517fcc2f0e862d5a3538342f86bea87994",
411
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/subaccountGetResponse.json": "929de7e767657a691c8bf34be8abe52990835f9787114256bca7a1fd6016b34798d36e2318ad3d4a2a8931986d8034e2310e4b4247fa38a84314658402aa3bc3",
412
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/subaccountListResponse.json": "c57bcf1f52d302550eacbe5492bbb1cc17bd399d03b6c83971bebd83fa8be975e97859063a2115edfed47f622adfb413d5c28d6cc180710211bce192d867052c",
413
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/subaccountModifyResponse.json": "a06022b797598bdabfd7029128d9ebc9934784edf77175292c17b60152e7464938f78ddb8ab2883e0da22fdf94e584d0fe8d766c40228bc0a564e6ce76c39365",
414
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/uploadmedia.json": "35f19877904dd5eacf97183a286db18153002e37159f6e007c9c70644843d73963e9293a5e64c1854665821e36592f5ca11289d2ece86fafb3ddc4b8b758dc4f",
415
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/wSpeak.xml": "05cdd9418d049dc33432e02bc305b10635daf3bda936c695c4136bc4bb8167ac63e6ae809202a566e5a1488d8543c06fd9c52f869b03a474bfc3db560769c00b",
416
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/AccountTest.php": "8a98fbb165ab60db8a7423252e78d9db1da922dc2e1de9ef5cde32488c04380ab01e8fe53f4f542c602b28e574966adf58385456388fb4aff543dc04467de668",
417
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/ApplicationTest.php": "e23381682056702928ea1c587bf8241f71743e4349cb30b621f2c843711c108c0811689c953ecd52515b2c780c50c134f959e4ef77ad2c0dd65dfccfa8c79c2c",
418
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/CallTest.php": "7aa7df68b91782de7a8ff67ce4bdce917de03ce4800da2d6c103f0d1297fc26c09effbbb7ead06d70566398b8679c54246213c4babefca43976c289b8bdb895c",
419
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/ConferenceTest.php": "3d1149c50cc760ec57de791d7a1eb46a5210c113fe91e1756dc642d2d94b333067c9c3c5ff9d0c90d9ad8981963394d332287b57b84c634c8e4008ec5cb2356c",
420
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/EndpointTest.php": "aae4c23a72674a9d4da6261986147a3b3a1c5e4da03d2efe7f4ec21336e03d352ddc0f7e47dab3c9b4063a170d37e0eebeba649ecd1159d85a3c5553789c51b1",
421
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/LookupTest.php": "c436483d9ad54681ed44ef7a6b44d4899d06b7b421be27d2a076aa4bbef23a5d160d5098c60d5c380a8e66ebf8245c917074edf6a7b682d056f9f60e082de032",
422
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/MediaTest.php": "a6ea3f17046c123698c0b8fc1e7cfca6665159166dd53b51d1b5a7700373527c7346a90e67a382f4df26ed3f92209790c3ca93c0c3d3b653d424e17a1fed9f17",
423
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/MessageTest.php": "9749cc39c4acb64b49150958745f19952ffeab648abf06ae839eccf8eb9a6c66bea62e7d8fa398dc48a79bdc97ee063df934ba827632faf88f4aca01e5432181",
424
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/NumberTest.php": "9123fe40158482d314279a729e4c5c0eecf3733884ea39df16de986e775e93e90b8d9c7ad35fbde8f3d4cde3e02b33c70ebe87cbb27039615de8213cc27aad47",
425
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/PhoneNumberTest.php": "4b52dd78392c66e1d1803a278ab98bb03e4bfe5275e28b043e4f672357125b4373acece1c2c5668081be021a683acd2796e6ba5ff2646baf3435dda1d6de7667",
426
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/PowerpackTest.php": "52a3c6967c93b1b996abb3fe7e40ebaec915e58e715c6943b0f5ebd945c8a59023184dd1339cd044d2f3ef1a0041a61559a41a3832bfc222332fd85bca8371c9",
427
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/PricingTest.php": "91a088d32f726c2eb49160363f7a77d351f3f65d43a9282cbea646310e2d01a33d22a2adff9ce5795f949bd205c0b6e77571f0a231265514704f42bdefbc51bf",
428
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/RecordingTest.php": "353008dcfc66ae09e915787634877d598930e60fff3f1e6eec0aa5590881f66d78ebd79aa1ba2b2a20409e4b9372eef9ab28406c9fd29f95ca6c773d8c83fa63",
429
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/SubAccountTest.php": "6dd803629402c6f7b8d923753477f6c03d6cfbd50aa59fcd63556527cdbc3d932557b318cf8c7a9f5a9d3ff8ff143ef15f31256e488fa8c35cd62bf80ae04d5a",
430
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/TestClient.php": "8917a380e2cc030228dbb37a7a3aaedd2cd624d8102eee1fc3469a9838f31f7ee734a40cd45e510d63bf4c1526da4bb3af8d45bd4ebd4382cc9fd5bc2ba178c1",
431
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/UtilTest.php": "6a66cd73b0cd403f64f8a4752381964bbac7507b4449e81c9aaa64d61db244128c604a8995327dd8e8ccc8a30cee7a3a57fc617b845ebe65a65ac38125ca7394",
432
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/BreakTest.php": "740c84bc38e7044f5138e3816b72c6a94bca3accb592733421578a6eee2080bc6721d85cefeb8b6f1db751e2056fbf722e0dae61d260b089dd803e72cd9cc0d7",
433
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/ContSpeakTest.php": "f3b641231907bf807c5c09b65a13409ea054b0116b9b36f5bbcc2bfa651592ae1f4707be5780c37c5b9f1516044a9f524f4ca829cd0b5387a6a32526ba11cc94",
434
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/EmphasisTest.php": "b76b6d0eee048b44965f87fa6f59614e64d885864ef3ff0aa2310746d76304fb5ac6cc6d0c714e7560e5472e018fd0183cf9a918d3e4ee5415723314d7d219e6",
435
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/LangTest.php": "1a4ef409ded7d9c7abd8c63994dd3e221b16bd1fcca8133ce43e04b300a28468cea68e430098393acafb78e537e37b0574644735cb84fd08e33dbd828e2fb071",
436
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/PTest.php": "9084715ad9065f1a926e8dfdabc5816b16a385dd5cd74f16f6fdfd1aef043b7d344d9cdac4b9dc43df85e8e63f329909553e20b86d995d9eb6d25d716fc5fd1b",
437
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/PhonemeTest.php": "f85a3119f95615c3d3e16c0a4c1d2aec7b2191629b60de276cedb769b23e11546fc27fff57e329c1ac6cb52868208d29f88d1412b452932b573d88cee9fbd68c",
438
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/ProsodyTest.php": "5aecbb6cb41b0269b0895e580bf87dae24703c3116dd39774c11d52406635f4167bf55ed0b950cb4d8af9138c03361161527c7f0e08867053034d8aea1fb1daa",
439
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/STest.php": "55343bd191ba9b88fdafcc409c1685224cd6673225c1ecdc006d4c3643d9e4f71fde0a07ead3f1bfda80bed486f09a7fdf42e16cf3d4fe66f592bb72397320bf",
440
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/SayAsTest.php": "005fb0efa4803847719d9e7d52438ada0026b3860d7143fa4deb96a80826ff0f8608b3dd9302617547dd36cdee5293ec25570dd6513cd81a921ff483379574ab",
441
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/SpeakTest.php": "cc92de5d0f5df6de17b121249074752bb191265335a6e50dcc4739fe525cc9d0014c187a7d15cd0c1226c56360277469ba10da72dc56dde01f478acc510a8dad",
442
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/SubTest.php": "5c113371cb363691313226362512772facc38c30afdc32e96976aa309d6ac33aa32bab7d4ba674cd566182641048434dc65cf1403f25ea4adfdf6c6793db2fc9",
443
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/WTest.php": "f7cb4983bde61290a90fac15c009ff1780b02fb81c8568d0e8a1f40fab97dc1ec2245cd477b5ec669c6f54e56bcf7351e38c09caac7255756174baf4070c9284",
444
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XmlTest.php": "58317dda536a0383749d695ee8cce6f73d6ab413984673d46b10d9299e5a70c6cc464051e986b75c849286787a8fb23ef15e8bdf6bbc9a27e1c0cadf46a1bcd3",
445
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/bootstrap.php": "fb1c83cc2a11ffef9903eaf721f4cbcda4767f70368be33a0980aec4e5b515fa8258750f6e19fca0eff6843d0294de9c35b8e95af0e62f51a94442be0099720d",
446
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/phpunit.xml": "74191aa62aebbcf797167fc2bfb6bb304cb3d309287a73919caa1c43c188dcef47a1f1905e56143952e4b342ef183a84887dacd6976c18e58025582d5f672035",
447
+        "providers\/Plivo\/vendor\/psr\/http-client\/CHANGELOG.md": "82bb81ca074204aff5d95ac5d3edfa9c85569c8b9114f809e3e2f9525a6046a1276187ca42f638ed428311631791f60e6dace74cd60d77f1af0a41e9f76ab2ac",
448
+        "providers\/Plivo\/vendor\/psr\/http-client\/LICENSE": "3e0ee70fc857b6dda26ef2eafa55ef09384d82bb2f85b4289abcd94a60201c698eb477dcf03a73858b2cbb9efcf00affa199e848344b84dd4a4c135601e886ce",
449
+        "providers\/Plivo\/vendor\/psr\/http-client\/README.md": "a8fc38f5744eb4c1f14f5016b02108319b7cceea7fb3219f57f0604a2e92778fa9be6f1e340003b095f70c962aff0b49ccfb0264b26eecb8fa7782667e62cf3a",
450
+        "providers\/Plivo\/vendor\/psr\/http-client\/composer.json": "b767c510e3dc28fc5c8c0debf4e5627f4897940d41ced88cb0c85284c2e0765f49305997407e84d87154a4d9e14045e6c50fd86163d3d7452294af8b7bc36ccf",
451
+        "providers\/Plivo\/vendor\/psr\/http-client\/src\/ClientExceptionInterface.php": "33aededf573747615cbf7b8bc6aa10faea7762c903a0cc98bc43803043f9bad58460f09f7301814c22e95f2a6d0269388d8ca899ab76fcf0f2bd8d82aea5d9c3",
452
+        "providers\/Plivo\/vendor\/psr\/http-client\/src\/ClientInterface.php": "11b1cee24748c4ed1a41681b1b6e43e865e08150be14452de885daaca737f4029d65e8381632a23910789d3cf5e9f9d02f4999aad62e4e8c80a2fda9ac96a4ed",
453
+        "providers\/Plivo\/vendor\/psr\/http-client\/src\/NetworkExceptionInterface.php": "6d3d81d18a51f451e8a1b74a16b3ac8ce6c5642013a2d1375ce6718090de5369779f9d6f594675aeeb7bc3f55a11f1b9396036354c4e9ae0c90183ff369fd65e",
454
+        "providers\/Plivo\/vendor\/psr\/http-client\/src\/RequestExceptionInterface.php": "46391124b679cd54538ce5ae6b05d7fcfb6b9ef7680f33c8771f94b38075a366788293b757ccc674060d615783476e1151d0ab8a5f2a10e24578c9b46cc1433f",
455
+        "providers\/Plivo\/vendor\/psr\/http-message\/CHANGELOG.md": "5567e49c016bd259491fd13a96e5b88629fe67ccaa0d75f7aa7c54096edd663fc743930eeade981a041cf7524d9f65104718c129fa36a200397d30c0e5d2c954",
456
+        "providers\/Plivo\/vendor\/psr\/http-message\/LICENSE": "22ef0ac33682fbed60a5274a5b25991308decbb45c6ed45fb3222cc045bb9e552fa7310b1ab6f38329b63f53a02c25e7bc5e955ad23c5bb2366b417563cb71de",
457
+        "providers\/Plivo\/vendor\/psr\/http-message\/README.md": "d58ab57a3e35e51848c3c21313836c88eaca950eb5b716878ba950ad2389bdd84b24a5fd8e6b19ce3ff04b07d879b5206b0f26d5e3a63a5be19beac0e9ccc1de",
458
+        "providers\/Plivo\/vendor\/psr\/http-message\/composer.json": "4f074821b6fb7074c418bed0fb6232677a0cf6ae5ddf24694e14bd5aa7fb3610a645f2221fd024e7c4bfe3e95501421455dcfbbbb38468e9db442b8cde9471a7",
459
+        "providers\/Plivo\/vendor\/psr\/http-message\/src\/MessageInterface.php": "b79e96e691ad169d4d70420953ccb5933301ce7cedc17d4eaba859dbd56719008198fd201e3be1606ea5dbc78b559f1d86ba17b73ab7e843f0c2f0b49564147f",
460
+        "providers\/Plivo\/vendor\/psr\/http-message\/src\/RequestInterface.php": "f54aefad46987c6b4880d5f09f7e99909e6e2a99f9d305d1f73e4de58b43493179149912352869e50fc46e057f50c78ba7ed5df6280a7c0347f3d7c36afcbfe4",
461
+        "providers\/Plivo\/vendor\/psr\/http-message\/src\/ResponseInterface.php": "69d177fb504f47ca0181ab35e2155cacf16e77535d07bf4eb4d790e1ddbc7a133f3de21eff936a3e75acb704c936ee2f2b12b2cf3516464222c3d60ea9760488",
462
+        "providers\/Plivo\/vendor\/psr\/http-message\/src\/ServerRequestInterface.php": "ea36ff66e8bd962e468fb2bc832e70f7bbd81f92dc0e607cd69092b737609d565f3e254a2d54fb3588f5302315f62e53c6eefe9299ba4b6f1f53ba8feffa815c",
463
+        "providers\/Plivo\/vendor\/psr\/http-message\/src\/StreamInterface.php": "11ab8a9d07beea1f1633f8f6cabb2a463ff288555f2fb8a4cc0b99404d8580493018557a0f2674feef653be51f6fb8d9aa3ad8e6dede0391cadb7bb49f96f781",
464
+        "providers\/Plivo\/vendor\/psr\/http-message\/src\/UploadedFileInterface.php": "65da733a08d80c5490fec8e69c7b56a47efc522e720a2ddcc673bd74c0e21f5fad4d522ad47da4942d25d139b5392e0882de32b7fe5a5697b86f40fd96ff0f8e",
465
+        "providers\/Plivo\/vendor\/psr\/http-message\/src\/UriInterface.php": "0d46735005331a3489e3ef4c8229307320de44b0443ff74d238cf8f3962d83e99316da9435259d479b48477d33e8713dd3d1a1859264c22f2a53b43cd6adae2c",
466
+        "providers\/Plivo\/vendor\/ralouphie\/getallheaders\/LICENSE": "ba7ad111dab105773d8a75d20024b48c4222cba6f7836b7b608fddf34f367cd218302829a1926a675bfd22660f4562b0e9a679d15b41162412924ebcc1a4e557",
467
+        "providers\/Plivo\/vendor\/ralouphie\/getallheaders\/README.md": "48ce2def80836640ced369db92da9f9e943b319849cc89441023bc260edd6919c710d08c91fbdf04864c6e08bf89e60a397f5e814b3e9699b48df574f5799522",
468
+        "providers\/Plivo\/vendor\/ralouphie\/getallheaders\/composer.json": "495b111d0e0b4f4496ccaec984dc89c897f189a67d840c09b0cf17034629e1c896c37c4ddb1afdceb7d5a188dd0d90405ce34aad409d3b7722169628411d3ca4",
469
+        "providers\/Plivo\/vendor\/ralouphie\/getallheaders\/src\/getallheaders.php": "a61a5f91f21a68108c7e9c8eef22282e4b1b6f6f14ff997c5f47c83f39acd08ec60f4b9d25d306d67fdc68ec57c7f71a44a1f63ebf7c25b40ad61fa1cb4e58a6",
470
+        "providers\/Telnyx\/CHANGELOG.md": "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
471
+        "providers\/Telnyx\/LICENSE": "8756122099aea86ddf6f176a480c0454f2be6dd278e475bd6be7d7ab3d572162f1bd44c9f623e52e53514cb15336be6e84a5eafc8e2a347b481ab5799ebd6e17",
472
+        "providers\/Telnyx\/README.md": "321748e1de717ff62ccd3fb2c10fbed8ce92a66271f2047c83be8929f965c179cd163e429175b44893ae30addef3623f96659b98528a405a585f7afc7394e866",
473
+        "providers\/Telnyx\/VERSION": "7558cccb74c98362a480e1c0ae17e711de8e5d6cd10f508a31395105c0efb22cdea79aa6f9f6f890837d519acafc2cb3c429d3ab17a283e1992e5aca5053e25b",
474
+        "providers\/Telnyx\/build.php": "485d76b827a54d8455550e8a8f8d14862f9444381da251e66c2bb8ceaf2106a554c1cd339666b1260450749d0244d6b9ba0c6d0a2220ab2411aa4041fc83f8ad",
475
+        "providers\/Telnyx\/composer.json": "7ab90dcc0b5854786b213e5f2ee8c8030b21f65b2f8d0f74a3aa6d771ca1054ae5e1ba58ad6684dd1234e7eb7244be537cdb0a6888172cffcdaefcc7f5908dd5",
476
+        "providers\/Telnyx\/composer.lock": "1e4b665caeb711f94b1e7f0ce6388e91ada9973159c1230d4e60f0dcfd44ba9af2dd236e6acaa27564e91b4a89dde817d5a73cad8682aa9cb93b203f467c6be0",
477
+        "providers\/Telnyx\/data\/ca-certificates.crt": "66816e077ee99ceb9535a472e6bbf4f0e48ca838099c8a97c7baf3297fcada9a43016ea1ded63a455ee56a8f18501417a0f744fc17b215bb599cafd76b754518",
478
+        "providers\/Telnyx\/docker-compose.yml": "1fe4c651e406095f0ff1bfc196406d473184bf53cf80f7c67dc79f1aa94b26db74174e0e9bc47adc95eb2a5f6eb950255c4a5cf44ccb7029ba712df3be9e6384",
479
+        "providers\/Telnyx\/docker\/Dockerfile": "a63d1fabd8c19fef37b90922aa4bb21fbd1094635666cf2a3a4db47009888bfd3f1ad5c34c05184e2ccc8f581971f6dae91c1ff137730821422cd482c39e9390",
480
+        "providers\/Telnyx\/docker\/entrypoint.sh": "2bf3911c365a271fc52d17a0aac1687abf52e5286a5d52cd34367e18651dcfd6ef1f791b54105b7742f5d691564ddca3c05a9ba4ce8edfbc68fe919e0bdf6c1e",
481
+        "providers\/Telnyx\/init.php": "e590e355286b775423b39dd23b5aa0d3383d8a85ed2d1346802e0c487cb834154b4ba1b0ca41ae112ba81cf5afbcc9133db8747e08565c00fa3b0ea04fa7ccbd",
482
+        "providers\/Telnyx\/lib\/AlphanumericSenderID.php": "c6f7d381cd9901af59d67c66fbe6ace0729c77ac2b2962ce41351ed076cb39c9049aeeb72ba0e3933ebce4ab8a936b86a7e21d30a1c07b2b08cad9da2abcda1e",
483
+        "providers\/Telnyx\/lib\/ApiOperations\/All.php": "5caeaf5bede40fa19422387d224255ed534a866638b22a7a832111cada5496764bc0434cb1aa7365e1d4e0a8ad55545bb05a42a17ae5f2b361ed42c12166a229",
484
+        "providers\/Telnyx\/lib\/ApiOperations\/Create.php": "811f9227ecc5acb172e8e7120541227de0bc22cbf66a41490b743b3e49647a38889d5cfa5d64139b602572f0fcc0fbb96e3971c78801ed9acf7b50db2ab7499c",
485
+        "providers\/Telnyx\/lib\/ApiOperations\/Delete.php": "4c03010d81be8014694e366cf93244dd2f73dfb38fe8a1f3066b6ce179b999967de5a9d3e3140b3076d0dbbeccea329ac750ebb93915ced1e44891ab589f0c7f",
486
+        "providers\/Telnyx\/lib\/ApiOperations\/NestedResource.php": "390efb020ed7c101b32379716bc2111e83273e2a7092da61623f85295c67ad1f6ac2fda617ec91eb28d02ed52a86db9992ee044356f3d96aff2e3474b16da601",
487
+        "providers\/Telnyx\/lib\/ApiOperations\/Request.php": "5b947c7171a05a754fce9c5bcb81f93c1614db086fd4ceef9be1a57977f8bfa7311af0a60a2879d8cb9380c64ddbf7c991738e5b5a4e4b2feb5d88e25c822f3d",
488
+        "providers\/Telnyx\/lib\/ApiOperations\/Retrieve.php": "d2a5aed1aaab9421f2f2b41f69047a70bdea46082e118cd94e087f4082865313d7c67aa037fac194063c53b06d9dccbfa5e65582a9adbbcaaa2982396cbda01c",
489
+        "providers\/Telnyx\/lib\/ApiOperations\/Update.php": "a102e823a46dca1eea6c0bd67b4b7c63bdc0d074c97b42a830de18006782309d3c5f77103b32e82c778f670aade73d3c31f49da49682d9ac204560bd868cd526",
490
+        "providers\/Telnyx\/lib\/ApiRequestor.php": "617ebb71c97dbd896ad736a4e1235f784ea7b89dd73a980a2b259820e3dde0ae935fa532d1fc8e0d9e14a63f843e880e074319bab2f9c519c1ec19467f80bbd7",
491
+        "providers\/Telnyx\/lib\/ApiResource.php": "40b33a633cfba6c4efd4035bb668720a802c2b86538a36bae2f56b8cb1025b87f204732b9ed4f731cb9293de3d69e753e2e55a4f17980b75c2d91c572329c6a9",
492
+        "providers\/Telnyx\/lib\/ApiResponse.php": "0d292d053a85224f4ac839f54253decab0eec5ae9861ca95314e98cad0fec2d2f0a7e712a8ec433adb302b6702d69262c8866b20fd08d67b2d18571965bf6789",
493
+        "providers\/Telnyx\/lib\/AvailablePhoneNumber.php": "7c82ca4fa28264c4fdd910c71741270657e52cdbc760343339bbb7c1d5980d27b7af476f7e1bd431926d428dba685a6e34d250f9678ef0a4e3cd8c4b06289e55",
494
+        "providers\/Telnyx\/lib\/Collection.php": "8953b7490974401e598cfdba09be005dcc037ff74d7eed660d11afca7a45d62c47f6b6c4f31b3b3003f3d9401599283122034362618a9c3d487eb131d05cfa13",
495
+        "providers\/Telnyx\/lib\/Error\/Api.php": "5c496f65e000a74652c5e7e3c79303befb693e497d67dab4e13287ebe72722c9651fa04c4de4065ea969e140f7a2f74ccaee2ab728f05790ee26200558d0085c",
496
+        "providers\/Telnyx\/lib\/Error\/ApiConnection.php": "469821ef557d096a088d2997f762b4a39c82c49bcf22ca707bcbf611b20006106522150d6365835e0c7e23e3303bd407d78181fb7b5d86bd35095645e68da158",
497
+        "providers\/Telnyx\/lib\/Error\/Authentication.php": "e1c7a938a695fcd8602e5a972086989efd349a6d8d5e3abddbf6f548ba2e1f9bdabe708b5ea75474f7c3588ba7cca8a1dc60970a8be70a80962f90342e67c13c",
498
+        "providers\/Telnyx\/lib\/Error\/Base.php": "9d311a5445b2f3d9c4e25c42094734c3d6243fdc5025c7e5a609ce49d2b2a47f01ea2f163154917f3330e1a92d30a736319c4daf3ae18bb6ddc41d131afae0ff",
499
+        "providers\/Telnyx\/lib\/Error\/Idempotency.php": "cde2f56479baab53e74c6784878c7914e7393b655bfdbf7a36e0619fa9c521671c105c3d5002983b3759989a22eafa0bba7b4aedd4801d7d6b820842c0285e35",
500
+        "providers\/Telnyx\/lib\/Error\/InvalidRequest.php": "0c5748224174c20020155c9f0c734121d07c752460ef63648b08a2392bb6d8b6ff0a9eba13ed1cfb8988545f6dc8c70930de6e78da03c63da0e59bc5fa109a9f",
501
+        "providers\/Telnyx\/lib\/Error\/Permission.php": "3a03b08e77e6fd0897de16d69fb3769707f6fb46717b2a00f1282d7b3e33527f5ca5ea94b6df03c883ea177520140ab2dce4986e0ee0977cce8c375e8a5011fd",
502
+        "providers\/Telnyx\/lib\/Error\/RateLimit.php": "0ceb884f1078559f5bbfbba6153e6bacd6ebc49dac2d047da9e7c64d45c7cff0abc067711366aaec74a4f2736b7205c02ae9de8c214871a82ed1fc53faf4be73",
503
+        "providers\/Telnyx\/lib\/Error\/SignatureVerification.php": "8aec6ea46f62c2b6ecf845cadb726332f89a6c0dd92f4864ac71ffd25268b2af0468cfa83b32a24e91c735ae947498bdc6181efe09857c6bfa799cec721dadda",
504
+        "providers\/Telnyx\/lib\/HttpClient\/ClientInterface.php": "f47e88048bac320e8cabb1b61869f138f84a04858afc3b7aff4de858db9b3efc507d1607037bf07ec5fb1f1df4069b71bf8ec1d0edf953bd1eb8255e67651ae9",
505
+        "providers\/Telnyx\/lib\/HttpClient\/CurlClient.php": "fed4939d221213da7fa7865b4405e5c0b7dc092375e5acd890bfdf178baa6572ec7ac7ad57cb02caab5af24d2aa52763bae1b21679f3b94e6f7ba659cee7a438",
506
+        "providers\/Telnyx\/lib\/Message.php": "18acf4bf51ec27d330df16216924c65a45db59895b610a3c803ef1d09beb7d96d20753b4ec16be06ed40f2886ad46bb3d866f14a87021484ede5d33ac1a93c4a",
507
+        "providers\/Telnyx\/lib\/MessagingPhoneNumber.php": "2a2caa5e44efc5de92ef9b0f8ed0a68af1ab2c80932f4cd7fe79caa87ca1e146af3bd0e1d16d977738da2a3af1fb3cef77081c32a0dac50bbe8ef54a108efbc9",
508
+        "providers\/Telnyx\/lib\/MessagingProfile.php": "351d96a913427c045f534b6993c37fa6ce2ecbdd7a398502ae6447d631ff322ce146cd73dcd1161c999f6bc9ab9764221b4bd3567888dd14c110b98bdc4432b3",
509
+        "providers\/Telnyx\/lib\/NumberOrder.php": "52067d9999c150fbefcbba9969b308bb6118eabe25bd08f30cc4978cdebd68fce4479e53d71ce29632133e8c69bb4ce9276301f5a36ea95bd77d29fd057f5d46",
510
+        "providers\/Telnyx\/lib\/NumberReservation.php": "2b44bfa3fdcce2e21668004d458e9e6bcdb5e33cc37e9a0c980bbdcacec945dc4e06e489bf5b9d0194df00229a79e39bc2a62395d44e4072473441e258841baa",
511
+        "providers\/Telnyx\/lib\/Reporting\/ReportRun.php": "2a7b066db83e08b86e3da4c0b2d041c4d53ce0a1fc95ca3dab76ad2bbf549d74f9a97974be6bbbf0d7b592a814a00b514bb26ad13c7621b5c229f9bc40abac7c",
512
+        "providers\/Telnyx\/lib\/Reporting\/ReportType.php": "92ad055c626d39d9f878666310ffec1c425d4625af9e7803547d50f1684c166ea1dc67d79c35580ae08850bb6e570a81994014e82f4d4080377cfbc664c4fbc5",
513
+        "providers\/Telnyx\/lib\/RequestTelemetry.php": "cefdb55dce61e5f276bd49f6b49e57c78085338537e56cce6fea5a81cd1d2235f1eaa78be326cbd513117be88a046177afb628659088b66ce423799995c53709",
514
+        "providers\/Telnyx\/lib\/ShortCode.php": "4abc882d0dbc72becbff07212d17b8e1383b0efb43818a7eab983fd2a08c3f591a4f4ba2f185003fab0622a43329c969d2fcc80b23cb94410007a0879309ad49",
515
+        "providers\/Telnyx\/lib\/SingletonApiResource.php": "f11599b789dfaef76ef6cf10bade1b426d2e16749bd207c6d08ddd007fea470fdbf0492f9a59cf8bc9f8589aa4532cd6c3887629cf27060696c3f086b0a48673",
516
+        "providers\/Telnyx\/lib\/Telnyx.php": "4971ff61049149242b0cfdca4a15dce213c465ee697cb444eb47da8215eddf2737508164c59393bd7661cf40b1a525afa9fc0df0dae8a071a59f3646a5ec44b9",
517
+        "providers\/Telnyx\/lib\/TelnyxObject.php": "a1bb11b6bfecd69ba694dd34d6309707e916ef45edea1e81e160c572dc404aa4e16841f3be7a82b3965037efef24db7c7c9730fbb65d26e8a188d30fa9af01f6",
518
+        "providers\/Telnyx\/lib\/Util\/AutoPagingIterator.php": "d03ac3841bb553d847be9ea73ab9debd8c1f2c829b0d38ac4416a121ac535a5ece2ecd9943d89e720cb5abb1c907ca9b96df899a561c190ccd6843bde785114b",
519
+        "providers\/Telnyx\/lib\/Util\/CaseInsensitiveArray.php": "bcdf3fba35ae234bc63ba6cdb5429aaa5fd6baed85857991abb9eff854b23eb7a878184ed038636292ac470b67f91c6bf8d79c20a6214d31c872d22fe51833a5",
520
+        "providers\/Telnyx\/lib\/Util\/DefaultLogger.php": "50a69f9f6ad628e489a05fdad0df811c926c957c301adb0b4b906dcce9733a0598f6c2eb126865c54a0100131dc4230a834b1e98275237ce8e90bff2e96cd0fb",
521
+        "providers\/Telnyx\/lib\/Util\/LoggerInterface.php": "8d2dc2c59af5e625eaeef0b85b09f78a42e533b62fee84717d67a4c706fbacd94674f439d3ac60984c0a3947b7d2f5a8ccfb64e071c41d063b8298f57578f88c",
522
+        "providers\/Telnyx\/lib\/Util\/RandomGenerator.php": "292c880420b28390e3d734c6343acd48f322db0c474f80430402916de1dcbf8e988b3d2753a7c18e763e632f474284b213ccc8e8fe4e52f00569e72728dcccb4",
523
+        "providers\/Telnyx\/lib\/Util\/RequestOptions.php": "61a13e62a72e7fc4a1f4d2a707d03ca785af36dd8566e037efa4b1a07d91debe1bccc637bbae6ab9dd836b20a4133cdb7316d6c2628da0d13d2164d6613f1e3f",
524
+        "providers\/Telnyx\/lib\/Util\/Set.php": "1381d2144748a490fd27329fe231e9d3a9a8b428499d4005f9ff18a946c350d8dda1ea90285314a1a99f5d351b1b235ad37a74823c37d7345da8af528dbbba87",
525
+        "providers\/Telnyx\/lib\/Util\/Util.php": "d7c35dbf5a2832ced6059800a6730fbe75338252641edab902adfb134a179d96e162f05bca2902c6c2d99cf4827d5b89b0daac826162c7d460e17017ee405606",
526
+        "providers\/Telnyx\/phpunit.no_autoload.xml": "06ad2f4fe0a292902757629f5605509f32a0d1dca527550619c98a61519d83fc70f3c886b12f5e5734b1031186fd9c7fed6fba813cd816b0f07d36c2a6bf11e4",
527
+        "providers\/Telnyx\/phpunit.xml": "82ac037adc20f2aa76682878094e8bffbfe31782dc6a94e2987bac5546e3ffec90577d03715f4ce481cc977685eec9e4109a61b4b46bc19351c2cad555d7cadf",
528
+        "providers\/Telnyx\/tests\/TelnyxMock.php": "e8e93ca1114530cb7e9cad46eb20e32072934496d515a9391ce8093773450dd60f3288f9d3ba46533a0f650fe67b508d5e54bbfc6e1642443d1fc043b88eaaeb",
529
+        "providers\/Telnyx\/tests\/TestCase.php": "9945df738b56e344648cc00d3d4b94345c15d8749ce511b5095a87d5e52aed35d8e3c773276d9dde9d9fa04eada784a55e4876ebf70a198ba719c8e94c8c32d8",
530
+        "providers\/Telnyx\/tests\/api_resources\/AlphanumericSenderIDTest.php": "1db47c5c215f1dccbc0456035edb1619cb7575dfe2b152924a6e1abe4a021bf63be3b1d1cf1b86285c5425f5df46c8e396cd66b6ff6a27534e402e145e5fb194",
531
+        "providers\/Telnyx\/tests\/api_resources\/AvailablePhoneNumberTest.php": "823ab5138035a84a790d70c9bc5964e7aa163f195aeaa2fb50d2cfc7068f1a77440f09a134bec36a187cf57cca6c735b428b225239a263aa26cc5cecbecdf6d5",
532
+        "providers\/Telnyx\/tests\/api_resources\/CollectionTest.php": "af248a4d4c4504f5fb7148e8f5ddbce3a05cc859a761f57cffb8335be10b07ef6d4e808002601f92eff2968e86873fbbc3fad838420db0694f81b9cd95091452",
533
+        "providers\/Telnyx\/tests\/api_resources\/MessageTest.php": "a616a69339b599526dfd24a25d8e99eefc99c2341bb7d4f635d1b4984f41dc38a3eb6bca3e4242caccb974b141a490624669b5c2b2f5315b6cb07540d74fcad7",
534
+        "providers\/Telnyx\/tests\/api_resources\/MessagingPhoneNumberTest.php": "40409c270a6f9a683bc690f6e91051fe1ac4c8a6cb1b4e5536416d64fc3f8c81f327f33e562ee94cee1481e0ec2f13148b0dc3f76f3f20a49a9d80adfa5c1afa",
535
+        "providers\/Telnyx\/tests\/api_resources\/MessagingProfileTest.php": "1ca7abc2b47f221b491ebbe7def5569deada6eaf4184bd6e6327f7bf2da15669d1fff581e24c466621e8462e816c0a12d02e0aa1d91aa3746092f8a09a9131ae",
536
+        "providers\/Telnyx\/tests\/api_resources\/NumberOrderTest.php": "dd6e4382dcdb0cd60ded9d9db6262bbc7f523e8f5eb842e15655fe8ba4e24ad5192b8be40bbc762de2c62de3aeec31e1373063420a99e39bf02f5bf74915d5ab",
537
+        "providers\/Telnyx\/tests\/api_resources\/NumberReservationTest.php": "8b8386c0e044e120b6d60f97433c9ecf0ddc272f805034768300bf01bfbc731a3f6f964758e509d650013df03bca66eb1db13fa1a24315df76ea55fd86287fd6",
538
+        "providers\/Telnyx\/tests\/api_resources\/ShortCodeTest.php": "8aef092868b89adda6517905c7f05245b3c39affed4c7723e5a32cf17b8e39528e8925923aad4b2add5a0bbce9049a8f934141b87a790fcb002eaf77aa494258",
539
+        "providers\/Telnyx\/tests\/bootstrap.no_autoload.php": "cb002f7c8f77834b6414db6535f083bcd227ee6085363fa3cb0f66b55226680a45c8562fd8458249868465957b2aeae134b3379f8ee2ed22c96425475e9c0af1",
540
+        "providers\/Telnyx\/tests\/bootstrap.php": "50e143ed68aceb91d3e119d5a31521e76bfe9876bd780c90ac83afb7ca4f32be48ff81c33c134109eafe1d22f35e0957a9a834966b8853df99dc1df04795adf4",
541
+        "providers\/Telnyx\/tests\/data\/test.png": "6ad523f5b65487369d305613366b9f68dcdeee225291766e3b25faf45439ca069f614030c08ca54c714fdbf7a944fac489b1515a8bf9e0d3191e1bcbbfe6a9df",
542
+        "providers\/Telnyx\/tests\/openapi\/README.md": "0c54fffd5b7a5f393358864ff9e3bd3793075d6060cc1336603b2455d60f16d160ffd47b52bca6834acf0d9713855b386f69580099a3dcc131e8d5d617975ff2",
543
+        "providers\/Telnyx\/update_certs.php": "46dfc1129c3dff2211cdd8274fadd8629c450e94a7a1c8527373221b25a0664b6043d6b007351ac9afa4b40ba349a7fdbf4ad2e088cf0a8d864f7cbb81145fb9",
544
+        "providers\/Telnyx\/vendor\/autoload.php": "1d4735a3ebfd65901ce478f8bb98ac576ef9ba2706f17a1c6ab125979a882ec7ff463b577fed1c418f817c1a56e842fc25b6aeb8e7ce6dcdd554a25e03959c3a",
545
+        "providers\/Telnyx\/vendor\/composer\/ClassLoader.php": "866e8cbde808b4e7774c5d9e2bdda44e84ff9bc84268785aff1a75277bd7918dc26ceeb27732718c9ea93756777ec0d16c09c15f9c1179be3cbb410c7914d295",
546
+        "providers\/Telnyx\/vendor\/composer\/InstalledVersions.php": "86ebb1216b59b01b7cd1f3b2e66311cd6295b58fab91a9a82603f903c6d2f716d7697a82d625372538f809e9e45f7dbd257a00e2b95d23c3785e4eeb3a6ebb60",
547
+        "providers\/Telnyx\/vendor\/composer\/LICENSE": "f3bb64009f41a425df5a9bbab53490f0eb9b74fa8d6aaa2f57efb928edc4ffff330260666edeaa04a91fed708c3663371cf01b284f3a08d6698aaef7a23f355a",
548
+        "providers\/Telnyx\/vendor\/composer\/autoload_classmap.php": "a298b75d605ec9a330a5efe11769e79f02cf202f49d8b241afbd175c7fcfa0ac4db8e72a29aa1d839138e3b181fbfeca525181eb57e998a4a2c14ec9e457cf1a",
549
+        "providers\/Telnyx\/vendor\/composer\/autoload_files.php": "107b2d75757e7b39e2d279e373fd4291d57e91a7f442b0f880b51d07e7119beb9d41d1cdf916131bba717e8da953e2117ff83f1bd9ef850fc1d9056d0f02996f",
550
+        "providers\/Telnyx\/vendor\/composer\/autoload_namespaces.php": "30324cf2dc20c214c5b5c8fdc2099b67772149ddea1d1d51969c711be9a83d036e43746c600f958a6b49969b16a10ef93e9b1e3d5af9714721ead916b9aef344",
551
+        "providers\/Telnyx\/vendor\/composer\/autoload_psr4.php": "02804e683dc13b4eb2ad98284be2dff3eeb97f0ae9054c3a45641ce7e6144a3b5f34ae36eb764fd2faae39fe5dd4131b4dffd4649c6ba3220ef24aeab45efcb4",
552
+        "providers\/Telnyx\/vendor\/composer\/autoload_real.php": "469f95fde429006c3262cabe72cd49970b0cd6098b743d8e5a646af25679dfe539c98d3337b51a8faf7f30d9c64e1def8d131a93e8897f801830e7e1c4da5874",
553
+        "providers\/Telnyx\/vendor\/composer\/autoload_static.php": "4845f043e32744886f456f358ea87cdcfd641508151ba6c3b0169c9aa53fe111f05b78b82e204368da01da68d7007709c9140d08dce4e7dca3cc4c9f60397dcb",
554
+        "providers\/Telnyx\/vendor\/composer\/installed.json": "5ca47a408f164e118f7ccba81577933913002efce47331f2eeb13f3e24d78878521db08454026d270deaa6552095260d745f0a424c91eb7efd36f6a9a20adfba",
555
+        "providers\/Telnyx\/vendor\/composer\/installed.php": "38fb24f1f4e4aa0435926d601c7b78797c231eb0e3621e370b17078645f5d238a1d02da3a29cd14a9125f78f53964445f4326311f6e830cf8faa24e944215ce4",
556
+        "providers\/Telnyx\/vendor\/composer\/platform_check.php": "4d385b31994301facce94382fa007a56ee32268d2e1cdbe7c9f9cfa834ed4195d3cf8e8e7c9a800c97aafe2c9b46f3c1a93e632c7415e8a9e4a282c083cc6f9a",
557
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/LICENSE": "0c0bf603f7e196edaf56d02acbb2e14df7f73a2da0617d62b5fc811f088c29865ecdbc7c6925a19bda63132cc651c56f1cdac79dfa02aaeb3fcca49033636ee0",
558
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/build-phar.sh": "a5ecc580bc6e95a9c901ad1a0097fd47ab857dee79d0221ae463e27f27cc8b2227e1975ab2699b9d0782f0b0396ed9b3ac0106f53fe61315cd2954ae54beb333",
559
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/composer.json": "c400438df2f41ace7bff40d284236bb06c6095ac03b58caef5b062e7ef317bac5a6bf551c94459ffc838acdae7df6cdfc615dfc3cbecd16be37ba67bd948415f",
560
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/dist\/random_compat.phar.pubkey": "e8909663e5350be2fa9416e28c6b179c41e87feab8da0d6fa6a41c294c9b00e8cc40ae8bcd03997770056f70d946315fd530f72f42974f63195f14b3c675e3c9",
561
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/dist\/random_compat.phar.pubkey.asc": "f07fb9c7b00f297e73127dddb1f3986fcebdb0760454765f6ce0977347919c0c74ea197ed310bcd86dca7ed227812bfa6d1595c44e40f10c085cbcbf602e163f",
562
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/lib\/random.php": "fe4539e2b55b47dfff1e2256c91498e5a41a85e28e42d790fdbcc42102c16abb09b0d7a0e2268ee004c555e1001241a9925fab1eeaa16c11ae2188e1f01540b9",
563
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/other\/build_phar.php": "370c622746a37b65aa6e36c2fb94486b4fb01f2db3f3c9539a7fde711d1abe3f9e9c30bc61f4200e6da9b47086c207b03cd7258d77dd2ea6b48126a618e2fa0e",
564
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/psalm-autoload.php": "f05ea11c8e973ddffde4d60688b161701217ac8e5c9237cfb57babf7113482d5e19ea441f5092eb1448a21b95ceed75f994427d6febfe0de100c376ed17e91c3",
565
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/psalm.xml": "88c631fb2f70a79d0e56a4484fb7ae8b6b3502ed2a9599757e7a3302c42b0adfc6f0c45c9916b88d7430f209d8934b6121221dd8b424dd913c49236db7ef01c4",
566
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/LICENSE": "db260eb10b8775cb408f675dcbe11bfb1a738d638f4215467df6c4bd03b8265dec7712fffa30dbcd38b5ef944266c3963343d033f497eaa6dc602f55fdd8729d",
567
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/README.md": "82f123f85b02a7e91c3ebece404b85ef5a0950e0ca79bb0841735a5a03b88d1a3efed4bc8229b3ee1db245471cf58b81923ac9800586ace3b794421f379f7bb3",
568
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/appveyor.yml": "ed6f025871e47d5afb1eda2e0705a2185670c447279cadd8c0fa796779fa2f1d7a5f17efaf6412c403e40bee345ac3224a45f9aa0e5143f06ea5e25ba8cb848a",
569
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/autoload-fast.php": "a40c6c77f211a2257d3339ad80ae7197ede8ba0a94c76b48052cfbcc8ce903959dbd8e3434e6660bfce2c5e935cb9f38568f96cf00819d03f4a1c46cd6b7b0b1",
570
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/autoload-pedantic.php": "c1a0e8a5b461135bc58ebf0a37d75e865d9e44ce666aba9a95d6416cc7d57a834aae6fb6ef4a9cb4176690a4e41cdd8638106a11b32a155f3a8ca3acebf7a504",
571
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/autoload-php7.php": "0ac98043c8df48e7bdd3a20c11688ad3702a06271687e1019c2a7288288532ea593e7e462635b806c0b18dacbb8f2bd6d9c700a61d2b1deb90eba0b49660b008",
572
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/autoload-phpunit.php": "d34cda9cd77a67d93817d5b9b1bb51a13521b2539f9a8d0189debb1938934df1d5fd51fd2a82c9d4775f5a8613708a1e78687fab86c3afdc356bc4b02045bc66",
573
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/autoload.php": "91c2a6366a27a76a0390c69dc4cf061c73cb03a22a3303aad673cd08e8cd659c7fa7e6796acdd9d2d271f015eb16b15663c5d21d8a538fe14f459519c9f9e8d1",
574
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/build-phar.sh": "5bc154a32c62797e85b82595da69ed11676d98deb9644b62a12d5ec169d3edfd4d3b24c67170143f12ca63d9bea06cd0803f68d5e63a7849ea9c4dc9483f7b4e",
575
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/composer-php52.json": "10cd40189c6ef385b9e21311b8b2bc8f7943273552227c8006a38889d743fde82c8c61286484d59bebfb83e645a87cf6d99f29409439a1057fd16a4ca7727417",
576
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/composer.json": "e9b03b450c47dc1a593e35493c7c80c373f958ac5ddbe89a163f15e7a30a8139ac0f9868466610899e3d5e5d573d517bf09acfc68d2b9420e3301b39e7736aad",
577
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/dist\/Makefile": "1cb0cca3e1413538bad70b8c8a22dd68d17bcb6450e0c4ee41fab9fab09c36bffb4816dd0f7ea2f40ca1b4cec6b030c5c0cc17955d2c83ec08759e748b04d965",
578
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/dist\/box.json": "47543b120abf7596f26b58f9911963e9bd0cbe2297b65d43f74dc52130e503ce09049a4be53146387b7fb42b7640f6577e3c1f4862540d4f8a0e668b0001e62c",
579
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/lib\/constants.php": "4e0597dadc39ae7b81e46ef5f3f045812a11753d9116215bf0d905e0bb3760bc44639988f1ec8f0ae8998f507e0c99eecbd19705f5399edfacb87172d7a577ba",
580
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/lib\/namespaced.php": "c550633d5dbd23c1bb2fe9a14b787e239bd5fa898932ddb8a1b1f8909a57393e01f12337fcc53f54b24bc48a97c3ed89de03da089ffbea71ef90d48c5091e200",
581
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/lib\/php72compat.php": "85b52455b2764ef4b80d60b8d99d5f65264b2a2e7d770b2ab05871a5aad213ad35f2cd755a8b5d19b5ddcea758c024175480f2dbc89ec75dc86ccdb453f5fc25",
582
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/lib\/php72compat_const.php": "177d6b1b8fb5286842400019be1465fa0438e06dfce2fbf5e93e93d0715c161ad07c0c31c17394cb0c6673a058f34544454cc0845893242dfb5a998655c93701",
583
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/lib\/ristretto255.php": "f2c36f65a9a556c43bf9f2fcad02f1c87c29d89bb5b3d81634112defbae7ac0c85e558fb3b5a5e74d95906a4b543e7a2cf16fd444ff28888ef09d73fb9e6b6f9",
584
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/lib\/sodium_compat.php": "75e3119fb1d400aba554506a562c64c1b1b82e66277383bf307406fd1f4c68499a32b82108529d5af99878890e3551dfd1fef1ab62ae86982c27dc975dd39155",
585
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/lib\/stream-xchacha20.php": "4cf0cb7bf023249c18f2261057f994faf8c4233022651285fdf8978fe9a71d7eae0511ea1f64faf2f3fcb1ae5b010112a5a4ebe8df9fea7ce908916cc2ec90af",
586
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Compat.php": "7a8389a0ca9cb8e544b7f345c60705e1cca41769105531211219142f15c83bd60b442dbe8bd62042a5fddf31040a19ba1f3f00ba6c2a44c3160089a2605099da",
587
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/BLAKE2b.php": "91aa0293c7c821d238f36fbb1f4327e67a718b53c13f0ea0f4d6e1d1675618bdadf183d842d4dea103017be863d40762a20c644a4f3619c7549991f11a19445b",
588
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/ChaCha20.php": "7e09160954fc59c77890f28e75f7ce8b75fdf08b9d5461c5e7dc1f49bc664bcb1b7ac74e3f5437657a20729c2db965d968060b27309a4a06a252d22b7f8dd4f6",
589
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/ChaCha20\/Ctx.php": "f19f61e54d42bf154182d203594613371f430d7c78f5b8229cb9bb94e19e42bb9a8e434639accff18497cd728ef391a1128d0145b8958f8d4350ee340340df39",
590
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/ChaCha20\/IetfCtx.php": "41ac6fb53ae553db13ef5c12d8c1c16d017267f130e8a00e9c2a8ad10d723aaee5ee08f2888f016babe4d712a0f1fa50012e4ebe6626b34973c26ad6728e36da",
591
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Curve25519.php": "5404d91b94a8e6c442c3eb30b763f1dd0c1234b845b967b7048f71d5a0b6e1ab287b44f43e06ae5bd6fce31f78154b8655353d7df86b6ac699a41200b9df33d7",
592
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Curve25519\/Fe.php": "937defa56e99d4f38a81b88c03c649deca5b0f41f5d0b8e340cadccb34ef0677563f18967bb9f63e9547137a2a1827f9e37c62005fe745aff3764e39adf86cee",
593
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Curve25519\/Ge\/Cached.php": "3db1263681f9414d237a8318c08ad07bbe3279b7310e21a40c22033f5d90eb5d7074dbde430eec7910a8d7e4286fa6c0131938c92045520f56fe6acc37af70af",
594
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Curve25519\/Ge\/P1p1.php": "d757efd8638aa0c1609d59c47f3b18608a0fc6e1e5bc3cb94f16fd3fa2d6125872a796f4837cd8b940ca6988db92d3c668bba684c721476ee5fdb6fb6d50670e",
595
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Curve25519\/Ge\/P2.php": "cd70c62efef16eb21967d5bb0489dadef845fb3cd4faf0b1bb7d080a8685164b2b0fde4d8865dec22037795eea6df605dc2151f20871c31d5e9e0084f0066219",
596
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Curve25519\/Ge\/P3.php": "56c14b848691af72c00f5dcc3d31281a300d0ea9b6ec273ff929cf30d2279cf34d51891729a5b095445fffa8a63b8c8147f4d1ea24935c86b0216b3c40aa4241",
597
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Curve25519\/Ge\/Precomp.php": "f6c53daf36931b4289248a231da52759e91e5c38af10b2cb89a1bd7e55d29e316dc77d144fb9e52ca1cbf50db84234aeebf13603c62d58d5b3ee58dc19cc18f0",
598
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Curve25519\/H.php": "c2e48f6273cabcdc40f20fd0f7ea55975fc9da5a419b1c9cb834b694c858533f9a0d3e3ce768b532ea6b69ff5d2df1ae4c246a15b7129916d4034ac497ca2be4",
599
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Ed25519.php": "eda61c7ee144449df655ea9a9142d0b26624644542012652598bdc51493f61938c13651b32b05e942d31d3cfbfb7899b8621f4ebd8a5909a1ed12704b2bcfbca",
600
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/HChaCha20.php": "b5005439c15ef7aed83b566e670053819f59c415d9c5f607550c756622d7161ca32fe65dad8f688e6a292f88192637260d859302064b416465c08bbf7f6dbe13",
601
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/HSalsa20.php": "c882b541376c8eea8ab3bb63d8b51dddb345cc45ade8d5d264dbaa96427f72f0201aea828e696808155da7a978c4a1fad09723d42ec393117693e48187cf2a4f",
602
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Poly1305.php": "c438e61d6b330be26cff863f8b5c42fa3284d6e8abdd1e43a2023c2695dec643d2641b2239a9b0fbea1a34e9e8011d5094b4eb024b111b6fa903a1c026328747",
603
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Poly1305\/State.php": "4558eb5b05c7664408a4e793c2b85a4c2593ab8a1118c3b89db712f337a12346e2e882a0c638c32af733f5589a310b4a528c9bc02c136692ae82f3ac7e6cddab",
604
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Salsa20.php": "2836d7eeeec597187c456ec790107a5dc478a1f79c1c1e4ede4314bb830f865f189e048e3dc55742703e2fb7bf31275f515cca57ab5bc47332961bbdcac7c490",
605
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/SipHash.php": "345fc6b9f37659ec9830c9b3bd1459257b81568dc73809c023c551dd825981b0da6b150b6b7cd57b00097ae9cd3b742d730ebfda2d2e459ebd7d5257fc967156",
606
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Util.php": "81aac8187fcd44a14ae856e34d7337c012ff3603c606e1b9ff5a95fd5cdeb962725b70672a57b600d344fb2f34aeea00ddc8f1d4d8f8888961fae9171f8262d1",
607
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/X25519.php": "d11fca34bc3d313e365ca47981a0efb880a3cc8be3e2cb00da7df69de8d52f2f1fc793c1654cce1385ea66aec40eb5339c5cbf120c127cb399b72fe84b7297c4",
608
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/XChaCha20.php": "de5d7f3dd4402fe3c99b66a92fa4f0766beec66928c8996b3754b2f7a8869b65035c6ebafcc8ba2fe9b309adf541e89eba9491554f1ba548af6139770aedabf8",
609
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Xsalsa20.php": "6abb7e9217d5463d373023d5aab49c41cd3e1026835985dd13256e68374ef63b90b7dd033f7fe14ea60229a98e5e64d0d0f23b7a382ecc9d8b41746bbe3fec11",
610
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Crypto.php": "257d3d05f1acc745b21f25652ddf0b09b5a68b2b75abaa9216bee10ea958f8ed1d3c964dda5326216366d9cca4a71e8678c23994fd07eca2582e3d8c8aa75500",
611
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/File.php": "d7cce5179670dc18544eace3bf8b8b9863e62fc9520526da2870e45d5d400004fdeeb3c0f44a90caf0742f89b633e7fe3f996bd5f89af4c7f52ea37f429e453b",
612
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/phpunit.xml.dist": "0f8b25b7effe47068dfafdc568c3298d7c5f2d4eb1abc040c8dcda1b0daea8523a1f82d8e00d6475ffde3cb566c18d17ccfd07db59c72bda11f40d555b692d32",
613
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/psalm-above-3.xml": "5bb5402c96cd45a0d88542bfaa12ee03c26c3242f42f1e33a2a32e5a16143e6b66e7dd4bca7cbe30f73ee9eea7e72862e356f1bc4c4daaaaf1ebcb248d63b230",
614
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/psalm-below-3.xml": "9ef67d2d8ee81c94d0ed80d592894be0c200045b295178f246865d12a54d963e97b4a8d75ab88595bbb73d74c75ab2275a54b9a33733bea2d15487c5894f515c",
615
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Compat.php": "1c233a4b931c13b00e243f699eed9e81fc683846e089a24ad90dd17f786bfdec9ab32509eb9666074c9fc2a168ea8d411144274e6c4d4413996c78bd3c536515",
616
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/BLAKE2b.php": "27fdd20dc655cc7f58454cfa97fb974e4d99f6da5b97d79e669d41b9c5bfd1be18fa34f0ef7a353731a3bebb11b56fcb68818cabb3d8ff026682e7b39106c6f5",
617
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Base64\/Common.php": "c8512fc6d570a3198107493c7b8d20f38539caec221adb14161d7efbd6ab7d1d0bef4cb5528fcd84cd9484f1a9e0fbeb45aaa2365012680b0106ea92f8873281",
618
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Base64\/Original.php": "4564f7cfef60c318abe626832bcd355cffbe04d020e04d18c5554fc1610c4a1b0ae8d1111681e2a458ae0b9d7ef3528bd62aef019fe3c1a3f9d28b5ae58da86f",
619
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Base64\/UrlSafe.php": "dcbd158a52f33b9c64c8046c8f091d9af95657a562ac694c9ac0beb3a1876d55a3f23cd42c1777d9cf2a55cdae38d88ec54628b2d5fccd6befc92d4d51eaca2a",
620
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/ChaCha20.php": "f0015a4f95fb6028c015c954992233d76ff0b07c7c60de6347e7b7ff1cf704e80de4ed5b3e236502fddd3c56071aa8012758d905031d6154f965c4898251329c",
621
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/ChaCha20\/Ctx.php": "aeb8c31a1bb46b8519f280f23d349fa93911bf766715c0964c0a901369d0f0599e87c6e13459734f582a04ce74d9ba9f3ed7553d4b7214855a815424a8a8610d",
622
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/ChaCha20\/IetfCtx.php": "d22a84b5bbe07297fa80c989e93681b27b3ee502a9b77b63e2b08eccdca03cb98c39834feec5fce3cb0e1915f2944b06e94fe555da123de982fedc61b30c1f91",
623
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519.php": "b25ba0383cbaa00339f5cbaff6b400a25f3bd4d244d2fe70a08b987ead0ebb04a7f51b9476baf01fea5967610911f809114e39d21d4e278a9be72b48ca39b09e",
624
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519\/Fe.php": "0fad7d424e7f3fbc0abd6a4f9113c83523aadc3f9d3423a94da0954f56d31705ca567ffad0972794bfbba00c4909c8638130b99a983cc52022d262d6b7d145bb",
625
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519\/Ge\/Cached.php": "58ed8181f08dd61076c0ae9ce176455d951de04b9b1b03260c593d009414e9757d9120ea9e94040ddc1e0867f8a6574dc55e3acf82f946100d03d4506c9f778b",
626
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519\/Ge\/P1p1.php": "63b5f5a6c7061826799c2e3285884ac2108adb19ea246475b98fb68a26aebd694eeba56191fe15fbc1a9ecb9b85c139bf9e8b65b4456b8fb42652fcf29097fad",
627
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519\/Ge\/P2.php": "4caf0b912ad4bd82f8c447fc25829177323ba7af6d2355a7709b8ef99a855b51158e5252a1739cf6e9ae72b780e415af0cf3d510bded3fbce3542c99cf057535",
628
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519\/Ge\/P3.php": "5bd84bc8087c48e62e9d29451c0165376ae8486ad9288556c81e4cb897822cdaf95a2df6093f16e2a336839d0a4ea7c1535361bf041d8be0fddeb1eb245eae55",
629
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519\/Ge\/Precomp.php": "a58cbf2c93a75948b4576395ba1ebcef5a35b6dfb4625690e872010a44edd92939ba146b145cf40bc2cb6e45da0e19f169a45b575d813a70428f171459ee2d8c",
630
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519\/H.php": "0ce669e4f370acdbf6cf27d5a525b0a3a3bb7c794b8a2ccc7b2f3a3670fbb048a8493e3e6306a5f148204f50a5458d47ffe4a2705520e15631b02d45d39b0676",
631
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519\/README.md": "3f50765b54a3cf172c9cdaf2541a54273b811df61330af83883de5309103d6309a0900ecbae056f60aa831e438543c16c809fe183cc15c6a2f2bf15f6f910cf7",
632
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Ed25519.php": "89eada60bdd8739af528cd74b771a2ac04e36aa3e588549c7e8a82d2267a4df5eb4ef13c806185ac65bcd33fcba0f49a03cdbc03f143ffaa576ba6f4ab5efaa7",
633
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/HChaCha20.php": "e221d5f3c4818256a895cc05a8e68ae2b3cced7eaf4e425f3c373d59b2cec31fa7b498e5e42af7e374e70c3a176f966da3cccc4be97b646182a8bef2817986cd",
634
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/HSalsa20.php": "05e5376ceaa53ddb24971a43ded855892cf37fe0f03647660f573334ca79e61edafdd511c418cdb3d42e62298462e729c69b4dae3eb802c4749774b43d659536",
635
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Poly1305.php": "1bc3f6e6323d44ab76eca14cce61e7043ee98d8f7c50f29a5e29704c35adee345faaac767af588e1c6566f5732c1ec40ea815c51711056737460c9143adef1e8",
636
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Poly1305\/State.php": "9a69f92ff7c3e384cd57c0d5fddf9111d57abc9849acebb329ffd1ac4f53e539e1548140f4a430f628cb378d7fc980494307df13e4d1837b0af377bd7811c6d5",
637
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Ristretto255.php": "c4fcc5c22d8ece4e704c847ca01ce6edba7682fb2b9b91d74d664a204cd5955128c3bf8089a855312244f28c4ef6953927832ed989a03edf6eaec5c26df1722e",
638
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Salsa20.php": "8c2ad19b46f527ef9c091cbab17f64d36610745ef32f778e3911e1aa2a142e88c0f6e005ced046a678d66982d2e9ca48677f082697af3999cb62fecee4d800bb",
639
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/SecretStream\/State.php": "629c6f96a7bba323ddb8eb422e7048839c188560932cb4306b9f11ba8a2b15afdfc037fc14ce8725ed3efc72c26700cf6cd2ca4a85870fa885aad6b6d57a4a0c",
640
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/SipHash.php": "6f24cd7d32eb80c943461199a0937b0acdf01560542c54ca916fae6843c3dc5fa65d751380434508aa50501f7dfb6c227e9330996956c4a8c8b32b6ae55bebba",
641
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Util.php": "fe12c7259ad5daa7eecd8e199c77f822e612333169878309cec5b5483a9bcc775261c344a31023c2741d53f37f05a0f6dc6289dc45c7d7b8ac7fedafd5458d57",
642
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/X25519.php": "ea1d665ec23534de7f18c4f48094de4463753baf8b9ba011e38b969873bbaaa32e6b90bbbd0597baed3687c28e37fe394c224a229d734671b7d7e03197d039f1",
643
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/XChaCha20.php": "56d827be22c68fe9a2cc01b9f5890846197c5831c3c0f129d9b8c522391b7d7391a217a2dc48a4bd78e81c3d2f3bd8187546d311f991148fdf43a8a67730c81e",
644
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/XSalsa20.php": "c0367d97622bfb654340a6a7948e8ca4ed399d106dd8b27169a9f5d9bc6532129548b4dabf9f12ffba654f490b8adfa07b0b76935bda15705560feb7c590a3bb",
645
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/BLAKE2b.php": "97cb339b44cc54299394b4fc27c8ab13d5a8d48aa4c8fce71733a27cea5d3226df4341bf9722fb4f4ba71c38f5491d677774245d75bd91a693269aaba0487036",
646
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/ChaCha20.php": "da693dd0be25c739b477673933d361ed4b2f83110ae98f7c6805af20789fb4379b4b7a4ae34aca588666cfbdf61c2dd5776f8a4b1ee0215dae64ea09c6479a10",
647
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/ChaCha20\/Ctx.php": "621194fbbe2eb42c04c9d94e45e3a0ebafdb4cd87195b924705f8c2a9e54c9dc52fa6dcb39967ea1dc4ceeb6f2d20659a1b0aced8035529376f6244ffaa96f07",
648
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/ChaCha20\/IetfCtx.php": "b4a0690f9af7ace9fb3f8c10ca78989573a1cd49d3309f9c0011501daa3c44f7b616868e417096076846b19502ddaaaacb7c85f9b5c8622c57e4882982e09a10",
649
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519.php": "fd10531c29a88f84f8b7de7c09a0e9e66472658827bcbdc55dcb1fba54f620b32dfe9359788e67abe4f6ffed3e4841e6b74939d7504188cfda243512a86c7eb4",
650
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519\/Fe.php": "e6e5ce11b327d42167d51d2fa462ca6a54bf180229261af9ac1189fab30941148136ddabfff606dcf656985cb9da9bee93902f1863a84a3e5d42bfccbb0111d3",
651
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519\/Ge\/Cached.php": "350f529a5a178921a2f40818a1668c3effdeac12b9b8aded2f57f1654343d0f7f535c780c5a271d9b7772969fff9381befcb85aaf676650c67b6e583d616c064",
652
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519\/Ge\/P1p1.php": "fc8344d196cfa17fb61ab576b0a73f0ecbdfdf03de53d669cbf56bf10cf13eabd8c8a83d3eab7d9f9436b4dbb8d0785f9929c190059e0695579811405f3c840a",
653
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519\/Ge\/P2.php": "6c4051bff3e25a7863fcfef3b9c1f028fa8b94d301e4de5dcb6654c629bc95f44978fdb697698375e3cfd1dfb9ae6a3c8dfcad0bd5138e51cd5d5315b5e5b788",
654
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519\/Ge\/P3.php": "d6ee2e6bd34cba83a2025bd79e2d8a829d39f148c65ceee5a382662ef25b1c684552e0486ca29215f52d5d1e140176bdf6e2c40febd55970db55675b76d448e2",
655
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519\/Ge\/Precomp.php": "397b94e8292ad4f09cc37f1b08a7f364e12d6acb74f125ff0148c5562631f632a2ecc44db517cbd5ea61865e70732e6223a0c736b831c751df859a7d2afc4ae6",
656
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519\/H.php": "7bd14df9e3afbf8bc2ba27d5faf6ba72f17eed218cb7e89f4a458f500f6d9a60c52eaf5f1fd656d7de492246b0b0ac3d5904da319c5d85b754c64ce4b1f1b433",
657
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519\/README.md": "3f50765b54a3cf172c9cdaf2541a54273b811df61330af83883de5309103d6309a0900ecbae056f60aa831e438543c16c809fe183cc15c6a2f2bf15f6f910cf7",
658
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Ed25519.php": "30b970fe798803452a504ac453c70b5a2b51cf3094639dc58195b3c8e44fc37089c58bec2337d7f79ca60c91c4951af5dfa89e9dfbe3ae327084a806a6b8db7f",
659
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/HChaCha20.php": "d4fdd553cde5a1ff277805bbba85128e3ea59e4fc32eaacbc8502414148933c760ef6da06fd967bc594f9d22523c62e45ebd7cc9411ad4b76e2d76c0fc2c00c5",
660
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/HSalsa20.php": "8bbde85156bb88b6f0f14cab67840cabf1e1c456f9459edc145e09907161bd6fbea93fd37f121678064de6922102e78789cbfa3c2eddfcb40b93178fa3fbab6e",
661
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Int32.php": "325772c5cadd6953316e83afe2a04804041292f25cb16e6027ea230e20aebcdd819c937977918161eeb9c43187fc105be2824949c9d6059e9c0a39e0cbc42219",
662
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Int64.php": "8fde2b57266d78e8b03d8c3f89a1fbca3329bb6d0ed4526b3c6dbf5a0e92ef9d8e9e3697cd23b7eb5f7524fba7474cc5a2e06f1ba6faa04f7cb8729c985a5794",
663
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Poly1305.php": "f0cc2f5cf32a37ad6c3dbaff1a8a155ff334995eab78ab42f2e5bd950390babaee0c1588e3f17d4e73cf970b8e3c34f536096d7da23182f526b0eed704e3ecc8",
664
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Poly1305\/State.php": "8656ebf7aa0c2c7e8cf01546a261bf5e9f6c374eb5f40f8133bcb33e35bda2f19f47471b2ae6af6224df7ab9bf3886cc43b88049e8ddbe54b8dd129b28491129",
665
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Salsa20.php": "bbb3dc0a30030d9c5f5ef1ef63e36f9a067d67891185b9620ebee17a67bee31a7abc420abb7b82f38e913b5de54d235859f0e8f5f718d8f02316f4fb03e24b2a",
666
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/SecretStream\/State.php": "69d505517dbbdd2e77cf5aed72673edffa2aa008e70325db88877ba5673ac3ac070bc4c19cf13707932b0b4d71ee0a9b007e06a0f822292ec278a60def7cf511",
667
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/SipHash.php": "8c3c2d2e4c656ee6f7af729856cc4c79918ae2e09a167d6d0cb92f7dc9240c0bdaa36e65a167f5b63961d9f9ac4df2c19e50c848e5a6da5855566deb5b9ab8b4",
668
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Util.php": "d6ff44eb1015687847600f8b7f6a80974f4de1cb80224ea7f733e908fd53ba2aa669b97d891fe89bf0bb8d358c15a2bbf0661a779e68a715cde0405455127eb4",
669
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/X25519.php": "9e2d803c100fc9a3749100dda30fabe25c6ec59382be64f9995b6505e1652d5b2762111f2243b69316abd942c88106fa5239adcae842971f22fedd8e3aedd954",
670
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/XChaCha20.php": "1d4ef660701da25af79c9d4af2f158e3f62afbc1e5c2aa062f64b970dd33378d5f67c9f0172991985ddd65a976759e09f4604ffdf6ae158bd8a98f4e97af851d",
671
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/XSalsa20.php": "ffcbccb7d8a1d0262c5e74cbc679022bbcf1acf9160599ce2b92f66e261996f0e93b419231fd41ca95852e09b7a892dd8e98101c3426d30cb294f869908ee21b",
672
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Crypto.php": "1af076765319483b5e0c2a3ed9d5a12133fd41b7172cd15073da3723200c41cdf077dbee04f1e4badc2b86ee5e23965dfd0e8f3af3f52b3b584ab2f775f64cf7",
673
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Crypto32.php": "9fd3ecc6e6faec645f2c5166ca551cbb4ff8430664bdb46c383da399048de42ab505a05c709b6ed0de245402a1abd701f21398252f059003a59fd55bffd6399b",
674
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/File.php": "4f2a6c996bd3fe4a07e4e1d49d2790e68798add08c4887efb3d7bdc7beb5ec2c1601b8e77a0b40e570211f7d3b4e5a5f97471f60df8b31434487495677052640",
675
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/PHP52\/SplFixedArray.php": "2adc50710dd4bc2cc1138b741cde09f225f727f2177d006ce8ca82691de0336dc51b6c30384938eef1693ae92628460f8984aaacf336815dea092de4ed1521b5",
676
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/SodiumException.php": "705f6e9777db6be71970f7e218339e36d50023abf723446195cef782976d7431f815a90d1ed83e32ec527303057287f890215b4b0a9a8c992a13d111e8bfb947",
677
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/CHANGELOG.md": "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
678
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/LICENSE": "8756122099aea86ddf6f176a480c0454f2be6dd278e475bd6be7d7ab3d572162f1bd44c9f623e52e53514cb15336be6e84a5eafc8e2a347b481ab5799ebd6e17",
679
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/README.md": "b552bcb37ad765a0aba888fe43d2e2f41b5bee6c90e734c365797e74dd0b8c4df017ae74dab2458edb410630299efd7b649438db57acd53fefb1723e233416f3",
680
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/VERSION": "294108697ec66acf16af2f9518c5999605a8585058ad25dc9303029fd890e6835b2fcda23fff2ad60058f8f6a8a19c945d998e4e228453d4946e395b9aa2055d",
681
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/build.php": "485d76b827a54d8455550e8a8f8d14862f9444381da251e66c2bb8ceaf2106a554c1cd339666b1260450749d0244d6b9ba0c6d0a2220ab2411aa4041fc83f8ad",
682
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/composer.json": "e05f4af7ceef33d82ed5704be36e1b9839236d13073d0e23ef77d33ce7ec303cc2cfc2ddcd25318f1a5295bbe3b61a13bc2fe72f55c226e2f072e2a0b1959481",
683
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/composer.lock": "2b8c24986c6cbd290c0ce53ac4f773836751aebfd65a2350fd07b4cf45292ce2667a54494fa098da13a385ce7a9e10a2ed55d20f7c8dd6817f93f33a6cc710fd",
684
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/data\/ca-certificates.crt": "659e8d36bcb65a7fdd299ee008fc4ecd42be87d8ae7d7d15828567b9be44b4ed8a316978f2f7d3d5d7e96a4da0b30bb8bdcfae5202ef099691daa796318a869e",
685
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/docker-compose.yml": "1fe4c651e406095f0ff1bfc196406d473184bf53cf80f7c67dc79f1aa94b26db74174e0e9bc47adc95eb2a5f6eb950255c4a5cf44ccb7029ba712df3be9e6384",
686
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/docker\/Dockerfile": "a63d1fabd8c19fef37b90922aa4bb21fbd1094635666cf2a3a4db47009888bfd3f1ad5c34c05184e2ccc8f581971f6dae91c1ff137730821422cd482c39e9390",
687
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/docker\/entrypoint.sh": "2bf3911c365a271fc52d17a0aac1687abf52e5286a5d52cd34367e18651dcfd6ef1f791b54105b7742f5d691564ddca3c05a9ba4ce8edfbc68fe919e0bdf6c1e",
688
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/examples\/example_webhook.php": "336b92a647e49d8c994c8e6dc6b26670f0a58cb57d4679d0ba7177fa1f56a84a628e5385dd4c1c25a1395b1d8499e54d34eb2c20f9742a2a2a3d0cb20c36be08",
689
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/examples\/simple_webhook.php": "ed299912ca9a55170796df76b25c5c92462660b065ef7eabf24bf7f552e75fe44512fc3fa977fae2a9dd5e9be1ea28100a456de926fd7f24c32152f577f8e46b",
690
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/examples\/verify_sms_demo.php": "042dee741d4fe90d78edcd0614df6a371cee77d1a95d34623b4e558ead69378c693a33d044f450ea204efd7253e7eeee1e5a4119708dfddbafeea358bc5408b0",
691
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/init.php": "82a207681a76c9b00d1a35fcfe64753cf286d9d0122366f8c1f3009ecd6c548369d2b65d5b4e03f20faa9502b967a3bdae30865e5bf8598eba630b5f9555542f",
692
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Address.php": "a01e1efcaab0209fa7cf32ed85722ff793b9c0f750daf7d3bcd0499037dea764f2a61defa54b4bbaf602f8d0f5f477fd4198e35d6d8b47b82fd13c7a7e70ad59",
693
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/AlphanumericSenderID.php": "c6f7d381cd9901af59d67c66fbe6ace0729c77ac2b2962ce41351ed076cb39c9049aeeb72ba0e3933ebce4ab8a936b86a7e21d30a1c07b2b08cad9da2abcda1e",
694
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiOperations\/All.php": "5a6381d1492e2ebd1498fb4371b55c7e112ebf2c898e1861d7dfd2345db8c56df221795208a29b2a0e42295846fcf98f6a60fa8839df7e28fb66b9bde9226ce5",
695
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiOperations\/Create.php": "811f9227ecc5acb172e8e7120541227de0bc22cbf66a41490b743b3e49647a38889d5cfa5d64139b602572f0fcc0fbb96e3971c78801ed9acf7b50db2ab7499c",
696
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiOperations\/Delete.php": "e3cde9f67ab7281870c7399c4e76ff5807791b94b595567f56ee4ee494574e0f6f282a8d0c024c78c1709940198460f386ab8de6118a85de7d8a52feea0b0dd9",
697
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiOperations\/NestedResource.php": "209aecf9e6abb679b4f1ec2b59b1ce363a73970f6d389829b77802cb88b7bb368506e4d0aad42f090b715b4d4a580fdbe5c8479c02227102b4d147d615fbdb8e",
698
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiOperations\/Request.php": "afcba7de3fa312bc9e532e43bdcab8fcc5ca8b532c6f7bec08f94a8d7b2849467266f98af029bd688a136ac24ab2b7f438ca2fc666395c589d578e9d0156053b",
699
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiOperations\/Retrieve.php": "6f29bd2711e3c6b586c2bf6d9805b986a5f76fb0cd8c98c63259cd9873eeacd679f9718dd333110966ec3bb772e2ad06da7b1586bb590180770bf300aef63c8f",
700
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiOperations\/Update.php": "1d353ac81bc74cd57c75f01da21d6c59e053813930a0eb0fa054417bc87b6a140f64393bc04ac312b8c16803bb4c3eabae278839973f772e3202df32828480c0",
701
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiRequestor.php": "deeca798d9ba058eced71d846bd22cac360cbb25bd1271db25cd0ebdb29b1af9ee863b362849035e8a9f6ee62bd49b8415cec97e1fc01e674ad6942ac987b6e0",
702
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiResource.php": "f093051a36277165763e1ee66594056cc266fdb89caec9ab9223ae6af9add8ea4a20e6e3ea6fff4e9625fcbb95f430686f1f89db36f981d7d54034d79bf397a4",
703
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiResponse.php": "0d292d053a85224f4ac839f54253decab0eec5ae9861ca95314e98cad0fec2d2f0a7e712a8ec433adb302b6702d69262c8866b20fd08d67b2d18571965bf6789",
704
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/AvailablePhoneNumber.php": "7c82ca4fa28264c4fdd910c71741270657e52cdbc760343339bbb7c1d5980d27b7af476f7e1bd431926d428dba685a6e34d250f9678ef0a4e3cd8c4b06289e55",
705
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Balance.php": "333bbe5f278ca247d8287c8da5cf3b3f6a96c896a82e3c3b54d01277e3cdc82dd5bbda2a1253fb473a29c49d3030b73b24eb8231cc34f85b0a43bd853682e000",
706
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/BillingGroup.php": "60d9fed23d1520237a50a707986709f3b700d42d049e4070a48fbb50f257a98eab779f45a15939af3d5bce811014c01abbcb86fa1b9ccc5b89d55f44c4b1a308",
707
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Call.php": "eec97591c5e7af2b057dac6e6498cbb2c1fee0439b1b7f31c2d879a5a0fdb5a3eb5ba3bb7e3c5a9195d9019e9df82c99a491ec52f15bec59b496435c0787d43e",
708
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/CallControlApplication.php": "fee499465ecfdd2d5aee0479d3770a80219a5837bed934e0930413e6dde740be21bcd965216c782e0765ba18fd71714ac69a5ee887497845ccc1bd7797d6cac4",
709
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Collection.php": "ba4afd20a921ae7c838a74bd9efcc4e468fc12ecae86b2222f97c9405d376a77533f55924bd1d577429825e746ac59142f6d4576f4d446cb3757cb36b65894fd",
710
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Conference.php": "ef9da126fc06537687947c8eea71fc34a53a7d44607d60bcaea7d8c7f55e76a94a9d7e0057f9abf7efb1f4f270680cba042112a127c2c487fe3c617c5102be29",
711
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Connection.php": "c5f43a62ff80b2e91556dc63ad2f78cd83b4fcae4a7a28ede36388177591fbfc6c20b244f6fd4e540cd9401e34b04946bf422eedfce25316e61c89f15de97665",
712
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/CredentialConnection.php": "fe9d8b7b34a24f5b3b83d6a2597359fedce871db3a526124832d4bf4129e7515366ae16517b8dae259305ae69f95655aaa8b4710a9addc23fffee0e70b70b74c",
713
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ErrorObject.php": "cf83764f49da72bbc816c8741644e15b9a74481145c6c0c11c390221ee4c7ae485cfc09d77db24a48b0756b69c85570242bb2b903c39ca699e636a299ec4dd31",
714
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Event.php": "4e4ccaef81755432630c46881a958928c8b633ef1dea76d05f05711da17f68bf6e5b7b77395abf297b3ab128c065da7b4ed38d1be3a45306eb6d7a1080e72994",
715
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/ApiConnectionException.php": "b2a920958f3e1664a6ea5c5f32c73f9914b3f59d8a927c4e920d385ce87a6676475823729f203b09f5530da667f52e3dc3d4471fa498277270ee9360d0797b5f",
716
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/ApiErrorException.php": "b775efde92c04d1a53dd3f948f2efd92baf1f1dcb5092ed0863f37bb71fe03052562fa89349b1030f3d27a0dffa974ee47c9a3655b40a3941b05e721e7fe97c9",
717
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/AuthenticationException.php": "f8154528a04642cdd24f3de876b1a38d6f97e357d36badafd39e596ca739df7fb77f4259de1efde8bc300f126b20f6e242db4c1e3a25503565df579b62676ec7",
718
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/BadMethodCallException.php": "5e6df108c1df11bc1275948d96829f0ca6ff039126934ec57dbeee74913af00a64e6a9f2b58f42bf74aebeb94596c45cbcf66e5a4afa8924b238ca63d424f452",
719
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/ExceptionInterface.php": "77d5904b79a9a5b265ef121cd19d91b952f631ac7436e7896bb0786d9afc0b7ffe54c7ea901091baefa0154b91abfbb3f9f3a7fcfea4053f27cb44be2d7cb23f",
720
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/InvalidArgumentException.php": "f2872cf684dba5abd50bf876971e32364a23c9259c1e85a01575348614274453d00cc655b01c2dbf2c78c88f4a6143cb486c786dd1664204dc7676a64a9cac4c",
721
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/InvalidRequestException.php": "fa310ff5d5ea8f02f731089c27e6903d9b0e692a3faf272efd19ae4f1075a2a1219d167730b21cac6a30e705816c4230e2511fdda981fb47714f4d81606ffcdd",
722
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/PermissionException.php": "4cc209df863027760738530c5c01962702970a73ac7f11be232234413376dfd34db049f4e49305c8a15ee1f016b26f1c128312930e10cab174e80d6ba20cb12f",
723
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/RateLimitException.php": "c37157b02475d2a3940dc7d007b84cc3c86cab88b42e841a392e3ce4919e637c9b59bc7b33ad3ed8b4b32e74dddafd8e61a6f30d60029b8b1ecc82b8faad4833",
724
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/SignatureVerificationException.php": "3aaa44cc52efcc4caeaee624c070e8ec87b665decbdf00d8aef04ac857358028e4bc0495c4a86c504f3ccc6d753413c5ed685816e3b80851026bf2034514cb59",
725
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/UnexpectedValueException.php": "33504e45241779bae5e9c1d6ace82a75d545e6f7ae76f7d7f071fa4bbab13b2c23d11e59230da3c242b548ee7b5386bf4795e0d06d1719812348d1f9efb0c1cb",
726
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/UnknownApiErrorException.php": "cf5cc44f46c03d9d0de656e2ae61d7b077d123a4b6666a4b0f57fafa2033e072ceb5b14d6a47987bb14e0acd48ae00b39d4d6ac1849fadc879bcc43ed1acb44a",
727
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/FQDN.php": "b7d44de17cfcd207ac1fe6aada6c24871a98dadafc4cddebe28b135c6e507634608e1b6c7052a40cc750f6515fe19c2de29864d4b9551e7002fd800cc6cc05fa",
728
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/FQDNConnection.php": "527d18ad480447e4d79e567e7a91796ca31bb778f10011aa9fafafba6e769d387fdfbc306a6f1ba58e583bc7c37a9a66f1961494d3639dcdcd8912efcd0e6a55",
729
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Fax.php": "fd8af5f711fb5341e2b86a7fc66a49707bd31efabd2cd63a1d5153c24462f07341d6af618b7e82ff1faeb9bdc203f62b6dd5570d74754e052300d0d7edd0424b",
730
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/FaxApplication.php": "f489a9e161565a6e7f55a4d90fc05bdc8147a8947788a757a2b5464059ff2c49e61fa26b6d1f0b43fbf9ce8d0c08328e276442ab4d2d100e7ef34e9b2e0860c0",
731
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/HttpClient\/ClientInterface.php": "da6ee5de3e8aec8ac144511858cb3bec53bfd2aa0b5ff27eb43c7f72dcdbfb1646da223cbd861db7595db904007ff4c8d6a010122547a98bc1d2c07139328a80",
732
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/HttpClient\/CurlClient.php": "dfcbf2f40053699b94de74defc4a57461c2e07280976a377cf4ec3600e6279fa9cc434060b0291c7e10a634647e1a86e67cbaaadc49783eb532681ca25256a42",
733
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/IP.php": "624821d6dcc5d30a1a08368bacba88cc7ce8b768bb3315b3f8013606e303fa8940c13da8ece0c67a43329a0cfd86d8bd09682963eb54138f4253eb2f159c7560",
734
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/IPConnection.php": "01239dc2096fbe207ce1a5a58dad8d25795b9a8a81dbdd4290730009f2fafee76d74335aa951fb7b54e930e4e9530a0566daa9ef7e99ea60a50b8daf956f11dd",
735
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/InboundChannel.php": "c37478b08abc62ca491806db6e2814c4a28a11357fef873f6aff8867e179dc8d89817ee3db3fdaa84150111cbeb426ad0282dfd7550eb815dca100843f542178",
736
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Message.php": "18acf4bf51ec27d330df16216924c65a45db59895b610a3c803ef1d09beb7d96d20753b4ec16be06ed40f2886ad46bb3d866f14a87021484ede5d33ac1a93c4a",
737
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/MessagingHostedNumberOrder.php": "ecee6ab7a46ebf03b93870017aba4ce00c10ee36342a6d3ead209078aacf4ebcb798ae129535fb15af860355b52ea72ae6bcbf0e5261a9d66224e43560858227",
738
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/MessagingPhoneNumber.php": "2a2caa5e44efc5de92ef9b0f8ed0a68af1ab2c80932f4cd7fe79caa87ca1e146af3bd0e1d16d977738da2a3af1fb3cef77081c32a0dac50bbe8ef54a108efbc9",
739
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/MessagingProfile.php": "7a561dcea7b45a4ad4c3dbfc6baa766f011de2b2dee9a23e512689b374017b05f4fcc5c3510f19111a9d8484ed93a5e05d3dc01f35d75e356f475a894596dc49",
740
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/MobileOperatorNetwork.php": "d4436bfd9a628713889a37846829763909033339a086b6983eac792e9af42c0df2a8bcbd688c5c54a196d1fcb3d22aae7b45e9e18c015592d979e9a924c42ffd",
741
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/NumberLookup.php": "cac3b5f1ea0ca30f9121849a8aa52ed2e18b7776c4f1d552dca4c3536e0d4eb96af45267bb687319a9ec715972bc95a19c7dda54c33a2701e20cff9564dfcee5",
742
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/NumberOrder.php": "52067d9999c150fbefcbba9969b308bb6118eabe25bd08f30cc4978cdebd68fce4479e53d71ce29632133e8c69bb4ce9276301f5a36ea95bd77d29fd057f5d46",
743
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/NumberOrderDocument.php": "007830f9c03979a7811a4e0dd0c74c4b2b6d05e05b56b9d6ceb5a6e55167eb95b2546087ae17328715e01d486c0e58e396bc41816b44866391b98d48ca246d03",
744
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/NumberReservation.php": "988c853084f13e0d86445d6638517f84ef3d90c3f618c2c85c0bd8ab790012c3986a1a3eb3e00fef7759d04a6a1957bd9521bb8da6ade8c05fd2e02a8040f6a3",
745
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/OtaUpdate.php": "3c9579c6ac1ef6f31ff572fa3fb7562b3618182cb36eab3f406d8fbe6fc7b1d35a996e47923074428583ee3653aaff3792f9fdc47eabe1627f1a85722fd9dbf0",
746
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/OutboundVoiceProfile.php": "d0c5985f6f629904f4c95b892e329f280f7e0e13b8794d1950e216ef4c28ede7b94baa99f18803ff6f60b09d6178ad39fe5d3c182e984c2b4b57e9732991597e",
747
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/PhoneNumber.php": "8106765a769bf3f6190783917aa923f3f7690af5b7bf971e3dbe73ee5f227b27531a553cff9cc425ccfc7cf2ac52bcfc685f3d3b178875f8fa837a5de99a077c",
748
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/PhoneNumber\/Messaging.php": "d0aded1cbbd4c6108b0fc6e6773dbd03040af54c967f0a8aa9b2523db769317182889c882e6efe6fb0e187ac3f2919563aa6a937c77f4c1ff94e5bbc31f4d9d6",
749
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/PhoneNumber\/Voice.php": "e7e8184351cb186fee77019e88600dcb15da0435161d1878799433686e012167ab3347d7f02efb5cd511b5d02cd7b6547453f6ecaab623ed23fac7c91b0a7333",
750
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/PortingOrder.php": "ad9a683aab02c8817796e62131fa9cad6f3490d3afe231b5718b3b4f0689a535543362a88333ab808c36e9c41bfc8b7b6178be7fbd5b12f38b6d806053726997",
751
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/PortingPhoneNumber.php": "ff2e1e98371b6a7b0cc5265d1ab82f053d97711a72633a7d3911a4211dacf75c08083d6629aa4fc028643c0dc929d3ab56132f6f21808b875a9ce679e56fe055",
752
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Portout.php": "71de0eb22350f649e5023b2c4a374b3d10a4beb0f8066d67482c62f68a39219d9cda4bd95d91e1df2fc215479f45b1ab79bfc0ccc2d39267d2f268356ae83ec8",
753
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/RegulatoryRequirement.php": "0658d49bc2c20a9a16ac72ea01b5306eda422d81747529c3373333facb5ce1940252387aa498d2957dec62f0eeaa8aac3979ffd84ca72308e660a1a0708796d4",
754
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/RequestTelemetry.php": "cefdb55dce61e5f276bd49f6b49e57c78085338537e56cce6fea5a81cd1d2235f1eaa78be326cbd513117be88a046177afb628659088b66ce423799995c53709",
755
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ShortCode.php": "4abc882d0dbc72becbff07212d17b8e1383b0efb43818a7eab983fd2a08c3f591a4f4ba2f185003fab0622a43329c969d2fcc80b23cb94410007a0879309ad49",
756
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/SimCard.php": "46289711eda27b37931b0d9f7e9624c114ef9c1e997ea88055dfdf6fe6dfaf7f9169b9a67cbfe48100dc4df2b73ba4d27328b0ca3ff0af3655789535ec3c0b26",
757
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/TelephonyCredential.php": "497a3dde2d7fcf8bf57b502c71daa5e166010daae45e30e1db7ebacb3a37028fc70c7cdcf39a356dd32f845664e8e9723a366fa69610c8f9bd31fa59b3300624",
758
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Telnyx.php": "f5ecf9589eaf7db991051de8482d582b36edc387b8a7ca48c80a419c1a99e1393d7f099aa4ad3e87adb4706ab62c8714dc843c9a8ce77d6fe6ea5ab929d9a882",
759
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/TelnyxObject.php": "0f45c91559ef686a3eb4ce3777ab7d43ba288b380ffd1031cc3c562138410d3582c251e2d986e8a84a2c189257ed4307500e3fa0d662a48a30b28a9622ae8ad2",
760
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/AutoPagingIterator.php": "d03ac3841bb553d847be9ea73ab9debd8c1f2c829b0d38ac4416a121ac535a5ece2ecd9943d89e720cb5abb1c907ca9b96df899a561c190ccd6843bde785114b",
761
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/CaseInsensitiveArray.php": "d5bcc37aeab4fcbbe0b9f4a9057a5654f6080ed899ae54f8ef18bfc907f244071a6693386dd306caceb6bf338883a13c7972574ac5d700aa00e22ec363932cd6",
762
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/DefaultLogger.php": "50a69f9f6ad628e489a05fdad0df811c926c957c301adb0b4b906dcce9733a0598f6c2eb126865c54a0100131dc4230a834b1e98275237ce8e90bff2e96cd0fb",
763
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/LoggerInterface.php": "8d2dc2c59af5e625eaeef0b85b09f78a42e533b62fee84717d67a4c706fbacd94674f439d3ac60984c0a3947b7d2f5a8ccfb64e071c41d063b8298f57578f88c",
764
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/ObjectTypes.php": "99ce4f7d4d4d9d43e24f3124a7c21b9540267aa160c780efe69d6559843a12948f3790b179db66282b0adda384309a793636d71aeb97d9aab0a62dccfbe2b51b",
765
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/RandomGenerator.php": "292c880420b28390e3d734c6343acd48f322db0c474f80430402916de1dcbf8e988b3d2753a7c18e763e632f474284b213ccc8e8fe4e52f00569e72728dcccb4",
766
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/RequestOptions.php": "00b6d4890b5a38f42f13ffdca556bbf1377c05c8a79ad2d6d0b69b7e27deb70252c15088458da4bbd56e7832cc6b2828e261241661dc344727e2bfb170465de2",
767
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/Set.php": "9cfa1c1bc6c012e8a7a797ba8a7893382eeeb234da73f93594a159f78b9858c984dec1e42da5a6cdb240f00d27d250e3fd6a7842d40c23513661201a148a6c5e",
768
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/Util.php": "4556fc8b785486adfb60ea8001296ad0ae7b13d785f92d545324b557fc4aad85a69ec19dbca27dd868050d64670e4e2be2e3a4f50e4aaac609b0089c0e9e2749",
769
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Verification.php": "b63d4f9d717ba204dcedd1c3315db3300567fe09563faed0e4b8f1415171e43e0068fb06ebb2f42c808602248f623f5773414a1612539a873070f461398be650",
770
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/VerifyProfile.php": "fbdf0818dbe1fdcd6bf13720f21ab6552a3ee7930c80a9adc44c3863ebb3df990b18adc8beee6770f4fca9bcda0d514a689d051c129d871eca48f2c0eccd7649",
771
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/VerifyVerification.php": "f2883946ac990666dfa62e07dad649ae0c9de75d5682857cd22419fda8926d45d504ce4fbf38896a1cbf25323a604a818d3b89f05baf58d91cef497c54d981e7",
772
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Webhook.php": "b451d90496fcad105eb4f61d5716b93878405315742c09d7c4be96c6b9c0427e35c03c1a664ab2f30f1288566b45117f87b069a3ce96d64111ef6a1ef289ac9e",
773
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/WebhookSignature.php": "ad990cd80d771718468e39aab1b06809a0efb9bb47f5ea4d42a649dbe481f5929fcbd502da6140f1438920e96ce2e4af82d9cfd810b0ddd0eaea391599685c0d",
774
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/phpunit.no_autoload.xml": "06ad2f4fe0a292902757629f5605509f32a0d1dca527550619c98a61519d83fc70f3c886b12f5e5734b1031186fd9c7fed6fba813cd816b0f07d36c2a6bf11e4",
775
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/phpunit.xml": "82ac037adc20f2aa76682878094e8bffbfe31782dc6a94e2987bac5546e3ffec90577d03715f4ce481cc977685eec9e4109a61b4b46bc19351c2cad555d7cadf",
776
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/TelnyxMock.php": "e8e93ca1114530cb7e9cad46eb20e32072934496d515a9391ce8093773450dd60f3288f9d3ba46533a0f650fe67b508d5e54bbfc6e1642443d1fc043b88eaaeb",
777
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/TestCase.php": "9945df738b56e344648cc00d3d4b94345c15d8749ce511b5095a87d5e52aed35d8e3c773276d9dde9d9fa04eada784a55e4876ebf70a198ba719c8e94c8c32d8",
778
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/AddressTest.php": "dd980e7890ad3dc1d12858f2d241a461689a34892bd780a8db034e620c23d01587996042c2c12d82333b2072bfcca6585afb06213694b7415b0b13d3084b83f5",
779
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiOperations\/AllTest.php": "6031bc6fa9e899f06af9465468fb9e15bf5a9a7c1051fb52fbd383ea879842e72ba4b5347d07566182c632b5f66d5f2d4bdf73c1368a3581c6010330bff91ec9",
780
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiOperations\/CreateTest.php": "c94c7e854a40716aec0e257c4d7fa279c3e941d64a37e167d4885dae5a0e22a513c8f3b018c436eff90ee045432c5e34b96aeb7d879380e9386c2bc177b94f39",
781
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiOperations\/DeleteTest.php": "02ea2d3adfd1d83770f10dc42cc2c12c28079ca80933fbe02219ea79fe7eb6958d2b1d76cb7a0bfee9e308c01efb1eff61901e22d192e15e89ae67f7edcabe5e",
782
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiOperations\/RequestTest.php": "f6e158958616f0637f827b94cce168e873e0d3be09e4ec27165f984af3d89c0be4d5d5cd3ed66df5b6237bf183003a0de1c652f599827fd01a2ee7ad47d5fd61",
783
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiOperations\/RetrieveTest.php": "b26b8f61eb3cb893ce4ff9517817295fe9b727dd570b1cf79ace36e16902e0ab9f460d6b65342afa28c59236b59ec0ba0809e1cee673f69ea26489fdbf5f4f42",
784
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiOperations\/UpdateTest.php": "6aafed3640a1173822ac9a26c002168eeef552f9b681fab9ec4f191df4f988a920d8c290b2f875c02596ef613273ed003e4b5a6bb6e0bc2760f54ffff445cdd1",
785
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiRequestorTest.php": "5a1234c4a1e4107aaf970bf87f0fdb1420979dd575a548e589b046cd7feea4dc914f25bf15474fe5bcd9773c94184b610d06b309d48639964a78e6137078cb5a",
786
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiResourceTest.php": "05562966c7ecea541b0ae95f67a11d9e2b86e45439b436b319e252d5998e0eb7a6c9b677e233572fc616caee856d9764b56feed80fd07cc1bec0d861490753b4",
787
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiResponseTest.php": "6f8d458b49e34df5c0634276659fd441e4140fb4dade92b384230e4e2b897e0da6d0e82c373b1eca98770dc3396ffc8b924672ce2141426706c624d00ffc7af9",
788
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/AvailablePhoneNumberTest.php": "354326429958fdd199df78d11bbc582a0988018b8f907d93808cbd53243f50332482c0603bf4ff12db2a8977ffe7e663ea9d6e8cb5f485aece0d46ae8942833d",
789
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/BalanceTest.php": "8f866f88a8a59754e2fce7d5fe2a0bf50399fd21711cef171873a45308ff96f929b23163495c273e96c9894b7ea39ee5149c45e764fa0de3b51807a329c674c6",
790
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/BillingGroupTest.php": "4333c81ee3ac767fa600095d95f324286d289c7e105ab251f635d9a942e75c418bde60f96c5954ae29dc152ee5fe7679bc5a8b67452f5fa1f59a411dc4854c69",
791
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/CallControlApplicationTest.php": "2bb4f83cdf82457840352c5beaaed8963aba1dcb59711e310d5aaed0d35429730796b412f1aa4e85d5be5a2288ebdd12fc2be9ad75549506d1a613d604d20749",
792
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/CallTest.php": "50f830a3a3c28953ec53c244d22381910307513ba18b7199d5e7bffc5747863e4da975fa972114b2f8a81d0c24afb2f72df8315010febd8d606d086d79d82165",
793
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/CollectionTest.php": "9e742f72d8a223e64bf1a25362f9a28356c0b55037811510692880a359ee5e39266d9e76aa0832de39530e26798806929fb9ab9795a04651ff316f609e2211f8",
794
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ConferenceTest.php": "4e8ab0baaf21da65e3942b0d98caff11b7a30c24bae10ba546b82f7031d7a85b9d88087f9ac8172e69546eb7635bc1cf8f39b509017b82116e0e13b557bc1f7e",
795
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ConnectionTest.php": "429f80316a563f45783c87db6b6d3dd1564190b5c6a259f254e91ad8b71b2aa5e6ed40b9cf1a98632b7c89b66441e07f0285d434c78dd9729c032c7a4891d4ee",
796
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/CredentialConnectionTest.php": "a1c37f36e418debb034faa2b7df5095eee175ac8801baed517089622123dcc4af642448aecde7aa8b19cf67629de087e4995ec816d791b5007923ee614590c1c",
797
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ErrorObjectTest.php": "97344e9d24c204ae429b856d0b32299de4380ec52e9cfbdef6090add25355d268e3dd3ec35ae7c5e0893f5bb204624930d1a856932243180bb71b40e5a1dc08f",
798
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/EventTest.php": "5152c008cb3de14a47586eeaf3ef778629b2beef87fe154a2c40c337c3f918d664c0ea44d8339e22846fedc696fe6b98f0bb0b557d3f88a3ac62990445a55ec5",
799
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Exception\/ApiErrorExceptionTest.php": "7d54379e1ab9f7d6bddb721ea1c284a8d023674e24e99d115f388ae367250089e10b5962e2bd091e3ebbedd0cc83bb4f821eb0a986ae11487e341569ef7f5c6e",
800
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Exception\/InvalidRequestExceptionTest.php": "a7da1818af1dfb3eaade1e1a122a8a3224e03a557396e11528af75b13cfae07764f82a282a3161d514358b4c55312193c73b5a8900fd70463fe0a66b448cc9f8",
801
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Exception\/SignatureVerificationExceptionTest.php": "1bb0fd1563a5c91b78b02e4f66f3cf0288986f546a0805830e0d4ad1ac449549930558caf86c06cdc578279323c43e4739747961065d5ddfa198dbbcd9540599",
802
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/FQDNConnectionTest.php": "0af10bfb2398682865c4ee72cfb34425fe73b0fd20c86b51c61c4cf72f8c4d39a4ecfa21e4ae2e07a67fdf956057549f0c8c4f77e27e65dc1b75dae8b9b849c9",
803
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/FQDNTest.php": "625370468fb338819fb823fbd38656799a8750f5093eebf75c02cfb592969a8635a442ec2febfe07705a5d6feea362b7644c25c67ae653a245bdf55fc178a2ed",
804
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/FaxApplicationTest.php": "64a60460c62983cb0afc2c76880628e16270f14b0b761a8d62766cbe4c0fb33dfc7bd93ae0cb62de25a8f2b3e1994826fcbfe300ea37353f398c4cc8ed7dd62b",
805
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/FaxTest.php": "a920c8ac18021bedbbc4972109afb0cd0afc16e5d86df2fffa2f8e0bdf837e5684124f926f01daf0bae439473022899498441a770ad8cc52479da3d012f1ea1f",
806
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/HttpClient\/CurlClientTest.php": "cff15215b95a804e4ee233df60671c5c1e9270f621025f6ea7cd5a0bdbb55175caa6c43c62e176300bde05c9ee90d84efda0dcdf0d0b5dda4dab2a47d1a669b7",
807
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/IPConnectionTest.php": "6e034e287616ac89e5059d337c682e3fde010130f4403dc76fe4efa12742c40dac114ddc1aaf7ce9e553c597d9ac27170419c5e33fb1439c31c6b585953ff1a4",
808
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/IPTest.php": "7ff33e91d1c7b8bdbef1ca1f5e373150a05f709e524d5a62b000b5c8b8d697ce42306ea8df917305d9ef2a4ea19f797ca28e2f8d0d5f9e3e31c4ebe5eab55ee9",
809
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/InboundChannelTest.php": "c430f6df3eb5add5bda2342e4b4a3acd77b33d74758516782ee0a045d75e7387aaccf36017fdaef18d71cf8865a28faaa0cf07a4f31c9876858719d84d479657",
810
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/MessageTest.php": "08ae5ad7b98362fa7c1478254f851078ef7e9a223c74f3fc57619d2b9c255259edefefc400e261cceafce7072fa7457b8c1cb4dc8dda29b51e432f6d274a8c3a",
811
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/MessagingHostedNumberOrderTest.php": "f8f8ac7271fb01b07815e2a92d7a0974e4320de63942eadc12df307c9458a7cbda7ddae505a731c491e4aa6bcdda7bec04786890df80dd9acd422593f2a02c0e",
812
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/MessagingPhoneNumberTest.php": "7827d12be3191d1329168c6b277899b81df17aa18b775be538b9b29ec9a90868969c05cf61d53715c42105b92cc37977270c1a7b78bee3d13214d8ece51172f2",
813
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/MessagingProfileTest.php": "0949c56ac67ee6f87854959635dbd003391e497325305692784905987d114b399e4c648252f314bc1147e385daf4e60198cbfd6aa940a6cb24992b8cb5abc24e",
814
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/MobileOperatorNetworkTest.php": "6cdaa23aa8cd0a0e9cc43b6f17c86d9c1f7793f7eb30b774f4a8ae9754488e59e0c180823c31d062abaa356578a8718c65f367588c61015e5e36f9f98e7a5cbe",
815
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/NumberLookupTest.php": "e03a73e589abd73cf52a637dd7d273dd2477533b66bcb75685552b77b47f7b58116c4637477da7f9ccb36a408909d91d3f0d3079396aca9bee996b862f358499",
816
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/NumberOrderDocumentTest.php": "06f3e8f8e8dcf5d8c96f25a6f1888d59e9433654ff060701bcc5cb9f54b07357bb3606ac17af3e3913033fb639358df85c6d5c55bff114407168333d7d49cbec",
817
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/NumberOrderTest.php": "176ca2e94df05262e8a43f14e112fb62108ce886bd90a690e8b907881c696e35bd223f08a4960fb58ebebd20cd42bd4217ffa14132e53ddac260926c6d7e8842",
818
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/NumberReservationTest.php": "11742f7449c279908848fd493817731f3f1343895e16d3426a7a7f9fc3d4cc27e275a858e16d7efb8e9c18d32de1ffffc92929e8e3ba277157ab7304c3023c86",
819
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/OtaUpdateTest.php": "14830affab4936804afdd723714f2dc76c520fc2fd6e4d36d7bb255ef566836eafb6b29c18c5adb8785eed39f4bab030e3cd1aab1ef0293d9660b38a10fd6a45",
820
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/OutboundVoiceProfileTest.php": "e49828087e2114fb11569db7387a0acb7cce8bdb0cd655b280b567445ba2dbf16f8b66a88369876e7a2530fb282bf5a04be702719adf4ace871c2b6df8fa5edf",
821
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/PhoneNumber\/MessagingTest.php": "b3c5665f4661624f58f02b814ab1edbee5ceb8c26643bd356b486f049dbb498a44da0af43daf200890c79acad16d51c169d7aa1a2ad4befe074b0ac539ebe3c0",
822
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/PhoneNumber\/VoiceTest.php": "af08b444289d0194437c414916a8ec9285b98413d78e74d1c832b9b45583f9037832a538751628b5dc86b5a13c40c63e9dd360b719501762e8e868fcaa6fb215",
823
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/PhoneNumberTest.php": "7a07f41165e45e5fab268b0e01523c2f67f0ad146965c401856582c4b4a3f63e53324585b1785b41cbeb637d8e61e26e2bfdb57feaf6c6c04cc33be8e4864df8",
824
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/PortingOrderTest.php": "48d2ed4bb9354c772eef6484a0c9a195487c39f26bee3d143ddf64ae7da15e42e5f280a3e26eaa280940230fdee52ea09b7e5320823d4baefa73eec4490537ad",
825
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/PortingPhoneNumberTest.php": "476748b7e467c4f5a648c394eb19dbf297aebc2c16357c946dbc4f363241639dd1001985a7bb21166d5bc77bff1e31edce6e379dbda10f04406377dafcae1bd5",
826
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/PortoutTest.php": "cd262d5eae7c9ef9ba8c76856ef2d4f604484e6bf8646e9ad5231e89f5d45c8176a8ac33a757c53e4be8e2c98e6bb750c6041aefe8b2a589ac1e70a2db4493b2",
827
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/RegulatoryRequirementTest.php": "daa2836606e7c3f34fa122045e982e42f5da86b46f367ddcd7fe9b12e2a3fe5d472d4f38403d4b63aa0c58473d3b5901b8dd49b93a56fa3e76a0bdcf88ebade0",
828
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/RequestTelemetryTest.php": "61190b3601f7c2c72f55e9b1634cfaf11ca53231cf4b5f854ab14859b97f5dc0f07f6c95b8f7c3516ed253e13768b7d4ed9c1d15d0772fd1850eb894f5821152",
829
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ShortCodeTest.php": "f2e867e0b75d8334ccce51f7bdce842b350e7028319e8d388e0512b5e119585952a54ea79762010f12de8ffcd1c440638ba5300ddbe59adfdcefc712d8e079ac",
830
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/SimCardTest.php": "7000edb2f9b739bdbd44fceeee2e4a16c708efb22c7e38483569d5416f3c107bcecdc759e2e6108553193ba99acc542f5bf3bc353ee1428593a81b80d89ad7c8",
831
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/TelephonyCredentialTest.php": "1f65bad536cd49b2df684db54533b9799856b32464b80700bed5008c9379c414f756d075ab8e231d83f5bd9c1729dba064a5ab5c7e515ca5c32e85698e2036ad",
832
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/TelnyxObjectTest.php": "6214f2c38865c7a183f6a3fd64bc79e7f04963bd726fc124a87b65412075fd236e00cb5f5ed514a3ca2847faec77f4e7a14c59e8906478543daea9c4ddecb7b7",
833
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/TelnyxTelemetryTest.php": "ced938d8d20bdcd0d465155e1bd3ffbaec8ba96a6392c42dbec27a1d10a04da17b90fd3b91322c94b54fcd5a974528e6f10d081ca9b1915a8c8166e0727ceb31",
834
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/TelnyxTest.php": "d88d70053ebb64905acccf7e3cf651ea40c9155130e351d56135c96ada96263311faeabc83d4cef1e72387302ea4a11edf338c3744093d9828e056351eefe11a",
835
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Util\/CaseInsensitiveArrayTest.php": "671262198a48a16dc2ddb7ecf1c7fd309241db9c74c11072d86cbd2f56403973e4bb17ca5bc6c489bddf46cc391098dd6b666b134fded9430c211c2a3193fc58",
836
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Util\/DefaultLoggerTest.php": "39942a071430588bf6c089f5d0c97596b3b46b5b7a2b45d900cc41670dcf4bcf0d34e37895e494f0c89242e52d11d8a62f419650407c26ed91b43ea18c816e9e",
837
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Util\/ObjectTypesTest.php": "2d697994485e6c8f9084f9155a5a5b753261bcd2afcc9dfc5760daa5d4196b7c5baee49b264142a705ca7dd6c5d2cde227db3c1f860173aee6769299db95cd83",
838
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Util\/RequestOptionsTest.php": "86d628c4b19e4b7d057cac471219603643b6405e83745535b6c5f743fe84d5cf918a273f9e8e22c5eded36cc20ce49453e90c0ae05a9ed437059ddc287ccb5f7",
839
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Util\/SetTest.php": "c91cbf6d983f16e033eec154e56705b1d942243371df25d5cec7cb375a359faf29fec0c87fa5f3e4d7aad512d7e757361cf409e60d643fff7fa8fef72d9ff172",
840
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Util\/UtilTest.php": "10f13d306d3ac2211b67e759a6e1fbbbdcbc1cb791db4531ac799a8f84be67b3ab43cc85498b786b0630510324bf5039ac7ed39e2252f607f7937e802f9b578d",
841
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/VerificationTest.php": "8ea7985bfc5075c0e5d3a8b0b703af578479e481d769a0e8659d4b0996314aae15de36cc7022e087c0625c5976255aae323f9ac141e9e4fef3939a23fda6d260",
842
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/VerifyProfileTest.php": "c0986530c0ddd14e2227cbf9ceb0614aeec3c3b2dc37b5bce0de0d174ebd047f61fa28ba0787b4de1fd3efb5d77d5924e36ebf6fbba09711d0237f520365e8fc",
843
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/WebhookTest.php": "7e06c31d714348c6c9a6cf14c4a21a1f593287fe61e41630a6d766f15cf2595dccb1cd92981578cc205f6c89839a07c7c845efca2b44521d0aa36c0be9e444f7",
844
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/bootstrap.no_autoload.php": "cb002f7c8f77834b6414db6535f083bcd227ee6085363fa3cb0f66b55226680a45c8562fd8458249868465957b2aeae134b3379f8ee2ed22c96425475e9c0af1",
845
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/bootstrap.php": "50e143ed68aceb91d3e119d5a31521e76bfe9876bd780c90ac83afb7ca4f32be48ff81c33c134109eafe1d22f35e0957a9a834966b8853df99dc1df04795adf4",
846
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/data\/test.png": "6ad523f5b65487369d305613366b9f68dcdeee225291766e3b25faf45439ca069f614030c08ca54c714fdbf7a944fac489b1515a8bf9e0d3191e1bcbbfe6a9df",
847
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/openapi\/README.md": "0c54fffd5b7a5f393358864ff9e3bd3793075d6060cc1336603b2455d60f16d160ffd47b52bca6834acf0d9713855b386f69580099a3dcc131e8d5d617975ff2",
848
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/update_certs.php": "6a7fd896832dbc4c039fc907c74f25fad01f26882809d1ed0bef2870ba7db5d5930311208e2864190209862a077e4397dabcc1760ef2ec7e29127868016fc0d8",
849
+        "providers\/Twilio\/readme.txt": "879f75eaefe03b56788a884a5cb031533b33a94acd816b9e3e51a9cf0db826de700062955fc45d9561bd4c69f71178e2976f702e801fc06c3c076494c55c8bcb",
850
+        "templates\/content\/index.php": "63d6e27dee39188b80cef2b095db84791e02af0526b80d41bd37845386714f9f82cc9dafaf97fa355b927ab9b74527199ec70604480e09feb10a2b076e313b5a",
851
+        "templates\/index.php": "15ea019ef66fa303773941fa9ca673e472e9521b3f9fdb9052870e6f0596ca3939b247c8924ec0d67e0f3fee6e612e2c447a1297cf23cb5b6144e58a6197d65e",
852
+        "templates\/navigation\/index.php": "2b7b13c516cd0199d5a01a5c85ce3d93f347495d50201238648ed8a516f0f6ac4680f73b7776e11968f231379db4bb5960d79cf2d053df354ae072fb7a08e54e",
853
+        "templates\/settings\/admin.php": "8cacf367ddf1010227a355af99aad3589418b1cfc861c395b3ebdb71a9b1adafd061e10ea3cd5383e044437c5bddead6728fbb02b27248492c930e901edde1af",
854
+        "templates\/settings\/personal.php": "28012052db35429ce5ca5ad2e6192e5bbebadb6069dfab2b7df7e4fde3f34411d40c8f3406d030c384b2629a76ea3a6e96d7571474b7040fda9f655d7f10b95d"
855
+    },
856
+    "signature": "lixrXyMfrF+YGUnACyLlBDquK4fGiogddqhkWqvMvZR4yqDFfnVfEToqFI1vcfbro8\/kmxzixheiizBZ5O100SvO2GjJdH\/1q8lGJ3y9qNfLU+l9xWGmh4cJBuW7LNFxAWeQ\/kv3Q+rrMB3Qpf+G5CDyNgVkJDdJZndazrVGCwC44BWQKeU32x0Erf3azE2neb7R6OkIlrzryjszN7TkYO1KqHQIGgkBtUpK0hTRGXzToZS6\/jEPu6UJsfuveIlVpI6ASWRF+YU3PvBklKL57KuYamLKXlxaFaDoGPj4k0cJaYRmC\/9WqW2dO55EUy+iN9KK4M00SyLqomalOwWAiiAqFEC+QcUI2w390HYDI+8nO7hRNeyCxUOcxEY15PfJDUwOth2ErxCxvDytwy3IxazjKyAXdh2L74Q74DJ3rXi+mzBYpVBzY2addKNEa20UYuxy05DCKXl0bgioVW9how+eHINvr951lyIzSOKCcQDpSiMMyIe9l3R7XhccQBHKTnrERgK6ws0cvD20xVPwhdZe6N6Qshn87xsLew6aucLjHungihTY0xpGQebee\/0GkAews216u5hn2e7vU26Hl0+2\/RTaQJrmpn7R+wz8o8\/5h5oTkxtGa\/oTLNwWRcrBDKYN0Ur20Pvas\/1VuiNIG35uACPGWHAuYJpw\/vOkgS0=",
857
+    "certificate": "-----BEGIN CERTIFICATE-----\r\nMIIECTCCAvECAhG8MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD\r\nVQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI\r\nMTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB\r\ndXRob3JpdHkwHhcNMjIwMjI1MTYwMjIyWhcNMzIwNjAyMTYwMjIyWjAZMRcwFQYD\r\nVQQDDA5zbXNfcmVsZW50bGVzczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC\r\nggIBALbJJdLJIooOqb46AyOdNlWR9LXm3hWzjNBkH0o8wtMFEnotUOLcbaXbmTun\r\niG0Q0eunZGLSF6in+kY5M420Jh9bbDP6bYI8iDG6CSDkmKgnfcdJRlB6i7g0qBG8\r\noMzOB1x7ZVTef8Ho2ylTMWCxCfTlcQ15okAUpLU1G37I5rg0DZH2fPdGs9PMg11a\r\n64Tofl2GJSf9aHsgLi0AXXVzSN\/96wmK2fJYBqTVsPo5qIqKtMVWduhDXsb9yT4q\r\nDMYzyHrr8ydrMSGPwfs940R00hG2qHJcuKKGjYCCtu7djMfpKA9fqsGZBE6IWlVH\r\nCZxYIHPaEfHOybPR5d2GIKzncUQjtO2\/9rsju31GwzrVswG7w0tQUIIaj5AFLIL3\r\njnagjo2LH11ta9mB+DikaZDfd4VYEEfkTJA4BjnNCDa9pYOaFBGGwJMBSH3eWJCZ\r\nURBtk2NBnIheFRaGWRAzUpKAc+ZYdnmuAqe3Eh1en9GNlKTMCO+mAHkFJp3z8Nai\r\n1ijEVK+PIgtrzqc48ft0r6L43Zd184JnSIscBm\/9GUb0sCf+Uv4WFBKm4c7nrWtM\r\nC1LMKqmj2OYD1fZJ65M1VrkAqh8VXNtqQI1caBGMkcs4\/\/1eo\/XomL6sEkvfa9Y2\r\n1OywnVt52ZeLHyUS2P1mvPyWZgL8AxIie82Mtp7ZWX9Q8ubbAgMBAAEwDQYJKoZI\r\nhvcNAQELBQADggEBAI6OdKpKpevWVprPZ1TzUpq5ATj2JyCZySYC71Ud8l3lAEmn\r\nuh9ok5P7ccY\/c\/9\/ePWuvGxNSHmk1+nEEWC8XNXY5OoU9+i+g7vXd6EKOsowallw\r\nvWZB2rjl6+eNC\/AVa0NE2d9C6AWZtLxiV6rVsmkNUbBS6orHq8JJ2PSJKPT0\/nfM\r\nWL+ZORuFguWazEsy9oZBlplaWNxyAgq\/L66SKXynQPe74kZeVdZ5aQluHnBKZAoh\r\n6v0c2YiaoG5Mg6tDWcx4zM8HXv39Nbg2hcAtP2j3F9EkHZaytW9nM7nTIOxZJtR\/\r\nuGJtkj5+e1NQaMYn2NDiYSZALGUQ3YkHv4OIzDY=\r\n-----END CERTIFICATE-----"
858
+}
0 859
\ No newline at end of file
1 860
new file mode 100644
... ...
@@ -0,0 +1,4598 @@
1
+/**
2
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
3
+ *
4
+ * @author Double Bastion LLC
5
+ *
6
+ * @license GNU AGPL version 3 or any later version
7
+ *
8
+ * This program is free software; you can redistribute it and/or
9
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
10
+ * License as published by the Free Software Foundation; either
11
+ * version 3 of the License, or any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
17
+ *
18
+ * You should have received a copy of the GNU Affero General Public
19
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+
23
+$(document).ready(function() {
24
+
25
+  var userid = "<?php p($userId); ?>";
26
+  var parseddata = null;
27
+  var sentparseddata = null;
28
+  var groupedparsed = null;
29
+  // Set the default number of messages per page
30
+  var messagesperpage = 100;
31
+
32
+  // Get the number of messages per page from the database
33
+  var getNoPerPageUrl = OC.generateUrl("/apps/sms_relentless/user/getmessagesperpage");
34
+
35
+  $.ajax({
36
+        url: getNoPerPageUrl + '/' + userid,
37
+        method: 'GET',
38
+        success: function(mesperpagedb) {
39
+                 messagesperpage = parseInt(mesperpagedb);
40
+
41
+        },
42
+        error: function(mesperpagedb) {
43
+                 showAlert("Error while getting the number of messages per page. You can check the Nextcloud log to find more details about this issue!");
44
+        }
45
+  });
46
+
47
+
48
+  // List received messages
49
+  $("#receivedsmstableshow").on("click", function(event) {
50
+
51
+     $('#smstables').empty();
52
+     var getReceivedUrl = OC.generateUrl("/apps/sms_relentless/user/getreceivedtable");
53
+
54
+     $('#smstables').addClass('icon-loading');
55
+
56
+     $.ajax({
57
+          url: getReceivedUrl + '/' + userid,
58
+          method: 'GET',
59
+          contentType: 'application/json',
60
+          success: function(datafdb) {
61
+
62
+                var parseddata = datafdb.datarows;
63
+
64
+                $('#smstables').append("<div id='toptablerec'><div class='topbuttonandpage'><span id='recarrow' title='Show/Hide filters and Delete button'></span></div><div id='paginationrec' class='recpages'>Pages </div></div>");
65
+                $('#smstables').append("<table id='recSmsTable'></table>");
66
+
67
+                $('#recSmsTable').append("<tr id='recfiltersrow'><td class='selectalldvfilter'><button id='clearrecfilters' title='Clear all filters.'></button><button id='deleterecrows' title='Permanently delete the selected row(s) from below from the database.'></button></td><td class='selectalldvfilter'><input type='text' id='dbidtextrec' class='indivfilterrec' title='Enter a database ID number to apply the filter.'><input type='submit' id='databaseidfilter' class='filterbuttonsrec' value='' title='Filter rows by the specified database ID.' /></td><td class='selectalldvfilter'><input type='text' id='useridtextrec' class='indivfilterrec' title='Enter a Nextcloud username to apply the filter.' /><input type='submit' id='useridfilter' class='filterbuttonsrec' value='' title='Filter rows by the specified username.' /></td><td class='selectalldvfilter'><input type='text' id='messageidtextrec' class='indivfilterrec' title='Enter a fragment from a message ID to apply the filter.'  /><input type='submit' id='messageidfilter' class='filterbuttonsrec' value='' title='Filter rows by the specified string.' /></td><td class='selectalldvfilter'><input type='text' id='datetextrec' class='indivfilterrec' title='Enter a fragment of a date to apply the filter.'/><input type='submit' id='datefilter' class='filterbuttonsrec' value='' title='Filter rows by the specified string.' /></td><td class='selectalldvfilter'><input type='text' id='fromtextrec' class='indivfilterrec' title='Enter a fragment of a sender&#146s phone number or alphanumeric sender ID, to apply the filter.' /><input type='submit' id='fromfilter' class='filterbuttonsrec' value='' title='Filter rows by the specified string.' /></td><td class='selectalldvfilter'><input type='text' id='totextrec' class='indivfilterrec' value='' title='Enter a fragment of a recipient&#146s phone number to apply the filter.'  /><input type='submit' id='tofilter' class='filterbuttonsrec' value='' title='Filter rows by the specified string.' /></td><td class='selectalldvfilter'><input type='text' id='messagetextrec' class='indivfilterrec' title='Enter a fragment of a message to apply the filter.' /><input type='submit' id='messagefilter' class='filterbuttonsrec' value='' title='Filter rows by the specified string.'/></td></tr>");
68
+                $('#recSmsTable').append("<tr class='receivedrows' id='recheaderrow'><th id='selectalldv' class='selectsmsdv'><input type='checkbox' id='selectAllChckbx' class ='indivchckbx' title='Select all rows.' /></th><th title='The database ID of each message.'>ID</th><th>User ID</th><th>Message ID</th><th>Date</th><th>From</th><th>To</th><th>Received Message</th></tr>");
69
+
70
+                $('#recfiltersrow').hide();
71
+
72
+                if (datafdb.showdispnm == 1) {
73
+
74
+                    for (var i = 0; i < parseddata.length; i++) {
75
+
76
+                         if (parseddata[i].author_displayname) {
77
+                             var procrcmessage = "<span class='messageAuthorName'>"+ parseddata[i].author_displayname + ":</span>" + parseddata[i].message +"<div id='showMsgConv-"+ i +"' class='lstMsgConv'><img class='lstMsgConvImg' src='/apps/sms_relentless/img/reply.svg' title='Show all the messages exchanged between the current 2 phone numbers.'></div>";
78
+                         } else {
79
+                             var procrcmessage = parseddata[i].message +"<div id='showMsgConv-"+ i +"' class='lstMsgConv'><img class='lstMsgConvImg' src='/apps/sms_relentless/img/reply.svg' title='Show all the messages exchanged between the current 2 phone numbers.'></div>";
80
+                         }
81
+
82
+                         if (parseddata[i].internal_sender == 0) {
83
+                             var procrecFrom = "<div id='frmNmbr-"+ i +"'><div id='addDispName-"+ i +"' style='display:block;margin-right:5px;'><img class='addNameToPhNb' src='/apps/sms_relentless/img/user-grey.svg' title='Associate a Display Name with this phone number'></div>"+ parseddata[i].from +"<div id='showMsgFrom-"+ i +"' class='listToFromMsgs'><img class='lstMsgToFromImg' src='/apps/sms_relentless/img/list.svg' title='Show all the messages sent/received to/from this phone number, that I am allowed to see.'></div></div>";
84
+                         } else {
85
+                             var procrecFrom = "<div id='frmNmbr-"+ i +"'>"+ parseddata[i].from +"<div id='showMsgFrom-"+ i +"' class='listToFromMsgs'><img class='lstMsgToFromImg' src = '/apps/sms_relentless/img/list.svg' title='Show all the messages sent/received to/from this phone number, that I am allowed to see.'></div></div>";
86
+                         }
87
+
88
+                         var procrecTo = "<div id='toNmbr-"+ i +"'>"+ parseddata[i].to +"<div id='showMsgTo-"+ i +"' class='listToFromMsgs'><img class='lstMsgToFromImg' src = '/apps/sms_relentless/img/list.svg' title='Show all the messages sent/received to/from this phone number, that I am allowed to see.'></div></div>";
89
+
90
+                         $("#recSmsTable").append("<tr id='singlerow_"+ i +"' class='receivedrowsbody'><td class='selectsmsdv'><input type='checkbox' id='selectspec_"+ i +"' class='indivchckbx' /></td><td class='dbidcolumnrec'>"+ parseddata[i].id +"</td><td class='useridcolrec'>"+ parseddata[i].user_id +"</td><td class='messageidcolrec'>"+ parseddata[i].message_id +"</td><td class='datecolrec'>"+ parseddata[i].date +"</td><td class='fromcolumnrec'>"+ procrecFrom +"</td><td class='tocolrec'>"+ procrecTo +"</td><td class='messagecolumnrec'>"+ procrcmessage +"</td></tr>");
91
+                    }
92
+
93
+                } else {
94
+
95
+                    for (var i = 0; i < parseddata.length; i++) {
96
+
97
+                         var procrcmessage = parseddata[i].message +"<div id='showMsgConv-"+ i +"' class='lstMsgConv'><img class='lstMsgConvImg' src='/apps/sms_relentless/img/reply.svg' title='Show all the messages exchanged between the current 2 phone numbers.'></div>";
98
+
99
+                         if (parseddata[i].internal_sender == 0) {
100
+                             var procrecFrom = "<div id='frmNmbr-"+ i +"'><div id='addDispName-"+ i +"' style='display:block;margin-right:5px;'><img class='addNameToPhNb' src='/apps/sms_relentless/img/user-grey.svg' title='Associate a Display Name with this phone number'></div>"+ parseddata[i].from +"<div id='showMsgFrom-"+ i +"' class='listToFromMsgs'><img class='lstMsgToFromImg' src='/apps/sms_relentless/img/list.svg' title='Show all the messages sent/received to/from this phone number, that I am allowed to see.'></div></div>";
101
+                         } else {
102
+                             var procrecFrom = "<div id='frmNmbr-"+ i +"'>"+ parseddata[i].from +"<div id='showMsgFrom-"+ i +"' class='listToFromMsgs'><img class='lstMsgToFromImg' src = '/apps/sms_relentless/img/list.svg' title='Show all the messages sent/received to/from this phone number, that I am allowed to see.'></div></div>";
103
+                         }
104
+
105
+                         var procrecTo = "<div id='toNmbr-"+ i +"'>"+ parseddata[i].to +"<div id='showMsgTo-"+ i +"' class='listToFromMsgs'><img class='lstMsgToFromImg' src = '/apps/sms_relentless/img/list.svg' title='Show all the messages sent/received to/from this phone number, that I am allowed to see.'></div></div>";
106
+
107
+                         $("#recSmsTable").append("<tr id='singlerow_"+ i +"' class='receivedrowsbody'><td class='selectsmsdv'><input type='checkbox' id='selectspec_"+ i +"' class='indivchckbx' /></td><td class='dbidcolumnrec'>"+ parseddata[i].id +"</td><td class='useridcolrec'>"+ parseddata[i].user_id +"</td><td class='messageidcolrec'>"+ parseddata[i].message_id +"</td><td class='datecolrec'>"+ parseddata[i].date +"</td><td class='fromcolumnrec'>"+ procrecFrom +"</td><td class='tocolrec'>"+ procrecTo +"</td><td class='messagecolumnrec'>"+ procrcmessage +"</td></tr>");
108
+                    }
109
+                }
110
+
111
+                $('#smstables').append("<div id='totalrecmessages'>Total displayed messages: " + parseddata.length + "</div>");
112
+
113
+                $('#smstables').removeClass('icon-loading');
114
+                $('#recarrow').removeClass('arrowUpCl');
115
+                $('#recarrow').addClass('arrowDownCl');
116
+
117
+
118
+                // Show the pop-up window that lists all the messages exchanged between the current 2 phone numbers
119
+                function showRecMsgPerConv(phNumberFrom, phNumberTo) {
120
+
121
+                   let allfrmtomsg = "<div id='listAllMsgsConv'>";
122
+                   allfrmtomsg += "<div id='draglstMsgmWindow'><img src='/apps/sms_relentless/img/dots.svg'></div>";
123
+                   allfrmtomsg += "<a id='closeFrmMsgWindow' title='Close this window'></a>";
124
+                   allfrmtomsg += "<div class='showByNmbrTitle'>Messages exchanged between <span style='color:#04957b'>"+ phNumberFrom +"</span> and <span style='color:#04957b'>"+ phNumberTo +"</span></div>";
125
+                   allfrmtomsg += "<div id='frmMsgLstWrap'>";
126
+                   allfrmtomsg += "<table id='frmMsgLstTbl'>";
127
+                   allfrmtomsg += "<tr class='groupedrowsbody'><td><div id='grpdbynamelst' class='groupedLstNamespn'></div></td><td><div id='loadMoreMsgs' title='Click to load older messages.'>Load more messages</div><div id='loadMoreMsgsusr' title='Click to load older messages.'>Load more messages</div><div id='msgListRowCell' class='groupedLstMsgspn'></div><div id='arrowupWrap'><div id='upArrowSmall' title='Scroll to the top'></div></div></td></tr>";
128
+                   allfrmtomsg += "</table></div>";
129
+                   allfrmtomsg += "<div id='sendMsgReply'><table id='sendMsgConv'><tr><td><div id='fromPhoneNmbrConv'>From: <select id='selectFromNbConv'></select></div><div id='toPhoneNmbrConv'>To: <span id='toNmbrConv' style='color:#04957b'>"+ phNumberFrom +"</span></div></td></tr>";
130
+                   allfrmtomsg += "<tr><td><textarea id='sendMsgConvText' placeholder='Enter a message here, then press Send SMS'></textarea></td></tr></table>";
131
+                   allfrmtomsg += "<div id='sendMsgConvBtn'>Send SMS</div></div>";
132
+                   allfrmtomsg += "<div style='display:block;width:100%;height:14px;'><img id='expandWindowRpl' src='/apps/sms_relentless/img/arrowDown.svg' title='Expand to send a reply'></div>";
133
+                   allfrmtomsg += "<div id='draglstMsgmWindowsc'><img src='/apps/sms_relentless/img/dots.svg' style='padding:4px;vertical-align:top;'></div>";
134
+                   allfrmtomsg += "</div>";
135
+
136
+                   $("#content").append("<div id='recTblOverlay'></div>");
137
+                   $("#content").append(allfrmtomsg);
138
+
139
+                   let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 340) +"px";
140
+                   let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 300) +"px";
141
+                   $("#listAllMsgsConv").css({ "top" : topDist, "left" : leftDist });
142
+
143
+                   $("#closeFrmMsgWindow").click(function() { $("#listAllMsgsConv").remove(); $("#recTblOverlay").remove(); });
144
+                   $("#recTblOverlay").click(function() { $("#listAllMsgsConv").remove(); $("#recTblOverlay").remove(); });
145
+
146
+	           // Expand the window when clicking on the arrow, to be able to send a reply message
147
+	           $("#expandWindowRpl").click(function() {
148
+
149
+	              if ($(this).attr('src') == '/apps/sms_relentless/img/arrowDown.svg') {
150
+                          $("#sendMsgReply").css("display", "block");
151
+                          $("#listAllMsgsConv").css("height", "618px");
152
+	                  $(this).attr('src', '/apps/sms_relentless/img/arrowUp.svg');
153
+                          $(this).attr('title', 'Collapse');
154
+	              } else {
155
+                          $("#sendMsgReply").css("display", "none");
156
+                          $("#listAllMsgsConv").css("height", "490px");
157
+                          $(this).attr('src', '/apps/sms_relentless/img/arrowDown.svg');
158
+                          $(this).attr('title', 'Expand to send a reply');
159
+	              }
160
+	           });
161
+
162
+                   // Send a message from the 'conversation' window
163
+                   $("#sendMsgConvBtn").click(function() {
164
+
165
+                      $("#sendMsgConv,#sendMsgConvBtn").addClass('icon-loading');
166
+                      var msgToSend = $("#sendMsgConvText").val();
167
+                      var selectedid = $("#selectFromNbConv").val();
168
+                      var toNumber = $("#toNmbrConv").text();
169
+                      var receiversNumbers = [toNumber];
170
+
171
+		      if (selectedid != '') { 
172
+
173
+			  var sendersplit = selectedid.split(":");
174
+			  var providercap = sendersplit[0];
175
+			  var provsec = sendersplit[1];
176
+
177
+			  if (/[a-zA-Z]/.test(provsec)) {
178
+			      var alphanumcheck = true;
179
+			  } else { var alphanumcheck = false; }
180
+
181
+			  if (providercap == 'Tx' && alphanumcheck == false) {  
182
+			      var senderproc = selectedid.replace(/[^0-9]/g, "");
183
+			      var selectedsender = "+" + senderproc;
184
+			      var providerUsed = "telnyx";
185
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmstel");
186
+			  } else if (providercap == 'Pl' && alphanumcheck == false) {
187
+			      var selectedsender = selectedid.replace(/[^0-9]/g, "");
188
+			      var providerUsed = "plivo";
189
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmsnex");
190
+			  } else if (providercap == 'Tw' && alphanumcheck == false) {  
191
+			      var senderproc = selectedid.replace(/[^0-9]/g, "");
192
+			      var selectedsender = "+" + senderproc;
193
+			      var providerUsed = "twilio";
194
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmstwil");
195
+			  } else if (providercap == 'Fl' && alphanumcheck == false) {  
196
+			      var senderproc = selectedid.replace(/[^0-9]/g, "");
197
+			      var selectedsender = "+" + senderproc;
198
+			      var providerUsed = "flowroute";
199
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmsflow");
200
+			  } else if (providercap == 'Tx' && alphanumcheck == true) {
201
+			      var selectedsender = provsec;
202
+			      var providerUsed = "telnyx";
203
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmstel");
204
+			  } else if (providercap == 'Pl' && alphanumcheck == true) {
205
+			      var selectedsender = provsec;
206
+			      var providerUsed = "plivo";
207
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmsnex");
208
+			  } else if (providercap == 'Tw' && alphanumcheck == true) {
209
+			      var selectedsender = provsec;
210
+			      var providerUsed = "twilio";
211
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmstwil");
212
+			  } else if (providercap == 'Fl' && alphanumcheck == true) {
213
+			      var selectedsender = provsec;
214
+			      var providerUsed = "flowroute";
215
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmsflow");
216
+			  }
217
+
218
+                          var uploadedtomms = [];
219
+
220
+	                  if (msgToSend != '') {
221
+
222
+				  $.ajax({
223
+				     url: relbaseUrl + '/' + userid,
224
+				     type: "POST",
225
+				     data: {
226
+				           receiversPhoneNbs: receiversNumbers,
227
+				           fromsender: selectedsender,
228
+				           waitinterval: 1000,
229
+				           sentsmstext: msgToSend,
230
+				           ismms: 0,
231
+				           mmsfiles: uploadedtomms
232
+				         },
233
+				     success: function(displayname) {
234
+
235
+                                           var tzdate = new Date();
236
+                                           var presDatest = new Date(tzdate.getTime() - (tzdate.getTimezoneOffset() * 60000)).toJSON();
237
+                                           var presDatedb = presDatest.split(".")[0];
238
+                                           var presDatesc = presDatedb.split("T");
239
+                                           var presDate = presDatesc[0] +" "+ presDatesc[1];
240
+                                           var sentMessageStatus = '';
241
+
242
+                                           if (displayname) {
243
+                                               var msgToSendproc = "<span class='msgAuthorNameGrp'>"+ displayname + ":</span>" + msgToSend; 
244
+                                           } else { var msgToSendproc = ''; }
245
+
246
+                                           $("#msgListRowCell").append("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ selectedsender +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ receiversNumbers[0] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ msgToSendproc +"</div><div style='display:inline-block;margin:6px 6px 0px 4px;font-size:12.5px;color:#353535;'>"+ presDate +"</div><div class='sentMssgStatus'>"+ sentMessageStatus +"</div></div>");
247
+
248
+                                           // Scroll down to the bottom of the window
249
+                                           $("#frmMsgLstWrap").animate({scrollTop:$("#frmMsgLstTbl").prop("scrollHeight")},200);
250
+
251
+                                           $("#sendMsgConv,#sendMsgConvBtn").removeClass('icon-loading');
252
+				     },
253
+				     error: function() {
254
+                                           showAlert("Error while sending the message. You can check your Nextcloud log to find out more about this issue.");
255
+				           $("#sendMsgConv,#sendMsgConvBtn").removeClass('icon-loading');
256
+				     }
257
+				  });
258
+			  } else {
259
+                                  showAlert("Please enter a message in the text box!");
260
+				  $("#sendMsgConv,#sendMsgConvBtn").removeClass('icon-loading');
261
+			  }
262
+		      } else {
263
+                              showAlert("Please choose a Sender ID from the 'From' drop-down list!");
264
+			      $("#sendMsgConv,#sendMsgConvBtn").removeClass('icon-loading');
265
+		      }
266
+
267
+                   });
268
+
269
+
270
+	           // Make the window draggable
271
+	           function makeMgrWndDraggable(e) {
272
+
273
+			   window.pmdragging = {};
274
+			   pmdragging.pageX0 = e.pageX;
275
+			   pmdragging.pageY0 = e.pageY;
276
+			   pmdragging.elem = $("#listAllMsgsConv");
277
+			   pmdragging.offset0 = $("#listAllMsgsConv").offset();
278
+
279
+			   function handle_dragging(e) {
280
+			       let left = pmdragging.offset0.left + (e.pageX - pmdragging.pageX0);
281
+			       let top = pmdragging.offset0.top + (e.pageY - pmdragging.pageY0);
282
+			       $(pmdragging.elem).offset({top: top, left: left});
283
+			   }
284
+
285
+			   function handle_mouseup(e) {
286
+			       $('body').off('mousemove', handle_dragging).off('mouseup', handle_mouseup);
287
+			   }
288
+
289
+			   $('body').on('mouseup', handle_mouseup).on('mousemove', handle_dragging);
290
+	           }
291
+	           $("#draglstMsgmWindow").mousedown(makeMgrWndDraggable);
292
+	           $("#draglstMsgmWindowsc").mousedown(makeMgrWndDraggable);
293
+
294
+
295
+                   // Append the available phone numbers to the From drop-down list
296
+                   var availPhoneNmbrs = [];
297
+                   $("#currentsmsnmbrs .optselectsmsnb").each(function() {
298
+                      var crtphnmbr = $(this).attr("value");
299
+                      if (crtphnmbr != "") { availPhoneNmbrs.push(crtphnmbr); }
300
+                   });
301
+
302
+                   if (availPhoneNmbrs.length > 0) {
303
+                       var avphopt = "";
304
+                       for (let d = 0; d < availPhoneNmbrs.length; d++) {
305
+                            if (availPhoneNmbrs[d].indexOf(phNumberTo) === -1) {
306
+                                avphopt += "<option value='"+ availPhoneNmbrs[d] +"'>"+ availPhoneNmbrs[d] +"</option>";
307
+                            } else {
308
+                                avphopt += "<option value='"+ availPhoneNmbrs[d] +"' selected>"+ availPhoneNmbrs[d] +"</option>";
309
+                            }
310
+                       }
311
+                       $("#selectFromNbConv").append(avphopt);
312
+
313
+                   } else { $("#selectFromNbConv").append("<option value='' selected>No IDs</option>"); }
314
+
315
+
316
+                   // Get the sent/received messages for the current phone number, from the database
317
+		   let getGrpConvUrl = OC.generateUrl("/apps/sms_relentless/user/getgroupedforreply");
318
+
319
+		   $('#listAllMsgsConv').addClass('icon-loading');
320
+		   let totalPhNmbrs = 0;
321
+
322
+		   $.ajax({
323
+			  method: 'POST',
324
+			  url: getGrpConvUrl + '/' + userid,
325
+			  contentType: 'application/json',
326
+                          data: JSON.stringify({ phoneNmbrFrom: phNumberFrom, phoneNmbrTo: phNumberTo }),
327
+			  success: function(groupedperconv) {
328
+
329
+				     $('#listAllMsgsConv').removeClass('icon-loading');
330
+
331
+				     let fromtoNmbrsData = [];
332
+
333
+				     for (let i = 0; i < groupedperconv.length; i++) {
334
+
335
+					     if (groupedperconv[i].author_displayname) {
336
+						 var authordnm = groupedperconv[i].author_displayname;
337
+					     } else { 
338
+						 var authordnm = '';
339
+					     }
340
+
341
+					     var sentfromnmbrarr = groupedperconv[i].from.split("+");
342
+				             if (sentfromnmbrarr[1]) {
343
+						 var groupednbfrom = "+"+ sentfromnmbrarr[1];
344
+				             } else {
345
+						 var groupednbfrom = sentfromnmbrarr[0];
346
+				             }
347
+
348
+				             var modmessagerec = '';
349
+				             if (groupedperconv[i].author_displayname) {
350
+						 modmessagerec = "<span class='msgAuthorNameGrp'>"+ groupedperconv[i].author_displayname + ":</span>" + groupedperconv[i].message;
351
+				             } else {
352
+			                         modmessagerec = groupedperconv[i].message;
353
+                                             }
354
+
355
+				             if (groupedperconv[i].to.indexOf(": ") > -1) {
356
+				                 var groupednmbrtopre = groupedperconv[i].to.split(": ");
357
+				                 var groupednmbrto = groupednmbrtopre[1];
358
+				             } else { 
359
+				                 var groupednmbrto = groupedperconv[i].to;
360
+				             }
361
+
362
+				             fromtoNmbrsData.push({
363
+				                       'author_displayname': authordnm,
364
+				                       'from': groupednbfrom,
365
+				                       'to': groupednmbrto,
366
+				                       'message': modmessagerec,
367
+				                       'date': groupedperconv[i].date,
368
+				                       'status': groupedperconv[i].deliveryreceipt,
369
+				                       'table': groupedperconv[i].table
370
+				             });
371
+				     }
372
+
373
+
374
+				     // Remove the duplicates
375
+				     let noDupMsgData = [];
376
+				     $.each(fromtoNmbrsData, function(i, e) {
377
+					    let matchingData = $.grep(noDupMsgData, function(item) {
378
+				                    return item.from == e.from && item.to == e.to && item.message == e.message && item.table == 'received' && e.table == 'sent';
379
+					    });
380
+					    if (matchingData.length === 0) {
381
+						noDupMsgData.push(e);
382
+					    }
383
+				     });
384
+
385
+				     let messagesPerNmbr = {};
386
+				     let msgsNamesPerNmbr = {};
387
+				     let msgsNmbrsNames = {};
388
+
389
+			             let displayNamesarr = [];
390
+			             let convData = [];
391
+
392
+			             for (let n = 0; n < noDupMsgData.length; n++) {
393
+
394
+			                  if (noDupMsgData[n]['from'] == phNumberFrom && noDupMsgData[n]['table'] == 'sent') {
395
+
396
+			                      convData.push({
397
+			                                     'author_displayname': noDupMsgData[n]['author_displayname'],
398
+			                                     'message': noDupMsgData[n]['message'],
399
+			                                     'from': noDupMsgData[n]['from'],
400
+			                                     'to': noDupMsgData[n]['to'],
401
+			                                     'date': noDupMsgData[n]['date'],
402
+			                                     'direction': 'sent_from',
403
+			                                     'status': noDupMsgData[n]['status'],
404
+			                                     'table': noDupMsgData[n]['table']
405
+			                      });
406
+
407
+			                  } else if (noDupMsgData[n]['to'] == phNumberFrom && noDupMsgData[n]['table'] == 'sent') {
408
+
409
+			                      convData.push({
410
+			                                     'author_displayname': noDupMsgData[n]['author_displayname'],
411
+			                                     'message': noDupMsgData[n]['message'],
412
+			                                     'from': noDupMsgData[n]['from'],
413
+			                                     'to': noDupMsgData[n]['to'],
414
+			                                     'date': noDupMsgData[n]['date'],
415
+			                                     'direction': 'sent_to',
416
+			                                     'status': noDupMsgData[n]['status'],
417
+			                                     'table': noDupMsgData[n]['table']
418
+			                      });
419
+
420
+
421
+			                  } else if (noDupMsgData[n]['from'] == phNumberFrom && noDupMsgData[n]['table'] == 'received') {
422
+
423
+			                      convData.push({
424
+			                                     'author_displayname': noDupMsgData[n]['author_displayname'],
425
+			                                     'message': noDupMsgData[n]['message'],
426
+			                                     'from': noDupMsgData[n]['from'],
427
+			                                     'to': noDupMsgData[n]['to'],
428
+			                                     'date': noDupMsgData[n]['date'],
429
+			                                     'direction': 'received_from',
430
+			                                     'status': noDupMsgData[n]['status'],
431
+			                                     'table': noDupMsgData[n]['table']
432
+			                      });
433
+
434
+			                  } else if (noDupMsgData[n]['to'] == phNumberFrom && noDupMsgData[n]['table'] == 'received') {
435
+
436
+			                      convData.push({
437
+			                                     'author_displayname': noDupMsgData[n]['author_displayname'],
438
+			                                     'message': noDupMsgData[n]['message'],
439
+			                                     'from': noDupMsgData[n]['from'],
440
+			                                     'to': noDupMsgData[n]['to'],
441
+			                                     'date': noDupMsgData[n]['date'],
442
+			                                     'direction': 'received_on',
443
+			                                     'status': noDupMsgData[n]['status'],
444
+			                                     'table': noDupMsgData[n]['table']
445
+			                      });
446
+			                  }
447
+			             }
448
+
449
+			             // Sort messages by date
450
+				     convData.sort(function(a, b) {
451
+					let c = new Date(a.date);
452
+					let d = new Date(b.date);
453
+					return c-d;
454
+				     });
455
+                                     convData.reverse();
456
+
457
+			             // Collect the display names of the users that sent messages from the current number
458
+			             let selectedNames = [];
459
+			             let displayNames = '';
460
+			             for (let v = 0; v < convData.length; v++) {
461
+			                  if (selectedNames.indexOf(convData[v]['author_displayname']) == -1) { 
462
+			                      selectedNames.push(convData[v]['author_displayname']);
463
+			                      displayNames += "<div id='diplNm_"+ phNumberFrom +"_"+ v +"' class='dispNameList' name='"+ convData[v]['author_displayname'] +"'>"+ convData[v]['author_displayname'] +"</div>";
464
+			                  }
465
+			             }
466
+			             displayNames += "<div id='diplNmAllMsg' class='dispNameListAll' title='Show all the messages for this number.'>"+ phNumberFrom +"</div>";
467
+
468
+			             // Store the display names for the current number, to be able to see them later
469
+			             let ctPhNumber = phNumberFrom;
470
+			             msgsNamesPerNmbr[ctPhNumber] = displayNames;
471
+
472
+			             // Store the messages sent by each user, to be able to see them later when clicking on the user's name
473
+			             for (let h = 0; h < selectedNames.length; h++) {
474
+
475
+			                  let rowMessageArrpn = [];
476
+			                  for (let b = 0; b < convData.length; b++) {
477
+
478
+			                       if (selectedNames[h] == convData[b]['author_displayname']) {
479
+
480
+					           if (convData[b]['direction'] == 'sent_from') {
481
+					               if (convData[b]['status'].indexOf("delivered") > -1 || convData[b]['status'].indexOf("delivery success") > -1) {
482
+					                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
483
+					               } else {
484
+					                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
485
+					               }
486
+					               rowMessageArrpn.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
487
+					           } else if (convData[b]['direction'] == 'sent_to') {
488
+					               if (convData[b]['status'].indexOf("delivered") > -1 || convData[b]['status'].indexOf("delivery success") > -1) {
489
+					                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
490
+					               } else {
491
+					                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
492
+					               }
493
+					               rowMessageArrpn.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
494
+					           } else if (convData[b]['direction'] == 'received_from') {
495
+					               rowMessageArrpn.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div></div>");
496
+					           } else if (convData[b]['direction'] == 'received_on') {
497
+					               rowMessageArrpn.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div></div>");
498
+			                           }
499
+			                       }
500
+			                  }
501
+			                  let crtNmber = phNumberFrom;
502
+			                  let crtName = selectedNames[h];
503
+			                  msgsNmbrsNames[crtNmber] = msgsNmbrsNames[crtNmber] || {};
504
+                                          msgsNmbrsNames[crtNmber][crtName] = rowMessageArrpn;
505
+			             }
506
+
507
+                                     // The number of messages to be loaded by default
508
+                                     let nmbTblDefault = 50;
509
+
510
+                                     // If the total number of messages is greater than the default number of messages to display, show the 'Load more messages' button
511
+                                     if (convData.length > nmbTblDefault) {
512
+                                         $("#loadMoreMsgs").css("display", "block");
513
+                                         var nmbToBeLoaded = nmbTblDefault;
514
+                                     } else { var nmbToBeLoaded = convData.length; }
515
+
516
+			             let rowMessageArr = [];
517
+			             for (var m = nmbToBeLoaded - 1; m >= 0; m--) {
518
+
519
+			                  if (convData[m]['direction'] == 'sent_from') {
520
+
521
+			                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
522
+			                          let sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
523
+			                      } else {
524
+			                          let sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
525
+			                      }
526
+			                      rowMessageArr.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 6px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
527
+
528
+			                  } else if (convData[m]['direction'] == 'sent_to') {
529
+
530
+			                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
531
+			                          let sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
532
+			                      } else {
533
+			                          let sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
534
+			                      }
535
+			                      rowMessageArr.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
536
+
537
+			                  } else if (convData[m]['direction'] == 'received_from') {
538
+
539
+					      rowMessageArr.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
540
+
541
+			                  } else if (convData[m]['direction'] == 'received_on') {
542
+
543
+					      rowMessageArr.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
544
+			                  }
545
+			             }
546
+
547
+			             let convDataPerNmbr = rowMessageArr.join("");
548
+
549
+                                     $("#grpdbynamelst").append(displayNames);
550
+                                     $("#msgListRowCell").append(convDataPerNmbr);
551
+
552
+			             // Store the messages for the current number, to be able to see them later, when clicking on the number
553
+			             let rowMessageArrcpt = [];
554
+			             for (let m = 0; m < convData.length; m++) {
555
+
556
+			                  if (convData[m]['direction'] == 'sent_from') {
557
+
558
+			                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
559
+			                          let sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
560
+			                      } else {
561
+			                          let sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
562
+			                      }
563
+			                      rowMessageArrcpt.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 6px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
564
+
565
+			                  } else if (convData[m]['direction'] == 'sent_to') {
566
+
567
+			                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
568
+			                          let sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
569
+			                      } else {
570
+			                          let sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
571
+			                      }
572
+			                      rowMessageArrcpt.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
573
+
574
+			                  } else if (convData[m]['direction'] == 'received_from') {
575
+
576
+					      rowMessageArrcpt.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
577
+
578
+			                  } else if (convData[m]['direction'] == 'received_on') {
579
+
580
+					      rowMessageArrcpt.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
581
+			                  }
582
+			             }
583
+
584
+			             messagesPerNmbr[phNumberFrom] = rowMessageArrcpt;
585
+
586
+                                     // Scroll down to the bottom of the window
587
+                                     $("#frmMsgLstWrap").animate({scrollTop:$("#frmMsgLstTbl").prop("scrollHeight")},200);
588
+
589
+                                     // Load more messages
590
+                                     let clickNmb = 0;
591
+                                     $("#loadMoreMsgs").click(function() {
592
+
593
+                                         clickNmb++;
594
+
595
+                                         var crefnb = (clickNmb + 1) * nmbToBeLoaded;
596
+
597
+                                         if (crefnb > convData.length) {
598
+                                             var nmbmsg = convData.length - 1;
599
+                                             $("#loadMoreMsgs").css("display", "none");
600
+                                         } else { 
601
+                                             var nmbmsg = crefnb - 1;
602
+                                         }
603
+
604
+                                         var rowMessageArrAdd = [];
605
+
606
+                                         for (let m = nmbmsg; m >= clickNmb * nmbToBeLoaded; m--) {
607
+
608
+			                      if (convData[m]['direction'] == 'sent_from') {
609
+
610
+			                          if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
611
+			                              let sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
612
+			                          } else {
613
+			                              let sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
614
+			                          }
615
+			                          rowMessageArrAdd.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 6px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
616
+
617
+			                      } else if (convData[m]['direction'] == 'sent_to') {
618
+
619
+			                          if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
620
+			                              let sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
621
+			                          } else {
622
+			                              let sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
623
+			                          }
624
+			                          rowMessageArrAdd.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
625
+
626
+			                      } else if (convData[m]['direction'] == 'received_from') {
627
+
628
+					          rowMessageArrAdd.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
629
+
630
+			                      } else if (convData[m]['direction'] == 'received_on') {
631
+
632
+					          rowMessageArrAdd.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
633
+			                      }
634
+                                         }
635
+
636
+			                 let convDataPerNmbrad = rowMessageArrAdd.join("");
637
+
638
+                                         let scrlheight = $("#msgListRowCell").height();
639
+                                         $("#msgListRowCell").prepend(convDataPerNmbrad);
640
+
641
+                                         $("#frmMsgLstWrap").scrollTop($("#msgListRowCell").height() - scrlheight);
642
+                                     });
643
+
644
+
645
+			             // Show the messages sent by each user whose name is clicked
646
+			             $('[id*="diplNm_"]').click(function() {
647
+
648
+			                 let crntNmbr = $(this).attr("id").split("_")[1];
649
+			                 let crntDisName = $(this).attr("name");                               
650
+                                         $("#loadMoreMsgs").css("display", "none");
651
+
652
+                                         let convDataprn = [];
653
+                                         $.each(msgsNmbrsNames[crntNmbr][crntDisName], function(index, item) {
654
+                                                convDataprn.push(item);
655
+                                         });
656
+
657
+                                         // If the total number of messages is greater than the default number of messages to display, show the 'Load more messages' button
658
+                                         if (convDataprn.length > nmbTblDefault) {
659
+                                             $("#loadMoreMsgsusr").css("display", "block");
660
+                                             let nmbToBeLoaded = nmbTblDefault;
661
+                                         } else {
662
+                                             $("#loadMoreMsgsusr").css("display", "none");
663
+                                             let nmbToBeLoaded = convDataprn.length;
664
+                                         }
665
+
666
+			                 let rowMessageArrprnst = [];
667
+
668
+			                 for (let n = nmbToBeLoaded - 1; n >= 0; n--) {
669
+                                              rowMessageArrprnst.push(convDataprn[n]);
670
+			                 }
671
+
672
+			                 let convDataPerNmbrprnst = rowMessageArrprnst.join("");
673
+
674
+                                         $("#msgListRowCell").empty();
675
+                                         $("#msgListRowCell").append(convDataPerNmbrprnst);
676
+
677
+                                         // Scroll down to the bottom of the window
678
+                                         $("#frmMsgLstWrap").animate({scrollTop:$("#frmMsgLstTbl").prop("scrollHeight")},200);
679
+
680
+                                         // Load more messages
681
+                                         let clckNb = 0;
682
+                                         $("#loadMoreMsgsusr").unbind("click");
683
+                                         $("#loadMoreMsgsusr").click(function() {
684
+
685
+                                             clckNb++;
686
+                                             var crefnb = (clckNb + 1) * nmbToBeLoaded;
687
+
688
+                                             $("#loadMoreMsgs").css("display", "none");
689
+
690
+                                             if (crefnb > convDataprn.length) {
691
+                                                 var nmbmsg = convDataprn.length - 1;
692
+                                                 $("#loadMoreMsgsusr").css("display", "none");
693
+                                             } else { 
694
+                                                 var nmbmsg = crefnb - 1;
695
+                                                 $("#loadMoreMsgsusr").css("display", "block");
696
+                                             }
697
+
698
+                                             var rowMessageArrAddst = [];
699
+
700
+                                             for (var q = nmbmsg; q >= clckNb * nmbToBeLoaded; q--) {
701
+
702
+                                                  rowMessageArrAddst.push(convDataprn[q]);
703
+                                             }
704
+
705
+			                     var convDataPerNmbradst = rowMessageArrAddst.join("");
706
+
707
+                                             var scrlheight = $("#msgListRowCell").height();
708
+                                             $("#msgListRowCell").prepend(convDataPerNmbradst);
709
+
710
+                                             $("#frmMsgLstWrap").scrollTop($("#msgListRowCell").height() - scrlheight);
711
+                                         });
712
+
713
+
714
+			                 $(".dispNameList").each(function() { $(this).css("color", "#0a559e"); });
715
+			                 $("#diplNmAllMsg").css("color", "#04957b");
716
+			                 $(this).css("color", "#1b8efe");
717
+			             });
718
+
719
+
720
+			             // Show again all the messages sent/received to/from the clicked number
721
+			             $("#diplNmAllMsg").click(function() {
722
+
723
+                                         $("#loadMoreMsgsusr").css("display", "none");
724
+
725
+                                         let convDataprn = [];
726
+                                         $.each(messagesPerNmbr[phNumberFrom], function(index, item) {
727
+                                                convDataprn.push(item);
728
+                                         });
729
+
730
+                                         // If the total number of messages is greater than the default number of messages to display, show the 'Load more messages' button
731
+                                         if (convDataprn.length > nmbTblDefault) {
732
+                                             $("#loadMoreMsgs").css("display", "block");
733
+                                             let nmbToBeLoaded = nmbTblDefault;
734
+                                         } else {
735
+                                             $("#loadMoreMsgs").css("display", "none");
736
+                                             let nmbToBeLoaded = convDataprn.length;
737
+                                         }
738
+
739
+
740
+			                 let rowMessageArrprnst = [];
741
+
742
+			                 for (let n = nmbToBeLoaded - 1; n >= 0; n--) {
743
+                                              rowMessageArrprnst.push(convDataprn[n]);
744
+			                 }
745
+
746
+			                 let convDataPerNmbrprnst = rowMessageArrprnst.join("");
747
+
748
+                                         $("#msgListRowCell").empty();
749
+                                         $("#msgListRowCell").append(convDataPerNmbrprnst);
750
+
751
+                                         // Scroll down to the bottom of the window
752
+                                         $("#frmMsgLstWrap").animate({scrollTop:$("#frmMsgLstTbl").prop("scrollHeight")},200);
753
+
754
+
755
+                                         // Load more messages
756
+                                         let clckNb = 0;
757
+                                         $("#loadMoreMsgsusr").unbind("click");
758
+                                         $("#loadMoreMsgsusr").click(function() {
759
+
760
+                                             clckNb++;
761
+                                             var crefnb = (clckNb + 1) * nmbToBeLoaded;
762
+
763
+                                             $("#loadMoreMsgs").css("display", "none");
764
+
765
+                                             if (crefnb > convDataprn.length) {
766
+                                                 var nmbmsg = convDataprn.length - 1;
767
+                                                 $("#loadMoreMsgsusr").css("display", "none");
768
+                                             } else { 
769
+                                                 var nmbmsg = crefnb - 1;
770
+                                                 $("#loadMoreMsgsusr").css("display", "block");
771
+                                             }
772
+
773
+                                             var rowMessageArrAddst = [];
774
+
775
+                                             for (var q = nmbmsg; q >= clckNb * nmbToBeLoaded; q--) {
776
+
777
+                                                  rowMessageArrAddst.push(convDataprn[q]);
778
+                                             }
779
+
780
+			                     var convDataPerNmbradst = rowMessageArrAddst.join("");
781
+
782
+                                             var scrlheight = $("#msgListRowCell").height();
783
+                                             $("#msgListRowCell").prepend(convDataPerNmbradst);
784
+
785
+                                             $("#frmMsgLstWrap").scrollTop($("#msgListRowCell").height() - scrlheight);
786
+                                         });
787
+
788
+
789
+			                 $(".dispNameList").each(function() { $(this).css("color", "#0a559e"); });
790
+			                 $("#diplNmAllMsg").css("color", "#04957b");
791
+			                 $(this).css("color", "#04c6a4");
792
+
793
+			             });
794
+
795
+
796
+				     // Show the scroll-up arrow
797
+				     $("#frmMsgLstWrap").scroll(function() {
798
+					if ($(this).scrollTop() > 900) {
799
+					      $('#upArrowSmall').fadeIn();
800
+					} else {
801
+					      $('#upArrowSmall').fadeOut();
802
+					}
803
+				     });
804
+
805
+				     $("#upArrowSmall").click(function() {
806
+					$("#frmMsgLstWrap").animate({scrollTop : 0},400);
807
+				     });
808
+
809
+			  },
810
+			  error: function() {
811
+                                     showAlert("Error while attempting to get message data from the database!");
812
+				     $('#listAllMsgsConv').removeClass('icon-loading');
813
+			  }
814
+		   });
815
+
816
+                }
817
+
818
+                $('[id^="showMsgConv-"]').click(function() {
819
+
820
+                   let ctrwnmbr = $(this).attr("id").replace("showMsgConv-", "");
821
+                   let phNumberFrom = $("#frmNmbr-"+ ctrwnmbr).text();
822
+                   let phNumberTo = $("#toNmbr-"+ ctrwnmbr).text().split(": ")[1];
823
+
824
+                   showRecMsgPerConv(phNumberFrom, phNumberTo);
825
+                });
826
+
827
+
828
+
829
+                // Show the pop-up window that lists all the messages sent/received to/from a phone number
830
+                function showMsgPerNmbr(clckPhNumber) {
831
+
832
+                   var allfrmtomsg = "<div id='listAllMsgsFromTo'>";
833
+                   allfrmtomsg += "<div id='draglstMsgmWindow'><img src='/apps/sms_relentless/img/dots.svg'></div>";
834
+                   allfrmtomsg += "<a id='closeFrmMsgWindow' title='Close this window'></a>";
835
+                   allfrmtomsg += "<div class='showByNmbrTitle'>Messages sent/received to/from  <span style='color:#04957b'>"+ clckPhNumber +"</span></div>";
836
+                   allfrmtomsg += "<div id='frmMsgLstWrap'>";
837
+                   allfrmtomsg += "<table id='frmMsgLstTbl'>";
838
+                   allfrmtomsg += "<tr class='groupedrowsbody'><td><div id='grpdbynamelst' class='groupedLstNamespn'></div></td><td><div id='loadMoreMsgs' title='Click to load older messages.'>Load more messages</div><div id='loadMoreMsgsusr' title='Click to load older messages.'>Load more messages</div><div id='msgListRowCell' class='groupedLstMsgspn'></div><div id='arrowupWrap'><div id='upArrowSmall' title='Scroll to the top'></div></div></td></tr>";
839
+                   allfrmtomsg += "</table></div>";
840
+                   allfrmtomsg += "<div id='sendMsgReply'><table id='sendMsgConv'><tr><td><div id='fromPhoneNmbrConv'>From: <select id='selectFromNbConv'></select></div><div id='toPhoneNmbrConv'>To: <span id='toNmbrConv' style='color:#04957b'>"+ clckPhNumber +"</span></div></td></tr>";
841
+                   allfrmtomsg += "<tr><td><textarea id='sendMsgConvText' placeholder='Enter a message here, then press Send SMS'></textarea></td></tr></table>";
842
+                   allfrmtomsg += "<div id='sendMsgConvBtn'>Send SMS</div></div>";
843
+                   allfrmtomsg += "<div style='display:block;width:100%;height:14px;'><img id='expandWindowRpl' src='/apps/sms_relentless/img/arrowDown.svg' title='Expand to send a message'></div>";
844
+                   allfrmtomsg += "<div id='draglstMsgmWindowsc'><img src='/apps/sms_relentless/img/dots.svg' style='padding:4px;vertical-align:top;'></div>";
845
+                   allfrmtomsg += "</div>";
846
+
847
+                   $("#content").append("<div id='recTblOverlay'></div>");
848
+                   $("#content").append(allfrmtomsg);
849
+
850
+                   var topDist = parseInt((window.innerHeight / 2).toFixed(2) - 340) +"px";
851
+                   var leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 300) +"px";
852
+                   $("#listAllMsgsFromTo").css({ "top" : topDist, "left" : leftDist });
853
+
854
+                   $("#closeFrmMsgWindow").click(function() { $("#listAllMsgsFromTo").remove(); $("#recTblOverlay").remove(); });
855
+                   $("#recTblOverlay").click(function() { $("#listAllMsgsFromTo").remove(); $("#recTblOverlay").remove(); });
856
+
857
+
858
+	           // Expand the window when clicking on the arrow, to be able to send a reply message
859
+	           $("#expandWindowRpl").click(function() {
860
+
861
+	              if ($(this).attr('src') == '/apps/sms_relentless/img/arrowDown.svg') {
862
+                          $("#sendMsgReply").css("display", "block");
863
+                          $("#listAllMsgsFromTo").css("height", "618px");
864
+	                  $(this).attr('src', '/apps/sms_relentless/img/arrowUp.svg');
865
+                          $(this).attr('title', 'Collapse');
866
+	              } else {
867
+                          $("#sendMsgReply").css("display", "none");
868
+                          $("#listAllMsgsFromTo").css("height", "490px");
869
+                          $(this).attr('src', '/apps/sms_relentless/img/arrowDown.svg');
870
+                          $(this).attr('title', 'Expand to send a reply');
871
+	              }
872
+	           });
873
+
874
+                   // Send a message from the 'conversation' window
875
+                   $("#sendMsgConvBtn").click(function() {
876
+
877
+                      $("#sendMsgConv,#sendMsgConvBtn").addClass('icon-loading');
878
+                      var msgToSend = $("#sendMsgConvText").val();
879
+                      var selectedid = $("#selectFromNbConv").val();
880
+                      var toNumber = $("#toNmbrConv").text();
881
+                      var receiversNumbers = [toNumber];
882
+
883
+		      if (selectedid != '') { 
884
+
885
+			  var sendersplit = selectedid.split(":");
886
+			  var providercap = sendersplit[0];
887
+			  var provsec = sendersplit[1];
888
+
889
+			  if (/[a-zA-Z]/.test(provsec)) {
890
+			      var alphanumcheck = true;
891
+			  } else { var alphanumcheck = false; }
892
+
893
+			  if (providercap == 'Tx' && alphanumcheck == false) {  
894
+			      var senderproc = selectedid.replace(/[^0-9]/g, "");
895
+			      var selectedsender = "+" + senderproc;
896
+			      var providerUsed = "telnyx";
897
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmstel");
898
+			  } else if (providercap == 'Pl' && alphanumcheck == false) {
899
+			      var selectedsender = selectedid.replace(/[^0-9]/g, "");
900
+			      var providerUsed = "plivo";
901
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmsnex");
902
+			  } else if (providercap == 'Tw' && alphanumcheck == false) {  
903
+			      var senderproc = selectedid.replace(/[^0-9]/g, "");
904
+			      var selectedsender = "+" + senderproc;
905
+			      var providerUsed = "twilio";
906
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmstwil");
907
+			  } else if (providercap == 'Fl' && alphanumcheck == false) {  
908
+			      var senderproc = selectedid.replace(/[^0-9]/g, "");
909
+			      var selectedsender = "+" + senderproc;
910
+			      var providerUsed = "flowroute";
911
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmsflow");
912
+			  } else if (providercap == 'Tx' && alphanumcheck == true) {
913
+			      var selectedsender = provsec;
914
+			      var providerUsed = "telnyx";
915
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmstel");
916
+			  } else if (providercap == 'Pl' && alphanumcheck == true) {
917
+			      var selectedsender = provsec;
918
+			      var providerUsed = "plivo";
919
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmsnex");
920
+			  } else if (providercap == 'Tw' && alphanumcheck == true) {
921
+			      var selectedsender = provsec;
922
+			      var providerUsed = "twilio";
923
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmstwil");
924
+			  } else if (providercap == 'Fl' && alphanumcheck == true) {
925
+			      var selectedsender = provsec;
926
+			      var providerUsed = "flowroute";
927
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmsflow");
928
+			  }
929
+
930
+                          var uploadedtomms = [];
931
+
932
+	                  if (msgToSend != '') {
933
+
934
+				  $.ajax({
935
+				     url: relbaseUrl + '/' + userid,
936
+				     type: "POST",
937
+				     data: {
938
+				           receiversPhoneNbs: receiversNumbers,
939
+				           fromsender: selectedsender,
940
+				           waitinterval: 1000,
941
+				           sentsmstext: msgToSend,
942
+				           ismms: 0,
943
+				           mmsfiles: uploadedtomms
944
+				         },
945
+				     success: function(displayname) {
946
+
947
+                                           var tzdate = new Date();
948
+                                           var presDatest = new Date(tzdate.getTime() - (tzdate.getTimezoneOffset() * 60000)).toJSON();
949
+                                           var presDatedb = presDatest.split(".")[0];
950
+                                           var presDatesc = presDatedb.split("T");
951
+                                           var presDate = presDatesc[0] +" "+ presDatesc[1];
952
+                                           var sentMessageStatus = '';
953
+
954
+                                           if (displayname) {
955
+                                               var msgToSendproc = "<span class='msgAuthorNameGrp'>"+ displayname + ":</span>" + msgToSend; 
956
+                                           } else { var msgToSendproc = ''; }
957
+
958
+                                           $("#msgListRowCell").append("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ selectedsender +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ receiversNumbers[0] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ msgToSendproc +"</div><div style='display:inline-block;margin:6px 6px 0px 4px;font-size:12.5px;color:#353535;'>"+ presDate +"</div><div class='sentMssgStatus'>"+ sentMessageStatus +"</div></div>");
959
+
960
+                                           // Scroll down to the bottom of the window
961
+                                           $("#frmMsgLstWrap").animate({scrollTop:$("#frmMsgLstTbl").prop("scrollHeight")},200);
962
+
963
+                                           $("#sendMsgConv,#sendMsgConvBtn").removeClass('icon-loading');
964
+				     },
965
+				     error: function() {
966
+                                           showAlert("Error while sending the message. You can check your Nextcloud log to find out more about this issue.");
967
+				           $("#sendMsgConv,#sendMsgConvBtn").removeClass('icon-loading');
968
+				     }
969
+				  });
970
+			  } else {
971
+                                  showAlert("Please enter a message in the text box!");
972
+				  $("#sendMsgConv,#sendMsgConvBtn").removeClass('icon-loading');
973
+			  }
974
+		      } else {
975
+                              showAlert("Please choose a Sender ID from the 'From' drop-down list!");
976
+			      $("#sendMsgConv,#sendMsgConvBtn").removeClass('icon-loading');
977
+		      }
978
+
979
+                   });
980
+
981
+
982
+
983
+	           // Make the window draggable
984
+	           function makeMgrWndDraggable(e) {
985
+
986
+			   window.pmdragging = {};
987
+			   pmdragging.pageX0 = e.pageX;
988
+			   pmdragging.pageY0 = e.pageY;
989
+			   pmdragging.elem = $("#listAllMsgsFromTo");
990
+			   pmdragging.offset0 = $("#listAllMsgsFromTo").offset();
991
+
992
+			   function handle_dragging(e) {
993
+			       var left = pmdragging.offset0.left + (e.pageX - pmdragging.pageX0);
994
+			       var top = pmdragging.offset0.top + (e.pageY - pmdragging.pageY0);
995
+			       $(pmdragging.elem).offset({top: top, left: left});
996
+			   }
997
+
998
+			   function handle_mouseup(e) {
999
+			       $('body').off('mousemove', handle_dragging).off('mouseup', handle_mouseup);
1000
+			   }
1001
+
1002
+			   $('body').on('mouseup', handle_mouseup).on('mousemove', handle_dragging);
1003
+	           }
1004
+	           $("#draglstMsgmWindow").mousedown(makeMgrWndDraggable);
1005
+	           $("#draglstMsgmWindowsc").mousedown(makeMgrWndDraggable);
1006
+
1007
+
1008
+                   // Append the available phone numbers to the From drop-down list
1009
+                   var availPhoneNmbrs = [];
1010
+                   $("#currentsmsnmbrs .optselectsmsnb").each(function() {
1011
+                      var crtphnmbr = $(this).attr("value");
1012
+                      if (crtphnmbr != "") { availPhoneNmbrs.push(crtphnmbr); }
1013
+                   });
1014
+
1015
+                   if (availPhoneNmbrs.length > 0) {
1016
+                       var avphopt = "";
1017
+                       for (let d = 0; d < availPhoneNmbrs.length; d++) {
1018
+                            avphopt += "<option value='"+ availPhoneNmbrs[d] +"'>"+ availPhoneNmbrs[d] +"</option>";
1019
+                       }
1020
+                       $("#selectFromNbConv").append(avphopt);
1021
+
1022
+                   } else { $("#selectFromNbConv").append("<option value='' selected>No IDs</option>"); }
1023
+
1024
+
1025
+                   // Get the sent/received messages for the current phone number, from the database
1026
+		   var getGroupedPnUrl = OC.generateUrl("/apps/sms_relentless/user/getgroupedpernumber");
1027
+
1028
+		   $('#listAllMsgsFromTo').addClass('icon-loading');
1029
+		   var totalPhNmbrs = 0;
1030
+
1031
+		   $.ajax({
1032
+			  method: 'POST',
1033
+			  url: getGroupedPnUrl + '/' + userid,
1034
+			  contentType: 'application/json',
1035
+                          data: JSON.stringify({ phoneNumber: clckPhNumber }),
1036
+			  success: function(groupedpernb) {
1037
+
1038
+				     $('#listAllMsgsFromTo').removeClass('icon-loading');
1039
+
1040
+				     var fromtoNmbrsData = [];
1041
+
1042
+				     for (var i = 0; i < groupedpernb.length; i++) {
1043
+
1044
+					     if (groupedpernb[i].author_displayname) {
1045
+						 var authordnm = groupedpernb[i].author_displayname;
1046
+					     } else { 
1047
+						 var authordnm = '';
1048
+					     }
1049
+
1050
+					     var sentfromnmbrarr = groupedpernb[i].from.split("+");
1051
+				             if (sentfromnmbrarr[1]) {
1052
+						 var groupednbfrom = "+"+ sentfromnmbrarr[1];
1053
+				             } else {
1054
+						 var groupednbfrom = sentfromnmbrarr[0];
1055
+				             }
1056
+
1057
+				             var modmessagerec = '';
1058
+				             if (groupedpernb[i].author_displayname) {
1059
+						 modmessagerec = "<span class='msgAuthorNameGrp'>"+ groupedpernb[i].author_displayname + ":</span>" + groupedpernb[i].message;
1060
+				             } else {
1061
+			                         modmessagerec = groupedpernb[i].message;
1062
+                                             }
1063
+
1064
+				             if (groupedpernb[i].to.indexOf(": ") > -1) {
1065
+				                 var groupednmbrtopre = groupedpernb[i].to.split(": ");
1066
+				                 var groupednmbrto = groupednmbrtopre[1];
1067
+				             } else { 
1068
+				                 var groupednmbrto = groupedpernb[i].to;
1069
+				             }
1070
+
1071
+				             fromtoNmbrsData.push({
1072
+				                       'author_displayname': authordnm,
1073
+				                       'from': groupednbfrom,
1074
+				                       'to': groupednmbrto,
1075
+				                       'message': modmessagerec,
1076
+				                       'date': groupedpernb[i].date,
1077
+				                       'status': groupedpernb[i].deliveryreceipt,
1078
+				                       'table': groupedpernb[i].table
1079
+				             });
1080
+				     }
1081
+
1082
+
1083
+				     // Remove the duplicates
1084
+				     var noDupMsgData = [];
1085
+				     $.each(fromtoNmbrsData, function(i, e) {
1086
+					    var matchingData = $.grep(noDupMsgData, function(item) {
1087
+				                    return item.from == e.from && item.to == e.to && item.message == e.message && item.table == 'received' && e.table == 'sent';
1088
+					    });
1089
+					    if (matchingData.length === 0) {
1090
+						noDupMsgData.push(e);
1091
+					    }
1092
+				     });
1093
+
1094
+				     var messagesPerNmbr = {};
1095
+				     var msgsNamesPerNmbr = {};
1096
+				     var msgsNmbrsNames = {};
1097
+
1098
+			             var displayNamesarr = [];
1099
+			             var convData = [];
1100
+
1101
+			             for (var n = 0; n < noDupMsgData.length; n++) {
1102
+
1103
+			                  if (noDupMsgData[n]['from'] == clckPhNumber && noDupMsgData[n]['table'] == 'sent') {
1104
+
1105
+			                      convData.push({
1106
+			                                     'author_displayname': noDupMsgData[n]['author_displayname'],
1107
+			                                     'message': noDupMsgData[n]['message'],
1108
+			                                     'from': noDupMsgData[n]['from'],
1109
+			                                     'to': noDupMsgData[n]['to'],
1110
+			                                     'date': noDupMsgData[n]['date'],
1111
+			                                     'direction': 'sent_from',
1112
+			                                     'status': noDupMsgData[n]['status'],
1113
+			                                     'table': noDupMsgData[n]['table']
1114
+			                      });
1115
+
1116
+			                  } else if (noDupMsgData[n]['to'] == clckPhNumber && noDupMsgData[n]['table'] == 'sent') {
1117
+
1118
+			                      convData.push({
1119
+			                                     'author_displayname': noDupMsgData[n]['author_displayname'],
1120
+			                                     'message': noDupMsgData[n]['message'],
1121
+			                                     'from': noDupMsgData[n]['from'],
1122
+			                                     'to': noDupMsgData[n]['to'],
1123
+			                                     'date': noDupMsgData[n]['date'],
1124
+			                                     'direction': 'sent_to',
1125
+			                                     'status': noDupMsgData[n]['status'],
1126
+			                                     'table': noDupMsgData[n]['table']
1127
+			                      });
1128
+
1129
+
1130
+			                  } else if (noDupMsgData[n]['from'] == clckPhNumber && noDupMsgData[n]['table'] == 'received') {
1131
+
1132
+			                      convData.push({
1133
+			                                     'author_displayname': noDupMsgData[n]['author_displayname'],
1134
+			                                     'message': noDupMsgData[n]['message'],
1135
+			                                     'from': noDupMsgData[n]['from'],
1136
+			                                     'to': noDupMsgData[n]['to'],
1137
+			                                     'date': noDupMsgData[n]['date'],
1138
+			                                     'direction': 'received_from',
1139
+			                                     'status': noDupMsgData[n]['status'],
1140
+			                                     'table': noDupMsgData[n]['table']
1141
+			                      });
1142
+
1143
+			                  } else if (noDupMsgData[n]['to'] == clckPhNumber && noDupMsgData[n]['table'] == 'received') {
1144
+
1145
+			                      convData.push({
1146
+			                                     'author_displayname': noDupMsgData[n]['author_displayname'],
1147
+			                                     'message': noDupMsgData[n]['message'],
1148
+			                                     'from': noDupMsgData[n]['from'],
1149
+			                                     'to': noDupMsgData[n]['to'],
1150
+			                                     'date': noDupMsgData[n]['date'],
1151
+			                                     'direction': 'received_on',
1152
+			                                     'status': noDupMsgData[n]['status'],
1153
+			                                     'table': noDupMsgData[n]['table']
1154
+			                      });
1155
+			                  }
1156
+			             }
1157
+
1158
+			             // Sort messages by date
1159
+				     convData.sort(function(a, b) {
1160
+					var c = new Date(a.date);
1161
+					var d = new Date(b.date);
1162
+					return c-d;
1163
+				     });
1164
+                                     convData.reverse();
1165
+
1166
+			             // Collect the display names of the users that sent messages from the current number
1167
+			             var selectedNames = [];
1168
+			             var displayNames = '';
1169
+			             for (var v = 0; v < convData.length; v++) {
1170
+			                  if (selectedNames.indexOf(convData[v]['author_displayname']) == -1) { 
1171
+			                      selectedNames.push(convData[v]['author_displayname']);
1172
+			                      displayNames += "<div id='diplNm_"+ clckPhNumber +"_"+ v +"' class='dispNameList' name='"+ convData[v]['author_displayname'] +"'>"+ convData[v]['author_displayname'] +"</div>";
1173
+			                  }
1174
+			             }
1175
+			             displayNames += "<div id='diplNmAllMsg' class='dispNameListAll' title='Show all the messages for this number.'>"+ clckPhNumber +"</div>";
1176
+
1177
+			             // Store the display names for the current number, to be able to see them later
1178
+			             var ctPhNumber = clckPhNumber;
1179
+			             msgsNamesPerNmbr[ctPhNumber] = displayNames;
1180
+
1181
+			             // Store the messages sent by each user, to be able to see them later when clicking on the user's name
1182
+			             for (var h = 0; h < selectedNames.length; h++) {
1183
+
1184
+			                  var rowMessageArrpn = [];
1185
+			                  for (var b = 0; b < convData.length; b++) {
1186
+
1187
+			                       if (selectedNames[h] == convData[b]['author_displayname']) {
1188
+
1189
+					           if (convData[b]['direction'] == 'sent_from') {
1190
+					               if (convData[b]['status'].indexOf("delivered") > -1 || convData[b]['status'].indexOf("delivery success") > -1) {
1191
+					                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
1192
+					               } else {
1193
+					                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
1194
+					               }
1195
+					               rowMessageArrpn.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
1196
+					           } else if (convData[b]['direction'] == 'sent_to') {
1197
+					               if (convData[b]['status'].indexOf("delivered") > -1 || convData[b]['status'].indexOf("delivery success") > -1) {
1198
+					                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
1199
+					               } else {
1200
+					                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
1201
+					               }
1202
+					               rowMessageArrpn.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
1203
+					           } else if (convData[b]['direction'] == 'received_from') {
1204
+					               rowMessageArrpn.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div></div>");
1205
+					           } else if (convData[b]['direction'] == 'received_on') {
1206
+					               rowMessageArrpn.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div></div>");
1207
+			                           }
1208
+			                       }
1209
+			                  }
1210
+			                  var crtNmber = clckPhNumber;
1211
+			                  var crtName = selectedNames[h];
1212
+			                  msgsNmbrsNames[crtNmber] = msgsNmbrsNames[crtNmber] || {};
1213
+                                          msgsNmbrsNames[crtNmber][crtName] = rowMessageArrpn;
1214
+			             }
1215
+
1216
+                                     // The number of messages to be loaded by default
1217
+                                     var nmbTblDefault = 50;
1218
+
1219
+                                     // If the total number of messages is greater than the default number of messages to display, show the 'Load more messages' button
1220
+                                     if (convData.length > nmbTblDefault) {
1221
+                                         $("#loadMoreMsgs").css("display", "block");
1222
+                                         var nmbToBeLoaded = nmbTblDefault;
1223
+                                     } else { var nmbToBeLoaded = convData.length; }
1224
+
1225
+			             var rowMessageArr = [];
1226
+			             for (var m = nmbToBeLoaded - 1; m >= 0; m--) {
1227
+
1228
+			                  if (convData[m]['direction'] == 'sent_from') {
1229
+
1230
+			                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
1231
+			                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
1232
+			                      } else {
1233
+			                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
1234
+			                      }
1235
+			                      rowMessageArr.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 6px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
1236
+
1237
+			                  } else if (convData[m]['direction'] == 'sent_to') {
1238
+
1239
+			                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
1240
+			                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
1241
+			                      } else {
1242
+			                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
1243
+			                      }
1244
+			                      rowMessageArr.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
1245
+
1246
+			                  } else if (convData[m]['direction'] == 'received_from') {
1247
+
1248
+					      rowMessageArr.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
1249
+
1250
+			                  } else if (convData[m]['direction'] == 'received_on') {
1251
+
1252
+					      rowMessageArr.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
1253
+			                  }
1254
+			             }
1255
+
1256
+			             var convDataPerNmbr = rowMessageArr.join("");
1257
+
1258
+                                     $("#grpdbynamelst").append(displayNames);
1259
+                                     $("#msgListRowCell").append(convDataPerNmbr);
1260
+
1261
+			             // Store the messages for the current number, to be able to see them later, when clicking on the number
1262
+			             var rowMessageArrcpt = [];
1263
+			             for (var m = 0; m < convData.length; m++) {
1264
+
1265
+			                  if (convData[m]['direction'] == 'sent_from') {
1266
+
1267
+			                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
1268
+			                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
1269
+			                      } else {
1270
+			                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
1271
+			                      }
1272
+			                      rowMessageArrcpt.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 6px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
1273
+
1274
+			                  } else if (convData[m]['direction'] == 'sent_to') {
1275
+
1276
+			                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
1277
+			                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
1278
+			                      } else {
1279
+			                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
1280
+			                      }
1281
+			                      rowMessageArrcpt.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
1282
+
1283
+			                  } else if (convData[m]['direction'] == 'received_from') {
1284
+
1285
+					      rowMessageArrcpt.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
1286
+
1287
+			                  } else if (convData[m]['direction'] == 'received_on') {
1288
+
1289
+					      rowMessageArrcpt.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
1290
+			                  }
1291
+			             }
1292
+
1293
+			             messagesPerNmbr[clckPhNumber] = rowMessageArrcpt;
1294
+
1295
+                                     // Scroll down to the bottom of the window
1296
+                                     $("#frmMsgLstWrap").animate({scrollTop:$("#frmMsgLstTbl").prop("scrollHeight")},200);
1297
+
1298
+                                     // Load more messages
1299
+                                     var clickNmb = 0;
1300
+                                     $("#loadMoreMsgs").click(function() {
1301
+
1302
+                                         clickNmb++;
1303
+
1304
+                                         var crefnb = (clickNmb + 1) * nmbToBeLoaded;
1305
+
1306
+                                         if (crefnb > convData.length) {
1307
+                                             var nmbmsg = convData.length - 1;
1308
+                                             $("#loadMoreMsgs").css("display", "none");
1309
+                                         } else { 
1310
+                                             var nmbmsg = crefnb - 1;
1311
+                                         }
1312
+
1313
+                                         var rowMessageArrAdd = [];
1314
+
1315
+                                         for (var m = nmbmsg; m >= clickNmb * nmbToBeLoaded; m--) {
1316
+
1317
+			                      if (convData[m]['direction'] == 'sent_from') {
1318
+
1319
+			                          if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
1320
+			                              var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
1321
+			                          } else {
1322
+			                              var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
1323
+			                          }
1324
+			                          rowMessageArrAdd.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 6px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
1325
+
1326
+			                      } else if (convData[m]['direction'] == 'sent_to') {
1327
+
1328
+			                          if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
1329
+			                              var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
1330
+			                          } else {
1331
+			                              var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
1332
+			                          }
1333
+			                          rowMessageArrAdd.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
1334
+
1335
+			                      } else if (convData[m]['direction'] == 'received_from') {
1336
+
1337
+					          rowMessageArrAdd.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
1338
+
1339
+			                      } else if (convData[m]['direction'] == 'received_on') {
1340
+
1341
+					          rowMessageArrAdd.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
1342
+			                      }
1343
+                                         }
1344
+
1345
+			                 var convDataPerNmbrad = rowMessageArrAdd.join("");
1346
+
1347
+                                         var scrlheight = $("#msgListRowCell").height();
1348
+                                         $("#msgListRowCell").prepend(convDataPerNmbrad);
1349
+
1350
+                                         $("#frmMsgLstWrap").scrollTop($("#msgListRowCell").height() - scrlheight);
1351
+                                     });
1352
+
1353
+
1354
+			             // Show the messages sent by each user whose name is clicked
1355
+			             $('[id*="diplNm_"]').click(function() {
1356
+
1357
+			                 var crntNmbr = $(this).attr("id").split("_")[1];
1358
+			                 var crntDisName = $(this).attr("name");                               
1359
+                                         $("#loadMoreMsgs").css("display", "none");
1360
+
1361
+                                         var convDataprn = [];
1362
+                                         $.each(msgsNmbrsNames[crntNmbr][crntDisName], function(index, item) {
1363
+                                                convDataprn.push(item);
1364
+                                         });
1365
+
1366
+                                         // If the total number of messages is greater than the default number of messages to display, show the 'Load more messages' button
1367
+                                         if (convDataprn.length > nmbTblDefault) {
1368
+                                             $("#loadMoreMsgsusr").css("display", "block");
1369
+                                             var nmbToBeLoaded = nmbTblDefault;
1370
+                                         } else {
1371
+                                             $("#loadMoreMsgsusr").css("display", "none");
1372
+                                             var nmbToBeLoaded = convDataprn.length;
1373
+                                         }
1374
+
1375
+			                 var rowMessageArrprnst = [];
1376
+
1377
+			                 for (var n = nmbToBeLoaded - 1; n >= 0; n--) {
1378
+                                              rowMessageArrprnst.push(convDataprn[n]);
1379
+			                 }
1380
+
1381
+			                 var convDataPerNmbrprnst = rowMessageArrprnst.join("");
1382
+
1383
+                                         $("#msgListRowCell").empty();
1384
+                                         $("#msgListRowCell").append(convDataPerNmbrprnst);
1385
+
1386
+                                         // Scroll down to the bottom of the window
1387
+                                         $("#frmMsgLstWrap").animate({scrollTop:$("#frmMsgLstTbl").prop("scrollHeight")},200);
1388
+
1389
+                                         // Load more messages
1390
+                                         var clckNb = 0;
1391
+                                         $("#loadMoreMsgsusr").unbind("click");
1392
+                                         $("#loadMoreMsgsusr").click(function() {
1393
+
1394
+                                             clckNb++;
1395
+                                             var crefnb = (clckNb + 1) * nmbToBeLoaded;
1396
+
1397
+                                             $("#loadMoreMsgs").css("display", "none");
1398
+
1399
+                                             if (crefnb > convDataprn.length) {
1400
+                                                 var nmbmsg = convDataprn.length - 1;
1401
+                                                 $("#loadMoreMsgsusr").css("display", "none");
1402
+                                             } else { 
1403
+                                                 var nmbmsg = crefnb - 1;
1404
+                                                 $("#loadMoreMsgsusr").css("display", "block");
1405
+                                             }
1406
+
1407
+                                             var rowMessageArrAddst = [];
1408
+
1409
+                                             for (var q = nmbmsg; q >= clckNb * nmbToBeLoaded; q--) {
1410
+
1411
+                                                  rowMessageArrAddst.push(convDataprn[q]);
1412
+                                             }
1413
+
1414
+			                     var convDataPerNmbradst = rowMessageArrAddst.join("");
1415
+
1416
+                                             var scrlheight = $("#msgListRowCell").height();
1417
+                                             $("#msgListRowCell").prepend(convDataPerNmbradst);
1418
+
1419
+                                             $("#frmMsgLstWrap").scrollTop($("#msgListRowCell").height() - scrlheight);
1420
+                                         });
1421
+
1422
+
1423
+			                 $(".dispNameList").each(function() { $(this).css("color", "#0a559e"); });
1424
+			                 $("#diplNmAllMsg").css("color", "#04957b");
1425
+			                 $(this).css("color", "#1b8efe");
1426
+			             });
1427
+
1428
+
1429
+			             // Show again all the messages sent/received to/from the clicked number
1430
+			             $("#diplNmAllMsg").click(function() {
1431
+
1432
+                                         $("#loadMoreMsgsusr").css("display", "none");
1433
+
1434
+                                         var convDataprn = [];
1435
+                                         $.each(messagesPerNmbr[clckPhNumber], function(index, item) {
1436
+                                                convDataprn.push(item);
1437
+                                         });
1438
+
1439
+                                         // If the total number of messages is greater than the default number of messages to display, show the 'Load more messages' button
1440
+                                         if (convDataprn.length > nmbTblDefault) {
1441
+                                             $("#loadMoreMsgs").css("display", "block");
1442
+                                             var nmbToBeLoaded = nmbTblDefault;
1443
+                                         } else {
1444
+                                             $("#loadMoreMsgs").css("display", "none");
1445
+                                             var nmbToBeLoaded = convDataprn.length;
1446
+                                         }
1447
+
1448
+
1449
+			                 var rowMessageArrprnst = [];
1450
+
1451
+			                 for (var n = nmbToBeLoaded - 1; n >= 0; n--) {
1452
+                                              rowMessageArrprnst.push(convDataprn[n]);
1453
+			                 }
1454
+
1455
+			                 var convDataPerNmbrprnst = rowMessageArrprnst.join("");
1456
+
1457
+                                         $("#msgListRowCell").empty();
1458
+                                         $("#msgListRowCell").append(convDataPerNmbrprnst);
1459
+
1460
+                                         // Scroll down to the bottom of the window
1461
+                                         $("#frmMsgLstWrap").animate({scrollTop:$("#frmMsgLstTbl").prop("scrollHeight")},200);
1462
+
1463
+
1464
+                                         // Load more messages
1465
+                                         var clckNb = 0;
1466
+                                         $("#loadMoreMsgsusr").unbind("click");
1467
+                                         $("#loadMoreMsgsusr").click(function() {
1468
+
1469
+                                             clckNb++;
1470
+                                             var crefnb = (clckNb + 1) * nmbToBeLoaded;
1471
+
1472
+                                             $("#loadMoreMsgs").css("display", "none");
1473
+
1474
+                                             if (crefnb > convDataprn.length) {
1475
+                                                 var nmbmsg = convDataprn.length - 1;
1476
+                                                 $("#loadMoreMsgsusr").css("display", "none");
1477
+                                             } else { 
1478
+                                                 var nmbmsg = crefnb - 1;
1479
+                                                 $("#loadMoreMsgsusr").css("display", "block");
1480
+                                             }
1481
+
1482
+                                             var rowMessageArrAddst = [];
1483
+
1484
+                                             for (var q = nmbmsg; q >= clckNb * nmbToBeLoaded; q--) {
1485
+
1486
+                                                  rowMessageArrAddst.push(convDataprn[q]);
1487
+                                             }
1488
+
1489
+			                     var convDataPerNmbradst = rowMessageArrAddst.join("");
1490
+
1491
+                                             var scrlheight = $("#msgListRowCell").height();
1492
+                                             $("#msgListRowCell").prepend(convDataPerNmbradst);
1493
+
1494
+                                             $("#frmMsgLstWrap").scrollTop($("#msgListRowCell").height() - scrlheight);
1495
+                                         });
1496
+
1497
+
1498
+			                 $(".dispNameList").each(function() { $(this).css("color", "#0a559e"); });
1499
+			                 $("#diplNmAllMsg").css("color", "#04957b");
1500
+			                 $(this).css("color", "#04c6a4");
1501
+
1502
+			             });
1503
+
1504
+
1505
+				     // Show the scroll-up arrow
1506
+				     $("#frmMsgLstWrap").scroll(function() {
1507
+					if ($(this).scrollTop() > 900) {
1508
+					      $('#upArrowSmall').fadeIn();
1509
+					} else {
1510
+					      $('#upArrowSmall').fadeOut();
1511
+					}
1512
+				     });
1513
+
1514
+				     $("#upArrowSmall").click(function() {
1515
+					$("#frmMsgLstWrap").animate({scrollTop : 0},400);
1516
+				     });
1517
+
1518
+			  },
1519
+			  error: function() {
1520
+                                     showAlert("Error while attempting to get message data from the database!");
1521
+				     $('#listAllMsgsFromTo').removeClass('icon-loading');
1522
+			  }
1523
+		   });
1524
+                }
1525
+
1526
+                $('[id^="showMsgFrom-"]').click(function() {
1527
+
1528
+                   var ctrwnb = $(this).attr("id").replace("showMsgFrom-", "");
1529
+                   var clckPhNumber = $("#frmNmbr-"+ ctrwnb).text();
1530
+
1531
+                   showMsgPerNmbr(clckPhNumber);
1532
+                })
1533
+
1534
+                $('[id^="showMsgTo-"]').click(function() {
1535
+                   var ctrwnbTo = $(this).attr("id").replace("showMsgTo-", "");
1536
+                   if ($("#toNmbr-"+ ctrwnbTo).text().indexOf(":") > -1) {
1537
+                       var clckPhNbTo = $("#toNmbr-"+ ctrwnbTo).text().split(": ")[1];
1538
+                   } else { var clckPhNbTo = $("#toNmbr-"+ ctrwnbTo).text(); };
1539
+
1540
+                   showMsgPerNmbr(clckPhNbTo);
1541
+                })
1542
+
1543
+                // Show the pop-up window for adding a Display Name to the 'From' numbers of unknown senders
1544
+                $('[id^="addDispName-"]').click(function() {
1545
+
1546
+                   var crrownb = $(this).attr("id").replace("addDispName-", "");
1547
+                   var slctPhoneNb = $("#frmNmbr-"+ crrownb).text();
1548
+
1549
+                   var addDNameWindow = "<div id='disNameWindow'>";
1550
+                   addDNameWindow += "<div id='dragDispNmWindow'><img src='/apps/sms_relentless/img/dots.svg'></div>";
1551
+                   addDNameWindow += "<a id='closeDisNmWindow' title='Close this window'></a>";
1552
+                   addDNameWindow += "<div style='display:block;text-align:left;font-size:16px;margin:14px 22px 0px 22px;color:#353535;'>If this is an external phone number (the number of a person that doesn't have a Nextcloud account), you can save a Display Name for this number, so that all the messages coming from it will be preceded by the specified Display Name:</div>";
1553
+                   addDNameWindow += "<div style='display:block;text-align:center;color:#49B382;font-size:16px;font-weight:500;margin:6px 0px 10px 0px;'>"+ slctPhoneNb +"</div>";
1554
+                   addDNameWindow += "<input type='text' id='saveDispNmText' placeholder='Eg: John Smith' style='display:block;width:80%;height:30px;margin:10px auto;padding:0px 12px;border-radius: 20px;'>";
1555
+                   addDNameWindow += "<input type='submit' id='saveDispName' value='Save'>";
1556
+                   addDNameWindow += "</div>";
1557
+
1558
+                   $("#content").append("<div id='recTblOverlay'></div>");
1559
+                   $("#content").append(addDNameWindow);
1560
+
1561
+                   var topNmDist = parseInt((window.innerHeight / 2).toFixed(2) - 180) +"px";
1562
+                   var leftNmDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
1563
+                   $("#disNameWindow").css({ "top" : topNmDist, "left" : leftNmDist });
1564
+
1565
+                   $("#closeDisNmWindow").click(function() { $("#disNameWindow").remove(); $("#recTblOverlay").remove(); });
1566
+                   $("#recTblOverlay").click(function() { $("#disNameWindow").remove(); $("#recTblOverlay").remove(); });
1567
+
1568
+
1569
+	           // Make the window draggable
1570
+	           function makeMgrWndDraggable(e) {
1571
+
1572
+			   window.pmdragging = {};
1573
+			   pmdragging.pageX0 = e.pageX;
1574
+			   pmdragging.pageY0 = e.pageY;
1575
+			   pmdragging.elem = $("#disNameWindow");
1576
+			   pmdragging.offset0 = $("#disNameWindow").offset();
1577
+
1578
+			   function handle_dragging(e) {
1579
+			       var left = pmdragging.offset0.left + (e.pageX - pmdragging.pageX0);
1580
+			       var top = pmdragging.offset0.top + (e.pageY - pmdragging.pageY0);
1581
+			       $(pmdragging.elem).offset({top: top, left: left});
1582
+			   }
1583
+
1584
+			   function handle_mouseup(e) {
1585
+			       $('body').off('mousemove', handle_dragging).off('mouseup', handle_mouseup);
1586
+			   }
1587
+
1588
+			   $('body').on('mouseup', handle_mouseup).on('mousemove', handle_dragging);
1589
+	           }
1590
+	           $("#dragDispNmWindow").mousedown(makeMgrWndDraggable);
1591
+
1592
+                   // Save the Display Name
1593
+                   $("#saveDispName").click(function() {
1594
+
1595
+                      var dispNmText = $("#saveDispNmText").val();
1596
+
1597
+                      if (/^[a-zA-Z0-9\s\-\/\.\)\(\']+$/.test(dispNmText) && dispNmText.length < 256) {
1598
+
1599
+                             var saveDispNameUrl = OC.generateUrl("/apps/sms_relentless/user/savedisplayname");
1600
+
1601
+			     $.ajax({
1602
+				  url: saveDispNameUrl + '/' + userid,
1603
+				  method: 'POST',
1604
+				  dataType:'text',
1605
+                                  data: { 
1606
+                                          authorDisplayname: dispNmText,
1607
+                                          from: slctPhoneNb
1608
+                                         },
1609
+				  success: function(respupdname) {
1610
+                                               showAlert(respupdname);
1611
+                                               $("#disNameWindow").remove();
1612
+                                               $("#recTblOverlay").remove();
1613
+                                  },
1614
+				  error: function() {
1615
+                                               showAlert("Error while attempting to save the new Display Name to the database.");
1616
+                                               $("#disNameWindow").remove();
1617
+                                               $("#recTblOverlay").remove();
1618
+                                  }
1619
+			     });
1620
+
1621
+                      } else {
1622
+                              showAlert("The Display Name should contain only letters, numbers, spaces, hyphens (-), slashes (/), periods (.), round brackets ()() and single quotation marks ('), it should not be empty and should have less than 256 characters.");
1623
+                      }
1624
+                   });
1625
+
1626
+                });
1627
+
1628
+
1629
+                // Add pagination
1630
+                var rowsShown = messagesperpage;
1631
+                var rowsTotal = $("#recSmsTable tr").length;
1632
+
1633
+                var numPages = (rowsTotal - 2) / rowsShown;
1634
+
1635
+                for (i = 0; i < numPages; i++) {
1636
+                     var pageNum = i + 1;
1637
+                     $('#paginationrec').append('<a href="#" rel="' + i + '" class="pagenumbersrec">' + pageNum + '</a> ');
1638
+                }
1639
+
1640
+                $('#paginationrec').children(":first").addClass('active');
1641
+
1642
+                $('#paginationrec a:first').addClass('active');
1643
+
1644
+                // Show table page when clicking a page number
1645
+                $('.recpages a').bind('click', function() {
1646
+
1647
+                   $('#paginationrec').children().removeClass('active');
1648
+
1649
+                   $(this).addClass('active');
1650
+
1651
+                   var currentPageNo = $(this).text();
1652
+
1653
+                   $('#paginationrec a').each(function() {
1654
+                       if ($(this).text() == currentPageNo) {
1655
+                           $(this).addClass('active');
1656
+                       }
1657
+                   });
1658
+
1659
+                   // Sort table rows
1660
+		   var rows = $('#recSmsTable tr').get();
1661
+
1662
+		   rows.sort(function(a, b) {
1663
+
1664
+		        var A = parseInt($('td.dbidcolumnrec', a).text());
1665
+		        var B = parseInt($('td.dbidcolumnrec', b).text());
1666
+
1667
+		        if (A < B) {
1668
+		            return -1;
1669
+		        }
1670
+
1671
+		        if (A > B) {
1672
+		            return 1;
1673
+		        }
1674
+
1675
+		        return 0;
1676
+		   });
1677
+
1678
+		   $.each(rows, function(index, row) {
1679
+		      $('#recSmsTable').append(row);
1680
+		   });
1681
+
1682
+                   var currPage = $(this).attr('rel');
1683
+                   var startItem = currPage * rowsShown;
1684
+                   var endItem = startItem + rowsShown;
1685
+
1686
+                   $(".receivedrowsbody").hide().slice(startItem, endItem).css('display', 'table-row');
1687
+
1688
+                   $('#totalrecmessages').remove();
1689
+                   $('#smstables').append("<div id='totalrecmessages'>Total displayed messages: " + parseddata.length + "</div>");
1690
+                });
1691
+
1692
+                $('#paginationrec').children(":last").trigger('click');
1693
+
1694
+                // Select all records
1695
+                $('#selectAllChckbx').change(function() {
1696
+                  if ($(this).is(':checked')) {
1697
+                       $(".indivchckbx").prop("checked", true);
1698
+                  } else {
1699
+                       $(".indivchckbx").prop("checked", false);
1700
+                  }
1701
+                });
1702
+
1703
+                function reorderRecRows() {
1704
+                   var currenttext = $(".filterbuttonsrec").closest('[class="filterbuttonsrec"]').find('[class="indivfilterrec"]').text();
1705
+                   if (currenttext == '') {
1706
+                       $('tr').sort(function (a, b) {
1707
+                          return parseInt($('td.dbidcolumnrec', b).text()) < parseInt($('td.dbidcolumnrec', a).text());
1708
+                       }).appendTo("#recSmsTable");
1709
+                   }
1710
+                }
1711
+
1712
+                // Filter rows
1713
+                $("#databaseidfilter").on("click", function(event) {
1714
+
1715
+                      var databaseId = $("#dbidtextrec").val();
1716
+                      var msgrowsNo = 0;
1717
+
1718
+                      $(".receivedrowsbody").each(function() {
1719
+
1720
+                          var checkrecEmpty1 = 0;
1721
+                          $(".indivfilterrec").not("#dbidtextrec").each(function() {
1722
+                              if ($(this).val() != '') {
1723
+                                  checkrecEmpty1 = 1;
1724
+                              }
1725
+                          });
1726
+
1727
+                          if (checkrecEmpty1 == 0) {
1728
+                              $(this).show();
1729
+                          }
1730
+
1731
+                          if (databaseId != '') {
1732
+                             if ($(this).find('[class="dbidcolumnrec"]').text() == databaseId) {
1733
+                                $("#recSmsTable").append(this);
1734
+                                if ($(this).is(":visible")) { msgrowsNo++; }
1735
+                             } else {
1736
+                                $(this).hide();
1737
+                             }
1738
+                          } else {
1739
+                                $(this).show();
1740
+                                msgrowsNo++;
1741
+                          }
1742
+                      });
1743
+
1744
+                      reorderRecRows();
1745
+                      $('#totalrecmessages').remove();
1746
+                      $('#smstables').append("<div id='totalrecmessages'>Total filtered messages: " + msgrowsNo + "</div>");
1747
+                });
1748
+
1749
+
1750
+                $("#useridfilter").on("click", function(event) {
1751
+
1752
+                      var useridtxt = $("#useridtextrec").val().toLowerCase();
1753
+                      var msgrowsNo = 0;
1754
+
1755
+                      $(".receivedrowsbody").each(function() {
1756
+
1757
+                          var checkrecEmpty2 = 0;
1758
+                          $(".indivfilterrec").not("#useridtextrec").each(function() {
1759
+                              if ($(this).val() != '') {
1760
+                                  checkrecEmpty2 = 1;
1761
+                              }
1762
+                          });
1763
+
1764
+                          if (checkrecEmpty2 == 0) {
1765
+                              $(this).show();
1766
+                          }
1767
+
1768
+                          if (useridtxt != '') {
1769
+                             var useridfound = $(this).find('[class="useridcolrec"]').text().toLowerCase();
1770
+                             if(useridfound.indexOf(useridtxt) != -1) {
1771
+                                $("#recSmsTable").append(this);
1772
+                                if ($(this).is(":visible")) { msgrowsNo++; }
1773
+                             } else {
1774
+                                $(this).hide();
1775
+                             }
1776
+                          } else {
1777
+                                $(this).show();
1778
+                                msgrowsNo++;
1779
+                          }
1780
+                      });
1781
+
1782
+                      reorderRecRows();
1783
+                      $('#totalrecmessages').remove();
1784
+                      $('#smstables').append("<div id='totalrecmessages'>Total filtered messages: " + msgrowsNo + "</div>");
1785
+
1786
+                });
1787
+
1788
+                $("#messageidfilter").on("click", function(event) {
1789
+
1790
+                      var messageidtxt = $("#messageidtextrec").val().toLowerCase();
1791
+                      var msgrowsNo = 0;
1792
+
1793
+                      $(".receivedrowsbody").each(function() {
1794
+
1795
+                          var checkrecEmpty3 = 0;
1796
+                          $(".indivfilterrec").not("#messageidtextrec").each(function() {
1797
+                              if ($(this).val() != '') {
1798
+                                  checkrecEmpty3 = 1;
1799
+                              }
1800
+                          });
1801
+
1802
+                          if (checkrecEmpty3 == 0) {
1803
+                              $(this).show();
1804
+                          }
1805
+
1806
+                          if (messageidtxt != '') {
1807
+                             var foundtdmssgid = $(this).find('[class="messageidcolrec"]').text().toLowerCase();
1808
+                             if (foundtdmssgid.indexOf(messageidtxt) != -1) {
1809
+                                $("#recSmsTable").append(this);
1810
+                                if ($(this).is(":visible")) { msgrowsNo++; }
1811
+                             } else {
1812
+                                $(this).hide();
1813
+                             }
1814
+                          } else {
1815
+                                $(this).show();
1816
+                                msgrowsNo++;
1817
+                          }
1818
+                      });
1819
+
1820
+                      reorderRecRows();
1821
+                      $('#totalrecmessages').remove();
1822
+                      $('#smstables').append("<div id='totalrecmessages'>Total filtered messages: " + msgrowsNo + "</div>");
1823
+                });
1824
+
1825
+                $("#datefilter").on("click", function(event) {
1826
+
1827
+                      var datetxtvr = $("#datetextrec").val().toLowerCase();
1828
+                      var msgrowsNo = 0;
1829
+
1830
+                      $(".receivedrowsbody").each(function() {
1831
+
1832
+                          var checkrecEmpty4 = 0;
1833
+                          $(".indivfilterrec").not("#datetextrec").each(function() {
1834
+                              if ($(this).val() != '') {
1835
+                                  checkrecEmpty4 = 1;
1836
+                              }
1837
+                          });
1838
+
1839
+                          if (checkrecEmpty4 == 0) {
1840
+                              $(this).show();
1841
+                          }
1842
+
1843
+                          if (datetxtvr != '') {
1844
+                              var founddate = $(this).find('[class="datecolrec"]').text().toLowerCase();
1845
+                              if (founddate.indexOf(datetxtvr) != -1) {
1846
+                                  $("#recSmsTable").append(this);
1847
+                                  if ($(this).is(":visible")) { msgrowsNo++; }
1848
+                              } else {
1849
+                                  $(this).hide();
1850
+                              }
1851
+                          } else {
1852
+                                  $(this).show();
1853
+                                  msgrowsNo++;
1854
+                          }
1855
+                      });
1856
+
1857
+                      reorderRecRows();
1858
+                      $('#totalrecmessages').remove();
1859
+                      $('#smstables').append("<div id='totalrecmessages'>Total filtered messages: " + msgrowsNo + "</div>");
1860
+                });
1861
+
1862
+                $("#fromfilter").on("click", function(event) {
1863
+
1864
+                      var fromtxtvr = $("#fromtextrec").val().toLowerCase();
1865
+                      var msgrowsNo = 0;
1866
+
1867
+                      $(".receivedrowsbody").each(function() {
1868
+
1869
+                          var checkrecEmpty5 = 0;
1870
+                          $(".indivfilterrec").not("#fromtextrec").each(function() {
1871
+                              if ($(this).val() != '') {
1872
+                                  checkrecEmpty5 = 1;
1873
+                              }
1874
+                          });
1875
+
1876
+                          if (checkrecEmpty5 == 0) {
1877
+                              $(this).show();
1878
+                          }
1879
+
1880
+                          if (fromtxtvr != '') {
1881
+                             var foundfrom = $(this).find('[class="fromcolumnrec"]').text().toLowerCase();
1882
+                             if (foundfrom.indexOf(fromtxtvr) != -1) {
1883
+                                 $("#recSmsTable").append(this);
1884
+                                 if ($(this).is(":visible")) { msgrowsNo++; }
1885
+                             } else {
1886
+                                 $(this).hide();
1887
+                             }
1888
+                          } else {
1889
+                                 $(this).show();
1890
+                                 msgrowsNo++;
1891
+                          }
1892
+                      });
1893
+
1894
+                      reorderRecRows();
1895
+                      $('#totalrecmessages').remove();
1896
+                      $('#smstables').append("<div id='totalrecmessages'>Total filtered messages: " + msgrowsNo + "</div>");
1897
+                });
1898
+
1899
+                $("#tofilter").on("click", function(event) {
1900
+
1901
+                      var totxtvr = $("#totextrec").val().toLowerCase();
1902
+                      var msgrowsNo = 0;
1903
+
1904
+                      $(".receivedrowsbody").each(function() {
1905
+
1906
+                          var checkrecEmpty6 = 0;
1907
+                          $(".indivfilterrec").not("#totextrec").each(function() {
1908
+                              if ($(this).val() != '') {
1909
+                                  checkrecEmpty6 = 1;
1910
+                              }
1911
+                          });
1912
+
1913
+                          if (checkrecEmpty6 == 0) {
1914
+                              $(this).show();
1915
+                          }
1916
+
1917
+                          if (totxtvr != '') {
1918
+                             var foundto = $(this).find('[class="tocolrec"]').text().toLowerCase();
1919
+                             if (foundto.indexOf(totxtvr) != -1) {
1920
+                                 $("#recSmsTable").append(this);
1921
+                                 if ($(this).is(":visible")) { msgrowsNo++; }
1922
+                             } else {
1923
+                                 $(this).hide();
1924
+                             }
1925
+                          } else {
1926
+                                 $(this).show();
1927
+                                 msgrowsNo++;
1928
+                          }
1929
+                      });
1930
+
1931
+                      reorderRecRows();
1932
+                      $('#totalrecmessages').remove();
1933
+                      $('#smstables').append("<div id='totalrecmessages'>Total filtered messages: " + msgrowsNo + "</div>");
1934
+                });
1935
+
1936
+                $("#messagefilter").on("click", function(event) {
1937
+
1938
+                      var messagetxtvr = $("#messagetextrec").val().toLowerCase();
1939
+                      var msgrowsNo = 0;
1940
+
1941
+                      $(".receivedrowsbody").each(function() {
1942
+
1943
+                          var checkrecEmpty7 = 0;
1944
+                          $(".indivfilterrec").not("#messagetextrec").each(function() {
1945
+                              if ($(this).val() != '') {
1946
+                                  checkrecEmpty7 = 1;
1947
+                              }
1948
+                          });
1949
+
1950
+                          if (checkrecEmpty7 == 0) {
1951
+                              $(this).show();
1952
+                          }
1953
+
1954
+                          if (messagetxtvr != '') {
1955
+                             var foundmessage = $(this).find('[class="messagecolumnrec"]').text().toLowerCase();
1956
+                             if (foundmessage.indexOf(messagetxtvr) != -1) {
1957
+                                $("#recSmsTable").append(this);
1958
+                                if ($(this).is(":visible")) { msgrowsNo++; }
1959
+                             } else {
1960
+                                $(this).hide();
1961
+                             }
1962
+                          } else {
1963
+                                $(this).show();
1964
+                                msgrowsNo++;
1965
+                          }
1966
+                      });
1967
+
1968
+                      reorderRecRows();
1969
+                      $('#totalrecmessages').remove();
1970
+                      $('#smstables').append("<div id='totalrecmessages'>Total filtered messages: " + msgrowsNo + "</div>");
1971
+               });
1972
+
1973
+               // Clear all filters
1974
+               $("#clearrecfilters").on("click", function(event) {
1975
+                      $(".receivedrowsbody").each(function() {
1976
+                          $(this).show();
1977
+                      });
1978
+                      $(".indivfilterrec").val("");
1979
+                      $('#totalrecmessages').remove();
1980
+                      $('#smstables').append("<div id='totalrecmessages'>Total displayed messages: " + parseddata.length + "</div>");
1981
+               });
1982
+
1983
+               // Delete selected rows from the database
1984
+               $("#deleterecrows").on("click", function() {
1985
+                  var checkcheckbx = jQuery("#recSmsTable input[type=checkbox]:checked").length;
1986
+                  if (checkcheckbx == 0) {
1987
+                      showAlert("Please select the row(s) to permanently delete from the database !");
1988
+                  } else {
1989
+                          var checkboxIds = [];
1990
+                          $(".receivedrowsbody").each(function() {
1991
+                             var rowcheckbx = $(this).find('input[type="checkbox"]');
1992
+                             if (rowcheckbx.is(":checked")) {
1993
+                                 var dbrowid = $(this).find('[class="dbidcolumnrec"]').text();
1994
+                                 checkboxIds.push(dbrowid);
1995
+                             }
1996
+                          });
1997
+
1998
+		          confirmAlert("Please note that the row(s) you selected will be permanently deleted from the database, without being saved before removal. This action cannot be undone ! If you really want to permanently delete the selected row(s) press 'OK'.");
1999
+
2000
+		          $("#confirmCancel").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
2001
+
2002
+		          $("#confirmOk").click(function() {
2003
+
2004
+		              $("#alertMsgOverlay").remove();
2005
+		              $("#alertConfMessage").remove();
2006
+
2007
+                              var deleterecRowsUrl = OC.generateUrl("/apps/sms_relentless/user/removerecrows");
2008
+                              $('#smstables').addClass('icon-loading');
2009
+
2010
+                              $.ajax({
2011
+                                   url: deleterecRowsUrl + '/' + userid,
2012
+                                   method: "POST",
2013
+                                   dataType:'text',
2014
+                                   data: {recmessagedbIDs: checkboxIds},
2015
+                                   success: function() {
2016
+                                              showAlert("The row(s) have been deleted successfully !");
2017
+                                              $('#smstables').removeClass('icon-loading');
2018
+                                              $('#receivedsmstableshow').click();
2019
+                                   },
2020
+                                   error: function() {
2021
+                                              showAlert("There was an error while deleting the selected row(s) !");
2022
+                                              $('#smstables').removeClass('icon-loading');
2023
+                                   }
2024
+                              });
2025
+                          });
2026
+
2027
+                  }
2028
+               });
2029
+
2030
+
2031
+               // Show/Hide filter row
2032
+	       $('#recarrow').on('click', function() {
2033
+	          if ($('#recfiltersrow').is(':visible')) {
2034
+		      $('#recfiltersrow').hide();
2035
+                      $('#recheaderrow').css('top', '0px');
2036
+                      $(this).removeClass('arrowUpCl');
2037
+                      $(this).addClass('arrowDownCl');
2038
+		  } else {
2039
+		      $('#recfiltersrow').show();
2040
+                      $('#recheaderrow').css('top', '158px');
2041
+                      $(this).removeClass('arrowDownCl');
2042
+                      $(this).addClass('arrowUpCl');
2043
+                  }
2044
+               });
2045
+
2046
+               $("#app-content").animate({scrollTop:$("#recSmsTable").prop("scrollHeight")},200);
2047
+          },
2048
+          error: function(recdatafromdb) {
2049
+                      showAlert("Error. You can check the Nextcloud log to find more details about this issue.");
2050
+                      $('#smstables').removeClass('icon-loading');
2051
+          }
2052
+     });
2053
+
2054
+  });
2055
+
2056
+
2057
+  // List sent messages
2058
+  $("#sentsmstableshow").on("click", function(event) {
2059
+
2060
+     $('#smstables').empty();
2061
+
2062
+     var getSentUrl = OC.generateUrl("/apps/sms_relentless/user/getsenttable");
2063
+     $('#smstables').addClass('icon-loading');
2064
+
2065
+     $.ajax({
2066
+          url: getSentUrl + '/' + userid,
2067
+          method: "GET",
2068
+          contentType: 'application/json',
2069
+          success: function(sentdatafdb) {
2070
+
2071
+                var sentparseddata = sentdatafdb.datarows;
2072
+
2073
+                $('#smstables').append("<div id='toptablesent'><div class='topbuttonandpage'><span id='sentarrow' title='Show/Hide filters and Delete button'></span></div><div id='paginationsent' class='pages'>Pages </div></div>");
2074
+                $('#smstables').append("<table id='sentSmsTable'></table>");
2075
+                $('#sentSmsTable').append("<tr id='sentfiltersrow'><td class='selectalldvfilter'><button id='clearsentfilters' title='Clear all filters.'></button><button id='deletesentrows' title='Permanently delete the selected row(s) from below from the database.'></button></td><td class='selectalldvfilter'><input type='text' id='dbidtextsent' class='indivfiltersent' title='Enter a database ID number to apply the filter.'><input type='submit' id='databaseidfilter' class='filterbuttonsent' value='' title='Filter rows by the specified database ID.' /></td><td class='selectalldvfilter'><input type='text' id='useridtext' class='indivfiltersent' title='Enter a Nextcloud username to apply the filter.' /><input type='submit' id='useridfilter' class='filterbuttonsent' value='' title='Filter rows by the specified username.' /></td><td class='selectalldvfilter'><input type='text' id='messageidtext' class='indivfiltersent' title='Enter a fragment from a message ID to apply the filter.'  /><input type='submit' id='messageidfilter' class='filterbuttonsent' value='' title='Filter rows by the specified string.' /></td><td class='selectalldvfilter'><input type='text' id='datetext' class='indivfiltersent' title='Enter a fragment of a date to apply the filter.'/><input type='submit' id='datefilter' class='filterbuttonsent' value='' title='Filter rows by the specified string.' /></td><td class='selectalldvfilter'><input type='text' id='fromtext' class='indivfiltersent' title='Enter a fragment of a sender&#146s phone number or alphanumeric Sender ID, to apply the filter.' /><input type='submit' id='fromfilter' class='filterbuttonsent' value='' title='Filter rows by the specified string.' /></td><td class='selectalldvfilter'><input type='text' id='totext' class='indivfiltersent' value='' title='Enter a fragment of a recipient&#146s phone number to apply the filter.'  /><input type='submit' id='tofilter' class='filterbuttonsent' value='' title='Filter rows by the specified string.' /></td><td class='selectalldvfilter'><input type='text' id='networktext' class='indivfiltersent' title='Enter a fragment of a network number to apply the filter.' /><input type='submit' id='networkfilter' class='filterbuttonsent' value='' title='Filter rows by the specified string.'/></td><td class='selectalldvfilter'><input type='text' id='pricetext' class='indivfiltersent' title='Enter a fragment of a price string to apply the filter.' /><input type='submit' id='pricefilter' class='filterbuttonsent' value='' title='Filter rows by the specified string.'/></td><td class='selectalldvfilter'><input type='text' id='statustext' class='indivfiltersent' title='Enter a fragment of a status to apply the filter.' /><input type='submit' id='statusfilter' class='filterbuttonsent' value='' title='Filter rows by the specified string.'/></td><td class='selectalldvfilter'><input type='text' id='deliveryrcpttext' class='indivfiltersent' title='Enter a fragment of a delivery receit to apply the filter.' /><input type='submit' id='deliveryrecfilter' class='filterbuttonsent' value='' title='Filter rows by the specified string.'/></td><td class='selectalldvfilter'><input type='text' id='messagetext' class='indivfiltersent' title='Enter a fragment of a message to apply the filter.' /><input type='submit' id='messagefilter' class='filterbuttonsent' value='' title='Filter rows by the specified string.'/></td></tr>");
2076
+                $('#sentSmsTable').append("<tr class='sentrows' id='sentheaderrow'><th id='selectalldv' class='selectsmsdv'><input type='checkbox' id='selectAllChckbx' class ='indivchckbx' title='Select all rows.' /></th><th title='The database ID of each message.'>ID</th><th>User ID</th><th>Message ID</th><th>Date</th><th>From</th><th>To</th><th title='When a 5 or 6 digits code appears in this column, the first 3 digits specify the mobile country code and the last 2 or 3 digits specify the mobile network code of the receiver. You can look up the mobile country code and then the mobile network code on https://en.wikipedia.org/wiki/Mobile_country_code#National_operators'>Network</th><th title=\"The currency is the currency configured in the client account, on the SMS provider's website.\">Price</th><th id='sentstatuscolumn' title=\"This column generally shows the status received from the recipient's carrier, or any errors generated when attempting to send the message.\">Status</th><th title='Not all delivery receipts guarantee that the target received the message. Some delivery receipts represent successful completion of just one step in the delivery process, such as transmitting the message to another telephony operator.'>Delivery<br>Receit</th><th>Sent Message</th></tr>");
2077
+
2078
+                $('#sentfiltersrow').hide();
2079
+
2080
+                if (sentdatafdb.showdispnm == 1) {
2081
+
2082
+                    for (var i = 0; i < sentparseddata.length; i++) {
2083
+
2084
+                         if (sentparseddata[i].author_displayname) {
2085
+                             var procmessage = "<span class='messageAuthorName'>"+ sentparseddata[i].author_displayname + ":</span>" + sentparseddata[i].message +"<div id='showMsgConv-"+ i +"' class='lstMsgConv'><img class='lstMsgConvImg' src='/apps/sms_relentless/img/reply.svg' title='Show all the messages exchanged between the current 2 phone numbers.'></div>";
2086
+                         } else {
2087
+                             var procmessage = sentparseddata[i].message +"<div id='showMsgConv-"+ i +"' class='lstMsgConv'><img class='lstMsgConvImg' src='/apps/sms_relentless/img/reply.svg' title='Show all the messages exchanged between the current 2 phone numbers.'></div>";
2088
+                         }
2089
+
2090
+                         var procsentFrom = "<div id='frmNmbr-"+ i +"'>"+ sentparseddata[i].from +"<div id='showMsgFrom-"+ i +"' class='listToFromMsgs'><img class='lstMsgToFromImg' src='/apps/sms_relentless/img/list.svg' title='Show all the messages sent/received to/from this phone number, that I am allowed to see.'></div></div>";
2091
+
2092
+                         var procsentTo = "<div id='toNmbr-"+ i +"'>"+ sentparseddata[i].to +"<div id='showMsgTo-"+ i +"' class='listToFromMsgs'><img class='lstMsgToFromImg' src='/apps/sms_relentless/img/list.svg' title='Show all the messages sent/received to/from this phone number, that I am allowed to see.'></div></div>";
2093
+
2094
+                         $('#sentSmsTable').append("<tr id='singlerow_"+ i +"' class='sentrowsbody'><td class='selectsmsdv'><input type='checkbox' id='selectspec_"+ i +"' class='indivchckbx' /></td><td class='sentdbidcolumn'>"+ sentparseddata[i].id +"</td><td class='useridcolsent'>"+ sentparseddata[i].user_id +"</td><td class='messageidcolsent'>"+ sentparseddata[i].message_id +"</td><td class='datecolsent'>"+ sentparseddata[i].date +"</td><td class='fromcolumnsent'>"+ procsentFrom +"</td><td class='tocolumnsent'>"+ procsentTo +"</td><td class='networkcolumnsent'>"+ sentparseddata[i].network +"</td><td class='pricecolumnsent'>"+ sentparseddata[i].price +"</td><td class='statuscolumnsent'>"+ sentparseddata[i].status +"</td><td class='deliveryrcptcolsent'>"+ sentparseddata[i].deliveryreceipt +"</td><td class='messagecolumnsent'>"+ procmessage +"</td></tr>");
2095
+                    }
2096
+
2097
+                } else {
2098
+
2099
+                    for (var i = 0; i < sentparseddata.length; i++) {
2100
+
2101
+                         var procmessage = sentparseddata[i].message +"<div id='showMsgConv-"+ i +"' class='lstMsgConv'><img class='lstMsgConvImg' src='/apps/sms_relentless/img/reply.svg' title='Show all the messages exchanged between the current 2 phone numbers.'></div>";
2102
+
2103
+                         var procsentFrom = "<div id='frmNmbr-"+ i +"'>"+ sentparseddata[i].from +"<div id='showMsgFrom-"+ i +"' class='listToFromMsgs'><img class='lstMsgToFromImg' src='/apps/sms_relentless/img/list.svg' title='Show all the messages sent/received to/from this phone number, that I am allowed to see.'></div></div>";
2104
+
2105
+                         var procsentTo = "<div id='toNmbr-"+ i +"'>"+ sentparseddata[i].to +"<div id='showMsgTo-"+ i +"' class='listToFromMsgs'><img class='lstMsgToFromImg' src='/apps/sms_relentless/img/list.svg' title='Show all the messages sent/received to/from this phone number, that I am allowed to see.'></div></div>";
2106
+
2107
+                         $('#sentSmsTable').append("<tr id='singlerow_"+ i +"' class='sentrowsbody'><td class='selectsmsdv'><input type='checkbox' id='selectspec_"+ i +"' class='indivchckbx' /></td><td class='sentdbidcolumn'>"+ sentparseddata[i].id +"</td><td class='useridcolsent'>"+ sentparseddata[i].user_id +"</td><td class='messageidcolsent'>"+ sentparseddata[i].message_id +"</td><td class='datecolsent'>"+ sentparseddata[i].date +"</td><td class='fromcolumnsent'>"+ procsentFrom +"</td><td class='tocolumnsent'>"+ procsentTo +"</td><td class='networkcolumnsent'>"+ sentparseddata[i].network +"</td><td class='pricecolumnsent'>"+ sentparseddata[i].price +"</td><td class='statuscolumnsent'>"+ sentparseddata[i].status +"</td><td class='deliveryrcptcolsent'>"+ sentparseddata[i].deliveryreceipt +"</td><td class='messagecolumnsent'>"+ procmessage +"</td></tr>");
2108
+                    }
2109
+                }
2110
+
2111
+                $('#smstables').append("<div id='totalsentmessages'><span>Total displayed messages: " + sentparseddata.length + "</span></div>");
2112
+
2113
+                $('#smstables').removeClass('icon-loading');
2114
+
2115
+                $('#sentarrow').removeClass('arrowUpCl');
2116
+                $('#sentarrow').addClass('arrowDownCl');
2117
+
2118
+
2119
+                // Show the pop-up window that lists all the messages exchanged between the current 2 phone numbers
2120
+                function showSentMsgPerConv(phNumberFrom, phNumberTo) {
2121
+
2122
+                   let allfrmtomsg = "<div id='listAllMsgsConv'>";
2123
+                   allfrmtomsg += "<div id='draglstMsgmWindow'><img src='/apps/sms_relentless/img/dots.svg'></div>";
2124
+                   allfrmtomsg += "<a id='closeFrmMsgWindow' title='Close this window'></a>";
2125
+                   allfrmtomsg += "<div class='showByNmbrTitle'>Messages exchanged between <span style='color:#04957b'>"+ phNumberFrom +"</span> and <span style='color:#04957b'>"+ phNumberTo +"</span></div>";
2126
+                   allfrmtomsg += "<div id='frmMsgLstWrap'>";
2127
+                   allfrmtomsg += "<table id='frmMsgLstTbl'>";
2128
+                   allfrmtomsg += "<tr class='groupedrowsbody'><td><div id='grpdbynamelst' class='groupedLstNamespn'></div></td><td><div id='loadMoreMsgs' title='Click to load older messages.'>Load more messages</div><div id='loadMoreMsgsusr' title='Click to load older messages.'>Load more messages</div><div id='msgListRowCell' class='groupedLstMsgspn'></div><div id='arrowupWrap'><div id='upArrowSmall' title='Scroll to the top'></div></div></td></tr>";
2129
+                   allfrmtomsg += "</table></div>";
2130
+                   allfrmtomsg += "<div id='sendMsgReply'><table id='sendMsgConv'><tr><td><div id='fromPhoneNmbrConv'>From: <select id='selectFromNbConv'></select></div><div id='toPhoneNmbrConv'>To: <span id='toNmbrConv' style='color:#04957b'>"+ phNumberTo +"</span></div></td></tr>";
2131
+                   allfrmtomsg += "<tr><td><textarea id='sendMsgConvText' placeholder='Enter a message here, then press Send SMS'></textarea></td></tr></table>";
2132
+                   allfrmtomsg += "<div id='sendMsgConvBtn'>Send SMS</div></div>";
2133
+                   allfrmtomsg += "<div style='display:block;width:100%;height:14px;'><img id='expandWindowRpl' src='/apps/sms_relentless/img/arrowDown.svg' title='Expand to send a reply'></div>";
2134
+                   allfrmtomsg += "<div id='draglstMsgmWindowsc'><img src='/apps/sms_relentless/img/dots.svg' style='padding:4px;vertical-align:top;'></div>";
2135
+                   allfrmtomsg += "</div>";
2136
+
2137
+                   $("#content").append("<div id='recTblOverlay'></div>");
2138
+                   $("#content").append(allfrmtomsg);
2139
+
2140
+                   let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 340) +"px";
2141
+                   let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 300) +"px";
2142
+                   $("#listAllMsgsConv").css({ "top" : topDist, "left" : leftDist });
2143
+
2144
+                   $("#closeFrmMsgWindow").click(function() { $("#listAllMsgsConv").remove(); $("#recTblOverlay").remove(); });
2145
+                   $("#recTblOverlay").click(function() { $("#listAllMsgsConv").remove(); $("#recTblOverlay").remove(); });
2146
+
2147
+	           // Expand the window when clicking on the arrow, to be able to send a reply message
2148
+	           $("#expandWindowRpl").click(function() {
2149
+
2150
+	              if ($(this).attr('src') == '/apps/sms_relentless/img/arrowDown.svg') {
2151
+                          $("#sendMsgReply").css("display", "block");
2152
+                          $("#listAllMsgsConv").css("height", "618px");
2153
+	                  $(this).attr('src', '/apps/sms_relentless/img/arrowUp.svg');
2154
+                          $(this).attr('title', 'Collapse');
2155
+	              } else {
2156
+                          $("#sendMsgReply").css("display", "none");
2157
+                          $("#listAllMsgsConv").css("height", "490px");
2158
+                          $(this).attr('src', '/apps/sms_relentless/img/arrowDown.svg');
2159
+                          $(this).attr('title', 'Expand to send a reply');
2160
+	              }
2161
+	           });
2162
+
2163
+                   // Send a message from the 'conversation' window
2164
+                   $("#sendMsgConvBtn").click(function() {
2165
+
2166
+                      $("#sendMsgConv,#sendMsgConvBtn").addClass('icon-loading');
2167
+                      var msgToSend = $("#sendMsgConvText").val();
2168
+                      var selectedid = $("#selectFromNbConv").val();
2169
+                      var toNumber = $("#toNmbrConv").text();
2170
+                      var receiversNumbers = [toNumber];
2171
+
2172
+		      if (selectedid != '') { 
2173
+
2174
+			  var sendersplit = selectedid.split(":");
2175
+			  var providercap = sendersplit[0];
2176
+			  var provsec = sendersplit[1];
2177
+
2178
+			  if (/[a-zA-Z]/.test(provsec)) {
2179
+			      var alphanumcheck = true;
2180
+			  } else { var alphanumcheck = false; }
2181
+
2182
+			  if (providercap == 'Tx' && alphanumcheck == false) {  
2183
+			      var senderproc = selectedid.replace(/[^0-9]/g, "");
2184
+			      var selectedsender = "+" + senderproc;
2185
+			      var providerUsed = "telnyx";
2186
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmstel");
2187
+			  } else if (providercap == 'Pl' && alphanumcheck == false) {
2188
+			      var selectedsender = selectedid.replace(/[^0-9]/g, "");
2189
+			      var providerUsed = "plivo";
2190
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmsnex");
2191
+			  } else if (providercap == 'Tw' && alphanumcheck == false) {  
2192
+			      var senderproc = selectedid.replace(/[^0-9]/g, "");
2193
+			      var selectedsender = "+" + senderproc;
2194
+			      var providerUsed = "twilio";
2195
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmstwil");
2196
+			  } else if (providercap == 'Fl' && alphanumcheck == false) {  
2197
+			      var senderproc = selectedid.replace(/[^0-9]/g, "");
2198
+			      var selectedsender = "+" + senderproc;
2199
+			      var providerUsed = "flowroute";
2200
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmsflow");
2201
+			  } else if (providercap == 'Tx' && alphanumcheck == true) {
2202
+			      var selectedsender = provsec;
2203
+			      var providerUsed = "telnyx";
2204
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmstel");
2205
+			  } else if (providercap == 'Pl' && alphanumcheck == true) {
2206
+			      var selectedsender = provsec;
2207
+			      var providerUsed = "plivo";
2208
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmsnex");
2209
+			  } else if (providercap == 'Tw' && alphanumcheck == true) {
2210
+			      var selectedsender = provsec;
2211
+			      var providerUsed = "twilio";
2212
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmstwil");
2213
+			  } else if (providercap == 'Fl' && alphanumcheck == true) {
2214
+			      var selectedsender = provsec;
2215
+			      var providerUsed = "flowroute";
2216
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmsflow");
2217
+			  }
2218
+
2219
+                          var uploadedtomms = [];
2220
+
2221
+	                  if (msgToSend != '') {
2222
+
2223
+				  $.ajax({
2224
+				     url: relbaseUrl + '/' + userid,
2225
+				     type: "POST",
2226
+				     data: {
2227
+				           receiversPhoneNbs: receiversNumbers,
2228
+				           fromsender: selectedsender,
2229
+				           waitinterval: 1000,
2230
+				           sentsmstext: msgToSend,
2231
+				           ismms: 0,
2232
+				           mmsfiles: uploadedtomms
2233
+				         },
2234
+				     success: function(displayname) {
2235
+
2236
+                                           var tzdate = new Date();
2237
+                                           var presDatest = new Date(tzdate.getTime() - (tzdate.getTimezoneOffset() * 60000)).toJSON();
2238
+                                           var presDatedb = presDatest.split(".")[0];
2239
+                                           var presDatesc = presDatedb.split("T");
2240
+                                           var presDate = presDatesc[0] +" "+ presDatesc[1];
2241
+                                           var sentMessageStatus = '';
2242
+
2243
+                                           if (displayname) {
2244
+                                               var msgToSendproc = "<span class='msgAuthorNameGrp'>"+ displayname + ":</span>" + msgToSend; 
2245
+                                           } else { var msgToSendproc = ''; }
2246
+
2247
+                                           $("#msgListRowCell").append("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ selectedsender +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ receiversNumbers[0] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ msgToSendproc +"</div><div style='display:inline-block;margin:6px 6px 0px 4px;font-size:12.5px;color:#353535;'>"+ presDate +"</div><div class='sentMssgStatus'>"+ sentMessageStatus +"</div></div>");
2248
+
2249
+                                           // Scroll down to the bottom of the window
2250
+                                           $("#frmMsgLstWrap").animate({scrollTop:$("#frmMsgLstTbl").prop("scrollHeight")},200);
2251
+
2252
+                                           $("#sendMsgConv,#sendMsgConvBtn").removeClass('icon-loading');
2253
+				     },
2254
+				     error: function() {
2255
+				           showAlert("Error while sending the message. You can check your Nextcloud log to find out more about this issue.");
2256
+				           $("#sendMsgConv,#sendMsgConvBtn").removeClass('icon-loading');
2257
+				     }
2258
+				  });
2259
+			  } else {
2260
+				  showAlert("Please enter a message in the text box!");
2261
+				  $("#sendMsgConv,#sendMsgConvBtn").removeClass('icon-loading');
2262
+			  }
2263
+		      } else {
2264
+			      showAlert("Please choose a Sender ID from the 'From' drop-down list!");
2265
+			      $("#sendMsgConv,#sendMsgConvBtn").removeClass('icon-loading');
2266
+		      }
2267
+
2268
+                   });
2269
+
2270
+
2271
+	           // Make the window draggable
2272
+	           function makeMgrWndDraggable(e) {
2273
+
2274
+			   window.pmdragging = {};
2275
+			   pmdragging.pageX0 = e.pageX;
2276
+			   pmdragging.pageY0 = e.pageY;
2277
+			   pmdragging.elem = $("#listAllMsgsConv");
2278
+			   pmdragging.offset0 = $("#listAllMsgsConv").offset();
2279
+
2280
+			   function handle_dragging(e) {
2281
+			       let left = pmdragging.offset0.left + (e.pageX - pmdragging.pageX0);
2282
+			       let top = pmdragging.offset0.top + (e.pageY - pmdragging.pageY0);
2283
+			       $(pmdragging.elem).offset({top: top, left: left});
2284
+			   }
2285
+
2286
+			   function handle_mouseup(e) {
2287
+			       $('body').off('mousemove', handle_dragging).off('mouseup', handle_mouseup);
2288
+			   }
2289
+
2290
+			   $('body').on('mouseup', handle_mouseup).on('mousemove', handle_dragging);
2291
+	           }
2292
+	           $("#draglstMsgmWindow").mousedown(makeMgrWndDraggable);
2293
+	           $("#draglstMsgmWindowsc").mousedown(makeMgrWndDraggable);
2294
+
2295
+
2296
+                   // Append the available phone numbers to the From drop-down list
2297
+                   var availPhoneNmbrs = [];
2298
+                   $("#currentsmsnmbrs .optselectsmsnb").each(function() {
2299
+                      var crtphnmbr = $(this).attr("value");
2300
+                      if (crtphnmbr != "") { availPhoneNmbrs.push(crtphnmbr); }
2301
+                   });
2302
+
2303
+                   if (availPhoneNmbrs.length > 0) {
2304
+                       var avphopt = "";
2305
+                       for (let d = 0; d < availPhoneNmbrs.length; d++) {
2306
+                            if (availPhoneNmbrs[d].indexOf(phNumberFrom) === -1) {
2307
+                                avphopt += "<option value='"+ availPhoneNmbrs[d] +"'>"+ availPhoneNmbrs[d] +"</option>";
2308
+                            } else {
2309
+                                avphopt += "<option value='"+ availPhoneNmbrs[d] +"' selected>"+ availPhoneNmbrs[d] +"</option>";
2310
+                            }
2311
+                       }
2312
+                       $("#selectFromNbConv").append(avphopt);
2313
+
2314
+                   } else { $("#selectFromNbConv").append("<option value='' selected>No IDs</option>"); }
2315
+
2316
+
2317
+                   // Get the sent/received messages for the current phone number, from the database
2318
+		   let getGrpConvUrl = OC.generateUrl("/apps/sms_relentless/user/getgroupedforreply");
2319
+
2320
+		   $('#listAllMsgsConv').addClass('icon-loading');
2321
+		   let totalPhNmbrs = 0;
2322
+
2323
+		   $.ajax({
2324
+			  method: 'POST',
2325
+			  url: getGrpConvUrl + '/' + userid,
2326
+			  contentType: 'application/json',
2327
+                          data: JSON.stringify({ phoneNmbrFrom: phNumberFrom, phoneNmbrTo: phNumberTo }),
2328
+			  success: function(groupedperconv) {
2329
+
2330
+				     $('#listAllMsgsConv').removeClass('icon-loading');
2331
+
2332
+				     let fromtoNmbrsData = [];
2333
+
2334
+				     for (let i = 0; i < groupedperconv.length; i++) {
2335
+
2336
+					     if (groupedperconv[i].author_displayname) {
2337
+						 var authordnm = groupedperconv[i].author_displayname;
2338
+					     } else { 
2339
+						 var authordnm = '';
2340
+					     }
2341
+
2342
+					     var sentfromnmbrarr = groupedperconv[i].from.split("+");
2343
+				             if (sentfromnmbrarr[1]) {
2344
+						 var groupednbfrom = "+"+ sentfromnmbrarr[1];
2345
+				             } else {
2346
+						 var groupednbfrom = sentfromnmbrarr[0];
2347
+				             }
2348
+
2349
+				             var modmessagerec = '';
2350
+				             if (groupedperconv[i].author_displayname) {
2351
+						 modmessagerec = "<span class='msgAuthorNameGrp'>"+ groupedperconv[i].author_displayname + ":</span>" + groupedperconv[i].message;
2352
+				             } else {
2353
+			                         modmessagerec = groupedperconv[i].message;
2354
+                                             }
2355
+
2356
+				             if (groupedperconv[i].to.indexOf(": ") > -1) {
2357
+				                 var groupednmbrtopre = groupedperconv[i].to.split(": ");
2358
+				                 var groupednmbrto = groupednmbrtopre[1];
2359
+				             } else { 
2360
+				                 var groupednmbrto = groupedperconv[i].to;
2361
+				             }
2362
+
2363
+				             fromtoNmbrsData.push({
2364
+				                       'author_displayname': authordnm,
2365
+				                       'from': groupednbfrom,
2366
+				                       'to': groupednmbrto,
2367
+				                       'message': modmessagerec,
2368
+				                       'date': groupedperconv[i].date,
2369
+				                       'status': groupedperconv[i].deliveryreceipt,
2370
+				                       'table': groupedperconv[i].table
2371
+				             });
2372
+				     }
2373
+
2374
+
2375
+				     // Remove the duplicates
2376
+				     let noDupMsgData = [];
2377
+				     $.each(fromtoNmbrsData, function(i, e) {
2378
+					    let matchingData = $.grep(noDupMsgData, function(item) {
2379
+				                    return item.from == e.from && item.to == e.to && item.message == e.message && item.table == 'received' && e.table == 'sent';
2380
+					    });
2381
+					    if (matchingData.length === 0) {
2382
+						noDupMsgData.push(e);
2383
+					    }
2384
+				     });
2385
+
2386
+				     let messagesPerNmbr = {};
2387
+				     let msgsNamesPerNmbr = {};
2388
+				     let msgsNmbrsNames = {};
2389
+
2390
+			             let displayNamesarr = [];
2391
+			             let convData = [];
2392
+
2393
+			             for (let n = 0; n < noDupMsgData.length; n++) {
2394
+
2395
+			                  if (noDupMsgData[n]['from'] == phNumberTo && noDupMsgData[n]['table'] == 'sent') {
2396
+
2397
+			                      convData.push({
2398
+			                                     'author_displayname': noDupMsgData[n]['author_displayname'],
2399
+			                                     'message': noDupMsgData[n]['message'],
2400
+			                                     'from': noDupMsgData[n]['from'],
2401
+			                                     'to': noDupMsgData[n]['to'],
2402
+			                                     'date': noDupMsgData[n]['date'],
2403
+			                                     'direction': 'sent_from',
2404
+			                                     'status': noDupMsgData[n]['status'],
2405
+			                                     'table': noDupMsgData[n]['table']
2406
+			                      });
2407
+
2408
+			                  } else if (noDupMsgData[n]['to'] == phNumberTo && noDupMsgData[n]['table'] == 'sent') {
2409
+
2410
+			                      convData.push({
2411
+			                                     'author_displayname': noDupMsgData[n]['author_displayname'],
2412
+			                                     'message': noDupMsgData[n]['message'],
2413
+			                                     'from': noDupMsgData[n]['from'],
2414
+			                                     'to': noDupMsgData[n]['to'],
2415
+			                                     'date': noDupMsgData[n]['date'],
2416
+			                                     'direction': 'sent_to',
2417
+			                                     'status': noDupMsgData[n]['status'],
2418
+			                                     'table': noDupMsgData[n]['table']
2419
+			                      });
2420
+
2421
+
2422
+			                  } else if (noDupMsgData[n]['from'] == phNumberTo && noDupMsgData[n]['table'] == 'received') {
2423
+
2424
+			                      convData.push({
2425
+			                                     'author_displayname': noDupMsgData[n]['author_displayname'],
2426
+			                                     'message': noDupMsgData[n]['message'],
2427
+			                                     'from': noDupMsgData[n]['from'],
2428
+			                                     'to': noDupMsgData[n]['to'],
2429
+			                                     'date': noDupMsgData[n]['date'],
2430
+			                                     'direction': 'received_from',
2431
+			                                     'status': noDupMsgData[n]['status'],
2432
+			                                     'table': noDupMsgData[n]['table']
2433
+			                      });
2434
+
2435
+			                  } else if (noDupMsgData[n]['to'] == phNumberTo && noDupMsgData[n]['table'] == 'received') {
2436
+
2437
+			                      convData.push({
2438
+			                                     'author_displayname': noDupMsgData[n]['author_displayname'],
2439
+			                                     'message': noDupMsgData[n]['message'],
2440
+			                                     'from': noDupMsgData[n]['from'],
2441
+			                                     'to': noDupMsgData[n]['to'],
2442
+			                                     'date': noDupMsgData[n]['date'],
2443
+			                                     'direction': 'received_on',
2444
+			                                     'status': noDupMsgData[n]['status'],
2445
+			                                     'table': noDupMsgData[n]['table']
2446
+			                      });
2447
+			                  }
2448
+			             }
2449
+
2450
+			             // Sort messages by date
2451
+				     convData.sort(function(a, b) {
2452
+					let c = new Date(a.date);
2453
+					let d = new Date(b.date);
2454
+					return c-d;
2455
+				     });
2456
+                                     convData.reverse();
2457
+
2458
+			             // Collect the display names of the users that sent messages from the current number
2459
+			             let selectedNames = [];
2460
+			             let displayNames = '';
2461
+			             for (let v = 0; v < convData.length; v++) {
2462
+			                  if (selectedNames.indexOf(convData[v]['author_displayname']) == -1) {
2463
+			                      selectedNames.push(convData[v]['author_displayname']);
2464
+			                      displayNames += "<div id='diplNm_"+ phNumberTo +"_"+ v +"' class='dispNameList' name='"+ convData[v]['author_displayname'] +"'>"+ convData[v]['author_displayname'] +"</div>";
2465
+			                  }
2466
+			             }
2467
+			             displayNames += "<div id='diplNmAllMsg' class='dispNameListAll' title='Show all the messages for this number.'>"+ phNumberTo +"</div>";
2468
+
2469
+			             // Store the display names for the current number, to be able to see them later
2470
+			             let ctPhNumber = phNumberTo;
2471
+			             msgsNamesPerNmbr[ctPhNumber] = displayNames;
2472
+
2473
+			             // Store the messages sent by each user, to be able to see them later when clicking on the user's name
2474
+			             for (let h = 0; h < selectedNames.length; h++) {
2475
+
2476
+			                  let rowMessageArrpn = [];
2477
+			                  for (let b = 0; b < convData.length; b++) {
2478
+
2479
+			                       if (selectedNames[h] == convData[b]['author_displayname']) {
2480
+
2481
+					           if (convData[b]['direction'] == 'sent_from') {
2482
+					               if (convData[b]['status'].indexOf("delivered") > -1 || convData[b]['status'].indexOf("delivery success") > -1) {
2483
+					                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
2484
+					               } else {
2485
+					                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
2486
+					               }
2487
+					               rowMessageArrpn.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
2488
+					           } else if (convData[b]['direction'] == 'sent_to') {
2489
+					               if (convData[b]['status'].indexOf("delivered") > -1 || convData[b]['status'].indexOf("delivery success") > -1) {
2490
+					                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
2491
+					               } else {
2492
+					                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
2493
+					               }
2494
+					               rowMessageArrpn.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
2495
+					           } else if (convData[b]['direction'] == 'received_from') {
2496
+					               rowMessageArrpn.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div></div>");
2497
+					           } else if (convData[b]['direction'] == 'received_on') {
2498
+					               rowMessageArrpn.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div></div>");
2499
+			                           }
2500
+			                       }
2501
+			                  }
2502
+			                  let crtNmber = phNumberTo;
2503
+			                  let crtName = selectedNames[h];
2504
+			                  msgsNmbrsNames[crtNmber] = msgsNmbrsNames[crtNmber] || {};
2505
+                                          msgsNmbrsNames[crtNmber][crtName] = rowMessageArrpn;
2506
+			             }
2507
+
2508
+                                     // The number of messages to be loaded by default
2509
+                                     let nmbTblDefault = 50;
2510
+
2511
+                                     // If the total number of messages is greater than the default number of messages to display, show the 'Load more messages' button
2512
+                                     if (convData.length > nmbTblDefault) {
2513
+                                         $("#loadMoreMsgs").css("display", "block");
2514
+                                         var nmbToBeLoaded = nmbTblDefault;
2515
+                                     } else { var nmbToBeLoaded = convData.length; }
2516
+
2517
+			             let rowMessageArr = [];
2518
+			             for (var m = nmbToBeLoaded - 1; m >= 0; m--) {
2519
+
2520
+			                  if (convData[m]['direction'] == 'sent_from') {
2521
+
2522
+			                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
2523
+			                          let sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
2524
+			                      } else {
2525
+			                          let sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
2526
+			                      }
2527
+			                      rowMessageArr.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 6px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
2528
+
2529
+			                  } else if (convData[m]['direction'] == 'sent_to') {
2530
+
2531
+			                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
2532
+			                          let sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
2533
+			                      } else {
2534
+			                          let sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
2535
+			                      }
2536
+			                      rowMessageArr.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
2537
+
2538
+			                  } else if (convData[m]['direction'] == 'received_from') {
2539
+
2540
+					      rowMessageArr.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
2541
+
2542
+			                  } else if (convData[m]['direction'] == 'received_on') {
2543
+
2544
+					      rowMessageArr.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
2545
+			                  }
2546
+			             }
2547
+
2548
+			             let convDataPerNmbr = rowMessageArr.join("");
2549
+
2550
+                                     $("#grpdbynamelst").append(displayNames);
2551
+                                     $("#msgListRowCell").append(convDataPerNmbr);
2552
+
2553
+			             // Store the messages for the current number, to be able to see them later, when clicking on the number
2554
+			             let rowMessageArrcpt = [];
2555
+			             for (let m = 0; m < convData.length; m++) {
2556
+
2557
+			                  if (convData[m]['direction'] == 'sent_from') {
2558
+
2559
+			                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
2560
+			                          let sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
2561
+			                      } else {
2562
+			                          let sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
2563
+			                      }
2564
+			                      rowMessageArrcpt.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 6px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
2565
+
2566
+			                  } else if (convData[m]['direction'] == 'sent_to') {
2567
+
2568
+			                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
2569
+			                          let sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
2570
+			                      } else {
2571
+			                          let sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
2572
+			                      }
2573
+			                      rowMessageArrcpt.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
2574
+
2575
+			                  } else if (convData[m]['direction'] == 'received_from') {
2576
+
2577
+					      rowMessageArrcpt.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
2578
+
2579
+			                  } else if (convData[m]['direction'] == 'received_on') {
2580
+
2581
+					      rowMessageArrcpt.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
2582
+			                  }
2583
+			             }
2584
+
2585
+			             messagesPerNmbr[phNumberTo] = rowMessageArrcpt;
2586
+
2587
+                                     // Scroll down to the bottom of the window
2588
+                                     $("#frmMsgLstWrap").animate({scrollTop:$("#frmMsgLstTbl").prop("scrollHeight")},200);
2589
+
2590
+                                     // Load more messages
2591
+                                     let clickNmb = 0;
2592
+                                     $("#loadMoreMsgs").click(function() {
2593
+
2594
+                                         clickNmb++;
2595
+
2596
+                                         var crefnb = (clickNmb + 1) * nmbToBeLoaded;
2597
+
2598
+                                         if (crefnb > convData.length) {
2599
+                                             var nmbmsg = convData.length - 1;
2600
+                                             $("#loadMoreMsgs").css("display", "none");
2601
+                                         } else { 
2602
+                                             var nmbmsg = crefnb - 1;
2603
+                                         }
2604
+
2605
+                                         var rowMessageArrAdd = [];
2606
+
2607
+                                         for (let m = nmbmsg; m >= clickNmb * nmbToBeLoaded; m--) {
2608
+
2609
+			                      if (convData[m]['direction'] == 'sent_from') {
2610
+
2611
+			                          if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
2612
+			                              let sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
2613
+			                          } else {
2614
+			                              let sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
2615
+			                          }
2616
+			                          rowMessageArrAdd.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 6px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
2617
+
2618
+			                      } else if (convData[m]['direction'] == 'sent_to') {
2619
+
2620
+			                          if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
2621
+			                              let sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
2622
+			                          } else {
2623
+			                              let sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
2624
+			                          }
2625
+			                          rowMessageArrAdd.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
2626
+
2627
+			                      } else if (convData[m]['direction'] == 'received_from') {
2628
+
2629
+					          rowMessageArrAdd.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
2630
+
2631
+			                      } else if (convData[m]['direction'] == 'received_on') {
2632
+
2633
+					          rowMessageArrAdd.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
2634
+			                      }
2635
+                                         }
2636
+
2637
+			                 let convDataPerNmbrad = rowMessageArrAdd.join("");
2638
+
2639
+                                         let scrlheight = $("#msgListRowCell").height();
2640
+                                         $("#msgListRowCell").prepend(convDataPerNmbrad);
2641
+
2642
+                                         $("#frmMsgLstWrap").scrollTop($("#msgListRowCell").height() - scrlheight);
2643
+                                     });
2644
+
2645
+
2646
+			             // Show the messages sent by each user whose name is clicked
2647
+			             $('[id*="diplNm_"]').click(function() {
2648
+
2649
+			                 let crntNmbr = $(this).attr("id").split("_")[1];
2650
+			                 let crntDisName = $(this).attr("name");                               
2651
+                                         $("#loadMoreMsgs").css("display", "none");
2652
+
2653
+                                         let convDataprn = [];
2654
+                                         $.each(msgsNmbrsNames[crntNmbr][crntDisName], function(index, item) {
2655
+                                                convDataprn.push(item);
2656
+                                         });
2657
+
2658
+                                         // If the total number of messages is greater than the default number of messages to display, show the 'Load more messages' button
2659
+                                         if (convDataprn.length > nmbTblDefault) {
2660
+                                             $("#loadMoreMsgsusr").css("display", "block");
2661
+                                             let nmbToBeLoaded = nmbTblDefault;
2662
+                                         } else {
2663
+                                             $("#loadMoreMsgsusr").css("display", "none");
2664
+                                             let nmbToBeLoaded = convDataprn.length;
2665
+                                         }
2666
+
2667
+			                 let rowMessageArrprnst = [];
2668
+
2669
+			                 for (let n = nmbToBeLoaded - 1; n >= 0; n--) {
2670
+                                              rowMessageArrprnst.push(convDataprn[n]);
2671
+			                 }
2672
+
2673
+			                 let convDataPerNmbrprnst = rowMessageArrprnst.join("");
2674
+
2675
+                                         $("#msgListRowCell").empty();
2676
+                                         $("#msgListRowCell").append(convDataPerNmbrprnst);
2677
+
2678
+                                         // Scroll down to the bottom of the window
2679
+                                         $("#frmMsgLstWrap").animate({scrollTop:$("#frmMsgLstTbl").prop("scrollHeight")},200);
2680
+
2681
+                                         // Load more messages
2682
+                                         let clckNb = 0;
2683
+                                         $("#loadMoreMsgsusr").unbind("click");
2684
+                                         $("#loadMoreMsgsusr").click(function() {
2685
+
2686
+                                             clckNb++;
2687
+                                             var crefnb = (clckNb + 1) * nmbToBeLoaded;
2688
+
2689
+                                             $("#loadMoreMsgs").css("display", "none");
2690
+
2691
+                                             if (crefnb > convDataprn.length) {
2692
+                                                 var nmbmsg = convDataprn.length - 1;
2693
+                                                 $("#loadMoreMsgsusr").css("display", "none");
2694
+                                             } else { 
2695
+                                                 var nmbmsg = crefnb - 1;
2696
+                                                 $("#loadMoreMsgsusr").css("display", "block");
2697
+                                             }
2698
+
2699
+                                             var rowMessageArrAddst = [];
2700
+
2701
+                                             for (var q = nmbmsg; q >= clckNb * nmbToBeLoaded; q--) {
2702
+
2703
+                                                  rowMessageArrAddst.push(convDataprn[q]);
2704
+                                             }
2705
+
2706
+			                     var convDataPerNmbradst = rowMessageArrAddst.join("");
2707
+
2708
+                                             var scrlheight = $("#msgListRowCell").height();
2709
+                                             $("#msgListRowCell").prepend(convDataPerNmbradst);
2710
+
2711
+                                             $("#frmMsgLstWrap").scrollTop($("#msgListRowCell").height() - scrlheight);
2712
+                                         });
2713
+
2714
+
2715
+			                 $(".dispNameList").each(function() { $(this).css("color", "#0a559e"); });
2716
+			                 $("#diplNmAllMsg").css("color", "#04957b");
2717
+			                 $(this).css("color", "#1b8efe");
2718
+			             });
2719
+
2720
+
2721
+			             // Show again all the messages sent/received to/from the clicked number
2722
+			             $("#diplNmAllMsg").click(function() {
2723
+
2724
+                                         $("#loadMoreMsgsusr").css("display", "none");
2725
+
2726
+                                         let convDataprn = [];
2727
+                                         $.each(messagesPerNmbr[phNumberTo], function(index, item) {
2728
+                                                convDataprn.push(item);
2729
+                                         });
2730
+
2731
+                                         // If the total number of messages is greater than the default number of messages to display, show the 'Load more messages' button
2732
+                                         if (convDataprn.length > nmbTblDefault) {
2733
+                                             $("#loadMoreMsgs").css("display", "block");
2734
+                                             let nmbToBeLoaded = nmbTblDefault;
2735
+                                         } else {
2736
+                                             $("#loadMoreMsgs").css("display", "none");
2737
+                                             let nmbToBeLoaded = convDataprn.length;
2738
+                                         }
2739
+
2740
+
2741
+			                 let rowMessageArrprnst = [];
2742
+
2743
+			                 for (let n = nmbToBeLoaded - 1; n >= 0; n--) {
2744
+                                              rowMessageArrprnst.push(convDataprn[n]);
2745
+			                 }
2746
+
2747
+			                 let convDataPerNmbrprnst = rowMessageArrprnst.join("");
2748
+
2749
+                                         $("#msgListRowCell").empty();
2750
+                                         $("#msgListRowCell").append(convDataPerNmbrprnst);
2751
+
2752
+                                         // Scroll down to the bottom of the window
2753
+                                         $("#frmMsgLstWrap").animate({scrollTop:$("#frmMsgLstTbl").prop("scrollHeight")},200);
2754
+
2755
+
2756
+                                         // Load more messages
2757
+                                         let clckNb = 0;
2758
+                                         $("#loadMoreMsgsusr").unbind("click");
2759
+                                         $("#loadMoreMsgsusr").click(function() {
2760
+
2761
+                                             clckNb++;
2762
+                                             var crefnb = (clckNb + 1) * nmbToBeLoaded;
2763
+
2764
+                                             $("#loadMoreMsgs").css("display", "none");
2765
+
2766
+                                             if (crefnb > convDataprn.length) {
2767
+                                                 var nmbmsg = convDataprn.length - 1;
2768
+                                                 $("#loadMoreMsgsusr").css("display", "none");
2769
+                                             } else { 
2770
+                                                 var nmbmsg = crefnb - 1;
2771
+                                                 $("#loadMoreMsgsusr").css("display", "block");
2772
+                                             }
2773
+
2774
+                                             var rowMessageArrAddst = [];
2775
+
2776
+                                             for (var q = nmbmsg; q >= clckNb * nmbToBeLoaded; q--) {
2777
+
2778
+                                                  rowMessageArrAddst.push(convDataprn[q]);
2779
+                                             }
2780
+
2781
+			                     var convDataPerNmbradst = rowMessageArrAddst.join("");
2782
+
2783
+                                             var scrlheight = $("#msgListRowCell").height();
2784
+                                             $("#msgListRowCell").prepend(convDataPerNmbradst);
2785
+
2786
+                                             $("#frmMsgLstWrap").scrollTop($("#msgListRowCell").height() - scrlheight);
2787
+                                         });
2788
+
2789
+
2790
+			                 $(".dispNameList").each(function() { $(this).css("color", "#0a559e"); });
2791
+			                 $("#diplNmAllMsg").css("color", "#04957b");
2792
+			                 $(this).css("color", "#04c6a4");
2793
+
2794
+			             });
2795
+
2796
+
2797
+				     // Show the scroll-up arrow
2798
+				     $("#frmMsgLstWrap").scroll(function() {
2799
+					if ($(this).scrollTop() > 900) {
2800
+					      $('#upArrowSmall').fadeIn();
2801
+					} else {
2802
+					      $('#upArrowSmall').fadeOut();
2803
+					}
2804
+				     });
2805
+
2806
+				     $("#upArrowSmall").click(function() {
2807
+					$("#frmMsgLstWrap").animate({scrollTop : 0},400);
2808
+				     });
2809
+
2810
+			  },
2811
+			  error: function() {
2812
+				     showAlert("Error while attempting to get message data from the database!");
2813
+				     $('#listAllMsgsConv').removeClass('icon-loading');
2814
+			  }
2815
+		   });
2816
+
2817
+                }
2818
+
2819
+                $('[id^="showMsgConv-"]').click(function() {
2820
+
2821
+                   let ctrwnmbr = $(this).attr("id").replace("showMsgConv-", "");
2822
+                   let phNumberFrom = $("#frmNmbr-"+ ctrwnmbr).text().split(": ")[1];
2823
+                   let phNumberTo = $("#toNmbr-"+ ctrwnmbr).text();
2824
+
2825
+                   showSentMsgPerConv(phNumberFrom, phNumberTo);
2826
+                });
2827
+
2828
+
2829
+                // Show the pop-up window that lists all the messages sent/received to/from a phone number
2830
+                function showMsgPerNmbr(clckPhNumber) {
2831
+
2832
+                   var allfrmtomsg = "<div id='listAllMsgsFromTo'>";
2833
+                   allfrmtomsg += "<div id='draglstMsgmWindow'><img src='/apps/sms_relentless/img/dots.svg'></div>";
2834
+                   allfrmtomsg += "<a id='closeFrmMsgWindow' title='Close this window'></a>";
2835
+                   allfrmtomsg += "<div class='showByNmbrTitle'>Messages sent/received to/from  <span style='color:#04957b'>"+ clckPhNumber +"</span></div>";
2836
+                   allfrmtomsg += "<div id='frmMsgLstWrap'>";
2837
+                   allfrmtomsg += "<table id='frmMsgLstTbl'>";
2838
+                   allfrmtomsg += "<tr class='groupedrowsbody'><td><div id='grpdbynamelst' class='groupedLstNamespn'></div></td><td><div id='loadMoreMsgs' title='Click to load older messages.'>Load more messages</div><div id='loadMoreMsgsusr' title='Click to load older messages.'>Load more messages</div><div id='msgListRowCell' class='groupedLstMsgspn'></div><div id='arrowupWrap'><div id='upArrowSmall' title='Scroll to the top'></div></div></td></tr>";
2839
+                   allfrmtomsg += "</table></div>";
2840
+                   allfrmtomsg += "<div id='sendMsgReply'><table id='sendMsgConv'><tr><td><div id='fromPhoneNmbrConv'>From: <select id='selectFromNbConv'></select></div><div id='toPhoneNmbrConv'>To: <span id='toNmbrConv' style='color:#04957b'>"+ clckPhNumber +"</span></div></td></tr>";
2841
+                   allfrmtomsg += "<tr><td><textarea id='sendMsgConvText' placeholder='Enter a message here, then press Send SMS'></textarea></td></tr></table>";
2842
+                   allfrmtomsg += "<div id='sendMsgConvBtn'>Send SMS</div></div>";
2843
+                   allfrmtomsg += "<div style='display:block;width:100%;height:14px;'><img id='expandWindowRpl' src='/apps/sms_relentless/img/arrowDown.svg' title='Expand to send a message'></div>";
2844
+                   allfrmtomsg += "<div id='draglstMsgmWindowsc'><img src='/apps/sms_relentless/img/dots.svg' style='padding:4px;vertical-align:top;'></div>";
2845
+                   allfrmtomsg += "</div>";
2846
+
2847
+                   $("#content").append("<div id='recTblOverlay'></div>");
2848
+                   $("#content").append(allfrmtomsg);
2849
+
2850
+                   var topDist = parseInt((window.innerHeight / 2).toFixed(2) - 340) +"px";
2851
+                   var leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 300) +"px";
2852
+                   $("#listAllMsgsFromTo").css({ "top" : topDist, "left" : leftDist });
2853
+
2854
+                   $("#closeFrmMsgWindow").click(function() { $("#listAllMsgsFromTo").remove(); $("#recTblOverlay").remove(); });
2855
+                   $("#recTblOverlay").click(function() { $("#listAllMsgsFromTo").remove(); $("#recTblOverlay").remove(); });
2856
+
2857
+
2858
+	           // Expand the window when clicking on the arrow, to be able to send a reply message
2859
+	           $("#expandWindowRpl").click(function() {
2860
+
2861
+	              if ($(this).attr('src') == '/apps/sms_relentless/img/arrowDown.svg') {
2862
+                          $("#sendMsgReply").css("display", "block");
2863
+                          $("#listAllMsgsFromTo").css("height", "618px");
2864
+	                  $(this).attr('src', '/apps/sms_relentless/img/arrowUp.svg');
2865
+                          $(this).attr('title', 'Collapse');
2866
+	              } else {
2867
+                          $("#sendMsgReply").css("display", "none");
2868
+                          $("#listAllMsgsFromTo").css("height", "490px");
2869
+                          $(this).attr('src', '/apps/sms_relentless/img/arrowDown.svg');
2870
+                          $(this).attr('title', 'Expand to send a reply');
2871
+	              }
2872
+	           });
2873
+
2874
+                   // Send a message from the 'conversation' window
2875
+                   $("#sendMsgConvBtn").click(function() {
2876
+
2877
+                      $("#sendMsgConv,#sendMsgConvBtn").addClass('icon-loading');
2878
+                      var msgToSend = $("#sendMsgConvText").val();
2879
+                      var selectedid = $("#selectFromNbConv").val();
2880
+                      var toNumber = $("#toNmbrConv").text();
2881
+                      var receiversNumbers = [toNumber];
2882
+
2883
+		      if (selectedid != '') {
2884
+
2885
+			  var sendersplit = selectedid.split(":");
2886
+			  var providercap = sendersplit[0];
2887
+			  var provsec = sendersplit[1];
2888
+
2889
+			  if (/[a-zA-Z]/.test(provsec)) {
2890
+			      var alphanumcheck = true;
2891
+			  } else { var alphanumcheck = false; }
2892
+
2893
+			  if (providercap == 'Tx' && alphanumcheck == false) {  
2894
+			      var senderproc = selectedid.replace(/[^0-9]/g, "");
2895
+			      var selectedsender = "+" + senderproc;
2896
+			      var providerUsed = "telnyx";
2897
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmstel");
2898
+			  } else if (providercap == 'Pl' && alphanumcheck == false) {
2899
+			      var selectedsender = selectedid.replace(/[^0-9]/g, "");
2900
+			      var providerUsed = "plivo";
2901
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmsnex");
2902
+			  } else if (providercap == 'Tw' && alphanumcheck == false) {  
2903
+			      var senderproc = selectedid.replace(/[^0-9]/g, "");
2904
+			      var selectedsender = "+" + senderproc;
2905
+			      var providerUsed = "twilio";
2906
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmstwil");
2907
+			  } else if (providercap == 'Fl' && alphanumcheck == false) {  
2908
+			      var senderproc = selectedid.replace(/[^0-9]/g, "");
2909
+			      var selectedsender = "+" + senderproc;
2910
+			      var providerUsed = "flowroute";
2911
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmsflow");
2912
+			  } else if (providercap == 'Tx' && alphanumcheck == true) {
2913
+			      var selectedsender = provsec;
2914
+			      var providerUsed = "telnyx";
2915
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmstel");
2916
+			  } else if (providercap == 'Pl' && alphanumcheck == true) {
2917
+			      var selectedsender = provsec;
2918
+			      var providerUsed = "plivo";
2919
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmsnex");
2920
+			  } else if (providercap == 'Tw' && alphanumcheck == true) {
2921
+			      var selectedsender = provsec;
2922
+			      var providerUsed = "twilio";
2923
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmstwil");
2924
+			  } else if (providercap == 'Fl' && alphanumcheck == true) {
2925
+			      var selectedsender = provsec;
2926
+			      var providerUsed = "flowroute";
2927
+			      var relbaseUrl = OC.generateUrl("/apps/sms_relentless/user/sendsmsflow");
2928
+			  }
2929
+
2930
+                          var uploadedtomms = [];
2931
+
2932
+	                  if (msgToSend != '') {
2933
+
2934
+				  $.ajax({
2935
+				     url: relbaseUrl + '/' + userid,
2936
+				     type: "POST",
2937
+				     data: {
2938
+				           receiversPhoneNbs: receiversNumbers,
2939
+				           fromsender: selectedsender,
2940
+				           waitinterval: 1000,
2941
+				           sentsmstext: msgToSend,
2942
+				           ismms: 0,
2943
+				           mmsfiles: uploadedtomms
2944
+				         },
2945
+				     success: function(displayname) {
2946
+
2947
+                                           var tzdate = new Date();
2948
+                                           var presDatest = new Date(tzdate.getTime() - (tzdate.getTimezoneOffset() * 60000)).toJSON();
2949
+                                           var presDatedb = presDatest.split(".")[0];
2950
+                                           var presDatesc = presDatedb.split("T");
2951
+                                           var presDate = presDatesc[0] +" "+ presDatesc[1];
2952
+                                           var sentMessageStatus = '';
2953
+
2954
+                                           if (displayname) {
2955
+                                               var msgToSendproc = "<span class='msgAuthorNameGrp'>"+ displayname + ":</span>" + msgToSend; 
2956
+                                           } else { var msgToSendproc = ''; }
2957
+
2958
+                                           $("#msgListRowCell").append("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ selectedsender +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ receiversNumbers[0] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ msgToSendproc +"</div><div style='display:inline-block;margin:6px 6px 0px 4px;font-size:12.5px;color:#353535;'>"+ presDate +"</div><div class='sentMssgStatus'>"+ sentMessageStatus +"</div></div>");
2959
+
2960
+                                           // Scroll down to the bottom of the window
2961
+                                           $("#frmMsgLstWrap").animate({scrollTop:$("#frmMsgLstTbl").prop("scrollHeight")},200);
2962
+
2963
+                                           $("#sendMsgConv,#sendMsgConvBtn").removeClass('icon-loading');
2964
+				     },
2965
+				     error: function() {
2966
+				           showAlert("Error while sending the message. You can check your Nextcloud log to find out more about this issue.");
2967
+				           $("#sendMsgConv,#sendMsgConvBtn").removeClass('icon-loading');
2968
+				     }
2969
+				  });
2970
+			  } else {
2971
+				  showAlert("Please enter a message in the text box!");
2972
+				  $("#sendMsgConv,#sendMsgConvBtn").removeClass('icon-loading');
2973
+			  }
2974
+		      } else {
2975
+			      showAlert("Please choose a Sender ID from the 'From' drop-down list!");
2976
+			      $("#sendMsgConv,#sendMsgConvBtn").removeClass('icon-loading');
2977
+		      }
2978
+
2979
+                   });
2980
+
2981
+
2982
+	           // Make the window draggable
2983
+	           function makeMgrWndDraggable(e) {
2984
+
2985
+			   window.pmdragging = {};
2986
+			   pmdragging.pageX0 = e.pageX;
2987
+			   pmdragging.pageY0 = e.pageY;
2988
+			   pmdragging.elem = $("#listAllMsgsFromTo");
2989
+			   pmdragging.offset0 = $("#listAllMsgsFromTo").offset();
2990
+
2991
+			   function handle_dragging(e) {
2992
+			       var left = pmdragging.offset0.left + (e.pageX - pmdragging.pageX0);
2993
+			       var top = pmdragging.offset0.top + (e.pageY - pmdragging.pageY0);
2994
+			       $(pmdragging.elem).offset({top: top, left: left});
2995
+			   }
2996
+
2997
+			   function handle_mouseup(e) {
2998
+			       $('body').off('mousemove', handle_dragging).off('mouseup', handle_mouseup);
2999
+			   }
3000
+
3001
+			   $('body').on('mouseup', handle_mouseup).on('mousemove', handle_dragging);
3002
+	           }
3003
+	           $("#draglstMsgmWindow").mousedown(makeMgrWndDraggable);
3004
+	           $("#draglstMsgmWindowsc").mousedown(makeMgrWndDraggable);
3005
+
3006
+
3007
+                   // Append the available phone numbers to the From drop-down list
3008
+                   var availPhoneNmbrs = [];
3009
+                   $("#currentsmsnmbrs .optselectsmsnb").each(function() {
3010
+                      var crtphnmbr = $(this).attr("value");
3011
+                      if (crtphnmbr != "") { availPhoneNmbrs.push(crtphnmbr); }
3012
+                   });
3013
+
3014
+                   if (availPhoneNmbrs.length > 0) {
3015
+                       var avphopt = "";
3016
+                       for (let d = 0; d < availPhoneNmbrs.length; d++) {
3017
+                            avphopt += "<option value='"+ availPhoneNmbrs[d] +"'>"+ availPhoneNmbrs[d] +"</option>";
3018
+                       }
3019
+                       $("#selectFromNbConv").append(avphopt);
3020
+
3021
+                   } else { $("#selectFromNbConv").append("<option value='' selected>No IDs</option>"); }
3022
+
3023
+
3024
+                   // Get the sent/received messages for the current phone number, from the database
3025
+		   var getGroupedPnUrl = OC.generateUrl("/apps/sms_relentless/user/getgroupedpernumber");
3026
+
3027
+		   $('#listAllMsgsFromTo').addClass('icon-loading');
3028
+		   var totalPhNmbrs = 0;
3029
+
3030
+		   $.ajax({
3031
+			  method: 'POST',
3032
+			  url: getGroupedPnUrl + '/' + userid,
3033
+			  contentType: 'application/json',
3034
+                          data: JSON.stringify({ phoneNumber: clckPhNumber }),
3035
+			  success: function(groupedpernb) {
3036
+
3037
+				     $('#listAllMsgsFromTo').removeClass('icon-loading');
3038
+
3039
+				     var fromtoNmbrsData = [];
3040
+
3041
+				     for (var i = 0; i < groupedpernb.length; i++) {
3042
+
3043
+					     if (groupedpernb[i].author_displayname) {
3044
+						 var authordnm = groupedpernb[i].author_displayname;
3045
+					     } else { 
3046
+						 var authordnm = '';
3047
+					     }
3048
+
3049
+					     var sentfromnmbrarr = groupedpernb[i].from.split("+");
3050
+				             if (sentfromnmbrarr[1]) {
3051
+						 var groupednbfrom = "+"+ sentfromnmbrarr[1];
3052
+				             } else {
3053
+						 var groupednbfrom = sentfromnmbrarr[0];
3054
+				             }
3055
+
3056
+				             var modmessagesent = '';
3057
+				             if (groupedpernb[i].author_displayname) {
3058
+						 modmessagesent = "<span class='msgAuthorNameGrp'>"+ groupedpernb[i].author_displayname + ":</span>" + groupedpernb[i].message;
3059
+				             } else {
3060
+			                         modmessagesent = groupedpernb[i].message;
3061
+                                             }
3062
+
3063
+				             if (groupedpernb[i].to.indexOf(": ") > -1) {
3064
+				                 var groupednmbrtopre = groupedpernb[i].to.split(": ");
3065
+				                 var groupednmbrto = groupednmbrtopre[1];
3066
+				             } else { 
3067
+				                 var groupednmbrto = groupedpernb[i].to;
3068
+				             }
3069
+
3070
+				             fromtoNmbrsData.push({
3071
+				                       'author_displayname': authordnm,
3072
+				                       'from': groupednbfrom,
3073
+				                       'to': groupednmbrto,
3074
+				                       'message': modmessagesent,
3075
+				                       'date': groupedpernb[i].date,
3076
+				                       'status': groupedpernb[i].deliveryreceipt,
3077
+				                       'table': groupedpernb[i].table
3078
+				             });
3079
+				     }
3080
+
3081
+
3082
+				     // Remove the duplicates
3083
+				     var noDupMsgData = [];
3084
+				     $.each(fromtoNmbrsData, function(i, e) {
3085
+					    var matchingData = $.grep(noDupMsgData, function(item) {
3086
+				                    return item.from == e.from && item.to == e.to && item.message == e.message && item.table == 'received' && e.table == 'sent';
3087
+					    });
3088
+					    if (matchingData.length === 0) {
3089
+						noDupMsgData.push(e);
3090
+					    }
3091
+				     });
3092
+
3093
+				     var messagesPerNmbr = {};
3094
+				     var msgsNamesPerNmbr = {};
3095
+				     var msgsNmbrsNames = {};
3096
+
3097
+			             var displayNamesarr = [];
3098
+			             var convData = [];
3099
+
3100
+			             for (var n = 0; n < noDupMsgData.length; n++) {
3101
+
3102
+			                  if (noDupMsgData[n]['from'] == clckPhNumber && noDupMsgData[n]['table'] == 'sent') {
3103
+
3104
+			                      convData.push({
3105
+			                                     'author_displayname': noDupMsgData[n]['author_displayname'],
3106
+			                                     'message': noDupMsgData[n]['message'],
3107
+			                                     'from': noDupMsgData[n]['from'],
3108
+			                                     'to': noDupMsgData[n]['to'],
3109
+			                                     'date': noDupMsgData[n]['date'],
3110
+			                                     'direction': 'sent_from',
3111
+			                                     'status': noDupMsgData[n]['status'],
3112
+			                                     'table': noDupMsgData[n]['table']
3113
+			                      });
3114
+
3115
+			                  } else if (noDupMsgData[n]['to'] == clckPhNumber && noDupMsgData[n]['table'] == 'sent') {
3116
+
3117
+			                      convData.push({
3118
+			                                     'author_displayname': noDupMsgData[n]['author_displayname'],
3119
+			                                     'message': noDupMsgData[n]['message'],
3120
+			                                     'from': noDupMsgData[n]['from'],
3121
+			                                     'to': noDupMsgData[n]['to'],
3122
+			                                     'date': noDupMsgData[n]['date'],
3123
+			                                     'direction': 'sent_to',
3124
+			                                     'status': noDupMsgData[n]['status'],
3125
+			                                     'table': noDupMsgData[n]['table']
3126
+			                      });
3127
+
3128
+
3129
+			                  } else if (noDupMsgData[n]['from'] == clckPhNumber && noDupMsgData[n]['table'] == 'received') {
3130
+
3131
+			                      convData.push({
3132
+			                                     'author_displayname': noDupMsgData[n]['author_displayname'],
3133
+			                                     'message': noDupMsgData[n]['message'],
3134
+			                                     'from': noDupMsgData[n]['from'],
3135
+			                                     'to': noDupMsgData[n]['to'],
3136
+			                                     'date': noDupMsgData[n]['date'],
3137
+			                                     'direction': 'received_from',
3138
+			                                     'status': noDupMsgData[n]['status'],
3139
+			                                     'table': noDupMsgData[n]['table']
3140
+			                      });
3141
+
3142
+			                  } else if (noDupMsgData[n]['to'] == clckPhNumber && noDupMsgData[n]['table'] == 'received') {
3143
+
3144
+			                      convData.push({
3145
+			                                     'author_displayname': noDupMsgData[n]['author_displayname'],
3146
+			                                     'message': noDupMsgData[n]['message'],
3147
+			                                     'from': noDupMsgData[n]['from'],
3148
+			                                     'to': noDupMsgData[n]['to'],
3149
+			                                     'date': noDupMsgData[n]['date'],
3150
+			                                     'direction': 'received_on',
3151
+			                                     'status': noDupMsgData[n]['status'],
3152
+			                                     'table': noDupMsgData[n]['table']
3153
+			                      });
3154
+			                  }
3155
+			             }
3156
+
3157
+			             // Sort messages by date
3158
+				     convData.sort(function(a, b) {
3159
+					var c = new Date(a.date);
3160
+					var d = new Date(b.date);
3161
+					return c-d;
3162
+				     });
3163
+                                     convData.reverse();
3164
+
3165
+			             // Collect the display names of the users that sent messages from the current number
3166
+			             var selectedNames = [];
3167
+			             var displayNames = '';
3168
+			             for (var v = 0; v < convData.length; v++) {
3169
+			                  if (selectedNames.indexOf(convData[v]['author_displayname']) == -1) { 
3170
+			                      selectedNames.push(convData[v]['author_displayname']);
3171
+			                      displayNames += "<div id='diplNm_"+ clckPhNumber +"_"+ v +"' class='dispNameList' name='"+ convData[v]['author_displayname'] +"'>"+ convData[v]['author_displayname'] +"</div>";
3172
+			                  }
3173
+			             }
3174
+			             displayNames += "<div id='diplNmAllMsg' class='dispNameListAll' title='Show all the messages for this number.'>"+ clckPhNumber +"</div>";
3175
+
3176
+			             // Store the display names for the current number, to be able to see them later
3177
+			             var ctPhNumber = clckPhNumber;
3178
+			             msgsNamesPerNmbr[ctPhNumber] = displayNames;
3179
+
3180
+			             // Store the messages sent by each user, to be able to see them later when clicking on the user's name
3181
+			             for (var h = 0; h < selectedNames.length; h++) {
3182
+
3183
+			                  var rowMessageArrpn = [];
3184
+			                  for (var b = 0; b < convData.length; b++) {
3185
+
3186
+			                       if (selectedNames[h] == convData[b]['author_displayname']) {
3187
+
3188
+					           if (convData[b]['direction'] == 'sent_from') {
3189
+					               if (convData[b]['status'].indexOf("delivered") > -1 || convData[b]['status'].indexOf("delivery success") > -1) {
3190
+					                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
3191
+					               } else {
3192
+					                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
3193
+					               }
3194
+					               rowMessageArrpn.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
3195
+					           } else if (convData[b]['direction'] == 'sent_to') {
3196
+					               if (convData[b]['status'].indexOf("delivered") > -1 || convData[b]['status'].indexOf("delivery success") > -1) {
3197
+					                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
3198
+					               } else {
3199
+					                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
3200
+					               }
3201
+					               rowMessageArrpn.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
3202
+					           } else if (convData[b]['direction'] == 'received_from') {
3203
+					               rowMessageArrpn.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div></div>");
3204
+					           } else if (convData[b]['direction'] == 'received_on') {
3205
+					               rowMessageArrpn.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div></div>");
3206
+			                           }
3207
+			                       }
3208
+			                  }
3209
+			                  var crtNmber = clckPhNumber;
3210
+			                  var crtName = selectedNames[h];
3211
+			                  msgsNmbrsNames[crtNmber] = msgsNmbrsNames[crtNmber] || {};
3212
+                                          msgsNmbrsNames[crtNmber][crtName] = rowMessageArrpn;
3213
+			             }
3214
+
3215
+                                     // The number of messages to be loaded by default
3216
+                                     var nmbTblDefault = 50;
3217
+
3218
+                                     // If the total number of messages is greater than the default number of messages to display, show the 'Load more messages' button
3219
+                                     if (convData.length > nmbTblDefault) {
3220
+                                         $("#loadMoreMsgs").css("display", "block");
3221
+                                         var nmbToBeLoaded = nmbTblDefault;
3222
+                                     } else { var nmbToBeLoaded = convData.length; }
3223
+
3224
+			             var rowMessageArr = [];
3225
+			             for (var m = nmbToBeLoaded - 1; m >= 0; m--) {
3226
+
3227
+			                  if (convData[m]['direction'] == 'sent_from') {
3228
+
3229
+			                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
3230
+			                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
3231
+			                      } else {
3232
+			                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
3233
+			                      }
3234
+			                      rowMessageArr.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 6px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
3235
+
3236
+			                  } else if (convData[m]['direction'] == 'sent_to') {
3237
+
3238
+			                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
3239
+			                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
3240
+			                      } else {
3241
+			                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
3242
+			                      }
3243
+			                      rowMessageArr.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
3244
+
3245
+			                  } else if (convData[m]['direction'] == 'received_from') {
3246
+
3247
+					      rowMessageArr.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
3248
+
3249
+			                  } else if (convData[m]['direction'] == 'received_on') {
3250
+
3251
+					      rowMessageArr.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
3252
+			                  }
3253
+			             }
3254
+
3255
+			             var convDataPerNmbr = rowMessageArr.join("");
3256
+
3257
+                                     $("#grpdbynamelst").append(displayNames);
3258
+                                     $("#msgListRowCell").append(convDataPerNmbr);
3259
+
3260
+			             // Store the messages for the current number, to be able to see them later, when clicking on the number
3261
+			             var rowMessageArrcpt = [];
3262
+			             for (var m = 0; m < convData.length; m++) {
3263
+
3264
+			                  if (convData[m]['direction'] == 'sent_from') {
3265
+
3266
+			                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
3267
+			                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
3268
+			                      } else {
3269
+			                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
3270
+			                      }
3271
+			                      rowMessageArrcpt.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 6px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
3272
+
3273
+			                  } else if (convData[m]['direction'] == 'sent_to') {
3274
+
3275
+			                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
3276
+			                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
3277
+			                      } else {
3278
+			                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
3279
+			                      }
3280
+			                      rowMessageArrcpt.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
3281
+
3282
+			                  } else if (convData[m]['direction'] == 'received_from') {
3283
+
3284
+					      rowMessageArrcpt.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
3285
+
3286
+			                  } else if (convData[m]['direction'] == 'received_on') {
3287
+
3288
+					      rowMessageArrcpt.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
3289
+			                  }
3290
+			             }
3291
+
3292
+			             messagesPerNmbr[clckPhNumber] = rowMessageArrcpt;
3293
+
3294
+                                     // Scroll down to the bottom of the window
3295
+                                     $("#frmMsgLstWrap").animate({scrollTop:$("#frmMsgLstTbl").prop("scrollHeight")},200);
3296
+
3297
+                                     // Load more messages
3298
+                                     var clickNmb = 0;
3299
+                                     $("#loadMoreMsgs").click(function() {
3300
+
3301
+                                         clickNmb++;
3302
+
3303
+                                         var crefnb = (clickNmb + 1) * nmbToBeLoaded;
3304
+
3305
+                                         if (crefnb > convData.length) {
3306
+                                             var nmbmsg = convData.length - 1;
3307
+                                             $("#loadMoreMsgs").css("display", "none");
3308
+                                         } else { 
3309
+                                             var nmbmsg = crefnb - 1;
3310
+                                         }
3311
+
3312
+                                         var rowMessageArrAdd = [];
3313
+
3314
+                                         for (var m = nmbmsg; m >= clickNmb * nmbToBeLoaded; m--) {
3315
+
3316
+			                      if (convData[m]['direction'] == 'sent_from') {
3317
+
3318
+			                          if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
3319
+			                              var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
3320
+			                          } else {
3321
+			                              var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
3322
+			                          }
3323
+			                          rowMessageArrAdd.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 6px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
3324
+
3325
+			                      } else if (convData[m]['direction'] == 'sent_to') {
3326
+
3327
+			                          if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
3328
+			                              var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
3329
+			                          } else {
3330
+			                              var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
3331
+			                          }
3332
+			                          rowMessageArrAdd.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
3333
+
3334
+			                      } else if (convData[m]['direction'] == 'received_from') {
3335
+
3336
+					          rowMessageArrAdd.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
3337
+
3338
+			                      } else if (convData[m]['direction'] == 'received_on') {
3339
+
3340
+					          rowMessageArrAdd.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
3341
+			                      }
3342
+                                         }
3343
+
3344
+			                 var convDataPerNmbrad = rowMessageArrAdd.join("");
3345
+
3346
+                                         var scrlheight = $("#msgListRowCell").height();
3347
+                                         $("#msgListRowCell").prepend(convDataPerNmbrad);
3348
+
3349
+                                         $("#frmMsgLstWrap").scrollTop($("#msgListRowCell").height() - scrlheight);
3350
+                                     });
3351
+
3352
+
3353
+			             // Show the messages sent by each user whose name is clicked
3354
+			             $('[id*="diplNm_"]').click(function() {
3355
+
3356
+			                 var crntNmbr = $(this).attr("id").split("_")[1];
3357
+			                 var crntDisName = $(this).attr("name");                               
3358
+                                         $("#loadMoreMsgs").css("display", "none");
3359
+
3360
+                                         var convDataprn = [];
3361
+                                         $.each(msgsNmbrsNames[crntNmbr][crntDisName], function(index, item) {
3362
+                                                convDataprn.push(item);
3363
+                                         });
3364
+
3365
+                                         // If the total number of messages is greater than the default number of messages to display, show the 'Load more messages' button
3366
+                                         if (convDataprn.length > nmbTblDefault) {
3367
+                                             $("#loadMoreMsgsusr").css("display", "block");
3368
+                                             var nmbToBeLoaded = nmbTblDefault;
3369
+                                         } else {
3370
+                                             $("#loadMoreMsgsusr").css("display", "none");
3371
+                                             var nmbToBeLoaded = convDataprn.length;
3372
+                                         }
3373
+
3374
+
3375
+			                 var rowMessageArrprnst = [];
3376
+
3377
+			                 for (var n = nmbToBeLoaded - 1; n >= 0; n--) {
3378
+                                              rowMessageArrprnst.push(convDataprn[n]);
3379
+			                 }
3380
+
3381
+			                 var convDataPerNmbrprnst = rowMessageArrprnst.join("");
3382
+
3383
+                                         $("#msgListRowCell").empty();
3384
+                                         $("#msgListRowCell").append(convDataPerNmbrprnst);
3385
+
3386
+                                         // Scroll down to the bottom of the window
3387
+                                         $("#frmMsgLstWrap").animate({scrollTop:$("#frmMsgLstTbl").prop("scrollHeight")},200);
3388
+
3389
+                                         // Load more messages
3390
+                                         var clckNb = 0;
3391
+                                         $("#loadMoreMsgsusr").unbind("click");
3392
+                                         $("#loadMoreMsgsusr").click(function() {
3393
+
3394
+                                             clckNb++;
3395
+                                             var crefnb = (clckNb + 1) * nmbToBeLoaded;
3396
+
3397
+                                             $("#loadMoreMsgs").css("display", "none");
3398
+
3399
+                                             if (crefnb > convDataprn.length) {
3400
+                                                 var nmbmsg = convDataprn.length - 1;
3401
+                                                 $("#loadMoreMsgsusr").css("display", "none");
3402
+                                             } else { 
3403
+                                                 var nmbmsg = crefnb - 1;
3404
+                                                 $("#loadMoreMsgsusr").css("display", "block");
3405
+                                             }
3406
+
3407
+                                             var rowMessageArrAddst = [];
3408
+
3409
+                                             for (var q = nmbmsg; q >= clckNb * nmbToBeLoaded; q--) {
3410
+
3411
+                                                  rowMessageArrAddst.push(convDataprn[q]);
3412
+                                             }
3413
+
3414
+			                     var convDataPerNmbradst = rowMessageArrAddst.join("");
3415
+
3416
+                                             var scrlheight = $("#msgListRowCell").height();
3417
+                                             $("#msgListRowCell").prepend(convDataPerNmbradst);
3418
+
3419
+                                             $("#frmMsgLstWrap").scrollTop($("#msgListRowCell").height() - scrlheight);
3420
+                                         });
3421
+
3422
+
3423
+			                 $(".dispNameList").each(function() { $(this).css("color", "#0a559e"); });
3424
+			                 $("#diplNmAllMsg").css("color", "#04957b");
3425
+			                 $(this).css("color", "#1b8efe");
3426
+			             });
3427
+
3428
+
3429
+			             // Show again all the messages sent/received to/from the clicked number
3430
+			             $("#diplNmAllMsg").click(function() {
3431
+
3432
+                                         $("#loadMoreMsgsusr").css("display", "none");
3433
+
3434
+                                         var convDataprn = [];
3435
+                                         $.each(messagesPerNmbr[clckPhNumber], function(index, item) {
3436
+                                                convDataprn.push(item);
3437
+                                         });
3438
+
3439
+                                         // If the total number of messages is greater than the default number of messages to display, show the 'Load more messages' button
3440
+                                         if (convDataprn.length > nmbTblDefault) {
3441
+                                             $("#loadMoreMsgs").css("display", "block");
3442
+                                             var nmbToBeLoaded = nmbTblDefault;
3443
+                                         } else {
3444
+                                             $("#loadMoreMsgs").css("display", "none");
3445
+                                             var nmbToBeLoaded = convDataprn.length;
3446
+                                         }
3447
+
3448
+
3449
+			                 var rowMessageArrprnst = [];
3450
+
3451
+			                 for (var n = nmbToBeLoaded - 1; n >= 0; n--) {
3452
+                                              rowMessageArrprnst.push(convDataprn[n]);
3453
+			                 }
3454
+
3455
+			                 var convDataPerNmbrprnst = rowMessageArrprnst.join("");
3456
+
3457
+                                         $("#msgListRowCell").empty();
3458
+                                         $("#msgListRowCell").append(convDataPerNmbrprnst);
3459
+
3460
+                                         // Scroll down to the bottom of the window
3461
+                                         $("#frmMsgLstWrap").animate({scrollTop:$("#frmMsgLstTbl").prop("scrollHeight")},200);
3462
+
3463
+
3464
+                                         // Load more messages
3465
+                                         var clckNb = 0;
3466
+                                         $("#loadMoreMsgsusr").unbind("click");
3467
+                                         $("#loadMoreMsgsusr").click(function() {
3468
+
3469
+                                             clckNb++;
3470
+                                             var crefnb = (clckNb + 1) * nmbToBeLoaded;
3471
+
3472
+                                             $("#loadMoreMsgs").css("display", "none");
3473
+
3474
+                                             if (crefnb > convDataprn.length) {
3475
+                                                 var nmbmsg = convDataprn.length - 1;
3476
+                                                 $("#loadMoreMsgsusr").css("display", "none");
3477
+                                             } else { 
3478
+                                                 var nmbmsg = crefnb - 1;
3479
+                                                 $("#loadMoreMsgsusr").css("display", "block");
3480
+                                             }
3481
+
3482
+                                             var rowMessageArrAddst = [];
3483
+
3484
+                                             for (var q = nmbmsg; q >= clckNb * nmbToBeLoaded; q--) {
3485
+
3486
+                                                  rowMessageArrAddst.push(convDataprn[q]);
3487
+                                             }
3488
+
3489
+			                     var convDataPerNmbradst = rowMessageArrAddst.join("");
3490
+
3491
+                                             var scrlheight = $("#msgListRowCell").height();
3492
+                                             $("#msgListRowCell").prepend(convDataPerNmbradst);
3493
+
3494
+                                             $("#frmMsgLstWrap").scrollTop($("#msgListRowCell").height() - scrlheight);
3495
+                                         });
3496
+
3497
+
3498
+			                 $(".dispNameList").each(function() { $(this).css("color", "#0a559e"); });
3499
+			                 $("#diplNmAllMsg").css("color", "#04957b");
3500
+			                 $(this).css("color", "#04c6a4");
3501
+
3502
+			             });
3503
+
3504
+
3505
+				     // Show the scroll-up arrow
3506
+				     $("#frmMsgLstWrap").scroll(function() {
3507
+					if ($(this).scrollTop() > 900) {
3508
+					      $('#upArrowSmall').fadeIn();
3509
+					} else {
3510
+					      $('#upArrowSmall').fadeOut();
3511
+					}
3512
+				     });
3513
+
3514
+				     $("#upArrowSmall").click(function() {
3515
+					$("#frmMsgLstWrap").animate({scrollTop : 0},400);
3516
+				     });
3517
+
3518
+			  },
3519
+			  error: function() {
3520
+				     showAlert("Error while attempting to get message data from the database!");
3521
+				     $('#listAllMsgsFromTo').removeClass('icon-loading');
3522
+			  }
3523
+		   });
3524
+                }
3525
+
3526
+
3527
+                $('[id^="showMsgFrom-"]').click(function() {
3528
+
3529
+                   var ctrwnb = $(this).attr("id").replace("showMsgFrom-", "");
3530
+                   if ($("#frmNmbr-"+ ctrwnb).text().indexOf(":") > -1) {
3531
+                       var clckPhNumber = $("#frmNmbr-"+ ctrwnb).text().split(": ")[1];
3532
+                   } else { var clckPhNumber = $("#frmNmbr-"+ ctrwnb).text(); }
3533
+
3534
+                   showMsgPerNmbr(clckPhNumber);
3535
+                })
3536
+
3537
+                $('[id^="showMsgTo-"]').click(function() {
3538
+                   var ctrwnbTo = $(this).attr("id").replace("showMsgTo-", "");
3539
+                   var clckPhNbTo = $("#toNmbr-"+ ctrwnbTo).text();
3540
+
3541
+                   showMsgPerNmbr(clckPhNbTo);
3542
+                })
3543
+
3544
+
3545
+                // Add pagination
3546
+                var rowsShown = messagesperpage;
3547
+                var rowsTotal = $("#sentSmsTable tr").length;
3548
+                var numPages = (rowsTotal - 2) / rowsShown;
3549
+
3550
+                for (i = 0; i < numPages; i++) {
3551
+                     var pageNum = i + 1;
3552
+                     $('#paginationsent').append('<a href="#" rel="' + i + '" class="pagenumbers">' + pageNum + '</a> ');
3553
+                }
3554
+
3555
+                $('#paginationsent').children(":first").addClass('active');
3556
+
3557
+                $('#paginationsent a:first').addClass('active');
3558
+
3559
+                // Show table page when clicking on page number
3560
+                $('.pages a').bind('click', function () {
3561
+
3562
+                      $('#paginationsent').children().removeClass('active');
3563
+
3564
+                      $(this).addClass('active');
3565
+
3566
+                      var currentsentPgNo = $(this).text();
3567
+
3568
+                      $('#paginationsent a').each(function() {
3569
+                         if ($(this).text() == currentsentPgNo) {
3570
+                             $(this).addClass('active');
3571
+                         }
3572
+                      });
3573
+
3574
+                      // Sort table rows
3575
+		      var rows = $('#sentSmsTable tr').get();
3576
+
3577
+		      rows.sort(function(a, b) {
3578
+
3579
+		           var A = parseInt($('td.sentdbidcolumn', a).text());
3580
+		           var B = parseInt($('td.sentdbidcolumn', b).text());
3581
+
3582
+		           if (A < B) {
3583
+		               return -1;
3584
+		           }
3585
+
3586
+		           if (A > B) {
3587
+		               return 1;
3588
+		           }
3589
+
3590
+		           return 0;
3591
+		      });
3592
+
3593
+		      $.each(rows, function(index, row) {
3594
+		         $('#sentSmsTable').append(row);
3595
+		      });
3596
+
3597
+                      var currPage = $(this).attr('rel');
3598
+                      var startItem = currPage * rowsShown;
3599
+                      var endItem = startItem + rowsShown;
3600
+
3601
+                      $('.sentrowsbody').hide().slice(startItem, endItem).css('display', 'table-row');
3602
+
3603
+                      $('#totalsentmessages').remove();
3604
+                      $('#smstables').append("<div id='totalsentmessages'>Total displayed messages: " + sentparseddata.length + "</div>");
3605
+                });
3606
+
3607
+                $('#paginationsent').children(":last").trigger('click');
3608
+
3609
+                // Select all records
3610
+                $('#selectAllChckbx').change(function() {
3611
+                   if ($(this).is(':checked')) {
3612
+                       $(".indivchckbx").prop("checked", true);
3613
+                   } else {
3614
+                       $(".indivchckbx").prop("checked", false);
3615
+                   }
3616
+                });
3617
+
3618
+                function reorderSentRows() {
3619
+                    var currenttext = $(".filterbuttonsent").closest('[class="filterbuttonsent"]').find('[class="indivfiltersent"]').text();
3620
+                    if (currenttext == '') {
3621
+                        $('tr').sort(function (a, b) {
3622
+                           return parseInt($('td.sentdbidcolumn', b).text()) < parseInt($('td.sentdbidcolumn', a).text());
3623
+                        }).appendTo("#sentSmsTable");
3624
+                    }
3625
+                }
3626
+
3627
+                // Filter rows
3628
+                $("#databaseidfilter").on("click", function(event) {
3629
+
3630
+                       var databaseId = $("#dbidtextsent").val();
3631
+                       var msgrowsNo = 0;
3632
+
3633
+                       $(".sentrowsbody").each(function() {
3634
+
3635
+                          var checkEmpty = 0;
3636
+                          $(".indivfiltersent").not("#dbidtextsent").each(function() {
3637
+                              if ($(this).val() != '') {
3638
+                                  checkEmpty = 1;
3639
+                              }
3640
+                          });
3641
+
3642
+                          if (checkEmpty == 0) {
3643
+                              $(this).show();
3644
+                          }
3645
+
3646
+                          if (databaseId != '') {
3647
+                             if ($(this).find('[class="sentdbidcolumn"]').text() == databaseId) {
3648
+                                 $("#sentSmsTable").append(this);
3649
+                                 if ($(this).is(":visible")) { msgrowsNo++; }
3650
+                             } else {
3651
+                                 $(this).hide();
3652
+                             }
3653
+                          } else {
3654
+                                 $(this).show();
3655
+                                 msgrowsNo++;
3656
+                          }
3657
+                       });
3658
+
3659
+                       reorderSentRows();
3660
+                       $('#totalsentmessages').remove();
3661
+                       $('#smstables').append("<div id='totalsentmessages'>Total filtered messages: " + msgrowsNo + "</div>");
3662
+                });
3663
+
3664
+                $("#useridfilter").on("click", function(event) {
3665
+
3666
+                       var useridtxt = $("#useridtext").val().toLowerCase();
3667
+                       var msgrowsNo = 0;
3668
+
3669
+                       $(".sentrowsbody").each(function() {
3670
+
3671
+                          var checkEmpty1 = 0;
3672
+                          $(".indivfiltersent").not("#useridtext").each(function() {
3673
+                              if ($(this).val() != '') {
3674
+                                  checkEmpty1 = 1;
3675
+                              }
3676
+                          });
3677
+
3678
+                          if (checkEmpty1 == 0) {
3679
+                              $(this).show();
3680
+                          }
3681
+
3682
+                          if (useridtxt != '') {
3683
+                              var founduserid = $(this).find('[class="useridcolsent"]').text().toLowerCase();
3684
+                              if (founduserid.indexOf(useridtxt) != -1) {
3685
+                                  $("#sentSmsTable").append(this);
3686
+                                  if ($(this).is(":visible")) { msgrowsNo++; }
3687
+                             } else {
3688
+                                  $(this).hide();
3689
+                             }
3690
+                          } else {
3691
+                                  $(this).show();
3692
+                                  msgrowsNo++;
3693
+                          }
3694
+                       });
3695
+
3696
+                       reorderSentRows();
3697
+                       $('#totalsentmessages').remove();
3698
+                       $('#smstables').append("<div id='totalsentmessages'>Total filtered messages: " + msgrowsNo + "</div>");
3699
+                });
3700
+
3701
+                $("#messageidfilter").on("click", function(event) {
3702
+
3703
+                       var messageidtxt = $("#messageidtext").val().toLowerCase();
3704
+                       var msgrowsNo = 0;
3705
+
3706
+                       $(".sentrowsbody").each(function() {
3707
+
3708
+                          var checkEmpty2 = 0;
3709
+                          $(".indivfiltersent").not("#messageidtext").each(function() {
3710
+                              if ($(this).val() != '') {
3711
+                                  checkEmpty2 = 1;
3712
+                              }
3713
+                          });
3714
+
3715
+                          if (checkEmpty2 == 0) {
3716
+                              $(this).show();
3717
+                          }
3718
+
3719
+                          if (messageidtxt != '') {
3720
+                              var foundtdmssgid = $(this).find('[class="messageidcolsent"]').text().toLowerCase();
3721
+                              if (foundtdmssgid.indexOf(messageidtxt) != -1) {
3722
+                                  $("#sentSmsTable").append(this);
3723
+                                  if ($(this).is(":visible")) { msgrowsNo++; }
3724
+                              } else {
3725
+                                  $(this).hide();
3726
+                              }
3727
+                          } else {
3728
+                                  $(this).show();
3729
+                                  msgrowsNo++;
3730
+                          }
3731
+                       });
3732
+
3733
+                       reorderSentRows();
3734
+                       $('#totalsentmessages').remove();
3735
+                       $('#smstables').append("<div id='totalsentmessages'>Total filtered messages: " + msgrowsNo + "</div>");
3736
+                });
3737
+
3738
+                $("#datefilter").on("click", function(event) {
3739
+
3740
+                       var datetxtvr = $("#datetext").val().toLowerCase();
3741
+                       var msgrowsNo = 0;
3742
+
3743
+                       $(".sentrowsbody").each(function() {
3744
+
3745
+                          var checkEmpty3 = 0;
3746
+                          $(".indivfiltersent").not("#datetext").each(function() {
3747
+                              if ($(this).val() != '') {
3748
+                                  checkEmpty3 = 1;
3749
+                              }
3750
+                          });
3751
+
3752
+                          if (checkEmpty3 == 0) {
3753
+                              $(this).show();
3754
+                          }
3755
+
3756
+                          if (datetxtvr != '') {
3757
+                             var founddate = $(this).find('[class="datecolsent"]').text().toLowerCase();
3758
+                             if (founddate.indexOf(datetxtvr) != -1) {
3759
+                                 $("#sentSmsTable").append(this);
3760
+                                 if ($(this).is(":visible")) { msgrowsNo++; }
3761
+                             } else {
3762
+                                 $(this).hide();
3763
+                             }
3764
+                          } else {
3765
+                                 $(this).show();
3766
+                                 msgrowsNo++;
3767
+                          }
3768
+                       });
3769
+
3770
+                       reorderSentRows();
3771
+                       $('#totalsentmessages').remove();
3772
+                       $('#smstables').append("<div id='totalsentmessages'>Total filtered messages: " + msgrowsNo + "</div>");
3773
+                });
3774
+
3775
+                $("#fromfilter").on("click", function(event) {
3776
+
3777
+                       var fromtxtvr = $("#fromtext").val().toLowerCase();
3778
+                       var msgrowsNo = 0;
3779
+
3780
+                       $(".sentrowsbody").each(function() {
3781
+
3782
+                          var checkEmpty4 = 0;
3783
+                          $(".indivfiltersent").not("#fromtext").each(function() {
3784
+                              if ($(this).val() != '') {
3785
+                                  checkEmpty4 = 1;
3786
+                              }
3787
+                          });
3788
+
3789
+                          if (checkEmpty4 == 0) {
3790
+                              $(this).show();
3791
+                          }
3792
+
3793
+                          if (fromtxtvr != '') {
3794
+                             var foundfrom = $(this).find('[class="fromcolumnsent"]').text().toLowerCase();
3795
+                             if (foundfrom.indexOf(fromtxtvr) != -1) {
3796
+                                 $("#sentSmsTable").append(this);
3797
+                                 if ($(this).is(":visible")) { msgrowsNo++; }
3798
+                             } else {
3799
+                                 $(this).hide();
3800
+                             }
3801
+                          } else {
3802
+                                 $(this).show();
3803
+                                 msgrowsNo++;
3804
+                          }
3805
+                       });
3806
+
3807
+                       reorderSentRows();
3808
+                       $('#totalsentmessages').remove();
3809
+                       $('#smstables').append("<div id='totalsentmessages'>Total filtered messages: " + msgrowsNo + "</div>");
3810
+                });
3811
+
3812
+                $("#tofilter").on("click", function(event) {
3813
+
3814
+                      var totxtvr = $("#totext").val().toLowerCase();
3815
+                      var msgrowsNo = 0;
3816
+
3817
+                      $(".sentrowsbody").each(function() {
3818
+
3819
+                          var checkEmpty5 = 0;
3820
+                          $(".indivfiltersent").not("#totext").each(function() {
3821
+                              if ($(this).val() != '') {
3822
+                                  checkEmpty5 = 1;
3823
+                              }
3824
+                          });
3825
+
3826
+                          if (checkEmpty5 == 0) {
3827
+                              $(this).show();
3828
+                          }
3829
+
3830
+                          if (totxtvr != '') {
3831
+                             var foundto = $(this).find('[class="tocolumnsent"]').text().toLowerCase();
3832
+                             if (foundto.indexOf(totxtvr) != -1) {
3833
+                                 $("#sentSmsTable").append(this);
3834
+                                 if ($(this).is(":visible")) { msgrowsNo++; }
3835
+                             } else {
3836
+                                 $(this).hide();
3837
+                             }
3838
+                          } else {
3839
+                                 $(this).show();
3840
+                                 msgrowsNo++;
3841
+                          }
3842
+                      });
3843
+
3844
+                      reorderSentRows();
3845
+                      $('#totalsentmessages').remove();
3846
+                      $('#smstables').append("<div id='totalsentmessages'>Total filtered messages: " + msgrowsNo + "</div>");
3847
+                });
3848
+
3849
+                $("#networkfilter").on("click", function(event) {
3850
+
3851
+                      var networktxtvr = $("#networktext").val().toLowerCase();
3852
+                      var msgrowsNo = 0;
3853
+
3854
+                      $(".sentrowsbody").each(function() {
3855
+
3856
+                          var checkEmpty6 = 0;
3857
+                          $(".indivfiltersent").not("#networktext").each(function() {
3858
+                              if ($(this).val() != '') {
3859
+                                  checkEmpty6 = 1;
3860
+                              }
3861
+                          });
3862
+
3863
+                          if (checkEmpty6 == 0) {
3864
+                              $(this).show();
3865
+                          }
3866
+
3867
+                          if (networktxtvr != '') {
3868
+                              var foundnetwork = $(this).find('[class="networkcolumnsent"]').text().toLowerCase();
3869
+                              if (foundnetwork.indexOf(networktxtvr) != -1) {
3870
+                                  $("#sentSmsTable").append(this);
3871
+                                  if ($(this).is(":visible")) { msgrowsNo++; }
3872
+                              } else {
3873
+                                  $(this).hide();
3874
+                              }
3875
+                          } else {
3876
+                                  $(this).show();
3877
+                                  msgrowsNo++;
3878
+                          }
3879
+                      });
3880
+
3881
+                      reorderSentRows();
3882
+                      $('#totalsentmessages').remove();
3883
+                      $('#smstables').append("<div id='totalsentmessages'>Total filtered messages: " + msgrowsNo + "</div>");
3884
+                });
3885
+
3886
+                $("#pricefilter").on("click", function(event) {
3887
+
3888
+                      var pricetxtvr = $("#pricetext").val().toLowerCase();
3889
+                      var msgrowsNo = 0;
3890
+
3891
+                      $(".sentrowsbody").each(function() {
3892
+
3893
+                          var checkEmpty7 = 0;
3894
+                          $(".indivfiltersent").not("#pricetext").each(function() {
3895
+                              if ($(this).val() != '') {
3896
+                                  checkEmpty7 = 1;
3897
+                              }
3898
+                          });
3899
+
3900
+                          if (checkEmpty7 == 0) {
3901
+                              $(this).show();
3902
+                          }
3903
+
3904
+                          if (pricetxtvr != '') {
3905
+                              var foundprice = $(this).find('[class="pricecolumnsent"]').text().toLowerCase();
3906
+                              if (foundprice.indexOf(pricetxtvr) != -1) {
3907
+                                  $("#sentSmsTable").append(this);
3908
+                                  if ($(this).is(":visible")) { msgrowsNo++; }
3909
+                              } else {
3910
+                                  $(this).hide();
3911
+                              }
3912
+                          } else {
3913
+                                  $(this).show();
3914
+                                  msgrowsNo++;
3915
+                          }
3916
+                      });
3917
+
3918
+                      reorderSentRows();
3919
+                      $('#totalsentmessages').remove();
3920
+                      $('#smstables').append("<div id='totalsentmessages'>Total filtered messages: " + msgrowsNo + "</div>");
3921
+                });
3922
+
3923
+                $("#statusfilter").on("click", function(event) {
3924
+
3925
+                      var statustxtvr = $("#statustext").val().toLowerCase();
3926
+                      var msgrowsNo = 0;
3927
+
3928
+                      $(".sentrowsbody").each(function() {
3929
+
3930
+                          var checkEmpty8 = 0;
3931
+                          $(".indivfiltersent").not("#statustext").each(function() {
3932
+                              if ($(this).val() != '') {
3933
+                                  checkEmpty8 = 1;
3934
+                              }
3935
+                          });
3936
+
3937
+                          if (checkEmpty8 == 0) {
3938
+                              $(this).show();
3939
+                          }
3940
+
3941
+                          if (statustxtvr != '') {
3942
+                              var foundstatus = $(this).find('[class="statuscolumnsent"]').text().toLowerCase();
3943
+                              if (foundstatus.indexOf(statustxtvr) != -1) {
3944
+                                  $("#sentSmsTable").append(this);
3945
+                                  if ($(this).is(":visible")) { msgrowsNo++; }
3946
+                              } else {
3947
+                                  $(this).hide();
3948
+                              }
3949
+                          } else {
3950
+                                  $(this).show();
3951
+                                  msgrowsNo++;
3952
+                          }
3953
+                      });
3954
+
3955
+                      reorderSentRows();
3956
+                      $('#totalsentmessages').remove();
3957
+                      $('#smstables').append("<div id='totalsentmessages'>Total filtered messages: " + msgrowsNo + "</div>");
3958
+                });
3959
+
3960
+                $("#deliveryrecfilter").on("click", function(event) {
3961
+
3962
+                      var deliverytxtvr = $("#deliveryrcpttext").val().toLowerCase();
3963
+                      var msgrowsNo = 0;
3964
+
3965
+                      $(".sentrowsbody").each(function() {
3966
+
3967
+                          var checkEmpty9 = 0;
3968
+                          $(".indivfiltersent").not("#deliveryrcpttext").each(function() {
3969
+                              if ($(this).val() != '') {
3970
+                                  checkEmpty9 = 1;
3971
+                              }
3972
+                          });
3973
+
3974
+                          if (checkEmpty9 == 0) {
3975
+                              $(this).show();
3976
+                          }
3977
+
3978
+                          if (deliverytxtvr != '') {
3979
+                              var founddeliveryrcpt = $(this).find('[class="deliveryrcptcolsent"]').text().toLowerCase();
3980
+                              if (founddeliveryrcpt.indexOf(deliverytxtvr) != -1) {
3981
+                                  $("#sentSmsTable").append(this);
3982
+                                  if ($(this).is(":visible")) { msgrowsNo++; }
3983
+                              } else {
3984
+                                  $(this).hide();
3985
+                              }
3986
+                          } else {
3987
+                                  $(this).show();
3988
+                                  msgrowsNo++;
3989
+                          }
3990
+                      });
3991
+
3992
+                      reorderSentRows();
3993
+                      $('#totalsentmessages').remove();
3994
+                      $('#smstables').append("<div id='totalsentmessages'>Total filtered messages: " + msgrowsNo + "</div>");
3995
+                });
3996
+
3997
+                $("#messagefilter").on("click", function(event) {
3998
+
3999
+                      var messagetxtvr = $("#messagetext").val().toLowerCase();
4000
+                      var msgrowsNo = 0;
4001
+
4002
+                      $(".sentrowsbody").each(function() {
4003
+
4004
+                          var checkEmpty10 = 0;
4005
+                          $(".indivfiltersent").not("#messagetext").each(function() {
4006
+                              if ($(this).val() != '') {
4007
+                                  checkEmpty10 = 1;
4008
+                              }
4009
+                          });
4010
+
4011
+                          if (checkEmpty10 == 0) {
4012
+                              $(this).show();
4013
+                          }
4014
+
4015
+                          if (messagetxtvr != '') {
4016
+                              var foundmessage = $(this).find('[class="messagecolumnsent"]').text().toLowerCase();
4017
+                              if (foundmessage.indexOf(messagetxtvr) != -1) {
4018
+                                  $("#sentSmsTable").append(this);
4019
+                                  if ($(this).is(":visible")) { msgrowsNo++; }
4020
+                              } else {
4021
+                                  $(this).hide();
4022
+                              }
4023
+                          } else {
4024
+                                  $(this).show();
4025
+                                  msgrowsNo++;
4026
+                          }
4027
+                      });
4028
+
4029
+                      reorderSentRows();
4030
+                      $('#totalsentmessages').remove();
4031
+                      $('#smstables').append("<div id='totalsentmessages'>Total filtered messages: " + msgrowsNo + "</div>");
4032
+                });
4033
+
4034
+                // Clear all filters
4035
+                $("#clearsentfilters").on("click", function(event) {
4036
+                       $(".sentrowsbody").each(function() {
4037
+                          $(this).show();
4038
+                       });
4039
+                       $(".indivfiltersent").val("");
4040
+                       $('#totalsentmessages').remove();
4041
+                       $('#smstables').append("<div id='totalsentmessages'>Total displayed messages: " + sentparseddata.length + "</div>");
4042
+                });
4043
+
4044
+                // Delete selected rows from the database
4045
+                $("#deletesentrows").on("click", function() {
4046
+
4047
+                   var checkcheckbx = jQuery("#sentSmsTable input[type=checkbox]:checked").length;
4048
+                   if (checkcheckbx == 0) {
4049
+                       showAlert("Please select the row(s) to permanently delete from the database !");
4050
+                   } else {
4051
+                          var sentcheckboxIds = [];
4052
+                          $(".sentrowsbody").each(function() {
4053
+                             var sentrowcheckbx = $(this).find('input[type="checkbox"]');
4054
+                             if (sentrowcheckbx.is(":checked")) {
4055
+                                 var dbrowid = $(this).find('[class="sentdbidcolumn"]').text();
4056
+                                 sentcheckboxIds.push(dbrowid);
4057
+                             }
4058
+                          });
4059
+
4060
+		          confirmAlert("Please note that the row(s) you selected will be permanently deleted from the database, without being saved before removal. This action cannot be undone ! If you really want to permanently delete the selected row(s) press 'OK'.");
4061
+
4062
+		          $("#confirmCancel").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
4063
+
4064
+		          $("#confirmOk").click(function() {
4065
+
4066
+		              $("#alertMsgOverlay").remove();
4067
+		              $("#alertConfMessage").remove();
4068
+
4069
+                              var deletesentRowsUrl = OC.generateUrl("/apps/sms_relentless/user/removesentrows");
4070
+                              $('#smstables').addClass('icon-loading');
4071
+
4072
+                              $.ajax({
4073
+                                   url: deletesentRowsUrl + '/' + userid,
4074
+                                   method: "POST",
4075
+                                   dataType:'text',
4076
+                                   data: {sentmessagedbIDs: sentcheckboxIds},
4077
+                                   success: function() {
4078
+                                            showAlert("The row(s) have been deleted successfully !");
4079
+                                            $('#smstables').removeClass('icon-loading');
4080
+                                            $('#sentsmstableshow').click();
4081
+                                   },
4082
+                                   error: function() {
4083
+                                            showAlert("There was an error while deleting the selected row(s) !");
4084
+                                            $('#smstables').removeClass('icon-loading');
4085
+                                   }
4086
+                              });
4087
+                          });
4088
+                    }
4089
+                });
4090
+
4091
+                // Show/Hide filter row
4092
+	        $('#sentarrow').on('click', function() {
4093
+	           if ($('#sentfiltersrow').is(':visible')) {
4094
+		       $('#sentfiltersrow').hide();
4095
+                       $('#sentheaderrow').css('top', '0px');
4096
+                       $(this).removeClass('arrowUpCl');
4097
+                       $(this).addClass('arrowDownCl');
4098
+		   } else {
4099
+		       $('#sentfiltersrow').show();
4100
+                       $('#sentheaderrow').css('top', '158px');
4101
+                       $(this).removeClass('arrowDownCl');
4102
+                       $(this).addClass('arrowUpCl');
4103
+                   }
4104
+                });
4105
+
4106
+                $("#app-content").animate({scrollTop:$("#sentSmsTable").prop("scrollHeight")},200);
4107
+          },
4108
+          error: function(sentdatafromdb) {
4109
+                showAlert("Error! You can check the Nextcloud log to find more details about this issue.");
4110
+                $('#smstables').removeClass('icon-loading');
4111
+          }
4112
+     });
4113
+
4114
+  });
4115
+
4116
+  // List grouped messages
4117
+  $("#groupedtableshow").on("click", function(event) {
4118
+
4119
+     $('#smstables').empty();
4120
+     var getGroupedUrl = OC.generateUrl("/apps/sms_relentless/user/getgroupedtable");
4121
+
4122
+     $('#smstables').addClass('icon-loading');
4123
+     var totalPhNmbrs = 0;
4124
+
4125
+     $.ajax({
4126
+          method: 'GET',
4127
+          url: getGroupedUrl + '/' + userid,
4128
+          contentType: 'application/json',
4129
+          success: function(groupedparsed) {
4130
+
4131
+		        $('#smstables').append("<div id='toptablegrp'><div class='topbuttonandpage'><span id='recarrow' title='Show/Hide filters'></span></div><div id='paginationgrp' class='grppages'>Pages </div></div>");
4132
+		        $('#smstables').append("<table id='groupedSmsTable'></table>");
4133
+
4134
+                        $('#groupedSmsTable').append("<tr id='grpfiltersrow'><td colspan='2'><div id='filterByNumber'></div></td><td><button id='cleargrpfilter' title='Clear the filter'></button></td></tr>");
4135
+                        $('#groupedSmsTable').append("<tr class='groupedmsgrows' id='grpheaderrow'><th>Phone Number</th><th>Senders / Receivers</th><th>Messages</th></tr>");
4136
+
4137
+                        $('#grpfiltersrow').hide();
4138
+
4139
+                        var fromtoNmbrsData = [];
4140
+                        var fromtoNumberArr = [];
4141
+
4142
+		        for (var i = 0; i < groupedparsed.length; i++) {
4143
+
4144
+			     if (groupedparsed[i].author_displayname) {
4145
+			         var authordnm = groupedparsed[i].author_displayname;
4146
+			     } else { 
4147
+			         var authordnm = '';
4148
+			     }
4149
+
4150
+			     var sentfromnmbrarr = groupedparsed[i].from.split("+");
4151
+                             if (sentfromnmbrarr[1]) {
4152
+			         var groupednbfrom = "+"+ sentfromnmbrarr[1];
4153
+                             } else {
4154
+			         var groupednbfrom = sentfromnmbrarr[0];
4155
+                             }
4156
+
4157
+                             var modmessage = '';
4158
+                             if (groupedparsed[i].author_displayname) {
4159
+			         modmessage = "<span class='msgAuthorNameGrp'>"+ groupedparsed[i].author_displayname + ":</span>" + groupedparsed[i].message;
4160
+                             } else {
4161
+			         modmessage = groupedparsed[i].message;
4162
+                             }
4163
+
4164
+                             if (groupedparsed[i].to.indexOf(": ") > -1) {
4165
+                                 var groupednmbrtopre = groupedparsed[i].to.split(": ");
4166
+                                 var groupednmbrto = groupednmbrtopre[1];
4167
+                             } else { 
4168
+                                 var groupednmbrto = groupedparsed[i].to;
4169
+                             }
4170
+
4171
+                             fromtoNmbrsData.push({
4172
+                                       'author_displayname': authordnm,
4173
+                                       'from': groupednbfrom,
4174
+                                       'to': groupednmbrto,
4175
+                                       'message': modmessage,
4176
+                                       'date': groupedparsed[i].date,
4177
+                                       'status': groupedparsed[i].deliveryreceipt,
4178
+                                       'table': groupedparsed[i].table
4179
+                             });
4180
+
4181
+                             if (fromtoNumberArr.indexOf(groupednbfrom) == -1) { fromtoNumberArr.push(groupednbfrom); }
4182
+                             if (fromtoNumberArr.indexOf(groupednmbrto) == -1) { fromtoNumberArr.push(groupednmbrto); }
4183
+		        }
4184
+
4185
+                        totalPhNmbrs = fromtoNumberArr.length;
4186
+
4187
+                        // Remove the duplicates
4188
+			var noDupMsgData = [];
4189
+			$.each(fromtoNmbrsData, function(i, e) {
4190
+			    var matchingData = $.grep(noDupMsgData, function(item) {
4191
+                                return item.from == e.from && item.to == e.to && item.message == e.message && item.table == 'received' && e.table == 'sent'
4192
+			    });
4193
+			    if (matchingData.length === 0) {
4194
+				noDupMsgData.push(e);
4195
+			    }
4196
+			});
4197
+
4198
+                        var messagesPerNmbr = {};
4199
+                        var msgsNamesPerNmbr = {};
4200
+                        var msgsNmbrsNames = {};
4201
+
4202
+                        for (var k = 0; k < fromtoNumberArr.length; k++) {
4203
+
4204
+                             var displayNamesarr = [];
4205
+                             var convData = [];
4206
+
4207
+                             for (var n = 0; n < noDupMsgData.length; n++) {
4208
+
4209
+                                  if (noDupMsgData[n]['from'] == fromtoNumberArr[k] && noDupMsgData[n]['table'] == 'sent') {
4210
+
4211
+                                      convData.push({
4212
+                                                     'author_displayname': noDupMsgData[n]['author_displayname'],
4213
+                                                     'message': noDupMsgData[n]['message'],
4214
+                                                     'from': noDupMsgData[n]['from'],
4215
+                                                     'to': noDupMsgData[n]['to'],
4216
+                                                     'date': noDupMsgData[n]['date'],
4217
+                                                     'direction': 'sent_from',
4218
+                                                     'status': noDupMsgData[n]['status'],
4219
+                                                     'table': noDupMsgData[n]['table']
4220
+                                      });
4221
+
4222
+                                  } else if (noDupMsgData[n]['to'] == fromtoNumberArr[k] && noDupMsgData[n]['table'] == 'sent') {
4223
+
4224
+                                      convData.push({
4225
+                                                     'author_displayname': noDupMsgData[n]['author_displayname'],
4226
+                                                     'message': noDupMsgData[n]['message'],
4227
+                                                     'from': noDupMsgData[n]['from'],
4228
+                                                     'to': noDupMsgData[n]['to'],
4229
+                                                     'date': noDupMsgData[n]['date'],
4230
+                                                     'direction': 'sent_to',
4231
+                                                     'status': noDupMsgData[n]['status'],
4232
+                                                     'table': noDupMsgData[n]['table']
4233
+                                      });
4234
+
4235
+
4236
+                                  } else if (noDupMsgData[n]['from'] == fromtoNumberArr[k] && noDupMsgData[n]['table'] == 'received') {
4237
+
4238
+                                      convData.push({
4239
+                                                     'author_displayname': noDupMsgData[n]['author_displayname'],
4240
+                                                     'message': noDupMsgData[n]['message'],
4241
+                                                     'from': noDupMsgData[n]['from'],
4242
+                                                     'to': noDupMsgData[n]['to'],
4243
+                                                     'date': noDupMsgData[n]['date'],
4244
+                                                     'direction': 'received_from',
4245
+                                                     'status': noDupMsgData[n]['status'],
4246
+                                                     'table': noDupMsgData[n]['table']
4247
+                                      });
4248
+
4249
+                                  } else if (noDupMsgData[n]['to'] == fromtoNumberArr[k] && noDupMsgData[n]['table'] == 'received') {
4250
+
4251
+                                      convData.push({
4252
+                                                     'author_displayname': noDupMsgData[n]['author_displayname'],
4253
+                                                     'message': noDupMsgData[n]['message'],
4254
+                                                     'from': noDupMsgData[n]['from'],
4255
+                                                     'to': noDupMsgData[n]['to'],
4256
+                                                     'date': noDupMsgData[n]['date'],
4257
+                                                     'direction': 'received_on',
4258
+                                                     'status': noDupMsgData[n]['status'],
4259
+                                                     'table': noDupMsgData[n]['table']
4260
+                                      });
4261
+                                  }
4262
+                             }
4263
+
4264
+                             // Sort messages by date
4265
+		             convData.sort(function(a, b) {
4266
+			        var c = new Date(a.date);
4267
+			        var d = new Date(b.date);
4268
+			        return c-d;
4269
+		             });
4270
+
4271
+                             // Collect the display names of the users that sent messages from the current number
4272
+                             var selectedNames = [];
4273
+                             var displayNames = '';
4274
+                             for (var v = 0; v < convData.length; v++) {
4275
+                                  if (selectedNames.indexOf(convData[v]['author_displayname']) == -1) { 
4276
+                                      selectedNames.push(convData[v]['author_displayname']);
4277
+                                      displayNames += "<div id='diplNm_"+ fromtoNumberArr[k] +"_"+ v +"' class='dispNameList' name='"+ convData[v]['author_displayname'] +"'>"+ convData[v]['author_displayname'] +"</div>";
4278
+                                  }
4279
+                             }
4280
+
4281
+                             // Store the display names for the current number, to be able to see them later when selecting the number from the drop-down list
4282
+                             var ctPhNumber = fromtoNumberArr[k];
4283
+                             msgsNamesPerNmbr[ctPhNumber] = displayNames;
4284
+
4285
+                             // Store the messages sent by each user, to be able to see them later when clicking on the user's name
4286
+                             for (var h = 0; h < selectedNames.length; h++) {
4287
+
4288
+                                  var rowMessageArrpn = [];
4289
+                                  for (var b = 0; b < convData.length; b++) {
4290
+
4291
+                                       if (selectedNames[h] == convData[b]['author_displayname']) {
4292
+
4293
+		                           if (convData[b]['direction'] == 'sent_from') {
4294
+		                               if (convData[b]['status'].indexOf("delivered") > -1 || convData[b]['status'].indexOf("delivery success") > -1) {
4295
+		                                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
4296
+		                               } else {
4297
+		                                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
4298
+		                               }
4299
+		                               rowMessageArrpn.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
4300
+		                           } else if (convData[b]['direction'] == 'sent_to') {
4301
+		                               if (convData[b]['status'].indexOf("delivered") > -1 || convData[b]['status'].indexOf("delivery success") > -1) {
4302
+		                                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
4303
+		                               } else {
4304
+		                                   var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
4305
+		                               }
4306
+		                               rowMessageArrpn.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
4307
+		                           } else if (convData[b]['direction'] == 'received_from') {
4308
+		                               rowMessageArrpn.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div></div>");
4309
+		                           } else if (convData[b]['direction'] == 'received_on') {
4310
+		                               rowMessageArrpn.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[b]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[b]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[b]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[b]['date'] +"</div></div>");
4311
+                                           }
4312
+                                       }
4313
+                                  }
4314
+                                  var convDataPerNmbrpn = rowMessageArrpn.join("<br>");
4315
+                                  var crtNmber = fromtoNumberArr[k];
4316
+                                  var crtName = selectedNames[h];
4317
+                                  msgsNmbrsNames[crtNmber] = msgsNmbrsNames[crtNmber] || {};
4318
+                                  msgsNmbrsNames[crtNmber][crtName] = convDataPerNmbrpn;
4319
+                             }
4320
+
4321
+                             var rowMessageArr = [];
4322
+                             for (var m = 0; m < convData.length; m++) {
4323
+
4324
+                                  if (convData[m]['direction'] == 'sent_from') {
4325
+
4326
+                                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
4327
+                                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
4328
+                                      } else {
4329
+                                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
4330
+                                      }
4331
+                                      rowMessageArr.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 6px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
4332
+
4333
+                                  } else if (convData[m]['direction'] == 'sent_to') {
4334
+
4335
+                                      if (convData[m]['status'].indexOf("delivered") > -1 || convData[m]['status'].indexOf("delivery success") > -1) {
4336
+                                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/check.svg' title='`delivery success` received.'>";
4337
+                                      } else {
4338
+                                          var sentMsgStatus = "<img src='/apps/sms_relentless/img/question.svg' title='This message did not receive a `delivery success` receipt. However, it is possible that it reached its destination.'>";
4339
+                                      }
4340
+                                      rowMessageArr.push("<div class='groupedSentMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;color:#06866f;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/outgoing.svg' title='Message sent to current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:inline-block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div><div class='sentMssgStatus'>"+ sentMsgStatus +"</div></div>");
4341
+
4342
+                                  } else if (convData[m]['direction'] == 'received_from') {
4343
+
4344
+		                      rowMessageArr.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received from current number.'></div><div style='display:inline-block;color:#06866f;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#353535;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
4345
+
4346
+                                  } else if (convData[m]['direction'] == 'received_on') {
4347
+
4348
+		                      rowMessageArr.push("<div class='groupedRecMsg'><div style='display:block;margin:0px 0px 6px 0px;'><div style='display:inline-block;margin:0px 12px 0px 3px;'><img src='/apps/sms_relentless/img/incoming.svg' title='Message received on current number.'></div><div style='display:inline-block;color:#353535;'>From: "+ convData[m]['from'] +"</div><div style='display:inline-block;margin:0px 0px 0px 12px;color:#06866f;'>To: "+ convData[m]['to'] +"</div></div><div style='display:block;font-size:15px;color:#353535;font-weight:500;white-space:normal;'>"+ convData[m]['message'] +"</div><div style='display:block;margin:6px 0px 0px 4px;font-size:12.5px;color:#353535;'>"+ convData[m]['date'] +"</div></div>");
4349
+                                  }
4350
+                             }
4351
+
4352
+                             var convDataPerNmbr = rowMessageArr.join("");
4353
+
4354
+                             var rowPhoneNumber = "<div id='nmbrow_"+ fromtoNumberArr[k] +"' class='phoneNmbrRow'>"+ fromtoNumberArr[k] +"</div>";
4355
+
4356
+		             $("#groupedSmsTable").append("<tr id='singlerow_"+ k +"' class='groupedrowsbody'><td><div class='groupedLstNmbr fixedRowHeight'>"+ rowPhoneNumber +"</div></td><td><div class='groupedLstNames fixedRowHeight'>"+ displayNames +"</div></td><td style='width:100%'><div class='groupedLstMsgs fixedRowHeight'>"+ convDataPerNmbr +"</div></td></tr>");
4357
+                             $("#groupedSmsTable").append("<tr id='expandRow_"+ k +"' class='groupedrowsexp'><td colspan='3'><div style='display:block;width:100%;height:14px;cursor:pointer;'><img class='expandGrpRow' src='/apps/sms_relentless/img/arrowDown.svg'></div><td></tr>");
4358
+
4359
+                             // Store the messages for the current number, to be able to see them later, when clicking on the number
4360
+                             var ctNmbr = fromtoNumberArr[k];
4361
+                             messagesPerNmbr[ctNmbr] = convDataPerNmbr;
4362
+                        }
4363
+
4364
+
4365
+                        // Add the 'filter by number' drop-down list
4366
+                        var nmbrslst = "<option value='title'>Filter messages by number</option>";
4367
+                        for (var p = 0; p < fromtoNumberArr.length; p++) {
4368
+                             nmbrslst += "<option value='"+ fromtoNumberArr[p] +"'>"+ fromtoNumberArr[p] +"</option>";
4369
+                        }
4370
+                        $("#filterByNumber").append("<select id='selectListedNmbrs'>"+ nmbrslst +"</select>");
4371
+
4372
+
4373
+                        $("#selectListedNmbrs").change(function() {
4374
+
4375
+                          var selectedNmbr = $(this).val();
4376
+
4377
+                          if (selectedNmbr != "title") {
4378
+
4379
+                              $(".groupedrowsbody,.groupedrowsexp").each(function() { $(this).hide(); });
4380
+		              $("#groupedSmsTable").append("<tr id='singlerowfl_"+ fromtoNumberArr.indexOf(selectedNmbr) +"' class='groupedrowsbody'><td><div class='groupedLstNmbr fixedRowHeight'><div id='nmbrow_"+ selectedNmbr +"' style='font-size:15px;font-weight:500;color:#06866f;cursor:pointer;'>"+ selectedNmbr +"</div></div></td><td><div class='groupedLstNames fixedRowHeight'>"+ msgsNamesPerNmbr[selectedNmbr] +"</div></td><td style='width:100%'><div class='groupedLstMsgs fixedRowHeight'>"+ messagesPerNmbr[selectedNmbr] +"</div></td></tr>");
4381
+                              $("#groupedSmsTable").append("<tr id='expandRowfl_"+ fromtoNumberArr.indexOf(selectedNmbr) +"' class='groupedrowsexp'><td colspan='3'><div style='display:block;width:100%;height:14px;cursor:pointer;'><img class='expandGrpRow' src='/apps/sms_relentless/img/arrowDown.svg'></div><td></tr>");
4382
+
4383
+
4384
+                               // Show the messages sent by each user whose name is listed for the phone number of the current row
4385
+                               $('[id*="diplNm_"]').click(function() {
4386
+
4387
+                                  var crntNmbr = $(this).attr("id").split("_")[1];
4388
+                                  var crntDisName = $(this).attr("name");                        
4389
+                                  var clsmsgcell = $(this).closest(".groupedrowsbody").find(".groupedLstMsgs");
4390
+                                  clsmsgcell.empty();
4391
+                                  clsmsgcell.html(msgsNmbrsNames[crntNmbr][crntDisName]);
4392
+
4393
+                                  $(".dispNameList").each(function() { $(this).css("color", "#0a559e"); });
4394
+                                  $(this).css("color", "#1483f0");
4395
+                                  $("#nmbrow_"+ selectedNmbr).css("color", "#06866f");
4396
+                                  $(".groupedLstNmbr").each(function () { $(this).css("color", "#06866f"); });
4397
+                               });
4398
+
4399
+
4400
+		               // Show all the messages sent to/from the clicked number
4401
+		               $('[id*="nmbrow_"]').click(function() {
4402
+		                  var rwNmbr = $(this).attr("id").replace("nmbrow_", "");
4403
+		                  var rowmsgcell = $(this).closest(".groupedrowsbody").find(".groupedLstMsgs");
4404
+		                  rowmsgcell.empty();
4405
+		                  rowmsgcell.html(messagesPerNmbr[rwNmbr]);
4406
+
4407
+		                  $(".phoneNmbrRow").each(function() { $(this).css("color", "#06866f"); });
4408
+		                  $(".dispNameList").each(function() { $(this).css("color", "#0a559e"); });
4409
+		                  $(this).css("color", "#08b899");
4410
+		               });
4411
+
4412
+
4413
+		               // Expand the rows to see all the messages
4414
+		               $('[id^="expandRowfl_"]').click(function() {
4415
+		                   var idnumbrfl = $(this).attr("id").replace("expandRowfl_", "");
4416
+		                   var crntExpandfl = $(this).find(".expandGrpRow");
4417
+
4418
+		                   if (crntExpandfl.attr('src') == '/apps/sms_relentless/img/arrowDown.svg') {
4419
+                                       $("#singlerowfl_"+ idnumbrfl).find(".fixedRowHeight").removeClass("fixedRowHeight");
4420
+		                       crntExpandfl.attr('src', '/apps/sms_relentless/img/arrowUp.svg');
4421
+		                   } else {
4422
+                                       $("#singlerowfl_"+ idnumbrfl).find(".groupedLstNmbr,.groupedLstNames,.groupedLstMsgs").addClass("fixedRowHeight");
4423
+                                       crntExpandfl.attr('src', '/apps/sms_relentless/img/arrowDown.svg'); 
4424
+		                   }
4425
+		               });
4426
+
4427
+		               $('#totalgrpmessages').remove();
4428
+		               $('#smstables').append("<div id='totalgrpmessages'>Total displayed phone numbers: 1</div>");
4429
+                           }
4430
+                        });
4431
+
4432
+                        // Clear the 'filter by number' filter
4433
+                        $("#cleargrpfilter").click(function() {
4434
+                               $('[id^="singlerowfl_"]').remove();
4435
+                               $('[id^="expandRowfl_"]').remove();
4436
+                               $(".groupedrowsbody,.groupedrowsexp").each(function() { $(this).show(); });
4437
+                               $("#selectListedNmbrs").val("title");
4438
+		               $('#totalgrpmessages').remove();
4439
+		               $('#smstables').append("<div id='totalgrpmessages'>Total displayed phone numbers: "+ totalPhNmbrs +"</div>");
4440
+                        });
4441
+
4442
+                        // Show the messages sent by each user whose name is listed for the phone number on the current row
4443
+                        $('[id*="diplNm_"]').click(function() {
4444
+
4445
+                           var crntNmbr = $(this).attr("id").split("_")[1];
4446
+                           var crntDisName = $(this).attr("name");                               
4447
+                           var clsmsgcell = $(this).closest(".groupedrowsbody").find(".groupedLstMsgs");
4448
+                           clsmsgcell.empty();
4449
+                           clsmsgcell.html(msgsNmbrsNames[crntNmbr][crntDisName]);
4450
+
4451
+                           $(".dispNameList").each(function() { $(this).css("color", "#0a559e"); });
4452
+                           $(this).css("color", "#1483f0");
4453
+                        });
4454
+
4455
+                        // Show all the messages sent to/from the clicked number
4456
+                        $('[id*="nmbrow_"]').click(function() {
4457
+                           var rwNmbr = $(this).attr("id").replace("nmbrow_", "");
4458
+                           var rowmsgcell = $(this).closest(".groupedrowsbody").find(".groupedLstMsgs");
4459
+                           rowmsgcell.empty();
4460
+                           rowmsgcell.html(messagesPerNmbr[rwNmbr]);
4461
+
4462
+                           $(".phoneNmbrRow").each(function() { $(this).css("color", "#06866f"); });
4463
+                           $(".dispNameList").each(function() { $(this).css("color", "#0a559e"); });
4464
+                           $(this).css("color", "#08b899");
4465
+                        });
4466
+
4467
+
4468
+		        $('#smstables').removeClass('icon-loading');
4469
+		        $('#recarrow').removeClass('arrowUpCl');
4470
+		        $('#recarrow').addClass('arrowDownCl');
4471
+
4472
+                        // Expand the rows to see all the messages
4473
+                        $('[id^="expandRow_"]').click(function() {
4474
+                            var idnumbr = $(this).attr("id").replace("expandRow_", "");
4475
+                            var crntExpand = $(this).find(".expandGrpRow");
4476
+
4477
+                            if (crntExpand.attr('src') == '/apps/sms_relentless/img/arrowDown.svg') {
4478
+                                $("#singlerow_"+ idnumbr).find(".fixedRowHeight").removeClass("fixedRowHeight");
4479
+                                crntExpand.attr('src', '/apps/sms_relentless/img/arrowUp.svg');
4480
+                            } else {
4481
+                                $("#singlerow_"+ idnumbr).find(".groupedLstNmbr,.groupedLstNames,.groupedLstMsgs").addClass("fixedRowHeight");
4482
+                                crntExpand.attr('src', '/apps/sms_relentless/img/arrowDown.svg'); 
4483
+                            }
4484
+                        });
4485
+
4486
+
4487
+		        // Add pagination
4488
+		        var rowsShowngrp = messagesperpage;
4489
+		        var rowsTotalgrp = $("#groupedSmsTable tr").length;
4490
+
4491
+		        var numPagesgrp = ((rowsTotalgrp - 2) / rowsShowngrp) / 2;
4492
+
4493
+		        for (i = 0; i < numPagesgrp; i++) {
4494
+		             var pageNumgrp = i + 1;
4495
+		             $('#paginationgrp').append('<a href="#" rel="' + i + '" class="pagenumbersgrp">' + pageNumgrp + '</a> ');
4496
+		        }
4497
+
4498
+		        $('#paginationgrp').children(":first").addClass('active');
4499
+
4500
+		        $(".groupedrowsbody,.groupedrowsexp").hide();
4501
+
4502
+		        $('#paginationgrp a:first').addClass('active');
4503
+
4504
+		        // Show table page when clicking a page number
4505
+		        $('.grppages a').bind('click', function() {
4506
+
4507
+		           $('#paginationgrp').children().removeClass('active');
4508
+
4509
+		           $(this).addClass('active');
4510
+
4511
+		           var currentPageNogrp = $(this).text();
4512
+
4513
+		           $('#paginationgrp a').each(function() {
4514
+		               if ($(this).text() == currentPageNogrp) {
4515
+		                   $(this).addClass('active');
4516
+		               }
4517
+		           });
4518
+
4519
+		           var currPagegrp = $(this).attr('rel');
4520
+		           var startItemgrp = currPagegrp * rowsShowngrp;
4521
+		           var endItemgrp = startItemgrp + rowsShowngrp;
4522
+
4523
+		           $(".groupedrowsbody").hide().slice(startItemgrp, endItemgrp).css('display', 'table-row');
4524
+		           $(".groupedrowsexp").hide().slice(startItemgrp, endItemgrp).css('display', 'table-row');
4525
+
4526
+		           $('#totalgrpmessages').remove();
4527
+		           $('#smstables').append("<div id='totalgrpmessages'>Total displayed phone numbers: " + totalPhNmbrs + "</div>");
4528
+		        });
4529
+
4530
+                        $('#paginationgrp').children(":last").trigger('click');
4531
+
4532
+
4533
+		        // Show/Hide filter row
4534
+		        $('#recarrow').on('click', function() {
4535
+			   if ($('#grpfiltersrow').is(':visible')) {
4536
+			       $('#grpfiltersrow').hide();
4537
+		               $('#grpheaderrow').css('top', '0px');
4538
+		               $(this).removeClass('arrowUpCl');
4539
+		               $(this).addClass('arrowDownCl');
4540
+			   } else {
4541
+			       $('#grpfiltersrow').show();
4542
+		               $('#grpheaderrow').css('top', '158px');
4543
+		               $(this).removeClass('arrowDownCl');
4544
+		               $(this).addClass('arrowUpCl');
4545
+		           }
4546
+		        });
4547
+
4548
+          },
4549
+          error: function() {
4550
+
4551
+                        showAlert("Error while attempting to get the messages from the database.");
4552
+                        $('#smstables').removeClass('icon-loading');
4553
+          }
4554
+     });
4555
+  });
4556
+
4557
+
4558
+  function showAlert(alertText) {
4559
+
4560
+     let alertwnd = "<div id='alertMessage'>";
4561
+     alertwnd += "<a id='closeAlertWnd' title='Close this window'></a>";
4562
+     alertwnd += "<div id='alertTextWrap'>"+ alertText +"</div>";
4563
+     alertwnd += "<input type='submit' id='alertOk' value='OK'>";
4564
+     alertwnd += "</div>";
4565
+
4566
+     $("#content").append("<div id='alertMsgOverlay'></div>");
4567
+     $("#content").append(alertwnd);
4568
+
4569
+     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
4570
+     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
4571
+     $("#alertMessage").css({ "top" : topDist, "left" : leftDist });
4572
+
4573
+     $("#closeAlertWnd").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
4574
+     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
4575
+     $("#alertOk").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
4576
+  }
4577
+
4578
+  function confirmAlert(alertText) {
4579
+
4580
+     let alertwndcf = "<div id='alertConfMessage'>";
4581
+     alertwndcf += "<a id='closeAlertWndcf' title='Close this window'></a>";
4582
+     alertwndcf += "<div id='alertTextWrap'>"+ alertText +"</div>";
4583
+     alertwndcf += "<div id='cancelOkWrap'><input type='submit' id='confirmCancel' value='Cancel'>";
4584
+     alertwndcf += "<input type='submit' id='confirmOk' value='OK'></div>";
4585
+     alertwndcf += "</div>";
4586
+
4587
+     $("#content").append("<div id='alertMsgOverlay'></div>");
4588
+     $("#content").append(alertwndcf);
4589
+
4590
+     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
4591
+     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
4592
+     $("#alertConfMessage").css({ "top" : topDist, "left" : leftDist });
4593
+
4594
+     $("#closeAlertWndcf").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
4595
+     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
4596
+  }
4597
+
4598
+});
0 4599
new file mode 100644
... ...
@@ -0,0 +1,510 @@
1
+<?php
2
+/**
3
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
4
+ *
5
+ * @author Double Bastion LLC
6
+ *
7
+ * @license GNU AGPL version 3 or any later version
8
+ *
9
+ * This program is free software; you can redistribute it and/or
10
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
11
+ * License as published by the Free Software Foundation; either
12
+ * version 3 of the License, or any later version.
13
+ *
14
+ * This program is distributed in the hope that it will be useful,
15
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
18
+ *
19
+ * You should have received a copy of the GNU Affero General Public
20
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
+ *
22
+ */
23
+
24
+declare(strict_types=1);
25
+
26
+namespace OCA\SMSRelentless\Migration;
27
+
28
+use Closure;
29
+use OCP\DB\Types;
30
+use OCP\DB\ISchemaWrapper;
31
+use OCP\IDBConnection;
32
+use OCP\Migration\IOutput;
33
+use OCP\Migration\SimpleMigrationStep;
34
+
35
+
36
+class Version116Date20230508212745 extends SimpleMigrationStep {
37
+
38
+        /** @var IDBConnection */
39
+        private $connection;
40
+
41
+        /**
42
+         * @param IDBConnection $connection
43
+         */
44
+        public function __construct(IDBConnection $connection) {
45
+                $this->connection = $connection;
46
+        }
47
+
48
+	/**
49
+	 * @param IOutput $output
50
+	 * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
51
+	 * @param array $options
52
+	 * @return null|ISchemaWrapper
53
+	 */
54
+	public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
55
+		/** @var ISchemaWrapper $schema */
56
+		$schema = $schemaClosure();
57
+
58
+		if (!$schema->hasTable('sms_relent_settings')) {
59
+			$table = $schema->createTable('sms_relent_settings');
60
+			$table->addColumn('id', Types::BIGINT, [
61
+				'autoincrement' => true,
62
+				'notnull' => true,
63
+                                'length' => 11,
64
+                                'unsigned' => true,
65
+			]);
66
+			$table->addColumn('user_id', Types::STRING, [
67
+				'notnull' => true,
68
+				'length' => 128,
69
+			]);
70
+			$table->addColumn('telapi_key', Types::STRING, [
71
+				'notnull' => true,
72
+				'length' => 512,
73
+			]);
74
+			$table->addColumn('tel_pub_key', Types::STRING, [
75
+				'notnull' => true,
76
+				'length' => 512,
77
+			]);
78
+			$table->addColumn('telapi_url_rec', Types::STRING, [
79
+				'notnull' => true,
80
+				'length' => 512,
81
+			]);
82
+			$table->addColumn('telapi_url', Types::STRING, [
83
+				'notnull' => true,
84
+				'length' => 512,
85
+			]);
86
+			$table->addColumn('messaging_profile_id', Types::STRING, [
87
+				'notnull' => true,
88
+				'length' => 512,
89
+			]);
90
+			$table->addColumn('nexapi_key', Types::STRING, [
91
+				'notnull' => true,
92
+				'length' => 512,
93
+			]);
94
+			$table->addColumn('nexapi_secret', Types::STRING, [
95
+				'notnull' => true,
96
+				'length' => 512,
97
+			]);
98
+			$table->addColumn('nexapi_url_rec', Types::STRING, [
99
+				'notnull' => true,
100
+				'length' => 512,
101
+			]);
102
+			$table->addColumn('nexapi_url', Types::STRING, [
103
+				'notnull' => true,
104
+				'length' => 512,
105
+			]);
106
+			$table->addColumn('twilapi_key', Types::STRING, [
107
+				'notnull' => true,
108
+				'length' => 512,
109
+			]);
110
+			$table->addColumn('twilapi_secret', Types::STRING, [
111
+				'notnull' => true,
112
+				'length' => 512,
113
+			]);
114
+			$table->addColumn('twilapi_url_rec', Types::STRING, [
115
+				'notnull' => true,
116
+				'length' => 512,
117
+			]);
118
+			$table->addColumn('twilapi_url', Types::STRING, [
119
+				'notnull' => true,
120
+				'length' => 512,
121
+			]);
122
+			$table->addColumn('flowapi_key', Types::STRING, [
123
+				'notnull' => true,
124
+				'length' => 512,
125
+			]);
126
+			$table->addColumn('flowapi_secret', Types::STRING, [
127
+				'notnull' => true,
128
+				'length' => 512,
129
+			]);
130
+			$table->addColumn('flowapi_url_rec', Types::STRING, [
131
+				'notnull' => true,
132
+				'length' => 512,
133
+			]);
134
+			$table->addColumn('flowapi_url', Types::STRING, [
135
+				'notnull' => true,
136
+				'length' => 512,
137
+			]);
138
+			$table->addColumn('tel_sender_name', Types::STRING, [
139
+				'notnull' => false,
140
+				'length' => 48,
141
+				'default' => '',
142
+			]);
143
+			$table->addColumn('nex_sender_name', Types::STRING, [
144
+				'notnull' => false,
145
+				'length' => 48,
146
+				'default' => '',
147
+			]);
148
+			$table->addColumn('twil_sender_name', Types::STRING, [
149
+				'notnull' => false,
150
+				'length' => 48,
151
+				'default' => '',
152
+			]);
153
+			$table->addColumn('flow_sender_name', Types::STRING, [
154
+				'notnull' => false,
155
+				'length' => 48,
156
+				'default' => '',
157
+			]);
158
+			$table->addColumn('messagesperpage', Types::INTEGER, [
159
+				'notnull' => false,
160
+				'length' => 11,
161
+                                'unsigned' => true,
162
+			]);
163
+			$table->addColumn('get_notify', Types::SMALLINT, [
164
+				'notnull' => false,
165
+				'length' => 1,
166
+			]);
167
+			$table->addColumn('notification_email', Types::STRING, [
168
+				'notnull' => false,
169
+				'length' => 512,
170
+				'default' => '',
171
+			]);
172
+			$table->addColumn('getsmsinemail', Types::SMALLINT, [
173
+				'notnull' => false,
174
+				'length' => 1,
175
+			]);
176
+			$table->addColumn('show_all_messages', Types::SMALLINT, [
177
+				'notnull' => false,
178
+				'length' => 1,
179
+			]);
180
+			$table->addColumn('show_display_names', Types::SMALLINT, [
181
+				'notnull' => false,
182
+				'length' => 1,
183
+			]);
184
+                        $table->setPrimaryKey(['id']);
185
+                        $table->addUniqueIndex(['id']);
186
+
187
+		} else {
188
+
189
+                        $table = $schema->getTable('sms_relent_settings');
190
+
191
+			$table->addColumn('show_all_messages', Types::SMALLINT, [
192
+				'notnull' => false,
193
+				'length' => 1,
194
+			]);
195
+			$table->addColumn('show_display_names', Types::SMALLINT, [
196
+				'notnull' => false,
197
+				'length' => 1,
198
+			]);
199
+                }
200
+
201
+
202
+		if (!$schema->hasTable('sms_relent_received')) {
203
+			$table = $schema->createTable('sms_relent_received');
204
+			$table->addColumn('id', Types::BIGINT, [
205
+				'autoincrement' => true,
206
+				'notnull' => true,
207
+                                'length' => 11,
208
+                                'unsigned' => true,
209
+			]);
210
+			$table->addColumn('user_id', Types::STRING, [
211
+				'notnull' => true,
212
+				'length' => 64,
213
+			]);
214
+			$table->addColumn('message_id', Types::STRING, [
215
+				'notnull' => true,
216
+				'length' => 512,
217
+			]);
218
+			$table->addColumn('date', Types::DATETIME, [
219
+				'notnull' => true,
220
+			]);
221
+			$table->addColumn('from', Types::STRING, [
222
+				'notnull' => true,
223
+				'length' => 128,
224
+			]);
225
+			$table->addColumn('to', Types::STRING, [
226
+				'notnull' => true,
227
+				'length' => 128,
228
+			]);
229
+			$table->addColumn('message', Types::TEXT, [
230
+				'notnull' => false,
231
+				'default' => '',
232
+			]);
233
+			$table->addColumn('author_displayname', Types::STRING, [
234
+				'notnull' => true,
235
+				'length' => 255,
236
+			]);
237
+			$table->addColumn('internal_sender', Types::SMALLINT, [
238
+				'notnull' => false,
239
+				'length' => 1,
240
+			]);
241
+                        $table->setPrimaryKey(['id']);
242
+                        $table->addUniqueIndex(['id']);
243
+
244
+		} else {
245
+
246
+                        $table = $schema->getTable('sms_relent_received');
247
+
248
+			$table->addColumn('author_displayname', Types::STRING, [
249
+				'notnull' => true,
250
+				'length' => 255,
251
+			]);
252
+			$table->addColumn('internal_sender', Types::SMALLINT, [
253
+				'notnull' => false,
254
+				'length' => 1,
255
+			]);
256
+                }
257
+
258
+
259
+		if (!$schema->hasTable('sms_relent_sent')) {
260
+			$table = $schema->createTable('sms_relent_sent');
261
+			$table->addColumn('id', Types::BIGINT, [
262
+				'autoincrement' => true,
263
+				'notnull' => true,
264
+                                'length' => 11,
265
+                                'unsigned' => true,
266
+			]);
267
+			$table->addColumn('user_id', Types::STRING, [
268
+				'notnull' => true,
269
+				'length' => 64,
270
+			]);
271
+			$table->addColumn('message_id', Types::STRING, [
272
+				'notnull' => true,
273
+				'length' => 512,
274
+			]);
275
+			$table->addColumn('date', Types::DATETIME, [
276
+				'notnull' => true,
277
+			]);
278
+			$table->addColumn('from', Types::STRING, [
279
+				'notnull' => true,
280
+				'length' => 128,
281
+			]);
282
+			$table->addColumn('to', Types::STRING, [
283
+				'notnull' => true,
284
+				'length' => 128,
285
+			]);
286
+			$table->addColumn('network ', Types::STRING, [
287
+				'notnull' => false,
288
+				'length' => 64,
289
+				'default' => '',
290
+			]);
291
+			$table->addColumn('price', Types::STRING, [
292
+				'notnull' => false,
293
+				'length' => 64,
294
+				'default' => '',
295
+			]);
296
+			$table->addColumn('status', Types::STRING, [
297
+				'notnull' => false,
298
+				'length' => 512,
299
+				'default' => '',
300
+			]);
301
+			$table->addColumn('deliveryreceipt', Types::STRING, [
302
+				'notnull' => false,
303
+				'length' => 64,
304
+				'default' => '',
305
+			]);
306
+			$table->addColumn('message', Types::TEXT, [
307
+				'notnull' => false,
308
+                                'default' => '',
309
+			]);
310
+			$table->addColumn('author_displayname', Types::STRING, [
311
+				'notnull' => true,
312
+				'length' => 255,
313
+			]);
314
+                        $table->setPrimaryKey(['id']);
315
+                        $table->addUniqueIndex(['id']);
316
+
317
+		} else {
318
+
319
+                        $table = $schema->getTable('sms_relent_sent');
320
+
321
+			$table->addColumn('author_displayname', Types::STRING, [
322
+				'notnull' => true,
323
+				'length' => 255,
324
+			]);
325
+                }
326
+
327
+
328
+		if (!$schema->hasTable('sms_relent_autorply')) {
329
+			$table = $schema->createTable('sms_relent_autorply');
330
+			$table->addColumn('id', Types::BIGINT, [
331
+				'autoincrement' => true,
332
+				'notnull' => true,
333
+                                'length' => 11,
334
+                                'unsigned' => true,
335
+			]);
336
+			$table->addColumn('user_id', Types::STRING, [
337
+				'notnull' => true,
338
+				'length' => 128,
339
+			]);
340
+			$table->addColumn('saved_by_dsplname', Types::STRING, [
341
+				'notnull' => true,
342
+				'length' => 255,
343
+			]);
344
+			$table->addColumn('phone_number', Types::STRING, [
345
+				'notnull' => true,
346
+				'length' => 128,
347
+			]);
348
+			$table->addColumn('days_of_week', Types::STRING, [
349
+				'notnull' => false,
350
+				'length' => 64,
351
+                                'default' => '',
352
+			]);
353
+			$table->addColumn('daily_start', Types::STRING, [
354
+				'notnull' => false,
355
+				'length' => 8,
356
+                                'default' => '',
357
+			]);
358
+			$table->addColumn('daily_end', Types::STRING, [
359
+				'notnull' => false,
360
+				'length' => 8,
361
+                                'default' => '',
362
+			]);
363
+			$table->addColumn('vacation_start', Types::DATETIME, [
364
+				'notnull' => false,
365
+			]);
366
+			$table->addColumn('vacation_end', Types::DATETIME, [
367
+				'notnull' => false,
368
+			]);
369
+			$table->addColumn('message_text', Types::TEXT, [
370
+				'notnull' => false,
371
+                                'default' => '',
372
+			]);
373
+                        $table->setPrimaryKey(['id']);
374
+                        $table->addUniqueIndex(['id']);
375
+
376
+		}
377
+
378
+
379
+		if (!$schema->hasTable('sms_relent_restrict')) {
380
+			$table = $schema->createTable('sms_relent_restrict');
381
+			$table->addColumn('id', Types::BIGINT, [
382
+				'autoincrement' => true,
383
+				'notnull' => true,
384
+                                'length' => 11,
385
+                                'unsigned' => true,
386
+			]);
387
+			$table->addColumn('user_id', Types::STRING, [
388
+				'notnull' => true,
389
+				'length' => 128,
390
+			]);
391
+			$table->addColumn('saved_by_dsplname', Types::STRING, [
392
+				'notnull' => true,
393
+				'length' => 255,
394
+			]);
395
+			$table->addColumn('phone_number', Types::STRING, [
396
+				'notnull' => true,
397
+				'length' => 128,
398
+			]);
399
+			$table->addColumn('groups', Types::STRING, [
400
+				'notnull' => true,
401
+				'length' => 2048,
402
+			]);
403
+			$table->addColumn('users', Types::STRING, [
404
+				'notnull' => true,
405
+				'length' => 2048,
406
+			]);
407
+                        $table->setPrimaryKey(['id']);
408
+                        $table->addUniqueIndex(['id']);
409
+
410
+		}
411
+
412
+		return $schema;
413
+	}
414
+
415
+        public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
416
+
417
+                // Enter the Nextcloud display name in the 'author_displayname' column of the 'sms_relent_sent' table, for messages that were sent before the upgrade
418
+                $getrecfromnb = $this->connection->prepare('SELECT `id`, `user_id` FROM `*PREFIX*sms_relent_sent`');
419
+	        $getrecfromnbres = $getrecfromnb->execute();
420
+
421
+                $recdatauids = [];
422
+                $idsent = [];
423
+                while ($rowfetched = $getrecfromnbres->fetch()) {
424
+                       $recdatauids[] = $rowfetched['user_id'];
425
+                       $idsent[] = $rowfetched['id'];
426
+                }
427
+                $getrecfromnbres->closeCursor();
428
+
429
+                if ($recdatauids) {
430
+
431
+                    $recuids = array_values(array_unique($recdatauids));
432
+                    $acdatausrdn = [];
433
+
434
+                    foreach ($recuids as $dnkey => $dnvalue) {
435
+		             $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
436
+			     $getacdatadnres = $getacdatadn->execute([$dnvalue, 'displayname']);
437
+
438
+			     while ($acusrdnfetched = $getacdatadnres->fetch()) {
439
+				    $acdatausrdn[$dnvalue] = $acusrdnfetched['value'];
440
+			     }
441
+			     $getacdatadnres->closeCursor();
442
+                    }
443
+
444
+                    foreach ($recdatauids as $pdpkey => $pdpvalue) {
445
+
446
+			     $updaterecms = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_sent` SET `author_displayname` = ? WHERE `user_id` = ? AND `id` = ?');
447
+			     $updaterecmsres = $updaterecms->execute([$acdatausrdn[$pdpvalue], $pdpvalue, $idsent[$pdpkey]]);
448
+			     $updaterecmsres->closeCursor();
449
+                    }
450
+                }
451
+
452
+
453
+                // Enter the Nextcloud display name in the 'author_displayname' column of the 'sms_relent_received' table, for messages that were received before the upgrade
454
+                $getrecfromnb = $this->connection->prepare('SELECT `id`, `date`, `from` FROM `*PREFIX*sms_relent_received`');
455
+	        $getrecfromnbres = $getrecfromnb->execute();
456
+
457
+                $recdatanmbrs = [];
458
+                $idsrc = [];
459
+                $daterec = [];
460
+                while ($rowfetched = $getrecfromnbres->fetch()) {
461
+                       $recdatanmbrs[] = $rowfetched['from'];
462
+                       $idsrc[] = $rowfetched['id'];
463
+                       $daterecarr = explode(":", $rowfetched['date']);
464
+                       $daterec[] = $daterecarr[0];
465
+                }
466
+                $getrecfromnbres->closeCursor();
467
+
468
+                if ($recdatanmbrs) {
469
+
470
+                    foreach ($recdatanmbrs as $rckey => $rcvalue) {
471
+
472
+			     // Search for the associated Display Name in the previous messages sent from the same phone number, in the 'sms_relent_sent' table
473
+			     $recmsgfromprc = '%' . $rcvalue;
474
+                             $recdataprc = $daterec[$rckey] . '%';
475
+			     $getdspnmst = $this->connection->prepare('SELECT `date`, `from`, `author_displayname` FROM `*PREFIX*sms_relent_sent` WHERE `from` LIKE ? AND `date` LIKE ?');
476
+			     $getdspnmstres = $getdspnmst->execute([$recmsgfromprc, $recdataprc]);
477
+
478
+			     $dispnamearr = [];
479
+			     while ($dspnmstfetched = $getdspnmstres->fetch()) {
480
+				    $dispnamearr[] = $dspnmstfetched['author_displayname'];
481
+			     }
482
+			     $getdspnmstres->closeCursor();
483
+
484
+			     if ($dispnamearr) {
485
+				 $descdspnmarr = array_reverse($dispnamearr);
486
+				 $authorDisplayNm = $descdspnmarr[0];
487
+				 $internalSender = 1;
488
+
489
+			     } else {
490
+
491
+                                 $authorDisplayNm = '';
492
+
493
+			         $getfrom = $this->connection->prepare('SELECT `from` FROM `*PREFIX*sms_relent_sent` WHERE `from` LIKE ? LIMIT 1');
494
+			         $getfromres = $getfrom->execute([$recmsgfromprc]);
495
+                                 $fromfetched = $getfromres->fetch();
496
+
497
+                                 if ($fromfetched) { $internalSender = 1; } else { $internalSender = 0; }
498
+			     }
499
+
500
+			     $updaterecms = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_received` SET `author_displayname` = ?, `internal_sender` = ?
501
+                                                                        WHERE `from` LIKE ? AND `id` = ?');
502
+			     $updaterecmsres = $updaterecms->execute([$authorDisplayNm, $internalSender, $recmsgfromprc, $idsrc[$rckey]]);
503
+			     $updaterecmsres->closeCursor();
504
+                    }
505
+                }
506
+
507
+                return null;
508
+        }
509
+
510
+}
0 511
new file mode 100644
... ...
@@ -0,0 +1,496 @@
1
+<?php
2
+/**
3
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
4
+ *
5
+ * @author Double Bastion LLC
6
+ *
7
+ * @license GNU AGPL version 3 or any later version
8
+ *
9
+ * This program is free software; you can redistribute it and/or
10
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
11
+ * License as published by the Free Software Foundation; either
12
+ * version 3 of the License, or any later version.
13
+ *
14
+ * This program is distributed in the hope that it will be useful,
15
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
18
+ *
19
+ * You should have received a copy of the GNU Affero General Public
20
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
+ *
22
+ */
23
+
24
+declare(strict_types=1);
25
+
26
+namespace OCA\SMSRelentless\Migration;
27
+
28
+use Closure;
29
+use OCP\DB\Types;
30
+use OCP\DB\ISchemaWrapper;
31
+use OCP\IDBConnection;
32
+use OCP\Migration\IOutput;
33
+use OCP\Migration\SimpleMigrationStep;
34
+
35
+
36
+class Version117Date20230509183517 extends SimpleMigrationStep {
37
+
38
+        /** @var IDBConnection */
39
+        private $connection;
40
+
41
+        /**
42
+         * @param IDBConnection $connection
43
+         */
44
+        public function __construct(IDBConnection $connection) {
45
+                $this->connection = $connection;
46
+        }
47
+
48
+	/**
49
+	 * @param IOutput $output
50
+	 * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
51
+	 * @param array $options
52
+	 * @return null|ISchemaWrapper
53
+	 */
54
+	public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
55
+		/** @var ISchemaWrapper $schema */
56
+		$schema = $schemaClosure();
57
+
58
+		if (!$schema->hasTable('sms_relent_settings')) {
59
+			$table = $schema->createTable('sms_relent_settings');
60
+			$table->addColumn('id', Types::BIGINT, [
61
+				'autoincrement' => true,
62
+				'notnull' => true,
63
+                                'length' => 11,
64
+                                'unsigned' => true,
65
+			]);
66
+			$table->addColumn('user_id', Types::STRING, [
67
+				'notnull' => true,
68
+				'length' => 128,
69
+			]);
70
+			$table->addColumn('telapi_key', Types::STRING, [
71
+				'notnull' => true,
72
+				'length' => 512,
73
+			]);
74
+			$table->addColumn('tel_pub_key', Types::STRING, [
75
+				'notnull' => true,
76
+				'length' => 512,
77
+			]);
78
+			$table->addColumn('telapi_url_rec', Types::STRING, [
79
+				'notnull' => true,
80
+				'length' => 512,
81
+			]);
82
+			$table->addColumn('telapi_url', Types::STRING, [
83
+				'notnull' => true,
84
+				'length' => 512,
85
+			]);
86
+			$table->addColumn('messaging_profile_id', Types::STRING, [
87
+				'notnull' => true,
88
+				'length' => 512,
89
+			]);
90
+			$table->addColumn('nexapi_key', Types::STRING, [
91
+				'notnull' => true,
92
+				'length' => 512,
93
+			]);
94
+			$table->addColumn('nexapi_secret', Types::STRING, [
95
+				'notnull' => true,
96
+				'length' => 512,
97
+			]);
98
+			$table->addColumn('nexapi_url_rec', Types::STRING, [
99
+				'notnull' => true,
100
+				'length' => 512,
101
+			]);
102
+			$table->addColumn('nexapi_url', Types::STRING, [
103
+				'notnull' => true,
104
+				'length' => 512,
105
+			]);
106
+			$table->addColumn('twilapi_key', Types::STRING, [
107
+				'notnull' => true,
108
+				'length' => 512,
109
+			]);
110
+			$table->addColumn('twilapi_secret', Types::STRING, [
111
+				'notnull' => true,
112
+				'length' => 512,
113
+			]);
114
+			$table->addColumn('twilapi_url_rec', Types::STRING, [
115
+				'notnull' => true,
116
+				'length' => 512,
117
+			]);
118
+			$table->addColumn('twilapi_url', Types::STRING, [
119
+				'notnull' => true,
120
+				'length' => 512,
121
+			]);
122
+			$table->addColumn('flowapi_key', Types::STRING, [
123
+				'notnull' => true,
124
+				'length' => 512,
125
+			]);
126
+			$table->addColumn('flowapi_secret', Types::STRING, [
127
+				'notnull' => true,
128
+				'length' => 512,
129
+			]);
130
+			$table->addColumn('flowapi_url_rec', Types::STRING, [
131
+				'notnull' => true,
132
+				'length' => 512,
133
+			]);
134
+			$table->addColumn('flowapi_url', Types::STRING, [
135
+				'notnull' => true,
136
+				'length' => 512,
137
+			]);
138
+			$table->addColumn('tel_sender_name', Types::STRING, [
139
+				'notnull' => false,
140
+				'length' => 48,
141
+				'default' => '',
142
+			]);
143
+			$table->addColumn('nex_sender_name', Types::STRING, [
144
+				'notnull' => false,
145
+				'length' => 48,
146
+				'default' => '',
147
+			]);
148
+			$table->addColumn('twil_sender_name', Types::STRING, [
149
+				'notnull' => false,
150
+				'length' => 48,
151
+				'default' => '',
152
+			]);
153
+			$table->addColumn('flow_sender_name', Types::STRING, [
154
+				'notnull' => false,
155
+				'length' => 48,
156
+				'default' => '',
157
+			]);
158
+			$table->addColumn('messagesperpage', Types::INTEGER, [
159
+				'notnull' => false,
160
+				'length' => 11,
161
+                                'unsigned' => true,
162
+			]);
163
+			$table->addColumn('get_notify', Types::SMALLINT, [
164
+				'notnull' => false,
165
+				'length' => 1,
166
+			]);
167
+			$table->addColumn('notification_email', Types::STRING, [
168
+				'notnull' => false,
169
+				'length' => 512,
170
+				'default' => '',
171
+			]);
172
+			$table->addColumn('getsmsinemail', Types::SMALLINT, [
173
+				'notnull' => false,
174
+				'length' => 1,
175
+			]);
176
+			$table->addColumn('show_all_messages', Types::SMALLINT, [
177
+				'notnull' => false,
178
+				'length' => 1,
179
+			]);
180
+			$table->addColumn('show_display_names', Types::SMALLINT, [
181
+				'notnull' => false,
182
+				'length' => 1,
183
+			]);
184
+                        $table->setPrimaryKey(['id']);
185
+                        $table->addUniqueIndex(['id']);
186
+
187
+		}
188
+
189
+
190
+		if (!$schema->hasTable('sms_relent_received')) {
191
+			$table = $schema->createTable('sms_relent_received');
192
+			$table->addColumn('id', Types::BIGINT, [
193
+				'autoincrement' => true,
194
+				'notnull' => true,
195
+                                'length' => 11,
196
+                                'unsigned' => true,
197
+			]);
198
+			$table->addColumn('user_id', Types::STRING, [
199
+				'notnull' => true,
200
+				'length' => 64,
201
+			]);
202
+			$table->addColumn('message_id', Types::STRING, [
203
+				'notnull' => true,
204
+				'length' => 512,
205
+			]);
206
+			$table->addColumn('date', Types::DATETIME, [
207
+				'notnull' => true,
208
+			]);
209
+			$table->addColumn('from', Types::STRING, [
210
+				'notnull' => true,
211
+				'length' => 128,
212
+			]);
213
+			$table->addColumn('to', Types::STRING, [
214
+				'notnull' => true,
215
+				'length' => 128,
216
+			]);
217
+			$table->addColumn('message', Types::TEXT, [
218
+				'notnull' => false,
219
+				'default' => '',
220
+			]);
221
+			$table->addColumn('author_displayname', Types::STRING, [
222
+				'notnull' => true,
223
+				'length' => 255,
224
+			]);
225
+			$table->addColumn('internal_sender', Types::SMALLINT, [
226
+				'notnull' => false,
227
+				'length' => 1,
228
+			]);
229
+                        $table->setPrimaryKey(['id']);
230
+                        $table->addUniqueIndex(['id']);
231
+
232
+		}
233
+
234
+
235
+		if (!$schema->hasTable('sms_relent_sent')) {
236
+			$table = $schema->createTable('sms_relent_sent');
237
+			$table->addColumn('id', Types::BIGINT, [
238
+				'autoincrement' => true,
239
+				'notnull' => true,
240
+                                'length' => 11,
241
+                                'unsigned' => true,
242
+			]);
243
+			$table->addColumn('user_id', Types::STRING, [
244
+				'notnull' => true,
245
+				'length' => 64,
246
+			]);
247
+			$table->addColumn('message_id', Types::STRING, [
248
+				'notnull' => true,
249
+				'length' => 512,
250
+			]);
251
+			$table->addColumn('date', Types::DATETIME, [
252
+				'notnull' => true,
253
+			]);
254
+			$table->addColumn('from', Types::STRING, [
255
+				'notnull' => true,
256
+				'length' => 128,
257
+			]);
258
+			$table->addColumn('to', Types::STRING, [
259
+				'notnull' => true,
260
+				'length' => 128,
261
+			]);
262
+			$table->addColumn('network ', Types::STRING, [
263
+				'notnull' => false,
264
+				'length' => 64,
265
+				'default' => '',
266
+			]);
267
+			$table->addColumn('price', Types::STRING, [
268
+				'notnull' => false,
269
+				'length' => 64,
270
+				'default' => '',
271
+			]);
272
+			$table->addColumn('status', Types::STRING, [
273
+				'notnull' => false,
274
+				'length' => 512,
275
+				'default' => '',
276
+			]);
277
+			$table->addColumn('deliveryreceipt', Types::STRING, [
278
+				'notnull' => false,
279
+				'length' => 64,
280
+				'default' => '',
281
+			]);
282
+			$table->addColumn('message', Types::TEXT, [
283
+				'notnull' => false,
284
+                                'default' => '',
285
+			]);
286
+			$table->addColumn('author_displayname', Types::STRING, [
287
+				'notnull' => true,
288
+				'length' => 255,
289
+			]);
290
+                        $table->setPrimaryKey(['id']);
291
+                        $table->addUniqueIndex(['id']);
292
+
293
+		}
294
+
295
+
296
+		if (!$schema->hasTable('sms_relent_autorply')) {
297
+			$table = $schema->createTable('sms_relent_autorply');
298
+			$table->addColumn('id', Types::BIGINT, [
299
+				'autoincrement' => true,
300
+				'notnull' => true,
301
+                                'length' => 11,
302
+                                'unsigned' => true,
303
+			]);
304
+			$table->addColumn('user_id', Types::STRING, [
305
+				'notnull' => true,
306
+				'length' => 128,
307
+			]);
308
+			$table->addColumn('saved_by_dsplname', Types::STRING, [
309
+				'notnull' => true,
310
+				'length' => 255,
311
+			]);
312
+			$table->addColumn('phone_number', Types::STRING, [
313
+				'notnull' => true,
314
+				'length' => 128,
315
+			]);
316
+			$table->addColumn('days_of_week', Types::STRING, [
317
+				'notnull' => false,
318
+				'length' => 64,
319
+                                'default' => '',
320
+			]);
321
+			$table->addColumn('daily_start', Types::STRING, [
322
+				'notnull' => false,
323
+				'length' => 8,
324
+                                'default' => '',
325
+			]);
326
+			$table->addColumn('daily_end', Types::STRING, [
327
+				'notnull' => false,
328
+				'length' => 8,
329
+                                'default' => '',
330
+			]);
331
+			$table->addColumn('vacation_start', Types::DATETIME, [
332
+				'notnull' => false,
333
+			]);
334
+			$table->addColumn('vacation_end', Types::DATETIME, [
335
+				'notnull' => false,
336
+			]);
337
+			$table->addColumn('message_text', Types::TEXT, [
338
+				'notnull' => false,
339
+                                'default' => '',
340
+			]);
341
+                        $table->setPrimaryKey(['id']);
342
+                        $table->addUniqueIndex(['id']);
343
+
344
+		}
345
+
346
+
347
+		if (!$schema->hasTable('sms_relent_restrict')) {
348
+			$table = $schema->createTable('sms_relent_restrict');
349
+			$table->addColumn('id', Types::BIGINT, [
350
+				'autoincrement' => true,
351
+				'notnull' => true,
352
+                                'length' => 11,
353
+                                'unsigned' => true,
354
+			]);
355
+			$table->addColumn('user_id', Types::STRING, [
356
+				'notnull' => true,
357
+				'length' => 128,
358
+			]);
359
+			$table->addColumn('saved_by_dsplname', Types::STRING, [
360
+				'notnull' => true,
361
+				'length' => 255,
362
+			]);
363
+			$table->addColumn('phone_number', Types::STRING, [
364
+				'notnull' => true,
365
+				'length' => 128,
366
+			]);
367
+			$table->addColumn('groups', Types::STRING, [
368
+				'notnull' => true,
369
+				'length' => 2048,
370
+			]);
371
+			$table->addColumn('users', Types::STRING, [
372
+				'notnull' => true,
373
+				'length' => 2048,
374
+			]);
375
+                        $table->setPrimaryKey(['id']);
376
+                        $table->addUniqueIndex(['id']);
377
+
378
+		}
379
+
380
+		return $schema;
381
+	}
382
+
383
+        public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
384
+
385
+                // Enter the Nextcloud display name in the 'author_displayname' column of the 'sms_relent_sent' table, for messages that were sent before the upgrade
386
+                $getrecfromnb = $this->connection->prepare('SELECT `id`, `user_id` FROM `*PREFIX*sms_relent_sent`');
387
+	        $getrecfromnbres = $getrecfromnb->execute();
388
+
389
+                $recdatauids = [];
390
+                $idsent = [];
391
+                while ($rowfetched = $getrecfromnbres->fetch()) {
392
+                       $recdatauids[] = $rowfetched['user_id'];
393
+                       $idsent[] = $rowfetched['id'];
394
+                }
395
+                $getrecfromnbres->closeCursor();
396
+
397
+                if ($recdatauids) {
398
+
399
+                    $recuids = array_values(array_unique($recdatauids));
400
+                    $acdatausrdn = [];
401
+
402
+                    foreach ($recuids as $dnkey => $dnvalue) {
403
+		             $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
404
+			     $getacdatadnres = $getacdatadn->execute([$dnvalue, 'displayname']);
405
+
406
+			     while ($acusrdnfetched = $getacdatadnres->fetch()) {
407
+				    $acdatausrdn[$dnvalue] = $acusrdnfetched['value'];
408
+			     }
409
+			     $getacdatadnres->closeCursor();
410
+                    }
411
+
412
+                    foreach ($recdatauids as $pdpkey => $pdpvalue) {
413
+
414
+			     $updaterecms = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_sent` SET `author_displayname` = ? WHERE `user_id` = ? AND `id` = ?');
415
+			     $updaterecmsres = $updaterecms->execute([$acdatausrdn[$pdpvalue], $pdpvalue, $idsent[$pdpkey]]);
416
+			     $updaterecmsres->closeCursor();
417
+                    }
418
+                }
419
+
420
+
421
+                // Enter the Nextcloud display name in the 'author_displayname' column of the 'sms_relent_received' table, for messages that were received before the upgrade
422
+                $getrecfromnb = $this->connection->prepare('SELECT `id`, `date`, `from` FROM `*PREFIX*sms_relent_received`');
423
+	        $getrecfromnbres = $getrecfromnb->execute();
424
+
425
+                $recdatanmbrs = [];
426
+                $idsrc = [];
427
+                $daterec = [];
428
+                while ($rowfetched = $getrecfromnbres->fetch()) {
429
+                       $recdatanmbrs[] = $rowfetched['from'];
430
+                       $idsrc[] = $rowfetched['id'];
431
+                       $daterecarr = explode(":", $rowfetched['date']);
432
+                       $daterec[] = $daterecarr[0];
433
+                }
434
+                $getrecfromnbres->closeCursor();
435
+
436
+                if ($recdatanmbrs) {
437
+
438
+                    foreach ($recdatanmbrs as $rckey => $rcvalue) {
439
+
440
+			     // Search for the associated Display Name in the previous messages sent from the same phone number, in the 'sms_relent_sent' table
441
+			     $recmsgfromprc = '%' . $rcvalue;
442
+                             $recdataprc = $daterec[$rckey] . '%';
443
+			     $getdspnmst = $this->connection->prepare('SELECT `date`, `from`, `author_displayname` FROM `*PREFIX*sms_relent_sent` WHERE `from` LIKE ? AND `date` LIKE ?');
444
+			     $getdspnmstres = $getdspnmst->execute([$recmsgfromprc, $recdataprc]);
445
+
446
+			     $dispnamearr = [];
447
+			     while ($dspnmstfetched = $getdspnmstres->fetch()) {
448
+				    $dispnamearr[] = $dspnmstfetched['author_displayname'];
449
+			     }
450
+			     $getdspnmstres->closeCursor();
451
+
452
+			     if ($dispnamearr) {
453
+				 $descdspnmarr = array_reverse($dispnamearr);
454
+				 $authorDisplayNm = $descdspnmarr[0];
455
+				 $internalSender = 1;
456
+
457
+			     } else {
458
+
459
+                                 $authorDisplayNm = '';
460
+
461
+			         $getfrom = $this->connection->prepare('SELECT `from` FROM `*PREFIX*sms_relent_sent` WHERE `from` LIKE ? LIMIT 1');
462
+			         $getfromres = $getfrom->execute([$recmsgfromprc]);
463
+                                 $fromfetched = $getfromres->fetch();
464
+
465
+                                 if ($fromfetched) { $internalSender = 1; } else { $internalSender = 0; }
466
+
467
+
468
+				 // Search for the associated Display Name in the previous messages coming from the same phone number, in the 'sms_relent_received' table
469
+				 $getdspnm = $this->connection->prepare('SELECT `from`, `author_displayname` FROM `*PREFIX*sms_relent_received` WHERE `from` = ?');
470
+				 $getdspnmres = $getdspnm->execute([$rcvalue]);
471
+
472
+				 $dspnmearr = [];
473
+				 while ($dspnmfetched = $getdspnmres->fetch()) {
474
+				        if ($dspnmfetched['author_displayname']) {
475
+				            $dspnmearr[] = $dspnmfetched['author_displayname'];
476
+				        }
477
+				 }
478
+				 $getdspnmres->closeCursor();
479
+
480
+				 if ($dspnmearr) {
481
+				     $descdisplaynmarr = array_reverse($dspnmearr);
482
+				     $authorDisplayNm = $descdisplaynmarr[0];
483
+				 } else { $authorDisplayNm = ''; }
484
+			     }
485
+
486
+			     $updaterecms = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_received` SET `author_displayname` = ?, `internal_sender` = ?
487
+                                                                        WHERE `from` LIKE ? AND `id` = ?');
488
+			     $updaterecmsres = $updaterecms->execute([$authorDisplayNm, $internalSender, $recmsgfromprc, $idsrc[$rckey]]);
489
+			     $updaterecmsres->closeCursor();
490
+                    }
491
+                }
492
+
493
+                return null;
494
+        }
495
+
496
+}
0 497
new file mode 100644
... ...
@@ -0,0 +1,496 @@
1
+<?php
2
+/**
3
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
4
+ *
5
+ * @author Double Bastion LLC
6
+ *
7
+ * @license GNU AGPL version 3 or any later version
8
+ *
9
+ * This program is free software; you can redistribute it and/or
10
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
11
+ * License as published by the Free Software Foundation; either
12
+ * version 3 of the License, or any later version.
13
+ *
14
+ * This program is distributed in the hope that it will be useful,
15
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
18
+ *
19
+ * You should have received a copy of the GNU Affero General Public
20
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
+ *
22
+ */
23
+
24
+declare(strict_types=1);
25
+
26
+namespace OCA\SMSRelentless\Migration;
27
+
28
+use Closure;
29
+use OCP\DB\Types;
30
+use OCP\DB\ISchemaWrapper;
31
+use OCP\IDBConnection;
32
+use OCP\Migration\IOutput;
33
+use OCP\Migration\SimpleMigrationStep;
34
+
35
+
36
+class Version118Date20230509194216 extends SimpleMigrationStep {
37
+
38
+        /** @var IDBConnection */
39
+        private $connection;
40
+
41
+        /**
42
+         * @param IDBConnection $connection
43
+         */
44
+        public function __construct(IDBConnection $connection) {
45
+                $this->connection = $connection;
46
+        }
47
+
48
+	/**
49
+	 * @param IOutput $output
50
+	 * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
51
+	 * @param array $options
52
+	 * @return null|ISchemaWrapper
53
+	 */
54
+	public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
55
+		/** @var ISchemaWrapper $schema */
56
+		$schema = $schemaClosure();
57
+
58
+		if (!$schema->hasTable('sms_relent_settings')) {
59
+			$table = $schema->createTable('sms_relent_settings');
60
+			$table->addColumn('id', Types::BIGINT, [
61
+				'autoincrement' => true,
62
+				'notnull' => true,
63
+                                'length' => 11,
64
+                                'unsigned' => true,
65
+			]);
66
+			$table->addColumn('user_id', Types::STRING, [
67
+				'notnull' => true,
68
+				'length' => 128,
69
+			]);
70
+			$table->addColumn('telapi_key', Types::STRING, [
71
+				'notnull' => true,
72
+				'length' => 512,
73
+			]);
74
+			$table->addColumn('tel_pub_key', Types::STRING, [
75
+				'notnull' => true,
76
+				'length' => 512,
77
+			]);
78
+			$table->addColumn('telapi_url_rec', Types::STRING, [
79
+				'notnull' => true,
80
+				'length' => 512,
81
+			]);
82
+			$table->addColumn('telapi_url', Types::STRING, [
83
+				'notnull' => true,
84
+				'length' => 512,
85
+			]);
86
+			$table->addColumn('messaging_profile_id', Types::STRING, [
87
+				'notnull' => true,
88
+				'length' => 512,
89
+			]);
90
+			$table->addColumn('nexapi_key', Types::STRING, [
91
+				'notnull' => true,
92
+				'length' => 512,
93
+			]);
94
+			$table->addColumn('nexapi_secret', Types::STRING, [
95
+				'notnull' => true,
96
+				'length' => 512,
97
+			]);
98
+			$table->addColumn('nexapi_url_rec', Types::STRING, [
99
+				'notnull' => true,
100
+				'length' => 512,
101
+			]);
102
+			$table->addColumn('nexapi_url', Types::STRING, [
103
+				'notnull' => true,
104
+				'length' => 512,
105
+			]);
106
+			$table->addColumn('twilapi_key', Types::STRING, [
107
+				'notnull' => true,
108
+				'length' => 512,
109
+			]);
110
+			$table->addColumn('twilapi_secret', Types::STRING, [
111
+				'notnull' => true,
112
+				'length' => 512,
113
+			]);
114
+			$table->addColumn('twilapi_url_rec', Types::STRING, [
115
+				'notnull' => true,
116
+				'length' => 512,
117
+			]);
118
+			$table->addColumn('twilapi_url', Types::STRING, [
119
+				'notnull' => true,
120
+				'length' => 512,
121
+			]);
122
+			$table->addColumn('flowapi_key', Types::STRING, [
123
+				'notnull' => true,
124
+				'length' => 512,
125
+			]);
126
+			$table->addColumn('flowapi_secret', Types::STRING, [
127
+				'notnull' => true,
128
+				'length' => 512,
129
+			]);
130
+			$table->addColumn('flowapi_url_rec', Types::STRING, [
131
+				'notnull' => true,
132
+				'length' => 512,
133
+			]);
134
+			$table->addColumn('flowapi_url', Types::STRING, [
135
+				'notnull' => true,
136
+				'length' => 512,
137
+			]);
138
+			$table->addColumn('tel_sender_name', Types::STRING, [
139
+				'notnull' => false,
140
+				'length' => 48,
141
+				'default' => '',
142
+			]);
143
+			$table->addColumn('nex_sender_name', Types::STRING, [
144
+				'notnull' => false,
145
+				'length' => 48,
146
+				'default' => '',
147
+			]);
148
+			$table->addColumn('twil_sender_name', Types::STRING, [
149
+				'notnull' => false,
150
+				'length' => 48,
151
+				'default' => '',
152
+			]);
153
+			$table->addColumn('flow_sender_name', Types::STRING, [
154
+				'notnull' => false,
155
+				'length' => 48,
156
+				'default' => '',
157
+			]);
158
+			$table->addColumn('messagesperpage', Types::INTEGER, [
159
+				'notnull' => false,
160
+				'length' => 11,
161
+                                'unsigned' => true,
162
+			]);
163
+			$table->addColumn('get_notify', Types::SMALLINT, [
164
+				'notnull' => false,
165
+				'length' => 1,
166
+			]);
167
+			$table->addColumn('notification_email', Types::STRING, [
168
+				'notnull' => false,
169
+				'length' => 512,
170
+				'default' => '',
171
+			]);
172
+			$table->addColumn('getsmsinemail', Types::SMALLINT, [
173
+				'notnull' => false,
174
+				'length' => 1,
175
+			]);
176
+			$table->addColumn('show_all_messages', Types::SMALLINT, [
177
+				'notnull' => false,
178
+				'length' => 1,
179
+			]);
180
+			$table->addColumn('show_display_names', Types::SMALLINT, [
181
+				'notnull' => false,
182
+				'length' => 1,
183
+			]);
184
+                        $table->setPrimaryKey(['id']);
185
+                        $table->addUniqueIndex(['id']);
186
+
187
+		}
188
+
189
+
190
+		if (!$schema->hasTable('sms_relent_received')) {
191
+			$table = $schema->createTable('sms_relent_received');
192
+			$table->addColumn('id', Types::BIGINT, [
193
+				'autoincrement' => true,
194
+				'notnull' => true,
195
+                                'length' => 11,
196
+                                'unsigned' => true,
197
+			]);
198
+			$table->addColumn('user_id', Types::STRING, [
199
+				'notnull' => true,
200
+				'length' => 64,
201
+			]);
202
+			$table->addColumn('message_id', Types::STRING, [
203
+				'notnull' => true,
204
+				'length' => 512,
205
+			]);
206
+			$table->addColumn('date', Types::DATETIME, [
207
+				'notnull' => true,
208
+			]);
209
+			$table->addColumn('from', Types::STRING, [
210
+				'notnull' => true,
211
+				'length' => 128,
212
+			]);
213
+			$table->addColumn('to', Types::STRING, [
214
+				'notnull' => true,
215
+				'length' => 128,
216
+			]);
217
+			$table->addColumn('message', Types::TEXT, [
218
+				'notnull' => false,
219
+				'default' => '',
220
+			]);
221
+			$table->addColumn('author_displayname', Types::STRING, [
222
+				'notnull' => true,
223
+				'length' => 255,
224
+			]);
225
+			$table->addColumn('internal_sender', Types::SMALLINT, [
226
+				'notnull' => false,
227
+				'length' => 1,
228
+			]);
229
+                        $table->setPrimaryKey(['id']);
230
+                        $table->addUniqueIndex(['id']);
231
+
232
+		}
233
+
234
+
235
+		if (!$schema->hasTable('sms_relent_sent')) {
236
+			$table = $schema->createTable('sms_relent_sent');
237
+			$table->addColumn('id', Types::BIGINT, [
238
+				'autoincrement' => true,
239
+				'notnull' => true,
240
+                                'length' => 11,
241
+                                'unsigned' => true,
242
+			]);
243
+			$table->addColumn('user_id', Types::STRING, [
244
+				'notnull' => true,
245
+				'length' => 64,
246
+			]);
247
+			$table->addColumn('message_id', Types::STRING, [
248
+				'notnull' => true,
249
+				'length' => 512,
250
+			]);
251
+			$table->addColumn('date', Types::DATETIME, [
252
+				'notnull' => true,
253
+			]);
254
+			$table->addColumn('from', Types::STRING, [
255
+				'notnull' => true,
256
+				'length' => 128,
257
+			]);
258
+			$table->addColumn('to', Types::STRING, [
259
+				'notnull' => true,
260
+				'length' => 128,
261
+			]);
262
+			$table->addColumn('network ', Types::STRING, [
263
+				'notnull' => false,
264
+				'length' => 64,
265
+				'default' => '',
266
+			]);
267
+			$table->addColumn('price', Types::STRING, [
268
+				'notnull' => false,
269
+				'length' => 64,
270
+				'default' => '',
271
+			]);
272
+			$table->addColumn('status', Types::STRING, [
273
+				'notnull' => false,
274
+				'length' => 512,
275
+				'default' => '',
276
+			]);
277
+			$table->addColumn('deliveryreceipt', Types::STRING, [
278
+				'notnull' => false,
279
+				'length' => 64,
280
+				'default' => '',
281
+			]);
282
+			$table->addColumn('message', Types::TEXT, [
283
+				'notnull' => false,
284
+                                'default' => '',
285
+			]);
286
+			$table->addColumn('author_displayname', Types::STRING, [
287
+				'notnull' => true,
288
+				'length' => 255,
289
+			]);
290
+                        $table->setPrimaryKey(['id']);
291
+                        $table->addUniqueIndex(['id']);
292
+
293
+		}
294
+
295
+
296
+		if (!$schema->hasTable('sms_relent_autorply')) {
297
+			$table = $schema->createTable('sms_relent_autorply');
298
+			$table->addColumn('id', Types::BIGINT, [
299
+				'autoincrement' => true,
300
+				'notnull' => true,
301
+                                'length' => 11,
302
+                                'unsigned' => true,
303
+			]);
304
+			$table->addColumn('user_id', Types::STRING, [
305
+				'notnull' => true,
306
+				'length' => 128,
307
+			]);
308
+			$table->addColumn('saved_by_dsplname', Types::STRING, [
309
+				'notnull' => true,
310
+				'length' => 255,
311
+			]);
312
+			$table->addColumn('phone_number', Types::STRING, [
313
+				'notnull' => true,
314
+				'length' => 128,
315
+			]);
316
+			$table->addColumn('days_of_week', Types::STRING, [
317
+				'notnull' => false,
318
+				'length' => 64,
319
+                                'default' => '',
320
+			]);
321
+			$table->addColumn('daily_start', Types::STRING, [
322
+				'notnull' => false,
323
+				'length' => 8,
324
+                                'default' => '',
325
+			]);
326
+			$table->addColumn('daily_end', Types::STRING, [
327
+				'notnull' => false,
328
+				'length' => 8,
329
+                                'default' => '',
330
+			]);
331
+			$table->addColumn('vacation_start', Types::DATETIME, [
332
+				'notnull' => false,
333
+			]);
334
+			$table->addColumn('vacation_end', Types::DATETIME, [
335
+				'notnull' => false,
336
+			]);
337
+			$table->addColumn('message_text', Types::TEXT, [
338
+				'notnull' => false,
339
+                                'default' => '',
340
+			]);
341
+                        $table->setPrimaryKey(['id']);
342
+                        $table->addUniqueIndex(['id']);
343
+
344
+		}
345
+
346
+
347
+		if (!$schema->hasTable('sms_relent_restrict')) {
348
+			$table = $schema->createTable('sms_relent_restrict');
349
+			$table->addColumn('id', Types::BIGINT, [
350
+				'autoincrement' => true,
351
+				'notnull' => true,
352
+                                'length' => 11,
353
+                                'unsigned' => true,
354
+			]);
355
+			$table->addColumn('user_id', Types::STRING, [
356
+				'notnull' => true,
357
+				'length' => 128,
358
+			]);
359
+			$table->addColumn('saved_by_dsplname', Types::STRING, [
360
+				'notnull' => true,
361
+				'length' => 255,
362
+			]);
363
+			$table->addColumn('phone_number', Types::STRING, [
364
+				'notnull' => true,
365
+				'length' => 128,
366
+			]);
367
+			$table->addColumn('groups', Types::STRING, [
368
+				'notnull' => true,
369
+				'length' => 2048,
370
+			]);
371
+			$table->addColumn('users', Types::STRING, [
372
+				'notnull' => true,
373
+				'length' => 2048,
374
+			]);
375
+                        $table->setPrimaryKey(['id']);
376
+                        $table->addUniqueIndex(['id']);
377
+
378
+		}
379
+
380
+		return $schema;
381
+	}
382
+
383
+        public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
384
+
385
+                // Enter the Nextcloud display name in the 'author_displayname' column of the 'sms_relent_sent' table, for messages that were sent before the upgrade
386
+                $getrecfromnb = $this->connection->prepare('SELECT `id`, `user_id` FROM `*PREFIX*sms_relent_sent`');
387
+	        $getrecfromnbres = $getrecfromnb->execute();
388
+
389
+                $recdatauids = [];
390
+                $idsent = [];
391
+                while ($rowfetched = $getrecfromnbres->fetch()) {
392
+                       $recdatauids[] = $rowfetched['user_id'];
393
+                       $idsent[] = $rowfetched['id'];
394
+                }
395
+                $getrecfromnbres->closeCursor();
396
+
397
+                if ($recdatauids) {
398
+
399
+                    $recuids = array_values(array_unique($recdatauids));
400
+                    $acdatausrdn = [];
401
+
402
+                    foreach ($recuids as $dnkey => $dnvalue) {
403
+		             $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
404
+			     $getacdatadnres = $getacdatadn->execute([$dnvalue, 'displayname']);
405
+
406
+			     while ($acusrdnfetched = $getacdatadnres->fetch()) {
407
+				    $acdatausrdn[$dnvalue] = $acusrdnfetched['value'];
408
+			     }
409
+			     $getacdatadnres->closeCursor();
410
+                    }
411
+
412
+                    foreach ($recdatauids as $pdpkey => $pdpvalue) {
413
+
414
+			     $updaterecms = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_sent` SET `author_displayname` = ? WHERE `user_id` = ? AND `id` = ?');
415
+			     $updaterecmsres = $updaterecms->execute([$acdatausrdn[$pdpvalue], $pdpvalue, $idsent[$pdpkey]]);
416
+			     $updaterecmsres->closeCursor();
417
+                    }
418
+                }
419
+
420
+
421
+                // Enter the Nextcloud display name in the 'author_displayname' column of the 'sms_relent_received' table, for messages that were received before the upgrade
422
+                $getrecfromnb = $this->connection->prepare('SELECT `id`, `date`, `from` FROM `*PREFIX*sms_relent_received`');
423
+	        $getrecfromnbres = $getrecfromnb->execute();
424
+
425
+                $recdatanmbrs = [];
426
+                $idsrc = [];
427
+                $daterec = [];
428
+                while ($rowfetched = $getrecfromnbres->fetch()) {
429
+                       $recdatanmbrs[] = $rowfetched['from'];
430
+                       $idsrc[] = $rowfetched['id'];
431
+                       $daterecarr = explode(":", $rowfetched['date']);
432
+                       $daterec[] = $daterecarr[0];
433
+                }
434
+                $getrecfromnbres->closeCursor();
435
+
436
+                if ($recdatanmbrs) {
437
+
438
+                    foreach ($recdatanmbrs as $rckey => $rcvalue) {
439
+
440
+			     // Search for the associated Display Name in the previous messages sent from the same phone number, in the 'sms_relent_sent' table
441
+			     $recmsgfromprc = '%' . $rcvalue;
442
+                             $recdataprc = $daterec[$rckey] . '%';
443
+			     $getdspnmst = $this->connection->prepare('SELECT `date`, `from`, `author_displayname` FROM `*PREFIX*sms_relent_sent` WHERE `from` LIKE ? AND `date` LIKE ?');
444
+			     $getdspnmstres = $getdspnmst->execute([$recmsgfromprc, $recdataprc]);
445
+
446
+			     $dispnamearr = [];
447
+			     while ($dspnmstfetched = $getdspnmstres->fetch()) {
448
+				    $dispnamearr[] = $dspnmstfetched['author_displayname'];
449
+			     }
450
+			     $getdspnmstres->closeCursor();
451
+
452
+			     if ($dispnamearr) {
453
+				 $descdspnmarr = array_reverse($dispnamearr);
454
+				 $authorDisplayNm = $descdspnmarr[0];
455
+				 $internalSender = 1;
456
+
457
+			     } else {
458
+
459
+                                 $authorDisplayNm = '';
460
+
461
+			         $getfrom = $this->connection->prepare('SELECT `from` FROM `*PREFIX*sms_relent_sent` WHERE `from` LIKE ? LIMIT 1');
462
+			         $getfromres = $getfrom->execute([$recmsgfromprc]);
463
+                                 $fromfetched = $getfromres->fetch();
464
+
465
+                                 if ($fromfetched) { $internalSender = 1; } else { $internalSender = 0; }
466
+
467
+
468
+				 // Search for the associated Display Name in the previous messages coming from the same phone number, in the 'sms_relent_received' table
469
+				 $getdspnm = $this->connection->prepare('SELECT `from`, `author_displayname` FROM `*PREFIX*sms_relent_received` WHERE `from` = ?');
470
+				 $getdspnmres = $getdspnm->execute([$rcvalue]);
471
+
472
+				 $dspnmearr = [];
473
+				 while ($dspnmfetched = $getdspnmres->fetch()) {
474
+				        if ($dspnmfetched['author_displayname']) {
475
+				            $dspnmearr[] = $dspnmfetched['author_displayname'];
476
+				        }
477
+				 }
478
+				 $getdspnmres->closeCursor();
479
+
480
+				 if ($dspnmearr) {
481
+				     $descdisplaynmarr = array_reverse($dspnmearr);
482
+				     $authorDisplayNm = $descdisplaynmarr[0];
483
+				 } else { $authorDisplayNm = ''; }
484
+			     }
485
+
486
+			     $updaterecms = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_received` SET `author_displayname` = ?, `internal_sender` = ?
487
+                                                                        WHERE `from` LIKE ? AND `id` = ?');
488
+			     $updaterecmsres = $updaterecms->execute([$authorDisplayNm, $internalSender, $recmsgfromprc, $idsrc[$rckey]]);
489
+			     $updaterecmsres->closeCursor();
490
+                    }
491
+                }
492
+
493
+                return null;
494
+        }
495
+
496
+}
0 497
new file mode 100644
... ...
@@ -0,0 +1,545 @@
1
+<?php
2
+/**
3
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
4
+ *
5
+ * @author Double Bastion LLC
6
+ *
7
+ * @license GNU AGPL version 3 or any later version
8
+ *
9
+ * This program is free software; you can redistribute it and/or
10
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
11
+ * License as published by the Free Software Foundation; either
12
+ * version 3 of the License, or any later version.
13
+ *
14
+ * This program is distributed in the hope that it will be useful,
15
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
18
+ *
19
+ * You should have received a copy of the GNU Affero General Public
20
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
+ *
22
+ */
23
+
24
+declare(strict_types=1);
25
+
26
+namespace OCA\SMSRelentless\Migration;
27
+
28
+use Closure;
29
+use OCP\DB\Types;
30
+use OCP\DB\ISchemaWrapper;
31
+use OCP\IDBConnection;
32
+use OCP\Migration\IOutput;
33
+use OCP\Migration\SimpleMigrationStep;
34
+
35
+
36
+class Version120Date20230520072431 extends SimpleMigrationStep {
37
+
38
+        /** @var IDBConnection */
39
+        private $connection;
40
+
41
+        /**
42
+         * @param IDBConnection $connection
43
+         */
44
+        public function __construct(IDBConnection $connection) {
45
+                $this->connection = $connection;
46
+        }
47
+
48
+	/**
49
+	 * @param IOutput $output
50
+	 * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
51
+	 * @param array $options
52
+	 * @return null|ISchemaWrapper
53
+	 */
54
+	public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
55
+		/** @var ISchemaWrapper $schema */
56
+		$schema = $schemaClosure();
57
+
58
+		if (!$schema->hasTable('sms_relent_settings')) {
59
+			$table = $schema->createTable('sms_relent_settings');
60
+			$table->addColumn('id', Types::BIGINT, [
61
+				'autoincrement' => true,
62
+				'notnull' => true,
63
+                                'length' => 11,
64
+                                'unsigned' => true,
65
+			]);
66
+			$table->addColumn('user_id', Types::STRING, [
67
+				'notnull' => true,
68
+				'length' => 128,
69
+			]);
70
+			$table->addColumn('telapi_key', Types::STRING, [
71
+				'notnull' => true,
72
+				'length' => 512,
73
+			]);
74
+			$table->addColumn('tel_pub_key', Types::STRING, [
75
+				'notnull' => true,
76
+				'length' => 512,
77
+			]);
78
+			$table->addColumn('telapi_url_rec', Types::STRING, [
79
+				'notnull' => true,
80
+				'length' => 512,
81
+			]);
82
+			$table->addColumn('telapi_url', Types::STRING, [
83
+				'notnull' => true,
84
+				'length' => 512,
85
+			]);
86
+			$table->addColumn('messaging_profile_id', Types::STRING, [
87
+				'notnull' => true,
88
+				'length' => 512,
89
+			]);
90
+			$table->addColumn('nexapi_key', Types::STRING, [
91
+				'notnull' => true,
92
+				'length' => 512,
93
+			]);
94
+			$table->addColumn('nexapi_secret', Types::STRING, [
95
+				'notnull' => true,
96
+				'length' => 512,
97
+			]);
98
+			$table->addColumn('nexapi_url_rec', Types::STRING, [
99
+				'notnull' => true,
100
+				'length' => 512,
101
+			]);
102
+			$table->addColumn('nexapi_url', Types::STRING, [
103
+				'notnull' => true,
104
+				'length' => 512,
105
+			]);
106
+			$table->addColumn('twilapi_key', Types::STRING, [
107
+				'notnull' => true,
108
+				'length' => 512,
109
+			]);
110
+			$table->addColumn('twilapi_secret', Types::STRING, [
111
+				'notnull' => true,
112
+				'length' => 512,
113
+			]);
114
+			$table->addColumn('twilapi_url_rec', Types::STRING, [
115
+				'notnull' => true,
116
+				'length' => 512,
117
+			]);
118
+			$table->addColumn('twilapi_url', Types::STRING, [
119
+				'notnull' => true,
120
+				'length' => 512,
121
+			]);
122
+			$table->addColumn('flowapi_key', Types::STRING, [
123
+				'notnull' => true,
124
+				'length' => 512,
125
+			]);
126
+			$table->addColumn('flowapi_secret', Types::STRING, [
127
+				'notnull' => true,
128
+				'length' => 512,
129
+			]);
130
+			$table->addColumn('flowapi_url_rec', Types::STRING, [
131
+				'notnull' => true,
132
+				'length' => 512,
133
+			]);
134
+			$table->addColumn('flowapi_url', Types::STRING, [
135
+				'notnull' => true,
136
+				'length' => 512,
137
+			]);
138
+			$table->addColumn('tel_sender_name', Types::STRING, [
139
+				'notnull' => false,
140
+				'length' => 48,
141
+				'default' => '',
142
+			]);
143
+			$table->addColumn('nex_sender_name', Types::STRING, [
144
+				'notnull' => false,
145
+				'length' => 48,
146
+				'default' => '',
147
+			]);
148
+			$table->addColumn('twil_sender_name', Types::STRING, [
149
+				'notnull' => false,
150
+				'length' => 48,
151
+				'default' => '',
152
+			]);
153
+			$table->addColumn('flow_sender_name', Types::STRING, [
154
+				'notnull' => false,
155
+				'length' => 48,
156
+				'default' => '',
157
+			]);
158
+			$table->addColumn('messagesperpage', Types::INTEGER, [
159
+				'notnull' => false,
160
+				'length' => 11,
161
+                                'unsigned' => true,
162
+			]);
163
+			$table->addColumn('get_notify', Types::SMALLINT, [
164
+				'notnull' => false,
165
+				'length' => 1,
166
+			]);
167
+			$table->addColumn('notification_email', Types::STRING, [
168
+				'notnull' => false,
169
+				'length' => 512,
170
+				'default' => '',
171
+			]);
172
+			$table->addColumn('getsmsinemail', Types::SMALLINT, [
173
+				'notnull' => false,
174
+				'length' => 1,
175
+			]);
176
+			$table->addColumn('show_all_messages', Types::SMALLINT, [
177
+				'notnull' => false,
178
+				'length' => 1,
179
+			]);
180
+			$table->addColumn('show_display_names', Types::SMALLINT, [
181
+				'notnull' => false,
182
+				'length' => 1,
183
+			]);
184
+                        $table->setPrimaryKey(['id']);
185
+                        $table->addUniqueIndex(['id']);
186
+
187
+		}
188
+
189
+
190
+		if (!$schema->hasTable('sms_relent_received')) {
191
+			$table = $schema->createTable('sms_relent_received');
192
+			$table->addColumn('id', Types::BIGINT, [
193
+				'autoincrement' => true,
194
+				'notnull' => true,
195
+                                'length' => 11,
196
+                                'unsigned' => true,
197
+			]);
198
+			$table->addColumn('user_id', Types::STRING, [
199
+				'notnull' => true,
200
+				'length' => 64,
201
+			]);
202
+			$table->addColumn('message_id', Types::STRING, [
203
+				'notnull' => true,
204
+				'length' => 512,
205
+			]);
206
+			$table->addColumn('date', Types::DATETIME, [
207
+				'notnull' => true,
208
+			]);
209
+			$table->addColumn('from', Types::STRING, [
210
+				'notnull' => true,
211
+				'length' => 128,
212
+			]);
213
+			$table->addColumn('to', Types::STRING, [
214
+				'notnull' => true,
215
+				'length' => 128,
216
+			]);
217
+			$table->addColumn('message', Types::TEXT, [
218
+				'notnull' => false,
219
+				'default' => '',
220
+			]);
221
+			$table->addColumn('author_displayname', Types::STRING, [
222
+				'notnull' => true,
223
+				'length' => 255,
224
+			]);
225
+			$table->addColumn('internal_sender', Types::SMALLINT, [
226
+				'notnull' => false,
227
+				'length' => 1,
228
+			]);
229
+                        $table->setPrimaryKey(['id']);
230
+                        $table->addUniqueIndex(['id']);
231
+
232
+		}
233
+
234
+
235
+		if (!$schema->hasTable('sms_relent_sent')) {
236
+			$table = $schema->createTable('sms_relent_sent');
237
+			$table->addColumn('id', Types::BIGINT, [
238
+				'autoincrement' => true,
239
+				'notnull' => true,
240
+                                'length' => 11,
241
+                                'unsigned' => true,
242
+			]);
243
+			$table->addColumn('user_id', Types::STRING, [
244
+				'notnull' => true,
245
+				'length' => 64,
246
+			]);
247
+			$table->addColumn('message_id', Types::STRING, [
248
+				'notnull' => true,
249
+				'length' => 512,
250
+			]);
251
+			$table->addColumn('date', Types::DATETIME, [
252
+				'notnull' => true,
253
+			]);
254
+			$table->addColumn('from', Types::STRING, [
255
+				'notnull' => true,
256
+				'length' => 128,
257
+			]);
258
+			$table->addColumn('to', Types::STRING, [
259
+				'notnull' => true,
260
+				'length' => 128,
261
+			]);
262
+			$table->addColumn('network ', Types::STRING, [
263
+				'notnull' => false,
264
+				'length' => 64,
265
+				'default' => '',
266
+			]);
267
+			$table->addColumn('price', Types::STRING, [
268
+				'notnull' => false,
269
+				'length' => 64,
270
+				'default' => '',
271
+			]);
272
+			$table->addColumn('status', Types::STRING, [
273
+				'notnull' => false,
274
+				'length' => 512,
275
+				'default' => '',
276
+			]);
277
+			$table->addColumn('deliveryreceipt', Types::STRING, [
278
+				'notnull' => false,
279
+				'length' => 64,
280
+				'default' => '',
281
+			]);
282
+			$table->addColumn('message', Types::TEXT, [
283
+				'notnull' => false,
284
+                                'default' => '',
285
+			]);
286
+			$table->addColumn('author_displayname', Types::STRING, [
287
+				'notnull' => true,
288
+				'length' => 255,
289
+			]);
290
+                        $table->setPrimaryKey(['id']);
291
+                        $table->addUniqueIndex(['id']);
292
+
293
+		}
294
+
295
+
296
+		if (!$schema->hasTable('sms_relent_autorply')) {
297
+			$table = $schema->createTable('sms_relent_autorply');
298
+			$table->addColumn('id', Types::BIGINT, [
299
+				'autoincrement' => true,
300
+				'notnull' => true,
301
+                                'length' => 11,
302
+                                'unsigned' => true,
303
+			]);
304
+			$table->addColumn('user_id', Types::STRING, [
305
+				'notnull' => true,
306
+				'length' => 128,
307
+			]);
308
+			$table->addColumn('saved_by_dsplname', Types::STRING, [
309
+				'notnull' => true,
310
+				'length' => 255,
311
+			]);
312
+			$table->addColumn('phone_number', Types::STRING, [
313
+				'notnull' => true,
314
+				'length' => 128,
315
+			]);
316
+			$table->addColumn('days_of_week', Types::STRING, [
317
+				'notnull' => false,
318
+				'length' => 64,
319
+                                'default' => '',
320
+			]);
321
+			$table->addColumn('daily_start', Types::STRING, [
322
+				'notnull' => false,
323
+				'length' => 8,
324
+                                'default' => '',
325
+			]);
326
+			$table->addColumn('daily_end', Types::STRING, [
327
+				'notnull' => false,
328
+				'length' => 8,
329
+                                'default' => '',
330
+			]);
331
+			$table->addColumn('vacation_start', Types::DATETIME, [
332
+				'notnull' => false,
333
+			]);
334
+			$table->addColumn('vacation_end', Types::DATETIME, [
335
+				'notnull' => false,
336
+			]);
337
+			$table->addColumn('message_text', Types::TEXT, [
338
+				'notnull' => false,
339
+                                'default' => '',
340
+			]);
341
+                        $table->setPrimaryKey(['id']);
342
+                        $table->addUniqueIndex(['id']);
343
+
344
+		}
345
+
346
+
347
+		if (!$schema->hasTable('sms_relent_restrict')) {
348
+			$table = $schema->createTable('sms_relent_restrict');
349
+			$table->addColumn('id', Types::BIGINT, [
350
+				'autoincrement' => true,
351
+				'notnull' => true,
352
+                                'length' => 11,
353
+                                'unsigned' => true,
354
+			]);
355
+			$table->addColumn('user_id', Types::STRING, [
356
+				'notnull' => true,
357
+				'length' => 128,
358
+			]);
359
+			$table->addColumn('saved_by_dsplname', Types::STRING, [
360
+				'notnull' => true,
361
+				'length' => 255,
362
+			]);
363
+			$table->addColumn('phone_number', Types::STRING, [
364
+				'notnull' => true,
365
+				'length' => 128,
366
+			]);
367
+			$table->addColumn('groups', Types::STRING, [
368
+				'notnull' => true,
369
+				'length' => 2048,
370
+			]);
371
+			$table->addColumn('users', Types::STRING, [
372
+				'notnull' => true,
373
+				'length' => 2048,
374
+			]);
375
+                        $table->setPrimaryKey(['id']);
376
+                        $table->addUniqueIndex(['id']);
377
+
378
+		}
379
+
380
+		if (!$schema->hasTable('sms_relent_subac')) {
381
+			$table = $schema->createTable('sms_relent_subac');
382
+			$table->addColumn('id', Types::BIGINT, [
383
+				'autoincrement' => true,
384
+				'notnull' => true,
385
+                                'length' => 11,
386
+                                'unsigned' => true,
387
+			]);
388
+			$table->addColumn('user_id', Types::STRING, [
389
+				'notnull' => true,
390
+				'length' => 128,
391
+			]);
392
+			$table->addColumn('tnx_groups_allowed', Types::TEXT, [
393
+				'notnull' => false,
394
+                                'default' => '',
395
+			]);
396
+			$table->addColumn('tnx_users_allowed', Types::TEXT, [
397
+				'notnull' => false,
398
+                                'default' => '',
399
+			]);
400
+			$table->addColumn('plv_groups_allowed', Types::TEXT, [
401
+				'notnull' => false,
402
+                                'default' => '',
403
+			]);
404
+			$table->addColumn('plv_users_allowed', Types::TEXT, [
405
+				'notnull' => false,
406
+                                'default' => '',
407
+			]);
408
+			$table->addColumn('twl_groups_allowed', Types::TEXT, [
409
+				'notnull' => false,
410
+                                'default' => '',
411
+			]);
412
+			$table->addColumn('twl_users_allowed', Types::TEXT, [
413
+				'notnull' => false,
414
+                                'default' => '',
415
+			]);
416
+			$table->addColumn('flr_groups_allowed', Types::TEXT, [
417
+				'notnull' => false,
418
+                                'default' => '',
419
+			]);
420
+			$table->addColumn('flr_users_allowed', Types::TEXT, [
421
+				'notnull' => false,
422
+                                'default' => '',
423
+			]);
424
+                        $table->setPrimaryKey(['id']);
425
+                        $table->addUniqueIndex(['id']);
426
+		}
427
+
428
+
429
+		return $schema;
430
+	}
431
+
432
+        public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
433
+
434
+                // Enter the Nextcloud display name in the 'author_displayname' column of the 'sms_relent_sent' table, for messages that were sent before the upgrade
435
+                $getrecfromnb = $this->connection->prepare('SELECT `id`, `user_id` FROM `*PREFIX*sms_relent_sent`');
436
+	        $getrecfromnbres = $getrecfromnb->execute();
437
+
438
+                $recdatauids = [];
439
+                $idsent = [];
440
+                while ($rowfetched = $getrecfromnbres->fetch()) {
441
+                       $recdatauids[] = $rowfetched['user_id'];
442
+                       $idsent[] = $rowfetched['id'];
443
+                }
444
+                $getrecfromnbres->closeCursor();
445
+
446
+                if ($recdatauids) {
447
+
448
+                    $recuids = array_values(array_unique($recdatauids));
449
+                    $acdatausrdn = [];
450
+
451
+                    foreach ($recuids as $dnkey => $dnvalue) {
452
+		             $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
453
+			     $getacdatadnres = $getacdatadn->execute([$dnvalue, 'displayname']);
454
+
455
+			     while ($acusrdnfetched = $getacdatadnres->fetch()) {
456
+				    $acdatausrdn[$dnvalue] = $acusrdnfetched['value'];
457
+			     }
458
+			     $getacdatadnres->closeCursor();
459
+                    }
460
+
461
+                    foreach ($recdatauids as $pdpkey => $pdpvalue) {
462
+
463
+			     $updaterecms = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_sent` SET `author_displayname` = ? WHERE `user_id` = ? AND `id` = ?');
464
+			     $updaterecmsres = $updaterecms->execute([$acdatausrdn[$pdpvalue], $pdpvalue, $idsent[$pdpkey]]);
465
+			     $updaterecmsres->closeCursor();
466
+                    }
467
+                }
468
+
469
+
470
+                // Enter the Nextcloud display name in the 'author_displayname' column of the 'sms_relent_received' table, for messages that were received before the upgrade
471
+                $getrecfromnb = $this->connection->prepare('SELECT `id`, `date`, `from` FROM `*PREFIX*sms_relent_received`');
472
+	        $getrecfromnbres = $getrecfromnb->execute();
473
+
474
+                $recdatanmbrs = [];
475
+                $idsrc = [];
476
+                $daterec = [];
477
+                while ($rowfetched = $getrecfromnbres->fetch()) {
478
+                       $recdatanmbrs[] = $rowfetched['from'];
479
+                       $idsrc[] = $rowfetched['id'];
480
+                       $daterecarr = explode(":", $rowfetched['date']);
481
+                       $daterec[] = $daterecarr[0];
482
+                }
483
+                $getrecfromnbres->closeCursor();
484
+
485
+                if ($recdatanmbrs) {
486
+
487
+                    foreach ($recdatanmbrs as $rckey => $rcvalue) {
488
+
489
+			     // Search for the associated Display Name in the previous messages sent from the same phone number, in the 'sms_relent_sent' table
490
+			     $recmsgfromprc = '%' . $rcvalue;
491
+                             $recdataprc = $daterec[$rckey] . '%';
492
+			     $getdspnmst = $this->connection->prepare('SELECT `date`, `from`, `author_displayname` FROM `*PREFIX*sms_relent_sent` WHERE `from` LIKE ? AND `date` LIKE ?');
493
+			     $getdspnmstres = $getdspnmst->execute([$recmsgfromprc, $recdataprc]);
494
+
495
+			     $dispnamearr = [];
496
+			     while ($dspnmstfetched = $getdspnmstres->fetch()) {
497
+				    $dispnamearr[] = $dspnmstfetched['author_displayname'];
498
+			     }
499
+			     $getdspnmstres->closeCursor();
500
+
501
+			     if ($dispnamearr) {
502
+				 $descdspnmarr = array_reverse($dispnamearr);
503
+				 $authorDisplayNm = $descdspnmarr[0];
504
+				 $internalSender = 1;
505
+
506
+			     } else {
507
+
508
+                                 $authorDisplayNm = '';
509
+
510
+			         $getfrom = $this->connection->prepare('SELECT `from` FROM `*PREFIX*sms_relent_sent` WHERE `from` LIKE ? LIMIT 1');
511
+			         $getfromres = $getfrom->execute([$recmsgfromprc]);
512
+                                 $fromfetched = $getfromres->fetch();
513
+
514
+                                 if ($fromfetched) { $internalSender = 1; } else { $internalSender = 0; }
515
+
516
+
517
+				 // Search for the associated Display Name in the previous messages coming from the same phone number, in the 'sms_relent_received' table
518
+				 $getdspnm = $this->connection->prepare('SELECT `from`, `author_displayname` FROM `*PREFIX*sms_relent_received` WHERE `from` = ?');
519
+				 $getdspnmres = $getdspnm->execute([$rcvalue]);
520
+
521
+				 $dspnmearr = [];
522
+				 while ($dspnmfetched = $getdspnmres->fetch()) {
523
+				        if ($dspnmfetched['author_displayname']) {
524
+				            $dspnmearr[] = $dspnmfetched['author_displayname'];
525
+				        }
526
+				 }
527
+				 $getdspnmres->closeCursor();
528
+
529
+				 if ($dspnmearr) {
530
+				     $descdisplaynmarr = array_reverse($dspnmearr);
531
+				     $authorDisplayNm = $descdisplaynmarr[0];
532
+				 } else { $authorDisplayNm = ''; }
533
+			     }
534
+
535
+			     $updaterecms = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_received` SET `author_displayname` = ?, `internal_sender` = ?
536
+                                                                        WHERE `from` LIKE ? AND `id` = ?');
537
+			     $updaterecmsres = $updaterecms->execute([$authorDisplayNm, $internalSender, $recmsgfromprc, $idsrc[$rckey]]);
538
+			     $updaterecmsres->closeCursor();
539
+                    }
540
+                }
541
+
542
+                return null;
543
+        }
544
+
545
+}
0 546
new file mode 100644
... ...
@@ -0,0 +1,546 @@
1
+<?php
2
+/**
3
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
4
+ *
5
+ * @author Double Bastion LLC
6
+ *
7
+ * @license GNU AGPL version 3 or any later version
8
+ *
9
+ * This program is free software; you can redistribute it and/or
10
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
11
+ * License as published by the Free Software Foundation; either
12
+ * version 3 of the License, or any later version.
13
+ *
14
+ * This program is distributed in the hope that it will be useful,
15
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
18
+ *
19
+ * You should have received a copy of the GNU Affero General Public
20
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
+ *
22
+ */
23
+
24
+declare(strict_types=1);
25
+
26
+namespace OCA\SMSRelentless\Migration;
27
+
28
+use Closure;
29
+use OCP\DB\Types;
30
+use OCP\DB\ISchemaWrapper;
31
+use OCP\IDBConnection;
32
+use OCP\Migration\IOutput;
33
+use OCP\Migration\SimpleMigrationStep;
34
+
35
+
36
+class Version121Date20230523201743 extends SimpleMigrationStep {
37
+
38
+        /** @var IDBConnection */
39
+        private $connection;
40
+
41
+        /**
42
+         * @param IDBConnection $connection
43
+         */
44
+        public function __construct(IDBConnection $connection) {
45
+                $this->connection = $connection;
46
+        }
47
+
48
+	/**
49
+	 * @param IOutput $output
50
+	 * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
51
+	 * @param array $options
52
+	 * @return null|ISchemaWrapper
53
+	 */
54
+	public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
55
+		/** @var ISchemaWrapper $schema */
56
+		$schema = $schemaClosure();
57
+
58
+		if (!$schema->hasTable('sms_relent_settings')) {
59
+			$table = $schema->createTable('sms_relent_settings');
60
+			$table->addColumn('id', Types::BIGINT, [
61
+				'autoincrement' => true,
62
+				'notnull' => true,
63
+                                'length' => 11,
64
+                                'unsigned' => true,
65
+			]);
66
+			$table->addColumn('user_id', Types::STRING, [
67
+				'notnull' => true,
68
+				'length' => 128,
69
+			]);
70
+			$table->addColumn('telapi_key', Types::STRING, [
71
+				'notnull' => true,
72
+				'length' => 512,
73
+			]);
74
+			$table->addColumn('tel_pub_key', Types::STRING, [
75
+				'notnull' => true,
76
+				'length' => 512,
77
+			]);
78
+			$table->addColumn('telapi_url_rec', Types::STRING, [
79
+				'notnull' => true,
80
+				'length' => 512,
81
+			]);
82
+			$table->addColumn('telapi_url', Types::STRING, [
83
+				'notnull' => true,
84
+				'length' => 512,
85
+			]);
86
+			$table->addColumn('messaging_profile_id', Types::STRING, [
87
+				'notnull' => true,
88
+				'length' => 512,
89
+			]);
90
+			$table->addColumn('nexapi_key', Types::STRING, [
91
+				'notnull' => true,
92
+				'length' => 512,
93
+			]);
94
+			$table->addColumn('nexapi_secret', Types::STRING, [
95
+				'notnull' => true,
96
+				'length' => 512,
97
+			]);
98
+			$table->addColumn('nexapi_url_rec', Types::STRING, [
99
+				'notnull' => true,
100
+				'length' => 512,
101
+			]);
102
+			$table->addColumn('nexapi_url', Types::STRING, [
103
+				'notnull' => true,
104
+				'length' => 512,
105
+			]);
106
+			$table->addColumn('twilapi_key', Types::STRING, [
107
+				'notnull' => true,
108
+				'length' => 512,
109
+			]);
110
+			$table->addColumn('twilapi_secret', Types::STRING, [
111
+				'notnull' => true,
112
+				'length' => 512,
113
+			]);
114
+			$table->addColumn('twilapi_url_rec', Types::STRING, [
115
+				'notnull' => true,
116
+				'length' => 512,
117
+			]);
118
+			$table->addColumn('twilapi_url', Types::STRING, [
119
+				'notnull' => true,
120
+				'length' => 512,
121
+			]);
122
+			$table->addColumn('flowapi_key', Types::STRING, [
123
+				'notnull' => true,
124
+				'length' => 512,
125
+			]);
126
+			$table->addColumn('flowapi_secret', Types::STRING, [
127
+				'notnull' => true,
128
+				'length' => 512,
129
+			]);
130
+			$table->addColumn('flowapi_url_rec', Types::STRING, [
131
+				'notnull' => true,
132
+				'length' => 512,
133
+			]);
134
+			$table->addColumn('flowapi_url', Types::STRING, [
135
+				'notnull' => true,
136
+				'length' => 512,
137
+			]);
138
+			$table->addColumn('tel_sender_name', Types::STRING, [
139
+				'notnull' => false,
140
+				'length' => 48,
141
+				'default' => '',
142
+			]);
143
+			$table->addColumn('nex_sender_name', Types::STRING, [
144
+				'notnull' => false,
145
+				'length' => 48,
146
+				'default' => '',
147
+			]);
148
+			$table->addColumn('twil_sender_name', Types::STRING, [
149
+				'notnull' => false,
150
+				'length' => 48,
151
+				'default' => '',
152
+			]);
153
+			$table->addColumn('flow_sender_name', Types::STRING, [
154
+				'notnull' => false,
155
+				'length' => 48,
156
+				'default' => '',
157
+			]);
158
+			$table->addColumn('messagesperpage', Types::INTEGER, [
159
+				'notnull' => false,
160
+				'length' => 11,
161
+                                'unsigned' => true,
162
+			]);
163
+			$table->addColumn('get_notify', Types::SMALLINT, [
164
+				'notnull' => false,
165
+				'length' => 1,
166
+			]);
167
+			$table->addColumn('notification_email', Types::STRING, [
168
+				'notnull' => false,
169
+				'length' => 512,
170
+				'default' => '',
171
+			]);
172
+			$table->addColumn('getsmsinemail', Types::SMALLINT, [
173
+				'notnull' => false,
174
+				'length' => 1,
175
+			]);
176
+			$table->addColumn('show_all_messages', Types::SMALLINT, [
177
+				'notnull' => false,
178
+				'length' => 1,
179
+			]);
180
+			$table->addColumn('show_display_names', Types::SMALLINT, [
181
+				'notnull' => false,
182
+				'length' => 1,
183
+			]);
184
+                        $table->setPrimaryKey(['id']);
185
+                        $table->addUniqueIndex(['id']);
186
+
187
+		}
188
+
189
+
190
+		if (!$schema->hasTable('sms_relent_received')) {
191
+			$table = $schema->createTable('sms_relent_received');
192
+			$table->addColumn('id', Types::BIGINT, [
193
+				'autoincrement' => true,
194
+				'notnull' => true,
195
+                                'length' => 11,
196
+                                'unsigned' => true,
197
+			]);
198
+			$table->addColumn('user_id', Types::STRING, [
199
+				'notnull' => true,
200
+				'length' => 64,
201
+			]);
202
+			$table->addColumn('message_id', Types::STRING, [
203
+				'notnull' => true,
204
+				'length' => 512,
205
+			]);
206
+			$table->addColumn('date', Types::DATETIME, [
207
+				'notnull' => true,
208
+			]);
209
+			$table->addColumn('from', Types::STRING, [
210
+				'notnull' => true,
211
+				'length' => 128,
212
+			]);
213
+			$table->addColumn('to', Types::STRING, [
214
+				'notnull' => true,
215
+				'length' => 128,
216
+			]);
217
+			$table->addColumn('message', Types::TEXT, [
218
+				'notnull' => false,
219
+				'default' => '',
220
+			]);
221
+			$table->addColumn('author_displayname', Types::STRING, [
222
+				'notnull' => true,
223
+				'length' => 255,
224
+			]);
225
+			$table->addColumn('internal_sender', Types::SMALLINT, [
226
+				'notnull' => false,
227
+				'length' => 1,
228
+			]);
229
+                        $table->setPrimaryKey(['id']);
230
+                        $table->addUniqueIndex(['id']);
231
+
232
+		}
233
+
234
+
235
+		if (!$schema->hasTable('sms_relent_sent')) {
236
+			$table = $schema->createTable('sms_relent_sent');
237
+			$table->addColumn('id', Types::BIGINT, [
238
+				'autoincrement' => true,
239
+				'notnull' => true,
240
+                                'length' => 11,
241
+                                'unsigned' => true,
242
+			]);
243
+			$table->addColumn('user_id', Types::STRING, [
244
+				'notnull' => true,
245
+				'length' => 64,
246
+			]);
247
+			$table->addColumn('message_id', Types::STRING, [
248
+				'notnull' => true,
249
+				'length' => 512,
250
+			]);
251
+			$table->addColumn('date', Types::DATETIME, [
252
+				'notnull' => true,
253
+			]);
254
+			$table->addColumn('from', Types::STRING, [
255
+				'notnull' => true,
256
+				'length' => 128,
257
+			]);
258
+			$table->addColumn('to', Types::STRING, [
259
+				'notnull' => true,
260
+				'length' => 128,
261
+			]);
262
+			$table->addColumn('network ', Types::STRING, [
263
+				'notnull' => false,
264
+				'length' => 64,
265
+				'default' => '',
266
+			]);
267
+			$table->addColumn('price', Types::STRING, [
268
+				'notnull' => false,
269
+				'length' => 64,
270
+				'default' => '',
271
+			]);
272
+			$table->addColumn('status', Types::STRING, [
273
+				'notnull' => false,
274
+				'length' => 512,
275
+				'default' => '',
276
+			]);
277
+			$table->addColumn('deliveryreceipt', Types::STRING, [
278
+				'notnull' => false,
279
+				'length' => 64,
280
+				'default' => '',
281
+			]);
282
+			$table->addColumn('message', Types::TEXT, [
283
+				'notnull' => false,
284
+                                'default' => '',
285
+			]);
286
+			$table->addColumn('author_displayname', Types::STRING, [
287
+				'notnull' => true,
288
+				'length' => 255,
289
+			]);
290
+                        $table->setPrimaryKey(['id']);
291
+                        $table->addUniqueIndex(['id']);
292
+
293
+		}
294
+
295
+
296
+		if (!$schema->hasTable('sms_relent_autorply')) {
297
+			$table = $schema->createTable('sms_relent_autorply');
298
+			$table->addColumn('id', Types::BIGINT, [
299
+				'autoincrement' => true,
300
+				'notnull' => true,
301
+                                'length' => 11,
302
+                                'unsigned' => true,
303
+			]);
304
+			$table->addColumn('user_id', Types::STRING, [
305
+				'notnull' => true,
306
+				'length' => 128,
307
+			]);
308
+			$table->addColumn('saved_by_dsplname', Types::STRING, [
309
+				'notnull' => true,
310
+				'length' => 255,
311
+			]);
312
+			$table->addColumn('phone_number', Types::STRING, [
313
+				'notnull' => true,
314
+				'length' => 128,
315
+			]);
316
+			$table->addColumn('days_of_week', Types::STRING, [
317
+				'notnull' => false,
318
+				'length' => 64,
319
+                                'default' => '',
320
+			]);
321
+			$table->addColumn('daily_start', Types::STRING, [
322
+				'notnull' => false,
323
+				'length' => 8,
324
+                                'default' => '',
325
+			]);
326
+			$table->addColumn('daily_end', Types::STRING, [
327
+				'notnull' => false,
328
+				'length' => 8,
329
+                                'default' => '',
330
+			]);
331
+			$table->addColumn('vacation_start', Types::DATETIME, [
332
+				'notnull' => false,
333
+			]);
334
+			$table->addColumn('vacation_end', Types::DATETIME, [
335
+				'notnull' => false,
336
+			]);
337
+			$table->addColumn('message_text', Types::TEXT, [
338
+				'notnull' => false,
339
+                                'default' => '',
340
+			]);
341
+                        $table->setPrimaryKey(['id']);
342
+                        $table->addUniqueIndex(['id']);
343
+
344
+		}
345
+
346
+
347
+		if (!$schema->hasTable('sms_relent_restrict')) {
348
+			$table = $schema->createTable('sms_relent_restrict');
349
+			$table->addColumn('id', Types::BIGINT, [
350
+				'autoincrement' => true,
351
+				'notnull' => true,
352
+                                'length' => 11,
353
+                                'unsigned' => true,
354
+			]);
355
+			$table->addColumn('user_id', Types::STRING, [
356
+				'notnull' => true,
357
+				'length' => 128,
358
+			]);
359
+			$table->addColumn('saved_by_dsplname', Types::STRING, [
360
+				'notnull' => true,
361
+				'length' => 255,
362
+			]);
363
+			$table->addColumn('phone_number', Types::STRING, [
364
+				'notnull' => true,
365
+				'length' => 128,
366
+			]);
367
+			$table->addColumn('groups', Types::STRING, [
368
+				'notnull' => true,
369
+				'length' => 2048,
370
+			]);
371
+			$table->addColumn('users', Types::STRING, [
372
+				'notnull' => true,
373
+				'length' => 2048,
374
+			]);
375
+                        $table->setPrimaryKey(['id']);
376
+                        $table->addUniqueIndex(['id']);
377
+
378
+		}
379
+
380
+		if (!$schema->hasTable('sms_relent_subac')) {
381
+			$table = $schema->createTable('sms_relent_subac');
382
+			$table->addColumn('id', Types::BIGINT, [
383
+				'autoincrement' => true,
384
+				'notnull' => true,
385
+                                'length' => 11,
386
+                                'unsigned' => true,
387
+			]);
388
+			$table->addColumn('user_id', Types::STRING, [
389
+				'notnull' => true,
390
+				'length' => 128,
391
+			]);
392
+			$table->addColumn('tnx_groups_allowed', Types::TEXT, [
393
+				'notnull' => false,
394
+                                'default' => '',
395
+			]);
396
+			$table->addColumn('tnx_users_allowed', Types::TEXT, [
397
+				'notnull' => false,
398
+                                'default' => '',
399
+			]);
400
+			$table->addColumn('plv_groups_allowed', Types::TEXT, [
401
+				'notnull' => false,
402
+                                'default' => '',
403
+			]);
404
+			$table->addColumn('plv_users_allowed', Types::TEXT, [
405
+				'notnull' => false,
406
+                                'default' => '',
407
+			]);
408
+			$table->addColumn('twl_groups_allowed', Types::TEXT, [
409
+				'notnull' => false,
410
+                                'default' => '',
411
+			]);
412
+			$table->addColumn('twl_users_allowed', Types::TEXT, [
413
+				'notnull' => false,
414
+                                'default' => '',
415
+			]);
416
+			$table->addColumn('flr_groups_allowed', Types::TEXT, [
417
+				'notnull' => false,
418
+                                'default' => '',
419
+			]);
420
+			$table->addColumn('flr_users_allowed', Types::TEXT, [
421
+				'notnull' => false,
422
+                                'default' => '',
423
+			]);
424
+                        $table->setPrimaryKey(['id']);
425
+                        $table->addUniqueIndex(['id']);
426
+		}
427
+
428
+
429
+		return $schema;
430
+	}
431
+
432
+        public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
433
+
434
+
435
+                // Enter the Nextcloud display name in the 'author_displayname' column of the 'sms_relent_sent' table, for messages that were sent before the upgrade
436
+                $getrecfromnb = $this->connection->prepare('SELECT `id`, `user_id` FROM `*PREFIX*sms_relent_sent`');
437
+	        $getrecfromnbres = $getrecfromnb->execute();
438
+
439
+                $recdatauids = [];
440
+                $idsent = [];
441
+                while ($rowfetched = $getrecfromnbres->fetch()) {
442
+                       $recdatauids[] = $rowfetched['user_id'];
443
+                       $idsent[] = $rowfetched['id'];
444
+                }
445
+                $getrecfromnbres->closeCursor();
446
+
447
+                if ($recdatauids) {
448
+
449
+                    $recuids = array_values(array_unique($recdatauids));
450
+                    $acdatausrdn = [];
451
+
452
+                    foreach ($recuids as $dnkey => $dnvalue) {
453
+		             $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
454
+			     $getacdatadnres = $getacdatadn->execute([$dnvalue, 'displayname']);
455
+
456
+			     while ($acusrdnfetched = $getacdatadnres->fetch()) {
457
+				    $acdatausrdn[$dnvalue] = $acusrdnfetched['value'];
458
+			     }
459
+			     $getacdatadnres->closeCursor();
460
+                    }
461
+
462
+                    foreach ($recdatauids as $pdpkey => $pdpvalue) {
463
+
464
+			     $updaterecms = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_sent` SET `author_displayname` = ? WHERE `user_id` = ? AND `id` = ?');
465
+			     $updaterecmsres = $updaterecms->execute([$acdatausrdn[$pdpvalue], $pdpvalue, $idsent[$pdpkey]]);
466
+			     $updaterecmsres->closeCursor();
467
+                    }
468
+                }
469
+
470
+
471
+                // Enter the Nextcloud display name in the 'author_displayname' column of the 'sms_relent_received' table, for messages that were received before the upgrade
472
+                $getrecfromnb = $this->connection->prepare('SELECT `id`, `date`, `from` FROM `*PREFIX*sms_relent_received`');
473
+	        $getrecfromnbres = $getrecfromnb->execute();
474
+
475
+                $recdatanmbrs = [];
476
+                $idsrc = [];
477
+                $daterec = [];
478
+                while ($rowfetched = $getrecfromnbres->fetch()) {
479
+                       $recdatanmbrs[] = $rowfetched['from'];
480
+                       $idsrc[] = $rowfetched['id'];
481
+                       $daterecarr = explode(":", $rowfetched['date']);
482
+                       $daterec[] = $daterecarr[0];
483
+                }
484
+                $getrecfromnbres->closeCursor();
485
+
486
+                if ($recdatanmbrs) {
487
+
488
+                    foreach ($recdatanmbrs as $rckey => $rcvalue) {
489
+
490
+			     // Search for the associated Display Name in the previous messages sent from the same phone number, in the 'sms_relent_sent' table
491
+			     $recmsgfromprc = '%' . $rcvalue;
492
+                             $recdataprc = $daterec[$rckey] . '%';
493
+			     $getdspnmst = $this->connection->prepare('SELECT `date`, `from`, `author_displayname` FROM `*PREFIX*sms_relent_sent` WHERE `from` LIKE ? AND `date` LIKE ?');
494
+			     $getdspnmstres = $getdspnmst->execute([$recmsgfromprc, $recdataprc]);
495
+
496
+			     $dispnamearr = [];
497
+			     while ($dspnmstfetched = $getdspnmstres->fetch()) {
498
+				    $dispnamearr[] = $dspnmstfetched['author_displayname'];
499
+			     }
500
+			     $getdspnmstres->closeCursor();
501
+
502
+			     if ($dispnamearr) {
503
+				 $descdspnmarr = array_reverse($dispnamearr);
504
+				 $authorDisplayNm = $descdspnmarr[0];
505
+				 $internalSender = 1;
506
+
507
+			     } else {
508
+
509
+                                 $authorDisplayNm = '';
510
+
511
+			         $getfrom = $this->connection->prepare('SELECT `from` FROM `*PREFIX*sms_relent_sent` WHERE `from` LIKE ? LIMIT 1');
512
+			         $getfromres = $getfrom->execute([$recmsgfromprc]);
513
+                                 $fromfetched = $getfromres->fetch();
514
+
515
+                                 if ($fromfetched) { $internalSender = 1; } else { $internalSender = 0; }
516
+
517
+
518
+				 // Search for the associated Display Name in the previous messages coming from the same phone number, in the 'sms_relent_received' table
519
+				 $getdspnm = $this->connection->prepare('SELECT `from`, `author_displayname` FROM `*PREFIX*sms_relent_received` WHERE `from` = ?');
520
+				 $getdspnmres = $getdspnm->execute([$rcvalue]);
521
+
522
+				 $dspnmearr = [];
523
+				 while ($dspnmfetched = $getdspnmres->fetch()) {
524
+				        if ($dspnmfetched['author_displayname']) {
525
+				            $dspnmearr[] = $dspnmfetched['author_displayname'];
526
+				        }
527
+				 }
528
+				 $getdspnmres->closeCursor();
529
+
530
+				 if ($dspnmearr) {
531
+				     $descdisplaynmarr = array_reverse($dspnmearr);
532
+				     $authorDisplayNm = $descdisplaynmarr[0];
533
+				 } else { $authorDisplayNm = ''; }
534
+			     }
535
+
536
+			     $updaterecms = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_received` SET `author_displayname` = ?, `internal_sender` = ?
537
+                                                                        WHERE `from` LIKE ? AND `id` = ?');
538
+			     $updaterecmsres = $updaterecms->execute([$authorDisplayNm, $internalSender, $recmsgfromprc, $idsrc[$rckey]]);
539
+			     $updaterecmsres->closeCursor();
540
+                    }
541
+                }
542
+
543
+                return null;
544
+        }
545
+
546
+}
0 547
new file mode 100644
... ...
@@ -0,0 +1,546 @@
1
+<?php
2
+/**
3
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
4
+ *
5
+ * @author Double Bastion LLC
6
+ *
7
+ * @license GNU AGPL version 3 or any later version
8
+ *
9
+ * This program is free software; you can redistribute it and/or
10
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
11
+ * License as published by the Free Software Foundation; either
12
+ * version 3 of the License, or any later version.
13
+ *
14
+ * This program is distributed in the hope that it will be useful,
15
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
18
+ *
19
+ * You should have received a copy of the GNU Affero General Public
20
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
+ *
22
+ */
23
+
24
+declare(strict_types=1);
25
+
26
+namespace OCA\SMSRelentless\Migration;
27
+
28
+use Closure;
29
+use OCP\DB\Types;
30
+use OCP\DB\ISchemaWrapper;
31
+use OCP\IDBConnection;
32
+use OCP\Migration\IOutput;
33
+use OCP\Migration\SimpleMigrationStep;
34
+
35
+
36
+class Version123Date20230524182156 extends SimpleMigrationStep {
37
+
38
+        /** @var IDBConnection */
39
+        private $connection;
40
+
41
+        /**
42
+         * @param IDBConnection $connection
43
+         */
44
+        public function __construct(IDBConnection $connection) {
45
+                $this->connection = $connection;
46
+        }
47
+
48
+	/**
49
+	 * @param IOutput $output
50
+	 * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
51
+	 * @param array $options
52
+	 * @return null|ISchemaWrapper
53
+	 */
54
+	public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
55
+		/** @var ISchemaWrapper $schema */
56
+		$schema = $schemaClosure();
57
+
58
+		if (!$schema->hasTable('sms_relent_settings')) {
59
+			$table = $schema->createTable('sms_relent_settings');
60
+			$table->addColumn('id', Types::BIGINT, [
61
+				'autoincrement' => true,
62
+				'notnull' => true,
63
+                                'length' => 11,
64
+                                'unsigned' => true,
65
+			]);
66
+			$table->addColumn('user_id', Types::STRING, [
67
+				'notnull' => true,
68
+				'length' => 128,
69
+			]);
70
+			$table->addColumn('telapi_key', Types::STRING, [
71
+				'notnull' => true,
72
+				'length' => 512,
73
+			]);
74
+			$table->addColumn('tel_pub_key', Types::STRING, [
75
+				'notnull' => true,
76
+				'length' => 512,
77
+			]);
78
+			$table->addColumn('telapi_url_rec', Types::STRING, [
79
+				'notnull' => true,
80
+				'length' => 512,
81
+			]);
82
+			$table->addColumn('telapi_url', Types::STRING, [
83
+				'notnull' => true,
84
+				'length' => 512,
85
+			]);
86
+			$table->addColumn('messaging_profile_id', Types::STRING, [
87
+				'notnull' => true,
88
+				'length' => 512,
89
+			]);
90
+			$table->addColumn('nexapi_key', Types::STRING, [
91
+				'notnull' => true,
92
+				'length' => 512,
93
+			]);
94
+			$table->addColumn('nexapi_secret', Types::STRING, [
95
+				'notnull' => true,
96
+				'length' => 512,
97
+			]);
98
+			$table->addColumn('nexapi_url_rec', Types::STRING, [
99
+				'notnull' => true,
100
+				'length' => 512,
101
+			]);
102
+			$table->addColumn('nexapi_url', Types::STRING, [
103
+				'notnull' => true,
104
+				'length' => 512,
105
+			]);
106
+			$table->addColumn('twilapi_key', Types::STRING, [
107
+				'notnull' => true,
108
+				'length' => 512,
109
+			]);
110
+			$table->addColumn('twilapi_secret', Types::STRING, [
111
+				'notnull' => true,
112
+				'length' => 512,
113
+			]);
114
+			$table->addColumn('twilapi_url_rec', Types::STRING, [
115
+				'notnull' => true,
116
+				'length' => 512,
117
+			]);
118
+			$table->addColumn('twilapi_url', Types::STRING, [
119
+				'notnull' => true,
120
+				'length' => 512,
121
+			]);
122
+			$table->addColumn('flowapi_key', Types::STRING, [
123
+				'notnull' => true,
124
+				'length' => 512,
125
+			]);
126
+			$table->addColumn('flowapi_secret', Types::STRING, [
127
+				'notnull' => true,
128
+				'length' => 512,
129
+			]);
130
+			$table->addColumn('flowapi_url_rec', Types::STRING, [
131
+				'notnull' => true,
132
+				'length' => 512,
133
+			]);
134
+			$table->addColumn('flowapi_url', Types::STRING, [
135
+				'notnull' => true,
136
+				'length' => 512,
137
+			]);
138
+			$table->addColumn('tel_sender_name', Types::STRING, [
139
+				'notnull' => false,
140
+				'length' => 48,
141
+				'default' => '',
142
+			]);
143
+			$table->addColumn('nex_sender_name', Types::STRING, [
144
+				'notnull' => false,
145
+				'length' => 48,
146
+				'default' => '',
147
+			]);
148
+			$table->addColumn('twil_sender_name', Types::STRING, [
149
+				'notnull' => false,
150
+				'length' => 48,
151
+				'default' => '',
152
+			]);
153
+			$table->addColumn('flow_sender_name', Types::STRING, [
154
+				'notnull' => false,
155
+				'length' => 48,
156
+				'default' => '',
157
+			]);
158
+			$table->addColumn('messagesperpage', Types::INTEGER, [
159
+				'notnull' => false,
160
+				'length' => 11,
161
+                                'unsigned' => true,
162
+			]);
163
+			$table->addColumn('get_notify', Types::SMALLINT, [
164
+				'notnull' => false,
165
+				'length' => 1,
166
+			]);
167
+			$table->addColumn('notification_email', Types::STRING, [
168
+				'notnull' => false,
169
+				'length' => 512,
170
+				'default' => '',
171
+			]);
172
+			$table->addColumn('getsmsinemail', Types::SMALLINT, [
173
+				'notnull' => false,
174
+				'length' => 1,
175
+			]);
176
+			$table->addColumn('show_all_messages', Types::SMALLINT, [
177
+				'notnull' => false,
178
+				'length' => 1,
179
+			]);
180
+			$table->addColumn('show_display_names', Types::SMALLINT, [
181
+				'notnull' => false,
182
+				'length' => 1,
183
+			]);
184
+                        $table->setPrimaryKey(['id']);
185
+                        $table->addUniqueIndex(['id']);
186
+
187
+		}
188
+
189
+
190
+		if (!$schema->hasTable('sms_relent_received')) {
191
+			$table = $schema->createTable('sms_relent_received');
192
+			$table->addColumn('id', Types::BIGINT, [
193
+				'autoincrement' => true,
194
+				'notnull' => true,
195
+                                'length' => 11,
196
+                                'unsigned' => true,
197
+			]);
198
+			$table->addColumn('user_id', Types::STRING, [
199
+				'notnull' => true,
200
+				'length' => 64,
201
+			]);
202
+			$table->addColumn('message_id', Types::STRING, [
203
+				'notnull' => true,
204
+				'length' => 512,
205
+			]);
206
+			$table->addColumn('date', Types::DATETIME, [
207
+				'notnull' => true,
208
+			]);
209
+			$table->addColumn('from', Types::STRING, [
210
+				'notnull' => true,
211
+				'length' => 128,
212
+			]);
213
+			$table->addColumn('to', Types::STRING, [
214
+				'notnull' => true,
215
+				'length' => 128,
216
+			]);
217
+			$table->addColumn('message', Types::TEXT, [
218
+				'notnull' => false,
219
+				'default' => '',
220
+			]);
221
+			$table->addColumn('author_displayname', Types::STRING, [
222
+				'notnull' => true,
223
+				'length' => 255,
224
+			]);
225
+			$table->addColumn('internal_sender', Types::SMALLINT, [
226
+				'notnull' => false,
227
+				'length' => 1,
228
+			]);
229
+                        $table->setPrimaryKey(['id']);
230
+                        $table->addUniqueIndex(['id']);
231
+
232
+		}
233
+
234
+
235
+		if (!$schema->hasTable('sms_relent_sent')) {
236
+			$table = $schema->createTable('sms_relent_sent');
237
+			$table->addColumn('id', Types::BIGINT, [
238
+				'autoincrement' => true,
239
+				'notnull' => true,
240
+                                'length' => 11,
241
+                                'unsigned' => true,
242
+			]);
243
+			$table->addColumn('user_id', Types::STRING, [
244
+				'notnull' => true,
245
+				'length' => 64,
246
+			]);
247
+			$table->addColumn('message_id', Types::STRING, [
248
+				'notnull' => true,
249
+				'length' => 512,
250
+			]);
251
+			$table->addColumn('date', Types::DATETIME, [
252
+				'notnull' => true,
253
+			]);
254
+			$table->addColumn('from', Types::STRING, [
255
+				'notnull' => true,
256
+				'length' => 128,
257
+			]);
258
+			$table->addColumn('to', Types::STRING, [
259
+				'notnull' => true,
260
+				'length' => 128,
261
+			]);
262
+			$table->addColumn('network ', Types::STRING, [
263
+				'notnull' => false,
264
+				'length' => 64,
265
+				'default' => '',
266
+			]);
267
+			$table->addColumn('price', Types::STRING, [
268
+				'notnull' => false,
269
+				'length' => 64,
270
+				'default' => '',
271
+			]);
272
+			$table->addColumn('status', Types::STRING, [
273
+				'notnull' => false,
274
+				'length' => 512,
275
+				'default' => '',
276
+			]);
277
+			$table->addColumn('deliveryreceipt', Types::STRING, [
278
+				'notnull' => false,
279
+				'length' => 64,
280
+				'default' => '',
281
+			]);
282
+			$table->addColumn('message', Types::TEXT, [
283
+				'notnull' => false,
284
+                                'default' => '',
285
+			]);
286
+			$table->addColumn('author_displayname', Types::STRING, [
287
+				'notnull' => true,
288
+				'length' => 255,
289
+			]);
290
+                        $table->setPrimaryKey(['id']);
291
+                        $table->addUniqueIndex(['id']);
292
+
293
+		}
294
+
295
+
296
+		if (!$schema->hasTable('sms_relent_autorply')) {
297
+			$table = $schema->createTable('sms_relent_autorply');
298
+			$table->addColumn('id', Types::BIGINT, [
299
+				'autoincrement' => true,
300
+				'notnull' => true,
301
+                                'length' => 11,
302
+                                'unsigned' => true,
303
+			]);
304
+			$table->addColumn('user_id', Types::STRING, [
305
+				'notnull' => true,
306
+				'length' => 128,
307
+			]);
308
+			$table->addColumn('saved_by_dsplname', Types::STRING, [
309
+				'notnull' => true,
310
+				'length' => 255,
311
+			]);
312
+			$table->addColumn('phone_number', Types::STRING, [
313
+				'notnull' => true,
314
+				'length' => 128,
315
+			]);
316
+			$table->addColumn('days_of_week', Types::STRING, [
317
+				'notnull' => false,
318
+				'length' => 64,
319
+                                'default' => '',
320
+			]);
321
+			$table->addColumn('daily_start', Types::STRING, [
322
+				'notnull' => false,
323
+				'length' => 8,
324
+                                'default' => '',
325
+			]);
326
+			$table->addColumn('daily_end', Types::STRING, [
327
+				'notnull' => false,
328
+				'length' => 8,
329
+                                'default' => '',
330
+			]);
331
+			$table->addColumn('vacation_start', Types::DATETIME, [
332
+				'notnull' => false,
333
+			]);
334
+			$table->addColumn('vacation_end', Types::DATETIME, [
335
+				'notnull' => false,
336
+			]);
337
+			$table->addColumn('message_text', Types::TEXT, [
338
+				'notnull' => false,
339
+                                'default' => '',
340
+			]);
341
+                        $table->setPrimaryKey(['id']);
342
+                        $table->addUniqueIndex(['id']);
343
+
344
+		}
345
+
346
+
347
+		if (!$schema->hasTable('sms_relent_restrict')) {
348
+			$table = $schema->createTable('sms_relent_restrict');
349
+			$table->addColumn('id', Types::BIGINT, [
350
+				'autoincrement' => true,
351
+				'notnull' => true,
352
+                                'length' => 11,
353
+                                'unsigned' => true,
354
+			]);
355
+			$table->addColumn('user_id', Types::STRING, [
356
+				'notnull' => true,
357
+				'length' => 128,
358
+			]);
359
+			$table->addColumn('saved_by_dsplname', Types::STRING, [
360
+				'notnull' => true,
361
+				'length' => 255,
362
+			]);
363
+			$table->addColumn('phone_number', Types::STRING, [
364
+				'notnull' => true,
365
+				'length' => 128,
366
+			]);
367
+			$table->addColumn('groups', Types::STRING, [
368
+				'notnull' => true,
369
+				'length' => 2048,
370
+			]);
371
+			$table->addColumn('users', Types::STRING, [
372
+				'notnull' => true,
373
+				'length' => 2048,
374
+			]);
375
+                        $table->setPrimaryKey(['id']);
376
+                        $table->addUniqueIndex(['id']);
377
+
378
+		}
379
+
380
+		if (!$schema->hasTable('sms_relent_subac')) {
381
+			$table = $schema->createTable('sms_relent_subac');
382
+			$table->addColumn('id', Types::BIGINT, [
383
+				'autoincrement' => true,
384
+				'notnull' => true,
385
+                                'length' => 11,
386
+                                'unsigned' => true,
387
+			]);
388
+			$table->addColumn('user_id', Types::STRING, [
389
+				'notnull' => true,
390
+				'length' => 128,
391
+			]);
392
+			$table->addColumn('tnx_groups_allowed', Types::TEXT, [
393
+				'notnull' => false,
394
+                                'default' => '',
395
+			]);
396
+			$table->addColumn('tnx_users_allowed', Types::TEXT, [
397
+				'notnull' => false,
398
+                                'default' => '',
399
+			]);
400
+			$table->addColumn('plv_groups_allowed', Types::TEXT, [
401
+				'notnull' => false,
402
+                                'default' => '',
403
+			]);
404
+			$table->addColumn('plv_users_allowed', Types::TEXT, [
405
+				'notnull' => false,
406
+                                'default' => '',
407
+			]);
408
+			$table->addColumn('twl_groups_allowed', Types::TEXT, [
409
+				'notnull' => false,
410
+                                'default' => '',
411
+			]);
412
+			$table->addColumn('twl_users_allowed', Types::TEXT, [
413
+				'notnull' => false,
414
+                                'default' => '',
415
+			]);
416
+			$table->addColumn('flr_groups_allowed', Types::TEXT, [
417
+				'notnull' => false,
418
+                                'default' => '',
419
+			]);
420
+			$table->addColumn('flr_users_allowed', Types::TEXT, [
421
+				'notnull' => false,
422
+                                'default' => '',
423
+			]);
424
+                        $table->setPrimaryKey(['id']);
425
+                        $table->addUniqueIndex(['id']);
426
+		}
427
+
428
+
429
+		return $schema;
430
+	}
431
+
432
+        public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
433
+
434
+
435
+                // Enter the Nextcloud display name in the 'author_displayname' column of the 'sms_relent_sent' table, for messages that were sent before the upgrade
436
+                $getrecfromnb = $this->connection->prepare('SELECT `id`, `user_id` FROM `*PREFIX*sms_relent_sent`');
437
+	        $getrecfromnbres = $getrecfromnb->execute();
438
+
439
+                $recdatauids = [];
440
+                $idsent = [];
441
+                while ($rowfetched = $getrecfromnbres->fetch()) {
442
+                       $recdatauids[] = $rowfetched['user_id'];
443
+                       $idsent[] = $rowfetched['id'];
444
+                }
445
+                $getrecfromnbres->closeCursor();
446
+
447
+                if ($recdatauids) {
448
+
449
+                    $recuids = array_values(array_unique($recdatauids));
450
+                    $acdatausrdn = [];
451
+
452
+                    foreach ($recuids as $dnkey => $dnvalue) {
453
+		             $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
454
+			     $getacdatadnres = $getacdatadn->execute([$dnvalue, 'displayname']);
455
+
456
+			     while ($acusrdnfetched = $getacdatadnres->fetch()) {
457
+				    $acdatausrdn[$dnvalue] = $acusrdnfetched['value'];
458
+			     }
459
+			     $getacdatadnres->closeCursor();
460
+                    }
461
+
462
+                    foreach ($recdatauids as $pdpkey => $pdpvalue) {
463
+
464
+			     $updaterecms = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_sent` SET `author_displayname` = ? WHERE `user_id` = ? AND `id` = ?');
465
+			     $updaterecmsres = $updaterecms->execute([$acdatausrdn[$pdpvalue], $pdpvalue, $idsent[$pdpkey]]);
466
+			     $updaterecmsres->closeCursor();
467
+                    }
468
+                }
469
+
470
+
471
+                // Enter the Nextcloud display name in the 'author_displayname' column of the 'sms_relent_received' table, for messages that were received before the upgrade
472
+                $getrecfromnb = $this->connection->prepare('SELECT `id`, `date`, `from` FROM `*PREFIX*sms_relent_received`');
473
+	        $getrecfromnbres = $getrecfromnb->execute();
474
+
475
+                $recdatanmbrs = [];
476
+                $idsrc = [];
477
+                $daterec = [];
478
+                while ($rowfetched = $getrecfromnbres->fetch()) {
479
+                       $recdatanmbrs[] = $rowfetched['from'];
480
+                       $idsrc[] = $rowfetched['id'];
481
+                       $daterecarr = explode(":", $rowfetched['date']);
482
+                       $daterec[] = $daterecarr[0];
483
+                }
484
+                $getrecfromnbres->closeCursor();
485
+
486
+                if ($recdatanmbrs) {
487
+
488
+                    foreach ($recdatanmbrs as $rckey => $rcvalue) {
489
+
490
+			     // Search for the associated Display Name in the previous messages sent from the same phone number, in the 'sms_relent_sent' table
491
+			     $recmsgfromprc = '%' . $rcvalue;
492
+                             $recdataprc = $daterec[$rckey] . '%';
493
+			     $getdspnmst = $this->connection->prepare('SELECT `date`, `from`, `author_displayname` FROM `*PREFIX*sms_relent_sent` WHERE `from` LIKE ? AND `date` LIKE ?');
494
+			     $getdspnmstres = $getdspnmst->execute([$recmsgfromprc, $recdataprc]);
495
+
496
+			     $dispnamearr = [];
497
+			     while ($dspnmstfetched = $getdspnmstres->fetch()) {
498
+				    $dispnamearr[] = $dspnmstfetched['author_displayname'];
499
+			     }
500
+			     $getdspnmstres->closeCursor();
501
+
502
+			     if ($dispnamearr) {
503
+				 $descdspnmarr = array_reverse($dispnamearr);
504
+				 $authorDisplayNm = $descdspnmarr[0];
505
+				 $internalSender = 1;
506
+
507
+			     } else {
508
+
509
+                                 $authorDisplayNm = '';
510
+
511
+			         $getfrom = $this->connection->prepare('SELECT `from` FROM `*PREFIX*sms_relent_sent` WHERE `from` LIKE ? LIMIT 1');
512
+			         $getfromres = $getfrom->execute([$recmsgfromprc]);
513
+                                 $fromfetched = $getfromres->fetch();
514
+
515
+                                 if ($fromfetched) { $internalSender = 1; } else { $internalSender = 0; }
516
+
517
+
518
+				 // Search for the associated Display Name in the previous messages coming from the same phone number, in the 'sms_relent_received' table
519
+				 $getdspnm = $this->connection->prepare('SELECT `from`, `author_displayname` FROM `*PREFIX*sms_relent_received` WHERE `from` = ?');
520
+				 $getdspnmres = $getdspnm->execute([$rcvalue]);
521
+
522
+				 $dspnmearr = [];
523
+				 while ($dspnmfetched = $getdspnmres->fetch()) {
524
+				        if ($dspnmfetched['author_displayname']) {
525
+				            $dspnmearr[] = $dspnmfetched['author_displayname'];
526
+				        }
527
+				 }
528
+				 $getdspnmres->closeCursor();
529
+
530
+				 if ($dspnmearr) {
531
+				     $descdisplaynmarr = array_reverse($dspnmearr);
532
+				     $authorDisplayNm = $descdisplaynmarr[0];
533
+				 } else { $authorDisplayNm = ''; }
534
+			     }
535
+
536
+			     $updaterecms = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_received` SET `author_displayname` = ?, `internal_sender` = ?
537
+                                                                        WHERE `from` LIKE ? AND `id` = ?');
538
+			     $updaterecmsres = $updaterecms->execute([$authorDisplayNm, $internalSender, $recmsgfromprc, $idsrc[$rckey]]);
539
+			     $updaterecmsres->closeCursor();
540
+                    }
541
+                }
542
+
543
+                return null;
544
+        }
545
+
546
+}