рд╣рдо "рдЕрдирд╛рдо" рдПрд╕рдПрдордПрд╕ рдХреЛ рдмрд╛рдЗрдЯрд╣реИрдВрдб рдФрд░ C ++ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдВрд╕реЛрд▓ рд╕реЗ рднреЗрдЬрддреЗ рд╣реИрдВ

рдХрднреА-рдХрднреА рдЕрдкрдиреЗ рдлреЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдпрд╛ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдФрд░ рдПрдХ рдЦреБрд▓реЗ рдХрдВрд╕реЛрд▓ рд╣реИ, рддреЛ рд╕рд╣реА рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдЕрдирд╛рдо рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдХрдИ рдлрд┐рд▓реНрдореЛрдВ рдореЗрдВ рдПрдХ рдРрд╕рд╛ рдХреНрд╖рдг рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдХреНрд░реИрдХ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдХрд░ рдХреЛ рд╡рд┐рдЪрд▓рд┐рдд рдХрд░рдиреЗ рдпрд╛ рдбрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕рдХреЗ рдирдВрдмрд░ рдкрд░ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рд╡реНрдпрдХреНрддрд┐ рдЙрд╕ рдирдВрдмрд░ рдкрд░ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдПрд╕рдПрдордПрд╕ рдЖрдпрд╛ рдерд╛, рддреЛ рдЖрдкрдХреЗ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреА рд╕реНрдХреНрд░реАрди рдкреНрд░рдХрд╛рд╢ рдореЗрдВ рдирд╣реАрдВ рдЖрддреА рд╣реИ рдФрд░ рд╕рдВрдЧреАрдд рдмрдЬрдиреЗ рд▓рдЧрд╛ред рдЙрдлрд╝ ... рдЕрдЬреАрдм рд╕реНрдерд┐рддрд┐ред рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ, рд╣рдо C ++ рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдирдВрдмрд░, рд╕рд┐рдо рдХрд╛рд░реНрдб рдФрд░ рдЖрддреНрдорд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдПрд╕рдПрдордПрд╕ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рд╢реНрд░реА рд░реЛрдмреЛрдЯ рдЯреАрд╡реА рд╢реЛ

"рдЧреБрдордирд╛рдореА" рд╢рдмреНрдж рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЬрд┐рд╕рдиреЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрд╛ рд╣реИ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рдЗрд╕ рддрдереНрдп рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддрд╛рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧрдВрднреАрд░ рдЪреБрдЯрдХреБрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрдкрд╕реЗ рдорд┐рд▓рдиреЗ рдирд╣реАрдВ рдЖрдКрдВрдЧрд╛ред

рдЪреЗрддрд╛рд╡рдиреАред рдХрд╛рд░реНрдп рдХреЛ рдЖрд╕рд╛рди рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ, рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ c ++ рднрд╛рд╖рд╛ рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЪрд▓реЛ рд╡реНрдпрд╛рдкрд╛рд░ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЛред

рдмрд╛рдЗрдЯрд╣реИрдВрдб рд╕реЗрд╡рд╛ рдПрдХ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдореЗрд▓рд┐рдВрдЧ рдФрд░ рдПрдХрд▓ рд╕рдВрджреЗрд╢ рджреЛрдиреЛрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕реЗрд╡рд╛ рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреНрдпреЛрдВ рдЪреБрдирд╛ рдпрд╣ рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рд╕реЗ рдЙрдкрд▓рдмреНрдз рдПрдХ рдПрдкреАрдЖрдИ рд╣реИ, рдЬреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рдПрдХ HTTP рдЕрдиреБрд░реЛрдз-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИред

рдпрд╣рд╛рдБ рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП:

  • рдмрд╛рдИрдЯрд╣реИрдВрдб рдЦрд╛рддрд╛
  • рдЦрд╛рддреЗ рдореЗрдВ 100 рд░реВрдмрд▓ (рдФрд░ рдЖрдк рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдПрд╕рдПрдордПрд╕ рдореБрдлреНрдд рдирд╣реАрдВ рд╣реИ)
  • C ++ рдХрдВрд╕реЛрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо
  • Https рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд Boost.Asio рдФрд░ OpenSSL рд▓рд╛рдЗрдмреНрд░реЗрд░реА
  • рдмрд╛рдЗрдЯрд╣реИрдВрдб рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рд╕реБрд░рдХреНрд╖рд┐рдд рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рдХреЗ рд▓рд┐рдП рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдмрд╛рдЗрдЯрд╣реИрдВрдб рд╕реЗрд╡рд╛ рдкрд░ рдкрдВрдЬреАрдХрд░рдг рдХрд░реЗрдВред рдкрдВрдЬреАрдХрд░рдг рдПрдХ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдИ-рдореЗрд▓ рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХрд╛ рдЦрд╛рддрд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЦрд╛рддреЗ рдХреЛ рдкреБрди: рднрд░рддреЗ рд╕рдордп (рдХрдо рд╕реЗ рдХрдо 100 рд░реВрдмрд▓) рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реЗрдбрд░ рдПрд╕рдПрдордПрд╕-рдЗрдирдлреЛ рдХреЗ рд╕рд╛рде рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рдкреНрд░рд╕реНрдерд╛рди рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрд╛рда рдЙрдкрдирд╛рдо рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдЧрд▓рд╛ рд╣рдо рд╕рдВрд╕рд╛рдзрди рдПрдкреАрдЖрдИ рдореЗрдВ рдЪрдврд╝рддреЗ рд╣реИрдВред рдФрд░ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдПрд╕рдПрдордПрд╕ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреЗрдЯрд╛ рдкреИрдХреЗрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

