Browse code

added CHANGELOG.txt appinfo/info.xml appinfo/signature.json css/style.css js/settings.js lib/Service/SmsrelentlessService.php lib/Controller/AuthorApiController.php templates/settings/admin.php

DoubleBastionAdmin authored on 03/11/2023 19:56:13
Showing 8 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,147 @@
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.
113
+
114
+== 1.2.4 - 2023-5-30 ==
115
+* Fixed MMS files domain problem.
116
+* Made MMS URLs clickable.
117
+* Added refresh button for messages in pop-up windows.
118
+
119
+== 1.2.5 - 2023-6-3 ==
120
+* Fixed incoming MMS issue.
121
+* Added checkbox on Settings page to allow users to include their display names in the text
122
+  of the message itself.
123
+
124
+== 1.2.6 - 2023-6-22 ==
125
+* Fixed messages display issue for non-admins.
126
+* Fixed how non-admins are able to see the messages sent/received from/to the numbers that are
127
+  shared with them but not restricted to them.
128
+
129
+== 1.2.7 - 2023-7-15 ==
130
+* Fixed alert messages issue.
131
+* Fixed text color for dark themes.
132
+* Added 'full-day' exception to auto-reply.
133
+* Added auto-refresh button on received/sent messages pages.
134
+
135
+== 1.2.8 - 2023-10-30 ==
136
+* Changed main screenshot and modified presentation text.
137
+* Changed text on Settings page.
138
+* Marked the app as compatible with Nextcloud 27.
139
+
140
+== 1.2.9 - 2023-11-1 ==
141
+* Changed how the app sends notifications for incoming messages.
142
+
143
+== 1.3.0 - 2023-11-3 ==
144
+* Changed notifications mechanism so that non-admin users receive notifications 
145
+  for messages received on phone numbers shared with them.
146
+* Fixed bug related to listing received messages for non-admin users.
147
+* Minor text modifications on the settings pages.
0 148
new file mode 100644
... ...
@@ -0,0 +1,89 @@
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. Detailed instructions on how to configure and use this application can be found on the 'Admin documentation' page.
10
+
11
+### Features:
12
+
13
+* 🚀 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.
14
+
15
+* 📑 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.
16
+
17
+* 🖼️  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.
18
+
19
+* 📔 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.
20
+
21
+* 💻 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.
22
+
23
+* 👤 The Display Name of Nextcloud users can be prepended to their messages, to make the origin of messages clearer.
24
+
25
+* ⚠️  Admins can restrict the use of specific phone numbers to specific groups or users.
26
+
27
+* ✉️  Auto-replies in 'daily mode' and 'vacation mode' can be configured for any controlled phone number.
28
+
29
+* 🔏 SMS/MMS messages coming from Telnyx, Plivo and Twilio are checked for authenticity by verifying the SMS provider's signature.
30
+
31
+* 📧 Users receive notifications in Nextcloud and (optionally) emails when new SMS/MMS messages arrive.
32
+
33
+* 📄 Each sent message receives a delivery receipt displayed in the Sent SMS Messages table.
34
+
35
+* 📱 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. 
36
+
37
+* 💵 It allows checking the current Telnyx/Plivo/Twilio balance by selecting the provider on the left panel.
38
+
39
+* 💰 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.
40
+
41
+* 💸 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.
42
+
43
+We have no affiliation with Telnyx, Plivo, Twilio or Flowroute.
44
+
45
+### Documentation
46
+
47
+* [Admin documentation](https://www.doublebastion.com/install-nextcloud/#install-sms-relentless)
48
+
49
+### Donations
50
+
51
+* 🎁 [Donate](https://www.doublebastion.com/donations/)
52
+
53
+    ]]></description>
54
+    <version>1.3.0</version>
55
+    <licence>AGPL</licence>
56
+    <author mail="contact@doublebastion.com">Double Bastion LLC</author>
57
+    <namespace>SMSRelentless</namespace>
58
+	<documentation>
59
+		<admin>https://www.doublebastion.com/install-nextcloud/#install-sms-relentless</admin>
60
+	</documentation>
61
+    <category>office</category>
62
+    <category>organization</category>
63
+
64
+    <website>https://www.doublebastion.com/sms-relentless/</website>
65
+    <bugs>https://git.doublebastion.com/sms-relentless/issues/develop</bugs>
66
+    <repository>https://git.doublebastion.com/sms-relentless/develop/</repository>
67
+
68
+    <screenshot>https://git.doublebastion.com/sms-relentless/raw/develop/img/sms_relentless_screenshot.png</screenshot>
69
+
70
+    <dependencies>
71
+            <nextcloud min-version="26" max-version="27" />
72
+    </dependencies>
73
+
74
+    <navigations>
75
+        <navigation>
76
+            <name>SMS Relentless</name>
77
+            <route>sms_relentless.page.index</route>
78
+            <order>102</order>
79
+            <icon>../img/sms_relentless.svg</icon>
80
+        </navigation>
81
+    </navigations>
82
+
83
+    <settings>
84
+            <personal>OCA\SMSRelentless\Settings\Personal</personal>
85
+            <personal-section>OCA\SMSRelentless\Settings\PersonalSection</personal-section>
86
+            <admin>OCA\SMSRelentless\Settings\Admin</admin>
87
+    	    <admin-section>OCA\SMSRelentless\Settings\AdminSection</admin-section>
88
+    </settings>
89
+</info>
0 90
new file mode 100644
... ...
@@ -0,0 +1,862 @@
1
+{
2
+    "hashes": {
3
+        "CHANGELOG.txt": "d27ce2dd1c767b63769f44010e176c8c6c216c0d20e5c9c042d35332bd7b027a8e11b0c8c9a794944a65d6eefd5ecc90eae61d4b20e29ba39a7dc28d561ed3a4",
4
+        "COPYING.txt": "a0a86214ea153fb07ff35ceec0848dd1703eae22de036a825efc8394e50f65e3044832f3b49cf7e45a39edc470bdf738abc36a3a78ca7df3a6e73c14eaef94a8",
5
+        "Contributors.txt": "8ab4ea9b8c38e4d115af6ca08e8e27592198b763982bd166b67f38ee0b9f2b7e093cd58ce0927ae38ee3bc015b129add2ffeb3967288c804da493241bc67ba9b",
6
+        "README.md": "3fe04136424464a3589932d9c3351ff44f5e18f0d4f6cbf2ad4cb6df993dbb55d2cde15567181295dcfb4789d1d6d7168107653aaea4e6fa5021e210172ca506",
7
+        "appinfo\/info.xml": "6b8d0e57478c5ed658503353b34be220a9d8311a29e7cc1d0b90a8335a67cc0d703997ce4b1c59ce85ee8ffdbe5cb34c80e8280ec47effb39866b7e583e90ca9",
8
+        "appinfo\/routes.php": "a0a4316f90aee60bb2cc1ea595e04a5588e5b81a9c369be197099b8c6fe7714fead0fdc35e964557f1f0652c7ef3d0031b3a781ccebd762c4a985a4ed3fbbb35",
9
+        "css\/style.css": "33fec05fbc676387f81379fa656f29f005c0cdc18c12e15ecf8332785f071a3bc75cec080d1a44447325eb3e2a47fd17cb530858c56b92abd23377ac58f579cc",
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.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": "ed145791dabad6478c05a9aa3a396e7a3422f64d90143b49a5df1a893f2279931df6945ba5b35b80291fd738066f4040dd468e4bee2acb630956af1d89c2a5ce",
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": "2bec7cde4e42442566f8c44c574651cd6862306b1ed13939a357d6bc5b45cbd9b2f9896d33c728d1045a422b8bbecae3e82d51020f9bdab72f5aa8b2ea363b4b",
46
+        "js\/arrowup.js": "819fd1975011e2819502cbe5bd006204122d5e73560f6f7fabe9c9f14c7086206e54c8b51e3b005820a1e2d9d29c9254ce2c1c8687285efc8daf3d667e51e738",
47
+        "js\/deleteoldsms.js": "7f967d97186690b1bf07a36efa4af3b593ef53c0efcecfb61d125aa15d077d5a6e69c703e3a0c0784475c5985272459c1fa9865395f7689838ecb37eb1b84ee0",
48
+        "js\/sendsms.js": "18a79816a64e7c38b00bb8a70b627103bdd5cead4269cbeb8f5bc46c9c3a7fdc2fab5c5a68229fceca55f385038c9d4439d0b36c0ea2a4db07a0d5df0d1b8529",
49
+        "js\/settings.js": "0458eac8b7fc76a26ab55d742ff01e02cf2d794974687e72f2d4cfa5723966ff4638dfd51b6d178da9885a8fae23ef34696f9b3449dfe9e7408d84b2d69fb6ce",
50
+        "js\/showsmstables.js": "f6407cb9f1e34bd91e17675523502a5420b17d5802a598b5b0da9d4e43544c16bf570a767dcde679f4e03c47e6c907eba22533ae88f5029f20d9003bc0fa1529",
51
+        "js\/tiff.js": "0c20e8d4f9f602ef497a26a50d8fd253abd55cf53afb0699638264550e931aba9b5b41c1ab0fdabee064046aab13b921c8d6988d76048f6c9795bed5aaac8aa7",
52
+        "js\/tiff.min.js": "c35f67b587aab62db7a3de662779a7b3264d70f5f856142cae88eadd1b477e474977f2b8c5ab31c16be002cb7ca9b52282e6de533b6fd79a02e6d33815919cb4",
53
+        "l10n\/en_GB.js": "5d918ab2b417bba0132c05ea1b0b186da73ad8e526c983998e3bece98891896835706d0512d96c84fd7ae17e22bea18fd7fb6942c7b344aa520efbfbf6edd600",
54
+        "l10n\/en_GB.json": "33b7ce5a3f4a6e59355f3581740594e87e974506e7830b528757e8d6c109c46cd67e9adeab2ee8e65073f3bbef45199564c89d84f85802b08ce945ca24106ee4",
55
+        "l10n\/en_US.js": "5d918ab2b417bba0132c05ea1b0b186da73ad8e526c983998e3bece98891896835706d0512d96c84fd7ae17e22bea18fd7fb6942c7b344aa520efbfbf6edd600",
56
+        "l10n\/en_US.json": "33b7ce5a3f4a6e59355f3581740594e87e974506e7830b528757e8d6c109c46cd67e9adeab2ee8e65073f3bbef45199564c89d84f85802b08ce945ca24106ee4",
57
+        "lib\/AppConfig.php": "c52269913ee80151397520bbebe4f0c725526910ce18f8717ba1c8016a5f4dcdc9a6f9350bc56c8a6b607ea342ee0cbe0f65afd9f03c31902190c008f41c9672",
58
+        "lib\/AppInfo\/Application.php": "7a4b185c9d8c130f7d3d804cd92099d38925e37b910f8bc2c433e3f0156f5631e2f952c7ece34f25e7139391f03158f3df1a3f60662d28699ecfbd89965b8cc7",
59
+        "lib\/Controller\/AuthorApiController.php": "970d1ee244c32a949e6bd2e031151a890c530466eed7747a08e2a875f4e6aa8239e34f0d53e5550b10e76fae4f5c28e2b45e933b59d5db5ec6fd1acbf7c9a098",
60
+        "lib\/Controller\/PageController.php": "07da5883ea41b3f7993a3e358a03a3db592a30fa81ea1ed0f26a234fcc3824a243316b76824fb9a24f40304ae945c48118dd4bed1f0d2f6993e479ab2c1dcab6",
61
+        "lib\/Controller\/SmsrelentlessController.php": "b6c6dd70e18865830cc9bb27b10d35997fa5f30f085d0d043bf907c943d50955f0f5e7d52e5a5cc6a7f04f60392a643e613696c8406c11238ad6886298810fe0",
62
+        "lib\/Migration\/Version100Date20211106192148.php": "96b9793edf72598c0330aed9f0c6c27ebf02287bd84b6b7a0285fc784bdf6442b560bc5dd2e55b464bb384a24831ae17d7ea144b0896d9b11cb82a27fbf602ff",
63
+        "lib\/Migration\/Version106Date20220813144231.php": "33f1f2953e038350e37c670462cc79fa48ab3a72b595f5fce970fdcc6d7eefa3401722da4cc532c7114d0c8aab7fbf0281afb374a695d5c1c1b311c30f64c9b8",
64
+        "lib\/Migration\/Version108Date20220823132408.php": "5d94388496cd88cec1dbbe67a2e9d6ae6fd5db7ed42d4bc737710d3c51ad4d8ad29d53a62739e05e2986e2d4c96374f4660a53dd7b7808d30e44e5c605105971",
65
+        "lib\/Migration\/Version114Date20221202011625.php": "920ee001204afad537bf2b7dbdb7c78e95b4ad0c79f5f693bd56347a1df91045cd83348f99e2ad714df2a735cf1a1d85aeb385c675ef6e90eed26f18b0b7d344",
66
+        "lib\/Migration\/Version116Date20230508212745.php": "556137e5580eb33beffbf6198447581b71de677c2a2561508c0d7f2f51e3ab7ca9feb0715b994a2753616838ad732e01e6cacbcfb521eaf559fb40200f0594fd",
67
+        "lib\/Migration\/Version117Date20230509183517.php": "dd289fe9ed0947b1174390dbd921ee696b50af9bdb360585376a6d5334e390dbcae65833c13c332732309f8fbaf8d83d047df6accb8118c9e4fdde8370db7b18",
68
+        "lib\/Migration\/Version118Date20230509194216.php": "165c805c76bedec7f48811fb4a83685287daa07660cf369b952ed2dbd9a6c0bf1bee2b78d3642478acc37ebd597f0df7d9eb7035c047acfc69146b664afdd286",
69
+        "lib\/Migration\/Version120Date20230520072431.php": "322eda5d5112d5e52a466c91ba02c40f1e77231c627c155e00cf6a924fbe16b4d6cee69978b0b3789c5daa03dfdb3fbf0f33b42fd40811aa366c7a227db4c31e",
70
+        "lib\/Migration\/Version121Date20230523201743.php": "d4f5e1520213a4f0a1d74c6faa1da8a4988dacf8d3f3c7aa8bb932744789a366e1758e2a9be14c7768ca7114ac0e7588ad53b7a9ad6bc1a45da5ef22806126b4",
71
+        "lib\/Migration\/Version123Date20230524182156.php": "7bc033f8852ac9b79e15bea2e13421c603acfcc443304bd36cb0f015991a0816b90950e6b45a84ebe5e03e92c4604e3473dbc90bd72810166a6a20f97eec546c",
72
+        "lib\/Migration\/Version125Date20230603224815.php": "430f98229247d0ca7e3c96f44d810e84a04a9b971c42f645eaaad08b213ec87506b4253c013b47b4c06d7f595aad414a17e3a9078b0fac9c9ed0d980bc39b4d9",
73
+        "lib\/Notification\/Notifier.php": "87389f3cc99cd6e54357f7659cea534bddbefb9912150ccc9c38ee71606aed37831bae0dad3670156813ce50493dff9b2e7a4d838dac043bf9c7844879dd9f44",
74
+        "lib\/Service\/SmsrelentlessService.php": "d27507675971e73a9cc4061ca604068868d46decb11b82c772752eb57a539ee884b38d88d66f46cc2450d1c1ce76b79d140ef727ec5ab82b9438b2445f9723eb",
75
+        "lib\/Settings\/Admin.php": "e4e5f6e8fc5748b11c90b676326dc228fbc52fe1f77a07e7b7460c6dbf2a8013b5e0b0f9084aac3f941478ae6ae75c47be17df3d229d8a998363b9a1d289f405",
76
+        "lib\/Settings\/AdminSection.php": "1c8fb26e8347d67c69af385b0aa33be2764135a4672b872b6c6d41bef3eac6733ca2796c393c8ff334ff56accd7ed4d4c38ca50baff2360d8d8be02b9f8a7c08",
77
+        "lib\/Settings\/Personal.php": "db6fc80342c865841edcae7d2cce5e50d04473a9ac47e26c2daabce493bbb1bbb922bbe9eb7353d759965506dbf1b4c99ce8e9c93f5c43769e1064cba19f95dd",
78
+        "lib\/Settings\/PersonalSection.php": "e65e1a8939e3818e7cd295ce86581a603b1e2fedb732ce51ed1fce62cb61ebae9b93742b1d923f08e14cdc6bd5cf2818d47917321e0aa1736932830c05a81682",
79
+        "providers\/Flowroute\/readme.txt": "25f08fea0f30105e850dbf07bb7a9351e47883640dd87d26981cf50f02ab5af8ef59dbd1fbe5e4127c0e019e13ce036f9414401b9d3f3a924c4125c291e53446",
80
+        "providers\/Plivo\/composer.json": "2d8def5ce9444d4bfe4ff32e008e6aeec924efd40e0cb61f3a72585fc4cf89e7b62970e796d56ebdd5d2f6378f39d3ad540ffdd02c31e2c4daae9b760482619e",
81
+        "providers\/Plivo\/composer.lock": "d9a2b89de334156eaded5ca4cdaee9b53c05e5d78584faf000a141692225a1bf6a1dd9ea6259bee2158ca7669c4000b3c366703fcd1f55a835278aa9f653c7c1",
82
+        "providers\/Plivo\/vendor\/autoload.php": "597387bcc320be22e8b0060c456fc745d8e3fbb06cd1cfbdf093b0ee52aa30cb7e4c31d6d8c38450f52387c0cd5f9d0483e3976611d96f391f5651b71d2095fc",
83
+        "providers\/Plivo\/vendor\/composer\/ClassLoader.php": "2b6fa585122ace1ba816410acbd8372cb75329917aae6363dbad48e396cca581452616e1386a2e445a8fbb0e461b988279103f4f89adf704bce7726f761abf0e",
84
+        "providers\/Plivo\/vendor\/composer\/InstalledVersions.php": "62b61a5303337c975905fa55addb6b1157034fecaa5fb3b5bad251ef7fa1b1ba840308f64fd2e1244d2098b7f87431e35939a153298530cdbd82f81b99cabaa2",
85
+        "providers\/Plivo\/vendor\/composer\/LICENSE": "f3bb64009f41a425df5a9bbab53490f0eb9b74fa8d6aaa2f57efb928edc4ffff330260666edeaa04a91fed708c3663371cf01b284f3a08d6698aaef7a23f355a",
86
+        "providers\/Plivo\/vendor\/composer\/autoload_classmap.php": "1844f7843fdaabef42d1d9e4c09f92f51a5ad45b26d44b34a2aa9202a183489239a0f5ee6502f302b169ccfa3a4bea7308771ca02d3bad96095b5b2194a65377",
87
+        "providers\/Plivo\/vendor\/composer\/autoload_files.php": "c0eaa5b28b83539deb67f24a98ebff5ac0483f9117a72d5cbba02e26f1f18cd4c93ebc23786047ee61eeef11961c55ae6cd4d4096a16f18a19d2af49a47820bb",
88
+        "providers\/Plivo\/vendor\/composer\/autoload_namespaces.php": "0ac6bde683c053d62b7024686ecced083ca1a326d5346a248b1a058ac74a5af71d515d311ce76df799a518027f734b80b9e7f6e8022a9556c0f24ce90240d822",
89
+        "providers\/Plivo\/vendor\/composer\/autoload_psr4.php": "91bffab80b2ba961f206bf3008a7380f81b7cac7b09afe4bcd2d4787d8b4c839ffe2a67442e04010918631b1c76b66304e7d7bce76371e741b444f2ef527355f",
90
+        "providers\/Plivo\/vendor\/composer\/autoload_real.php": "2ff5b7a817e3acbf585fe506b11345f6f3ab0f21c0ee96c67037f09de6130126d4c0e728ea22508192787a451322369197610726f96f32a12f91b7e48cee86a1",
91
+        "providers\/Plivo\/vendor\/composer\/autoload_static.php": "4fdf5e58875a6dc6bab4aafefd254cf3504f78feecdeda5fb431a56f84b37d2cf8fab8e233ecaadc2667f1be492ded264423f3200e1095aa507172b0dad3f60b",
92
+        "providers\/Plivo\/vendor\/composer\/installed.json": "0365a8c8cb376a0b3ca8cdf63147012435d2488c5ab585db3f9e0d926b588887992c1c8cfe07ac187f5f72afa9a3db936c6885d443db444147d7c87ff0f3084b",
93
+        "providers\/Plivo\/vendor\/composer\/installed.php": "923c151f9cca2fe9489aa4cfe04053d20e1923dfb388cc6aea2486557d77284fe6d9d2a77a7acd94496237465f03b712166a2f2f5837ab13bbb7f0aed8d52552",
94
+        "providers\/Plivo\/vendor\/composer\/platform_check.php": "49e79f2c7c1c32796dfef02f64feda4fc8fc5aa05197465fba579997d332cb9dfcad3511efbb34a32a2b2c8d8901be4ca39867026b2471fb17999ba840c3c340",
95
+        "providers\/Plivo\/vendor\/firebase\/php-jwt\/LICENSE": "6f6cbdccc57476f5386f5336c1efa105b4116760a329ae2fedb30fabe1f34f7c1a3073e7f711e07284c8b57b3b8ab6dcb38ba8d71f6835ac024ad524ad658f94",
96
+        "providers\/Plivo\/vendor\/firebase\/php-jwt\/README.md": "8f3226941b2d676aa31b66f5a38f6fa78a4073ec7ea6d6a3aaf0209072cbc8df2ebee65f64460e350f499f8448542443f9859db75f927fcbe70f1f59384e1a70",
97
+        "providers\/Plivo\/vendor\/firebase\/php-jwt\/composer.json": "82e17e8f606504476175a3c5116bff37c3d58faf5fbd9590cc4047f787b6aae79a84c660bf2e8dca453b998926dec84e6d5bca5d81b6817e09d99c6774cd04e3",
98
+        "providers\/Plivo\/vendor\/firebase\/php-jwt\/src\/BeforeValidException.php": "8aac5fb14b6d94bcf048a1cd4935af09c25183e74eaad8f2db19902f1f017a33261707b12be8080d5a662bd01d997d4d5805cfcdf3127f447feb6ec6b971f563",
99
+        "providers\/Plivo\/vendor\/firebase\/php-jwt\/src\/ExpiredException.php": "7cf0ec0dd02717f5152abf5c01979526fbb89f04c01802915745097c8606e432b41a4de5bf92b7cd1543b37a939ce8e133b7622f29cc48798c321654dfb94a3a",
100
+        "providers\/Plivo\/vendor\/firebase\/php-jwt\/src\/JWK.php": "3f134e7503b44f882a92a699dc4cbb4d7415bb93526438e4395cbe877ab2da700d3ef7a8c037d7d2ffabb84e20165f93e338bb32c2bad9426e63708da4f842e3",
101
+        "providers\/Plivo\/vendor\/firebase\/php-jwt\/src\/JWT.php": "9e5e21477b0495c3cc6fdff79d9b6acc136c0187d732cfa4ea438d9802be4642c2fe0e76b288238fa29bb0a8e37e31d57546d548519436dc49de467cfa704ed1",
102
+        "providers\/Plivo\/vendor\/firebase\/php-jwt\/src\/SignatureInvalidException.php": "0c00a3a08bf4fc2eb675fe8ad3d8cb732a82a8f88d37dba5e510ec798a49342b8089098dfae1f1ef1906e62a4b8e465fb7b4c6d17c9c0d8e66ba33ab271e5c88",
103
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/CHANGELOG.md": "f99b50bf2d30b8e842d2db14a28068364b330b402db7bb1fe87fd4e1e3a9009edb05a519a4c35be68ba99c4c334680ff52ff0bebb84ab99de8814959d34e9c90",
104
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/LICENSE": "ed4199d68a412c0515450194549bac0c6a6d838b3950c036bff6c97457fade76fc914d11bf008321b3e2622ef0a3c14da0bee2f109529cfa5a5fdc11fc6452ae",
105
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/README.md": "dcb463420d7da1805c5cc020988f60c15fc5623a2493556ba4bba63d431c21f0584c1e65f27bf0a4c7962074aacf40d763981f878a10e12327cff9b89204ae57",
106
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/UPGRADING.md": "4f2540329c6e06bc0f05a574b0ce5d77ac3f7fa4032371665dce41a766cd28ee12a0b7803ca507faf005f6a3ec5107a60978b69a4fede8bc562333b736576f55",
107
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/composer.json": "8746b3c8b0fcf0ede926b6a60b4d34e7a3e0e9664aef67b34e7e238c25179d22ce599e8c4a580e9f3d73122a0c9b373b87526874c947878ab339e662b03c150d",
108
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/BodySummarizer.php": "649dbacf3be500e6171769c18b1eec1888bfe831dcef8464ebce4461d5fd337c60a200d3c89f9bd7c2714c0567e5e220b31ec2970e7a013f914123824ea324a8",
109
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/BodySummarizerInterface.php": "d0a1271ad03136dca5752c0dfaa7fa678c6fb03890be828780201cd9fbdc8169ff4fd7c17867cf82ef1672ecf0e9f871f682ade1a8ff37e7b84d24c572e1b962",
110
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Client.php": "8fc98c3490398476a81f660a0dda38306acedaab2f662f762881c11f98bab8b5194ea6c05477bfb2676848f54229087df8fac0e6aacec6499f2313e09b940ea4",
111
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/ClientInterface.php": "d1ab53fbb1b6695e6537050421b3a749a7b34b3184015da449a1c76987fd6944bcc1c4cca7247b98b338926af89fa477f9be4897e6316cefb2c1656520c3ea2d",
112
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/ClientTrait.php": "ec1e95b2f1c56e4443c6fcf695ede88e02f1129b7027287f968a0ef2f7debb7533ce2371a27b5ee07f78818786b0a6d1b3d2f8ce28f44f4a8f7e275bbd1b6727",
113
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Cookie\/CookieJar.php": "3fa0964d59cbba956bb47fe103f02e4707a2a6ebe5a60dd5c33f59402a090b6f0110c2795b52f961f6ddf338567382e1248f1e27bf2d0e2033a43efd15e2705c",
114
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Cookie\/CookieJarInterface.php": "a3c6b9138e285d6c6b7521dc7059a04e1c80bc0de7a925c93ecde6c95cb7fadab91ee05e9594d6b891872a557a1b98fc6717ca1d1d46e00992c9cdcdb934a71a",
115
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Cookie\/FileCookieJar.php": "35111b9229059f54b537baec960b8480d5e3caf2961ca3e7e45de3fa5ad5bd0b0a91c2c4231f6386a4966bf9d97aa308a7e444000dae9b21f8c58b6832dee68b",
116
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Cookie\/SessionCookieJar.php": "9cf11d2908913a7555e9e190e6a4ffb0f0e26ddb3d141faeb0e7bafaa6f0b3259119ce6febb6d01b5a7f5a3193f72a099f08ea45b5955bdc7120bfd4857879a6",
117
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Cookie\/SetCookie.php": "7d6c4c14c9d652c27da23923cb577fa999e24f81c1b82f13fa329da3eda3373ba7a832b72d793d924fda9d6a3a02cb39db97e49e17feab3ecc93f395e614d44b",
118
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/BadResponseException.php": "4b7a572e9796b8043d56dc6650709e59bde237b3bacab1206b807485cc850ec99dde86892696d73121c345f1c88a9d2e879dc91be2cd438defe2609e521011b4",
119
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/ClientException.php": "0011418b0cd07eff70f99645a008c30e9a6a90b9ec396e8cf70ffc281140054bf313eba40d97ed34b59e04e5fd6712330d34268353493d112b8029c1c42e5046",
120
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/ConnectException.php": "bca929720f3f8f4484899b18b40f5d4d40ebc4105b316679a9349b97200c74ad2ae6408e2362b4639bcc4a3150fe63ca1e08bc1b159c51744d76466c41203c83",
121
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/GuzzleException.php": "444ae2d2847cc99d9a3895e2d23f0abe59bf0eae279809f7a4983e34098ee0a0ad7408d251df821c4029621060aff1ea0dc890615535ea4368e5796151a767cb",
122
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/InvalidArgumentException.php": "2647ca6c297960b01b29435db7522ece3a997def6b3af71e26113abd43ca4493501c130e7767b845db0e723f9955164ce33664d49bd67a45bd29d270a66e0e3b",
123
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/RequestException.php": "b0b3163e4eb96ace90c03faf9406b89ae21c7cd5fcabe78035d5d9e1e7ba0ff72bcf31b877ce2d5cd38e940cf0ead52659c3637dfa3567745fb46a11cc9de31a",
124
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/ServerException.php": "9cab599fd913d8f0bb1b8f448932ae0b5c5b1cd7d83fc4e1e4c13fec29b0a849a5385a6c40183b8dc58404ed020227b9ea4483ac89d135c6c82e4c7985604044",
125
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/TooManyRedirectsException.php": "99c4e6f908a5dc03939ca083232cf48cecd742616e00839ae25ca173ec458e6da10be2690b98588b76e0f3c24ee7f35c09ed5c848f9348c639c414aecedf6c2d",
126
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Exception\/TransferException.php": "665600a8617328454b70a43fbb72c81ea196584dc22e10324b3c861974aa55ff5867b30b86a65123f1bd4fece75049a9f6c4bfeef5410a9f29913d350358178b",
127
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Handler\/CurlFactory.php": "1dd7a848ab73a8db9354fa2f0461a995320ccb677b29464812a484730a85f405d8b6c9b39783881b299328cb8f99e67b9d959b00672bf60a4559b136fdae8119",
128
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Handler\/CurlFactoryInterface.php": "0d063ee120e0ff6042a58d29b109bf6573494d427e20184a4d448ef31fe0cb0cedd60bb47c7289d5f6e1027413a28f9f57921823605d4f11086da5c9be8c0902",
129
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Handler\/CurlHandler.php": "ae0388a0146bd0cfff1c597570f58acec92876d3d01298e1988dabc717ffd76895b45359cafd7bbc62ca1fb5e7e96fdab70697a2cb469c8c5d0298aef12e44e9",
130
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Handler\/CurlMultiHandler.php": "d03d4a374657d671554d06e5622eef0d1b06d0a39a9167ec6f894ee28af31defe1d4306f937376cf5997c1421643e08e757880e45a1c9c10959c967022160f96",
131
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Handler\/EasyHandle.php": "7438c054921687fcc4bea6ef6b49aae15651a95cced2cf73ffe46bb15abdf924afdd4784e8d2121ca851934fafce69d3661f1a792e6f2352cc5f5c1803ace3de",
132
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Handler\/MockHandler.php": "0d8e2e43e0b8079f20de6b86c241afdc83bb5bcdc5a91ac47084ffdf2a3904a79e5db6fbafa4715785ded8fb90dd8fc418aa05bc0fa8c52220555720f81e827e",
133
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Handler\/Proxy.php": "9caf11da430da351eff6e9be0a1e8e029bce41283a6d8215e2215d6abbd3f021018564d1e6717f65f280703d5e4dab78a2b522042d63c5a9cfd019b0bb0aa4f9",
134
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Handler\/StreamHandler.php": "e45738ddf123fa57df229fccc94622b9a2ad5dd9bf6f65d24756239b587937bac9b7a37220e65c55f2abbd7159bc16ac785893d4aac5c192e6422af4fc4f1222",
135
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/HandlerStack.php": "900b9df966c3c1f3aadc45bd42a81e8ab153c74d0eb90cb3c8b2f9d46115353f45e5bcaf0eaba1281ab98dffb3d136a0c0fa0058fe73d906eebb741b273c150a",
136
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/MessageFormatter.php": "99460bb55080cbc7e08eb6f1b3c8abc71c38cd5d6e04422bdf8144ca554e7d7de29fc5d5dbf7aab5f7440c4ec9d779d684f8194f90139a1ece1bb086f14e3cc5",
137
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/MessageFormatterInterface.php": "609462659ab00682e7fdd1bb56aed5ad3cf54a2ee3b641623175b9dca0136b4e1cbd3cb0541526ed86d05174a18a9333ba52a9e50f4c05ece55cdc636815e385",
138
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Middleware.php": "42fea3a5bff7eb363a7af1f85a21a9322aee8d7e343295209815739f8bbd5dc372f14e3e8c5454f7650a3b9d802ca25fa069d64fa16b0f5d4d48c3d626ba3527",
139
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Pool.php": "a6d17779976754d7c16127680ae32f8e45ed54c3ef4a2a6364a1e4100ce732b8494b2848977ba6b2bf6fd296d7a54b30a2f021cba5a88ddd0d1e0f3a3712b9cd",
140
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/PrepareBodyMiddleware.php": "268182133f0e484b56fa23193d20def23166eeabcc2fd9626b17cbc20188d76549adaa4c768df695b787d31b2eb26a5316f0a3531ad3ed022aaddf0574fc2ac8",
141
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/RedirectMiddleware.php": "38bbd75b92a6764b0502cea113e222d5cce7abe53c7ea0c01e441fbbb6b0514f2f54388ff14d459ed611925eaf9b48c0aee1b1fb41892d07d1b260734a1d2afb",
142
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/RequestOptions.php": "239e524c17dadb296efbd8b9ba82b94ddfcd90c83377fe4bf2890dae5dbc62f58032205274575f14bb2e745112ee59bb559936b992d9a227dec00f5b2e32c03d",
143
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/RetryMiddleware.php": "01236bb2265c0761148ccdda7d3668c10f9539119bcdcc36f10d077ca32013ca0169938d6f4bd0703018f38fac53b2bd34e873a07d8e5287c26fb64b7284dfe8",
144
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/TransferStats.php": "4fe882f7f801ba55a3934e00d81aef09edd092eadef498f3bb424f7f32dc8d568940806a9d8e80b1b6c768cffd41ecf0814a0bb366195b2400f08a8e310a8c19",
145
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/Utils.php": "c3e52199a0a1755f52b6902b78d008de10e33ff8b93242a709d7a12e8c05c1c2c09c2874439606f0f3ce6b353bbe3b8ac385a236307b428fbccc078e1959c7c1",
146
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/functions.php": "f45c62cbff0de0255f4f149ee3e93c52bdae44492d43c9314a48d8a793ef028f8a8f704a2b28c5b84491687c3b682e9f85c4ea61bf63de56c6cc6a4ba8081ae8",
147
+        "providers\/Plivo\/vendor\/guzzlehttp\/guzzle\/src\/functions_include.php": "058a92f735b5848dc18be383478bd1659a0b578beba1dce5a1ef3b7a0b6b5f643e2f222dd72ed09ec72e8a5c5c9fae9757979f7c4016c5654bcce9d7dfd42d37",
148
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/.php_cs.dist": "4d42019074dff2a1a5bebfa51568de254e5128b88ad309bbed5e8348ef213035cf3a4da66ae6753354a0dcf6ccc0001bfafa2453028bffb3548f2ede26c30177",
149
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/CHANGELOG.md": "0c021cdbfea029de4a20511445e64d0d6c35400025f1361cc913754adce9b2dc16efeac12cbdd489ffcbb76e95f91108dcc557fb9dfdacc99e5bb98f20b55b43",
150
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/LICENSE": "9699a00cb2c5ebf932515e1232b83f79c944f8100881df096de09e25222fa01173bf24d9e083db7d9605d1e4f5dfa14c726aed52c0fc2499643714a9e64c4cc5",
151
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/Makefile": "a350f48cbb68a05cd07f787522193851f9cdc6b2643e34eb502fe261387d97e5ceb8499a22b20ff2fec5d7352ff239a952fa3b129ba3407fae871683d65e9bbe",
152
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/README.md": "1ea705deca28d726cc65d0f55db886545b9f5309ccc085bb482f627a0ddb5f8609d6635f65686e3e26b9a23cb8bf03b3e8d02a26d25eaf8195dc6c2cc93be0bf",
153
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/composer.json": "74a66451bfa422f886266ff300b4ca5f7b0ed62199293635671718caced457f6eab5b8c9467f24e999762f56368fb35742dc0adaa35a233d32c72783112a6c50",
154
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/phpstan-baseline.neon": "916bcb7d298578dfc4770a3c49ee558eef9a20dbff8e3d097506379c8680917b08a8f96f2b59d96b1b56b1ccf4a5478c868a2da504a1935956db70f51528494f",
155
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/phpstan.neon.dist": "ddfcf700a47b916ed1072c979f13d6d51327c9bc389c49ad264ba23279b01151b90aaeef0a81a13eafd40115d407ceaf471c20a61b47f1b4796f8adf3c1ad218",
156
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/psalm.xml": "52c09c8b7daf6d90db16a5ce50b7a8ce15c1ffa02265fd1d4b117cf717331475245bfd4f2dc45d3990d67333988a11081e13ebf783bca8854a1df9c1b0cc9cfa",
157
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/AggregateException.php": "97b6e46aa16ad26a2b714129b83d933cba02ec7afcda514ef67c5027cf5b9b93a5d7cbc72560307adf294179a4d7b86a6da9caa835bcf5be17e398501bb88fba",
158
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/CancellationException.php": "b958ade84fa4e6c7a7efed66dfb6a7f83b9743a9ac6581276eb99bcab667ebcdfea92a9bb114d086c5831d26abf7f6ec3e03254067e2b29abaec995e28cbce8d",
159
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/Coroutine.php": "d1c789e47536cf8c9db52acf791bc6de0d61790856a78f0cf6a9c98a1628d2c42cdf9e5e94e05fea802a099bd3ae3c65b790f2fb5a342bd130654c4cfb4fcf07",
160
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/Create.php": "a3651bfb1f458675c58397460c8534c2819404fc89422467f119de4cd80147177e462a9965bde6a75e74e4354c3c6935cebe1891e6a53a1bb26383f22e9dbccc",
161
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/Each.php": "e57ea03f69e1680b56676ca1057e8defe7eaefeffb456b636f3cb32295eb6be36073c7a9a621f656c40d5661c0fbfaa3a632961d82ec7f116ab7fb5aa9db196a",
162
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/EachPromise.php": "c7d79757cca80b7352ffd12a6743a515255e4a89764f65067035b16fe39c09b6dabb833aec3fad3cb741aefd778f620202caf79e98b86095c6b252f4e555bbcd",
163
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/FulfilledPromise.php": "952eac7f7cc150394dedb72ac97e624db8156ecd41c8afc382ed0cf8e4c2c6c94879b7ddf6ff76608c6a95ef30ee136f44fa03ab9f5ce4b7fa01bcd0c7e7574f",
164
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/Is.php": "894b3c475b5a828e442745507fae4b35bf394fc9fc93905258f9736a67112c321b1f3e353f8f3fb84e8778bff67bd9d27a6fd5ab6dab3218a30d82b8fd14ae0a",
165
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/Promise.php": "bbfba94124c36b87941e1548162708a5543f156d64a8f465f78397a02bdc34c764b60f73d5e77a3a2e48727f4cbd91f60b9c1cd47c0fe205994c4ffdadb99c5c",
166
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/PromiseInterface.php": "8d8d1d9e04d75ceb6d3e656794fa93170a3b1f9c2dd3b53ba6b4dd3e599f880599cab0b1ec15eaedc1b26d09d6c535dc9fe92802ea8ab1ed5927ee8cda7cb9b3",
167
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/PromisorInterface.php": "1058176a68078d02c288528673176648e38d2b8093e67b0984d73ebc710c0bda7019689303b1f064726cbbfc9382e733443e9d5443a77715ba40bb798ac79e04",
168
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/RejectedPromise.php": "53914a46ca238b8d079333f9c71180aed015a77bf765cd2793790dde21fa7fcf67dcedc5c797a1d7caa06d788bd9631628712861b1185f3cef9aa63260aff0cd",
169
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/RejectionException.php": "6dae5e0b0b47538e5c94a3d4890623e3ec41be8198a1d00ca84d77f32b9d074cae13e25ea90e2af614e802aa28271def466e5ab623c187df49425cdfc5bc05f3",
170
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/TaskQueue.php": "431a73762758dd08406a41587115a11e61f921cc01997ea71efd803b2e3882b9cb7f6d89694e06ecd2992f2bffa38ba55d631dba7fabfce3b84d68dd4913a02f",
171
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/TaskQueueInterface.php": "f0b2b36ffb75337c590f82d3d7d19a4caa4eecd6003c0bec7ef935604dfe35f4e960f49da7115b3b3cf65c61d04bdf258310ae1b4f4b6cff4eb09f52626adc11",
172
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/Utils.php": "9bb1eebf4d0f43bc47cda6f70f08b3fde962355075bb87d40ec75d41b552c262a79023a72e2e8d776b6d0db1ef1d412e398ae16d96476aa5c72afbdab9d5a9fc",
173
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/functions.php": "b756c2bce2557e9c6b8db2ebfb026354418c93f54169d1e9249478532bb02e1062c30e14060a3bae195098c74deb4f7580943aca944a162615c44139acfa7861",
174
+        "providers\/Plivo\/vendor\/guzzlehttp\/promises\/src\/functions_include.php": "17063296fca8aa655e7d5267abcf04051cd58fab5a7ff02530e1becb5002306252d5ec55c82461cc51f62c881c51dd80da53ed9d90640b6d0dd56d5e8f819022",
175
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/CHANGELOG.md": "0540da857957565d77741b846932c739e0883751660d561b2a0990a7cec8188573c2d31400cf9f125d1b6eab482455d19f30a8363354341e3c54088a0c418e7a",
176
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/LICENSE": "5d25479f1c9c0b802e2944e029d7011f9b9d3f7b37f7c12eb77321ba448414f79b0b254c0846d2e5e1b8826bed85d7c377803a4ad5d5afb288f220c761822043",
177
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/README.md": "b9759cedfe2199b2477e95fc0770f35ed6a4a18c6e6b4b4e30a20f75945505dcc76834e20e61e3aed90fd790c677536bb43f593de8a68558a200000eca8d0bdc",
178
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/composer.json": "27ad0b2937068e201fd0312a7dcfba706a8a318ca4e09d80f29611803bfb28d48433ba5f2b452da8bd76fdfe2b9f073f81f2e2cd6fc3e4223b20637408f6c836",
179
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/AppendStream.php": "d94d352d6f640589e84fe2aae0bd20880c4d6e897a29a47d4dffe6aed4d852fd5df274db2e68124c7f15b84d6f4fc684873fd03d003db39caa61b024b053e396",
180
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/BufferStream.php": "eee7de67e107fb33e8f97949743726a30e8201fd874490fc93870a410b1e0e3a059b75dda972b3a844b8c739b9b768a73d65c61bf8030589d0d787aa26f70e8e",
181
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/CachingStream.php": "e9b1e3d5e2bfae610677b9d216643be7b2e8b97cf661bc5c67631f994df0dc88a9a9ac7bb9dd68fcfd2ed343cadbbae227a8a46baa3b732733497e24f1338be7",
182
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/DroppingStream.php": "63db37354a2eba98b768f0929ee9a4ffbce1647a79cc9aee5e994cb693e53cfdb9f7a0fc4c32b68b46c64b39438b1c53a30532f5f8fb442f07062a6b4861e39e",
183
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/FnStream.php": "bd25e2ca8ea196a5e876c5b9d01c6f2a27b206f7ba05d047cb46476c52191a594f1280c7435b6429e4ea411fe5fc01a2388e213df26d27c5ae5094a0d0f2d619",
184
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Header.php": "27014466522ffca93b4a3da6e96a5e8501f11691f7642a2e5091f3d0c1b146789ea41fd7fa1e3948f264926e7b764b557b1b564a95a7b5cd56c17c8ddfb6b7d1",
185
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/InflateStream.php": "e19b69eb2f1d2f8782f7285414095ea810f746d02a447badef5ec7185623235f17f5689682b185ba124e71a19b0dcf3d36b64894d183e25edf27f1d1e34c1c0f",
186
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/LazyOpenStream.php": "8c262a2c574767d61a9eb084d6848bef77d047601ec5688a90fbc012d5349d9b4ea188444fe509c8ffbcbf6ecdfd839a461505ed3746b6e1c5283860f7fd4a2d",
187
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/LimitStream.php": "81a43b1ec261207c1a52faac2c5099a429e43083bbe0c9099f447859d2ea12a45d30e7f0b5a994696084b3c59401bc28564685c432644caf6a9d8b9669404c91",
188
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Message.php": "4e9b857c226b57e2d2faea27643d6f213bba65bf158889a528fd684cf1acce6f480805d04da39a32fbd25be9fc51c4f1a3c1bbc9e92f3707fcf33a120b2aa256",
189
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/MessageTrait.php": "367bacfe383be2caeb0064fe80e5f6b138050dd4189bb65ff82d8f86d0b1b604090b61a2473d7e80c733c395cb893fa9eb2dad0a63a353c19da32e940a1de01a",
190
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/MimeType.php": "98467f19beca7d4239963d4d91a7896d44539c13a5c694c4aa8ec68f3b57031367d1cddff19fb51c389393cd1402a574c9afdc448766c8807228d726796d2e9c",
191
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/MultipartStream.php": "5bbb8f71ad1f2f421eac8c0d40c3a18372516e8ab8f2bb3f917871bec9aef0eafbef930902084aa3ca64a8ae930edb1f2befe1e6b49dec387ea239c5c475c099",
192
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/NoSeekStream.php": "f003ec01ce15f5dd56200396a84a2c94a1b134d320230983ef91efb1abc770827018894a1b8d1f3a68c2aa481e8f0bfbaec4c568d0b0fe251a61f76ee22efa38",
193
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/PumpStream.php": "15192b83cabf910107b30bde59197618e524aece85f9d396dcd8459174fe50a1cb82de51e5225b8e6ea64fbeec7b4d94f035bba2ed893efebb660105021fc98d",
194
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Query.php": "8ace1f141c08396103431803ed35e1bf247fdf7f7c7b727ca63e58a1cfdd7e353a6c266c8a7bdbb863e5d290414ea630bbe37f55f275cc5a5b946b794ce01740",
195
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Request.php": "e0582b7b304fddcd81a214bd8ecd4db301479eddec3084b18b822f5e22fbc9d1fe3f3d2f6ba52959619dfbd0e98db304b2400e67675fca41f470ca6126085da2",
196
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Response.php": "32524250d58fba5c152472ed37160a9aba92c586c9b2a6bc55f97134e490636189bc8708fd8ca4145478a5bb20ea51b5bc417fa8d61ab08fab3479a04c4506e2",
197
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Rfc7230.php": "beb2f85fd643c3cdb3c92b401c4df1385bc6fcddf7dfbfbed88396611438720a1b86ecb9b913472ca8edf1bd9782a3692b2138195fb366ac1b8a7f1b0b81d390",
198
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/ServerRequest.php": "f3fead87c83ce2f73b2890ec79cc620f319c59ebc41a041e4b70b38bb1e412c928fd7ff0f10d96fffed841cdc1ef2874d5ddb0e7cfbbad3ffa81ce7484365c05",
199
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Stream.php": "7d108ed410ba89cad35637f837d97f7ef53c43a4666d0502e3e7dc4aad06e7bc365f311961d2bb8768faf9d9c6d64d09e080aa9bc65638084a127e7a563acbbb",
200
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/StreamDecoratorTrait.php": "e1b90e1d97a4a1ed1eb1552bcaa9011f79733167b7e5e3f2af8cfdc54adf0d64a414ed630ec74418020fd8ecc7c75e43db6bbe0fdb9ec6d3ea928bd3bb3f4561",
201
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/StreamWrapper.php": "7ed1833a91a1f56b743172192b7ce4399928b261eddba6bdcdde958bbeedeadcaadff4fe5b3913dad0e4b2cd9346f47b43849cc65bbdb839c9d9e4b586638eef",
202
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/UploadedFile.php": "a66f1119bd7327a19315456f17ac2d3ecb40e564705d41047a91a02b431efcde1eab2750b2f354fd2f5c10c1ec1b5968e84e758d51210f011dafa8df5fb35c0c",
203
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Uri.php": "fc5c81c97687dcd34ebd18c6714479eb6b4d1c7d58963bf7f1f732eae98a04b094dd9c99d58f4bff265b2faf0629a456c391ab5b96534c927420f51a95dda637",
204
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/UriNormalizer.php": "8992ef486358f43df4a9567a6a232ad76883d9c7cacdc94707343e5465c857a4385739f66d0024136df94c59e60a5ccbf1850634a55f2cc1f56adddc717434e0",
205
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/UriResolver.php": "46e4c0ed24579ad9a0cf467141fda7dce6dd3a3d3281a1606261f322462d1b19bca413f3c5590b7ad42fda1fc57e60ba86d121b5af0c5b5a2ea21bbdf07f44fa",
206
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/Utils.php": "be75312627f929b2ac94cd6d12972816a13660a40d25cf87f6fc7fb7af416316ba8988656147a16becfa8120ce2a484c84d9f399b43dea2cd3c7ed916f7d8302",
207
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/functions.php": "f31604b89969730b482cd03a13b1356ff9b91324eeaa9ec45a45f86be2bd52a8209cec55aa878d5875a3c82fadd86848d558789d0072e853505d644f0a2603ab",
208
+        "providers\/Plivo\/vendor\/guzzlehttp\/psr7\/src\/functions_include.php": "5b85d1438039f778c454f67bfd3ff2933d06b1aa4bbf9dc516e385bd36cd749f7001de6278c5a1b4e3c5a7d280876d4d35337f87a0dcc6e521ccc20a3ddad1bb",
209
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/AUTHORS.md": "bd202fc574c862a7c3d4a27653605b6fa377823744a793a7848ddaa7001166fd645d6047892d79c8488786d82fee785b87b19e9af1d04512503eb195bd300aad",
210
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/CHANGELOG.md": "ef87f930b797ba0b32dec670491e021b5c881f6986624c1906d8f910e8393b37e6d7f5eb9f860c1bb8447ce61a206bca80db4b2279c57bb064a28be3d83690fd",
211
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/Jenkinsfile": "98d95e7185d040e9aea6e75118ec17ac34e38e17f8ad5a38d869ea02c0c9de5dd79d208a78da23ccb87444df7b7de827b314469027ee7573cc51423521786320",
212
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/LICENSE.txt": "0974968907abaaf61b640ece98a502e3c677b7cf734ccc82cb522b3e166c50eaccb189b4d31b03bdfe8e61a97b3ce06917a7ff5c7c60887e2ae944f909fb6e72",
213
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/README.md": "ddaea1367057ed09023311b6ce37938985c188fbbcb6867c6c3ddfbdb984b954e42fd6450d1e5cfe10374ddc4448f9b96d6130d465983d634ddb3c0b01a276a4",
214
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/ci\/config.yml": "d50e43de2ba68261ae35625f8ce984903baffc3c6535d31a7fb3c5efddd08f71cf0ec3aaf22ee9e17e93852dd99284b653b343a053ba50a45cf6716033131e3f",
215
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/composer.json": "c6b4f35c928d33d62b48139a8be5d85868fdcd0716380865f8dbe0f5a708600ad7dffb3ba510a45bf4a8002f7e1fbefb1c835de7e3e2d9b7c1cbddf9fa2b565d",
216
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Examples\/JWT.php": "ee8052cfd45be4eac77df60902c518a14bf2df07ae7218322493a8e2d115280b87c65f9637ca766a63d82dce36c7c78e894984dc83031a9b7a8d5a6345d38214",
217
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Examples\/Phlo.php": "f9d6482c51987aaa3d7f0db59cd45030e17284262681866999309205161094d96a55a39dd2898d0b7980074d764e1bde6cb6ad1f50be8a40cc9d557431c1bf91",
218
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Examples\/SSML.php": "932a827eedcd81956c275529815a2f7542636b0cb887fcf182648e8f972006f6ba8ea4a763b3de48aac989f26a5e44752c7d3a62df256ee2b6a1c922de677e14",
219
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Authentication\/BasicAuth.php": "42c036c38225556834ad5cb916db0c4783c7127909053ef623e7f71aa51c9fc968b9523fe5dcdaebee769cecdb0c4c76215116cbf5959b268c8792fa96754531",
220
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/BaseClient.php": "029f2be5a3c7734b5030b4fa96e0d7c0c1252bb7b30b9f001a78abaa646d6d3821a127859e5d170ea5e3c7f5c86d06112f28152c5cb2315f94dbccd318f9e5e0",
221
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Exceptions\/PlivoAuthenticationException.php": "7ee7458999adea1ab1722358f669467cb35265eb616ef2eb16e6bc3d42a7f3c2fcb0b42655df8f4f21127bfecded765bcb479a6923dbf1a184e00f6e26321ab4",
222
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Exceptions\/PlivoNotFoundException.php": "bf54dd70534e988c27d5e7d17bf8edf9dc65191b77677d9ffbf95ae3bd019f1ba368065e82440e04f9a0d7045cd62b5915943273b5d8d72ba01676ebf2975edb",
223
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Exceptions\/PlivoRequestException.php": "6655a36e42e700283235b84889088e378bab6861ae98ea99c20bde017ed39b83dc743e5c166e8129b9910a434b119578b23523fdfd5e9e1dcf3d57c5cf9375ef",
224
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Exceptions\/PlivoResponseException.php": "4f18628f90b1c5142446f0e394d5071a91995baec240344a1afa47687ae463cdc3dd18a79008813077a3511c1b00dff7a8715d26990afcb6f9726598c96822f3",
225
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Exceptions\/PlivoRestException.php": "758babb40ea45fb50dafe5231605196214736f014860618af9ca7161157255cdf20c5b0bf534f6f6b30a4f9bf612b5ff5edd2f7adc45553ef12555354f82c15a",
226
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Exceptions\/PlivoServerException.php": "b2b8f6d1d03a720885ce5718b1c80bc75c7f483f72a1d2d2313b98a37e152ca78bb688f7923f025563517a52de7e915325cf86e463a2083c30ca2473446b91c6",
227
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Exceptions\/PlivoValidationException.php": "5faec3f351037d6affa710c10f733c57a7919cb04820f93ef0c19f75b2f2b2b8ae1a0d004c216673977539b713ca31475f233fdd21698a390319364d2b9a4ba3",
228
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Exceptions\/PlivoXMLException.php": "a66429863ac7caad7e0d77f7a1fc105fea0a45e7eecb753e64bfd5a76c89b5eb06e4228bd63a78134090774458a646e10a11417855d3e72b2a6fd75aa754c625",
229
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Http\/PlivoRequest.php": "3fa26ce55e1b201dbe78e4bf3615f8c38d9e6c4e96e5b3673f6cf7985bc4055b88f227677273189381bd29076ae5e8baba6c0cef4bd612f2ff8fbd2847b6c129",
230
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Http\/PlivoResponse.php": "3f9f1ce15ef75db2e028f198d1bb337c37f31fa6dc7e5b985ad589f6a4dd7d873e3dae968b80f5e1eb6056b4bd00e1a4df4d54242206861302f9d6263d177bbe",
231
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/HttpClients\/HttpClientsFactory.php": "a9fbd6c007260fc2169648c9c764ff7b5988af0874b21211f8e85e8a995897d597cbc0c9fce4ec5c8d60a901ea05c5a8cd70684c2302ea17bff528ac674ea578",
232
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/HttpClients\/PlivoGuzzleHttpClient.php": "dc661dc489b30bfa98e0d75f04147d164ad953e7dc51326a20fa94846fe30afff07ce92958c27a9bce9fd15371543852c0be4c24031cf382b54403a0901189ce",
233
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/HttpClients\/PlivoHttpClientInterface.php": "61a18efcb4383bea7598ad9167ffe49a73e295d2ed3229c015f9a5ea08b00362005df1388cf6846f1c331b123b187290a1651341c76ce2cd4233926c927b6e9c",
234
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/MessageClient.php": "f96e09d05b71a2e0b6675300132634f5664026bbb84472a1e7ca5f72b679390170ed5aa0d4e21a4dd1bc646cf0267f0f9240c931657f7cca9b2bdea501586d26",
235
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Account\/Account.php": "22bf526a376e6045fe9045ef4eaef52c769ceb8a7c3ef11902e66acdbb673fa521f70f446e6724155c8499cc700a6cf4f4d435ed06d81baab69f638cb15651ef",
236
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Account\/AccountInterface.php": "5093f51c3803de918f3a500f1754f47a3dbf990008804c07e543da253a22641b96ca2ae5faa7e6800cfa10a41f7d407e5d29e9907c0970a9183a8795be9f7543",
237
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Account\/Address\/Address.php": "7ba3e1e7e136d43989fa0449b29882d78fcea39cb764e54228c7a4a899d5ce4db2deae9d9ff9ed5cc53a8af72f98c55914c10be3dbb7b9a354b8a06e17cce829",
238
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Account\/Address\/AddressInterface.php": "36182073184f67cb024e0c020307d4d74c8b5c65e3ac7affcb76e189c91af9750c318404d8ba3a5a6e104d64459c59c80d7a944395796f0f5aaad18d43d93720",
239
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Application\/Application.php": "9431715557954e8ac1cc340f3f568a6eddd6e00a0ff0356154b2778b118f620d0afad3979e79eef0a583b313256fdd018516cc8128a441dc667b39668b6f506b",
240
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Application\/ApplicationCreateResponse.php": "cb1167e6057eb71e102d55ad2ac3cc2c7aa2a757b317cc97d8d08dc400548d4ac56379653583d53185ee8ab37c4dd189b66af011bc9a32baae55991922c41466",
241
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Application\/ApplicationInterface.php": "77af1063e341dacee15504837264b8140ffa3e8f537b9eb0b102e8f6d184deefab6a08ff7f771965c31d6c84333de9963b2e998bd0389bd0517479d5ee150d3f",
242
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Application\/ApplicationList.php": "0840ebcf3a0d9688cc68a82f11484339d8dadc9d1a50787ee11b3849a361a421f30417ad4322633c53633b4cf58ff7980de6ef87471fc88b16d090f127763450",
243
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Call\/Call.php": "8e0a3bd97abbb7b9d03e22a4eca6eac4989653c43facff064a374f6787698bcc91320352d105f66aa3f31cc0d70902c8cef0f9264062ec4bf4e5cba6d07549ec",
244
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Call\/CallCreateResponse.php": "a3a07958282fc5a6e7b99978427e2361e8828a63c06a940159a7fbb356ab9621a899e6e2a25c27d445fb92ac34b63d8e5a8b6f0782b7f20c7d9f4308306903ee",
245
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Call\/CallInterface.php": "9aa42eadb3b1c06c802d46f1a11b17acf59e0c78ae65b6c9039b4afd9fe53f171cd8023be738a359128afef545a6fddd43bc039d94b014d122e9714f9591ab71",
246
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Call\/CallList.php": "9883c38a74497c496cbf7c4a837051cb6bfa0ed0b9ca9298f8908e7195a000196f7c79b4846417c64af0aeddb6327e45ad4b36352a28e8300c977e21db0fbd0e",
247
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Call\/CallLive.php": "14fc226091078fd069998fe41625d086407e0c22455dde078284f9a3e8fb34fbcac0b75484c5350b437387dc203db7690d9fe1f02aeb09da2d5c57f7b2ffa651",
248
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Call\/CallQueued.php": "64552d83e5911b11202ae4a965bcd7c408643c446566c3d09aebb0bd02fac0dca41477988aae62e91bfb42913900f1eeae9d20693c6bc29651e2734b06cf18da",
249
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Call\/CallRecording.php": "d23438ea994b0ab936c3917d77ae9bb38bc9ca14dff4c5c120a0f583db46891af3bde1a8c3f55d15bacae99723e510184c14c60eb6d3d411d46aa90c5c8acfa8",
250
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/CallFeedback\/CallFeedbackCreateResponse.php": "cff0c47988bfee02787a2d73df6b3165749844c1a93b1fb91e87e80582bd28c8c7efe101fcd532bdab62886eadc6354924eea81278da5037ad9d3ee5d8dc8f29",
251
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/CallFeedback\/CallFeedbackInterface.php": "7860708568f488bd0832e626123f4bb5ab986fa5d54f305d4744503ceb4e919857b78a02b766e7241d324a77d86592f60f26d1ed78955f5550bd0fcc7bbabcab",
252
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Conference\/Conference.php": "8b97d6c9abee836cce410fa1216fdb5aa8a4df0c8543a75c2415bb31a5ee2d87531d5d162b218660a33cdc30539861cb09d85a780feab2d5321d0e8ce06194cc",
253
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Conference\/ConferenceInterface.php": "34f563cac4a75ca234e4517cb4678998461011440f30f9d81895adfdbb2e1960009114773ac30901dfbd2596d327554fd335057de66516b656f7a96446f4b06b",
254
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Conference\/ConferenceMember.php": "1a880200a2988394ed0436702f805ce60762be1774e1d156f38e45be39cc72203fd4f04411a521ceba8fa9647cb00f6d1bc6d94798b66f12175fc68d88c51dcb",
255
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Conference\/ConferenceRecording.php": "1c3239209726556971c2cccc812ce5bb5a3fc8c7a0e4f3ef520e037acde32d9659dea1dc5d3803e1f7cfd39e945a1680983bdeba8cf62459fc168f0df731adab",
256
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Endpoint\/Endpoint.php": "4c9a87fd6042a3eb486af5dc899d1e4c0948de5ebb1467cc85704030947e2588e79d23407ff662a21b097fb46a05925c3df29dd6e2a038555cf44844342cb206",
257
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Endpoint\/EndpointCreateReponse.php": "f77356f3ca29ef7163e47530004a5d79c1da73e922b17333a89512e39c7d3cc842b161d9dcbc745075f6a6c7ae27b7f7cf85f56a6d5bb796b87db4efbb8425ae",
258
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Endpoint\/EndpointInterface.php": "09914bc8e8eeca2812a4dc07469137011eec1dd77b99e3aefc8d5b8f4675b8f221bc54e37417f6c45b07896b84bed953f8c85831f9e7cc7b85b7293142b60fff",
259
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Lookup\/LookupInterface.php": "040b0a2c01ca3c0c02c2c8450b47e8d1847ab7158014ae161ce971e330712d14d389cd746a353707d2bd2667dc604e55c662af8eb15796cfc613f285e170ed15",
260
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Media\/Media.php": "72b83f02669ec7b942dd898a74c22e909cd9b058ea2e903e92ef4dd9e985305311d53c30a0c54a3f0c210433aeb7b8bd04a4b3a768c853aa73ee4dad9c621a56",
261
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Media\/MediaInterface.php": "1cda06754bd1ba503a8405561594f9d3cd5befee2cc6d9cee98542886c71601bd8744899e7ede346df6b90552f05a9eadeec4cb4d11fdab3269de88170cae961",
262
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Message\/Message.php": "54ae356246cc911258552001390f10f701929afa24801b2bc6cde72484c915e2e738a03d04aee90908003efb3b4b3cc8106f92d7ff87d2119e8a350f7aeab54e",
263
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Message\/MessageCreateResponse.php": "75495f459ecf577e2e0c2f8c075d569f36df80c5c828fd1d6b84a001de2c3d032add50b5ef08177d5c68014fccbc939c8ff89ce6c884ac0c1b64f4301d81cc5e",
264
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Message\/MessageInterface.php": "e96af121fd4a851e4c1f27297c602a5e6862e0ac54974aedb19248f017f2d98386ea9b495ef6cb775aacafa7b51b6117665c803356442786142c15e86066ef41",
265
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Message\/MessageList.php": "baacdb72ec116be9a14b8e7e55d6c40cfd8b04c5bd1b0d93d5c9919ccba2591105e03dee96effee29e95ab7b7e58e45569760ae825351c1891877dd96853254e",
266
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Number\/Number.php": "1bf8e1b1844ccced8d8068a80ae45b6904f59b0fa0e7d6a7c5b43adda906859ec11d709a501f560aac3f8315176e9260ba4796aa9cbbd637431ec94f0ec0c668",
267
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Number\/NumberInterface.php": "e633bf2e705735759f6e27f9e747e3e05e839484b57672e2da405b7e2d8615653fa828f8295a442d13f5b64645fd009ba6cd923f0c163f2070710c7df57a1a70",
268
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/ConferenceBridge\/ConferenceBridge.php": "3da97309ccefdb15596bab5180d386e2a78cf938823225820f5b206d8d8f366209dcf96bd139cd0364729c8b733612ae067d03e1e29aef472c4dc82527d3002f",
269
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/ConferenceBridge\/ConferenceBridgeMember.php": "9ee728dc1f37fc183fd4890ca5d213bb1f47899d2379a16009de7ae32b75b459444a1a329357faff349909ee89843ac5798c75699fb2b8d939501f61dc09b564",
270
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/MultiiPartyCall\/MultiPartyCall.php": "d13d863ee416714a697600882f33b88a8bc9de8d5603149fa199f787d7d904d55aaa6646cfdb3d71caa99e4e95d7e352199e8b54230d3c64cfb81924f1b603f9",
271
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/MultiiPartyCall\/MultiPartyCallMember.php": "6e8f1c6a1177d0c933352bc2d8bd54c989db7679f2feb893f430e9e634c446d033d01a82ea740185b1926734f285facdb3d99b18ffcefe83be723fc08b50fc12",
272
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/Node\/NodeClass.php": "b8a08dfe16a42c08ea66d141b3b4471caffd2bbf89fa4b360a1b16a7072ea29d538792c16b93f1e3f1a1a01d564acf1a40906c32482c4cef0ef42f1647e483d8",
273
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/Node\/NodeMember.php": "e13f76753f278f07e8778f1d0ad64c9ff401633423ab2476700ad0711ea5534f7caa871b5e10fbb26096feca64471205082f9ba45de607e7ce71eccda0e7db91",
274
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/Phlo.php": "da8e7b69e9290d876b6ebe6778c09ab68f47f13cb22438ac92d6eb880b7fe72ffcc68c681cbb9be074e36f3ce4afefc69680e7a3493d3046a04ca9ec432d7a99",
275
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/PhloRestClient.php": "5f3b9bb5e3f7dd96572f1dc71531caeb0b14b21ba7c291561c1ebb040c3ded22bfc0dbd9030843cfeda8b4f83e69d86ed9db2b3b7d0cc8b311ec64000f3b935c",
276
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PHLO\/Phlorunner.php": "c1f3764aa4a4c14a33614bc7cdaa05043d268b24f88cb2312bec3596e5e7e5286e9d0429edb8583b640723784b28ebf69df691d5e4ec53b7d7912252832c3ed9",
277
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PhoneNumber\/PhoneNumber.php": "57bb602a9f511dd39c7143c50a9ca6537bd83f398eeb6f198feec689877a9a423d9cfb0645c4d20eaf30490ae6b6ebb91fbf1d00ce633a2007333ddd6273b032",
278
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PhoneNumber\/PhoneNumberBuyResponse.php": "6929f9a7447425d76afae60b91de8d6a5a42a1e7864871dc73a40199181d5af8be9f645185ce1e796e75440d138cd0f69ef86ef404879d74b58107ce32824b6b",
279
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/PhoneNumber\/PhoneNumberInterface.php": "3720a8056618a019c64de2e4e05e99e0b30cf48de07117e75172b8ba02f2b2c60a1e0b12c3cc07b3f5ba8aeee2e747c3eed43b5bf589c29c7236b47b5ce75747",
280
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Powerpack\/Numberpool.php": "a774de315b1d34a61c9b9af9b21b8fd1f624b48bcdbc7ed1302ed25cc21093e05ce1533c0ce4788ad36ab28792878321a99b941cf9e1a8ec7fa2f2ab1d16f872",
281
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Powerpack\/Numbers.php": "f62f6534b223fa353f2363e38fb1069c3d10544a4cae2efeaff30019c0cfec7de2b4b9f551cfc16bf26fa1dfb916f6d916f9cd1d1357f8cf6f7cc84815812237",
282
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Powerpack\/Powerpack.php": "895da995fc1445bb6f7458c3904c918d8ba8e8db75e94e558f04ab8355058bf82d881d7c282fd8e03acf723c232f3081733a9ace2bef1da42c3e9f4de452d2cb",
283
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Powerpack\/PowerpackInterface.php": "e09a8e4e67ece27935a81730b7587bf29afe72ff9aac57b6c0efa6fdbc4b7cf4c91d60bdcc506a2c0b86f7a4cf7df70c38135e295504417d39024a4671b3cd33",
284
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Powerpack\/Shortcode.php": "afd1a0a277918a55fabfc2b46460ab6a8740ac68e1d7b9a0180d88229d7a93269305765fdc362c02cc2996ff7c3d8c95417bc90bb74e44f9c2cf12f023f45b08",
285
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Powerpack\/Tollfree.php": "0c63aaf33046375a8d7c0f9c7c092ca1041f553b1987ad5e2944630dd23f865785e06205b0711c215468630455d8c2264c0b141fee5cbdb4bf9430e6ef90527d",
286
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/Inbound.php": "285fd073a2fbf84c533af3c0e60b369689592882364413a1879691a025655bf4bdc40831d13d96c59ec7a8827233e92d478c14d1d648df885c75fbe3d054351b",
287
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/Local.php": "5140df58e671179a4edbfa82fcb7b7277e440706406200255ade35177e9a715c3340f5920c4a57c351b6e222f7bb1ef20b207d0830c487bd14b9fa713d3d8c4f",
288
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/Message.php": "ae4e8bbe3a668748ba57bfa571cabcd97932d6cb7a8a63ea04689863ccf75a63e0aa867fad60c39e263cc685521a8465b46f730014933dcdc941ebf152fc437b",
289
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/Outbound.php": "7656989e6b1da4e4887f8443304e422ad2aa01c9c05aea5b5245b4f3edc333935be4f573fc5105e13cf03ba6ed0ee0ea323cc76c833846bc5cfa01f3a0f33763",
290
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/OutboundNetwork.php": "900ae54c0c0aa0f85af4f02da252a34907999bcd311e9e39ef8d8e27a16fc6c8bbde5d5f6460af6b8e68cf584419ccd7fbc4de177cb827cabb5ae9b2c896494e",
291
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/PhoneNumbers.php": "cb51001dfd504ac52dfd39e2a0fcd01686de42e78464c76767f99fbc7884cc2d6e304cedd72e66dde42852f72cd833dc49dc1e92fe1487b2682648432e7979fa",
292
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/Pricing.php": "5d197bd5eef109ba3d877f6de48f8567f135466adf1d811d32908d8d4fa7c8961592733d6bdbaa4f646c3d25a31c8098768dff183d192617b2c1726e8f41c447",
293
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/PricingInterface.php": "dc940fc2f0338348b06fefb22caa65b98fbfd37063621fb4e4f1e23c5dfe21149e2e648c1a32b09012b34c5bd622fe28126bd33ba1255c6ae3c370dabce6ee97",
294
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/Tollfree.php": "ad733c0d904ecfd646e79a3b6bb3ade270f99df5e6353bd6c8695322a71238fae107a55d33167063dc2e4b1b905273bb0631f051d06cbfcf5d01c94e9252fbdb",
295
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Pricing\/Voice.php": "ab645548152bfd840951e981c0d18aad23d613afefd4453af077a6055f902d6bea6a0bcc805288f130da6686d8419913e86422cae35b57c1087eea3371b7e799",
296
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Recording\/Recording.php": "def8da050e24afea59514b4fda360ecd1d80a49df2013b258e3d78304d6eb2ccbe21ff1ac50a851079234a1460d0f2750da8fb59c9ff184e8ba1f1becdfffe6c",
297
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Recording\/RecordingInterface.php": "1953832ff8be0a6801f306632f3ca3bc46f067d08662b8ca6d53e29d53507a48750bdd891d2d0164c029f675b8c4c1dfa6765c9abf328578838b428dcea22615",
298
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/Resource.php": "b8a8f583217c43c3eceedcb8f047efa1569bfe5f440fcf4f252f1a8402f484e18abff63229521f89697c1f7df21a2ff919488fcd9df42b5aaf7a160a50f0c62a",
299
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/ResourceInterface.php": "85bde5b0479b85aefa79139d36192ac334e3deb3a07353b7b1b0cea1180a050a92dcb563ef4a968b6436f60ac990fc5c1322ba3ee6f4ffd41d2997d604653b6b",
300
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/ResourceList.php": "71fc010407c57d77f5b31105f6e645d04347d961c3c81eef6cacc7b8dd475d86bd228c5ea5dd5976ce34d025b0753083b5361a47cde5d5daf0507678762106fe",
301
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/ResponseDelete.php": "3acf13bc2797c0ed58c78abac46ae2822a67b9c9194b3c9864738516847618c0033fe12c5a62d9dcb7d110ffd4264c534fded370d04a2960a2da32059fecaa8e",
302
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/ResponseUpdate.php": "4db3ee43405d0a456dbc23801c2c0d71676c3f88ac7c4161395ad275e7fd0dc6b53aee99a882706da4f14fc6c35844d54143a7fa3b6597a5a25d59ed67e0e6bc",
303
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/SubAccount\/SubAccount.php": "b39e628ab06827320f3dcb47d3ea55d459af1a133430e8e51e8e6aed5216c31b54498c836cfd2a5c5f2d9cda4bcac03ac476bd8ae81c3ee2c7865ddfcd359dfb",
304
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/SubAccount\/SubAccountCreateResponse.php": "3b92a7ef8da848a7a5d7b79436ae557657e97141ecb2bad076e69d495d78f94f6e9c68464dd7e790d64dc563428e4567a1baf96df1f8bc97cfdcb946e60e94ce",
305
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/SubAccount\/SubAccountInterface.php": "a4cec509ce127faf30261cf75555a2905c6e551223b4b90949251f0822dc20d7b97efadbcb6bb189cc9302acffed8106ceab79628a7531c161f4f713d6a26c4e",
306
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Resources\/SubAccount\/SubAccountList.php": "228e0fc0fc27fb523c9d2d9e62de77a5deb3bb2a29c10d91d7c59b6cf36b3e12b8b1935a69fb0ceda72c4008b2a04436e6aa3f84740edf265d0f647eed7c52d4",
307
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/RestClient.php": "91f01799f98c6d65e1a0a8025668fb0c9f5fa4b77d44e86790b34599c2b9045cbce2cb3a5dcd93a1fa8523cb688d9f2b895d7d5f2377f64f2e33ce68e621dd82",
308
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Util\/ArrayOperations.php": "04a84eb09d1ba33c3414dfc74d1c4b31c3149dc8e3a038912be632673a92e693da8e531a987c5ce747aa11fe01bf65bc05ac91924ccbb8f157c15c62f8ce9694",
309
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Util\/jwt.php": "61ef00cfe10afee4047149729431595a9e21d44b25de3e8808014312a869110bc22898552fd9216cda6906c91de2b3ef9d723ff0d4e18020d1b7f5d1050fe810",
310
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Util\/signatureValidation.php": "2bf40afd282bd8711459cff1b366510ea253508349adca2f64ad101b6c4e3e20bf405194b9e421ea7cad5b738716624127969de5497e16e3647872e0b3bfc6a6",
311
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Util\/v3SignatureValidation.php": "d70083f5ecd20fc41035462a2a27e04a9367d9b7b13e6bad5579dde4556ff187b8ecdfa17b2c07a0fcf88cce0141baf7dccfaad85a17aa2fd1a7afe7998d1037",
312
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/Version.php": "365ed59af02f30183af840aafe55b67b682919cbb3d662f860baf1defaede8a67fccc5a7f087209494239466f356fc83f612faa02f9f03a301f5ffc66b52bd09",
313
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Break.php": "89a669d486a72465efc2c6128deb6760dd86c9fb69cd8c0f57c209d10eb74067efb50bc6f0e68e2d1c9c2f39862ef3fa03a35c65b7395aea6ca963a013869658",
314
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Conference.php": "bf673327e263996b05a0b45e323168e3d44b27a65efb8a8acb0eccb0276360c1a0391f08edc34ac617aa079c6c2b1f45eba6142446a7ae2286e23f337819caef",
315
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Cont.php": "45ed9435166f1b72dc5ee98afaf3547ae646d16d41677ce5409a6005ccb9ff23743e4c528385a1e0a8f5570eb7ec9374433f609bb8cdcbdfe756842f1005c52f",
316
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/DTMF.php": "14c619e3f01d6dee2dbbe9b718c6c64458a97bf70ae333455aa45c9cce91e4bab693f5265de0099c9cef2334a5310bb85e3374c5f0cde9b93c3051cdf5b57a4f",
317
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Dial.php": "5370d1f1a1ca8420560fa204d295558ba9aeb626fb7149ee06e12acf7f4b7d079307f329f91594e138847a2b3dd9e3f3e9a9e6e774a3c1095c3201ab249e9c03",
318
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Element.php": "4913c3c78365a85eb5c90aa721b0e1cf535c00d5815f509e336ce635cf47a9d9aed1346ff0cbc875eabae65190be2875d0820312a6a5c90c6df3acfa23bc80c0",
319
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Emphasis.php": "d6fda7993f909d3a1a50441ef74003811252d68a33ec2da63d3551236a005952d3b6c7e2bcdf5d9c85d33bee2a9255dbc2b95988cbe0e115b42eeb667d58ca38",
320
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/GetDigits.php": "e41a4e05fd55fec82a24cb2a545db122000251abc0986715a4d5866dc64604ac340c59cf0a30a35ffeeaf17713eed730a7705f32aa20aa3b14ffea368cdddfe2",
321
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/GetInput.php": "cb11a5e0311d3b8938f7d94462d24c5d4b8a2ea4d733943253ffcf36aaa648cd3a4337d732799f382526e0e2b2059dd1489e9ac7fc5ae478eb1db07b3830a711",
322
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Hangup.php": "6a7ac35846ffaf61d8de286929bdce05974799b26b17f4d61e68b6f740cff49bc4a0b72899d1150ae03d72e4f8c4dc7cac491872e76be0aec6b1a665446a9226",
323
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Lang.php": "c16c3db519373df61712fb1748f91785d79ba0fcd7e85a32cff1d17ae89768cbc10b3c4cbceab380fa9762cc1b6948d8fa56054d78185f8c9c1d6c60a012f527",
324
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Message.php": "541a76d5dc1e25633d7bf67c83d1fa123820296b4755e7e48aca094040ba0c2acc6215eb29176551516941b8e8225e6084fbf89892893557e12f678cbe2abb86",
325
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Number.php": "82569de717d895eca9c4270a3fc48022e666e59e6d6c74dffe4982a8db1f6031d80c51863226c750cef5db111f0de940878baaafb352153bd0d053f716c43fe2",
326
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/P.php": "d8bc0f70c13af91549bf4c37ce4c95b6683590ac9c9a3006bf2a4dc02d85ea63a33d0d8fce4a6465f25e0f86b35994d98e7bf75c07e30737305a7f2707ceb444",
327
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Phoneme.php": "9bce52123dcc7451f21ecb2e155884479b7530715d78d175cd616da86198151481632af22cfc19f9c70a4cf0f29f3262f335982fc9988e4aa3a435cd74f14c59",
328
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Play.php": "9b25a9f3a6149ad856c4aa008c405192bf2804432d83d3a572cf066dbb151b8298272b0a9185bb26a5faa51c03d069aed172ddb135d4dff3fb99af9fe982ded5",
329
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/PlivoXML.php": "03c37815022f4b4e7ea917f69b5516c3bb5499e68b65ed1b50f7427d9827de1e84037745d25b420c1f81ab829f51ae752b126943005c82b06a668c8ff895e923",
330
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/PreAnswer.php": "f66f22bedaae6dce341d650d5ded5007d867361c570162a642e0a15f5fd6e90b49a4c8fac2d3a1cb5fea446c75e30834a1106a3acd1ac02a87b5a7df7c1d5af2",
331
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Prosody.php": "12c8b634b226bad4ec0a7dea7b8249959943bc5ab0e71f75fd42afbf6d1413834563c38430e9348bde2cdf1059f266a2ef59fb7a8f6187ecec135ee9d5dede4b",
332
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Record.php": "070470af5650220e0556baa6b109684e1abceb6e80af620ec750f0c691824249121e1c6aef6cc1c91bebb45b76ea9db24f9cadbdbab8857b367ba2521d1cd001",
333
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Redirect.php": "34e09e0b208c4dde1c4b53c451b09f23985c8f74737e73f4675053494cfc81b14920afd6620ff161877c4e1b7b6e7381cf3f824a2b06508d84299aa4e0e45690",
334
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Response.php": "8db3a9e823e3c11b8377829c783d93f0b7cf98afc6d837e514803b478a7887d6602bae6efac9dae6a2e7683d8409c23f78c463185754fd7916845aec23e42c58",
335
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/S.php": "d0dc3f3bcc818d107fd8e4be38718587edf610e3f840d7e6763ce8fef51a1e96de3b49076995802aac9edc7d8a976ef024a1d45ef634599a56d13c56a8ba73de",
336
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/SayAs.php": "46c8fff6a9dbb36df1bb14d0c4247569e00ce77b37730d7f8fe6fc4a404a632ae70e48c774f40c4ac0e19b10ecca7c09686c7d5a6fc7d5311edcba657177b6db",
337
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Speak.php": "d18aafc18ac404a85d18627ddc66d2810ba1061f8e0d3d3634d5f5258b239a139649a8cf479367dc026929010288a291aa1144aec2415a2de6083040b8a4a96f",
338
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Sub.php": "9d34d26e76074e65fc01a3a477ac176027b1ceb5dca2fff450111bd2cfc0027c7f7338777b494728ae2617a27075888ea699d4226b60049c4fec633d42cff8d5",
339
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/User.php": "2dab0ac6bb38d9216c1b39b81ce20f1a2af1d385c90ea13aa566176eeb288f8ce80e11048209abf8c38151207137cc86b754b7784cc478dcfa1f567fcf929520",
340
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/W.php": "798d6f10e6d07a54b29916216dbb2382f25bbf2f96e15906f842cd2ae4aee22b8f3e56535264b1da6d40835d5b9da6a9f4346303f7602c9562587b29fa419f3b",
341
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/src\/Plivo\/XML\/Wait.php": "99e6e66fb4d2a81f0419ac823be64ea8c81e6ffc8313934b41d6189519d053b54b5e95dbc7b869dc979b72b551b5654dcd6eef0540c3b01eb900716e97d52dd9",
342
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/BaseTestCase.php": "662140921fab3f1e7be65bef2d063673900eb3c41de8ddf68320de194e254ec3fbba3322790812c258698af81da35277cbdfc0d2fc957fd5f68956e7db2ceac2",
343
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/accountGetResponse.json": "1ee7d7e260e8678fa70fa47206ac7c4645e9d698da7017ab05fb56266710e34bce48b19d3c65541a084be28cfe918e81fd52073064071daba77355af2eddbbf2",
344
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/accountModifyResponse.json": "ef0e777d38b4605ab58d951f26e975566b61a26ebe5710b9c8c7588aae799c68cf76dc5860f44aaa666864f3fc1f74185b5eba888c1dfa8c2004fb8baf6d859a",
345
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/applicationCreateResponse.json": "19336630707d50a021e3dd3cbcd8a229f9f6123211e27fdba211494bc40e9b9fc5573ef328806bf00b937106e7c894ef96a98080f6003d91cdec67f50196849d",
346
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/applicationGetResponse.json": "26a3aee28fa9219455b0c7a54d47eaf1ee7e9fb526185d1598d5611246c1ad7b0cb1abb05b12d21189463955e25d2da906cf5b04f1bd4c3b826d44de47c0d56d",
347
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/applicationListResponse.json": "b363791ef3276030677b53f555a42deb02a9873cb5b21e17aee9176d425ed38c562da7fc162cf5771f0bd259b46d615ded3799f34f6fef590e2df97180ebd228",
348
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/applicationModifyResponse.json": "742b49b7f428a281b1189fd5f23811931f2d6c71fa271ead086b6acfac63bafed22b86f2e460fcea35d8bdd46786c5db83707f35c7a855efbb92e51ec01a4859",
349
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/break.xml": "6707a46a4316a9f23104a23e4ce9c79f8b4f969639c08f5196a9aa94ba3abd4a1972a29d6131e563a685732e8cb0a4fc90a76f2d0ff5b72637fba2f974abecd3",
350
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/callCreateResponse.json": "513446e1e7fb97b30b86dad2119bc9fe73e70f01f4976ac40e57e41e7d96a2faf978fc72fe2ff49e3326fdef8e17cb4da24bf665be81089aad1232716e42e114",
351
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/callGetResponse.json": "2958c05e7fe02f5f6f2f8834b34050599df05c6f5751fde2fb038853383683e78b2b33b9534bf8da38770173e08ea9c7015d7b2d4f270efddcaedffd77ce661a",
352
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/callListResponse.json": "b2b35a27aaff76dafc6f5a42b6ff515e56ea9d7c196670613b97c2b4c0b7f2dfc3ba7ca705b2618f3851e1db554268018c7c2bb658e94b66493576048c54ab49",
353
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/callUpdateResponse.json": "06be7ca7ccaf82f24f23e8c33382d372ba639662283023a9b6ef555fa24d273efd845ab27fd423dd4267d66a8df24604f96113aa3bb8f8dcfa49e713f3d71bbf",
354
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceDeleteAllResponse.json": "6722c7663c8877f4bd5d417638d5a0fde3db7cd2ba1880dc66a7ce9ad25a14de60b4942d84647cc21c0b12211227161349109162ef3eafc2a9607c2645d3c93a",
355
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceDeleteResponse.json": "9a8baf62bab7971a89490d637633a3d498d4442bb11ca29486d21a3dde432ca6c0cb36d236bbc94859efac83b2e56d33442a13a4395f4b026dfece2103ca790d",
356
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceGetResponse.json": "950fb7d6e6e120ce670da43937ab4ce9e7a7df5296848cb52261f5f854bd89d47f26d76f89929adc59bdadbc8d0e77de79f29edc5d6e6b4b73aff1a0c126bd43",
357
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceListResponse.json": "9f5635d9e0988b03c2bffa8457962cb6870a39d4354ec6c065b58949850b188d2829fcd3db1761ec42a4bed30ee3704b6c353d2b9372742cd6d8b00bff273dc3",
358
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceMemberDeafCreateResponse.json": "b39ae8d7a1de7d5732afdc00da955a91850b855f6463b143b5837023dd8281b450fa79635a3fc729b5b198c6af5cb57f9c6797c8eb56daf72b7c7131196fb4da",
359
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceMemberDeleteResponse.json": "ec18404f82674de8b7ca25eaf95074cefef51b13b038de14dc9ed5f2664c6e6c5c87d3f7a08eeab3926869e171ac26d1647ba1cca03253085a194cb0fbe16975",
360
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceMemberKickCreateResponse.json": "9f924beac462c4ad9f42a705f7bfde5aafe5e73563b07e98ac9db42e95d3c657f5c4ba0d6ea64b01e2e061563fec41d53f8ae8fbd7f5e08857a903c948019e1c",
361
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceMemberMuteCreateResponse.json": "c3f1c38b6c8295b28d531c446199454fd7422d00e3cf71fdd318a821edca4afba444f8cea38175c0853b34dcda5dcc2c6317a9f3103e16474fb36c43241a52de",
362
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceMemberPlayCreateResponse.json": "ac345d15512ca5debe0a20092d8a4bba1f725a581799a632bbdccea771f1b6094b6df3362120a29c1d9109cd8ca8857447c3be08436fa94a5a4304725b75ef4d",
363
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceMemberPlayDeleteResponse.json": "10b6ab89ba98b9d6d08dba8637971ca9260757c318a4842521c7d2bb2a1b967498453aee4cef6fd964cf2e614c25364f543412a0a88b877154b3faa9f18ab3ca",
364
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceMemberSpeakCreateResponse.json": "b2b01526d4838a72c816ad9c6ca7f9cb473a89818d4444b48aefc269d0173fc9eeed1e2473667517280c18315d67a548f41937ab4b7d26f2edd4d0e13486aff7",
365
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceMemberSpeakDeleteResponse.json": "d42658e98680911d21be32033be208b53071e3ee2c514a86809ef4d06cc138ca0a74d9b2e546c54b51c66f3aa891cf0ba3b4db9a6a07e7f06ed37bfb39ef3a6f",
366
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/conferenceRecordCreateResponse.json": "c9d8570ab20fea79181b1416cdc44b8e9f8b18b06ad446a0929ecbec53a6bb3d66ddc8609a2baff92d8ddf9bb68b802ac4eb3d62e958d2cdc1485711a6286ed8",
367
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/contSpeak.xml": "1115d194144f96d3b4ba895d45268e346e7e56bd308b4b7c58bf62712380908bb71d5250323bfa6d13b8d25e64a86580437f7ac1f2c63896965e3c13909c240d",
368
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/defaultSpeak.xml": "2449ff96f102465168a4551ddac6ff85bc680370b423d46ee10b345c128755560e0bf48c070081e8045839503450c0f8b443fe0b33b455410ad5dfd639a6adb0",
369
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/emphasisSpeak.xml": "1ae7422578c6921013c5dd65650f0c1efa50512824b429334cc150ee6872dd2a7981a125b07a8023e360d8a881a32333de24f1b595c95a339507dfb29732af83",
370
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/endpointCreateResponse.json": "e0cd43507839270c51117e48fdf3158e67662c1bdf9c8c964b57a13c15517ab7c83483855764b763f63bfee011bb893c20eca7e7a0b3b8872bbb1f26228ed720",
371
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/endpointGetResponse.json": "05359131cc3ed432c1b29f3766d019be556f58e5e7f7b502d866d0057c04917ad7011bea5afd7ca8f2814dc75c45a52930d48464f7fd740ae94b45d0a07d3627",
372
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/endpointListResponse.json": "d6488ec5e6277af9a34629d901a211e37c9a522107f84ea77f861c417345ddfa409d7de389ae69b719997600a0495289bcde64791ef07c257f75bdef4fa8006e",
373
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/endpointUpdateResponse.json": "3f20870d3ef78c57407bd42cd424775a7014473d891020bfc41fd78c9187acc3d7fc2a2d7a137eb5bf9e8741525db9aec853889b11d2d3ff508f7fb16a4bfc88",
374
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/langSpeak.xml": "1eb16f6028ee00a12e677560ec9b3ca4921deb2d6da15b3686c43f506e9a13ab0cf811d71e942e1f225989f3a486ee39b4949d17d8692ac0a50574845491cc8f",
375
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/liveCallDtmfCreateResponse.json": "f30ceb762f24445068ff4a688935a84cb64840310bd518806c1259ec26fd60da6a8be9f11c9c0882d08c857058944cf1c69c95035517716dba322a1a865435f2",
376
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/liveCallGetResponse.json": "339633aa5d9cd2aea4a86dc48dd8c63ea8c0c56d5cc0f4513bcd2d66df425ce4b74b246a8c39d6cb0dcde75a8c01d4ec8347e69342649ac27599a79a72fafd9e",
377
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/liveCallListGetResponse.json": "7e8efa8df76422d6a9bb0133c81d96b9ed932f7f529644a109b35e9f8f301b3a548e8e7f6a9213e301f25e914b98c3855160ca7e0d6f0283e947cd6fc95c5ed8",
378
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/liveCallPlayCreateResponse.json": "4cf2ddd4f3087fdcdf772219c5ed84ffe1dc027208540059bc532961b6c4cad382bce98dec481e0245c99e288c9523e8f33ae7c3c35316c8130f49f81db40604",
379
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/liveCallRecordCreateResponse.json": "02f2c4c88fc63e5585f6e5988d5f615488507a7d7eba442430753a60f0cc2763c38abf905042c9ae0f7d017dc50caf67f269267972b5a7fdd4fe7675572589a6",
380
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/liveCallSpeakCreateResponse.json": "ef69736cd0199704894c2fd938e4f84768b09a6b9d2f334ef0a83b1750db0bf0eab538471fead4397b49ffa8e86011da111e867d5d8b3532bf3f4250958d6146",
381
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/liveCallSpeakDeleteResponse.json": "63a9fda757cfbe1a338c42f19532609e8607f3c2c8a317ec8e5aa2a164b0e9f9a652129bbf7fbf9fe05c38a0f68138ba10b4d256f48dda1fa292c18f2b717d3b",
382
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/lookupGetResponse.json": "6b2dd461ce651012160ed88d092de0859ff1cc132c57091a1064b5745b83cd6e5144e8204b6810da7bb675eca802fff54fa298f03be6ef858c59058acd24e640",
383
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/mediaGetResponse.json": "251c9d7226411a160031776b1c7039d7e7f3d715ad7bb89131353611a2509a570656b8e29577e505102cf588ba50cab34b3b74351dd33e2a99333676d48b7aaf",
384
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/mediaListResponse.json": "1512baf046701056ae6b5ef06a1e6405cd62a27d4b82f5b38ed2b2ef6faddfd147b6d57074d04d77cc14325d50d7908c0446acd4a5a0355e9dd9316f80b0f448",
385
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/mediaResponse.json": "329e01ec90033528ca170704dc7a3de8f5d004a609fda5abaee4ad610b1559464a97b423ca27248f49fa3696f12ce6c1b3ef69ba198ae57877927ff78257231f",
386
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/messageGetResponse.json": "10494dc350e9a659083f44802a899a893e67fd82acdc506210c827642e27bb4ca1fca7c00a73a7aa20900ead392b9983ae719c6a9aaeeb0ff9f9b9e02539ca4b",
387
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/messageListResponse.json": "5751782fdb135ac45cec47687b7bcb10d4e2c4c8ae88461baca0eb6f0f81b8144aca9b610cc6ef7f3cffd4b5dc2ddac08247e74608166d147bafb1a9ecd4b834",
388
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/messageSendResponse.json": "ae5ef8b7e2a5db03fc5c04e96cef35b3f819f1670cce72e0e729b57de018bd6ffc254e00f20fa7c662eea100f78bb1824f0080275ac270f7e1229566683fc62a",
389
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/mmsmediaListResponse.json": "fa4d1e3885b6c84d72c9f9a4a414de7d1ae1d574db325cd773600c7a17f83fcbe2a84c0daa8fc690d5f5d95431b1ffe5097c17279593ccb4155d5f99b1a853c6",
390
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/numberCreateResponse.json": "e7acbc2aac3a716dd50e27de2e8937e27fe70da7dfcce17561f4d81a2de53e8cdfb5a695255e1ac65c8c49e4b894722e7ecc9297b9d040dadff97d1cb61ea414",
391
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/numberGetResponse.json": "261a85df87eb4ebd1d310575e8f33d94f74c30f5ba3aef1ed47654f7569ebe4310019c5dd317a8c6e2b015a1ac3f72455118e0878d688817580b18b747d6dda4",
392
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/numberListResponse.json": "134543e58c07917a79e0498e85466b9cbb1c97a0e3087473463419bc6c178bc278ca75e148f885eead7f6b1074063256fa61745c57a0dec4ac060c4b03afc499",
393
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/numberUpdateResponse.json": "e7acbc2aac3a716dd50e27de2e8937e27fe70da7dfcce17561f4d81a2de53e8cdfb5a695255e1ac65c8c49e4b894722e7ecc9297b9d040dadff97d1cb61ea414",
394
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/numberpoolListResponse.json": "961fe25a8fe8c35dee1b0608a24d741b6ab91f2104a9f2af2080279d6cbe4e631416d7b3d8e3772715e376a603cb740d652435a0f2d7971e64e00eb44e7cd518",
395
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/numberpoolResponse.json": "c725314dd96d000028683c175528d15657c046cb421add91a927472c235ae5c1ee1aab060aa0eec56b6c717138623684f827a2de50bdbec1017e7bff937b437f",
396
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/pSpeak.xml": "1e49af0752b825db21fc50126642fde3f39dd8b63cec3db00c3df92ca38935d58b8752ad14928278b98ef23421d0926d624b6aae948f9473398d25e2d087b963",
397
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/paramBreak.xml": "1202da39615a87758a5fd85096a4d98f6c2726d705ef0b1086cfc66cd0f456b15e3f79d9850e1bb8b99e9114e41b3ca19ee4fd269a42c002c205de005c72ceef",
398
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/phoneNumberCreateResponse.json": "a1dd38958ee69b5036aaa1c86cc730802dc2d7612eb1de9266f9a6651f6f067cf9a42d44c736bf85d1f40048f01f99fa05ccb3fb26baf3875e3bea98fbb9bbd8",
399
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/phoneNumberListResponse.json": "f2c263fdf122dfcf98289f6cd9276cd8c22fe4ff5bffca19b3509800d07909664e9ddfa3e145da04c06dfc6c5227a39868d17ca947e55b65a9cb18a6faadfe57",
400
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/phonemeSpeak.xml": "30620187252e4a92154e06e611a2cda1ca881a0d85b1c6c36e3c713734c0be9ce79bb9ad38a11e040cff437c5676c01638eecbacc5b50a20e0adb506565a9475",
401
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/powerpackDeleteResponse.json": "f170bba1b0b6bb42c88bc74353ea4db09b82f07f5a2166f693d0579e5b7d6beacb8cf11e39cff546345333b14752456212584e284c2c360cc673d009fd2aa018",
402
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/powerpackListResponse.json": "0cf4f36945bf4f73377a6688f99bb3efb0c35924ca9278bd777ecd0081c3f667d45de4a34f7101588b7a7b3b20179d18a393dcc468ed88df8eb53b5e2463d7c1",
403
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/powerpackResponse.json": "4318b75a2ac1642f6ee33fc62f18765a5142aa52e0353082a9d38cbc7660e40f24e1665a59c723ba90ba9a86edb4cd4a396bb9a0c00cebf6d5944e0ba84e7919",
404
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/pricingGetResponse.json": "25a616f338c147cb22228535abafa9c1439f663230d1fc5109af24f4f11a637c5d0cfdbfbf3b2762b87d0b4693f14223254e431f3b8ab1f518b32ea884e2d1fd",
405
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/prosodySpeak.xml": "0529a04b9ebbfc245e7d50bce1177e3eea9f0f6ede900e9fd3a447f86078ca86fe8c9911fad4645494cc784394194c5e6b63141a2a9125a1ecdde2cbe8bd7c86",
406
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/recordingGetResponse.json": "bdf9cd97b6c687685b9c37a0921bcba910dfc811abe416be7b17fefbf857c3ee1233e987570eb444d168edd660c26acb55377f60b8aa0a898f0c9af1743edc81",
407
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/recordingListResponse.json": "2d831eb418cd0de8a0d63da8a2ed133005a3e15e4e021c3451a737c45f42e5753ca5143204acf2f8bdf6ee91cf1ee8b04ee960f942ae0e62bfc3583ab44a1dbb",
408
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/sSpeak.xml": "b81f50357fb60ad968d8e949aed15c7544abed0a45c26c5bdcd4b166fa1d9bf74f57137fcfd378fec345e1fb2281ac38c30b2a3150cc6fcdc13581ea29379796",
409
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/sayAsSpeak.xml": "84e2d4a310c8d1fccc5be4be4cab026e1dde129ed2e18ab4fedcd50512cee91a52cf437606cc936c474cbfa508a105f36272edb6bcae29388f2a75bcb354de6b",
410
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/shortcodeListResponse.json": "449e0c165ad81254715b4521e5f4d39b0a6d1ecd583bf337e8b85ba40550a0942c04a8e33b69e5327a275fca4e42e31dd1719f100c8d6e459939a3696ede1a71",
411
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/shortcodeResponse.json": "867e2309b5c912c9dac5b06929a835b578b0dd3391c43f6e0d454adccf997060e1e5013051b394a94d44af3e5cfea67a88f4376088a376a031d6fde5fafa09be",
412
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/speak.xml": "a781afeb86ed31833e74d834de6d9834783264ec43678fe3e70a7f963e97a9dfd05dcb5ae75f51fdeec1d5d8d299d8c476454307a23efb830022a477500c02f2",
413
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/subSpeak.xml": "06ff8e0c15b36727265d9f80c736a1781438c04445e91bd563b73a1f9ed4b501458f7e3ec22607dcd96e9f95da6e6d874c39381ca061a768c2b664a1b4bfc504",
414
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/subaccountCreateResponse.json": "7fb28239b065aab21f14d158e51ab6bfff6b10de97ca558da02adb639fd15e99343ca54277d0e0b0dc6be11c01abe6517fcc2f0e862d5a3538342f86bea87994",
415
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/subaccountGetResponse.json": "929de7e767657a691c8bf34be8abe52990835f9787114256bca7a1fd6016b34798d36e2318ad3d4a2a8931986d8034e2310e4b4247fa38a84314658402aa3bc3",
416
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/subaccountListResponse.json": "c57bcf1f52d302550eacbe5492bbb1cc17bd399d03b6c83971bebd83fa8be975e97859063a2115edfed47f622adfb413d5c28d6cc180710211bce192d867052c",
417
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/subaccountModifyResponse.json": "a06022b797598bdabfd7029128d9ebc9934784edf77175292c17b60152e7464938f78ddb8ab2883e0da22fdf94e584d0fe8d766c40228bc0a564e6ce76c39365",
418
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/uploadmedia.json": "35f19877904dd5eacf97183a286db18153002e37159f6e007c9c70644843d73963e9293a5e64c1854665821e36592f5ca11289d2ece86fafb3ddc4b8b758dc4f",
419
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Mocks\/wSpeak.xml": "05cdd9418d049dc33432e02bc305b10635daf3bda936c695c4136bc4bb8167ac63e6ae809202a566e5a1488d8543c06fd9c52f869b03a474bfc3db560769c00b",
420
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/AccountTest.php": "8a98fbb165ab60db8a7423252e78d9db1da922dc2e1de9ef5cde32488c04380ab01e8fe53f4f542c602b28e574966adf58385456388fb4aff543dc04467de668",
421
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/ApplicationTest.php": "e23381682056702928ea1c587bf8241f71743e4349cb30b621f2c843711c108c0811689c953ecd52515b2c780c50c134f959e4ef77ad2c0dd65dfccfa8c79c2c",
422
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/CallTest.php": "7aa7df68b91782de7a8ff67ce4bdce917de03ce4800da2d6c103f0d1297fc26c09effbbb7ead06d70566398b8679c54246213c4babefca43976c289b8bdb895c",
423
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/ConferenceTest.php": "3d1149c50cc760ec57de791d7a1eb46a5210c113fe91e1756dc642d2d94b333067c9c3c5ff9d0c90d9ad8981963394d332287b57b84c634c8e4008ec5cb2356c",
424
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/EndpointTest.php": "aae4c23a72674a9d4da6261986147a3b3a1c5e4da03d2efe7f4ec21336e03d352ddc0f7e47dab3c9b4063a170d37e0eebeba649ecd1159d85a3c5553789c51b1",
425
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/LookupTest.php": "c436483d9ad54681ed44ef7a6b44d4899d06b7b421be27d2a076aa4bbef23a5d160d5098c60d5c380a8e66ebf8245c917074edf6a7b682d056f9f60e082de032",
426
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/MediaTest.php": "a6ea3f17046c123698c0b8fc1e7cfca6665159166dd53b51d1b5a7700373527c7346a90e67a382f4df26ed3f92209790c3ca93c0c3d3b653d424e17a1fed9f17",
427
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/MessageTest.php": "9749cc39c4acb64b49150958745f19952ffeab648abf06ae839eccf8eb9a6c66bea62e7d8fa398dc48a79bdc97ee063df934ba827632faf88f4aca01e5432181",
428
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/NumberTest.php": "9123fe40158482d314279a729e4c5c0eecf3733884ea39df16de986e775e93e90b8d9c7ad35fbde8f3d4cde3e02b33c70ebe87cbb27039615de8213cc27aad47",
429
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/PhoneNumberTest.php": "4b52dd78392c66e1d1803a278ab98bb03e4bfe5275e28b043e4f672357125b4373acece1c2c5668081be021a683acd2796e6ba5ff2646baf3435dda1d6de7667",
430
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/PowerpackTest.php": "52a3c6967c93b1b996abb3fe7e40ebaec915e58e715c6943b0f5ebd945c8a59023184dd1339cd044d2f3ef1a0041a61559a41a3832bfc222332fd85bca8371c9",
431
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/PricingTest.php": "91a088d32f726c2eb49160363f7a77d351f3f65d43a9282cbea646310e2d01a33d22a2adff9ce5795f949bd205c0b6e77571f0a231265514704f42bdefbc51bf",
432
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/RecordingTest.php": "353008dcfc66ae09e915787634877d598930e60fff3f1e6eec0aa5590881f66d78ebd79aa1ba2b2a20409e4b9372eef9ab28406c9fd29f95ca6c773d8c83fa63",
433
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/Resources\/SubAccountTest.php": "6dd803629402c6f7b8d923753477f6c03d6cfbd50aa59fcd63556527cdbc3d932557b318cf8c7a9f5a9d3ff8ff143ef15f31256e488fa8c35cd62bf80ae04d5a",
434
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/TestClient.php": "8917a380e2cc030228dbb37a7a3aaedd2cd624d8102eee1fc3469a9838f31f7ee734a40cd45e510d63bf4c1526da4bb3af8d45bd4ebd4382cc9fd5bc2ba178c1",
435
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/UtilTest.php": "6a66cd73b0cd403f64f8a4752381964bbac7507b4449e81c9aaa64d61db244128c604a8995327dd8e8ccc8a30cee7a3a57fc617b845ebe65a65ac38125ca7394",
436
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/BreakTest.php": "740c84bc38e7044f5138e3816b72c6a94bca3accb592733421578a6eee2080bc6721d85cefeb8b6f1db751e2056fbf722e0dae61d260b089dd803e72cd9cc0d7",
437
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/ContSpeakTest.php": "f3b641231907bf807c5c09b65a13409ea054b0116b9b36f5bbcc2bfa651592ae1f4707be5780c37c5b9f1516044a9f524f4ca829cd0b5387a6a32526ba11cc94",
438
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/EmphasisTest.php": "b76b6d0eee048b44965f87fa6f59614e64d885864ef3ff0aa2310746d76304fb5ac6cc6d0c714e7560e5472e018fd0183cf9a918d3e4ee5415723314d7d219e6",
439
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/LangTest.php": "1a4ef409ded7d9c7abd8c63994dd3e221b16bd1fcca8133ce43e04b300a28468cea68e430098393acafb78e537e37b0574644735cb84fd08e33dbd828e2fb071",
440
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/PTest.php": "9084715ad9065f1a926e8dfdabc5816b16a385dd5cd74f16f6fdfd1aef043b7d344d9cdac4b9dc43df85e8e63f329909553e20b86d995d9eb6d25d716fc5fd1b",
441
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/PhonemeTest.php": "f85a3119f95615c3d3e16c0a4c1d2aec7b2191629b60de276cedb769b23e11546fc27fff57e329c1ac6cb52868208d29f88d1412b452932b573d88cee9fbd68c",
442
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/ProsodyTest.php": "5aecbb6cb41b0269b0895e580bf87dae24703c3116dd39774c11d52406635f4167bf55ed0b950cb4d8af9138c03361161527c7f0e08867053034d8aea1fb1daa",
443
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/STest.php": "55343bd191ba9b88fdafcc409c1685224cd6673225c1ecdc006d4c3643d9e4f71fde0a07ead3f1bfda80bed486f09a7fdf42e16cf3d4fe66f592bb72397320bf",
444
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/SayAsTest.php": "005fb0efa4803847719d9e7d52438ada0026b3860d7143fa4deb96a80826ff0f8608b3dd9302617547dd36cdee5293ec25570dd6513cd81a921ff483379574ab",
445
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/SpeakTest.php": "cc92de5d0f5df6de17b121249074752bb191265335a6e50dcc4739fe525cc9d0014c187a7d15cd0c1226c56360277469ba10da72dc56dde01f478acc510a8dad",
446
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/SubTest.php": "5c113371cb363691313226362512772facc38c30afdc32e96976aa309d6ac33aa32bab7d4ba674cd566182641048434dc65cf1403f25ea4adfdf6c6793db2fc9",
447
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XML\/WTest.php": "f7cb4983bde61290a90fac15c009ff1780b02fb81c8568d0e8a1f40fab97dc1ec2245cd477b5ec669c6f54e56bcf7351e38c09caac7255756174baf4070c9284",
448
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/XmlTest.php": "58317dda536a0383749d695ee8cce6f73d6ab413984673d46b10d9299e5a70c6cc464051e986b75c849286787a8fb23ef15e8bdf6bbc9a27e1c0cadf46a1bcd3",
449
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/bootstrap.php": "fb1c83cc2a11ffef9903eaf721f4cbcda4767f70368be33a0980aec4e5b515fa8258750f6e19fca0eff6843d0294de9c35b8e95af0e62f51a94442be0099720d",
450
+        "providers\/Plivo\/vendor\/plivo\/plivo-php\/tests\/phpunit.xml": "74191aa62aebbcf797167fc2bfb6bb304cb3d309287a73919caa1c43c188dcef47a1f1905e56143952e4b342ef183a84887dacd6976c18e58025582d5f672035",
451
+        "providers\/Plivo\/vendor\/psr\/http-client\/CHANGELOG.md": "82bb81ca074204aff5d95ac5d3edfa9c85569c8b9114f809e3e2f9525a6046a1276187ca42f638ed428311631791f60e6dace74cd60d77f1af0a41e9f76ab2ac",
452
+        "providers\/Plivo\/vendor\/psr\/http-client\/LICENSE": "3e0ee70fc857b6dda26ef2eafa55ef09384d82bb2f85b4289abcd94a60201c698eb477dcf03a73858b2cbb9efcf00affa199e848344b84dd4a4c135601e886ce",
453
+        "providers\/Plivo\/vendor\/psr\/http-client\/README.md": "a8fc38f5744eb4c1f14f5016b02108319b7cceea7fb3219f57f0604a2e92778fa9be6f1e340003b095f70c962aff0b49ccfb0264b26eecb8fa7782667e62cf3a",
454
+        "providers\/Plivo\/vendor\/psr\/http-client\/composer.json": "b767c510e3dc28fc5c8c0debf4e5627f4897940d41ced88cb0c85284c2e0765f49305997407e84d87154a4d9e14045e6c50fd86163d3d7452294af8b7bc36ccf",
455
+        "providers\/Plivo\/vendor\/psr\/http-client\/src\/ClientExceptionInterface.php": "33aededf573747615cbf7b8bc6aa10faea7762c903a0cc98bc43803043f9bad58460f09f7301814c22e95f2a6d0269388d8ca899ab76fcf0f2bd8d82aea5d9c3",
456
+        "providers\/Plivo\/vendor\/psr\/http-client\/src\/ClientInterface.php": "11b1cee24748c4ed1a41681b1b6e43e865e08150be14452de885daaca737f4029d65e8381632a23910789d3cf5e9f9d02f4999aad62e4e8c80a2fda9ac96a4ed",
457
+        "providers\/Plivo\/vendor\/psr\/http-client\/src\/NetworkExceptionInterface.php": "6d3d81d18a51f451e8a1b74a16b3ac8ce6c5642013a2d1375ce6718090de5369779f9d6f594675aeeb7bc3f55a11f1b9396036354c4e9ae0c90183ff369fd65e",
458
+        "providers\/Plivo\/vendor\/psr\/http-client\/src\/RequestExceptionInterface.php": "46391124b679cd54538ce5ae6b05d7fcfb6b9ef7680f33c8771f94b38075a366788293b757ccc674060d615783476e1151d0ab8a5f2a10e24578c9b46cc1433f",
459
+        "providers\/Plivo\/vendor\/psr\/http-message\/CHANGELOG.md": "5567e49c016bd259491fd13a96e5b88629fe67ccaa0d75f7aa7c54096edd663fc743930eeade981a041cf7524d9f65104718c129fa36a200397d30c0e5d2c954",
460
+        "providers\/Plivo\/vendor\/psr\/http-message\/LICENSE": "22ef0ac33682fbed60a5274a5b25991308decbb45c6ed45fb3222cc045bb9e552fa7310b1ab6f38329b63f53a02c25e7bc5e955ad23c5bb2366b417563cb71de",
461
+        "providers\/Plivo\/vendor\/psr\/http-message\/README.md": "d58ab57a3e35e51848c3c21313836c88eaca950eb5b716878ba950ad2389bdd84b24a5fd8e6b19ce3ff04b07d879b5206b0f26d5e3a63a5be19beac0e9ccc1de",
462
+        "providers\/Plivo\/vendor\/psr\/http-message\/composer.json": "4f074821b6fb7074c418bed0fb6232677a0cf6ae5ddf24694e14bd5aa7fb3610a645f2221fd024e7c4bfe3e95501421455dcfbbbb38468e9db442b8cde9471a7",
463
+        "providers\/Plivo\/vendor\/psr\/http-message\/src\/MessageInterface.php": "b79e96e691ad169d4d70420953ccb5933301ce7cedc17d4eaba859dbd56719008198fd201e3be1606ea5dbc78b559f1d86ba17b73ab7e843f0c2f0b49564147f",
464
+        "providers\/Plivo\/vendor\/psr\/http-message\/src\/RequestInterface.php": "f54aefad46987c6b4880d5f09f7e99909e6e2a99f9d305d1f73e4de58b43493179149912352869e50fc46e057f50c78ba7ed5df6280a7c0347f3d7c36afcbfe4",
465
+        "providers\/Plivo\/vendor\/psr\/http-message\/src\/ResponseInterface.php": "69d177fb504f47ca0181ab35e2155cacf16e77535d07bf4eb4d790e1ddbc7a133f3de21eff936a3e75acb704c936ee2f2b12b2cf3516464222c3d60ea9760488",
466
+        "providers\/Plivo\/vendor\/psr\/http-message\/src\/ServerRequestInterface.php": "ea36ff66e8bd962e468fb2bc832e70f7bbd81f92dc0e607cd69092b737609d565f3e254a2d54fb3588f5302315f62e53c6eefe9299ba4b6f1f53ba8feffa815c",
467
+        "providers\/Plivo\/vendor\/psr\/http-message\/src\/StreamInterface.php": "11ab8a9d07beea1f1633f8f6cabb2a463ff288555f2fb8a4cc0b99404d8580493018557a0f2674feef653be51f6fb8d9aa3ad8e6dede0391cadb7bb49f96f781",
468
+        "providers\/Plivo\/vendor\/psr\/http-message\/src\/UploadedFileInterface.php": "65da733a08d80c5490fec8e69c7b56a47efc522e720a2ddcc673bd74c0e21f5fad4d522ad47da4942d25d139b5392e0882de32b7fe5a5697b86f40fd96ff0f8e",
469
+        "providers\/Plivo\/vendor\/psr\/http-message\/src\/UriInterface.php": "0d46735005331a3489e3ef4c8229307320de44b0443ff74d238cf8f3962d83e99316da9435259d479b48477d33e8713dd3d1a1859264c22f2a53b43cd6adae2c",
470
+        "providers\/Plivo\/vendor\/ralouphie\/getallheaders\/LICENSE": "ba7ad111dab105773d8a75d20024b48c4222cba6f7836b7b608fddf34f367cd218302829a1926a675bfd22660f4562b0e9a679d15b41162412924ebcc1a4e557",
471
+        "providers\/Plivo\/vendor\/ralouphie\/getallheaders\/README.md": "48ce2def80836640ced369db92da9f9e943b319849cc89441023bc260edd6919c710d08c91fbdf04864c6e08bf89e60a397f5e814b3e9699b48df574f5799522",
472
+        "providers\/Plivo\/vendor\/ralouphie\/getallheaders\/composer.json": "495b111d0e0b4f4496ccaec984dc89c897f189a67d840c09b0cf17034629e1c896c37c4ddb1afdceb7d5a188dd0d90405ce34aad409d3b7722169628411d3ca4",
473
+        "providers\/Plivo\/vendor\/ralouphie\/getallheaders\/src\/getallheaders.php": "a61a5f91f21a68108c7e9c8eef22282e4b1b6f6f14ff997c5f47c83f39acd08ec60f4b9d25d306d67fdc68ec57c7f71a44a1f63ebf7c25b40ad61fa1cb4e58a6",
474
+        "providers\/Telnyx\/CHANGELOG.md": "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
475
+        "providers\/Telnyx\/LICENSE": "8756122099aea86ddf6f176a480c0454f2be6dd278e475bd6be7d7ab3d572162f1bd44c9f623e52e53514cb15336be6e84a5eafc8e2a347b481ab5799ebd6e17",
476
+        "providers\/Telnyx\/README.md": "321748e1de717ff62ccd3fb2c10fbed8ce92a66271f2047c83be8929f965c179cd163e429175b44893ae30addef3623f96659b98528a405a585f7afc7394e866",
477
+        "providers\/Telnyx\/VERSION": "7558cccb74c98362a480e1c0ae17e711de8e5d6cd10f508a31395105c0efb22cdea79aa6f9f6f890837d519acafc2cb3c429d3ab17a283e1992e5aca5053e25b",
478
+        "providers\/Telnyx\/build.php": "485d76b827a54d8455550e8a8f8d14862f9444381da251e66c2bb8ceaf2106a554c1cd339666b1260450749d0244d6b9ba0c6d0a2220ab2411aa4041fc83f8ad",
479
+        "providers\/Telnyx\/composer.json": "7ab90dcc0b5854786b213e5f2ee8c8030b21f65b2f8d0f74a3aa6d771ca1054ae5e1ba58ad6684dd1234e7eb7244be537cdb0a6888172cffcdaefcc7f5908dd5",
480
+        "providers\/Telnyx\/composer.lock": "1e4b665caeb711f94b1e7f0ce6388e91ada9973159c1230d4e60f0dcfd44ba9af2dd236e6acaa27564e91b4a89dde817d5a73cad8682aa9cb93b203f467c6be0",
481
+        "providers\/Telnyx\/data\/ca-certificates.crt": "66816e077ee99ceb9535a472e6bbf4f0e48ca838099c8a97c7baf3297fcada9a43016ea1ded63a455ee56a8f18501417a0f744fc17b215bb599cafd76b754518",
482
+        "providers\/Telnyx\/docker-compose.yml": "1fe4c651e406095f0ff1bfc196406d473184bf53cf80f7c67dc79f1aa94b26db74174e0e9bc47adc95eb2a5f6eb950255c4a5cf44ccb7029ba712df3be9e6384",
483
+        "providers\/Telnyx\/docker\/Dockerfile": "a63d1fabd8c19fef37b90922aa4bb21fbd1094635666cf2a3a4db47009888bfd3f1ad5c34c05184e2ccc8f581971f6dae91c1ff137730821422cd482c39e9390",
484
+        "providers\/Telnyx\/docker\/entrypoint.sh": "2bf3911c365a271fc52d17a0aac1687abf52e5286a5d52cd34367e18651dcfd6ef1f791b54105b7742f5d691564ddca3c05a9ba4ce8edfbc68fe919e0bdf6c1e",
485
+        "providers\/Telnyx\/init.php": "e590e355286b775423b39dd23b5aa0d3383d8a85ed2d1346802e0c487cb834154b4ba1b0ca41ae112ba81cf5afbcc9133db8747e08565c00fa3b0ea04fa7ccbd",
486
+        "providers\/Telnyx\/lib\/AlphanumericSenderID.php": "c6f7d381cd9901af59d67c66fbe6ace0729c77ac2b2962ce41351ed076cb39c9049aeeb72ba0e3933ebce4ab8a936b86a7e21d30a1c07b2b08cad9da2abcda1e",
487
+        "providers\/Telnyx\/lib\/ApiOperations\/All.php": "5caeaf5bede40fa19422387d224255ed534a866638b22a7a832111cada5496764bc0434cb1aa7365e1d4e0a8ad55545bb05a42a17ae5f2b361ed42c12166a229",
488
+        "providers\/Telnyx\/lib\/ApiOperations\/Create.php": "811f9227ecc5acb172e8e7120541227de0bc22cbf66a41490b743b3e49647a38889d5cfa5d64139b602572f0fcc0fbb96e3971c78801ed9acf7b50db2ab7499c",
489
+        "providers\/Telnyx\/lib\/ApiOperations\/Delete.php": "4c03010d81be8014694e366cf93244dd2f73dfb38fe8a1f3066b6ce179b999967de5a9d3e3140b3076d0dbbeccea329ac750ebb93915ced1e44891ab589f0c7f",
490
+        "providers\/Telnyx\/lib\/ApiOperations\/NestedResource.php": "390efb020ed7c101b32379716bc2111e83273e2a7092da61623f85295c67ad1f6ac2fda617ec91eb28d02ed52a86db9992ee044356f3d96aff2e3474b16da601",
491
+        "providers\/Telnyx\/lib\/ApiOperations\/Request.php": "5b947c7171a05a754fce9c5bcb81f93c1614db086fd4ceef9be1a57977f8bfa7311af0a60a2879d8cb9380c64ddbf7c991738e5b5a4e4b2feb5d88e25c822f3d",
492
+        "providers\/Telnyx\/lib\/ApiOperations\/Retrieve.php": "d2a5aed1aaab9421f2f2b41f69047a70bdea46082e118cd94e087f4082865313d7c67aa037fac194063c53b06d9dccbfa5e65582a9adbbcaaa2982396cbda01c",
493
+        "providers\/Telnyx\/lib\/ApiOperations\/Update.php": "a102e823a46dca1eea6c0bd67b4b7c63bdc0d074c97b42a830de18006782309d3c5f77103b32e82c778f670aade73d3c31f49da49682d9ac204560bd868cd526",
494
+        "providers\/Telnyx\/lib\/ApiRequestor.php": "617ebb71c97dbd896ad736a4e1235f784ea7b89dd73a980a2b259820e3dde0ae935fa532d1fc8e0d9e14a63f843e880e074319bab2f9c519c1ec19467f80bbd7",
495
+        "providers\/Telnyx\/lib\/ApiResource.php": "5adbc90947859652ee20745236c330c5a3124edd3140cb54cb2d4ecb46409d4d825024708b6bc0a44a418f181fd5631a65b41381aae7a55d7c98d80ca9751b5e",
496
+        "providers\/Telnyx\/lib\/ApiResponse.php": "0d292d053a85224f4ac839f54253decab0eec5ae9861ca95314e98cad0fec2d2f0a7e712a8ec433adb302b6702d69262c8866b20fd08d67b2d18571965bf6789",
497
+        "providers\/Telnyx\/lib\/AvailablePhoneNumber.php": "7c82ca4fa28264c4fdd910c71741270657e52cdbc760343339bbb7c1d5980d27b7af476f7e1bd431926d428dba685a6e34d250f9678ef0a4e3cd8c4b06289e55",
498
+        "providers\/Telnyx\/lib\/Collection.php": "8953b7490974401e598cfdba09be005dcc037ff74d7eed660d11afca7a45d62c47f6b6c4f31b3b3003f3d9401599283122034362618a9c3d487eb131d05cfa13",
499
+        "providers\/Telnyx\/lib\/Error\/Api.php": "5c496f65e000a74652c5e7e3c79303befb693e497d67dab4e13287ebe72722c9651fa04c4de4065ea969e140f7a2f74ccaee2ab728f05790ee26200558d0085c",
500
+        "providers\/Telnyx\/lib\/Error\/ApiConnection.php": "469821ef557d096a088d2997f762b4a39c82c49bcf22ca707bcbf611b20006106522150d6365835e0c7e23e3303bd407d78181fb7b5d86bd35095645e68da158",
501
+        "providers\/Telnyx\/lib\/Error\/Authentication.php": "e1c7a938a695fcd8602e5a972086989efd349a6d8d5e3abddbf6f548ba2e1f9bdabe708b5ea75474f7c3588ba7cca8a1dc60970a8be70a80962f90342e67c13c",
502
+        "providers\/Telnyx\/lib\/Error\/Base.php": "9d311a5445b2f3d9c4e25c42094734c3d6243fdc5025c7e5a609ce49d2b2a47f01ea2f163154917f3330e1a92d30a736319c4daf3ae18bb6ddc41d131afae0ff",
503
+        "providers\/Telnyx\/lib\/Error\/Idempotency.php": "cde2f56479baab53e74c6784878c7914e7393b655bfdbf7a36e0619fa9c521671c105c3d5002983b3759989a22eafa0bba7b4aedd4801d7d6b820842c0285e35",
504
+        "providers\/Telnyx\/lib\/Error\/InvalidRequest.php": "0c5748224174c20020155c9f0c734121d07c752460ef63648b08a2392bb6d8b6ff0a9eba13ed1cfb8988545f6dc8c70930de6e78da03c63da0e59bc5fa109a9f",
505
+        "providers\/Telnyx\/lib\/Error\/Permission.php": "3a03b08e77e6fd0897de16d69fb3769707f6fb46717b2a00f1282d7b3e33527f5ca5ea94b6df03c883ea177520140ab2dce4986e0ee0977cce8c375e8a5011fd",
506
+        "providers\/Telnyx\/lib\/Error\/RateLimit.php": "0ceb884f1078559f5bbfbba6153e6bacd6ebc49dac2d047da9e7c64d45c7cff0abc067711366aaec74a4f2736b7205c02ae9de8c214871a82ed1fc53faf4be73",
507
+        "providers\/Telnyx\/lib\/Error\/SignatureVerification.php": "8aec6ea46f62c2b6ecf845cadb726332f89a6c0dd92f4864ac71ffd25268b2af0468cfa83b32a24e91c735ae947498bdc6181efe09857c6bfa799cec721dadda",
508
+        "providers\/Telnyx\/lib\/HttpClient\/ClientInterface.php": "f47e88048bac320e8cabb1b61869f138f84a04858afc3b7aff4de858db9b3efc507d1607037bf07ec5fb1f1df4069b71bf8ec1d0edf953bd1eb8255e67651ae9",
509
+        "providers\/Telnyx\/lib\/HttpClient\/CurlClient.php": "fed4939d221213da7fa7865b4405e5c0b7dc092375e5acd890bfdf178baa6572ec7ac7ad57cb02caab5af24d2aa52763bae1b21679f3b94e6f7ba659cee7a438",
510
+        "providers\/Telnyx\/lib\/Message.php": "18acf4bf51ec27d330df16216924c65a45db59895b610a3c803ef1d09beb7d96d20753b4ec16be06ed40f2886ad46bb3d866f14a87021484ede5d33ac1a93c4a",
511
+        "providers\/Telnyx\/lib\/MessagingPhoneNumber.php": "2a2caa5e44efc5de92ef9b0f8ed0a68af1ab2c80932f4cd7fe79caa87ca1e146af3bd0e1d16d977738da2a3af1fb3cef77081c32a0dac50bbe8ef54a108efbc9",
512
+        "providers\/Telnyx\/lib\/MessagingProfile.php": "351d96a913427c045f534b6993c37fa6ce2ecbdd7a398502ae6447d631ff322ce146cd73dcd1161c999f6bc9ab9764221b4bd3567888dd14c110b98bdc4432b3",
513
+        "providers\/Telnyx\/lib\/NumberOrder.php": "52067d9999c150fbefcbba9969b308bb6118eabe25bd08f30cc4978cdebd68fce4479e53d71ce29632133e8c69bb4ce9276301f5a36ea95bd77d29fd057f5d46",
514
+        "providers\/Telnyx\/lib\/NumberReservation.php": "2b44bfa3fdcce2e21668004d458e9e6bcdb5e33cc37e9a0c980bbdcacec945dc4e06e489bf5b9d0194df00229a79e39bc2a62395d44e4072473441e258841baa",
515
+        "providers\/Telnyx\/lib\/Reporting\/ReportRun.php": "2a7b066db83e08b86e3da4c0b2d041c4d53ce0a1fc95ca3dab76ad2bbf549d74f9a97974be6bbbf0d7b592a814a00b514bb26ad13c7621b5c229f9bc40abac7c",
516
+        "providers\/Telnyx\/lib\/Reporting\/ReportType.php": "92ad055c626d39d9f878666310ffec1c425d4625af9e7803547d50f1684c166ea1dc67d79c35580ae08850bb6e570a81994014e82f4d4080377cfbc664c4fbc5",
517
+        "providers\/Telnyx\/lib\/RequestTelemetry.php": "cefdb55dce61e5f276bd49f6b49e57c78085338537e56cce6fea5a81cd1d2235f1eaa78be326cbd513117be88a046177afb628659088b66ce423799995c53709",
518
+        "providers\/Telnyx\/lib\/ShortCode.php": "4abc882d0dbc72becbff07212d17b8e1383b0efb43818a7eab983fd2a08c3f591a4f4ba2f185003fab0622a43329c969d2fcc80b23cb94410007a0879309ad49",
519
+        "providers\/Telnyx\/lib\/SingletonApiResource.php": "f11599b789dfaef76ef6cf10bade1b426d2e16749bd207c6d08ddd007fea470fdbf0492f9a59cf8bc9f8589aa4532cd6c3887629cf27060696c3f086b0a48673",
520
+        "providers\/Telnyx\/lib\/Telnyx.php": "4971ff61049149242b0cfdca4a15dce213c465ee697cb444eb47da8215eddf2737508164c59393bd7661cf40b1a525afa9fc0df0dae8a071a59f3646a5ec44b9",
521
+        "providers\/Telnyx\/lib\/TelnyxObject.php": "a1bb11b6bfecd69ba694dd34d6309707e916ef45edea1e81e160c572dc404aa4e16841f3be7a82b3965037efef24db7c7c9730fbb65d26e8a188d30fa9af01f6",
522
+        "providers\/Telnyx\/lib\/Util\/AutoPagingIterator.php": "d03ac3841bb553d847be9ea73ab9debd8c1f2c829b0d38ac4416a121ac535a5ece2ecd9943d89e720cb5abb1c907ca9b96df899a561c190ccd6843bde785114b",
523
+        "providers\/Telnyx\/lib\/Util\/CaseInsensitiveArray.php": "bcdf3fba35ae234bc63ba6cdb5429aaa5fd6baed85857991abb9eff854b23eb7a878184ed038636292ac470b67f91c6bf8d79c20a6214d31c872d22fe51833a5",
524
+        "providers\/Telnyx\/lib\/Util\/DefaultLogger.php": "50a69f9f6ad628e489a05fdad0df811c926c957c301adb0b4b906dcce9733a0598f6c2eb126865c54a0100131dc4230a834b1e98275237ce8e90bff2e96cd0fb",
525
+        "providers\/Telnyx\/lib\/Util\/LoggerInterface.php": "8d2dc2c59af5e625eaeef0b85b09f78a42e533b62fee84717d67a4c706fbacd94674f439d3ac60984c0a3947b7d2f5a8ccfb64e071c41d063b8298f57578f88c",
526
+        "providers\/Telnyx\/lib\/Util\/RandomGenerator.php": "292c880420b28390e3d734c6343acd48f322db0c474f80430402916de1dcbf8e988b3d2753a7c18e763e632f474284b213ccc8e8fe4e52f00569e72728dcccb4",
527
+        "providers\/Telnyx\/lib\/Util\/RequestOptions.php": "61a13e62a72e7fc4a1f4d2a707d03ca785af36dd8566e037efa4b1a07d91debe1bccc637bbae6ab9dd836b20a4133cdb7316d6c2628da0d13d2164d6613f1e3f",
528
+        "providers\/Telnyx\/lib\/Util\/Set.php": "1381d2144748a490fd27329fe231e9d3a9a8b428499d4005f9ff18a946c350d8dda1ea90285314a1a99f5d351b1b235ad37a74823c37d7345da8af528dbbba87",
529
+        "providers\/Telnyx\/lib\/Util\/Util.php": "d7c35dbf5a2832ced6059800a6730fbe75338252641edab902adfb134a179d96e162f05bca2902c6c2d99cf4827d5b89b0daac826162c7d460e17017ee405606",
530
+        "providers\/Telnyx\/phpunit.no_autoload.xml": "06ad2f4fe0a292902757629f5605509f32a0d1dca527550619c98a61519d83fc70f3c886b12f5e5734b1031186fd9c7fed6fba813cd816b0f07d36c2a6bf11e4",
531
+        "providers\/Telnyx\/phpunit.xml": "82ac037adc20f2aa76682878094e8bffbfe31782dc6a94e2987bac5546e3ffec90577d03715f4ce481cc977685eec9e4109a61b4b46bc19351c2cad555d7cadf",
532
+        "providers\/Telnyx\/tests\/TelnyxMock.php": "e8e93ca1114530cb7e9cad46eb20e32072934496d515a9391ce8093773450dd60f3288f9d3ba46533a0f650fe67b508d5e54bbfc6e1642443d1fc043b88eaaeb",
533
+        "providers\/Telnyx\/tests\/TestCase.php": "9945df738b56e344648cc00d3d4b94345c15d8749ce511b5095a87d5e52aed35d8e3c773276d9dde9d9fa04eada784a55e4876ebf70a198ba719c8e94c8c32d8",
534
+        "providers\/Telnyx\/tests\/api_resources\/AlphanumericSenderIDTest.php": "1db47c5c215f1dccbc0456035edb1619cb7575dfe2b152924a6e1abe4a021bf63be3b1d1cf1b86285c5425f5df46c8e396cd66b6ff6a27534e402e145e5fb194",
535
+        "providers\/Telnyx\/tests\/api_resources\/AvailablePhoneNumberTest.php": "823ab5138035a84a790d70c9bc5964e7aa163f195aeaa2fb50d2cfc7068f1a77440f09a134bec36a187cf57cca6c735b428b225239a263aa26cc5cecbecdf6d5",
536
+        "providers\/Telnyx\/tests\/api_resources\/CollectionTest.php": "af248a4d4c4504f5fb7148e8f5ddbce3a05cc859a761f57cffb8335be10b07ef6d4e808002601f92eff2968e86873fbbc3fad838420db0694f81b9cd95091452",
537
+        "providers\/Telnyx\/tests\/api_resources\/MessageTest.php": "a616a69339b599526dfd24a25d8e99eefc99c2341bb7d4f635d1b4984f41dc38a3eb6bca3e4242caccb974b141a490624669b5c2b2f5315b6cb07540d74fcad7",
538
+        "providers\/Telnyx\/tests\/api_resources\/MessagingPhoneNumberTest.php": "40409c270a6f9a683bc690f6e91051fe1ac4c8a6cb1b4e5536416d64fc3f8c81f327f33e562ee94cee1481e0ec2f13148b0dc3f76f3f20a49a9d80adfa5c1afa",
539
+        "providers\/Telnyx\/tests\/api_resources\/MessagingProfileTest.php": "1ca7abc2b47f221b491ebbe7def5569deada6eaf4184bd6e6327f7bf2da15669d1fff581e24c466621e8462e816c0a12d02e0aa1d91aa3746092f8a09a9131ae",
540
+        "providers\/Telnyx\/tests\/api_resources\/NumberOrderTest.php": "dd6e4382dcdb0cd60ded9d9db6262bbc7f523e8f5eb842e15655fe8ba4e24ad5192b8be40bbc762de2c62de3aeec31e1373063420a99e39bf02f5bf74915d5ab",
541
+        "providers\/Telnyx\/tests\/api_resources\/NumberReservationTest.php": "8b8386c0e044e120b6d60f97433c9ecf0ddc272f805034768300bf01bfbc731a3f6f964758e509d650013df03bca66eb1db13fa1a24315df76ea55fd86287fd6",
542
+        "providers\/Telnyx\/tests\/api_resources\/ShortCodeTest.php": "8aef092868b89adda6517905c7f05245b3c39affed4c7723e5a32cf17b8e39528e8925923aad4b2add5a0bbce9049a8f934141b87a790fcb002eaf77aa494258",
543
+        "providers\/Telnyx\/tests\/bootstrap.no_autoload.php": "cb002f7c8f77834b6414db6535f083bcd227ee6085363fa3cb0f66b55226680a45c8562fd8458249868465957b2aeae134b3379f8ee2ed22c96425475e9c0af1",
544
+        "providers\/Telnyx\/tests\/bootstrap.php": "50e143ed68aceb91d3e119d5a31521e76bfe9876bd780c90ac83afb7ca4f32be48ff81c33c134109eafe1d22f35e0957a9a834966b8853df99dc1df04795adf4",
545
+        "providers\/Telnyx\/tests\/data\/test.png": "6ad523f5b65487369d305613366b9f68dcdeee225291766e3b25faf45439ca069f614030c08ca54c714fdbf7a944fac489b1515a8bf9e0d3191e1bcbbfe6a9df",
546
+        "providers\/Telnyx\/tests\/openapi\/README.md": "0c54fffd5b7a5f393358864ff9e3bd3793075d6060cc1336603b2455d60f16d160ffd47b52bca6834acf0d9713855b386f69580099a3dcc131e8d5d617975ff2",
547
+        "providers\/Telnyx\/update_certs.php": "46dfc1129c3dff2211cdd8274fadd8629c450e94a7a1c8527373221b25a0664b6043d6b007351ac9afa4b40ba349a7fdbf4ad2e088cf0a8d864f7cbb81145fb9",
548
+        "providers\/Telnyx\/vendor\/autoload.php": "1d4735a3ebfd65901ce478f8bb98ac576ef9ba2706f17a1c6ab125979a882ec7ff463b577fed1c418f817c1a56e842fc25b6aeb8e7ce6dcdd554a25e03959c3a",
549
+        "providers\/Telnyx\/vendor\/composer\/ClassLoader.php": "866e8cbde808b4e7774c5d9e2bdda44e84ff9bc84268785aff1a75277bd7918dc26ceeb27732718c9ea93756777ec0d16c09c15f9c1179be3cbb410c7914d295",
550
+        "providers\/Telnyx\/vendor\/composer\/InstalledVersions.php": "86ebb1216b59b01b7cd1f3b2e66311cd6295b58fab91a9a82603f903c6d2f716d7697a82d625372538f809e9e45f7dbd257a00e2b95d23c3785e4eeb3a6ebb60",
551
+        "providers\/Telnyx\/vendor\/composer\/LICENSE": "f3bb64009f41a425df5a9bbab53490f0eb9b74fa8d6aaa2f57efb928edc4ffff330260666edeaa04a91fed708c3663371cf01b284f3a08d6698aaef7a23f355a",
552
+        "providers\/Telnyx\/vendor\/composer\/autoload_classmap.php": "a298b75d605ec9a330a5efe11769e79f02cf202f49d8b241afbd175c7fcfa0ac4db8e72a29aa1d839138e3b181fbfeca525181eb57e998a4a2c14ec9e457cf1a",
553
+        "providers\/Telnyx\/vendor\/composer\/autoload_files.php": "107b2d75757e7b39e2d279e373fd4291d57e91a7f442b0f880b51d07e7119beb9d41d1cdf916131bba717e8da953e2117ff83f1bd9ef850fc1d9056d0f02996f",
554
+        "providers\/Telnyx\/vendor\/composer\/autoload_namespaces.php": "30324cf2dc20c214c5b5c8fdc2099b67772149ddea1d1d51969c711be9a83d036e43746c600f958a6b49969b16a10ef93e9b1e3d5af9714721ead916b9aef344",
555
+        "providers\/Telnyx\/vendor\/composer\/autoload_psr4.php": "02804e683dc13b4eb2ad98284be2dff3eeb97f0ae9054c3a45641ce7e6144a3b5f34ae36eb764fd2faae39fe5dd4131b4dffd4649c6ba3220ef24aeab45efcb4",
556
+        "providers\/Telnyx\/vendor\/composer\/autoload_real.php": "469f95fde429006c3262cabe72cd49970b0cd6098b743d8e5a646af25679dfe539c98d3337b51a8faf7f30d9c64e1def8d131a93e8897f801830e7e1c4da5874",
557
+        "providers\/Telnyx\/vendor\/composer\/autoload_static.php": "4845f043e32744886f456f358ea87cdcfd641508151ba6c3b0169c9aa53fe111f05b78b82e204368da01da68d7007709c9140d08dce4e7dca3cc4c9f60397dcb",
558
+        "providers\/Telnyx\/vendor\/composer\/installed.json": "5ca47a408f164e118f7ccba81577933913002efce47331f2eeb13f3e24d78878521db08454026d270deaa6552095260d745f0a424c91eb7efd36f6a9a20adfba",
559
+        "providers\/Telnyx\/vendor\/composer\/installed.php": "38fb24f1f4e4aa0435926d601c7b78797c231eb0e3621e370b17078645f5d238a1d02da3a29cd14a9125f78f53964445f4326311f6e830cf8faa24e944215ce4",
560
+        "providers\/Telnyx\/vendor\/composer\/platform_check.php": "4d385b31994301facce94382fa007a56ee32268d2e1cdbe7c9f9cfa834ed4195d3cf8e8e7c9a800c97aafe2c9b46f3c1a93e632c7415e8a9e4a282c083cc6f9a",
561
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/LICENSE": "0c0bf603f7e196edaf56d02acbb2e14df7f73a2da0617d62b5fc811f088c29865ecdbc7c6925a19bda63132cc651c56f1cdac79dfa02aaeb3fcca49033636ee0",
562
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/build-phar.sh": "a5ecc580bc6e95a9c901ad1a0097fd47ab857dee79d0221ae463e27f27cc8b2227e1975ab2699b9d0782f0b0396ed9b3ac0106f53fe61315cd2954ae54beb333",
563
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/composer.json": "c400438df2f41ace7bff40d284236bb06c6095ac03b58caef5b062e7ef317bac5a6bf551c94459ffc838acdae7df6cdfc615dfc3cbecd16be37ba67bd948415f",
564
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/dist\/random_compat.phar.pubkey": "e8909663e5350be2fa9416e28c6b179c41e87feab8da0d6fa6a41c294c9b00e8cc40ae8bcd03997770056f70d946315fd530f72f42974f63195f14b3c675e3c9",
565
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/dist\/random_compat.phar.pubkey.asc": "f07fb9c7b00f297e73127dddb1f3986fcebdb0760454765f6ce0977347919c0c74ea197ed310bcd86dca7ed227812bfa6d1595c44e40f10c085cbcbf602e163f",
566
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/lib\/random.php": "fe4539e2b55b47dfff1e2256c91498e5a41a85e28e42d790fdbcc42102c16abb09b0d7a0e2268ee004c555e1001241a9925fab1eeaa16c11ae2188e1f01540b9",
567
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/other\/build_phar.php": "370c622746a37b65aa6e36c2fb94486b4fb01f2db3f3c9539a7fde711d1abe3f9e9c30bc61f4200e6da9b47086c207b03cd7258d77dd2ea6b48126a618e2fa0e",
568
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/psalm-autoload.php": "f05ea11c8e973ddffde4d60688b161701217ac8e5c9237cfb57babf7113482d5e19ea441f5092eb1448a21b95ceed75f994427d6febfe0de100c376ed17e91c3",
569
+        "providers\/Telnyx\/vendor\/paragonie\/random_compat\/psalm.xml": "88c631fb2f70a79d0e56a4484fb7ae8b6b3502ed2a9599757e7a3302c42b0adfc6f0c45c9916b88d7430f209d8934b6121221dd8b424dd913c49236db7ef01c4",
570
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/LICENSE": "db260eb10b8775cb408f675dcbe11bfb1a738d638f4215467df6c4bd03b8265dec7712fffa30dbcd38b5ef944266c3963343d033f497eaa6dc602f55fdd8729d",
571
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/README.md": "82f123f85b02a7e91c3ebece404b85ef5a0950e0ca79bb0841735a5a03b88d1a3efed4bc8229b3ee1db245471cf58b81923ac9800586ace3b794421f379f7bb3",
572
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/appveyor.yml": "ed6f025871e47d5afb1eda2e0705a2185670c447279cadd8c0fa796779fa2f1d7a5f17efaf6412c403e40bee345ac3224a45f9aa0e5143f06ea5e25ba8cb848a",
573
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/autoload-fast.php": "a40c6c77f211a2257d3339ad80ae7197ede8ba0a94c76b48052cfbcc8ce903959dbd8e3434e6660bfce2c5e935cb9f38568f96cf00819d03f4a1c46cd6b7b0b1",
574
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/autoload-pedantic.php": "c1a0e8a5b461135bc58ebf0a37d75e865d9e44ce666aba9a95d6416cc7d57a834aae6fb6ef4a9cb4176690a4e41cdd8638106a11b32a155f3a8ca3acebf7a504",
575
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/autoload-php7.php": "0ac98043c8df48e7bdd3a20c11688ad3702a06271687e1019c2a7288288532ea593e7e462635b806c0b18dacbb8f2bd6d9c700a61d2b1deb90eba0b49660b008",
576
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/autoload-phpunit.php": "d34cda9cd77a67d93817d5b9b1bb51a13521b2539f9a8d0189debb1938934df1d5fd51fd2a82c9d4775f5a8613708a1e78687fab86c3afdc356bc4b02045bc66",
577
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/autoload.php": "91c2a6366a27a76a0390c69dc4cf061c73cb03a22a3303aad673cd08e8cd659c7fa7e6796acdd9d2d271f015eb16b15663c5d21d8a538fe14f459519c9f9e8d1",
578
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/build-phar.sh": "5bc154a32c62797e85b82595da69ed11676d98deb9644b62a12d5ec169d3edfd4d3b24c67170143f12ca63d9bea06cd0803f68d5e63a7849ea9c4dc9483f7b4e",
579
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/composer-php52.json": "10cd40189c6ef385b9e21311b8b2bc8f7943273552227c8006a38889d743fde82c8c61286484d59bebfb83e645a87cf6d99f29409439a1057fd16a4ca7727417",
580
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/composer.json": "e9b03b450c47dc1a593e35493c7c80c373f958ac5ddbe89a163f15e7a30a8139ac0f9868466610899e3d5e5d573d517bf09acfc68d2b9420e3301b39e7736aad",
581
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/dist\/Makefile": "1cb0cca3e1413538bad70b8c8a22dd68d17bcb6450e0c4ee41fab9fab09c36bffb4816dd0f7ea2f40ca1b4cec6b030c5c0cc17955d2c83ec08759e748b04d965",
582
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/dist\/box.json": "47543b120abf7596f26b58f9911963e9bd0cbe2297b65d43f74dc52130e503ce09049a4be53146387b7fb42b7640f6577e3c1f4862540d4f8a0e668b0001e62c",
583
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/lib\/constants.php": "4e0597dadc39ae7b81e46ef5f3f045812a11753d9116215bf0d905e0bb3760bc44639988f1ec8f0ae8998f507e0c99eecbd19705f5399edfacb87172d7a577ba",
584
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/lib\/namespaced.php": "c550633d5dbd23c1bb2fe9a14b787e239bd5fa898932ddb8a1b1f8909a57393e01f12337fcc53f54b24bc48a97c3ed89de03da089ffbea71ef90d48c5091e200",
585
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/lib\/php72compat.php": "85b52455b2764ef4b80d60b8d99d5f65264b2a2e7d770b2ab05871a5aad213ad35f2cd755a8b5d19b5ddcea758c024175480f2dbc89ec75dc86ccdb453f5fc25",
586
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/lib\/php72compat_const.php": "177d6b1b8fb5286842400019be1465fa0438e06dfce2fbf5e93e93d0715c161ad07c0c31c17394cb0c6673a058f34544454cc0845893242dfb5a998655c93701",
587
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/lib\/ristretto255.php": "f2c36f65a9a556c43bf9f2fcad02f1c87c29d89bb5b3d81634112defbae7ac0c85e558fb3b5a5e74d95906a4b543e7a2cf16fd444ff28888ef09d73fb9e6b6f9",
588
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/lib\/sodium_compat.php": "75e3119fb1d400aba554506a562c64c1b1b82e66277383bf307406fd1f4c68499a32b82108529d5af99878890e3551dfd1fef1ab62ae86982c27dc975dd39155",
589
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/lib\/stream-xchacha20.php": "4cf0cb7bf023249c18f2261057f994faf8c4233022651285fdf8978fe9a71d7eae0511ea1f64faf2f3fcb1ae5b010112a5a4ebe8df9fea7ce908916cc2ec90af",
590
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Compat.php": "7a8389a0ca9cb8e544b7f345c60705e1cca41769105531211219142f15c83bd60b442dbe8bd62042a5fddf31040a19ba1f3f00ba6c2a44c3160089a2605099da",
591
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/BLAKE2b.php": "91aa0293c7c821d238f36fbb1f4327e67a718b53c13f0ea0f4d6e1d1675618bdadf183d842d4dea103017be863d40762a20c644a4f3619c7549991f11a19445b",
592
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/ChaCha20.php": "7e09160954fc59c77890f28e75f7ce8b75fdf08b9d5461c5e7dc1f49bc664bcb1b7ac74e3f5437657a20729c2db965d968060b27309a4a06a252d22b7f8dd4f6",
593
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/ChaCha20\/Ctx.php": "f19f61e54d42bf154182d203594613371f430d7c78f5b8229cb9bb94e19e42bb9a8e434639accff18497cd728ef391a1128d0145b8958f8d4350ee340340df39",
594
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/ChaCha20\/IetfCtx.php": "41ac6fb53ae553db13ef5c12d8c1c16d017267f130e8a00e9c2a8ad10d723aaee5ee08f2888f016babe4d712a0f1fa50012e4ebe6626b34973c26ad6728e36da",
595
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Curve25519.php": "5404d91b94a8e6c442c3eb30b763f1dd0c1234b845b967b7048f71d5a0b6e1ab287b44f43e06ae5bd6fce31f78154b8655353d7df86b6ac699a41200b9df33d7",
596
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Curve25519\/Fe.php": "937defa56e99d4f38a81b88c03c649deca5b0f41f5d0b8e340cadccb34ef0677563f18967bb9f63e9547137a2a1827f9e37c62005fe745aff3764e39adf86cee",
597
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Curve25519\/Ge\/Cached.php": "3db1263681f9414d237a8318c08ad07bbe3279b7310e21a40c22033f5d90eb5d7074dbde430eec7910a8d7e4286fa6c0131938c92045520f56fe6acc37af70af",
598
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Curve25519\/Ge\/P1p1.php": "d757efd8638aa0c1609d59c47f3b18608a0fc6e1e5bc3cb94f16fd3fa2d6125872a796f4837cd8b940ca6988db92d3c668bba684c721476ee5fdb6fb6d50670e",
599
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Curve25519\/Ge\/P2.php": "cd70c62efef16eb21967d5bb0489dadef845fb3cd4faf0b1bb7d080a8685164b2b0fde4d8865dec22037795eea6df605dc2151f20871c31d5e9e0084f0066219",
600
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Curve25519\/Ge\/P3.php": "56c14b848691af72c00f5dcc3d31281a300d0ea9b6ec273ff929cf30d2279cf34d51891729a5b095445fffa8a63b8c8147f4d1ea24935c86b0216b3c40aa4241",
601
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Curve25519\/Ge\/Precomp.php": "f6c53daf36931b4289248a231da52759e91e5c38af10b2cb89a1bd7e55d29e316dc77d144fb9e52ca1cbf50db84234aeebf13603c62d58d5b3ee58dc19cc18f0",
602
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Curve25519\/H.php": "c2e48f6273cabcdc40f20fd0f7ea55975fc9da5a419b1c9cb834b694c858533f9a0d3e3ce768b532ea6b69ff5d2df1ae4c246a15b7129916d4034ac497ca2be4",
603
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Ed25519.php": "eda61c7ee144449df655ea9a9142d0b26624644542012652598bdc51493f61938c13651b32b05e942d31d3cfbfb7899b8621f4ebd8a5909a1ed12704b2bcfbca",
604
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/HChaCha20.php": "b5005439c15ef7aed83b566e670053819f59c415d9c5f607550c756622d7161ca32fe65dad8f688e6a292f88192637260d859302064b416465c08bbf7f6dbe13",
605
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/HSalsa20.php": "c882b541376c8eea8ab3bb63d8b51dddb345cc45ade8d5d264dbaa96427f72f0201aea828e696808155da7a978c4a1fad09723d42ec393117693e48187cf2a4f",
606
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Poly1305.php": "c438e61d6b330be26cff863f8b5c42fa3284d6e8abdd1e43a2023c2695dec643d2641b2239a9b0fbea1a34e9e8011d5094b4eb024b111b6fa903a1c026328747",
607
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Poly1305\/State.php": "4558eb5b05c7664408a4e793c2b85a4c2593ab8a1118c3b89db712f337a12346e2e882a0c638c32af733f5589a310b4a528c9bc02c136692ae82f3ac7e6cddab",
608
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Salsa20.php": "2836d7eeeec597187c456ec790107a5dc478a1f79c1c1e4ede4314bb830f865f189e048e3dc55742703e2fb7bf31275f515cca57ab5bc47332961bbdcac7c490",
609
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/SipHash.php": "345fc6b9f37659ec9830c9b3bd1459257b81568dc73809c023c551dd825981b0da6b150b6b7cd57b00097ae9cd3b742d730ebfda2d2e459ebd7d5257fc967156",
610
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Util.php": "81aac8187fcd44a14ae856e34d7337c012ff3603c606e1b9ff5a95fd5cdeb962725b70672a57b600d344fb2f34aeea00ddc8f1d4d8f8888961fae9171f8262d1",
611
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/X25519.php": "d11fca34bc3d313e365ca47981a0efb880a3cc8be3e2cb00da7df69de8d52f2f1fc793c1654cce1385ea66aec40eb5339c5cbf120c127cb399b72fe84b7297c4",
612
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/XChaCha20.php": "de5d7f3dd4402fe3c99b66a92fa4f0766beec66928c8996b3754b2f7a8869b65035c6ebafcc8ba2fe9b309adf541e89eba9491554f1ba548af6139770aedabf8",
613
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Core\/Xsalsa20.php": "6abb7e9217d5463d373023d5aab49c41cd3e1026835985dd13256e68374ef63b90b7dd033f7fe14ea60229a98e5e64d0d0f23b7a382ecc9d8b41746bbe3fec11",
614
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/Crypto.php": "257d3d05f1acc745b21f25652ddf0b09b5a68b2b75abaa9216bee10ea958f8ed1d3c964dda5326216366d9cca4a71e8678c23994fd07eca2582e3d8c8aa75500",
615
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/namespaced\/File.php": "d7cce5179670dc18544eace3bf8b8b9863e62fc9520526da2870e45d5d400004fdeeb3c0f44a90caf0742f89b633e7fe3f996bd5f89af4c7f52ea37f429e453b",
616
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/phpunit.xml.dist": "0f8b25b7effe47068dfafdc568c3298d7c5f2d4eb1abc040c8dcda1b0daea8523a1f82d8e00d6475ffde3cb566c18d17ccfd07db59c72bda11f40d555b692d32",
617
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/psalm-above-3.xml": "5bb5402c96cd45a0d88542bfaa12ee03c26c3242f42f1e33a2a32e5a16143e6b66e7dd4bca7cbe30f73ee9eea7e72862e356f1bc4c4daaaaf1ebcb248d63b230",
618
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/psalm-below-3.xml": "9ef67d2d8ee81c94d0ed80d592894be0c200045b295178f246865d12a54d963e97b4a8d75ab88595bbb73d74c75ab2275a54b9a33733bea2d15487c5894f515c",
619
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Compat.php": "1c233a4b931c13b00e243f699eed9e81fc683846e089a24ad90dd17f786bfdec9ab32509eb9666074c9fc2a168ea8d411144274e6c4d4413996c78bd3c536515",
620
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/BLAKE2b.php": "27fdd20dc655cc7f58454cfa97fb974e4d99f6da5b97d79e669d41b9c5bfd1be18fa34f0ef7a353731a3bebb11b56fcb68818cabb3d8ff026682e7b39106c6f5",
621
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Base64\/Common.php": "c8512fc6d570a3198107493c7b8d20f38539caec221adb14161d7efbd6ab7d1d0bef4cb5528fcd84cd9484f1a9e0fbeb45aaa2365012680b0106ea92f8873281",
622
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Base64\/Original.php": "4564f7cfef60c318abe626832bcd355cffbe04d020e04d18c5554fc1610c4a1b0ae8d1111681e2a458ae0b9d7ef3528bd62aef019fe3c1a3f9d28b5ae58da86f",
623
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Base64\/UrlSafe.php": "dcbd158a52f33b9c64c8046c8f091d9af95657a562ac694c9ac0beb3a1876d55a3f23cd42c1777d9cf2a55cdae38d88ec54628b2d5fccd6befc92d4d51eaca2a",
624
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/ChaCha20.php": "f0015a4f95fb6028c015c954992233d76ff0b07c7c60de6347e7b7ff1cf704e80de4ed5b3e236502fddd3c56071aa8012758d905031d6154f965c4898251329c",
625
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/ChaCha20\/Ctx.php": "aeb8c31a1bb46b8519f280f23d349fa93911bf766715c0964c0a901369d0f0599e87c6e13459734f582a04ce74d9ba9f3ed7553d4b7214855a815424a8a8610d",
626
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/ChaCha20\/IetfCtx.php": "d22a84b5bbe07297fa80c989e93681b27b3ee502a9b77b63e2b08eccdca03cb98c39834feec5fce3cb0e1915f2944b06e94fe555da123de982fedc61b30c1f91",
627
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519.php": "b25ba0383cbaa00339f5cbaff6b400a25f3bd4d244d2fe70a08b987ead0ebb04a7f51b9476baf01fea5967610911f809114e39d21d4e278a9be72b48ca39b09e",
628
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519\/Fe.php": "0fad7d424e7f3fbc0abd6a4f9113c83523aadc3f9d3423a94da0954f56d31705ca567ffad0972794bfbba00c4909c8638130b99a983cc52022d262d6b7d145bb",
629
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519\/Ge\/Cached.php": "58ed8181f08dd61076c0ae9ce176455d951de04b9b1b03260c593d009414e9757d9120ea9e94040ddc1e0867f8a6574dc55e3acf82f946100d03d4506c9f778b",
630
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519\/Ge\/P1p1.php": "63b5f5a6c7061826799c2e3285884ac2108adb19ea246475b98fb68a26aebd694eeba56191fe15fbc1a9ecb9b85c139bf9e8b65b4456b8fb42652fcf29097fad",
631
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519\/Ge\/P2.php": "4caf0b912ad4bd82f8c447fc25829177323ba7af6d2355a7709b8ef99a855b51158e5252a1739cf6e9ae72b780e415af0cf3d510bded3fbce3542c99cf057535",
632
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519\/Ge\/P3.php": "5bd84bc8087c48e62e9d29451c0165376ae8486ad9288556c81e4cb897822cdaf95a2df6093f16e2a336839d0a4ea7c1535361bf041d8be0fddeb1eb245eae55",
633
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519\/Ge\/Precomp.php": "a58cbf2c93a75948b4576395ba1ebcef5a35b6dfb4625690e872010a44edd92939ba146b145cf40bc2cb6e45da0e19f169a45b575d813a70428f171459ee2d8c",
634
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519\/H.php": "0ce669e4f370acdbf6cf27d5a525b0a3a3bb7c794b8a2ccc7b2f3a3670fbb048a8493e3e6306a5f148204f50a5458d47ffe4a2705520e15631b02d45d39b0676",
635
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Curve25519\/README.md": "3f50765b54a3cf172c9cdaf2541a54273b811df61330af83883de5309103d6309a0900ecbae056f60aa831e438543c16c809fe183cc15c6a2f2bf15f6f910cf7",
636
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Ed25519.php": "89eada60bdd8739af528cd74b771a2ac04e36aa3e588549c7e8a82d2267a4df5eb4ef13c806185ac65bcd33fcba0f49a03cdbc03f143ffaa576ba6f4ab5efaa7",
637
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/HChaCha20.php": "e221d5f3c4818256a895cc05a8e68ae2b3cced7eaf4e425f3c373d59b2cec31fa7b498e5e42af7e374e70c3a176f966da3cccc4be97b646182a8bef2817986cd",
638
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/HSalsa20.php": "05e5376ceaa53ddb24971a43ded855892cf37fe0f03647660f573334ca79e61edafdd511c418cdb3d42e62298462e729c69b4dae3eb802c4749774b43d659536",
639
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Poly1305.php": "1bc3f6e6323d44ab76eca14cce61e7043ee98d8f7c50f29a5e29704c35adee345faaac767af588e1c6566f5732c1ec40ea815c51711056737460c9143adef1e8",
640
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Poly1305\/State.php": "9a69f92ff7c3e384cd57c0d5fddf9111d57abc9849acebb329ffd1ac4f53e539e1548140f4a430f628cb378d7fc980494307df13e4d1837b0af377bd7811c6d5",
641
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Ristretto255.php": "c4fcc5c22d8ece4e704c847ca01ce6edba7682fb2b9b91d74d664a204cd5955128c3bf8089a855312244f28c4ef6953927832ed989a03edf6eaec5c26df1722e",
642
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Salsa20.php": "8c2ad19b46f527ef9c091cbab17f64d36610745ef32f778e3911e1aa2a142e88c0f6e005ced046a678d66982d2e9ca48677f082697af3999cb62fecee4d800bb",
643
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/SecretStream\/State.php": "629c6f96a7bba323ddb8eb422e7048839c188560932cb4306b9f11ba8a2b15afdfc037fc14ce8725ed3efc72c26700cf6cd2ca4a85870fa885aad6b6d57a4a0c",
644
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/SipHash.php": "6f24cd7d32eb80c943461199a0937b0acdf01560542c54ca916fae6843c3dc5fa65d751380434508aa50501f7dfb6c227e9330996956c4a8c8b32b6ae55bebba",
645
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/Util.php": "fe12c7259ad5daa7eecd8e199c77f822e612333169878309cec5b5483a9bcc775261c344a31023c2741d53f37f05a0f6dc6289dc45c7d7b8ac7fedafd5458d57",
646
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/X25519.php": "ea1d665ec23534de7f18c4f48094de4463753baf8b9ba011e38b969873bbaaa32e6b90bbbd0597baed3687c28e37fe394c224a229d734671b7d7e03197d039f1",
647
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/XChaCha20.php": "56d827be22c68fe9a2cc01b9f5890846197c5831c3c0f129d9b8c522391b7d7391a217a2dc48a4bd78e81c3d2f3bd8187546d311f991148fdf43a8a67730c81e",
648
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core\/XSalsa20.php": "c0367d97622bfb654340a6a7948e8ca4ed399d106dd8b27169a9f5d9bc6532129548b4dabf9f12ffba654f490b8adfa07b0b76935bda15705560feb7c590a3bb",
649
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/BLAKE2b.php": "97cb339b44cc54299394b4fc27c8ab13d5a8d48aa4c8fce71733a27cea5d3226df4341bf9722fb4f4ba71c38f5491d677774245d75bd91a693269aaba0487036",
650
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/ChaCha20.php": "da693dd0be25c739b477673933d361ed4b2f83110ae98f7c6805af20789fb4379b4b7a4ae34aca588666cfbdf61c2dd5776f8a4b1ee0215dae64ea09c6479a10",
651
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/ChaCha20\/Ctx.php": "621194fbbe2eb42c04c9d94e45e3a0ebafdb4cd87195b924705f8c2a9e54c9dc52fa6dcb39967ea1dc4ceeb6f2d20659a1b0aced8035529376f6244ffaa96f07",
652
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/ChaCha20\/IetfCtx.php": "b4a0690f9af7ace9fb3f8c10ca78989573a1cd49d3309f9c0011501daa3c44f7b616868e417096076846b19502ddaaaacb7c85f9b5c8622c57e4882982e09a10",
653
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519.php": "fd10531c29a88f84f8b7de7c09a0e9e66472658827bcbdc55dcb1fba54f620b32dfe9359788e67abe4f6ffed3e4841e6b74939d7504188cfda243512a86c7eb4",
654
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519\/Fe.php": "e6e5ce11b327d42167d51d2fa462ca6a54bf180229261af9ac1189fab30941148136ddabfff606dcf656985cb9da9bee93902f1863a84a3e5d42bfccbb0111d3",
655
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519\/Ge\/Cached.php": "350f529a5a178921a2f40818a1668c3effdeac12b9b8aded2f57f1654343d0f7f535c780c5a271d9b7772969fff9381befcb85aaf676650c67b6e583d616c064",
656
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519\/Ge\/P1p1.php": "fc8344d196cfa17fb61ab576b0a73f0ecbdfdf03de53d669cbf56bf10cf13eabd8c8a83d3eab7d9f9436b4dbb8d0785f9929c190059e0695579811405f3c840a",
657
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519\/Ge\/P2.php": "6c4051bff3e25a7863fcfef3b9c1f028fa8b94d301e4de5dcb6654c629bc95f44978fdb697698375e3cfd1dfb9ae6a3c8dfcad0bd5138e51cd5d5315b5e5b788",
658
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519\/Ge\/P3.php": "d6ee2e6bd34cba83a2025bd79e2d8a829d39f148c65ceee5a382662ef25b1c684552e0486ca29215f52d5d1e140176bdf6e2c40febd55970db55675b76d448e2",
659
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519\/Ge\/Precomp.php": "397b94e8292ad4f09cc37f1b08a7f364e12d6acb74f125ff0148c5562631f632a2ecc44db517cbd5ea61865e70732e6223a0c736b831c751df859a7d2afc4ae6",
660
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519\/H.php": "7bd14df9e3afbf8bc2ba27d5faf6ba72f17eed218cb7e89f4a458f500f6d9a60c52eaf5f1fd656d7de492246b0b0ac3d5904da319c5d85b754c64ce4b1f1b433",
661
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Curve25519\/README.md": "3f50765b54a3cf172c9cdaf2541a54273b811df61330af83883de5309103d6309a0900ecbae056f60aa831e438543c16c809fe183cc15c6a2f2bf15f6f910cf7",
662
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Ed25519.php": "30b970fe798803452a504ac453c70b5a2b51cf3094639dc58195b3c8e44fc37089c58bec2337d7f79ca60c91c4951af5dfa89e9dfbe3ae327084a806a6b8db7f",
663
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/HChaCha20.php": "d4fdd553cde5a1ff277805bbba85128e3ea59e4fc32eaacbc8502414148933c760ef6da06fd967bc594f9d22523c62e45ebd7cc9411ad4b76e2d76c0fc2c00c5",
664
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/HSalsa20.php": "8bbde85156bb88b6f0f14cab67840cabf1e1c456f9459edc145e09907161bd6fbea93fd37f121678064de6922102e78789cbfa3c2eddfcb40b93178fa3fbab6e",
665
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Int32.php": "325772c5cadd6953316e83afe2a04804041292f25cb16e6027ea230e20aebcdd819c937977918161eeb9c43187fc105be2824949c9d6059e9c0a39e0cbc42219",
666
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Int64.php": "8fde2b57266d78e8b03d8c3f89a1fbca3329bb6d0ed4526b3c6dbf5a0e92ef9d8e9e3697cd23b7eb5f7524fba7474cc5a2e06f1ba6faa04f7cb8729c985a5794",
667
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Poly1305.php": "f0cc2f5cf32a37ad6c3dbaff1a8a155ff334995eab78ab42f2e5bd950390babaee0c1588e3f17d4e73cf970b8e3c34f536096d7da23182f526b0eed704e3ecc8",
668
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Poly1305\/State.php": "8656ebf7aa0c2c7e8cf01546a261bf5e9f6c374eb5f40f8133bcb33e35bda2f19f47471b2ae6af6224df7ab9bf3886cc43b88049e8ddbe54b8dd129b28491129",
669
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Salsa20.php": "bbb3dc0a30030d9c5f5ef1ef63e36f9a067d67891185b9620ebee17a67bee31a7abc420abb7b82f38e913b5de54d235859f0e8f5f718d8f02316f4fb03e24b2a",
670
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/SecretStream\/State.php": "69d505517dbbdd2e77cf5aed72673edffa2aa008e70325db88877ba5673ac3ac070bc4c19cf13707932b0b4d71ee0a9b007e06a0f822292ec278a60def7cf511",
671
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/SipHash.php": "8c3c2d2e4c656ee6f7af729856cc4c79918ae2e09a167d6d0cb92f7dc9240c0bdaa36e65a167f5b63961d9f9ac4df2c19e50c848e5a6da5855566deb5b9ab8b4",
672
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/Util.php": "d6ff44eb1015687847600f8b7f6a80974f4de1cb80224ea7f733e908fd53ba2aa669b97d891fe89bf0bb8d358c15a2bbf0661a779e68a715cde0405455127eb4",
673
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/X25519.php": "9e2d803c100fc9a3749100dda30fabe25c6ec59382be64f9995b6505e1652d5b2762111f2243b69316abd942c88106fa5239adcae842971f22fedd8e3aedd954",
674
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/XChaCha20.php": "1d4ef660701da25af79c9d4af2f158e3f62afbc1e5c2aa062f64b970dd33378d5f67c9f0172991985ddd65a976759e09f4604ffdf6ae158bd8a98f4e97af851d",
675
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Core32\/XSalsa20.php": "ffcbccb7d8a1d0262c5e74cbc679022bbcf1acf9160599ce2b92f66e261996f0e93b419231fd41ca95852e09b7a892dd8e98101c3426d30cb294f869908ee21b",
676
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Crypto.php": "1af076765319483b5e0c2a3ed9d5a12133fd41b7172cd15073da3723200c41cdf077dbee04f1e4badc2b86ee5e23965dfd0e8f3af3f52b3b584ab2f775f64cf7",
677
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/Crypto32.php": "9fd3ecc6e6faec645f2c5166ca551cbb4ff8430664bdb46c383da399048de42ab505a05c709b6ed0de245402a1abd701f21398252f059003a59fd55bffd6399b",
678
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/File.php": "4f2a6c996bd3fe4a07e4e1d49d2790e68798add08c4887efb3d7bdc7beb5ec2c1601b8e77a0b40e570211f7d3b4e5a5f97471f60df8b31434487495677052640",
679
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/PHP52\/SplFixedArray.php": "2adc50710dd4bc2cc1138b741cde09f225f727f2177d006ce8ca82691de0336dc51b6c30384938eef1693ae92628460f8984aaacf336815dea092de4ed1521b5",
680
+        "providers\/Telnyx\/vendor\/paragonie\/sodium_compat\/src\/SodiumException.php": "705f6e9777db6be71970f7e218339e36d50023abf723446195cef782976d7431f815a90d1ed83e32ec527303057287f890215b4b0a9a8c992a13d111e8bfb947",
681
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/CHANGELOG.md": "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
682
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/LICENSE": "8756122099aea86ddf6f176a480c0454f2be6dd278e475bd6be7d7ab3d572162f1bd44c9f623e52e53514cb15336be6e84a5eafc8e2a347b481ab5799ebd6e17",
683
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/README.md": "b552bcb37ad765a0aba888fe43d2e2f41b5bee6c90e734c365797e74dd0b8c4df017ae74dab2458edb410630299efd7b649438db57acd53fefb1723e233416f3",
684
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/VERSION": "294108697ec66acf16af2f9518c5999605a8585058ad25dc9303029fd890e6835b2fcda23fff2ad60058f8f6a8a19c945d998e4e228453d4946e395b9aa2055d",
685
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/build.php": "485d76b827a54d8455550e8a8f8d14862f9444381da251e66c2bb8ceaf2106a554c1cd339666b1260450749d0244d6b9ba0c6d0a2220ab2411aa4041fc83f8ad",
686
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/composer.json": "e05f4af7ceef33d82ed5704be36e1b9839236d13073d0e23ef77d33ce7ec303cc2cfc2ddcd25318f1a5295bbe3b61a13bc2fe72f55c226e2f072e2a0b1959481",
687
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/composer.lock": "2b8c24986c6cbd290c0ce53ac4f773836751aebfd65a2350fd07b4cf45292ce2667a54494fa098da13a385ce7a9e10a2ed55d20f7c8dd6817f93f33a6cc710fd",
688
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/data\/ca-certificates.crt": "659e8d36bcb65a7fdd299ee008fc4ecd42be87d8ae7d7d15828567b9be44b4ed8a316978f2f7d3d5d7e96a4da0b30bb8bdcfae5202ef099691daa796318a869e",
689
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/docker-compose.yml": "1fe4c651e406095f0ff1bfc196406d473184bf53cf80f7c67dc79f1aa94b26db74174e0e9bc47adc95eb2a5f6eb950255c4a5cf44ccb7029ba712df3be9e6384",
690
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/docker\/Dockerfile": "a63d1fabd8c19fef37b90922aa4bb21fbd1094635666cf2a3a4db47009888bfd3f1ad5c34c05184e2ccc8f581971f6dae91c1ff137730821422cd482c39e9390",
691
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/docker\/entrypoint.sh": "2bf3911c365a271fc52d17a0aac1687abf52e5286a5d52cd34367e18651dcfd6ef1f791b54105b7742f5d691564ddca3c05a9ba4ce8edfbc68fe919e0bdf6c1e",
692
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/examples\/example_webhook.php": "336b92a647e49d8c994c8e6dc6b26670f0a58cb57d4679d0ba7177fa1f56a84a628e5385dd4c1c25a1395b1d8499e54d34eb2c20f9742a2a2a3d0cb20c36be08",
693
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/examples\/simple_webhook.php": "ed299912ca9a55170796df76b25c5c92462660b065ef7eabf24bf7f552e75fe44512fc3fa977fae2a9dd5e9be1ea28100a456de926fd7f24c32152f577f8e46b",
694
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/examples\/verify_sms_demo.php": "042dee741d4fe90d78edcd0614df6a371cee77d1a95d34623b4e558ead69378c693a33d044f450ea204efd7253e7eeee1e5a4119708dfddbafeea358bc5408b0",
695
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/init.php": "82a207681a76c9b00d1a35fcfe64753cf286d9d0122366f8c1f3009ecd6c548369d2b65d5b4e03f20faa9502b967a3bdae30865e5bf8598eba630b5f9555542f",
696
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Address.php": "a01e1efcaab0209fa7cf32ed85722ff793b9c0f750daf7d3bcd0499037dea764f2a61defa54b4bbaf602f8d0f5f477fd4198e35d6d8b47b82fd13c7a7e70ad59",
697
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/AlphanumericSenderID.php": "c6f7d381cd9901af59d67c66fbe6ace0729c77ac2b2962ce41351ed076cb39c9049aeeb72ba0e3933ebce4ab8a936b86a7e21d30a1c07b2b08cad9da2abcda1e",
698
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiOperations\/All.php": "5a6381d1492e2ebd1498fb4371b55c7e112ebf2c898e1861d7dfd2345db8c56df221795208a29b2a0e42295846fcf98f6a60fa8839df7e28fb66b9bde9226ce5",
699
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiOperations\/Create.php": "811f9227ecc5acb172e8e7120541227de0bc22cbf66a41490b743b3e49647a38889d5cfa5d64139b602572f0fcc0fbb96e3971c78801ed9acf7b50db2ab7499c",
700
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiOperations\/Delete.php": "e3cde9f67ab7281870c7399c4e76ff5807791b94b595567f56ee4ee494574e0f6f282a8d0c024c78c1709940198460f386ab8de6118a85de7d8a52feea0b0dd9",
701
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiOperations\/NestedResource.php": "209aecf9e6abb679b4f1ec2b59b1ce363a73970f6d389829b77802cb88b7bb368506e4d0aad42f090b715b4d4a580fdbe5c8479c02227102b4d147d615fbdb8e",
702
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiOperations\/Request.php": "afcba7de3fa312bc9e532e43bdcab8fcc5ca8b532c6f7bec08f94a8d7b2849467266f98af029bd688a136ac24ab2b7f438ca2fc666395c589d578e9d0156053b",
703
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiOperations\/Retrieve.php": "6f29bd2711e3c6b586c2bf6d9805b986a5f76fb0cd8c98c63259cd9873eeacd679f9718dd333110966ec3bb772e2ad06da7b1586bb590180770bf300aef63c8f",
704
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiOperations\/Update.php": "1d353ac81bc74cd57c75f01da21d6c59e053813930a0eb0fa054417bc87b6a140f64393bc04ac312b8c16803bb4c3eabae278839973f772e3202df32828480c0",
705
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiRequestor.php": "deeca798d9ba058eced71d846bd22cac360cbb25bd1271db25cd0ebdb29b1af9ee863b362849035e8a9f6ee62bd49b8415cec97e1fc01e674ad6942ac987b6e0",
706
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiResource.php": "f093051a36277165763e1ee66594056cc266fdb89caec9ab9223ae6af9add8ea4a20e6e3ea6fff4e9625fcbb95f430686f1f89db36f981d7d54034d79bf397a4",
707
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ApiResponse.php": "0d292d053a85224f4ac839f54253decab0eec5ae9861ca95314e98cad0fec2d2f0a7e712a8ec433adb302b6702d69262c8866b20fd08d67b2d18571965bf6789",
708
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/AvailablePhoneNumber.php": "7c82ca4fa28264c4fdd910c71741270657e52cdbc760343339bbb7c1d5980d27b7af476f7e1bd431926d428dba685a6e34d250f9678ef0a4e3cd8c4b06289e55",
709
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Balance.php": "333bbe5f278ca247d8287c8da5cf3b3f6a96c896a82e3c3b54d01277e3cdc82dd5bbda2a1253fb473a29c49d3030b73b24eb8231cc34f85b0a43bd853682e000",
710
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/BillingGroup.php": "60d9fed23d1520237a50a707986709f3b700d42d049e4070a48fbb50f257a98eab779f45a15939af3d5bce811014c01abbcb86fa1b9ccc5b89d55f44c4b1a308",
711
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Call.php": "eec97591c5e7af2b057dac6e6498cbb2c1fee0439b1b7f31c2d879a5a0fdb5a3eb5ba3bb7e3c5a9195d9019e9df82c99a491ec52f15bec59b496435c0787d43e",
712
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/CallControlApplication.php": "fee499465ecfdd2d5aee0479d3770a80219a5837bed934e0930413e6dde740be21bcd965216c782e0765ba18fd71714ac69a5ee887497845ccc1bd7797d6cac4",
713
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Collection.php": "ba4afd20a921ae7c838a74bd9efcc4e468fc12ecae86b2222f97c9405d376a77533f55924bd1d577429825e746ac59142f6d4576f4d446cb3757cb36b65894fd",
714
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Conference.php": "ef9da126fc06537687947c8eea71fc34a53a7d44607d60bcaea7d8c7f55e76a94a9d7e0057f9abf7efb1f4f270680cba042112a127c2c487fe3c617c5102be29",
715
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Connection.php": "c5f43a62ff80b2e91556dc63ad2f78cd83b4fcae4a7a28ede36388177591fbfc6c20b244f6fd4e540cd9401e34b04946bf422eedfce25316e61c89f15de97665",
716
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/CredentialConnection.php": "fe9d8b7b34a24f5b3b83d6a2597359fedce871db3a526124832d4bf4129e7515366ae16517b8dae259305ae69f95655aaa8b4710a9addc23fffee0e70b70b74c",
717
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ErrorObject.php": "cf83764f49da72bbc816c8741644e15b9a74481145c6c0c11c390221ee4c7ae485cfc09d77db24a48b0756b69c85570242bb2b903c39ca699e636a299ec4dd31",
718
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Event.php": "4e4ccaef81755432630c46881a958928c8b633ef1dea76d05f05711da17f68bf6e5b7b77395abf297b3ab128c065da7b4ed38d1be3a45306eb6d7a1080e72994",
719
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/ApiConnectionException.php": "b2a920958f3e1664a6ea5c5f32c73f9914b3f59d8a927c4e920d385ce87a6676475823729f203b09f5530da667f52e3dc3d4471fa498277270ee9360d0797b5f",
720
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/ApiErrorException.php": "b775efde92c04d1a53dd3f948f2efd92baf1f1dcb5092ed0863f37bb71fe03052562fa89349b1030f3d27a0dffa974ee47c9a3655b40a3941b05e721e7fe97c9",
721
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/AuthenticationException.php": "f8154528a04642cdd24f3de876b1a38d6f97e357d36badafd39e596ca739df7fb77f4259de1efde8bc300f126b20f6e242db4c1e3a25503565df579b62676ec7",
722
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/BadMethodCallException.php": "5e6df108c1df11bc1275948d96829f0ca6ff039126934ec57dbeee74913af00a64e6a9f2b58f42bf74aebeb94596c45cbcf66e5a4afa8924b238ca63d424f452",
723
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/ExceptionInterface.php": "77d5904b79a9a5b265ef121cd19d91b952f631ac7436e7896bb0786d9afc0b7ffe54c7ea901091baefa0154b91abfbb3f9f3a7fcfea4053f27cb44be2d7cb23f",
724
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/InvalidArgumentException.php": "f2872cf684dba5abd50bf876971e32364a23c9259c1e85a01575348614274453d00cc655b01c2dbf2c78c88f4a6143cb486c786dd1664204dc7676a64a9cac4c",
725
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/InvalidRequestException.php": "fa310ff5d5ea8f02f731089c27e6903d9b0e692a3faf272efd19ae4f1075a2a1219d167730b21cac6a30e705816c4230e2511fdda981fb47714f4d81606ffcdd",
726
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/PermissionException.php": "4cc209df863027760738530c5c01962702970a73ac7f11be232234413376dfd34db049f4e49305c8a15ee1f016b26f1c128312930e10cab174e80d6ba20cb12f",
727
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/RateLimitException.php": "c37157b02475d2a3940dc7d007b84cc3c86cab88b42e841a392e3ce4919e637c9b59bc7b33ad3ed8b4b32e74dddafd8e61a6f30d60029b8b1ecc82b8faad4833",
728
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/SignatureVerificationException.php": "3aaa44cc52efcc4caeaee624c070e8ec87b665decbdf00d8aef04ac857358028e4bc0495c4a86c504f3ccc6d753413c5ed685816e3b80851026bf2034514cb59",
729
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/UnexpectedValueException.php": "33504e45241779bae5e9c1d6ace82a75d545e6f7ae76f7d7f071fa4bbab13b2c23d11e59230da3c242b548ee7b5386bf4795e0d06d1719812348d1f9efb0c1cb",
730
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Exception\/UnknownApiErrorException.php": "cf5cc44f46c03d9d0de656e2ae61d7b077d123a4b6666a4b0f57fafa2033e072ceb5b14d6a47987bb14e0acd48ae00b39d4d6ac1849fadc879bcc43ed1acb44a",
731
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/FQDN.php": "b7d44de17cfcd207ac1fe6aada6c24871a98dadafc4cddebe28b135c6e507634608e1b6c7052a40cc750f6515fe19c2de29864d4b9551e7002fd800cc6cc05fa",
732
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/FQDNConnection.php": "527d18ad480447e4d79e567e7a91796ca31bb778f10011aa9fafafba6e769d387fdfbc306a6f1ba58e583bc7c37a9a66f1961494d3639dcdcd8912efcd0e6a55",
733
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Fax.php": "fd8af5f711fb5341e2b86a7fc66a49707bd31efabd2cd63a1d5153c24462f07341d6af618b7e82ff1faeb9bdc203f62b6dd5570d74754e052300d0d7edd0424b",
734
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/FaxApplication.php": "f489a9e161565a6e7f55a4d90fc05bdc8147a8947788a757a2b5464059ff2c49e61fa26b6d1f0b43fbf9ce8d0c08328e276442ab4d2d100e7ef34e9b2e0860c0",
735
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/HttpClient\/ClientInterface.php": "da6ee5de3e8aec8ac144511858cb3bec53bfd2aa0b5ff27eb43c7f72dcdbfb1646da223cbd861db7595db904007ff4c8d6a010122547a98bc1d2c07139328a80",
736
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/HttpClient\/CurlClient.php": "dfcbf2f40053699b94de74defc4a57461c2e07280976a377cf4ec3600e6279fa9cc434060b0291c7e10a634647e1a86e67cbaaadc49783eb532681ca25256a42",
737
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/IP.php": "624821d6dcc5d30a1a08368bacba88cc7ce8b768bb3315b3f8013606e303fa8940c13da8ece0c67a43329a0cfd86d8bd09682963eb54138f4253eb2f159c7560",
738
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/IPConnection.php": "01239dc2096fbe207ce1a5a58dad8d25795b9a8a81dbdd4290730009f2fafee76d74335aa951fb7b54e930e4e9530a0566daa9ef7e99ea60a50b8daf956f11dd",
739
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/InboundChannel.php": "c37478b08abc62ca491806db6e2814c4a28a11357fef873f6aff8867e179dc8d89817ee3db3fdaa84150111cbeb426ad0282dfd7550eb815dca100843f542178",
740
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Message.php": "18acf4bf51ec27d330df16216924c65a45db59895b610a3c803ef1d09beb7d96d20753b4ec16be06ed40f2886ad46bb3d866f14a87021484ede5d33ac1a93c4a",
741
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/MessagingHostedNumberOrder.php": "ecee6ab7a46ebf03b93870017aba4ce00c10ee36342a6d3ead209078aacf4ebcb798ae129535fb15af860355b52ea72ae6bcbf0e5261a9d66224e43560858227",
742
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/MessagingPhoneNumber.php": "2a2caa5e44efc5de92ef9b0f8ed0a68af1ab2c80932f4cd7fe79caa87ca1e146af3bd0e1d16d977738da2a3af1fb3cef77081c32a0dac50bbe8ef54a108efbc9",
743
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/MessagingProfile.php": "7a561dcea7b45a4ad4c3dbfc6baa766f011de2b2dee9a23e512689b374017b05f4fcc5c3510f19111a9d8484ed93a5e05d3dc01f35d75e356f475a894596dc49",
744
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/MobileOperatorNetwork.php": "d4436bfd9a628713889a37846829763909033339a086b6983eac792e9af42c0df2a8bcbd688c5c54a196d1fcb3d22aae7b45e9e18c015592d979e9a924c42ffd",
745
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/NumberLookup.php": "cac3b5f1ea0ca30f9121849a8aa52ed2e18b7776c4f1d552dca4c3536e0d4eb96af45267bb687319a9ec715972bc95a19c7dda54c33a2701e20cff9564dfcee5",
746
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/NumberOrder.php": "52067d9999c150fbefcbba9969b308bb6118eabe25bd08f30cc4978cdebd68fce4479e53d71ce29632133e8c69bb4ce9276301f5a36ea95bd77d29fd057f5d46",
747
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/NumberOrderDocument.php": "007830f9c03979a7811a4e0dd0c74c4b2b6d05e05b56b9d6ceb5a6e55167eb95b2546087ae17328715e01d486c0e58e396bc41816b44866391b98d48ca246d03",
748
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/NumberReservation.php": "988c853084f13e0d86445d6638517f84ef3d90c3f618c2c85c0bd8ab790012c3986a1a3eb3e00fef7759d04a6a1957bd9521bb8da6ade8c05fd2e02a8040f6a3",
749
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/OtaUpdate.php": "3c9579c6ac1ef6f31ff572fa3fb7562b3618182cb36eab3f406d8fbe6fc7b1d35a996e47923074428583ee3653aaff3792f9fdc47eabe1627f1a85722fd9dbf0",
750
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/OutboundVoiceProfile.php": "d0c5985f6f629904f4c95b892e329f280f7e0e13b8794d1950e216ef4c28ede7b94baa99f18803ff6f60b09d6178ad39fe5d3c182e984c2b4b57e9732991597e",
751
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/PhoneNumber.php": "8106765a769bf3f6190783917aa923f3f7690af5b7bf971e3dbe73ee5f227b27531a553cff9cc425ccfc7cf2ac52bcfc685f3d3b178875f8fa837a5de99a077c",
752
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/PhoneNumber\/Messaging.php": "d0aded1cbbd4c6108b0fc6e6773dbd03040af54c967f0a8aa9b2523db769317182889c882e6efe6fb0e187ac3f2919563aa6a937c77f4c1ff94e5bbc31f4d9d6",
753
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/PhoneNumber\/Voice.php": "e7e8184351cb186fee77019e88600dcb15da0435161d1878799433686e012167ab3347d7f02efb5cd511b5d02cd7b6547453f6ecaab623ed23fac7c91b0a7333",
754
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/PortingOrder.php": "ad9a683aab02c8817796e62131fa9cad6f3490d3afe231b5718b3b4f0689a535543362a88333ab808c36e9c41bfc8b7b6178be7fbd5b12f38b6d806053726997",
755
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/PortingPhoneNumber.php": "ff2e1e98371b6a7b0cc5265d1ab82f053d97711a72633a7d3911a4211dacf75c08083d6629aa4fc028643c0dc929d3ab56132f6f21808b875a9ce679e56fe055",
756
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Portout.php": "71de0eb22350f649e5023b2c4a374b3d10a4beb0f8066d67482c62f68a39219d9cda4bd95d91e1df2fc215479f45b1ab79bfc0ccc2d39267d2f268356ae83ec8",
757
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/RegulatoryRequirement.php": "0658d49bc2c20a9a16ac72ea01b5306eda422d81747529c3373333facb5ce1940252387aa498d2957dec62f0eeaa8aac3979ffd84ca72308e660a1a0708796d4",
758
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/RequestTelemetry.php": "cefdb55dce61e5f276bd49f6b49e57c78085338537e56cce6fea5a81cd1d2235f1eaa78be326cbd513117be88a046177afb628659088b66ce423799995c53709",
759
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/ShortCode.php": "4abc882d0dbc72becbff07212d17b8e1383b0efb43818a7eab983fd2a08c3f591a4f4ba2f185003fab0622a43329c969d2fcc80b23cb94410007a0879309ad49",
760
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/SimCard.php": "46289711eda27b37931b0d9f7e9624c114ef9c1e997ea88055dfdf6fe6dfaf7f9169b9a67cbfe48100dc4df2b73ba4d27328b0ca3ff0af3655789535ec3c0b26",
761
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/TelephonyCredential.php": "497a3dde2d7fcf8bf57b502c71daa5e166010daae45e30e1db7ebacb3a37028fc70c7cdcf39a356dd32f845664e8e9723a366fa69610c8f9bd31fa59b3300624",
762
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Telnyx.php": "f5ecf9589eaf7db991051de8482d582b36edc387b8a7ca48c80a419c1a99e1393d7f099aa4ad3e87adb4706ab62c8714dc843c9a8ce77d6fe6ea5ab929d9a882",
763
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/TelnyxObject.php": "0f45c91559ef686a3eb4ce3777ab7d43ba288b380ffd1031cc3c562138410d3582c251e2d986e8a84a2c189257ed4307500e3fa0d662a48a30b28a9622ae8ad2",
764
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/AutoPagingIterator.php": "d03ac3841bb553d847be9ea73ab9debd8c1f2c829b0d38ac4416a121ac535a5ece2ecd9943d89e720cb5abb1c907ca9b96df899a561c190ccd6843bde785114b",
765
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/CaseInsensitiveArray.php": "d5bcc37aeab4fcbbe0b9f4a9057a5654f6080ed899ae54f8ef18bfc907f244071a6693386dd306caceb6bf338883a13c7972574ac5d700aa00e22ec363932cd6",
766
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/DefaultLogger.php": "50a69f9f6ad628e489a05fdad0df811c926c957c301adb0b4b906dcce9733a0598f6c2eb126865c54a0100131dc4230a834b1e98275237ce8e90bff2e96cd0fb",
767
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/LoggerInterface.php": "8d2dc2c59af5e625eaeef0b85b09f78a42e533b62fee84717d67a4c706fbacd94674f439d3ac60984c0a3947b7d2f5a8ccfb64e071c41d063b8298f57578f88c",
768
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/ObjectTypes.php": "99ce4f7d4d4d9d43e24f3124a7c21b9540267aa160c780efe69d6559843a12948f3790b179db66282b0adda384309a793636d71aeb97d9aab0a62dccfbe2b51b",
769
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/RandomGenerator.php": "292c880420b28390e3d734c6343acd48f322db0c474f80430402916de1dcbf8e988b3d2753a7c18e763e632f474284b213ccc8e8fe4e52f00569e72728dcccb4",
770
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/RequestOptions.php": "00b6d4890b5a38f42f13ffdca556bbf1377c05c8a79ad2d6d0b69b7e27deb70252c15088458da4bbd56e7832cc6b2828e261241661dc344727e2bfb170465de2",
771
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/Set.php": "9cfa1c1bc6c012e8a7a797ba8a7893382eeeb234da73f93594a159f78b9858c984dec1e42da5a6cdb240f00d27d250e3fd6a7842d40c23513661201a148a6c5e",
772
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Util\/Util.php": "4556fc8b785486adfb60ea8001296ad0ae7b13d785f92d545324b557fc4aad85a69ec19dbca27dd868050d64670e4e2be2e3a4f50e4aaac609b0089c0e9e2749",
773
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Verification.php": "b63d4f9d717ba204dcedd1c3315db3300567fe09563faed0e4b8f1415171e43e0068fb06ebb2f42c808602248f623f5773414a1612539a873070f461398be650",
774
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/VerifyProfile.php": "fbdf0818dbe1fdcd6bf13720f21ab6552a3ee7930c80a9adc44c3863ebb3df990b18adc8beee6770f4fca9bcda0d514a689d051c129d871eca48f2c0eccd7649",
775
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/VerifyVerification.php": "f2883946ac990666dfa62e07dad649ae0c9de75d5682857cd22419fda8926d45d504ce4fbf38896a1cbf25323a604a818d3b89f05baf58d91cef497c54d981e7",
776
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/Webhook.php": "b451d90496fcad105eb4f61d5716b93878405315742c09d7c4be96c6b9c0427e35c03c1a664ab2f30f1288566b45117f87b069a3ce96d64111ef6a1ef289ac9e",
777
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/lib\/WebhookSignature.php": "ad990cd80d771718468e39aab1b06809a0efb9bb47f5ea4d42a649dbe481f5929fcbd502da6140f1438920e96ce2e4af82d9cfd810b0ddd0eaea391599685c0d",
778
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/phpunit.no_autoload.xml": "06ad2f4fe0a292902757629f5605509f32a0d1dca527550619c98a61519d83fc70f3c886b12f5e5734b1031186fd9c7fed6fba813cd816b0f07d36c2a6bf11e4",
779
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/phpunit.xml": "82ac037adc20f2aa76682878094e8bffbfe31782dc6a94e2987bac5546e3ffec90577d03715f4ce481cc977685eec9e4109a61b4b46bc19351c2cad555d7cadf",
780
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/TelnyxMock.php": "e8e93ca1114530cb7e9cad46eb20e32072934496d515a9391ce8093773450dd60f3288f9d3ba46533a0f650fe67b508d5e54bbfc6e1642443d1fc043b88eaaeb",
781
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/TestCase.php": "9945df738b56e344648cc00d3d4b94345c15d8749ce511b5095a87d5e52aed35d8e3c773276d9dde9d9fa04eada784a55e4876ebf70a198ba719c8e94c8c32d8",
782
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/AddressTest.php": "dd980e7890ad3dc1d12858f2d241a461689a34892bd780a8db034e620c23d01587996042c2c12d82333b2072bfcca6585afb06213694b7415b0b13d3084b83f5",
783
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiOperations\/AllTest.php": "6031bc6fa9e899f06af9465468fb9e15bf5a9a7c1051fb52fbd383ea879842e72ba4b5347d07566182c632b5f66d5f2d4bdf73c1368a3581c6010330bff91ec9",
784
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiOperations\/CreateTest.php": "c94c7e854a40716aec0e257c4d7fa279c3e941d64a37e167d4885dae5a0e22a513c8f3b018c436eff90ee045432c5e34b96aeb7d879380e9386c2bc177b94f39",
785
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiOperations\/DeleteTest.php": "02ea2d3adfd1d83770f10dc42cc2c12c28079ca80933fbe02219ea79fe7eb6958d2b1d76cb7a0bfee9e308c01efb1eff61901e22d192e15e89ae67f7edcabe5e",
786
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiOperations\/RequestTest.php": "f6e158958616f0637f827b94cce168e873e0d3be09e4ec27165f984af3d89c0be4d5d5cd3ed66df5b6237bf183003a0de1c652f599827fd01a2ee7ad47d5fd61",
787
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiOperations\/RetrieveTest.php": "b26b8f61eb3cb893ce4ff9517817295fe9b727dd570b1cf79ace36e16902e0ab9f460d6b65342afa28c59236b59ec0ba0809e1cee673f69ea26489fdbf5f4f42",
788
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiOperations\/UpdateTest.php": "6aafed3640a1173822ac9a26c002168eeef552f9b681fab9ec4f191df4f988a920d8c290b2f875c02596ef613273ed003e4b5a6bb6e0bc2760f54ffff445cdd1",
789
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiRequestorTest.php": "5a1234c4a1e4107aaf970bf87f0fdb1420979dd575a548e589b046cd7feea4dc914f25bf15474fe5bcd9773c94184b610d06b309d48639964a78e6137078cb5a",
790
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiResourceTest.php": "05562966c7ecea541b0ae95f67a11d9e2b86e45439b436b319e252d5998e0eb7a6c9b677e233572fc616caee856d9764b56feed80fd07cc1bec0d861490753b4",
791
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ApiResponseTest.php": "6f8d458b49e34df5c0634276659fd441e4140fb4dade92b384230e4e2b897e0da6d0e82c373b1eca98770dc3396ffc8b924672ce2141426706c624d00ffc7af9",
792
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/AvailablePhoneNumberTest.php": "354326429958fdd199df78d11bbc582a0988018b8f907d93808cbd53243f50332482c0603bf4ff12db2a8977ffe7e663ea9d6e8cb5f485aece0d46ae8942833d",
793
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/BalanceTest.php": "8f866f88a8a59754e2fce7d5fe2a0bf50399fd21711cef171873a45308ff96f929b23163495c273e96c9894b7ea39ee5149c45e764fa0de3b51807a329c674c6",
794
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/BillingGroupTest.php": "4333c81ee3ac767fa600095d95f324286d289c7e105ab251f635d9a942e75c418bde60f96c5954ae29dc152ee5fe7679bc5a8b67452f5fa1f59a411dc4854c69",
795
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/CallControlApplicationTest.php": "2bb4f83cdf82457840352c5beaaed8963aba1dcb59711e310d5aaed0d35429730796b412f1aa4e85d5be5a2288ebdd12fc2be9ad75549506d1a613d604d20749",
796
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/CallTest.php": "50f830a3a3c28953ec53c244d22381910307513ba18b7199d5e7bffc5747863e4da975fa972114b2f8a81d0c24afb2f72df8315010febd8d606d086d79d82165",
797
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/CollectionTest.php": "9e742f72d8a223e64bf1a25362f9a28356c0b55037811510692880a359ee5e39266d9e76aa0832de39530e26798806929fb9ab9795a04651ff316f609e2211f8",
798
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ConferenceTest.php": "4e8ab0baaf21da65e3942b0d98caff11b7a30c24bae10ba546b82f7031d7a85b9d88087f9ac8172e69546eb7635bc1cf8f39b509017b82116e0e13b557bc1f7e",
799
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ConnectionTest.php": "429f80316a563f45783c87db6b6d3dd1564190b5c6a259f254e91ad8b71b2aa5e6ed40b9cf1a98632b7c89b66441e07f0285d434c78dd9729c032c7a4891d4ee",
800
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/CredentialConnectionTest.php": "a1c37f36e418debb034faa2b7df5095eee175ac8801baed517089622123dcc4af642448aecde7aa8b19cf67629de087e4995ec816d791b5007923ee614590c1c",
801
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ErrorObjectTest.php": "97344e9d24c204ae429b856d0b32299de4380ec52e9cfbdef6090add25355d268e3dd3ec35ae7c5e0893f5bb204624930d1a856932243180bb71b40e5a1dc08f",
802
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/EventTest.php": "5152c008cb3de14a47586eeaf3ef778629b2beef87fe154a2c40c337c3f918d664c0ea44d8339e22846fedc696fe6b98f0bb0b557d3f88a3ac62990445a55ec5",
803
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Exception\/ApiErrorExceptionTest.php": "7d54379e1ab9f7d6bddb721ea1c284a8d023674e24e99d115f388ae367250089e10b5962e2bd091e3ebbedd0cc83bb4f821eb0a986ae11487e341569ef7f5c6e",
804
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Exception\/InvalidRequestExceptionTest.php": "a7da1818af1dfb3eaade1e1a122a8a3224e03a557396e11528af75b13cfae07764f82a282a3161d514358b4c55312193c73b5a8900fd70463fe0a66b448cc9f8",
805
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Exception\/SignatureVerificationExceptionTest.php": "1bb0fd1563a5c91b78b02e4f66f3cf0288986f546a0805830e0d4ad1ac449549930558caf86c06cdc578279323c43e4739747961065d5ddfa198dbbcd9540599",
806
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/FQDNConnectionTest.php": "0af10bfb2398682865c4ee72cfb34425fe73b0fd20c86b51c61c4cf72f8c4d39a4ecfa21e4ae2e07a67fdf956057549f0c8c4f77e27e65dc1b75dae8b9b849c9",
807
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/FQDNTest.php": "625370468fb338819fb823fbd38656799a8750f5093eebf75c02cfb592969a8635a442ec2febfe07705a5d6feea362b7644c25c67ae653a245bdf55fc178a2ed",
808
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/FaxApplicationTest.php": "64a60460c62983cb0afc2c76880628e16270f14b0b761a8d62766cbe4c0fb33dfc7bd93ae0cb62de25a8f2b3e1994826fcbfe300ea37353f398c4cc8ed7dd62b",
809
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/FaxTest.php": "a920c8ac18021bedbbc4972109afb0cd0afc16e5d86df2fffa2f8e0bdf837e5684124f926f01daf0bae439473022899498441a770ad8cc52479da3d012f1ea1f",
810
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/HttpClient\/CurlClientTest.php": "cff15215b95a804e4ee233df60671c5c1e9270f621025f6ea7cd5a0bdbb55175caa6c43c62e176300bde05c9ee90d84efda0dcdf0d0b5dda4dab2a47d1a669b7",
811
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/IPConnectionTest.php": "6e034e287616ac89e5059d337c682e3fde010130f4403dc76fe4efa12742c40dac114ddc1aaf7ce9e553c597d9ac27170419c5e33fb1439c31c6b585953ff1a4",
812
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/IPTest.php": "7ff33e91d1c7b8bdbef1ca1f5e373150a05f709e524d5a62b000b5c8b8d697ce42306ea8df917305d9ef2a4ea19f797ca28e2f8d0d5f9e3e31c4ebe5eab55ee9",
813
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/InboundChannelTest.php": "c430f6df3eb5add5bda2342e4b4a3acd77b33d74758516782ee0a045d75e7387aaccf36017fdaef18d71cf8865a28faaa0cf07a4f31c9876858719d84d479657",
814
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/MessageTest.php": "08ae5ad7b98362fa7c1478254f851078ef7e9a223c74f3fc57619d2b9c255259edefefc400e261cceafce7072fa7457b8c1cb4dc8dda29b51e432f6d274a8c3a",
815
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/MessagingHostedNumberOrderTest.php": "f8f8ac7271fb01b07815e2a92d7a0974e4320de63942eadc12df307c9458a7cbda7ddae505a731c491e4aa6bcdda7bec04786890df80dd9acd422593f2a02c0e",
816
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/MessagingPhoneNumberTest.php": "7827d12be3191d1329168c6b277899b81df17aa18b775be538b9b29ec9a90868969c05cf61d53715c42105b92cc37977270c1a7b78bee3d13214d8ece51172f2",
817
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/MessagingProfileTest.php": "0949c56ac67ee6f87854959635dbd003391e497325305692784905987d114b399e4c648252f314bc1147e385daf4e60198cbfd6aa940a6cb24992b8cb5abc24e",
818
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/MobileOperatorNetworkTest.php": "6cdaa23aa8cd0a0e9cc43b6f17c86d9c1f7793f7eb30b774f4a8ae9754488e59e0c180823c31d062abaa356578a8718c65f367588c61015e5e36f9f98e7a5cbe",
819
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/NumberLookupTest.php": "e03a73e589abd73cf52a637dd7d273dd2477533b66bcb75685552b77b47f7b58116c4637477da7f9ccb36a408909d91d3f0d3079396aca9bee996b862f358499",
820
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/NumberOrderDocumentTest.php": "06f3e8f8e8dcf5d8c96f25a6f1888d59e9433654ff060701bcc5cb9f54b07357bb3606ac17af3e3913033fb639358df85c6d5c55bff114407168333d7d49cbec",
821
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/NumberOrderTest.php": "176ca2e94df05262e8a43f14e112fb62108ce886bd90a690e8b907881c696e35bd223f08a4960fb58ebebd20cd42bd4217ffa14132e53ddac260926c6d7e8842",
822
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/NumberReservationTest.php": "11742f7449c279908848fd493817731f3f1343895e16d3426a7a7f9fc3d4cc27e275a858e16d7efb8e9c18d32de1ffffc92929e8e3ba277157ab7304c3023c86",
823
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/OtaUpdateTest.php": "14830affab4936804afdd723714f2dc76c520fc2fd6e4d36d7bb255ef566836eafb6b29c18c5adb8785eed39f4bab030e3cd1aab1ef0293d9660b38a10fd6a45",
824
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/OutboundVoiceProfileTest.php": "e49828087e2114fb11569db7387a0acb7cce8bdb0cd655b280b567445ba2dbf16f8b66a88369876e7a2530fb282bf5a04be702719adf4ace871c2b6df8fa5edf",
825
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/PhoneNumber\/MessagingTest.php": "b3c5665f4661624f58f02b814ab1edbee5ceb8c26643bd356b486f049dbb498a44da0af43daf200890c79acad16d51c169d7aa1a2ad4befe074b0ac539ebe3c0",
826
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/PhoneNumber\/VoiceTest.php": "af08b444289d0194437c414916a8ec9285b98413d78e74d1c832b9b45583f9037832a538751628b5dc86b5a13c40c63e9dd360b719501762e8e868fcaa6fb215",
827
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/PhoneNumberTest.php": "7a07f41165e45e5fab268b0e01523c2f67f0ad146965c401856582c4b4a3f63e53324585b1785b41cbeb637d8e61e26e2bfdb57feaf6c6c04cc33be8e4864df8",
828
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/PortingOrderTest.php": "48d2ed4bb9354c772eef6484a0c9a195487c39f26bee3d143ddf64ae7da15e42e5f280a3e26eaa280940230fdee52ea09b7e5320823d4baefa73eec4490537ad",
829
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/PortingPhoneNumberTest.php": "476748b7e467c4f5a648c394eb19dbf297aebc2c16357c946dbc4f363241639dd1001985a7bb21166d5bc77bff1e31edce6e379dbda10f04406377dafcae1bd5",
830
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/PortoutTest.php": "cd262d5eae7c9ef9ba8c76856ef2d4f604484e6bf8646e9ad5231e89f5d45c8176a8ac33a757c53e4be8e2c98e6bb750c6041aefe8b2a589ac1e70a2db4493b2",
831
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/RegulatoryRequirementTest.php": "daa2836606e7c3f34fa122045e982e42f5da86b46f367ddcd7fe9b12e2a3fe5d472d4f38403d4b63aa0c58473d3b5901b8dd49b93a56fa3e76a0bdcf88ebade0",
832
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/RequestTelemetryTest.php": "61190b3601f7c2c72f55e9b1634cfaf11ca53231cf4b5f854ab14859b97f5dc0f07f6c95b8f7c3516ed253e13768b7d4ed9c1d15d0772fd1850eb894f5821152",
833
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/ShortCodeTest.php": "f2e867e0b75d8334ccce51f7bdce842b350e7028319e8d388e0512b5e119585952a54ea79762010f12de8ffcd1c440638ba5300ddbe59adfdcefc712d8e079ac",
834
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/SimCardTest.php": "7000edb2f9b739bdbd44fceeee2e4a16c708efb22c7e38483569d5416f3c107bcecdc759e2e6108553193ba99acc542f5bf3bc353ee1428593a81b80d89ad7c8",
835
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/TelephonyCredentialTest.php": "1f65bad536cd49b2df684db54533b9799856b32464b80700bed5008c9379c414f756d075ab8e231d83f5bd9c1729dba064a5ab5c7e515ca5c32e85698e2036ad",
836
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/TelnyxObjectTest.php": "6214f2c38865c7a183f6a3fd64bc79e7f04963bd726fc124a87b65412075fd236e00cb5f5ed514a3ca2847faec77f4e7a14c59e8906478543daea9c4ddecb7b7",
837
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/TelnyxTelemetryTest.php": "ced938d8d20bdcd0d465155e1bd3ffbaec8ba96a6392c42dbec27a1d10a04da17b90fd3b91322c94b54fcd5a974528e6f10d081ca9b1915a8c8166e0727ceb31",
838
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/TelnyxTest.php": "d88d70053ebb64905acccf7e3cf651ea40c9155130e351d56135c96ada96263311faeabc83d4cef1e72387302ea4a11edf338c3744093d9828e056351eefe11a",
839
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Util\/CaseInsensitiveArrayTest.php": "671262198a48a16dc2ddb7ecf1c7fd309241db9c74c11072d86cbd2f56403973e4bb17ca5bc6c489bddf46cc391098dd6b666b134fded9430c211c2a3193fc58",
840
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Util\/DefaultLoggerTest.php": "39942a071430588bf6c089f5d0c97596b3b46b5b7a2b45d900cc41670dcf4bcf0d34e37895e494f0c89242e52d11d8a62f419650407c26ed91b43ea18c816e9e",
841
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Util\/ObjectTypesTest.php": "2d697994485e6c8f9084f9155a5a5b753261bcd2afcc9dfc5760daa5d4196b7c5baee49b264142a705ca7dd6c5d2cde227db3c1f860173aee6769299db95cd83",
842
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Util\/RequestOptionsTest.php": "86d628c4b19e4b7d057cac471219603643b6405e83745535b6c5f743fe84d5cf918a273f9e8e22c5eded36cc20ce49453e90c0ae05a9ed437059ddc287ccb5f7",
843
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Util\/SetTest.php": "c91cbf6d983f16e033eec154e56705b1d942243371df25d5cec7cb375a359faf29fec0c87fa5f3e4d7aad512d7e757361cf409e60d643fff7fa8fef72d9ff172",
844
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/Util\/UtilTest.php": "10f13d306d3ac2211b67e759a6e1fbbbdcbc1cb791db4531ac799a8f84be67b3ab43cc85498b786b0630510324bf5039ac7ed39e2252f607f7937e802f9b578d",
845
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/VerificationTest.php": "8ea7985bfc5075c0e5d3a8b0b703af578479e481d769a0e8659d4b0996314aae15de36cc7022e087c0625c5976255aae323f9ac141e9e4fef3939a23fda6d260",
846
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/VerifyProfileTest.php": "c0986530c0ddd14e2227cbf9ceb0614aeec3c3b2dc37b5bce0de0d174ebd047f61fa28ba0787b4de1fd3efb5d77d5924e36ebf6fbba09711d0237f520365e8fc",
847
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/api_resources\/WebhookTest.php": "7e06c31d714348c6c9a6cf14c4a21a1f593287fe61e41630a6d766f15cf2595dccb1cd92981578cc205f6c89839a07c7c845efca2b44521d0aa36c0be9e444f7",
848
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/bootstrap.no_autoload.php": "cb002f7c8f77834b6414db6535f083bcd227ee6085363fa3cb0f66b55226680a45c8562fd8458249868465957b2aeae134b3379f8ee2ed22c96425475e9c0af1",
849
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/bootstrap.php": "50e143ed68aceb91d3e119d5a31521e76bfe9876bd780c90ac83afb7ca4f32be48ff81c33c134109eafe1d22f35e0957a9a834966b8853df99dc1df04795adf4",
850
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/data\/test.png": "6ad523f5b65487369d305613366b9f68dcdeee225291766e3b25faf45439ca069f614030c08ca54c714fdbf7a944fac489b1515a8bf9e0d3191e1bcbbfe6a9df",
851
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/tests\/openapi\/README.md": "0c54fffd5b7a5f393358864ff9e3bd3793075d6060cc1336603b2455d60f16d160ffd47b52bca6834acf0d9713855b386f69580099a3dcc131e8d5d617975ff2",
852
+        "providers\/Telnyx\/vendor\/telnyx\/telnyx-php\/update_certs.php": "6a7fd896832dbc4c039fc907c74f25fad01f26882809d1ed0bef2870ba7db5d5930311208e2864190209862a077e4397dabcc1760ef2ec7e29127868016fc0d8",
853
+        "providers\/Twilio\/readme.txt": "879f75eaefe03b56788a884a5cb031533b33a94acd816b9e3e51a9cf0db826de700062955fc45d9561bd4c69f71178e2976f702e801fc06c3c076494c55c8bcb",
854
+        "templates\/content\/index.php": "63d6e27dee39188b80cef2b095db84791e02af0526b80d41bd37845386714f9f82cc9dafaf97fa355b927ab9b74527199ec70604480e09feb10a2b076e313b5a",
855
+        "templates\/index.php": "15ea019ef66fa303773941fa9ca673e472e9521b3f9fdb9052870e6f0596ca3939b247c8924ec0d67e0f3fee6e612e2c447a1297cf23cb5b6144e58a6197d65e",
856
+        "templates\/navigation\/index.php": "2b7b13c516cd0199d5a01a5c85ce3d93f347495d50201238648ed8a516f0f6ac4680f73b7776e11968f231379db4bb5960d79cf2d053df354ae072fb7a08e54e",
857
+        "templates\/settings\/admin.php": "fc11bdc9a9ebd20114ac1a0c7105cc2a950e6e6818808706786c1b36384102121feaf5eca3677335b7b13e879f586b256d55094c8ba70cc81bd0e0db2e468e9d",
858
+        "templates\/settings\/personal.php": "c2318964fec2a2f1cf3710fecea66bac9bc9f7fb10abbf65be5268c21ab1679f3a174f750821982a55fb43820ff873a4fc6437a89c4155bbb51622439d996439"
859
+    },
860
+    "signature": "WSTzHckBGAAZbNBm\/v7mjier2rweiVWpewwfC2OZiCF\/Gafd0LbQ\/jGiJ8XTiLNwzNKiiAzemjv8VIJs256100aYOpTGrU9o1SPCSocsyNau\/BpzK0M7SRcRYP38fnlUyrl+hCM4icn5LNaa1Jo\/Iuu50VEDQo2sruWoYQ1y2J8RdAIPnW44SvEygYmUPnf5xc0rwujOCFtXFHrIhCcIn8m2py\/tHIsZLIKzYejra30ROq6F5J1iX+syoltFkhi265maQ6rv9q5F89eBh6tcCZHNNqx+81L9hYFI1v9oz7pr7yZ4CJvMgfgIT9lC2BYbTbrdhl14nh+ZR667bd\/FbqbYoegYd2+bq1p0owD4oF2zJ8ulXoO6VM4aThAAgOPRgVV2SQNc4CocFa2xb6rfI5PQmWEWeLLRjSRNF0ylGgl83eJU8NBJB482IouXL5u17bNqFH7affPjJfgSdXFBqF4BfL5bqEKi9TVBG3ONyB6E+KSBdQDBIZh2MUAYyjcfGWkx9IsLhjPh23Ldz0xcj38GhZrS7EafI6CvprYT3sy7XCGR9g7+DjbD\/HyQOU2XUw54\/qGcllxBEUkp4f\/Q64JgG7Sjicuaw3w0ZoZsdBU+enwP10CSr4Ue5m\/T+MW0LqXJa1ThyQS6OzFk\/8LvxAs0nBLbxPvqsFpl24C67sY=",
861
+    "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-----"
862
+}
0 863
\ No newline at end of file
1 864
new file mode 100644
... ...
@@ -0,0 +1,3007 @@
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
+div > label {
24
+   position: relative;
25
+}
26
+
27
+label span {
28
+   display: inline-block;
29
+   min-width: 110px;
30
+   padding: 0px 0px 8px 0px;
31
+}
32
+
33
+select {
34
+  min-height: 25px;
35
+  box-sizing: border-box;
36
+  text-overflow: inherit;
37
+}
38
+
39
+.providerSettings {
40
+   background-color: #F7F7F7;
41
+   padding: 14px;
42
+}
43
+
44
+.providerName {
45
+   font-size: 18px;
46
+   font-weight: bold;
47
+   margin-bottom: 20px;
48
+}
49
+
50
+#smsrelentless_vbar {
51
+   padding: 18px;
52
+   font-family: Calibri, Frutiger, "Myriad Pro", Myriad, sans-serif;
53
+   color: #6d6c6c;
54
+}
55
+
56
+.smsr_textbox {
57
+   display: block;
58
+   box-sizing: content-box;
59
+   width: 70%;
60
+   font-size: 14px !important;
61
+}
62
+
63
+.smsr_textboxspec {
64
+   box-sizing: content-box;
65
+   width: 70%;
66
+   font-size: 14px !important;
67
+}
68
+
69
+#copyToClipboardtel, #copyToClipboardnex, #copyToClipboardtwil, #copyToClipboardflow {
70
+   display: inline-block;
71
+   width: 18px;
72
+   height: 18px;
73
+   margin: 0px 0px -4px 5px;
74
+   cursor: pointer;
75
+}
76
+
77
+#copyToClipboardtel:hover, #copyToClipboardnex:hover, #copyToClipboardtwil:hover, #copyToClipboardflow:hover {
78
+   background-color: #E0E0E0;
79
+}
80
+
81
+#telapi_url, #nexapi_url, #twilapi_url, #twilapi_url_rec, #flowapi_url, #flowapi_url_rec {
82
+   display: inline-block;
83
+   box-sizing: content-box;
84
+   width: 70%;
85
+   font-size: 14px !important;
86
+}
87
+
88
+#generate_tel_rcpt, #generate_tel_delrcpt, #generate_nex_rcpt, #generate_nex_delrcpt, #generate_twil_rcpt, #generate_twil_delrcpt, #generate_flow_rcpt, #generate_flow_delrcpt {
89
+   display: block;
90
+   white-space: normal;
91
+   word-wrap: break-word;
92
+}
93
+
94
+.generateUrl {
95
+   color: #161616;
96
+   background-color: #e3ecf0 !important;
97
+}
98
+
99
+.generateUrl:hover {
100
+   background-color: #c2dcea !important;
101
+}
102
+
103
+.generateUrl:active {
104
+   background-color: #b5cfdd !important;
105
+}
106
+
107
+#settings-dscr {
108
+   padding-top: 3px;
109
+}
110
+
111
+.setlabeltext {
112
+  font-size: 15px;
113
+}
114
+
115
+#smsr_save_msg {
116
+   display: inline;
117
+   color: #181918;
118
+   background-color: #a5e5b3;
119
+   font-weight: bold;
120
+}
121
+
122
+#get_notify {
123
+   display: block;
124
+   margin-bottom: 18px;
125
+}
126
+
127
+#get_notify:hover {
128
+   cursor: pointer;
129
+}
130
+
131
+#includesmsinemail, #showallmessages, #showdisplaynames {
132
+   display: block;
133
+   margin-bottom: 14px;
134
+}
135
+
136
+#includesmsinemail:hover {
137
+   cursor: pointer;
138
+}
139
+
140
+#currentbaldiv, #smsnumbersdiv {
141
+   display: block;
142
+   position: relative;
143
+   font-size: 17px;
144
+   font-weight: bold;
145
+   height: 30px;
146
+   margin: 0px 0px 14px 0px;
147
+   background-color: #4CA3D9;
148
+   border-radius: 20px;
149
+}
150
+
151
+.providername {
152
+  color: #FFFFFF;
153
+}
154
+
155
+.providername:hover {
156
+  color: #2c0cfc;
157
+}
158
+
159
+#currentbalance {
160
+  display: inline-block;
161
+  position: relative;
162
+  margin: 5px 0px 0px 114px;
163
+  color: #262626;
164
+  font-weight: 600;
165
+}
166
+
167
+#smsprovider {
168
+  display: inline;
169
+  position: absolute;
170
+  width: 102px;
171
+  height: 22px;
172
+  padding: 0px 0px 1px 0px !important;
173
+  -moz-box-sizing: border-box;
174
+  -webkit-box-sizing: border-box;
175
+  box-sizing: border-box;
176
+  background: #fcfcfc;
177
+  font-size: 15px;
178
+  font-weight: 500;
179
+  color: #565656;
180
+  text-align: center;
181
+  border-radius: 20px;
182
+}
183
+
184
+#currentsmsnmbrs {
185
+  display: inline-block;
186
+  position: absolute;
187
+  height: 22px;
188
+  width: 54%;
189
+  padding: 0.4px 0px 0px 0px !important;
190
+  margin: 2px 0px 0px 4px;
191
+  text-align: center;
192
+  text-overflow: inherit;
193
+  font-size: 14px;
194
+  font-weight: 500;
195
+  color: #565656;
196
+  -moz-box-sizing: border-box;
197
+  -webkit-box-sizing: border-box;
198
+  box-sizing: border-box;
199
+  background: #fcfcfc;
200
+  border-radius: 20px;
201
+}
202
+
203
+.cllridcls {
204
+  position: relative;
205
+  display: inline;
206
+  font-size: 17px;
207
+  color: #000000;
208
+}
209
+
210
+.tooltipbalanceid  {
211
+  position: relative;
212
+  display: inline-block;
213
+  float: right;
214
+  font-size: 15px;
215
+  color: #000000;
216
+  z-index: 9;
217
+}
218
+
219
+.tooltipsetid  {
220
+  position: relative;
221
+  display: inline-block;
222
+  float: right;
223
+  font-size: 15px;
224
+  color: #000000;
225
+  z-index: 8;
226
+}
227
+
228
+.tooltipbalanceid #infobalance {
229
+  display: block;
230
+  position: relative;
231
+  margin: 4px 14px 0px 0px;
232
+  color: #000000;
233
+  font-size: 21px;
234
+  font-weight: bold;
235
+  font-family: 'Liberation Serif', sans-serif;
236
+  font-style: italic;
237
+  z-index: 6;
238
+}
239
+
240
+.tooltipbalanceid .balancetooltip {
241
+  display: block;
242
+  position: absolute;
243
+  visibility: hidden;
244
+  width: 264px;
245
+  background-color: #fafafa;
246
+  font-size: 15px;
247
+  font-weight: bold;
248
+  color: #595959;
249
+  text-align: left;
250
+  border-radius: 5px;
251
+  padding: 5px 5px 5px 8px;
252
+  margin: -4px 0px 0px -244px;
253
+  box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
254
+  -webkit-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
255
+  -moz-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
256
+  z-index: 6;
257
+}
258
+
259
+.tooltipbalanceid:hover .balancetooltip {
260
+   visibility: visible;
261
+}
262
+
263
+#infotipid {
264
+   display: block;
265
+   position: relative;
266
+   margin: 4px 14px 0px 0px;
267
+   color: #000000;
268
+   font-size: 21px;
269
+   font-weight: bold;
270
+   font-family: 'Liberation Serif', sans-serif;
271
+   font-style: italic;
272
+   z-index: 5;
273
+}
274
+
275
+#setcalleridtp {
276
+   display: block;
277
+   position: absolute;
278
+   width: 274px;
279
+   overflow-y: scroll;
280
+   visibility: hidden;
281
+   background-color: #fafafa;
282
+   border-radius: 5px;
283
+   margin: -6px 0px 0px -250px;
284
+   scrollbar-width: auto;
285
+   scrollbar-color: #a2a2a2 #ececec;
286
+   box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
287
+   -webkit-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
288
+   -moz-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
289
+   z-index: 10;
290
+}
291
+
292
+.calleridtooltip {
293
+   display: block;
294
+   position: relative;
295
+   width: auto;
296
+   height: auto;
297
+   background-color: #f4f4f4;
298
+   font-size: 15px;
299
+   font-weight: bold;
300
+   color: #595959;
301
+   text-align: left;
302
+   padding: 5px 12px 5px 10px;
303
+   z-index: 10;
304
+}
305
+
306
+.tooltipsetid:hover #setcalleridtp {
307
+   visibility: visible;
308
+}
309
+
310
+.pflabels {
311
+   font-size: 15px;
312
+   font-weight: bold;
313
+}
314
+
315
+.srheader {
316
+   display: block;
317
+   position: relative;
318
+   margin: 0px 0px 7px 0px;
319
+   font-size: 17px;
320
+   font-weight: bold;
321
+}
322
+
323
+.sendtomultrcvrs {
324
+   display: block;
325
+   position: relative;
326
+   margin: 0px 0px 7px 0px;
327
+   font-size: 17px;
328
+}
329
+
330
+.smsnbformat {
331
+   display: block;
332
+   position: relative;
333
+   margin: 0px;
334
+   font-size: 17px;
335
+   font-weight: bold;
336
+}
337
+
338
+.smsrelentless_box {
339
+   width: 400px;
340
+   display: block;
341
+}
342
+.indtext {
343
+   display: inline-block;
344
+   padding-left: 10px;
345
+}
346
+
347
+#settings-dscr {
348
+   padding-top: 3px;
349
+}
350
+
351
+#sms_upload_msg {
352
+   display: block;
353
+   color: #181918;
354
+   background-color: #a5e5b3;
355
+   font-weight: bold;
356
+}
357
+
358
+#sms_submit_msg {
359
+   display: none;
360
+   margin: 14px 0px 8px 0px;
361
+   padding: 3px 20px 0px 20px;
362
+   width: 100%;
363
+   color: #181918;
364
+   background-color: #a5e5b3;
365
+   font-size: 15px;
366
+   font-weight: bold;
367
+   text-align: center;
368
+   border-radius: 14px;
369
+}
370
+
371
+#pickedfilename {
372
+   font-size: 13px;
373
+}
374
+
375
+#smstodiv {
376
+   display: block;
377
+   position: relative;
378
+   height: 32px;
379
+}
380
+
381
+#smsto {
382
+   display: block;
383
+   width: 99%;
384
+   max-height: 32px;
385
+   padding: 0px 15px 0px 15px;
386
+   color: #565656;
387
+   font-size: 16px;
388
+   font-weight: bold;
389
+   border-radius: 20px;
390
+}
391
+
392
+#sendtomultiple {
393
+   display: inline-block;
394
+   position: relative;
395
+   margin: 10px 0px 12px 0px;
396
+   font-size: 16px;
397
+   font-weight: bold;
398
+}
399
+
400
+#entermessage {
401
+   display: block;
402
+   position: relative;
403
+   margin: 4px 0px 0px 0px;
404
+   font-size: 16px;
405
+   font-weight: bold;
406
+}
407
+
408
+#uploadfileforsms {
409
+   margin-left: 7px;
410
+   background-color: #ffffff;
411
+   border-radius: 3px !important;
412
+}
413
+
414
+.entertime {
415
+   display: inline;
416
+   font-size: 16px;
417
+   font-weight: bold;
418
+   margin-right: 7px;
419
+}
420
+
421
+#sendmediafl {
422
+   display: block;
423
+   position: relative;
424
+   margin: 0px 0px 20px 0px;
425
+   font-size: 16px;
426
+   font-weight: bold;
427
+}
428
+
429
+#tomultchckbx {
430
+   display: inline-block;
431
+   position: absolute;
432
+   margin: 3px 0px 0px 10px;
433
+}
434
+
435
+#mediafilechckbx {
436
+   display: inline-block;
437
+   position: absolute;
438
+   margin: -7px 0px 0px 10px;
439
+}
440
+
441
+#deleteoldchckbox {
442
+   display: inline-block;
443
+   position: absolute;
444
+   margin: 3.5px 0px 0px 10px;
445
+}
446
+
447
+#tomultchckbx:hover, #mediafilechckbx:hover, #deleteoldchckbox:hover {
448
+   cursor: pointer;
449
+}
450
+
451
+.maxmessagelength {
452
+   display: none;
453
+   position: relative;
454
+   margin: 2px 7px 4px 0px;
455
+   font-size: 15px;
456
+   color: #000000;
457
+   z-index: 6;
458
+}
459
+
460
+#maxlengthinfo {
461
+   display: block;
462
+   position: absolute;
463
+   width: 274px;
464
+   height: 200px;
465
+   overflow-y: scroll;
466
+   visibility: hidden;
467
+   background-color: #fafafa;
468
+   border-radius: 5px;
469
+   margin: -11px 0px 0px -6px;
470
+   scrollbar-width: auto;
471
+   scrollbar-color: #a2a2a2 #ececec;
472
+   box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
473
+   -webkit-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
474
+   -moz-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
475
+   z-index: 10;
476
+}
477
+
478
+.maxlengthtooltip {
479
+   display: block;
480
+   position: relative;
481
+   width: auto;
482
+   height: auto;
483
+   background-color: #f4f4f4;
484
+   font-size: 15px;
485
+   font-weight: bold;
486
+   color: #595959;
487
+   text-align: left;
488
+   padding: 5px 12px 5px 10px;
489
+   z-index: 10;
490
+}
491
+
492
+.maxmessagelength:hover #maxlengthinfo {
493
+   visibility: visible;
494
+}
495
+
496
+.up-bttn-wrapper {
497
+  display: block;
498
+  position: relative;
499
+  overflow: hidden;
500
+  padding-top: 20px;
501
+  padding-bottom: 30px;
502
+}
503
+
504
+#smstext {
505
+  display: inline-block;
506
+  color: #000000;
507
+  width: 100%;
508
+  height: 130px;
509
+  text-align: left;
510
+  font-size: 16px;
511
+  border-radius: 6px;
512
+  resize: vertical;
513
+  white-space: pre-wrap;
514
+}
515
+
516
+#char_count {
517
+  display: none;
518
+  font-size: 15px;
519
+  font-weight: bold;
520
+}
521
+
522
+#mtextSize {
523
+  display: none;
524
+  margin-left: 10px;
525
+  font-size: 15px;
526
+  font-weight: bold;
527
+  color: #4CA3D9;
528
+}
529
+
530
+#submitsms {
531
+   display: block;
532
+   position: relative;
533
+   margin-top: 14px;
534
+   color: white;
535
+   font-weight: bold;
536
+   font-size: 15px;
537
+   background-color: #4CA3D9;
538
+   border-radius: 20px;
539
+   cursor: pointer;
540
+   opacity: 1 !important;
541
+}
542
+
543
+#submitsms:hover {
544
+   border-color: #5CAECC;
545
+}
546
+
547
+#submitsms:active {
548
+   background: #4B96B1;
549
+   border-color: #4B96B1;
550
+}
551
+
552
+#multiplerecivers {
553
+   display: none;
554
+   background: #e8f6ff;
555
+   border-radius: 6px;
556
+   padding: 5px;
557
+   margin: 0px 0px 20px 0px;
558
+}
559
+
560
+#multsetrows {
561
+  display: block;
562
+  padding: 5px;
563
+}
564
+
565
+#multsmsinterval {
566
+  display: block;
567
+  width: 100px;
568
+  height: 25px;
569
+  font-size: 14px;
570
+  font-weight: bold;
571
+  padding: 0px 0px 0px 10px;
572
+  border-radius: 20px;
573
+}
574
+
575
+#app {
576
+  position: relative;
577
+  display: flex;
578
+  min-height: 100%;
579
+  min-width: 100%;
580
+}
581
+
582
+#app-content {
583
+   position: relative;
584
+   z-index: 1000;
585
+   flex-basis: 100vw;
586
+   min-width: 0;
587
+   min-height: 100%;
588
+   margin: 0 !important;
589
+   overflow-y: scroll;
590
+}
591
+
592
+#viewerContainer {
593
+   display: block;
594
+   position: relative;
595
+   width: 100%;
596
+   height: 100%;
597
+}
598
+
599
+.pdfViewer #viewer {
600
+   display: block;
601
+   position: relative;
602
+   min-width: 100%;
603
+   min-height: 100%;
604
+}
605
+
606
+#smsdocpreview {
607
+   display: inline-block;
608
+   position: relative;
609
+   width: 100%;
610
+   height: 100%;
611
+   margin-top: -50px;
612
+}
613
+
614
+#outerContainer {
615
+   display: block;
616
+   position: relative;
617
+   width: 100%;
618
+   height: 100%;
619
+}
620
+
621
+#mainContainer {
622
+   display: block;
623
+   position: relative;
624
+   width: 100%;
625
+   height: 100%;
626
+}
627
+
628
+.texttooltip {
629
+  font-family: 'Liberation Serif', Calibri, sans-serif;
630
+  font-style: italic;
631
+  color: #000000;
632
+  font-size: 21px;
633
+  font-weight: bold;
634
+  margin: 0px 0px 4px 4px;
635
+}
636
+
637
+.fortooltip {
638
+   position: relative;
639
+   display: inline-block;
640
+   margin: 0px;
641
+   font-size: 15px;
642
+   color: #000000;
643
+   z-index: 7;
644
+}
645
+
646
+.fortooltipsec {
647
+   position: relative;
648
+   display: inline-block;
649
+   font-size: 15px;
650
+   color: #000000;
651
+   padding: 2px 0px 4px 2px;
652
+   z-index: 3;
653
+}
654
+
655
+.fortooltiptert {
656
+   position: relative;
657
+   display: inline-block;
658
+   font-size: 15px;
659
+   color: #000000;
660
+   padding: 2px 0px 4px 2px;
661
+   z-index: 0;
662
+}
663
+
664
+.fortooltipfourth {
665
+   position: relative;
666
+   display: inline-block;
667
+   font-size: 15px;
668
+   color: #000000;
669
+   padding: 2px 0px 4px 2px;
670
+   z-index: 4;
671
+}
672
+
673
+#tonmbrformat {
674
+   display: block;
675
+   position: absolute;
676
+   width: 274px;
677
+   overflow-y: scroll;
678
+   visibility: hidden;
679
+   background-color: #fafafa;
680
+   border-radius: 5px;
681
+   margin: -11px 0px 0px -6px;
682
+   scrollbar-width: auto;
683
+   scrollbar-color: #a2a2a2 #ececec;
684
+   box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
685
+   -webkit-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
686
+   -moz-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
687
+   z-index: 10;
688
+}
689
+
690
+.fortooltiptext {
691
+   display: block;
692
+   position: relative;
693
+   width: auto;
694
+   height: auto;
695
+   background-color: #f4f4f4;
696
+   font-size: 15px;
697
+   font-weight: bold;
698
+   color: #595959;
699
+   text-align: left;
700
+   padding: 5px 12px 5px 10px;
701
+   z-index: 10;
702
+}
703
+
704
+.fortooltip:hover #tonmbrformat {
705
+   visibility: visible;
706
+}
707
+
708
+#uploadfileinfo {
709
+   display: block;
710
+   position: absolute;
711
+   width: 274px;
712
+   overflow-y: scroll;
713
+   visibility: hidden;
714
+   background-color: #fafafa;
715
+   border-radius: 5px;
716
+   margin: -11px 0px 0px -6px;
717
+   scrollbar-width: auto;
718
+   scrollbar-color: #a2a2a2 #ececec;
719
+   box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
720
+   -webkit-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
721
+   -moz-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
722
+   z-index: 10;
723
+}
724
+
725
+.fortooltiptextsec {
726
+   display: block;
727
+   position: relative;
728
+   width: auto;
729
+   height: auto;
730
+   background-color: #f4f4f4;
731
+   font-size: 15px;
732
+   font-weight: bold;
733
+   color: #595959;
734
+   text-align: left;
735
+   padding: 5px 12px 5px 10px;
736
+   z-index: 10;
737
+}
738
+
739
+.fortooltipsec:hover #uploadfileinfo {
740
+   visibility: visible;
741
+}
742
+
743
+#deleteoldinfo {
744
+   display: block;
745
+   position: absolute;
746
+   width: 274px;
747
+   height: 200px;
748
+   overflow-y: scroll;
749
+   visibility: hidden;
750
+   background-color: #fafafa;
751
+   border-radius: 5px;
752
+   margin: -11px 0px 0px -6px;
753
+   scrollbar-width: auto;
754
+   scrollbar-color: #a2a2a2 #ececec;
755
+   box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
756
+   -webkit-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
757
+   -moz-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
758
+   z-index: 10;
759
+}
760
+
761
+.fortooltiptexttert {
762
+   display: block;
763
+   position: relative;
764
+   width: auto;
765
+   height: auto;
766
+   background-color: #f4f4f4;
767
+   font-size: 15px;
768
+   font-weight: bold;
769
+   color: #595959;
770
+   text-align: left;
771
+   padding: 5px 12px 5px 10px;
772
+   z-index: 10;
773
+}
774
+
775
+.fortooltiptert:hover #deleteoldinfo {
776
+   visibility: visible;
777
+}
778
+
779
+#uploadmmfileinfo {
780
+   display: block;
781
+   position: absolute;
782
+   width: 274px;
783
+   height: 350px;
784
+   overflow-y: scroll;
785
+   visibility: hidden;
786
+   background-color: #fafafa;
787
+   border-radius: 5px;
788
+   margin: -11px 0px 0px -16px;
789
+   scrollbar-width: auto;
790
+   scrollbar-color: #a2a2a2 #ececec;
791
+   box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
792
+   -webkit-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
793
+   -moz-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
794
+   z-index: 10;
795
+}
796
+
797
+#tooltiptextfourth {
798
+   display: block;
799
+   position: relative;
800
+   width: auto;
801
+   height: auto;
802
+   background-color: #f4f4f4;
803
+   font-size: 15px;
804
+   font-weight: bold;
805
+   color: #595959;
806
+   text-align: left;
807
+   padding: 5px 12px 5px 10px;
808
+   z-index: 10;
809
+}
810
+
811
+.fortooltipfourth:hover #uploadmmfileinfo {
812
+   visibility: visible;
813
+}
814
+
815
+.fileupload {
816
+   display: none;
817
+}
818
+
819
+.uploadflbt {
820
+   width: 411px;
821
+}
822
+
823
+#infotipmms {
824
+   display: block;
825
+   position: relative;
826
+   margin: 0px;
827
+   color: #000000;
828
+   font-size: 21px;
829
+   font-weight: bold;
830
+   font-family: 'Liberation Serif', sans-serif;
831
+   font-style: italic;
832
+   z-index: 5;
833
+}
834
+
835
+#mmsfoldersview {
836
+   display: none;
837
+   position: relative;
838
+   width: 100%;
839
+   height: 100%;
840
+   margin-top: -50px;
841
+   background-color: #f4f9ff;
842
+}
843
+
844
+#upmediafiles {
845
+   display: none;
846
+   background: #e8f6ff;
847
+   border-radius: 6px;
848
+   padding: 10px;
849
+   margin: 0px 0px 20px 0px;
850
+}
851
+
852
+.uploadflbt .icon-upload {
853
+   display: inline;
854
+}
855
+
856
+.pfprompt {
857
+   font-size: 16px;
858
+   font-weight: bold;
859
+}
860
+
861
+.fileuploadstl, .filesfromnc {
862
+  display: block;
863
+  font-size: 17px;
864
+  font-weight: bold;
865
+  color: #000000;
866
+}
867
+
868
+#uploadfileformms {
869
+   margin-left: 21px;
870
+   background-color: #ffffff;
871
+   border-radius: 3px !important;
872
+}
873
+
874
+#filestotsize {
875
+  display: none;
876
+  position: relative;
877
+  height: auto;
878
+  padding: 0px 0px 8px 0px;
879
+  font-size: 14.5px;
880
+  font-weight: bold;
881
+  color: #189558;
882
+}
883
+
884
+#filessizetext {
885
+  display: inline;
886
+  position: relative;
887
+  padding-left: 10px;
888
+}
889
+
890
+#fileuploadednm .indivflcls {
891
+  display: inline-block;
892
+  position: relative;
893
+  height:auto;
894
+  max-width: 90%;
895
+  overflow: visible;
896
+  white-space: normal;
897
+  word-break: break-all;
898
+  text-overflow: ellipsis;
899
+  font-size: 17px;
900
+  color: #0e6ba0;
901
+}
902
+
903
+#fileuploadednm .indivflcls:hover {
904
+  cursor: pointer;
905
+  text-decoration: underline;
906
+}
907
+
908
+#fileuploadednm .indupfldl {
909
+  position: relative;
910
+  display: inline-block;
911
+  float: right;
912
+  cursor: pointer;
913
+  width: 20px;
914
+  color: #0e6ba0;
915
+  text-align: center;
916
+  font-size: 17px;
917
+}
918
+
919
+#fileuploadednm .indupfldl:hover {
920
+  background-color: #e8f6ff;
921
+  cursor: pointer;
922
+}
923
+
924
+#filespickednc .indivflpckd {
925
+  display: inline-block;
926
+  position: relative;
927
+  height:auto;
928
+  max-width: 90%;
929
+  overflow: visible;
930
+  white-space: normal;
931
+  word-break: break-all;
932
+  text-overflow: ellipsis;
933
+  color: #0e6ba0;
934
+}
935
+
936
+.indivflpckd:hover {
937
+  cursor: pointer;
938
+  text-decoration: underline;
939
+}
940
+
941
+.indpckfldl {
942
+  position: relative;
943
+  display: inline-block;
944
+  float: right;
945
+  cursor: pointer;
946
+  width: 20px;
947
+  color: #0e6ba0;
948
+  text-align: center;
949
+}
950
+
951
+#filespickednc .indpckfldl:hover {
952
+  background-color: #e8f6ff;
953
+  cursor: pointer;
954
+}
955
+
956
+#pf_upload_msg, #pf_choose_msg {
957
+  display: block;
958
+  color: #181918;
959
+  background-color: #a5e5b3;
960
+  font-weight: bold;
961
+  text-align: center;
962
+  border-radius: 3px;
963
+}
964
+
965
+#choosefilen {
966
+  display: inline;
967
+  position: relative;
968
+  margin: 0px 0px 20px 16px;
969
+  padding-top: 15px;
970
+  background-image: url('../img/nextcloud_logo.svg');
971
+  background-repeat: no-repeat;
972
+  background-size: 110% 125%;
973
+  background-position: center center;
974
+  min-width: 66px;
975
+  min-height: 30px;
976
+  cursor:pointer;
977
+}
978
+
979
+#choosefilen:active {
980
+  background-image: url('../img/nextcloud_logo_bright.svg');
981
+  background-repeat: no-repeat;
982
+  background-size: 110% 125%;
983
+  background-position: center center;
984
+  min-width: 66px;
985
+  min-height: 30px;
986
+}
987
+
988
+#pickFromNext, #uploadFile {
989
+  display: inline-block;
990
+  position: relative;
991
+  font-size: 16px;
992
+  font-weight: bold;
993
+  color: #6d6c6c;
994
+}
995
+
996
+#filespickednc .indivflpckd {
997
+  display: inline-block;
998
+  position: relative;
999
+  height:auto;
1000
+  max-width: 90%;
1001
+  overflow: visible;
1002
+  white-space: normal;
1003
+  word-break: break-all;
1004
+  text-overflow: ellipsis;
1005
+  color: #0e6ba0;
1006
+}
1007
+
1008
+#filespickednc .indpckfldl:hover {
1009
+  background-color: #e8f6ff;
1010
+  cursor: pointer;
1011
+}
1012
+
1013
+.uploadflbt {
1014
+  width: 411px;
1015
+}
1016
+
1017
+.uploadflbt .icon-upload {
1018
+  display: inline;
1019
+}
1020
+
1021
+.uploadfiledv {
1022
+  display: inline-block;
1023
+  position: relative;
1024
+  margin: 16px 0px 22px 0px;
1025
+}
1026
+
1027
+#mmsfileuploadednm .indivflcls {
1028
+  display: inline-block;
1029
+  position: relative;
1030
+  height:auto;
1031
+  max-width: 90%;
1032
+  overflow: visible;
1033
+  white-space: normal;
1034
+  word-break: break-all;
1035
+  text-overflow: ellipsis;
1036
+  font-size: 17px;
1037
+  color: #0e6ba0;
1038
+}
1039
+
1040
+#mmsfileuploadednm .indivflcls:hover {
1041
+  cursor: pointer;
1042
+  text-decoration: underline;
1043
+}
1044
+
1045
+#mmsfileuploadednm .indupfldl {
1046
+  position: relative;
1047
+  display: inline-block;
1048
+  float: right;
1049
+  cursor: pointer;
1050
+  width: 20px;
1051
+  color: #0e6ba0;
1052
+  text-align: center;
1053
+  font-size: 17px;
1054
+}
1055
+
1056
+#mmsfileuploadednm .indupfldl:hover {
1057
+  background-color: #e8f6ff;
1058
+  cursor: pointer;
1059
+}
1060
+
1061
+#filessizetext {
1062
+  display: inline;
1063
+  position: relative;
1064
+  padding-left: 10px;
1065
+}
1066
+
1067
+.srheaderch {
1068
+  display: block;
1069
+  position: relative;
1070
+  margin: 0px 0px 15px 0px;
1071
+  font-size: 16px;
1072
+  font-weight: bold;
1073
+}
1074
+
1075
+.indgenflclsmms, .indgenpckfls {
1076
+  display: block;
1077
+  margin: 10px 6px 0px 6px;
1078
+}
1079
+
1080
+#pickfilesNext {
1081
+  display: block;
1082
+  margin: 20px 0px 0px 0px;
1083
+}
1084
+
1085
+#dirbuttons {
1086
+  margin-top: 20px;
1087
+}
1088
+
1089
+button, input, textarea, div[contenteditable="true"], div[contenteditable="false"] {
1090
+  min-height: 9px;
1091
+}
1092
+
1093
+#choosefilen {
1094
+  display: inline;
1095
+  position: relative;
1096
+  margin: 4px 0px 20px 16px;
1097
+  background-image: url('../img/nextcloud_logo.svg');
1098
+  background-repeat: no-repeat;
1099
+  background-size: 110% 125%;
1100
+  background-position: center center;
1101
+  min-width: 66px;
1102
+  min-height: 30px;
1103
+  cursor:pointer;
1104
+}
1105
+
1106
+#choosefilen:active {
1107
+  background-image: url('../img/nextcloud_logo_bright.svg');
1108
+  background-repeat: no-repeat;
1109
+  background-size: 110% 125%;
1110
+  background-position: center center;
1111
+  min-width: 66px;
1112
+  min-height: 30px;
1113
+}
1114
+
1115
+#pickid, #showsum {
1116
+  display: inline-block;
1117
+  position: relative;
1118
+  font-size: 17px;
1119
+  font-weight: bold;
1120
+  margin: 4px 0px 8px 14px;
1121
+  color: #FFFFFF;
1122
+}
1123
+
1124
+.smsrelentless_checkbox:hover {
1125
+  cursor: pointer;
1126
+}
1127
+
1128
+#smstables {
1129
+  display: block; 
1130
+  position: relative;
1131
+  min-width: 100%;
1132
+  min-height: 100%;
1133
+}
1134
+
1135
+#smsRGreyLogo {
1136
+  display: block;
1137
+  position: relative;
1138
+  background-image: url('../img/sms_relentless_grey.svg');
1139
+  background-repeat: no-repeat;
1140
+  background-position: center center;
1141
+  width: 100%;
1142
+  height: 675px;
1143
+}
1144
+
1145
+#recSmsTable, #sentSmsTable {
1146
+  display: block;
1147
+  position: relative;
1148
+  top: 0px;
1149
+  width: 100%;
1150
+  height: auto;
1151
+  font-size: 14px;
1152
+  z-index: 50;
1153
+  background: #FFFFFF;
1154
+}
1155
+
1156
+.receivedrows, .receivedrowsbody, .sentrows, .sentrowsbody, .groupedmsgrows {
1157
+  border: 1px solid #f3f3f3;
1158
+  padding: 8px;
1159
+}
1160
+
1161
+#groupedSmsTable {
1162
+  display: block;
1163
+  position: relative;
1164
+  top: 0px;
1165
+  width: 100%;
1166
+  height: auto;
1167
+  font-size: 14px;
1168
+  z-index: 50;
1169
+  background: #FFFFFF;
1170
+}
1171
+
1172
+#groupedSmsTable td {
1173
+  text-align: left;
1174
+  vertical-align: top;
1175
+  border: 1px solid #f3f3f3;
1176
+  padding: 5px;
1177
+}
1178
+
1179
+.groupedrowsbody {
1180
+  border: 1px solid #f3f3f3;
1181
+  padding: 8px;
1182
+}
1183
+
1184
+.groupedLstNmbr {
1185
+  overflow: scroll;
1186
+  white-space: nowrap;
1187
+}
1188
+
1189
+.groupedLstNames {
1190
+  overflow: scroll;
1191
+  white-space: nowrap;
1192
+}
1193
+
1194
+.groupedLstMsgs {
1195
+  overflow: scroll;
1196
+  white-space: nowrap;
1197
+}
1198
+
1199
+.groupedSentMsg {
1200
+  display: block;
1201
+  width: 95%;
1202
+  float: right;
1203
+  margin: 6px 6px 6px 0px;
1204
+  padding: 8px 10px;
1205
+  border: 0;
1206
+  border-radius: 10px;
1207
+  background-color: #f2fbff;
1208
+  white-space: normal;
1209
+  word-break: break-word;
1210
+}
1211
+
1212
+.groupedRecMsg {
1213
+  display: block; 
1214
+  width: 95%;
1215
+  float: left;
1216
+  margin: 6px 0px;
1217
+  padding: 8px 10px;
1218
+  border: 0;
1219
+  border-radius: 10px;
1220
+  background-color: #f2fff8;
1221
+  white-space: normal;
1222
+  word-break: break-word;
1223
+}
1224
+
1225
+.fixedRowHeight {
1226
+  max-height: 300px;
1227
+}
1228
+
1229
+.expandGrpRow {
1230
+  display: block;
1231
+  margin:-3px auto 7px auto;
1232
+  cursor: pointer;
1233
+}
1234
+
1235
+.dispNameList {
1236
+  display: block;
1237
+  margin: 2px 0px;
1238
+  font-size: 14.5px;
1239
+  font-weight: 500;
1240
+  color: #0a559e;
1241
+  cursor: pointer;
1242
+}
1243
+
1244
+.dispNameList:hover {
1245
+  color: #1483f0;
1246
+}
1247
+
1248
+.phoneNmbrRow {
1249
+  font-size: 14.5px;
1250
+  font-weight: 500;
1251
+  color: #06866f;
1252
+  cursor: pointer;
1253
+}
1254
+
1255
+.phoneNmbrRow:hover {
1256
+  color: #08b899;
1257
+}
1258
+
1259
+#selectListedNmbrs {
1260
+  display: block;
1261
+  width: 100%;
1262
+}
1263
+
1264
+.sentMssgStatus {
1265
+  display: inline-block;
1266
+  margin: 0px 6px 0px 6.5px;
1267
+}
1268
+
1269
+.saveRestrictions, .saveAutoReply {
1270
+  display: inline-block;
1271
+  border-radius: 8px !important;
1272
+  padding: 0px 14px !important;
1273
+  margin: 0px 0px 0px 10px !important;
1274
+  color: #ffffff !important;
1275
+  background-color: #59d0b4 !important;
1276
+}
1277
+
1278
+.savealwdKeys {
1279
+  display: inline-block;
1280
+  border-radius: 8px !important;
1281
+  padding: 0px 14px !important;
1282
+  margin: 0 !important;
1283
+  color: #ffffff !important;
1284
+  background-color: #59d0b4 !important;
1285
+}
1286
+
1287
+.saveRestrictions:hover, .saveAutoReply:hover, .savealwdKeys:hover {
1288
+  background-color: #40c1a3 !important;
1289
+}
1290
+
1291
+.saveRestrictions:active, .saveAutoReply:active, .savealwdKeys:active {
1292
+  background-color: #3aad92 !important;
1293
+}
1294
+
1295
+#save_admin_settings {
1296
+  display: inline-block;
1297
+  border-radius: 8px !important;
1298
+  padding: 0px 14px !important;
1299
+  color: #ffffff !important;
1300
+  background-color: #1e89c2 !important;
1301
+}
1302
+
1303
+#save_admin_settings:hover {
1304
+  background-color: #0369a0  !important;
1305
+}
1306
+
1307
+#save_admin_settings:active {
1308
+  background-color: #025480  !important;
1309
+}
1310
+
1311
+#phoneNmbrRestr th {
1312
+  font-weight: 500;
1313
+}
1314
+
1315
+#tnxKeysAccessTbl th, #plvKeysAccessTbl th, #twlKeysAccessTbl th, #flrKeysAccessTbl th {
1316
+  font-weight: 500;
1317
+  color: #222222;
1318
+}
1319
+
1320
+.restrAuthor {
1321
+  width: 200px;
1322
+  height: 40px !important;
1323
+}
1324
+
1325
+.restrPhoneNmbr, .arplPhoneNmbr {
1326
+  width: 194px;
1327
+  height: 40px !important;
1328
+}
1329
+
1330
+.restrGroups, .restrUsers {
1331
+  width: 330px;
1332
+  height: 40px !important;
1333
+  border: 1px solid #000;
1334
+  border-radius: 6px;
1335
+  margin: 0px 1px 0px 0px;
1336
+  padding: 0px 4px;
1337
+  overflow: hidden;
1338
+}
1339
+
1340
+.restrGroups:hover, .restrUsers:hover {
1341
+  overflow: auto !important;
1342
+}
1343
+
1344
+.alwdKeysGroups, .alwdKeysUsers {
1345
+  width: 398px;
1346
+  min-height: 80px !important;
1347
+  background-color: #ffffff !important;
1348
+  border: 1px solid #000;
1349
+  border-radius: 6px;
1350
+  margin: 0px 1px 0px 0px;
1351
+  padding: 0px 4px;
1352
+  overflow-y: scroll;
1353
+  white-space: pre-wrap;
1354
+}
1355
+
1356
+.alwdKeysGroups:hover, .alwdKeysUsers:hover {
1357
+  overflow: auto !important;
1358
+}
1359
+
1360
+#addRestrRow, #addArplRow {
1361
+  display: block;
1362
+  margin: 10px 0px 0px 6px;
1363
+  width: 16px;
1364
+  height: 16px;
1365
+  cursor: pointer;
1366
+  border-radius: 2px;
1367
+}
1368
+
1369
+#autoReplyTbl td {
1370
+  text-align: left;
1371
+  vertical-align: top;
1372
+  padding: 0px 0px 10px 0px;
1373
+}
1374
+
1375
+#autoReplyTbl th {
1376
+  font-weight: 500;
1377
+}
1378
+
1379
+.arplAuthor {
1380
+  width: 200px;
1381
+  height: 38px !important;
1382
+}
1383
+
1384
+.arplMode {
1385
+  display: inline-block;
1386
+  width: 330px;
1387
+  height: 184px;
1388
+  border: 1px solid #000;
1389
+  border-radius: 6px;
1390
+  margin: 0px 4px 0px 0px;
1391
+  overflow: visible;
1392
+}
1393
+
1394
+.modeContent .date-picker-x {
1395
+   top: -170px !important;
1396
+   left: -170px !important;
1397
+}
1398
+
1399
+.arplText {
1400
+  display: inline-block;
1401
+  color: #000000;
1402
+  width: 330px;
1403
+  height: 184px;
1404
+  font-size: 15px;
1405
+  text-align: left;
1406
+  border: 1px solid #000;
1407
+  border-radius: 6px;
1408
+  margin: 0px 1px 0px 0px;
1409
+  resize: vertical;
1410
+  white-space: pre-wrap;
1411
+  overflow: auto;
1412
+}
1413
+
1414
+.selectArplMode {
1415
+  display: block;
1416
+  width: 322px;
1417
+  margin: 4px 0px 0px 4px;
1418
+  cursor: pointer;
1419
+  font-weight: 500;
1420
+}
1421
+
1422
+.daysOfWeek {
1423
+  display: block;
1424
+  width: 100%;
1425
+  height: 26px;
1426
+  margin: 3px auto;
1427
+  font-weight: 500;
1428
+  text-align: center;
1429
+}
1430
+
1431
+.daysInWeek {
1432
+  display: block;
1433
+  position: relative;
1434
+  width: 322px;
1435
+  height: auto;
1436
+  margin: 0px 0px 0px 4px !important;
1437
+  text-align: center;
1438
+  border: 1px solid #000;
1439
+  border-radius: 6px;
1440
+}
1441
+
1442
+.chooseTInterval {
1443
+  display: block;
1444
+  width: 100%;
1445
+  height: 26px;
1446
+  margin: 5px auto 0px auto;
1447
+  font-weight: 500;
1448
+  text-align: center;
1449
+}
1450
+
1451
+.selectArplHours {
1452
+  display: block;
1453
+  width: 100%;
1454
+  text-align: center;
1455
+}
1456
+
1457
+.tooltipautoreply {
1458
+  display: inline-block;
1459
+  position: absolute;
1460
+  font-size: 15px;
1461
+  z-index: 9;
1462
+}
1463
+
1464
+.tooltipautoreplyst, .tooltipautoreplypn, .tooltiprestrict {
1465
+  display: inline-block;
1466
+  position: absolute;
1467
+  font-size: 15px;
1468
+  z-index: 7;
1469
+}
1470
+
1471
+#infoautoreply, #infoautoreplyst, #infoautoreplypn, #inforestrict {
1472
+  display: inline-block;
1473
+  position: relative;
1474
+  margin: -2px 0px 0px 10px;
1475
+  color: #000000;
1476
+  font-size: 21px;
1477
+  font-weight: bold;
1478
+  font-family: 'Liberation Serif', sans-serif;
1479
+  font-style: italic;
1480
+  cursor: pointer;
1481
+}
1482
+
1483
+.autorpltooltip, .autorpltooltipst, .autorpltooltippn, .restricttooltext {
1484
+  display: block;
1485
+  position: absolute;
1486
+  visibility: hidden;
1487
+  width: 330px;
1488
+  height: auto;
1489
+  background-color: #fafafa;
1490
+  font-size: 15px;
1491
+  font-weight: bold;
1492
+  white-space: normal;
1493
+  color: #595959;
1494
+  text-align: left;
1495
+  border-radius: 5px;
1496
+  padding: 5px 5px 5px 8px;
1497
+  margin: -4px 0px 0px -150px;
1498
+  box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
1499
+  -webkit-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
1500
+  -moz-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
1501
+}
1502
+
1503
+.tooltipautoreply:hover .autorpltooltip, .tooltipautoreplyst:hover .autorpltooltipst, .tooltipautoreplypn:hover .autorpltooltippn, .tooltiprestrict:hover .restricttooltext  {
1504
+   visibility: visible;
1505
+}
1506
+
1507
+.selectHrMin {
1508
+  font-weight: 500 !important;
1509
+  color: #01446d !important;
1510
+}
1511
+
1512
+.chooseDateIntvl {
1513
+  display: block;
1514
+  width: 100%;
1515
+  height: 32px;
1516
+  margin: 19px auto 4px auto;
1517
+  font-weight: 500;
1518
+  text-align: center;
1519
+}
1520
+
1521
+.arplstrtendDates {
1522
+  display: block;
1523
+  position: absolute;
1524
+  width: 330px;
1525
+  height: auto;
1526
+}
1527
+
1528
+.stdtTitle {
1529
+  display: inline-block;
1530
+  position: absolute;
1531
+  width: 140px;
1532
+  height: 38px;
1533
+  left: 10px;
1534
+  top: 2px;
1535
+  font-weight: 500;
1536
+  text-align: center;
1537
+}
1538
+
1539
+.enddtTitle {
1540
+  display: inline-block;
1541
+  position: absolute;
1542
+  width: 140px;
1543
+  height: 38px;
1544
+  right: 10px;
1545
+  top: 2px;
1546
+  font-weight: 500;
1547
+  text-align: center;
1548
+}
1549
+
1550
+.startDate {
1551
+  display: inline-block;
1552
+  position: absolute;
1553
+  width: 140px;
1554
+  height: 38px;
1555
+  left: 10px;
1556
+  top: 26px;
1557
+  border: 1px solid #3b3b3b;
1558
+  border-radius: 6px;
1559
+  text-align: center;
1560
+  font-weight: 500;
1561
+  color: #01446d !important;
1562
+}
1563
+
1564
+.endDate {
1565
+  display: inline-block;
1566
+  position: absolute;
1567
+  width: 140px;
1568
+  height: 38px;
1569
+  right: 10px;
1570
+  top: 26px;
1571
+  border: 1px solid #3b3b3b;
1572
+  border-radius: 6px;
1573
+  text-align: center;
1574
+  font-weight: 500;
1575
+  color: #01446d !important;
1576
+}
1577
+
1578
+#adminOverlay {
1579
+  display: block;
1580
+  position: absolute;
1581
+  top: 0;
1582
+  left: 0;
1583
+  opacity: 0;
1584
+  z-index: 4990;
1585
+}
1586
+
1587
+.grpsList, .usrsList {
1588
+  display: block;
1589
+  position: absolute;
1590
+  width: 300px;
1591
+  max-height: 400px;
1592
+  z-index: 5000;
1593
+  overflow: auto;
1594
+  background-color: #ffffff;
1595
+}
1596
+
1597
+.groupsList, .usersList {
1598
+  display: block;
1599
+  position: relative;
1600
+  float: left;
1601
+  padding: 6px 4px;
1602
+  width: 300px;
1603
+  height: auto;
1604
+  color: #353535;
1605
+  border-radius: 6px;
1606
+  border: 1px solid #dadada;
1607
+  cursor: pointer;
1608
+}
1609
+
1610
+.groupsList:hover, .usersList:hover {
1611
+  background-color: #f1f1f1;
1612
+}
1613
+
1614
+.selectedGrps, .selectedUsrs {
1615
+  display: inline-block;
1616
+  position: relative;
1617
+  margin: 6px 1px 0px 1px;
1618
+  padding: 0px 6px;
1619
+  color: #353535;
1620
+  background-color: #ffffff;
1621
+  border: 1px solid #dadada;
1622
+  border-radius: 6px;
1623
+  box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
1624
+  -webkit-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
1625
+  -moz-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
1626
+}
1627
+
1628
+.removeGroup, .removeUser {
1629
+  margin: 0px 0px 0px 6px;
1630
+  width: 9px;
1631
+  height: 9px;
1632
+  cursor: pointer;
1633
+}
1634
+
1635
+.showAllGroups, .showAllUsers {
1636
+  max-width: 40px !important;
1637
+  margin: 3px 10px 0px 6px;
1638
+  background-color: #ffffff;
1639
+  border-radius: 6px;
1640
+  padding: 4px 4px 0px 4px;
1641
+  z-index: 5000;
1642
+}
1643
+
1644
+.showAllGroupsak {
1645
+  max-width: 40px !important;
1646
+  margin: 3px 12px 0px 6px;
1647
+  background-color: #F7F7F7;
1648
+  border-radius: 6px;
1649
+  padding: 4px 4px 0px 4px;
1650
+}
1651
+
1652
+.showAllUsersak {
1653
+  max-width: 40px !important;
1654
+  margin: 3px 10px 0px 6px;
1655
+  background-color: #F7F7F7;
1656
+  border-radius: 6px;
1657
+  padding: 4px 4px 0px 4px;
1658
+}
1659
+
1660
+.showByNmbrTitle {
1661
+  display: block;
1662
+  width: 100%;
1663
+  color: #353535;
1664
+  text-align: center;
1665
+  font-size: 16px; 
1666
+  font-weight: 500;
1667
+  margin: 0px auto 5px auto;
1668
+}
1669
+
1670
+#refreshMsgsWrap, #refreshMsgsWraptf {
1671
+  display: block;
1672
+  position: sticky;
1673
+  width: 21px;
1674
+  height: 21px;
1675
+  bottom: 12px;
1676
+  left: 0;
1677
+}
1678
+
1679
+#refreshMsgsConv, #refreshMsgsConvtf {
1680
+  display: inline-block;
1681
+  position: relative;
1682
+  background-image: url("../img/refresh.svg");
1683
+  background-repeat: no-repeat;
1684
+  background-color: transparent !important;
1685
+  width: 21px;
1686
+  height: 21px;
1687
+  opacity: 0.30;
1688
+  border: none;
1689
+  cursor: pointer;
1690
+  z-index: 5300;
1691
+}
1692
+
1693
+#refreshMsgsConv:hover, #refreshMsgsConvtf:hover {
1694
+  opacity: 1;
1695
+}
1696
+
1697
+#stopAutoRefresh, #stopAutoRefreshtf {
1698
+  display: inline-block;
1699
+  width: auto;
1700
+  height: auto;
1701
+  vertical-align: top;
1702
+  border: 1px solid #c6cedb;
1703
+  border-radius: 20px;
1704
+  color: #0a559e;
1705
+  font-size: 12px;
1706
+  padding: 0px 9px;
1707
+  text-align: center;
1708
+  font-weight: 400;
1709
+  cursor: pointer;
1710
+  visibility: hidden;
1711
+}
1712
+
1713
+@media (max-width: 1020px) {
1714
+  #stopAutoRefreshRec, #stopAutoRefreshSent {
1715
+    display: none;
1716
+    position: fixed;
1717
+    left: 86px;
1718
+    top: 50.7px;
1719
+    z-index: 5000;
1720
+  }
1721
+}
1722
+
1723
+@media (min-width: 1021px) {
1724
+  #stopAutoRefreshRec, #stopAutoRefreshSent {
1725
+    display: none;
1726
+    position: fixed;
1727
+    left: 340px;
1728
+    top: 50.7px;
1729
+    z-index: 5000;
1730
+  }
1731
+}
1732
+
1733
+#stopAutoRefreshRecBtn, #stopAutoRefreshSentBtn {
1734
+  display: inline-block;
1735
+  position: relative;
1736
+  width: auto;
1737
+  height: auto;
1738
+  vertical-align: top;
1739
+  border: 1px solid #c6cedb;
1740
+  border-radius: 20px;
1741
+  color: #0a559e;
1742
+  font-size: 12px;
1743
+  padding: 0px 9px;
1744
+  text-align: center;
1745
+  font-weight: 400;
1746
+  cursor: pointer;
1747
+}
1748
+
1749
+#stopAutoRefresh:hover, #stopAutoRefreshtf:hover, #stopAutoRefreshRecBtn:hover, #stopAutoRefreshSentBtn:hover {
1750
+  border: 1px solid #79a2be;
1751
+  box-shadow: 0 0 6px rgba(0, 0, 0, 0.23);
1752
+  -webkit-box-shadow: 0 0 6px rgba(0, 0, 0, 0.23);
1753
+  -moz-box-shadow: 0 0 6px rgba(0, 0, 0, 0.23);
1754
+}
1755
+
1756
+.mmstblUrls {
1757
+  color: #09579b;
1758
+  cursor: pointer;
1759
+}
1760
+
1761
+.mmstblUrls:hover {
1762
+  color: #1479d3;
1763
+}
1764
+
1765
+.marksent {
1766
+  background-color: #F2FBFF !important;
1767
+}
1768
+
1769
+.markreceived {
1770
+  background-color: #F2FFF5 !important;
1771
+}
1772
+
1773
+#sentfiltersrow, #recfiltersrow, #grpfiltersrow {
1774
+  display: none;
1775
+  position: sticky;
1776
+  top: 27px;
1777
+  background: #FFFFFF;
1778
+  box-shadow: 0 6px 7px rgba(0, 0, 0, 0.1);
1779
+  z-index: 1000;
1780
+}
1781
+
1782
+#sentSmsTable th, #recSmsTable th, #groupedSmsTable th {
1783
+  position: sticky;
1784
+  top: 27px;
1785
+  z-index: 999;
1786
+  border: 1px solid #f3f3f3;
1787
+  padding: 7px;
1788
+  background-color: #bfe5f2;
1789
+  font-size: 15px;
1790
+  font-weight: bold;
1791
+  text-align: center;
1792
+}
1793
+
1794
+#sentSmsTable td, #recSmsTable td {
1795
+  border: 1px solid #f3f3f3;
1796
+  padding: 5px;
1797
+  white-space: normal;
1798
+}
1799
+
1800
+.datecolsent {
1801
+  text-align: center;
1802
+}
1803
+
1804
+.sentdbidcolumn {
1805
+  text-align: center;
1806
+}
1807
+
1808
+.dbidcolumnrec {
1809
+  width: 50px;
1810
+  text-align: center;
1811
+}
1812
+
1813
+.messagecolumnsent {
1814
+  background: #fffff2;
1815
+  text-align: left;
1816
+  font-weight: 500;
1817
+  width: 250px;
1818
+  word-break: break-word;
1819
+}
1820
+
1821
+.messagecolumnrec {
1822
+  background: #fffff2;
1823
+  text-align: left;
1824
+  font-weight: 500;
1825
+  width: 526px;
1826
+  word-break: break-word;
1827
+}
1828
+
1829
+.messageAuthorName {
1830
+  border: 0px;
1831
+  border-radius: 20px;
1832
+  padding: 4px 10px;
1833
+  margin: 0px 4px 0px 0px;
1834
+  color: #414141;
1835
+  background-color: #eff9ff;
1836
+}
1837
+
1838
+.msgAuthorNameGrp {
1839
+  border: 0px;
1840
+  border-radius: 20px;
1841
+  padding: 3px 8px;
1842
+  margin: 0px 4px 0px 0px;
1843
+  color: #616161;
1844
+  background-color: #e8edff !important;
1845
+}
1846
+
1847
+.addNameToPhNb {
1848
+  cursor: pointer;
1849
+  border-radius: 20px;
1850
+}
1851
+
1852
+.listToFromMsgs {
1853
+  display: block;
1854
+  margin: 0 auto;
1855
+  width: 30px;
1856
+  text-align: center;
1857
+  cursor: pointer;
1858
+}
1859
+
1860
+.lstMsgConv {
1861
+  display: block;
1862
+  position: relative;
1863
+  width: 30px;
1864
+  height: auto;
1865
+  text-align: center;
1866
+  margin: 4px auto 0 auto;
1867
+}
1868
+
1869
+.lstMsgConvImg {
1870
+  cursor: pointer;
1871
+  height: auto;
1872
+}
1873
+
1874
+.lstMsgToFromImg {
1875
+  cursor: pointer;
1876
+  height: auto;
1877
+}
1878
+
1879
+.lstMsgToFromImg:hover, .lstMsgConvImg:hover {
1880
+   box-shadow: 0 0 7px rgba(0, 0, 0, 0.25);
1881
+   -webkit-box-shadow: 0 0 7px rgba(0, 0, 0, 0.25);
1882
+   -moz-box-shadow: 0 0 7px rgba(0, 0, 0, 0.25);
1883
+}
1884
+
1885
+.lstMsgToFromImg:active, .lstMsgConvImg:hover {
1886
+   box-shadow: 0 0 9px rgba(0, 0, 0, 0.25);
1887
+   -webkit-box-shadow: 0 0 9px rgba(0, 0, 0, 0.25);
1888
+   -moz-box-shadow: 0 0 9px rgba(0, 0, 0, 0.25);
1889
+}
1890
+
1891
+
1892
+#loadMoreMsgs, #loadMoreMsgsusr {
1893
+  display: none;
1894
+  width: 180px;
1895
+  height: auto;
1896
+  margin: 1px auto 2px auto;
1897
+  padding: 0px 0px 2px 0px;
1898
+  border: 1px solid #b8d4e6;
1899
+  border-radius: 20px;
1900
+  color: #6c91b2;
1901
+  line-height: normal;
1902
+  text-align: center;
1903
+  font-size: 15px;
1904
+  font-weight: 500;
1905
+  cursor: pointer;
1906
+}
1907
+
1908
+#loadMoreMsgs:hover, #loadMoreMsgsusr:hover {
1909
+  color: #3a6c9a;
1910
+  border: 1px solid #95bad3;
1911
+}
1912
+
1913
+#loadMoreMsgs:active, #loadMoreMsgsusr:active {
1914
+  box-shadow: 0 0 6px rgba(0, 0, 0, 0.23);
1915
+  -webkit-box-shadow: 0 0 6px rgba(0, 0, 0, 0.23);
1916
+  -moz-box-shadow: 0 0 6px rgba(0, 0, 0, 0.23);
1917
+  border: 1px solid #79a2be;
1918
+}
1919
+
1920
+.addNameToPhNb:hover {
1921
+  box-shadow: 0 0 8px rgba(0, 0, 0, 0.23);
1922
+  -webkit-box-shadow: 0 0 8px rgba(0, 0, 0, 0.23);
1923
+  -moz-box-shadow: 0 0 8px rgba(0, 0, 0, 0.23);
1924
+}
1925
+
1926
+.addNameToPhNb:active {
1927
+  box-shadow: 0 0 12px rgba(0, 0, 0, 0.33);
1928
+  -webkit-box-shadow: 0 0 12px rgba(0, 0, 0, 0.33);
1929
+  -moz-box-shadow: 0 0 12px rgba(0, 0, 0, 0.33);
1930
+}
1931
+
1932
+#recTblOverlay, #alertMsgOverlay {
1933
+  display: block;
1934
+  position: absolute;
1935
+  top: 0;
1936
+  left: 0;
1937
+  width: 100%;
1938
+  height: 100%;
1939
+  background-color: #000000;
1940
+  opacity: 0.09;
1941
+  z-index: 5050;
1942
+}
1943
+
1944
+#disNameWindow, #alertMessage, #alertConfMessage {
1945
+  display: block;
1946
+  position: absolute;
1947
+  width: 338px;
1948
+  height: auto;
1949
+  white-space: pre-wrap;
1950
+  border-radius: 6px;
1951
+  background-color: #ffffff;
1952
+  box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
1953
+   -webkit-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
1954
+   -moz-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
1955
+  z-index: 5100;
1956
+}
1957
+
1958
+#alertTextWrap {
1959
+  display: block;
1960
+  text-align: left;
1961
+  font-size: 16px;
1962
+  margin: 30px 22px 16px 22px;
1963
+  color: #353535;
1964
+  white-space: pre-wrap;
1965
+  word-break: break-word;
1966
+}
1967
+
1968
+#closeDisNmWindow {
1969
+  display: block;
1970
+  position: absolute;
1971
+  width: 12px;
1972
+  height: 12px;
1973
+  right: 8px;
1974
+  top: 10px;
1975
+  padding: 0;
1976
+  background-image: url('../img/closewnd.svg');
1977
+  background-repeat: no-repeat;
1978
+  background-position: center center;
1979
+  cursor: pointer;
1980
+}
1981
+
1982
+#closeFrmMsgWindow, #closeAlertWnd, #closeAlertWndcf {
1983
+  display: block;
1984
+  position: absolute;
1985
+  width: 12px;
1986
+  height: 12px;
1987
+  right: 8px;
1988
+  top: 10px;
1989
+  padding: 0;
1990
+  background-image: url('../img/closewnd.svg');
1991
+  background-repeat: no-repeat;
1992
+  background-position: center center;
1993
+  cursor: pointer;
1994
+}
1995
+
1996
+#sendMsgConvBtn {
1997
+  display: flex;
1998
+  width: 200px;
1999
+  height: 20px;
2000
+  padding: 0;
2001
+  margin: -2px auto 0 auto;
2002
+  color: #ffffff;
2003
+  background: #40c1a3;
2004
+  border: 1px solid #40c1a3;
2005
+  border-radius: 20px;
2006
+  text-align: center;
2007
+  font-weight: 500;
2008
+  cursor: pointer;
2009
+  line-height: normal;
2010
+  justify-content: center;
2011
+  align-items: end;
2012
+}
2013
+
2014
+#sendMsgConvBtn:hover {
2015
+  background-color:  #3bb397 !important;
2016
+  box-shadow: 0 0 6px rgba(0, 0, 0, 0.23);
2017
+  -webkit-box-shadow: 0 0 6px rgba(0, 0, 0, 0.23);
2018
+  -moz-box-shadow: 0 0 6px rgba(0, 0, 0, 0.23);
2019
+}
2020
+
2021
+#sendMsgConvBtn:active {
2022
+  background-color: #33a087 !important;
2023
+  box-shadow: 0 0 6px rgba(0, 0, 0, 0.23);
2024
+  -webkit-box-shadow: 0 0 6px rgba(0, 0, 0, 0.23);
2025
+  -moz-box-shadow: 0 0 6px rgba(0, 0, 0, 0.23);
2026
+}
2027
+
2028
+#saveDispName, #alertOk {
2029
+  display: block;
2030
+  border-radius: 20px !important;
2031
+  padding: 0px 14px !important;
2032
+  margin: 10px auto !important;
2033
+  min-height: 30px !important;
2034
+  height: 30px !important;
2035
+  color: #ffffff !important;
2036
+  background-color: #40c1a3 !important;
2037
+}
2038
+
2039
+#cancelOkWrap {
2040
+  display: block;
2041
+  width: 100%; 
2042
+  margin: 10px auto !important;
2043
+  text-align: center;
2044
+}
2045
+
2046
+#confirmOk, #confirmCancel {
2047
+  display: inline-block;
2048
+  min-width: 76px;
2049
+  border-radius: 20px !important;
2050
+  padding: 0px 14px !important;
2051
+  margin: 0 5px;
2052
+  min-height: 30px !important;
2053
+  height: 30px !important;
2054
+  color: #ffffff !important;
2055
+  background-color: #40c1a3 !important;
2056
+}
2057
+
2058
+#saveDispName:hover, #alertOk:hover, #confirmOk:hover, #confirmCancel:hover {
2059
+  background-color:  #3bb397 !important;
2060
+}
2061
+
2062
+#saveDispName:active, #alertOk:active, #confirmOk:active, #confirmCancel:active {
2063
+  background-color: #33a087 !important;
2064
+}
2065
+
2066
+#sendMsgReply {
2067
+  display: none;
2068
+}
2069
+
2070
+#sendMsgConv {
2071
+  display: block;
2072
+  width: 558px;
2073
+  height: auto;
2074
+  margin: 0 auto;
2075
+  border: none;
2076
+}
2077
+
2078
+#sendMsgConv td {
2079
+  background-color: #ffffff;
2080
+  border: none;
2081
+}
2082
+
2083
+#sendMsgConvText {
2084
+  display: inline-block;
2085
+  width: 558px;
2086
+  height: 72px;
2087
+  padding: 3px 5px;
2088
+  color: #000000;
2089
+  text-align: left;
2090
+  font-size: 16px;
2091
+  border-radius: 6px;
2092
+  resize: none;
2093
+  white-space: pre-wrap;
2094
+  border: 1px solid #dedede;
2095
+  background-color: #ffffff;
2096
+  overflow-y: auto;
2097
+}
2098
+
2099
+#fromPhoneNmbrConv {
2100
+  display: inline-block;
2101
+  width: 50%;
2102
+  height: auto;
2103
+  margin: 6px 0px 2px 10px;
2104
+  font-weight: 500;
2105
+  color: #222222;
2106
+}
2107
+
2108
+#toPhoneNmbrConv {
2109
+  display: inline-block;
2110
+  width: 50%;
2111
+  height: auto;
2112
+  margin: 6px 0px 2px -20px;
2113
+  font-weight: 500;
2114
+  color: #222222;
2115
+  text-align: right;
2116
+}
2117
+
2118
+#selectFromNbConv {
2119
+  height: 26px;
2120
+  width: auto;
2121
+  margin: 0;
2122
+  text-align: left;
2123
+  color: #222222;
2124
+  background-color: #ffffff !important;
2125
+  border: 1px solid #d8d8d8;
2126
+}
2127
+
2128
+#listAllMsgsFromTo {
2129
+  display: block;
2130
+  position: absolute;
2131
+  width: 600px;
2132
+  height: 490px;
2133
+  white-space: pre-wrap;
2134
+  border-radius: 6px;
2135
+  background-color: #ffffff;
2136
+  box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
2137
+  -webkit-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
2138
+  -moz-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
2139
+  z-index: 5100;
2140
+}
2141
+
2142
+#listAllMsgsConv {
2143
+  display: block;
2144
+  position: absolute;
2145
+  width: 600px;
2146
+  height: 490px;
2147
+  white-space: pre-wrap;
2148
+  border-radius: 6px;
2149
+  background-color: #ffffff;
2150
+  box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
2151
+  -webkit-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
2152
+  -moz-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23);
2153
+  z-index: 5100;
2154
+}
2155
+
2156
+#expandWindowRpl {
2157
+  display: block;
2158
+  margin: 4px auto 0 auto;
2159
+  cursor: pointer;
2160
+}
2161
+
2162
+#dragDispNmWindow {
2163
+  display: block;
2164
+  position: relative;
2165
+  width: 40px;
2166
+  height: 20px;
2167
+  margin:-3px auto 0px auto;
2168
+  cursor: grab;
2169
+  text-align: center;
2170
+}
2171
+
2172
+#draglstMsgmWindow {
2173
+  display: block;
2174
+  position: relative;
2175
+  width: 500px;
2176
+  height: 20px;
2177
+  margin:-3px auto 0px auto;
2178
+  cursor: grab;
2179
+  text-align: center;
2180
+}
2181
+
2182
+#draglstMsgmWindowsc {
2183
+  display: block;
2184
+  position: absolute;
2185
+  width: 100%;
2186
+  height: 14px;
2187
+  bottom: 3px;
2188
+  cursor: grab;
2189
+  text-align: center;
2190
+}
2191
+
2192
+#frmMsgLstWrap {
2193
+  display: block;
2194
+  position: relative;
2195
+  width: 560px;
2196
+  height: 400px;
2197
+  margin: 0 auto;
2198
+  overflow-y: auto;
2199
+  overflow-x: hidden;
2200
+}
2201
+
2202
+#frmMsgLstTbl {
2203
+  display: block;
2204
+  position: relative;
2205
+  width: 100%;
2206
+  height: 100%;
2207
+}
2208
+
2209
+#frmMsgLstTbl td {
2210
+  text-align: left;
2211
+  vertical-align: top;
2212
+  background-color: #ffffff !important;
2213
+}
2214
+
2215
+.groupedLstNamespn {
2216
+  display: block;
2217
+  position: fixed;
2218
+  width: 130px;
2219
+  height: auto;
2220
+  padding: 0px 0px 0px 4px;
2221
+  overflow-y: auto;
2222
+  white-space: pre-wrap;
2223
+}
2224
+
2225
+#msgListRowCell {
2226
+  display: block;
2227
+  width: 428px;
2228
+  height: auto;
2229
+  min-height: 358px;
2230
+  margin: 0px 0px 0px 130px;
2231
+  padding: 0px 0px 0px 4px;
2232
+  overflow: scroll;
2233
+  white-space: nowrap;
2234
+}
2235
+
2236
+.dispNameListAll {
2237
+  display: block;
2238
+  width: 100%;
2239
+  height: auto;
2240
+  border: 1px solid #c6cedb;
2241
+  border-radius: 20px;
2242
+  margin: 6px 0px 0px 0px;
2243
+  color: #04957b;
2244
+  font-size: 13px;
2245
+  padding: 0px 9px;
2246
+  text-align: center;
2247
+  font-weight: 500;
2248
+  cursor: pointer;
2249
+}
2250
+
2251
+#selectAllChckbx:hover {
2252
+  cursor: pointer;
2253
+}
2254
+
2255
+.indivchckbx:hover {
2256
+  cursor: pointer;
2257
+}
2258
+
2259
+.selectsmsdv {
2260
+  width: 30px;
2261
+  padding: 5px 5px 5px 7px;
2262
+  text-align: center;
2263
+}
2264
+
2265
+#selectalldv {
2266
+  width: 30px;
2267
+  padding: 5px 5px 5px 7px;
2268
+}
2269
+
2270
+.indivfilter {
2271
+  height: 30px;
2272
+  font-weight: bold;
2273
+  padding: 0px;
2274
+}
2275
+
2276
+.selectalldvfilter {
2277
+  border: 1px solid #f3f3f3;
2278
+  padding: 3px;
2279
+  margin: 0px; 
2280
+}
2281
+
2282
+.filterbuttonsrec, .filterbuttonsent {
2283
+  display: block;
2284
+  position: relative;
2285
+  margin: 5px auto !important;
2286
+  border-radius: 3px !important;
2287
+  background-color: #ffffff !important;
2288
+  background-image: url('../img/filter_icon.svg');
2289
+  background-repeat: no-repeat;
2290
+  background-position: center center;
2291
+  cursor: pointer;
2292
+}
2293
+
2294
+#clearrecfilters, #clearsentfilters, #cleargrpfilter {
2295
+  display: inline-block;
2296
+  width: 22px;
2297
+  height: 22px;
2298
+  background-color: #ffffff;
2299
+  background-image: url('../img/clearfilters.svg');
2300
+  background-repeat: no-repeat;
2301
+  background-position: center center;
2302
+  margin: 0px 0px 8px 0px;
2303
+  border: none;
2304
+  cursor: pointer;
2305
+}
2306
+
2307
+#deleterecrows, #deletesentrows {
2308
+  display: inline-block;
2309
+  width: 16px;
2310
+  height: 20px;
2311
+  background-color: #ffffff;
2312
+  background-image: url('../img/garbage.svg');
2313
+  background-repeat: no-repeat;
2314
+  background-position: center center;
2315
+  margin: 0px 0px 4px 0px;
2316
+  border: none;
2317
+  cursor: pointer;
2318
+}
2319
+
2320
+#deleterecrows:active, #deletesentrows:active {
2321
+  background-image: url('../img/garbage_bright.svg');
2322
+}
2323
+
2324
+#toptablerec, #toptablesent, #toptablegrp {
2325
+  display: block;
2326
+  position: sticky;
2327
+  top: 0px;
2328
+  height: 27px;
2329
+  width: 100%;
2330
+  z-index: 1001;
2331
+}
2332
+
2333
+.topbuttonandpage {
2334
+  display: block;
2335
+  position: relative;
2336
+  width: 100%;
2337
+  height: 27px;
2338
+  border-radius: 0px 24px 0px 0px;
2339
+  background: #FFFFFF;
2340
+  z-index: 1001;
2341
+}
2342
+
2343
+#paginationrec, #paginationsent, #paginationgrp {
2344
+   display: block;
2345
+   position: relative;
2346
+   float: right;
2347
+   width: auto;
2348
+   margin: -25px 14px 0px 0px;
2349
+   font-size: 16px;
2350
+   font-weight: bold;
2351
+   color: #0082C9;
2352
+   z-index: 1002;
2353
+}
2354
+
2355
+.arrowDownCl {
2356
+   background-image: url('../img/arrowDown.svg');
2357
+   background-repeat: no-repeat;
2358
+   background-position: center center;
2359
+   z-index: 1010;
2360
+}
2361
+
2362
+.arrowUpCl {
2363
+   background-image: url('../img/arrowUp.svg');
2364
+   background-repeat: no-repeat;
2365
+   background-position: center center;
2366
+   z-index: 1010;   
2367
+}
2368
+
2369
+@media (max-width: 1020px) {
2370
+  #recarrow, #sentarrow {
2371
+    display: block;
2372
+    position: relative;
2373
+    float: left;
2374
+    margin: 3.8px 0px 0px 50px;
2375
+    width: 17px;
2376
+    height: 17px;
2377
+    border: none;
2378
+    cursor: pointer;
2379
+  }
2380
+}
2381
+
2382
+@media (min-width: 1021px) {
2383
+  #recarrow, #sentarrow {
2384
+    display: block;
2385
+    position: relative;
2386
+    float: left;
2387
+    margin: 3.8px 0px 0px 7px;
2388
+    width: 17px;
2389
+    height: 17px;
2390
+    border: none;
2391
+    cursor: pointer;
2392
+  }
2393
+}
2394
+
2395
+#totalrecmessages, #totalsentmessages, #totalgrpmessages {
2396
+  display: block;
2397
+  position: relative;
2398
+  padding: 10px 0px 0px 7px;
2399
+  font-size: 14px;
2400
+  font-weight: bold;
2401
+  color: #4cbc86;
2402
+}
2403
+
2404
+.pagenumbers, .pagenumbersbottom, .pagenumbersrec, .pagenumbersbottomrec, .pagenumbersgrp {
2405
+  color: #0082C9;
2406
+}
2407
+
2408
+#dbidtextsent {
2409
+  display: block;
2410
+  margin: auto;
2411
+  width: 95%;
2412
+}
2413
+
2414
+#dbidtextrec {
2415
+  display: block;
2416
+  margin: auto;
2417
+  width: 95%;
2418
+}
2419
+
2420
+#useridtext {
2421
+  display: block;
2422
+  margin: auto;
2423
+  width: 95%;
2424
+}
2425
+
2426
+#useridtextrec {
2427
+  display: block;
2428
+  margin: auto;
2429
+  width: 95%;
2430
+}
2431
+
2432
+#messageidtext {
2433
+  display: block;
2434
+  margin: auto;
2435
+  width: 95%;
2436
+}
2437
+
2438
+#messageidtextrec {
2439
+  display: block;
2440
+  margin: auto;
2441
+  width: 95%;
2442
+}
2443
+
2444
+#datetext {
2445
+  display: block;
2446
+  margin: auto;
2447
+  width: 95px;
2448
+}
2449
+
2450
+#datetextrec {
2451
+  display: block;
2452
+  margin: auto;
2453
+  width: 95%;
2454
+}
2455
+
2456
+#fromtext {
2457
+  display: block;
2458
+  margin: auto;
2459
+  width: 95%;
2460
+}
2461
+
2462
+#fromtextrec {
2463
+  display: block;
2464
+  margin: auto;
2465
+  width: 95%;
2466
+}
2467
+
2468
+#totext {
2469
+  display: block;
2470
+  margin: auto;
2471
+  width: 95%;
2472
+}
2473
+
2474
+#totextrec {
2475
+  display: block;
2476
+  margin: auto;
2477
+  width: 95%;
2478
+}
2479
+
2480
+#networktext {
2481
+  display: block;
2482
+  margin: auto;
2483
+  width: 95%;
2484
+}
2485
+
2486
+#pricetext {
2487
+  display: block;
2488
+  margin: auto;
2489
+  width: 95%;
2490
+}
2491
+
2492
+#statustext {
2493
+  display: block;
2494
+  margin: auto;
2495
+  width: 95%;
2496
+}
2497
+
2498
+#deliveryrcpttext {
2499
+  display: block;
2500
+  margin: auto;
2501
+  width: 95%;
2502
+}
2503
+
2504
+#messagetext {
2505
+  display: block;
2506
+  margin: auto;
2507
+  width: 95%;
2508
+}
2509
+
2510
+#messagetextrec {
2511
+  display: block;
2512
+  margin: auto;
2513
+  width: 95%;
2514
+}
2515
+
2516
+#databaseidfilter {
2517
+  display: block;
2518
+  margin-left: auto;
2519
+  margin-right: auto;
2520
+}
2521
+
2522
+#sentstatuscolumn {
2523
+  max-width: 160px;
2524
+}
2525
+
2526
+.useridcolrec {
2527
+  width: 124px;
2528
+  background-color: #ffffff;
2529
+  text-align: center;
2530
+}
2531
+
2532
+.messageidcolsent {
2533
+  overflow: visible;
2534
+  word-break: break-all;
2535
+  text-align: center;
2536
+}
2537
+
2538
+.messageidcolrec {
2539
+  overflow: visible;
2540
+  word-break: break-all;
2541
+  width: 420px;
2542
+  text-align: center;
2543
+}
2544
+
2545
+.datecolrec {
2546
+  width: 160px;
2547
+  text-align: center;
2548
+}
2549
+
2550
+.fromcolumnrec {
2551
+  width: 140px;
2552
+  text-align: center;
2553
+  background-color: #f2fff5;
2554
+}
2555
+
2556
+.tocolrec {
2557
+  width: 140px;
2558
+  background-color: #f2fbff;
2559
+  text-align: center;
2560
+}
2561
+
2562
+.networkcolumnsent {
2563
+  max-width: 90px;
2564
+  background-color: #ffffff;
2565
+  word-break: break-word;
2566
+  text-align: center;
2567
+}
2568
+
2569
+.useridcolsent, .pricecolumnsent, .statuscolumnsent, .deliveryrcptcolsent {
2570
+  background-color: #ffffff;
2571
+  text-align: center;
2572
+}
2573
+
2574
+.tocolumnsent {
2575
+  background-color: #f2fbff;
2576
+  text-align: center;
2577
+}
2578
+
2579
+.fromcolumnsent {
2580
+  background-color: #f2fff5;
2581
+  text-align: center;
2582
+}
2583
+
2584
+.active {
2585
+  color: #c62b71;
2586
+}
2587
+
2588
+#deleteoldmssgs {
2589
+  display: inline-block;
2590
+  position: relative;
2591
+  margin: 10px 0px 10px 1px;
2592
+  font-size: 16px;
2593
+  font-weight: bold;
2594
+}
2595
+
2596
+#deleteoldsms {
2597
+  display: none;
2598
+  background: #e8f6ff;
2599
+  border-radius: 6px;
2600
+  padding: 5px;
2601
+}
2602
+
2603
+#delOldrecSMS, #delOldsentSMS {
2604
+  display: block;
2605
+  background-color: #0082C9;
2606
+  color: #ffffff;
2607
+  margin: 10px 0px 10px 5px;
2608
+  border-radius: 20px;  
2609
+}
2610
+
2611
+#delOldrecSMS:active, #delOldsentSMS:active {
2612
+  background: #00a2f9;
2613
+}
2614
+
2615
+#delsetrows {
2616
+  display: block;
2617
+  padding: 5px;
2618
+}
2619
+
2620
+.deletesmsolder {
2621
+  display: inline;
2622
+  font-size: 16px;
2623
+  font-weight: bold;
2624
+}
2625
+
2626
+#oldrecSmsInterval, #oldsentSmsInterval {
2627
+  display: inline;
2628
+  width: 60px;
2629
+  height: 25px;
2630
+  padding: 0px 0px 0px 10px;
2631
+  font-size: 14px;
2632
+  font-weight: bold;
2633
+  border-radius: 20px;
2634
+}
2635
+
2636
+#upArrow {
2637
+  background-image: url("../img/arrow-top.svg");
2638
+  background-repeat: no-repeat;
2639
+  background-color: transparent !important;
2640
+  opacity: 0.30;
2641
+  position: fixed;
2642
+  bottom: 40px;
2643
+  right: 4px;
2644
+  width: 50px;
2645
+  height: 50px;
2646
+  border: none;
2647
+  cursor: pointer;
2648
+  display: none;
2649
+  z-index: 1010;
2650
+}
2651
+
2652
+#upArrow:hover {
2653
+  opacity: 1;
2654
+}
2655
+
2656
+#arrowupWrap {
2657
+  display: block;
2658
+  position: sticky;
2659
+  width: 21px;
2660
+  height: 21px;
2661
+  bottom: 12px;
2662
+  left: 530px;
2663
+}
2664
+
2665
+#upArrowSmall {
2666
+  position: relative;
2667
+  background-image: url("../img/arrow-top-small.svg");
2668
+  background-repeat: no-repeat;
2669
+  background-color: transparent !important;
2670
+  width: 21px;
2671
+  height: 21px;
2672
+  opacity: 0.30;
2673
+  border: none;
2674
+  cursor: pointer;
2675
+  display: none;
2676
+  z-index: 5300;
2677
+}
2678
+
2679
+#upArrowSmall:hover {
2680
+  opacity: 1;
2681
+}
2682
+
2683
+.opensmsfolder {
2684
+  display: block;
2685
+  position: relative;
2686
+  margin: 10px 0px 10px 0px !important;
2687
+  padding: 7px 0px 7px 0px;
2688
+  width: 100% !important;
2689
+  color: #FFFFFF !important;
2690
+  font-size: 15px !important;
2691
+  background-color: #CB99C5 !important;
2692
+}
2693
+
2694
+.opensmsfolder:hover {
2695
+  border: 2px;
2696
+  background-color: #c18bba !important;
2697
+}
2698
+
2699
+.opensmsfolder:active {
2700
+  background-color: #b777af !important;
2701
+  border: 2px;
2702
+  color: #FFFFFF !important;
2703
+  border-color: #b777af;
2704
+}
2705
+
2706
+.opensmsfolder:focus {
2707
+  background-color: #a3669b !important;
2708
+  border: 2px;
2709
+  border-color: #a3669b;
2710
+}
2711
+
2712
+#save_sms_settings {
2713
+  display: inline-block;
2714
+  border-radius: 8px !important;
2715
+  padding: 0px 14px !important;
2716
+  color: #ffffff !important;
2717
+  background-color: #1e89c2 !important;
2718
+}
2719
+
2720
+#save_sms_settings:hover {
2721
+  background-color: #0369a0 !important;
2722
+}
2723
+
2724
+#save_sms_settings:active {
2725
+  background-color: #025480 !important;
2726
+}
2727
+
2728
+#conversationsTable {
2729
+  display: block;
2730
+  position: relative;
2731
+  top: 0;
2732
+  bottom: 0;
2733
+  width: 100%;
2734
+  height: 100%;
2735
+  font-size: 14px;
2736
+  z-index: 50;
2737
+  background-color: #ffffff;
2738
+}
2739
+
2740
+#conversationsTable td {
2741
+  text-align: left;
2742
+  vertical-align: top;
2743
+  border: 1px solid #f3f3f3;
2744
+  padding: 2px;
2745
+}
2746
+
2747
+#conversationsTable tr:hover {
2748
+  background-color: #ffffff;
2749
+}
2750
+/*
2751
+#convArchAndActive {
2752
+  position: relative;
2753
+  top: 0;
2754
+  margin-top: 0;
2755
+}
2756
+
2757
+#conversationsText {
2758
+  position: relative;
2759
+  top: 0;
2760
+  margin-top: 0;
2761
+}
2762
+*/
2763
+
2764
+/* Timer for page auto-refresh */
2765
+#refreshTimerRec, #refreshTimerSent {
2766
+  display: none;
2767
+  margin: 1.5px 0px 0px 6px;
2768
+}
2769
+
2770
+.arftimer {
2771
+  background: -webkit-linear-gradient(left, #3c76bd 50%, #eee 50%);
2772
+  border-radius: 100%;
2773
+  height: calc(var(--size) * 1px);
2774
+  width: calc(var(--size) * 1px);
2775
+  position: relative;
2776
+  -webkit-animation: time calc(var(--duration) * 1s) steps(1000, start) infinite;
2777
+  -webkit-mask: radial-gradient(transparent 50%,#000 50%);
2778
+  mask: radial-gradient(transparent 50%,#000 50%);
2779
+}
2780
+.arfmask {
2781
+  border-radius: 100% 0 0 100% / 50% 0 0 50%;
2782
+  height: 100%;
2783
+  left: 0;
2784
+  position: absolute;
2785
+  top: 0;
2786
+  width: 50%;
2787
+  -webkit-animation: mask calc(var(--duration) * 1s) steps(500, start) infinite;
2788
+  -webkit-transform-origin: 100% 50%;
2789
+}
2790
+@-webkit-keyframes time {
2791
+  100% {
2792
+      -webkit-transform: rotate(360deg);
2793
+  }
2794
+}
2795
+@-webkit-keyframes mask {
2796
+  0% {
2797
+      background: #eee;
2798
+      -webkit-transform: rotate(0deg);
2799
+  }
2800
+  50% {
2801
+      background: #eee;
2802
+      -webkit-transform: rotate(-180deg);
2803
+  }
2804
+  50.01% {
2805
+      background: #3c76bd;
2806
+      -webkit-transform: rotate(0deg);
2807
+  }
2808
+  100% {
2809
+      background: #3c76bd;
2810
+      -webkit-transform: rotate(-180deg);
2811
+  }
2812
+}
2813
+
2814
+/* Changes for dark themes */
2815
+[data-theme-dark] .srheader,
2816
+[data-theme-dark-highcontrast] .srheader {
2817
+  display: block;
2818
+  position: relative;
2819
+  margin: 0px 0px 7px 0px;
2820
+  color: #fafafa;
2821
+  font-size: 17px;
2822
+  font-weight: bold;
2823
+}
2824
+
2825
+[data-theme-dark] #sendtomultiple,
2826
+[data-theme-dark-highcontrast] #sendtomultiple {
2827
+  display: inline-block;
2828
+  position: relative;
2829
+  margin: 10px 0px 12px 0px;
2830
+  color: #fafafa;
2831
+  font-size: 16px;
2832
+  font-weight: bold;
2833
+}
2834
+
2835
+[data-theme-dark] #entermessage,
2836
+[data-theme-dark-highcontrast] #entermessage {
2837
+  display: block;
2838
+  position: relative;
2839
+  margin: 10px 0px 0px 0px;
2840
+  color: #fafafa;
2841
+  font-size: 16px;
2842
+  font-weight: bold;
2843
+}
2844
+
2845
+[data-theme-dark] #sendmediafl,
2846
+[data-theme-dark-highcontrast] #sendmediafl {
2847
+  display: block;
2848
+  position: relative;
2849
+  margin: 0px 0px 20px 0px;
2850
+  color: #fafafa;
2851
+  font-size: 16px;
2852
+  font-weight: bold;
2853
+}
2854
+
2855
+[data-theme-dark] #deleteoldmssgs,
2856
+[data-theme-dark-highcontrast] #deleteoldmssgs {
2857
+  display: inline-block;
2858
+  position: relative;
2859
+  margin: 10px 0px 10px 1px;
2860
+  color: #fafafa;
2861
+  font-size: 16px;
2862
+  font-weight: bold;
2863
+}
2864
+
2865
+[data-theme-dark] #smsto,
2866
+[data-theme-dark-highcontrast] #smsto {
2867
+  display: block;
2868
+  width: 99%;
2869
+  max-height: 32px;
2870
+  padding: 0px 15px 0px 15px;
2871
+  color: #fafafa;
2872
+  font-size: 16px;
2873
+  font-weight: bold;
2874
+  border-radius: 20px;
2875
+}
2876
+
2877
+[data-theme-dark] #smstext,
2878
+[data-theme-dark-highcontrast] #smstext {
2879
+  display: inline-block;
2880
+  color: #ffffff;
2881
+  width: 100%;
2882
+  height: 130px;
2883
+  text-align: left;
2884
+  font-size: 16px;
2885
+  border-radius: 6px;
2886
+  resize: vertical;
2887
+  white-space: pre-wrap;
2888
+}
2889
+
2890
+
2891
+[data-theme-dark] .arplText,
2892
+[data-theme-dark-highcontrast] .arplText {
2893
+  display: inline-block;
2894
+  color: #fafafa;
2895
+  width: 330px;
2896
+  height: 184px;
2897
+  font-size: 15px;
2898
+  text-align: left;
2899
+  border: 1px solid #000;
2900
+  border-radius: 6px;
2901
+  margin: 0px 1px 0px 0px;
2902
+  resize: vertical;
2903
+  white-space: pre-wrap;
2904
+  overflow: auto;
2905
+}
2906
+
2907
+[data-theme-dark] .tooltipbalanceid #infobalance,
2908
+[data-theme-dark-highcontrast] .tooltipbalanceid #infobalance {
2909
+  display: block;
2910
+  position: relative;
2911
+  margin: 4px 14px 0px 0px;
2912
+  color: #fafafa;
2913
+  font-size: 21px;
2914
+  font-weight: bold;
2915
+  font-family: 'Liberation Serif', sans-serif;
2916
+  font-style: italic;
2917
+  z-index: 6;
2918
+}
2919
+
2920
+[data-theme-dark] #infotipid,
2921
+[data-theme-dark-highcontrast] #infotipid {
2922
+  display: block;
2923
+  position: relative;
2924
+  margin: 4px 14px 0px 0px;
2925
+  color: #fafafa;
2926
+  font-size: 21px;
2927
+  font-weight: bold;
2928
+  font-family: 'Liberation Serif', sans-serif;
2929
+  font-style: italic;
2930
+  z-index: 5;
2931
+}
2932
+
2933
+[data-theme-dark] .fortooltip .texttooltip, [data-theme-dark] .maxmessagelength .texttooltip,
2934
+[data-theme-dark-highcontrast] .fortooltip .texttooltip, [data-theme-dark-highcontrast] .maxmessagelength .texttooltip {
2935
+  font-family: 'Liberation Serif', Calibri, sans-serif;
2936
+  font-style: italic;
2937
+  color: #fafafa;
2938
+  font-size: 21px;
2939
+  font-weight: bold;
2940
+  margin: 0px 0px 4px 4px;
2941
+}
2942
+
2943
+[data-theme-dark] #uploadfileforsms,
2944
+[data-theme-dark-highcontrast] #uploadfileforsms {
2945
+  margin-left: 7px;
2946
+  background-color: #434343;
2947
+  border-radius: 3px !important;
2948
+}
2949
+
2950
+[data-theme-dark] #uploadfileformms,
2951
+[data-theme-dark-highcontrast] #uploadfileformms {
2952
+  margin-left: 21px;
2953
+  background-color: #434343;
2954
+  border-radius: 3px !important;
2955
+}
2956
+
2957
+[data-theme-dark] .smsnbformat a,
2958
+[data-theme-dark-highcontrast] .smsnbformat a {
2959
+  color: #cedfff !important;
2960
+}
2961
+
2962
+[data-theme-dark] .smsnbformat font,
2963
+[data-theme-dark-highcontrast] .smsnbformat font {
2964
+  color: #f7547a !important;
2965
+}
2966
+
2967
+[data-theme-dark] .indivfiltersent, [data-theme-dark] .indivfilterrec,
2968
+[data-theme-dark-highcontrast] .indivfiltersent, [data-theme-dark-highcontrast] .indivfilterrec {
2969
+  color: #ffffff !important;
2970
+}
2971
+
2972
+[data-theme-dark] #recSmsTable, [data-theme-dark] #groupedSmsTable, [data-theme-dark] #sentSmsTable,
2973
+[data-theme-dark-highcontrast] #recSmsTable, [data-theme-dark-highcontrast] #groupedSmsTable, [data-theme-dark-highcontrast] #sentSmsTable {
2974
+  color: #000000 !important;
2975
+}
2976
+
2977
+[data-theme-dark] .providerSettings .setlabeltext,
2978
+[data-theme-dark-highcontrast] .providerSettings .setlabeltext {
2979
+  color: #272727;
2980
+}
2981
+
2982
+[data-theme-dark] .providerName,
2983
+[data-theme-dark-highcontrast] .providerName  {
2984
+  font-size: 18px;
2985
+  font-weight: bold;
2986
+  margin-bottom: 20px;
2987
+  color: #272727;
2988
+}
2989
+
2990
+[data-theme-dark] .selectHrMin, 
2991
+[data-theme-dark-highcontrast] .selectHrMin,
2992
+[data-theme-dark] .startDate,
2993
+[data-theme-dark-highcontrast] .startDate,
2994
+[data-theme-dark] .endDate,
2995
+[data-theme-dark-highcontrast] .endDate {
2996
+  color: #ffffff !important;
2997
+}
2998
+
2999
+[data-theme-dark] #infoautoreply, [data-theme-dark] #infoautoreplyst, [data-theme-dark] #infoautoreplypn,
3000
+[data-theme-dark-highcontrast] #infoautoreply, [data-theme-dark-highcontrast] #infoautoreplyst, [data-theme-dark-highcontrast] #infoautoreplypn {
3001
+  color: #ffffff;
3002
+}
3003
+
3004
+[data-theme-dark] .generateUrl,
3005
+[data-theme-dark-highcontrast] .generateUrl {
3006
+  color: #013351 !important;
3007
+}
0 3008
new file mode 100644
... ...
@@ -0,0 +1,866 @@
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 isadm = '';
27
+
28
+  // Get personal settings
29
+  var baseUrlget = OC.generateUrl('/apps/sms_relentless/user/getsettings');
30
+
31
+  $.ajax({
32
+     method: 'GET',
33
+     url: baseUrlget + '/' + userid,
34
+     contentType: 'application/json',
35
+     success: function(settingsfromdb) {
36
+
37
+         // Add the webhook URLs section, if the user is not an admin
38
+         if (settingsfromdb.adminornot == 'reguser') {
39
+
40
+             isadm = 'reguser';
41
+
42
+             $("#appTitlePrg").append('<p id="settings-dscr"><h3>Enter your options in the fields from below. As a non-admin user, you can use any of the SMS service providers from \
43
+                  below (Telnyx/Plivo/Twilio/Flowroute), on the condition that an admin has shared with you his API keys for that provider. If an admin has shared with you his API \
44
+                  keys for a provider, to be able to use them properly, you will have to generate the two webhook URLs for that provider by clicking the corresponding \
45
+                  "Generate new webhook URL ..." buttons from below, then click "Save" at the bottom of this page:</h3></p><br>');
46
+
47
+             $("#nadmProvSection").append('<div class="providerSettings"><p><label for="telapi_url_rec" class="setlabeltext"><b>Telnyx webhook URL for incoming SMS/MMS</b> (Generate \
48
+                  the URL by pressing the button from below. Don\'t forget to also click the \'Save\' button at the bottom of this page after entering all the options, to save \
49
+                  all the settings to the database.)</label></p> \
50
+                  <input type="button" id="generate_tel_rcpt" class="generateUrl" value="Generate new webhook URL for incoming SMS/MMS" /> \
51
+                  <input type="text" class="smsr_textboxspec" id="telapi_url_rec" name="telapi_url_rec" autocomplete="false" /> \
52
+                  <span id="copyToClipboardtel" class="icon icon-clippy" title="Copy to clipboard"></span><br><br> \
53
+                  \
54
+                  <p><label for="telapi_url" class="setlabeltext"><b>Telnyx webhook URL for delivery receipts</b> (This URL will be included by SMS Relentless in message sending \
55
+                  requests, so that Telnyx will know where to send the delivery receipts. Just generate it by pressing the button from below. Don\'t forget to click the \'Save\' \
56
+                  button at the bottom of this page after entering all the options, to save all the settings to the database.)</label></p> \
57
+                  <input type="button" id="generate_tel_delrcpt" class="generateUrl" value="Generate new webhook URL for delivery receipts" /> \
58
+                  <input type="text" id="telapi_url" name="telapi_url" autocomplete="false" /></div><br><br> \
59
+                  \
60
+                  <div class="providerSettings"><p><label for="nexapi_url_rec" class="setlabeltext"><b>Plivo webhook URL for incoming SMS/MMS</b> (Generate the URL by pressing \
61
+                  the button from below. Don\'t forget to also click the \'Save\' button at the bottom of this page after entering all the options, to save all the settings \
62
+                  to the database.)</label></p> \
63
+                  <input type="button" id="generate_nex_rcpt" class="generateUrl" value="Generate new webhook URL for incoming SMS/MMS" /> \
64
+                  <input type="text" class="smsr_textboxspec" id="nexapi_url_rec" name="nexapi_url_rec" autocomplete="false" /> \
65
+                  <span id="copyToClipboardnex" class="icon icon-clippy" title="Copy to clipboard"></span><br><br> \
66
+                  \
67
+                  <p><label for="nexapi_url" class="setlabeltext"><b>Plivo webhook URL for delivery receipts</b> (This URL will be included by SMS Relentless in message sending \
68
+                  requests, so that Plivo will know where to send the delivery receipts. Just generate it by pressing the button from below. Don\'t forget to click the \'Save\' \
69
+                  button at the bottom of this page after entering all the options, to save all the settings to the database.)</label></p> \
70
+                  <input type="button" id="generate_nex_delrcpt" class="generateUrl" value="Generate new webhook URL for delivery receipts" /> \
71
+                  <input type="text" id="nexapi_url" name="nexapi_url" autocomplete="false" /></div><br><br> \
72
+                  \
73
+                  <div class="providerSettings"><p><label for="twilapi_url_rec" class="setlabeltext"><b>Twilio webhook URL for incoming SMS/MMS</b> (Generate the URL by pressing \
74
+                  the button from below. Don\'t forget to also click the \'Save\' button at the bottom of this page after entering all the options, to save all the settings to \
75
+                  the database.)</label></p> \
76
+                  <input type="button" id="generate_twil_rcpt" class="generateUrl" value="Generate new webhook URL for incoming SMS/MMS" /> \
77
+                  <input type="text" class="smsr_textboxspec" id="twilapi_url_rec" name="twilapi_url_rec" autocomplete="false" /> \
78
+                  <span id="copyToClipboardtwil" class="icon icon-clippy" title="Copy to clipboard"></span><br><br> \
79
+                  \
80
+                  <p><label for="twilapi_url" class="setlabeltext"><b>Twilio webhook URL for delivery receipts</b> (This URL will be included by SMS Relentless in message sending \
81
+                  requests, so that Twilio will know where to send the delivery receipts. Just generate it by pressing the button from below. Don\'t forget to click the \'Save\' \
82
+                  button at the bottom of this page after entering all the options, to save all the settings to the database.)</label></p> \
83
+                  <input type="button" id="generate_twil_delrcpt" class="generateUrl" value="Generate new webhook URL for delivery receipts" /> \
84
+                  <input type="text" id="twilapi_url" name="twilapi_url" autocomplete="false" /></div><br><br> \
85
+                  \
86
+                  <div class="providerSettings"><p><label for="flowapi_url_rec" class="setlabeltext"><b>Flowroute webhook URL for incoming SMS/MMS</b> (Generate the URL by pressing \
87
+                  the button from below. Don\'t forget to also click the \'Save\' button at the bottom of this page after entering all the options, to save all the settings to \
88
+                  the database.)</label></p> \
89
+                  <input type="button" id="generate_flow_rcpt" class="generateUrl" value="Generate new webhook URL for incoming SMS/MMS" /> \
90
+                  <input type="text" class="smsr_textboxspec" id="flowapi_url_rec" name="flowapi_url_rec" autocomplete="false" /> \
91
+                  <span id="copyToClipboardflow" class="icon icon-clippy" title="Copy to clipboard"></span><br><br> \
92
+                  \
93
+                  <p><label for="flowapi_url" class="setlabeltext"><b>Flowroute webhook URL for delivery receipts</b> (This URL will be included by SMS Relentless in message sending \
94
+                  requests, so that Flowroute will know where to send the delivery receipts. Just generate it by pressing the button from below. Don\'t forget to click the \'Save\' \
95
+                  button at the bottom of this page after entering all the options, to save all the settings to the database.)</label></p> \
96
+                  <input type="button" id="generate_flow_delrcpt" class="generateUrl" value="Generate new webhook URL for delivery receipts" /> \
97
+                  <input type="text" id="flowapi_url" name="flowapi_url" autocomplete="false" /><br><br> \
98
+                  Flowroute only supports sending/receiving SMS/MMS messages within USA and Canada and it doesn\'t support Alphanumeric Sender IDs.</div><br>');
99
+
100
+
101
+		  $("#telapi_url_rec").val(settingsfromdb.telapi_url_rec);
102
+		  $("#telapi_url").val(settingsfromdb.telapi_url);
103
+		  $("#nexapi_url_rec").val(settingsfromdb.nexapi_url_rec);
104
+		  $("#nexapi_url").val(settingsfromdb.nexapi_url);
105
+		  $("#twilapi_url_rec").val(settingsfromdb.twilapi_url_rec);
106
+		  $("#twilapi_url").val(settingsfromdb.twilapi_url);
107
+		  $("#flowapi_url_rec").val(settingsfromdb.flowapi_url_rec);
108
+		  $("#flowapi_url").val(settingsfromdb.flowapi_url);
109
+		  $("#messagesperpage").val(settingsfromdb.messagesperpage);
110
+
111
+		  if (settingsfromdb.get_notify == 1) {
112
+		      $("#get_notify").attr('checked', true);
113
+		  } else {
114
+		      $("#get_notify").attr('checked', false);
115
+		  }
116
+
117
+		  $("#notification_email").val(settingsfromdb.notification_email);
118
+
119
+		  if (settingsfromdb.getsmsinemail == 1) {
120
+		      $("#includesmsinemail").attr('checked', true);
121
+		  } else {
122
+		      $("#includesmsinemail").attr('checked', false);
123
+		  }
124
+
125
+		  if (settingsfromdb.show_display_names == 1) {
126
+		      $("#showdisplaynames").attr('checked', true);
127
+		  } else {
128
+		      $("#showdisplaynames").attr('checked', false);
129
+		  }
130
+
131
+		  if (settingsfromdb.add_display_names == 1) {
132
+		      $("#adddisplaynames").attr('checked', true);
133
+		  } else {
134
+		      $("#adddisplaynames").attr('checked', false);
135
+		  }
136
+
137
+		  function randomStr(strlength) {
138
+			var fintext = "";
139
+			var keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
140
+			for (var i = 0; i < strlength; i++) {
141
+			     fintext += keyspace.charAt(Math.floor(Math.random() * keyspace.length));
142
+			}
143
+			return fintext;
144
+		  }
145
+
146
+		  $("#generate_tel_rcpt").on("click", function(event) {
147
+
148
+		     var teltokenrec = randomStr(70);
149
+		     var telnyxwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstel?telrecparam=') + teltokenrec;
150
+
151
+		     $("#telapi_url_rec").val(telnyxwhurlrec);
152
+		  });
153
+
154
+		  $("#copyToClipboardtel").on("click", function(event) {
155
+		     var $tempEl = $("<input>");
156
+		     $("body").append($tempEl);
157
+		     $tempEl.val($("#telapi_url_rec").val()).select();
158
+		     document.execCommand("Copy");
159
+		     $tempEl.remove();
160
+		     showAlert("The link has been copied to your clipboard!");
161
+		  });
162
+
163
+		  $("#generate_tel_delrcpt").on("click", function(event) {
164
+
165
+		     var teltoken = randomStr(70);
166
+		     var telnyxwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytel?teldrparam=') + teltoken;
167
+
168
+		     $("#telapi_url").val(telnyxwhurl);
169
+		  });
170
+
171
+
172
+		  $("#generate_nex_rcpt").on("click", function(event) {
173
+
174
+		     var plivotokenrec = randomStr(70);
175
+		     var plivowhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsnex?plivorecparam=') + plivotokenrec;
176
+
177
+		     $("#nexapi_url_rec").val(plivowhurlrec);
178
+		  });
179
+
180
+		  $("#copyToClipboardnex").on("click", function(event) {
181
+		     var $tempElpl = $("<input>");
182
+		     $("body").append($tempElpl);
183
+		     $tempElpl.val($("#nexapi_url_rec").val()).select();
184
+		     document.execCommand("Copy");
185
+		     $tempElpl.remove();
186
+		     showAlert("The link has been copied to your clipboard!");
187
+		  });
188
+
189
+		  $("#generate_nex_delrcpt").on("click", function(event) {
190
+
191
+		     var plivotoken = randomStr(70);
192
+		     var plivodrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverynex?plivodrparam=') + plivotoken;
193
+
194
+		     $("#nexapi_url").val(plivodrwhurl);
195
+		  });
196
+
197
+
198
+		  $("#generate_twil_rcpt").on("click", function(event) {
199
+
200
+		     var twiltokenrec = randomStr(35);
201
+		     var twilwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstwil?twilrecparam=') + twiltokenrec;
202
+
203
+		     $("#twilapi_url_rec").val(twilwhurlrec);
204
+		  });
205
+
206
+		  $("#copyToClipboardtwil").on("click", function(event) {
207
+		     var $tempElpl = $("<input>");
208
+		     $("body").append($tempElpl);
209
+		     $tempElpl.val($("#twilapi_url_rec").val()).select();
210
+		     document.execCommand("Copy");
211
+		     $tempElpl.remove();
212
+		     showAlert("The link has been copied to your clipboard!");
213
+		  });
214
+
215
+		  $("#generate_twil_delrcpt").on("click", function(event) {
216
+
217
+		     var twiltoken = randomStr(35);
218
+		     var twildrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytwil?twildrparam=') + twiltoken;
219
+
220
+		     $("#twilapi_url").val(twildrwhurl);
221
+		  });
222
+
223
+
224
+		  $("#generate_flow_rcpt").on("click", function(event) {
225
+
226
+		     var flowtokenrec = randomStr(70);
227
+		     var flowwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsflow?flowrecparam=') + flowtokenrec;
228
+
229
+		     $("#flowapi_url_rec").val(flowwhurlrec);
230
+		  });
231
+
232
+		  $("#copyToClipboardflow").on("click", function(event) {
233
+		     var $tempElpl = $("<input>");
234
+		     $("body").append($tempElpl);
235
+		     $tempElpl.val($("#flowapi_url_rec").val()).select();
236
+		     document.execCommand("Copy");
237
+		     $tempElpl.remove();
238
+		     showAlert("The link has been copied to your clipboard!");
239
+		  });
240
+
241
+		  $("#generate_flow_delrcpt").on("click", function(event) {
242
+
243
+		     var flowtoken = randomStr(70);
244
+		     var flowdrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliveryflow?flowdrparam=') + flowtoken;
245
+
246
+		     $("#flowapi_url").val(flowdrwhurl);
247
+		  });
248
+
249
+
250
+         } else if (settingsfromdb.adminornot == 'admin') {
251
+
252
+                  $("#appTitlePrg").append('<p id="settings-dscr"><h3>First enter your credentials and options on the admin settings page (on the left panel, under Administration, \
253
+                                            click on SMS Relentless), then enter your options in the fields from below:</h3></p><br>');
254
+                  isadm = 'admin';
255
+
256
+		  $("#messagesperpage").val(settingsfromdb.messagesperpage);
257
+
258
+		  if (settingsfromdb.get_notify == 1) {
259
+		      $("#get_notify").attr('checked', true);
260
+		  } else {
261
+		      $("#get_notify").attr('checked', false);
262
+		  }
263
+
264
+		  $("#notification_email").val(settingsfromdb.notification_email);
265
+
266
+		  if (settingsfromdb.getsmsinemail == 1) {
267
+		      $("#includesmsinemail").attr('checked', true);
268
+		  } else {
269
+		      $("#includesmsinemail").attr('checked', false);
270
+		  }
271
+
272
+		  if (settingsfromdb.show_display_names == 1) {
273
+		      $("#showdisplaynames").attr('checked', true);
274
+		  } else {
275
+		      $("#showdisplaynames").attr('checked', false);
276
+		  }
277
+
278
+		  if (settingsfromdb.add_display_names == 1) {
279
+		      $("#adddisplaynames").attr('checked', true);
280
+		  } else {
281
+		      $("#adddisplaynames").attr('checked', false);
282
+		  }
283
+         }
284
+
285
+
286
+         // Auto-reply settings
287
+
288
+         // Get the available phone numbers from all providers associated with the access keys entered on the Settings page (restrictions are applied to numbers for non-admins)
289
+         $("#autoRplPhoneNb").addClass('icon-loading');
290
+         var getnumbersUrl = OC.generateUrl("/apps/sms_relentless/user/getautoreplyconf");
291
+
292
+	 $.ajax({
293
+		  url: getnumbersUrl + '/' + userid,
294
+		  type: "GET",
295
+                  contentType: 'application/json',
296
+		  success: function(autoreplydata) {
297
+
298
+                                    $("#autoRplPhoneNb").removeClass('icon-loading');
299
+                                    var cusrDisplayName = autoreplydata.userdisplayname;
300
+                                    var availPhoneNmbrs = autoreplydata.phonenumbers;
301
+                                    var autorpldata = autoreplydata.autoreplies;
302
+
303
+				    if (autorpldata.length > 0) { 
304
+				        var arplNmb = autorpldata.length;
305
+				    } else { 
306
+				        var arplNmb = 0; 
307
+				    }
308
+
309
+				    // List the auto-replies for the phone numbers available for the current user
310
+				    if (arplNmb == 0) {
311
+
312
+				        $("#autoReplyTbl").append("<tr><td><input type='text' class='arplAuthor' value='"+ cusrDisplayName +"' disabled></td><td><select id='arpphn-"+ arplNmb +"' class='arplPhoneNmbr'></select></td><td><div id='arplmode-"+ arplNmb +"' class='arplMode'><select id='modeselect-"+ arplNmb +"' class='selectArplMode'><option value='' selected>Select mode</option><option value='daily'>Daily mode</option><option value='vacation'>Vacation mode</option></select><div id='modecont-"+ arplNmb +"' class='modeContent'></div></div></td><td><textarea id='arpltxt-"+ arplNmb +"' class='arplText' rows='20' cols='40' placeholder='Enter the auto-reply message here.'></textarea></td><td><img id='rmRow-"+ arplNmb +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:9px 8px 0px 18px;'></td><td><input type='submit' id='arplsave-"+ arplNmb +"' class='saveAutoReply' value='Save' title='Save Row' /></td></tr>");
313
+				        $("#autoReplyTbl").append("<div><img id='addArplRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
314
+
315
+				    } else {
316
+
317
+				        for (k = 0; k < arplNmb; k++) {
318
+
319
+                                             if (autorpldata[k].days_of_week != '') {
320
+
321
+                                                 var slctdMode = "<option value=''>Select mode</option><option value='daily' selected>Daily mode</option><option value='vacation'>Vacation mode</option>";
322
+                                                 var dailyStartArr = autorpldata[k].daily_start.split(":");
323
+                                                 var dailyEndArr = autorpldata[k].daily_end.split(":");
324
+
325
+		                                 var dlHrStartOptions = "";
326
+			                         for (var hr = 0; hr < 24; hr++) {
327
+		                                      if (dailyStartArr[0] != hr.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false})) {
328
+			                                  dlHrStartOptions += "<option value='"+ hr.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"'>"+ hr.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"</option>";
329
+		                                      } else {
330
+			                                  dlHrStartOptions += "<option value='"+ hr.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"' selected>"+ hr.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"</option>";
331
+		                                      }
332
+			                         }
333
+
334
+		                                 var dlMnStartOptions = "";
335
+			                         for (var mn = 0; mn < 60; mn++) {
336
+		                                      if (dailyStartArr[1] != mn.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false})) {
337
+			                                  dlMnStartOptions += "<option value='"+ mn.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"'>"+ mn.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"</option>";
338
+		                                      } else {
339
+			                                  dlMnStartOptions += "<option value='"+ mn.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"' selected>"+ mn.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"</option>";
340
+		                                      }
341
+			                         }
342
+
343
+		                                 var dlHrEndOptions = "";
344
+			                         for (var hr = 0; hr < 24; hr++) {
345
+		                                      if (dailyEndArr[0] != hr.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false})) {
346
+			                                  dlHrEndOptions += "<option value='"+ hr.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"'>"+ hr.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"</option>";
347
+		                                      } else {
348
+			                                  dlHrEndOptions += "<option value='"+ hr.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"' selected>"+ hr.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"</option>";
349
+		                                      }
350
+			                         }
351
+
352
+		                                 var dlMnEndOptions = "";
353
+			                         for (var mn = 0; mn < 60; mn++) {
354
+		                                      if (dailyEndArr[1] != mn.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false})) {
355
+			                                  dlMnEndOptions += "<option value='"+ mn.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"'>"+ mn.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"</option>";
356
+		                                      } else {
357
+			                                  dlMnEndOptions += "<option value='"+ mn.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"' selected>"+ mn.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"</option>";
358
+		                                      }
359
+			                         }
360
+
361
+                                                 var modeContent = "<div class='daysOfWeek'>Days of the week:<div class='tooltipautoreply'><div id='infoautoreply'>i</div><div class='autorpltooltip'>Enter the order number of the days of the week in which the auto-reply will be sent. For example, to send the auto-reply every day from Monday to Friday outside the time interval specified below, enter 1,2,3,4,5 To send the auto-reply only Monday, Thursday and Friday enter 1,4,5 To send the auto-reply every day of the week enter 1,2,3,4,5,6,7 As an exception, if you want the auto-reply to be sent during an entire day, irrespective of the specified interval, add (full) after the number of that day. For example, if you want the auto-reply to be sent from Monday to Friday outside the interval specified below, and also during the entire days of Saturday and Sunday, enter 1,2,3,4,5,6(full),7(full)</div></div></div><input type='text' id='weekdays-"+ k +"' class='daysInWeek' value='"+ autorpldata[k].days_of_week +"'><div class='chooseTInterval'>Send auto-reply <span style='color:#ad0202'>outside</span> this interval:<div class='tooltipautoreplyst'><div id='infoautoreplyst'>i</div><div class='autorpltooltipst'>These fields specify the time of the server. If the server is located in a time zone that is different from that of the owner/company, the time interval entered here should be adjusted accordingly.</div></div></div><div class='selectArplHours'><select id='dmstarthr-"+ k +"' class='selectHrMin'>"+ dlHrStartOptions +"</select><select id='dmstartmn-"+ k +"' class='selectHrMin'>"+ dlMnStartOptions +"</select><span style='font-weight: 600'> — </span><select id='dmendhr-"+ k +"' class='selectHrMin'>"+ dlHrEndOptions +"</select><select id='dmendmn-"+ k +"' class='selectHrMin'>"+ dlMnEndOptions +"</select></div>";
362
+
363
+                                             } else {
364
+
365
+                                                 var vctnStart = autorpldata[k].vacation_start.split(" ")[0];
366
+                                                 var vctnEnd = autorpldata[k].vacation_end.split(" ")[0];
367
+
368
+                                                 var slctdMode = "<option value=''>Select mode</option><option value='daily'>Daily mode</option><option value='vacation' selected>Vacation mode</option>";
369
+                                                 var modeContent = "<div class='chooseDateIntvl'>Send auto-reply <span style='color:#ad0202'>inside</span> this interval:</div><div class='arplstrtendDates'><div class='stdtTitle'>Start Date</div><input type='text' id='startDT-"+ k +"' class='startDate' placeholder='Pick a date' value='"+ vctnStart +"'><div class='enddtTitle'>End Date</div><input type='text' id='endDT-"+ k +"' class='endDate' placeholder='Pick a date' value='"+ vctnEnd +"'></div>"
370
+                                             }
371
+
372
+				             $("#autoReplyTbl").append("<tr><td><input type='text' class='arplAuthor' value='"+ autorpldata[k].saved_by_dsplname +"' disabled></td><td><select id='arpphn-"+ k +"' class='arplPhoneNmbr' style='pointer-events:none'><option selected>"+ autorpldata[k].phone_number +"</option></select></td><td><div id='arplmode-"+ k +"' class='arplMode'><select id='modeselect-"+ k +"' class='selectArplMode'>"+ slctdMode +"</select><div id='modecont-"+ k +"' class='modeContent'>"+ modeContent +"</div></div></td><td><textarea id='arpltxt-"+ k +"' class='arplText' rows='20' cols='40' placeholder='Enter the auto-reply message here.'>"+ autorpldata[k].message_text +"</textarea></td><td><img id='rmRow-"+ k +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:9px 8px 0px 18px;'></td><td><input type='submit' id='arplsave-"+ k +"' class='saveAutoReply' value='Edit' title='Edit Row' /></td></tr>");
373
+				        }
374
+				        $("#autoReplyTbl").append("<div><img id='addArplRow' src='/apps/sms_relentless/img/add.svg' title='Add Row'></div>");
375
+				    }
376
+
377
+
378
+				    // Create a list with all the available phone numbers
379
+                                    var numbersListItems = "<option value='' selected>Select phone number</option>";
380
+
381
+				    $.each(availPhoneNmbrs, function(key, indsmsnmb) {
382
+				           numbersListItems += "<option value='"+ indsmsnmb +"'>"+ indsmsnmb +"</option>";
383
+				    });
384
+
385
+                                    if (arplNmb == 0) {
386
+				        $("#arpphn-"+ arplNmb).append(numbersListItems);
387
+                                    }
388
+
389
+                                    // Initialize the date picker
390
+			            $('[id^="endDT-"]').datepicker({ dateFormat: "yy-mm-dd" });
391
+			            $('[id^="startDT-"]').datepicker({ dateFormat: "yy-mm-dd" });
392
+
393
+
394
+                                    // Select the auto-reply mode
395
+                                    function selectMode() {
396
+
397
+		                            $('[id^="modeselect-"]').change(function() {
398
+
399
+		                               var crtnmbr = $(this).attr("id").replace("modeselect-", "");
400
+
401
+		                               var dailyHrStart = "";
402
+		                               for (var h = 0; h < 24; h++) {
403
+		                                    dailyHrStart += "<option value='"+ h.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"'>"+ h.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"</option>";
404
+		                               }
405
+
406
+		                               var dailyMnStart = "";
407
+		                               for (var m = 0; m < 60; m++) {
408
+		                                    dailyMnStart += "<option value='"+ m.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"'>"+ m.toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false}) +"</option>";
409
+		                               }
410
+
411
+		                               var dailyHrEnd = dailyHrStart;
412
+		                               var dailyMnEnd = dailyMnStart;
413
+
414
+		                               if ($(this).val() == 'daily') {
415
+		                                   $("#modecont-"+ crtnmbr).empty();
416
+		                                   $("#modecont-"+ crtnmbr).append("<div class='daysOfWeek'>Days of the week:<div class='tooltipautoreply'><div id='infoautoreply'>i</div><div class='autorpltooltip'>Enter the order number of the days of the week in which the auto-reply will be sent. For example, to send the auto-reply every day from Monday to Friday outside the time interval specified below, enter 1,2,3,4,5 To send the auto-reply only Monday, Thursday and Friday enter 1,4,5 To send the auto-reply every day of the week enter 1,2,3,4,5,6,7 As an exception, if you want the auto-reply to be sent during an entire day, irrespective of the specified interval, add (full) after the number of that day. For example, if you want the auto-reply to be sent from Monday to Friday outside the interval specified below, and also during the entire days of Saturday and Sunday, enter 1,2,3,4,5,6(full),7(full)</div></div></div><input type='text' id='weekdays-"+ crtnmbr +"' class='daysInWeek'><div class='chooseTInterval'>Send auto-reply <span style='color:#ad0202'>outside</span> this interval:<div class='tooltipautoreplyst'><div id='infoautoreplyst'>i</div><div class='autorpltooltipst'>These fields specify the time of the server. If the server is located in a time zone that is different from that of the owner/company, the time interval entered here should be adjusted accordingly.</div></div></div><div class='selectArplHours'><select id='dmstarthr-"+ crtnmbr +"' class='selectHrMin'>"+ dailyHrStart +"</select><select id='dmstartmn-"+ crtnmbr +"' class='selectHrMin'>"+ dailyMnStart +"</select><span style='font-weight: 600'> — </span><select id='dmendhr-"+ crtnmbr +"' class='selectHrMin'>"+ dailyHrEnd +"</select><select id='dmendmn-"+ crtnmbr +"' class='selectHrMin'>"+ dailyMnEnd +"</select></div>");
417
+		                               } else if ($(this).val() == 'vacation') {
418
+		                                   $("#modecont-"+ crtnmbr).empty();
419
+		                                   $("#modecont-"+ crtnmbr).append("<div class='chooseDateIntvl'>Send auto-reply <span style='color:#ad0202'>inside</span> this interval:</div><div class='arplstrtendDates'><div class='stdtTitle'>Start Date</div><input type='text' id='startDT-"+ crtnmbr +"' class='startDate' placeholder='Pick a date'><div class='enddtTitle'>End Date</div><input type='text' id='endDT-"+ crtnmbr +"' class='endDate' placeholder='Pick a date' /></div>");
420
+		                               }
421
+
422
+					       $("#endDT-"+ crtnmbr +"").datepicker({ dateFormat: "yy-mm-dd" });
423
+					       $("#startDT-"+ crtnmbr +"").datepicker({ dateFormat: "yy-mm-dd" });
424
+		                          });
425
+                                  }
426
+                                  selectMode();
427
+
428
+				  // Save the data
429
+				  function saveArplRow() {
430
+
431
+				     $('[id^="arplsave-"]').unbind("click");
432
+				     $('[id^="arplsave-"]').click(function(event) {
433
+
434
+				        event.preventDefault();
435
+				        var crntrwnmbr = $(this).attr("id").replace("arplsave-", "");
436
+
437
+				        if ($(this).attr("value") == "Save") {
438
+
439
+				            var phoneNmbr = $("#arpphn-"+ crntrwnmbr).val();
440
+				            var arplText = $("#arpltxt-"+ crntrwnmbr).val();
441
+				            var slctdMode = $("#modeselect-"+ crntrwnmbr).val();
442
+
443
+				            var slctddmDays = "";
444
+				            var slctdHrStart = "";
445
+				            var slctdMnStart = "";
446
+				            var slctdHrEnd = "";
447
+				            var slctdMnEnd = "";
448
+
449
+				            var vcStartDate = null;
450
+				            var vcEndDate = null;
451
+
452
+				            if (slctdMode == 'daily') {
453
+
454
+				                slctddmDays = $("#weekdays-"+ crntrwnmbr).val().trim();
455
+				                slctdHrStart = $("#dmstarthr-"+ crntrwnmbr).val().trim();
456
+				                slctdMnStart = $("#dmstartmn-"+ crntrwnmbr).val().trim();
457
+				                slctdHrEnd = $("#dmendhr-"+ crntrwnmbr).val().trim();
458
+				                slctdMnEnd = $("#dmendmn-"+ crntrwnmbr).val().trim();
459
+
460
+                                                if (slctdHrStart != '' && slctdMnStart != '') {
461
+                                                    var hrmnStartComp = slctdHrStart +":"+ slctdMnStart;
462
+                                                } else { var hrmnStartComp = ""; }
463
+
464
+                                                if (slctdHrEnd != '' && slctdMnEnd != '') {
465
+                                                    var hrmnEndComp = slctdHrEnd +":"+ slctdMnEnd;
466
+                                                } else { var hrmnEndComp = ""; }
467
+
468
+                                                if (!(/^[1-7ful\,\(\)]+$/.test(slctddmDays))) {
469
+				                    showAlert("The 'Days of the week' field can contain only digits from 1 to 7, the lowercase letters f, u and l, round brackets ()() and commas (,).");
470
+				                    return;
471
+                                                }
472
+
473
+                                                if (!(/^[0-9]+$/.test(slctdHrStart + slctdMnStart + slctdHrEnd + slctdMnEnd))) {
474
+				                    showAlert("The starting and ending values of the time interval for the 'Daily mode' can contain only digits from 0 to 9.");
475
+				                    return;
476
+                                                }
477
+
478
+                                                if (slctddmDays.trim() == '' || (slctdHrStart == slctdHrEnd && slctdMnStart == slctdMnEnd)) {
479
+				                    showAlert("For the 'Daily mode', you have to enter the order number of the days of the week for which you want the auto-reply to be sent, and you have to set a starting time that is different from the ending time!");
480
+				                    return;
481
+                                                }
482
+
483
+				            } else if (slctdMode == 'vacation') {
484
+		
485
+                                                if ($("#startDT-"+ crntrwnmbr).val().trim() == '' || $("#endDT-"+ crntrwnmbr).val().trim() == '') {
486
+
487
+				                    showAlert("For the 'Vacation mode', you have to enter both a start date and an end date.");
488
+				                    return;
489
+
490
+                                                } else {
491
+
492
+                                                    if (!(/^[0-9\-]+$/.test($("#startDT-"+ crntrwnmbr).val().trim() + $("#endDT-"+ crntrwnmbr).val().trim()))) {
493
+				                        showAlert("The start date and end date values for the 'Vacation mode' can contain only digits from 0 to 9 and hyphens (-).");
494
+				                        return;
495
+                                                    }
496
+
497
+		                                    vcStartDate = $("#startDT-"+ crntrwnmbr).val().trim() +" 00:00:00";
498
+				                    vcEndDate = $("#endDT-"+ crntrwnmbr).val().trim() +" 23:59:59";
499
+				                    var strtDateCmp = new Date(vcStartDate).toJSON().slice(0, 10) +" 00:00:00";
500
+				                    var endDateCmp = new Date(vcEndDate).toJSON().slice(0, 10) +" 23:59:59";
501
+				                    var crntDate = new Date().toJSON().slice(0, 10) +" 23:59:59";
502
+
503
+                                                    if (vcStartDate.trim() == "" || vcEndDate.trim() == "" || (strtDateCmp >= endDateCmp || ((strtDateCmp < crntDate) && (endDateCmp < crntDate)))) {
504
+				                        showAlert("For 'Vacation mode', you have to enter both a start date and an end date, the start date must be before the end date and at least the ending of the time interval must be in the future.");
505
+				                        return;
506
+                                                    }
507
+                                                }
508
+				            }
509
+
510
+
511
+				            if (phoneNmbr != '') {
512
+
513
+				              if (arplText.trim() != '') {
514
+
515
+				                if (slctdMode != '') {
516
+
517
+				                    var saveArplUrl = OC.generateUrl('/apps/sms_relentless/user/updateautoreplies');
518
+				                    var arpldata = {
519
+				                         userId: userid,
520
+				                         savedByDsplname: cusrDisplayName,
521
+				                         phoneNumber: phoneNmbr,
522
+				                         daysOfWeek: slctddmDays,
523
+				                         dailyStart: hrmnStartComp,
524
+				                         dailyEnd: hrmnEndComp,
525
+				                         vacationStart: vcStartDate,
526
+				                         vacationEnd: vcEndDate,
527
+				                         messageText: arplText
528
+				                    };
529
+
530
+					            $.ajax({
531
+					              method: 'PUT',
532
+					              url: saveArplUrl + '/' + userid,
533
+					              contentType: 'application/json',
534
+					              data: JSON.stringify(arpldata),
535
+				                      success: function(messagereceived) {
536
+
537
+				                                   if (messagereceived == 'success') {
538
+				                                       showAlert('The auto-reply has been successfully saved to the database!');
539
+				                                   } else if (messagereceived == 'failure') {
540
+				                                       showAlert('Error while trying to save the auto-reply!');
541
+				                                   } else if (messagereceived == 'not allowed') {
542
+                                                                       showAlert('You cannot change an auto-reply that was saved by a different user.');
543
+                                                                   }
544
+				                      },
545
+					              error: function() {
546
+						                   showAlert('Error while attempting to save the auto-reply! You can check the Nextcloud log to find more details about this issue.');
547
+					              }
548
+					            });
549
+
550
+
551
+                                                } else { showAlert("Please select the auto-reply mode."); return; }
552
+
553
+                                              } else { showAlert("Please enter the text of the auto-reply."); return; }
554
+
555
+                                            } else { showAlert("Please select a phone number if at least one number is available in the 'Phone Number' drop-down list. Otherwise, you should contact the administrator."); return; }
556
+
557
+                                            $(this).attr("value", "Edit");
558
+
559
+                                        } else {
560
+                                            $("#arplsave-"+ crntrwnmbr).attr("value", "Save");
561
+                                        }
562
+
563
+                                     });
564
+
565
+				  }
566
+                                  saveArplRow();
567
+
568
+
569
+				  // Remove a row
570
+				  function removeArplRow() {
571
+				       $('[id^="rmRow-"]').click(function() {
572
+
573
+					  var slctRowRm = $(this).attr("id").replace("rmRow-", "");
574
+					  var crntPhnNmbr = $("#arpphn-"+ slctRowRm).val();
575
+
576
+				          confirmAlert("Do you really want to remove this row from the database ?");
577
+
578
+				          $("#confirmCancel").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
579
+
580
+				          $("#confirmOk").click(function() {
581
+
582
+				              $("#alertMsgOverlay").remove();
583
+				              $("#alertConfMessage").remove();
584
+
585
+					      var rmvArplUrl = OC.generateUrl('/apps/sms_relentless/user/removeautoreplies');
586
+					      $.ajax({
587
+						   url: rmvArplUrl + '/' + userid,
588
+						   method: "POST",
589
+						   dataType: "text",
590
+						   data: { phoneNumber: crntPhnNmbr },
591
+						   success: function(delresult) {
592
+
593
+						                     if (delresult.indexOf("success") > -1) {
594
+						                         showAlert("The auto-reply has been removed successfully!");
595
+						                         $("#arpphn-"+ slctRowRm).closest("tr").remove();
596
+						                     } else if (delresult.indexOf("failure") > -1) {
597
+						                         showAlert("Error while trying to remove auto-reply data!");
598
+						                     } else if (delresult.indexOf("not allowed") > -1) {
599
+                                                                         showAlert("You cannot remove the auto-reply saved by another user.");
600
+                                                                     }
601
+						   },
602
+						   error: function() { showAlert("Error while attempting to remove auto-reply data! You can check the Nextcloud log to find more details about this issue."); }
603
+					       });
604
+					  });
605
+				       });
606
+				  }
607
+				  removeArplRow();
608
+
609
+                                  // Add a new row
610
+                                  $("#addArplRow").click(function() {
611
+
612
+                                     if ($("#autoReplyTbl").find("tr:last-child").find(".arplPhoneNmbr").length > 0) {
613
+                                         var lastarpl = $("#autoReplyTbl").find("tr:last-child").find(".arplPhoneNmbr").attr("id").replace("arpphn-", "");
614
+                                         var indArplAdd = parseInt(lastarpl + 1);
615
+                                     } else { var indArplAdd = 0; }
616
+			             $("#autoReplyTbl").append("<tr><td><input type='text' class='arplAuthor' value='"+ cusrDisplayName +"' disabled></td><td><select id='arpphn-"+ indArplAdd +"' class='arplPhoneNmbr'>"+ numbersListItems +"</select></td><td><div id='arplmode-"+ indArplAdd +"' class='arplMode'><select id='modeselect-"+ indArplAdd +"' class='selectArplMode'><option value='' selected>Select mode</option><option value='daily'>Daily mode</option><option value='vacation'>Vacation mode</option></select><div id='modecont-"+ indArplAdd +"' class='modeContent'></div></div></td><td><textarea id='arpltxt-"+ indArplAdd +"' class='arplText' rows='20' cols='40' placeholder='Enter the auto-reply message here.'></textarea></td><td><img id='rmRow-"+ indArplAdd +"' class='removeRow' src='/apps/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:9px 8px 0px 18px;'></td><td><input type='submit' id='arplsave-"+ indArplAdd +"' class='saveAutoReply' value='Save' title='Save Row' /></td></tr>");
617
+
618
+                                     selectMode();
619
+                                     saveArplRow();
620
+                                     removeArplRow();
621
+
622
+			             // Check if there is an auto-reply set for the same phone number
623
+				     $("#arpphn-"+ indArplAdd).change(function() {
624
+					 var selectedPhNb = $("#arpphn-"+ indArplAdd).val();
625
+					 var allArplPhNmbrs = $("#autoReplyTbl").find("tr").find(".arplPhoneNmbr");
626
+					 var phNbChck = 0;
627
+					 allArplPhNmbrs.each(function() {
628
+					    var slctphnb = ($(this).val())? $(this).val() : $(this).text();
629
+					    if (selectedPhNb == slctphnb) { phNbChck++; }
630
+					 });
631
+
632
+					 if (phNbChck == 2) {
633
+					     showAlert("There is already an auto-reply set up for this phone number. Please edit its own row, or choose a different phone number.");
634
+					     $(this).val('');
635
+					     return;
636
+					 }
637
+				     });
638
+                                  });
639
+
640
+		  },
641
+		  error: function() {
642
+                                    $("#autoRplPhoneNb").removeClass('icon-loading'); 
643
+                                    showAlert("Error while attempting to get the auto-reply settings! You can check the Nextcloud log to find more details about this issue.");
644
+                  }
645
+         });
646
+
647
+     },
648
+     error: function() {
649
+                  showAlert('Error while getting the settings! You can check the Nextcloud log to find more details about this issue.');
650
+     }
651
+  });
652
+
653
+
654
+
655
+  // Save personal settings for non-admin users
656
+  $("#save_sms_settings").on("click", function(event) {
657
+
658
+     if (isadm == 'reguser') {
659
+
660
+	    event.preventDefault();
661
+	    var baseUrlsave = OC.generateUrl('/apps/sms_relentless/user/updatesettings');
662
+
663
+	    var messagesperpageinit = $("#messagesperpage").val();
664
+	    var messagesperpagesec = messagesperpageinit.replace(/[^0-9]/g, '');
665
+
666
+	    if (messagesperpagesec != '') {
667
+		var messagesperpageproc = messagesperpagesec;
668
+	    } else {
669
+		var messagesperpageproc = 100;
670
+	    }
671
+
672
+	    var getnotify = 0;
673
+
674
+	    if ($("#get_notify").is(':checked')) {
675
+		getnotify = 1;
676
+	    }
677
+
678
+	    var emailaddressinit = $("#notification_email").val();
679
+
680
+	    function validate_email($email) {
681
+		var email_reg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
682
+		return email_reg.test($email);
683
+	    }
684
+
685
+	    if (validate_email(emailaddressinit)) {
686
+		 var notifyemail = emailaddressinit;
687
+	    } else {
688
+		 var notifyemail = '';
689
+	    }
690
+
691
+	    var includesmsinemail = 0;
692
+	    if ($("#includesmsinemail").is(':checked')) {
693
+		includesmsinemail = 1;
694
+                if ($("#notification_email").val().trim() == '') {
695
+                    showAlert("Please enter an email address in the field: 'I want to receive a notification to the email address from below ...', or uncheck the checkbox: 'Include the SMS/MMS message in the email notification itself'.");
696
+                    return;
697
+                }
698
+	    }
699
+
700
+	    var showdisplaynm = 0;
701
+	    if ($("#showdisplaynames").is(':checked')) {
702
+		showdisplaynm = 1;
703
+	    }
704
+
705
+	    var adddisplaynm = 0;
706
+	    if ($("#adddisplaynames").is(':checked')) {
707
+		adddisplaynm = 1;
708
+	    }
709
+
710
+	    var datatosave = {
711
+			      userId: userid,
712
+		              telapiUrlRec: $("#telapi_url_rec").val(),
713
+		              telapiUrl: $("#telapi_url").val(),
714
+		              nexapiUrlRec: $("#nexapi_url_rec").val(),
715
+		              nexapiUrl: $("#nexapi_url").val(),
716
+		              twilapiUrlRec: $("#twilapi_url_rec").val(),
717
+		              twilapiUrl: $("#twilapi_url").val(),
718
+		              flowapiUrlRec: $("#flowapi_url_rec").val(),
719
+		              flowapiUrl: $("#flowapi_url").val(),
720
+			      messagesperpage: messagesperpageproc,
721
+			      getNotify: getnotify,
722
+			      notificationEmail: notifyemail,
723
+			      getsmsinemail: includesmsinemail,
724
+			      showDisplayNames: showdisplaynm,
725
+                              addDisplayNames: adddisplaynm
726
+	    };
727
+
728
+
729
+	    $.ajax({
730
+	       method: 'PUT',
731
+	       url: baseUrlsave + '/' + userid,
732
+	       contentType: 'application/json',
733
+	       data: JSON.stringify(datatosave),
734
+	       success: function() {
735
+                               OC.msg.startAction('#smsr_save_msg', t('sms_relentless', 'Saved'));
736
+	       },
737
+	       error: function() {
738
+		    showAlert('Error while attempting to save the settings! You can check the Nextcloud log to find more details about this issue.');
739
+	       }
740
+	    });
741
+
742
+
743
+     } else if (isadm == 'admin') {
744
+
745
+	    // Save personal settings for admins
746
+	    event.preventDefault();
747
+	    var baseUrlsaveadm = OC.generateUrl('/apps/sms_relentless/user/updatepersadmnsettings');
748
+
749
+	    var messagesperpageinit = $("#messagesperpage").val();
750
+	    var messagesperpagesec = messagesperpageinit.replace(/[^0-9]/g, '');
751
+
752
+	    if (messagesperpagesec != '') {
753
+		var messagesperpageproc = messagesperpagesec;
754
+	    } else {
755
+		var messagesperpageproc = 100;
756
+	    }
757
+
758
+	    var getnotify = 0;
759
+
760
+	    if ($("#get_notify").is(':checked')) {
761
+		getnotify = 1;
762
+	    }
763
+
764
+	    var emailaddressinit = $("#notification_email").val();
765
+
766
+	    function validate_email($email) {
767
+		var email_reg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
768
+		return email_reg.test($email);
769
+	    }
770
+
771
+	    if (validate_email(emailaddressinit)) {
772
+		 var notifyemail = emailaddressinit;
773
+	    } else {
774
+		 var notifyemail = '';
775
+	    }
776
+
777
+	    var includesmsinemail = 0;
778
+	    if ($("#includesmsinemail").is(':checked')) {
779
+		includesmsinemail = 1;
780
+                if ($("#notification_email").val().trim() == '') {
781
+                    showAlert("Please enter an email address in the field: 'I want to receive a notification to the email address from below ...', or uncheck the checkbox: 'Include the SMS/MMS message in the email notification itself'.");
782
+                    return;
783
+                }
784
+	    }
785
+
786
+	    var showdisplaynm = 0;
787
+	    if ($("#showdisplaynames").is(':checked')) {
788
+		showdisplaynm = 1;
789
+	    }
790
+
791
+	    var adddisplaynm = 0;
792
+	    if ($("#adddisplaynames").is(':checked')) {
793
+		adddisplaynm = 1;
794
+	    }
795
+
796
+	    var datatosave = {
797
+			      userId: userid,
798
+			      messagesperpage: messagesperpageproc,
799
+			      getNotify: getnotify,
800
+			      notificationEmail: notifyemail,
801
+			      getsmsinemail: includesmsinemail,
802
+			      showDisplayNames: showdisplaynm,
803
+                              addDisplayNames: adddisplaynm
804
+	    };
805
+
806
+
807
+	    $.ajax({
808
+	       method: 'PUT',
809
+	       url: baseUrlsaveadm + '/' + userid,
810
+	       contentType: 'application/json',
811
+	       data: JSON.stringify(datatosave),
812
+	       success: function() {
813
+                               OC.msg.startAction('#smsr_save_msg', t('sms_relentless', 'Saved'));
814
+	       },
815
+	       error: function() {
816
+		    showAlert('Error while attempting to save the settings! You can check the Nextcloud log to find more details about this issue.');
817
+	       }
818
+	    });
819
+
820
+     }
821
+  });
822
+
823
+  function showAlert(alertText) {
824
+
825
+     let alertwnd = "<div id='alertMessage'>";
826
+     alertwnd += "<a id='closeAlertWnd' title='Close this window'></a>";
827
+     alertwnd += "<div id='alertTextWrap'>"+ alertText +"</div>";
828
+     alertwnd += "<input type='submit' id='alertOk' value='OK'>";
829
+     alertwnd += "</div>";
830
+
831
+     $("#content").append("<div id='alertMsgOverlay'></div>");
832
+     $("#content").append(alertwnd);
833
+
834
+     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
835
+     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
836
+     $("#alertMessage").css({ "top" : topDist, "left" : leftDist });
837
+
838
+     $("#closeAlertWnd").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
839
+     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
840
+     $("#alertOk").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
841
+  }
842
+
843
+  function confirmAlert(alertText) {
844
+
845
+     $("#alertMsgOverlay").remove();
846
+     $("#alertConfMessage").remove();
847
+
848
+     let alertwndcf = "<div id='alertConfMessage'>";
849
+     alertwndcf += "<a id='closeAlertWndcf' title='Close this window'></a>";
850
+     alertwndcf += "<div id='alertTextWrap'>"+ alertText +"</div>";
851
+     alertwndcf += "<div id='cancelOkWrap'><input type='submit' id='confirmCancel' value='Cancel'>";
852
+     alertwndcf += "<input type='submit' id='confirmOk' value='OK'></div>";
853
+     alertwndcf += "</div>";
854
+
855
+     $("#content").append("<div id='alertMsgOverlay'></div>");
856
+     $("#content").append(alertwndcf);
857
+
858
+     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
859
+     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
860
+     $("#alertConfMessage").css({ "top" : topDist, "left" : leftDist });
861
+
862
+     $("#closeAlertWndcf").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
863
+     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
864
+  }
865
+
866
+});
0 867
new file mode 100644
... ...
@@ -0,0 +1,1435 @@
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\Controller;
27
+
28
+use OCP\AppFramework\ApiController;
29
+use OCP\IRequest;
30
+use OCA\SMSRelentless\Service\SmsrelentlessService;
31
+use OCP\AppFramework\Http\DataResponse;
32
+use OCP\AppFramework\OCSController;
33
+use OCP\IUserSession;
34
+use OCP\IConfig;
35
+use \DateTime;
36
+use OCP\AppFramework\Controller;
37
+use OCP\Files\IAppData;
38
+use OCP\AppFramework\App;
39
+use OCP\Files\NotPermittedException;
40
+use \ReflectionClass;
41
+use OCP\Notification\INotification;
42
+use OCP\Notification\IManager;
43
+use Plivo\RestClient;
44
+use Plivo\Util\signatureValidation;
45
+use OCP\IDBConnection;
46
+use OCP\IUserManager;
47
+
48
+
49
+class AuthorApiController extends ApiController {
50
+
51
+    private $service;
52
+    private $userId;
53
+    private $config;
54
+    private $connection;
55
+    private $userManager;
56
+    private $manager;
57
+
58
+    public function __construct($appName, IRequest $request, SmsrelentlessService $service, $userId, IConfig $config, IDBConnection $connection, IUserManager $userManager, IManager $manager) {
59
+        parent::__construct(
60
+            $appName,
61
+            $request,
62
+            'PUT, POST, GET, DELETE, PATCH',
63
+            'Authorization, Content-Type, Accept',
64
+            1728000);
65
+
66
+        $this->service = $service;
67
+        $this->userId = $userId;
68
+        $this->config = $config;
69
+        $this->connection = $connection;
70
+        $this->userManager = $userManager;
71
+	$this->manager = $manager;
72
+    }
73
+
74
+
75
+    /**
76
+     * @NoAdminRequired
77
+     */
78
+    public function object_to_array($obj) {
79
+       if(is_object($obj)) $obj = (array)$this->dismount($obj);
80
+       if(is_array($obj)) {
81
+          $new = array();
82
+          foreach($obj as $key => $val) {
83
+              $new[$key] = $this->object_to_array($val);
84
+          }
85
+       }
86
+       else $new = $obj;
87
+       return $new;
88
+    }
89
+
90
+
91
+    /**
92
+     * @NoAdminRequired
93
+     */
94
+    public function dismount($object) {
95
+       $reflectionClass = new ReflectionClass(get_class($object));
96
+       $array = array();
97
+       foreach ($reflectionClass->getProperties() as $property) {
98
+          $property->setAccessible(true);
99
+          $array[$property->getName()] = $property->getValue($object);
100
+          $property->setAccessible(false);
101
+       }
102
+       return $array;
103
+    }
104
+
105
+
106
+    /**
107
+     * @NoAdminRequired
108
+     */
109
+    public function verifyHeader($receiveddata, $signature_header, $timestamp, $public_key = '', $tolerance = null ) {
110
+        // Typecast timestamp to int for comparisons
111
+        $timestamp = (int)$timestamp;
112
+
113
+        // Check if timestamp is within tolerance
114
+        if (($tolerance > 0) && (\abs(\time() - $timestamp) > $tolerance)) {
115
+             return false;
116
+        } else {
117
+
118
+            // Convert base64 string to bytes for sodium crypto functions
119
+            $public_key_bytes = base64_decode($public_key);
120
+            $signature_header_bytes = base64_decode($signature_header);
121
+
122
+            // Construct a message to test against the signature header using the timestamp and payload
123
+            $constructed_string = $timestamp . '|' . $receiveddata;
124
+
125
+            if (!\sodium_crypto_sign_verify_detached($signature_header_bytes, $constructed_string, $public_key_bytes)) {
126
+                return false;
127
+            } else {
128
+                return true;
129
+            }
130
+        }
131
+    }
132
+
133
+
134
+    /**
135
+     * @NoAdminRequired
136
+     * @NoCSRFRequired
137
+     * @PublicPage
138
+     */
139
+    public function recdeliveryreptel() {
140
+
141
+       $request = file_get_contents("php://input");
142
+       $recdata = json_decode($request, TRUE);
143
+
144
+       $delsmswebhookurl = $recdata["data"]["payload"]["webhook_url"];
145
+       $ncuserfortelnyxdel = $this->service->getuserbyteldelrwhurl($delsmswebhookurl);
146
+
147
+       if ($ncuserfortelnyxdel != '' && $ncuserfortelnyxdel != null && $ncuserfortelnyxdel != 'undefined') {
148
+
149
+	       $messageid = $recdata["data"]["payload"]["id"];
150
+
151
+	       $network = $recdata["data"]["payload"]["to"][0]["carrier"];
152
+	       $messageprice = $recdata["data"]["payload"]["cost"]["amount"];
153
+	       $deliverystatus = $recdata["data"]["payload"]["to"][0]["status"];
154
+
155
+	       $goterrorinit = $recdata["data"]["payload"]["errors"];
156
+
157
+	       if (!empty($goterrorinit)) {
158
+		   $retrievedtitle = $recdata["data"]["payload"]["errors"][0]["title"];
159
+		   $retrievedcode = $recdata["data"]["payload"]["errors"][0]["code"];
160
+		   $messagestatus = "(Error " . $retrievedcode . ") " . $retrievedtitle;
161
+	       } else {
162
+		   $messagestatus = "Success ! The message has been successfully accepted for delivery.";
163
+	       }
164
+
165
+	       return $this->service->updatedeliverystatustel($ncuserfortelnyxdel, $messageid, $network, $messageprice, $messagestatus, $deliverystatus); 
166
+
167
+       } else { return "access denied"; }
168
+
169
+    }
170
+
171
+
172
+    /**
173
+     * @NoAdminRequired
174
+     * @NoCSRFRequired
175
+     * @PublicPage
176
+     */
177
+    public function recdeliveryrepnex() {
178
+
179
+       $plivodrurl = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
180
+
181
+       $ncuserforplivodel = $this->service->getuserbyplivodelrwhurl($plivodrurl);
182
+
183
+       if ($ncuserforplivodel != '' && $ncuserforplivodel != null && $ncuserforplivodel != 'undefined') {
184
+
185
+	       $networkcode = "";
186
+	       $mStatus = ""; 
187
+
188
+	       if (isset($_REQUEST["MessageUUID"])) { $messageid = $_REQUEST["MessageUUID"]; } else { $messageid = ''; }
189
+	       if (isset($_REQUEST["MCC"]) && isset($_REQUEST["MNC"])) { $networkcode = $_REQUEST["MCC"] . " " . $_REQUEST["MNC"]; } else { $networkcode = ''; }
190
+	       if (isset($_REQUEST["TotalAmount"])) { $messageprice = $_REQUEST["TotalAmount"]; } else { $messageprice = ''; }
191
+	       if (isset($_REQUEST["ErrorCode"]) && $_REQUEST["ErrorCode"] == "") {
192
+                   $mStatus = "Success ! The message has been successfully accepted for delivery.";
193
+               } elseif (isset($_REQUEST["ErrorCode"]) && $_REQUEST["ErrorCode"] != "") {
194
+                   $mStatus = "Error " . $_REQUEST["ErrorCode"]; 
195
+               } else { $mStatus = ''; }
196
+
197
+	       if (isset($_REQUEST["Status"])) { $deliverystatus = $_REQUEST["Status"]; }
198
+
199
+	       return $this->service->updatedeliverystatusnex($ncuserforplivodel, $messageid, $networkcode, $messageprice, $mStatus, $deliverystatus);
200
+
201
+       } else { return "access denied"; }
202
+
203
+    }
204
+
205
+
206
+    /**
207
+     * @NoAdminRequired
208
+     * @NoCSRFRequired
209
+     * @PublicPage
210
+     */
211
+    public function recdeliveryreptwil() {
212
+
213
+       $twildrurl = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
214
+
215
+       $ncuserfortwildel = $this->service->getuserbytwildelrwhurl($twildrurl);
216
+
217
+       if ($ncuserfortwildel != '' && $ncuserfortwildel != null && $ncuserfortwildel != 'undefined') {
218
+
219
+           $messageid = $_REQUEST["SmsSid"];
220
+
221
+           if ($messageid != null) {
222
+
223
+               $credentialstw = $this->service->getapicredentials($ncuserfortwildel);
224
+               $sidtw = $credentialstw[15];
225
+               $tokentw = $credentialstw[16];
226
+               $msdetails = json_decode(file_get_contents("https://".$sidtw.":".$tokentw."@api.twilio.com/2010-04-01/Accounts/".$sidtw."/Messages/".$messageid.".json"));
227
+               $errorMessage = $msdetails->error_message;
228
+               $errorCode = $msdetails->error_code;
229
+               $deliverystatus = $msdetails->status;
230
+
231
+               if ($errorCode == null) { 
232
+                   $mStatus = 'Success ! The message has been successfully accepted for delivery.'; 
233
+               } else { $mStatus = 'Error ' . $errorCode . '. '. ($errorMessage != '') ? 'Message: '. $errorMessage : ''; }
234
+
235
+               $messagepricepre = $msdetails->price;
236
+
237
+               if ($messagepricepre) {
238
+                   $messageprice = str_replace("-", "", $messagepricepre);
239
+               } else { $messageprice = ""; }
240
+
241
+               $networkcode = '';
242
+
243
+	       return $this->service->updatedeliverystatustwil($ncuserfortwildel, $messageid, $networkcode, $messageprice, $mStatus, $deliverystatus);
244
+
245
+           } else { exit(); }
246
+
247
+       } else { exit(); }
248
+
249
+    }
250
+
251
+
252
+    /**
253
+     * @NoAdminRequired
254
+     * @NoCSRFRequired
255
+     * @PublicPage
256
+     */
257
+    public function recdeliveryrepflow() {
258
+
259
+       $flowdrurl = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
260
+
261
+       $ncuserforflowdel = $this->service->getuserbyflowdelrwhurl($flowdrurl);
262
+
263
+       if ($ncuserforflowdel != '' && $ncuserforflowdel != null && $ncuserforflowdel != 'undefined') {
264
+
265
+           $receivereq = file_get_contents('php://input');
266
+           $recmdec = json_decode($receivereq, true);
267
+           $recmsid = $recmdec['data']['id'];
268
+
269
+           $smsapicredfl = $this->service->getapicredentials($ncuserforflowdel);
270
+           $flowapikey = $smsapicredfl[20];
271
+           $flowapisecret = $smsapicredfl[21];
272
+
273
+           $getmsdetails = json_decode(file_get_contents("https://".$flowapikey.":".$flowapisecret."@api.flowroute.com/v2.1/messages/".$recmsid.""), true);
274
+           $messagepriceflinit = $getmsdetails['data']['attributes']['amount_display'];
275
+           $messagepricefl = str_replace("$", "", $messagepriceflinit);
276
+
277
+           $mdeliveryflinit = $getmsdetails['data']['attributes']['delivery_receipts'][0]['status'];
278
+
279
+           if ($mdeliveryflinit != 'message buffered') {
280
+               if ($mdeliveryflinit == 'Ok') {
281
+                   $messagedeliveryfl = "Issues";
282
+               } else { $messagedeliveryfl = $mdeliveryflinit; }
283
+           } else { $messagedeliveryfl = 'delivered'; }
284
+
285
+           $messagestatuscode = $getmsdetails['data']['attributes']['delivery_receipts'][0]['status_code'];
286
+           $messagestatusdescr = $getmsdetails['data']['attributes']['delivery_receipts'][0]['status_code_description'];
287
+
288
+           if ($messagestatuscode != '') { 
289
+               $messagestatusfl = (($messagestatusdescr != '') ? $messagestatusdescr . ". " : "") . "Status code: " . $messagestatuscode; 
290
+           } else { $messagestatusfl = "There were issues with message delivery."; }
291
+
292
+           $networkcodefl = '';
293
+
294
+           return $this->service->updatedeliverystatusflow($ncuserforflowdel, $recmsid, $networkcodefl, $messagepricefl,  $messagestatusfl, $messagedeliveryfl);
295
+
296
+       } else { return "access denied"; }
297
+
298
+    }
299
+
300
+
301
+    /**
302
+     * @NoAdminRequired
303
+     * @NoCSRFRequired
304
+     * @PublicPage
305
+     */
306
+    public function receivesmstel() {
307
+
308
+       $signature = $_SERVER['HTTP_TELNYX_SIGNATURE_ED25519'];
309
+       $timestamp = $_SERVER['HTTP_TELNYX_TIMESTAMP'];
310
+
311
+       $receivereq = file_get_contents('php://input');
312
+
313
+       $recmesdata = json_decode($receivereq, TRUE);
314
+
315
+       $recsmswebhookurl = $recmesdata["data"]["payload"]["webhook_url"];
316
+
317
+       $ncuserfortelnyx = $this->service->getuserbytelrecwhurl($recsmswebhookurl);
318
+
319
+       $txcredentials = $this->service->getapicredentials($ncuserfortelnyx);
320
+
321
+       $telpubkey = $txcredentials[1];
322
+       $telnyxkey = $txcredentials[0];
323
+       $teldelrecurl = $txcredentials[3];
324
+       $messagingprofid = $txcredentials[4];
325
+
326
+       // Verify message signature
327
+       $signatureverify = $this->verifyHeader($receivereq, $signature, $timestamp, $telpubkey, $tolerance = 30);
328
+
329
+       if ($signatureverify) {
330
+
331
+          if ($ncuserfortelnyx != '' && $ncuserfortelnyx != null && $ncuserfortelnyx != 'undefined') {
332
+
333
+	       $messageid = $recmesdata["data"]["payload"]["id"];
334
+
335
+	       $messagedate = date("Y-m-d H:i:s");
336
+
337
+	       $messagefrom = $recmesdata["data"]["payload"]["from"]["phone_number"];
338
+
339
+	       $messageto = "Telnyx: " . $recmesdata["data"]["payload"]["to"][0]["phone_number"];
340
+
341
+               $messagetopr = $recmesdata["data"]["payload"]["to"][0]["phone_number"];
342
+
343
+               $messagetoprtx = "Tx: " . $messagetopr;
344
+
345
+               // Check if the message is a MMS
346
+               if ($recmesdata["data"]["payload"]['type'] == 'MMS') {
347
+
348
+                   $includedFilestx = '';
349
+
350
+                   foreach ($recmesdata["data"]["payload"]['media'] as $telkey => $telvalue) {
351
+                        if (is_array($telvalue)) {
352
+                            foreach ($telvalue as $telkeysec => $telvaluesec) {
353
+                                if ($telkeysec == "url") {
354
+                                    $includedFilestx .= "<div id='mmsTblUrl-" . mt_rand(1, 10000) . "' class='mmstblUrls' title='Download this file only if you trust the sender and the domain of the URL.'>" . $telvaluesec . "</div><br><br>";
355
+                                }
356
+                            }
357
+                        }
358
+                   }
359
+
360
+                   $messagetexttel = $recmesdata["data"]["payload"]["text"] . "<br><br><br></b>--- The files included in the MMS follow. Download them only if you trust the sender and the domain of the URLs ---<br><br><br>" . $includedFilestx;
361
+                   $ismmstel = 1;
362
+               } else {
363
+                   $messagetexttel = $recmesdata["data"]["payload"]["text"];
364
+                   $ismmstel = 0;
365
+               }
366
+
367
+	       $recmessagearr = [$messageid, $messagedate, $messagefrom, $messageto, $messagetexttel];
368
+
369
+	       $this->service->insertrecsms($ncuserfortelnyx, $recmessagearr);
370
+
371
+
372
+               // Check if there is any auto-reply configured for the receiving number
373
+	       $telgetarpl = $this->connection->prepare('SELECT `phone_number`, `days_of_week`, `daily_start`, `daily_end`, `vacation_start`, `vacation_end`, `message_text` FROM 
374
+                                                        `*PREFIX*sms_relent_autorply` WHERE `phone_number` = ?');
375
+	       $telgetarplres = $telgetarpl->execute([$messagetoprtx]);
376
+	       $telarpldata = $telgetarplres->fetch();
377
+	       $telgetarplres->closeCursor();
378
+
379
+               if ($telarpldata) {
380
+
381
+                   $autoreplytext = $telarpldata['message_text'];
382
+
383
+                   // Get the Display Name of the current user
384
+                   $crtuser = $this->userManager->get($ncuserfortelnyx);
385
+                   $displaynm = $crtuser->getDisplayName();
386
+
387
+                   // Check if the auto-reply is in 'daily mode'
388
+                   if ($telarpldata['days_of_week']) {
389
+
390
+                       // Check if the auto-reply should be sent 
391
+                       $daysofweekarrinit = explode(",", $telarpldata['days_of_week']);
392
+
393
+                       $daysofweekarr = [];
394
+                       $fulldays = [];
395
+                       foreach ($daysofweekarrinit as $crtday) {
396
+                           if (strpos($crtday, "full") !== false) {
397
+                               $fulldays[] = $crtday;
398
+                           } else {
399
+                               $daysofweekarr[] = $crtday;
400
+                           }
401
+                       }
402
+
403
+                       $dailystart = $telarpldata['daily_start'];
404
+                       $dailyend = $telarpldata['daily_end'];
405
+
406
+                       $crntdate = date("Y-m-d");
407
+                       $crntDayNumber = date('N', strtotime($crntdate));
408
+
409
+                       if (in_array($crntDayNumber, $daysofweekarr)) {
410
+
411
+                           $crntimehrmin = date("H:i");
412
+                           $crntdatefmt = new DateTime($crntimehrmin);
413
+                           $startdatefmt = new DateTime($dailystart);
414
+                           $enddatefmt = new DateTime($dailyend);
415
+
416
+                           if ($crntdatefmt >= $startdatefmt && $enddatefmt > $crntdatefmt) {
417
+                               // OK
418
+                           } else {
419
+
420
+	                       // Send the auto-reply
421
+		               \Telnyx\Telnyx::setApiKey($telnyxkey);
422
+		               $messagedate = date("Y-m-d H:i:s");
423
+		               $message = \Telnyx\Message::Create(["from" => $messagetopr, "to" => $messagefrom, "text" => $autoreplytext, "webhook_url" => $teldelrecurl]);
424
+
425
+		               // Insert the sent SMS in the 'sms_relent_sent' table
426
+		               $messageid = $message['id'];
427
+		               $messagefromtx = "Telnyx: " . $messagetopr;
428
+		               $messagetotx = $messagefrom;
429
+		               $messagenetwork = null;
430
+		               $messageprice = null;
431
+		               $messagestatus = $message['to'][0]['status'];
432
+		               $messagedelivery = null;
433
+
434
+		               $sentmessagearr = [$messageid, $messagedate, $messagefromtx, $messagetotx, $messagenetwork, $messageprice, $messagestatus, $messagedelivery, $autoreplytext];
435
+
436
+		               $this->service->insertsentsms($ncuserfortelnyx, $displaynm, $sentmessagearr);
437
+                           }
438
+                       }
439
+
440
+                       if (in_array($crntDayNumber . "(full)", $fulldays)) {
441
+
442
+	                       // Send the auto-reply
443
+		               \Telnyx\Telnyx::setApiKey($telnyxkey);
444
+		               $messagedate = date("Y-m-d H:i:s");
445
+		               $message = \Telnyx\Message::Create(["from" => $messagetopr, "to" => $messagefrom, "text" => $autoreplytext, "webhook_url" => $teldelrecurl]);
446
+
447
+		               // Insert the sent SMS in the 'sms_relent_sent' table
448
+		               $messageid = $message['id'];
449
+		               $messagefromtx = "Telnyx: " . $messagetopr;
450
+		               $messagetotx = $messagefrom;
451
+		               $messagenetwork = null;
452
+		               $messageprice = null;
453
+		               $messagestatus = $message['to'][0]['status'];
454
+		               $messagedelivery = null;
455
+
456
+		               $sentmessagearr = [$messageid, $messagedate, $messagefromtx, $messagetotx, $messagenetwork, $messageprice, $messagestatus, $messagedelivery, $autoreplytext];
457
+
458
+		               $this->service->insertsentsms($ncuserfortelnyx, $displaynm, $sentmessagearr);
459
+                       }
460
+
461
+                   } elseif ($telarpldata['vacation_start'] && $telarpldata['vacation_end']) {
462
+
463
+                             $vacationstart = $telarpldata['vacation_start'];
464
+                             $vacationend = $telarpldata['vacation_end'];
465
+
466
+                             $crntimeymd = date("Y-m-d H:i:s");
467
+                             $crntdatevcfmt = new DateTime($crntimeymd);
468
+                             $startdatevcfmt = new DateTime($vacationstart);
469
+                             $enddatefvcmt = new DateTime($vacationend);
470
+
471
+                             if ($startdatevcfmt <= $crntdatevcfmt && $crntdatevcfmt <= $enddatefvcmt) {
472
+
473
+			         // Send the auto-reply
474
+			         \Telnyx\Telnyx::setApiKey($telnyxkey);
475
+			         $messagedate = date("Y-m-d H:i:s");
476
+			         $message = \Telnyx\Message::Create(["from" => $messagetopr, "to" => $messagefrom, "text" => $autoreplytext, "webhook_url" => $teldelrecurl]);
477
+
478
+			         // Insert the sent SMS in the 'sms_relent_sent' table
479
+			         $messageid = $message['id'];
480
+			         $messagefromtx = "Telnyx: " . $messagetopr;
481
+			         $messagetotx = $messagefrom;
482
+			         $messagenetwork = null;
483
+			         $messageprice = null;
484
+			         $messagestatus = $message['to'][0]['status'];
485
+			         $messagedelivery = null;
486
+
487
+			         $sentmessagearr = [$messageid, $messagedate, $messagefromtx, $messagetotx, $messagenetwork, $messageprice, $messagestatus, $messagedelivery, $autoreplytext];
488
+
489
+			         $this->service->insertsentsms($ncuserfortelnyx, $displaynm, $sentmessagearr);
490
+                           }
491
+
492
+                   }
493
+               }
494
+
495
+
496
+	       // Send notifications
497
+               $nameofhost = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'];
498
+
499
+	       $telsmsapicred = $this->service->getapicredentials($ncuserfortelnyx);
500
+	       $telnotify = $telsmsapicred[12];
501
+	       $emailaddress = $telsmsapicred[13];
502
+	       $includemessageinemail = $telsmsapicred[14];
503
+
504
+               if ($ismmstel == 0) { $smsormmstel = "SMS"; } else { $smsormmstel = "MMS"; }
505
+
506
+	       if ($telnotify != 0 ) {
507
+
508
+                   $allalloweduserstx = $this->service->getallowedusers($ncuserfortelnyx);
509
+
510
+                   foreach ($allalloweduserstx as $alusrkeytx => $specusrnametx) {
511
+
512
+		            $notificationtx = $this->manager->createNotification();
513
+		            $notificationtx->setApp('sms_relentless')
514
+			          ->setUser($specusrnametx)
515
+			          ->setDateTime(new \DateTime())
516
+			          ->setObject('sms_relentless', '11')
517
+			          ->setSubject('New SMS Message');
518
+		            $this->manager->notify($notificationtx);
519
+                   }
520
+	       }
521
+
522
+	       if ($emailaddress != '') {
523
+
524
+		   $gmtind = "UTC " . date('P');
525
+		   $smsdateinit = date("Y-m-d  H:i:s");
526
+		   $smsdate = $smsdateinit . " " . $gmtind;
527
+
528
+		   $subject = "New ". $smsormmstel ." message received";
529
+
530
+                   $messagetextnltel = str_replace("\n", "<br>", $messagetexttel);
531
+
532
+		   if ($includemessageinemail == 0) {
533
+		       $message = "Hello, <br><br> You have received a new message on ".$smsdate." .<br> You can check the new message by going to 'SMS Relentless' > 'Received SMS Messages'. <br><br> Yours, <br> SMS Relentless <br> An SMS application for Nextcloud <br> Host: '" . $nameofhost . "' <br>";
534
+		   } else {
535
+		       $message = "Hello, <br><br> You have received a new message on ".$smsdate." :<br><br><br> Message ID: ".$messageid." <br> Message Date: ".$messagedate." <br> From: ".$messagefrom." <br> To: ".$messageto."<br> Message Text: <br><br><b>".$messagetextnltel."</b><br>____________<br><br> Yours, <br> SMS Relentless <br> An SMS application for Nextcloud <br> Host: '".$nameofhost."' <br>";
536
+		   }
537
+
538
+                   $messagefin = chunk_split(base64_encode($message));
539
+
540
+		   $headers = "MIME-Version: 1.0" . "\r\n";
541
+		   $headers .= "Content-type: text/html; charset=UTF-8" . "\r\n";
542
+                   $headers .= "Content-Transfer-Encoding: base64" . "\r\n";
543
+
544
+		   // Set the email sender
545
+		   $headers .= "From: " . $emailaddress . "\r\n";
546
+		   $headers .= "Reply-To: " . $emailaddress . "\r\n";
547
+
548
+		   mail($emailaddress, $subject, $messagefin, $headers);
549
+	       }
550
+
551
+	       return http_response_code(200);
552
+
553
+          } else { return "access denied"; }
554
+
555
+       } else { return "access denied"; }
556
+    }
557
+
558
+
559
+    /**
560
+     * @NoAdminRequired
561
+     * @NoCSRFRequired
562
+     * @PublicPage
563
+     */
564
+    public function receivesmsnex() {
565
+
566
+       $plivosignature = $_SERVER['HTTP_X_PLIVO_SIGNATURE_V2'];
567
+       $plivononce = $_SERVER["HTTP_X_PLIVO_SIGNATURE_V2_NONCE"];
568
+
569
+       $plivorecurl = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
570
+
571
+       $ncuserforplivo = $this->service->getuserbyplivorecwhurl($plivorecurl);
572
+
573
+       $smsapicred = $this->service->getapicredentials($ncuserforplivo);
574
+
575
+       $plivoapikey = $smsapicred[5];
576
+       $plivoauthtoken = $smsapicred[6];
577
+       $plivowhdelrcpt = $smsapicred[8];
578
+
579
+       $baseplivourlinit = explode("?", $plivorecurl);  
580
+       $baseplivoURI = $baseplivourlinit[0];
581
+
582
+       // Verify message signature
583
+       $SigValidation = new signatureValidation();
584
+       $signverify = $SigValidation->validateSignature($baseplivoURI, $plivononce, $plivosignature, $plivoauthtoken);
585
+
586
+       if ($signverify) {
587
+
588
+              if ($ncuserforplivo != '' && $ncuserforplivo != null && $ncuserforplivo != 'undefined') {
589
+
590
+	          $messageid = $_REQUEST["MessageUUID"];
591
+
592
+	          $messagedate = date("Y-m-d H:i:s");
593
+
594
+	          $messagefrom = "+" . $_REQUEST['From'];
595
+	          $messageto = "Plivo: +" . $_REQUEST['To'];
596
+	          $messagetoprpl = "Pl: +" . $_REQUEST['To'];
597
+                  $messagetoplsp = "+" . $_REQUEST['To'];
598
+
599
+                  // Check if the message is a MMS
600
+                  if ($_REQUEST['Type'] == 'mms') {
601
+
602
+                      $includedFilespl = '';
603
+                      foreach ($_REQUEST as $plkey => $plvalue) {
604
+
605
+			   if (strpos($plkey, "Media") !== false && $plkey != "MediaCount") {
606
+                               $includedFilespl .= "<div id='mmsTblUrl-" . mt_rand(1, 10000) . "' class='mmstblUrls' title='Download this file only if you trust the sender and the domain of the URL.'>" . $plvalue . "</div><br><br>";
607
+			   }
608
+                      }
609
+
610
+                      $messagetextpl = $_REQUEST['Body'] . "<br><br><br></b>--- The files included in the MMS follow. Download them only if you trust the sender and the domain of the URLs ---<br><br><br>" . $includedFilespl;
611
+                      $ismmspl = 1;
612
+                  } else {
613
+                      $messagetextpl = $_REQUEST['Text'];
614
+                      $ismmspl = 0;
615
+                  }
616
+
617
+	          $recmessagearr = [$messageid, $messagedate, $messagefrom, $messageto, $messagetextpl];
618
+
619
+                  $this->service->insertrecsms($ncuserforplivo, $recmessagearr);
620
+
621
+
622
+                  // Check if there is any auto-reply configured for the receiving number
623
+	          $plgetarpl = $this->connection->prepare('SELECT `phone_number`, `days_of_week`, `daily_start`, `daily_end`, `vacation_start`, `vacation_end`, `message_text` FROM 
624
+                                                          `*PREFIX*sms_relent_autorply` WHERE `phone_number` = ?');
625
+	          $plgetarplres = $plgetarpl->execute([$messagetoprpl]);
626
+	          $plarpldata = $plgetarplres->fetch();
627
+	          $plgetarplres->closeCursor();
628
+
629
+                  if ($plarpldata) {
630
+
631
+                      $autoreplytext = $plarpldata['message_text'];
632
+
633
+                      // Get the Display Name of the current user
634
+                      $crtuser = $this->userManager->get($ncuserforplivo);
635
+                      $displaynm = $crtuser->getDisplayName();
636
+
637
+                      // Check if the auto-reply is in 'daily mode'
638
+                      if ($plarpldata['days_of_week']) {
639
+
640
+                          // Check if the auto-reply should be sent 
641
+                          $daysofweekarrinit = explode(",", $plarpldata['days_of_week']);
642
+
643
+                          $daysofweekarr = [];
644
+                          $fulldays = [];
645
+                          foreach ($daysofweekarrinit as $crtday) {
646
+                              if (strpos($crtday, "full") !== false) {
647
+                                  $fulldays[] = $crtday;
648
+                              } else {
649
+                                  $daysofweekarr[] = $crtday;
650
+                              }
651
+                          }
652
+
653
+                          $dailystart = $plarpldata['daily_start'];
654
+                          $dailyend = $plarpldata['daily_end'];
655
+
656
+                          $crntdate = date("Y-m-d");
657
+                          $crntDayNumber = date('N', strtotime($crntdate));
658
+
659
+                          if (in_array($crntDayNumber, $daysofweekarr)) {
660
+
661
+                              $crntimehrmin = date("H:i");
662
+                              $crntdatefmt = new DateTime($crntimehrmin);
663
+                              $startdatefmt = new DateTime($dailystart);
664
+                              $enddatefmt = new DateTime($dailyend);
665
+
666
+                              if ($crntdatefmt >= $startdatefmt && $enddatefmt > $crntdatefmt) {
667
+                                  // OK
668
+                              } else {
669
+
670
+                                  // Send the auto-reply
671
+		                  $client = new RestClient($plivoapikey, $plivoauthtoken);
672
+                                  $messagedatepl = date("Y-m-d H:i:s");
673
+		                  $response = $client->messages->create($messagetoplsp,[$messagefrom],$autoreplytext,["url" => $plivowhdelrcpt]);
674
+			          $messageidinit = $response->getmessageUuid(0);
675
+		                  $messageid = $messageidinit[0];
676
+
677
+		                  if (property_exists($response, 'error')) { 
678
+		                      $messagestatus = "Error: " . $response->error;
679
+		                  } else { $messagestatus = 'The message has been accepted for delivery.'; }
680
+
681
+                                  $messagefrompl = $messageto;
682
+			          $messagetopl = $messagefrom;
683
+			          $messagenetwork = '';
684
+			          $messageprice = '';
685
+
686
+			          $messagedelivery = '';
687
+
688
+			          $sentmessagearr = [$messageid, $messagedatepl, $messagefrompl, $messagetopl, $messagenetwork, $messageprice, $messagestatus, $messagedelivery, $autoreplytext];
689
+
690
+			          $this->service->insertsentsms($ncuserforplivo, $displaynm, $sentmessagearr);
691
+                              }
692
+                          }
693
+
694
+                          if (in_array($crntDayNumber, $fulldays)) {
695
+
696
+                                  // Send the auto-reply
697
+		                  $client = new RestClient($plivoapikey, $plivoauthtoken);
698
+                                  $messagedatepl = date("Y-m-d H:i:s");
699
+		                  $response = $client->messages->create($messagetoplsp,[$messagefrom],$autoreplytext,["url" => $plivowhdelrcpt]);
700
+			          $messageidinit = $response->getmessageUuid(0);
701
+		                  $messageid = $messageidinit[0];
702
+
703
+		                  if (property_exists($response, 'error')) { 
704
+		                      $messagestatus = "Error: " . $response->error;
705
+		                  } else { $messagestatus = 'The message has been accepted for delivery.'; }
706
+
707
+                                  $messagefrompl = $messageto;
708
+			          $messagetopl = $messagefrom;
709
+			          $messagenetwork = '';
710
+			          $messageprice = '';
711
+
712
+			          $messagedelivery = '';
713
+
714
+			          $sentmessagearr = [$messageid, $messagedatepl, $messagefrompl, $messagetopl, $messagenetwork, $messageprice, $messagestatus, $messagedelivery, $autoreplytext];
715
+
716
+			          $this->service->insertsentsms($ncuserforplivo, $displaynm, $sentmessagearr);
717
+                          }
718
+
719
+                      } elseif ($plarpldata['vacation_start'] && $plarpldata['vacation_end']) {
720
+
721
+                             $vacationstart = $plarpldata['vacation_start'];
722
+                             $vacationend = $plarpldata['vacation_end'];
723
+
724
+                             $crntimeymd = date("Y-m-d H:i:s");
725
+                             $crntdatevcfmt = new DateTime($crntimeymd);
726
+                             $startdatevcfmt = new DateTime($vacationstart);
727
+                             $enddatefvcmt = new DateTime($vacationend);
728
+
729
+                             if ($startdatevcfmt <= $crntdatevcfmt && $crntdatevcfmt <= $enddatefvcmt) {
730
+
731
+		                 $client = new RestClient($plivoapikey, $plivoauthtoken);
732
+                                 $messagedatepl = date("Y-m-d H:i:s");
733
+		                 $response = $client->messages->create($messagetoplsp,[$messagefrom],$autoreplytext,["url" => $plivowhdelrcpt]);
734
+
735
+			         $messageidinit = $response->getmessageUuid(0);
736
+		                 $messageid = $messageidinit[0];
737
+
738
+		                 if (property_exists($response, 'error')) { 
739
+		                     $messagestatus = "Error: " . $response->error;
740
+		                 } else { $messagestatus = 'The message has been accepted for delivery.'; }
741
+
742
+                                 $messagefrompl = $messageto;
743
+			         $messagetopl = $messagefrom;
744
+			         $messagenetwork = '';
745
+			         $messageprice = '';
746
+
747
+			         $messagedelivery = '';
748
+
749
+			         $sentmessagearr = [$messageid, $messagedatepl, $messagefrompl, $messagetopl, $messagenetwork, $messageprice, $messagestatus, $messagedelivery, $autoreplytext];
750
+
751
+			         $this->service->insertsentsms($ncuserforplivo, $displaynm, $sentmessagearr);
752
+                             }
753
+
754
+                      }
755
+                  }
756
+
757
+
758
+	          // Send notifications
759
+                  $nameofhost = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'];
760
+
761
+	          $nextnotify = $smsapicred[12];
762
+	          $emailaddress = $smsapicred[13];
763
+	          $includemessageinemail = $smsapicred[14];
764
+
765
+                  if ($ismmspl == 0) { $smsormmspl = "SMS"; } else { $smsormmspl = "MMS"; }
766
+
767
+	          if ($nextnotify != 0 ) {
768
+
769
+                      $allalloweduserspl = $this->service->getallowedusers($ncuserforplivo);
770
+
771
+                      foreach ($allalloweduserspl as $alusrkeypl => $specusrnamepl) {
772
+
773
+		               $notificationpl = $this->manager->createNotification();
774
+		               $notificationpl->setApp('sms_relentless')
775
+			                      ->setUser($specusrnamepl)
776
+			                      ->setDateTime(new \DateTime())
777
+			                      ->setObject('sms_relentless', '11')
778
+			                      ->setSubject('New SMS Message');
779
+		               $this->manager->notify($notificationpl);
780
+                      }
781
+	          }
782
+
783
+	          if ($emailaddress != '') {
784
+
785
+		      $gmtind = "UTC " . date('P');
786
+		      $smsdateinit = date("Y-m-d  H:i:s");
787
+		      $smsdate = $smsdateinit . " " . $gmtind;
788
+
789
+		      $subject = "New ". $smsormmspl ." message received";
790
+
791
+                      $messagetextnlpl = str_replace("\n", "<br>", $messagetextpl);
792
+
793
+		      if ($includemessageinemail == 0) {
794
+		          $message = "Hello, <br><br> You have received a new message on ".$smsdate." .<br> You can check the new message by going to 'SMS Relentless' > 'Received SMS Messages'. <br><br> Yours, <br> SMS Relentless <br> An SMS application for Nextcloud <br> Host: '".$nameofhost."' <br>";
795
+		      } else {
796
+		          $message = "Hello, <br><br> You have received a new message on ".$smsdate." :<br><br><br> Message ID: ".$messageid." <br> Message Date: ".$messagedate." <br> From: ".$messagefrom." <br> To: ".$messageto."<br> Message Text: <br><br><b>".$messagetextnlpl."</b><br>____________<br><br> Yours, <br> SMS Relentless <br> An SMS application for Nextcloud <br> Host: '".$nameofhost."' <br>";
797
+		      }
798
+
799
+                      $messagefin = chunk_split(base64_encode($message));
800
+
801
+		      $headers = "MIME-Version: 1.0" . "\r\n";
802
+		      $headers .= "Content-type: text/html; charset=UTF-8" . "\r\n";
803
+                      $headers .= "Content-Transfer-Encoding: base64" . "\r\n";
804
+
805
+		      // Set the email sender
806
+		      $headers .= "From: " . $emailaddress . "\r\n";
807
+		      $headers .= "Reply-To: " . $emailaddress . "\r\n";
808
+
809
+		      mail($emailaddress, $subject, $messagefin, $headers);
810
+	          }
811
+
812
+	          return http_response_code(200);
813
+
814
+              } else { return "access denied"; }
815
+
816
+       } else { return "access denied"; }
817
+    }
818
+
819
+
820
+    /**
821
+     * @NoAdminRequired
822
+     * @NoCSRFRequired
823
+     * @PublicPage
824
+     */
825
+    public function receivesmstwil() {
826
+
827
+       $twilsig = $_SERVER['HTTP_X_TWILIO_SIGNATURE'];
828
+
829
+       $basepath = $this->config->getSystemValue('overwrite.cli.url');
830
+       $twilrecprm = $_GET["twilrecparam"];
831
+       $twilrecurl = $basepath . "/apps/sms_relentless/api/recsmstwil?twilrecparam=" . $twilrecprm;
832
+
833
+       $ncuserfortwil = $this->service->getuserbytwilrecwhurl($twilrecurl);
834
+
835
+       $smsapicred = $this->service->getapicredentials($ncuserfortwil);
836
+       $apikeyTw = $smsapicred[15];
837
+       $authTokenTw = $smsapicred[16];
838
+       $apidelrecurltw = $smsapicred[18];
839
+
840
+       $postVars = $_POST;
841
+       ksort($postVars);
842
+
843
+       $compurlpart = '';
844
+
845
+       foreach ($postVars as $twilkey => $twilvalue) {
846
+                $compurlpart .= $twilkey . $twilvalue;
847
+       }
848
+
849
+       $compURL1 = $basepath . "/apps/sms_relentless/api/recsmstwil?twilrecparam=" . $twilrecprm . $compurlpart;
850
+       $compURL2 = $basepath . "/apps/sms_relentless/api/recsmstwil?twilrecparam=" . $twilrecprm . "&twilrecparam=" . $twilrecprm . $compurlpart;
851
+       $computedsig1 = base64_encode(hash_hmac('sha1', $compURL1, $authTokenTw, true));
852
+       $computedsig2 = base64_encode(hash_hmac('sha1', $compURL2, $authTokenTw, true));
853
+
854
+       // Verify message signature
855
+       if (strcmp($computedsig1, $twilsig) == 0 || strcmp($computedsig2, $twilsig) == 0) {
856
+
857
+           if ($ncuserfortwil) {
858
+
859
+	       $messageid = $_POST['MessageSid'];
860
+
861
+	       $messagedate = date("Y-m-d H:i:s");
862
+
863
+	       $messagefrom = $_POST['From'];
864
+
865
+	       $messageto = "Twilio: " . $_POST['To'];
866
+
867
+	       $messagetoprtw = $_POST['To'];
868
+
869
+	       $messagetotwls = "Tw: " . $_POST['To'];
870
+
871
+               // Check if the new message is a MMS
872
+               if ($_POST['NumMedia'] != 0) {
873
+
874
+                   $includedFilestw = '';
875
+                   foreach ($_POST as $twkey => $twvalue) {
876
+
877
+			if (strpos($twkey, "MediaUrl") !== false) {
878
+
879
+                            $includedFilestw .= "<div id='mmsTblUrl-" . mt_rand(1, 10000) . "' class='mmstblUrls' title='Download this file only if you trust the sender and the domain of the URL.'>" . $twvalue . "</div><br><br>";
880
+			}
881
+                   }
882
+                   $messagetexttw = $_POST['Body'] . "<br><br><br></b>--- The files included in the MMS follow. Download them only if you trust the sender and the domain of the URLs ---<br><br><br>" . $includedFilestw;
883
+                   $ismmstw = 1;
884
+
885
+               } else {
886
+                   $messagetexttw = $_POST['Body'];
887
+                   $ismmstw = 0;
888
+               }
889
+
890
+	       $recmessagearr = [$messageid, $messagedate, $messagefrom, $messageto, $messagetexttw];
891
+
892
+	       $this->service->insertrecsms($ncuserfortwil, $recmessagearr);
893
+
894
+
895
+               // Check if there is any auto-reply configured for the receiving number
896
+	       $twilgetarpl = $this->connection->prepare('SELECT `phone_number`, `days_of_week`, `daily_start`, `daily_end`, `vacation_start`, `vacation_end`, `message_text` FROM 
897
+                                                         `*PREFIX*sms_relent_autorply` WHERE `phone_number` = ?');
898
+	       $twilgetarplres = $twilgetarpl->execute([$messagetotwls]);
899
+	       $twilarpldata = $twilgetarplres->fetch();
900
+	       $twilgetarplres->closeCursor();
901
+
902
+               if ($twilarpldata) {
903
+
904
+                   $autoreplytext = $twilarpldata['message_text'];
905
+
906
+                   // Get the Display Name of the current user
907
+                   $crtuser = $this->userManager->get($ncuserfortwil);
908
+                   $displaynm = $crtuser->getDisplayName();
909
+
910
+                   // Check if the auto-reply is in 'daily mode'
911
+                   if ($twilarpldata['days_of_week']) {
912
+
913
+                       // Check if the auto-reply should be sent 
914
+                       $daysofweekarrinit = explode(",", $twilarpldata['days_of_week']);
915
+
916
+                       $daysofweekarr = [];
917
+                       $fulldays = [];
918
+                       foreach ($daysofweekarrinit as $crtday) {
919
+                           if (strpos($crtday, "full") !== false) {
920
+                               $fulldays[] = str_replace("(full)", "", $crtday);
921
+                           } else {
922
+                               $daysofweekarr[] = $crtday;
923
+                           }
924
+                       }
925
+
926
+                       $dailystart = $twilarpldata['daily_start'];
927
+                       $dailyend = $twilarpldata['daily_end'];
928
+
929
+                       $crntdate = date("Y-m-d");
930
+                       $crntDayNumber = date('N', strtotime($crntdate));
931
+
932
+                       if (in_array($crntDayNumber, $daysofweekarr)) {
933
+
934
+                           $crntimehrmin = date("H:i");
935
+                           $crntdatefmt = new DateTime($crntimehrmin);
936
+                           $startdatefmt = new DateTime($dailystart);
937
+                           $enddatefmt = new DateTime($dailyend);
938
+
939
+                           if ($crntdatefmt >= $startdatefmt && $enddatefmt > $crntdatefmt) {
940
+                               // OK
941
+                           } else {
942
+
943
+			       $datatoposttw = [["To" => $messagefrom, "From" => $messagetoprtw, "Body" => $autoreplytext, "StatusCallback" => $apidelrecurltw]];
944
+
945
+			       $postedsendingfl = implode('&', array_map('http_build_query', $datatoposttw));
946
+			       $messagedatetw = date("Y-m-d H:i:s");
947
+
948
+			       $chtw = curl_init();
949
+			       curl_setopt($chtw, CURLOPT_URL, 'https://api.twilio.com/2010-04-01/Accounts/' . $apikeyTw . '/Messages.json');
950
+			       curl_setopt($chtw, CURLOPT_TIMEOUT, 300);
951
+			       curl_setopt($chtw, CURLOPT_RETURNTRANSFER, 1);
952
+			       curl_setopt($chtw, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
953
+			       curl_setopt($chtw, CURLOPT_USERPWD, "$apikeyTw:$authTokenTw");
954
+			       curl_setopt($chtw, CURLOPT_POST, 1);
955
+			       curl_setopt($chtw, CURLOPT_POSTFIELDS, $postedsendingfl);
956
+
957
+			       $resulttw = curl_exec ($chtw);
958
+			       $statusCodetw = curl_getinfo($chtw, CURLINFO_HTTP_CODE);
959
+			       curl_close ($chtw);
960
+
961
+			       $decresulttw = json_decode($resulttw);
962
+
963
+			       if ($resulttw) {
964
+				   $messageidtw = $decresulttw->sid;
965
+			       } else { $messageidtw = ''; }
966
+
967
+			       if (in_array($statusCodetw, [200, 201, 202, 203, 204, 205, 206])) {
968
+				   $messagestatustw = 'The message has been accepted for delivery.';
969
+			       } else {
970
+				   $messagestatustw = 'An error occurred while trying to send the message.';
971
+			       }
972
+
973
+			       $messagenetworktw = '';
974
+			       $messagepricetw = '';
975
+			       $messagedeliverytw = '';
976
+
977
+			       $sentmessagearr = [$messageidtw, $messagedatetw, $messageto, $messagefrom, $messagenetworktw, $messagepricetw, $messagestatustw, $messagedeliverytw, $autoreplytext];
978
+
979
+			       $this->service->insertsentsms($ncuserfortwil, $displaynm, $sentmessagearr);
980
+                           }
981
+                       }
982
+
983
+                       if (in_array($crntDayNumber, $fulldays)) {
984
+
985
+			       $datatoposttw = [["To" => $messagefrom, "From" => $messagetoprtw, "Body" => $autoreplytext, "StatusCallback" => $apidelrecurltw]];
986
+
987
+			       $postedsendingfl = implode('&', array_map('http_build_query', $datatoposttw));
988
+			       $messagedatetw = date("Y-m-d H:i:s");
989
+
990
+			       $chtw = curl_init();
991
+			       curl_setopt($chtw, CURLOPT_URL, 'https://api.twilio.com/2010-04-01/Accounts/' . $apikeyTw . '/Messages.json');
992
+			       curl_setopt($chtw, CURLOPT_TIMEOUT, 300);
993
+			       curl_setopt($chtw, CURLOPT_RETURNTRANSFER, 1);
994
+			       curl_setopt($chtw, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
995
+			       curl_setopt($chtw, CURLOPT_USERPWD, "$apikeyTw:$authTokenTw");
996
+			       curl_setopt($chtw, CURLOPT_POST, 1);
997
+			       curl_setopt($chtw, CURLOPT_POSTFIELDS, $postedsendingfl);
998
+
999
+			       $resulttw = curl_exec ($chtw);
1000
+			       $statusCodetw = curl_getinfo($chtw, CURLINFO_HTTP_CODE);
1001
+			       curl_close ($chtw);
1002
+
1003
+			       $decresulttw = json_decode($resulttw);
1004
+
1005
+			       if ($resulttw) {
1006
+				   $messageidtw = $decresulttw->sid;
1007
+			       } else { $messageidtw = ''; }
1008
+
1009
+			       if (in_array($statusCodetw, [200, 201, 202, 203, 204, 205, 206])) {
1010
+				   $messagestatustw = 'The message has been accepted for delivery.';
1011
+			       } else {
1012
+				   $messagestatustw = 'An error occurred while trying to send the message.';
1013
+			       }
1014
+
1015
+			       $messagenetworktw = '';
1016
+			       $messagepricetw = '';
1017
+			       $messagedeliverytw = '';
1018
+
1019
+			       $sentmessagearr = [$messageidtw, $messagedatetw, $messageto, $messagefrom, $messagenetworktw, $messagepricetw, $messagestatustw, $messagedeliverytw, $autoreplytext];
1020
+
1021
+			       $this->service->insertsentsms($ncuserfortwil, $displaynm, $sentmessagearr);
1022
+                       }
1023
+
1024
+                   } elseif ($twilarpldata['vacation_start'] && $twilarpldata['vacation_end']) {
1025
+
1026
+                             $vacationstart = $twilarpldata['vacation_start'];
1027
+                             $vacationend = $twilarpldata['vacation_end'];
1028
+
1029
+                             $crntimeymd = date("Y-m-d H:i:s");
1030
+                             $crntdatevcfmt = new DateTime($crntimeymd);
1031
+                             $startdatevcfmt = new DateTime($vacationstart);
1032
+                             $enddatefvcmt = new DateTime($vacationend);
1033
+
1034
+                             if ($startdatevcfmt <= $crntdatevcfmt && $crntdatevcfmt <= $enddatefvcmt) {
1035
+
1036
+			         $datatoposttw = [["To" => $messagefrom, "From" => $messagetoprtw, "Body" => $autoreplytext, "StatusCallback" => $apidelrecurltw]];
1037
+
1038
+			         $postedsendingfl = implode('&', array_map('http_build_query', $datatoposttw));
1039
+			         $messagedatetw = date("Y-m-d H:i:s");
1040
+
1041
+			         $chtw = curl_init();
1042
+			         curl_setopt($chtw, CURLOPT_URL, 'https://api.twilio.com/2010-04-01/Accounts/' . $apikeyTw . '/Messages.json');
1043
+			         curl_setopt($chtw, CURLOPT_TIMEOUT, 300);
1044
+			         curl_setopt($chtw, CURLOPT_RETURNTRANSFER, 1);
1045
+			         curl_setopt($chtw, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
1046
+			         curl_setopt($chtw, CURLOPT_USERPWD, "$apikeyTw:$authTokenTw");
1047
+			         curl_setopt($chtw, CURLOPT_POST, 1);
1048
+			         curl_setopt($chtw, CURLOPT_POSTFIELDS, $postedsendingfl);
1049
+
1050
+			         $resulttw = curl_exec ($chtw);
1051
+			         $statusCodetw = curl_getinfo($chtw, CURLINFO_HTTP_CODE);
1052
+			         curl_close ($chtw);
1053
+
1054
+			         $decresulttw = json_decode($resulttw);
1055
+
1056
+			         if ($resulttw) {
1057
+				     $messageidtw = $decresulttw->sid;
1058
+			         } else { $messageidtw = ''; }
1059
+
1060
+			         if (in_array($statusCodetw, [200, 201, 202, 203, 204, 205, 206])) {
1061
+				     $messagestatustw = 'The message has been accepted for delivery.';
1062
+			         } else {
1063
+				     $messagestatustw = 'An error occurred while trying to send the message.';
1064
+			         }
1065
+
1066
+			         $messagenetworktw = '';
1067
+			         $messagepricetw = '';
1068
+			         $messagedeliverytw = '';
1069
+
1070
+			         $sentmessagearr = [$messageidtw, $messagedatetw, $messageto, $messagefrom, $messagenetworktw, $messagepricetw, $messagestatustw, $messagedeliverytw, $autoreplytext];
1071
+
1072
+			         $this->service->insertsentsms($ncuserfortwil, $displaynm, $sentmessagearr);
1073
+                             }
1074
+
1075
+                   }
1076
+               }
1077
+
1078
+
1079
+	       // Send notifications
1080
+               $nameofhost = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'];
1081
+
1082
+	       $twilnotify = $smsapicred[12];
1083
+	       $emailaddress = $smsapicred[13];
1084
+	       $includemessageinemail = $smsapicred[14];
1085
+
1086
+               if ($ismmstw == 0) { $smsormmstw = "SMS"; } else { $smsormmstw = "MMS"; }
1087
+
1088
+	       if ($twilnotify != 0 ) {
1089
+
1090
+                   $allalloweduserstw = $this->service->getallowedusers($ncuserfortwil);
1091
+
1092
+                   foreach ($allalloweduserstw as $alusrkeytw => $specusrnametw) {
1093
+
1094
+	                    $notificationtw = $this->manager->createNotification();
1095
+		            $notificationtw->setApp('sms_relentless')
1096
+			                   ->setUser($specusrnametw)
1097
+			                   ->setDateTime(new \DateTime())
1098
+			                   ->setObject('sms_relentless', '11')
1099
+			                   ->setSubject('New SMS Message');
1100
+		            $this->manager->notify($notificationtw);
1101
+                   }
1102
+	       }
1103
+
1104
+	       if ($emailaddress != '') {
1105
+
1106
+		   $gmtind = "UTC " . date('P');
1107
+		   $smsdateinit = date("Y-m-d  H:i:s");
1108
+		   $smsdate = $smsdateinit . " " . $gmtind;
1109
+
1110
+		   $subject = "New ". $smsormmstw ." message received";
1111
+
1112
+                   $messagetextnltw = str_replace("\n", "<br>", $messagetexttw);
1113
+
1114
+		   if ($includemessageinemail == 0) {
1115
+		       $message = "Hello, <br><br> You have received a new message on ".$smsdate." .<br> You can check the new message by going to 'SMS Relentless' > 'Received SMS Messages'. <br><br> Yours, <br> SMS Relentless <br> An SMS application for Nextcloud <br> Host: '".$nameofhost."' <br>";
1116
+		   } else {
1117
+		       $message = "Hello, <br><br> You have received a new message on ".$smsdate." :<br><br><br> Message ID: ".$messageid." <br> Message Date: ".$messagedate." <br> From: ".$messagefrom." <br> To: ".$messageto."<br> Message Text: <br><br><b>".$messagetextnltw."</b><br>____________<br><br> Yours, <br> SMS Relentless <br> An SMS application for Nextcloud <br> Host: '".$nameofhost."' <br>";
1118
+		   }
1119
+
1120
+                   $messagefin = chunk_split(base64_encode($message));
1121
+
1122
+		   $headers = "MIME-Version: 1.0" . "\r\n";
1123
+		   $headers .= "Content-type: text/html; charset=UTF-8" . "\r\n";
1124
+                   $headers .= "Content-Transfer-Encoding: base64" . "\r\n";
1125
+
1126
+		   // Set the email sender
1127
+		   $headers .= "From: " . $emailaddress . "\r\n";
1128
+		   $headers .= "Reply-To: " . $emailaddress . "\r\n";
1129
+
1130
+		   mail($emailaddress, $subject, $messagefin, $headers);
1131
+	       }
1132
+
1133
+               exit();
1134
+
1135
+           } else { exit(); }
1136
+
1137
+       } else { exit(); }
1138
+
1139
+    }
1140
+
1141
+
1142
+    /**
1143
+     * @NoAdminRequired
1144
+     * @NoCSRFRequired
1145
+     * @PublicPage
1146
+     */
1147
+    public function receivesmsflow() {
1148
+
1149
+       $flowdrurl = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
1150
+
1151
+       $receivesms = file_get_contents('php://input');
1152
+       $recsmsarr = json_decode($receivesms, true);
1153
+
1154
+       $ncuserforflowrec = $this->service->getuserbyflowrecwhurl($flowdrurl);
1155
+
1156
+       if ($ncuserforflowrec != '' && $ncuserforflowrec != null && $ncuserforflowrec != 'undefined') {
1157
+
1158
+           $messageidfl = $recsmsarr['data']['id'];
1159
+
1160
+           $messagedatefl = date("Y-m-d H:i:s");
1161
+
1162
+           $messagefromflpre = $recsmsarr['data']['attributes']['from'];
1163
+           if (substr($messagefromflpre, 0, 1) == '+') { $messagefromfl = $messagefromflpre; } else { $messagefromfl = '+' . $messagefromflpre; }
1164
+
1165
+           $messagetofl = "Flowroute: +" . $recsmsarr['data']['attributes']['to'];
1166
+           $messagetoprsl = "+" . $recsmsarr['data']['attributes']['to'];
1167
+           $messagetoprfl = "Fl: +" . $recsmsarr['data']['attributes']['to'];
1168
+
1169
+           // Check if the message is a MMS
1170
+           if ($recsmsarr['data']['attributes']['is_mms'] == true) {
1171
+
1172
+               $includedFilesfl = '';
1173
+               for ($k = 0; $k < count($recsmsarr['included']); $k++) {
1174
+
1175
+                    $includedFilesfl .= "<div id='mmsTblUrl-" . mt_rand(1, 10000) . "' class='mmstblUrls' title='Download this file only if you trust the sender and the domain of the URL.'>" . $recsmsarr['included'][$k]['attributes']['url'] . "</div><br><br>";
1176
+               }
1177
+               $messagetextfl = $recsmsarr['data']['attributes']['body'] . "<br><br><br></b>--- The files included in the MMS follow. Download them only if you trust the sender and the domain of the URLs ---<br><br><br>" . $includedFilesfl;
1178
+               $ismmsfl = 1;
1179
+           } else {
1180
+               $messagetextfl = $recsmsarr['data']['attributes']['body'];
1181
+               $ismmsfl = 0;
1182
+           }
1183
+
1184
+           $recmessagearr = [$messageidfl, $messagedatefl, $messagefromfl, $messagetofl, $messagetextfl];
1185
+
1186
+           $this->service->insertrecsms($ncuserforflowrec, $recmessagearr);
1187
+
1188
+           $flsmsapicred = $this->service->getapicredentials($ncuserforflowrec);
1189
+	   $flownotify = $flsmsapicred[12];
1190
+	   $emailaddress = $flsmsapicred[13];
1191
+	   $includemessageinemail = $flsmsapicred[14];
1192
+           $flowapikey = $flsmsapicred[20];
1193
+           $flowapisecret = $flsmsapicred[21];
1194
+           $flowdelrecurl = $flsmsapicred[23];
1195
+
1196
+
1197
+           // Check if there is any auto-reply configured for the receiving number
1198
+	   $flgetarpl = $this->connection->prepare('SELECT `phone_number`, `days_of_week`, `daily_start`, `daily_end`, `vacation_start`, `vacation_end`, `message_text` FROM 
1199
+                                                   `*PREFIX*sms_relent_autorply` WHERE `phone_number` = ?');
1200
+	   $flgetarplres = $flgetarpl->execute([$messagetoprfl]);
1201
+	   $flarpldata = $flgetarplres->fetch();
1202
+	   $flgetarplres->closeCursor();
1203
+
1204
+           if ($flarpldata) {
1205
+
1206
+               $autoreplytext = $flarpldata['message_text'];
1207
+
1208
+               // Get the Display Name of the current user
1209
+               $crtuser = $this->userManager->get($ncuserforflowrec);
1210
+               $displaynm = $crtuser->getDisplayName();
1211
+
1212
+               // Check if the auto-reply is in 'daily mode'
1213
+               if ($flarpldata['days_of_week']) {
1214
+
1215
+                   // Check if the auto-reply should be sent 
1216
+                   $daysofweekarrinit = explode(",", $flarpldata['days_of_week']);
1217
+
1218
+                   $daysofweekarr = [];
1219
+                   $fulldays = [];
1220
+                   foreach ($daysofweekarrinit as $crtday) {
1221
+                       if (strpos($crtday, "full") !== false) {
1222
+                           $fulldays[] = str_replace("(full)", "", $crtday);
1223
+                       } else {
1224
+                           $daysofweekarr[] = $crtday;
1225
+                       }
1226
+                   }
1227
+
1228
+                   $dailystart = $flarpldata['daily_start'];
1229
+                   $dailyend = $flarpldata['daily_end'];
1230
+
1231
+                   $crntdate = date("Y-m-d");
1232
+                   $crntDayNumber = date('N', strtotime($crntdate));
1233
+
1234
+                   if (in_array($crntDayNumber, $daysofweekarr)) {
1235
+
1236
+                       $crntimehrmin = date("H:i");
1237
+                       $crntdatefmt = new DateTime($crntimehrmin);
1238
+                       $startdatefmt = new DateTime($dailystart);
1239
+                       $enddatefmt = new DateTime($dailyend);
1240
+
1241
+                       if ($crntdatefmt >= $startdatefmt && $enddatefmt > $crntdatefmt) {
1242
+                           // OK
1243
+                       } else {
1244
+
1245
+                           // Send the auto-reply
1246
+		           $postedparamsfl = json_encode(["to" => $messagefromfl, "from" => $messagetoprsl, "body" => $autoreplytext, "dlr_callback" => $flowdelrecurl]);
1247
+		           $messagedatefl = date("Y-m-d H:i:s");
1248
+
1249
+		           $chfl = curl_init();
1250
+		           curl_setopt($chfl, CURLOPT_URL, 'https://' . $flowapikey . ':' . $flowapisecret . '@api.flowroute.com/v2.1/messages');
1251
+		           curl_setopt($chfl, CURLOPT_HTTPHEADER, array("Content-Type: application/vnd.api+json"));
1252
+		           curl_setopt($chfl, CURLOPT_TIMEOUT, 300);
1253
+		           curl_setopt($chfl, CURLOPT_RETURNTRANSFER, 1);
1254
+		           curl_setopt($chfl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
1255
+		           curl_setopt($chfl, CURLOPT_POST, 1);
1256
+		           curl_setopt($chfl, CURLOPT_POSTFIELDS, $postedparamsfl);
1257
+		           $resultfl = curl_exec ($chfl);
1258
+		           $statusCode = curl_getinfo($chfl, CURLINFO_HTTP_CODE);
1259
+		           curl_close ($chfl);
1260
+
1261
+		           $decresultfl = json_decode($resultfl);
1262
+
1263
+		           if ($resultfl) {
1264
+		               $messageidfl = $decresultfl->data->id;
1265
+		           } else { $messageidfl = ''; }
1266
+
1267
+		           if (in_array($statusCode, [200, 201, 202, 203, 204, 205, 206])) {
1268
+		               $messagestatusfl = 'The message has been accepted for delivery.'; 
1269
+		           } else { 
1270
+		               $messagestatusfl = 'An error occurred while trying to send the message.'; 
1271
+		           }
1272
+
1273
+		           $messagefromflow = "Flowroute: " . $messagetoprsl;
1274
+                           $messagetoflow = $messagefromfl;
1275
+		           $messagenetworkfl = '';
1276
+		           $messagepricefl = '';
1277
+		           $messagedeliveryfl = '';
1278
+
1279
+		           $sentmessagearr = [$messageidfl, $messagedatefl, $messagefromflow, $messagetoflow, $messagenetworkfl, $messagepricefl, $messagestatusfl, $messagedeliveryfl, $autoreplytext];
1280
+
1281
+		           $this->service->insertsentsms($ncuserforflowrec, $displaynm, $sentmessagearr);
1282
+                       }
1283
+                   }
1284
+
1285
+                   if (in_array($crntDayNumber, $fulldays)) {
1286
+
1287
+                           // Send the auto-reply
1288
+		           $postedparamsfl = json_encode(["to" => $messagefromfl, "from" => $messagetoprsl, "body" => $autoreplytext, "dlr_callback" => $flowdelrecurl]);
1289
+		           $messagedatefl = date("Y-m-d H:i:s");
1290
+
1291
+		           $chfl = curl_init();
1292
+		           curl_setopt($chfl, CURLOPT_URL, 'https://' . $flowapikey . ':' . $flowapisecret . '@api.flowroute.com/v2.1/messages');
1293
+		           curl_setopt($chfl, CURLOPT_HTTPHEADER, array("Content-Type: application/vnd.api+json"));
1294
+		           curl_setopt($chfl, CURLOPT_TIMEOUT, 300);
1295
+		           curl_setopt($chfl, CURLOPT_RETURNTRANSFER, 1);
1296
+		           curl_setopt($chfl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
1297
+		           curl_setopt($chfl, CURLOPT_POST, 1);
1298
+		           curl_setopt($chfl, CURLOPT_POSTFIELDS, $postedparamsfl);
1299
+		           $resultfl = curl_exec ($chfl);
1300
+		           $statusCode = curl_getinfo($chfl, CURLINFO_HTTP_CODE);
1301
+		           curl_close ($chfl);
1302
+
1303
+		           $decresultfl = json_decode($resultfl);
1304
+
1305
+		           if ($resultfl) {
1306
+		               $messageidfl = $decresultfl->data->id;
1307
+		           } else { $messageidfl = ''; }
1308
+
1309
+		           if (in_array($statusCode, [200, 201, 202, 203, 204, 205, 206])) {
1310
+		               $messagestatusfl = 'The message has been accepted for delivery.'; 
1311
+		           } else { 
1312
+		               $messagestatusfl = 'An error occurred while trying to send the message.'; 
1313
+		           }
1314
+
1315
+		           $messagefromflow = "Flowroute: " . $messagetoprsl;
1316
+                           $messagetoflow = $messagefromfl;
1317
+		           $messagenetworkfl = '';
1318
+		           $messagepricefl = '';
1319
+		           $messagedeliveryfl = '';
1320
+
1321
+		           $sentmessagearr = [$messageidfl, $messagedatefl, $messagefromflow, $messagetoflow, $messagenetworkfl, $messagepricefl, $messagestatusfl, $messagedeliveryfl, $autoreplytext];
1322
+
1323
+		           $this->service->insertsentsms($ncuserforflowrec, $displaynm, $sentmessagearr);
1324
+                   }
1325
+
1326
+               } elseif ($flarpldata['vacation_start'] && $flarpldata['vacation_end']) {
1327
+
1328
+                         $vacationstart = $flarpldata['vacation_start'];
1329
+                         $vacationend = $flarpldata['vacation_end'];
1330
+
1331
+                         $crntimeymd = date("Y-m-d H:i:s");
1332
+                         $crntdatevcfmt = new DateTime($crntimeymd);
1333
+                         $startdatevcfmt = new DateTime($vacationstart);
1334
+                         $enddatefvcmt = new DateTime($vacationend);
1335
+
1336
+                         if ($startdatevcfmt <= $crntdatevcfmt && $crntdatevcfmt <= $enddatefvcmt) {
1337
+
1338
+		             $postedparamsfl = json_encode(["to" => $messagefromfl, "from" => $messagetoprsl, "body" => $autoreplytext, "dlr_callback" => $flowdelrecurl]);
1339
+		             $messagedatefl = date("Y-m-d H:i:s");
1340
+
1341
+		             $chfl = curl_init();
1342
+		             curl_setopt($chfl, CURLOPT_URL, 'https://' . $flowapikey . ':' . $flowapisecret . '@api.flowroute.com/v2.1/messages');
1343
+		             curl_setopt($chfl, CURLOPT_HTTPHEADER, array("Content-Type: application/vnd.api+json"));
1344
+		             curl_setopt($chfl, CURLOPT_TIMEOUT, 300);
1345
+		             curl_setopt($chfl, CURLOPT_RETURNTRANSFER, 1);
1346
+		             curl_setopt($chfl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
1347
+		             curl_setopt($chfl, CURLOPT_POST, 1);
1348
+		             curl_setopt($chfl, CURLOPT_POSTFIELDS, $postedparamsfl);
1349
+		             $resultfl = curl_exec ($chfl);
1350
+		             $statusCode = curl_getinfo($chfl, CURLINFO_HTTP_CODE);
1351
+		             curl_close ($chfl);
1352
+
1353
+		             $decresultfl = json_decode($resultfl);
1354
+
1355
+		             if ($resultfl) {
1356
+		                 $messageidfl = $decresultfl->data->id;
1357
+		             } else { $messageidfl = ''; }
1358
+
1359
+		             if (in_array($statusCode, [200, 201, 202, 203, 204, 205, 206])) {
1360
+		                 $messagestatusfl = 'The message has been accepted for delivery.'; 
1361
+		             } else { 
1362
+		                 $messagestatusfl = 'An error occurred while trying to send the message.'; 
1363
+		             }
1364
+
1365
+		             $messagefromflow = "Flowroute: " . $messagetoprsl;
1366
+                             $messagetoflow = $messagefromfl;
1367
+		             $messagenetworkfl = '';
1368
+		             $messagepricefl = '';
1369
+		             $messagedeliveryfl = '';
1370
+
1371
+		             $sentmessagearr = [$messageidfl, $messagedatefl, $messagefromflow, $messagetoflow, $messagenetworkfl, $messagepricefl, $messagestatusfl, $messagedeliveryfl, $autoreplytext];
1372
+
1373
+		             $this->service->insertsentsms($ncuserforflowrec, $displaynm, $sentmessagearr);
1374
+                         }
1375
+
1376
+               }
1377
+           }
1378
+
1379
+
1380
+	   // Send notifications
1381
+           $nameofhost = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['HTTP_HOST'];
1382
+
1383
+           if ($ismmsfl == 0) { $smsormmsfl = "SMS"; } else { $smsormmsfl = "MMS"; }
1384
+
1385
+	   if ($flownotify != 0 ) {
1386
+
1387
+               $allallowedusersfl = $this->service->getallowedusers($ncuserforflowrec);
1388
+
1389
+               foreach ($allallowedusersfl as $alusrkeyfl => $specusrnamefl) {
1390
+
1391
+	                $notificationfl = $this->manager->createNotification();
1392
+	                $notificationfl->setApp('sms_relentless')
1393
+		                       ->setUser($specusrnamefl)
1394
+			               ->setDateTime(new \DateTime())
1395
+			               ->setObject('sms_relentless', '11')
1396
+			               ->setSubject('New SMS Message');
1397
+	                $this->manager->notify($notificationfl);
1398
+               }
1399
+	   }
1400
+
1401
+	   if ($emailaddress != '') {
1402
+
1403
+	       $gmtind = "UTC " . date('P');
1404
+	       $smsdateinit = date("Y-m-d  H:i:s");
1405
+	       $smsdate = $smsdateinit . " " . $gmtind;
1406
+
1407
+	       $subject = "New ". $smsormmsfl ." message received";
1408
+
1409
+               $messagetextnlfl = str_replace("\n", "<br>", $messagetextfl);
1410
+
1411
+	       if ($includemessageinemail == 0) {
1412
+	           $message = "Hello, <br><br> You have received a new message on ".$smsdate." .<br> You can check the new message by going to 'SMS Relentless' > 'Received SMS Messages'. <br><br> Yours, <br> SMS Relentless <br> An SMS application for Nextcloud <br> Host: '".$nameofhost."' <br>";
1413
+	       } else {
1414
+	           $message = "Hello, <br><br> You have received a new message on ".$smsdate." :<br><br><br> Message ID: ".$messageidfl." <br> Message Date: ".$messagedatefl." <br> From: ".$messagefromfl." <br> To: ".$messagetofl."<br> Message Text: <br><br><b>".$messagetextnlfl."</b><br>____________<br><br> Yours, <br> SMS Relentless <br> An SMS application for Nextcloud <br> Host: '".$nameofhost."' <br>";
1415
+	       }
1416
+
1417
+               $messagefin = chunk_split(base64_encode($message));
1418
+
1419
+	       $headers = "MIME-Version: 1.0" . "\r\n";
1420
+	       $headers .= "Content-type: text/html; charset=UTF-8" . "\r\n";
1421
+               $headers .= "Content-Transfer-Encoding: base64" . "\r\n";
1422
+
1423
+	       // Set the email sender
1424
+	       $headers .= "From: " . $emailaddress . "\r\n";
1425
+	       $headers .= "Reply-To: " . $emailaddress . "\r\n";
1426
+
1427
+	       mail($emailaddress, $subject, $messagefin, $headers);
1428
+	   }
1429
+
1430
+           return http_response_code(200);
1431
+
1432
+       } else { return "access denied"; }
1433
+
1434
+    }
1435
+}
0 1436
new file mode 100644
... ...
@@ -0,0 +1,4128 @@
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\Service;
27
+
28
+use OCP\IDBConnection;
29
+use OCP\Security\ICrypto;
30
+use OCP\AppFramework\ApiController;
31
+use OCP\AppFramework\Controller;
32
+use OCP\IRequest;
33
+use OCP\IGroupManager;
34
+use \ReflectionClass;
35
+
36
+class SmsrelentlessService {
37
+
38
+     private $connection;
39
+     private $crypto;
40
+     private $groupManager;
41
+
42
+     public function __construct(IDBConnection $connection, ICrypto $crypto, IGroupManager $groupManager) {
43
+
44
+                $this->connection = $connection;
45
+                $this->crypto = $crypto;
46
+                $this->groupManager = $groupManager;
47
+     }
48
+
49
+
50
+     /**
51
+      * @NoAdminRequired
52
+      *
53
+      */
54
+     public function insertrecsms($userId, $recmessagearr) {
55
+
56
+            $authorDisplayNm = '';
57
+            $internalSender = 0;
58
+
59
+            // Search for the associated Display Name in the previous messages sent from the same phone number, in the 'sms_relent_sent' table
60
+            $recmsgfromprc = '%' . $recmessagearr[2];
61
+            $getdspnmst = $this->connection->prepare('SELECT `from`, `author_displayname` FROM `*PREFIX*sms_relent_sent` WHERE `from` LIKE ?');
62
+            $getdspnmstres = $getdspnmst->execute([$recmsgfromprc]);
63
+
64
+            $dispnamearr = [];
65
+            while ($dspnmstfetched = $getdspnmstres->fetch()) {
66
+                   $dispnamearr[] = $dspnmstfetched['author_displayname'];
67
+            }
68
+	    $getdspnmstres->closeCursor();
69
+
70
+            if ($dispnamearr) {
71
+                $descdspnmarr = array_reverse($dispnamearr);
72
+                $authorDisplayNm = $descdspnmarr[0];
73
+                $internalSender = 1;
74
+            } else { $authorDisplayNm = ''; $internalSender = 0; }
75
+
76
+
77
+            if (!$authorDisplayNm) {
78
+
79
+                // Search for the associated Display Name in the previous messages coming from the same phone number, in the 'sms_relent_received' table
80
+                $getdspnm = $this->connection->prepare('SELECT `from`, `author_displayname` FROM `*PREFIX*sms_relent_received` WHERE `from` = ?');
81
+                $getdspnmres = $getdspnm->execute([$recmessagearr[2]]);
82
+
83
+                $dspnmearr = [];
84
+                while ($dspnmfetched = $getdspnmres->fetch()) {
85
+                       if ($dspnmfetched['author_displayname']) {
86
+                           $dspnmearr[] = $dspnmfetched['author_displayname'];
87
+                       }
88
+                }
89
+	        $getdspnmres->closeCursor();
90
+
91
+                if ($dspnmearr) {
92
+                    $descdisplaynmarr = array_reverse($dspnmearr);
93
+                    $authorDisplayNm = $descdisplaynmarr[0];
94
+                    $internalSender = 0;
95
+                } else { $authorDisplayNm = ''; $internalSender = 0; }
96
+            }
97
+
98
+            // Insert the received message in the 'sms_relent_received' table
99
+            $escapedmessagepre = $recmessagearr[4];
100
+            $escapedmessage = nl2br($escapedmessagepre);
101
+
102
+            $sql = $this->connection->prepare('
103
+				INSERT INTO `*PREFIX*sms_relent_received`
104
+					(`user_id`, `message_id`, `date`, `from`, `to`, `message`, `author_displayname`, `internal_sender`)
105
+				VALUES (?, ?, ?, ?, ?, ?, ?, ?)
106
+			');
107
+	    $sql->execute([$userId, $recmessagearr[0], $recmessagearr[1], $recmessagearr[2], $recmessagearr[3], $escapedmessage, $authorDisplayNm, $internalSender]);
108
+     }
109
+
110
+
111
+     /**
112
+      * @NoAdminRequired
113
+      *
114
+      */
115
+     public function insertsentsms($userId, $displayname, $sentmessagearr) {
116
+
117
+            $msgsentfrompre = explode("+", $sentmessagearr[2]);
118
+            $msgsentfrom = "+" . $msgsentfrompre[1];
119
+
120
+            $textwithnl = nl2br($sentmessagearr[8]);
121
+            $sql = $this->connection->prepare('
122
+				INSERT INTO `*PREFIX*sms_relent_sent`
123
+					(`user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`, `author_displayname`)
124
+				VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
125
+			');
126
+	    $sql->execute([$userId, $sentmessagearr[0], $sentmessagearr[1], $sentmessagearr[2], $sentmessagearr[3], $sentmessagearr[4], $sentmessagearr[5], $sentmessagearr[6], 
127
+                           $sentmessagearr[7], $textwithnl, $displayname]);
128
+     }
129
+
130
+
131
+     /**
132
+      * @NoAdminRequired
133
+      *
134
+      */
135
+     public function updatedeliverystatustel($ncuserfortelnyxdel, $messageid, $network, $messageprice, $messagestatus, $deliverystatus) {
136
+
137
+	    $sqlupdateds = $this->connection->prepare('
138
+			UPDATE `*PREFIX*sms_relent_sent`
139
+			SET `price` = ?, `status` = ?, `deliveryreceipt` = ?, `network` = ?
140
+                        WHERE `message_id` = ? AND `user_id` = ? ');
141
+	    $updateRes = $sqlupdateds->execute([$messageprice, $messagestatus, $deliverystatus, $network, $messageid, $ncuserfortelnyxdel]);
142
+	    $updateRes->closeCursor();
143
+     }
144
+
145
+
146
+     /**
147
+      * @NoAdminRequired
148
+      *
149
+      */
150
+     public function updatedeliverystatusnex($ncuserforplivodel, $messageid, $networkcode, $messageprice, $mStatus, $deliverystatus) {
151
+
152
+	    $sqlupdatedspl = $this->connection->prepare('
153
+			UPDATE `*PREFIX*sms_relent_sent`
154
+			SET `price` = ?, `deliveryreceipt` = ?, `status` = ?, `network` = ?
155
+                        WHERE `message_id` = ? AND `user_id` = ? ');
156
+	    $updateResdspl = $sqlupdatedspl->execute([$messageprice, $deliverystatus, $mStatus, $networkcode, $messageid, $ncuserforplivodel]);
157
+	    $updateResdspl->closeCursor();
158
+     }
159
+
160
+
161
+     /**
162
+      * @NoAdminRequired
163
+      *
164
+      */
165
+     public function updatedeliverystatustwil($ncuserfortwildel, $messageid, $networkcode, $messageprice, $mStatus, $deliverystatus) {
166
+
167
+	    $sqlupdatedstw = $this->connection->prepare('
168
+			UPDATE `*PREFIX*sms_relent_sent`
169
+			SET `price` = ?, `deliveryreceipt` = ?, `status` = ?, `network` = ?
170
+                        WHERE `message_id` = ? AND `user_id` = ? ');
171
+	    $updateResdstw = $sqlupdatedstw->execute([$messageprice, $deliverystatus, $mStatus, $networkcode, $messageid, $ncuserfortwildel]);
172
+	    $updateResdstw->closeCursor();
173
+     }
174
+
175
+
176
+     /**
177
+      * @NoAdminRequired
178
+      *
179
+      */
180
+     public function updatedeliverystatusflow($ncuserforflowdel, $messageid, $networkcode, $messageprice, $mStatus, $deliverystatus) {
181
+
182
+	    $sqlupdatedsfl = $this->connection->prepare('
183
+			UPDATE `*PREFIX*sms_relent_sent`
184
+			SET `price` = ?, `deliveryreceipt` = ?, `status` = ?, `network` = ?
185
+                        WHERE `message_id` = ? AND `user_id` = ? ');
186
+	    $updateResdsfl = $sqlupdatedsfl->execute([$messageprice, $deliverystatus, $mStatus, $networkcode, $messageid, $ncuserforflowdel]);
187
+	    $updateResdsfl->closeCursor();
188
+     }
189
+
190
+
191
+     /**
192
+      * @NoAdminRequired
193
+      */
194
+     public function getreceivedtable($userId) {
195
+
196
+        // Get the user's preferences from the settings
197
+        $getgamcheckrc = $this->connection->prepare('
198
+		       SELECT `user_id`, `show_all_messages`, `show_display_names`
199
+		       FROM  `*PREFIX*sms_relent_settings` WHERE `user_id` = ?');
200
+        $getgamcheckrcres = $getgamcheckrc->execute([$userId]);
201
+        $getcrgamsrcpref = $getgamcheckrcres->fetch();
202
+        $crgamsrcpref = $getcrgamsrcpref['show_all_messages'];
203
+        $crdnmsrcpref = $getcrgamsrcpref['show_display_names'];
204
+        $getgamcheckrcres->closeCursor();
205
+
206
+
207
+        // Collect the users with whom the current admin is sharing his API keys and whose messages he will be able to see
208
+        if ($crgamsrcpref == 1 && $this->groupManager->isAdmin($userId)) {
209
+
210
+            // Get the users that belong to the 'admin' group
211
+            $getadmn = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
212
+            $getadmnres = $getadmn->execute(['admin']);
213
+
214
+            $usersadminsd = [];
215
+            while ($getadmnusrs = $getadmnres->fetch()) {
216
+                   $usersadminsd[] = $getadmnusrs['uid'];
217
+            }
218
+            $getadmnres->closeCursor();
219
+
220
+            // Get the groups and users that were allowed access to the API keys
221
+            $getgrps = $this->connection->prepare('SELECT `user_id`, `tnx_groups_allowed`, `tnx_users_allowed`, `plv_groups_allowed`, `plv_users_allowed`,
222
+                                                  `twl_groups_allowed`, `twl_users_allowed`, `flr_groups_allowed`, `flr_users_allowed` FROM `*PREFIX*sms_relent_subac`
223
+                                                   WHERE `user_id` = ?');
224
+            $getgrpsres = $getgrps->execute([$userId]);
225
+            $getgrpsusr = $getgrpsres->fetch();
226
+            $getgrpsres->closeCursor();
227
+
228
+            if ($getgrpsusr) {
229
+
230
+                if ($getgrpsusr['tnx_users_allowed']) { $tnxusers = explode("|", $getgrpsusr['tnx_users_allowed']); } else { $tnxusers = []; }
231
+                if ($getgrpsusr['plv_users_allowed']) { $plvusers = explode("|", $getgrpsusr['plv_users_allowed']); } else { $plvusers = []; }
232
+                if ($getgrpsusr['twl_users_allowed']) { $twlusers = explode("|", $getgrpsusr['twl_users_allowed']); } else { $twlusers = []; }
233
+                if ($getgrpsusr['flr_users_allowed']) { $flrusers = explode("|", $getgrpsusr['flr_users_allowed']); } else { $flrusers = []; }
234
+
235
+                $allwdusersarr = array_merge($tnxusers, $plvusers, $twlusers, $flrusers);
236
+                $allwdusersunq = array_filter(array_unique($allwdusersarr));
237
+
238
+                if ($getgrpsusr['tnx_groups_allowed']) { $tnxgroups = explode("|", $getgrpsusr['tnx_groups_allowed']); } else { $tnxgroups = []; }
239
+                if ($getgrpsusr['plv_groups_allowed']) { $plvgroups = explode("|", $getgrpsusr['plv_groups_allowed']); } else { $plvgroups = []; }
240
+                if ($getgrpsusr['twl_groups_allowed']) { $twlgroups = explode("|", $getgrpsusr['twl_groups_allowed']); } else { $twlgroups = []; }
241
+                if ($getgrpsusr['flr_groups_allowed']) { $flrgroups = explode("|", $getgrpsusr['flr_groups_allowed']); } else { $flrgroups = []; }
242
+
243
+                $allwdgroupsarr = array_merge($tnxgroups, $plvgroups, $twlgroups, $flrgroups);
244
+                $allwdgroupsunq = array_filter(array_unique($allwdgroupsarr));
245
+
246
+            } else {
247
+                $allwdusersunq = [];
248
+                $allwdgroupsunq = [];
249
+            }
250
+
251
+            // Get the username for each Display Name of the allowed users
252
+            $allwdusersfnl = [];
253
+            foreach ($allwdusersunq as $alwdusrkey => $alwdusrvalue) {
254
+
255
+                         $getacdatausrnm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
256
+		         $getacdatausrnmres = $getacdatausrnm->execute(['displayname', $alwdusrvalue]);
257
+		         $acdatausrname = $getacdatausrnmres->fetch();
258
+                         if ($acdatausrname) {
259
+                             $allwdusersfnl[] = $acdatausrname['uid'];
260
+                         }
261
+                         $getacdatausrnmres->closeCursor();
262
+            }
263
+
264
+            // Get the users from all the allowed groups
265
+            $allwdusersgrpmlt = [];
266
+            foreach ($allwdgroupsunq as $prgrpkey => $prgrpvalue) {
267
+
268
+                         // Get all the users that belong to the current group
269
+                         $getusringroup = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
270
+		         $getusringroupres = $getusringroup->execute([$prgrpvalue]);
271
+
272
+		         while ($getusrname = $getusringroupres->fetch()) {
273
+
274
+	                        // Ensure the current user is not an admin
275
+                                if (!in_array($getusrname['uid'], $usersadminsd)) {
276
+                                     $allwdusersgrpmlt[] = $getusrname['uid'];
277
+                                }
278
+                         }
279
+		         $getusringroupres->closeCursor();
280
+            }
281
+            $allwdusersgrpfnl = array_unique($allwdusersgrpmlt);
282
+            
283
+            $allusr = array_merge($allwdusersfnl, $allwdusersgrpfnl);
284
+            $allusruniquest = array_unique($allusr);
285
+
286
+            if ($allusruniquest) {
287
+                array_unshift($allusruniquest, $userId);
288
+                $allusruniquerc = $allusruniquest;
289
+            } else { $allusruniquerc = [$userId]; }
290
+
291
+            $procardatarc = implode(",", array_fill(0, count($allusruniquerc), "?"));
292
+        }
293
+
294
+        // If the user is an admin and he wants to see his messages and the messages of all the users with whom he shares his API keys
295
+        if ($crgamsrcpref == 1 && $this->groupManager->isAdmin($userId)) {
296
+
297
+            if ($crdnmsrcpref == 1) {
298
+	        $getrectable = $this->connection->prepare("
299
+			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `author_displayname`, `internal_sender`
300
+			FROM `*PREFIX*sms_relent_received` 
301
+                        WHERE `user_id` IN (" . $procardatarc . ")");
302
+	        $rcresult = $getrectable->execute($allusruniquerc);
303
+            } else {
304
+	        $getrectable = $this->connection->prepare("
305
+			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `internal_sender`
306
+			FROM `*PREFIX*sms_relent_received` 
307
+                        WHERE `user_id` IN (" . $procardatarc . ")");
308
+	        $rcresult = $getrectable->execute($allusruniquerc);
309
+            }
310
+
311
+        // If the user is an admin and he wants to see only his messages
312
+        } elseif ($crgamsrcpref == 0 && $this->groupManager->isAdmin($userId)) {
313
+
314
+            if ($crdnmsrcpref == 1) {
315
+	        $getrectable = $this->connection->prepare('
316
+			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `author_displayname`, `internal_sender`
317
+			FROM `*PREFIX*sms_relent_received` 
318
+                        WHERE `user_id` = ?');
319
+	        $rcresult = $getrectable->execute([$userId]);
320
+            } else {
321
+	        $getrectable = $this->connection->prepare('
322
+			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `internal_sender`
323
+			FROM `*PREFIX*sms_relent_received` 
324
+                        WHERE `user_id` = ?');
325
+	        $rcresult = $getrectable->execute([$userId]);
326
+            }
327
+
328
+        // If the user is not an admin 
329
+        } elseif (!$this->groupManager->isAdmin($userId)) {
330
+
331
+	    // Get the Display Name of the current user
332
+	    $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
333
+	    $getacdatadnres = $getacdatadn->execute([$userId, 'displayname']);
334
+	    $acdatausrdnadm = $getacdatadnres->fetch();
335
+	    $cruserdname = $acdatausrdnadm['value'];
336
+	    $getacdatadnres->closeCursor();
337
+
338
+            // Get the groups to which the current user belongs
339
+            $getusrgrp = $this->connection->prepare('
340
+	          SELECT `gid`, `uid`
341
+	          FROM  `*PREFIX*group_user`
342
+                  WHERE `uid` = ?');
343
+            $getusrgrpres = $getusrgrp->execute([$userId]);
344
+
345
+            $usergrps = [];
346
+            while ($fetchedgrps = $getusrgrpres->fetch()) {
347
+                   $usergrps[] = $fetchedgrps['gid'];
348
+            }
349
+            $getusrgrpres->closeCursor();
350
+
351
+            // Get the restrictions from the 'sms_relent_restrict' table
352
+            $getrestr = $this->connection->prepare('
353
+		       SELECT `phone_number`, `groups`, `users`
354
+		       FROM  `*PREFIX*sms_relent_restrict`');
355
+            $getrestrres = $getrestr->execute();
356
+
357
+            $restrdata = [];
358
+            while ($restrfetched = $getrestrres->fetch()) {
359
+                   $restrdata[] = $restrfetched;
360
+            }
361
+            $getrestrres->closeCursor();
362
+
363
+            // Get the phone numbers that the user is allowed/not allowed to use
364
+            if ($restrdata) {
365
+
366
+                $restrPhoneNmbrs = [];
367
+                $allowedPhoneNmbrs = [];
368
+                foreach ($restrdata as $rskey => $rsvalue) {
369
+
370
+                         $chck = 0;
371
+                         $restrgrparr = explode("|", $rsvalue['groups']);
372
+                         foreach ($restrgrparr as $rkey => $rvalue) {
373
+                                  if ($rvalue) {
374
+                                      if (strpos(implode("|", $usergrps), $rvalue) !== false) { $chck++; }
375
+                                  }
376
+                         }
377
+                         if (strpos($rsvalue['users'], $cruserdname) !== false) { $chck++; }
378
+
379
+                         if ($chck == 0) {
380
+                             $restrPhoneNmbrs[] = $rsvalue['phone_number'];
381
+                         }
382
+                }
383
+
384
+		$allowedPhNmbrs = $this->getsmsnumbers($userId);
385
+
386
+		foreach ($allowedPhNmbrs as $apnkey => $apnvalue) {
387
+			 $crphnmbr = explode(": ", $apnvalue);
388
+			 if ($crphnmbr[0] == 'Tx') {
389
+			     $allowedPhoneNmbrs[] = 'Telnyx: ' . $crphnmbr[1];
390
+			 } elseif ($crphnmbr[0] == 'Pl') {
391
+			     $allowedPhoneNmbrs[] = 'Plivo: ' . $crphnmbr[1];
392
+			 } elseif ($crphnmbr[0] == 'Tw') {
393
+			     $allowedPhoneNmbrs[] = 'Twilio: ' . $crphnmbr[1];
394
+			 } elseif ($crphnmbr[0] == 'Fl') {
395
+			     $allowedPhoneNmbrs[] = 'Flowroute: ' . $crphnmbr[1];
396
+			 }
397
+		}
398
+
399
+                $procalwdphnmbrs = implode(",", array_fill(0, count($allowedPhoneNmbrs), "?"));
400
+                array_unshift($allowedPhoneNmbrs, $userId);
401
+                $procalwduid = $allowedPhoneNmbrs;
402
+
403
+                if ($crdnmsrcpref == 1) {
404
+
405
+                    if ($procalwdphnmbrs) {
406
+/*
407
+	                $getrectable = $this->connection->prepare('
408
+			    SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `author_displayname`, `internal_sender`
409
+			    FROM `*PREFIX*sms_relent_received`
410
+			    WHERE `user_id` = ? OR `to` IN (' . $procalwdphnmbrs . ')');
411
+	                $rcresult = $getrectable->execute($procalwduid);
412
+*/
413
+	                $getrectable = $this->connection->prepare("
414
+			    SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `author_displayname`, `internal_sender`
415
+			    FROM `*PREFIX*sms_relent_received`
416
+			    WHERE `user_id` = ? OR `to` IN (" . $procalwdphnmbrs . ")");
417
+	                $rcresult = $getrectable->execute($procalwduid);
418
+
419
+                    } else {
420
+
421
+	                $getrectable = $this->connection->prepare('
422
+			    SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `author_displayname`, `internal_sender`
423
+			    FROM `*PREFIX*sms_relent_received`
424
+			    WHERE `user_id` = ?');
425
+	                $rcresult = $getrectable->execute($procalwduid);
426
+
427
+                    }
428
+
429
+                } else {
430
+                    if ($procalwdphnmbrs) {
431
+	                $getrectable = $this->connection->prepare("
432
+			    SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `internal_sender`
433
+			    FROM `*PREFIX*sms_relent_received`
434
+			    WHERE `user_id` = ? OR `to` IN (" . $procalwdphnmbrs . ")");
435
+	                $rcresult = $getrectable->execute($procalwduid);
436
+                    } else {
437
+	                $getrectable = $this->connection->prepare('
438
+			    SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `internal_sender`
439
+			    FROM `*PREFIX*sms_relent_received`
440
+			    WHERE `user_id` = ?');
441
+	                $rcresult = $getrectable->execute($procalwduid);
442
+                    }
443
+                }
444
+
445
+            } else {
446
+
447
+                if ($crdnmsrcpref == 1) {
448
+	            $getrectable = $this->connection->prepare('
449
+			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `author_displayname`, `internal_sender`
450
+			FROM `*PREFIX*sms_relent_received`
451
+			WHERE `user_id` = ?');
452
+	            $rcresult = $getrectable->execute([$userId]);
453
+                } else {
454
+	            $getrectable = $this->connection->prepare('
455
+			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `internal_sender`
456
+			FROM `*PREFIX*sms_relent_received`
457
+			WHERE `user_id` = ?');
458
+	            $rcresult = $getrectable->execute([$userId]);
459
+                }
460
+            }
461
+        }
462
+
463
+        $recdatatable = [];
464
+        while ($rowfetched = $rcresult->fetch()) {
465
+               $recdatatable[] = $rowfetched;
466
+        }
467
+	$rcresult->closeCursor();
468
+
469
+        $recdatafromdb = $recdatatable;
470
+
471
+
472
+        if ($this->groupManager->isAdmin($userId)) {
473
+
474
+              $recdatafdb = ['datarows' => $recdatafromdb, 'showdispnm' => $crdnmsrcpref];
475
+              return $recdatafdb;
476
+
477
+        } else {
478
+
479
+            if ($restrdata) {
480
+
481
+                // Clean the 'not allowed' phone numbers from tags
482
+                $restrPhfin = [];
483
+                foreach ($restrPhoneNmbrs as $phkey => $phvalue) {
484
+
485
+                    $restrpharr = explode(": ", $phvalue);
486
+                    $restrPhfin[] = $restrpharr[1];
487
+                }
488
+
489
+                // Assemble the array of message rows that excludes the rows for the 'not allowed' phone numbers
490
+                foreach ($recdatafromdb as $mdkey => $mdvalue) {
491
+
492
+                    if (str_contains($mdvalue['to'], "+")) {
493
+                        $fromnmbrarr = explode("+", $mdvalue['to']);
494
+                        if (in_array("+" . $fromnmbrarr[1], $restrPhfin)) {
495
+                            unset($recdatafromdb[$mdkey]);
496
+                        }
497
+                    } else {
498
+                        $tonmbrarr = explode(": ", $mdvalue['to']);
499
+                        if (count($tonmbrarr) == 2) {
500
+                            $tonmbrtbcmprd = $tonmbrarr[1];
501
+                        } else {
502
+                            $tonmbrtbcmprd = $tonmbrarr[0];
503
+                        }
504
+                        if (in_array($tonmbrtbcmprd, $restrPhfin)) {
505
+                            unset($recdatafromdb[$mdkey]);
506
+                        }
507
+                    }
508
+                }
509
+
510
+                $recdatafdbproc = array_values($recdatafromdb);
511
+
512
+                $recdataproc = ['datarows' => $recdatafdbproc, 'showdispnm' => $crdnmsrcpref];
513
+                return $recdataproc;
514
+
515
+            } else {
516
+
517
+                $recdatafdb = ['datarows' => $recdatafromdb, 'showdispnm' => $crdnmsrcpref];
518
+                return $recdatafdb;
519
+            }
520
+        }
521
+     }
522
+
523
+
524
+     /**
525
+      * @NoAdminRequired
526
+      */
527
+     public function getreceivedtablefordel($userId) {
528
+
529
+        if ($this->groupManager->isAdmin($userId)) {
530
+
531
+            $getrecfordl = $this->connection->prepare('
532
+			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `author_displayname`, `internal_sender`
533
+			FROM  `*PREFIX*sms_relent_received`
534
+			WHERE `user_id` = ?');
535
+	    $resultdl = $getrecfordl->execute([$userId]);
536
+
537
+            $recdatatable = [];
538
+            while ($rowfetched = $resultdl->fetch()) {
539
+                   $recdatatable[] = $rowfetched;
540
+            }
541
+            $resultdl->closeCursor();
542
+
543
+            $recdatafromdb = $recdatatable;
544
+
545
+            return $recdatafromdb;
546
+
547
+        } else { return "not permitted"; }
548
+     }
549
+
550
+
551
+     /**
552
+      * @NoAdminRequired
553
+      */
554
+     public function removerecrows($userId, $recmessagedbIDs) {
555
+
556
+        foreach ($recmessagedbIDs as $key => $rowtodel) {
557
+		 $query = $this->connection->prepare('
558
+		       DELETE FROM `*PREFIX*sms_relent_received`
559
+		       WHERE `id` = ?');
560
+		 $deleteResult = $query->execute([$rowtodel]);
561
+		 $deleteResult->closeCursor();
562
+        }
563
+
564
+	$sqlupdate = $this->connection->prepare('
565
+                  SET @resetrec = 0;
566
+		  UPDATE `*PREFIX*sms_relent_received`
567
+		  SET `id` = @resetrec := @resetrec + 1;
568
+                  ALTER TABLE `*PREFIX*sms_relent_received` auto_increment=1;');
569
+	$updateRes = $sqlupdate->execute();
570
+	$updateRes->closeCursor();
571
+     }
572
+
573
+
574
+     /**
575
+      * @NoAdminRequired
576
+      */
577
+     public function getsenttable($userId) {
578
+
579
+        // Get the user's preferences from the settings
580
+        $getgamcheck = $this->connection->prepare('
581
+		       SELECT `user_id`, `show_all_messages`, `show_display_names`
582
+		       FROM  `*PREFIX*sms_relent_settings` WHERE `user_id` = ?');
583
+        $getgamcheckres = $getgamcheck->execute([$userId]);
584
+        $getcrgamspref = $getgamcheckres->fetch();
585
+        $crgamspref = $getcrgamspref['show_all_messages'];
586
+        $crdnamespref = $getcrgamspref['show_display_names'];
587
+        $getgamcheckres->closeCursor();
588
+
589
+
590
+        // Collect the users with whom the current admin is sharing his API keys and whose messages he will be able to see
591
+        if ($crgamspref == 1 && $this->groupManager->isAdmin($userId)) {
592
+
593
+            // Get the users that belong to the 'admin' group
594
+            $getadmn = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
595
+            $getadmnres = $getadmn->execute(['admin']);
596
+
597
+            $usersadminsd = [];
598
+            while ($getadmnusrs = $getadmnres->fetch()) {
599
+                   $usersadminsd[] = $getadmnusrs['uid'];
600
+            }
601
+            $getadmnres->closeCursor();
602
+
603
+            // Get the groups and users that were allowed access to the API keys
604
+            $getgrps = $this->connection->prepare('SELECT `user_id`, `tnx_groups_allowed`, `tnx_users_allowed`, `plv_groups_allowed`, `plv_users_allowed`,
605
+                                                  `twl_groups_allowed`, `twl_users_allowed`, `flr_groups_allowed`, `flr_users_allowed` FROM `*PREFIX*sms_relent_subac`
606
+                                                   WHERE `user_id` = ?');
607
+            $getgrpsres = $getgrps->execute([$userId]);
608
+            $getgrpsusr = $getgrpsres->fetch();
609
+            $getgrpsres->closeCursor();
610
+
611
+            if ($getgrpsusr) {
612
+
613
+                if ($getgrpsusr['tnx_users_allowed']) { $tnxusers = explode("|", $getgrpsusr['tnx_users_allowed']); } else { $tnxusers = []; }
614
+                if ($getgrpsusr['plv_users_allowed']) { $plvusers = explode("|", $getgrpsusr['plv_users_allowed']); } else { $plvusers = []; }
615
+                if ($getgrpsusr['twl_users_allowed']) { $twlusers = explode("|", $getgrpsusr['twl_users_allowed']); } else { $twlusers = []; }
616
+                if ($getgrpsusr['flr_users_allowed']) { $flrusers = explode("|", $getgrpsusr['flr_users_allowed']); } else { $flrusers = []; }
617
+
618
+                $allwdusersarr = array_merge($tnxusers, $plvusers, $twlusers, $flrusers);
619
+                $allwdusersunq = array_filter(array_unique($allwdusersarr));
620
+
621
+                if ($getgrpsusr['tnx_groups_allowed']) { $tnxgroups = explode("|", $getgrpsusr['tnx_groups_allowed']); } else { $tnxgroups = []; }
622
+                if ($getgrpsusr['plv_groups_allowed']) { $plvgroups = explode("|", $getgrpsusr['plv_groups_allowed']); } else { $plvgroups = []; }
623
+                if ($getgrpsusr['twl_groups_allowed']) { $twlgroups = explode("|", $getgrpsusr['twl_groups_allowed']); } else { $twlgroups = []; }
624
+                if ($getgrpsusr['flr_groups_allowed']) { $flrgroups = explode("|", $getgrpsusr['flr_groups_allowed']); } else { $flrgroups = []; }
625
+
626
+                $allwdgroupsarr = array_merge($tnxgroups, $plvgroups, $twlgroups, $flrgroups);
627
+                $allwdgroupsunq = array_filter(array_unique($allwdgroupsarr));
628
+
629
+            } else {
630
+                $allwdusersunq = [];
631
+                $allwdgroupsunq = [];
632
+            }
633
+
634
+            // Get the username for each Display Name of the allowed users
635
+            $allwdusersfnl = [];
636
+            foreach ($allwdusersunq as $alwdusrkey => $alwdusrvalue) {
637
+
638
+                         $getacdatausrnm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
639
+		         $getacdatausrnmres = $getacdatausrnm->execute(['displayname', $alwdusrvalue]);
640
+		         $acdatausrname = $getacdatausrnmres->fetch();
641
+                         if ($acdatausrname) {
642
+                             $allwdusersfnl[] = $acdatausrname['uid'];
643
+                         }
644
+                         $getacdatausrnmres->closeCursor();
645
+            }
646
+
647
+            // Get the users from all the allowed groups
648
+            $allwdusersgrpmlt = [];
649
+            foreach ($allwdgroupsunq as $prgrpkey => $prgrpvalue) {
650
+
651
+                         // Get all the users that belong to the current group
652
+                         $getusringroup = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
653
+		         $getusringroupres = $getusringroup->execute([$prgrpvalue]);
654
+
655
+		         while ($getusrname = $getusringroupres->fetch()) {
656
+
657
+	                        // Ensure the current user is not an admin
658
+                                if (!in_array($getusrname['uid'], $usersadminsd)) {
659
+                                     $allwdusersgrpmlt[] = $getusrname['uid'];
660
+                                }
661
+                         }
662
+		         $getusringroupres->closeCursor();
663
+            }
664
+            $allwdusersgrpfnl = array_unique($allwdusersgrpmlt);
665
+            
666
+            $allusr = array_merge($allwdusersfnl, $allwdusersgrpfnl);
667
+            $allusruniquest = array_unique($allusr);
668
+
669
+            if ($allusruniquest) {
670
+                array_unshift($allusruniquest, $userId);
671
+                $allusrunique = $allusruniquest;
672
+            } else { $allusrunique = [$userId]; }
673
+
674
+            $procardata = implode(",", array_fill(0, count($allusrunique), "?"));
675
+        }
676
+
677
+        // If the user is an admin and he wants to see his messages and the messages of all the users with whom he shares his API keys
678
+        if ($crgamspref == 1 && $this->groupManager->isAdmin($userId)) {
679
+
680
+            if ($crdnamespref == 1) {
681
+                $getsenttbl = $this->connection->prepare("
682
+		       SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`, `author_displayname`
683
+		       FROM  `*PREFIX*sms_relent_sent` 
684
+                       WHERE `user_id` IN (" . $procardata . ")");
685
+                $resultsent = $getsenttbl->execute($allusrunique);
686
+            } else {
687
+                $getsenttbl = $this->connection->prepare("
688
+		       SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`
689
+		       FROM  `*PREFIX*sms_relent_sent` 
690
+                       WHERE `user_id` IN (" . $procardata . ")");
691
+                $resultsent = $getsenttbl->execute($allusrunique);
692
+            }
693
+
694
+        // If the user is an admin and he wants to see only his messages
695
+        } elseif ($crgamspref == 0 && $this->groupManager->isAdmin($userId)) {
696
+
697
+            if ($crdnamespref == 1) {
698
+                $getsenttbl = $this->connection->prepare('
699
+		       SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`, `author_displayname`
700
+		       FROM  `*PREFIX*sms_relent_sent` 
701
+                       WHERE `user_id` = ?');
702
+                $resultsent = $getsenttbl->execute([$userId]);
703
+            } else {
704
+                $getsenttbl = $this->connection->prepare('
705
+		       SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`
706
+		       FROM  `*PREFIX*sms_relent_sent` 
707
+                       WHERE `user_id` = ?');
708
+                $resultsent = $getsenttbl->execute([$userId]);
709
+            }
710
+
711
+        // If the user is not an admin 
712
+        } elseif (!$this->groupManager->isAdmin($userId)) {
713
+
714
+	    // Get the Display Name of the current user
715
+	    $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
716
+	    $getacdatadnres = $getacdatadn->execute([$userId, 'displayname']);
717
+	    $acdatausrdnadm = $getacdatadnres->fetch();
718
+	    $cruserdname = $acdatausrdnadm['value'];
719
+	    $getacdatadnres->closeCursor();
720
+
721
+            // Get the groups to which the current user belongs
722
+            $getusrgrp = $this->connection->prepare('
723
+	          SELECT `gid`, `uid`
724
+	          FROM  `*PREFIX*group_user`
725
+                  WHERE `uid` = ?');
726
+            $getusrgrpres = $getusrgrp->execute([$userId]);
727
+
728
+            $usergrps = [];
729
+            while ($fetchedgrps = $getusrgrpres->fetch()) {
730
+                   $usergrps[] = $fetchedgrps['gid'];
731
+            }
732
+            $getusrgrpres->closeCursor();
733
+
734
+            // Get the restrictions from the 'sms_relent_restrict' table
735
+            $getrestr = $this->connection->prepare('
736
+		       SELECT `phone_number`, `groups`, `users`
737
+		       FROM  `*PREFIX*sms_relent_restrict`');
738
+            $getrestrres = $getrestr->execute();
739
+
740
+            $restrdata = [];
741
+            while ($restrfetched = $getrestrres->fetch()) {
742
+                   $restrdata[] = $restrfetched;
743
+            }
744
+            $getrestrres->closeCursor();
745
+
746
+            // Get the phone numbers that the user is allowed/not allowed to use
747
+            if ($restrdata) {
748
+
749
+                $restrPhoneNmbrs = [];
750
+                $allowedPhoneNmbrs = [];
751
+                foreach ($restrdata as $rskey => $rsvalue) {
752
+
753
+                         $chck = 0;
754
+                         $restrgrparr = explode("|", $rsvalue['groups']);
755
+                         foreach ($restrgrparr as $rkey => $rvalue) {
756
+                                  if ($rvalue) {
757
+                                      if (strpos(implode("|", $usergrps), $rvalue) !== false) { $chck++; }
758
+                                  }
759
+                         }
760
+                         if (strpos($rsvalue['users'], $cruserdname) !== false) { $chck++; }
761
+
762
+                         if ($chck == 0) { 
763
+                             $restrPhoneNmbrs[] = $rsvalue['phone_number']; 
764
+                         }
765
+                }
766
+
767
+		$allowedPhNmbrs = $this->getsmsnumbers($userId);
768
+
769
+		foreach ($allowedPhNmbrs as $apnkey => $apnvalue) {
770
+			 $crphnmbr = explode(": ", $apnvalue);
771
+			 if ($crphnmbr[0] == 'Tx') {
772
+			     $allowedPhoneNmbrs[] = 'Telnyx: ' . $crphnmbr[1];
773
+			 } elseif ($crphnmbr[0] == 'Pl') {
774
+			     $allowedPhoneNmbrs[] = 'Plivo: ' . $crphnmbr[1];
775
+			 } elseif ($crphnmbr[0] == 'Tw') {
776
+			     $allowedPhoneNmbrs[] = 'Twilio: ' . $crphnmbr[1];
777
+			 } elseif ($crphnmbr[0] == 'Fl') {
778
+			     $allowedPhoneNmbrs[] = 'Flowroute: ' . $crphnmbr[1];
779
+			 }
780
+		}
781
+
782
+                $procalwdphnmbrs = implode(",", array_fill(0, count($allowedPhoneNmbrs), "?"));
783
+                array_unshift($allowedPhoneNmbrs, $userId);
784
+                $procalwduid = $allowedPhoneNmbrs;
785
+
786
+                if ($crdnamespref == 1) {
787
+                    if ($procalwdphnmbrs) {
788
+	                $getsenttbl = $this->connection->prepare("
789
+		            SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`, `author_displayname`
790
+		            FROM `*PREFIX*sms_relent_sent`
791
+			    WHERE `user_id` = ? OR `from` IN (" . $procalwdphnmbrs . ")");
792
+	                $resultsent = $getsenttbl->execute($procalwduid);
793
+                    } else {
794
+	                $getsenttbl = $this->connection->prepare('
795
+		            SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`, `author_displayname`
796
+		            FROM `*PREFIX*sms_relent_sent`
797
+			    WHERE `user_id` = ?');
798
+	                $resultsent = $getsenttbl->execute($procalwduid);
799
+                    }
800
+                } else {
801
+                    if ($procalwdphnmbrs) {
802
+	                $getsenttbl = $this->connection->prepare("
803
+		            SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`
804
+		            FROM `*PREFIX*sms_relent_sent`
805
+			    WHERE `user_id` = ? OR `from` IN (" . $procalwdphnmbrs . ")");
806
+	                $resultsent = $getsenttbl->execute($procalwduid);
807
+                    } else {
808
+	                $getsenttbl = $this->connection->prepare('
809
+		            SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`
810
+		            FROM `*PREFIX*sms_relent_sent`
811
+			    WHERE `user_id` = ?');
812
+	                $resultsent = $getsenttbl->execute($procalwduid);
813
+                    }
814
+                }
815
+
816
+            } else {
817
+
818
+                if ($crdnamespref == 1) {
819
+                    $getsenttbl = $this->connection->prepare('
820
+		       SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`, `author_displayname`
821
+		       FROM `*PREFIX*sms_relent_sent`
822
+		       WHERE `user_id` = ?');
823
+                    $resultsent = $getsenttbl->execute([$userId]);
824
+                } else {
825
+                    $getsenttbl = $this->connection->prepare('
826
+		       SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`
827
+		       FROM `*PREFIX*sms_relent_sent`
828
+		       WHERE `user_id` = ?');
829
+                    $resultsent = $getsenttbl->execute([$userId]);
830
+                }
831
+            }
832
+        }
833
+
834
+
835
+        $sentdatatable = [];
836
+        while ($rowfetched = $resultsent->fetch()){
837
+               $sentdatatable[] = $rowfetched;
838
+        }
839
+        $resultsent->closeCursor();
840
+
841
+        $sentdatafromdb = $sentdatatable;
842
+
843
+
844
+        if ($this->groupManager->isAdmin($userId)) {
845
+
846
+            $sentdatafdb = ['datarows' => $sentdatafromdb, 'showdispnm' => $crdnamespref];
847
+            return $sentdatafdb;
848
+
849
+        } else {
850
+
851
+            if ($restrdata) {
852
+
853
+                // Clean the phone numbers from tags
854
+                $restrPhfin = [];
855
+                foreach ($restrPhoneNmbrs as $phkey => $phvalue) {
856
+
857
+                    $restrpharr = explode(": ", $phvalue);
858
+                    $restrPhfin[] = $restrpharr[1];
859
+                }
860
+
861
+                // Assemble the array of message rows that excludes the rows for the restricted phone numbers
862
+                foreach ($sentdatafromdb as $smdkey => $smdvalue) {
863
+
864
+                    if (str_contains($smdvalue['from'], "+")) {
865
+                        $fromnmbrarr = explode("+", $smdvalue['from']);
866
+                        if (in_array("+" . $fromnmbrarr[1], $restrPhfin)) {
867
+                            unset($sentdatafromdb[$smdkey]);
868
+                        }
869
+                    } else {
870
+                        $frmnmbrarr = explode(": ", $smdvalue['from']);
871
+                        if (count($frmnmbrarr) == 2) {
872
+                            $nmbtbcmprd = $frmnmbrarr[1];
873
+                        } else { 
874
+                            $nmbtbcmprd = $frmnmbrarr[0];
875
+                        }
876
+
877
+                        if (in_array($nmbtbcmprd, $restrPhfin)) {
878
+                            unset($sentdatafromdb[$smdkey]);
879
+                        }
880
+                    }
881
+                }
882
+
883
+                $sentdatadbproc = array_values($sentdatafromdb);
884
+
885
+                $sentdatafdb = ['datarows' => $sentdatadbproc, 'showdispnm' => $crdnamespref];
886
+                return $sentdatafdb;
887
+
888
+            } else {
889
+
890
+                $sentdatafdb = ['datarows' => $sentdatafromdb, 'showdispnm' => $crdnamespref];
891
+                return $sentdatafdb;
892
+            }
893
+        }
894
+     }
895
+
896
+
897
+     /**
898
+      * @NoAdminRequired
899
+      */
900
+     public function getsenttablefordel($userId) {
901
+
902
+        if ($this->groupManager->isAdmin($userId)) {
903
+
904
+            $getsenttbldel = $this->connection->prepare('
905
+		          SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`, `author_displayname`
906
+		          FROM  `*PREFIX*sms_relent_sent`
907
+		          WHERE `user_id` = ?');
908
+            $resultsentdl = $getsenttbldel->execute([$userId]);
909
+
910
+            $sentdatatable = [];
911
+            while ($rowfetched = $resultsentdl->fetch()){
912
+                   $sentdatatable[] = $rowfetched;
913
+            }
914
+            $resultsentdl->closeCursor();
915
+
916
+            $sentdatafromdb = $sentdatatable;
917
+
918
+            return $sentdatafromdb;
919
+
920
+        } else { return "not permitted"; }
921
+     }
922
+
923
+
924
+     /**
925
+      * @NoAdminRequired
926
+      */
927
+     public function removesentrows($userId, $sentmessagedbIDs) {
928
+
929
+        foreach ($sentmessagedbIDs as $key => $sentrowtodel) {
930
+		 $query = $this->connection->prepare('
931
+		       DELETE FROM `*PREFIX*sms_relent_sent`
932
+		       WHERE `id` = ?');
933
+		 $deleteResult = $query->execute([$sentrowtodel]);
934
+		 $deleteResult->closeCursor();
935
+        }
936
+
937
+	$sqlupdate = $this->connection->prepare('
938
+                  SET @resetsent = 0;
939
+		  UPDATE `*PREFIX*sms_relent_sent`
940
+		  SET `id` = @resetsent := @resetsent + 1;
941
+                  ALTER TABLE `*PREFIX*sms_relent_sent` auto_increment=1;');
942
+	$updateRes = $sqlupdate->execute();
943
+	$updateRes->closeCursor();
944
+     }
945
+
946
+
947
+     /**
948
+      * @NoAdminRequired
949
+      */
950
+     public function getgroupedtable($userId) {
951
+
952
+
953
+        // Get the user's preferences from the settings
954
+        $getpref = $this->connection->prepare('
955
+		       SELECT `user_id`, `show_all_messages`
956
+		       FROM  `*PREFIX*sms_relent_settings` WHERE `user_id` = ?');
957
+        $getprefres = $getpref->execute([$userId]);
958
+        $getprefresdata = $getprefres->fetch();
959
+        $crsampref = $getprefresdata['show_all_messages'];
960
+        $getprefres->closeCursor();
961
+
962
+
963
+        // Collect the users with whom the current admin is sharing his API keys and whose messages he will be able to see
964
+        if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
965
+
966
+            // Get the users that belong to the 'admin' group
967
+            $getadmn = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
968
+            $getadmnres = $getadmn->execute(['admin']);
969
+
970
+            $usersadminsd = [];
971
+            while ($getadmnusrs = $getadmnres->fetch()) {
972
+                   $usersadminsd[] = $getadmnusrs['uid'];
973
+            }
974
+            $getadmnres->closeCursor();
975
+
976
+            // Get the groups and users that were allowed access to the API keys
977
+            $getgrps = $this->connection->prepare('SELECT `user_id`, `tnx_groups_allowed`, `tnx_users_allowed`, `plv_groups_allowed`, `plv_users_allowed`,
978
+                                                  `twl_groups_allowed`, `twl_users_allowed`, `flr_groups_allowed`, `flr_users_allowed` FROM `*PREFIX*sms_relent_subac`
979
+                                                   WHERE `user_id` = ?');
980
+            $getgrpsres = $getgrps->execute([$userId]);
981
+            $getgrpsusr = $getgrpsres->fetch();
982
+            $getgrpsres->closeCursor();
983
+
984
+            if ($getgrpsusr) {
985
+
986
+                if ($getgrpsusr['tnx_users_allowed']) { $tnxusers = explode("|", $getgrpsusr['tnx_users_allowed']); } else { $tnxusers = []; }
987
+                if ($getgrpsusr['plv_users_allowed']) { $plvusers = explode("|", $getgrpsusr['plv_users_allowed']); } else { $plvusers = []; }
988
+                if ($getgrpsusr['twl_users_allowed']) { $twlusers = explode("|", $getgrpsusr['twl_users_allowed']); } else { $twlusers = []; }
989
+                if ($getgrpsusr['flr_users_allowed']) { $flrusers = explode("|", $getgrpsusr['flr_users_allowed']); } else { $flrusers = []; }
990
+
991
+                $allwdusersarr = array_merge($tnxusers, $plvusers, $twlusers, $flrusers);
992
+                $allwdusersunq = array_filter(array_unique($allwdusersarr));
993
+
994
+                if ($getgrpsusr['tnx_groups_allowed']) { $tnxgroups = explode("|", $getgrpsusr['tnx_groups_allowed']); } else { $tnxgroups = []; }
995
+                if ($getgrpsusr['plv_groups_allowed']) { $plvgroups = explode("|", $getgrpsusr['plv_groups_allowed']); } else { $plvgroups = []; }
996
+                if ($getgrpsusr['twl_groups_allowed']) { $twlgroups = explode("|", $getgrpsusr['twl_groups_allowed']); } else { $twlgroups = []; }
997
+                if ($getgrpsusr['flr_groups_allowed']) { $flrgroups = explode("|", $getgrpsusr['flr_groups_allowed']); } else { $flrgroups = []; }
998
+
999
+                $allwdgroupsarr = array_merge($tnxgroups, $plvgroups, $twlgroups, $flrgroups);
1000
+                $allwdgroupsunq = array_filter(array_unique($allwdgroupsarr));
1001
+
1002
+            } else {
1003
+                $allwdusersunq = [];
1004
+                $allwdgroupsunq = [];
1005
+            }
1006
+
1007
+            // Get the username for each Display Name of the allowed users
1008
+            $allwdusersfnl = [];
1009
+            foreach ($allwdusersunq as $alwdusrkey => $alwdusrvalue) {
1010
+
1011
+                         $getacdatausrnm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
1012
+		         $getacdatausrnmres = $getacdatausrnm->execute(['displayname', $alwdusrvalue]);
1013
+		         $acdatausrname = $getacdatausrnmres->fetch();
1014
+                         if ($acdatausrname) {
1015
+                             $allwdusersfnl[] = $acdatausrname['uid'];
1016
+                         }
1017
+                         $getacdatausrnmres->closeCursor();
1018
+            }
1019
+
1020
+            // Get the users from all the allowed groups
1021
+            $allwdusersgrpmlt = [];
1022
+            foreach ($allwdgroupsunq as $prgrpkey => $prgrpvalue) {
1023
+
1024
+                         // Get all the users that belong to the current group
1025
+                         $getusringroup = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
1026
+		         $getusringroupres = $getusringroup->execute([$prgrpvalue]);
1027
+
1028
+		         while ($getusrname = $getusringroupres->fetch()) {
1029
+
1030
+	                        // Ensure the current user is not an admin
1031
+                                if (!in_array($getusrname['uid'], $usersadminsd)) {
1032
+                                     $allwdusersgrpmlt[] = $getusrname['uid'];
1033
+                                }
1034
+                         }
1035
+		         $getusringroupres->closeCursor();
1036
+            }
1037
+            $allwdusersgrpfnl = array_unique($allwdusersgrpmlt);
1038
+            
1039
+            $allusr = array_merge($allwdusersfnl, $allwdusersgrpfnl);
1040
+            $allusruniquest = array_unique($allusr);
1041
+
1042
+            if ($allusruniquest) {
1043
+                array_unshift($allusruniquest, $userId);
1044
+                $allusruniquegr = $allusruniquest;
1045
+            } else { $allusruniquegr = [$userId]; }
1046
+
1047
+            $procardatagr = implode(",", array_fill(0, count($allusruniquegr), "?"));
1048
+        }
1049
+
1050
+        // Get received messages
1051
+
1052
+        // If the user is an admin and he wants to see his messages and the messages of all the users with whom he shares his API keys
1053
+        if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
1054
+
1055
+            $getrecmsgs = $this->connection->prepare("
1056
+			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
1057
+			FROM `*PREFIX*sms_relent_received` WHERE `user_id` IN (" . $procardatagr . ")");
1058
+	    $getrecmsgsres = $getrecmsgs->execute($allusruniquegr);
1059
+
1060
+        // If the user is an admin and he wants to see only his messages
1061
+        } elseif ($crsampref == 0 && $this->groupManager->isAdmin($userId)) {
1062
+
1063
+            $getrecmsgs = $this->connection->prepare('
1064
+			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
1065
+			FROM `*PREFIX*sms_relent_received` WHERE `user_id` = ?');
1066
+	    $getrecmsgsres = $getrecmsgs->execute([$userId]);
1067
+
1068
+        // If the user is not an admin 
1069
+        } elseif (!$this->groupManager->isAdmin($userId)) {
1070
+
1071
+	    // Get the Display Name of the current user
1072
+	    $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
1073
+	    $getacdatadnres = $getacdatadn->execute([$userId, 'displayname']);
1074
+	    $acdatausrdnadm = $getacdatadnres->fetch();
1075
+	    $cruserdname = $acdatausrdnadm['value'];
1076
+	    $getacdatadnres->closeCursor();
1077
+
1078
+            // Get the groups to which the current user belongs
1079
+            $getusrgrp = $this->connection->prepare('
1080
+	          SELECT `gid`, `uid`
1081
+	          FROM  `*PREFIX*group_user`
1082
+                  WHERE `uid` = ?');
1083
+            $getusrgrpres = $getusrgrp->execute([$userId]);
1084
+
1085
+            $usergrps = [];
1086
+            while ($fetchedgrps = $getusrgrpres->fetch()) {
1087
+                   $usergrps[] = $fetchedgrps['gid'];
1088
+            }
1089
+            $getusrgrpres->closeCursor();
1090
+
1091
+            // Get the restrictions from the 'sms_relent_restrict' table
1092
+            $getrestr = $this->connection->prepare('
1093
+		       SELECT `phone_number`, `groups`, `users`
1094
+		       FROM  `*PREFIX*sms_relent_restrict`');
1095
+            $getrestrres = $getrestr->execute();
1096
+
1097
+            $restrdata = [];
1098
+            while ($restrfetched = $getrestrres->fetch()) {
1099
+                   $restrdata[] = $restrfetched;
1100
+            }
1101
+            $getrestrres->closeCursor();
1102
+
1103
+            // Get the phone numbers that the user is allowed/not allowed to use
1104
+            if ($restrdata) {
1105
+
1106
+                $restrPhoneNmbrs = [];
1107
+                $allowedPhoneNmbrs = [];
1108
+                foreach ($restrdata as $rskey => $rsvalue) {
1109
+
1110
+                         $chck = 0;
1111
+                         $restrgrparr = explode("|", $rsvalue['groups']);
1112
+                         foreach ($restrgrparr as $rkey => $rvalue) {
1113
+                                  if ($rvalue) {
1114
+                                      if (strpos(implode("|", $usergrps), $rvalue) !== false) { $chck++; }
1115
+                                  }
1116
+                         }
1117
+                         if (strpos($rsvalue['users'], $cruserdname) !== false) { $chck++; }
1118
+
1119
+                         if ($chck == 0) { 
1120
+                             $restrPhoneNmbrs[] = $rsvalue['phone_number']; 
1121
+                         }
1122
+                }
1123
+
1124
+		$allowedPhNmbrs = $this->getsmsnumbers($userId);
1125
+
1126
+		foreach ($allowedPhNmbrs as $apnkey => $apnvalue) {
1127
+			 $crphnmbr = explode(": ", $apnvalue);
1128
+			 if ($crphnmbr[0] == 'Tx') {
1129
+			     $allowedPhoneNmbrs[] = 'Telnyx: ' . $crphnmbr[1];
1130
+			 } elseif ($crphnmbr[0] == 'Pl') {
1131
+			     $allowedPhoneNmbrs[] = 'Plivo: ' . $crphnmbr[1];
1132
+			 } elseif ($crphnmbr[0] == 'Tw') {
1133
+			     $allowedPhoneNmbrs[] = 'Twilio: ' . $crphnmbr[1];
1134
+			 } elseif ($crphnmbr[0] == 'Fl') {
1135
+			     $allowedPhoneNmbrs[] = 'Flowroute: ' . $crphnmbr[1];
1136
+			 }
1137
+		}
1138
+
1139
+                $procalwdphnmbrs = implode(",", array_fill(0, count($allowedPhoneNmbrs), "?"));
1140
+                array_unshift($allowedPhoneNmbrs, $userId);
1141
+                $procalwduid = $allowedPhoneNmbrs;
1142
+
1143
+                if ($procalwdphnmbrs) {
1144
+	            $getrectable = $this->connection->prepare("
1145
+			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
1146
+			FROM `*PREFIX*sms_relent_received`
1147
+			WHERE `user_id` = ? OR `to` IN (" . $procalwdphnmbrs . ")");
1148
+	            $getrecmsgsres = $getrectable->execute($procalwduid);
1149
+                } else {
1150
+	            $getrectable = $this->connection->prepare('
1151
+			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
1152
+			FROM `*PREFIX*sms_relent_received`
1153
+			WHERE `user_id` = ?');
1154
+	            $getrecmsgsres = $getrectable->execute($procalwduid);
1155
+                }
1156
+
1157
+            } else {
1158
+
1159
+	        $getrectable = $this->connection->prepare('
1160
+			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
1161
+			FROM `*PREFIX*sms_relent_received`
1162
+			WHERE `user_id` = ?');
1163
+	        $getrecmsgsres = $getrectable->execute([$userId]);
1164
+            }
1165
+        }
1166
+
1167
+        $recmsgs = [];
1168
+        while ($rcrowsfetch = $getrecmsgsres->fetch()) {
1169
+               $rcrowsfetch['deliveryreceipt'] = '';
1170
+               $rcrowsfetch['table'] = 'received';
1171
+               $recmsgs[] = $rcrowsfetch;
1172
+        }
1173
+	$getrecmsgsres->closeCursor();
1174
+
1175
+
1176
+        // Get sent messages
1177
+
1178
+        // If the user is an admin and he wants to see his messages and the messages of all the users with whom he shares his API keys
1179
+        if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
1180
+
1181
+            $getsentmsgs = $this->connection->prepare("
1182
+		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
1183
+		       FROM  `*PREFIX*sms_relent_sent` 
1184
+                       WHERE `user_id` IN (" . $procardatagr . ")");
1185
+            $getsentmsgsres = $getsentmsgs->execute($allusruniquegr);
1186
+
1187
+        // If the user is an admin and he wants to see only his messages
1188
+        } elseif ($crsampref == 0 && $this->groupManager->isAdmin($userId)) {
1189
+
1190
+            $getsentmsgs = $this->connection->prepare('
1191
+		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
1192
+		       FROM  `*PREFIX*sms_relent_sent`
1193
+		       WHERE `user_id` = ?');
1194
+            $getsentmsgsres = $getsentmsgs->execute([$userId]);
1195
+
1196
+        // If the user is not an admin 
1197
+        } elseif (!$this->groupManager->isAdmin($userId)) {
1198
+
1199
+            if ($restrdata) {
1200
+                if ($procalwdphnmbrs) {
1201
+                    $getsentmsgs = $this->connection->prepare("
1202
+		        SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
1203
+		        FROM  `*PREFIX*sms_relent_sent`
1204
+			WHERE `user_id` = ? OR `from` IN (" . $procalwdphnmbrs . ")");
1205
+	            $getsentmsgsres = $getsentmsgs->execute($procalwduid);
1206
+                } else {
1207
+                    $getsentmsgs = $this->connection->prepare('
1208
+		        SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
1209
+		        FROM  `*PREFIX*sms_relent_sent`
1210
+			WHERE `user_id` = ?');
1211
+	            $getsentmsgsres = $getsentmsgs->execute($procalwduid);
1212
+                }
1213
+
1214
+            } else {
1215
+
1216
+                $getsentmsgs = $this->connection->prepare('
1217
+		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
1218
+		       FROM  `*PREFIX*sms_relent_sent`
1219
+		       WHERE `user_id` = ?');
1220
+                $getsentmsgsres = $getsentmsgs->execute([$userId]);
1221
+            }
1222
+        }
1223
+
1224
+
1225
+        $sentmsgs = [];
1226
+        while ($rowfetchedsmsg = $getsentmsgsres->fetch()) {
1227
+               $rowfetchedsmsg['table'] = 'sent';
1228
+               $sentmsgs[] = $rowfetchedsmsg;
1229
+        }
1230
+        $getsentmsgsres->closeCursor();
1231
+
1232
+        $groupedfromdb = array_merge($recmsgs, $sentmsgs);
1233
+
1234
+        if ($this->groupManager->isAdmin($userId)) {
1235
+
1236
+            return $groupedfromdb;
1237
+
1238
+        } else {
1239
+
1240
+            if ($restrdata) {
1241
+
1242
+                // Clean the phone numbers from tags
1243
+                $restrPhfin = [];
1244
+                foreach ($restrPhoneNmbrs as $phkey => $phvalue) {
1245
+
1246
+                    $restrpharr = explode(": ", $phvalue);
1247
+                    $restrPhfin[] = $restrpharr[1];
1248
+                }
1249
+
1250
+                // Assemble the array of message rows that excludes the rows for the restricted phone numbers
1251
+                foreach ($groupedfromdb as $gmdkey => $gmdvalue) {
1252
+
1253
+                         if ($gmdvalue['table'] == 'sent') {
1254
+
1255
+                             if (str_contains($gmdvalue['from'], "+")) {
1256
+                                 $fromnmbrarr = explode("+", $gmdvalue['from']);
1257
+                                 if (in_array("+" . $fromnmbrarr[1], $restrPhfin)) {
1258
+                                     unset($groupedfromdb[$gmdkey]);
1259
+                                 }
1260
+                             } else {
1261
+                                 $frmnmbrarr = explode(": ", $gmdvalue['from']);
1262
+                                 if (count($frmnmbrarr) == 2) {
1263
+                                     $nmbtbcmprd = $frmnmbrarr[1];
1264
+                                 } else { 
1265
+                                     $nmbtbcmprd = $frmnmbrarr[0];
1266
+                                 }
1267
+                                 if (in_array($nmbtbcmprd, $restrPhfin)) {
1268
+                                     unset($groupedfromdb[$gmdkey]);
1269
+                                 }
1270
+                             }
1271
+
1272
+                         } elseif ($gmdvalue['table'] == 'received') {
1273
+
1274
+                             if (str_contains($gmdvalue['to'], "+")) {
1275
+                                 $fromnmbrarr = explode("+", $gmdvalue['to']);
1276
+                                 if (in_array("+" . $fromnmbrarr[1], $restrPhfin)) {
1277
+                                     unset($groupedfromdb[$gmdkey]);
1278
+                                 }
1279
+                             } else {
1280
+                                 $tonmbrarr = explode(": ", $gmdvalue['to']);
1281
+                                 if (count($tonmbrarr) == 2) {
1282
+                                     $tonmbrtbcmprd = $tonmbrarr[1];
1283
+                                 } else {
1284
+                                     $tonmbrtbcmprd = $tonmbrarr[0];
1285
+                                 }
1286
+                                 if (in_array($tonmbrtbcmprd, $restrPhfin)) {
1287
+                                     unset($groupedfromdb[$gmdkey]);
1288
+                                 }
1289
+                             }
1290
+                         }
1291
+
1292
+                }
1293
+
1294
+                $groupedfdbproc = array_values($groupedfromdb);
1295
+
1296
+                return $groupedfdbproc;
1297
+
1298
+            } else { return $groupedfromdb; }
1299
+        }
1300
+     }
1301
+
1302
+
1303
+     /**
1304
+      * @NoAdminRequired
1305
+      */
1306
+     public function getgroupedpernumber($userId, $phoneNumber) {
1307
+
1308
+        $phoneNumberpr = "%" . $phoneNumber;
1309
+
1310
+        // Get the user's preferences from the settings
1311
+        $getpref = $this->connection->prepare('
1312
+		       SELECT `user_id`, `show_all_messages`
1313
+		       FROM  `*PREFIX*sms_relent_settings` WHERE `user_id` = ?');
1314
+        $getprefres = $getpref->execute([$userId]);
1315
+        $getprefresdata = $getprefres->fetch();
1316
+        $crsampref = $getprefresdata['show_all_messages'];
1317
+        $getprefres->closeCursor();
1318
+
1319
+
1320
+        // Collect the users with whom the current admin is sharing his API keys and whose messages he will be able to see
1321
+        if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
1322
+
1323
+            // Get the users that belong to the 'admin' group
1324
+            $getadmn = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
1325
+            $getadmnres = $getadmn->execute(['admin']);
1326
+
1327
+            $usersadminsd = [];
1328
+            while ($getadmnusrs = $getadmnres->fetch()) {
1329
+                   $usersadminsd[] = $getadmnusrs['uid'];
1330
+            }
1331
+            $getadmnres->closeCursor();
1332
+
1333
+            // Get the groups and users that were allowed access to the API keys
1334
+            $getgrps = $this->connection->prepare('SELECT `user_id`, `tnx_groups_allowed`, `tnx_users_allowed`, `plv_groups_allowed`, `plv_users_allowed`,
1335
+                                                  `twl_groups_allowed`, `twl_users_allowed`, `flr_groups_allowed`, `flr_users_allowed` FROM `*PREFIX*sms_relent_subac`
1336
+                                                   WHERE `user_id` = ?');
1337
+            $getgrpsres = $getgrps->execute([$userId]);
1338
+            $getgrpsusr = $getgrpsres->fetch();
1339
+            $getgrpsres->closeCursor();
1340
+
1341
+            if ($getgrpsusr) {
1342
+
1343
+                if ($getgrpsusr['tnx_users_allowed']) { $tnxusers = explode("|", $getgrpsusr['tnx_users_allowed']); } else { $tnxusers = []; }
1344
+                if ($getgrpsusr['plv_users_allowed']) { $plvusers = explode("|", $getgrpsusr['plv_users_allowed']); } else { $plvusers = []; }
1345
+                if ($getgrpsusr['twl_users_allowed']) { $twlusers = explode("|", $getgrpsusr['twl_users_allowed']); } else { $twlusers = []; }
1346
+                if ($getgrpsusr['flr_users_allowed']) { $flrusers = explode("|", $getgrpsusr['flr_users_allowed']); } else { $flrusers = []; }
1347
+
1348
+                $allwdusersarr = array_merge($tnxusers, $plvusers, $twlusers, $flrusers);
1349
+                $allwdusersunq = array_filter(array_unique($allwdusersarr));
1350
+
1351
+                if ($getgrpsusr['tnx_groups_allowed']) { $tnxgroups = explode("|", $getgrpsusr['tnx_groups_allowed']); } else { $tnxgroups = []; }
1352
+                if ($getgrpsusr['plv_groups_allowed']) { $plvgroups = explode("|", $getgrpsusr['plv_groups_allowed']); } else { $plvgroups = []; }
1353
+                if ($getgrpsusr['twl_groups_allowed']) { $twlgroups = explode("|", $getgrpsusr['twl_groups_allowed']); } else { $twlgroups = []; }
1354
+                if ($getgrpsusr['flr_groups_allowed']) { $flrgroups = explode("|", $getgrpsusr['flr_groups_allowed']); } else { $flrgroups = []; }
1355
+
1356
+                $allwdgroupsarr = array_merge($tnxgroups, $plvgroups, $twlgroups, $flrgroups);
1357
+                $allwdgroupsunq = array_filter(array_unique($allwdgroupsarr));
1358
+
1359
+            } else {
1360
+                $allwdusersunq = [];
1361
+                $allwdgroupsunq = [];
1362
+            }
1363
+
1364
+            // Get the username for each Display Name of the allowed users
1365
+            $allwdusersfnl = [];
1366
+            foreach ($allwdusersunq as $alwdusrkey => $alwdusrvalue) {
1367
+
1368
+                         $getacdatausrnm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
1369
+		         $getacdatausrnmres = $getacdatausrnm->execute(['displayname', $alwdusrvalue]);
1370
+		         $acdatausrname = $getacdatausrnmres->fetch();
1371
+                         if ($acdatausrname) {
1372
+                             $allwdusersfnl[] = $acdatausrname['uid'];
1373
+                         }
1374
+                         $getacdatausrnmres->closeCursor();
1375
+            }
1376
+
1377
+            // Get the users from all the allowed groups
1378
+            $allwdusersgrpmlt = [];
1379
+            foreach ($allwdgroupsunq as $prgrpkey => $prgrpvalue) {
1380
+
1381
+                         // Get all the users that belong to the current group
1382
+                         $getusringroup = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
1383
+		         $getusringroupres = $getusringroup->execute([$prgrpvalue]);
1384
+
1385
+		         while ($getusrname = $getusringroupres->fetch()) {
1386
+
1387
+	                        // Ensure the current user is not an admin
1388
+                                if (!in_array($getusrname['uid'], $usersadminsd)) {
1389
+                                     $allwdusersgrpmlt[] = $getusrname['uid'];
1390
+                                }
1391
+                         }
1392
+		         $getusringroupres->closeCursor();
1393
+            }
1394
+            $allwdusersgrpfnl = array_unique($allwdusersgrpmlt);
1395
+            
1396
+            $allusr = array_merge($allwdusersfnl, $allwdusersgrpfnl);
1397
+            $allusruniquest = array_unique($allusr);
1398
+
1399
+            if ($allusruniquest) {
1400
+                array_unshift($allusruniquest, $userId);
1401
+                $allusruniquepn = $allusruniquest;
1402
+            } else { $allusruniquepn = [$userId]; }
1403
+
1404
+            $allusruniquepnst = $allusruniquepn;
1405
+
1406
+            $procardatapn = implode(",", array_fill(0, count($allusruniquepn), "?"));
1407
+
1408
+            array_unshift($allusruniquepn, $phoneNumber, $phoneNumberpr);
1409
+            $allusruniquead = $allusruniquepn;
1410
+
1411
+            array_unshift($allusruniquepnst, $phoneNumberpr, $phoneNumber);
1412
+            $allusruniqueadst = $allusruniquepnst;
1413
+        }
1414
+
1415
+
1416
+        // Get received messages
1417
+
1418
+        // If the user is an admin and he wants to see his messages and the messages of all the users with whom he shares his API keys
1419
+        if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
1420
+
1421
+            $getrecmsgs = $this->connection->prepare("
1422
+			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
1423
+			FROM `*PREFIX*sms_relent_received` 
1424
+                        WHERE (`from` = ? OR `to` LIKE ?) AND `user_id` IN (" . $procardatapn . ")");
1425
+	    $getrecmsgsres = $getrecmsgs->execute($allusruniquead);
1426
+
1427
+        // If the user is an admin and he wants to see only his messages
1428
+        } elseif ($crsampref == 0 && $this->groupManager->isAdmin($userId)) {
1429
+
1430
+            $getrecmsgs = $this->connection->prepare('
1431
+			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
1432
+			FROM `*PREFIX*sms_relent_received` 
1433
+                        WHERE `user_id` = ? AND (`from` = ? OR `to` LIKE ?)');
1434
+	    $getrecmsgsres = $getrecmsgs->execute([$userId, $phoneNumber, $phoneNumberpr]);
1435
+
1436
+        // If the user is not an admin 
1437
+        } elseif (!$this->groupManager->isAdmin($userId)) {
1438
+
1439
+	    // Get the Display Name of the current user
1440
+	    $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
1441
+	    $getacdatadnres = $getacdatadn->execute([$userId, 'displayname']);
1442
+	    $acdatausrdnadm = $getacdatadnres->fetch();
1443
+	    $cruserdname = $acdatausrdnadm['value'];
1444
+	    $getacdatadnres->closeCursor();
1445
+
1446
+            // Get the groups to which the current user belongs
1447
+            $getusrgrp = $this->connection->prepare('
1448
+	          SELECT `gid`, `uid`
1449
+	          FROM  `*PREFIX*group_user`
1450
+                  WHERE `uid` = ?');
1451
+            $getusrgrpres = $getusrgrp->execute([$userId]);
1452
+
1453
+            $usergrps = [];
1454
+            while ($fetchedgrps = $getusrgrpres->fetch()) {
1455
+                   $usergrps[] = $fetchedgrps['gid'];
1456
+            }
1457
+            $getusrgrpres->closeCursor();
1458
+
1459
+            // Get the restrictions from the 'sms_relent_restrict' table
1460
+            $getrestr = $this->connection->prepare('
1461
+		       SELECT `phone_number`, `groups`, `users`
1462
+		       FROM  `*PREFIX*sms_relent_restrict`');
1463
+            $getrestrres = $getrestr->execute();
1464
+
1465
+            $restrdata = [];
1466
+            while ($restrfetched = $getrestrres->fetch()) {
1467
+                   $restrdata[] = $restrfetched;
1468
+            }
1469
+            $getrestrres->closeCursor();
1470
+
1471
+            // Get the phone numbers that the user is allowed/not allowed to use
1472
+            if ($restrdata) {
1473
+
1474
+                $restrPhoneNmbrs = [];
1475
+                $allowedPhoneNmbrs = [];
1476
+                foreach ($restrdata as $rskey => $rsvalue) {
1477
+
1478
+                         $chck = 0;
1479
+                         $restrgrparr = explode("|", $rsvalue['groups']);
1480
+                         foreach ($restrgrparr as $rkey => $rvalue) {
1481
+                                  if ($rvalue) {
1482
+                                      if (strpos(implode("|", $usergrps), $rvalue) !== false) { $chck++; }
1483
+                                  }
1484
+                         }
1485
+                         if (strpos($rsvalue['users'], $cruserdname) !== false) { $chck++; }
1486
+
1487
+                         if ($chck == 0) { 
1488
+                             $restrPhoneNmbrs[] = $rsvalue['phone_number']; 
1489
+                         }
1490
+                }
1491
+
1492
+		$allowedPhNmbrs = $this->getsmsnumbers($userId);
1493
+
1494
+		foreach ($allowedPhNmbrs as $apnkey => $apnvalue) {
1495
+			 $crphnmbr = explode(": ", $apnvalue);
1496
+			 if ($crphnmbr[0] == 'Tx') {
1497
+			     $allowedPhoneNmbrs[] = 'Telnyx: ' . $crphnmbr[1];
1498
+			 } elseif ($crphnmbr[0] == 'Pl') {
1499
+			     $allowedPhoneNmbrs[] = 'Plivo: ' . $crphnmbr[1];
1500
+			 } elseif ($crphnmbr[0] == 'Tw') {
1501
+			     $allowedPhoneNmbrs[] = 'Twilio: ' . $crphnmbr[1];
1502
+			 } elseif ($crphnmbr[0] == 'Fl') {
1503
+			     $allowedPhoneNmbrs[] = 'Flowroute: ' . $crphnmbr[1];
1504
+			 }
1505
+		}
1506
+
1507
+                $allowedPhoneNmbrscp = $allowedPhoneNmbrs;
1508
+
1509
+                $procalwdphnmbrs = implode(",", array_fill(0, count($allowedPhoneNmbrs), "?"));
1510
+
1511
+                array_unshift($allowedPhoneNmbrs, $userId);
1512
+                array_push($allowedPhoneNmbrs, $phoneNumber, $phoneNumberpr);
1513
+                $procalwduid = $allowedPhoneNmbrs;
1514
+
1515
+                array_unshift($allowedPhoneNmbrscp, $userId);
1516
+                array_push($allowedPhoneNmbrscp, $phoneNumberpr, $phoneNumber);
1517
+                $procalwduidcp = $allowedPhoneNmbrscp;
1518
+
1519
+                if ($procalwdphnmbrs) {
1520
+	            $getrecmsgs = $this->connection->prepare("
1521
+			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
1522
+			FROM `*PREFIX*sms_relent_received`
1523
+			WHERE (`user_id` = ? OR `to` IN (" . $procalwdphnmbrs . ")) AND (`from` = ? OR `to` LIKE ?)");
1524
+	            $getrecmsgsres = $getrecmsgs->execute($procalwduid);
1525
+                } else {
1526
+	            $getrecmsgs = $this->connection->prepare('
1527
+			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
1528
+			FROM `*PREFIX*sms_relent_received`
1529
+			WHERE `user_id` = ? AND (`from` = ? OR `to` LIKE ?)');
1530
+	            $getrecmsgsres = $getrecmsgs->execute($procalwduid);
1531
+                }
1532
+
1533
+            } else {
1534
+
1535
+                $getrecmsgs = $this->connection->prepare('
1536
+			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
1537
+			FROM `*PREFIX*sms_relent_received`
1538
+			WHERE `user_id` = ? AND (`from` = ? OR `to` LIKE ?)');
1539
+	        $getrecmsgsres = $getrecmsgs->execute([$userId, $phoneNumber, $phoneNumberpr]);
1540
+            }
1541
+        }
1542
+
1543
+
1544
+        $recmsgs = [];
1545
+        while ($rcrowsfetch = $getrecmsgsres->fetch()) {
1546
+               $rcrowsfetch['deliveryreceipt'] = '';
1547
+               $rcrowsfetch['table'] = 'received';
1548
+               $recmsgs[] = $rcrowsfetch;
1549
+        }
1550
+	$getrecmsgsres->closeCursor();
1551
+
1552
+
1553
+        // Get sent messages
1554
+
1555
+        // If the user is an admin and he wants to see his messages and the messages of all the users with whom he shares his API keys
1556
+        if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
1557
+
1558
+            $getsentmsgs = $this->connection->prepare("
1559
+		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
1560
+		       FROM  `*PREFIX*sms_relent_sent` 
1561
+                       WHERE (`from` LIKE ? OR `to` = ?) AND `user_id` IN (" . $procardatapn . ")");
1562
+            $getsentmsgsres = $getsentmsgs->execute($allusruniqueadst);
1563
+
1564
+
1565
+        // If the user is an admin and he wants to see only his messages
1566
+        } elseif ($crsampref == 0 && $this->groupManager->isAdmin($userId)) {
1567
+
1568
+            $getsentmsgs = $this->connection->prepare('
1569
+		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
1570
+		       FROM  `*PREFIX*sms_relent_sent`
1571
+		       WHERE `user_id` = ? AND (`from` LIKE ? OR `to` = ?)');
1572
+            $getsentmsgsres = $getsentmsgs->execute([$userId, $phoneNumberpr, $phoneNumber]);
1573
+
1574
+
1575
+        // If the user is not an admin 
1576
+        } elseif (!$this->groupManager->isAdmin($userId)) {
1577
+
1578
+            if ($restrdata) {
1579
+                if ($procalwdphnmbrs) {
1580
+                    $getsentmsgs = $this->connection->prepare("
1581
+		        SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
1582
+		        FROM  `*PREFIX*sms_relent_sent`
1583
+			WHERE (`user_id` = ? OR `from` IN (" . $procalwdphnmbrs . ")) AND (`from` LIKE ? OR `to` = ?)");
1584
+	            $getsentmsgsres = $getsentmsgs->execute($procalwduidcp);
1585
+                } else {
1586
+                    $getsentmsgs = $this->connection->prepare('
1587
+		        SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
1588
+		        FROM  `*PREFIX*sms_relent_sent`
1589
+			WHERE `user_id` = ? AND (`from` LIKE ? OR `to` = ?)');
1590
+	            $getsentmsgsres = $getsentmsgs->execute($procalwduidcp);
1591
+                }
1592
+
1593
+            } else {
1594
+
1595
+                $getsentmsgs = $this->connection->prepare('
1596
+		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
1597
+		       FROM  `*PREFIX*sms_relent_sent`
1598
+		       WHERE `user_id` = ? AND (`from` LIKE ? OR `to` = ?)');
1599
+                $getsentmsgsres = $getsentmsgs->execute([$userId, $phoneNumberpr, $phoneNumber]);
1600
+            }
1601
+        }
1602
+
1603
+        $sentmsgs = [];
1604
+        while ($rowfetchedsmsg = $getsentmsgsres->fetch()) {
1605
+               $rowfetchedsmsg['table'] = 'sent';
1606
+               $sentmsgs[] = $rowfetchedsmsg;
1607
+        }
1608
+        $getsentmsgsres->closeCursor();
1609
+
1610
+        $groupedpernb = array_merge($recmsgs, $sentmsgs);
1611
+
1612
+        if ($this->groupManager->isAdmin($userId)) {
1613
+
1614
+            return $groupedpernb;
1615
+
1616
+        } else {
1617
+
1618
+            if ($restrdata) {
1619
+
1620
+                // Clean the phone numbers from tags
1621
+                $restrPhfin = [];
1622
+                foreach ($restrPhoneNmbrs as $phkey => $phvalue) {
1623
+
1624
+                    $restrpharr = explode(": ", $phvalue);
1625
+                    $restrPhfin[] = $restrpharr[1];
1626
+                }
1627
+
1628
+                // Assemble the array of message rows that excludes the rows for the restricted phone numbers
1629
+                foreach ($groupedpernb as $gmdkey => $gmdvalue) {
1630
+
1631
+                         if ($gmdvalue['table'] == 'sent') {
1632
+
1633
+                             if (str_contains($gmdvalue['from'], "+")) {
1634
+                                 $fromnmbrarr = explode("+", $gmdvalue['from']);
1635
+                                 if (in_array("+" . $fromnmbrarr[1], $restrPhfin)) {
1636
+                                     unset($groupedpernb[$gmdkey]);
1637
+                                 }
1638
+                             } else {
1639
+                                 $frmnmbrarr = explode(": ", $gmdvalue['from']);
1640
+                                 if (count($frmnmbrarr) == 2) {
1641
+                                     $nmbtbcmprd = $frmnmbrarr[1];
1642
+                                 } else { 
1643
+                                     $nmbtbcmprd = $frmnmbrarr[0];
1644
+                                 }
1645
+                                 if (in_array($nmbtbcmprd, $restrPhfin)) {
1646
+                                     unset($groupedpernb[$gmdkey]);
1647
+                                 }
1648
+                             }
1649
+
1650
+                         } elseif ($gmdvalue['table'] == 'received') {
1651
+
1652
+                             if (str_contains($gmdvalue['to'], "+")) {
1653
+                                 $fromnmbrarr = explode("+", $gmdvalue['to']);
1654
+                                 if (in_array("+" . $fromnmbrarr[1], $restrPhfin)) {
1655
+                                     unset($groupedpernb[$gmdkey]);
1656
+                                 }
1657
+                             } else {
1658
+                                 $tonmbrarr = explode(": ", $gmdvalue['to']);
1659
+                                 if (count($tonmbrarr) == 2) {
1660
+                                     $tonmbrtbcmprd = $tonmbrarr[1];
1661
+                                 } else {
1662
+                                     $tonmbrtbcmprd = $tonmbrarr[0];
1663
+                                 }
1664
+                                 if (in_array($tonmbrtbcmprd, $restrPhfin)) {
1665
+                                     unset($groupedpernb[$gmdkey]);
1666
+                                 }
1667
+                             }
1668
+                         }
1669
+
1670
+                }
1671
+
1672
+                $groupedpernbprc = array_values($groupedpernb);
1673
+
1674
+                return $groupedpernbprc;
1675
+
1676
+            } else { return $groupedpernb; }
1677
+        }
1678
+     }
1679
+
1680
+
1681
+     /**
1682
+      * @NoAdminRequired
1683
+      */
1684
+     public function getgroupedforreply($userId, $phoneNmbrFrom, $phoneNmbrTo) {
1685
+
1686
+        $phoneNmbrFrompr = "%" . $phoneNmbrFrom;
1687
+        $phoneNmbrTopr = "%" . $phoneNmbrTo;
1688
+
1689
+        // Get the user's preferences from the settings
1690
+        $getpref = $this->connection->prepare('
1691
+		       SELECT `user_id`, `show_all_messages`
1692
+		       FROM  `*PREFIX*sms_relent_settings` WHERE `user_id` = ?');
1693
+        $getprefres = $getpref->execute([$userId]);
1694
+        $getprefresdata = $getprefres->fetch();
1695
+        $crsampref = $getprefresdata['show_all_messages'];
1696
+        $getprefres->closeCursor();
1697
+
1698
+
1699
+        // Collect the users with whom the current admin is sharing his API keys and whose messages he will be able to see
1700
+        if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
1701
+
1702
+            // Get the users that belong to the 'admin' group
1703
+            $getadmn = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
1704
+            $getadmnres = $getadmn->execute(['admin']);
1705
+
1706
+            $usersadminsd = [];
1707
+            while ($getadmnusrs = $getadmnres->fetch()) {
1708
+                   $usersadminsd[] = $getadmnusrs['uid'];
1709
+            }
1710
+            $getadmnres->closeCursor();
1711
+
1712
+            // Get the groups and users that were allowed access to the API keys
1713
+            $getgrps = $this->connection->prepare('SELECT `user_id`, `tnx_groups_allowed`, `tnx_users_allowed`, `plv_groups_allowed`, `plv_users_allowed`,
1714
+                                                  `twl_groups_allowed`, `twl_users_allowed`, `flr_groups_allowed`, `flr_users_allowed` FROM `*PREFIX*sms_relent_subac`
1715
+                                                   WHERE `user_id` = ?');
1716
+            $getgrpsres = $getgrps->execute([$userId]);
1717
+            $getgrpsusr = $getgrpsres->fetch();
1718
+            $getgrpsres->closeCursor();
1719
+
1720
+            if ($getgrpsusr) {
1721
+
1722
+                if ($getgrpsusr['tnx_users_allowed']) { $tnxusers = explode("|", $getgrpsusr['tnx_users_allowed']); } else { $tnxusers = []; }
1723
+                if ($getgrpsusr['plv_users_allowed']) { $plvusers = explode("|", $getgrpsusr['plv_users_allowed']); } else { $plvusers = []; }
1724
+                if ($getgrpsusr['twl_users_allowed']) { $twlusers = explode("|", $getgrpsusr['twl_users_allowed']); } else { $twlusers = []; }
1725
+                if ($getgrpsusr['flr_users_allowed']) { $flrusers = explode("|", $getgrpsusr['flr_users_allowed']); } else { $flrusers = []; }
1726
+
1727
+                $allwdusersarr = array_merge($tnxusers, $plvusers, $twlusers, $flrusers);
1728
+                $allwdusersunq = array_filter(array_unique($allwdusersarr));
1729
+
1730
+                if ($getgrpsusr['tnx_groups_allowed']) { $tnxgroups = explode("|", $getgrpsusr['tnx_groups_allowed']); } else { $tnxgroups = []; }
1731
+                if ($getgrpsusr['plv_groups_allowed']) { $plvgroups = explode("|", $getgrpsusr['plv_groups_allowed']); } else { $plvgroups = []; }
1732
+                if ($getgrpsusr['twl_groups_allowed']) { $twlgroups = explode("|", $getgrpsusr['twl_groups_allowed']); } else { $twlgroups = []; }
1733
+                if ($getgrpsusr['flr_groups_allowed']) { $flrgroups = explode("|", $getgrpsusr['flr_groups_allowed']); } else { $flrgroups = []; }
1734
+
1735
+                $allwdgroupsarr = array_merge($tnxgroups, $plvgroups, $twlgroups, $flrgroups);
1736
+                $allwdgroupsunq = array_filter(array_unique($allwdgroupsarr));
1737
+
1738
+            } else {
1739
+                $allwdusersunq = [];
1740
+                $allwdgroupsunq = [];
1741
+            }
1742
+
1743
+            // Get the username for each Display Name of the allowed users
1744
+            $allwdusersfnl = [];
1745
+            foreach ($allwdusersunq as $alwdusrkey => $alwdusrvalue) {
1746
+
1747
+                         $getacdatausrnm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
1748
+		         $getacdatausrnmres = $getacdatausrnm->execute(['displayname', $alwdusrvalue]);
1749
+		         $acdatausrname = $getacdatausrnmres->fetch();
1750
+                         if ($acdatausrname) {
1751
+                             $allwdusersfnl[] = $acdatausrname['uid'];
1752
+                         }
1753
+                         $getacdatausrnmres->closeCursor();
1754
+            }
1755
+
1756
+            // Get the users from all the allowed groups
1757
+            $allwdusersgrpmlt = [];
1758
+            foreach ($allwdgroupsunq as $prgrpkey => $prgrpvalue) {
1759
+
1760
+                         // Get all the users that belong to the current group
1761
+                         $getusringroup = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
1762
+		         $getusringroupres = $getusringroup->execute([$prgrpvalue]);
1763
+
1764
+		         while ($getusrname = $getusringroupres->fetch()) {
1765
+
1766
+	                        // Ensure the current user is not an admin
1767
+                                if (!in_array($getusrname['uid'], $usersadminsd)) {
1768
+                                     $allwdusersgrpmlt[] = $getusrname['uid'];
1769
+                                }
1770
+                         }
1771
+		         $getusringroupres->closeCursor();
1772
+            }
1773
+            $allwdusersgrpfnl = array_unique($allwdusersgrpmlt);
1774
+            
1775
+            $allusr = array_merge($allwdusersfnl, $allwdusersgrpfnl);
1776
+            $allusruniquest = array_unique($allusr);
1777
+
1778
+            if ($allusruniquest) {
1779
+                array_unshift($allusruniquest, $userId);
1780
+                $allusruniquerp = $allusruniquest;
1781
+            } else { $allusruniquerp = [$userId]; }
1782
+
1783
+            $allusruniquerpst = $allusruniquerp;
1784
+
1785
+            $procardatarp = implode(",", array_fill(0, count($allusruniquerp), "?"));
1786
+
1787
+            array_unshift($allusruniquerp, $phoneNmbrFrom, $phoneNmbrTopr, $phoneNmbrTo, $phoneNmbrFrompr);
1788
+            $allusruniqueadrp = $allusruniquerp;
1789
+
1790
+            array_unshift($allusruniquerpst, $phoneNmbrFrompr, $phoneNmbrTo, $phoneNmbrTopr, $phoneNmbrFrom);
1791
+            $allusruniqueadrpst = $allusruniquerpst;
1792
+        }
1793
+
1794
+
1795
+        // Get received messages
1796
+
1797
+        // If the user is an admin and he wants to see his messages and the messages of all the users with whom he shares his API keys
1798
+        if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
1799
+
1800
+            $getrecmsgs = $this->connection->prepare("
1801
+			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
1802
+			FROM `*PREFIX*sms_relent_received` 
1803
+                        WHERE ((`from` = ? AND `to` LIKE ?) OR (`from` = ? AND `to` LIKE ?)) AND `user_id` IN (" . $procardatarp . ")");
1804
+	    $getrecmsgsres = $getrecmsgs->execute($allusruniqueadrp);
1805
+
1806
+        // If the user is an admin and he wants to see only his messages
1807
+        } elseif ($crsampref == 0 && $this->groupManager->isAdmin($userId)) {
1808
+
1809
+            $getrecmsgs = $this->connection->prepare('
1810
+			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
1811
+			FROM  `*PREFIX*sms_relent_received`
1812
+			WHERE `user_id` = ? AND ((`from` = ? AND `to` LIKE ?) OR (`from` = ? AND `to` LIKE ?))');
1813
+	    $getrecmsgsres = $getrecmsgs->execute([$userId, $phoneNmbrFrom, $phoneNmbrTopr, $phoneNmbrTo, $phoneNmbrFrompr]);
1814
+
1815
+        // If the user is not an admin 
1816
+        } elseif (!$this->groupManager->isAdmin($userId)) {
1817
+
1818
+	    // Get the Display Name of the current user
1819
+	    $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
1820
+	    $getacdatadnres = $getacdatadn->execute([$userId, 'displayname']);
1821
+	    $acdatausrdnadm = $getacdatadnres->fetch();
1822
+	    $cruserdname = $acdatausrdnadm['value'];
1823
+	    $getacdatadnres->closeCursor();
1824
+
1825
+            // Get the groups to which the current user belongs
1826
+            $getusrgrp = $this->connection->prepare('
1827
+	          SELECT `gid`, `uid`
1828
+	          FROM  `*PREFIX*group_user`
1829
+                  WHERE `uid` = ?');
1830
+            $getusrgrpres = $getusrgrp->execute([$userId]);
1831
+
1832
+            $usergrps = [];
1833
+            while ($fetchedgrps = $getusrgrpres->fetch()) {
1834
+                   $usergrps[] = $fetchedgrps['gid'];
1835
+            }
1836
+            $getusrgrpres->closeCursor();
1837
+
1838
+            // Get the restrictions from the 'sms_relent_restrict' table
1839
+            $getrestr = $this->connection->prepare('
1840
+		       SELECT `phone_number`, `groups`, `users`
1841
+		       FROM  `*PREFIX*sms_relent_restrict`');
1842
+            $getrestrres = $getrestr->execute();
1843
+
1844
+            $restrdata = [];
1845
+            while ($restrfetched = $getrestrres->fetch()) {
1846
+                   $restrdata[] = $restrfetched;
1847
+            }
1848
+            $getrestrres->closeCursor();
1849
+
1850
+            // Get the phone numbers that the user is allowed/not allowed to use
1851
+            if ($restrdata) {
1852
+
1853
+                $restrPhoneNmbrs = [];
1854
+                $allowedPhoneNmbrs = [];
1855
+                foreach ($restrdata as $rskey => $rsvalue) {
1856
+
1857
+                         $chck = 0;
1858
+                         $restrgrparr = explode("|", $rsvalue['groups']);
1859
+                         foreach ($restrgrparr as $rkey => $rvalue) {
1860
+                                  if ($rvalue) {
1861
+                                      if (strpos(implode("|", $usergrps), $rvalue) !== false) { $chck++; }
1862
+                                  }
1863
+                         }
1864
+                         if (strpos($rsvalue['users'], $cruserdname) !== false) { $chck++; }
1865
+
1866
+                         if ($chck == 0) { 
1867
+                             $restrPhoneNmbrs[] = $rsvalue['phone_number']; 
1868
+                         }
1869
+                }
1870
+
1871
+		$allowedPhNmbrs = $this->getsmsnumbers($userId);
1872
+
1873
+		foreach ($allowedPhNmbrs as $apnkey => $apnvalue) {
1874
+			 $crphnmbr = explode(": ", $apnvalue);
1875
+			 if ($crphnmbr[0] == 'Tx') {
1876
+			     $allowedPhoneNmbrs[] = 'Telnyx: ' . $crphnmbr[1];
1877
+			 } elseif ($crphnmbr[0] == 'Pl') {
1878
+			     $allowedPhoneNmbrs[] = 'Plivo: ' . $crphnmbr[1];
1879
+			 } elseif ($crphnmbr[0] == 'Tw') {
1880
+			     $allowedPhoneNmbrs[] = 'Twilio: ' . $crphnmbr[1];
1881
+			 } elseif ($crphnmbr[0] == 'Fl') {
1882
+			     $allowedPhoneNmbrs[] = 'Flowroute: ' . $crphnmbr[1];
1883
+			 }
1884
+		}
1885
+
1886
+                $allowedPhoneNmbrscpr = $allowedPhoneNmbrs;
1887
+
1888
+                $procalwdphnmbrs = implode(",", array_fill(0, count($allowedPhoneNmbrs), "?"));
1889
+
1890
+                array_unshift($allowedPhoneNmbrs, $userId);
1891
+                array_push($allowedPhoneNmbrs, $phoneNmbrFrom, $phoneNmbrTopr, $phoneNmbrTo, $phoneNmbrFrompr);
1892
+                $procalwduid = $allowedPhoneNmbrs;
1893
+
1894
+                array_unshift($allowedPhoneNmbrscpr, $userId);
1895
+                array_push($allowedPhoneNmbrscpr, $phoneNmbrFrompr, $phoneNmbrTo, $phoneNmbrTopr, $phoneNmbrFrom);
1896
+                $procalwduidcpr = $allowedPhoneNmbrscpr;
1897
+
1898
+                if ($procalwdphnmbrs) {
1899
+	            $getrecmsgs = $this->connection->prepare("
1900
+			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
1901
+			FROM `*PREFIX*sms_relent_received`
1902
+			WHERE (`user_id` = ? OR `to` IN (" . $procalwdphnmbrs . ")) AND ((`from` = ? AND `to` LIKE ?) OR (`from` = ? AND `to` LIKE ?))");
1903
+	            $getrecmsgsres = $getrecmsgs->execute($procalwduid);
1904
+                } else {
1905
+	            $getrecmsgs = $this->connection->prepare('
1906
+			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
1907
+			FROM `*PREFIX*sms_relent_received`
1908
+			WHERE `user_id` = ? AND ((`from` = ? AND `to` LIKE ?) OR (`from` = ? AND `to` LIKE ?))');
1909
+	            $getrecmsgsres = $getrecmsgs->execute($procalwduid);
1910
+                }
1911
+
1912
+            } else {
1913
+
1914
+                $getrecmsgs = $this->connection->prepare('
1915
+			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
1916
+			FROM  `*PREFIX*sms_relent_received`
1917
+			WHERE `user_id` = ? AND ((`from` = ? AND `to` LIKE ?) OR (`from` = ? AND `to` LIKE ?))');
1918
+	        $getrecmsgsres = $getrecmsgs->execute([$userId, $phoneNmbrFrom, $phoneNmbrTopr, $phoneNmbrTo, $phoneNmbrFrompr]);
1919
+            }
1920
+        }
1921
+
1922
+        $recmsgs = [];
1923
+        while ($rcrowsfetch = $getrecmsgsres->fetch()) {
1924
+               $rcrowsfetch['deliveryreceipt'] = '';
1925
+               $rcrowsfetch['table'] = 'received';
1926
+               $recmsgs[] = $rcrowsfetch;
1927
+        }
1928
+	$getrecmsgsres->closeCursor();
1929
+
1930
+
1931
+        // Get sent messages
1932
+
1933
+        // If the user is an admin and he wants to see his messages and the messages of all the users with whom he shares his API keys
1934
+        if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
1935
+
1936
+            $getsentmsgs = $this->connection->prepare("
1937
+		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
1938
+		       FROM  `*PREFIX*sms_relent_sent` 
1939
+                       WHERE ((`from` LIKE ? AND `to` = ?) OR (`from` LIKE ? AND `to` = ?)) AND `user_id` IN (" . $procardatarp . ")");
1940
+            $getsentmsgsres = $getsentmsgs->execute($allusruniqueadrpst);
1941
+
1942
+        // If the user is an admin and he wants to see only his messages
1943
+        } elseif ($crsampref == 0 && $this->groupManager->isAdmin($userId)) {
1944
+
1945
+            $getsentmsgs = $this->connection->prepare('
1946
+		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
1947
+		       FROM `*PREFIX*sms_relent_sent`
1948
+		       WHERE `user_id` = ? AND ((`from` LIKE ? AND `to` = ?) OR (`from` LIKE ? AND `to` = ?))');
1949
+            $getsentmsgsres = $getsentmsgs->execute([$userId, $phoneNmbrFrompr, $phoneNmbrTo, $phoneNmbrTopr, $phoneNmbrFrom]);
1950
+
1951
+        // If the user is not an admin
1952
+        } elseif (!$this->groupManager->isAdmin($userId)) {
1953
+
1954
+            if ($restrdata) {
1955
+                if ($procalwdphnmbrs) {
1956
+                    $getsentmsgs = $this->connection->prepare("
1957
+		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
1958
+		       FROM `*PREFIX*sms_relent_sent`
1959
+		       WHERE (`user_id` = ? OR `from` IN (" . $procalwdphnmbrs . ")) AND ((`from` LIKE ? AND `to` = ?) OR (`from` LIKE ? AND `to` = ?))");
1960
+	            $getsentmsgsres = $getsentmsgs->execute($procalwduidcpr);
1961
+                } else {
1962
+                    $getsentmsgs = $this->connection->prepare('
1963
+		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
1964
+		       FROM `*PREFIX*sms_relent_sent`
1965
+		       WHERE `user_id` = ? AND ((`from` LIKE ? AND `to` = ?) OR (`from` LIKE ? AND `to` = ?))');
1966
+	            $getsentmsgsres = $getsentmsgs->execute($procalwduidcpr);
1967
+                }
1968
+
1969
+            } else {
1970
+
1971
+                $getsentmsgs = $this->connection->prepare('
1972
+		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
1973
+		       FROM `*PREFIX*sms_relent_sent`
1974
+		       WHERE `user_id` = ? AND ((`from` LIKE ? AND `to` = ?) OR (`from` LIKE ? AND `to` = ?))');
1975
+                $getsentmsgsres = $getsentmsgs->execute([$userId, $phoneNmbrFrompr, $phoneNmbrTo, $phoneNmbrTopr, $phoneNmbrFrom]);
1976
+            }
1977
+        }
1978
+
1979
+        $sentmsgs = [];
1980
+        while ($rowfetchedsmsg = $getsentmsgsres->fetch()) {
1981
+               $rowfetchedsmsg['table'] = 'sent';
1982
+               $sentmsgs[] = $rowfetchedsmsg;
1983
+        }
1984
+        $getsentmsgsres->closeCursor();
1985
+
1986
+        $groupedpernb = array_merge($recmsgs, $sentmsgs);
1987
+
1988
+        if ($this->groupManager->isAdmin($userId)) {
1989
+
1990
+            return $groupedpernb;
1991
+
1992
+        } else {
1993
+
1994
+            if ($restrdata) {
1995
+
1996
+                // Clean the phone numbers from tags
1997
+                $restrPhfin = [];
1998
+                foreach ($restrPhoneNmbrs as $phkey => $phvalue) {
1999
+
2000
+                    $restrpharr = explode(": ", $phvalue);
2001
+                    $restrPhfin[] = $restrpharr[1];
2002
+                }
2003
+
2004
+                // Assemble the array of message rows that excludes the rows for the restricted phone numbers
2005
+                foreach ($groupedpernb as $gmdkey => $gmdvalue) {
2006
+
2007
+                         if ($gmdvalue['table'] == 'sent') {
2008
+
2009
+                             if (str_contains($gmdvalue['from'], "+")) {
2010
+                                 $fromnmbrarr = explode("+", $gmdvalue['from']);
2011
+                                 if (in_array("+" . $fromnmbrarr[1], $restrPhfin)) {
2012
+                                     unset($groupedpernb[$gmdkey]);
2013
+                                 }
2014
+                             } else {
2015
+                                 $frmnmbrarr = explode(": ", $gmdvalue['from']);
2016
+                                 if (count($frmnmbrarr) == 2) {
2017
+                                     $nmbtbcmprd = $frmnmbrarr[1];
2018
+                                 } else { 
2019
+                                     $nmbtbcmprd = $frmnmbrarr[0];
2020
+                                 }
2021
+                                 if (in_array($nmbtbcmprd, $restrPhfin)) {
2022
+                                     unset($groupedpernb[$gmdkey]);
2023
+                                 }
2024
+                             }
2025
+
2026
+                         } elseif ($gmdvalue['table'] == 'received') {
2027
+
2028
+                             if (str_contains($gmdvalue['to'], "+")) {
2029
+                                 $fromnmbrarr = explode("+", $gmdvalue['to']);
2030
+                                 if (in_array("+" . $fromnmbrarr[1], $restrPhfin)) {
2031
+                                     unset($groupedpernb[$gmdkey]);
2032
+                                 }
2033
+                             } else {
2034
+                                 $tonmbrarr = explode(": ", $gmdvalue['to']);
2035
+                                 if (count($tonmbrarr) == 2) {
2036
+                                     $tonmbrtbcmprd = $tonmbrarr[1];
2037
+                                 } else {
2038
+                                     $tonmbrtbcmprd = $tonmbrarr[0];
2039
+                                 }
2040
+                                 if (in_array($tonmbrtbcmprd, $restrPhfin)) {
2041
+                                     unset($groupedpernb[$gmdkey]);
2042
+                                 }
2043
+                             }
2044
+                         }
2045
+
2046
+                }
2047
+
2048
+                $groupedperconv = array_values($groupedpernb);
2049
+
2050
+                return $groupedperconv;
2051
+
2052
+            } else { return $groupedpernb; }
2053
+        }
2054
+     }
2055
+
2056
+
2057
+
2058
+     /**
2059
+      * @NoAdminRequired
2060
+      */
2061
+     public function savedisplayname($userId, $authorDisplayname, $from) {
2062
+
2063
+        if ($this->groupManager->isAdmin($userId)) {
2064
+
2065
+	    $updatedispnm = $this->connection->prepare('
2066
+			UPDATE `*PREFIX*sms_relent_received`
2067
+			SET `author_displayname` = ?
2068
+                        WHERE `from` = ?');
2069
+	    $updatedispnmres = $updatedispnm->execute([$authorDisplayname, $from]);
2070
+
2071
+            if ($updatedispnmres) {
2072
+                return $respupdname = "The new Display Name has been saved. If on the Settings page, the option 'Add the display name of the message author, before each message' is checked, when you refresh the page you will see the new Display Name before the messages.";
2073
+            } else {
2074
+                return $respupdname = "Error while trying to save the new Display Name to the database.";
2075
+            }
2076
+	    $updatedispnmres->closeCursor();
2077
+
2078
+        } else { return $respupdname = "Only admins can save Display Names for phone numbers that are not associated with Nextcloud users."; }
2079
+     }
2080
+
2081
+     /**
2082
+      * @NoAdminRequired
2083
+      */
2084
+     public function getmessagesperpage($userId) {
2085
+
2086
+        $sqlmpp = $this->connection->prepare('
2087
+	       SELECT `user_id`, `messagesperpage` 
2088
+               FROM `*PREFIX*sms_relent_settings`
2089
+               WHERE `user_id` = ?');
2090
+	$result = $sqlmpp->execute([$userId]);
2091
+        $mesppdata = $result->fetch();
2092
+        $result->closeCursor();
2093
+        if ($mesppdata) {
2094
+            $mesperpagedb = $mesppdata['messagesperpage'];
2095
+            return $mesperpagedb;
2096
+        }
2097
+     }
2098
+
2099
+
2100
+     /**
2101
+      * @NoAdminRequired
2102
+      */
2103
+     public function getsettings($userId) {
2104
+
2105
+        $getsettings = $this->connection->prepare('
2106
+                    SELECT `id`, `user_id`, `telapi_url_rec`, `telapi_url`, `nexapi_url_rec`, `nexapi_url`, `twilapi_url_rec`, `twilapi_url`, `flowapi_url_rec`, `flowapi_url`, 
2107
+                           `messagesperpage`, `get_notify`, `notification_email`, `getsmsinemail`, `show_display_names`, `add_display_names`                           
2108
+		    FROM  `*PREFIX*sms_relent_settings`
2109
+		    WHERE `user_id` = ?');
2110
+        $resultsettings = $getsettings->execute([$userId]);
2111
+
2112
+        $settingsfromdb = $resultsettings->fetch();
2113
+
2114
+        $resultsettings->closeCursor();
2115
+
2116
+        if ($settingsfromdb) {
2117
+
2118
+            if ($this->groupManager->isAdmin($userId)) { $adminreguser = 'admin'; } else { $adminreguser = 'reguser'; }
2119
+            $settingsfromdb['adminornot'] = $adminreguser;
2120
+
2121
+            return $settingsfromdb;
2122
+        }
2123
+
2124
+     }
2125
+
2126
+
2127
+     public function updatenumberrestrictions($userId, $savedByDsplname, $phoneNumber, $groups, $users) {
2128
+
2129
+        if ($this->groupManager->isAdmin($userId)) {
2130
+
2131
+            $groupsproc = implode("|", $groups);
2132
+            $usersproc = implode("|", $users);
2133
+
2134
+            // Get the restrictions for the current number from the 'sms_relent_restrict' table
2135
+            $getrestr = $this->connection->prepare('SELECT `user_id`, `saved_by_dsplname`, `phone_number`, `groups`, `users` FROM `*PREFIX*sms_relent_restrict` WHERE
2136
+                                                   `phone_number` = ?');
2137
+            $getrestrresult = $getrestr->execute([$phoneNumber]);
2138
+            $crntrestr = $getrestrresult->fetch();
2139
+            $getrestrresult->closeCursor();
2140
+
2141
+            if ($getrestrresult && !$crntrestr) {
2142
+
2143
+	        $insertphrestr = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_restrict` (`user_id`, `saved_by_dsplname`, `phone_number`, `groups`, `users`) VALUES
2144
+                                                             (?, ?, ?, ?, ?)');
2145
+	        if ($insertphrestr->execute([$userId, $savedByDsplname, $phoneNumber, $groupsproc, $usersproc])) { $messagetosend = 'success'; } else { $messagetosend = 'failure'; }  
2146
+         
2147
+            } elseif ($getrestrresult && $crntrestr) {
2148
+
2149
+	        $updatephrestr = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_restrict` SET `user_id` = ?, `saved_by_dsplname` = ?, `groups` = ?, `users` = ? WHERE 
2150
+                                                            `phone_number` = ?');
2151
+	        if ($admupdatephonerestr = $updatephrestr->execute([$userId, $savedByDsplname, $groupsproc, $usersproc, $phoneNumber])) { 
2152
+                    $messagetosend = 'success';
2153
+                } else { 
2154
+                    $messagetosend = 'failure'; 
2155
+                }
2156
+
2157
+	        $admupdatephonerestr->closeCursor();
2158
+            }
2159
+            return $messagetosend;
2160
+        }
2161
+     }
2162
+
2163
+
2164
+     private function updateusercredentials($userId, $usersarr, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, $plivoapisecret, $plivosendernm, 
2165
+                                            $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret) {
2166
+
2167
+        $msgtosend = 'success';
2168
+
2169
+        foreach ($usersarr as $usrkey => $usrvalue) {
2170
+
2171
+            $getusrset = $this->connection->prepare('SELECT `user_id` FROM `*PREFIX*sms_relent_settings` WHERE `user_id` = ?');
2172
+	    $getusrsetres = $getusrset->execute([$usrvalue]);
2173
+	    $getcrunmdata = $getusrsetres->fetch();
2174
+	    $getusrsetres->closeCursor();
2175
+
2176
+            if ($getcrunmdata) {
2177
+
2178
+                if ($provider == "tnx") {
2179
+
2180
+                    $upusrset = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_settings` SET `telapi_key` = ?, `tel_pub_key` = ?, `messaging_profile_id` = ?,
2181
+                                                           `tel_sender_name` = ? WHERE `user_id` = ?');
2182
+                    if ($upusrsetres = $upusrset->execute([$telapiKey, $telpubKey, $telmsgprofid, $telsendername, $usrvalue])) {
2183
+                        $msgtosend = 'success';
2184
+                    } else { $msgtosend = 'failure'; }
2185
+                    $upusrsetres->closeCursor();
2186
+
2187
+                } elseif ($provider == "plv") {
2188
+
2189
+                    $upusrset = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_settings` SET `nexapi_key` = ?, `nexapi_secret` = ?, `nex_sender_name` = ?
2190
+                                                            WHERE `user_id` = ?');
2191
+                    if ($upusrsetres = $upusrset->execute([$plivoapikey, $plivoapisecret, $plivosendernm, $usrvalue])) {
2192
+                        $msgtosend = 'success';
2193
+                    } else { $msgtosend = 'failure'; }
2194
+                    $upusrsetres->closeCursor();
2195
+
2196
+                } elseif ($provider == "twl") {
2197
+
2198
+                    $upusrset = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_settings` SET `twilapi_key` = ?, `twilapi_secret` = ?, `twil_sender_name` = ?
2199
+                                                            WHERE `user_id` = ?');
2200
+                    if ($upusrsetres = $upusrset->execute([$twilapikey, $twilapisecret, $twilsendernm, $usrvalue])) {
2201
+                        $msgtosend = 'success';
2202
+                    } else { $msgtosend = 'failure'; }
2203
+                    $upusrsetres->closeCursor();
2204
+
2205
+                } elseif ($provider == "flr") {
2206
+
2207
+                    $upusrset = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_settings` SET `flowapi_key` = ?, `flowapi_secret` = ? WHERE `user_id` = ?');
2208
+                    if ($upusrsetres = $upusrset->execute([$flowapikey, $flowapisecret, $usrvalue])) {
2209
+                        $msgtosend = 'success';
2210
+                    } else { $msgtosend = 'failure'; }
2211
+                    $upusrsetres->closeCursor();
2212
+                }
2213
+
2214
+            } else {
2215
+
2216
+                $emptfld = "";
2217
+
2218
+                if ($provider == "tnx") {
2219
+
2220
+                    $upusrset = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_settings` (`user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`,
2221
+                                                           `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`, `nexapi_url`, `twilapi_key`, `twilapi_secret`,
2222
+                                                           `twilapi_url_rec`, `twilapi_url`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`, `tel_sender_name`) 
2223
+                                                            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
2224
+                    if ($upusrsetres = $upusrset->execute([$usrvalue, $telapiKey, $telpubKey, $emptfld, $emptfld, $telmsgprofid, $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, 
2225
+                                                           $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $telsendername])) {
2226
+                        $msgtosend = 'success';
2227
+                    } else { $msgtosend = 'failure'; }
2228
+                    $upusrsetres->closeCursor();
2229
+
2230
+                } elseif ($provider == "plv") {
2231
+
2232
+                    $upusrset = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_settings` (`user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`,
2233
+                                                           `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`, `nexapi_url`, `twilapi_key`, `twilapi_secret`,
2234
+                                                           `twilapi_url_rec`, `twilapi_url`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`, `nex_sender_name`)
2235
+                                                            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
2236
+                    if ($upusrsetres = $upusrset->execute([$usrvalue, $telapiKey, $telpubKey, $emptfld, $emptfld, $telmsgprofid, $plivoapikey, $plivoapisecret, $emptfld, $emptfld, 
2237
+                                                           $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $plivosendernm])) {
2238
+                        $msgtosend = 'success';
2239
+                    } else { $msgtosend = 'failure'; }
2240
+                    $upusrsetres->closeCursor();
2241
+
2242
+                } elseif ($provider == "twl") {
2243
+
2244
+                    $upusrset = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_settings` (`user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`,
2245
+                                                           `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`, `nexapi_url`, `twilapi_key`, `twilapi_secret`,
2246
+                                                           `twilapi_url_rec`, `twilapi_url`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`, `twil_sender_name`)
2247
+                                                            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
2248
+                    if ($upusrsetres = $upusrset->execute([$usrvalue, $telapiKey, $telpubKey, $emptfld, $emptfld, $telmsgprofid, $plivoapikey, $plivoapisecret, $emptfld, $emptfld, 
2249
+                                                           $twilapikey, $twilapisecret, $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $twilsendernm])) {
2250
+                        $msgtosend = 'success';
2251
+                    } else { $msgtosend = 'failure'; }
2252
+                    $upusrsetres->closeCursor();
2253
+
2254
+                } elseif ($provider == "flr") {
2255
+
2256
+                    $upusrset = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_settings` (`user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`,
2257
+                                                           `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`, `nexapi_url`, `twilapi_key`, `twilapi_secret`,
2258
+                                                           `twilapi_url_rec`, `twilapi_url`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`)
2259
+                                                            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
2260
+                    if ($upusrsetres = $upusrset->execute([$usrvalue, $telapiKey, $telpubKey, $emptfld, $emptfld, $telmsgprofid, $plivoapikey, $plivoapisecret, $emptfld, $emptfld, 
2261
+                                                           $twilapikey, $twilapisecret, $emptfld, $emptfld, $flowapikey, $flowapisecret, $emptfld, $emptfld])) {
2262
+                        $msgtosend = 'success';
2263
+                    } else { $msgtosend = 'failure'; }
2264
+                    $upusrsetres->closeCursor();
2265
+                }
2266
+
2267
+            }                 
2268
+        }
2269
+
2270
+        return $msgtosend;
2271
+     }
2272
+
2273
+
2274
+     private function removeusercredentials($userId, $usersarr, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, $plivoapisecret, $plivosendernm, 
2275
+                                            $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret) {
2276
+
2277
+        $msgtosend = 'success';
2278
+
2279
+        foreach ($usersarr as $usrkey => $usrvalue) {
2280
+
2281
+                $emptyfld = "";
2282
+
2283
+                if ($provider == "tnx") {
2284
+
2285
+                    $upusrset = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_settings` SET `telapi_key` = ?, `tel_pub_key` = ?, `messaging_profile_id` = ?,
2286
+                                                           `tel_sender_name` = ? WHERE `user_id` = ?');
2287
+                    if ($upusrsetres = $upusrset->execute([$emptyfld, $emptyfld, $emptyfld, $emptyfld, $usrvalue])) {
2288
+                        $msgtosend = 'success';
2289
+                    } else { $msgtosend = 'failure'; }
2290
+                    $upusrsetres->closeCursor();
2291
+
2292
+                } elseif ($provider == "plv") {
2293
+
2294
+                    $upusrset = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_settings` SET `nexapi_key` = ?, `nexapi_secret` = ?, `nex_sender_name` = ?
2295
+                                                            WHERE `user_id` = ?');
2296
+                    if ($upusrsetres = $upusrset->execute([$emptyfld, $emptyfld, $emptyfld, $usrvalue])) {
2297
+                        $msgtosend = 'success';
2298
+                    } else { $msgtosend = 'failure'; }
2299
+                    $upusrsetres->closeCursor();
2300
+
2301
+                } elseif ($provider == "twl") {
2302
+
2303
+                    $upusrset = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_settings` SET `twilapi_key` = ?, `twilapi_secret` = ?, `twil_sender_name` = ?
2304
+                                                            WHERE `user_id` = ?');
2305
+                    if ($upusrsetres = $upusrset->execute([$emptyfld, $emptyfld, $emptyfld, $usrvalue])) {
2306
+                        $msgtosend = 'success';
2307
+                    } else { $msgtosend = 'failure'; }
2308
+                    $upusrsetres->closeCursor();
2309
+
2310
+                } elseif ($provider == "flr") {
2311
+
2312
+                    $upusrset = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_settings` SET `flowapi_key` = ?, `flowapi_secret` = ? WHERE `user_id` = ?');
2313
+                    if ($upusrsetres = $upusrset->execute([$emptyfld, $emptyfld, $usrvalue])) {
2314
+                        $msgtosend = 'success';
2315
+                    } else { $msgtosend = 'failure'; }
2316
+                    $upusrsetres->closeCursor();
2317
+                }
2318
+        }
2319
+
2320
+        return $msgtosend;
2321
+     }
2322
+
2323
+
2324
+     public function updatekeysallowedusers($userId, $groups, $users, $provider) {
2325
+
2326
+       if ($this->groupManager->isAdmin($userId)) {
2327
+
2328
+          $msgtosend = 'success';
2329
+
2330
+          // Get the users that belong to the 'admin' group
2331
+          $getadmn = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
2332
+          $getadmnres = $getadmn->execute(['admin']);
2333
+
2334
+          $usersadmin = [];
2335
+          while ($getadmnusrs = $getadmnres->fetch()) {
2336
+                 $usersadmin[] = $getadmnusrs['uid'];
2337
+          }
2338
+          $getadmnres->closeCursor();
2339
+          
2340
+          // Get the API keys and alphanumeric sender IDs for the current admin, from the 'sms_relent_settings' table
2341
+          $getadmset = $this->connection->prepare('SELECT `user_id`, `telapi_key`, `tel_pub_key`, `messaging_profile_id`, `tel_sender_name`, `nexapi_key`, `nexapi_secret`,
2342
+                                                  `nex_sender_name`, `twilapi_key`, `twilapi_secret`, `twil_sender_name`, `flowapi_key`, `flowapi_secret` 
2343
+                                                   FROM `*PREFIX*sms_relent_settings` WHERE `user_id` = ?');
2344
+	  $getadmsetres = $getadmset->execute([$userId]);
2345
+	  $getcradmdata = $getadmsetres->fetch();
2346
+          $telapiKey = $getcradmdata['telapi_key'];
2347
+          $telpubKey = $getcradmdata['tel_pub_key'];
2348
+          $telmsgprofid = $getcradmdata['messaging_profile_id'];
2349
+          $telsendername = $getcradmdata['tel_sender_name'];
2350
+          $plivoapikey = $getcradmdata['nexapi_key'];
2351
+          $plivoapisecret = $getcradmdata['nexapi_secret'];
2352
+          $plivosendernm = $getcradmdata['nex_sender_name'];
2353
+          $twilapikey = $getcradmdata['twilapi_key'];
2354
+          $twilapisecret = $getcradmdata['twilapi_secret'];
2355
+          $twilsendernm = $getcradmdata['twil_sender_name'];
2356
+          $flowapikey = $getcradmdata['flowapi_key'];
2357
+          $flowapisecret = $getcradmdata['flowapi_secret'];
2358
+	  $getadmsetres->closeCursor();
2359
+
2360
+          if ($getcradmdata) {
2361
+
2362
+            if ($provider == "tnx") {
2363
+
2364
+                $getalwd = $this->connection->prepare('SELECT `user_id`, `tnx_groups_allowed`, `tnx_users_allowed` FROM `*PREFIX*sms_relent_subac`');
2365
+                $getalwdres = $getalwd->execute();
2366
+
2367
+                $upchck = 0;
2368
+                $seldataarr = [];
2369
+                $groupsPerProvider = '';
2370
+                $usersPerProvider = '';
2371
+                while ($crntrestr = $getalwdres->fetch()) {
2372
+                       if ($crntrestr['user_id'] != $userId) {
2373
+                           $seldataarr[] = ['userid' => $crntrestr['user_id'], 'groupsallowed' => $crntrestr['tnx_groups_allowed'], 'usersallowed' => $crntrestr['tnx_users_allowed']];
2374
+                       } else {
2375
+                           $upchck++;
2376
+                           $groupsPerProvider = $crntrestr['tnx_groups_allowed'];
2377
+                           $usersPerProvider = $crntrestr['tnx_users_allowed'];
2378
+                       }
2379
+                }
2380
+                $getalwdres->closeCursor();
2381
+
2382
+
2383
+            } elseif ($provider == "plv") {
2384
+
2385
+                $getalwd = $this->connection->prepare('SELECT `user_id`, `plv_groups_allowed`, `plv_users_allowed` FROM `*PREFIX*sms_relent_subac`');
2386
+                $getalwdres = $getalwd->execute();
2387
+
2388
+                $upchck = 0;
2389
+                $seldataarr = [];
2390
+                $groupsPerProvider = '';
2391
+                $usersPerProvider = '';
2392
+                while ($crntrestr = $getalwdres->fetch()) {
2393
+                       if ($crntrestr['user_id'] != $userId) {
2394
+                           $seldataarr[] = ['userid' => $crntrestr['user_id'], 'groupsallowed' => $crntrestr['plv_groups_allowed'], 'usersallowed' => $crntrestr['plv_users_allowed']];
2395
+                       } else {
2396
+                           $upchck++;
2397
+                           $groupsPerProvider = $crntrestr['plv_groups_allowed'];
2398
+                           $usersPerProvider = $crntrestr['plv_users_allowed'];
2399
+                       }
2400
+                }
2401
+                $getalwdres->closeCursor();
2402
+
2403
+            } elseif ($provider == "twl") {
2404
+
2405
+                $getalwd = $this->connection->prepare('SELECT `user_id`, `twl_groups_allowed`, `twl_users_allowed` FROM `*PREFIX*sms_relent_subac`');
2406
+                $getalwdres = $getalwd->execute();
2407
+
2408
+                $upchck = 0;
2409
+                $seldataarr = [];
2410
+                $groupsPerProvider = '';
2411
+                $usersPerProvider = '';
2412
+                while ($crntrestr = $getalwdres->fetch()) {
2413
+                       if ($crntrestr['user_id'] != $userId) {
2414
+                           $seldataarr[] = ['userid' => $crntrestr['user_id'], 'groupsallowed' => $crntrestr['twl_groups_allowed'], 'usersallowed' => $crntrestr['twl_users_allowed']];
2415
+                       } else {
2416
+                           $upchck++;
2417
+                           $groupsPerProvider = $crntrestr['twl_groups_allowed'];
2418
+                           $usersPerProvider = $crntrestr['twl_users_allowed'];
2419
+                       }
2420
+                }
2421
+                $getalwdres->closeCursor();
2422
+
2423
+            } elseif ($provider == "flr") {
2424
+
2425
+                $getalwd = $this->connection->prepare('SELECT `user_id`, `flr_groups_allowed`, `flr_users_allowed` FROM `*PREFIX*sms_relent_subac`');
2426
+                $getalwdres = $getalwd->execute();
2427
+
2428
+                $upchck = 0;
2429
+                $seldataarr = [];
2430
+                $groupsPerProvider = '';
2431
+                $usersPerProvider = '';
2432
+                while ($crntrestr = $getalwdres->fetch()) {
2433
+                       if ($crntrestr['user_id'] != $userId) {
2434
+                           $seldataarr[] = ['userid' => $crntrestr['user_id'], 'groupsallowed' => $crntrestr['flr_groups_allowed'], 'usersallowed' => $crntrestr['flr_users_allowed']];
2435
+                       } else {
2436
+                           $upchck++;
2437
+                           $groupsPerProvider = $crntrestr['flr_groups_allowed'];
2438
+                           $usersPerProvider = $crntrestr['flr_users_allowed'];
2439
+                       }
2440
+                }
2441
+                $getalwdres->closeCursor();
2442
+
2443
+            }
2444
+
2445
+
2446
+            if ($seldataarr) {
2447
+
2448
+                // Check if any of the current users are among the already saved ones (for the same provider)
2449
+                $usrchck = 0;
2450
+                $usrmsgarr = [];
2451
+                foreach ($users as $ukey => $uvalue) {
2452
+                         if ($uvalue != '') {
2453
+                             for ($j = 0; $j < count($seldataarr); $j++) {
2454
+                                  if (str_contains($seldataarr[$j]['usersallowed'], $uvalue)) {
2455
+                                      $usrchck++;
2456
+                                      $usrmsgarr[] = "The admin " . $seldataarr[$j]['userid'] . " has already allowed the user " . $uvalue . " to access his API keys for this provider.";
2457
+                                  }
2458
+                             }
2459
+                         }
2460
+                }
2461
+
2462
+                // Check if any of the current groups are among the already saved ones (for the same provider)
2463
+                $grchck = 0;
2464
+                $grmsgarr = [];
2465
+                foreach ($groups as $gkey => $gvalue) {
2466
+                         if ($gvalue != '') {
2467
+                             for ($k = 0; $k < count($seldataarr); $k++) {
2468
+                                  if (str_contains($seldataarr[$k]['groupsallowed'], $gvalue)) {
2469
+                                      $grchck++;
2470
+                                      $grmsgarr[] = "The admin " . $seldataarr[$k]['userid'] . " has already allowed the group " . $gvalue . " to access his API keys for this provider.";
2471
+                                  }
2472
+                             }
2473
+                         }
2474
+                }
2475
+
2476
+                if ($usrchck == 0 && $grchck == 0) {
2477
+
2478
+
2479
+                    // Remove the previously saved API keys for each user in the specified groups, for the current provider
2480
+                    if ($groupsPerProvider != '') {
2481
+
2482
+                        $groupsPerProvarr = explode("|", $groupsPerProvider);
2483
+                        foreach ($groupsPerProvarr as $prgrkey => $prgrvalue) {
2484
+
2485
+                                 if ($prgrvalue != "admin" && $prgrvalue != '') {
2486
+
2487
+                                     // Get all the users that belong to the group
2488
+	                             $getusringrp = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
2489
+			             $getusringrpres = $getusringrp->execute([$prgrvalue]);
2490
+
2491
+                                     $usersingroup = [];
2492
+			             while ($getusrnm = $getusringrpres->fetch()) {
2493
+                                            if ($getusrnm['uid'] != $userId) {
2494
+
2495
+		                                // Ensure the current user is not an admin
2496
+                                                if (!in_array($getusrnm['uid'], $usersadmin)) {
2497
+                                                     $usersingroup[] = $getusrnm['uid'];
2498
+                                                }
2499
+                                            }
2500
+                                     }
2501
+			             $getusringrpres->closeCursor();
2502
+
2503
+                                     if ($usersingroup) {
2504
+                                         $msgtosend = $this->removeusercredentials($userId, $usersingroup, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, 
2505
+                                                                               $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
2506
+                                     }
2507
+                                 }
2508
+
2509
+                        }
2510
+                    }
2511
+
2512
+
2513
+                    // Remove the previously saved API keys for each user, for the current provider
2514
+                    if ($usersPerProvider != '') {
2515
+
2516
+                        $usersPerProvarr = explode("|", $usersPerProvider);
2517
+                        if ($usersPerProvarr) {
2518
+
2519
+                            $ctusernamearrpr = [];
2520
+                            foreach ($usersPerProvarr as $usrKeypr => $usrValuepr) {
2521
+
2522
+		                 // Get the username for this Display Name
2523
+		                 $getacdataunmpr = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
2524
+		                 $getacdataunmprres = $getacdataunmpr->execute(['displayname', $usrValuepr]);
2525
+		                 $acdatausrnamepr = $getacdataunmprres->fetch();
2526
+                                 if ($acdatausrnamepr['uid'] != $userId) {
2527
+
2528
+		                     // Ensure the current user is not an admin
2529
+                                     if (!in_array($acdatausrnamepr['uid'], $usersadmin)) {
2530
+                                          $ctusernamearrpr[] = $acdatausrnamepr['uid'];
2531
+                                     }
2532
+
2533
+                                 }
2534
+		                 $getacdataunmprres->closeCursor();
2535
+                            }
2536
+
2537
+                            $msgtosend = $this->removeusercredentials($userId, $ctusernamearrpr, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey,
2538
+                                                                      $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
2539
+                        }
2540
+                    }
2541
+
2542
+
2543
+                    // Insert the provider's API keys for the allowed users
2544
+                    if ($users) {
2545
+
2546
+                        $ctusernamearruid = [];
2547
+                        $ctusernamearr = [];
2548
+                        foreach ($users as $usrKey => $usrValue) {
2549
+                             if ($usrValue != '') {
2550
+		                 // Get the username for this Display Name
2551
+		                 $getacdataunm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
2552
+		                 $getacdataunmres = $getacdataunm->execute(['displayname', $usrValue]);
2553
+		                 $acdatausrname = $getacdataunmres->fetch();
2554
+                                 if ($acdatausrname['uid'] != $userId) {
2555
+
2556
+		                     // Ensure the current user is not an admin
2557
+                                     if (!in_array($acdatausrname['uid'], $usersadmin)) {
2558
+                                         $ctusernamearruid[] = $acdatausrname['uid'];
2559
+                                         $ctusernamearr[] = $usrValue;
2560
+                                     }
2561
+
2562
+                                 }
2563
+		                 $getacdataunmres->closeCursor();
2564
+                             }
2565
+                        }
2566
+
2567
+
2568
+                        // Insert/update the allowed users in the 'sms_relent_subac' table
2569
+                        $usersalwdrs = implode("|", $ctusernamearr);
2570
+
2571
+                        if ($upchck == 0) {
2572
+
2573
+		            if ($provider == "tnx") {
2574
+
2575
+	                        $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `tnx_users_allowed`) VALUES (?, ?)');
2576
+	                        if ($datalwdres = $insertalwd->execute([$userId, $usersalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2577
+                                $upchck++;
2578
+
2579
+		            } elseif ($provider == "plv") {
2580
+
2581
+	                        $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `plv_users_allowed`) VALUES (?, ?)');
2582
+	                        if ($datalwdres = $insertalwd->execute([$userId, $usersalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; } 
2583
+                                $upchck++;
2584
+
2585
+		            } elseif ($provider == "twl") {
2586
+
2587
+	                        $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `twl_users_allowed`) VALUES (?, ?)');
2588
+	                        if ($datalwdres = $insertalwd->execute([$userId, $usersalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; } 
2589
+                                $upchck++;
2590
+
2591
+		            } elseif ($provider == "flr") {
2592
+
2593
+	                        $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `flr_users_allowed`) VALUES (?, ?)');
2594
+	                        if ($datalwdres = $insertalwd->execute([$userId, $usersalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2595
+                                $upchck++;
2596
+		            }
2597
+
2598
+                        } else {
2599
+
2600
+		            if ($provider == "tnx") {
2601
+
2602
+	                        $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `tnx_users_allowed` = ? WHERE `user_id` = ?');
2603
+	                        if ($datalwdres = $updatealwd->execute([$usersalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2604
+
2605
+		            } elseif ($provider == "plv") {
2606
+
2607
+	                        $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `plv_users_allowed` = ? WHERE `user_id` = ?');
2608
+	                        if ($datalwdres = $updatealwd->execute([$usersalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2609
+
2610
+		            } elseif ($provider == "twl") {
2611
+
2612
+	                        $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `twl_users_allowed` = ? WHERE `user_id` = ?');
2613
+	                        if ($datalwdres = $updatealwd->execute([$usersalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2614
+
2615
+		            } elseif ($provider == "flr") {
2616
+
2617
+	                        $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `flr_users_allowed` = ? WHERE `user_id` = ?');
2618
+	                        if ($datalwdres = $updatealwd->execute([$usersalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2619
+		            }
2620
+                        }
2621
+
2622
+                        $datalwdres->closeCursor();
2623
+
2624
+
2625
+                        // Insert/update the credentials in the 'sms_relent_settings' table, for each allowed user
2626
+                        $msgtosend = $this->updateusercredentials($userId, $ctusernamearruid, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, 
2627
+                                                                  $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
2628
+                    }
2629
+
2630
+                    // Insert the provider's API keys for the allowed groups
2631
+                    if ($groups) {
2632
+
2633
+                        $allwdgrps = [];
2634
+                        foreach ($groups as $groupkey => $groupvalue) {
2635
+
2636
+                                 if ($groupvalue != "admin" && $groupvalue != '') {
2637
+
2638
+                                     $allwdgrps[] = $groupvalue;
2639
+
2640
+                                     // Get all the users that belong to the group
2641
+			             $getacdusr = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
2642
+			             $getacdusrres = $getacdusr->execute([$groupvalue]);
2643
+
2644
+                                     $usersingrp = [];
2645
+			             while ($getacdusrnm = $getacdusrres->fetch()) {
2646
+                                            if ($getacdusrnm['uid'] != $userId) {
2647
+
2648
+		                                // Ensure the current user is not an admin
2649
+                                                if (!in_array($getacdusrnm['uid'], $usersadmin)) {
2650
+                                                     $usersingrp[] = $getacdusrnm['uid'];
2651
+                                                }
2652
+                                            }
2653
+                                     }
2654
+			             $getacdusrres->closeCursor();
2655
+
2656
+                                     // Insert the provider's API keys for each user of the allowed groups
2657
+                                     if ($usersingrp) {
2658
+                                         $msgtosend = $this->updateusercredentials($userId, $usersingrp, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, 
2659
+                                                             $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
2660
+                                     }
2661
+                                 }
2662
+
2663
+
2664
+		                // Insert/update the allowed groups in the 'sms_relent_subac' table
2665
+		                $groupsalwdrs = implode("|", $allwdgrps);
2666
+
2667
+		                if ($upchck == 0) {
2668
+
2669
+				    if ($provider == "tnx") {
2670
+
2671
+			                $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `tnx_groups_allowed`) VALUES (?, ?)');
2672
+			                if ($datalwdres = $insertalwd->execute([$userId, $groupsalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2673
+                                        $upchck++;
2674
+
2675
+				    } elseif ($provider == "plv") {
2676
+
2677
+			                $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `plv_groups_allowed`) VALUES (?, ?)');
2678
+			                if ($datalwdres = $insertalwd->execute([$userId, $groupsalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2679
+                                        $upchck++;
2680
+
2681
+				    } elseif ($provider == "twl") {
2682
+
2683
+			                $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `twl_groups_allowed`) VALUES (?, ?)');
2684
+			                if ($datalwdres = $insertalwd->execute([$userId, $groupsalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2685
+                                        $upchck++;
2686
+
2687
+				    } elseif ($provider == "flr") {
2688
+
2689
+			                $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `flr_groups_allowed`) VALUES (?, ?)');
2690
+			                if ($datalwdres = $insertalwd->execute([$userId, $groupsalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2691
+                                        $upchck++;
2692
+				    }
2693
+
2694
+		                } else {
2695
+
2696
+				    if ($provider == "tnx") {
2697
+
2698
+			                $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `tnx_groups_allowed` = ? WHERE `user_id` = ?');
2699
+			                if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2700
+
2701
+				    } elseif ($provider == "plv") {
2702
+
2703
+			                $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `plv_groups_allowed` = ? WHERE `user_id` = ?');
2704
+			                if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2705
+
2706
+				    } elseif ($provider == "twl") {
2707
+
2708
+			                $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `twl_groups_allowed` = ? WHERE `user_id` = ?');
2709
+			                if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2710
+
2711
+				    } elseif ($provider == "flr") {
2712
+
2713
+			                $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `flr_groups_allowed` = ? WHERE `user_id` = ?');
2714
+			                if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2715
+				    }
2716
+		                }
2717
+
2718
+		                $datalwdres->closeCursor();
2719
+                        }
2720
+
2721
+                    }
2722
+
2723
+                } else {
2724
+
2725
+                        if ($grmsgarr) {
2726
+                            $grppart = implode(" ", $grmsgarr) . " A group cannot be allowed access to 2 different sets of API keys for the same SMS provider.";
2727
+                        } else { $grppart = ''; }
2728
+
2729
+                        if ($usrmsgarr) {
2730
+                            $usrpart = implode(" ", $usrmsgarr) . " A user cannot be allowed access to 2 different sets of API keys for the same SMS provider.";
2731
+                        } else { $usrpart = ''; }
2732
+
2733
+                    $msgtosend = $grppart . $usrpart;
2734
+                }
2735
+
2736
+
2737
+            } else {
2738
+
2739
+                if ($upchck == 0) {
2740
+
2741
+                    // Insert the provider's API keys for the allowed users
2742
+                    if ($users) {
2743
+
2744
+                        $ctusernamearruid = [];
2745
+                        $ctusernamearr = [];
2746
+                        foreach ($users as $usrKey => $usrValue) {
2747
+                             if ($usrValue != '') {
2748
+		                 // Get the username for this Display Name
2749
+		                 $getacdataunm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
2750
+		                 $getacdataunmres = $getacdataunm->execute(['displayname', $usrValue]);
2751
+		                 $acdatausrname = $getacdataunmres->fetch();
2752
+                                 if ($acdatausrname['uid'] != $userId) {
2753
+
2754
+		                     // Ensure the current user is not an admin
2755
+                                     if (!in_array($acdatausrname['uid'], $usersadmin)) {
2756
+                                         $ctusernamearruid[] = $acdatausrname['uid'];
2757
+                                         $ctusernamearr[] = $usrValue;
2758
+                                     }
2759
+
2760
+                                 }
2761
+		                 $getacdataunmres->closeCursor();
2762
+                             }
2763
+                        }
2764
+
2765
+
2766
+                        // Insert the allowed users into the 'sms_relent_subac' table
2767
+                        $usersalwdrs = implode("|", $ctusernamearr);
2768
+
2769
+		        if ($provider == "tnx") {
2770
+
2771
+	                    $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `tnx_users_allowed`) VALUES (?, ?)');
2772
+	                    if ($datalwdres = $insertalwd->execute([$userId, $usersalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; } 
2773
+                            $upchck++;
2774
+
2775
+		        } elseif ($provider == "plv") {
2776
+
2777
+	                    $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `plv_users_allowed`) VALUES (?, ?)');
2778
+	                    if ($datalwdres = $insertalwd->execute([$userId, $usersalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2779
+                            $upchck++;
2780
+
2781
+		        } elseif ($provider == "twl") {
2782
+
2783
+	                    $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `twl_users_allowed`) VALUES (?, ?)');
2784
+	                    if ($datalwdres = $insertalwd->execute([$userId, $usersalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2785
+                            $upchck++;
2786
+
2787
+		        } elseif ($provider == "flr") {
2788
+
2789
+	                    $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `flr_users_allowed`) VALUES (?, ?)');
2790
+	                    if ($datalwdres = $insertalwd->execute([$userId, $usersalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2791
+                            $upchck++;
2792
+		        }
2793
+
2794
+                        $datalwdres->closeCursor();
2795
+
2796
+
2797
+                        // Insert/update the credentials in the 'sms_relent_settings' table, for each allowed user
2798
+                        $msgtosend = $this->updateusercredentials($userId, $ctusernamearruid, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, 
2799
+                                                                  $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
2800
+                    }
2801
+
2802
+                    // Insert the provider's API keys for the allowed groups
2803
+                    if ($groups) {
2804
+
2805
+                        $allwdgrps = [];
2806
+                        foreach ($groups as $groupkey => $groupvalue) {
2807
+
2808
+                                 if ($groupvalue != "admin" && $groupvalue != '') {
2809
+
2810
+                                     $allwdgrps[] = $groupvalue;
2811
+
2812
+                                     // Get all the users that belong to the group
2813
+			             $getacdusr = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
2814
+			             $getacdusrres = $getacdusr->execute([$groupvalue]);
2815
+
2816
+                                     $usersingrp = [];
2817
+			             while ($getacdusrnm = $getacdusrres->fetch()) {
2818
+                                            if ($getacdusrnm['uid'] != $userId) {
2819
+
2820
+		                                // Ensure the current user is not an admin
2821
+                                                if (!in_array($getacdusrnm['uid'], $usersadmin)) {
2822
+                                                     $usersingrp[] = $getacdusrnm['uid'];
2823
+                                                }
2824
+                                            }
2825
+                                     }
2826
+			             $getacdusrres->closeCursor();
2827
+
2828
+                                     // Insert the provider's API keys for each user of the allowed groups
2829
+                                     if ($usersingrp) {
2830
+                                         $msgtosend = $this->updateusercredentials($userId, $usersingrp, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, 
2831
+                                                             $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
2832
+                                     }
2833
+                                 }
2834
+
2835
+
2836
+		                // Insert the allowed groups into the 'sms_relent_subac' table
2837
+		                $groupsalwdrs = implode("|", $allwdgrps);
2838
+
2839
+                                if ($upchck == 0) {
2840
+
2841
+				    if ($provider == "tnx") {
2842
+
2843
+			                $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `tnx_groups_allowed`) VALUES (?, ?)');
2844
+			                if ($datalwdres = $insertalwd->execute([$userId, $groupsalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; } 
2845
+
2846
+				    } elseif ($provider == "plv") {
2847
+
2848
+			                $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `plv_groups_allowed`) VALUES (?, ?)');
2849
+			                if ($datalwdres = $insertalwd->execute([$userId, $groupsalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; } 
2850
+
2851
+				    } elseif ($provider == "twl") {
2852
+
2853
+			                $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `twl_groups_allowed`) VALUES (?, ?)');
2854
+			                if ($datalwdres = $insertalwd->execute([$userId, $groupsalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; } 
2855
+
2856
+				    } elseif ($provider == "flr") {
2857
+
2858
+			                $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `flr_groups_allowed`) VALUES (?, ?)');
2859
+			                if ($datalwdres = $insertalwd->execute([$userId, $groupsalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; } 
2860
+				    }
2861
+
2862
+                                } else {
2863
+
2864
+				    if ($provider == "tnx") {
2865
+
2866
+			                $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `tnx_groups_allowed` = ? WHERE `user_id` = ?');
2867
+			                if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2868
+
2869
+				    } elseif ($provider == "plv") {
2870
+
2871
+			                $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `plv_groups_allowed` = ? WHERE `user_id` = ?');
2872
+			                if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2873
+
2874
+				    } elseif ($provider == "twl") {
2875
+
2876
+			                $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `twl_groups_allowed` = ? WHERE `user_id` = ?');
2877
+			                if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2878
+
2879
+				    } elseif ($provider == "flr") {
2880
+
2881
+			                $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `flr_groups_allowed` = ? WHERE `user_id` = ?');
2882
+			                if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2883
+				    }
2884
+
2885
+                                }
2886
+
2887
+		                $datalwdres->closeCursor();
2888
+                        }
2889
+
2890
+                    }
2891
+
2892
+                } else {
2893
+
2894
+                    // Remove the previously saved API keys for each user in the specified groups, for the current provider
2895
+                    if ($groupsPerProvider != '') {
2896
+
2897
+                        $groupsPerProvarr = explode("|", $groupsPerProvider);
2898
+                        foreach ($groupsPerProvarr as $prgrkey => $prgrvalue) {
2899
+
2900
+                                 if ($prgrvalue != "admin" && $prgrvalue != '') {
2901
+
2902
+                                     // Get all the users that belong to the group
2903
+	                             $getusringrp = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
2904
+			             $getusringrpres = $getusringrp->execute([$prgrvalue]);
2905
+
2906
+                                     $usersingroup = [];
2907
+			             while ($getusrnm = $getusringrpres->fetch()) {
2908
+                                            if ($getusrnm['uid'] != $userId) {
2909
+
2910
+		                                // Ensure the current user is not an admin
2911
+                                                if (!in_array($getusrnm['uid'], $usersadmin)) {
2912
+                                                     $usersingroup[] = $getusrnm['uid'];
2913
+                                                }
2914
+                                            }
2915
+                                     }
2916
+			             $getusringrpres->closeCursor();
2917
+
2918
+                                     if ($usersingroup) {
2919
+                                         $msgtosend = $this->removeusercredentials($userId, $usersingroup, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, 
2920
+                                                             $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
2921
+                                     }
2922
+                                 }
2923
+
2924
+                        }
2925
+                    }
2926
+
2927
+
2928
+                    // Remove the previously saved API keys for each user, for the current provider
2929
+                    if ($usersPerProvider != '') {
2930
+
2931
+                        $usersPerProvarr = explode("|", $usersPerProvider);
2932
+                        if ($usersPerProvarr) {
2933
+
2934
+                            $ctusernamearrpr = [];
2935
+                            foreach ($usersPerProvarr as $usrKeypr => $usrValuepr) {
2936
+
2937
+		                 // Get the username for this Display Name
2938
+		                 $getacdataunmpr = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
2939
+		                 $getacdataunmprres = $getacdataunmpr->execute(['displayname', $usrValuepr]);
2940
+		                 $acdatausrnamepr = $getacdataunmprres->fetch();
2941
+                                 if ($acdatausrnamepr['uid'] != $userId) {
2942
+
2943
+		                     // Ensure the current user is not an admin
2944
+                                     if (!in_array($acdatausrnamepr['uid'], $usersadmin)) {
2945
+                                          $ctusernamearrpr[] = $acdatausrnamepr['uid'];
2946
+                                     }
2947
+
2948
+                                 }
2949
+		                 $getacdataunmprres->closeCursor();
2950
+                            }
2951
+
2952
+                            $msgtosend = $this->removeusercredentials($userId, $ctusernamearrpr, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey,
2953
+                                                                      $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
2954
+                        }
2955
+                    }
2956
+
2957
+
2958
+
2959
+                    // Insert the provider's API keys for the allowed users
2960
+                    if ($users) {
2961
+
2962
+                        $ctusernamearruid = [];
2963
+                        $ctusernamearr = [];
2964
+                        foreach ($users as $usrKey => $usrValue) {
2965
+                             if ($usrValue != '') {
2966
+		                 // Get the username for this Display Name
2967
+		                 $getacdataunm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
2968
+		                 $getacdataunmres = $getacdataunm->execute(['displayname', $usrValue]);
2969
+		                 $acdatausrname = $getacdataunmres->fetch();
2970
+                                 if ($acdatausrname['uid'] != $userId) {
2971
+
2972
+		                     // Ensure the current user is not an admin
2973
+                                     if (!in_array($acdatausrname['uid'], $usersadmin)) {
2974
+                                         $ctusernamearruid[] = $acdatausrname['uid'];
2975
+                                         $ctusernamearr[] = $usrValue;
2976
+
2977
+                                     }
2978
+
2979
+                                 }
2980
+		                 $getacdataunmres->closeCursor();
2981
+                             }
2982
+                        }
2983
+
2984
+
2985
+                        // Update the allowed users in the 'sms_relent_subac' table
2986
+                        $usersalwdrs = implode("|", $ctusernamearr);
2987
+
2988
+		        if ($provider == "tnx") {
2989
+
2990
+	                    $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `tnx_users_allowed` = ? WHERE `user_id` = ?');
2991
+	                    if ($datalwdres = $updatealwd->execute([$usersalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2992
+
2993
+		        } elseif ($provider == "plv") {
2994
+
2995
+	                    $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `plv_users_allowed` = ? WHERE `user_id` = ?');
2996
+	                    if ($datalwdres = $updatealwd->execute([$usersalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
2997
+
2998
+		        } elseif ($provider == "twl") {
2999
+
3000
+	                    $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `twl_users_allowed` = ? WHERE `user_id` = ?');
3001
+	                    if ($datalwdres = $updatealwd->execute([$usersalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
3002
+
3003
+		        } elseif ($provider == "flr") {
3004
+
3005
+	                    $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `flr_users_allowed` = ? WHERE `user_id` = ?');
3006
+	                    if ($datalwdres = $updatealwd->execute([$usersalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
3007
+		        }
3008
+
3009
+                        $datalwdres->closeCursor();
3010
+
3011
+
3012
+                        // Insert/update the credentials in the 'sms_relent_settings' table, for each allowed user
3013
+                        $msgtosend = $this->updateusercredentials($userId, $ctusernamearruid, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, 
3014
+                                                                  $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
3015
+                    }
3016
+
3017
+                    // Insert the provider's API keys for the allowed groups
3018
+                    if ($groups) {
3019
+
3020
+                        $allwdgrps = [];
3021
+                        foreach ($groups as $groupkey => $groupvalue) {
3022
+
3023
+                                 if ($groupvalue != "admin" && $groupvalue != '') {
3024
+
3025
+                                     $allwdgrps[] = $groupvalue;
3026
+
3027
+                                     // Get all the users that belong to the group
3028
+			             $getacdusr = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
3029
+			             $getacdusrres = $getacdusr->execute([$groupvalue]);
3030
+
3031
+                                     $usersingrp = [];
3032
+			             while ($getacdusrnm = $getacdusrres->fetch()) {
3033
+                                            if ($getacdusrnm['uid'] != $userId) {
3034
+
3035
+		                                // Ensure the current user is not an admin
3036
+                                                if (!in_array($getacdusrnm['uid'], $usersadmin)) {
3037
+                                                     $usersingrp[] = $getacdusrnm['uid'];
3038
+                                                }
3039
+                                            }
3040
+                                     }
3041
+			             $getacdusrres->closeCursor();
3042
+
3043
+                                     // Insert the provider's API keys for each user of the allowed groups
3044
+                                     if ($usersingrp) {
3045
+                                         $msgtosend = $this->updateusercredentials($userId, $usersingrp, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, 
3046
+                                                             $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
3047
+                                     }
3048
+                                 }
3049
+
3050
+
3051
+		                 // Update the allowed groups in the 'sms_relent_subac' table
3052
+		                 $groupsalwdrs = implode("|", $allwdgrps);
3053
+
3054
+				 if ($provider == "tnx") {
3055
+
3056
+			             $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `tnx_groups_allowed` = ? WHERE `user_id` = ?');
3057
+			             if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
3058
+
3059
+				 } elseif ($provider == "plv") {
3060
+
3061
+			             $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `plv_groups_allowed` = ? WHERE `user_id` = ?');
3062
+			             if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
3063
+
3064
+				 } elseif ($provider == "twl") {
3065
+
3066
+			             $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `twl_groups_allowed` = ? WHERE `user_id` = ?');
3067
+			             if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
3068
+
3069
+				 } elseif ($provider == "flr") {
3070
+
3071
+			             $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `flr_groups_allowed` = ? WHERE `user_id` = ?');
3072
+			             if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
3073
+				 }
3074
+
3075
+		                 $datalwdres->closeCursor();
3076
+                        }
3077
+
3078
+                    }
3079
+
3080
+                }
3081
+
3082
+            }
3083
+
3084
+          } else { $msgtosend = "You have to save your credentials first, by clicking the 'Save' button at the bottom of this page, and then share your API keys with other users."; }
3085
+
3086
+          return $msgtosend;
3087
+       }
3088
+     }
3089
+
3090
+
3091
+     public function removenumberrestrictions($userId, $phoneNumber) {
3092
+
3093
+        if ($this->groupManager->isAdmin($userId)) {
3094
+
3095
+                // Remove the restrictions for the given phone number
3096
+		$delrstr = $this->connection->prepare('
3097
+		       DELETE FROM `*PREFIX*sms_relent_restrict`
3098
+		       WHERE `phone_number` = ?');
3099
+                if ($delrstrres = $delrstr->execute([$phoneNumber])) { $delresult = "success"; } else { $delresult = "failure"; }
3100
+		$delrstrres->closeCursor();
3101
+
3102
+	        $updateind = $this->connection->prepare('
3103
+                       SET @resetrec = 0;
3104
+		       UPDATE `*PREFIX*sms_relent_restrict`
3105
+		       SET `id` = @resetrec := @resetrec + 1;
3106
+                       ALTER TABLE `*PREFIX*sms_relent_restrict` auto_increment=1;');
3107
+	        $updateindres = $updateind->execute();
3108
+	        $updateindres->closeCursor();
3109
+
3110
+                return $delresult;
3111
+        }
3112
+     }
3113
+
3114
+
3115
+    /**
3116
+     * @NoAdminRequired
3117
+     */
3118
+    public function updateautoreplies($userId, $savedByDsplname, $phoneNumber, $daysOfWeek, $dailyStart, $dailyEnd, $vacationStart, $vacationEnd, $messageText) {
3119
+
3120
+        // Get the auto-reply for the current number from the 'sms_relent_autorply' table
3121
+        $getarpl = $this->connection->prepare('SELECT `user_id`, `saved_by_dsplname`, `phone_number`, `days_of_week`, `daily_start`, `daily_end`, `vacation_start`,
3122
+                                              `vacation_end`, `message_text` FROM `*PREFIX*sms_relent_autorply` WHERE `phone_number` = ?');
3123
+        $getarplresult = $getarpl->execute([$phoneNumber]);
3124
+        $crntarpl = $getarplresult->fetch();
3125
+        $getarplresult->closeCursor();
3126
+
3127
+        if ($getarplresult && !$crntarpl) {
3128
+
3129
+	    $insertpharpl = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_autorply` (`user_id`, `saved_by_dsplname`, `phone_number`, `days_of_week`, 
3130
+                                                       `daily_start`, `daily_end`, `vacation_start`, `vacation_end`, `message_text`) VALUES
3131
+                                                        (?, ?, ?, ?, ?, ?, ?, ?, ?)');
3132
+	    if ($insertpharpl->execute([$userId, $savedByDsplname, $phoneNumber, $daysOfWeek, $dailyStart, $dailyEnd, $vacationStart, $vacationEnd, $messageText])) { 
3133
+                $messagetosend = 'success'; 
3134
+            } else { 
3135
+                $messagetosend = 'failure'; 
3136
+            }
3137
+         
3138
+        } elseif ($getarplresult && $crntarpl) {
3139
+
3140
+            if ($this->groupManager->isAdmin($userId)) {
3141
+
3142
+                $updatepharpl = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_autorply` SET `user_id` = ?, `saved_by_dsplname` = ?, `days_of_week` = ?, `daily_start` = ?,
3143
+                                                           `daily_end` = ?, `vacation_start` = ?, `vacation_end` = ?, `message_text` = ?  WHERE `phone_number` = ?');
3144
+	        if ($updatephnmbrarpl = $updatepharpl->execute([$userId, $savedByDsplname, $daysOfWeek, $dailyStart, $dailyEnd, $vacationStart, $vacationEnd, $messageText,
3145
+                                                                $phoneNumber])) { 
3146
+                    $messagetosend = 'success';
3147
+                } else { 
3148
+                    $messagetosend = 'failure'; 
3149
+                }
3150
+	        $updatephnmbrarpl->closeCursor();
3151
+
3152
+            } else {
3153
+
3154
+                // Check if the current user is the author of the existing version of the auto-reply
3155
+                if ($userId == $crntarpl['user_id']) {
3156
+
3157
+                    $updatepharpl = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_autorply` SET `user_id` = ?, `saved_by_dsplname` = ?, `days_of_week` = ?, `daily_start` = ?,
3158
+                                                               `daily_end` = ?, `vacation_start` = ?, `vacation_end` = ?, `message_text` = ?  WHERE `phone_number` = ?');
3159
+	            if ($updatephnmbrarpl = $updatepharpl->execute([$userId, $savedByDsplname, $daysOfWeek, $dailyStart, $dailyEnd, $vacationStart, $vacationEnd, $messageText,
3160
+                                                                    $phoneNumber])) { 
3161
+                        $messagetosend = 'success';
3162
+                    } else { 
3163
+                        $messagetosend = 'failure'; 
3164
+                    }
3165
+	            $updatephnmbrarpl->closeCursor();
3166
+
3167
+                } else { $messagetosend = 'not allowed'; }
3168
+            }
3169
+        }
3170
+
3171
+        return $messagetosend;
3172
+    }
3173
+
3174
+
3175
+    /**
3176
+     * @NoAdminRequired
3177
+     */
3178
+    public function removeautoreplies($userId, $phoneNumber) {
3179
+
3180
+        if ($this->groupManager->isAdmin($userId)) {
3181
+
3182
+                // Remove the auto-reply for the given phone number
3183
+		$delarpl = $this->connection->prepare('
3184
+		       DELETE FROM `*PREFIX*sms_relent_autorply`
3185
+		       WHERE `phone_number` = ?');
3186
+                if ($delarplres = $delarpl->execute([$phoneNumber])) { $delarplresult = "success"; } else { $delarplresult = "failure"; }
3187
+		$delarplres->closeCursor();
3188
+
3189
+	        $updateindarpl = $this->connection->prepare('
3190
+                       SET @resetarpl = 0;
3191
+		       UPDATE `*PREFIX*sms_relent_autorply`
3192
+		       SET `id` = @resetarpl := @resetarpl + 1;
3193
+                       ALTER TABLE `*PREFIX*sms_relent_autorply` auto_increment=1;');
3194
+	        $updateindarplres = $updateindarpl->execute();
3195
+	        $updateindarplres->closeCursor();
3196
+
3197
+                return $delarplresult;
3198
+
3199
+        } else {
3200
+                // Get the author of the auto-reply for the given phone number
3201
+		$getarplusr = $this->connection->prepare('SELECT `user_id`, `phone_number` FROM `*PREFIX*sms_relent_autorply` WHERE `phone_number` = ?');
3202
+		$getarplusrres = $getarplusr->execute([$phoneNumber]);
3203
+		$crntarpldata = $getarplusrres->fetch();
3204
+                $crntarpluser = $crntarpldata['user_id'];
3205
+		$getarplusrres->closeCursor();
3206
+
3207
+                // If the author of the auto-reply is the current user, allow the removal
3208
+                if ($crntarpluser == $userId) {
3209
+
3210
+                    // Remove the auto-reply for the given phone number
3211
+		    $delarpl = $this->connection->prepare('
3212
+		           DELETE FROM `*PREFIX*sms_relent_autorply`
3213
+		           WHERE `phone_number` = ?');
3214
+                    if ($delarplres = $delarpl->execute([$phoneNumber])) { $delarplresult = "success"; } else { $delarplresult = "failure"; }
3215
+		    $delarplres->closeCursor();
3216
+
3217
+	            $updateindarpl = $this->connection->prepare('
3218
+                           SET @resetarpl = 0;
3219
+		           UPDATE `*PREFIX*sms_relent_autorply`
3220
+		           SET `id` = @resetarpl := @resetarpl + 1;
3221
+                           ALTER TABLE `*PREFIX*sms_relent_autorply` auto_increment=1;');
3222
+	            $updateindarplres = $updateindarpl->execute();
3223
+	            $updateindarplres->closeCursor();
3224
+
3225
+                    return $delarplresult;
3226
+
3227
+                } else { 
3228
+                    return $delarplresult = 'not allowed';
3229
+                }
3230
+        }
3231
+    }
3232
+
3233
+
3234
+    public function getadminsettings($userId) {
3235
+
3236
+        if ($this->groupManager->isAdmin($userId)) {
3237
+
3238
+
3239
+	    $getsettings = $this->connection->prepare('
3240
+                            SELECT `id`, `user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`, `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`,
3241
+                                   `nexapi_url`, `twilapi_key`, `twilapi_secret`, `twilapi_url_rec`, `twilapi_url`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`, 
3242
+                                   `tel_sender_name`, `nex_sender_name`, `twil_sender_name`, `flow_sender_name`, `messagesperpage`, `get_notify`, `notification_email`, `getsmsinemail`, 
3243
+                                   `show_all_messages`
3244
+			    FROM  `*PREFIX*sms_relent_settings`
3245
+			    WHERE `user_id` = ?');
3246
+
3247
+	    $resultsettings = $getsettings->execute([$userId]);
3248
+
3249
+            $settingsadm = $resultsettings->fetch();
3250
+
3251
+	    $resultsettings->closeCursor();
3252
+
3253
+	    if ($settingsadm) {
3254
+
3255
+		    if ($settingsadm['telapi_key'] != '') {
3256
+
3257
+		        // Send a placeholder to the browser, instead of the real API key
3258
+		        $settingsadm['telapi_key'] = "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20";
3259
+		    }
3260
+		    if ($settingsadm['tel_pub_key'] != '') {
3261
+		        $settingsadm['tel_pub_key'] = "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20";
3262
+		    }
3263
+		    if ($settingsadm['messaging_profile_id'] != '') {
3264
+		        $settingsadm['messaging_profile_id'] = "%20%20%20%20%20%20%20%20%20%20%20%20";
3265
+		    }
3266
+		    if ($settingsadm['nexapi_key'] != '') {
3267
+		        $settingsadm['nexapi_key'] = "%20%20%20%20%20%20%20%20%20";
3268
+		    }
3269
+		    if ($settingsadm['nexapi_secret'] != '') {
3270
+		        $settingsadm['nexapi_secret'] = "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20";
3271
+		    }
3272
+		    if ($settingsadm['twilapi_key'] != '') {
3273
+		        $settingsadm['twilapi_key'] = "%20%20%20%20%20%20%20%20%20";
3274
+		    }
3275
+		    if ($settingsadm['twilapi_secret'] != '') {
3276
+		        $settingsadm['twilapi_secret'] = "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20";
3277
+		    }
3278
+		    if ($settingsadm['flowapi_key'] != '') {
3279
+		        $settingsadm['flowapi_key'] = "%20%20%20%20%20%20%20%20%20";
3280
+		    }
3281
+		    if ($settingsadm['flowapi_secret'] != '') {
3282
+		        $settingsadm['flowapi_secret'] = "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20";
3283
+		    }
3284
+
3285
+
3286
+		    // Get the Display Name of the current admin
3287
+		    $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
3288
+		    $getacdatadnres = $getacdatadn->execute([$userId, 'displayname']);
3289
+		    $acdatausrdnadm = $getacdatadnres->fetch();
3290
+		    $cruserdname = $acdatausrdnadm['value'];
3291
+		    $getacdatadnres->closeCursor();
3292
+
3293
+		    // Get all the restrictions on phone numbers
3294
+		    $getrestr = $this->connection->prepare('SELECT `saved_by_dsplname`, `phone_number`, `groups`, `users` FROM `*PREFIX*sms_relent_restrict`');
3295
+		    $getrestres = $getrestr->execute();
3296
+
3297
+		    $restrictedArr = [];
3298
+		    while ($restrfetched = $getrestres->fetch()) {
3299
+		           $restrictedArr[] = $restrfetched;
3300
+		    }
3301
+		    $getrestres->closeCursor();
3302
+
3303
+		    if ($restrictedArr) { $restrictedUsers = $restrictedArr; } else { $restrictedUsers = ''; }
3304
+
3305
+
3306
+		    // Get the name of all the groups
3307
+		    $getgroups = $this->connection->prepare('SELECT `gid`, `displayname` FROM `*PREFIX*groups`');
3308
+		    $getgroupsres = $getgroups->execute();
3309
+
3310
+		    $groupsArr = [];
3311
+                    $allgroupswadmarr = [];
3312
+		    while ($groupsfetched = $getgroupsres->fetch()) {
3313
+
3314
+		           $groupsArr[] = $groupsfetched['gid'];
3315
+                           if ($groupsfetched['gid'] != 'admin') { $allgroupswadmarr[] = $groupsfetched['gid']; }
3316
+		    }
3317
+		    $getgroupsres->closeCursor();
3318
+
3319
+		    if ($groupsArr) { $allgroups = $groupsArr; } else { $allgroups = ''; }
3320
+                    if ($allgroupswadmarr) { $allgroupswadm = $allgroupswadmarr; } else { $allgroupswadm = ''; }
3321
+
3322
+		    // Get the users that belong to the 'admin' group
3323
+		    $getadmnsc = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
3324
+		    $getadmnscres = $getadmnsc->execute(['admin']);
3325
+
3326
+		    $usersadminsc = [];
3327
+		    while ($getadmnusrsc = $getadmnscres->fetch()) {
3328
+		           $usersadminsc[] = $getadmnusrsc['uid'];
3329
+		    }
3330
+		    $getadmnscres->closeCursor();
3331
+
3332
+
3333
+		    // Get the display name of all the users
3334
+		    $getusers = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ?');
3335
+		    $getusersres = $getusers->execute(['displayname']);
3336
+
3337
+		    $usersArr = [];
3338
+                    $alluserswadmarr = [];
3339
+		    while ($usersfetched = $getusersres->fetch()) {
3340
+
3341
+		           $usersArr[] = $usersfetched['value'];
3342
+                           if (!in_array($usersfetched['uid'], $usersadminsc)) { $alluserswadmarr[] = $usersfetched['value']; }
3343
+		    }
3344
+		    $getusersres->closeCursor();
3345
+
3346
+		    if ($usersArr) { $allusers = $usersArr; } else { $allusers = ''; }
3347
+                    if ($alluserswadmarr) { $alluserswadm = $alluserswadmarr; } else { $alluserswadm = ''; }
3348
+
3349
+                    // Get the groups and users that are allowed to use the API Keys, for each provider
3350
+                    $getalwdall = $this->connection->prepare('SELECT `user_id`, `tnx_groups_allowed`, `tnx_users_allowed`, `plv_groups_allowed`, `plv_users_allowed`,
3351
+                                                             `twl_groups_allowed`, `twl_users_allowed`, `flr_groups_allowed`, `flr_users_allowed` FROM `*PREFIX*sms_relent_subac`
3352
+                                                              WHERE `user_id` = ?');
3353
+                    $getalwdallres = $getalwdall->execute([$userId]);
3354
+                    $crtdtrow = $getalwdallres->fetch();
3355
+                    if ($crtdtrow) {
3356
+                        $allowedgrps = ['tnx_groups_allowed' => $crtdtrow['tnx_groups_allowed'], 'tnx_users_allowed' => $crtdtrow['tnx_users_allowed'], 
3357
+                                        'plv_groups_allowed' => $crtdtrow['plv_groups_allowed'], 'plv_users_allowed' => $crtdtrow['plv_users_allowed'],
3358
+                                        'twl_groups_allowed' => $crtdtrow['twl_groups_allowed'], 'twl_users_allowed' => $crtdtrow['twl_users_allowed'],
3359
+                                        'flr_groups_allowed' => $crtdtrow['flr_groups_allowed'], 'flr_users_allowed' => $crtdtrow['flr_users_allowed']];
3360
+                        $getalwdallres->closeCursor();
3361
+                    } else { $allowedgrps = []; }
3362
+
3363
+
3364
+                    $settingsadm['admdisplayname'] = $cruserdname;
3365
+                    $settingsadm['restrictions'] = $restrictedUsers;
3366
+                    $settingsadm['allgroups'] = $allgroups;
3367
+                    $settingsadm['allusers'] = $allusers;
3368
+                    $settingsadm['allgroupswadm'] = $allgroupswadm;
3369
+                    $settingsadm['alluserswadm'] = $alluserswadm;  
3370
+                    $settingsadm['allowedkeysuse'] = $allowedgrps;
3371
+
3372
+		    return $settingsadm;
3373
+	    }
3374
+        }
3375
+     }
3376
+
3377
+
3378
+     /**
3379
+      * @NoAdminRequired
3380
+      *
3381
+      */
3382
+     public function updatesettings($userId, $telapiUrlRec, $telapiUrl, $nexapiUrlRec, $nexapiUrl, $twilapiUrlRec, $twilapiUrl, $flowapiUrlRec, $flowapiUrl, $messagesperpage, 
3383
+                                    $getNotify, $notificationEmail, $getsmsinemail, $showDisplayNames, $addDisplayNames) {
3384
+        $upsettings = $this->connection->prepare('
3385
+                        SELECT `id`, `user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`, `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`,
3386
+                           `nexapi_url`, `twilapi_key`, `twilapi_secret`, `twilapi_url_rec`, `twilapi_url`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`, 
3387
+                           `tel_sender_name`, `nex_sender_name`, `twil_sender_name`, `flow_sender_name`, `messagesperpage`, `get_notify`, `notification_email`, `getsmsinemail`, 
3388
+                           `show_all_messages`, `show_display_names`, `add_display_names`
3389
+		        FROM  `*PREFIX*sms_relent_settings`
3390
+		        WHERE `user_id` = ?');
3391
+
3392
+        $resultstng = $upsettings->execute([$userId]);
3393
+
3394
+        $rowup = $resultstng->fetch();
3395
+
3396
+        $resultstng->closeCursor();
3397
+
3398
+        if ($resultstng && !$rowup) {
3399
+
3400
+	    $sql = $this->connection->prepare('
3401
+				INSERT INTO `*PREFIX*sms_relent_settings`
3402
+					(`user_id`, `telapi_url_rec`, `telapi_url`, `nexapi_url_rec`, `nexapi_url`, `twilapi_url_rec`, `twilapi_url`, `flowapi_url_rec`, `flowapi_url`, 
3403
+                                         `messagesperpage`, `get_notify`, `notification_email`, `getsmsinemail`, `show_display_names`, `add_display_names`)
3404
+				VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
3405
+			');
3406
+	    $sql->execute([$userId, $telapiUrlRec, $telapiUrl, $nexapiUrlRec, $nexapiUrl, $twilapiUrlRec, $twilapiUrl, $flowapiUrlRec, $flowapiUrl, $messagesperpage, $getNotify, 
3407
+                           $notificationEmail, $getsmsinemail, $showDisplayNames, $addDisplayNames]);
3408
+
3409
+        } elseif ($resultstng && $rowup) {
3410
+
3411
+	    $sqlupdatedb = $this->connection->prepare('
3412
+			UPDATE `*PREFIX*sms_relent_settings`
3413
+			SET `telapi_url_rec` = ?, `telapi_url` = ?, `nexapi_url_rec` = ?, `nexapi_url` = ?, `twilapi_url_rec` = ?, `twilapi_url` = ?, `flowapi_url_rec` = ?, 
3414
+                            `flowapi_url` = ?, `messagesperpage` = ?, `get_notify` = ?, `notification_email` = ?, `getsmsinemail` = ?, `show_display_names` = ?, `add_display_names` = ?
3415
+	                WHERE `user_id` = ?');
3416
+	    $updateRes = $sqlupdatedb->execute([$telapiUrlRec, $telapiUrl, $nexapiUrlRec, $nexapiUrl, $twilapiUrlRec, $twilapiUrl, $flowapiUrlRec, $flowapiUrl, $messagesperpage, 
3417
+                                                $getNotify, $notificationEmail, $getsmsinemail, $showDisplayNames, $addDisplayNames, $userId]);
3418
+	    $updateRes->closeCursor();
3419
+
3420
+	}
3421
+     }
3422
+
3423
+
3424
+     public function updateadminsettings($userId, $telapiKey, $telPubKey, $telapiUrlRec, $telapiUrl, $messagingProfileId, $nexapiKey, $nexapiSecret, $nexapiUrlRec, $nexapiUrl,
3425
+                                         $telSenderName, $nexSenderName, $twilapiKey, $twilapiSecret, $twilapiUrlRec, $twilapiUrl, $twilSenderName, $flowapiKey, $flowapiSecret, 
3426
+                                         $flowapiUrlRec, $flowapiUrl, $showAllMessages) {
3427
+
3428
+        if ($this->groupManager->isAdmin($userId)) {
3429
+
3430
+            $upsettings = $this->connection->prepare('
3431
+                        SELECT `id`, `user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`, `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`,
3432
+                           `nexapi_url`, `twilapi_key`, `twilapi_secret`, `twilapi_url_rec`, `twilapi_url`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`, 
3433
+                           `tel_sender_name`, `nex_sender_name`, `twil_sender_name`, `flow_sender_name`, `messagesperpage`, `get_notify`, `notification_email`, `getsmsinemail`, 
3434
+                           `show_all_messages`, `show_display_names`, `add_display_names`
3435
+		        FROM  `*PREFIX*sms_relent_settings`
3436
+		        WHERE `user_id` = ?');
3437
+
3438
+            $resultstng = $upsettings->execute([$userId]);
3439
+
3440
+            $rowup = $resultstng->fetch();
3441
+
3442
+            $resultstng->closeCursor();
3443
+
3444
+            if ($resultstng && !$rowup) {
3445
+
3446
+	        if ($telapiKey != '') {
3447
+	            $telapikeystrenc = $this->crypto->encrypt($telapiKey);             
3448
+	        } else { $telapikeystrenc = ''; }
3449
+
3450
+	        if ($telPubKey != '') {
3451
+	            $telpubkeystrenc =  $this->crypto->encrypt($telPubKey);             
3452
+	        } else { $telpubkeystrenc = ''; }
3453
+
3454
+	        if ($messagingProfileId != '') {
3455
+	            $messagingprofenc = $this->crypto->encrypt($messagingProfileId);             
3456
+	        } else { $messagingprofenc = ''; }
3457
+
3458
+	        if ($nexapiKey != '') {
3459
+	            $nexapikeystrenc = $this->crypto->encrypt($nexapiKey);             
3460
+	        } else { $nexapikeystrenc = ''; }
3461
+
3462
+	        if ($nexapiSecret != '') {
3463
+	            $nexapisecretstrenc = $this->crypto->encrypt($nexapiSecret);             
3464
+	        } else { $nexapisecretstrenc = ''; }
3465
+
3466
+	        if ($twilapiKey != '') {
3467
+	            $twilapikeystrenc = $this->crypto->encrypt($twilapiKey);             
3468
+	        } else { $twilapikeystrenc = ''; }
3469
+
3470
+	        if ($twilapiSecret != '') {
3471
+	            $twilapisecretstrenc = $this->crypto->encrypt($twilapiSecret);             
3472
+	        } else { $twilapisecretstrenc = ''; }
3473
+
3474
+	        if ($flowapiKey != '') {
3475
+	            $flowapikeystrenc = $this->crypto->encrypt($flowapiKey);             
3476
+	        } else { $flowapikeystrenc = ''; }
3477
+
3478
+	        if ($flowapiSecret != '') {
3479
+	            $flowapisecretstrenc = $this->crypto->encrypt($flowapiSecret);             
3480
+	        } else { $flowapisecretstrenc = ''; }
3481
+
3482
+
3483
+	        $sql = $this->connection->prepare('
3484
+				INSERT INTO `*PREFIX*sms_relent_settings`
3485
+					(`user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`, `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`, 
3486
+	                                 `nexapi_url`, `tel_sender_name`, `nex_sender_name`, `twilapi_key`, `twilapi_secret`, `twilapi_url_rec`, `twilapi_url`, `twil_sender_name`, 
3487
+                                         `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`, `show_all_messages`)
3488
+				VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
3489
+			');
3490
+	        $sql->execute([$userId, $telapikeystrenc, $telpubkeystrenc, $telapiUrlRec, $telapiUrl, $messagingprofenc, $nexapikeystrenc, $nexapisecretstrenc, $nexapiUrlRec, 
3491
+                               $nexapiUrl, $telSenderName, $nexSenderName, $twilapikeystrenc, $twilapisecretstrenc, $twilapiUrlRec, $twilapiUrl, $twilSenderName, $flowapikeystrenc, 
3492
+                               $flowapisecretstrenc, $flowapiUrlRec, $flowapiUrl, $showAllMessages]);
3493
+
3494
+            } elseif ($resultstng && $rowup) {
3495
+
3496
+	        // Check if the value of the field is the placeholder or an empty string
3497
+	        if ($telapiKey != '' && $telapiKey != "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
3498
+	            $telapikeystrenc = $this->crypto->encrypt($telapiKey);                
3499
+	        } elseif ($telapiKey == "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
3500
+	            $telapikeystrenc = $rowup['telapi_key'];
3501
+	        } elseif ($telapiKey == '') {
3502
+	            $telapikeystrenc = '';
3503
+	        }
3504
+
3505
+	        if ($telPubKey != '' && $telPubKey != "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
3506
+	            $telpubkeystrenc = $this->crypto->encrypt($telPubKey);                
3507
+	        } elseif ($telPubKey == "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
3508
+	            $telpubkeystrenc = $rowup['tel_pub_key'];
3509
+	        } elseif ($telPubKey == '') {
3510
+	            $telpubkeystrenc = '';
3511
+	        }
3512
+
3513
+	        if ($messagingProfileId != '' && $messagingProfileId != "%20%20%20%20%20%20%20%20%20%20%20%20") {
3514
+	            $messagingprofenc = $this->crypto->encrypt($messagingProfileId);                
3515
+	        } elseif ($messagingProfileId == "%20%20%20%20%20%20%20%20%20%20%20%20") {
3516
+	            $messagingprofenc = $rowup['messaging_profile_id'];
3517
+	        } elseif ($messagingProfileId == '') {
3518
+	            $messagingprofenc = '';
3519
+	        }
3520
+
3521
+	        if ($nexapiKey != '' && $nexapiKey != "%20%20%20%20%20%20%20%20%20") {
3522
+	            $nexapikeystrenc = $this->crypto->encrypt($nexapiKey);                
3523
+	        } elseif ($nexapiKey == "%20%20%20%20%20%20%20%20%20") {
3524
+	            $nexapikeystrenc = $rowup['nexapi_key'];
3525
+	        } elseif ($nexapiKey == '') {
3526
+	            $nexapikeystrenc = '';
3527
+	        }
3528
+
3529
+	        if ($twilapiKey != '' && $twilapiKey != "%20%20%20%20%20%20%20%20%20") {
3530
+	            $twilapikeystrenc = $this->crypto->encrypt($twilapiKey);                
3531
+	        } elseif ($twilapiKey == "%20%20%20%20%20%20%20%20%20") {
3532
+	            $twilapikeystrenc = $rowup['twilapi_key'];
3533
+	        } elseif ($twilapiKey == '') {
3534
+	            $twilapikeystrenc = '';
3535
+	        }
3536
+
3537
+	        if ($flowapiKey != '' && $flowapiKey != "%20%20%20%20%20%20%20%20%20") {
3538
+	            $flowapikeystrenc = $this->crypto->encrypt($flowapiKey);                
3539
+	        } elseif ($flowapiKey == "%20%20%20%20%20%20%20%20%20") {
3540
+	            $flowapikeystrenc = $rowup['flowapi_key'];
3541
+	        } elseif ($flowapiKey == '') {
3542
+	            $flowapikeystrenc = '';
3543
+	        }
3544
+
3545
+	        if ($nexapiSecret != '' && $nexapiSecret != "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
3546
+	            $nexapisecretstrenc = $this->crypto->encrypt($nexapiSecret);                
3547
+	        } elseif ($nexapiSecret == "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
3548
+	            $nexapisecretstrenc = $rowup['nexapi_secret'];
3549
+	        } elseif ($nexapiSecret == '') {
3550
+	            $nexapisecretstrenc = '';
3551
+	        }
3552
+
3553
+	        if ($twilapiSecret != '' && $twilapiSecret != "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
3554
+	            $twilapisecretstrenc = $this->crypto->encrypt($twilapiSecret);                
3555
+	        } elseif ($twilapiSecret == "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
3556
+	            $twilapisecretstrenc = $rowup['twilapi_secret'];
3557
+	        } elseif ($twilapiSecret == '') {
3558
+	            $twilapisecretstrenc = '';
3559
+	        }
3560
+
3561
+	        if ($flowapiSecret != '' && $flowapiSecret != "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
3562
+	            $flowapisecretstrenc = $this->crypto->encrypt($flowapiSecret);                
3563
+	        } elseif ($flowapiSecret == "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
3564
+	            $flowapisecretstrenc = $rowup['flowapi_secret'];
3565
+	        } elseif ($flowapiSecret == '') {
3566
+	            $flowapisecretstrenc = '';
3567
+	        }
3568
+
3569
+	        $sqlupdatedb = $this->connection->prepare('
3570
+			UPDATE `*PREFIX*sms_relent_settings`
3571
+			SET `telapi_key` = ?, `tel_pub_key` = ?, `telapi_url_rec` = ?, `telapi_url` = ?, `messaging_profile_id` = ?, `nexapi_key` = ?, `nexapi_secret` = ?,
3572
+	                    `nexapi_url_rec` = ?, `nexapi_url` = ?, `tel_sender_name` = ?, `nex_sender_name` = ?, `twilapi_key` = ?, `twilapi_secret` = ?, `twilapi_url_rec` = ?, `twilapi_url` = ?, `twil_sender_name` = ?, `flowapi_key` = ?, 
3573
+	                    `flowapi_secret` = ?, `flowapi_url_rec` = ?, `flowapi_url` = ?, `show_all_messages` = ?
3574
+	                WHERE `user_id` = ?');
3575
+	        $updateRes = $sqlupdatedb->execute([$telapikeystrenc, $telpubkeystrenc, $telapiUrlRec, $telapiUrl, $messagingprofenc, $nexapikeystrenc, $nexapisecretstrenc, 
3576
+                                                    $nexapiUrlRec, $nexapiUrl, $telSenderName, $nexSenderName, $twilapikeystrenc, $twilapisecretstrenc, $twilapiUrlRec, $twilapiUrl, 
3577
+                                                    $twilSenderName, $flowapikeystrenc, $flowapisecretstrenc, $flowapiUrlRec, $flowapiUrl, $showAllMessages, $userId]);
3578
+	        $updateRes->closeCursor();
3579
+
3580
+	    }
3581
+        }
3582
+     }
3583
+
3584
+
3585
+     public function updatepersadmnsettings($userId, $messagesperpage, $getNotify, $notificationEmail, $getsmsinemail, $showDisplayNames, $addDisplayNames) {
3586
+
3587
+        if ($this->groupManager->isAdmin($userId)) {
3588
+
3589
+            $upsettings = $this->connection->prepare('
3590
+                        SELECT `id`, `user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`, `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`,
3591
+                           `nexapi_url`, `twilapi_key`, `twilapi_secret`, `twilapi_url_rec`, `twilapi_url`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`, 
3592
+                           `tel_sender_name`, `nex_sender_name`, `twil_sender_name`, `flow_sender_name`, `messagesperpage`, `get_notify`, `notification_email`, `getsmsinemail`, 
3593
+                           `show_all_messages`, `show_display_names`, `add_display_names`
3594
+		        FROM  `*PREFIX*sms_relent_settings`
3595
+		        WHERE `user_id` = ?');
3596
+
3597
+            $resultstng = $upsettings->execute([$userId]);
3598
+
3599
+            $rowup = $resultstng->fetch();
3600
+
3601
+            $resultstng->closeCursor();
3602
+
3603
+            if ($resultstng && !$rowup) {
3604
+
3605
+	        $sql = $this->connection->prepare('
3606
+				INSERT INTO `*PREFIX*sms_relent_settings` (`user_id`, `messagesperpage`, `get_notify`, `notification_email`, `getsmsinemail`, `show_display_names`,
3607
+                                `add_display_names`)
3608
+				VALUES (?, ?, ?, ?, ?, ?, ?)');
3609
+	        $sql->execute([$userId, $messagesperpage, $getNotify, $notificationEmail, $getsmsinemail, $showDisplayNames, $addDisplayNames]);
3610
+
3611
+            } elseif ($resultstng && $rowup) {
3612
+
3613
+	        $sqlupdatedb = $this->connection->prepare('
3614
+			UPDATE `*PREFIX*sms_relent_settings`
3615
+			SET `messagesperpage` = ?, `get_notify` = ?, `notification_email` = ?, `getsmsinemail` = ?, `show_display_names` = ?, `add_display_names` = ?
3616
+	                WHERE `user_id` = ?');
3617
+	        $updateRes = $sqlupdatedb->execute([$messagesperpage, $getNotify, $notificationEmail, $getsmsinemail, $showDisplayNames, $addDisplayNames, $userId]);
3618
+	        $updateRes->closeCursor();
3619
+            }
3620
+        }
3621
+     }
3622
+
3623
+
3624
+     /**
3625
+      * @NoAdminRequired
3626
+      */
3627
+     public function getapicredentials($userId) {
3628
+
3629
+        $sqlcr = $this->connection->prepare('
3630
+              SELECT `id`, `user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`, `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`, `nexapi_url`,
3631
+                     `tel_sender_name`, `nex_sender_name`, `messagesperpage`, `get_notify`, `notification_email`, `getsmsinemail`, `twilapi_key`, `twilapi_secret`, `twilapi_url_rec`, 
3632
+                     `twilapi_url`, `twil_sender_name`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`, `add_display_names` FROM `*PREFIX*sms_relent_settings`
3633
+	      WHERE `user_id` = ?');
3634
+	$resultcr = $sqlcr->execute([$userId]);
3635
+        $settingsfrdb = $resultcr->fetch();
3636
+        $resultcr->closeCursor();
3637
+
3638
+        if (($settingsfrdb['telapi_key'] != '') && ($settingsfrdb['telapi_key'] != 'undefined') && ($settingsfrdb['telapi_key'] != null)) { 
3639
+             $telapikeystrdec = $this->crypto->decrypt($settingsfrdb['telapi_key']); 
3640
+        } else { $telapikeystrdec = ''; }
3641
+
3642
+        if (($settingsfrdb['tel_pub_key'] != '') && ($settingsfrdb['tel_pub_key'] != 'undefined') && ($settingsfrdb['tel_pub_key'] != null)) {
3643
+             $telpubkeystrdec = $this->crypto->decrypt($settingsfrdb['tel_pub_key']); 
3644
+        } else { $telpubkeystrdec = ''; }
3645
+
3646
+        $telapiurlrec = $settingsfrdb['telapi_url_rec'];
3647
+        $telapiurlstr = $settingsfrdb['telapi_url'];
3648
+
3649
+        if (($settingsfrdb['messaging_profile_id'] != '') && ($settingsfrdb['messaging_profile_id'] != 'undefined') && ($settingsfrdb['messaging_profile_id'] != null)) {
3650
+             $messagingprofid = $this->crypto->decrypt($settingsfrdb['messaging_profile_id']); 
3651
+        } else { $messagingprofid = ''; }
3652
+
3653
+        if (($settingsfrdb['nexapi_key'] != '') && ($settingsfrdb['nexapi_key'] != 'undefined') && ($settingsfrdb['nexapi_key'] != null)) { 
3654
+             $nexapikeystr = $this->crypto->decrypt($settingsfrdb['nexapi_key']); 
3655
+        } else { $nexapikeystr = ''; }
3656
+
3657
+        if (($settingsfrdb['nexapi_secret'] != '') && ($settingsfrdb['nexapi_secret'] != 'undefined') && ($settingsfrdb['nexapi_secret'] != null)) { 
3658
+             $nexapisecretstr = $this->crypto->decrypt($settingsfrdb['nexapi_secret']); 
3659
+        } else { $nexapisecretstr = ''; }
3660
+
3661
+        if (($settingsfrdb['twilapi_key'] != '') && ($settingsfrdb['twilapi_key'] != 'undefined') && ($settingsfrdb['twilapi_key'] != null)) { 
3662
+             $twilapikeystr = $this->crypto->decrypt($settingsfrdb['twilapi_key']); 
3663
+        } else { $twilapikeystr = ''; }
3664
+
3665
+        if (($settingsfrdb['twilapi_secret'] != '') && ($settingsfrdb['twilapi_secret'] != 'undefined') && ($settingsfrdb['twilapi_secret'] != null)) { 
3666
+             $twilapisecretstr = $this->crypto->decrypt($settingsfrdb['twilapi_secret']); 
3667
+        } else { $twilapisecretstr = ''; }
3668
+
3669
+        if (($settingsfrdb['flowapi_key'] != '') && ($settingsfrdb['flowapi_key'] != 'undefined') && ($settingsfrdb['flowapi_key'] != null)) { 
3670
+             $flowapikeystr = $this->crypto->decrypt($settingsfrdb['flowapi_key']); 
3671
+        } else { $flowapikeystr = ''; }
3672
+
3673
+        if (($settingsfrdb['flowapi_secret'] != '') && ($settingsfrdb['flowapi_secret'] != 'undefined') && ($settingsfrdb['flowapi_secret'] != null)) { 
3674
+             $flowapisecretstr = $this->crypto->decrypt($settingsfrdb['flowapi_secret']); 
3675
+        } else { $flowapisecretstr = ''; }
3676
+
3677
+        $nexapiurlrecsms = $settingsfrdb['nexapi_url_rec'];
3678
+        $nexapiurldelrcpt = $settingsfrdb['nexapi_url'];
3679
+        $twilapiurlrecsms = $settingsfrdb['twilapi_url_rec'];
3680
+        $twilapiurldelrcpt = $settingsfrdb['twilapi_url'];
3681
+        $flowapiurlrecsms = $settingsfrdb['flowapi_url_rec'];
3682
+        $flowapiurldelrcpt = $settingsfrdb['flowapi_url'];
3683
+        $gettelsendername = $settingsfrdb['tel_sender_name'];
3684
+        $getnexsendername = $settingsfrdb['nex_sender_name'];
3685
+        $gettwilsendername = $settingsfrdb['twil_sender_name'];
3686
+        $getmessagesperpage = $settingsfrdb['messagesperpage'];
3687
+        $getnotification = $settingsfrdb['get_notify'];
3688
+        $notifyemail = $settingsfrdb['notification_email'];
3689
+        $includesmsinemail = $settingsfrdb['getsmsinemail'];
3690
+        $includeDisplNames = $settingsfrdb['add_display_names'];
3691
+
3692
+        return [$telapikeystrdec, $telpubkeystrdec, $telapiurlrec, $telapiurlstr, $messagingprofid, $nexapikeystr, $nexapisecretstr, $nexapiurlrecsms, $nexapiurldelrcpt,
3693
+                $gettelsendername, $getnexsendername, $getmessagesperpage, $getnotification, $notifyemail, $includesmsinemail, $twilapikeystr, $twilapisecretstr, $twilapiurlrecsms, 
3694
+                $twilapiurldelrcpt, $gettwilsendername, $flowapikeystr, $flowapisecretstr, $flowapiurlrecsms, $flowapiurldelrcpt, $includeDisplNames];
3695
+     }
3696
+
3697
+     /**
3698
+      * @NoAdminRequired
3699
+      */
3700
+     public function getuserbytelrecwhurl($recsmswebhookurl) {
3701
+
3702
+        $sqlrec = $this->connection->prepare('SELECT `user_id`, `telapi_url_rec` FROM `*PREFIX*sms_relent_settings` WHERE `telapi_url_rec` = ?');
3703
+	$result = $sqlrec->execute([$recsmswebhookurl]);
3704
+        $datafromdb = $result->fetch();
3705
+        $result->closeCursor();
3706
+        $ncusertelrec = $datafromdb['user_id'];
3707
+
3708
+        return $ncusertelrec;
3709
+     }
3710
+
3711
+     /**
3712
+      * @NoAdminRequired
3713
+      */
3714
+     public function getuserbyteldelrwhurl($delsmswebhookurl) {
3715
+
3716
+        $sqldel = $this->connection->prepare('SELECT `user_id`, `telapi_url` FROM `*PREFIX*sms_relent_settings` WHERE `telapi_url` = ?');
3717
+	$ressqldel = $sqldel->execute([$delsmswebhookurl]);
3718
+        $datafromdbdel = $ressqldel->fetch();
3719
+        $ressqldel->closeCursor();
3720
+        $ncuserteldel = $datafromdbdel['user_id'];
3721
+
3722
+        return $ncuserteldel;
3723
+     }
3724
+
3725
+     /**
3726
+      * @NoAdminRequired
3727
+      */
3728
+     public function getuserbyplivorecwhurl($plivorecurl) {
3729
+
3730
+        $sqlrecpl = $this->connection->prepare('SELECT `user_id`, `nexapi_url_rec` FROM `*PREFIX*sms_relent_settings` WHERE `nexapi_url_rec` = ?');
3731
+	$plresrecsql = $sqlrecpl->execute([$plivorecurl]);
3732
+        $pldatafromdb = $plresrecsql->fetch();
3733
+        $plresrecsql->closeCursor();
3734
+        $ncuserplrec = $pldatafromdb['user_id'];
3735
+
3736
+        return $ncuserplrec;
3737
+     }
3738
+
3739
+     /**
3740
+      * @NoAdminRequired
3741
+      */
3742
+     public function getuserbyplivodelrwhurl($plivodrurl) {
3743
+
3744
+        $sqldrpl = $this->connection->prepare('SELECT `user_id`, `nexapi_url` FROM `*PREFIX*sms_relent_settings` WHERE `nexapi_url` = ?');
3745
+	$ressqldelrec = $sqldrpl->execute([$plivodrurl]);
3746
+        $datafromdbdr = $ressqldelrec->fetch();
3747
+        $ressqldelrec->closeCursor();
3748
+        $ncuserplivodel = $datafromdbdr['user_id'];
3749
+
3750
+        return $ncuserplivodel;
3751
+     }
3752
+
3753
+     /**
3754
+      * @NoAdminRequired
3755
+      */
3756
+     public function getuserbytwilrecwhurl($twilrecurl) {
3757
+
3758
+        $sqlrectw = $this->connection->prepare('SELECT `user_id`, `twilapi_url_rec` FROM `*PREFIX*sms_relent_settings` WHERE `twilapi_url_rec` = ?');
3759
+	$twresrecsql = $sqlrectw->execute([$twilrecurl]);
3760
+        $twdatafromdb = $twresrecsql->fetch();
3761
+        $twresrecsql->closeCursor();
3762
+        $ncusertwrec = $twdatafromdb['user_id'];
3763
+
3764
+        return $ncusertwrec;
3765
+     }
3766
+
3767
+     /**
3768
+      * @NoAdminRequired
3769
+      */
3770
+     public function getuserbytwildelrwhurl($twildrurl) {
3771
+
3772
+        $sqldrtw = $this->connection->prepare('SELECT `user_id`, `twilapi_url` FROM `*PREFIX*sms_relent_settings` WHERE `twilapi_url` = ?');
3773
+	$ressqldelrectw = $sqldrtw->execute([$twildrurl]);
3774
+        $datafromdbdrtw = $ressqldelrectw->fetch();
3775
+        $ressqldelrectw->closeCursor();
3776
+        $ncusertwildel = $datafromdbdrtw['user_id'];
3777
+
3778
+        return $ncusertwildel;
3779
+     }
3780
+
3781
+     /**
3782
+      * @NoAdminRequired
3783
+      */
3784
+     public function getuserbyflowrecwhurl($flowrecurl) {
3785
+
3786
+        $sqlrecfl = $this->connection->prepare('SELECT `user_id`, `flowapi_url_rec` FROM `*PREFIX*sms_relent_settings` WHERE `flowapi_url_rec` = ?');
3787
+	$flresrecsql = $sqlrecfl->execute([$flowrecurl]);
3788
+        $fldatafromdb = $flresrecsql->fetch();
3789
+        $flresrecsql->closeCursor();
3790
+        $ncuserflrec = $fldatafromdb['user_id'];
3791
+
3792
+        return $ncuserflrec;
3793
+     }
3794
+
3795
+     /**
3796
+      * @NoAdminRequired
3797
+      */
3798
+     public function getuserbyflowdelrwhurl($flowdrurl) {
3799
+
3800
+        $sqldrfl = $this->connection->prepare('SELECT `user_id`, `flowapi_url` FROM `*PREFIX*sms_relent_settings` WHERE `flowapi_url` = ?');
3801
+	$ressqldelrecfl = $sqldrfl->execute([$flowdrurl]);
3802
+        $datafromdbdrfl = $ressqldelrecfl->fetch();
3803
+        $ressqldelrecfl->closeCursor();
3804
+        $ncuserflowdel = $datafromdbdrfl['user_id'];
3805
+
3806
+        return $ncuserflowdel;
3807
+     }
3808
+
3809
+
3810
+    /**
3811
+     * @NoAdminRequired
3812
+     */
3813
+    public function object_to_array($obj) {
3814
+        if (is_object($obj)) $obj = (array)$this->dismount($obj);
3815
+        if (is_array($obj)) {
3816
+           $new = array();
3817
+           foreach($obj as $key => $val) {
3818
+               $new[$key] = $this->object_to_array($val);
3819
+           }
3820
+        }
3821
+        else $new = $obj;
3822
+        return $new;
3823
+    }
3824
+
3825
+
3826
+    /**
3827
+     * @NoAdminRequired
3828
+     */
3829
+    public function dismount($object) {
3830
+        $reflectionClass = new ReflectionClass(get_class($object));
3831
+        $array = array();
3832
+        foreach ($reflectionClass->getProperties() as $property) {
3833
+           $property->setAccessible(true);
3834
+           $array[$property->getName()] = $property->getValue($object);
3835
+           $property->setAccessible(false);
3836
+        }
3837
+        return $array;
3838
+    }
3839
+
3840
+
3841
+    /**
3842
+     * @NoAdminRequired
3843
+     */
3844
+    public function getallowedusers($userId) {
3845
+
3846
+        // Collect the users with whom the current admin is sharing his API keys and whose messages he will be able to see
3847
+        if ($this->groupManager->isAdmin($userId)) {
3848
+
3849
+            // Get the users that belong to the 'admin' group
3850
+            $getadmn = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
3851
+            $getadmnres = $getadmn->execute(['admin']);
3852
+
3853
+            $usersadminsd = [];
3854
+            while ($getadmnusrs = $getadmnres->fetch()) {
3855
+                   $usersadminsd[] = $getadmnusrs['uid'];
3856
+            }
3857
+            $getadmnres->closeCursor();
3858
+
3859
+            // Get the groups and users that were allowed access to the API keys
3860
+            $getgrps = $this->connection->prepare('SELECT `user_id`, `tnx_groups_allowed`, `tnx_users_allowed`, `plv_groups_allowed`, `plv_users_allowed`,
3861
+                                                  `twl_groups_allowed`, `twl_users_allowed`, `flr_groups_allowed`, `flr_users_allowed` FROM `*PREFIX*sms_relent_subac`
3862
+                                                   WHERE `user_id` = ?');
3863
+            $getgrpsres = $getgrps->execute([$userId]);
3864
+            $getgrpsusr = $getgrpsres->fetch();
3865
+            $getgrpsres->closeCursor();
3866
+
3867
+            if ($getgrpsusr) {
3868
+
3869
+                if ($getgrpsusr['tnx_users_allowed']) { $tnxusers = explode("|", $getgrpsusr['tnx_users_allowed']); } else { $tnxusers = []; }
3870
+                if ($getgrpsusr['plv_users_allowed']) { $plvusers = explode("|", $getgrpsusr['plv_users_allowed']); } else { $plvusers = []; }
3871
+                if ($getgrpsusr['twl_users_allowed']) { $twlusers = explode("|", $getgrpsusr['twl_users_allowed']); } else { $twlusers = []; }
3872
+                if ($getgrpsusr['flr_users_allowed']) { $flrusers = explode("|", $getgrpsusr['flr_users_allowed']); } else { $flrusers = []; }
3873
+
3874
+                $allwdusersarr = array_merge($tnxusers, $plvusers, $twlusers, $flrusers);
3875
+                $allwdusersunq = array_filter(array_unique($allwdusersarr));
3876
+
3877
+                if ($getgrpsusr['tnx_groups_allowed']) { $tnxgroups = explode("|", $getgrpsusr['tnx_groups_allowed']); } else { $tnxgroups = []; }
3878
+                if ($getgrpsusr['plv_groups_allowed']) { $plvgroups = explode("|", $getgrpsusr['plv_groups_allowed']); } else { $plvgroups = []; }
3879
+                if ($getgrpsusr['twl_groups_allowed']) { $twlgroups = explode("|", $getgrpsusr['twl_groups_allowed']); } else { $twlgroups = []; }
3880
+                if ($getgrpsusr['flr_groups_allowed']) { $flrgroups = explode("|", $getgrpsusr['flr_groups_allowed']); } else { $flrgroups = []; }
3881
+
3882
+                $allwdgroupsarr = array_merge($tnxgroups, $plvgroups, $twlgroups, $flrgroups);
3883
+                $allwdgroupsunq = array_filter(array_unique($allwdgroupsarr));
3884
+
3885
+            } else {
3886
+                $allwdusersunq = [];
3887
+                $allwdgroupsunq = [];
3888
+            }
3889
+
3890
+            // Get the username for each Display Name of the allowed users
3891
+            $allwdusersfnl = [];
3892
+            foreach ($allwdusersunq as $alwdusrkey => $alwdusrvalue) {
3893
+
3894
+                         $getacdatausrnm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
3895
+		         $getacdatausrnmres = $getacdatausrnm->execute(['displayname', $alwdusrvalue]);
3896
+		         $acdatausrname = $getacdatausrnmres->fetch();
3897
+                         if ($acdatausrname) {
3898
+                             $allwdusersfnl[] = $acdatausrname['uid'];
3899
+                         }
3900
+                         $getacdatausrnmres->closeCursor();
3901
+            }
3902
+
3903
+            // Get the users from all the allowed groups
3904
+            $allwdusersgrpmlt = [];
3905
+            foreach ($allwdgroupsunq as $prgrpkey => $prgrpvalue) {
3906
+
3907
+                         // Get all the users that belong to the current group
3908
+                         $getusringroup = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
3909
+		         $getusringroupres = $getusringroup->execute([$prgrpvalue]);
3910
+
3911
+		         while ($getusrname = $getusringroupres->fetch()) {
3912
+
3913
+	                        // Ensure the current user is not an admin
3914
+                                if (!in_array($getusrname['uid'], $usersadminsd)) {
3915
+                                     $allwdusersgrpmlt[] = $getusrname['uid'];
3916
+                                }
3917
+                         }
3918
+		         $getusringroupres->closeCursor();
3919
+            }
3920
+            $allwdusersgrpfnl = array_unique($allwdusersgrpmlt);
3921
+            
3922
+            $allusr = array_merge($allwdusersfnl, $allwdusersgrpfnl);
3923
+            $allusruniquest = array_unique($allusr);
3924
+
3925
+            if ($allusruniquest) {
3926
+                array_unshift($allusruniquest, $userId);
3927
+                $allusruniquerc = $allusruniquest;
3928
+            } else { $allusruniquerc = [$userId]; }
3929
+
3930
+            return $allusruniquerc;
3931
+
3932
+        } else { return [$userId]; }
3933
+    }
3934
+
3935
+
3936
+    /**
3937
+     * @NoAdminRequired
3938
+     */
3939
+    public function getsmsnumbers($userId) {
3940
+
3941
+        $smsapicred = $this->getapicredentials($userId);
3942
+
3943
+        $telnyxkey = $smsapicred[0];
3944
+
3945
+        $nexapikey = $smsapicred[5];
3946
+        $nexapisecret = $smsapicred[6];
3947
+
3948
+        $twilapikey = $smsapicred[15];
3949
+        $twilapisecret = $smsapicred[16];
3950
+
3951
+        $flowapikey = $smsapicred[20];
3952
+        $flowapisecret = $smsapicred[21];
3953
+
3954
+        $telsendernameinit = $smsapicred[9];
3955
+        $nexsendernameinit = $smsapicred[10];
3956
+        $twilsendernameinit = $smsapicred[19];
3957
+
3958
+        if ($telsendernameinit) {
3959
+            $telsendername = "Tx: " . $telsendernameinit;
3960
+            $telsenderarr = [0 => $telsendername];
3961
+        } else { $telsenderarr = []; }
3962
+
3963
+        if ($nexsendernameinit) {
3964
+            $nexsendername = "Pl: " . $nexsendernameinit;
3965
+            $nexsenderarr = [0 => $nexsendername];
3966
+        } else { $nexsenderarr = []; }
3967
+
3968
+        if ($twilsendernameinit) {
3969
+            $twilsendername = "Tw: " . $twilsendernameinit;
3970
+            $twilsenderarr = [0 => $twilsendername];
3971
+        } else { $twilsenderarr = []; }
3972
+
3973
+        // Get Telnyx phone numbers
3974
+        if ($telnyxkey != '') {
3975
+
3976
+           \Telnyx\Telnyx::setApiKey($telnyxkey);
3977
+           $telnumbers = \Telnyx\MessagingPhoneNumber::All();
3978
+
3979
+           $telnumbersarr = $this->object_to_array($telnumbers);
3980
+           $telnmbrs = [];
3981
+
3982
+           foreach ($telnumbersarr['_originalValues'] as $nmbkey => $nmbvalue) {
3983
+              if (is_int($nmbkey)) {
3984
+                 foreach ($nmbvalue as $nkey => $nvalue) {
3985
+                    if ($nkey == 'phone_number' && $nvalue) {
3986
+                       $telnmbrs[] = "Tx: " . $nvalue;
3987
+                    }
3988
+                 }
3989
+              }
3990
+           }
3991
+
3992
+        } else { $telnmbrs = []; }
3993
+
3994
+        // Get Plivo phone numbers
3995
+        if ($nexapikey != '' && $nexapisecret != '') {
3996
+
3997
+           $getacdata = "https://".$nexapikey.":".$nexapisecret."@api.plivo.com/v1/Account/".$nexapikey."/Number/";
3998
+           $acdata = file_get_contents($getacdata);
3999
+           $datainit = json_decode($acdata, true);
4000
+
4001
+           $findata = $this->object_to_array($datainit);
4002
+
4003
+           $nexcurrentnmbrs = [];
4004
+
4005
+           foreach ($findata['objects'] as $smskey => $smsvalue) {
4006
+                   if (is_array($smsvalue)) {
4007
+                         foreach ($smsvalue as $smskey2 => $smsvalue2) {
4008
+                               if ($smskey2 == 'number' && $smsvalue2) {
4009
+                                   $nexcurrentnmbrs[] = "Pl: +" . $smsvalue2;
4010
+                               }
4011
+                         }
4012
+                   }
4013
+           }
4014
+
4015
+        } else { $nexcurrentnmbrs = []; }
4016
+
4017
+        // Get Twilio phone numbers
4018
+        if ($twilapikey != '' && $twilapisecret != '') {
4019
+
4020
+            $twilnumbers = json_decode(file_get_contents("https://".$twilapikey.":".$twilapisecret."@api.twilio.com/2010-04-01/Accounts/".$twilapikey."/IncomingPhoneNumbers.json"), true);
4021
+            $twilactivenmbrs = $twilnumbers['incoming_phone_numbers'];
4022
+
4023
+            $twilcurrentnmbrs = [];
4024
+            foreach ($twilactivenmbrs as $twnbkey => $twnbvalue) {
4025
+                 if (is_array($twnbvalue)) {
4026
+                     foreach ($twnbvalue as $twfkey => $twfvalue) {
4027
+                          if ($twfkey == 'phone_number' && $twfvalue) {
4028
+                              $twilcurrentnmbrs[] = "Tw: " . $twfvalue;
4029
+                          }
4030
+                     }
4031
+                 }
4032
+            }
4033
+
4034
+        } else { $twilcurrentnmbrs = []; }
4035
+
4036
+        // Get Flowroute phone numbers
4037
+        if ($flowapikey != '' && $flowapisecret != '') {
4038
+
4039
+            $flnbrsresult = json_decode(file_get_contents("https://".$flowapikey.":".$flowapisecret."@api.flowroute.com/v2/numbers"));
4040
+            $flnbrsarr = $flnbrsresult->data;
4041
+            $flowcurrentnmbrs = [];
4042
+            foreach ($flnbrsarr as $flkey => $flitem) {
4043
+                     if ($flitem->id) {
4044
+                         $flowcurrentnmbrs[] = "Fl: +" . $flitem->id;
4045
+                     }
4046
+            }
4047
+
4048
+        } else { $flowcurrentnmbrs = []; }
4049
+
4050
+        $currentnmbrs = array_merge($telnmbrs, $nexcurrentnmbrs, $twilcurrentnmbrs, $flowcurrentnmbrs, $telsenderarr, $nexsenderarr, $twilsenderarr);
4051
+
4052
+        if ($this->groupManager->isAdmin($userId)) {
4053
+
4054
+            return $currentnmbrs;
4055
+
4056
+        } else {
4057
+
4058
+            // Get the restrictions from the 'sms_relent_restrict' table
4059
+            $getrestr = $this->connection->prepare('
4060
+		       SELECT `phone_number`, `groups`, `users` FROM `*PREFIX*sms_relent_restrict`');
4061
+            $getrestrres = $getrestr->execute();
4062
+
4063
+            $restrdata = [];
4064
+            while ($restrfetched = $getrestrres->fetch()) {
4065
+                   $restrdata[] = $restrfetched;
4066
+            }
4067
+            $getrestrres->closeCursor();
4068
+
4069
+            if ($restrdata) {
4070
+
4071
+                // Get the groups to which the current user belongs
4072
+                $getusrgrp = $this->connection->prepare('
4073
+		       SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `uid` = ?');
4074
+                $getusrgrpres = $getusrgrp->execute([$userId]);
4075
+
4076
+                $usergrps = [];
4077
+                while ($fetchedgrps = $getusrgrpres->fetch()) {
4078
+                       $usergrps[] = $fetchedgrps['gid'];
4079
+                }
4080
+                $getusrgrpres->closeCursor();
4081
+                $ctusergroups = implode("|", $usergrps);
4082
+
4083
+		// Get the Display Name of the current user
4084
+		$getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
4085
+		$getacdatadnres = $getacdatadn->execute([$userId, 'displayname']);
4086
+		$acdatausrdnadm = $getacdatadnres->fetch();
4087
+		$cruserdname = $acdatausrdnadm['value'];
4088
+		$getacdatadnres->closeCursor();
4089
+
4090
+                // Get the phone numbers that are not allowed for the current user
4091
+                $restrPhoneNb = [];
4092
+                foreach ($restrdata as $rskey => $rsvalue) {
4093
+
4094
+                        $chck = 0;
4095
+                        if ($rsvalue['groups']) {
4096
+                            $restrgrparr = explode("|", $rsvalue['groups']);
4097
+
4098
+                            foreach ($restrgrparr as $grkey => $grvalue) {
4099
+                                     if (str_contains($ctusergroups, $grvalue)) { $chck++; }
4100
+                            }
4101
+                        }
4102
+
4103
+                        if ($rsvalue['users']) {
4104
+                            $usrnmstr = $rsvalue['users'];
4105
+                            if (str_contains($usrnmstr, $cruserdname)) { $chck++; }
4106
+                        }
4107
+
4108
+                        if ($chck == 0) { $restrPhoneNb[] = $rsvalue['phone_number']; }
4109
+                }
4110
+
4111
+                $restrPhoneNmbrs = array_unique($restrPhoneNb);
4112
+
4113
+                // Assemble the array of phone numbers that the current user is allowed to use
4114
+                for ($k = 0; $k < count($currentnmbrs); $k++) {
4115
+
4116
+                    if (in_array($currentnmbrs[$k], $restrPhoneNmbrs)) {
4117
+                        unset($currentnmbrs[$k]);
4118
+                    }
4119
+                }
4120
+
4121
+                $currentnmbrsrstr = array_values($currentnmbrs);
4122
+
4123
+                return $currentnmbrsrstr;
4124
+
4125
+            } else { return $currentnmbrs; }
4126
+        }
4127
+    }
4128
+}
0 4129
new file mode 100644
... ...
@@ -0,0 +1,298 @@
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
+script('sms_relentless', 'adminsettings');
27
+style('sms_relentless', 'style');
28
+
29
+?>
30
+
31
+<div id="sms_relentless_adm">
32
+
33
+        <div class="section">
34
+           <h2><?php p($l->t('SMS Relentless'));?></h2>
35
+           <p id="settings-dscr"><h3><?php p($l->t('Enter your credentials and options in the fields from below. As SMS service provider you can use Telnyx, Plivo, Twilio or 
36
+               Flowroute, or all of them:')); ?></h3></p><br>
37
+           <div class="sms_followupsection">
38
+
39
+                <form id="admin_conf" action="#" >
40
+
41
+                   <div class="providerSettings">
42
+                   <p class="providerName">Telnyx Settings</p>
43
+                   <p><label for="telapi_key" class="setlabeltext"><b>Telnyx API Secret Key</b> (Log in to Telnyx, then, on the 'Home' page, in the 'API Keys' section from the upper 
44
+                          right corner, click on 'Manage Keys'. If you already have an API key, just copy it by clicking the 'Copy to clipboard' icon. Otherwise, to create an API key, 
45
+                          click the 'Create API Key' button, on the pop up message click 'Create', then enter it in the field from below.):</label></p>
46
+                   <input type="password" class="smsr_textbox" id="telapi_key" name="telapi_key" autocomplete="false"
47
+                          placeholder="<?php p($l->t('e.g. d6f172ce92e4f2 ...')); ?>" /><br>
48
+
49
+                   <p><label for="tel_pub_key" class="setlabeltext"><b>Telnyx Account Public Key</b> (While logged in to Telnyx, on the 'Home' page, in the 'API Keys' section from the 
50
+                          upper right corner, click on 'Manage Keys', then click on 'Public Key' on the upper bar, then copy the key from the 'Key' field and enter it in the field from 
51
+                          below.):</label></p>
52
+                   <input type="password" class="smsr_textbox" id="tel_pub_key" name="tel_pub_key" autocomplete="false"
53
+                          placeholder="<?php p($l->t('e.g. KLCnMsTSp8utW3RRHx0FiXxbf5BxK2Y5q8mMTCn0jgv=')); ?>" /><br>
54
+
55
+                   <p><label for="messaging_profile_id" class="setlabeltext"><b>Messaging Profile ID</b> (While logged in to Telnyx, click on 'Messaging', then on 'Programmable 
56
+                       Messaging' on the left panel, click on the name of the messaging profile that you want to use, then under 'Profile ID' you will find the messaging profile ID. 
57
+                       Copy it and enter it in the field from below.):
58
+                   </label></p>
59
+                   <input type="password" class="smsr_textbox" id="messaging_profile_id" name="messaging_profile_id" autocomplete="false"
60
+                          placeholder="<?php p($l->t('e.g. 9d4f47b6-26c9-d25c-c2f5 ...')); ?>" /><br>
61
+
62
+                   <p><label for="telapi_url_rec" class="setlabeltext"><b>Telnyx webhook URL for incoming SMS/MMS</b> (You have to first generate and then copy this URL into your Telnyx
63
+                       account, so that Telnyx knows where to deliver the SMS/MMS messages received by your Telnyx phone number(s). First generate the URL by pressing the button from
64
+                       below, copy it, then, in your Telnyx account click on 'Messaging' then on 'Programmable Messaging' on the left panel, click on the name of the messaging profile 
65
+                       that you associated with your phone number(s), then, under 'Inbound Settings', enter the webhook URL generated here in the field 'Send a webhook to this URL' and 
66
+                       click the 'Save' button. Don't forget to also click the 'Save' button at the bottom of this page after entering all the credentials, to save all the settings to 
67
+                       the database.)</label></p>
68
+                   <input type="button" id="generate_tel_rcpt" class="generateUrl" value="<?php p($l->t('Generate new webhook URL for incoming SMS/MMS')) ?>" />
69
+                   <input type="text" class="smsr_textboxspec" id="telapi_url_rec" name="telapi_url_rec" autocomplete="false" />
70
+                   <span id="copyToClipboardtel" class="icon icon-clippy" title="Copy to clipboard"></span><br><br>
71
+
72
+                   <p><label for="telapi_url" class="setlabeltext"><b>Telnyx webhook URL for delivery receipts</b> (This URL will be included by SMS Relentless in message sending 
73
+                       requests, so that Telnyx will know where to send the delivery receipts. Just generate it by pressing the button from below.
74
+                       You don't have to enter this URL into your Telnyx account. Don't forget to click the 'Save' button at the bottom of this page after entering all the credentials, 
75
+                       to save all the settings to the database.)</label></p>
76
+                   <input type="button" id="generate_tel_delrcpt" class="generateUrl" value="<?php p($l->t('Generate new webhook URL for delivery receipts')) ?>" />
77
+                   <input type="text" id="telapi_url" name="telapi_url" autocomplete="false" /><br><br>
78
+
79
+                   <p><label for="tel_sender_name" class="setlabeltext"><b>Telnyx alphanumeric Sender ID</b> (If you intend to use an alphanumeric Sender ID, enter an alphanumeric 
80
+                          sequence of up to 11 characters in the range of a-z, A-Z, 0-9 and space. In certain countries there are regulations that accept only shorter alphanumeric 
81
+                          Sender IDs, such as up to 6 characters. You cannot send SMS/MMS messages with alphanumeric Sender IDs to USA or Canada. There are even 
82
+                          <a href="https://support.plivo.com/hc/en-us/articles/360041448032" style="color:#1b60ba" target="_blank" rel="noreferrer noopener">countries</a> that require
83
+                          preregistration of alphanumeric Sender IDs. Before sending SMS/MMS messages to a country, it's recommended to read the
84
+                          <a href="https://support.twilio.com/hc/en-us/articles/223133767-International-support-for-Alphanumeric-Sender-ID" style="color:#1b60ba" target="_blank"
85
+                          rel="noreferrer noopener">country specific features and restrictions.</a> Some carriers won't accept messages with an alphanumeric Sender ID): </label></p>
86
+                   <input type="text" class="smsr_textbox" id="tel_sender_name" name="tel_sender_name" autocomplete="false"
87
+                          placeholder="<?php p($l->t('e.g. Smart Inc')); ?>" /><br><br>
88
+
89
+                   <p><label for="tnxKeysAccessTbl" class="setlabeltext"><b>Allow the following groups and non-admin users to send and receive messages using the Telnyx API Secret Key, 
90
+                          Public Key, messaging profile ID and alphanumeric Sender ID mentioned above (to be able to use them properly, the users with whom these credentials are shared 
91
+                          will have to access their app Settings page, generate the two webhook URLs for Telnyx by clicking the corresponding 'Generate new webhook URL ...' buttons, and
92
+                          then click the 'Save' button at the bottom of that page):</b></label></p><br>
93
+
94
+                   <table id="tnxKeysAccessTbl">
95
+
96
+                      <tr><th>Groups Allowed</th><th style="max-width: 40px !important"></th><th>Users Allowed</th><th style="max-width: 40px !important"></th><th></th></tr>
97
+                      <tr><td><div id="alwdakeyGrps-tnx" class="alwdKeysGroups"></div></td><td><div id="showakeyGrps-tnx" class="showAllGroupsak">
98
+                      <img src="/apps/sms_relentless/img/group.svg" style="cursor:pointer" title="Show all groups"></div></td><td><div id="alwdakeyUsrs-tnx" class="alwdKeysUsers"></div>
99
+                      </td><td><div id="showakeyUsrs-tnx" class="showAllUsersak"><img src="/apps/sms_relentless/img/user.svg" style="cursor:pointer" title="Show all users"></div></td>
100
+                      <td><input type="submit" id="alwdrstsave-tnx" class="savealwdKeys" value="Edit" title="Edit Row" /></td></tr>
101
+
102
+                   </table><br>
103
+
104
+                   </div><br><br><br>
105
+
106
+                   <div class="providerSettings">
107
+                   <p class="providerName">Plivo Settings</p>
108
+                   <p><label for="nexapi_key" class="setlabeltext"><b>Plivo Auth ID</b> (Log in to Plivo. On the first page, which is the Overview page, under Account, copy the 'Auth ID'
109
+                          and enter it in the field from below.):</label></p>
110
+                   <input type="password" class="smsr_textbox" id="nexapi_key" name="nexapi_key" autocomplete="false"
111
+                          placeholder="<?php p($l->t('e.g. r5g974cb92e4t1 ...')); ?>" /><br>
112
+
113
+                   <p><label for="nexapi_secret" class="setlabeltext"><b>Plivo Auth Token</b> (While logged in to Plivo, on the Overview page, under Account, copy the 'Auth Token' and
114
+                          enter it in the field from below.):</label></p>
115
+                   <input type="password" class="smsr_textbox" id="nexapi_secret" name="nexapi_secret" autocomplete="false"
116
+                          placeholder="<?php p($l->t('e.g. k6f489d8awn4p9 ...')); ?>" /><br>
117
+
118
+                   <p><label for="nexapi_url_rec" class="setlabeltext"><b>Plivo webhook URL for incoming SMS/MMS</b> (You have to first generate and then copy this URL into your Plivo
119
+                       account, so that Plivo knows where to deliver the SMS/MMS messages received by your Plivo phone number(s). First generate the URL by pressing the button from
120
+                       below, copy it, then, in your Plivo account click on 'Messaging' on the left vertical bar, click on 'Applications', then, under 'Application name' click on
121
+                       'Inbound SMS Messages', next, under 'Message', enter the webhook URL generated here in the field 'Message URL' and select 'POST' next to it, then click the
122
+                       'Update Application' button. Don't forget to also click the 'Save' button at the bottom of this page after entering all the credentials, to save all the settings 
123
+                       to the database.)</label></p>
124
+                   <input type="button" id="generate_nex_rcpt" class="generateUrl" value="<?php p($l->t('Generate new webhook URL for incoming SMS/MMS')) ?>" />
125
+                   <input type="text" class="smsr_textboxspec" id="nexapi_url_rec" name="nexapi_url_rec" autocomplete="false" />
126
+                   <span id="copyToClipboardnex" class="icon icon-clippy" title="Copy to clipboard"></span><br><br>
127
+
128
+                   <p><label for="nexapi_url" class="setlabeltext"><b>Plivo webhook URL for delivery receipts</b> (This URL will be included by SMS Relentless in message sending 
129
+                       requests, so that Plivo will know where to send the delivery receipts. Just generate it by pressing the button from below.
130
+                       You don't have to enter this URL into your Plivo account. Don't forget to click the 'Save' button at the bottom of this page after entering all the credentials, 
131
+                       to save all the settings to the database.)</label></p>
132
+                   <input type="button" id="generate_nex_delrcpt" class="generateUrl" value="<?php p($l->t('Generate new webhook URL for delivery receipts')) ?>" />
133
+                   <input type="text" id="nexapi_url" name="nexapi_url" autocomplete="false" /><br><br>
134
+
135
+                   <p><label for="nex_sender_name" class="setlabeltext"><b>Plivo alphanumeric Sender ID:</b> (If you intend to use an alphanumeric Sender ID, enter an alphanumeric 
136
+                          sequence of up to 11 characters in the range of a-z, A-Z, 0-9 and space. In certain countries there are regulations that accept only shorter alphanumeric 
137
+                          Sender IDs, such as up to 6 characters. You cannot send SMS/MMS messages with alphanumeric Sender IDs to USA or Canada. There are even 
138
+                          <a href="https://support.plivo.com/hc/en-us/articles/360041448032" style="color:#1b60ba" target="_blank" rel="noreferrer noopener">countries</a> that require
139
+                          preregistration of alphanumeric Sender IDs. Before sending SMS/MMS messages to a country, it's recommended to read the
140
+                          <a href="https://support.twilio.com/hc/en-us/articles/223133767-International-support-for-Alphanumeric-Sender-ID" style="color:#1b60ba" target="_blank"
141
+                          rel="noreferrer noopener">country specific features and restrictions.</a> Some carriers won't accept messages with an alphanumeric Sender ID): </label></p>
142
+                   <input type="text" class="smsr_textbox" id="nex_sender_name" name="nex_sender_name" autocomplete="false"
143
+                          placeholder="<?php p($l->t('e.g. Global Inc')); ?>" /><br><br>
144
+
145
+                   <p><label for="plvKeysAccessTbl" class="setlabeltext"><b>Allow the following groups and non-admin users to send and receive messages using the Plivo Auth ID, Auth 
146
+                          Token and alphanumeric Sender ID mentioned above (to be able to use them properly, the users with whom these credentials are shared will have to access their 
147
+                          app Settings page, generate the two webhook URLs for Plivo by clicking the corresponding 'Generate new webhook URL ...' buttons, and then click the 'Save' 
148
+                          button at the bottom of that page):</b></label></p><br>
149
+
150
+                   <table id="plvKeysAccessTbl">
151
+
152
+                      <tr><th>Groups Allowed</th><th style="max-width: 40px !important"></th><th>Users Allowed</th><th style="max-width: 40px !important"></th></th><th></tr>
153
+                      <tr><td><div id="alwdakeyGrps-plv" class="alwdKeysGroups"></div></td><td><div id="showakeyGrps-plv" class="showAllGroupsak">
154
+                      <img src="/apps/sms_relentless/img/group.svg" style="cursor:pointer" title="Show all groups"></div></td><td><div id="alwdakeyUsrs-plv" class="alwdKeysUsers"></div>
155
+                      </td><td><div id="showakeyUsrs-plv" class="showAllUsersak"><img src="/apps/sms_relentless/img/user.svg" style="cursor:pointer" title="Show all users"></div></td>
156
+                      <td><input type="submit" id="alwdrstsave-plv" class="savealwdKeys" value="Edit" title="Edit Row" /></td></tr>
157
+
158
+                   </table><br>
159
+
160
+                   </div><br><br><br>
161
+
162
+                   <div class="providerSettings">
163
+                   <p class="providerName">Twilio Settings</p>
164
+                   <p><label for="twilapi_key" class="setlabeltext"><b>Twilio Account SID</b> (Log in to Twilio. On the first page, under Account Info, copy the 'Account SID'
165
+                          and enter it in the field from below.):</label></p>
166
+                   <input type="password" class="smsr_textbox" id="twilapi_key" name="twilapi_key" autocomplete="false"
167
+                          placeholder="<?php p($l->t('e.g. r5g974cb92e4t1 ...')); ?>" /><br>
168
+
169
+                   <p><label for="twilapi_secret" class="setlabeltext"><b>Twilio Auth Token</b> (While logged in to Twilio, on the first page, under Account Info, copy the 'Auth Token'
170
+                          and enter it in the field from below.):</label></p>
171
+                   <input type="password" class="smsr_textbox" id="twilapi_secret" name="twilapi_secret" autocomplete="false"
172
+                          placeholder="<?php p($l->t('e.g. k6f489d8awn4p9 ...')); ?>" /><br>
173
+
174
+                   <p><label for="twilapi_url_rec" class="setlabeltext"><b>Twilio webhook URL for incoming SMS/MMS</b> (You have to first generate and then copy this URL into your 
175
+                       Twilio account, so that Twilio knows where to deliver the SMS/MMS messages received by your Twilio phone number(s). First generate the URL by pressing the button 
176
+                       from below, copy it, then, in your Twilio account click on 'Phone Numbers' on the left panel > 'Manage' > 'Active numbers', click on the phone number you want to 
177
+                       use for SMS/MMS, scroll down to the 'Messaging' section, then under 'A MESSAGE COMES IN' select 'Webhook', then paste in the webhook URL that you have just 
178
+                       generated and select 'HTTP POST' as the request type. Enter the same data under 'PRIMARY HANDLER FAILS', then click the 'Save' button. If you have multiple 
179
+                       SMS/MMS enabled phone numbers, do the same for each number. Don't forget to also click the 'Save' button at the bottom of this page after entering all the 
180
+                       credentials, to save all the settings to the database.)</label></p>
181
+                   <input type="button" id="generate_twil_rcpt" class="generateUrl" value="<?php p($l->t('Generate new webhook URL for incoming SMS/MMS')) ?>" />
182
+                   <input type="text" class="smsr_textboxspec" id="twilapi_url_rec" name="twilapi_url_rec" autocomplete="false" />
183
+                   <span id="copyToClipboardtwil" class="icon icon-clippy" title="Copy to clipboard"></span><br><br>
184
+
185
+                   <p><label for="twilapi_url" class="setlabeltext"><b>Twilio webhook URL for delivery receipts</b> (This URL will be included by SMS Relentless in message sending 
186
+                       requests, so that Twilio will know where to send the delivery receipts. Just generate it by pressing the button from below.
187
+                       You don't have to enter this URL into your Twilio account. Don't forget to click the 'Save' button at the bottom of this page after entering all the credentials, 
188
+                       to save all the settings to the database.)</label></p>
189
+                   <input type="button" id="generate_twil_delrcpt" class="generateUrl" value="<?php p($l->t('Generate new webhook URL for delivery receipts')) ?>" />
190
+                   <input type="text" id="twilapi_url" name="twilapi_url" autocomplete="false" /><br><br>
191
+
192
+                   <p><label for="twil_sender_name" class="setlabeltext"><b>Twilio alphanumeric Sender ID:</b> (If you intend to use an alphanumeric Sender ID, enter an alphanumeric 
193
+                          sequence of up to 11 characters in the range of a-z, A-Z, 0-9 and space. In certain countries there are regulations that accept only shorter alphanumeric 
194
+                          Sender IDs, such as up to 6 characters. You cannot send SMS/MMS messages with alphanumeric Sender IDs to USA or Canada. There are even 
195
+                          <a href="https://support.plivo.com/hc/en-us/articles/360041448032" style="color:#1b60ba" target="_blank" rel="noreferrer noopener">countries</a> that require
196
+                          preregistration of alphanumeric Sender IDs. Before sending SMS/MMS messages to a country, it's recommended to read the
197
+                          <a href="https://support.twilio.com/hc/en-us/articles/223133767-International-support-for-Alphanumeric-Sender-ID" style="color:#1b60ba" target="_blank"
198
+                          rel="noreferrer noopener">country specific features and restrictions.</a> Some carriers won't accept messages with an alphanumeric Sender ID): </label></p>
199
+                   <input type="text" class="smsr_textbox" id="twil_sender_name" name="twil_sender_name" autocomplete="false"
200
+                          placeholder="<?php p($l->t('e.g. Global Inc')); ?>" /><br><br>
201
+
202
+                   <p><label for="twlKeysAccessTbl" class="setlabeltext"><b>Allow the following groups and non-admin users to send and receive messages using the Twilio Account SID, 
203
+                          Auth Token and alphanumeric Sender ID mentioned above (to be able to use them properly, the users with whom these credentials are shared will have to access 
204
+                          their app Settings page, generate the two webhook URLs for Twilio by clicking the corresponding 'Generate new webhook URL ...' buttons, and then click the 
205
+                          'Save' button at the bottom of that page):</b></label></p><br>
206
+
207
+                   <table id="twlKeysAccessTbl">
208
+
209
+                      <tr><th>Groups Allowed</th><th style="max-width: 40px !important"></th><th>Users Allowed</th><th style="max-width: 40px !important"></th></th><th></tr>
210
+                      <tr><td><div id="alwdakeyGrps-twl" class="alwdKeysGroups"></div></td><td><div id="showakeyGrps-twl" class="showAllGroupsak">
211
+                          <img src="/apps/sms_relentless/img/group.svg" style="cursor:pointer" title="Show all groups"></div></td>
212
+                          <td><div id="alwdakeyUsrs-twl" class="alwdKeysUsers"></div></td><td><div id="showakeyUsrs-twl" class="showAllUsersak">
213
+                          <img src="/apps/sms_relentless/img/user.svg" style="cursor:pointer" title="Show all users"></div></td>
214
+                          <td><input type="submit" id="alwdrstsave-twl" class="savealwdKeys" value="Edit" title="Edit Row" /></td></tr>
215
+
216
+                   </table><br>
217
+
218
+                   </div><br><br><br>
219
+
220
+                   <div class="providerSettings">
221
+                   <p class="providerName">Flowroute Settings</p>
222
+                   <p><label for="flowapi_key" class="setlabeltext"><b>Flowroute Access Key</b> (Log in to Flowroute. On the left panel, click on 'Preferences', then on the 'API Control'
223
+                          tab. Scroll down to the 'API Keys' section. If you already have a pair of keys listed in that section, just copy the Access Key to the field from below. If you
224
+                          haven't created any keys yet, to create a key pair, under 'Add new API Key', in the 'Name' field, enter a name for the new key pair. In the 'Description' field 
225
+                          enter a short description, then click 'Add new'. A new pair of keys will be created and you will be prompted to copy the Secret Key. After you copy the Secret 
226
+                          Key to a safe location, copy the Access Key that has just been created to the field from below.):</label></p>
227
+                   <input type="password" class="smsr_textbox" id="flowapi_key" name="flowapi_key" autocomplete="false"
228
+                          placeholder="<?php p($l->t('e.g. r5g974cb92e4t1 ...')); ?>" /><br>
229
+
230
+                   <p><label for="flowapi_secret" class="setlabeltext"><b>Flowroute Secret Key</b> (Enter the Secret Key created earlier and copied to a safe place, in the field from 
231
+                          below.):</label></p>
232
+                   <input type="password" class="smsr_textbox" id="flowapi_secret" name="flowapi_secret" autocomplete="false"
233
+                          placeholder="<?php p($l->t('e.g. k6f489d8awn4p9 ...')); ?>" /><br>
234
+
235
+                   <p><label for="flowapi_url_rec" class="setlabeltext"><b>Flowroute webhook URL for incoming SMS/MMS</b> (You have to first generate and then copy this URL into your 
236
+                          Flowroute account, so that Flowroute knows where to deliver the SMS/MMS messages received by your Flowroute phone number(s). First generate the URL by pressing 
237
+                          the button from below, copy it, then, in your Flowroute account click on 'Preferences' on the left panel, then click on the 'API Control tab', turn on the 'SMS' 
238
+                          switch and in the field that shows up enter the URL that you have just generated. Click 'Save URL'. If you have an MMS enabled phone number, turn on the 'MMS' 
239
+                          switch, enter the same URL in the URL field and save it. Also, under 'SMS Webhook Version' choose 'v2.1'. Don't forget to also click the 'Save' button at the 
240
+                          bottom of this page after entering all the credentials, to save all the settings to the database.)</label></p>
241
+                   <input type="button" id="generate_flow_rcpt" class="generateUrl" value="<?php p($l->t('Generate new webhook URL for incoming SMS/MMS')) ?>" />
242
+                   <input type="text" class="smsr_textboxspec" id="flowapi_url_rec" name="flowapi_url_rec" autocomplete="false" />
243
+                   <span id="copyToClipboardflow" class="icon icon-clippy" title="Copy to clipboard"></span><br><br>
244
+
245
+                   <p><label for="flowapi_url" class="setlabeltext"><b>Flowroute webhook URL for delivery receipts</b> (This URL will be included by SMS Relentless in message sending 
246
+                          requests, so that Flowroute will know where to send the delivery receipts. Just generate it by pressing the button from below. You don't have to enter this URL 
247
+                          into your Flowroute account. Don't forget to click the 'Save' button at the bottom of this page after entering all the credentials, to save all the settings 
248
+                          to the database.)</label></p>
249
+                   <input type="button" id="generate_flow_delrcpt" class="generateUrl" value="<?php p($l->t('Generate new webhook URL for delivery receipts')) ?>" />
250
+                   <input type="text" id="flowapi_url" name="flowapi_url" autocomplete="false" /><br><br>
251
+                   <span style='color:#272727'>Flowroute only supports sending/receiving SMS/MMS messages within USA and Canada and it doesn't support Alphanumeric Sender IDs.</span><br><br>
252
+
253
+                   <p><label for="flrKeysAccessTbl" class="setlabeltext"><b>Allow the following groups and non-admin users to send and receive messages using the Flowroute Access Key 
254
+                          and Secret Key mentioned above (to be able to use them properly, the users with whom these credentials are shared will have to access their app Settings page, 
255
+                          generate the two webhook URLs for Flowroute by clicking the corresponding 'Generate new webhook URL ...' buttons, and then click the 'Save' button at the 
256
+                          bottom of that page):</b></label></p><br>
257
+
258
+                   <table id="flrKeysAccessTbl">
259
+
260
+                      <tr><th>Groups Allowed</th><th style="max-width: 40px !important"></th><th>Users Allowed</th><th style="max-width: 40px !important"></th></th><th></tr>
261
+                      <tr><td><div id="alwdakeyGrps-flr" class="alwdKeysGroups"></div></td><td><div id="showakeyGrps-flr" class="showAllGroupsak">
262
+                      <img src="/apps/sms_relentless/img/group.svg" style="cursor:pointer" title="Show all groups"></div></td><td>
263
+                      <div id="alwdakeyUsrs-flr" class="alwdKeysUsers"></div></td><td><div id="showakeyUsrs-flr" class="showAllUsersak">
264
+                      <img src="/apps/sms_relentless/img/user.svg" style="cursor:pointer" title="Show all users"></div></td>
265
+                      <td><input type="submit" id="alwdrstsave-flr" class="savealwdKeys" value="Edit" title="Edit Row" /></td></tr>
266
+
267
+                   </table><br>
268
+
269
+                   </div><br><br><br>
270
+
271
+
272
+                   <p><label for="showallmessages" class="setlabeltext"><b>In my message tables, list not only my messages but also the messages of all the Nextcloud users 
273
+                   with whom I share the access keys mentioned above:</b></label></p>
274
+                   <input type="checkbox" class="sms_rel_checkbox" id="showallmessages" name="showallmessages" autocomplete="false" /><br>
275
+
276
+                   <p><div class="setlabeltext"><b>Restrict access to the following phone numbers:</b><div class="tooltiprestrict">
277
+                        <div id="inforestrict">i</div><div class="restricttooltext">After you allow non-admin users to use your API keys for a provider, to send and
278
+                        receive messages, they will be able to see and use all the phone numbers associated with those API keys. However, if you restrict a shared phone number
279
+                        to a specific non-admin user, he will be able to see and use only that number.</div></div></p><br>
280
+
281
+                   <table id="phoneNmbrRestr">
282
+
283
+                      <tr><th>Restriction Author</th><th id="phoneNumberTh">Phone Number</th><th>Groups Allowed</th><th style="max-width: 40px !important"></th><th>Users Allowed</th>
284
+                      <th style="max-width: 40px !important"></th><th></th><th></th></tr>
285
+
286
+                   </table><br>
287
+
288
+                   <input type="hidden" id="user_id" name="user_id" />
289
+
290
+                   <input id="save_admin_settings" type="submit" value="<?php p($l->t('Save')) ?>" />
291
+
292
+                   <span id="smsr_save_msg"></span>
293
+
294
+               </form>
295
+           </div>
296
+        </div>
297
+</div>
298
+