vendor: 87 bytes, lines 1-4
1/******/ (() => { // webpackBootstrap 2/******/ var __webpack_modules__ = ({ 3 4/***/ "./
4app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/components/clientSideValidation.js": 5/*!***************************************************************************************************************************!*\ 6 !*** ./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/components/clientSideValidation.js ***! 7 \***************************************************************************************************************************/ 8/***/ ((module) => { 9 10"use strict"; 11 12 13/** 14 * Validate whole form. Requires `this` to be set to form object 15 * @param {jQuery.event} event - Event to be canceled if form is invalid. 16 * @returns {boolean} - Flag to indicate if form is valid 17 */ 18function _validateForm(event) { 19 var valid = true; 20 if (this.checkValidity && !this.checkValidity()) { 21 // safari 22 valid = false; 23 if (event) { 24 event.preventDefault(); 25 event.stopPropagation(); 26 event.stopImmediatePropagation(); 27 } 28 $(this).find('input, select, textarea').each(function () { 29 if (!this.validity.valid) { 30 $(this).trigger('invalid', this.validity); 31 } 32 }); 33 } 34 return valid; 35} 36 37/** 38 * Remove all validation. Should be called every time before revalidating form 39 * @param {element} form - Form to be cleared 40 * @returns {void} 41 */ 42function clearForm(form) { 43 $(form).find('.form-control.is-invalid').removeClass('is-invalid'); 44 $(form).find('.invalid-feedback').text(''); 45} 46module.exports = {
47 invalid: function invalid() { 48 $('form input, form select, form textarea').on('invalid', function (e) { 49 e.preventDefault(); 50 this.setCustomValidity(''); 51 if (!this.validity.valid) { 52 var validationMessage = this.validationMessage; 53 $(this).addClass('is-invalid'); 54 // Due to the input with type email has many validations 55 // So need to set it invalid with the pattern mismatch error 56 // (When all validity is false, but this.validity.valid is still not true) 57 if (this.validity.patternMismatch && $(this).data('pattern-mismatch') || Object.values(this.validity).every(function (value) { 58 return !value; 59 })) { 60 validationMessage = $(this).data('pattern-mismatch'); 61 } 62 if ((this.validity.rangeOverflow || this.validity.rangeUnderflow) && $(this).data('range-error')) { 63 validationMessage = $(this).data('range-error'); 64 } 65 if ((this.validity.tooLong || this.validity.tooShort) && $(this).data('range-error')) { 66 validationMessage = $(this).data('range-error'); 67 } 68 if (this.validity.valueMissing && $(this).data('missing-error')) { 69 validationMessage = $(this).data('missing-error'); 70 } 71 $(this).parents('.form-group').find('.invalid-feedback').text(validationMessage); 72 } 73 }); 74 }, 75 submit: function submit() { 76 $('form').on('submit', function (e) { 77 return _validateForm.call(this, e); 78 }); 79 }, 80 buttonClick: function buttonClick() { 81 $('form button[type="submit"], form input[type="submit"]').on('click', function () { 82 // clear all errors when trying to submit the form 83 clearForm($(this).parents('form')); 84 }); 85 }, 86 functions: { 87 validateForm: function validateForm(form, event) { 88 var isValidForm = _validateForm.call(form, event || null); 89 return isValidForm; 90 }, 91 clearForm: clearForm 92 } 93}; 94 95/***/ }), 96
97/***/ "./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/components/emailValidation.js": 98/*!**********************************************************************************************************************!*\ 99 !*** ./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/components/emailValidation.js ***! 100 \**********************************************************************************************************************/ 101/***/ ((module) => { 102 103"use strict"; 104 105 106module.exports = function (email) { 107 var split = email.split('@'); 108 var regex = email.match(/^[A-Za-z0-9_.+\/?-]+@[a-zA-Z0-9]+[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/) && split.length == 2 && !split[0].match(/[\s,()\[\];:%*<>\""{}]/) && !split[0].match(/^[\.]|[\x01-\x1F]|[\x7f-\xff]/) && !split[1].match(/^\.|\.\.|\.$|[^a-zA-Z0-9\.\-\_]/); 109 return regex; 110}; 111 112/***/ }), 113
114/***/ "./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/components/errorNotification.js": 115/*!************************************************************************************************************************!*\ 116 !*** ./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/components/errorNotification.js ***! 117 \************************************************************************************************************************/ 118/***/ ((module) => { 119 120module.exports = function (element, message) { 121 var errorHtml = "".concat('<div class="alert alert-danger alert-dismissible ' + 'fade show" role="alert">' + '<button type="button" class="close" data-dismiss="alert" aria-label="Close">' + '<span aria-hidden="true">×</span>' + '</button>').concat(message, "</div>"); 122 $(element).append(errorHtml); 123}; 124 125/***/ }), 126
127/***/ "./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/components/formValidation.js": 128/*!*********************************************************************************************************************!*\ 129 !*** ./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/components/formValidation.js ***! 130 \*********************************************************************************************************************/ 131/***/ ((module) => { 132 133function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } 134/** 135 * Remove all validation. Should be called every time before revalidating form 136 * @param {element} form - Form to be cleared 137 * @returns {void} 138 */ 139function clearFormErrors(form) { 140 $(form).find('.form-control.is-invalid').removeClass('is-invalid'); 141} 142module.exports = function (formElement, payload) { 143 // clear form validation first 144 clearFormErrors(formElement); 145 $('.alert', formElement).remove(); 146 if (_typeof(payload) === 'object' && payload.fields) { 147 Object.keys(payload.fields).forEach(function (key) { 148 if (payload.fields[key]) { 149 var feedbackElement = $(formElement).find("[name=\"".concat(key, "\"]")).parent().children('.invalid-feedback'); 150 if (feedbackElement.length > 0) { 151 if (Array.isArray(payload[key])) { 152 feedbackElement.html(payload.fields[key].join('<br/>')); 153 } else { 154 feedbackElement.html(payload.fields[key]); 155 } 156 feedbackElement.siblings('.form-control').addClass('is-invalid'); 157 } 158 } 159 }); 160 } 161 if (payload && payload.error) { 162 var form = $(formElement).prop('tagName') === 'FORM' ? $(formElement) : $(formElement).parents('form'); 163 form.prepend("<div class=\"alert alert-danger\" role=\"alert\">".concat(payload.error.join('<br/>'), "</div>")); 164 } 165}; 166 167/***/ }), 168
169/***/ "./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/components/passwordValidation.js": 170/*!*************************************************************************************************************************!*\ 171 !*** ./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/components/passwordValidation.js ***! 172 \*************************************************************************************************************************/ 173/***/ ((module) => { 174 175"use strict"; 176 177 178module.exports = function (password) { 179 var regex = /^(?=.*?[0-9])(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[!-/:-@[-`{-~])[0-9a-zA-Z!-/:-@[-`{-~]{8,12}$/; 180 return regex.test(password); 181}; 182 183/***/ }), 184
185/***/ "./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/login/login.js": 186/*!*******************************************************************************************************!*\ 187 !*** ./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/login/login.js ***! 188 \*******************************************************************************************************/ 189/***/ ((module, __unused_webpack_exports, __webpack_require__) => { 190 191"use strict"; 192 193 194var formValidation = __webpack_require__(/*! ../components/formValidation */ "./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/components/formValidation.js"); 195var clientSideValidation = __webpack_require__(/*! ../components/clientSideValidation */ "./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/components/clientSideValidation.js"); 196var emailValidation = __webpack_require__(/*! ../components/emailValidation */ "./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/components/emailValidation.js"); 197var passwordValidation = __webpack_require__(/*! ../components/passwordValidation */ "./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/components/passwordValidation.js"); 198var createErrorNotification = __webpack_require__(/*! ../components/errorNotification */ "./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/components/errorNotification.js"); 199function bodyFixedOn(isiOS, scrollPosition) { 200 if (isiOS) { 201 scrollPosition = $(window).scrollTop(); 202 $('body').addClass('jsModalOpenedIOS'); 203 $('body').css('top', "-".concat(scrollPosition, "px")); 204 } else { 205 $('body').addClass('jsModalOpened'); 206 } 207} 208function bodyFixedOff(isiOS, scrollPosition) { 209 if (isiOS) { 210 $('body').removeClass('jsModalOpenedIOS'); 211 $('body').css('top', ''); 212 $(window).scrollTop(scrollPosition); 213 } else { 214 $('body').removeClass('jsModalOpened'); 215 } 216} 217function popupModal(button, e) { 218 var $this = $(button); 219 var closeBtnUrl = $this.data('close-btn'); 220 var closeButton = '<button title="Close (Esc)" type="button" class="mfp-close mfp-close--custom" onclick="$.magnificPopup.close();"><img src="' + closeBtnUrl + '"></button>'; 221 if ($this.hasClass('jsNoDispClose')) { 222 closeButton = ''; 223 } 224 var scrollPosition; 225 var ua = window.navigator.userAgent.toLowerCase(); 226 var isiOS = ua.indexOf('iphone') > -1 || ua.indexOf('ipad') > -1 || ua.indexOf('macintosh') > -1 && 'ontouchend' in document; 227 $.ajax({ 228 url: $this.attr('href'), 229 type: 'get', 230 data: [] 231 }).done(function (data) { 232 $.spinner().stop(); 233 $.magnificPopup.open({ 234 items: { 235 src: data, 236 type: 'inline' 237 }, 238 // è¦ç´åæã¯ã¢ãã«å¤ã¯ãªãã¯ã§ã¯éããªã 239 closeOnBgClick: false, 240 mainClass: 'mfp-fade', 241 removalDelay: 600, 242 closeMarkup: "<button title=\"Close (Esc)\" type=\"button\" class=\"mfp-close mfp-close--custom\" onclick=\"$.magnificPopup.close();\"><img src=\"".concat(closeBtnUrl, "\"></button>"), 243 callbacks: { 244 open: function open() { 245 bodyFixedOn(isiOS, scrollPosition); 246 }, 247 close: function close() { 248 bodyFixedOff(isiOS, scrollPosition); 249 } 250 } 251 }); 252 }).fail(function (err) { 253 if (err.responseJSON.redirectUrl) { 254 window.location.href = err.responseJSON.redirectUrl; 255 } 256 }); 257 e.preventDefault(); 258} 259function setAgreementVersion(loginEmail, loginPassword) { 260 var signinContent = $('.signin-content'); 261 var form = $('form.login'); 262 var url = form.attr('action'); 263 $.ajax({ 264 url: url, 265 type: 'post', 266 dataType: 'json', 267 data: form.serialize(), 268 success: function success(data) { 269 if (data.success) { 270 // æåæã¯ä½ãããç»é¢é·ç§» 271 window.location.href = data.redirectUrl; 272 } else { 273 // 失ææã¯ã¨ã©ã¼è¡¨ç¤º 274 $('.jsModalContentOuter').spinner().stop(); 275 $.magnificPopup.close(); 276 var errorMessage = data.error[0]; 277 signinContent.find('#form-backend-error').html(errorMessage); 278 } 279 }, 280 error: function error(data) { 281 if (data.responseJSON.redirectUrl) { 282 window.location.href = data.responseJSON.redirectUrl; 283 } else { 284 // 失ææã¯ã¨ã©ã¼è¡¨ç¤º 285 $('.jsModalContentOuter').spinner().stop(); 286 $.magnificPopup.close(); 287 var errorMessage = data.responseJSON.error.errorText; 288 signinContent.find('#form-backend-error').html(errorMessage); 289 } 290 } 291 }); 292 return false;
293} 294 295/** 296 * å種ããªãã¼ã·ã§ã³å¾ã«ãã°ã¤ã³ããããè¦ç´åæãã¼ã¸ã§ã³ãç°ãªãå ´åã¯ã¢ã¼ãã«ã表示ããã 297 * è¦ç´åæãã¼ã¸ã§ã³ãåä¸ãªãã°ãã®ã¾ã¾ãã°ã¤ã³ããã 298 * @param {Event} e - ã¤ãã³ãæ å ± 299 * @returns {Boolean} false 300 */ 301function _login(e) { 302 $.spinner().start(); 303 /** 304 * ãã©ã¼ã æ å ±åå¾ 305 */ 306 var form = $('form.login'); 307 308 /** 309 * ãã°ã¤ã³ç¨ã¡ã¼ã«ã¢ãã¬ã¹ 310 * @type {string} 311 */ 312 var loginEmail = $('#login-form-email').val(); 313 /** 314 * ãã°ã¤ã³ç¨ãã¹ã¯ã¼ã 315 * @type {string} 316 */ 317 var loginPassword = $('#login-form-password').val(); 318 319 // ã¨ã©ã¼ã¡ãã»ã¼ã¸ã®é¤å» 320 clientSideValidation.functions.clearForm(form.get(0)); 321 form.find('#form-backend-error').html(''); 322 var isValidPasswordEmail = true; 323 324 // Eã¡ã¼ã«ã¢ãã¬ã¹ã®ããªãã¼ã·ã§ã³ãã§ã㯠325 if (!emailValidation(loginEmail)) { 326 var emailErrorMessage = $('#login-form-email').data('pattern-mismatch'); 327 $('#login-form-email').addClass('is-invalid'); 328 form.find('#form-address-error').html(emailErrorMessage); 329 isValidPasswordEmail = false; 330 } 331 332 // ãã¹ã¯ã¼ãã®ããªãã¼ã·ã§ã³ãã§ã㯠333 if (!passwordValidation(loginPassword)) { 334 var passwordErrorMessage = $('#login-form-password').data('pattern-mismatch'); 335 $('#login-form-password').addClass('is-invalid'); 336 form.find('#form-password-error').html(passwordErrorMessage); 337 isValidPasswordEmail = false; 338 } 339 340 // formã®validationãã§ã㯠341 var isValid = clientSideValidation.functions.validateForm(form.get(0), e); 342 // validation失æ 343 if (!isValidPasswordEmail || !isValid) { 344 $.spinner().stop(); 345 return false; 346 } 347 var button = $('.jsMagnific#login'); 348 var url = button.data('loginurl'); 349 // ããã¯ã¨ã³ãã¸ã®éä¿¡å¦ç 350 $.ajax({ 351 url: url, 352 type: 'post', 353 dataType: 'json', 354 data: form.serialize(), 355 context: button, 356 success: function success(data) { 357 if (data.success) { 358 // æåæã¯ä½ãããç»é¢é·ç§» 359 window.location.href = data.redirectUrl; 360 } else if (data.isDifferentAgreementVersion) { 361 // è¦ç´åæãã¼ã¸ã§ã³ã«éããããå ´åã¯ãã¤ã¢ãã°ã表示ãã 362 popupModal(this, e); 363 } else if (data.isExpiredPassword) { 364 // ãã¹ã¯ã¼ãæå¹æéåãã¯ãªã»ãããã¼ã¸ã«é·ç§» 365 window.location.href = data.redirectUrl; 366 } else { 367 // 失ææã¯ã¨ã©ã¼è¡¨ç¤º 368 $.spinner().stop(); 369 var errorMessage = data.error[0]; 370 form.find('#form-backend-error').html(errorMessage); 371 } 372 }, 373 error: function error(data) { 374 if (data.responseJSON.redirectUrl) { 375 window.location.href = data.responseJSON.redirectUrl; 376 } else { 377 var errorMessage = data.responseJSON.error.errorText; 378 form.find('#form-backend-error').html(errorMessage); 379 $.spinner().stop(); 380 } 381 } 382 }); 383} 384module.exports = { 385 login: function login() { 386 // ãã°ã¤ã³ãã¿ã³æ¼ä¸ã§çºç« 387 $('.jsMagnific#login').click(function (e) { 388 _login(e); 389 }); 390 // ãã°ã¤ã³ãã©ã¼ã ä¸ã§ã¨ã³ã¿ã¼ãã¼æ¼ä¸ã§çºç« 391 $('form.login').keypress(function (e) { 392 if (e.which === 13) { 393 _login(e); 394 } 395 }); 396 }, 397 showmodal: function showmodal() { 398 $('.jsMagnific#registration').click(function (e) { 399 e.preventDefault(); 400 $.spinner().start(); 401 var form = $('form.registration'); 402 var isValidPasswordEmail = true; 403 404 // ã¨ã©ã¼ã¡ãã»ã¼ã¸ã®é¤å» 405 clientSideValidation.functions.clearForm(form.get(0)); 406 // emailã®æ£è¦è¡¨ç¾ãã§ã㯠407 var email = $('#register-email'); 408 if (!emailValidation(email.val())) { 409 email.addClass('is-invalid'); 410 email.parents('.form-group').find('.invalid-feedback').text(email.data('pattern-mismatch')); 411 isValidPasswordEmail = false; 412 } 413 // Validate email address 414 if (email.val().length > 80) { 415 email.addClass('is-invalid');
416 email.parents('.form-group').find('.invalid-feedback').text(email.data('range-error')); 417 isValidPasswordEmail = false; 418 } 419 420 // ãã¹ã¯ã¼ãã®æ£è¦è¡¨ç¾ãã§ã㯠421 var password = $('#register-password'); 422 if (!passwordValidation(password.val())) { 423 password.addClass('is-invalid'); 424 password.parents('.form-group').find('.invalid-feedback').text(password.data('pattern-mismatch')); 425 isValidPasswordEmail = false; 426 } 427 428 // formã®validationãã§ã㯠429 var isValid = clientSideValidation.functions.validateForm(form.get(0), e); 430 // validation失æ 431 if (!isValidPasswordEmail || !isValid) { 432 $.spinner().stop(); 433 return false; 434 } 435 436 // server-sideã§ã®validationãã§ã㯠437 $.ajax({ 438 url: $(this).data('checkform'), 439 type: 'post', 440 dataType: 'json', 441 data: form.serialize(), 442 context: $('.jsMagnific#registration'), 443 success: function success(data) { 444 if (data.isValid) { 445 popupModal(this, e); 446 } else { 447 $.spinner().stop(); 448 formValidation(form, data); 449 } 450 }, 451 error: function error(err) { 452 createErrorNotification($('.error-messaging'), err.responseJSON.errorMessage); 453 $.spinner().stop(); 454 } 455 }); 456 return false; 457 }); 458 }, 459 register: function register() { 460 $('form.registration').on('submit', function (e) { 461 var form = $(this); 462 e.preventDefault(); 463 var url = form.attr('action'); 464 $('form.registration').trigger('login:register', e); 465 $.ajax({ 466 url: url, 467 type: 'post', 468 dataType: 'json', 469 data: form.serialize(), 470 success: function success(data) { 471 if (data.success) { 472 location.href = data.redirectUrl; 473 } else { 474 $('.jsModalContentOuter').spinner().stop(); 475 $.magnificPopup.close(); 476 formValidation(form, data); 477 } 478 }, 479 error: function error(err) { 480 if (err.responseJSON.redirectUrl) { 481 window.location.href = err.responseJSON.redirectUrl; 482 } else { 483 $('.jsModalContentOuter').spinner().stop(); 484 $.magnificPopup.close(); 485 createErrorNotification($('.error-messaging'), err.responseJSON.errorMessage); 486 } 487 } 488 }); 489 return false; 490 }); 491 }, 492 submitbtn: function submitbtn() { 493 $('body').on('click', '.jsButtonContinue#submitbtn', function (e) { 494 var formName = $(this).data('form-name'); 495 $(this).prop('disabled', true); 496 $('.jsModalContentOuter').spinner().start(); 497 // è¦ç´åæã¢ãã«ãæ°è¦ä¼å¡ç»é²ããå¼ã³åºãããå ´å 498 if (formName === 'registration') { 499 $('form.registration').trigger('submit'); 500 // è¦ç´åæã¢ãã«ããã°ã¤ã³ããå¼ã³åºãããå ´å 501 } else if (formName === 'login') { 502 // 顧客ã®è¦ç´åæãã¼ã¸ã§ã³ãæ´æ°ããã°ã¤ã³ãã 503 var loginEmail = $('#login-form-email').val(); 504 ; 505 var loginPassword = $('#login-form-password').val(); 506 ; 507 setAgreementVersion(loginEmail, loginPassword); 508 } 509 return false; 510 }); 511 } 512}; 513 514/***/ }), 515
516/***/ "./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/util.js": 517/*!************************************************************************************************!*\ 518 !*** ./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/util.js ***! 519 \************************************************************************************************/ 520/***/ ((module) => { 521 522function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } 523module.exports = function (include) { 524 if (typeof include === 'function') { 525 include(); 526 } else if (_typeof(include) === 'object') { 527 Object.keys(include).forEach(function (key) { 528 if (typeof include[key] === 'function') { 529 include[key](); 530 } 531 }); 532 } 533}; 534 535/***/ })
535 536 537/******/ }); 538/************************************************************************/ 539/******/ // The module cache 540/******/ var __webpack_module_cache__ = {}; 541/******/ 542/******/ // The require function 543/******/ function __webpack_require__(moduleId) { 544/******/ // Check if module is in cache 545/******/ var cachedModule = __webpack_module_cache__[moduleId]; 546/******/ if (cachedModule !== undefined) { 547/******/ return cachedModule.exports; 548/******/ } 549/******/ // Create a new module (and put it into the cache) 550/******/ var module = __webpack_module_cache__[moduleId] = { 551/******/ // no module.id needed 552/******/ // no module.loaded needed 553/******/ exports: {} 554/******/ }; 555/******/ 556/******/ // Execute the module function 557/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); 558/******/ 559/******/ // Return the exports of the module 560/******/ return module.exports; 561/******/ } 562/******/ 563/************************************************************************/ 564var __webpack_exports__ = {}; 565// This entry need to be wrapped in an IIFE because it need to be in strict mode. 566(() => { 567"use strict"; 568/*!*************************************************************************************************!*\ 569 !*** ./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/login.js ***! 570 \*************************************************************************************************/ 571 572 573var processInclude = __webpack_require__(/*! ./util */ "./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/util.js"); 574$(document).ready(function () { 575 processInclude(__webpack_require__(/*! ./login/login */ "./app_prime1studio_ec/cartridges/app_prime1studio_ec/cartridge/client/default/js/login/login.js")); 576}); 577})(); 578 579/******/ })() 580; 581//# sourceMappingURL=login.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.