POST /v2/sms/messages HTTP/1.1 Host: api.bytehand.com Connection: close Content-Length: * Content-Type: application/json;charset=UTF-8 X-Service-Key: ab4db0b982dcd0ba63e44191e5d71ef8 { "sender": "MyShop", "receiver": "+79167654321", "text": "Today only! 20% off for all goods!!" } 

рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ http рд╣реИрдбрд░ рдореЗрдВ X-Service-Key рд╕рдВрдкреВрд░реНрдг рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╣реИред рдЗрд╕ рдХреБрдВрдЬреА рдХреЛ "рд╕реБрд░рдХреНрд╖рд╛" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕рд╛рдЗрдЯ рдкрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рдЖрдк c ++ рдореЗрдВ рдХрдВрд╕реЛрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдореЗрдВ рдПрдХ рдХреЛрдб рдХрд╛ рдЯреБрдХрдбрд╝рд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ Boost.Asio рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ https рдкреНрд░реЛрдЯреЛрдХреЙрд▓

 //   Boost #include <boost/asio.hpp> #include <boost/asio/ssl.hpp> #include <boost/bind.hpp> // --------------------------- // ---------- Include OpenSSL Lib ---------- #pragma comment (lib, "libeay32.lib") #pragma comment (lib, "ssleay32.lib") // ----------------------------------------- using namespace boost::asio; //    bool verify_certificate(bool preverified, boost::asio::ssl::verify_context& ctx) { X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle()); return preverified; } int main() { io_service service; // ,    /*------------------------------------------------------------ -     - ------------------------------------------------------------*/ ip::tcp::resolver resolver(service); ip::tcp::resolver::query query("api.bytehand.com", "https"); ip::tcp::resolver::iterator iterator = resolver.resolve(query); ssl::context context(boost::asio::ssl::context::sslv23); context.load_verify_file("dh2048.pem"); ssl::stream<ip::tcp::socket> socket_(service, context); socket_.set_verify_mode(ssl::context::verify_none); socket_.set_verify_callback(boost::bind(verify_certificate, _1, _2)); connect(socket_.lowest_layer(), iterator); socket_.handshake(boost::asio::ssl::stream_base::client); //        socket_.write_some() } 

рдХреЛрдб dh2048.pem рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕рд╛рде рд░рдЦреЗрдВред
рдЖрдк рдпрд╣ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдБ рдбреЛрдореЗрди рдирд╛рдо api.bytehand.com рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП http рдЕрдиреБрд░реЛрдз рдХреЗ рд╣реЗрдбрд░ рдФрд░ рдмреЙрдбреА рдмрдирддреЗ рд╣реИрдВред

 int main() { /*  ,       https */ //            //       string number = "+79180000000"; string signature = "SMS-INFO"; string text = "Today only! 20% off for all goods!!"; std::stringstream request_; //     char sockBuffer[8192]; //      //     ,       Content-Length string reqTmp = "{\"sender\": \"" + signature + "\",\"receiver\": \"" + number + "\",\"text\": \"" + text + "\"}\r\n"; request_ << "POST /v2/sms/messages HTTP/1.1\r\n"; request_ << "Host: api.bytehand.com\r\n"; request_ << "Connection: close\r\n"; request_ << "Content-Length: " << reqTmp.length() << "\r\n"; request_ << "Content-Type: application/json;charset=UTF-8\r\n"; request_ << "X-Service-Key: ab4db0b982dcd0ba63e44191e5d71ef8\r\n"; request_ << "\r\n"; request_ << reqTmp; //     socket_.write_some(buffer(request_.str())); memset(sockBuffer, NULL, 8192); //       socket_.read_some(buffer(boost::asio::buffer(sockBuffer))); //     cout << endl << endl << sockBuffer << endl; } 

рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде X-Service-Key рдлрд╝реАрд▓реНрдб рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдФрд░ рдпрджрд┐ рд╕рдм рдХреБрдЫ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рд░реНрд╡рд░ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддрд╛ рд╣реИ:

 Status Code: 200 Content-Type: application/json;charset=UTF-8 Content-Language: en Cache-Control: no-cache, no-store, max-age=0, must-revalidate Pragma: no-cache { "result": "created", "count": 1 } 

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдЦрд╛рддреЗ рдореЗрдВ рдкреИрд╕рд╛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдореИрд╕реЗрдЬ рдПрдбреНрд░реЗрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдкрд╛рд╕ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рд╡рд╣ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдХрдВрдкрдиреА рдирдВрдмрд░ рдпрд╛ рдПрдХ рдкрд╛рда рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рд╕рдордЭ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рд╕рдВрджреЗрд╢ рдХрд┐рд╕рд╕реЗ рдерд╛ред

рдЬрдм рдореИрдВрдиреЗ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрд╛ рддреЛ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реБрдЖ:

MyProgram

рдпрд╣ рдЕрдирд╛рдбрд╝реА рдирд┐рдХрд▓рд╛, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реИред рд╕рднреА рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдБ, рд╢рд╛рдпрдж рдЗрд╕ рд╡рд┐рд╖рдп рдиреЗ рдЖрдкрдХреА рдХреБрдЫ рдорджрдж рдХреАред

рдпрд╣ рдпрд╣рд╛рдБ рдореЗрд░рд╛ рджреВрд╕рд░рд╛ рд▓реЗрдЦ рдерд╛ред рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╕реМрднрд╛рдЧреНрдп рдЖрдкрдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕ред

Source: https://habr.com/ru/post/hi419165/


All Articles