while(line = readline()) {
    let length = line.length;
    let pointer = 97;
    let codeArr = [];
    let otherArr = [];
    for (let i = 0; i < length; i++) {
        let code = line.charCodeAt(i);
        if (!isABC(code)){
            otherArr.push({index: i, str: line[i]});
        }
    }
    //逻辑麻烦就在这,这里参考别人的代码,他的想法很简单就是把字母按照a-z的顺序拿出来,然后把原有的替换。
  //我的逻辑是把字母拿出来然后都大写用unicode排序,再还原,结果不知道为啥sort排序把相同code的index搞乱了,剩下就是把非字母的位置记录然后插入
    for (let i = 0; i < 26; i++) {
        for (let j = 0; j < length; j++ ) {
            let code = line.charCodeAt(j);
            if (isABC(code) && line[j].toLowerCase().charCodeAt() === pointer) {
                codeArr.push(line[j]);
            }
        }
        pointer++;
    }
 
    function isABC(code) {
        if (code >= 65 && code <= 90 || code >=97 && code <= 122) {
            return true;
        }
        return false;
    }
    
    for (let item of otherArr) {
        codeArr.splice(item.index,0, item.str)
    }
    
   console.log(codeArr.join(''))
}